Ring3: Added BlockIo, DiskIo wrappers.

This commit is contained in:
Mikhail Krichanov 2024-02-20 14:17:10 +03:00
parent d19bee4d2d
commit c8c5e3ea28
5 changed files with 215 additions and 27 deletions

View File

@ -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 (

View File

@ -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
);
} }

View File

@ -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;

View File

@ -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"));

View File

@ -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;