diff options
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | xen/arch/x86/tboot.c | 41 | ||||
-rw-r--r-- | xen/include/asm-x86/tboot.h | 6 |
3 files changed, 49 insertions, 4 deletions
@@ -211,7 +211,7 @@ linux26: # tboot targets # -TBOOT_TARFILE = tboot-20071029.tar.gz +TBOOT_TARFILE = tboot-20071128.tar.gz TBOOT_BASE_URL = http://downloads.sourceforge.net/tboot .PHONY: build-tboot @@ -222,6 +222,10 @@ build-tboot: download_tboot install-tboot: download_tboot $(MAKE) -C tboot install +.PHONY: dist-tboot +dist-tboot: download_tboot + $(MAKE) DESTDIR=$(DISTDIR)/install -C tboot dist + .PHONY: clean-tboot clean-tboot: [ ! -d tboot ] || $(MAKE) -C tboot clean diff --git a/xen/arch/x86/tboot.c b/xen/arch/x86/tboot.c index dbc9b8e407..697ca9f461 100644 --- a/xen/arch/x86/tboot.c +++ b/xen/arch/x86/tboot.c @@ -43,16 +43,43 @@ void __init tboot_probe(void) printk(" s3_tb_wakeup_entry: 0x%08x\n", tboot_shared->s3_tb_wakeup_entry); printk(" s3_k_wakeup_entry: 0x%08x\n", tboot_shared->s3_k_wakeup_entry); printk(" &acpi_sinfo: 0x%p\n", &tboot_shared->acpi_sinfo); + if ( tboot_shared->version >= 0x02 ) + { + printk(" tboot_base: 0x%08x\n", tboot_shared->tboot_base); + printk(" tboot_size: 0x%x\n", tboot_shared->tboot_size); + } } void tboot_shutdown(uint32_t shutdown_type) { + uint32_t map_base, map_size; + int err; + g_tboot_shared->shutdown_type = shutdown_type; local_irq_disable(); - /* Create identity map for 0-640k to include tboot code. */ - map_pages_to_xen(0, 0, PFN_UP(0xa0000), __PAGE_HYPERVISOR); + /* Create identity map for tboot shutdown code. */ + if ( g_tboot_shared->version >= 0x02 ) + { + map_base = PFN_DOWN(g_tboot_shared->tboot_base); + map_size = PFN_UP(g_tboot_shared->tboot_size); + } + else + { + map_base = 0; + map_size = PFN_UP(0xa0000); + } + + err = map_pages_to_xen(map_base << PAGE_SHIFT, map_base, map_size, + __PAGE_HYPERVISOR); + if ( err != 0 ) + { + printk("error (0x%x) mapping tboot pages (mfns) @ 0x%x, 0x%x\n", err, + map_base, map_size); + return; + } + write_ptbase(idle_vcpu[0]); #ifdef __x86_64__ @@ -68,3 +95,13 @@ int tboot_in_measured_env(void) { return (g_tboot_shared != NULL); } + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/asm-x86/tboot.h b/xen/include/asm-x86/tboot.h index 3393b57aed..80c8c9068e 100644 --- a/xen/include/asm-x86/tboot.h +++ b/xen/include/asm-x86/tboot.h @@ -49,8 +49,9 @@ typedef struct __attribute__ ((__packed__)) { #define MAX_TB_ACPI_SINFO_SIZE 64 typedef struct __attribute__ ((__packed__)) { + /* version 0x01+ fields: */ uuid_t uuid; /* {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} */ - uint32_t version; /* 0x01 */ + uint32_t version; /* Version number: 0x01, 0x02, ... */ uint32_t log_addr; /* physical addr of tb_log_t log */ uint32_t shutdown_entry32; /* entry point for tboot shutdown from 32b */ uint32_t shutdown_entry64; /* entry point for tboot shutdown from 64b */ @@ -59,6 +60,9 @@ typedef struct __attribute__ ((__packed__)) { uint32_t s3_k_wakeup_entry; /* entry point for xen s3 wake up */ uint8_t acpi_sinfo[MAX_TB_ACPI_SINFO_SIZE]; /* where kernel put acpi sleep info in Sx */ + /* version 0x02+ fields: */ + uint32_t tboot_base; /* starting addr for tboot */ + uint32_t tboot_size; /* size of tboot */ } tboot_shared_t; #define TB_SHUTDOWN_REBOOT 0 |