mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-25 14:44:28 +02:00
Core/Dxe: Placed platform dependent code into separate files.
This commit is contained in:
parent
9d632c6572
commit
519bffe4f9
@ -150,10 +150,10 @@
|
|||||||
gEfiHobMemoryAllocStackGuid ## SOMETIMES_CONSUMES ## SystemTable
|
gEfiHobMemoryAllocStackGuid ## SOMETIMES_CONSUMES ## SystemTable
|
||||||
gUefiImageLoaderImageContextGuid ## CONSUMES ## HOB
|
gUefiImageLoaderImageContextGuid ## CONSUMES ## HOB
|
||||||
gEfiGlobalVariableGuid ## SOMETIMES_CONSUMES ## SysCall
|
gEfiGlobalVariableGuid ## SOMETIMES_CONSUMES ## SysCall
|
||||||
gEarlyPL011BaseAddressGuid ## CONSUMES
|
|
||||||
|
|
||||||
[Guids.ARM, Guids.AARCH64]
|
[Guids.ARM, Guids.AARCH64]
|
||||||
gArmVirtSystemMemorySizeGuid ## CONSUMES
|
gArmVirtSystemMemorySizeGuid ## SOMETIMES_CONSUMES ## SysCall
|
||||||
|
gEarlyPL011BaseAddressGuid ## SOMETIMES_CONSUMES ## SysCall
|
||||||
|
|
||||||
[Ppis]
|
[Ppis]
|
||||||
gEfiVectorHandoffInfoPpiGuid ## UNDEFINED # HOB
|
gEfiVectorHandoffInfoPpiGuid ## UNDEFINED # HOB
|
||||||
@ -227,7 +227,6 @@
|
|||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdEnableUserSpace ## CONSUMES
|
gEfiMdeModulePkgTokenSpaceGuid.PcdEnableUserSpace ## CONSUMES
|
||||||
gEfiMdePkgTokenSpaceGuid.PcdDebugRaisePropertyMask ## CONSUMES
|
gEfiMdePkgTokenSpaceGuid.PcdDebugRaisePropertyMask ## CONSUMES
|
||||||
gEfiMdePkgTokenSpaceGuid.PcdImageProtectionPolicy ## CONSUMES
|
gEfiMdePkgTokenSpaceGuid.PcdImageProtectionPolicy ## CONSUMES
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio ## CONSUMES
|
|
||||||
|
|
||||||
[Pcd.IA32, Pcd.X64]
|
[Pcd.IA32, Pcd.X64]
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES
|
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES
|
||||||
|
@ -1700,6 +1700,9 @@ CoreStartImage (
|
|||||||
if (PcdGetBool (PcdEnableUserSpace) && (Image->IsUserImage)) {
|
if (PcdGetBool (PcdEnableUserSpace) && (Image->IsUserImage)) {
|
||||||
if (gRing3Data == NULL) {
|
if (gRing3Data == NULL) {
|
||||||
Image->Status = InitializeRing3 (ImageHandle, Image);
|
Image->Status = InitializeRing3 (ImageHandle, Image);
|
||||||
|
if (EFI_ERROR (Image->Status)) {
|
||||||
|
CpuDeadLoop ();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(UINTN)Image->EntryPoint, &Attributes);
|
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(UINTN)Image->EntryPoint, &Attributes);
|
||||||
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
#include <Chipset/AArch64.h>
|
#include <Chipset/AArch64.h>
|
||||||
|
#include <Guid/EarlyPL011BaseAddress.h>
|
||||||
#include <Library/ArmLib.h>
|
#include <Library/ArmLib.h>
|
||||||
#include <Library/ArmMmuLib.h>
|
#include <Library/ArmMmuLib.h>
|
||||||
#include <Library/DefaultExceptionHandlerLib.h>
|
#include <Library/DefaultExceptionHandlerLib.h>
|
||||||
@ -14,6 +15,10 @@
|
|||||||
|
|
||||||
UINTN gUserPageTable;
|
UINTN gUserPageTable;
|
||||||
|
|
||||||
|
STATIC UINTN mConfigurationTable;
|
||||||
|
STATIC UINTN mConfigurationTableSize;
|
||||||
|
STATIC UINTN mUartBaseAddress;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmCallRing3 (
|
ArmCallRing3 (
|
||||||
@ -89,15 +94,55 @@ MakeUserPageTableTemplate (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeMsr (
|
InitializePlatform (
|
||||||
IN OUT EFI_CONFIGURATION_TABLE *Table,
|
IN OUT EFI_SYSTEM_TABLE *System
|
||||||
IN UINTN NumberOfEntries
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Tcr;
|
EFI_STATUS Status;
|
||||||
UINTN Sctlr;
|
UINTN Tcr;
|
||||||
|
UINTN Sctlr;
|
||||||
|
EFI_PHYSICAL_ADDRESS Physical;
|
||||||
|
UINTN Index;
|
||||||
|
EFI_CONFIGURATION_TABLE *Conf;
|
||||||
|
EARLY_PL011_BASE_ADDRESS *UartBase;
|
||||||
|
CONST VOID *Hob;
|
||||||
|
|
||||||
|
mConfigurationTableSize = (System->NumberOfTableEntries + 1) * sizeof (EFI_CONFIGURATION_TABLE);
|
||||||
|
|
||||||
|
Status = CoreAllocatePages (
|
||||||
|
AllocateAnyPages,
|
||||||
|
EfiRing3MemoryType,
|
||||||
|
EFI_SIZE_TO_PAGES (mConfigurationTableSize),
|
||||||
|
&Physical
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Core: Failed to allocate memory for Ring3 ConfigurationTable.\n"));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Conf = (EFI_CONFIGURATION_TABLE *)(UINTN)Physical;
|
||||||
|
|
||||||
|
for (Index = 0; Index < System->NumberOfTableEntries; ++Index) {
|
||||||
|
CopyGuid (&Conf->VendorGuid, &System->ConfigurationTable[Index].VendorGuid);
|
||||||
|
|
||||||
|
Conf->VendorTable = System->ConfigurationTable[Index].VendorTable;
|
||||||
|
|
||||||
|
++Conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hob = GetFirstGuidHob (&gEarlyPL011BaseAddressGuid);
|
||||||
|
UartBase = GET_GUID_HOB_DATA (Hob);
|
||||||
|
mUartBaseAddress = (UINTN)UartBase->DebugAddress;
|
||||||
|
|
||||||
|
CopyGuid (&(Conf->VendorGuid), &gEarlyPL011BaseAddressGuid);
|
||||||
|
Conf->VendorTable = (VOID *)mUartBaseAddress;
|
||||||
|
++System->NumberOfTableEntries;
|
||||||
|
|
||||||
|
System->ConfigurationTable = (EFI_CONFIGURATION_TABLE *)(UINTN)Physical;
|
||||||
|
mConfigurationTable = (UINTN)Physical;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Disable Hierarchical permissions just in case.
|
// Disable Hierarchical permissions just in case.
|
||||||
//
|
//
|
||||||
@ -118,6 +163,33 @@ InitializeMsr (
|
|||||||
|
|
||||||
InitializeSysCallHandler ((VOID *)SysCallBootService);
|
InitializeSysCallHandler ((VOID *)SysCallBootService);
|
||||||
SetExceptionAddresses (NULL, 0);
|
SetExceptionAddresses (NULL, 0);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
MapPlatform (
|
||||||
|
IN OUT UINTN UserPageTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
mConfigurationTable,
|
||||||
|
ALIGN_VALUE (mConfigurationTableSize, EFI_PAGE_SIZE),
|
||||||
|
EFI_MEMORY_XP | EFI_MEMORY_USER
|
||||||
|
);
|
||||||
|
//
|
||||||
|
// Necessary fix for DEBUG printings.
|
||||||
|
//
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
mUartBaseAddress,
|
||||||
|
SIZE_4KB,
|
||||||
|
EFI_MEMORY_XP | EFI_MEMORY_USER
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
#include <Guid/EarlyPL011BaseAddress.h>
|
||||||
#include <Library/ArmLib.h>
|
#include <Library/ArmLib.h>
|
||||||
#include <Library/ArmMmuLib.h>
|
#include <Library/ArmMmuLib.h>
|
||||||
#include <Library/DefaultExceptionHandlerLib.h>
|
#include <Library/DefaultExceptionHandlerLib.h>
|
||||||
@ -13,6 +14,10 @@
|
|||||||
|
|
||||||
UINTN gUserPageTable;
|
UINTN gUserPageTable;
|
||||||
|
|
||||||
|
STATIC UINTN mConfigurationTable;
|
||||||
|
STATIC UINTN mConfigurationTableSize;
|
||||||
|
STATIC UINTN mUartBaseAddress;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmCallRing3 (
|
ArmCallRing3 (
|
||||||
@ -116,13 +121,53 @@ MakeUserPageTableTemplate (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeMsr (
|
InitializePlatform (
|
||||||
IN OUT EFI_CONFIGURATION_TABLE *Table,
|
IN OUT EFI_SYSTEM_TABLE *System
|
||||||
IN UINTN NumberOfEntries
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_PHYSICAL_ADDRESS Physical;
|
||||||
|
UINTN Index;
|
||||||
|
EFI_CONFIGURATION_TABLE *Conf;
|
||||||
|
EARLY_PL011_BASE_ADDRESS *UartBase;
|
||||||
|
CONST VOID *Hob;
|
||||||
|
|
||||||
|
mConfigurationTableSize = (System->NumberOfTableEntries + 1) * sizeof (EFI_CONFIGURATION_TABLE);
|
||||||
|
|
||||||
|
Status = CoreAllocatePages (
|
||||||
|
AllocateAnyPages,
|
||||||
|
EfiRing3MemoryType,
|
||||||
|
EFI_SIZE_TO_PAGES (mConfigurationTableSize),
|
||||||
|
&Physical
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Core: Failed to allocate memory for Ring3 ConfigurationTable.\n"));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Conf = (EFI_CONFIGURATION_TABLE *)(UINTN)Physical;
|
||||||
|
|
||||||
|
for (Index = 0; Index < System->NumberOfTableEntries; ++Index) {
|
||||||
|
CopyGuid (&Conf->VendorGuid, &System->ConfigurationTable[Index].VendorGuid);
|
||||||
|
|
||||||
|
Conf->VendorTable = System->ConfigurationTable[Index].VendorTable;
|
||||||
|
|
||||||
|
++Conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hob = GetFirstGuidHob (&gEarlyPL011BaseAddressGuid);
|
||||||
|
UartBase = GET_GUID_HOB_DATA (Hob);
|
||||||
|
mUartBaseAddress = (UINTN)UartBase->DebugAddress;
|
||||||
|
|
||||||
|
CopyGuid (&(Conf->VendorGuid), &gEarlyPL011BaseAddressGuid);
|
||||||
|
Conf->VendorTable = (VOID *)mUartBaseAddress;
|
||||||
|
++System->NumberOfTableEntries;
|
||||||
|
|
||||||
|
System->ConfigurationTable = (EFI_CONFIGURATION_TABLE *)(UINTN)Physical;
|
||||||
|
mConfigurationTable = (UINTN)Physical;
|
||||||
|
|
||||||
if (ArmHasPan ()) {
|
if (ArmHasPan ()) {
|
||||||
//
|
//
|
||||||
// Enable Privileged Access Never feature.
|
// Enable Privileged Access Never feature.
|
||||||
@ -132,6 +177,33 @@ InitializeMsr (
|
|||||||
|
|
||||||
InitializeSysCallHandler (SysCallBootService);
|
InitializeSysCallHandler (SysCallBootService);
|
||||||
SetExceptionAddresses (NULL, 0);
|
SetExceptionAddresses (NULL, 0);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
MapPlatform (
|
||||||
|
IN OUT UINTN UserPageTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
mConfigurationTable,
|
||||||
|
ALIGN_VALUE (mConfigurationTableSize, EFI_PAGE_SIZE),
|
||||||
|
EFI_MEMORY_XP | EFI_MEMORY_USER
|
||||||
|
);
|
||||||
|
//
|
||||||
|
// Necessary fix for DEBUG printings.
|
||||||
|
//
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
mUartBaseAddress,
|
||||||
|
SIZE_4KB,
|
||||||
|
EFI_MEMORY_XP | EFI_MEMORY_USER
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
#include <Register/Intel/ArchitecturalMsr.h>
|
#include <Register/Intel/ArchitecturalMsr.h>
|
||||||
#include <IndustryStandard/PageTable.h>
|
#include <IndustryStandard/PageTable.h>
|
||||||
|
|
||||||
|
extern EXCEPTION_ADDRESSES *mExceptionAddresses;
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MakeUserPageTableTemplate (
|
MakeUserPageTableTemplate (
|
||||||
@ -87,11 +89,10 @@ MakeUserPageTableTemplate (
|
|||||||
*UserPageTableTemplateSize = EFI_PAGES_TO_SIZE (TotalPagesNum);
|
*UserPageTableTemplateSize = EFI_PAGES_TO_SIZE (TotalPagesNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeMsr (
|
InitializePlatform (
|
||||||
IN OUT EFI_CONFIGURATION_TABLE *Table,
|
IN OUT EFI_SYSTEM_TABLE *System
|
||||||
IN UINTN NumberOfEntries
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT64 Msr;
|
UINT64 Msr;
|
||||||
@ -140,7 +141,7 @@ InitializeMsr (
|
|||||||
AsmCpuidEx (0x01, 0x0, NULL, NULL, NULL, &Edx);
|
AsmCpuidEx (0x01, 0x0, NULL, NULL, NULL, &Edx);
|
||||||
if ((Edx & BIT11) == 0) {
|
if ((Edx & BIT11) == 0) {
|
||||||
DEBUG ((DEBUG_ERROR, "Core: SYSENTER and SYSEXIT are not supported.\n"));
|
DEBUG ((DEBUG_ERROR, "Core: SYSENTER and SYSEXIT are not supported.\n"));
|
||||||
CpuDeadLoop ();
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -154,4 +155,52 @@ InitializeMsr (
|
|||||||
AsmWriteMsr64 (MSR_IA32_SYSENTER_EIP, Msr);
|
AsmWriteMsr64 (MSR_IA32_SYSENTER_EIP, Msr);
|
||||||
|
|
||||||
gCorePageTable = AsmReadCr3 ();
|
gCorePageTable = AsmReadCr3 ();
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
MapPlatform (
|
||||||
|
IN OUT UINTN UserPageTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
IA32_DESCRIPTOR IdtDescriptor;
|
||||||
|
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
(UINTN)&gCorePageTable,
|
||||||
|
SIZE_4KB,
|
||||||
|
EFI_MEMORY_RO | EFI_MEMORY_XP
|
||||||
|
);
|
||||||
|
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
mExceptionAddresses->ExceptionStackBase,
|
||||||
|
mExceptionAddresses->ExceptionStackSize,
|
||||||
|
EFI_MEMORY_XP
|
||||||
|
);
|
||||||
|
|
||||||
|
AsmReadIdtr (&IdtDescriptor);
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
IdtDescriptor.Base,
|
||||||
|
SIZE_4KB,
|
||||||
|
EFI_MEMORY_RO | EFI_MEMORY_XP
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Necessary fix for ProcessLibraryConstructorList() -> DxeCcProbeLibConstructor()
|
||||||
|
//
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
FixedPcdGet32 (PcdOvmfWorkAreaBase),
|
||||||
|
FixedPcdGet32 (PcdOvmfWorkAreaSize),
|
||||||
|
EFI_MEMORY_XP | EFI_MEMORY_USER
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,25 +5,20 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <Guid/EarlyPL011BaseAddress.h>
|
|
||||||
|
|
||||||
#include "DxeMain.h"
|
#include "DxeMain.h"
|
||||||
|
|
||||||
VOID *gRing3EntryPoint;
|
VOID *gRing3EntryPoint;
|
||||||
RING3_DATA *gRing3Data;
|
RING3_DATA *gRing3Data;
|
||||||
VOID *gRing3Interfaces;
|
VOID *gRing3Interfaces;
|
||||||
UINTN gUartBaseAddress;
|
|
||||||
|
|
||||||
UEFI_IMAGE_RECORD *mDxeRing3;
|
|
||||||
EXCEPTION_ADDRESSES *mExceptionAddresses;
|
|
||||||
UINTN mConfigurationTable;
|
|
||||||
UINTN mConfigurationTableSize;
|
|
||||||
EFI_PHYSICAL_ADDRESS mCoreStackBase;
|
|
||||||
UINT64 mCoreStackSize;
|
|
||||||
|
|
||||||
|
EXCEPTION_ADDRESSES *mExceptionAddresses;
|
||||||
extern UINTN SysCallBase;
|
extern UINTN SysCallBase;
|
||||||
extern UINTN SysCallEnd;
|
extern UINTN SysCallEnd;
|
||||||
|
|
||||||
|
STATIC UEFI_IMAGE_RECORD *mDxeRing3;
|
||||||
|
STATIC EFI_PHYSICAL_ADDRESS mCoreStackBase;
|
||||||
|
STATIC UINT64 mCoreStackSize;
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MakeUserPageTableTemplate (
|
MakeUserPageTableTemplate (
|
||||||
@ -31,11 +26,16 @@ MakeUserPageTableTemplate (
|
|||||||
OUT UINTN *UserPageTableTemplateSize
|
OUT UINTN *UserPageTableTemplateSize
|
||||||
);
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
InitializePlatform (
|
||||||
|
IN OUT EFI_SYSTEM_TABLE *System
|
||||||
|
);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeMsr (
|
MapPlatform (
|
||||||
IN OUT EFI_CONFIGURATION_TABLE *Table,
|
IN OUT UINTN UserPageTable
|
||||||
IN UINTN NumberOfEntries
|
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -47,10 +47,6 @@ InitializeRing3 (
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_PHYSICAL_ADDRESS Physical;
|
EFI_PHYSICAL_ADDRESS Physical;
|
||||||
UINTN Index;
|
|
||||||
EFI_CONFIGURATION_TABLE *Conf;
|
|
||||||
EARLY_PL011_BASE_ADDRESS *UartBase;
|
|
||||||
CONST VOID *Hob;
|
|
||||||
EFI_PEI_HOB_POINTERS PeiHob;
|
EFI_PEI_HOB_POINTERS PeiHob;
|
||||||
EFI_HOB_MEMORY_ALLOCATION *MemoryHob;
|
EFI_HOB_MEMORY_ALLOCATION *MemoryHob;
|
||||||
|
|
||||||
@ -78,43 +74,6 @@ InitializeRing3 (
|
|||||||
EFI_MEMORY_XP | EFI_MEMORY_USER
|
EFI_MEMORY_XP | EFI_MEMORY_USER
|
||||||
);
|
);
|
||||||
|
|
||||||
if (PcdGetBool (PcdSerialUseMmio)) {
|
|
||||||
mConfigurationTableSize = (gRing3Data->SystemTable.NumberOfTableEntries + 1) * sizeof (EFI_CONFIGURATION_TABLE);
|
|
||||||
|
|
||||||
Status = CoreAllocatePages (
|
|
||||||
AllocateAnyPages,
|
|
||||||
EfiRing3MemoryType,
|
|
||||||
EFI_SIZE_TO_PAGES (mConfigurationTableSize),
|
|
||||||
&Physical
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_ERROR, "Core: Failed to allocate memory for Ring3 ConfigurationTable.\n"));
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
Conf = (EFI_CONFIGURATION_TABLE *)(UINTN)Physical;
|
|
||||||
|
|
||||||
for (Index = 0; Index < gRing3Data->SystemTable.NumberOfTableEntries; ++Index) {
|
|
||||||
CopyGuid (&(Conf->VendorGuid), &gRing3Data->SystemTable.ConfigurationTable[Index].VendorGuid);
|
|
||||||
|
|
||||||
Conf->VendorTable = gRing3Data->SystemTable.ConfigurationTable[Index].VendorTable;
|
|
||||||
|
|
||||||
++Conf;
|
|
||||||
}
|
|
||||||
|
|
||||||
Hob = GetFirstGuidHob (&gEarlyPL011BaseAddressGuid);
|
|
||||||
UartBase = GET_GUID_HOB_DATA (Hob);
|
|
||||||
gUartBaseAddress = (UINTN)UartBase->DebugAddress;
|
|
||||||
|
|
||||||
CopyGuid (&(Conf->VendorGuid), &gEarlyPL011BaseAddressGuid);
|
|
||||||
Conf->VendorTable = (VOID *)gUartBaseAddress;
|
|
||||||
++gRing3Data->SystemTable.NumberOfTableEntries;
|
|
||||||
|
|
||||||
DEBUG ((DEBUG_ERROR, "Core: gUartBaseAddress = 0x%p\n", gUartBaseAddress));
|
|
||||||
|
|
||||||
gRing3Data->SystemTable.ConfigurationTable = (EFI_CONFIGURATION_TABLE *)(UINTN)Physical;
|
|
||||||
mConfigurationTable = (UINTN)Physical;
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
// Initialize DxeRing3 with Supervisor privileges.
|
// Initialize DxeRing3 with Supervisor privileges.
|
||||||
//
|
//
|
||||||
@ -155,10 +114,18 @@ InitializeRing3 (
|
|||||||
EFI_MEMORY_XP | EFI_MEMORY_USER
|
EFI_MEMORY_XP | EFI_MEMORY_USER
|
||||||
);
|
);
|
||||||
|
|
||||||
InitializeMsr (
|
Status = InitializePlatform (&gRing3Data->SystemTable);
|
||||||
gRing3Data->SystemTable.ConfigurationTable,
|
if (EFI_ERROR (Status)) {
|
||||||
gRing3Data->SystemTable.NumberOfTableEntries
|
CoreFreePages (
|
||||||
);
|
(EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Data,
|
||||||
|
EFI_SIZE_TO_PAGES (sizeof (RING3_DATA))
|
||||||
|
);
|
||||||
|
CoreFreePages (
|
||||||
|
(EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Interfaces,
|
||||||
|
RING3_INTERFACES_PAGES
|
||||||
|
);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
mExceptionAddresses = GetExceptionAddresses ();
|
mExceptionAddresses = GetExceptionAddresses ();
|
||||||
|
|
||||||
@ -249,7 +216,7 @@ InitializeUserPageTable (
|
|||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Map ExceptionHandlers, ExceptionStacks, Idt
|
// Map ExceptionHandlers
|
||||||
//
|
//
|
||||||
gCpu->SetUserMemoryAttributes (
|
gCpu->SetUserMemoryAttributes (
|
||||||
gCpu,
|
gCpu,
|
||||||
@ -267,63 +234,7 @@ InitializeUserPageTable (
|
|||||||
EFI_MEMORY_XP
|
EFI_MEMORY_XP
|
||||||
);
|
);
|
||||||
|
|
||||||
#if defined (MDE_CPU_X64) || defined (MDE_CPU_IA32)
|
MapPlatform (UserPageTable);
|
||||||
IA32_DESCRIPTOR IdtDescriptor;
|
|
||||||
|
|
||||||
gCpu->SetUserMemoryAttributes (
|
|
||||||
gCpu,
|
|
||||||
UserPageTable,
|
|
||||||
(UINTN)&gCorePageTable,
|
|
||||||
SIZE_4KB,
|
|
||||||
EFI_MEMORY_RO | EFI_MEMORY_XP
|
|
||||||
);
|
|
||||||
|
|
||||||
gCpu->SetUserMemoryAttributes (
|
|
||||||
gCpu,
|
|
||||||
UserPageTable,
|
|
||||||
mExceptionAddresses->ExceptionStackBase,
|
|
||||||
mExceptionAddresses->ExceptionStackSize,
|
|
||||||
EFI_MEMORY_XP
|
|
||||||
);
|
|
||||||
|
|
||||||
AsmReadIdtr (&IdtDescriptor);
|
|
||||||
gCpu->SetUserMemoryAttributes (
|
|
||||||
gCpu,
|
|
||||||
UserPageTable,
|
|
||||||
IdtDescriptor.Base,
|
|
||||||
SIZE_4KB,
|
|
||||||
EFI_MEMORY_RO | EFI_MEMORY_XP
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Necessary fix for ProcessLibraryConstructorList() -> DxeCcProbeLibConstructor()
|
|
||||||
//
|
|
||||||
gCpu->SetUserMemoryAttributes (
|
|
||||||
gCpu,
|
|
||||||
UserPageTable,
|
|
||||||
FixedPcdGet32 (PcdOvmfWorkAreaBase),
|
|
||||||
FixedPcdGet32 (PcdOvmfWorkAreaSize),
|
|
||||||
EFI_MEMORY_XP | EFI_MEMORY_USER
|
|
||||||
);
|
|
||||||
#elif defined (MDE_CPU_AARCH64) || defined (MDE_CPU_ARM)
|
|
||||||
gCpu->SetUserMemoryAttributes (
|
|
||||||
gCpu,
|
|
||||||
UserPageTable,
|
|
||||||
mConfigurationTable,
|
|
||||||
ALIGN_VALUE (mConfigurationTableSize, EFI_PAGE_SIZE),
|
|
||||||
EFI_MEMORY_XP | EFI_MEMORY_USER
|
|
||||||
);
|
|
||||||
//
|
|
||||||
// Necessary fix for DEBUG printings.
|
|
||||||
//
|
|
||||||
gCpu->SetUserMemoryAttributes (
|
|
||||||
gCpu,
|
|
||||||
UserPageTable,
|
|
||||||
gUartBaseAddress,
|
|
||||||
SIZE_4KB,
|
|
||||||
EFI_MEMORY_XP | EFI_MEMORY_USER
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Map User Image
|
// Map User Image
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
#include <Register/Intel/Cpuid.h>
|
#include <Register/Intel/Cpuid.h>
|
||||||
#include <IndustryStandard/PageTable.h>
|
#include <IndustryStandard/PageTable.h>
|
||||||
|
|
||||||
|
extern EXCEPTION_ADDRESSES *mExceptionAddresses;
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MakeUserPageTableTemplate (
|
MakeUserPageTableTemplate (
|
||||||
@ -284,11 +286,10 @@ MakeUserPageTableTemplate (
|
|||||||
*UserPageTableTemplateSize = EFI_PAGES_TO_SIZE (TotalPagesNum);
|
*UserPageTableTemplateSize = EFI_PAGES_TO_SIZE (TotalPagesNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeMsr (
|
InitializePlatform (
|
||||||
IN OUT EFI_CONFIGURATION_TABLE *Table,
|
IN OUT EFI_SYSTEM_TABLE *System
|
||||||
IN UINTN NumberOfEntries
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT64 Msr;
|
UINT64 Msr;
|
||||||
@ -342,7 +343,7 @@ InitializeMsr (
|
|||||||
AsmWriteMsr64 (MSR_IA32_EFER, MsrEfer.Uint64);
|
AsmWriteMsr64 (MSR_IA32_EFER, MsrEfer.Uint64);
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_ERROR, "Core: SYSCALL and SYSRET are not supported.\n"));
|
DEBUG ((DEBUG_ERROR, "Core: SYSCALL and SYSRET are not supported.\n"));
|
||||||
CpuDeadLoop ();
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -360,4 +361,52 @@ InitializeMsr (
|
|||||||
AsmWriteMsr64 (MSR_IA32_FMASK, Msr);
|
AsmWriteMsr64 (MSR_IA32_FMASK, Msr);
|
||||||
|
|
||||||
gCorePageTable = AsmReadCr3 ();
|
gCorePageTable = AsmReadCr3 ();
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
MapPlatform (
|
||||||
|
IN OUT UINTN UserPageTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
IA32_DESCRIPTOR IdtDescriptor;
|
||||||
|
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
(UINTN)&gCorePageTable,
|
||||||
|
SIZE_4KB,
|
||||||
|
EFI_MEMORY_RO | EFI_MEMORY_XP
|
||||||
|
);
|
||||||
|
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
mExceptionAddresses->ExceptionStackBase,
|
||||||
|
mExceptionAddresses->ExceptionStackSize,
|
||||||
|
EFI_MEMORY_XP
|
||||||
|
);
|
||||||
|
|
||||||
|
AsmReadIdtr (&IdtDescriptor);
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
IdtDescriptor.Base,
|
||||||
|
SIZE_4KB,
|
||||||
|
EFI_MEMORY_RO | EFI_MEMORY_XP
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Necessary fix for ProcessLibraryConstructorList() -> DxeCcProbeLibConstructor()
|
||||||
|
//
|
||||||
|
gCpu->SetUserMemoryAttributes (
|
||||||
|
gCpu,
|
||||||
|
UserPageTable,
|
||||||
|
FixedPcdGet32 (PcdOvmfWorkAreaBase),
|
||||||
|
FixedPcdGet32 (PcdOvmfWorkAreaSize),
|
||||||
|
EFI_MEMORY_XP | EFI_MEMORY_USER
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user