mirror of https://github.com/acidanthera/audk.git
Ring3: Added NumberOfArguments to SysCall() and CallBootService().
This commit is contained in:
parent
82c76dee94
commit
dce1dbefaf
|
@ -2737,6 +2737,7 @@ EFI_STATUS
|
|||
EFIAPI
|
||||
CallBootService (
|
||||
IN UINT8 Type,
|
||||
IN UINT8 NumberOfArguments,
|
||||
IN UINTN *UserArguments,
|
||||
IN UINTN ReturnSP
|
||||
);
|
||||
|
|
|
@ -11,7 +11,8 @@
|
|||
// EFI_STATUS
|
||||
// EFIAPI
|
||||
// SysCall (
|
||||
// IN UINT8 Type,
|
||||
// IN UINT8 Type,
|
||||
// IN UINT8 NumberOfArguments,
|
||||
// ...
|
||||
// );
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
|
@ -11,7 +11,8 @@
|
|||
// EFI_STATUS
|
||||
// EFIAPI
|
||||
// SysCall (
|
||||
// IN UINT8 Type,
|
||||
// IN UINT8 Type,
|
||||
// IN UINT8 NumberOfArguments,
|
||||
// ...
|
||||
// );
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
|
@ -238,7 +238,7 @@ Ring3Call (
|
|||
break;
|
||||
}
|
||||
|
||||
SysCall (SysCallReturnToCore, Status);
|
||||
SysCall (SysCallReturnToCore, 1, Status);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
#include <Uefi/UefiSpec.h>
|
||||
|
||||
extern ASM_PFX(Ring3Call)
|
||||
|
||||
DEFAULT REL
|
||||
|
@ -12,18 +14,36 @@ SECTION .text
|
|||
; EFI_STATUS
|
||||
; EFIAPI
|
||||
; SysCall (
|
||||
; IN UINT8 Type,
|
||||
; IN UINT8 Type,
|
||||
; IN UINT8 NumberOfArguments,
|
||||
; ...
|
||||
; );
|
||||
;------------------------------------------------------------------------------
|
||||
global ASM_PFX(SysCall)
|
||||
ASM_PFX(SysCall):
|
||||
push ebx
|
||||
mov edx, esp
|
||||
mov ecx, [esp + 4] ; Type
|
||||
mov ecx, [esp + 4*2] ; Type
|
||||
mov ebx, [esp + 4*3] ; NumberOfArguments
|
||||
lea eax, [userReturnAddress]
|
||||
|
||||
; Fixup NumberOfArguments.
|
||||
cmp ecx, SC_FREE_PAGES
|
||||
je fixup
|
||||
cmp ecx, SC_BLOCK_IO_READ
|
||||
je fixup
|
||||
cmp ecx, SC_BLOCK_IO_WRITE
|
||||
je fixup
|
||||
cmp ecx, SC_DISK_IO_READ
|
||||
je fixup
|
||||
cmp ecx, SC_DISK_IO_WRITE
|
||||
je fixup
|
||||
jmp makecall
|
||||
fixup:
|
||||
add ebx, 1
|
||||
makecall:
|
||||
sysenter
|
||||
userReturnAddress:
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
|
|
|
@ -14,7 +14,8 @@
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
SysCall (
|
||||
IN UINT8 Type,
|
||||
IN UINT8 Type,
|
||||
IN UINT8 NumberOfArguments,
|
||||
...
|
||||
);
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ Ring3BlockIoReset (
|
|||
{
|
||||
return SysCall (
|
||||
SysCallBlockIoReset,
|
||||
2,
|
||||
This,
|
||||
ExtendedVerification
|
||||
);
|
||||
|
@ -33,6 +34,7 @@ Ring3BlockIoRead (
|
|||
{
|
||||
return SysCall (
|
||||
SysCallBlockIoRead,
|
||||
5,
|
||||
This,
|
||||
MediaId,
|
||||
BufferSize,
|
||||
|
@ -53,6 +55,7 @@ Ring3BlockIoWrite (
|
|||
{
|
||||
return SysCall (
|
||||
SysCallBlockIoWrite,
|
||||
5,
|
||||
This,
|
||||
MediaId,
|
||||
BufferSize,
|
||||
|
@ -69,6 +72,7 @@ Ring3BlockIoFlush (
|
|||
{
|
||||
return SysCall (
|
||||
SysCallBlockIoFlush,
|
||||
1,
|
||||
This
|
||||
);
|
||||
}
|
||||
|
@ -85,6 +89,7 @@ Ring3DiskIoRead (
|
|||
{
|
||||
return SysCall (
|
||||
SysCallDiskIoRead,
|
||||
5,
|
||||
This,
|
||||
MediaId,
|
||||
BufferSize,
|
||||
|
@ -105,6 +110,7 @@ Ring3DiskIoWrite (
|
|||
{
|
||||
return SysCall (
|
||||
SysCallDiskIoWrite,
|
||||
5,
|
||||
This,
|
||||
MediaId,
|
||||
BufferSize,
|
||||
|
@ -123,6 +129,7 @@ Ring3UnicodeStriColl (
|
|||
{
|
||||
return (INTN)SysCall (
|
||||
SysCallUnicodeStriColl,
|
||||
3,
|
||||
This,
|
||||
Str1,
|
||||
Str2
|
||||
|
@ -139,6 +146,7 @@ Ring3UnicodeMetaiMatch (
|
|||
{
|
||||
return (BOOLEAN)SysCall (
|
||||
SysCallUnicodeMetaiMatch,
|
||||
3,
|
||||
This,
|
||||
String,
|
||||
Pattern
|
||||
|
@ -154,6 +162,7 @@ Ring3UnicodeStrLwr (
|
|||
{
|
||||
SysCall (
|
||||
SysCallUnicodeStrLwr,
|
||||
2,
|
||||
This,
|
||||
Str
|
||||
);
|
||||
|
@ -168,6 +177,7 @@ Ring3UnicodeStrUpr (
|
|||
{
|
||||
SysCall (
|
||||
SysCallUnicodeStrUpr,
|
||||
2,
|
||||
This,
|
||||
Str
|
||||
);
|
||||
|
@ -184,6 +194,7 @@ Ring3UnicodeFatToStr (
|
|||
{
|
||||
SysCall (
|
||||
SysCallUnicodeFatToStr,
|
||||
4,
|
||||
This,
|
||||
FatSize,
|
||||
Fat,
|
||||
|
@ -202,6 +213,7 @@ Ring3UnicodeStrToFat (
|
|||
{
|
||||
return (BOOLEAN)SysCall (
|
||||
SysCallUnicodeStrToFat,
|
||||
4,
|
||||
This,
|
||||
String,
|
||||
FatSize,
|
||||
|
|
|
@ -98,6 +98,7 @@ Ring3RaiseTpl (
|
|||
{
|
||||
return (EFI_TPL)SysCall (
|
||||
SysCallRaiseTpl,
|
||||
1,
|
||||
NewTpl
|
||||
);
|
||||
}
|
||||
|
@ -110,6 +111,7 @@ Ring3RestoreTpl (
|
|||
{
|
||||
SysCall (
|
||||
SysCallRestoreTpl,
|
||||
1,
|
||||
NewTpl
|
||||
);
|
||||
}
|
||||
|
@ -127,6 +129,7 @@ Ring3AllocatePages (
|
|||
|
||||
Status = SysCall (
|
||||
SysCallAllocatePages,
|
||||
4,
|
||||
Type,
|
||||
EfiRing3MemoryType,
|
||||
NumberOfPages,
|
||||
|
@ -150,6 +153,7 @@ Ring3FreePages (
|
|||
|
||||
Status = SysCall (
|
||||
SysCallFreePages,
|
||||
2,
|
||||
NumberOfPages,
|
||||
Memory
|
||||
);
|
||||
|
@ -302,6 +306,7 @@ Ring3HandleProtocol (
|
|||
|
||||
Status = SysCall (
|
||||
SysCallHandleProtocol,
|
||||
3,
|
||||
CoreUserHandle,
|
||||
Protocol,
|
||||
Interface
|
||||
|
@ -511,6 +516,7 @@ Ring3OpenProtocol (
|
|||
|
||||
Status = SysCall (
|
||||
SysCallOpenProtocol,
|
||||
6,
|
||||
CoreUserHandle,
|
||||
Protocol,
|
||||
Interface,
|
||||
|
@ -536,6 +542,7 @@ Ring3CloseProtocol (
|
|||
{
|
||||
return SysCall (
|
||||
SysCallCloseProtocol,
|
||||
4,
|
||||
UserHandle,
|
||||
Protocol,
|
||||
AgentHandle,
|
||||
|
@ -587,6 +594,7 @@ Ring3LocateHandleBuffer (
|
|||
|
||||
StatusBS = SysCall (
|
||||
SysCallLocateHandleBuffer,
|
||||
5,
|
||||
SearchType,
|
||||
Protocol,
|
||||
SearchKey,
|
||||
|
@ -631,6 +639,7 @@ Ring3LocateProtocol (
|
|||
|
||||
Status = SysCall (
|
||||
SysCallLocateProtocol,
|
||||
3,
|
||||
Protocol,
|
||||
CoreRegistration,
|
||||
Interface
|
||||
|
@ -673,6 +682,7 @@ Ring3InstallMultipleProtocolInterfaces (
|
|||
|
||||
return SysCall (
|
||||
SysCallInstallMultipleProtocolInterfaces,
|
||||
2,
|
||||
Handle,
|
||||
ArgList
|
||||
);
|
||||
|
@ -700,6 +710,7 @@ Ring3CalculateCrc32 (
|
|||
{
|
||||
return SysCall (
|
||||
SysCallCalculateCrc32,
|
||||
3,
|
||||
Data,
|
||||
DataSize,
|
||||
Crc32
|
||||
|
|
|
@ -91,6 +91,7 @@ Ring3GetVariable (
|
|||
{
|
||||
return SysCall (
|
||||
SysCallGetVariable,
|
||||
5,
|
||||
VariableName,
|
||||
VendorGuid,
|
||||
Attributes,
|
||||
|
|
|
@ -12,7 +12,8 @@ SECTION .text
|
|||
; EFI_STATUS
|
||||
; EFIAPI
|
||||
; SysCall (
|
||||
; IN UINT8 Type,
|
||||
; IN UINT8 Type,
|
||||
; IN UINT8 NumberOfArguments,
|
||||
; ...
|
||||
; );
|
||||
;------------------------------------------------------------------------------
|
||||
|
@ -20,7 +21,21 @@ global ASM_PFX(SysCall)
|
|||
ASM_PFX(SysCall):
|
||||
; Save Type for CoreBootServices().
|
||||
mov r10, rcx
|
||||
|
||||
; Construct User Arguments[].
|
||||
cmp rdx, 2
|
||||
jg continue
|
||||
push r9
|
||||
push r8
|
||||
mov r8, rsp
|
||||
sub r8, 8
|
||||
add rsp, 8*2
|
||||
jmp makecall
|
||||
continue:
|
||||
mov [rsp + 8*4], r9
|
||||
mov [rsp + 8*3], r8
|
||||
mov r8, rsp
|
||||
add r8, 8*2
|
||||
makecall:
|
||||
; SYSCALL saves RFLAGS into R11 and the RIP of the next instruction into RCX.
|
||||
syscall
|
||||
; SYSRET copies the value in RCX into RIP and loads RFLAGS from R11.
|
||||
|
|
|
@ -39,7 +39,7 @@ SysCallBootService (
|
|||
Status = CoreAllocatePages (
|
||||
AllocateAnyPages,
|
||||
EfiRing3MemoryType,
|
||||
EFI_SIZE_TO_PAGES (8 * sizeof (UINTN)),
|
||||
EFI_SIZE_TO_PAGES (7 * sizeof (UINTN)),
|
||||
&Physical
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
@ -47,16 +47,17 @@ SysCallBootService (
|
|||
}
|
||||
|
||||
AllowSupervisorAccessToUserMemory ();
|
||||
CopyMem ((VOID *)Physical, (VOID *)&(Context.SystemContextAArch64->X0), 8 * sizeof (UINTN));
|
||||
CopyMem ((VOID *)Physical, (VOID *)&(Context.SystemContextAArch64->X1), 7 * sizeof (UINTN));
|
||||
ForbidSupervisorAccessToUserMemory ();
|
||||
|
||||
Status = CallBootService (
|
||||
Context.SystemContextAArch64->X0,
|
||||
Context.SystemContextAArch64->X1,
|
||||
(UINTN *)Physical,
|
||||
*(UINTN *)Context.SystemContextAArch64->SP
|
||||
);
|
||||
|
||||
CoreFreePages (Physical, EFI_SIZE_TO_PAGES (9 * sizeof (UINTN)));
|
||||
CoreFreePages (Physical, EFI_SIZE_TO_PAGES (7 * sizeof (UINTN)));
|
||||
|
||||
ArmDisableInterrupts ();
|
||||
|
||||
|
|
|
@ -32,13 +32,26 @@ SysCallBootService (
|
|||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS Physical;
|
||||
UINT8 Type;
|
||||
UINT8 NumberOfArguments;
|
||||
|
||||
ArmEnableInterrupts ();
|
||||
|
||||
Type = Context.SystemContextArm->R0;
|
||||
NumberOfArguments = Context.SystemContextArm->R1;
|
||||
|
||||
if ((Type == SysCallFreePages)
|
||||
|| (Type == SysCallBlockIoRead)
|
||||
|| (Type == SysCallBlockIoWrite)
|
||||
|| (Type == SysCallDiskIoRead)
|
||||
|| (Type == SysCallDiskIoWrite)) {
|
||||
++NumberOfArguments;
|
||||
}
|
||||
|
||||
Status = CoreAllocatePages (
|
||||
AllocateAnyPages,
|
||||
EfiRing3MemoryType,
|
||||
EFI_SIZE_TO_PAGES (8 * sizeof (UINTN)),
|
||||
EFI_SIZE_TO_PAGES ((NumberOfArguments + 1) * sizeof (UINTN)),
|
||||
&Physical
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
@ -46,25 +59,47 @@ SysCallBootService (
|
|||
}
|
||||
|
||||
AllowSupervisorAccessToUserMemory ();
|
||||
//
|
||||
// First 3 arguments are passed through R1-R3 and copied to SysCall Stack.
|
||||
//
|
||||
CopyMem ((VOID *)(UINTN)Physical, (VOID *)&(Context.SystemContextArm->R0), 4 * sizeof (UINTN));
|
||||
//
|
||||
// All remaining arguments are on User Stack.
|
||||
//
|
||||
CopyMem ((VOID *)((UINTN)Physical + 4 * sizeof (UINTN)), (VOID *)Context.SystemContextArm->SP, 4 * sizeof (UINTN));
|
||||
if (Type == SysCallFreePages) {
|
||||
//
|
||||
// R0 == Type, R1 == NumberOfArguments, R2 == NumberOfPages, R3 == NULL
|
||||
// [SP] == Memory
|
||||
// Memory is passed as 2 words on stack and aligned on 8 bytes.
|
||||
//
|
||||
CopyMem ((VOID *)(UINTN)Physical, (VOID *)&(Context.SystemContextArm->R1), 2 * sizeof (UINTN));
|
||||
CopyMem (
|
||||
(VOID *)((UINTN)Physical + 2 * sizeof (UINTN)),
|
||||
(VOID *)Context.SystemContextArm->SP,
|
||||
2 * sizeof (UINTN)
|
||||
);
|
||||
} else {
|
||||
//
|
||||
// First 2 arguments are passed through R2-R3 and copied to SysCall Stack.
|
||||
//
|
||||
CopyMem ((VOID *)(UINTN)Physical, (VOID *)&(Context.SystemContextArm->R1), 3 * sizeof (UINTN));
|
||||
|
||||
if (NumberOfArguments > 2) {
|
||||
//
|
||||
// All remaining arguments are on User Stack.
|
||||
//
|
||||
CopyMem (
|
||||
(VOID *)((UINTN)Physical + 3 * sizeof (UINTN)),
|
||||
(VOID *)Context.SystemContextArm->SP,
|
||||
(NumberOfArguments - 2) * sizeof (UINTN)
|
||||
);
|
||||
}
|
||||
}
|
||||
ForbidSupervisorAccessToUserMemory ();
|
||||
|
||||
Status = CallBootService (
|
||||
Context.SystemContextArm->R0,
|
||||
Type,
|
||||
NumberOfArguments,
|
||||
(UINTN *)(UINTN)Physical,
|
||||
*(UINTN *)Context.SystemContextArm->SP_EL1
|
||||
);
|
||||
//
|
||||
// TODO: Fix memory leak for ReturnToCore().
|
||||
//
|
||||
CoreFreePages (Physical, EFI_SIZE_TO_PAGES (9 * sizeof (UINTN)));
|
||||
CoreFreePages (Physical, EFI_SIZE_TO_PAGES ((NumberOfArguments + 1) * sizeof (UINTN)));
|
||||
|
||||
ArmDisableInterrupts ();
|
||||
|
||||
|
|
|
@ -279,7 +279,7 @@ STATIC
|
|||
UINTN *
|
||||
EFIAPI
|
||||
CopyUserArguments (
|
||||
IN UINTN NumberOfArguments,
|
||||
IN UINT8 NumberOfArguments,
|
||||
IN UINTN *UserArguments
|
||||
)
|
||||
{
|
||||
|
@ -330,6 +330,7 @@ EFI_STATUS
|
|||
EFIAPI
|
||||
CallBootService (
|
||||
IN UINT8 Type,
|
||||
IN UINT8 NumberOfArguments,
|
||||
IN UINTN *UserArguments,
|
||||
IN UINTN ReturnSP
|
||||
)
|
||||
|
@ -367,13 +368,12 @@ CallBootService (
|
|||
Argument5 = 0;
|
||||
Argument6 = 0;
|
||||
Interface = NULL;
|
||||
Arguments = CopyUserArguments (NumberOfArguments, UserArguments);
|
||||
|
||||
DEBUG ((DEBUG_VERBOSE, "Type: %a\n", SysCallNames[Type]));
|
||||
|
||||
switch (Type) {
|
||||
case SysCallReturnToCore:
|
||||
Arguments = CopyUserArguments (1, UserArguments);
|
||||
|
||||
ReturnToCore (Arguments[1], ReturnSP);
|
||||
break;
|
||||
case SysCallLocateProtocol:
|
||||
|
@ -382,8 +382,6 @@ CallBootService (
|
|||
// Argument 2: VOID *CoreRegistration
|
||||
// Argument 3: VOID **Interface
|
||||
//
|
||||
Arguments = CopyUserArguments (3, UserArguments);
|
||||
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)Arguments[1], &Attributes);
|
||||
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(Arguments[1] + sizeof (EFI_GUID) - 1), &Attributes);
|
||||
|
@ -428,8 +426,6 @@ CallBootService (
|
|||
// Argument 5: EFI_HANDLE CoreControllerHandle
|
||||
// Argument 6: UINT32 Attributes
|
||||
//
|
||||
Arguments = CopyUserArguments (6, UserArguments);
|
||||
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)Arguments[2], &Attributes);
|
||||
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(Arguments[2] + sizeof (EFI_GUID) - 1), &Attributes);
|
||||
|
@ -476,8 +472,6 @@ CallBootService (
|
|||
// Argument 1: EFI_HANDLE *Handle
|
||||
// ...
|
||||
//
|
||||
Arguments = CopyUserArguments (2, UserArguments);
|
||||
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)Arguments[1], &Attributes);
|
||||
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(Arguments[1] + sizeof (EFI_HANDLE *) - 1), &Attributes);
|
||||
|
@ -588,8 +582,6 @@ CallBootService (
|
|||
// Argument 3: EFI_HANDLE CoreAgentHandle
|
||||
// Argument 4: EFI_HANDLE CoreControllerHandle
|
||||
//
|
||||
Arguments = CopyUserArguments (4, UserArguments);
|
||||
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)Arguments[2], &Attributes);
|
||||
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(Arguments[2] + sizeof (EFI_GUID) - 1), &Attributes);
|
||||
|
@ -619,8 +611,6 @@ CallBootService (
|
|||
// Argument 2: EFI_GUID *Protocol
|
||||
// Argument 3: VOID **Interface
|
||||
//
|
||||
Arguments = CopyUserArguments (3, UserArguments);
|
||||
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)Arguments[2], &Attributes);
|
||||
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(Arguments[2] + sizeof (EFI_GUID) - 1), &Attributes);
|
||||
|
@ -663,8 +653,6 @@ CallBootService (
|
|||
// Argument 3: UINTN NumberOfPages
|
||||
// Argument 4: EFI_PHYSICAL_ADDRESS *Memory
|
||||
//
|
||||
Arguments = CopyUserArguments (4, UserArguments);
|
||||
|
||||
Status = gBS->AllocatePages (
|
||||
(EFI_ALLOCATE_TYPE)Arguments[1],
|
||||
(EFI_MEMORY_TYPE)Arguments[2],
|
||||
|
@ -689,8 +677,7 @@ CallBootService (
|
|||
// Argument 1: UINTN NumberOfPages
|
||||
// Argument 2: EFI_PHYSICAL_ADDRESS Memory
|
||||
//
|
||||
Arguments = CopyUserArguments (3, UserArguments);
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[2];
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[2];
|
||||
|
||||
gCpu->GetMemoryAttributes (gCpu, PhysAddr, &Attributes);
|
||||
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
||||
|
@ -706,8 +693,6 @@ CallBootService (
|
|||
//
|
||||
// Argument 1: EFI_TPL NewTpl
|
||||
//
|
||||
Arguments = CopyUserArguments (1, UserArguments);
|
||||
|
||||
Status = (EFI_STATUS)gBS->RaiseTPL ((EFI_TPL)Arguments[1]);
|
||||
|
||||
FreePool (Arguments);
|
||||
|
@ -717,8 +702,6 @@ CallBootService (
|
|||
//
|
||||
// Argument 1: EFI_TPL NewTpl
|
||||
//
|
||||
Arguments = CopyUserArguments (1, UserArguments);
|
||||
|
||||
gBS->RestoreTPL ((EFI_TPL)Arguments[1]);
|
||||
|
||||
FreePool (Arguments);
|
||||
|
@ -732,8 +715,6 @@ CallBootService (
|
|||
// Argument 4: UINTN *NumberHandles
|
||||
// Argument 5: EFI_HANDLE **Buffer
|
||||
//
|
||||
Arguments = CopyUserArguments (5, UserArguments);
|
||||
|
||||
if ((EFI_GUID *)Arguments[2] != NULL) {
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)Arguments[2], &Attributes);
|
||||
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
||||
|
@ -805,8 +786,6 @@ CallBootService (
|
|||
// Argument 2: UINTN DataSize
|
||||
// Argument 3: UINT32 *Crc32
|
||||
//
|
||||
Arguments = CopyUserArguments (3, UserArguments);
|
||||
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)Arguments[1], &Attributes);
|
||||
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)(Arguments[1] + Arguments[2] - 1), &Attributes);
|
||||
|
@ -847,8 +826,6 @@ CallBootService (
|
|||
// Argument 4: UINTN *DataSize
|
||||
// Argument 5: VOID *Data OPTIONAL
|
||||
//
|
||||
Arguments = CopyUserArguments (5, UserArguments);
|
||||
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)Arguments[1], &Attributes);
|
||||
ASSERT ((Attributes & EFI_MEMORY_USER) != 0);
|
||||
gCpu->GetMemoryAttributes (gCpu, (EFI_PHYSICAL_ADDRESS)Arguments[2], &Attributes);
|
||||
|
@ -938,8 +915,6 @@ CallBootService (
|
|||
// Argument 1: EFI_BLOCK_IO_PROTOCOL *This
|
||||
// Argument 2: BOOLEAN ExtendedVerification
|
||||
//
|
||||
Arguments = CopyUserArguments (2, UserArguments);
|
||||
|
||||
BlockIo = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
if (BlockIo == NULL) {
|
||||
|
@ -963,16 +938,7 @@ CallBootService (
|
|||
// Argument 4: VOID *Buffer
|
||||
// Argument 5: EFI_LBA Lba
|
||||
//
|
||||
#if defined (MDE_CPU_ARM)
|
||||
//
|
||||
// EFI_LBA Lba is aligned on 8 bytes.
|
||||
//
|
||||
Arguments = CopyUserArguments (7, UserArguments);
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[6];
|
||||
#else
|
||||
Arguments = CopyUserArguments (6, UserArguments);
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[5];
|
||||
#endif
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[5];
|
||||
|
||||
BlockIo = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
|
@ -1017,16 +983,7 @@ CallBootService (
|
|||
// Argument 4: VOID *Buffer
|
||||
// Argument 5: EFI_LBA Lba
|
||||
//
|
||||
#if defined (MDE_CPU_ARM)
|
||||
//
|
||||
// EFI_LBA Lba is aligned on 8 bytes.
|
||||
//
|
||||
Arguments = CopyUserArguments (7, UserArguments);
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[6];
|
||||
#else
|
||||
Arguments = CopyUserArguments (6, UserArguments);
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[5];
|
||||
#endif
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[5];
|
||||
|
||||
BlockIo = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
|
@ -1067,8 +1024,6 @@ CallBootService (
|
|||
//
|
||||
// Argument 1: EFI_BLOCK_IO_PROTOCOL *This
|
||||
//
|
||||
Arguments = CopyUserArguments (1, UserArguments);
|
||||
|
||||
BlockIo = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
if (BlockIo == NULL) {
|
||||
|
@ -1089,16 +1044,7 @@ CallBootService (
|
|||
// Argument 4: VOID *Buffer
|
||||
// Argument 5: UINT64 Offset
|
||||
//
|
||||
#if defined (MDE_CPU_ARM)
|
||||
//
|
||||
// UINT64 Offset is aligned on 8 bytes.
|
||||
//
|
||||
Arguments = CopyUserArguments (7, UserArguments);
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[6];
|
||||
#else
|
||||
Arguments = CopyUserArguments (6, UserArguments);
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[5];
|
||||
#endif
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[5];
|
||||
|
||||
DiskIo = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
|
@ -1143,16 +1089,7 @@ CallBootService (
|
|||
// Argument 4: VOID *Buffer
|
||||
// Argument 5: UINT64 Offset
|
||||
//
|
||||
#if defined (MDE_CPU_ARM)
|
||||
//
|
||||
// UINT64 Offset is aligned on 8 bytes.
|
||||
//
|
||||
Arguments = CopyUserArguments (7, UserArguments);
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[6];
|
||||
#else
|
||||
Arguments = CopyUserArguments (6, UserArguments);
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[5];
|
||||
#endif
|
||||
PhysAddr = *(EFI_PHYSICAL_ADDRESS *)&Arguments[5];
|
||||
|
||||
DiskIo = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
|
@ -1195,8 +1132,6 @@ CallBootService (
|
|||
// Argument 2: CHAR16 *Str1
|
||||
// Argument 3: CHAR16 *Str2
|
||||
//
|
||||
Arguments = CopyUserArguments (3, UserArguments);
|
||||
|
||||
Unicode = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
if (Unicode == NULL) {
|
||||
|
@ -1263,8 +1198,6 @@ CallBootService (
|
|||
// Argument 2: CHAR16 *String
|
||||
// Argument 3: CHAR16 *Pattern
|
||||
//
|
||||
Arguments = CopyUserArguments (3, UserArguments);
|
||||
|
||||
Unicode = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
if (Unicode == NULL) {
|
||||
|
@ -1330,8 +1263,6 @@ CallBootService (
|
|||
// Argument 1: EFI_UNICODE_COLLATION_PROTOCOL *This
|
||||
// Argument 2: CHAR16 *Str
|
||||
//
|
||||
Arguments = CopyUserArguments (2, UserArguments);
|
||||
|
||||
Unicode = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
if (Unicode == NULL) {
|
||||
|
@ -1376,8 +1307,6 @@ CallBootService (
|
|||
// Argument 1: EFI_UNICODE_COLLATION_PROTOCOL *This
|
||||
// Argument 2: CHAR16 *Str
|
||||
//
|
||||
Arguments = CopyUserArguments (2, UserArguments);
|
||||
|
||||
Unicode = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
if (Unicode == NULL) {
|
||||
|
@ -1424,8 +1353,6 @@ CallBootService (
|
|||
// Argument 3: CHAR8 *Fat
|
||||
// Argument 4: CHAR16 *String
|
||||
//
|
||||
Arguments = CopyUserArguments (4, UserArguments);
|
||||
|
||||
Unicode = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
if (Unicode == NULL) {
|
||||
|
@ -1494,8 +1421,6 @@ CallBootService (
|
|||
// Argument 3: UINTN FatSize
|
||||
// Argument 4: CHAR8 *Fat
|
||||
//
|
||||
Arguments = CopyUserArguments (4, UserArguments);
|
||||
|
||||
Unicode = FindInterface (FALSE, (VOID *)Arguments[1]);
|
||||
|
||||
if (Unicode == NULL) {
|
||||
|
|
|
@ -109,6 +109,7 @@ ASM_PFX(SysCallBase):
|
|||
; );
|
||||
;
|
||||
; (eax) User return address.
|
||||
; (ebx) Number of User Arguments.
|
||||
; (ecx) Type.
|
||||
; (edx) User Stack Pointer.
|
||||
;
|
||||
|
@ -135,8 +136,9 @@ ASM_PFX(CoreBootServices):
|
|||
mov ebp, esp
|
||||
mov eax, [esp + 4*3]
|
||||
push eax ; ReturnSP
|
||||
add edx, 4 ; User Arguments[]
|
||||
push edx
|
||||
add edx, 4*3
|
||||
push edx ; User Arguments[]
|
||||
push ebx ; NumberOfArguments
|
||||
push ecx ; Type
|
||||
|
||||
sti
|
||||
|
|
|
@ -117,13 +117,10 @@ ASM_PFX(SysCallBase):
|
|||
; );
|
||||
;
|
||||
; (rcx) RIP of the next instruction saved by SYSCALL in SysCall().
|
||||
; (rdx) Argument 1 of the called function.
|
||||
; (r8) Argument 2 of the called function.
|
||||
; (r9) Argument 3 of the called function.
|
||||
; (rdx) Number of User Arguments.
|
||||
; (r8) User Arguments[].
|
||||
; (r10) Type.
|
||||
; (r11) RFLAGS saved by SYSCALL in SysCall().
|
||||
;
|
||||
; (On User Stack) Argument 4, 5, ...
|
||||
;------------------------------------------------------------------------------
|
||||
global ASM_PFX(CoreBootServices)
|
||||
ASM_PFX(CoreBootServices):
|
||||
|
@ -147,23 +144,14 @@ ASM_PFX(CoreBootServices):
|
|||
push rcx
|
||||
; Save User RFLAGS for SYSRET.
|
||||
push r11
|
||||
; Save User Arguments [1..3] on User stack.
|
||||
call ASM_PFX(AllowSupervisorAccessToUserMemory)
|
||||
mov rax, [rsp + 8*3]
|
||||
mov [rax + 8*2], rdx
|
||||
mov [rax + 8*3], r8
|
||||
mov [rax + 8*4], r9
|
||||
call ASM_PFX(ForbidSupervisorAccessToUserMemory)
|
||||
mov rbp, rsp
|
||||
; Reserve space on stack for 4 CallBootService arguments (NOOPT prerequisite).
|
||||
sub rsp, 8*4
|
||||
|
||||
; Prepare CallBootService arguments.
|
||||
mov rcx, r10 ; Type
|
||||
mov rdx, [rbp + 8*3]
|
||||
add rdx, 8 ; User Arguments[]
|
||||
mov rax, [ASM_PFX(SysCallStackTop)]
|
||||
mov r8, [rax] ; ReturnSP
|
||||
mov r9, [rax] ; ReturnSP
|
||||
|
||||
sti
|
||||
call ASM_PFX(CallBootService)
|
||||
|
|
|
@ -2024,7 +2024,7 @@ typedef enum {
|
|||
SysCallCloseProtocol,
|
||||
SysCallHandleProtocol,
|
||||
SysCallAllocatePages,
|
||||
SysCallFreePages,
|
||||
SysCallFreePages = 7,
|
||||
SysCallRaiseTpl,
|
||||
SysCallRestoreTpl,
|
||||
SysCallLocateHandleBuffer,
|
||||
|
@ -2037,11 +2037,11 @@ typedef enum {
|
|||
// Protocols
|
||||
//
|
||||
SysCallBlockIoReset,
|
||||
SysCallBlockIoRead,
|
||||
SysCallBlockIoWrite,
|
||||
SysCallBlockIoRead = 14,
|
||||
SysCallBlockIoWrite = 15,
|
||||
SysCallBlockIoFlush,
|
||||
SysCallDiskIoRead,
|
||||
SysCallDiskIoWrite,
|
||||
SysCallDiskIoRead = 17,
|
||||
SysCallDiskIoWrite = 18,
|
||||
SysCallUnicodeStriColl,
|
||||
SysCallUnicodeMetaiMatch,
|
||||
SysCallUnicodeStrLwr,
|
||||
|
@ -2052,6 +2052,11 @@ typedef enum {
|
|||
} SYS_CALL_TYPE;
|
||||
|
||||
#define MAX_LIST 32
|
||||
#define SC_FREE_PAGES 7
|
||||
#define SC_BLOCK_IO_READ 14
|
||||
#define SC_BLOCK_IO_WRITE 15
|
||||
#define SC_DISK_IO_READ 17
|
||||
#define SC_DISK_IO_WRITE 18
|
||||
|
||||
///
|
||||
/// Contains a set of GUID/pointer pairs comprised of the ConfigurationTable field in the
|
||||
|
|
Loading…
Reference in New Issue