mirror of https://github.com/acidanthera/audk.git
95 lines
2.6 KiB
NASM
95 lines
2.6 KiB
NASM
|
;------------------------------------------------------------------------------ ;
|
||
|
; Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>
|
||
|
; This program and the accompanying materials
|
||
|
; are licensed and made available under the terms and conditions of the BSD License
|
||
|
; which accompanies this distribution. The full text of the license may be found at
|
||
|
; http://opensource.org/licenses/bsd-license.php.
|
||
|
;
|
||
|
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||
|
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||
|
;
|
||
|
; Module Name:
|
||
|
;
|
||
|
; SmmInit.Asm
|
||
|
;
|
||
|
; Abstract:
|
||
|
;
|
||
|
; Functions for relocating SMBASE's for all processors
|
||
|
;
|
||
|
;-------------------------------------------------------------------------------
|
||
|
|
||
|
.686p
|
||
|
.xmm
|
||
|
.model flat,C
|
||
|
|
||
|
SmmInitHandler PROTO C
|
||
|
|
||
|
EXTERNDEF C gSmmCr0:DWORD
|
||
|
EXTERNDEF C gSmmCr3:DWORD
|
||
|
EXTERNDEF C gSmmCr4:DWORD
|
||
|
EXTERNDEF C gcSmmInitTemplate:BYTE
|
||
|
EXTERNDEF C gcSmmInitSize:WORD
|
||
|
EXTERNDEF C gSmmJmpAddr:QWORD
|
||
|
EXTERNDEF C mRebasedFlag:PTR BYTE
|
||
|
EXTERNDEF C mSmmRelocationOriginalAddress:DWORD
|
||
|
EXTERNDEF C gSmmInitStack:DWORD
|
||
|
EXTERNDEF C gcSmiInitGdtr:FWORD
|
||
|
|
||
|
PROTECT_MODE_CS EQU 08h
|
||
|
PROTECT_MODE_DS EQU 20h
|
||
|
|
||
|
.code
|
||
|
|
||
|
gcSmiInitGdtr LABEL FWORD
|
||
|
DW 0
|
||
|
DQ 0
|
||
|
|
||
|
SmmStartup PROC
|
||
|
DB 66h, 0b8h
|
||
|
gSmmCr3 DD ?
|
||
|
mov cr3, eax
|
||
|
DB 67h, 66h
|
||
|
lgdt fword ptr cs:[ebp + (offset gcSmiInitGdtr - SmmStartup)]
|
||
|
DB 66h, 0b8h
|
||
|
gSmmCr4 DD ?
|
||
|
mov cr4, eax
|
||
|
DB 66h, 0b8h
|
||
|
gSmmCr0 DD ?
|
||
|
DB 0bfh, PROTECT_MODE_DS, 0 ; mov di, PROTECT_MODE_DS
|
||
|
mov cr0, eax
|
||
|
DB 66h, 0eah ; jmp far [ptr48]
|
||
|
gSmmJmpAddr LABEL QWORD
|
||
|
DD @32bit
|
||
|
DW PROTECT_MODE_CS
|
||
|
@32bit:
|
||
|
mov ds, edi
|
||
|
mov es, edi
|
||
|
mov fs, edi
|
||
|
mov gs, edi
|
||
|
mov ss, edi
|
||
|
DB 0bch ; mov esp, imm32
|
||
|
gSmmInitStack DD ?
|
||
|
call SmmInitHandler
|
||
|
rsm
|
||
|
SmmStartup ENDP
|
||
|
|
||
|
gcSmmInitTemplate LABEL BYTE
|
||
|
|
||
|
_SmmInitTemplate PROC
|
||
|
DB 66h
|
||
|
mov ebp, SmmStartup
|
||
|
DB 66h, 81h, 0edh, 00h, 00h, 03h, 00 ; sub ebp, 30000h
|
||
|
jmp bp ; jmp ebp actually
|
||
|
_SmmInitTemplate ENDP
|
||
|
|
||
|
gcSmmInitSize DW $ - gcSmmInitTemplate
|
||
|
|
||
|
SmmRelocationSemaphoreComplete PROC
|
||
|
push eax
|
||
|
mov eax, mRebasedFlag
|
||
|
mov byte ptr [eax], 1
|
||
|
pop eax
|
||
|
jmp [mSmmRelocationOriginalAddress]
|
||
|
SmmRelocationSemaphoreComplete ENDP
|
||
|
END
|