aboutsummaryrefslogtreecommitdiff
path: root/EfiGuardDxe/X64/Cet.nasm
blob: b93ca1611034a7b57813d002dc2b3ad18eea576b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
%define MSR_S_CET						0x6A2
%define MSR_S_CET_SH_STK_EN				0x1
%define CR4_CET							(1 << 23)
%define N_CR4_CET						23

DEFAULT REL
SECTION .text

align 16
global ASM_PFX(AsmDisableCet)
ASM_PFX(AsmDisableCet):
	mov ecx, MSR_S_CET
	rdmsr
	test al, MSR_S_CET_SH_STK_EN
	jz .SsDone					; if z, shadow stack not enabled

	; Pop pushed data for 'call'
	mov rax, 1
	incsspq rax

.SsDone:
	mov rax, cr4
	btr eax, N_CR4_CET			; clear CR4_CET
	mov cr4, rax
	ret

align 16
global ASM_PFX(AsmEnableCet)
ASM_PFX(AsmEnableCet):
	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