mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-24 06:04:52 +02:00
Ring3: Added BlockIo, DiskIo wrappers.
This commit is contained in:
parent
d19bee4d2d
commit
c8c5e3ea28
@ -10,9 +10,6 @@
|
|||||||
#include <Protocol/DiskIo.h>
|
#include <Protocol/DiskIo.h>
|
||||||
#include <Protocol/LoadedImage.h>
|
#include <Protocol/LoadedImage.h>
|
||||||
|
|
||||||
extern EFI_BLOCK_IO_PROTOCOL mCoreBlockIo;
|
|
||||||
extern EFI_DISK_IO_PROTOCOL mCoreDiskIo;
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
SysCall (
|
SysCall (
|
||||||
|
@ -17,7 +17,11 @@ Ring3BlockIoReset (
|
|||||||
IN BOOLEAN ExtendedVerification
|
IN BOOLEAN ExtendedVerification
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return SysCall (
|
||||||
|
SysCallBlockIoReset,
|
||||||
|
This,
|
||||||
|
ExtendedVerification
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -30,7 +34,14 @@ Ring3BlockIoRead (
|
|||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return SysCall (
|
||||||
|
SysCallBlockIoRead,
|
||||||
|
This,
|
||||||
|
MediaId,
|
||||||
|
Lba,
|
||||||
|
BufferSize,
|
||||||
|
Buffer
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -43,7 +54,14 @@ Ring3BlockIoWrite (
|
|||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return SysCall (
|
||||||
|
SysCallBlockIoWrite,
|
||||||
|
This,
|
||||||
|
MediaId,
|
||||||
|
Lba,
|
||||||
|
BufferSize,
|
||||||
|
Buffer
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -52,7 +70,10 @@ Ring3BlockIoFlush (
|
|||||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return SysCall (
|
||||||
|
SysCallBlockIoFlush,
|
||||||
|
This
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -65,7 +86,14 @@ Ring3DiskIoRead (
|
|||||||
OUT VOID *Buffer
|
OUT VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return SysCall (
|
||||||
|
SysCallDiskIoRead,
|
||||||
|
This,
|
||||||
|
MediaId,
|
||||||
|
Offset,
|
||||||
|
BufferSize,
|
||||||
|
Buffer
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -78,5 +106,12 @@ Ring3DiskIoWrite (
|
|||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return SysCall (
|
||||||
|
SysCallDiskIoWrite,
|
||||||
|
This,
|
||||||
|
MediaId,
|
||||||
|
Offset,
|
||||||
|
BufferSize,
|
||||||
|
Buffer
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -413,11 +413,6 @@ Ring3OpenProtocol (
|
|||||||
|
|
||||||
BlockIo = (EFI_BLOCK_IO_PROTOCOL *)*Interface;
|
BlockIo = (EFI_BLOCK_IO_PROTOCOL *)*Interface;
|
||||||
|
|
||||||
mCoreBlockIo.Reset = BlockIo->Reset;
|
|
||||||
mCoreBlockIo.ReadBlocks = BlockIo->ReadBlocks;
|
|
||||||
mCoreBlockIo.WriteBlocks = BlockIo->WriteBlocks;
|
|
||||||
mCoreBlockIo.FlushBlocks = BlockIo->FlushBlocks;
|
|
||||||
|
|
||||||
BlockIo->Reset = Ring3BlockIoReset;
|
BlockIo->Reset = Ring3BlockIoReset;
|
||||||
BlockIo->ReadBlocks = Ring3BlockIoRead;
|
BlockIo->ReadBlocks = Ring3BlockIoRead;
|
||||||
BlockIo->WriteBlocks = Ring3BlockIoWrite;
|
BlockIo->WriteBlocks = Ring3BlockIoWrite;
|
||||||
@ -427,9 +422,6 @@ Ring3OpenProtocol (
|
|||||||
|
|
||||||
DiskIo = (EFI_DISK_IO_PROTOCOL *)*Interface;
|
DiskIo = (EFI_DISK_IO_PROTOCOL *)*Interface;
|
||||||
|
|
||||||
mCoreDiskIo.ReadDisk = DiskIo->ReadDisk;
|
|
||||||
mCoreDiskIo.WriteDisk = DiskIo->WriteDisk;
|
|
||||||
|
|
||||||
DiskIo->ReadDisk = Ring3DiskIoRead;
|
DiskIo->ReadDisk = Ring3DiskIoRead;
|
||||||
DiskIo->WriteDisk = Ring3DiskIoWrite;
|
DiskIo->WriteDisk = Ring3DiskIoWrite;
|
||||||
|
|
||||||
|
@ -8,6 +8,9 @@
|
|||||||
#include "DxeMain.h"
|
#include "DxeMain.h"
|
||||||
#include "SupportedProtocols.h"
|
#include "SupportedProtocols.h"
|
||||||
|
|
||||||
|
EFI_DISK_IO_PROTOCOL *mCoreDiskIoProtocol;
|
||||||
|
EFI_BLOCK_IO_PROTOCOL *mCoreBlockIoProtocol;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CallInstallMultipleProtocolInterfaces (
|
CallInstallMultipleProtocolInterfaces (
|
||||||
@ -119,9 +122,9 @@ CallBootService (
|
|||||||
VOID *Interface;
|
VOID *Interface;
|
||||||
EFI_GUID *CoreProtocol;
|
EFI_GUID *CoreProtocol;
|
||||||
UINT32 MemoryCoreSize;
|
UINT32 MemoryCoreSize;
|
||||||
EFI_HANDLE Argument4;
|
UINTN Argument4;
|
||||||
EFI_HANDLE Argument5;
|
UINTN Argument5;
|
||||||
UINT32 Argument6;
|
UINTN Argument6;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
VOID **UserArgList;
|
VOID **UserArgList;
|
||||||
VOID *CoreArgList[MAX_LIST];
|
VOID *CoreArgList[MAX_LIST];
|
||||||
@ -160,7 +163,7 @@ CallBootService (
|
|||||||
if (Interface == NULL) {
|
if (Interface == NULL) {
|
||||||
EnableSMAP ();
|
EnableSMAP ();
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*(VOID **)CoreRbp->Argument3 = Interface;
|
*(VOID **)CoreRbp->Argument3 = Interface;
|
||||||
@ -184,22 +187,28 @@ CallBootService (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Argument4 = (EFI_HANDLE)UserRsp->Arguments[4];
|
Argument4 = UserRsp->Arguments[4];
|
||||||
Argument5 = (EFI_HANDLE)UserRsp->Arguments[5];
|
Argument5 = UserRsp->Arguments[5];
|
||||||
Argument6 = (UINT32)UserRsp->Arguments[6];
|
Argument6 = UserRsp->Arguments[6];
|
||||||
EnableSMAP ();
|
EnableSMAP ();
|
||||||
|
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
(EFI_HANDLE)CoreRbp->Argument1,
|
(EFI_HANDLE)CoreRbp->Argument1,
|
||||||
CoreProtocol,
|
CoreProtocol,
|
||||||
&Interface,
|
&Interface,
|
||||||
Argument4,
|
(EFI_HANDLE)Argument4,
|
||||||
Argument5,
|
(EFI_HANDLE)Argument5,
|
||||||
Argument6
|
(UINT32)Argument6
|
||||||
);
|
);
|
||||||
|
|
||||||
DisableSMAP ();
|
DisableSMAP ();
|
||||||
if (Interface != NULL) {
|
if (Interface != NULL) {
|
||||||
|
if (CompareGuid (CoreProtocol, &gEfiDiskIoProtocolGuid)) {
|
||||||
|
mCoreDiskIoProtocol = (EFI_DISK_IO_PROTOCOL *)Interface;
|
||||||
|
} else if (CompareGuid (CoreProtocol, &gEfiBlockIoProtocolGuid)) {
|
||||||
|
mCoreBlockIoProtocol = (EFI_BLOCK_IO_PROTOCOL *)Interface;
|
||||||
|
}
|
||||||
|
|
||||||
Interface = AllocateRing3Copy (Interface, MemoryCoreSize, MemoryCoreSize);
|
Interface = AllocateRing3Copy (Interface, MemoryCoreSize, MemoryCoreSize);
|
||||||
if (Interface == NULL) {
|
if (Interface == NULL) {
|
||||||
EnableSMAP ();
|
EnableSMAP ();
|
||||||
@ -287,6 +296,152 @@ CallBootService (
|
|||||||
);
|
);
|
||||||
EnableSMAP ();
|
EnableSMAP ();
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
case SysCallBlockIoReset:
|
||||||
|
//
|
||||||
|
// Argument 1: EFI_BLOCK_IO_PROTOCOL *This
|
||||||
|
// Argument 2: BOOLEAN ExtendedVerification
|
||||||
|
//
|
||||||
|
return mCoreBlockIoProtocol->Reset (
|
||||||
|
mCoreBlockIoProtocol,
|
||||||
|
(BOOLEAN)CoreRbp->Argument2
|
||||||
|
);
|
||||||
|
|
||||||
|
case SysCallBlockIoRead:
|
||||||
|
//
|
||||||
|
// Argument 1: EFI_BLOCK_IO_PROTOCOL *This
|
||||||
|
// Argument 2: UINT32 MediaId
|
||||||
|
// Argument 3: EFI_LBA Lba
|
||||||
|
// Argument 4: UINTN BufferSize
|
||||||
|
// Argument 5: VOID *Buffer
|
||||||
|
//
|
||||||
|
DisableSMAP ();
|
||||||
|
Argument4 = UserRsp->Arguments[4];
|
||||||
|
EnableSMAP ();
|
||||||
|
|
||||||
|
Argument5 = (UINTN)AllocatePool (Argument4);
|
||||||
|
if ((VOID *)Argument5 == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = mCoreBlockIoProtocol->ReadBlocks (
|
||||||
|
mCoreBlockIoProtocol,
|
||||||
|
(UINT32)CoreRbp->Argument2,
|
||||||
|
(EFI_LBA)CoreRbp->Argument3,
|
||||||
|
Argument4,
|
||||||
|
(VOID *)Argument5
|
||||||
|
);
|
||||||
|
DisableSMAP ();
|
||||||
|
CopyMem ((VOID *)UserRsp->Arguments[5], (VOID *)Argument5, Argument4);
|
||||||
|
EnableSMAP ();
|
||||||
|
|
||||||
|
FreePool ((VOID *)Argument5);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
case SysCallBlockIoWrite:
|
||||||
|
//
|
||||||
|
// Argument 1: EFI_BLOCK_IO_PROTOCOL *This
|
||||||
|
// Argument 2: UINT32 MediaId
|
||||||
|
// Argument 3: EFI_LBA Lba
|
||||||
|
// Argument 4: UINTN BufferSize
|
||||||
|
// Argument 5: VOID *Buffer
|
||||||
|
//
|
||||||
|
DisableSMAP ();
|
||||||
|
Argument4 = UserRsp->Arguments[4];
|
||||||
|
EnableSMAP ();
|
||||||
|
|
||||||
|
Argument5 = (UINTN)AllocatePool (Argument4);
|
||||||
|
if ((VOID *)Argument5 == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = mCoreBlockIoProtocol->WriteBlocks (
|
||||||
|
mCoreBlockIoProtocol,
|
||||||
|
(UINT32)CoreRbp->Argument2,
|
||||||
|
(EFI_LBA)CoreRbp->Argument3,
|
||||||
|
Argument4,
|
||||||
|
(VOID *)Argument5
|
||||||
|
);
|
||||||
|
DisableSMAP ();
|
||||||
|
CopyMem ((VOID *)UserRsp->Arguments[5], (VOID *)Argument5, Argument4);
|
||||||
|
EnableSMAP ();
|
||||||
|
|
||||||
|
FreePool ((VOID *)Argument5);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
case SysCallBlockIoFlush:
|
||||||
|
//
|
||||||
|
// Argument 1: EFI_BLOCK_IO_PROTOCOL *This
|
||||||
|
//
|
||||||
|
return mCoreBlockIoProtocol->FlushBlocks (
|
||||||
|
mCoreBlockIoProtocol
|
||||||
|
);
|
||||||
|
|
||||||
|
case SysCallDiskIoRead:
|
||||||
|
//
|
||||||
|
// Argument 1: EFI_DISK_IO_PROTOCOL *This
|
||||||
|
// Argument 2: UINT32 MediaId
|
||||||
|
// Argument 3: UINT64 Offset
|
||||||
|
// Argument 4: UINTN BufferSize
|
||||||
|
// Argument 5: VOID *Buffer
|
||||||
|
//
|
||||||
|
DisableSMAP ();
|
||||||
|
Argument4 = UserRsp->Arguments[4];
|
||||||
|
EnableSMAP ();
|
||||||
|
|
||||||
|
Argument5 = (UINTN)AllocatePool (Argument4);
|
||||||
|
if ((VOID *)Argument5 == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = mCoreDiskIoProtocol->ReadDisk (
|
||||||
|
mCoreDiskIoProtocol,
|
||||||
|
(UINT32)CoreRbp->Argument2,
|
||||||
|
(UINT64)CoreRbp->Argument3,
|
||||||
|
Argument4,
|
||||||
|
(VOID *)Argument5
|
||||||
|
);
|
||||||
|
DisableSMAP ();
|
||||||
|
CopyMem ((VOID *)UserRsp->Arguments[5], (VOID *)Argument5, Argument4);
|
||||||
|
EnableSMAP ();
|
||||||
|
|
||||||
|
FreePool ((VOID *)Argument5);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
case SysCallDiskIoWrite:
|
||||||
|
//
|
||||||
|
// Argument 1: EFI_DISK_IO_PROTOCOL *This
|
||||||
|
// Argument 2: UINT32 MediaId
|
||||||
|
// Argument 3: UINT64 Offset
|
||||||
|
// Argument 4: UINTN BufferSize
|
||||||
|
// Argument 5: VOID *Buffer
|
||||||
|
//
|
||||||
|
DisableSMAP ();
|
||||||
|
Argument4 = UserRsp->Arguments[4];
|
||||||
|
EnableSMAP ();
|
||||||
|
|
||||||
|
Argument5 = (UINTN)AllocatePool (Argument4);
|
||||||
|
if ((VOID *)Argument5 == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = mCoreDiskIoProtocol->WriteDisk (
|
||||||
|
mCoreDiskIoProtocol,
|
||||||
|
(UINT32)CoreRbp->Argument2,
|
||||||
|
(UINT64)CoreRbp->Argument3,
|
||||||
|
Argument4,
|
||||||
|
(VOID *)Argument5
|
||||||
|
);
|
||||||
|
DisableSMAP ();
|
||||||
|
CopyMem ((VOID *)UserRsp->Arguments[5], (VOID *)Argument5, Argument4);
|
||||||
|
EnableSMAP ();
|
||||||
|
|
||||||
|
FreePool ((VOID *)Argument5);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
default:
|
default:
|
||||||
DEBUG ((DEBUG_ERROR, "Ring0: Unknown syscall type.\n"));
|
DEBUG ((DEBUG_ERROR, "Ring0: Unknown syscall type.\n"));
|
||||||
|
@ -2020,6 +2020,15 @@ typedef enum {
|
|||||||
SysCallInstallMultipleProtocolInterfaces,
|
SysCallInstallMultipleProtocolInterfaces,
|
||||||
SysCallAllocatePool,
|
SysCallAllocatePool,
|
||||||
SysCallFreePool,
|
SysCallFreePool,
|
||||||
|
//
|
||||||
|
// Protocols
|
||||||
|
//
|
||||||
|
SysCallBlockIoReset,
|
||||||
|
SysCallBlockIoRead,
|
||||||
|
SysCallBlockIoWrite,
|
||||||
|
SysCallBlockIoFlush,
|
||||||
|
SysCallDiskIoRead,
|
||||||
|
SysCallDiskIoWrite,
|
||||||
SysCallMax
|
SysCallMax
|
||||||
} SYS_CALL_TYPE;
|
} SYS_CALL_TYPE;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user