[haiku-commits] haiku: hrev46044 - in src/system/kernel/arch/x86/paging: 64bit pae src/system/kernel/arch/x86

  • From: pdziepak@xxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 14 Sep 2013 05:42:23 +0200 (CEST)

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];


Other related posts:

  • » [haiku-commits] haiku: hrev46044 - in src/system/kernel/arch/x86/paging: 64bit pae src/system/kernel/arch/x86 - pdziepak