hrev45522 adds 1 changeset to branch 'master' old head: 807ea4dad0131bf3a50f669df1df00c8d2f0612a new head: 103977d0a94f8218b2df110ee2f8a8157edf692f overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=103977d+%5E807ea4d ---------------------------------------------------------------------------- 103977d: arch: NX is initialized too early on non-boot CPUs [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev45522 Commit: 103977d0a94f8218b2df110ee2f8a8157edf692f URL: http://cgit.haiku-os.org/haiku/commit/?id=103977d Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Wed Apr 17 22:15:57 2013 UTC ---------------------------------------------------------------------------- 3 files changed, 20 insertions(+), 17 deletions(-) src/system/kernel/arch/x86/arch_cpu.cpp | 9 +++++++++ .../arch/x86/paging/64bit/X86PagingMethod64Bit.cpp | 16 +++++----------- .../arch/x86/paging/pae/X86PagingMethodPAE.cpp | 12 ++++++------ ---------------------------------------------------------------------------- diff --git a/src/system/kernel/arch/x86/arch_cpu.cpp b/src/system/kernel/arch/x86/arch_cpu.cpp index ff35238..7e60ae4 100644 --- a/src/system/kernel/arch/x86/arch_cpu.cpp +++ b/src/system/kernel/arch/x86/arch_cpu.cpp @@ -747,6 +747,15 @@ arch_cpu_init_percpu(kernel_args* args, int cpu) } } + // If availalbe enable NX-bit (No eXecute). Boot CPU can not enable + // NX-bit here since PAE should be enabled first. + if (cpu != 0) { + if (x86_check_feature(IA32_FEATURE_AMD_EXT_NX, FEATURE_EXT_AMD)) { + x86_write_msr(IA32_MSR_EFER, x86_read_msr(IA32_MSR_EFER) + | IA32_MSR_EFER_NX); + } + } + return B_OK; } diff --git a/src/system/kernel/arch/x86/paging/64bit/X86PagingMethod64Bit.cpp b/src/system/kernel/arch/x86/paging/64bit/X86PagingMethod64Bit.cpp index 059f99c..3f04f88 100644 --- a/src/system/kernel/arch/x86/paging/64bit/X86PagingMethod64Bit.cpp +++ b/src/system/kernel/arch/x86/paging/64bit/X86PagingMethod64Bit.cpp @@ -59,9 +59,11 @@ X86PagingMethod64Bit::Init(kernel_args* args, fKernelPhysicalPML4 = args->arch_args.phys_pgdir; fKernelVirtualPML4 = (uint64*)(addr_t)args->arch_args.vir_pgdir; - // enable NX-bit on all CPUs - if (x86_check_feature(IA32_FEATURE_AMD_EXT_NX, FEATURE_EXT_AMD)) - call_all_cpus_sync(&_EnableExecutionDisable, NULL); + // if availalbe enable NX-bit (No eXecute) + if (x86_check_feature(IA32_FEATURE_AMD_EXT_NX, FEATURE_EXT_AMD)) { + x86_write_msr(IA32_MSR_EFER, x86_read_msr(IA32_MSR_EFER) + | IA32_MSR_EFER_NX); + } // Ensure that the user half of the address space is clear. This removes // the temporary identity mapping made by the boot loader. @@ -380,11 +382,3 @@ X86PagingMethod64Bit::PutPageTableEntryInTable(uint64* entry, SetTableEntry(entry, page); } - -void -X86PagingMethod64Bit::_EnableExecutionDisable(void* dummy, int cpu) -{ - x86_write_msr(IA32_MSR_EFER, x86_read_msr(IA32_MSR_EFER) - | IA32_MSR_EFER_NX); -} - diff --git a/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp b/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp index d2071bc..90a2aee 100644 --- a/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp +++ b/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp @@ -148,6 +148,12 @@ struct X86PagingMethodPAE::ToPAESwitcher { // enable PAE on all CPUs call_all_cpus_sync(&_EnablePAE, (void*)(addr_t)physicalPDPT); + // if availalbe enable NX-bit (No eXecute) + if (x86_check_feature(IA32_FEATURE_AMD_EXT_NX, FEATURE_EXT_AMD)) { + x86_write_msr(IA32_MSR_EFER, x86_read_msr(IA32_MSR_EFER) + | IA32_MSR_EFER_NX); + } + // set return values _virtualPDPT = pdpt; _physicalPDPT = physicalPDPT; @@ -165,12 +171,6 @@ private: { x86_write_cr3((addr_t)physicalPDPT); x86_write_cr4(x86_read_cr4() | IA32_CR4_PAE | IA32_CR4_GLOBAL_PAGES); - - // if availalbe enable NX-bit (No eXecute) - if (x86_check_feature(IA32_FEATURE_AMD_EXT_NX, FEATURE_EXT_AMD)) { - x86_write_msr(IA32_MSR_EFER, x86_read_msr(IA32_MSR_EFER) - | IA32_MSR_EFER_NX); - } } void _TranslatePageTable(addr_t virtualBase)