X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=UefiCpuPkg%2FPiSmmCpuDxeSmm%2FX64%2FSmiEntry.asm;h=094cf2c3da330820ef9056c57ff78aaf0cbfa6f4;hb=e1f0eed1b2a9954428708bd91243f981e3161301;hp=c556bf5f5b284813e2bfb1e327fff4bd8560a164;hpb=427e3573426fe425141e413d17cf3ff65452fdb8;p=mirror_edk2.git diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm index c556bf5f5b..094cf2c3da 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm @@ -22,12 +22,13 @@ ; Variables referenced by C code ; EXTERNDEF SmiRendezvous:PROC +EXTERNDEF CpuSmmDebugEntry:PROC +EXTERNDEF CpuSmmDebugExit:PROC EXTERNDEF gcSmiHandlerTemplate:BYTE EXTERNDEF gcSmiHandlerSize:WORD EXTERNDEF gSmiCr3:DWORD EXTERNDEF gSmiStack:DWORD EXTERNDEF gSmbase:DWORD -EXTERNDEF FeaturePcdGet (PcdCpuSmmDebug):BYTE EXTERNDEF gSmiHandlerIdtr:FWORD @@ -124,14 +125,6 @@ gSmiCr3 DD ? sgdt fword ptr [rsp] mov eax, [rsp + 2] ; eax = GDT base add esp, 8 - mov edx, eax - add edx, GDT_SIZE - mov [rax + TSS_SEGMENT + 2], dl - mov [rax + TSS_SEGMENT + 3], dh - DB 0c1h, 0eah, 10h ; shr edx, 16 - mov [rax + TSS_SEGMENT + 4], dl - mov [rax + TSS_SEGMENT + 7], dh - mov edx, eax mov dl, 89h mov [rax + TSS_SEGMENT + 5], dl ; clear busy flag mov eax, TSS_SEGMENT @@ -147,7 +140,7 @@ Base: or ah, 1 wrmsr mov rbx, cr0 - bts ebx, 31 + or ebx, 080010000h ; enable paging + WP mov cr0, rbx retf @LongMode: ; long mode (64-bit code) starts here @@ -165,26 +158,7 @@ Base: ; jmp _SmiHandler ; instruction is not needed _SmiHandler: -; -; The following lines restore DR6 & DR7 before running C code. They are useful -; when you want to enable hardware breakpoints in SMM. -; -; NOTE: These lines might not be appreciated in runtime since they might -; conflict with OS debugging facilities. Turn them off in RELEASE. -; - mov rax, offset FeaturePcdGet (PcdCpuSmmDebug) ;Get absolute address. Avoid RIP relative addressing - cmp byte ptr [rax], 0 - jz @1 - - DB 48h, 8bh, 0dh ; mov rcx, [rip + disp32] - DD SSM_DR6 - ($ + 4 - _SmiEntryPoint + 8000h) - DB 48h, 8bh, 15h ; mov rdx, [rip + disp32] - DD SSM_DR7 - ($ + 4 - _SmiEntryPoint + 8000h) - mov dr6, rcx - mov dr7, rdx -@1: - mov rcx, [rsp] ; rcx <- CpuIndex - mov rax, SmiRendezvous ; rax <- absolute addr of SmiRedezvous + mov rbx, [rsp] ; rbx <- CpuIndex ; ; Save FP registers @@ -194,7 +168,19 @@ _SmiHandler: fxsave [rsp] add rsp, -20h + + mov rcx, rbx + mov rax, CpuSmmDebugEntry + call rax + + mov rcx, rbx + mov rax, SmiRendezvous ; rax <- absolute addr of SmiRedezvous + call rax + + mov rcx, rbx + mov rax, CpuSmmDebugExit call rax + add rsp, 20h ; @@ -203,17 +189,6 @@ _SmiHandler: DB 48h ; FXRSTOR64 fxrstor [rsp] - mov rax, offset FeaturePcdGet (PcdCpuSmmDebug) ;Get absolute address. Avoid RIP relative addressing - cmp byte ptr [rax], 0 - jz @2 - - mov rdx, dr7 - mov rcx, dr6 - DB 48h, 89h, 15h ; mov [rip + disp32], rdx - DD SSM_DR7 - ($ + 4 - _SmiEntryPoint + 8000h) - DB 48h, 89h, 0dh ; mov [rip + disp32], rcx - DD SSM_DR6 - ($ + 4 - _SmiEntryPoint + 8000h) -@2: rsm gcSmiHandlerSize DW $ - _SmiEntryPoint