mirror of https://github.com/acidanthera/audk.git
Set correct DS/ES/FS/GS/SS segment selectors after GDT loaded.
Signed-off-by: Jeff Fan <jeff.fan@intel.com> Reviewed-by: Rui Sun <rui.sun@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13667 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
8d4e1bd933
commit
abef469fc1
|
@ -0,0 +1,38 @@
|
|||
#------------------------------------------------------------------------------
|
||||
#*
|
||||
#* Copyright (c) 2012, 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.
|
||||
#*
|
||||
#* AsmFuncs.S
|
||||
#*
|
||||
#* Abstract:
|
||||
#*
|
||||
#* Assembly function to set segment selectors.
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
.text
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# VOID
|
||||
# EFIAPI
|
||||
# AsmSetDataSelectors (
|
||||
# IN UINT16 SelectorValue
|
||||
# );
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_GLOBAL ASM_PFX(AsmSetDataSelectors)
|
||||
ASM_PFX(AsmSetDataSelectors):
|
||||
movl 4(%esp), %eax
|
||||
movw %ax, %ss
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %fs
|
||||
movw %ax, %gs
|
||||
ret
|
|
@ -0,0 +1,45 @@
|
|||
;------------------------------------------------------------------------------ ;
|
||||
; Copyright (c) 2012, 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:
|
||||
;
|
||||
; AsmFuncs.Asm
|
||||
;
|
||||
; Abstract:
|
||||
;
|
||||
; Assembly function to set segment selectors.
|
||||
;
|
||||
; Notes:
|
||||
;
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
.686
|
||||
.model flat,C
|
||||
|
||||
.code
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; VOID
|
||||
; EFIAPI
|
||||
; AsmSetDataSelectors (
|
||||
; IN UINT16 SelectorValue
|
||||
; );
|
||||
;------------------------------------------------------------------------------
|
||||
AsmSetDataSelectors PROC near public
|
||||
mov eax, [esp + 4]
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov fs, ax
|
||||
mov gs, ax
|
||||
mov ss, ax
|
||||
ret
|
||||
AsmSetDataSelectors ENDP
|
||||
|
||||
END
|
|
@ -193,6 +193,18 @@ S3RestoreConfig2 (
|
|||
IN EFI_PEI_S3_RESUME2_PPI *This
|
||||
);
|
||||
|
||||
/**
|
||||
Set data segment selectors value including DS/ES/FS/GS/SS.
|
||||
|
||||
@param[in] SelectorValue Segment selector value to be set.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
AsmSetDataSelectors (
|
||||
IN UINT16 SelectorValue
|
||||
);
|
||||
|
||||
//
|
||||
// Globals
|
||||
//
|
||||
|
@ -232,6 +244,8 @@ GLOBAL_REMOVE_IF_UNREFERENCED IA32_GDT mGdtEntries[] = {
|
|||
/* 0x40 */ {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
|
||||
};
|
||||
|
||||
#define DATA_SEGEMENT_SELECTOR 0x18
|
||||
|
||||
//
|
||||
// IA32 Gdt register
|
||||
//
|
||||
|
@ -701,6 +715,7 @@ S3ResumeExecuteBootScript (
|
|||
IA32_DESCRIPTOR *IdtDescriptor;
|
||||
VOID *IdtBuffer;
|
||||
PEI_S3_RESUME_STATE *PeiS3ResumeState;
|
||||
BOOLEAN InterruptStatus;
|
||||
|
||||
DEBUG ((EFI_D_ERROR, "S3ResumeExecuteBootScript()\n"));
|
||||
|
||||
|
@ -769,10 +784,19 @@ S3ResumeExecuteBootScript (
|
|||
*(UINTN*)(IdtDescriptor->Base - sizeof(UINTN)) = (UINTN)GetPeiServicesTablePointer ();
|
||||
}
|
||||
|
||||
InterruptStatus = SaveAndDisableInterrupts ();
|
||||
//
|
||||
// Need to make sure the GDT is loaded with values that support long mode and real mode.
|
||||
//
|
||||
AsmWriteGdtr (&mGdt);
|
||||
//
|
||||
// update segment selectors per the new GDT.
|
||||
//
|
||||
AsmSetDataSelectors (DATA_SEGEMENT_SELECTOR);
|
||||
//
|
||||
// Restore interrupt state.
|
||||
//
|
||||
SetInterruptState (InterruptStatus);
|
||||
|
||||
//
|
||||
// Prepare data for return back
|
||||
|
@ -873,6 +897,7 @@ S3RestoreConfig2 (
|
|||
SMM_S3_RESUME_STATE *SmmS3ResumeState;
|
||||
VOID *GuidHob;
|
||||
BOOLEAN Build4GPageTableOnly;
|
||||
BOOLEAN InterruptStatus;
|
||||
|
||||
TempAcpiS3Context = 0;
|
||||
TempEfiBootScriptExecutorVariable = 0;
|
||||
|
@ -1002,10 +1027,20 @@ S3RestoreConfig2 (
|
|||
// Switch to long mode to complete resume.
|
||||
//
|
||||
|
||||
InterruptStatus = SaveAndDisableInterrupts ();
|
||||
//
|
||||
// Need to make sure the GDT is loaded with values that support long mode and real mode.
|
||||
//
|
||||
AsmWriteGdtr (&mGdt);
|
||||
//
|
||||
// update segment selectors per the new GDT.
|
||||
//
|
||||
AsmSetDataSelectors (DATA_SEGEMENT_SELECTOR);
|
||||
//
|
||||
// Restore interrupt state.
|
||||
//
|
||||
SetInterruptState (InterruptStatus);
|
||||
|
||||
AsmWriteCr3 ((UINTN)SmmS3ResumeState->SmmS3Cr3);
|
||||
AsmEnablePaging64 (
|
||||
0x38,
|
||||
|
|
|
@ -33,6 +33,14 @@
|
|||
[Sources]
|
||||
S3Resume.c
|
||||
|
||||
[Sources.IA32]
|
||||
Ia32/AsmFuncs.asm | MSFT
|
||||
Ia32/AsmFuncs.S | GCC
|
||||
|
||||
[Sources.X64]
|
||||
X64/AsmFuncs.asm | MSFT
|
||||
X64/AsmFuncs.S | GCC
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
#------------------------------------------------------------------------------
|
||||
#*
|
||||
#* Copyright (c) 2012, 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.
|
||||
#*
|
||||
#* AsmFuncs.S
|
||||
#*
|
||||
#* Abstract:
|
||||
#*
|
||||
#* Assembly function to set segment selectors.
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
.text
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# VOID
|
||||
# EFIAPI
|
||||
# AsmSetDataSelectors (
|
||||
# IN UINT16 SelectorValue
|
||||
# );
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_GLOBAL ASM_PFX(AsmSetDataSelectors)
|
||||
ASM_PFX(AsmSetDataSelectors):
|
||||
movw %cx, %ss
|
||||
movw %cx, %ds
|
||||
movw %cx, %es
|
||||
movw %cx, %fs
|
||||
movw %cx, %gs
|
||||
ret
|
|
@ -0,0 +1,41 @@
|
|||
;------------------------------------------------------------------------------ ;
|
||||
; Copyright (c) 2012, 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:
|
||||
;
|
||||
; AsmFuncs.Asm
|
||||
;
|
||||
; Abstract:
|
||||
;
|
||||
; Assembly function to set segment selectors.
|
||||
;
|
||||
; Notes:
|
||||
;
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
.code
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; VOID
|
||||
; EFIAPI
|
||||
; AsmSetDataSelectors (
|
||||
; IN UINT16 SelectorValue
|
||||
; );
|
||||
;------------------------------------------------------------------------------
|
||||
AsmSetDataSelectors PROC
|
||||
mov ds, cx
|
||||
mov es, cx
|
||||
mov fs, cx
|
||||
mov gs, cx
|
||||
mov ss, cx
|
||||
ret
|
||||
AsmSetDataSelectors ENDP
|
||||
|
||||
END
|
Loading…
Reference in New Issue