mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-26 23:24:03 +02:00
Store PeiServices** when updating IDT table in DxeIplPeim before transfer to long mode.
Signed-off-by: vanjeff Reviewed-by: rsun3 Reviewed-by: mdkinney git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12580 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
153a2bae71
commit
bdfbe63efa
@ -2,7 +2,7 @@
|
|||||||
Master header file for DxeIpl PEIM. All source files in this module should
|
Master header file for DxeIpl PEIM. All source files in this module should
|
||||||
include this file for common definitions.
|
include this file for common definitions.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -46,6 +46,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
#include <Library/S3Lib.h>
|
#include <Library/S3Lib.h>
|
||||||
#include <Library/RecoveryLib.h>
|
#include <Library/RecoveryLib.h>
|
||||||
#include <Library/DebugAgentLib.h>
|
#include <Library/DebugAgentLib.h>
|
||||||
|
#include <Library/PeiServicesTablePointerLib.h>
|
||||||
|
|
||||||
#define STACK_SIZE 0x20000
|
#define STACK_SIZE 0x20000
|
||||||
#define BSP_STORE_SIZE 0x4000
|
#define BSP_STORE_SIZE 0x4000
|
||||||
|
@ -73,6 +73,7 @@
|
|||||||
PeimEntryPoint
|
PeimEntryPoint
|
||||||
DebugLib
|
DebugLib
|
||||||
DebugAgentLib
|
DebugAgentLib
|
||||||
|
PeiServicesTablePointerLib
|
||||||
|
|
||||||
[Ppis]
|
[Ppis]
|
||||||
gEfiDxeIplPpiGuid ## PRODUCES
|
gEfiDxeIplPpiGuid ## PRODUCES
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
Ia32-specific functionality for DxeLoad.
|
Ia32-specific functionality for DxeLoad.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -17,6 +17,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
#define IDT_ENTRY_COUNT 32
|
#define IDT_ENTRY_COUNT 32
|
||||||
|
|
||||||
|
typedef struct _X64_IDT_TABLE {
|
||||||
|
//
|
||||||
|
// Reserved 4 bytes preceding PeiService and IdtTable,
|
||||||
|
// since IDT base address should be 8-byte alignment.
|
||||||
|
//
|
||||||
|
UINT32 Reserved;
|
||||||
|
CONST EFI_PEI_SERVICES **PeiService;
|
||||||
|
X64_IDT_GATE_DESCRIPTOR IdtTable[IDT_ENTRY_COUNT];
|
||||||
|
} X64_IDT_TABLE;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global Descriptor Table (GDT)
|
// Global Descriptor Table (GDT)
|
||||||
//
|
//
|
||||||
@ -72,6 +82,7 @@ HandOffToDxeCore (
|
|||||||
VOID *TemplateBase;
|
VOID *TemplateBase;
|
||||||
EFI_PHYSICAL_ADDRESS VectorAddress;
|
EFI_PHYSICAL_ADDRESS VectorAddress;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
|
X64_IDT_TABLE *IdtTableForX64;
|
||||||
|
|
||||||
Status = PeiServicesAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack);
|
Status = PeiServicesAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
@ -120,12 +131,19 @@ HandOffToDxeCore (
|
|||||||
|
|
||||||
Status = PeiServicesAllocatePages (
|
Status = PeiServicesAllocatePages (
|
||||||
EfiBootServicesData,
|
EfiBootServicesData,
|
||||||
EFI_SIZE_TO_PAGES((SizeOfTemplate + sizeof (X64_IDT_GATE_DESCRIPTOR)) * IDT_ENTRY_COUNT),
|
EFI_SIZE_TO_PAGES(sizeof (X64_IDT_TABLE) + SizeOfTemplate * IDT_ENTRY_COUNT),
|
||||||
&VectorAddress
|
(EFI_PHYSICAL_ADDRESS *) &IdtTableForX64
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
IdtTable = (X64_IDT_GATE_DESCRIPTOR *) (UINTN) (VectorAddress + SizeOfTemplate * IDT_ENTRY_COUNT);
|
//
|
||||||
|
// Store EFI_PEI_SERVICES** in the 4 bytes immediately preceding IDT to avoid that
|
||||||
|
// it may not be gotten correctly after IDT register is re-written.
|
||||||
|
//
|
||||||
|
IdtTableForX64->PeiService = GetPeiServicesTablePointer ();
|
||||||
|
|
||||||
|
VectorAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) (IdtTableForX64 + 1);
|
||||||
|
IdtTable = IdtTableForX64->IdtTable;
|
||||||
for (Index = 0; Index < IDT_ENTRY_COUNT; Index++) {
|
for (Index = 0; Index < IDT_ENTRY_COUNT; Index++) {
|
||||||
IdtTable[Index].Ia32IdtEntry.Bits.GateType = 0x8e;
|
IdtTable[Index].Ia32IdtEntry.Bits.GateType = 0x8e;
|
||||||
IdtTable[Index].Ia32IdtEntry.Bits.Reserved_0 = 0;
|
IdtTable[Index].Ia32IdtEntry.Bits.Reserved_0 = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user