]> xenbits.xen.org Git - xenclient/xen.git/commitdiff
tboot patch 4/5 Hypervisor S3 integrity
authorRoss Philipson <ross.philipson@citrix.com>
Wed, 4 Feb 2009 16:14:52 +0000 (11:14 -0500)
committerRoss Philipson <ross.philipson@citrix.com>
Wed, 4 Feb 2009 16:14:52 +0000 (11:14 -0500)
When launched from tboot, utilise tboot interface to provide
integrity protection to the hypervisor during S3.

 Changes to be committed:
modified:   xen/arch/x86/tboot.c
modified:   xen/include/asm-x86/tboot.h

xen/arch/x86/tboot.c
xen/include/asm-x86/tboot.h

index 603f3301fb3fe101e0407a0ec4dc50b3bb1bf76f..4577d0f06d7553a6f2eddd38f03b29e68422c710 100644 (file)
@@ -18,6 +18,8 @@ tboot_shared_t *g_tboot_shared;
 
 static const uuid_t tboot_shared_uuid = TBOOT_SHARED_UUID;
 
+extern char __init_begin[], __per_cpu_start[], __per_cpu_end[], __bss_start[];
+
 /*
  * TXT configuration registers (offsets from TXT_{PUB, PRIV}_CONFIG_REGS_BASE)
  */
@@ -77,6 +79,25 @@ void tboot_shutdown(uint32_t shutdown_type)
 
     local_irq_disable();
 
+    /* if this is S3 then set regions to MAC */
+    if ( shutdown_type == TB_SHUTDOWN_S3 ) {
+        g_tboot_shared->num_mac_regions = 4;
+        /* S3 resume code (and other real mode trampoline code) */
+        g_tboot_shared->mac_regions[0].start =
+            (uint64_t)bootsym_phys(trampoline_start);
+        g_tboot_shared->mac_regions[0].end =
+            (uint64_t)bootsym_phys(trampoline_end);
+        /* hypervisor code + data */
+        g_tboot_shared->mac_regions[1].start = (uint64_t)__pa(&_stext);
+        g_tboot_shared->mac_regions[1].end = (uint64_t)__pa(&__init_begin);
+        /* per-cpu data */
+        g_tboot_shared->mac_regions[2].start = (uint64_t)__pa(&__per_cpu_start);
+        g_tboot_shared->mac_regions[2].end = (uint64_t)__pa(&__per_cpu_end);
+        /* bss */
+        g_tboot_shared->mac_regions[3].start = (uint64_t)__pa(&__bss_start);
+        g_tboot_shared->mac_regions[3].end = (uint64_t)__pa(&_end);
+    }
+
     /* Create identity map for tboot shutdown code. */
     map_base = PFN_DOWN(g_tboot_shared->tboot_base);
     map_size = PFN_UP(g_tboot_shared->tboot_size);
index 65a9cfedc6ea6948bd09b27c48c16c6f4cb9e286..4aa89c0f946484eb4c33aa858dde0488ec2e82b9 100644 (file)
@@ -51,6 +51,12 @@ typedef struct __packed {
 
 /* used to communicate between tboot and the launched kernel (i.e. Xen) */
 
+#define MAX_TB_MAC_REGIONS      32
+typedef struct __packed {
+    uint64_t  start;
+    uint64_t  end;
+} tboot_mac_region_t;
+
 /* GAS - Generic Address Structure (ACPI 2.0+) */
 typedef struct __packed {
        uint8_t  space_id;
@@ -83,6 +89,9 @@ typedef struct __packed {
               acpi_sinfo;        /* where kernel put acpi sleep info in Sx */
     uint32_t  tboot_base;        /* starting addr for tboot */
     uint32_t  tboot_size;        /* size of tboot */
+    uint8_t   num_mac_regions;   /* number mem regions to MAC on S3 */
+                                 /* contig regions memory to MAC on S3 */
+    tboot_mac_region_t mac_regions[MAX_TB_MAC_REGIONS];
 } tboot_shared_t;
 
 #define TB_SHUTDOWN_REBOOT      0