From: "Abner Chang" <abner.chang@hpe.com>
To: "Schaefer, Daniel" <daniel.schaefer@hpe.com>,
"devel@edk2.groups.io" <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>
Subject: Re: [edk2-test PATCHv2 1/5] SctPkg: Add RISCV64 support by using Aarch64 sources
Date: Thu, 25 Feb 2021 02:44:21 +0000 [thread overview]
Message-ID: <CS1PR8401MB1144B6EFE6D33F2F4532DE61FF9E9@CS1PR8401MB1144.NAMPRD84.PROD.OUTLOOK.COM> (raw)
In-Reply-To: <20210209154354.30234-2-daniel.schaefer@hpe.com>
Reviewed-by: Abner Chang <abner.chang@hpe.com>
> -----Original Message-----
> From: Schaefer, Daniel
> Sent: Tuesday, February 9, 2021 11:44 PM
> 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>; Chang, Abner (HPS SW/FW Technologist)
> <abner.chang@hpe.com>
> Subject: [edk2-test PATCHv2 1/5] SctPkg: Add RISCV64 support by using
> Aarch64 sources
>
> 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/EntsLib
> Plat.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++#endifdiff --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 x2diff --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++++#endifdiff --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/BlackBoxTe
> +++ st/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/BlackBoxTe
> +++ st/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/BlackBoxTe
> +++ st/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/Riscv
> +++ 64/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.++--
> */+;++#endifdiff --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/Riscv
> +++ 64/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-25 2: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 ` [edk2-test PATCHv2 1/5] SctPkg: Add RISCV64 support by using Aarch64 sources Daniel Schaefer
2021-02-25 2:44 ` Abner Chang [this message]
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=CS1PR8401MB1144B6EFE6D33F2F4532DE61FF9E9@CS1PR8401MB1144.NAMPRD84.PROD.OUTLOOK.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