From: "Daniel Schaefer" <daniel.schaefer@hpe.com>
To: <devel@edk2.groups.io>
Cc: G Edhaya Chandran <Edhaya.Chandran@arm.com>,
Barton Gao <gaojie@byosoft.com.cn>,
Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>,
Eric Jin <eric.jin@intel.com>, Arvin Chen <arvinx.chen@intel.com>,
Leif Lindholm <leif@nuviainc.com>,
Heinrich Schuchardt <xypron.glpk@gmx.de>,
Abner Chang <abner.chang@hpe.com>
Subject: [edk2-test PATCHv2 1/5] SctPkg: Add RISCV64 support by using Aarch64 sources
Date: Tue, 9 Feb 2021 23:43:50 +0800 [thread overview]
Message-ID: <20210209154354.30234-2-daniel.schaefer@hpe.com> (raw)
In-Reply-To: <20210209154354.30234-1-daniel.schaefer@hpe.com>
The sources were copied from Aarch64. Follow-up commit will adapt them
for Riscv64.
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3042
Cc: G Edhaya Chandran <Edhaya.Chandran@arm.com>
Cc: Barton Gao <gaojie@byosoft.com.cn>
Cc: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>
Cc: Eric Jin <eric.jin@intel.com>
Cc: Arvin Chen <arvinx.chen@intel.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Heinrich Schuchardt <xypron.glpk@gmx.de>
Cc: Abner Chang <abner.chang@hpe.com>
Signed-off-by: Daniel Schaefer <daniel.schaefer@hpe.com>
---
uefi-sct/SctPkg/Library/SctLib/Riscv64/SctLibPlat.h | 32 +++
uefi-sct/SctPkg/Library/SctLib/Riscv64/initplat.c | 45 ++++
uefi-sct/SctPkg/SCRT/SCRTApp/Riscv64/GoVirtual.S | 44 ++++
uefi-sct/SctPkg/SCRT/SCRTApp/Riscv64/VirtualMemory.c | 182 +++++++++++++
uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Debug.c | 88 +++++++
uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Dump.c | 68 +++++
uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Io.c | 134 ++++++++++
uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Io.h | 48 ++++
uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/DebugSupportBBTestCacheFunction.c | 137 ++++++++++
uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/DebugSupportBBTestExceptionCallbackFunction.c | 276 ++++++++++++++++++++
uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/PlatformIsa.c | 30 +++
uefi-sct/SctPkg/TestInfrastructure/SCT/Framework/ENTS/EasLib/Riscv64/EntsLibPlat.h | 55 ++++
uefi-sct/SctPkg/TestInfrastructure/SCT/Framework/ENTS/EasLib/Riscv64/InitPlat.c | 55 ++++
13 files changed, 1194 insertions(+)
diff --git a/uefi-sct/SctPkg/Library/SctLib/Riscv64/SctLibPlat.h b/uefi-sct/SctPkg/Library/SctLib/Riscv64/SctLibPlat.h
new file mode 100644
index 00000000..ee7c656b
--- /dev/null
+++ b/uefi-sct/SctPkg/Library/SctLib/Riscv64/SctLibPlat.h
@@ -0,0 +1,32 @@
+/** @file
+
+ Copyright 2006 - 2012 Unified EFI, Inc.<BR>
+ Copyright (c) 2011 - 2012, ARM Ltd. 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.
+
+**/
+/*++
+
+Module Name:
+
+ SctLibPlat.h
+
+Abstract:
+
+ AArch64 specific defines
+
+--*/
+
+#ifndef _EFI_LIB_PLAT_H_
+#define _EFI_LIB_PLAT_H_
+
+#define MIN_ALIGNMENT_SIZE 8
+
+#endif
diff --git a/uefi-sct/SctPkg/Library/SctLib/Riscv64/initplat.c b/uefi-sct/SctPkg/Library/SctLib/Riscv64/initplat.c
new file mode 100644
index 00000000..a48bb2f3
--- /dev/null
+++ b/uefi-sct/SctPkg/Library/SctLib/Riscv64/initplat.c
@@ -0,0 +1,45 @@
+/** @file
+
+ Copyright 2006 - 2012 Unified EFI, Inc.<BR>
+ Copyright (c) 2011 - 2012, ARM Ltd. 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.
+
+**/
+/*++
+
+Module Name:
+
+ initplat.c
+
+Abstract:
+
+ Math routines for compatibility with native EFI library routines.
+
+--*/
+
+#include "SctLibInternal.h"
+
+VOID
+InitializeLibPlatform (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+
+{
+ // No platform-specific initializations
+}
+
+UINT64
+SctReadTsc (
+ VOID
+ )
+{
+ return 0;
+}
diff --git a/uefi-sct/SctPkg/SCRT/SCRTApp/Riscv64/GoVirtual.S b/uefi-sct/SctPkg/SCRT/SCRTApp/Riscv64/GoVirtual.S
new file mode 100644
index 00000000..d223b36b
--- /dev/null
+++ b/uefi-sct/SctPkg/SCRT/SCRTApp/Riscv64/GoVirtual.S
@@ -0,0 +1,44 @@
+## @file
+#
+# Copyright 2010 - 2012 Unified EFI, Inc.<BR>
+# Copyright (c) 2012, ARM Ltd. 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.
+#
+##
+#
+#
+#/*++
+#
+# Module Name:
+#
+# GoVirtual.S
+#
+#--*/
+#start of the code section
+.text
+/* FIXME: Should alignment be different on Aarch64? */
+.align 3
+
+.global JumpToTestFunc
+.type JumpToTestFunc, %function
+
+#------------------------------------------------------------------------------
+# VOID
+# JumpToTestFunc (
+# IN UINTN FuncPointer,
+# IN UNITN ConfigInfo
+# )
+#
+JumpToTestFunc:
+ mov x2, x0
+ mov x0, x1
+
+ // Jump to Virtual function
+ blr x2
diff --git a/uefi-sct/SctPkg/SCRT/SCRTApp/Riscv64/VirtualMemory.c b/uefi-sct/SctPkg/SCRT/SCRTApp/Riscv64/VirtualMemory.c
new file mode 100644
index 00000000..397b3514
--- /dev/null
+++ b/uefi-sct/SctPkg/SCRT/SCRTApp/Riscv64/VirtualMemory.c
@@ -0,0 +1,182 @@
+/** @file
+
+ Copyright 2006 - 2012 Unified EFI, Inc.<BR>
+ Copyright (c) 2012, ARM Ltd. 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.
+
+**/
+/*++
+
+Module Name:
+
+ VirtualMemory.c
+
+--*/
+
+#include "SCRTApp.h"
+
+#define VIRT_TO_PHYS_OFFSET (0x80000000) //2G
+
+BOOLEAN HighAddress = FALSE;
+UINTN PageTable = 0;
+
+
+VOID
+ConvertRuntimeFuncPtr (
+ IN OUT UINTN *VirtualFunc
+ )
+/*++
+
+Routine Description:
+
+ Change RuntimeTestFunc physical address to virtual address
+
+Arguments:
+
+ VirtualFunc - On input, RuntimeTestFunc physical address.
+ On output, RuntimeTest virtual address.
+
+Returns:
+
+ NONE
+
+--*/
+{
+ /*Note: It is presumed that on ARM v5, V6 and V7 architectures
+ * the MMU is configured and enabled in PEI phase. As VirtualFunc
+ * is already mapped to virtual memory, don't have to do anything here.
+ */
+ /* FIXME: Is it the same on ARM v8? */
+}
+
+
+EFI_STATUS
+DoMemoryAllocation (
+ IN UINTN PhysicalFunc
+ )
+/*++
+
+Routine Description:
+
+ Allocate memory and create the PageTable to set up physical-virtual map.
+
+Arguments:
+
+ PhysicalFunc - Physical address where RuntimeTestFunc locates.
+
+Returns:
+
+ EFI_STATUS
+
+--*/
+{
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS AllocateMemory;
+
+ //create new page tables or use existing page tables.
+ //
+ // Allocate PageTable memory close to this Application image location in
+ // the system memory. In this way, it is safe for page table memory.
+ //
+ AllocateMemory = PhysicalFunc;
+
+ Status = tBS->AllocatePages (
+ AllocateMaxAddress,
+ EfiRuntimeServicesData,
+ 1,
+ &AllocateMemory
+ );
+
+ if (EFI_ERROR(Status)) {
+ return Status;
+ }
+
+ PageTable = (UINTN)AllocateMemory;
+ return EFI_SUCCESS;
+}
+
+
+VOID
+PrepareVirtualAddressMap (
+ IN UINTN MemoryMapSize,
+ IN UINTN DescriptorSize,
+ IN EFI_MEMORY_DESCRIPTOR *MemoryMap,
+ IN EFI_MEMORY_DESCRIPTOR *VirtualMemoryMap,
+ IN OUT UINTN *VirtualMapSize
+ )
+/*++
+
+Routine Description:
+
+ Construct VirtualAddressMap from physical address to virtual address
+
+Arguments:
+
+ MemoryMapSize - The size, in bytes, of the MemoryMap buffer
+ DescriptorSize - The size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR
+ MemoryMap - A pointer to the current memory map
+ VirtualMemoryMap - A pointer to the modified virtual memory map
+ VirtualMapSize - A pointer to the size, in bytes, of the VirtualMemoryMap buffer
+
+Returns:
+
+ NONE
+
+--*/
+{
+ UINTN Index;
+ *VirtualMapSize = 0;
+
+ //
+ // Copy entries that need runtime mapping to construct virtualMemoryMap
+ //
+ for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) {
+ if ((MemoryMap->Attribute & EFI_MEMORY_RUNTIME) == EFI_MEMORY_RUNTIME) {
+ SctCopyMem ((VOID *) VirtualMemoryMap, (VOID *) MemoryMap, DescriptorSize);
+ VirtualMemoryMap->VirtualStart = VirtualMemoryMap->PhysicalStart;
+ *VirtualMapSize += DescriptorSize;
+ VirtualMemoryMap = NextMemoryDescriptor (VirtualMemoryMap, DescriptorSize);
+ }
+
+ MemoryMap = NextMemoryDescriptor (MemoryMap, DescriptorSize);
+ }
+}
+
+
+
+VOID
+JumpVirtualMode(
+ IN UINTN VirtualFunc,
+ IN UINTN HandOffAddr
+ )
+/*++
+
+Routine Description:
+
+ Enable virtual addressing mode, and jump to RuntimeTestFunc in virtual address
+
+Arguments:
+
+ VirtualFunc - RuntimeTestFunc virtual address
+ HandOffAddr - Configuration Data Address
+
+Returns:
+
+ NONE
+
+--*/
+{
+ //
+ // Note: It is assumed that the MMU and page tables are configured on ARM platforms
+ // based on ARM v5 v6 and v7 architecture.
+ //
+ /* FIXME: Is it the same on ARM v8? */
+ JumpToTestFunc(VirtualFunc, HandOffAddr);
+}
diff --git a/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Debug.c b/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Debug.c
new file mode 100644
index 00000000..6161d596
--- /dev/null
+++ b/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Debug.c
@@ -0,0 +1,88 @@
+/** @file
+
+ Copyright 2006 - 2012 Unified EFI, Inc.<BR>
+ Copyright (c) 2011 - 2012 ARM Ltd. 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.
+
+**/
+
+/*++
+
+Module Name:
+
+ Debug.c
+
+--*/
+
+#include "SCRTDriver.h"
+
+UINTN mHandOffPtr = 0;
+EFI_PHYSICAL_ADDRESS mIoPortSpaceAddress = 0;
+
+
+EFI_STATUS
+ConsumeHandOff (
+ IN UINTN HandOffAddr,
+ OUT CONF_INFO *ConfigData
+ )
+{
+ RUNTIME_HANDOFF *HandOffPtr;
+ //
+ // First fix the memory address of hand off data.
+ //
+ FixAddress(&HandOffAddr);
+ mHandOffPtr = HandOffAddr;
+ HandOffPtr = (RUNTIME_HANDOFF*)mHandOffPtr;
+ *ConfigData = HandOffPtr->ConfigureInfo;
+
+ if (!HandOffPtr->DebuggerInfo.MmioFlag){
+ //
+ // If debug port is I/O mapped, fix IoBase Address.
+ //
+ FixAddress(&HandOffPtr->DebuggerInfo.IoBase);
+ mIoPortSpaceAddress = HandOffPtr->DebuggerInfo.IoBase;
+ } else {
+ //
+ // If debug port is MMIO, fix MmioBase Address.
+ //
+ FixAddress(&HandOffPtr->DebuggerInfo.MmioBase);
+ }
+
+ return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+Send2UART (
+ CHAR8 *String
+ )
+{
+ //
+ // TODO: On ARM platforms use platform specific functions to
+ // write the data to UART.
+ //
+ return EFI_SUCCESS;
+}
+
+
+
+EFI_STATUS
+DebugWorker (
+ IN CHAR8 *String
+ )
+{
+ EFI_STATUS Status;
+
+ //
+ // Send text message to registered UART.
+ //
+ Status = Send2UART(String);
+ return Status;
+}
diff --git a/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Dump.c b/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Dump.c
new file mode 100644
index 00000000..cc8d9869
--- /dev/null
+++ b/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Dump.c
@@ -0,0 +1,68 @@
+/** @file
+
+ Copyright 2006 - 2012 Unified EFI, Inc.<BR>
+ Copyright (c) 2011 - 2012 ARM Ltd. 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.
+
+**/
+
+/*++
+
+Module Name:
+
+ Dump.c
+
+--*/
+
+#include "SCRTDriver.h"
+
+VOID
+DumpRuntimeTable()
+{
+ SctAPrint ("\n================Dump Runtime Table===============\n");
+ SctAPrint ("Header Signature = 0x%x\n", VRT->Hdr.Signature);
+
+ SctAPrint ("\n================GetTime Service==============\n");
+ SctAPrint ("GetTime @ 0x%x\n", VRT->GetTime);
+
+ SctAPrint ("\n================SetTime Service==============\n");
+ SctAPrint ("SetTime @ 0x%x\n", VRT->SetTime);
+
+ SctAPrint ("\n================GetWakeupTime Service==============\n");
+ SctAPrint ("GetWakeupTime @ 0x%x\n", VRT->GetWakeupTime);
+
+ SctAPrint ("\n================SetWakeupTime Service==============\n");
+ SctAPrint ("SetWakeupTime @ 0x%x\n", VRT->SetWakeupTime);
+
+ SctAPrint ("\n================GetVariable Service==============\n");
+ SctAPrint ("GetVariable @ 0x%x\n", VRT->GetVariable);
+
+ SctAPrint ("\n================GetNextVariableName Service==============\n");
+ SctAPrint ("GetNextVariableName @ 0x%x\n", VRT->GetNextVariableName);
+
+ SctAPrint ("\n================SetVariable Service==============\n");
+ SctAPrint ("SetVariable @ 0x%x\n", VRT->SetVariable);
+
+ SctAPrint ("\n================GetNextHighMonotonicCount Service==============\n");
+ SctAPrint ("GetNextHighMonotonicCount @ 0x%x\n", VRT->GetNextHighMonotonicCount);
+
+ SctAPrint ("\n================ResetSystem Service==============\n");
+ SctAPrint ("ResetSystem @ 0x%x\n", VRT->ResetSystem);
+#if 0
+ SctAPrint ("\n================UpdateCapsule Service==============\n");
+ SctAPrint ("UpdateCapsule @ 0x%x\n", VRT->UpdateCapsule);
+
+ SctAPrint ("\n================QueryCapsuleCapabilities Service==============\n");
+ SctAPrint ("QueryCapsuleCapabilities @ 0x%x\n", VRT->QueryCapsuleCapabilities);
+
+ SctAPrint ("\n================QueryVariableInfo Service==============\n");
+ SctAPrint ("QueryVariableInfo @ 0x%x\n", VRT->QueryVariableInfo);
+#endif
+}
diff --git a/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Io.c b/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Io.c
new file mode 100644
index 00000000..b925e151
--- /dev/null
+++ b/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Io.c
@@ -0,0 +1,134 @@
+/** @file
+
+ Copyright 2006 - 2012 Unified EFI, Inc.<BR>
+ Copyright (c) 2011 - 2012 ARM Ltd. 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.
+
+**/
+
+/*++
+
+Module Name:
+
+ Io.c
+
+--*/
+
+#include "Io.h"
+
+EFI_STATUS
+EFIAPI
+CpuIoServiceWrite (
+ IN EFI_PEI_CPU_IO_PPI_WIDTH Width,
+ IN UINT64 UserAddress,
+ IN UINTN Count,
+ IN VOID *UserBuffer
+ )
+/*++
+
+Routine Description:
+
+ Perform the port I/O write service
+
+Arguments:
+
+ Width - Width of the port I/O operation
+ Address - Base address of the port I/O operation
+ Count - Count of the number of accesses to perform
+ Buffer - Pointer to the source buffer from which to write data
+
+Returns:
+
+ EFI_SUCCESS - The data was written.
+ EFI_INVALID_PARAMETER - Width is invalid.
+ EFI_INVALID_PARAMETER - Buffer is NULL.
+ EFI_UNSUPPORTED - The Buffer is not aligned for the given Width.
+ EFI_UNSUPPORTED - The address range specified by Address, Width,
+ and Count is not valid.
+
+--*/
+{
+ return EFI_UNSUPPORTED;
+}
+
+
+EFI_STATUS
+EfiIoWrite (
+ IN EFI_PEI_CPU_IO_PPI_WIDTH Width,
+ IN UINT64 Address,
+ IN UINTN Count,
+ IN OUT VOID *Buffer
+ )
+/*++
+
+Routine Description:
+ Perform an IO write into Buffer.
+
+Arguments:
+ Width - Width of write transaction, and repeat operation to use
+ Address - IO address to write
+ Count - Number of times to write the IO address.
+ Buffer - Buffer to write data from. size is Width * Count
+
+Returns:
+ Status code
+
+--*/
+{
+ return CpuIoServiceWrite(Width, Address, Count, Buffer);
+}
+
+
+EFI_STATUS
+EfiIoRead (
+ IN EFI_PEI_CPU_IO_PPI_WIDTH Width,
+ IN UINT64 Address,
+ IN UINTN Count,
+ IN OUT VOID *Buffer
+ )
+/*++
+
+Routine Description:
+ Perform an IO read into Buffer.
+
+Arguments:
+ Width - Width of read transaction, and repeat operation to use
+ Address - IO address to read
+ Count - Number of times to read the IO address.
+ Buffer - Buffer to read data into. size is Width * Count
+
+Returns:
+ Status code
+
+--*/
+{
+ return EFI_UNSUPPORTED;
+}
+
+
+VOID
+FixAddress (
+ IN UINTN *PhyAddress
+ )
+{
+ //
+ //Note: On ARM platforms don't have to do this as all the functions are virtually mapped.
+ //
+}
+
+// Quick port to ARM
+
+VOID
+Port80 (
+ UINT8 Number
+ )
+{
+ //EFI_SCT_DEBUG ((EFI_SCT_D_ERROR, L"Port80 %02x", Number));
+}
diff --git a/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Io.h b/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Io.h
new file mode 100644
index 00000000..1e78b3e4
--- /dev/null
+++ b/uefi-sct/SctPkg/SCRT/SCRTDriver/Riscv64/Io.h
@@ -0,0 +1,48 @@
+/** @file
+
+ Copyright 2006 - 2012 Unified EFI, Inc.<BR>
+ Copyright (c) 2011 - 2012 ARM Ltd. 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.
+
+**/
+
+/*++
+
+Module Name:
+
+ Debug.h
+
+--*/
+
+#ifndef _IA32_IO_ACCESS_H
+#define _IA32_IO_ACCESS_H
+
+#include "SCRTDriver.h"
+
+#define IA32_MAX_IO_ADDRESS 0xFFFF
+
+#define IA32API
+
+
+typedef union {
+ UINT8 VOLATILE *buf;
+ UINT8 VOLATILE *ui8;
+ UINT16 VOLATILE *ui16;
+ UINT32 VOLATILE *ui32;
+ UINT64 VOLATILE *ui64;
+ UINTN VOLATILE ui;
+} PTR;
+
+// This address is assuming a pure PC architecture. Not required?
+#define VIRT_TO_PHYS_OFFSET (0x80000000) //2G
+
+
+
+#endif
diff --git a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/DebugSupportBBTestCacheFunction.c b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/DebugSupportBBTestCacheFunction.c
new file mode 100644
index 00000000..96ee7b57
--- /dev/null
+++ b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/DebugSupportBBTestCacheFunction.c
@@ -0,0 +1,137 @@
+/** @file
+
+ Copyright 2006 - 2016 Unified EFI, Inc.<BR>
+ Copyright (c) 2011 - 2016, ARM Ltd. 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.
+
+**/
+/*++
+
+Module Name:
+
+ DebugSupportBBTestCacheFunction.c
+
+Abstract:
+
+ Interface Function Test Cases of Debug Support Protocol
+
+--*/
+
+
+#include "DebugSupportBBTestMain.h"
+
+/**
+ * Entrypoint for EFI_DEBUG_SUPPORT_PROTOCOL.InvalidateInstructionCache() Function Test.
+ * @param This a pointer of EFI_BB_TEST_PROTOCOL.
+ * @param ClientInterface a pointer to the interface to be tested.
+ * @param TestLevel test "thoroughness" control.
+ * @param SupportHandle a handle containing protocols required.
+ * @return EFI_SUCCESS Finish the test successfully.
+ */
+//
+// TDS 3.5
+//
+EFI_STATUS
+BBTestInvalidateInstructionCacheFunctionAutoTest (
+ IN EFI_BB_TEST_PROTOCOL *This,
+ IN VOID *ClientInterface,
+ IN EFI_TEST_LEVEL TestLevel,
+ IN EFI_HANDLE SupportHandle
+ )
+{
+ EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib;
+ EFI_STATUS Status;
+ EFI_DEBUG_SUPPORT_PROTOCOL *DebugSupport;
+ EFI_TEST_ASSERTION AssertionType;
+ UINT64 Start;
+ UINT64 Length;
+ UINTN MaxProcessorIndex;
+ UINTN ProcessorIndex;
+
+ //
+ // Get the Standard Library Interface
+ //
+ Status = gtBS->HandleProtocol (
+ SupportHandle,
+ &gEfiStandardTestLibraryGuid,
+ (VOID **) &StandardLib
+ );
+
+ if (EFI_ERROR(Status)) {
+ StandardLib->RecordAssertion (
+ StandardLib,
+ EFI_TEST_ASSERTION_FAILED,
+ gTestGenericFailureGuid,
+ L"BS.HandleProtocol - Handle standard test library",
+ L"%a:%d:Status - %r",
+ __FILE__,
+ (UINTN)__LINE__,
+ Status
+ );
+ return Status;
+ }
+
+ DebugSupport = (EFI_DEBUG_SUPPORT_PROTOCOL *)ClientInterface;
+
+ if (DebugSupport->Isa != PlatformIsa) {
+ return EFI_SUCCESS;
+ }
+
+ Status = DebugSupport->GetMaximumProcessorIndex (DebugSupport, &MaxProcessorIndex);
+ if (EFI_ERROR(Status)) {
+ StandardLib->RecordAssertion (
+ StandardLib,
+ EFI_TEST_ASSERTION_FAILED,
+ gTestGenericFailureGuid,
+ L"EFI_DEBUG_SUPPORT_PROTOCOL.GetMaximumProcessorIndex",
+ L"%a:%d:Status - %r",
+ __FILE__,
+ (UINTN)__LINE__,
+ Status
+ );
+ return Status;
+ }
+
+ for (ProcessorIndex = 0; ProcessorIndex <= MaxProcessorIndex; ProcessorIndex++) {
+
+ //
+ // Assertion Point 3.5.2.1
+ // Invoke InvalidateInstructionCache and verify interface correctness.
+ //
+
+ // The Physical base of the memory range to be invalidated.
+ Start = 0x0;
+
+ // The minimum number of bytes in the processor's instruction cache to be invalidated.
+ Length = 0x0;
+
+ Status = DebugSupport->InvalidateInstructionCache (DebugSupport, ProcessorIndex, (VOID*)&Start, Length);
+
+ if (EFI_ERROR(Status)) {
+ AssertionType = EFI_TEST_ASSERTION_FAILED;
+ } else {
+ AssertionType = EFI_TEST_ASSERTION_PASSED;
+ }
+
+ StandardLib->RecordAssertion (
+ StandardLib,
+ AssertionType,
+ gDebugSupportBBTestFunctionAssertionGuid015,
+ L"EFI_DEBUG_SUPPORT_PROTOCOL.InvalidateInstructionCache - Invoke this function and verify interface correctness",
+ L"%a:%d:Status - %r",
+ __FILE__,
+ (UINTN)__LINE__,
+ Status
+ );
+ }
+
+ return EFI_SUCCESS;
+}
+
diff --git a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/DebugSupportBBTestExceptionCallbackFunction.c b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/DebugSupportBBTestExceptionCallbackFunction.c
new file mode 100644
index 00000000..c27c0c0c
--- /dev/null
+++ b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/DebugSupportBBTestExceptionCallbackFunction.c
@@ -0,0 +1,276 @@
+/** @file
+
+ Copyright 2006 - 2016 Unified EFI, Inc.<BR>
+ Copyright (c) 2011 - 2016, ARM Ltd. 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.
+
+**/
+/*++
+
+Module Name:
+
+ DebugSupportBBExceptionCallbackFunction.c
+
+Abstract:
+
+ Interface Function Test Cases of Debug Support Protocol
+
+--*/
+
+
+#include "DebugSupportBBTestMain.h"
+
+extern volatile UINTN InvokedExceptionCallback;
+extern volatile UINTN InvokedPeriodicCallback;
+
+extern EFI_INSTRUCTION_SET_ARCHITECTURE PlatformIsa;
+
+void
+SoftwareBreak (
+ void
+ )
+{
+ // Not ported to ARM yet
+ ASSERT (FALSE);
+}
+
+/**
+ * Entrypoint for EFI_DEBUG_SUPPORT_PROTOCOL.RegisterExceptionCallback() Function Test.
+ * @param This a pointer of EFI_BB_TEST_PROTOCOL.
+ * @param ClientInterface a pointer to the interface to be tested.
+ * @param TestLevel test "thoroughness" control.
+ * @param SupportHandle a handle containing protocols required.
+ * @return EFI_SUCCESS Finish the test successfully.
+ */
+//
+// TDS 3.4
+//
+EFI_STATUS
+BBTestRegisterExceptionCallbackFunctionManualTest (
+ IN EFI_BB_TEST_PROTOCOL *This,
+ IN VOID *ClientInterface,
+ IN EFI_TEST_LEVEL TestLevel,
+ IN EFI_HANDLE SupportHandle
+ )
+{
+ EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib;
+ EFI_STATUS Status;
+ EFI_DEBUG_SUPPORT_PROTOCOL *DebugSupport;
+ EFI_TEST_ASSERTION AssertionType;
+
+ DebugSupport = (EFI_DEBUG_SUPPORT_PROTOCOL *)ClientInterface;
+
+ if (DebugSupport->Isa != PlatformIsa) {
+ return EFI_SUCCESS;
+ }
+
+ //
+ // Get the Standard Library Interface
+ //
+ Status = gtBS->HandleProtocol (
+ SupportHandle,
+ &gEfiStandardTestLibraryGuid,
+ (VOID **) &StandardLib
+ );
+
+ if (EFI_ERROR(Status)) {
+ StandardLib->RecordAssertion (
+ StandardLib,
+ EFI_TEST_ASSERTION_FAILED,
+ gTestGenericFailureGuid,
+ L"BS.HandleProtocol - Handle standard test library",
+ L"%a:%d:Status - %r",
+ __FILE__,
+ (UINTN)__LINE__,
+ Status
+ );
+ return Status;
+ }
+
+ //
+ // Assertion Point 3.4.2.1
+ // Invoke RegisterExceptionCallback() to install an interrupt handler function.
+ //
+ InvokedExceptionCallback = FALSE;
+ // FIXME: Is it normal that we use EXCEPT_IA32_BREAKPOINT here?
+ // Shouldn't we define proper constants for ARM exceptions in DebugSupportProtocol.h file?
+ Status = DebugSupport->RegisterExceptionCallback (DebugSupport, 0, ExceptionCallback, EXCEPT_IA32_BREAKPOINT);
+
+ if ((Status == EFI_SUCCESS) || (Status == EFI_ALREADY_STARTED)) {
+ AssertionType = EFI_TEST_ASSERTION_PASSED;
+ } else {
+ AssertionType = EFI_TEST_ASSERTION_FAILED;
+ }
+
+ StandardLib->RecordAssertion (
+ StandardLib,
+ AssertionType,
+ gDebugSupportBBTestFunctionAssertionGuid009,
+ L"EFI_DEBUG_SUPPORT_PROTOCOL.RegisterExceptionCallback - Invoke this function and verify interface correctness",
+ L"%a:%d:Status - %r",
+ __FILE__,
+ (UINTN)__LINE__,
+ Status
+ );
+
+ //
+ // If the callback function is already registed, return
+ //
+ if (EFI_ERROR(Status)) {
+ return EFI_SUCCESS;
+ }
+
+ //
+ // Test the callback function registed.
+ //
+
+ //
+ // Call SoftwareBreak to invoke the interrupt handler function.
+ //
+ SoftwareBreak ();
+
+ if (InvokedExceptionCallback == FALSE) {
+ AssertionType = EFI_TEST_ASSERTION_FAILED;
+ } else {
+ AssertionType = EFI_TEST_ASSERTION_PASSED;
+ }
+
+ StandardLib->RecordAssertion (
+ StandardLib,
+ AssertionType,
+ gDebugSupportBBTestFunctionAssertionGuid010,
+ L"EFI_DEBUG_SUPPORT_PROTOCOL.RegisterExceptionCallback - Verify the callback function was invoked.",
+ L"%a:%d:Status - %r",
+ __FILE__,
+ (UINTN)__LINE__,
+ Status
+ );
+
+ //
+ // Assertion Point 3.4.2.2
+ // Invoke RegisterPeriodicCallback() to install the Periodic interrupt handler function.
+ // Verify the two callback functions can be both invoked.
+ //
+ InvokedExceptionCallback = FALSE;
+ InvokedPeriodicCallback = FALSE;
+
+ Status = DebugSupport->RegisterPeriodicCallback (DebugSupport, 0, PeriodicCallback);
+ if (EFI_ERROR(Status)) {
+ return Status;
+ }
+
+ //
+ // Wait the PeriodicCallback to be invoked.
+ //
+ gtBS->Stall (500000);
+
+ //
+ // Call SoftwareBreak to invoke the interrupt handler function.
+ //
+ SoftwareBreak ();
+
+ if ((InvokedExceptionCallback == TRUE) && (InvokedPeriodicCallback == TRUE)) {
+ AssertionType = EFI_TEST_ASSERTION_PASSED;
+ } else {
+ AssertionType = EFI_TEST_ASSERTION_FAILED;
+ }
+
+ StandardLib->RecordAssertion (
+ StandardLib,
+ AssertionType,
+ gDebugSupportBBTestFunctionAssertionGuid011,
+ L"EFI_DEBUG_SUPPORT_PROTOCOL.RegisterExceptionCallback - Verify the two callback functions can be both invoked.",
+ L"%a:%d:Status - %r",
+ __FILE__,
+ (UINTN)__LINE__,
+ Status
+ );
+
+ //
+ // Uninstall the Periodic callback function.
+ //
+ Status = DebugSupport->RegisterPeriodicCallback (DebugSupport, 0, NULL);
+ if (EFI_ERROR(Status)) {
+ return Status;
+ }
+
+ //
+ // Assertion Point 3.4.2.3
+ // Invoke RegisterExceptionCallback() to install another interrupt handler function.
+ //
+ Status = DebugSupport->RegisterExceptionCallback (DebugSupport, 0, ExceptionCallback1, EXCEPT_IA32_BREAKPOINT);
+
+ if (Status != EFI_ALREADY_STARTED) {
+ AssertionType = EFI_TEST_ASSERTION_FAILED;
+ } else {
+ AssertionType = EFI_TEST_ASSERTION_PASSED;
+ }
+
+ StandardLib->RecordAssertion (
+ StandardLib,
+ AssertionType,
+ gDebugSupportBBTestFunctionAssertionGuid012,
+ L"EFI_DEBUG_SUPPORT_PROTOCOL.RegisterExceptionCallback - Register another callback function.",
+ L"%a:%d:Status - %r",
+ __FILE__,
+ (UINTN)__LINE__,
+ Status
+ );
+
+ //
+ // Assertion Point 3.4.2.4
+ // Invoke RegisterExceptionCallback() to unstall the interrupt handler function.
+ //
+ Status = DebugSupport->RegisterExceptionCallback (DebugSupport, 0, NULL, EXCEPT_IA32_BREAKPOINT);
+
+ if (EFI_ERROR(Status)) {
+ AssertionType = EFI_TEST_ASSERTION_FAILED;
+ } else {
+ AssertionType = EFI_TEST_ASSERTION_PASSED;
+ }
+
+ StandardLib->RecordAssertion (
+ StandardLib,
+ AssertionType,
+ gDebugSupportBBTestFunctionAssertionGuid013,
+ L"EFI_DEBUG_SUPPORT_PROTOCOL.RegisterExceptionCallback - Invoke this function to uninstall the interrupt handler function",
+ L"%a:%d:Status - %r",
+ __FILE__,
+ (UINTN)__LINE__,
+ Status
+ );
+
+ InvokedExceptionCallback = FALSE;
+
+ //
+ // Call SoftwareBreak to invoke the interrupt handler function.
+ //
+ SoftwareBreak ();
+
+ if (InvokedExceptionCallback != FALSE) {
+ AssertionType = EFI_TEST_ASSERTION_FAILED;
+ } else {
+ AssertionType = EFI_TEST_ASSERTION_PASSED;
+ }
+
+ StandardLib->RecordAssertion (
+ StandardLib,
+ AssertionType,
+ gDebugSupportBBTestFunctionAssertionGuid014,
+ L"EFI_DEBUG_SUPPORT_PROTOCOL.RegisterExceptionCallback - Verify the callback function wasn't invoked",
+ L"%a:%d:Status - %r",
+ __FILE__,
+ (UINTN)__LINE__,
+ Status
+ );
+
+ return EFI_SUCCESS;
+}
+
diff --git a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/PlatformIsa.c b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/PlatformIsa.c
new file mode 100644
index 00000000..8334f601
--- /dev/null
+++ b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/DebugSupport/BlackBoxTest/Riscv64/PlatformIsa.c
@@ -0,0 +1,30 @@
+/** @file
+
+ Copyright 2006 - 2012 Unified EFI, Inc.<BR>
+ Copyright (c) 2011 - 2012, ARM Ltd. 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.
+
+**/
+/*++
+
+Module Name:
+
+ PlatformIsa.c
+
+Abstract:
+
+ Platform related Isa definition.
+
+--*/
+
+#include "DebugSupportBBTestMain.h"
+
+EFI_INSTRUCTION_SET_ARCHITECTURE PlatformIsa = IsaAArch64;
+
diff --git a/uefi-sct/SctPkg/TestInfrastructure/SCT/Framework/ENTS/EasLib/Riscv64/EntsLibPlat.h b/uefi-sct/SctPkg/TestInfrastructure/SCT/Framework/ENTS/EasLib/Riscv64/EntsLibPlat.h
new file mode 100644
index 00000000..ff781aee
--- /dev/null
+++ b/uefi-sct/SctPkg/TestInfrastructure/SCT/Framework/ENTS/EasLib/Riscv64/EntsLibPlat.h
@@ -0,0 +1,55 @@
+/** @file
+
+ Copyright 2006 - 2012 Unified EFI, Inc.<BR>
+ Copyright (c) 2010 - 2012, ARM Ltd. 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.
+
+**/
+/*++
+
+Module Name:
+
+ EntsLibPlat.h
+
+Abstract:
+
+ AArch64 specific defines
+
+--*/
+
+#ifndef _EFI_LIB_PLAT_H_
+#define _EFI_LIB_PLAT_H_
+
+#define MIN_ALIGNMENT_SIZE 8
+
+VOID
+EntsInitializeLibPlatform (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+/*++
+
+Routine Description:
+
+ Initialize platform.
+
+Arguments:
+
+ ImageHandle - The image handle.
+ SystemTable - The system table.
+
+Returns:
+
+ None.
+
+--*/
+;
+
+#endif
diff --git a/uefi-sct/SctPkg/TestInfrastructure/SCT/Framework/ENTS/EasLib/Riscv64/InitPlat.c b/uefi-sct/SctPkg/TestInfrastructure/SCT/Framework/ENTS/EasLib/Riscv64/InitPlat.c
new file mode 100644
index 00000000..70a509a4
--- /dev/null
+++ b/uefi-sct/SctPkg/TestInfrastructure/SCT/Framework/ENTS/EasLib/Riscv64/InitPlat.c
@@ -0,0 +1,55 @@
+/** @file
+
+ Copyright 2006 - 2012 Unified EFI, Inc.<BR>
+ Copyright (c) 2010 - 2012, ARM Ltd. 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.
+
+**/
+/*++
+
+Module Name:
+
+ InitPlat.c
+
+Abstract:
+
+ Math routines for compatibility with native EFI library routines.
+
+--*/
+
+#include "Efi.h"
+#include "EntsLibPlat.h"
+
+VOID
+EntsInitializeLibPlatform (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+/*++
+
+Routine Description:
+
+ Initialize platform.
+
+Arguments:
+
+ ImageHandle - The image handle.
+ SystemTable - The system table.
+
+Returns:
+
+ None.
+
+--*/
+{
+ //
+ // No platform-specific initializations
+ //
+}
--
2.30.0
next prev parent reply other threads:[~2021-02-09 15:44 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-09 15:43 [edk2-test PATCHv2 0/5] Port SCT to RISCV64 Daniel Schaefer
2021-02-09 15:43 ` Daniel Schaefer [this message]
2021-02-25 2:44 ` [edk2-test PATCHv2 1/5] SctPkg: Add RISCV64 support by using Aarch64 sources Abner Chang
2021-02-09 15:43 ` [edk2-test PATCHv2 2/5] SctPkg: Adapt Aarch64 sources for Riscv64 Daniel Schaefer
2021-02-25 2:47 ` Abner Chang
2021-02-09 15:43 ` [edk2-test PATCHv2 3/5] SctPkg: Add RISCV64 build support Daniel Schaefer
2021-02-25 5:47 ` Abner Chang
2021-02-09 15:43 ` [edk2-test PATCHv2 4/5] SctPkg: Unify CC_FLAGS for all GCC platforms Daniel Schaefer
2021-02-25 6:56 ` Abner Chang
2021-03-04 3:01 ` Daniel Schaefer
2021-02-09 15:43 ` [edk2-test PATCHv2 5/5] SctPkg: Remove trailing whitespace Daniel Schaefer
2021-02-20 16:04 ` Samer El-Haj-Mahmoud
2021-02-24 9:02 ` G Edhaya Chandran
2021-02-25 3:07 ` Abner Chang
2021-03-04 3:08 ` Daniel Schaefer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210209154354.30234-2-daniel.schaefer@hpe.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox