MdeModulePkg: Add BootScriptExecutorDxe driver
Signed-off-by: jljusten Reviewed-by: mdkinney Reviewed-by: rsun3 Reviewed-by: jyao1 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12225 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
## @file
|
||||
# This is the assembly code for transferring to control to OS S3 waking vector
|
||||
# for X64 platform
|
||||
#
|
||||
# Copyright (c) 2006, 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.
|
||||
#
|
||||
##
|
||||
|
||||
ASM_GLOBAL ASM_PFX(AsmTransferControl)
|
||||
ASM_PFX(AsmTransferControl):
|
||||
# rcx S3WakingVector :DWORD
|
||||
# rdx AcpiLowMemoryBase :DWORD
|
||||
lea _AsmTransferControl_al_0000, %eax
|
||||
movq $0x2800000000, %r8
|
||||
orq %r8, %rax
|
||||
pushq %rax
|
||||
shrd $20, %ecx, %ebx
|
||||
andl $0x0f, %ecx
|
||||
movw %cx, %bx
|
||||
movl %ebx, jmp_addr
|
||||
lret
|
||||
_AsmTransferControl_al_0000:
|
||||
.byte 0x0b8, 0x30, 0 # mov ax, 30h as selector
|
||||
movl %eax, %ds
|
||||
movl %eax, %es
|
||||
movl %eax, %fs
|
||||
movl %eax, %gs
|
||||
movl %eax, %ss
|
||||
movq %cr0, %rax
|
||||
movq %cr4, %rbx
|
||||
.byte 0x66
|
||||
andl $0x7ffffffe, %eax
|
||||
andb $0xdf, %bl
|
||||
movq %rax, %cr0
|
||||
.byte 0x66
|
||||
movl $0x0c0000080, %ecx
|
||||
rdmsr
|
||||
andb $0xfe, %ah
|
||||
wrmsr
|
||||
movq %rbx, %cr4
|
||||
.byte 0x0ea # jmp far jmp_addr
|
||||
jmp_addr:
|
||||
.long 0
|
||||
|
||||
ASM_GLOBAL ASM_PFX(AsmTransferControl32)
|
||||
ASM_PFX(AsmTransferControl32):
|
||||
# S3WakingVector :DWORD
|
||||
# AcpiLowMemoryBase :DWORD
|
||||
pushq %rbp
|
||||
movl %esp,%ebp
|
||||
.byte 0x8d, 0x05 # lea eax, AsmTransferControl16
|
||||
ASM_GLOBAL ASM_PFX(AsmFixAddress16)
|
||||
ASM_PFX(AsmFixAddress16):
|
||||
.long 0
|
||||
pushq $0x28 # CS
|
||||
pushq %rax
|
||||
lret
|
||||
|
||||
ASM_GLOBAL ASM_PFX(AsmTransferControl16)
|
||||
ASM_PFX(AsmTransferControl16):
|
||||
.byte 0xb8,0x30,0 # mov ax, 30h as selector
|
||||
movw %ax,%ds
|
||||
movw %ax,%es
|
||||
movw %ax,%fs
|
||||
movw %ax,%gs
|
||||
movw %ax,%ss
|
||||
movq %cr0, %rax # Get control register 0
|
||||
.byte 0x66
|
||||
.byte 0x83,0xe0,0xfe # and eax, 0fffffffeh ; Clear PE bit (bit #0)
|
||||
.byte 0xf,0x22,0xc0 # mov cr0, eax ; Activate real mode
|
||||
.byte 0xea # jmp far AsmJmpAddr32
|
||||
ASM_GLOBAL ASM_PFX(AsmJmpAddr32)
|
||||
ASM_PFX(AsmJmpAddr32):
|
||||
.long 0
|
@@ -0,0 +1,84 @@
|
||||
;; @file
|
||||
; This is the assembly code for transferring to control to OS S3 waking vector
|
||||
; for X64 platform
|
||||
;
|
||||
; Copyright (c) 2006, 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.
|
||||
;
|
||||
;;
|
||||
|
||||
.code
|
||||
|
||||
EXTERNDEF AsmFixAddress16:DWORD
|
||||
EXTERNDEF AsmJmpAddr32:DWORD
|
||||
|
||||
AsmTransferControl PROC
|
||||
; rcx S3WakingVector :DWORD
|
||||
; rdx AcpiLowMemoryBase :DWORD
|
||||
lea eax, @F
|
||||
mov r8, 2800000000h
|
||||
or rax, r8
|
||||
push rax
|
||||
shrd ebx, ecx, 20
|
||||
and ecx, 0fh
|
||||
mov bx, cx
|
||||
mov @jmp_addr, ebx
|
||||
retf
|
||||
@@:
|
||||
DB 0b8h, 30h, 0 ; mov ax, 30h as selector
|
||||
mov ds, eax
|
||||
mov es, eax
|
||||
mov fs, eax
|
||||
mov gs, eax
|
||||
mov ss, eax
|
||||
mov rax, cr0
|
||||
mov rbx, cr4
|
||||
DB 66h
|
||||
and eax, ((NOT 080000001h) AND 0ffffffffh)
|
||||
and bl, NOT (1 SHL 5)
|
||||
mov cr0, rax
|
||||
DB 66h
|
||||
mov ecx, 0c0000080h
|
||||
rdmsr
|
||||
and ah, NOT 1
|
||||
wrmsr
|
||||
mov cr4, rbx
|
||||
DB 0eah ; jmp far @jmp_addr
|
||||
@jmp_addr DD ?
|
||||
AsmTransferControl ENDP
|
||||
|
||||
AsmTransferControl32 PROC
|
||||
; S3WakingVector :DWORD
|
||||
; AcpiLowMemoryBase :DWORD
|
||||
push rbp
|
||||
mov ebp, esp
|
||||
DB 8dh, 05h ; lea eax, AsmTransferControl16
|
||||
AsmFixAddress16 DD ?
|
||||
push 28h ; CS
|
||||
push rax
|
||||
retf
|
||||
AsmTransferControl32 ENDP
|
||||
|
||||
AsmTransferControl16 PROC
|
||||
DB 0b8h, 30h, 0 ; mov ax, 30h as selector
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov fs, ax
|
||||
mov gs, ax
|
||||
mov ss, ax
|
||||
mov rax, cr0 ; Get control register 0
|
||||
DB 66h
|
||||
DB 83h, 0e0h, 0feh ; and eax, 0fffffffeh ; Clear PE bit (bit #0)
|
||||
DB 0fh, 22h, 0c0h ; mov cr0, eax ; Activate real mode
|
||||
DB 0eah ; jmp far AsmJmpAddr32
|
||||
AsmJmpAddr32 DD ?
|
||||
AsmTransferControl16 ENDP
|
||||
|
||||
END
|
@@ -0,0 +1,67 @@
|
||||
/** @file
|
||||
Set a IDT entry for debug purpose
|
||||
|
||||
Set a IDT entry for interrupt vector 3 for debug purpose for x64 platform
|
||||
|
||||
Copyright (c) 2006 - 2010, 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.
|
||||
|
||||
**/
|
||||
#include "ScriptExecute.h"
|
||||
//
|
||||
// INTERRUPT_GATE_DESCRIPTOR and SetIdtEntry () are used to setup IDT to do debug
|
||||
//
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
typedef struct {
|
||||
UINT16 Offset15To0;
|
||||
UINT16 SegmentSelector;
|
||||
UINT16 Attributes;
|
||||
UINT16 Offset31To16;
|
||||
UINT32 Offset63To32;
|
||||
UINT32 Reserved;
|
||||
} INTERRUPT_GATE_DESCRIPTOR;
|
||||
|
||||
#define INTERRUPT_GATE_ATTRIBUTE 0x8e00
|
||||
|
||||
#pragma pack()
|
||||
/**
|
||||
Set a IDT entry for interrupt vector 3 for debug purpose.
|
||||
|
||||
@param AcpiS3Context a pointer to a structure of ACPI_S3_CONTEXT
|
||||
|
||||
**/
|
||||
VOID
|
||||
SetIdtEntry (
|
||||
IN ACPI_S3_CONTEXT *AcpiS3Context
|
||||
)
|
||||
{
|
||||
INTERRUPT_GATE_DESCRIPTOR *IdtEntry;
|
||||
IA32_DESCRIPTOR *IdtDescriptor;
|
||||
UINTN S3DebugBuffer;
|
||||
|
||||
//
|
||||
// Restore IDT for debug
|
||||
//
|
||||
IdtDescriptor = (IA32_DESCRIPTOR *) (UINTN) (AcpiS3Context->IdtrProfile);
|
||||
IdtEntry = (INTERRUPT_GATE_DESCRIPTOR *)(IdtDescriptor->Base + (3 * sizeof (INTERRUPT_GATE_DESCRIPTOR)));
|
||||
S3DebugBuffer = (UINTN) (AcpiS3Context->S3DebugBufferAddress);
|
||||
|
||||
IdtEntry->Offset15To0 = (UINT16)S3DebugBuffer;
|
||||
IdtEntry->SegmentSelector = (UINT16)AsmReadCs ();;
|
||||
IdtEntry->Attributes = (UINT16)INTERRUPT_GATE_ATTRIBUTE;
|
||||
IdtEntry->Offset31To16 = (UINT16)(S3DebugBuffer >> 16);
|
||||
IdtEntry->Offset63To32 = (UINT32)(S3DebugBuffer >> 32);
|
||||
IdtEntry->Reserved = 0;
|
||||
|
||||
AsmWriteIdtr (IdtDescriptor);
|
||||
}
|
||||
|
Reference in New Issue
Block a user