Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions MsvmPkg/Include/BiosInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,7 @@ enum UefiStructureType
UefiConfigHmat = 0x26,
UefiConfigIort = 0x27,
UefiConfigPcieBarApertures = 0x28,
UefiConfigRamDisk = 0x29,
};

//
Expand Down Expand Up @@ -905,6 +906,19 @@ typedef struct _UEFI_CONFIG_PCIE_BAR_APERTURES {
PCIE_BAR_APERTURE_ENTRY Entries[];
} UEFI_CONFIG_PCIE_BAR_APERTURES;

typedef struct _UEFI_CONFIG_RAM_DISK
{
UEFI_CONFIG_HEADER Header;
//
// GPA of the RAM disk image (must be page-aligned).
//
UINT64 RamDiskGpa;
//
// Size in bytes of the RAM disk image (must be page-aligned).
//
UINT64 RamDiskSize;
} UEFI_CONFIG_RAM_DISK;

//
// UEFI configuration information for direct parsing of IGVM parameters.
//
Expand Down
31 changes: 31 additions & 0 deletions MsvmPkg/Include/RamDiskConfigHob.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/** @file
Shared definitions for RAM disk configuration HOBs passed from PEI to DXE.

Copyright (c) Microsoft Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#include <Uefi.h>
#include <Library/HobLib.h>

//
// GUID used to identify RAM disk configuration HOBs.
// Each HOB with this GUID contains a RAM_DISK_CONFIG_HOB_DATA structure
// describing a RAM disk region that should be registered via
// EFI_RAM_DISK_PROTOCOL during DXE.
//
#define MSVM_RAM_DISK_CONFIG_HOB_GUID \
{ 0xa41d6c49, 0xaf34, 0x4e34, { 0xa0, 0xb3, 0x12, 0x9a, 0x48, 0x66, 0x70, 0xcd } }

Comment on lines +20 to +22
extern EFI_GUID gMsvmRamDiskConfigHobGuid;

//
// HOB payload: describes a RAM disk region to register.
//
typedef struct {
EFI_PHYSICAL_ADDRESS RamDiskGpa;
UINT64 RamDiskSize;
} RAM_DISK_CONFIG_HOB_DATA;
5 changes: 5 additions & 0 deletions MsvmPkg/MsvmPkg.dec
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@
#
gAcpiReplacementTableHobGuid = {0xa24aef4c, 0xa824, 0x48e9, {0xb5, 0xb8, 0xbc, 0xd9, 0x6a, 0x59, 0x71, 0xaf}}

#
# HOB GUID for RAM disk configuration entries from the config blob
#
gMsvmRamDiskConfigHobGuid = {0xa41d6c49, 0xaf34, 0x4e34, {0xa0, 0xb3, 0x12, 0x9a, 0x48, 0x66, 0x70, 0xcd}}

#
# MsvmPkg specific events
#
Expand Down
1 change: 1 addition & 0 deletions MsvmPkg/MsvmPkgAARCH64.dsc
Original file line number Diff line number Diff line change
Expand Up @@ -830,6 +830,7 @@
MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf
MsvmPkg/RamDiskConfigDxe/RamDiskConfigDxe.inf
MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
MdeModulePkg/Universal/Metronome/Metronome.inf
Expand Down
1 change: 1 addition & 0 deletions MsvmPkg/MsvmPkgAARCH64.fdf
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf
INF MsvmPkg/RamDiskConfigDxe/RamDiskConfigDxe.inf
INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
INF MdeModulePkg/Universal/Metronome/Metronome.inf
Expand Down
1 change: 1 addition & 0 deletions MsvmPkg/MsvmPkgX64.dsc
Original file line number Diff line number Diff line change
Expand Up @@ -861,6 +861,7 @@
MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf
MsvmPkg/RamDiskConfigDxe/RamDiskConfigDxe.inf
MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf {
<LibraryClasses>
UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
Expand Down
1 change: 1 addition & 0 deletions MsvmPkg/MsvmPkgX64.fdf
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf
INF MsvmPkg/RamDiskConfigDxe/RamDiskConfigDxe.inf
INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
Expand Down
54 changes: 54 additions & 0 deletions MsvmPkg/PlatformPei/Config.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <Library/HobLib.h>
#include <Library/SafeIntLib.h>
#include <AcpiReplacementTable.h>
#include <RamDiskConfigHob.h>
#include "AllowNamelessAggregate.h"
#include "AssignStruct.h"

Expand Down Expand Up @@ -824,6 +825,13 @@ DebugDumpUefiConfigStruct(
break;
}

case UefiConfigRamDisk:
{
UEFI_CONFIG_RAM_DISK *ramDisk = (UEFI_CONFIG_RAM_DISK*) Header;
DEBUG((DEBUG_VERBOSE, "\tRamDisk GPA: 0x%lx Size: 0x%lx\n", ramDisk->RamDiskGpa, ramDisk->RamDiskSize));
break;
}

default:
DEBUG((DEBUG_VERBOSE, "\t!!! Unrecognized config structure type !!!\n"));
break;
Expand Down Expand Up @@ -1639,6 +1647,52 @@ Return Value:
PcdSet32S(PcdPcieBarAperturesSize, dataSize));
break;
}

case UefiConfigRamDisk:
{
UEFI_CONFIG_RAM_DISK *ramDisk = (UEFI_CONFIG_RAM_DISK*) header;

if (header->Length != sizeof(UEFI_CONFIG_RAM_DISK))
{
DEBUG((DEBUG_ERROR, "*** Malformed RamDisk structure length\n"));
FAIL_FAST_UNEXPECTED_HOST_BEHAVIOR();
}

if (ramDisk->RamDiskGpa == 0 || ramDisk->RamDiskSize == 0)
{
DEBUG((DEBUG_ERROR, "*** RamDisk: GPA or Size is zero\n"));
FAIL_FAST_UNEXPECTED_HOST_BEHAVIOR();
}
Comment on lines +1661 to +1665

if ((ramDisk->RamDiskGpa % EFI_PAGE_SIZE) != 0 ||
(ramDisk->RamDiskSize % EFI_PAGE_SIZE) != 0)
{
DEBUG((DEBUG_ERROR, "*** RamDisk: GPA or Size not page-aligned\n"));
FAIL_FAST_UNEXPECTED_HOST_BEHAVIOR();
}

//
// Mark the RAM disk memory as allocated boot services data so
// the DXE allocator won't hand it out.
//
HobAddAllocatedMemoryRange(ramDisk->RamDiskGpa, ramDisk->RamDiskSize);

//
// Create a GUIDed HOB for DXE to consume.
//
{
RAM_DISK_CONFIG_HOB_DATA hobData;
hobData.RamDiskGpa = ramDisk->RamDiskGpa;
hobData.RamDiskSize = ramDisk->RamDiskSize;
BuildGuidDataHob(&gMsvmRamDiskConfigHobGuid,
&hobData,
sizeof(hobData));
}

DEBUG((DEBUG_INFO, "RamDisk: registered HOB for GPA 0x%lx Size 0x%lx\n",
ramDisk->RamDiskGpa, ramDisk->RamDiskSize));
break;
}
}

calculatedConfigSize += header->Length;
Expand Down
1 change: 1 addition & 0 deletions MsvmPkg/PlatformPei/PlatformPei.inf
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
gEfiMemoryTypeInformationGuid
gMsvmDebuggerEnabledGuid
gMsvmDebuggerKdnetBinaryGuid
gMsvmRamDiskConfigHobGuid

[Guids.AARCH64]
gArmTokenSpaceGuid
Expand Down
94 changes: 94 additions & 0 deletions MsvmPkg/RamDiskConfigDxe/RamDiskConfigDxe.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/** @file
DXE driver that registers RAM disks declared in the config blob.

During PEI, the config blob parser creates GUIDed HOBs for each
UefiConfigRamDisk entry. This driver enumerates those HOBs and
registers each RAM disk via EFI_RAM_DISK_PROTOCOL so that the
volumes become available for BDS boot option processing.

Copyright (c) Microsoft Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <Uefi.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/HobLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/RamDisk.h>
#include <RamDiskConfigHob.h>

/**
Entry point for RamDiskConfigDxe.

Enumerates RAM disk config HOBs and registers each RAM disk.

@param[in] ImageHandle The firmware allocated handle for the EFI image.
@param[in] SystemTable A pointer to the EFI System Table.

@retval EFI_SUCCESS The driver completed successfully.

**/
EFI_STATUS
EFIAPI
RamDiskConfigDxeEntry (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_RAM_DISK_PROTOCOL *RamDiskProtocol;
VOID *Hob;
UINTN Count;

//
// Find the first RAM disk config HOB. If none exist, nothing to do.
//
Hob = GetFirstGuidHob (&gMsvmRamDiskConfigHobGuid);
if (Hob == NULL) {
DEBUG ((DEBUG_VERBOSE, "RamDiskConfigDxe: No RAM disk HOBs found\n"));
return EFI_SUCCESS;
}

//
// Locate the RAM disk protocol.
//
Status = gBS->LocateProtocol (&gEfiRamDiskProtocolGuid, NULL, (VOID **)&RamDiskProtocol);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "RamDiskConfigDxe: Failed to locate EFI_RAM_DISK_PROTOCOL: %r\n", Status));
return Status;
}

//
// Iterate over all RAM disk config HOBs and register each one.
//
Count = 0;
while (Hob != NULL) {
EFI_HOB_GUID_TYPE *GuidHob = (EFI_HOB_GUID_TYPE *)Hob;
RAM_DISK_CONFIG_HOB_DATA *Data = (RAM_DISK_CONFIG_HOB_DATA *)GET_GUID_HOB_DATA (GuidHob);
EFI_DEVICE_PATH_PROTOCOL *DevicePath = NULL;
Comment on lines +68 to +70

Comment on lines +68 to +71
DEBUG ((DEBUG_INFO, "RamDiskConfigDxe: Registering RAM disk #%u at GPA 0x%lx, Size 0x%lx\n",
Count, Data->RamDiskGpa, Data->RamDiskSize));
Comment on lines +72 to +73

Status = RamDiskProtocol->Register (
Data->RamDiskGpa,
Data->RamDiskSize,
&gEfiVirtualDiskGuid,
NULL,
&DevicePath
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "RamDiskConfigDxe: Failed to register RAM disk #%u: %r\n", Count, Status));
} else {
DEBUG ((DEBUG_INFO, "RamDiskConfigDxe: RAM disk #%u registered successfully\n", Count));
}

Count++;
Hob = GetNextGuidHob (&gMsvmRamDiskConfigHobGuid, GET_NEXT_HOB (Hob));
}

DEBUG ((DEBUG_INFO, "RamDiskConfigDxe: Processed %u RAM disk(s)\n", Count));
return EFI_SUCCESS;
}
40 changes: 40 additions & 0 deletions MsvmPkg/RamDiskConfigDxe/RamDiskConfigDxe.inf
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
## @file
# DXE driver that registers RAM disks declared in the config blob.
#
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
##

[Defines]
INF_VERSION = 0x00010005
BASE_NAME = RamDiskConfigDxe
FILE_GUID = 4bcbeb49-b83c-41e0-9987-e09cd00d2467
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = RamDiskConfigDxeEntry

[Sources]
RamDiskConfigDxe.c

[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
MsvmPkg/MsvmPkg.dec

[LibraryClasses]
BaseLib
DebugLib
HobLib
UefiBootServicesTableLib
UefiDriverEntryPoint

[Guids]
gMsvmRamDiskConfigHobGuid
gEfiVirtualDiskGuid

[Protocols]
gEfiRamDiskProtocolGuid

[Depex]
gEfiRamDiskProtocolGuid
Loading