mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-22 21:24:35 +02:00
Ring3: Added Ring3BlockIo and Ring3DiskIo drafts.
This commit is contained in:
parent
3868edbf44
commit
f82b04a2dc
@ -25,6 +25,7 @@
|
|||||||
Ring3.h
|
Ring3.h
|
||||||
DxeRing3.c
|
DxeRing3.c
|
||||||
Ring3UefiBootServices.c
|
Ring3UefiBootServices.c
|
||||||
|
Ring3Protocols.c
|
||||||
|
|
||||||
[Sources.X64]
|
[Sources.X64]
|
||||||
X64/SysCall.nasm
|
X64/SysCall.nasm
|
||||||
|
@ -5,6 +5,14 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
#include <Protocol/BlockIo.h>
|
||||||
|
#include <Protocol/DevicePathUtilities.h>
|
||||||
|
#include <Protocol/DiskIo.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 (
|
||||||
@ -1011,3 +1019,151 @@ Ring3CreateEventEx (
|
|||||||
IN CONST EFI_GUID *EventGroup OPTIONAL,
|
IN CONST EFI_GUID *EventGroup OPTIONAL,
|
||||||
OUT EFI_EVENT *Event
|
OUT EFI_EVENT *Event
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Reset the Block Device.
|
||||||
|
|
||||||
|
@param This Indicates a pointer to the calling context.
|
||||||
|
@param ExtendedVerification Driver may perform diagnostics on reset.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The device was reset.
|
||||||
|
@retval EFI_DEVICE_ERROR The device is not functioning properly and could
|
||||||
|
not be reset.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3BlockIoReset (
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
|
IN BOOLEAN ExtendedVerification
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Read BufferSize bytes from Lba into Buffer.
|
||||||
|
|
||||||
|
@param This Indicates a pointer to the calling context.
|
||||||
|
@param MediaId Id of the media, changes every time the media is replaced.
|
||||||
|
@param Lba The starting Logical Block Address to read from
|
||||||
|
@param BufferSize Size of Buffer, must be a multiple of device block size.
|
||||||
|
@param Buffer A pointer to the destination buffer for the data. The caller is
|
||||||
|
responsible for either having implicit or explicit ownership of the buffer.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The data was read correctly from the device.
|
||||||
|
@retval EFI_DEVICE_ERROR The device reported an error while performing the read.
|
||||||
|
@retval EFI_NO_MEDIA There is no media in the device.
|
||||||
|
@retval EFI_MEDIA_CHANGED The MediaId does not matched the current device.
|
||||||
|
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
|
||||||
|
@retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid,
|
||||||
|
or the buffer is not on proper alignment.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3BlockIoRead (
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 MediaId,
|
||||||
|
IN EFI_LBA Lba,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
OUT VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Write BufferSize bytes from Lba into Buffer.
|
||||||
|
|
||||||
|
@param This Indicates a pointer to the calling context.
|
||||||
|
@param MediaId The media ID that the write request is for.
|
||||||
|
@param Lba The starting logical block address to be written. The caller is
|
||||||
|
responsible for writing to only legitimate locations.
|
||||||
|
@param BufferSize Size of Buffer, must be a multiple of device block size.
|
||||||
|
@param Buffer A pointer to the source buffer for the data.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The data was written correctly to the device.
|
||||||
|
@retval EFI_WRITE_PROTECTED The device can not be written to.
|
||||||
|
@retval EFI_DEVICE_ERROR The device reported an error while performing the write.
|
||||||
|
@retval EFI_NO_MEDIA There is no media in the device.
|
||||||
|
@retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device.
|
||||||
|
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
|
||||||
|
@retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid,
|
||||||
|
or the buffer is not on proper alignment.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3BlockIoWrite (
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 MediaId,
|
||||||
|
IN EFI_LBA Lba,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
IN VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Flush the Block Device.
|
||||||
|
|
||||||
|
@param This Indicates a pointer to the calling context.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS All outstanding data was written to the device
|
||||||
|
@retval EFI_DEVICE_ERROR The device reported an error while writting back the data
|
||||||
|
@retval EFI_NO_MEDIA There is no media in the device.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3BlockIoFlush (
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Read BufferSize bytes from Offset into Buffer.
|
||||||
|
|
||||||
|
@param This Protocol instance pointer.
|
||||||
|
@param MediaId Id of the media, changes every time the media is replaced.
|
||||||
|
@param Offset The starting byte offset to read from
|
||||||
|
@param BufferSize Size of Buffer
|
||||||
|
@param Buffer Buffer containing read data
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The data was read correctly from the device.
|
||||||
|
@retval EFI_DEVICE_ERROR The device reported an error while performing the read.
|
||||||
|
@retval EFI_NO_MEDIA There is no media in the device.
|
||||||
|
@retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device.
|
||||||
|
@retval EFI_INVALID_PARAMETER The read request contains device addresses that are not
|
||||||
|
valid for the device.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3DiskIoRead (
|
||||||
|
IN EFI_DISK_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 MediaId,
|
||||||
|
IN UINT64 Offset,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
OUT VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Writes a specified number of bytes to a device.
|
||||||
|
|
||||||
|
@param This Indicates a pointer to the calling context.
|
||||||
|
@param MediaId ID of the medium to be written.
|
||||||
|
@param Offset The starting byte offset on the logical block I/O device to write.
|
||||||
|
@param BufferSize The size in bytes of Buffer. The number of bytes to write to the device.
|
||||||
|
@param Buffer A pointer to the buffer containing the data to be written.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The data was written correctly to the device.
|
||||||
|
@retval EFI_WRITE_PROTECTED The device can not be written to.
|
||||||
|
@retval EFI_DEVICE_ERROR The device reported an error while performing the write.
|
||||||
|
@retval EFI_NO_MEDIA There is no media in the device.
|
||||||
|
@retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device.
|
||||||
|
@retval EFI_INVALID_PARAMETER The write request contains device addresses that are not
|
||||||
|
valid for the device.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3DiskIoWrite (
|
||||||
|
IN EFI_DISK_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 MediaId,
|
||||||
|
IN UINT64 Offset,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
IN VOID *Buffer
|
||||||
|
);
|
||||||
|
82
MdeModulePkg/Core/Dxe/DxeRing3/Ring3Protocols.c
Normal file
82
MdeModulePkg/Core/Dxe/DxeRing3/Ring3Protocols.c
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/** @file
|
||||||
|
|
||||||
|
Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
|
||||||
|
SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include "Ring3.h"
|
||||||
|
|
||||||
|
EFI_BLOCK_IO_PROTOCOL mCoreBlockIo;
|
||||||
|
EFI_DISK_IO_PROTOCOL mCoreDiskIo;
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3BlockIoReset (
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
|
IN BOOLEAN ExtendedVerification
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3BlockIoRead (
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 MediaId,
|
||||||
|
IN EFI_LBA Lba,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
OUT VOID *Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3BlockIoWrite (
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 MediaId,
|
||||||
|
IN EFI_LBA Lba,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
IN VOID *Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3BlockIoFlush (
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3DiskIoRead (
|
||||||
|
IN EFI_DISK_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 MediaId,
|
||||||
|
IN UINT64 Offset,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
OUT VOID *Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Ring3DiskIoWrite (
|
||||||
|
IN EFI_DISK_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 MediaId,
|
||||||
|
IN UINT64 Offset,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
IN VOID *Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
@ -11,9 +11,6 @@
|
|||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
|
|
||||||
#include <Protocol/DevicePathUtilities.h>
|
|
||||||
#include <Protocol/LoadedImage.h>
|
|
||||||
|
|
||||||
#include "Ring3.h"
|
#include "Ring3.h"
|
||||||
|
|
||||||
EFI_TPL
|
EFI_TPL
|
||||||
@ -386,7 +383,9 @@ Ring3OpenProtocol (
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
EFI_LOADED_IMAGE_PROTOCOL *UserProtocol;
|
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
||||||
|
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||||
|
EFI_DISK_IO_PROTOCOL *DiskIo;
|
||||||
|
|
||||||
Status = SysCall (
|
Status = SysCall (
|
||||||
SysCallOpenProtocol,
|
SysCallOpenProtocol,
|
||||||
@ -403,16 +402,42 @@ Ring3OpenProtocol (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (CompareGuid (Protocol, &gEfiLoadedImageProtocolGuid)) {
|
if (CompareGuid (Protocol, &gEfiLoadedImageProtocolGuid)) {
|
||||||
UserProtocol = (EFI_LOADED_IMAGE_PROTOCOL *)*Interface;
|
|
||||||
|
LoadedImage = (EFI_LOADED_IMAGE_PROTOCOL *)*Interface;
|
||||||
|
|
||||||
// TODO: Copy User changes to Core? Resembles InstallMultipleProtocolInterfaces().
|
// TODO: Copy User changes to Core? Resembles InstallMultipleProtocolInterfaces().
|
||||||
|
|
||||||
UserProtocol->Unload = NULL;
|
LoadedImage->Unload = NULL;
|
||||||
|
|
||||||
return Status;
|
} else if (CompareGuid (Protocol, &gEfiBlockIoProtocolGuid)) {
|
||||||
|
|
||||||
|
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->ReadBlocks = Ring3BlockIoRead;
|
||||||
|
BlockIo->WriteBlocks = Ring3BlockIoWrite;
|
||||||
|
BlockIo->FlushBlocks = Ring3BlockIoFlush;
|
||||||
|
|
||||||
|
} else if (CompareGuid (Protocol, &gEfiDiskIoProtocolGuid)) {
|
||||||
|
|
||||||
|
DiskIo = (EFI_DISK_IO_PROTOCOL *)*Interface;
|
||||||
|
|
||||||
|
mCoreDiskIo.ReadDisk = DiskIo->ReadDisk;
|
||||||
|
mCoreDiskIo.WriteDisk = DiskIo->WriteDisk;
|
||||||
|
|
||||||
|
DiskIo->ReadDisk = Ring3DiskIoRead;
|
||||||
|
DiskIo->WriteDisk = Ring3DiskIoWrite;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Status = EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -473,7 +498,7 @@ Ring3LocateProtocol (
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
EFI_DEVICE_PATH_UTILITIES_PROTOCOL *UserProtocol;
|
EFI_DEVICE_PATH_UTILITIES_PROTOCOL *DevicePath;
|
||||||
|
|
||||||
Status = SysCall (
|
Status = SysCall (
|
||||||
SysCallLocateProtocol,
|
SysCallLocateProtocol,
|
||||||
@ -487,16 +512,16 @@ Ring3LocateProtocol (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (CompareGuid (Protocol, &gEfiDevicePathUtilitiesProtocolGuid)) {
|
if (CompareGuid (Protocol, &gEfiDevicePathUtilitiesProtocolGuid)) {
|
||||||
UserProtocol = (EFI_DEVICE_PATH_UTILITIES_PROTOCOL *)*Interface;
|
DevicePath = (EFI_DEVICE_PATH_UTILITIES_PROTOCOL *)*Interface;
|
||||||
|
|
||||||
UserProtocol->GetDevicePathSize = NULL;
|
DevicePath->GetDevicePathSize = NULL;
|
||||||
UserProtocol->DuplicateDevicePath = NULL;
|
DevicePath->DuplicateDevicePath = NULL;
|
||||||
UserProtocol->AppendDevicePath = NULL;
|
DevicePath->AppendDevicePath = NULL;
|
||||||
UserProtocol->AppendDeviceNode = NULL;
|
DevicePath->AppendDeviceNode = NULL;
|
||||||
UserProtocol->AppendDevicePathInstance = NULL;
|
DevicePath->AppendDevicePathInstance = NULL;
|
||||||
UserProtocol->GetNextDevicePathInstance = NULL;
|
DevicePath->GetNextDevicePathInstance = NULL;
|
||||||
UserProtocol->IsDevicePathMultiInstance = NULL;
|
DevicePath->IsDevicePathMultiInstance = NULL;
|
||||||
UserProtocol->CreateDeviceNode = NULL;
|
DevicePath->CreateDeviceNode = NULL;
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -29,23 +29,35 @@ FindGuid (
|
|||||||
ASSERT (CoreSize != NULL);
|
ASSERT (CoreSize != NULL);
|
||||||
|
|
||||||
if (CompareGuid (Ring3, &gEfiDevicePathUtilitiesProtocolGuid)) {
|
if (CompareGuid (Ring3, &gEfiDevicePathUtilitiesProtocolGuid)) {
|
||||||
|
|
||||||
*Core = &gEfiDevicePathUtilitiesProtocolGuid;
|
*Core = &gEfiDevicePathUtilitiesProtocolGuid;
|
||||||
*CoreSize = sizeof (EFI_DEVICE_PATH_UTILITIES_PROTOCOL);
|
*CoreSize = sizeof (EFI_DEVICE_PATH_UTILITIES_PROTOCOL);
|
||||||
|
|
||||||
} else if (CompareGuid (Ring3, &gEfiLoadedImageProtocolGuid)) {
|
} else if (CompareGuid (Ring3, &gEfiLoadedImageProtocolGuid)) {
|
||||||
|
|
||||||
*Core = &gEfiLoadedImageProtocolGuid;
|
*Core = &gEfiLoadedImageProtocolGuid;
|
||||||
*CoreSize = sizeof (EFI_LOADED_IMAGE_PROTOCOL);
|
*CoreSize = sizeof (EFI_LOADED_IMAGE_PROTOCOL);
|
||||||
|
|
||||||
} else if (CompareGuid (Ring3, &gEfiBlockIoProtocolGuid)) {
|
} else if (CompareGuid (Ring3, &gEfiBlockIoProtocolGuid)) {
|
||||||
|
|
||||||
*Core = &gEfiBlockIoProtocolGuid;
|
*Core = &gEfiBlockIoProtocolGuid;
|
||||||
*CoreSize = sizeof (EFI_BLOCK_IO_PROTOCOL);
|
*CoreSize = sizeof (EFI_BLOCK_IO_PROTOCOL);
|
||||||
|
|
||||||
} else if (CompareGuid (Ring3, &gEfiDiskIoProtocolGuid)) {
|
} else if (CompareGuid (Ring3, &gEfiDiskIoProtocolGuid)) {
|
||||||
|
|
||||||
*Core = &gEfiDiskIoProtocolGuid;
|
*Core = &gEfiDiskIoProtocolGuid;
|
||||||
*CoreSize = sizeof (EFI_DISK_IO_PROTOCOL);
|
*CoreSize = sizeof (EFI_DISK_IO_PROTOCOL);
|
||||||
|
|
||||||
} else if (CompareGuid (Ring3, &gEfiDriverBindingProtocolGuid)) {
|
} else if (CompareGuid (Ring3, &gEfiDriverBindingProtocolGuid)) {
|
||||||
|
|
||||||
*Core = &gEfiDriverBindingProtocolGuid;
|
*Core = &gEfiDriverBindingProtocolGuid;
|
||||||
*CoreSize = sizeof (EFI_DRIVER_BINDING_PROTOCOL);
|
*CoreSize = sizeof (EFI_DRIVER_BINDING_PROTOCOL);
|
||||||
|
|
||||||
} else if (CompareGuid (Ring3, &gEfiComponentNameProtocolGuid)) {
|
} else if (CompareGuid (Ring3, &gEfiComponentNameProtocolGuid)) {
|
||||||
|
|
||||||
*Core = &gEfiComponentNameProtocolGuid;
|
*Core = &gEfiComponentNameProtocolGuid;
|
||||||
*CoreSize = sizeof (EFI_COMPONENT_NAME_PROTOCOL);
|
*CoreSize = sizeof (EFI_COMPONENT_NAME_PROTOCOL);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_ERROR, "Ring0: Unknown protocol.\n"));
|
DEBUG ((DEBUG_ERROR, "Ring0: Unknown protocol.\n"));
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
@ -54,6 +66,26 @@ FindGuid (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
FixInterface (
|
||||||
|
IN EFI_GUID *Guid,
|
||||||
|
IN OUT VOID *Interface
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||||
|
|
||||||
|
if (CompareGuid (Guid, &gEfiBlockIoProtocolGuid)) {
|
||||||
|
BlockIo = (EFI_BLOCK_IO_PROTOCOL *)Interface;
|
||||||
|
|
||||||
|
BlockIo->Media = AllocateRing3Copy (
|
||||||
|
BlockIo->Media,
|
||||||
|
sizeof (EFI_BLOCK_IO_MEDIA),
|
||||||
|
sizeof (EFI_BLOCK_IO_MEDIA)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Argument1;
|
UINTN Argument1;
|
||||||
UINTN Argument2;
|
UINTN Argument2;
|
||||||
@ -171,6 +203,8 @@ CallBootService (
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FixInterface (CoreProtocol, Interface);
|
||||||
|
|
||||||
*(VOID **)CoreRbp->Argument3 = Interface;
|
*(VOID **)CoreRbp->Argument3 = Interface;
|
||||||
EnableSMAP ();
|
EnableSMAP ();
|
||||||
|
|
||||||
@ -189,6 +223,7 @@ CallBootService (
|
|||||||
Status = FindGuid ((EFI_GUID *)UserArgList[Index], (EFI_GUID **)&CoreArgList[Index], &MemoryCoreSize);
|
Status = FindGuid ((EFI_GUID *)UserArgList[Index], (EFI_GUID **)&CoreArgList[Index], &MemoryCoreSize);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
EnableSMAP ();
|
EnableSMAP ();
|
||||||
|
//TODO: Free CoreArgList.
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user