[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86: re-enable NX if disabled
>>> On 04.12.15 at 19:25, <andrew.cooper3@xxxxxxxxxx> wrote: > On 04/12/15 16:31, Jan Beulich wrote: >> @@ -56,6 +60,9 @@ trampoline_gdt: >> .long trampoline_gdt + BOOT_PSEUDORM_DS + 2 - . >> .popsection >> >> +GLOBAL(trampoline_misc_enable_off) >> + .quad 0 >> + > > For clarity, I would name this trampoline_misc_enable_mask and invert > its representation to make the asm easier. Easier? >> + mov bootsym_rel(trampoline_misc_enable_off,4,%esi) >> + mov bootsym_rel(trampoline_misc_enable_off+4,4,%edi) >> + mov %esi,%eax >> + or %edi,%eax >> + jz 1f >> + mov $MSR_IA32_MISC_ENABLE,%ecx >> + rdmsr >> + not %esi >> + not %edi >> + and %esi,%eax >> + and %edi,%edx >> + wrmsr >> +1: We could save the two NOTs, at the expense of the conditional requiring a comparison. Not a whole lot of a win I would say, and I generally prefer zero-initialized data items in the trampoline. >> --- a/xen/arch/x86/cpu/intel.c >> +++ b/xen/arch/x86/cpu/intel.c >> @@ -162,19 +162,29 @@ static void __devinit early_init_intel(s >> if (c->x86 == 15 && c->x86_cache_alignment == 64) >> c->x86_cache_alignment = 128; >> >> - /* Unmask CPUID levels if masked: */ >> + /* Unmask CPUID levels and NX if masked: */ >> if (c->x86 > 6 || (c->x86 == 6 && c->x86_model >= 0xd)) { >> - u64 misc_enable; >> + u64 misc_enable, disable; >> >> rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable); >> >> - if (misc_enable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID) { >> - misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID; >> - wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable); >> - c->cpuid_level = cpuid_eax(0); >> - if (opt_cpu_info || c == &boot_cpu_data) >> - printk(KERN_INFO "revised cpuid level: %d\n", >> - c->cpuid_level); >> + disable = misc_enable & (MSR_IA32_MISC_ENABLE_LIMIT_CPUID | >> + MSR_IA32_MISC_ENABLE_XD_DISABLE); >> + if (disable) { >> + wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable & ~disable); >> + bootsym(trampoline_misc_enable_off) |= disable; >> + } >> + >> + if (disable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID) >> + printk(KERN_INFO "revised cpuid level: %d\n", >> + cpuid_eax(0)); >> + if (disable & MSR_IA32_MISC_ENABLE_XD_DISABLE) { >> + u64 efer; >> + >> + rdmsrl(MSR_EFER, efer); >> + wrmsrl(MSR_EFER, efer | EFER_NX); > > {read,write}_efer(), which also update this_cpu(efer). Oh, indeed. >> + printk(KERN_INFO >> + "re-enabled NX (Execute Disable) protection\n"); >> } > > Because of the asm adjustment of $MSR_IA32_MISC_ENABLE, this code will > only ever run on the BSP. > > As such, it would better live somewhere like early_cpu_detect() (or a > brand new early_cpu_workaround()), making it __init. Well, I considered this but dropped the idea to avoid scattering around of these workarounds even further. But now that you ask for such - if at all I'd consider moving it into intel_cpu_init(). Otoh the place it's now at allows for us noticing if the adjustment in the trampoline didn't take effect (because then early_init_intel() would still result in messages logged, even if in the NX case the AP would be unlikely to make it that far). Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |