[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xense-devel] [PATCH] txt: 2/6 - explicitly protect TXT addr ranges from dom0
tboot no longer marks the TXT heap/SINIT/private config space as E820_UNUSABLE in the e820 table, so Xen must explicitly disallow those regions from dom0. Signed-off-by: Shane Wang <shane.wang@xxxxxxxxx> Signed-off-by: Joseph Cihula <joseph.cihula@xxxxxxxxx> diff -r 3d294dba4255 -r bde0fd053306 xen/arch/x86/domain_build.c --- a/xen/arch/x86/domain_build.c Fri Jan 16 13:25:37 2009 -0800 +++ b/xen/arch/x86/domain_build.c Fri Jan 16 13:34:36 2009 -0800 @@ -29,6 +29,7 @@ #include <asm/paging.h> #include <asm/p2m.h> #include <asm/e820.h> +#include <asm/tboot.h> #include <public/version.h> @@ -1038,6 +1039,20 @@ int __init construct_dom0( rc |= iomem_deny_access(dom0, sfn, efn); } + /* Remove access to TXT Heap/SINIT/Private Space. */ + if ( tboot_in_measured_env() ) + { + unsigned long sfn, efn; + + for ( i = 0; i < ARRAY_SIZE(txt_protmem_range_starts); i++ ) + { + sfn = paddr_to_pfn(txt_protmem_range_starts[i]); + efn = paddr_to_pfn(txt_protmem_range_ends[i]); + if ( sfn <= efn ) + rc |= iomem_deny_access(dom0, sfn, efn); + } + } + BUG_ON(rc != 0); return 0; diff -r 3d294dba4255 -r bde0fd053306 xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Fri Jan 16 13:25:37 2009 -0800 +++ b/xen/arch/x86/mm.c Fri Jan 16 13:34:36 2009 -0800 @@ -109,6 +109,7 @@ #include <asm/e820.h> #include <asm/hypercall.h> #include <asm/shared.h> +#include <asm/tboot.h> #include <public/memory.h> #include <xsm/xsm.h> #include <xen/trace.h> @@ -216,7 +217,7 @@ void __init arch_init_memory(void) { extern void subarch_init_memory(void); - unsigned long i, pfn, rstart_pfn, rend_pfn, iostart_pfn, ioend_pfn; + unsigned long i, pfn, rstart_pfn, rend_pfn, iostart_pfn, ioend_pfn, j; /* * Initialise our DOMID_XEN domain. @@ -279,6 +280,19 @@ void __init arch_init_memory(void) for ( ; pfn < rstart_pfn; pfn++ ) { BUG_ON(!mfn_valid(pfn)); + /* Ensure the TXT ranges are not marked as I/O since that memory */ + /* can't be used in dom0. */ + if ( tboot_in_measured_env() ) + { + for ( j = 0; j < ARRAY_SIZE(txt_protmem_range_starts); j++ ) + { + if ( (PFN_DOWN(txt_protmem_range_starts[j]) <= pfn) + && (pfn <= PFN_DOWN(txt_protmem_range_ends[j])) ) + break; + } + if ( j != ARRAY_SIZE(txt_protmem_range_starts) ) + continue; + } share_xen_page_with_guest( mfn_to_page(pfn), dom_io, XENSHARE_writable); } diff -r 3d294dba4255 -r bde0fd053306 xen/arch/x86/tboot.c --- a/xen/arch/x86/tboot.c Fri Jan 16 13:25:37 2009 -0800 +++ b/xen/arch/x86/tboot.c Fri Jan 16 13:34:36 2009 -0800 @@ -15,12 +15,18 @@ string_param("tboot", opt_tboot); /* Global pointer to shared data; NULL means no measured launch. */ tboot_shared_t *g_tboot_shared; +/* TXT memory ranges which need to be protected from dom0 */ +uint64_t txt_protmem_range_starts[TXT_PROTMEM_RANGE_MAX]; +uint64_t txt_protmem_range_ends[TXT_PROTMEM_RANGE_MAX]; + static const uuid_t tboot_shared_uuid = TBOOT_SHARED_UUID; void __init tboot_probe(void) { tboot_shared_t *tboot_shared; - unsigned long p_tboot_shared; + unsigned long p_tboot_shared, map_addr; + uint64_t base, size; + uint32_t map_base, map_size; /* Look for valid page-aligned address for shared page. */ p_tboot_shared = simple_strtoul(opt_tboot, NULL, 0); @@ -48,6 +54,34 @@ void __init tboot_probe(void) printk(" tboot_base: 0x%08x\n", tboot_shared->tboot_base); printk(" tboot_size: 0x%x\n", tboot_shared->tboot_size); } + + /* Get TXT heaps/SINIT/Private Space addresses. */ + map_base = PFN_DOWN(TXT_PUB_CONFIG_REGS_BASE); + map_size = PFN_UP(NR_TXT_CONFIG_PAGES * PAGE_SIZE); + + map_addr = (unsigned long)__va(map_base << PAGE_SHIFT); + if ( map_pages_to_xen(map_addr, map_base, map_size, __PAGE_HYPERVISOR) ) + panic("Could not get TXT heaps/SINIT/Private Space addresses\n"); + + /* TXT Heap */ + base = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_BASE); + size = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_SIZE); + txt_protmem_range_starts[0] = base; + txt_protmem_range_ends[0] = base + size - 1; + + /* SINIT */ + base = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_BASE); + size = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_SIZE); + txt_protmem_range_starts[1] = base; + txt_protmem_range_ends[1] = base + size - 1; + + /* TXT Private Space */ + txt_protmem_range_starts[2] = TXT_PRIV_CONFIG_REGS_BASE; + txt_protmem_range_ends[2] = TXT_PRIV_CONFIG_REGS_BASE + + NR_TXT_CONFIG_PAGES * PAGE_SIZE - 1; + + destroy_xen_mappings((unsigned long)__va(map_base << PAGE_SHIFT), + (unsigned long)__va((map_base + map_size) << PAGE_SHIFT)); } void tboot_shutdown(uint32_t shutdown_type) diff -r 3d294dba4255 -r bde0fd053306 xen/include/asm-x86/tboot.h --- a/xen/include/asm-x86/tboot.h Fri Jan 16 13:25:37 2009 -0800 +++ b/xen/include/asm-x86/tboot.h Fri Jan 16 13:34:36 2009 -0800 @@ -2,7 +2,7 @@ * tboot.h: shared data structure with MLE and kernel and functions * used by kernel for runtime support * - * Copyright (c) 2006-2007, Intel Corporation + * Copyright (c) 2006-2009, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -90,6 +90,26 @@ void tboot_shutdown(uint32_t shutdown_ty void tboot_shutdown(uint32_t shutdown_type); int tboot_in_measured_env(void); +/* + * TXT configuration registers (offsets from TXT_{PUB, PRIV}_CONFIG_REGS_BASE) + */ + +#define TXT_PUB_CONFIG_REGS_BASE 0xfed30000 +#define TXT_PRIV_CONFIG_REGS_BASE 0xfed20000 + +/* # pages for each config regs space - used by fixmap */ +#define NR_TXT_CONFIG_PAGES ((TXT_PUB_CONFIG_REGS_BASE - \ + TXT_PRIV_CONFIG_REGS_BASE) >> \ + PAGE_SHIFT) +#define TXTCR_SINIT_BASE 0x0270 +#define TXTCR_SINIT_SIZE 0x0278 +#define TXTCR_HEAP_BASE 0x0300 +#define TXTCR_HEAP_SIZE 0x0308 + +#define TXT_PROTMEM_RANGE_MAX 3 +extern uint64_t txt_protmem_range_starts[TXT_PROTMEM_RANGE_MAX]; +extern uint64_t txt_protmem_range_ends[TXT_PROTMEM_RANGE_MAX]; + #endif /* __TBOOT_H__ */ /* Attachment:
xen-txt-02-protect_txt_ranges.patch _______________________________________________ Xense-devel mailing list Xense-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xense-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |