--
Thanks,
Chao
------------------------
> -----Original Message-----> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Chao Li> Sent: Wednesday, February 9, 2022 2:56 PM> To: devel@edk2.groups.io> Cc: Michael D Kinney <michael.d.kinney@intel.com>; Liming Gao> <gaoliming@byosoft.com.cn>; Zhiguang Liu <zhiguang.liu@intel.com>; Baoqi> Zhang <zhangbaoqi@loongson.cn>> Subject: [edk2-devel] [staging/LoongArch RESEND PATCH v1 24/33]> MdePkg/BasePeCoff: Add LoongArch PE/Coff related code.>> Add LoongArch image relocation.>> Cc: Michael D Kinney <michael.d.kinney@intel.com>> Cc: Liming Gao <gaoliming@byosoft.com.cn>> Cc: Zhiguang Liu <zhiguang.liu@intel.com>>> Signed-off-by: Chao Li <lichao@loongson.cn>> Co-authored-by: Baoqi Zhang <zhangbaoqi@loongson.cn>> ---> MdePkg/Library/BasePeCoffLib/BasePeCoff.c | 3 +-> .../Library/BasePeCoffLib/BasePeCoffLib.inf | 5 +> .../Library/BasePeCoffLib/BasePeCoffLib.uni | 2 +> .../BasePeCoffLib/LoongArch/PeCoffLoaderEx.c | 132> ++++++++++++++++++> 4 files changed, 141 insertions(+), 1 deletion(-)> create mode 100644> MdePkg/Library/BasePeCoffLib/LoongArch/PeCoffLoaderEx.c>> diff --git a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c> b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c> index 6d8d9faeb8..97a8aaf8c7 100644> --- a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c> +++ b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c> @@ -1,6 +1,6 @@> /** @file> Base PE/COFF loader supports loading any PE32/PE32+ or TE image, but> - only supports relocating IA32, x64, IPF, ARM, RISC-V and EBC images.> + only supports relocating IA32, x64, IPF, ARM, RISC-V, LoongArch and EBC> images.>> Caution: This file requires additional review when modified.> This library will have external input - PE/COFF image.> @@ -18,6 +18,7 @@> Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>> Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>> Portions Copyright (c) 2020, Hewlett Packard Enterprise Development LP.> All rights reserved.<BR>> + Portions Copyright (c) 2022, Loongson Technology Corporation Limited. All> rights reserved.<BR>> SPDX-License-Identifier: BSD-2-Clause-Patent>> **/> diff --git a/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf> b/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf> index 110b6d5a09..3b8b8eb191 100644> --- a/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf> +++ b/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf> @@ -4,6 +4,7 @@> # The IA32 version library support loading IA32, X64 and EBC PE/COFF images.> # The X64 version library support loading IA32, X64 and EBC PE/COFF images.> # The RISC-V version library support loading RISC-V images.> +# The LoongArch version library support loading LoongArch images.> #> # Caution: This module requires additional review when modified.> # This library will have external input - PE/COFF image.> @@ -13,6 +14,7 @@> # Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>> # Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>> # Portions Copyright (c) 2020, Hewlett Packard Enterprise Development LP.> All rights reserved.<BR>> +# Portions Copyright (c) 2022, Loongson Technology Corporation Limited. All> rights reserved.<BR>> #> # SPDX-License-Identifier: BSD-2-Clause-Patent> #> @@ -46,6 +48,9 @@> [Sources.RISCV64]> RiscV/PeCoffLoaderEx.c>> +[Sources.LOONGARCH64]> + LoongArch/PeCoffLoaderEx.c> +> [Packages]> MdePkg/MdePkg.dec>> diff --git a/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.uni> b/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.uni> index 55417029f2..1f731344e1 100644> --- a/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.uni> +++ b/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.uni> @@ -5,6 +5,7 @@> // The IA32 version library support loading IA32, X64 and EBC PE/COFF> images.> // The X64 version library support loading IA32, X64 and EBC PE/COFF images.> // The RISC-V version library support loading RISC-V32 and RISC-V64 PE/COFF> images.> +// The LoongArch version library support loading LoongArch32 and> LoongArch64 PE/COFF images.> //> // Caution: This module requires additional review when modified.> // This library will have external input - PE/COFF image.> @@ -14,6 +15,7 @@> // Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>> // Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>> // Portions Copyright (c) 2020, Hewlett Packard Enterprise Development LP.> All rights reserved.<BR>> +// Portions Copyright (c) 2022, Loongson Technology Corporation Limited.> All rights reserved.<BR>> //> // SPDX-License-Identifier: BSD-2-Clause-Patent> //> diff --git a/MdePkg/Library/BasePeCoffLib/LoongArch/PeCoffLoaderEx.c> b/MdePkg/Library/BasePeCoffLib/LoongArch/PeCoffLoaderEx.c> new file mode 100644> index 0000000000..ec572c2dd6> --- /dev/null> +++ b/MdePkg/Library/BasePeCoffLib/LoongArch/PeCoffLoaderEx.c> @@ -0,0 +1,132 @@> +/** @file> + PE/Coff loader for LoongArch PE image> +> + Copyright (c) 2022, Loongson Technology Corporation Limited. All rights> reserved.<BR>> +> + SPDX-License-Identifier: BSD-2-Clause-Patent> +**/> +> +#include "BasePeCoffLibInternals.h"> +#include <Library/BaseLib.h>> +> +/**> + Performs an LoongArch specific relocation fixup and is a no-op on other> + instruction sets.> +> + @param Reloc Pointer to the relocation record.> + @param Fixup Pointer to the address to fix up.> + @param FixupData Pointer to a buffer to log the fixups.> + @param Adjust The offset to adjust the fixup.> +> + @return Status code.> +> +**/> +RETURN_STATUS> +PeCoffLoaderRelocateImageEx (> + IN UINT16 *Reloc,> + IN OUT CHAR8 *Fixup,> + IN OUT CHAR8 **FixupData,> + IN UINT64 Adjust> + )> +{> + UINT8 RelocType;> + UINT64 Value = 0;> + UINT64 Tmp1 = 0;> + UINT64 Tmp2 = 0;> +> + RelocType = (*Reloc) >> 12;> +> + switch (RelocType) {> + case EFI_IMAGE_REL_BASED_LOONGARCH64_MARK_LA:> + Value = (*(UINT32*)Fixup & 0x1ffffe0) << 7 | /* lu12i.w 20bits from> bit5 */> + (*((UINT32*)Fixup + 1) & 0x3ffc00) >> 10; /* ori 12bits from bit10 */> + Tmp1 = *((UINT32*)Fixup + 2) & 0x1ffffe0; /* lu32i.d 20bits from bit5> */> + Tmp2 = *((UINT32*)Fixup + 3) & 0x3ffc00; /* lu52i.d 12bits from> bit10 */> + Value = Value | (Tmp1 << 27) | (Tmp2 << 42);> + Value += Adjust;Please use double back slash for the comments in the function in this file.Abner