aboutsummaryrefslogtreecommitdiff
path: root/EfiGuardDxe/X64/Cet.asm
diff options
context:
space:
mode:
Diffstat (limited to 'EfiGuardDxe/X64/Cet.asm')
-rw-r--r--EfiGuardDxe/X64/Cet.asm37
1 files changed, 37 insertions, 0 deletions
diff --git a/EfiGuardDxe/X64/Cet.asm b/EfiGuardDxe/X64/Cet.asm
new file mode 100644
index 0000000..74433c2
--- /dev/null
+++ b/EfiGuardDxe/X64/Cet.asm
@@ -0,0 +1,37 @@
+MSR_S_CET EQU 6A2h
+MSR_S_CET_SH_STK_EN EQU 1
+CR4_CET EQU (1 SHL 23)
+N_CR4_CET EQU 23
+
+.code
+
+align 16
+AsmDisableCet PROC
+ mov ecx, MSR_S_CET
+ rdmsr
+ test al, MSR_S_CET_SH_STK_EN
+ jz @F ; if z, shadow stack not enabled
+
+ ; Pop pushed data for 'call'
+ mov rax, 1
+ incsspq rax
+
+@@:
+ mov rax, cr4
+ btr eax, N_CR4_CET ; clear CR4_CET
+ mov cr4, rax
+ ret
+AsmDisableCet ENDP
+
+align 16
+AsmEnableCet PROC
+ mov rax, cr4
+ bts eax, N_CR4_CET ; set CR4_CET
+ mov cr4, rax
+
+ ; Use jmp to skip check for 'ret'
+ pop rax
+ jmp rax
+AsmEnableCet ENDP
+
+end