From: "Akira Moroo" <retrage01@gmail.com>
To: devel@edk2.groups.io
Cc: afish@apple.com, ray.ni@intel.com, Akira Moroo <retrage01@gmail.com>
Subject: [RFC PATCH 3/4] EmulatorPkg/Unix/Host: Add AArch64 support
Date: Sun, 10 Oct 2021 00:49:17 +0900 [thread overview]
Message-ID: <a40af5f638c77429e21683aa80142960bab466fa.1633789833.git.retrage01@gmail.com> (raw)
In-Reply-To: <cover.1633789833.git.retrage01@gmail.com>
Since there is no difference in calling convention between the Unix host
and the UEFI environment on AArch64, it does not require gaskets. In
this commit, it defines EmulatorPkg protocols that calls the host
functions without gaskets and adds AArch64 specific stack switch logic.
Signed-off-by: Akira Moroo <retrage01@gmail.com>
---
EmulatorPkg/Unix/Host/AArch64/Gasket.c | 50 +++++++++++
EmulatorPkg/Unix/Host/AArch64/SwitchStack.S | 42 +++++++++
EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c | 37 ++++++++
EmulatorPkg/Unix/Host/BlockIo.c | 26 ++++++
EmulatorPkg/Unix/Host/EmuThunk.c | 29 ++++++
EmulatorPkg/Unix/Host/Host.c | 32 +++++++
EmulatorPkg/Unix/Host/Host.inf | 5 +-
EmulatorPkg/Unix/Host/LinuxPacketFilter.c | 38 ++++++++
EmulatorPkg/Unix/Host/PosixFileSystem.c | 94 +++++++++++++++++++-
EmulatorPkg/Unix/Host/Pthreads.c | 30 ++++++-
EmulatorPkg/Unix/Host/X11GraphicsWindow.c | 26 +++++-
11 files changed, 405 insertions(+), 4 deletions(-)
create mode 100644 EmulatorPkg/Unix/Host/AArch64/Gasket.c
create mode 100644 EmulatorPkg/Unix/Host/AArch64/SwitchStack.S
diff --git a/EmulatorPkg/Unix/Host/AArch64/Gasket.c b/EmulatorPkg/Unix/Host/AArch64/Gasket.c
new file mode 100644
index 0000000000..69a728d408
--- /dev/null
+++ b/EmulatorPkg/Unix/Host/AArch64/Gasket.c
@@ -0,0 +1,50 @@
+/** @file
+
+ Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
+ Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "Host.h"
+
+//
+// Reverse (UNIX to EFIAPI) gaskets
+//
+
+typedef
+UINTN
+(EFIAPI *CALL_BACK_1) (
+ UINT64 Delta
+ );
+
+UINTN
+ReverseGasketUint64 (
+ UINTN CallBack,
+ UINT64 a
+ )
+{
+ return ((CALL_BACK_1) CallBack) (a);
+}
+
+//
+// UNIX ABI to EFI ABI call
+//
+
+typedef
+UINTN
+(EFIAPI *CALL_BACK_2) (
+ VOID *Context,
+ VOID *Key
+ );
+
+UINTN
+ReverseGasketUint64Uint64 (
+ VOID *CallBack,
+ VOID *Context,
+ VOID *Key
+ )
+{
+ return ((CALL_BACK_2) CallBack) (Context, Key);
+}
diff --git a/EmulatorPkg/Unix/Host/AArch64/SwitchStack.S b/EmulatorPkg/Unix/Host/AArch64/SwitchStack.S
new file mode 100644
index 0000000000..6e903b94ef
--- /dev/null
+++ b/EmulatorPkg/Unix/Host/AArch64/SwitchStack.S
@@ -0,0 +1,42 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
+# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+# Portions copyright (c) 2011 - 2013, ARM Limited. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#------------------------------------------------------------------------------
+
+.text
+.align 5
+
+GCC_ASM_EXPORT(PeiSwitchStacks)
+
+#/**
+#
+# This allows the caller to switch the stack and goes to the new entry point
+#
+# @param EntryPoint The pointer to the location to enter
+# @param Context Parameter to pass in
+# @param Context2 Parameter2 to pass in
+# @param NewStack New Location of the stack
+#
+# @return Nothing. Goes to the Entry Point passing in the new parameters
+#
+#**/
+#VOID
+#EFIAPI
+#PeiSwitchStacks (
+# SWITCH_STACK_ENTRY_POINT EntryPoint,
+# VOID *Context,
+# VOID *Context2,
+# VOID *NewStack
+# );
+#
+ASM_PFX(PeiSwitchStacks):
+ mov x29, #0
+ mov x30, x0
+ mov sp, x3
+ mov x0, x1
+ mov x1, x2
+ ret
diff --git a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
index 441f1e8d0a..f591d94f4e 100644
--- a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
+++ b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
@@ -972,6 +972,26 @@ EmuSnpReceive (
return EFI_SUCCESS;
}
+#if defined(__aarch64__)
+
+EMU_SNP_PROTOCOL gEmuSnpProtocol = {
+ EmuSnpCreateMapping,
+ EmuSnpStart,
+ EmuSnpStop,
+ EmuSnpInitialize,
+ EmuSnpReset,
+ EmuSnpShutdown,
+ EmuSnpReceiveFilters,
+ EmuSnpStationAddress,
+ EmuSnpStatistics,
+ EmuSnpMCastIpToMac,
+ EmuSnpNvData,
+ EmuSnpGetStatus,
+ EmuSnpTransmit,
+ EmuSnpReceive
+};
+
+#else
EMU_SNP_PROTOCOL gEmuSnpProtocol = {
GasketSnpCreateMapping,
@@ -990,6 +1010,8 @@ EMU_SNP_PROTOCOL gEmuSnpProtocol = {
GasketSnpReceive
};
+#endif
+
EFI_STATUS
GetInterfaceMacAddr (
EMU_SNP_PRIVATE *Private
@@ -1092,6 +1114,19 @@ EmuSnpThunkClose (
}
+#if defined(__aarch64__)
+
+EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
+ &gEmuSnpProtocolGuid,
+ NULL,
+ NULL,
+ 0,
+ EmuSnpThunkOpen,
+ EmuSnpThunkClose,
+ NULL
+};
+
+#else
EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
&gEmuSnpProtocolGuid,
@@ -1104,3 +1139,5 @@ EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
};
#endif
+
+#endif
diff --git a/EmulatorPkg/Unix/Host/BlockIo.c b/EmulatorPkg/Unix/Host/BlockIo.c
index 18368060d5..b335db192e 100644
--- a/EmulatorPkg/Unix/Host/BlockIo.c
+++ b/EmulatorPkg/Unix/Host/BlockIo.c
@@ -594,6 +594,17 @@ StdDupUnicodeToAscii (
return Ascii;
}
+#if defined(__aarch64__)
+
+EMU_BLOCK_IO_PROTOCOL gEmuBlockIoProtocol = {
+ EmuBlockIoReset,
+ EmuBlockIoReadBlocks,
+ EmuBlockIoWriteBlocks,
+ EmuBlockIoFlushBlocks,
+ EmuBlockIoCreateMapping
+};
+
+#else
EMU_BLOCK_IO_PROTOCOL gEmuBlockIoProtocol = {
GasketEmuBlockIoReset,
@@ -603,6 +614,8 @@ EMU_BLOCK_IO_PROTOCOL gEmuBlockIoProtocol = {
GasketEmuBlockIoCreateMapping
};
+#endif
+
EFI_STATUS
EmuBlockIoThunkOpen (
IN EMU_IO_THUNK_PROTOCOL *This
@@ -687,7 +700,19 @@ EmuBlockIoThunkClose (
return EFI_SUCCESS;
}
+#if defined(__aarch64__)
+EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo = {
+ &gEmuBlockIoProtocolGuid,
+ NULL,
+ NULL,
+ 0,
+ EmuBlockIoThunkOpen,
+ EmuBlockIoThunkClose,
+ NULL
+};
+
+#else
EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo = {
&gEmuBlockIoProtocolGuid,
@@ -699,4 +724,5 @@ EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo = {
NULL
};
+#endif
diff --git a/EmulatorPkg/Unix/Host/EmuThunk.c b/EmulatorPkg/Unix/Host/EmuThunk.c
index b8b0651c6a..bd78232f9c 100644
--- a/EmulatorPkg/Unix/Host/EmuThunk.c
+++ b/EmulatorPkg/Unix/Host/EmuThunk.c
@@ -396,6 +396,34 @@ SecGetNextProtocol (
return GetNextThunkProtocol (EmuBusDriver, Instance);
}
+#if defined(__aarch64__)
+
+EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
+ SecWriteStdErr,
+ SecConfigStdIn,
+ SecWriteStdOut,
+ SecReadStdIn,
+ SecPollStdIn,
+ SecMalloc,
+ SecValloc,
+ SecFree,
+ SecPeCoffGetEntryPoint,
+ SecPeCoffRelocateImageExtraAction,
+ SecPeCoffUnloadImageExtraAction,
+ SecEnableInterrupt,
+ SecDisableInterrupt,
+ QueryPerformanceFrequency,
+ QueryPerformanceCounter,
+ SecSleep,
+ SecCpuSleep,
+ SecExit,
+ SecGetTime,
+ SecSetTime,
+ SecSetTimer,
+ SecGetNextProtocol
+};
+
+#else
EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
GasketSecWriteStdErr,
@@ -422,6 +450,7 @@ EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
GasketSecGetNextProtocol
};
+#endif
VOID
SecInitThunkProtocol (
diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c
index b4e5510613..bba6282738 100644
--- a/EmulatorPkg/Unix/Host/Host.c
+++ b/EmulatorPkg/Unix/Host/Host.c
@@ -12,17 +12,49 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#define MAP_ANONYMOUS MAP_ANON
#endif
+EFI_STATUS
+SecUnixPeiAutoScan (
+ IN UINTN Index,
+ OUT EFI_PHYSICAL_ADDRESS *MemoryBase,
+ OUT UINT64 *MemorySize
+ );
+
+EFI_STATUS
+SecUnixFdAddress (
+ IN UINTN Index,
+ IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
+ IN OUT UINT64 *FdSize,
+ IN OUT EFI_PHYSICAL_ADDRESS *FixUp
+ );
+
+VOID *
+SecEmuThunkAddress (
+ VOID
+ );
+
//
// Globals
//
+#if defined(__aarch64__)
+
+EMU_THUNK_PPI mSecEmuThunkPpi = {
+ SecUnixPeiAutoScan,
+ SecUnixFdAddress,
+ SecEmuThunkAddress
+};
+
+#else
+
EMU_THUNK_PPI mSecEmuThunkPpi = {
GasketSecUnixPeiAutoScan,
GasketSecUnixFdAddress,
GasketSecEmuThunkAddress
};
+#endif
+
char *gGdbWorkingFileName = NULL;
unsigned int mScriptSymbolChangesCount = 0;
diff --git a/EmulatorPkg/Unix/Host/Host.inf b/EmulatorPkg/Unix/Host/Host.inf
index c479d2b7d0..43cb55aa21 100644
--- a/EmulatorPkg/Unix/Host/Host.inf
+++ b/EmulatorPkg/Unix/Host/Host.inf
@@ -20,7 +20,7 @@
#
# The following information is for reference only and not required by the build tools.
#
-# VALID_ARCHITECTURES = IA32 X64 EBC
+# VALID_ARCHITECTURES = IA32 X64 AARCH64 EBC
#
[Sources]
@@ -42,6 +42,9 @@
Ia32/Gasket.S # enforce 16-byte stack alignment for Mac OS X
Ia32/SwitchStack.c
+[Sources.AARCH64]
+ AArch64/Gasket.c
+ AArch64/SwitchStack.S
[Packages]
MdePkg/MdePkg.dec
diff --git a/EmulatorPkg/Unix/Host/LinuxPacketFilter.c b/EmulatorPkg/Unix/Host/LinuxPacketFilter.c
index 2b772ab884..9c696a8774 100644
--- a/EmulatorPkg/Unix/Host/LinuxPacketFilter.c
+++ b/EmulatorPkg/Unix/Host/LinuxPacketFilter.c
@@ -518,6 +518,27 @@ EmuSnpReceive (
}
+#if defined(__aarch64__)
+
+EMU_SNP_PROTOCOL gEmuSnpProtocol = {
+ EmuSnpCreateMapping,
+ EmuSnpStart,
+ EmuSnpStop,
+ EmuSnpInitialize,
+ EmuSnpReset,
+ EmuSnpShutdown,
+ EmuSnpReceiveFilters,
+ EmuSnpStationAddress,
+ EmuSnpStatistics,
+ EmuSnpMCastIpToMac,
+ EmuSnpNvData,
+ EmuSnpGetStatus,
+ EmuSnpTransmit,
+ EmuSnpReceive
+};
+
+#else
+
EMU_SNP_PROTOCOL gEmuSnpProtocol = {
GasketSnpCreateMapping,
GasketSnpStart,
@@ -535,6 +556,8 @@ EMU_SNP_PROTOCOL gEmuSnpProtocol = {
GasketSnpReceive
};
+#endif
+
EFI_STATUS
EmuSnpThunkOpen (
IN EMU_IO_THUNK_PROTOCOL *This
@@ -584,6 +607,19 @@ EmuSnpThunkClose (
}
+#if defined(__aarch64__)
+
+EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
+ &gEmuSnpProtocolGuid,
+ NULL,
+ NULL,
+ 0,
+ EmuSnpThunkOpen,
+ EmuSnpThunkClose,
+ NULL
+};
+
+#else
EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
&gEmuSnpProtocolGuid,
@@ -596,3 +632,5 @@ EMU_IO_THUNK_PROTOCOL gSnpThunkIo = {
};
#endif
+
+#endif
diff --git a/EmulatorPkg/Unix/Host/PosixFileSystem.c b/EmulatorPkg/Unix/Host/PosixFileSystem.c
index 0a618abcd8..4676f2f933 100644
--- a/EmulatorPkg/Unix/Host/PosixFileSystem.c
+++ b/EmulatorPkg/Unix/Host/PosixFileSystem.c
@@ -53,6 +53,51 @@ typedef struct {
EMU_EFI_FILE_PRIVATE_SIGNATURE \
)
+EFI_STATUS
+PosixFileOpen (
+ IN EFI_FILE_PROTOCOL *This,
+ OUT EFI_FILE_PROTOCOL **NewHandle,
+ IN CHAR16 *FileName,
+ IN UINT64 OpenMode,
+ IN UINT64 Attributes
+ );
+
+EFI_STATUS
+PosixFileCLose (
+ IN EFI_FILE_PROTOCOL *This
+ );
+
+EFI_STATUS
+PosixFileDelete (
+ IN EFI_FILE_PROTOCOL *This
+ );
+
+EFI_STATUS
+PosixFileRead (
+ IN EFI_FILE_PROTOCOL *This,
+ IN OUT UINTN *BufferSize,
+ OUT VOID *Buffer
+ );
+
+EFI_STATUS
+PosixFileWrite (
+ IN EFI_FILE_PROTOCOL *This,
+ IN OUT UINTN *BufferSize,
+ IN VOID *Buffer
+ );
+
+EFI_STATUS
+PosixFileGetPossition (
+ IN EFI_FILE_PROTOCOL *This,
+ OUT UINT64 *Position
+ );
+
+EFI_STATUS
+PosixFileSetPossition (
+ IN EFI_FILE_PROTOCOL *This,
+ IN UINT64 Position
+ );
+
EFI_STATUS
PosixFileGetInfo (
IN EFI_FILE_PROTOCOL *This,
@@ -69,6 +114,39 @@ PosixFileSetInfo (
IN VOID *Buffer
);
+EFI_STATUS
+PosixFileFlush (
+ IN EFI_FILE_PROTOCOL *This
+ );
+
+EFI_STATUS
+PosixOpenVolume (
+ IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
+ OUT EFI_FILE_PROTOCOL **Root
+ );
+
+#if defined(__aarch64__)
+
+EFI_FILE_PROTOCOL gPosixFileProtocol = {
+ EFI_FILE_REVISION,
+ PosixFileOpen,
+ PosixFileCLose,
+ PosixFileDelete,
+ PosixFileRead,
+ PosixFileWrite,
+ PosixFileGetPossition,
+ PosixFileSetPossition,
+ PosixFileGetInfo,
+ PosixFileSetInfo,
+ PosixFileFlush
+};
+
+EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
+ PosixOpenVolume,
+};
+
+#else
EFI_FILE_PROTOCOL gPosixFileProtocol = {
EFI_FILE_REVISION,
@@ -89,6 +167,7 @@ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
GasketPosixOpenVolume,
};
+#endif
/**
Open the root directory on a volume.
@@ -1573,6 +1652,19 @@ PosixFileSystmeThunkClose (
return EFI_SUCCESS;
}
+#if defined(__aarch64__)
+
+EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
+ &gEfiSimpleFileSystemProtocolGuid,
+ NULL,
+ NULL,
+ 0,
+ PosixFileSystmeThunkOpen,
+ PosixFileSystmeThunkClose,
+ NULL
+};
+
+#else
EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
&gEfiSimpleFileSystemProtocolGuid,
@@ -1584,4 +1676,4 @@ EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
NULL
};
-
+#endif
diff --git a/EmulatorPkg/Unix/Host/Pthreads.c b/EmulatorPkg/Unix/Host/Pthreads.c
index 025687c356..3613e4cf60 100644
--- a/EmulatorPkg/Unix/Host/Pthreads.c
+++ b/EmulatorPkg/Unix/Host/Pthreads.c
@@ -173,6 +173,20 @@ PthreadSelf (
return (UINTN)pthread_self ();
}
+#if defined(__aarch64__)
+
+EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
+ PthreadMutexLock,
+ PthreadMutexUnLock,
+ PthreadMutexTryLock,
+ PthreadMutexInit,
+ PthreadMutexDestroy,
+ PthreadCreate,
+ PthreadExit,
+ PthreadSelf
+};
+
+#else
EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
GasketPthreadMutexLock,
@@ -185,6 +199,7 @@ EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
GasketPthreadSelf
};
+#endif
EFI_STATUS
PthreadOpen (
@@ -215,6 +230,19 @@ PthreadClose (
return EFI_SUCCESS;
}
+#if defined(__aarch64__)
+
+EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
+ &gEmuThreadThunkProtocolGuid,
+ NULL,
+ NULL,
+ 0,
+ PthreadOpen,
+ PthreadClose,
+ NULL
+};
+
+#else
EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
&gEmuThreadThunkProtocolGuid,
@@ -226,4 +254,4 @@ EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
NULL
};
-
+#endif
diff --git a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
index 5325a0e35b..cff8a6f7b9 100644
--- a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
+++ b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
@@ -918,6 +918,16 @@ X11GraphicsWindowOpen (
return EFI_OUT_OF_RESOURCES;
}
+#if defined(__aarch64__)
+ Drv->GraphicsIo.Size = X11Size;
+ Drv->GraphicsIo.CheckKey = X11CheckKey;
+ Drv->GraphicsIo.GetKey = X11GetKey;
+ Drv->GraphicsIo.KeySetState = X11KeySetState;
+ Drv->GraphicsIo.RegisterKeyNotify = X11RegisterKeyNotify;
+ Drv->GraphicsIo.Blt = X11Blt;
+ Drv->GraphicsIo.CheckPointer = X11CheckPointer;
+ Drv->GraphicsIo.GetPointerState = X11GetPointerState;
+#else
Drv->GraphicsIo.Size = GasketX11Size;
Drv->GraphicsIo.CheckKey = GasketX11CheckKey;
Drv->GraphicsIo.GetKey = GasketX11GetKey;
@@ -926,6 +936,7 @@ X11GraphicsWindowOpen (
Drv->GraphicsIo.Blt = GasketX11Blt;
Drv->GraphicsIo.CheckPointer = GasketX11CheckPointer;
Drv->GraphicsIo.GetPointerState = GasketX11GetPointerState;
+#endif
Drv->key_count = 0;
@@ -1008,6 +1019,19 @@ X11GraphicsWindowClose (
return EFI_SUCCESS;
}
+#if defined(__aarch64__)
+
+EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
+ &gEmuGraphicsWindowProtocolGuid,
+ NULL,
+ NULL,
+ 0,
+ X11GraphicsWindowOpen,
+ X11GraphicsWindowClose,
+ NULL
+};
+
+#else
EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
&gEmuGraphicsWindowProtocolGuid,
@@ -1019,4 +1043,4 @@ EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
NULL
};
-
+#endif
--
2.33.0
next prev parent reply other threads:[~2021-10-09 15:50 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-09 15:49 [RFC PATCH 0/4] EmulatorPkg AArch64 Linux support retrage01
2021-10-09 15:49 ` [RFC PATCH 1/4] EmulatorPkg/Unix/Host: Fix typo Akira Moroo
2021-10-09 15:49 ` [RFC PATCH 2/4] EmulatorPkg/Sec: Add AArch64 support Akira Moroo
2021-10-09 15:49 ` Akira Moroo [this message]
2021-10-09 15:49 ` [RFC PATCH 4/4] EmulatorPkg: Add AArch64 Unix host build support Akira Moroo
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=a40af5f638c77429e21683aa80142960bab466fa.1633789833.git.retrage01@gmail.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