[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Export machine_to_phys start and end addresses to guests.
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxxxx # Node ID f7bb99cdc391a4a23ee41d48dfd19f3d5b0c69c3 # Parent a31f3bff4f7639dafe91684f0bfeb1430db78c8d Export machine_to_phys start and end addresses to guests. Use this info in Linux to bounds-check accesses to the m2p table. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h | 18 +++++++----- linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h | 18 +++++++----- xen/arch/x86/setup.c | 4 ++ xen/include/public/arch-x86_32.h | 9 +++++- xen/include/public/arch-x86_64.h | 14 ++++++--- 5 files changed, 42 insertions(+), 21 deletions(-) diff -r a31f3bff4f76 -r f7bb99cdc391 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h Tue Jun 20 11:04:58 2006 +0100 +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h Tue Jun 20 12:01:09 2006 +0100 @@ -89,19 +89,23 @@ static inline unsigned long mfn_to_pfn(u if (xen_feature(XENFEAT_auto_translated_physmap)) return mfn; - /* - * The array access can fail (e.g., device space beyond end of RAM). - * In such cases it doesn't matter what we return (we return garbage), - * but we must handle the fault without crashing! - */ + if (mfn >= MACH2PHYS_NR_ENTRIES) + return max_mapnr; + + /* The array access can fail (e.g., device space beyond end of RAM). */ asm ( "1: movl %1,%0\n" "2:\n" + ".section .fixup,\"ax\"\n" + "3: movl %2,%0\n" + " jmp 2b\n" + ".previous\n" ".section __ex_table,\"a\"\n" " .align 4\n" - " .long 1b,2b\n" + " .long 1b,3b\n" ".previous" - : "=r" (pfn) : "m" (machine_to_phys_mapping[mfn]) ); + : "=r" (pfn) + : "m" (machine_to_phys_mapping[mfn]), "i" (max_mapnr) ); return pfn; } diff -r a31f3bff4f76 -r f7bb99cdc391 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h --- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h Tue Jun 20 11:04:58 2006 +0100 +++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h Tue Jun 20 12:01:09 2006 +0100 @@ -107,19 +107,23 @@ static inline unsigned long mfn_to_pfn(u if (xen_feature(XENFEAT_auto_translated_physmap)) return mfn; - /* - * The array access can fail (e.g., device space beyond end of RAM). - * In such cases it doesn't matter what we return (we return garbage), - * but we must handle the fault without crashing! - */ + if (mfn >= MACH2PHYS_NR_ENTRIES) + return end_pfn; + + /* The array access can fail (e.g., device space beyond end of RAM). */ asm ( "1: movq %1,%0\n" "2:\n" + ".section .fixup,\"ax\"\n" + "3: movq %2,%0\n" + " jmp 2b\n" + ".previous\n" ".section __ex_table,\"a\"\n" " .align 8\n" - " .quad 1b,2b\n" + " .quad 1b,3b\n" ".previous" - : "=r" (pfn) : "m" (machine_to_phys_mapping[mfn]) ); + : "=r" (pfn) + : "m" (machine_to_phys_mapping[mfn]), "ir" (end_pfn) ); return pfn; } diff -r a31f3bff4f76 -r f7bb99cdc391 xen/arch/x86/setup.c --- a/xen/arch/x86/setup.c Tue Jun 20 11:04:58 2006 +0100 +++ b/xen/arch/x86/setup.c Tue Jun 20 12:01:09 2006 +0100 @@ -396,11 +396,13 @@ void __init __start_xen(multiboot_info_t BUILD_BUG_ON(sizeof(shared_info_t) > PAGE_SIZE); BUILD_BUG_ON(sizeof(vcpu_info_t) != 64); - /* __foo are defined in public headers. Check they match internal defs. */ + /* Check definitions in public headers match internal defs. */ BUILD_BUG_ON(__HYPERVISOR_VIRT_START != HYPERVISOR_VIRT_START); #ifdef HYPERVISOR_VIRT_END BUILD_BUG_ON(__HYPERVISOR_VIRT_END != HYPERVISOR_VIRT_END); #endif + BUILD_BUG_ON(MACH2PHYS_VIRT_START != RO_MPT_VIRT_START); + BUILD_BUG_ON(MACH2PHYS_VIRT_END != RO_MPT_VIRT_END); init_frametable(); diff -r a31f3bff4f76 -r f7bb99cdc391 xen/include/public/arch-x86_32.h --- a/xen/include/public/arch-x86_32.h Tue Jun 20 11:04:58 2006 +0100 +++ b/xen/include/public/arch-x86_32.h Tue Jun 20 12:01:09 2006 +0100 @@ -74,16 +74,23 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t); */ #ifdef CONFIG_X86_PAE #define __HYPERVISOR_VIRT_START 0xF5800000 +#define __MACH2PHYS_VIRT_START 0xF5800000 +#define __MACH2PHYS_VIRT_END 0xF6800000 #else #define __HYPERVISOR_VIRT_START 0xFC000000 +#define __MACH2PHYS_VIRT_START 0xFC000000 +#define __MACH2PHYS_VIRT_END 0xFC400000 #endif #ifndef HYPERVISOR_VIRT_START #define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START) #endif +#define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START) +#define MACH2PHYS_VIRT_END mk_unsigned_long(__MACH2PHYS_VIRT_END) +#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>2) #ifndef machine_to_phys_mapping -#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) +#define machine_to_phys_mapping ((unsigned long *)MACH2PHYS_VIRT_START) #endif /* Maximum number of virtual CPUs in multi-processor guests. */ diff -r a31f3bff4f76 -r f7bb99cdc391 xen/include/public/arch-x86_64.h --- a/xen/include/public/arch-x86_64.h Tue Jun 20 11:04:58 2006 +0100 +++ b/xen/include/public/arch-x86_64.h Tue Jun 20 12:01:09 2006 +0100 @@ -85,21 +85,25 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t); #define __HYPERVISOR_VIRT_START 0xFFFF800000000000 #define __HYPERVISOR_VIRT_END 0xFFFF880000000000 +#define __MACH2PHYS_VIRT_START 0xFFFF800000000000 +#define __MACH2PHYS_VIRT_END 0xFFFF804000000000 #ifndef HYPERVISOR_VIRT_START #define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START) #define HYPERVISOR_VIRT_END mk_unsigned_long(__HYPERVISOR_VIRT_END) #endif +#define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START) +#define MACH2PHYS_VIRT_END mk_unsigned_long(__MACH2PHYS_VIRT_END) +#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>3) +#ifndef machine_to_phys_mapping +#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) +#endif + /* Maximum number of virtual CPUs in multi-processor guests. */ #define MAX_VIRT_CPUS 32 #ifndef __ASSEMBLY__ - -/* The machine->physical mapping table starts at this address, read-only. */ -#ifndef machine_to_phys_mapping -#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) -#endif /* * int HYPERVISOR_set_segment_base(unsigned int which, unsigned long base) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |