Ring3: Refactored out gCoreSysCallStackTop and gRing3CallStackTop.

This commit is contained in:
Mikhail Krichanov 2025-01-13 13:27:58 +03:00
parent efcbf1946d
commit befe005612
17 changed files with 208 additions and 117 deletions

View File

@ -88,9 +88,9 @@ APRIORI DXE {
# #
INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
INF FatPkg/EnhancedFatDxe/Fat.inf INF USER FatPkg/EnhancedFatDxe/Fat.inf
INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf
INF USER MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf
INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf

View File

@ -286,8 +286,6 @@ extern LOADED_IMAGE_PRIVATE_DATA * mCurrentImage;
extern RING3_DATA *gRing3Data; extern RING3_DATA *gRing3Data;
extern VOID *gRing3Interfaces; extern VOID *gRing3Interfaces;
extern UINTN gCoreSysCallStackTop;
extern UINTN gRing3CallStackTop;
extern VOID *gRing3EntryPoint; extern VOID *gRing3EntryPoint;
extern UINTN gUserPageTable; extern UINTN gUserPageTable;
extern UINTN gCorePageTable; extern UINTN gCorePageTable;
@ -2744,12 +2742,6 @@ CallBootService (
IN RING3_STACK *UserRsp IN RING3_STACK *UserRsp
); );
EFI_STATUS
EFIAPI
CallRing3 (
IN RING3_CALL_DATA *Data
);
VOID VOID
EFIAPI EFIAPI
AllowSupervisorAccessToUserMemory ( AllowSupervisorAccessToUserMemory (
@ -2765,8 +2757,10 @@ ForbidSupervisorAccessToUserMemory (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
GoToRing3 ( GoToRing3 (
IN UINT8 Number, IN UINT8 Number,
IN VOID *EntryPoint, IN VOID *EntryPoint,
IN UINTN UserStackTop,
IN UINTN SysCallStackTop,
... ...
); );

View File

@ -1741,16 +1741,16 @@ CoreStartImage (
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);
gUserPageTable = Image->UserPageTable; gUserPageTable = Image->UserPageTable;
gRing3CallStackTop = Image->UserStackTop;
gCoreSysCallStackTop = Image->SysCallStackTop;
Image->Status = GoToRing3 ( Image->Status = GoToRing3 (
2, 2,
(VOID *)Image->EntryPoint, (VOID *)Image->EntryPoint,
ImageHandle, Image->UserStackTop,
gRing3Data Image->SysCallStackTop,
); ImageHandle,
gRing3Data
);
} }
} else { } else {
Image->Status = Image->EntryPoint (ImageHandle, Image->Info.SystemTable); Image->Status = Image->EntryPoint (ImageHandle, Image->Info.SystemTable);

View File

@ -60,13 +60,15 @@ ASM_FUNC_ALIGN(SysCallBase, 4096)
// EFI_STATUS // EFI_STATUS
// EFIAPI // EFIAPI
// CallRing3 ( // CallRing3 (
// IN RING3_CALL_DATA *Data // IN RING3_CALL_DATA *Data,
// IN UINTN UserStackTop,
// IN UINTN SysCallStackTop
// ); // );
// //
// (x0) Data // (x0) Data
// (x1) gRing3CallStackTop // (x1) UserStackTop
// (x2) gRing3EntryPoint // (x2) gRing3EntryPoint
// (x3) gCoreSysCallStackTop // (x3) SysCallStackTop
// (x4) &CoreSp // (x4) &CoreSp
// (x5) gUserPageTable // (x5) gUserPageTable
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View File

@ -14,6 +14,8 @@
STATIC UINTN mCoreSp; STATIC UINTN mCoreSp;
UINTN gUserPageTable; UINTN gUserPageTable;
UINTN mRing3CallStackTop;
UINTN mCoreSysCallStackTop;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -167,8 +169,13 @@ ForbidSupervisorAccessToUserMemory (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CallRing3 ( CallRing3 (
IN RING3_CALL_DATA *Data IN RING3_CALL_DATA *Data,
IN UINTN UserStackTop,
IN UINTN SysCallStackTop
) )
{ {
return ArmCallRing3 (Data, gRing3CallStackTop, gRing3EntryPoint, gCoreSysCallStackTop, &mCoreSp, gUserPageTable); mRing3CallStackTop = UserStackTop;
mCoreSysCallStackTop = SysCallStackTop;
return ArmCallRing3 (Data, UserStackTop, gRing3EntryPoint, SysCallStackTop, &mCoreSp, gUserPageTable);
} }

View File

@ -56,13 +56,15 @@ ASM_FUNC_ALIGN(SysCallBase, 4096)
// EFI_STATUS // EFI_STATUS
// EFIAPI // EFIAPI
// CallRing3 ( // CallRing3 (
// IN RING3_CALL_DATA *Data // IN RING3_CALL_DATA *Data,
// IN UINTN UserStackTop,
// IN UINTN SysCallStackTop
// ); // );
// //
// (r0) Data // (r0) Data
// (r1) gRing3CallStackTop // (r1) UserStackTop
// (r2) gRing3EntryPoint // (r2) gRing3EntryPoint
// (r3) gCoreSysCallStackTop // (r3) SysCallStackTop
// //
// (On Core Stack) &CoreSp, gUserPageTable // (On Core Stack) &CoreSp, gUserPageTable
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -84,7 +86,7 @@ ASM_FUNC(ArmCallRing3)
cpsid if cpsid if
isb isb
// Set SP_usr to gRing3CallStackTop. // Set SP_usr to UserStackTop.
push {R1} push {R1}
mov R1, SP mov R1, SP
ldmia R1, {SP}^ ldmia R1, {SP}^

View File

@ -13,6 +13,8 @@
STATIC UINTN mCoreSp; STATIC UINTN mCoreSp;
UINTN gUserPageTable; UINTN gUserPageTable;
UINTN mRing3CallStackTop;
UINTN mCoreSysCallStackTop;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -162,8 +164,13 @@ ForbidSupervisorAccessToUserMemory (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CallRing3 ( CallRing3 (
IN RING3_CALL_DATA *Data IN RING3_CALL_DATA *Data,
IN UINTN UserStackTop,
IN UINTN SysCallStackTop
) )
{ {
return ArmCallRing3 (Data, gRing3CallStackTop, gRing3EntryPoint, gCoreSysCallStackTop, &mCoreSp, gUserPageTable); mRing3CallStackTop = UserStackTop;
mCoreSysCallStackTop = SysCallStackTop;
return ArmCallRing3 (Data, UserStackTop, gRing3EntryPoint, SysCallStackTop, &mCoreSp, gUserPageTable);
} }

View File

@ -8,6 +8,9 @@
#include "DxeMain.h" #include "DxeMain.h"
#include "SupportedProtocols.h" #include "SupportedProtocols.h"
extern UINTN mRing3CallStackTop;
extern UINTN mCoreSysCallStackTop;
LIST_ENTRY mProtocolsHead = INITIALIZE_LIST_HEAD_VARIABLE (mProtocolsHead); LIST_ENTRY mProtocolsHead = INITIALIZE_LIST_HEAD_VARIABLE (mProtocolsHead);
typedef struct { typedef struct {
@ -479,6 +482,8 @@ CallBootService (
UserDriver->CoreWrapper = CoreArgList[Index + 1]; UserDriver->CoreWrapper = CoreArgList[Index + 1];
UserDriver->UserSpaceDriver = UserArgList[Index + 1]; UserDriver->UserSpaceDriver = UserArgList[Index + 1];
UserDriver->UserPageTable = gUserPageTable; UserDriver->UserPageTable = gUserPageTable;
UserDriver->SysCallStackTop = mCoreSysCallStackTop;
UserDriver->UserStackTop = mRing3CallStackTop;
InsertTailList (&mUserSpaceDriversHead, &UserDriver->Link); InsertTailList (&mUserSpaceDriversHead, &UserDriver->Link);

View File

@ -8,8 +8,6 @@
#include <Register/Intel/ArchitecturalMsr.h> #include <Register/Intel/ArchitecturalMsr.h>
extern ASM_PFX(CallBootService) extern ASM_PFX(CallBootService)
extern ASM_PFX(gCoreSysCallStackTop)
extern ASM_PFX(gRing3CallStackTop)
extern ASM_PFX(gRing3EntryPoint) extern ASM_PFX(gRing3EntryPoint)
extern ASM_PFX(AsmReadMsr64) extern ASM_PFX(AsmReadMsr64)
@ -174,7 +172,9 @@ ASM_PFX(CoreBootServices):
; EFI_STATUS ; EFI_STATUS
; EFIAPI ; EFIAPI
; CallRing3 ( ; CallRing3 (
; IN RING3_CALL_DATA *Data ; IN RING3_CALL_DATA *Data,
; IN UINTN UserStackTop,
; IN UINTN SysCallStackTop
; ); ; );
; ;
; (On User Stack) Data ; (On User Stack) Data
@ -191,8 +191,17 @@ ASM_PFX(CallRing3):
; Save Core Stack pointer. ; Save Core Stack pointer.
mov [ASM_PFX(CoreEsp)], esp mov [ASM_PFX(CoreEsp)], esp
mov ebx, [esp + 4 * 6] ; UserStackTop
mov [ASM_PFX(mRing3CallStackTop)], ebx
mov ebx, [esp + 4 * 7] ; SysCallStackTop
mov [ASM_PFX(mCoreSysCallStackTop)], ebx
mov edx, 0
mov eax, ebx
mov ecx, MSR_IA32_SYSENTER_ESP
wrmsr
push dword [ASM_PFX(gRing3EntryPoint)] push dword [ASM_PFX(gRing3EntryPoint)]
push dword [ASM_PFX(gRing3CallStackTop)] push dword [ASM_PFX(mRing3CallStackTop)]
SetRing3DataSegmentSelectors SetRing3DataSegmentSelectors
@ -249,3 +258,11 @@ ASM_PFX(gUserPageTable):
ALIGN 4096 ALIGN 4096
ASM_PFX(CoreEsp): ASM_PFX(CoreEsp):
resd 1 resd 1
global ASM_PFX(mRing3CallStackTop)
ASM_PFX(mRing3CallStackTop):
resd 1
global ASM_PFX(mCoreSysCallStackTop)
ASM_PFX(mCoreSysCallStackTop):
resd 1

View File

@ -153,8 +153,5 @@ InitializeMsr (
Msr = (UINT64)(UINTN)CoreBootServices; Msr = (UINT64)(UINTN)CoreBootServices;
AsmWriteMsr64 (MSR_IA32_SYSENTER_EIP, Msr); AsmWriteMsr64 (MSR_IA32_SYSENTER_EIP, Msr);
Msr = (UINT64)(UINTN)gCoreSysCallStackTop;
AsmWriteMsr64 (MSR_IA32_SYSENTER_ESP, Msr);
gCorePageTable = AsmReadCr3 (); gCorePageTable = AsmReadCr3 ();
} }

View File

@ -9,8 +9,6 @@
#include "DxeMain.h" #include "DxeMain.h"
UINTN gCoreSysCallStackTop;
UINTN gRing3CallStackTop;
VOID *gRing3EntryPoint; VOID *gRing3EntryPoint;
RING3_DATA *gRing3Data; RING3_DATA *gRing3Data;
VOID *gRing3Interfaces; VOID *gRing3Interfaces;

View File

@ -10,11 +10,21 @@
LIST_ENTRY mUserSpaceDriversHead = INITIALIZE_LIST_HEAD_VARIABLE (mUserSpaceDriversHead); LIST_ENTRY mUserSpaceDriversHead = INITIALIZE_LIST_HEAD_VARIABLE (mUserSpaceDriversHead);
EFI_STATUS
EFIAPI
CallRing3 (
IN RING3_CALL_DATA *Data,
IN UINTN UserStackTop,
IN UINTN SysCallStackTop
);
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
GoToRing3 ( GoToRing3 (
IN UINT8 Number, IN UINT8 Number,
IN VOID *EntryPoint, IN VOID *EntryPoint,
IN UINTN UserStackTop,
IN UINTN SysCallStackTop,
... ...
) )
{ {
@ -43,14 +53,14 @@ GoToRing3 (
Input->NumberOfArguments = Number; Input->NumberOfArguments = Number;
Input->EntryPoint = EntryPoint; Input->EntryPoint = EntryPoint;
VA_START (Marker, EntryPoint); VA_START (Marker, SysCallStackTop);
for (Index = 0; Index < Number; ++Index) { for (Index = 0; Index < Number; ++Index) {
Input->Arguments[Index] = VA_ARG (Marker, UINTN); Input->Arguments[Index] = VA_ARG (Marker, UINTN);
} }
VA_END (Marker); VA_END (Marker);
ForbidSupervisorAccessToUserMemory (); ForbidSupervisorAccessToUserMemory ();
Status = CallRing3 (Input); Status = CallRing3 (Input, UserStackTop, SysCallStackTop);
CoreFreePages (Ring3Pages, PagesNumber); CoreFreePages (Ring3Pages, PagesNumber);
@ -71,6 +81,7 @@ FindUserSpaceDriver (
UserDriver = BASE_CR (Link, USER_SPACE_DRIVER, Link); UserDriver = BASE_CR (Link, USER_SPACE_DRIVER, Link);
if (UserDriver->CoreWrapper == CoreWrapper) { if (UserDriver->CoreWrapper == CoreWrapper) {
gUserPageTable = UserDriver->UserPageTable;
return UserDriver; return UserDriver;
} }
} }
@ -93,8 +104,7 @@ CoreDriverBindingSupported (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
EntryPoint = (VOID *)This->Supported; EntryPoint = (VOID *)This->Supported;
@ -103,6 +113,8 @@ CoreDriverBindingSupported (
Status = GoToRing3 ( Status = GoToRing3 (
3, 3,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
ControllerHandle, ControllerHandle,
RemainingDevicePath RemainingDevicePath
@ -126,8 +138,7 @@ CoreDriverBindingStart (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
EntryPoint = (VOID *)This->Start; EntryPoint = (VOID *)This->Start;
@ -136,6 +147,8 @@ CoreDriverBindingStart (
Status = GoToRing3 ( Status = GoToRing3 (
3, 3,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
ControllerHandle, ControllerHandle,
RemainingDevicePath RemainingDevicePath
@ -160,8 +173,7 @@ CoreDriverBindingStop (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
EntryPoint = (VOID *)This->Stop; EntryPoint = (VOID *)This->Stop;
@ -170,6 +182,8 @@ CoreDriverBindingStop (
Status = GoToRing3 ( Status = GoToRing3 (
4, 4,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
ControllerHandle, ControllerHandle,
NumberOfChildren, NumberOfChildren,
@ -193,8 +207,7 @@ CoreFileClose (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
EntryPoint = (VOID *)This->Close; EntryPoint = (VOID *)This->Close;
@ -203,10 +216,13 @@ CoreFileClose (
Status = GoToRing3 ( Status = GoToRing3 (
1, 1,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This This
); );
FreePool (UserDriver->CoreWrapper); FreePool (UserDriver->CoreWrapper);
RemoveEntryList (&UserDriver->Link);
return Status; return Status;
} }
@ -241,6 +257,13 @@ CoreFileRead (
if ((This == NULL) || (BufferSize == NULL)) { if ((This == NULL) || (BufferSize == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
//
// gUserPageTable must be set before alloctation of EfiRing3MemoryType pages.
//
UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver;
Ring3Buffer = NULL; Ring3Buffer = NULL;
Ring3Pages = 0; Ring3Pages = 0;
@ -258,12 +281,6 @@ CoreFileRead (
Ring3BufferSize = (UINTN *)(UINTN)Ring3Pages; Ring3BufferSize = (UINTN *)(UINTN)Ring3Pages;
UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
*Ring3BufferSize = *BufferSize; *Ring3BufferSize = *BufferSize;
EntryPoint = (VOID *)This->Read; EntryPoint = (VOID *)This->Read;
@ -276,6 +293,8 @@ CoreFileRead (
Status = GoToRing3 ( Status = GoToRing3 (
3, 3,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
Ring3BufferSize, Ring3BufferSize,
Ring3Buffer Ring3Buffer
@ -320,8 +339,7 @@ CoreFileSetPosition (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
EntryPoint = (VOID *)This->SetPosition; EntryPoint = (VOID *)This->SetPosition;
@ -331,6 +349,8 @@ CoreFileSetPosition (
return GoToRing3 ( return GoToRing3 (
2, 2,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
Position Position
); );
@ -341,17 +361,21 @@ CoreFileSetPosition (
return GoToRing3 ( return GoToRing3 (
3, 3,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
Position Position
); );
#elif defined (MDE_CPU_ARM) #elif defined (MDE_CPU_ARM)
// //
// UINT64 Position is passed as 2 words in 2 registers and is aligned on 8 bytes. // UINT64 Position is passed as 2 words in 2 registers and is aligned on 8 bytes.
// R0 == File->Ring3File, R1 == NULL, R2 == Position_Low, R3 == Position_High. // R0 == This, R1 == NULL, R2 == Position_Low, R3 == Position_High.
// //
return GoToRing3 ( return GoToRing3 (
4, 4,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
Position Position
); );
@ -376,6 +400,11 @@ CoreFileGetPosition (
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver;
Status = CoreAllocatePages ( Status = CoreAllocatePages (
AllocateAnyPages, AllocateAnyPages,
EfiRing3MemoryType, EfiRing3MemoryType,
@ -386,12 +415,6 @@ CoreFileGetPosition (
return Status; return Status;
} }
UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
*(UINT64 *)(UINTN)Ring3Position = *Position; *(UINT64 *)(UINTN)Ring3Position = *Position;
EntryPoint = (VOID *)This->GetPosition; EntryPoint = (VOID *)This->GetPosition;
@ -400,6 +423,8 @@ CoreFileGetPosition (
Status = GoToRing3 ( Status = GoToRing3 (
2, 2,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
Ring3Position Ring3Position
); );
@ -436,6 +461,11 @@ CoreFileGetInfo (
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver;
Ring3Buffer = NULL; Ring3Buffer = NULL;
Ring3InformationType = NULL; Ring3InformationType = NULL;
Ring3Pages = 0; Ring3Pages = 0;
@ -454,12 +484,6 @@ CoreFileGetInfo (
Ring3BufferSize = (UINTN *)(UINTN)Ring3Pages; Ring3BufferSize = (UINTN *)(UINTN)Ring3Pages;
UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
*Ring3BufferSize = *BufferSize; *Ring3BufferSize = *BufferSize;
EntryPoint = (VOID *)This->GetInfo; EntryPoint = (VOID *)This->GetInfo;
@ -480,6 +504,8 @@ CoreFileGetInfo (
Status = GoToRing3 ( Status = GoToRing3 (
4, 4,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
Ring3InformationType, Ring3InformationType,
Ring3BufferSize, Ring3BufferSize,
@ -588,12 +614,18 @@ CoreFileOpen (
EFI_PHYSICAL_ADDRESS Ring3Pages; EFI_PHYSICAL_ADDRESS Ring3Pages;
UINT32 PagesNumber; UINT32 PagesNumber;
USER_SPACE_DRIVER *UserDriver; USER_SPACE_DRIVER *UserDriver;
USER_SPACE_DRIVER *NewDriver;
VOID *EntryPoint; VOID *EntryPoint;
if ((This == NULL) || (NewHandle == NULL) || (FileName == NULL)) { if ((This == NULL) || (NewHandle == NULL) || (FileName == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver;
Ring3NewHandle = NULL; Ring3NewHandle = NULL;
Ring3FileName = NULL; Ring3FileName = NULL;
Ring3Pages = 0; Ring3Pages = 0;
@ -614,12 +646,6 @@ CoreFileOpen (
Ring3NewHandle = (EFI_FILE_PROTOCOL **)(UINTN)Ring3Pages; Ring3NewHandle = (EFI_FILE_PROTOCOL **)(UINTN)Ring3Pages;
Ring3FileName = (CHAR16 *)((EFI_FILE_PROTOCOL **)(UINTN)Ring3Pages + 1); Ring3FileName = (CHAR16 *)((EFI_FILE_PROTOCOL **)(UINTN)Ring3Pages + 1);
UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
Status = StrCpyS (Ring3FileName, StrLen (FileName) + 1, FileName); Status = StrCpyS (Ring3FileName, StrLen (FileName) + 1, FileName);
EntryPoint = (VOID *)This->Open; EntryPoint = (VOID *)This->Open;
@ -634,6 +660,8 @@ CoreFileOpen (
Status = GoToRing3 ( Status = GoToRing3 (
5, 5,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
Ring3NewHandle, Ring3NewHandle,
Ring3FileName, Ring3FileName,
@ -647,6 +675,8 @@ CoreFileOpen (
Status = GoToRing3 ( Status = GoToRing3 (
7, 7,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
Ring3NewHandle, Ring3NewHandle,
Ring3FileName, Ring3FileName,
@ -657,12 +687,14 @@ CoreFileOpen (
// //
// UINT64 OpenMode and Attributes are each passed as 2 words on stack. // UINT64 OpenMode and Attributes are each passed as 2 words on stack.
// Each of them is aligned on 8 bytes. // Each of them is aligned on 8 bytes.
// R0 == File->Ring3File, R1 == Ring3NewHandle, R2 == Ring3FileName, R3 == NULL, // R0 == This, R1 == Ring3NewHandle, R2 == Ring3FileName, R3 == NULL,
// [SP] == OpenMode, [SP + 8] == Attributes. // [SP] == OpenMode, [SP + 8] == Attributes.
// //
Status = GoToRing3 ( Status = GoToRing3 (
8, 8,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
Ring3NewHandle, Ring3NewHandle,
Ring3FileName, Ring3FileName,
@ -683,16 +715,22 @@ CoreFileOpen (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
UserDriver = AllocatePool (sizeof (USER_SPACE_DRIVER)); NewDriver = AllocatePool (sizeof (USER_SPACE_DRIVER));
UserDriver->CoreWrapper = NewFile; NewDriver->CoreWrapper = NewFile;
UserDriver->UserPageTable = gUserPageTable; NewDriver->UserPageTable = UserDriver->UserPageTable;
//
// TODO: Allocate new stacks, because UserDriver can be interrupted
// and interrupt handler may call the same UserDriver again.
//
NewDriver->UserStackTop = UserDriver->UserStackTop;
NewDriver->SysCallStackTop = UserDriver->SysCallStackTop;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
UserDriver->UserSpaceDriver = *Ring3NewHandle; NewDriver->UserSpaceDriver = *Ring3NewHandle;
NewFile->Revision = (*Ring3NewHandle)->Revision; NewFile->Revision = (*Ring3NewHandle)->Revision;
ForbidSupervisorAccessToUserMemory (); ForbidSupervisorAccessToUserMemory ();
InsertTailList (&mUserSpaceDriversHead, &UserDriver->Link); InsertTailList (&mUserSpaceDriversHead, &NewDriver->Link);
NewFile->Open = CoreFileOpen; NewFile->Open = CoreFileOpen;
NewFile->Close = CoreFileClose; NewFile->Close = CoreFileClose;
@ -728,6 +766,7 @@ CoreOpenVolume (
EFI_FILE_PROTOCOL *File; EFI_FILE_PROTOCOL *File;
EFI_PHYSICAL_ADDRESS Physical; EFI_PHYSICAL_ADDRESS Physical;
USER_SPACE_DRIVER *UserDriver; USER_SPACE_DRIVER *UserDriver;
USER_SPACE_DRIVER *NewDriver;
VOID *EntryPoint; VOID *EntryPoint;
if (Root == NULL) { if (Root == NULL) {
@ -737,8 +776,7 @@ CoreOpenVolume (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
EntryPoint = (VOID *)This->OpenVolume; EntryPoint = (VOID *)This->OpenVolume;
@ -760,6 +798,8 @@ CoreOpenVolume (
Status = GoToRing3 ( Status = GoToRing3 (
2, 2,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
Ring3Root Ring3Root
); );
@ -776,16 +816,18 @@ CoreOpenVolume (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
UserDriver = AllocatePool (sizeof (USER_SPACE_DRIVER)); NewDriver = AllocatePool (sizeof (USER_SPACE_DRIVER));
UserDriver->CoreWrapper = File; NewDriver->CoreWrapper = File;
UserDriver->UserPageTable = gUserPageTable; NewDriver->UserPageTable = UserDriver->UserPageTable;
NewDriver->UserStackTop = UserDriver->UserStackTop;
NewDriver->SysCallStackTop = UserDriver->SysCallStackTop;
AllowSupervisorAccessToUserMemory (); AllowSupervisorAccessToUserMemory ();
UserDriver->UserSpaceDriver = *Ring3Root; NewDriver->UserSpaceDriver = *Ring3Root;
File->Revision = (*Ring3Root)->Revision; File->Revision = (*Ring3Root)->Revision;
ForbidSupervisorAccessToUserMemory (); ForbidSupervisorAccessToUserMemory ();
InsertTailList (&mUserSpaceDriversHead, &UserDriver->Link); InsertTailList (&mUserSpaceDriversHead, &NewDriver->Link);
File->Open = CoreFileOpen; File->Open = CoreFileOpen;
File->Close = CoreFileClose; File->Close = CoreFileClose;
@ -827,8 +869,7 @@ CoreUnicodeCollationStriColl (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
Size1 = StrSize (Str1); Size1 = StrSize (Str1);
Size2 = StrSize (Str2); Size2 = StrSize (Str2);
@ -852,6 +893,8 @@ CoreUnicodeCollationStriColl (
Status = GoToRing3 ( Status = GoToRing3 (
3, 3,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
(UINTN)UserMem, (UINTN)UserMem,
(UINTN)UserMem + Size1 (UINTN)UserMem + Size1
@ -880,8 +923,7 @@ CoreUnicodeCollationMetaiMatch (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
Size1 = StrSize (String); Size1 = StrSize (String);
Size2 = StrSize (Pattern); Size2 = StrSize (Pattern);
@ -905,6 +947,8 @@ CoreUnicodeCollationMetaiMatch (
Status = GoToRing3 ( Status = GoToRing3 (
3, 3,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
(UINTN)UserMem, (UINTN)UserMem,
(UINTN)UserMem + Size1 (UINTN)UserMem + Size1
@ -931,8 +975,7 @@ CoreUnicodeCollationStrLwr (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
Size1 = StrSize (Str); Size1 = StrSize (Str);
@ -954,6 +997,8 @@ CoreUnicodeCollationStrLwr (
Status = GoToRing3 ( Status = GoToRing3 (
2, 2,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
(UINTN)UserMem (UINTN)UserMem
); );
@ -981,8 +1026,7 @@ CoreUnicodeCollationStrUpr (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
Size1 = StrSize (Str); Size1 = StrSize (Str);
@ -1004,6 +1048,8 @@ CoreUnicodeCollationStrUpr (
Status = GoToRing3 ( Status = GoToRing3 (
2, 2,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
(UINTN)UserMem (UINTN)UserMem
); );
@ -1032,8 +1078,7 @@ CoreUnicodeCollationFatToStr (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
Status = CoreAllocatePages ( Status = CoreAllocatePages (
AllocateAnyPages, AllocateAnyPages,
@ -1053,6 +1098,8 @@ CoreUnicodeCollationFatToStr (
Status = GoToRing3 ( Status = GoToRing3 (
4, 4,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
FatSize, FatSize,
(UINTN)UserMem, (UINTN)UserMem,
@ -1084,8 +1131,7 @@ CoreUnicodeCollationStrToFat (
UserDriver = FindUserSpaceDriver (This); UserDriver = FindUserSpaceDriver (This);
ASSERT (UserDriver != NULL); ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver; This = UserDriver->UserSpaceDriver;
gUserPageTable = UserDriver->UserPageTable;
Size1 = StrSize (String); Size1 = StrSize (String);
@ -1107,6 +1153,8 @@ CoreUnicodeCollationStrToFat (
Status = GoToRing3 ( Status = GoToRing3 (
4, 4,
EntryPoint, EntryPoint,
UserDriver->UserStackTop,
UserDriver->SysCallStackTop,
This, This,
(UINTN)UserMem, (UINTN)UserMem,
FatSize, FatSize,

View File

@ -15,6 +15,8 @@ typedef struct {
VOID *CoreWrapper; VOID *CoreWrapper;
VOID *UserSpaceDriver; VOID *UserSpaceDriver;
UINTN UserPageTable; UINTN UserPageTable;
UINTN UserStackTop;
UINTN SysCallStackTop;
LIST_ENTRY Link; LIST_ENTRY Link;
} USER_SPACE_DRIVER; } USER_SPACE_DRIVER;

View File

@ -8,8 +8,6 @@
#include <Register/Intel/ArchitecturalMsr.h> #include <Register/Intel/ArchitecturalMsr.h>
extern ASM_PFX(CallBootService) extern ASM_PFX(CallBootService)
extern ASM_PFX(gCoreSysCallStackTop)
extern ASM_PFX(gRing3CallStackTop)
extern ASM_PFX(gRing3EntryPoint) extern ASM_PFX(gRing3EntryPoint)
DEFAULT REL DEFAULT REL
@ -140,7 +138,7 @@ ASM_PFX(CoreBootServices):
mov gs, ax mov gs, ax
; Save User Stack pointers and switch to Core SysCall Stack. ; Save User Stack pointers and switch to Core SysCall Stack.
mov rax, [ASM_PFX(gCoreSysCallStackTop)] mov rax, [ASM_PFX(mCoreSysCallStackTop)]
sub rax, 8 sub rax, 8
mov [rax], rsp mov [rax], rsp
mov rsp, rax mov rsp, rax
@ -192,10 +190,14 @@ o64 sysret
; EFI_STATUS ; EFI_STATUS
; EFIAPI ; EFIAPI
; CallRing3 ( ; CallRing3 (
; IN RING3_CALL_DATA *Data ; IN RING3_CALL_DATA *Data,
; IN UINTN UserStackTop,
; IN UINTN SysCallStackTop
; ); ; );
; ;
; (rcx) Data ; (rcx) Data
; (rdx) UserStackTop
; (r8) SysCallStackTop
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
global ASM_PFX(CallRing3) global ASM_PFX(CallRing3)
ASM_PFX(CallRing3): ASM_PFX(CallRing3):
@ -216,7 +218,9 @@ ASM_PFX(CallRing3):
mov [ASM_PFX(CoreRsp)], rsp mov [ASM_PFX(CoreRsp)], rsp
; Save input Arguments. ; Save input Arguments.
mov r8, [ASM_PFX(gRing3CallStackTop)] mov [ASM_PFX(mRing3CallStackTop)], rdx
mov [ASM_PFX(mCoreSysCallStackTop)], r8
mov r8, [ASM_PFX(mRing3CallStackTop)]
mov r9, [ASM_PFX(gRing3EntryPoint)] mov r9, [ASM_PFX(gRing3EntryPoint)]
mov r10, rcx mov r10, rcx
@ -276,3 +280,11 @@ ASM_PFX(gUserPageTable):
ALIGN 4096 ALIGN 4096
ASM_PFX(CoreRsp): ASM_PFX(CoreRsp):
resq 1 resq 1
global ASM_PFX(mRing3CallStackTop)
ASM_PFX(mRing3CallStackTop):
resq 1
global ASM_PFX(mCoreSysCallStackTop)
ASM_PFX(mCoreSysCallStackTop):
resq 1

View File

@ -265,7 +265,7 @@ INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf
INF USER MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf
INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
@ -291,7 +291,7 @@ INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
INF FatPkg/EnhancedFatDxe/Fat.inf INF USER FatPkg/EnhancedFatDxe/Fat.inf
INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf
INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf
INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf

View File

@ -266,7 +266,7 @@ INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf
INF USER MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf
INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
@ -292,7 +292,7 @@ INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
INF FatPkg/EnhancedFatDxe/Fat.inf INF USER FatPkg/EnhancedFatDxe/Fat.inf
INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf
INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf
INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf

View File

@ -295,7 +295,7 @@ INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf
INF USER MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf
INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
@ -321,7 +321,7 @@ INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf
INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf
INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
INF FatPkg/EnhancedFatDxe/Fat.inf INF USER FatPkg/EnhancedFatDxe/Fat.inf
INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf INF USER MdeModulePkg/Core/Dxe/DxeRing3/DxeRing3.inf
INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf
INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf