]> xenbits.xensource.com Git - people/royger/linux-2.6.18-xen.git/commitdiff
xen: add privileged (dom0) kernel feature indication
authorJan Beulich <jbeulich@novell.com>
Sat, 23 Jul 2011 07:51:31 +0000 (08:51 +0100)
committerJan Beulich <jbeulich@novell.com>
Sat, 23 Jul 2011 07:51:31 +0000 (08:51 +0100)
Signed-off-by: Jan Beulich <jbeulich@novell.com>
arch/i386/kernel/head-xen.S
arch/x86_64/kernel/head-xen.S

index b96ff493c79dfb2ef6773424b7470f977cea5351..1bc0a97de6ee8fdeb69882fca515ede4aaab9d1d 100644 (file)
@@ -12,6 +12,7 @@
 #include <asm/dwarf2.h>
 #include <xen/interface/xen.h>
 #include <xen/interface/elfnote.h>
+#include <xen/interface/features.h>
 
 /*
  * References to members of the new_cpu_data structure.
@@ -142,6 +143,18 @@ ENTRY(cpu_gdt_table)
        .quad 0x0000000000000000        /* 0xf0 - unused */
        .quad 0x0000000000000000        /* 0xf8 - GDT entry 31: double-fault TSS */
 
+#ifdef CONFIG_XEN_UNPRIVILEGED_GUEST
+# define XEN_DOM0_CAP          0
+# define XEN_DOM0_CAP_STR      ""
+#else
+# define XEN_DOM0_CAP          (1 << XENFEAT_dom0)
+# if CONFIG_XEN_COMPAT < 0x040200
+#  define XEN_DOM0_CAP_STR     ""
+# else
+#  define XEN_DOM0_CAP_STR     "|dom0"
+# endif
+#endif
+
 #if CONFIG_XEN_COMPAT <= 0x030002
 /*
  * __xen_guest information
@@ -195,7 +208,18 @@ ENTRY(cpu_gdt_table)
        ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,          .long,  startup_32)
        ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .long,  hypercall_page)
        ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW,   .long,  HYPERVISOR_VIRT_START)
-       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_FEATURES,       .ascii, "writable_page_tables";
+                                                .ascii  "|writable_descriptor_tables";
+                                                .ascii  "|auto_translated_physmap";
+                                                .ascii  "|pae_pgdir_above_4gb";
+                                                .ascii  "|supervisor_mode_kernel";
+                                                .asciz  XEN_DOM0_CAP_STR)
+       ELFNOTE(Xen, XEN_ELFNOTE_SUPPORTED_FEATURES, .long, XEN_DOM0_CAP |
+                                          (1 << XENFEAT_writable_page_tables) |
+                                          (1 << XENFEAT_writable_descriptor_tables) |
+                                          (1 << XENFEAT_auto_translated_physmap) |
+                                          (1 << XENFEAT_pae_pgdir_above_4gb) |
+                                          (1 << XENFEAT_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)
index 6981e4eac7da9d41f9487acddc732ee14e1d1560..9408e31cdf08b37e4090d3c9e11c38c81fd5c3fe 100644 (file)
@@ -24,6 +24,7 @@
 #include <asm/cache.h>
 #include <asm/dwarf2.h>
 #include <xen/interface/elfnote.h>
+#include <xen/interface/features.h>
 
        .section .bootstrap.text, "ax", @progbits
        .code64
@@ -160,6 +161,18 @@ gdt_end:
 ENTRY(empty_zero_page)
        .skip PAGE_SIZE
 
+#ifdef CONFIG_XEN_UNPRIVILEGED_GUEST
+# define XEN_DOM0_CAP          0
+# define XEN_DOM0_CAP_STR      ""
+#else
+# define XEN_DOM0_CAP          (1 << XENFEAT_dom0)
+# if CONFIG_XEN_COMPAT < 0x040200
+#  define XEN_DOM0_CAP_STR     ""
+# else
+#  define XEN_DOM0_CAP_STR     "|dom0"
+# endif
+#endif
+
 #if CONFIG_XEN_COMPAT <= 0x030002
 /*
  * __xen_guest information
@@ -206,6 +219,15 @@ ENTRY(empty_zero_page)
        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|supervisor_mode_kernel")
+       ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .ascii, "writable_page_tables";
+                                                .ascii  "|writable_descriptor_tables";
+                                                .ascii  "|auto_translated_physmap";
+                                                .ascii  "|supervisor_mode_kernel";
+                                                .asciz  XEN_DOM0_CAP_STR)
+       ELFNOTE(Xen, XEN_ELFNOTE_SUPPORTED_FEATURES, .long, XEN_DOM0_CAP |
+                                          (1 << XENFEAT_writable_page_tables) |
+                                          (1 << XENFEAT_writable_descriptor_tables) |
+                                          (1 << XENFEAT_auto_translated_physmap) |
+                                          (1 << XENFEAT_supervisor_mode_kernel))
        ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz, "generic")
        ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long,  1)