mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-31 01:24:12 +02:00
Ring3: Refactored out gCoreSysCallStackTop and gRing3CallStackTop.
This commit is contained in:
parent
efcbf1946d
commit
befe005612
@ -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
|
||||||
|
|
||||||
|
@ -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,
|
||||||
...
|
...
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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}^
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 ();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user