[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] linux/x86: Advertise which page table entries contain MFNs



.. and hence need to be (un)canonicalized during save/restore.

The patch should apply without the page table handling adjustment one, yet
the values passed in the new note assume that patch to be applied.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

Index: 2007-02-08/linux-2.6-xen-sparse/arch/i386/kernel/Makefile
===================================================================
--- 2007-02-08/linux-2.6-xen-sparse/arch/i386/kernel/Makefile   2007-02-13 
15:13:10.000000000 +0100
+++ 2007-02-08/linux-2.6-xen-sparse/arch/i386/kernel/Makefile   2007-02-13 
12:27:16.000000000 +0100
@@ -98,4 +98,5 @@ n-obj-xen := i8259.o timers/ reboot.o sm
 obj-y := $(call filterxen, $(obj-y), $(n-obj-xen))
 obj-y := $(call cherrypickxen, $(obj-y))
 extra-y := $(call cherrypickxen, $(extra-y))
+%/head-xen.o %/head-xen.s: EXTRA_AFLAGS :=
 endif
Index: 2007-02-08/linux-2.6-xen-sparse/arch/i386/kernel/head-xen.S
===================================================================
--- 2007-02-08/linux-2.6-xen-sparse/arch/i386/kernel/head-xen.S 2007-02-13 
15:13:12.000000000 +0100
+++ 2007-02-08/linux-2.6-xen-sparse/arch/i386/kernel/head-xen.S 2007-02-13 
15:13:52.000000000 +0100
@@ -6,6 +6,7 @@
 #include <linux/linkage.h>
 #include <asm/segment.h>
 #include <asm/page.h>
+#include <asm/pgtable.h>
 #include <asm/cache.h>
 #include <asm/thread_info.h>
 #include <asm/asm-offsets.h>
@@ -198,7 +199,9 @@ ENTRY(cpu_gdt_table)
        ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .asciz,
"writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel")
 #ifdef CONFIG_X86_PAE
        ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz, "yes")
+       ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .quad,  
_PAGE_PRESENT,_PAGE_PRESENT)
 #else
        ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz, "no")
+       ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .long,  
_PAGE_PRESENT,_PAGE_PRESENT)
 #endif
        ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz, "generic")
Index: 2007-02-08/linux-2.6-xen-sparse/arch/x86_64/kernel/Makefile
===================================================================
--- 2007-02-08/linux-2.6-xen-sparse/arch/x86_64/kernel/Makefile 2007-02-13 
15:13:10.000000000 +0100
+++ 2007-02-08/linux-2.6-xen-sparse/arch/x86_64/kernel/Makefile 2007-02-13 
12:27:16.000000000 +0100
@@ -72,4 +72,5 @@ include $(srctree)/scripts/Makefile.xen
 obj-y := $(call filterxen, $(obj-y), $(n-obj-xen))
 obj-y := $(call cherrypickxen, $(obj-y))
 extra-y := $(call cherrypickxen, $(extra-y))
+%/head-xen.o %/head-xen.s: EXTRA_AFLAGS :=
 endif
Index: 2007-02-08/linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S
===================================================================
--- 2007-02-08/linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S       
2007-02-13 15:13:10.000000000 +0100
+++ 2007-02-08/linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S       
2007-02-13 12:28:21.000000000 +0100
@@ -20,6 +20,7 @@
 #include <asm/desc.h>
 #include <asm/segment.h>
 #include <asm/page.h>
+#include <asm/pgtable.h>
 #include <asm/msr.h>
 #include <asm/cache.h>
 
@@ -49,7 +50,7 @@ ENTRY(_stext)
 #define NEXT_PAGE(name) \
        $page = $page + 1; \
        .org $page * 0x1000; \
-       phys_/**/name = $page * 0x1000 + __PHYSICAL_START; \
+       phys_##name = $page * 0x1000 + __PHYSICAL_START; \
 ENTRY(name)
 
 NEXT_PAGE(init_level4_pgt)
@@ -181,5 +182,6 @@ gdt_end:
 #endif /* !CONFIG_XEN_COMPAT_030002 */
        ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,          .quad,  startup_64)
        ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad,  hypercall_page)
+       ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .quad,  
_PAGE_PRESENT,_PAGE_PRESENT)
        ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .asciz,
"writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel")
        ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz, "generic")
Index: 2007-02-08/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable.h
===================================================================
--- 2007-02-08/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable.h     
2007-02-13 14:14:47.000000000 +0100
+++ 2007-02-08/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable.h     
2007-02-13 12:27:16.000000000 +0100
@@ -1,6 +1,7 @@
 #ifndef _I386_PGTABLE_H
 #define _I386_PGTABLE_H
 
+#ifndef __ASSEMBLY__
 #include <asm/hypervisor.h>
 
 /*
@@ -12,7 +13,6 @@
  * This file contains the functions and defines necessary to modify and use
  * the i386 page table tree.
  */
-#ifndef __ASSEMBLY__
 #include <asm/processor.h>
 #include <asm/fixmap.h>
 #include <linux/threads.h>
@@ -91,6 +91,8 @@ void paging_init(void);
 # define VMALLOC_END   (FIXADDR_START-2*PAGE_SIZE)
 #endif
 
+#endif /* !__ASSEMBLY__ */
+
 /*
  * _PAGE_PSE set in the page directory entry just means that
  * the page directory entry points directly to a 4MB-aligned block of
@@ -160,6 +162,8 @@ void paging_init(void);
 #define _PAGE_KERNEL_EXEC \
        (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
 
+#ifndef __ASSEMBLY__
+
 extern unsigned long long __PAGE_KERNEL, __PAGE_KERNEL_EXEC;
 #define __PAGE_KERNEL_RO               (__PAGE_KERNEL & ~_PAGE_RW)
 #define __PAGE_KERNEL_NOCACHE          (__PAGE_KERNEL | _PAGE_PCD)
@@ -469,8 +473,6 @@ void make_pages_writable(void *va, unsig
        m | ((unsigned long)(__va) & (PAGE_SIZE-1));                    \
 })
 
-#endif /* !__ASSEMBLY__ */
-
 #ifdef CONFIG_FLATMEM
 #define kern_addr_valid(addr)  (1)
 #endif /* CONFIG_FLATMEM */
@@ -508,4 +510,6 @@ direct_remap_pfn_range(vma,from,pfn,size
 #define __HAVE_ARCH_PTE_SAME
 #include <asm-generic/pgtable.h>
 
+#endif /* !__ASSEMBLY__ */
+
 #endif /* _I386_PGTABLE_H */
Index: 2007-02-08/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h
===================================================================
--- 2007-02-08/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h   
2007-02-13 14:14:47.000000000 +0100
+++ 2007-02-08/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h   
2007-02-13 12:27:16.000000000 +0100
@@ -5,6 +5,7 @@
  * This file contains the functions and defines necessary to modify and use
  * the x86-64 page table tree.
  */
+#ifndef __ASSEMBLY__
 #include <asm/processor.h>
 #include <asm/fixmap.h>
 #include <asm/bitops.h>
@@ -172,7 +173,6 @@ static inline pte_t ptep_get_and_clear_f
 #define USER_PTRS_PER_PGD      ((TASK_SIZE-1)/PGDIR_SIZE+1)
 #define FIRST_USER_ADDRESS     0
 
-#ifndef __ASSEMBLY__
 #define MAXMEM          0x3fffffffffffUL
 #define VMALLOC_START    0xffffc20000000000UL
 #define VMALLOC_END      0xffffe1ffffffffffUL
@@ -180,6 +180,8 @@ static inline pte_t ptep_get_and_clear_f
 #define MODULES_END      0xfffffffffff00000UL
 #define MODULES_LEN   (MODULES_END - MODULES_VADDR)
 
+#endif /* !__ASSEMBLY__ */
+
 #define _PAGE_BIT_PRESENT      0
 #define _PAGE_BIT_RW           1
 #define _PAGE_BIT_USER         2
@@ -205,6 +207,8 @@ static inline pte_t ptep_get_and_clear_f
 #define _PAGE_PROTNONE 0x080   /* If not present */
 #define _PAGE_NX        (1UL<<_PAGE_BIT_NX)
 
+#ifndef __ASSEMBLY__
+
 #ifdef CONFIG_XEN_COMPAT_030002
 extern unsigned int __kernel_page_user;
 #else
@@ -511,8 +515,6 @@ static inline pte_t pte_modify(pte_t pte
 extern struct page *pgd_list;
 void vmalloc_sync_all(void);
 
-#endif /* !__ASSEMBLY__ */
-
 extern int kern_addr_valid(unsigned long addr); 
 
 #define DOMID_LOCAL (0xFFFFU)
@@ -566,4 +568,6 @@ int touch_pte_range(struct mm_struct *mm
 #define __HAVE_ARCH_PTE_SAME
 #include <asm-generic/pgtable.h>
 
+#endif /* !__ASSEMBLY__ */
+
 #endif /* _X86_64_PGTABLE_H */
Index: 2007-02-08/linux-2.6-xen-sparse/include/linux/elfnote.h
===================================================================
--- 2007-02-08/linux-2.6-xen-sparse/include/linux/elfnote.h     2007-02-13 
15:13:10.000000000 +0100
+++ 2007-02-08/linux-2.6-xen-sparse/include/linux/elfnote.h     2007-02-13 
12:27:16.000000000 +0100
@@ -38,7 +38,20 @@
  * e.g. ELFNOTE(XYZCo, 42, .asciz, "forty-two")
  *      ELFNOTE(XYZCo, 12, .long, 0xdeadbeef)
  */
-#define ELFNOTE(name, type, desctype, descdata)        \
+#ifdef __STDC__
+#define ELFNOTE(name, type, desctype, descdata...) \
+.pushsection .note.name                        ;       \
+  .align 4                             ;       \
+  .long 2f - 1f                /* namesz */    ;       \
+  .long 4f - 3f                /* descsz */    ;       \
+  .long type                           ;       \
+1:.asciz #name                         ;       \
+2:.align 4                             ;       \
+3:desctype descdata                    ;       \
+4:.align 4                             ;       \
+.popsection
+#else /* !__STDC__, i.e. -traditional */
+#define ELFNOTE(name, type, desctype, descdata) \
 .pushsection .note.name                        ;       \
   .align 4                             ;       \
   .long 2f - 1f                /* namesz */    ;       \
@@ -48,7 +61,8 @@
 2:.align 4                             ;       \
 3:desctype descdata                    ;       \
 4:.align 4                             ;       \
-.popsection                            ;
+.popsection
+#endif /* __STDC__ */
 #else  /* !__ASSEMBLER__ */
 #include <linux/elf.h>
 /*
Index: 2007-02-08/xen/include/public/elfnote.h
===================================================================
--- 2007-02-08/xen/include/public/elfnote.h     2007-02-13 15:13:10.000000000 
+0100
+++ 2007-02-08/xen/include/public/elfnote.h     2007-02-13 12:27:16.000000000 
+0100
@@ -151,6 +151,12 @@
 #define XEN_ELFNOTE_HV_START_LOW  12
 
 /*
+ * List of maddr_t-sized mask/value pairs describing how to recognize
+ * (non-present) L1 page table entries carrying valid MFNs (numeric).
+ */
+#define XEN_ELFNOTE_L1_MFN_VALID  13
+
+/*
  * System information exported through crash notes.
  *
  * The kexec / kdump code will create one XEN_ELFNOTE_CRASH_INFO 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.