hrev46044 adds 1 changeset to branch 'master' old head: 426f721b81ba05cd77e11fc6d697945932148055 new head: b8dc812f3e99db27af1d4e6495a305bfb830a507 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=b8dc812+%5E426f721 ---------------------------------------------------------------------------- b8dc812: x86[_64]: Enable NX on non-boot CPUs as soon as possible [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev46044 Commit: b8dc812f3e99db27af1d4e6495a305bfb830a507 URL: http://cgit.haiku-os.org/haiku/commit/?id=b8dc812 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Sat Sep 14 03:25:56 2013 UTC ---------------------------------------------------------------------------- 3 files changed, 18 insertions(+), 17 deletions(-) src/system/kernel/arch/x86/arch_cpu.cpp | 9 --------- .../arch/x86/paging/64bit/X86PagingMethod64Bit.cpp | 14 ++++++++++---- .../kernel/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 67212e2..a817ec0 100644 --- a/src/system/kernel/arch/x86/arch_cpu.cpp +++ b/src/system/kernel/arch/x86/arch_cpu.cpp @@ -753,15 +753,6 @@ 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 b560db0..2a6ef79 100644 --- a/src/system/kernel/arch/x86/paging/64bit/X86PagingMethod64Bit.cpp +++ b/src/system/kernel/arch/x86/paging/64bit/X86PagingMethod64Bit.cpp @@ -60,10 +60,8 @@ X86PagingMethod64Bit::Init(kernel_args* args, fKernelVirtualPML4 = (uint64*)(addr_t)args->arch_args.vir_pgdir; // 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); - } + if (x86_check_feature(IA32_FEATURE_AMD_EXT_NX, FEATURE_EXT_AMD)) + call_all_cpus_sync(&_EnableExecutionDisable, NULL); // Ensure that the user half of the address space is clear. This removes // the temporary identity mapping made by the boot loader. @@ -384,3 +382,11 @@ X86PagingMethod64Bit::PutPageTableEntryInTable(uint64* entry, SetTableEntry(entry, page); } + +/*static*/ 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 f8b4712..6e1da99 100644 --- a/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp +++ b/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp @@ -149,10 +149,8 @@ struct X86PagingMethodPAE::ToPAESwitcher { 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); - } + if (x86_check_feature(IA32_FEATURE_AMD_EXT_NX, FEATURE_EXT_AMD)) + call_all_cpus_sync(&_EnableExecutionDisable, NULL); // set return values _virtualPDPT = pdpt; @@ -173,6 +171,12 @@ private: x86_write_cr4(x86_read_cr4() | IA32_CR4_PAE | IA32_CR4_GLOBAL_PAGES); } + static void _EnableExecutionDisable(void* dummy, int cpu) + { + x86_write_msr(IA32_MSR_EFER, x86_read_msr(IA32_MSR_EFER) + | IA32_MSR_EFER_NX); + } + void _TranslatePageTable(addr_t virtualBase) { page_table_entry* entry = &fPageHole[virtualBase / B_PAGE_SIZE];