\r
global ASM_PFX(SmmStartup)\r
ASM_PFX(SmmStartup):\r
+ DB 0x66\r
+ mov eax, 0x80000001 ; read capability\r
+ cpuid\r
+ DB 0x66\r
+ mov ebx, edx ; rdmsr will change edx. keep it in ebx.\r
DB 0x66, 0xb8\r
ASM_PFX(gSmmCr3): DD 0\r
mov cr3, eax\r
DB 0x66, 0xb8\r
ASM_PFX(gSmmCr4): DD 0\r
mov cr4, eax\r
+ DB 0x66\r
+ mov ecx, 0xc0000080 ; IA32_EFER MSR\r
+ rdmsr\r
+ DB 0x66\r
+ test ebx, BIT20 ; check NXE capability\r
+ jz .1\r
+ or ah, BIT3 ; set NXE bit\r
+ wrmsr\r
+.1:\r
DB 0x66, 0xb8\r
ASM_PFX(gSmmCr0): DD 0\r
DB 0xbf, PROTECT_MODE_DS, 0 ; mov di, PROTECT_MODE_DS\r
\r
global ASM_PFX(SmmStartup)\r
ASM_PFX(SmmStartup):\r
+ DB 0x66\r
+ mov eax, 0x80000001 ; read capability\r
+ cpuid\r
+ DB 0x66\r
+ mov ebx, edx ; rdmsr will change edx. keep it in ebx.\r
DB 0x66, 0xb8 ; mov eax, imm32\r
ASM_PFX(gSmmCr3): DD 0\r
mov cr3, rax\r
DB 0x66\r
mov ecx, 0xc0000080 ; IA32_EFER MSR\r
rdmsr\r
- or ah, 1 ; set LME bit\r
+ or ah, BIT0 ; set LME bit\r
+ DB 0x66\r
+ test ebx, BIT20 ; check NXE capability\r
+ jz .1\r
+ or ah, BIT3 ; set NXE bit\r
+.1:\r
wrmsr\r
DB 0x66, 0xb8 ; mov eax, imm32\r
ASM_PFX(gSmmCr0): DD 0\r