From 2a0c5a262fb7555cb0a8c837e2118ad009ccc8f1 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Sat, 23 Jul 2011 08:51:31 +0100 Subject: [PATCH] xen: add privileged (dom0) kernel feature indication Signed-off-by: Jan Beulich --- arch/i386/kernel/head-xen.S | 26 +++++++++++++++++++++++++- arch/x86_64/kernel/head-xen.S | 24 +++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/arch/i386/kernel/head-xen.S b/arch/i386/kernel/head-xen.S index b96ff493..1bc0a97d 100644 --- a/arch/i386/kernel/head-xen.S +++ b/arch/i386/kernel/head-xen.S @@ -12,6 +12,7 @@ #include #include #include +#include /* * 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) diff --git a/arch/x86_64/kernel/head-xen.S b/arch/x86_64/kernel/head-xen.S index 6981e4ea..9408e31c 100644 --- a/arch/x86_64/kernel/head-xen.S +++ b/arch/x86_64/kernel/head-xen.S @@ -24,6 +24,7 @@ #include #include #include +#include .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) -- 2.39.5