diff options
Diffstat (limited to 'arch/x86/xen/enlighten.c')
-rw-r--r-- | arch/x86/xen/enlighten.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 3439616d69f1..dfbf70e65860 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -178,6 +178,7 @@ static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0; | |||
178 | static void xen_cpuid(unsigned int *ax, unsigned int *bx, | 178 | static void xen_cpuid(unsigned int *ax, unsigned int *bx, |
179 | unsigned int *cx, unsigned int *dx) | 179 | unsigned int *cx, unsigned int *dx) |
180 | { | 180 | { |
181 | unsigned maskebx = ~0; | ||
181 | unsigned maskecx = ~0; | 182 | unsigned maskecx = ~0; |
182 | unsigned maskedx = ~0; | 183 | unsigned maskedx = ~0; |
183 | 184 | ||
@@ -185,9 +186,16 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, | |||
185 | * Mask out inconvenient features, to try and disable as many | 186 | * Mask out inconvenient features, to try and disable as many |
186 | * unsupported kernel subsystems as possible. | 187 | * unsupported kernel subsystems as possible. |
187 | */ | 188 | */ |
188 | if (*ax == 1) { | 189 | switch (*ax) { |
190 | case 1: | ||
189 | maskecx = cpuid_leaf1_ecx_mask; | 191 | maskecx = cpuid_leaf1_ecx_mask; |
190 | maskedx = cpuid_leaf1_edx_mask; | 192 | maskedx = cpuid_leaf1_edx_mask; |
193 | break; | ||
194 | |||
195 | case 0xb: | ||
196 | /* Suppress extended topology stuff */ | ||
197 | maskebx = 0; | ||
198 | break; | ||
191 | } | 199 | } |
192 | 200 | ||
193 | asm(XEN_EMULATE_PREFIX "cpuid" | 201 | asm(XEN_EMULATE_PREFIX "cpuid" |
@@ -197,6 +205,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, | |||
197 | "=d" (*dx) | 205 | "=d" (*dx) |
198 | : "0" (*ax), "2" (*cx)); | 206 | : "0" (*ax), "2" (*cx)); |
199 | 207 | ||
208 | *bx &= maskebx; | ||
200 | *cx &= maskecx; | 209 | *cx &= maskecx; |
201 | *dx &= maskedx; | 210 | *dx &= maskedx; |
202 | } | 211 | } |
@@ -1075,6 +1084,8 @@ asmlinkage void __init xen_start_kernel(void) | |||
1075 | * Set up some pagetable state before starting to set any ptes. | 1084 | * Set up some pagetable state before starting to set any ptes. |
1076 | */ | 1085 | */ |
1077 | 1086 | ||
1087 | xen_init_mmu_ops(); | ||
1088 | |||
1078 | /* Prevent unwanted bits from being set in PTEs. */ | 1089 | /* Prevent unwanted bits from being set in PTEs. */ |
1079 | __supported_pte_mask &= ~_PAGE_GLOBAL; | 1090 | __supported_pte_mask &= ~_PAGE_GLOBAL; |
1080 | if (!xen_initial_domain()) | 1091 | if (!xen_initial_domain()) |
@@ -1099,7 +1110,6 @@ asmlinkage void __init xen_start_kernel(void) | |||
1099 | */ | 1110 | */ |
1100 | xen_setup_stackprotector(); | 1111 | xen_setup_stackprotector(); |
1101 | 1112 | ||
1102 | xen_init_mmu_ops(); | ||
1103 | xen_init_irq_ops(); | 1113 | xen_init_irq_ops(); |
1104 | xen_init_cpuid_mask(); | 1114 | xen_init_cpuid_mask(); |
1105 | 1115 | ||