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

  • From: pdziepak@xxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 18 Apr 2013 00:17:44 +0200 (CEST)

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)


Other related posts:

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