mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-25 22:54:51 +02:00
Ring3: Enabled SMAP and SMEP.
This commit is contained in:
parent
8c069a27e5
commit
db69014ad8
@ -701,6 +701,10 @@ CreateIdentityMappingPageTables (
|
|||||||
PAGE_TABLE_1G_ENTRY *PageDirectory1GEntry;
|
PAGE_TABLE_1G_ENTRY *PageDirectory1GEntry;
|
||||||
UINT64 AddressEncMask;
|
UINT64 AddressEncMask;
|
||||||
IA32_CR4 Cr4;
|
IA32_CR4 Cr4;
|
||||||
|
IA32_EFLAGS32 Eflags;
|
||||||
|
UINT32 Ebx;
|
||||||
|
|
||||||
|
Ebx = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Set PageMapLevel5Entry to suppress incorrect compiler/analyzer warnings
|
// Set PageMapLevel5Entry to suppress incorrect compiler/analyzer warnings
|
||||||
@ -970,5 +974,21 @@ CreateIdentityMappingPageTables (
|
|||||||
EnableExecuteDisableBit ();
|
EnableExecuteDisableBit ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Forbid supervisor-mode accesses to any user-mode pages.
|
||||||
|
// SMEP and SMAP must be supported.
|
||||||
|
//
|
||||||
|
AsmCpuidEx (0x07, 0x0, NULL, &Ebx, NULL, NULL);
|
||||||
|
if (((Ebx & BIT20) != 0) && ((Ebx & BIT7) != 0)) {
|
||||||
|
Cr4.UintN = AsmReadCr4 ();
|
||||||
|
Cr4.Bits.SMAP = 1;
|
||||||
|
Cr4.Bits.SMEP = 1;
|
||||||
|
AsmWriteCr4 (Cr4.UintN);
|
||||||
|
|
||||||
|
Eflags.UintN = AsmReadEflags ();
|
||||||
|
Eflags.Bits.AC = 0;
|
||||||
|
AsmWriteEflags (Eflags.UintN);
|
||||||
|
}
|
||||||
|
|
||||||
return (UINTN)PageMap;
|
return (UINTN)PageMap;
|
||||||
}
|
}
|
||||||
|
@ -6502,6 +6502,24 @@ AsmReadCr4 (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Writes a value to the EFLAGS register.
|
||||||
|
|
||||||
|
Writes and returns a new value to the EFLAGS register. This function is
|
||||||
|
only available on IA-32 and x64. This writes a 32-bit value on IA-32 and
|
||||||
|
a 64-bit value on x64.
|
||||||
|
|
||||||
|
@param EFLAGS The value to write to EFLAGS.
|
||||||
|
|
||||||
|
@return The value written to EFLAGS.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINTN
|
||||||
|
EFIAPI
|
||||||
|
AsmWriteEflags (
|
||||||
|
UINTN Eflags
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Writes a value to Control Register 0 (CR0).
|
Writes a value to Control Register 0 (CR0).
|
||||||
|
|
||||||
|
@ -294,6 +294,7 @@
|
|||||||
X64/ReadCr2.nasm| MSFT
|
X64/ReadCr2.nasm| MSFT
|
||||||
X64/ReadCr0.nasm| MSFT
|
X64/ReadCr0.nasm| MSFT
|
||||||
X64/ReadEflags.nasm| MSFT
|
X64/ReadEflags.nasm| MSFT
|
||||||
|
X64/WriteEflags.nasm
|
||||||
|
|
||||||
X64/TdCall.nasm
|
X64/TdCall.nasm
|
||||||
X64/TdVmcall.nasm
|
X64/TdVmcall.nasm
|
||||||
|
33
MdePkg/Library/BaseLib/X64/WriteEflags.nasm
Normal file
33
MdePkg/Library/BaseLib/X64/WriteEflags.nasm
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
|
||||||
|
; SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
;
|
||||||
|
; Module Name:
|
||||||
|
;
|
||||||
|
; WriteEflags.Asm
|
||||||
|
;
|
||||||
|
; Abstract:
|
||||||
|
;
|
||||||
|
; AsmWriteEflags function
|
||||||
|
;
|
||||||
|
; Notes:
|
||||||
|
;
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
DEFAULT REL
|
||||||
|
SECTION .text
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; UINTN
|
||||||
|
; EFIAPI
|
||||||
|
; AsmWriteEflags (
|
||||||
|
; UINTN Eflags
|
||||||
|
; );
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
global ASM_PFX(AsmWriteEflags)
|
||||||
|
ASM_PFX(AsmWriteEflags):
|
||||||
|
push rcx
|
||||||
|
popfq
|
||||||
|
mov rax, rcx
|
||||||
|
ret
|
Loading…
x
Reference in New Issue
Block a user