1;------------------------------------------------------------------------------ ; 2; Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR> 3; This program and the accompanying materials 4; are licensed and made available under the terms and conditions of the BSD License 5; which accompanies this distribution. The full text of the license may be found at 6; http://opensource.org/licenses/bsd-license.php. 7; 8; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 9; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 10; 11; Module Name: 12; 13; SmmInit.Asm 14; 15; Abstract: 16; 17; Functions for relocating SMBASE's for all processors 18; 19;------------------------------------------------------------------------------- 20 21EXTERNDEF SmmInitHandler:PROC 22EXTERNDEF gSmmCr0:DWORD 23EXTERNDEF gSmmCr3:DWORD 24EXTERNDEF gSmmCr4:DWORD 25EXTERNDEF gSmmJmpAddr:QWORD 26EXTERNDEF gcSmmInitTemplate:BYTE 27EXTERNDEF gcSmmInitSize:WORD 28EXTERNDEF mRebasedFlag:PTR BYTE 29EXTERNDEF mSmmRelocationOriginalAddress:QWORD 30EXTERNDEF mRebasedFlagAddr32:DWORD 31EXTERNDEF mSmmRelocationOriginalAddressPtr32:DWORD 32EXTERNDEF gSmmInitStack:QWORD 33EXTERNDEF gcSmiInitGdtr:FWORD 34 35 .code 36 37gcSmiInitGdtr LABEL FWORD 38 DW 0 39 DQ 0 40 41SmmStartup PROC 42 DB 66h, 0b8h ; mov eax, imm32 43gSmmCr3 DD ? 44 mov cr3, rax 45 DB 66h, 2eh 46 lgdt fword ptr [ebp + (offset gcSmiInitGdtr - SmmStartup)] 47 DB 66h, 0b8h ; mov eax, imm32 48gSmmCr4 DD ? 49 or ah, 2 ; enable XMM registers access 50 mov cr4, rax 51 DB 66h 52 mov ecx, 0c0000080h ; IA32_EFER MSR 53 rdmsr 54 or ah, 1 ; set LME bit 55 wrmsr 56 DB 66h, 0b8h ; mov eax, imm32 57gSmmCr0 DD ? 58 mov cr0, rax ; enable protected mode & paging 59 DB 66h, 0eah ; far jmp to long mode 60gSmmJmpAddr DQ @LongMode 61@LongMode: ; long-mode starts here 62 DB 48h, 0bch ; mov rsp, imm64 63gSmmInitStack DQ ? 64 and sp, 0fff0h ; make sure RSP is 16-byte aligned 65 ; 66 ; Accoring to X64 calling convention, XMM0~5 are volatile, we need to save 67 ; them before calling C-function. 68 ; 69 sub rsp, 60h 70 movdqa [rsp], xmm0 71 movdqa [rsp + 10h], xmm1 72 movdqa [rsp + 20h], xmm2 73 movdqa [rsp + 30h], xmm3 74 movdqa [rsp + 40h], xmm4 75 movdqa [rsp + 50h], xmm5 76 77 add rsp, -20h 78 call SmmInitHandler 79 add rsp, 20h 80 81 ; 82 ; Restore XMM0~5 after calling C-function. 83 ; 84 movdqa xmm0, [rsp] 85 movdqa xmm1, [rsp + 10h] 86 movdqa xmm2, [rsp + 20h] 87 movdqa xmm3, [rsp + 30h] 88 movdqa xmm4, [rsp + 40h] 89 movdqa xmm5, [rsp + 50h] 90 91 rsm 92SmmStartup ENDP 93 94gcSmmInitTemplate LABEL BYTE 95 96_SmmInitTemplate PROC 97 DB 66h, 2eh, 8bh, 2eh ; mov ebp, cs:[@F] 98 DW @L1 - _SmmInitTemplate + 8000h 99 DB 66h, 81h, 0edh, 00h, 00h, 03h, 00 ; sub ebp, 30000h 100 jmp bp ; jmp ebp actually 101@L1: 102 DQ SmmStartup 103_SmmInitTemplate ENDP 104 105gcSmmInitSize DW $ - gcSmmInitTemplate 106 107SmmRelocationSemaphoreComplete PROC 108 push rax 109 mov rax, mRebasedFlag 110 mov byte ptr [rax], 1 111 pop rax 112 jmp [mSmmRelocationOriginalAddress] 113SmmRelocationSemaphoreComplete ENDP 114 115; 116; Semaphore code running in 32-bit mode 117; 118SmmRelocationSemaphoreComplete32 PROC 119 ; 120 ; mov byte ptr [], 1 121 ; 122 db 0c6h, 05h 123mRebasedFlagAddr32 dd 0 124 db 1 125 ; 126 ; jmp dword ptr [] 127 ; 128 db 0ffh, 25h 129mSmmRelocationOriginalAddressPtr32 dd 0 130SmmRelocationSemaphoreComplete32 ENDP 131 132 END 133