642 lines
19 KiB
Diff
642 lines
19 KiB
Diff
From b0967ea5b377ba6de08749213db9073dcba3b498 Mon Sep 17 00:00:00 2001
|
|
From: Liu Zixing <liuzixing@hygon.cn>
|
|
Date: Fri, 25 Feb 2022 16:34:25 +0800
|
|
Subject: [PATCH 08/11] OvmfPkg: Add CsvDxe driver
|
|
|
|
CsvDxe creates and installs the CsvSharedMemory protocol.
|
|
|
|
CSV VM needs the shared memory to exchange data with external devices.
|
|
|
|
To improve the performance, CsvSharedMemory protocol pre-allocates
|
|
huge shared memory chunk as a pool.
|
|
|
|
When reqeusted, it allocates small pieces of shared memory from the
|
|
pool and records the allocated memory in a list.
|
|
|
|
When finished, the shared memory pieces are returned to the pool and
|
|
removed from the record list.
|
|
|
|
Signed-off-by: Xin Jiang <jiangxin@hygon.cn>
|
|
---
|
|
OvmfPkg/AmdSev/AmdSevX64.dsc | 1 +
|
|
OvmfPkg/AmdSev/AmdSevX64.fdf | 1 +
|
|
OvmfPkg/CsvDxe/CsvDxe.c | 104 +++++++++++
|
|
OvmfPkg/CsvDxe/CsvDxe.inf | 45 +++++
|
|
OvmfPkg/CsvDxe/CsvSharedMemory.c | 208 +++++++++++++++++++++
|
|
OvmfPkg/CsvDxe/CsvSharedMemory.h | 29 +++
|
|
OvmfPkg/Include/Protocol/CsvSharedMemory.h | 99 ++++++++++
|
|
OvmfPkg/OvmfPkg.dec | 1 +
|
|
OvmfPkg/OvmfPkgIa32X64.dsc | 1 +
|
|
OvmfPkg/OvmfPkgIa32X64.fdf | 1 +
|
|
OvmfPkg/OvmfPkgX64.dsc | 1 +
|
|
OvmfPkg/OvmfPkgX64.fdf | 1 +
|
|
12 files changed, 492 insertions(+)
|
|
create mode 100644 OvmfPkg/CsvDxe/CsvDxe.c
|
|
create mode 100644 OvmfPkg/CsvDxe/CsvDxe.inf
|
|
create mode 100644 OvmfPkg/CsvDxe/CsvSharedMemory.c
|
|
create mode 100644 OvmfPkg/CsvDxe/CsvSharedMemory.h
|
|
create mode 100644 OvmfPkg/Include/Protocol/CsvSharedMemory.h
|
|
|
|
diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc
|
|
index c70edd3..31bff34 100644
|
|
--- a/OvmfPkg/AmdSev/AmdSevX64.dsc
|
|
+++ b/OvmfPkg/AmdSev/AmdSevX64.dsc
|
|
@@ -757,6 +757,7 @@
|
|
PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
|
|
}
|
|
OvmfPkg/IoMmuDxe/IoMmuDxe.inf
|
|
+ OvmfPkg/CsvDxe/CsvDxe.inf
|
|
|
|
#
|
|
# Variable driver stack (non-SMM)
|
|
diff --git a/OvmfPkg/AmdSev/AmdSevX64.fdf b/OvmfPkg/AmdSev/AmdSevX64.fdf
|
|
index 7afa73a..5d5612a 100644
|
|
--- a/OvmfPkg/AmdSev/AmdSevX64.fdf
|
|
+++ b/OvmfPkg/AmdSev/AmdSevX64.fdf
|
|
@@ -306,6 +306,7 @@ INF OvmfPkg/VirtioGpuDxe/VirtioGpu.inf
|
|
INF OvmfPkg/PlatformDxe/Platform.inf
|
|
INF OvmfPkg/AmdSevDxe/AmdSevDxe.inf
|
|
INF OvmfPkg/IoMmuDxe/IoMmuDxe.inf
|
|
+INF OvmfPkg/CsvDxe/CsvDxe.inf
|
|
|
|
|
|
#
|
|
diff --git a/OvmfPkg/CsvDxe/CsvDxe.c b/OvmfPkg/CsvDxe/CsvDxe.c
|
|
new file mode 100644
|
|
index 0000000..d7edf3b
|
|
--- /dev/null
|
|
+++ b/OvmfPkg/CsvDxe/CsvDxe.c
|
|
@@ -0,0 +1,104 @@
|
|
+/** @file
|
|
+
|
|
+ Hygon CSV DXE.
|
|
+
|
|
+ Copyright (c) 2022, HYGON. All rights reserved.<BR>
|
|
+
|
|
+ This program and the accompanying materials are licensed and made available
|
|
+ under the terms and conditions of the BSD License which accompanies this
|
|
+ distribution. The full text of the license may be found at
|
|
+ http://opensource.org/licenses/bsd-license.php
|
|
+
|
|
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
|
|
+ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
+
|
|
+**/
|
|
+
|
|
+#include <Library/BaseLib.h>
|
|
+#include <Library/BaseMemoryLib.h>
|
|
+#include <Library/DebugLib.h>
|
|
+#include <Library/DxeServicesTableLib.h>
|
|
+#include <Library/MemoryAllocationLib.h>
|
|
+#include <Library/PcdLib.h>
|
|
+#include <Library/CsvLib.h>
|
|
+#include <Library/UefiBootServicesTableLib.h>
|
|
+#include <Protocol/CsvSharedMemory.h>
|
|
+#include <Library/MemEncryptSevLib.h>
|
|
+#include "CsvSharedMemory.h"
|
|
+
|
|
+
|
|
+#define HUGE_PAGE_SIZE 0x200000ULL
|
|
+
|
|
+EFI_STATUS
|
|
+EFIAPI
|
|
+CsvDxeEntryPoint (
|
|
+ IN EFI_HANDLE ImageHandle,
|
|
+ IN EFI_SYSTEM_TABLE *SystemTable
|
|
+ )
|
|
+{
|
|
+ EFI_STATUS Status;
|
|
+ RETURN_STATUS DecryptStatus;
|
|
+ CSV_SHARED_MEMORY_PROTOCOL *SharedMemory;
|
|
+ EFI_PHYSICAL_ADDRESS Memory;
|
|
+ EFI_PHYSICAL_ADDRESS EndMemory;
|
|
+ EFI_ALLOCATE_TYPE AllocateType;
|
|
+ UINT64 Size;
|
|
+
|
|
+ Status = CsvInstallSharedMemoryProtocol ();
|
|
+
|
|
+ if (EFI_ERROR (Status)) {
|
|
+ DEBUG ((EFI_D_ERROR, "fail to install CsvSharedMemory protocol\n"));
|
|
+ return Status;
|
|
+ }
|
|
+
|
|
+ //
|
|
+ // Do nothing more when CSV is not enabled
|
|
+ //
|
|
+ if (!CsvIsEnabled ()) {
|
|
+ return EFI_SUCCESS;
|
|
+ }
|
|
+
|
|
+ Status = gBS->LocateProtocol (
|
|
+ &gCsvSharedMemoryProtocolGuid,
|
|
+ NULL,
|
|
+ (VOID**)&SharedMemory
|
|
+ );
|
|
+
|
|
+ if (Status == EFI_SUCCESS) {
|
|
+
|
|
+ AllocateType = AllocateMaxAddress;
|
|
+ Memory = BASE_4GB - 1;
|
|
+
|
|
+ Status = gBS->AllocatePages (
|
|
+ AllocateType,
|
|
+ EfiBootServicesData,
|
|
+ CSV_SHARED_MEMORY_PAGE_NUMBER,
|
|
+ &Memory
|
|
+ );
|
|
+
|
|
+ if (EFI_ERROR (Status)) {
|
|
+ DEBUG ((DEBUG_ERROR, "fail to allocate CsvSharedMemory\n", SharedMemory));
|
|
+ } else {
|
|
+ //Align to huge page
|
|
+ EndMemory = (Memory + CSV_SHARED_MEMORY_SIZE) & (~(HUGE_PAGE_SIZE - 1));
|
|
+ Memory = ALIGN_VALUE(Memory, HUGE_PAGE_SIZE);
|
|
+ Size = (EndMemory > Memory) ? EndMemory - Memory : 0;
|
|
+ DecryptStatus = MemEncryptSevClearPageEncMask (
|
|
+ 0,
|
|
+ Memory,
|
|
+ Size >> EFI_PAGE_SHIFT
|
|
+ );
|
|
+ ASSERT_RETURN_ERROR (DecryptStatus);
|
|
+
|
|
+ SharedMemory->CsvInitializeSharedMemoryList (
|
|
+ SharedMemory,
|
|
+ (UINT64)Memory,
|
|
+ Size
|
|
+ );
|
|
+ }
|
|
+ } else {
|
|
+ DEBUG ((DEBUG_ERROR, "fail to LocateProtocol gCsvSharedMemoryProtocolGuid\n"));
|
|
+ }
|
|
+
|
|
+ return EFI_SUCCESS;
|
|
+}
|
|
diff --git a/OvmfPkg/CsvDxe/CsvDxe.inf b/OvmfPkg/CsvDxe/CsvDxe.inf
|
|
new file mode 100644
|
|
index 0000000..0dc8860
|
|
--- /dev/null
|
|
+++ b/OvmfPkg/CsvDxe/CsvDxe.inf
|
|
@@ -0,0 +1,45 @@
|
|
+#/** @file
|
|
+#
|
|
+# Secure Isolated Virtualization
|
|
+#
|
|
+# Copyright (c) 2022, HYGON Inc. All rights reserved.<BR>
|
|
+#
|
|
+# This program and the accompanying materials are licensed and made available
|
|
+# under the terms and conditions of the BSD License which accompanies this
|
|
+# distribution. The full text of the license may be found at
|
|
+# http://opensource.org/licenses/bsd-license.php
|
|
+#
|
|
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
|
|
+# IMPLIED.
|
|
+#
|
|
+#**/
|
|
+
|
|
+[Defines]
|
|
+ INF_VERSION = 1.25
|
|
+ BASE_NAME = CsvDxe
|
|
+ FILE_GUID = 829310c0-b9c4-11e9-9e16-9b10d744f884
|
|
+ MODULE_TYPE = DXE_DRIVER
|
|
+ VERSION_STRING = 1.0
|
|
+ ENTRY_POINT = CsvDxeEntryPoint
|
|
+
|
|
+[Sources]
|
|
+ CsvDxe.c
|
|
+ CsvSharedMemory.c
|
|
+
|
|
+[Packages]
|
|
+ MdePkg/MdePkg.dec
|
|
+ OvmfPkg/OvmfPkg.dec
|
|
+
|
|
+[LibraryClasses]
|
|
+ BaseLib
|
|
+ BaseMemoryLib
|
|
+ DebugLib
|
|
+ CsvLib
|
|
+ UefiDriverEntryPoint
|
|
+
|
|
+[Depex]
|
|
+ TRUE
|
|
+
|
|
+[Protocols]
|
|
+ gCsvSharedMemoryProtocolGuid
|
|
diff --git a/OvmfPkg/CsvDxe/CsvSharedMemory.c b/OvmfPkg/CsvDxe/CsvSharedMemory.c
|
|
new file mode 100644
|
|
index 0000000..fbebc61
|
|
--- /dev/null
|
|
+++ b/OvmfPkg/CsvDxe/CsvSharedMemory.c
|
|
@@ -0,0 +1,208 @@
|
|
+/** @file
|
|
+
|
|
+ The protocol provides allocate, free the CSV shared memory.
|
|
+
|
|
+ Copyright (c) 2022, HYGON. All rights reserved.<BR>
|
|
+
|
|
+ This program and the accompanying materials are licensed and made available
|
|
+ under the terms and conditions of the BSD License which accompanies this
|
|
+ distribution. The full text of the license may be found at
|
|
+ http://opensource.org/licenses/bsd-license.php
|
|
+
|
|
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
+
|
|
+**/
|
|
+
|
|
+#include <Library/BaseLib.h>
|
|
+#include <Uefi/UefiBaseType.h>
|
|
+#include <Library/CsvLib.h>
|
|
+#include <Library/MemoryAllocationLib.h>
|
|
+#include <Library/DebugLib.h>
|
|
+#include <Library/UefiBootServicesTableLib.h>
|
|
+#include <Protocol/CsvSharedMemory.h>
|
|
+
|
|
+
|
|
+STATIC LIST_ENTRY CsvSharedMemoryList = INITIALIZE_LIST_HEAD_VARIABLE (CsvSharedMemoryList);
|
|
+
|
|
+//
|
|
+// Insert the initial shared memory address and length to list.
|
|
+//
|
|
+
|
|
+EFI_STATUS
|
|
+EFIAPI
|
|
+CsvInitializeSharedMemoryList (
|
|
+ IN CSV_SHARED_MEMORY_PROTOCOL *Protocol,
|
|
+ IN UINT64 Address,
|
|
+ IN UINT64 Length
|
|
+ )
|
|
+{
|
|
+ CsvSharedMemoryEntry *Entry;
|
|
+
|
|
+ if (Length == 0) {
|
|
+ return EFI_INVALID_PARAMETER;
|
|
+ }
|
|
+
|
|
+ Entry = AllocatePool (sizeof (*Entry));
|
|
+ if (Entry == NULL) {
|
|
+ DEBUG((DEBUG_ERROR, "CsvInitializeSharedMemoryList AllocatePool error\n"));
|
|
+ return EFI_OUT_OF_RESOURCES;
|
|
+ }
|
|
+
|
|
+ Entry->Start = Address;
|
|
+ Entry->Length = Length;
|
|
+ Entry->Signature = CSV_SHARED_MEMORY_SIGNATURE;
|
|
+
|
|
+ InsertTailList (&CsvSharedMemoryList, &Entry->Link);
|
|
+
|
|
+ return EFI_SUCCESS;
|
|
+}
|
|
+
|
|
+EFI_STATUS
|
|
+EFIAPI
|
|
+CsvAllocateSharedMemory (
|
|
+ IN CSV_SHARED_MEMORY_PROTOCOL *Protocol,
|
|
+ IN UINTN NumberOfPages,
|
|
+ OUT UINT64 *Memory
|
|
+ )
|
|
+{
|
|
+ LIST_ENTRY *Link;
|
|
+ CsvSharedMemoryEntry *Entry;
|
|
+ UINT64 MemoryLength;
|
|
+
|
|
+ MemoryLength = (UINT64)NumberOfPages << EFI_PAGE_SHIFT;
|
|
+
|
|
+ for (Link = CsvSharedMemoryList.ForwardLink; Link != &CsvSharedMemoryList; Link = Link->ForwardLink) {
|
|
+ Entry = CR (Link, CsvSharedMemoryEntry, Link, CSV_SHARED_MEMORY_SIGNATURE);
|
|
+ if (Entry->Length > MemoryLength) {
|
|
+ *Memory = (EFI_PHYSICAL_ADDRESS)Entry->Start;
|
|
+ Entry->Start = *Memory + MemoryLength;
|
|
+ Entry->Length -= MemoryLength;
|
|
+ break;
|
|
+ } else if (Entry->Length == MemoryLength) {
|
|
+ *Memory = (EFI_PHYSICAL_ADDRESS)Entry->Start;
|
|
+ RemoveEntryList (&Entry->Link);
|
|
+ FreePool (Entry);
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+
|
|
+
|
|
+ if (Link == &CsvSharedMemoryList) {
|
|
+ DEBUG ((EFI_D_ERROR, "CsvAllocateSharedMemory fail to allocate %u pages\n", NumberOfPages));
|
|
+ return EFI_NOT_FOUND;
|
|
+ }
|
|
+ else {
|
|
+ return EFI_SUCCESS;
|
|
+ }
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
+EFI_STATUS
|
|
+EFIAPI
|
|
+CsvFreeSharedMemory (
|
|
+ IN CSV_SHARED_MEMORY_PROTOCOL *Protocol,
|
|
+ IN UINTN Pages,
|
|
+ IN UINT64 HostAddress
|
|
+ )
|
|
+{
|
|
+ LIST_ENTRY *Link;
|
|
+ CsvSharedMemoryEntry *Entry;
|
|
+ CsvSharedMemoryEntry *NewEntry;
|
|
+ UINT64 Memory;
|
|
+ UINT64 MemoryLength;
|
|
+ CsvSharedMemoryEntry *Previous = NULL;
|
|
+ BOOLEAN Inserted = FALSE;
|
|
+
|
|
+ Memory = (UINT64)HostAddress;
|
|
+ MemoryLength = (UINT64)Pages << EFI_PAGE_SHIFT;
|
|
+
|
|
+ for (Link = CsvSharedMemoryList.ForwardLink;
|
|
+ Link != &CsvSharedMemoryList;
|
|
+ Link = Link->ForwardLink) {
|
|
+ Entry = CR (Link, CsvSharedMemoryEntry, Link, CSV_SHARED_MEMORY_SIGNATURE);
|
|
+ if (Inserted)
|
|
+ goto Merge;
|
|
+ if (Entry->Start + Entry->Length == Memory) {
|
|
+ Entry->Length += MemoryLength;
|
|
+ Inserted = TRUE;
|
|
+ goto Merge;
|
|
+ } else if (Memory + MemoryLength < Entry->Start) {
|
|
+ NewEntry = AllocatePool (sizeof *NewEntry);
|
|
+ if (NewEntry == NULL) {
|
|
+ return EFI_OUT_OF_RESOURCES;
|
|
+ }
|
|
+
|
|
+ NewEntry->Start = Memory;
|
|
+ NewEntry->Length = MemoryLength;
|
|
+ NewEntry->Signature = CSV_SHARED_MEMORY_SIGNATURE;
|
|
+
|
|
+ InsertTailList (&Entry->Link, &NewEntry->Link);
|
|
+ break;
|
|
+ } else if (Memory + MemoryLength == Entry->Start) {
|
|
+ Entry->Start = Memory;
|
|
+ Entry->Length += MemoryLength;
|
|
+ break;
|
|
+ } else if (Link->ForwardLink == &CsvSharedMemoryList) {
|
|
+ //
|
|
+ // Insert to tail
|
|
+ //
|
|
+ NewEntry = AllocatePool (sizeof *NewEntry);
|
|
+ if (NewEntry == NULL) {
|
|
+ return EFI_OUT_OF_RESOURCES;
|
|
+ }
|
|
+
|
|
+ NewEntry->Start = Memory;
|
|
+ NewEntry->Length = MemoryLength;
|
|
+ NewEntry->Signature = CSV_SHARED_MEMORY_SIGNATURE;
|
|
+ InsertHeadList (Link, &NewEntry->Link);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+Merge:
|
|
+ if (Previous) {
|
|
+ if (Previous->Start + Previous->Length == Entry->Start) {
|
|
+ Entry->Start = Previous->Start;
|
|
+ Entry->Length += Previous->Length;
|
|
+ RemoveEntryList (&Previous->Link);
|
|
+ FreePool (Previous);
|
|
+ }
|
|
+ break;
|
|
+ } else {
|
|
+ Previous = Entry;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return EFI_SUCCESS;
|
|
+}
|
|
+
|
|
+CSV_SHARED_MEMORY_PROTOCOL mCsvSharedMemory = {
|
|
+ CsvInitializeSharedMemoryList,
|
|
+ CsvAllocateSharedMemory,
|
|
+ CsvFreeSharedMemory
|
|
+};
|
|
+
|
|
+/**
|
|
+ Initialize CsvSharedMemory Protocol.
|
|
+
|
|
+**/
|
|
+EFI_STATUS
|
|
+EFIAPI
|
|
+CsvInstallSharedMemoryProtocol (
|
|
+ VOID
|
|
+ )
|
|
+{
|
|
+ EFI_STATUS Status;
|
|
+ EFI_HANDLE Handle;
|
|
+
|
|
+ Handle = NULL;
|
|
+ Status = gBS->InstallMultipleProtocolInterfaces (
|
|
+ &Handle,
|
|
+ &gCsvSharedMemoryProtocolGuid,
|
|
+ &mCsvSharedMemory,
|
|
+ NULL
|
|
+ );
|
|
+ return Status;
|
|
+}
|
|
diff --git a/OvmfPkg/CsvDxe/CsvSharedMemory.h b/OvmfPkg/CsvDxe/CsvSharedMemory.h
|
|
new file mode 100644
|
|
index 0000000..1634818
|
|
--- /dev/null
|
|
+++ b/OvmfPkg/CsvDxe/CsvSharedMemory.h
|
|
@@ -0,0 +1,29 @@
|
|
+/** @file
|
|
+ CSV shared memory management protocol
|
|
+
|
|
+ Copyright (C) 2022 HYGON.
|
|
+
|
|
+ This program and the accompanying materials
|
|
+ are licensed and made available under the terms and conditions of the BSD License
|
|
+ which accompanies this distribution. The full text of the license may be found at
|
|
+ http://opensource.org/licenses/bsd-license.php
|
|
+
|
|
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
+
|
|
+**/
|
|
+
|
|
+#ifndef _CSV_SHARED_MEMORY_H_
|
|
+#define _CSV_SHARED_MEMORY_H_
|
|
+
|
|
+//
|
|
+// Install SHARED_MEMORY protocol .
|
|
+//
|
|
+
|
|
+EFI_STATUS
|
|
+EFIAPI
|
|
+CsvInstallSharedMemoryProtocol (
|
|
+ VOID
|
|
+ );
|
|
+
|
|
+#endif
|
|
diff --git a/OvmfPkg/Include/Protocol/CsvSharedMemory.h b/OvmfPkg/Include/Protocol/CsvSharedMemory.h
|
|
new file mode 100644
|
|
index 0000000..ba62f3a
|
|
--- /dev/null
|
|
+++ b/OvmfPkg/Include/Protocol/CsvSharedMemory.h
|
|
@@ -0,0 +1,99 @@
|
|
+/** @file
|
|
+ CSV shared memory management protocol
|
|
+
|
|
+ Copyright (C) 2022 HYGON.
|
|
+
|
|
+ This program and the accompanying materials
|
|
+ are licensed and made available under the terms and conditions of the BSD License
|
|
+ which accompanies this distribution. The full text of the license may be found at
|
|
+ http://opensource.org/licenses/bsd-license.php
|
|
+
|
|
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
+
|
|
+**/
|
|
+
|
|
+#ifndef __PROTOCOL_CSV_SHARED_MEMORY_H__
|
|
+#define __PROTOCOL_CSV_SHARED_MEMORY_H__
|
|
+
|
|
+#define CSV_SHARED_MEMORY_PAGE_NUMBER (16384ULL)
|
|
+#define CSV_SHARED_MEMORY_SIZE ((CSV_SHARED_MEMORY_PAGE_NUMBER)*(SIZE_4KB))
|
|
+
|
|
+///
|
|
+/// Forward declaration
|
|
+///
|
|
+typedef struct _CSV_SHARED_MEMORY_PROTOCOL CSV_SHARED_MEMORY_PROTOCOL;
|
|
+
|
|
+
|
|
+///
|
|
+/// Function prototypes
|
|
+///
|
|
+
|
|
+/**
|
|
+ Initialize the list to manage the CSV shared memory.
|
|
+ Insert the start address and length.
|
|
+
|
|
+ @param This A pointer to CSV_SHARED_MEMORY_PROTOCOL instance.
|
|
+ @param Address The start address of the shared memory.
|
|
+ @param Length The length of the shared memory.
|
|
+
|
|
+**/
|
|
+typedef
|
|
+EFI_STATUS
|
|
+(EFIAPI *CSV_INITIALIZE_SHARED_MEMORY_LIST)(
|
|
+ IN CSV_SHARED_MEMORY_PROTOCOL *This,
|
|
+ IN UINT64 Address,
|
|
+ IN UINT64 Length
|
|
+ );
|
|
+
|
|
+/**
|
|
+ Allocate buffer from the shared memory.
|
|
+
|
|
+ @param This A pointer to CSV_SHARED_MEMORY_PROTOCOL instance.
|
|
+ @param NumberOfPages The length of page number.
|
|
+ @param Memory When success, allocated memory will be stored in.
|
|
+
|
|
+ @return On success, EFI_SUCCESS. Otherwise an errno value
|
|
+ indicating the type of failure.
|
|
+**/
|
|
+typedef
|
|
+EFI_STATUS
|
|
+(EFIAPI *CSV_ALLOCATE_SHARED_MEMORY)(
|
|
+ IN CSV_SHARED_MEMORY_PROTOCOL *This,
|
|
+ IN UINTN NumberOfPages,
|
|
+ OUT UINT64 *Memory
|
|
+ );
|
|
+
|
|
+/**
|
|
+ Free buffer to the shared memory.
|
|
+
|
|
+ @param This A pointer to CSV_SHARED_MEMORY_PROTOCOL instance.
|
|
+ @param NumberOfPages The page number.
|
|
+ @param Memory The allocated memory to be freed.
|
|
+
|
|
+ @return On success, EFI_SUCCESS. Otherwise an errno value
|
|
+ indicating the type of failure.
|
|
+**/
|
|
+typedef
|
|
+EFI_STATUS
|
|
+(EFIAPI *CSV_FREE_SHARED_MEMORY)(
|
|
+ IN CSV_SHARED_MEMORY_PROTOCOL *This,
|
|
+ IN UINTN NumberOfPages,
|
|
+ IN UINT64 Memory
|
|
+ );
|
|
+
|
|
+///
|
|
+/// Protocol structure
|
|
+///
|
|
+struct _CSV_SHARED_MEMORY_PROTOCOL {
|
|
+ //
|
|
+ // Protocol data fields
|
|
+ //
|
|
+ CSV_INITIALIZE_SHARED_MEMORY_LIST CsvInitializeSharedMemoryList;
|
|
+ CSV_ALLOCATE_SHARED_MEMORY CsvAllocateSharedMemory;
|
|
+ CSV_FREE_SHARED_MEMORY CsvFreeSharedMemory;
|
|
+};
|
|
+
|
|
+extern EFI_GUID gCsvSharedMemoryProtocolGuid;
|
|
+
|
|
+#endif
|
|
diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
|
|
index f19a356..593a536 100644
|
|
--- a/OvmfPkg/OvmfPkg.dec
|
|
+++ b/OvmfPkg/OvmfPkg.dec
|
|
@@ -201,6 +201,7 @@
|
|
gQemuAcpiTableNotifyProtocolGuid = {0x928939b2, 0x4235, 0x462f, {0x95, 0x80, 0xf6, 0xa2, 0xb2, 0xc2, 0x1a, 0x4f}}
|
|
gEfiMpInitLibMpDepProtocolGuid = {0xbb00a5ca, 0x8ce, 0x462f, {0xa5, 0x37, 0x43, 0xc7, 0x4a, 0x82, 0x5c, 0xa4}}
|
|
gEfiMpInitLibUpDepProtocolGuid = {0xa9e7cef1, 0x5682, 0x42cc, {0xb1, 0x23, 0x99, 0x30, 0x97, 0x3f, 0x4a, 0x9f}}
|
|
+ gCsvSharedMemoryProtocolGuid = {0x0c795ed0, 0xbf0a, 0x11e9, {0x99, 0xbe, 0x50, 0x9a, 0x4c, 0x01, 0x1e, 0xd1}}
|
|
|
|
[PcdsFixedAtBuild]
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|0x0|UINT32|0
|
|
diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
|
|
index 8084970..577583d 100644
|
|
--- a/OvmfPkg/OvmfPkgIa32X64.dsc
|
|
+++ b/OvmfPkg/OvmfPkgIa32X64.dsc
|
|
@@ -976,6 +976,7 @@
|
|
PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
|
|
}
|
|
OvmfPkg/IoMmuDxe/IoMmuDxe.inf
|
|
+ OvmfPkg/CsvDxe/CsvDxe.inf
|
|
|
|
!if $(SMM_REQUIRE) == TRUE
|
|
OvmfPkg/SmmAccess/SmmAccess2Dxe.inf
|
|
diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf
|
|
index 7f599f1..429c0eb 100644
|
|
--- a/OvmfPkg/OvmfPkgIa32X64.fdf
|
|
+++ b/OvmfPkg/OvmfPkgIa32X64.fdf
|
|
@@ -345,6 +345,7 @@ INF OvmfPkg/VirtioGpuDxe/VirtioGpu.inf
|
|
INF OvmfPkg/PlatformDxe/Platform.inf
|
|
INF OvmfPkg/AmdSevDxe/AmdSevDxe.inf
|
|
INF OvmfPkg/IoMmuDxe/IoMmuDxe.inf
|
|
+INF OvmfPkg/CsvDxe/CsvDxe.inf
|
|
|
|
!if $(SMM_REQUIRE) == TRUE
|
|
INF OvmfPkg/SmmAccess/SmmAccess2Dxe.inf
|
|
diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
|
|
index 7b27691..9e01848 100644
|
|
--- a/OvmfPkg/OvmfPkgX64.dsc
|
|
+++ b/OvmfPkg/OvmfPkgX64.dsc
|
|
@@ -1043,6 +1043,7 @@
|
|
PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
|
|
}
|
|
OvmfPkg/IoMmuDxe/IoMmuDxe.inf
|
|
+ OvmfPkg/CsvDxe/CsvDxe.inf
|
|
|
|
OvmfPkg/TdxDxe/TdxDxe.inf
|
|
|
|
diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf
|
|
index 41fdb8b..597c9de 100644
|
|
--- a/OvmfPkg/OvmfPkgX64.fdf
|
|
+++ b/OvmfPkg/OvmfPkgX64.fdf
|
|
@@ -375,6 +375,7 @@ INF OvmfPkg/VirtioGpuDxe/VirtioGpu.inf
|
|
INF OvmfPkg/PlatformDxe/Platform.inf
|
|
INF OvmfPkg/AmdSevDxe/AmdSevDxe.inf
|
|
INF OvmfPkg/IoMmuDxe/IoMmuDxe.inf
|
|
+INF OvmfPkg/CsvDxe/CsvDxe.inf
|
|
|
|
!if $(SMM_REQUIRE) == TRUE
|
|
INF OvmfPkg/SmmAccess/SmmAccess2Dxe.inf
|
|
--
|
|
2.25.1
|
|
|