From nobody Mon Feb 9 11:05:51 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+93892+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+93892+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1663299405; cv=none; d=zohomail.com; s=zohoarc; b=EY0+SQSgUlEyHqL94ZbtpqEK7MyeCIzvtd0+byzzqYPgY8eWL7pSbU3jy6T0t+tlXR9nZsesTaPKpVO6KFtl79+O009Y1+kng/+3803EjLMnBEOiB6iyUrBsFk7Oah97I8BZ4nljTUTG0lWdKfVzxHLY755Hf8BHUBe8XeMMfcM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1663299405; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=OAroBBeYgTRyzOktFJydAmBNXvxC7njWbUHVasFJ1kQ=; b=nAj5Vhhdig5ndMfjr9UmGuMkk6bxy1OU7z6gRc34yUsu8TdouMP8p8ttcz0rXpC+5G1dCS7oVfxuXp93AJYeByf1GwIUkZKl5dS5A/TRNBqSIVU2Nh/NMpLI4HbqRK/8JktVK6AKxaV5NFyVjbNlRshmJ9Vpwrdw9fkX2rl51bI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+93892+1787277+3901457@groups.io Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1663299405558667.1708951894165; Thu, 15 Sep 2022 20:36:45 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id R592YY1788612xu538shUQfK; Thu, 15 Sep 2022 20:36:45 -0700 X-Received: from loongson.cn (loongson.cn [114.242.206.163]) by mx.groups.io with SMTP id smtpd.web12.2041.1663299401037147215 for ; Thu, 15 Sep 2022 20:36:43 -0700 X-Received: from localhost.localdomain (unknown [10.2.5.185]) by localhost.localdomain (Coremail) with SMTP id AQAAf8DxPGtB7yNj984aAA--.41628S4; Fri, 16 Sep 2022 11:36:36 +0800 (CST) From: "xianglai" To: devel@edk2.groups.io Cc: quic_llindhol@quicinc.com, michael.d.kinney@intel.com, maobibo@loongson.cn Subject: [edk2-devel] [edk2-platforms][PATCH V2 02/16] Platform/Loongson: Support SEC And Add Readme.md Date: Fri, 16 Sep 2022 11:36:19 +0800 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-CM-TRANSID: AQAAf8DxPGtB7yNj984aAA--.41628S4 X-Coremail-Antispam: 1UD129KBjvAXoWfAr47XrW3JFy7ZryUCw1fCrg_yoW5KFWkAo WxWFWIkw48Gr1rX3WUGFnrJrW8AF1Fqa15tr1FqayDGF4Yyrn8ta98J3s7Gw15Awn8J3Z8 G34rGaykJFW7ta4kn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjDUYxBIdaVFxhVjvjDU0xZFpf9x0zRUUUUUUUUU= X-CM-SenderInfo: 5ol0xt5qjotxo6or00hjvr0hdfq/ Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,lixianglai@loongson.cn X-Gm-Message-State: diEPibYvKXaeptpKVcx9Yny5x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1663299405; bh=yHmRIr4fMHjjQA/rzGQJH/sfN0s4xHbtvidmJ3/pkgQ=; h=Cc:Date:From:Reply-To:Subject:To; b=wD73E0Jxc1SdhKL8uNNAyfhbd6UMEpvuHCFhOPL3fuLBvoc0RR1V4CjbyV5xbnvtwjd x9yqY3IRDo89VM3lKTy5+xB/IJbxd2wciU3FD7YaQl4fpBEguIIJMivGxOJ596PfoGbsS UVogAvDk4m429BDlcduMTgfvi0PRG8WbnSY= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1663299406312100013 Content-Type: text/plain; charset="utf-8" Add SEC Code And Readme.md for LoongArchQemu REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4054 Signed-off-by: xianglai li Signed-off-by: xianglai li --- Maintainers.txt | 4 + .../Include/LoongArchAsmMacro.h | 23 + .../Loongson/LoongArchQemuPkg/Loongson.dec | 38 ++ .../Loongson/LoongArchQemuPkg/Loongson.dsc | 133 +++++ .../Loongson/LoongArchQemuPkg/Loongson.fdf | 53 ++ .../LoongArchQemuPkg/Loongson.fdf.inc | 21 + Platform/Loongson/LoongArchQemuPkg/Readme.md | 59 ++ .../LoongArchQemuPkg/Sec/LoongArch64/Start.S | 76 +++ .../Loongson/LoongArchQemuPkg/Sec/SecMain.c | 510 ++++++++++++++++++ .../Loongson/LoongArchQemuPkg/Sec/SecMain.inf | 49 ++ Readme.md | 9 + 11 files changed, 975 insertions(+) create mode 100644 Platform/Loongson/LoongArchQemuPkg/Include/LoongArchAsm= Macro.h create mode 100644 Platform/Loongson/LoongArchQemuPkg/Loongson.dec create mode 100644 Platform/Loongson/LoongArchQemuPkg/Loongson.dsc create mode 100644 Platform/Loongson/LoongArchQemuPkg/Loongson.fdf create mode 100644 Platform/Loongson/LoongArchQemuPkg/Loongson.fdf.inc create mode 100644 Platform/Loongson/LoongArchQemuPkg/Readme.md create mode 100644 Platform/Loongson/LoongArchQemuPkg/Sec/LoongArch64/Star= t.S create mode 100644 Platform/Loongson/LoongArchQemuPkg/Sec/SecMain.c create mode 100644 Platform/Loongson/LoongArchQemuPkg/Sec/SecMain.inf diff --git a/Maintainers.txt b/Maintainers.txt index 700ca0af60..8921d6b4e1 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -329,6 +329,10 @@ M: Bob Feng M: Liming Gao R: Yuwei Chen =20 +Loongson platforms +F: Platform/Loongson/ +M: xianglai li + Marvell platforms and silicon F: Platform/Marvell/ F: Platform/SolidRun/Armada80x0McBin/ diff --git a/Platform/Loongson/LoongArchQemuPkg/Include/LoongArchAsmMacro.h= b/Platform/Loongson/LoongArchQemuPkg/Include/LoongArchAsmMacro.h new file mode 100644 index 0000000000..366d4308e8 --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Include/LoongArchAsmMacro.h @@ -0,0 +1,23 @@ +/** @file + LoongArch ASM macro definition. + + Copyright (c) 2021, Loongson Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + + **/ + +#ifndef LOONGARCH_ASM_MACRO_H_ +#define LOONGARCH_ASM_MACRO_H_ + +#include + +#define _ASM_FUNC(Name, Section) \ + .global Name ; \ + .section #Section, "ax" ; \ + .type Name, %function ; \ + Name: + +#define ASM_FUNC(Name) _ASM_FUNC(ASM_PFX(Name), .text. ## Name) + +#endif // __LOONGARCH_ASM_MACRO_H__ diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.dec b/Platform/Loo= ngson/LoongArchQemuPkg/Loongson.dec new file mode 100644 index 0000000000..248b668fd1 --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.dec @@ -0,0 +1,38 @@ +## @file +# +# Copyright (c) 2021 Loongson Technology Corporation Limited. All rights = reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION =3D 0x00010005 + PACKAGE_NAME =3D LoongArchQemuPkg + PACKAGE_GUID =3D b51d765a-41da-45fc-a537-de3ee785c0f6 + PACKAGE_VERSION =3D 0.1 + +##########################################################################= ###### +# +# Include Section - list of Include Paths that are provided by this packag= e. +# Comments are used for Keywords and Module Types. +# +# Supported Module Types: +# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_D= RIVER DXE_SAL_DRIVER UEFI_DRIVER UEFI_APPLICATION +# +##########################################################################= ###### +[Includes.common] + Include # Root include for the package + +[Guids] + gLoongArchQemuPkgTokenSpaceGuid =3D { 0x0e0383ce, 0x0151, 0x4d01, { 0x8= 0, 0x0e, 0x3f, 0xef, 0x8b, 0x27, 0x6d, 0x52 } } + +[PcdsFixedAtBuild, PcdsDynamic] + gLoongArchQemuPkgTokenSpaceGuid.PcdFlashPeiFvBase|0x0|UINT64|0x00000003 + gLoongArchQemuPkgTokenSpaceGuid.PcdFlashPeiFvSize|0x0|UINT32|0x00000004 + gLoongArchQemuPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize|0|UINT3= 2|0x00000016 + gLoongArchQemuPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|0|UI= NT32|0x00000017 + gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamBase|0|UINT64|0x0000001c + gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamSize|0|UINT32|0x0000001d + gLoongArchQemuPkgTokenSpaceGuid.PcdFlashSecFvBase|0x0|UINT64|0x00000028 + gLoongArchQemuPkgTokenSpaceGuid.PcdFlashSecFvSize|0x0|UINT32|0x00000029 diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc b/Platform/Loo= ngson/LoongArchQemuPkg/Loongson.dsc new file mode 100644 index 0000000000..f23fed77e6 --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc @@ -0,0 +1,133 @@ +## @file +# +# Copyright (c) 2021 Loongson Technology Corporation Limited. All rights = reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +##########################################################################= ###### +# +# Defines Section - statements that will be processed to create a Makefile. +# +##########################################################################= ##### +[Defines] + PLATFORM_NAME =3D LoongArchQemu + PLATFORMPKG_NAME =3D LoongArchQemu + PLATFORM_GUID =3D 7926ea52-b0dc-4ee8-ac63-341eebd84ed4 + PLATFORM_VERSION =3D 0.1 + DSC_SPECIFICATION =3D 0x00010005 + OUTPUT_DIRECTORY =3D Build/$(PLATFORM_NAME) + SUPPORTED_ARCHITECTURES =3D LOONGARCH64 + BUILD_TARGETS =3D DEBUG|RELEASE + SKUID_IDENTIFIER =3D DEFAULT + FLASH_DEFINITION =3D Platform/Loongson/LoongArchQemuPkg/Lo= ongson.fdf + TTY_TERMINAL =3D FALSE + +##########################################################################= ## +# +# Defines for default states. These can be changed on the command line. +# -D FLAG=3DVALUE +##########################################################################= ## +[BuildOptions] + GCC:RELEASE_*_*_CC_FLAGS =3D -DSPEEDUP + + # + # Disable deprecated APIs. + # + GCC:*_*_*_CC_FLAGS =3D -D DISABLE_NEW_DEPRECATED_INTERFACES + + +[BuildOptions.LOONGARCH64.EDKII.SEC] + *_*_*_CC_FLAGS =3D + +#[BuildOptions.common.EDKII.DXE_CORE,BuildOptions.common.EDKII.DXE_DRIVER,= BuildOptions.common.EDKII.UEFI_DRIVER,BuildOptions.common.EDKII.UEFI_APPLIC= ATION] +# GCC:*_*_*_DLINK_FLAGS =3D -z common-page-size=3D0x1000 + +[BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER] + GCC:*_*_LOONGARCH64_DLINK_FLAGS =3D -z common-page-size=3D0x10000 + +##########################################################################= ###### +# +# Library Class section - list of all Library Classes needed by this Platf= orm. +# +##########################################################################= ###### + +!include MdePkg/MdeLibs.dsc.inc + +[LibraryClasses.common] + PcdLib | MdePkg/Library/BasePcdLibNull/BasePcd= LibNull.inf + PrintLib | MdePkg/Library/BasePrintLib/BasePrint= Lib.inf + BaseMemoryLib | MdePkg/Library/BaseMemoryLib/BaseMemo= ryLib.inf + + + BaseLib | MdePkg/Library/BaseLib/BaseLib.inf + PeCoffLib | MdePkg/Library/BasePeCoffLib/BasePeCo= ffLib.inf + PeCoffGetEntryPointLib | MdePkg/Library/BasePeCoffGetEntryPoin= tLib/BasePeCoffGetEntryPointLib.inf + IoLib | MdePkg/Library/BaseIoLibIntrinsic/Bas= eIoLibIntrinsic.inf + SerialPortLib | Platform/Loongson/LoongArchQemuPkg/Li= brary/SerialPortLib/SerialPortLib.inf + DebugPrintErrorLevelLib | MdePkg/Library/BaseDebugPrintErrorLev= elLib/BaseDebugPrintErrorLevelLib.inf + PeCoffExtraActionLib | MdePkg/Library/BasePeCoffExtraActionL= ibNull/BasePeCoffExtraActionLibNull.inf + DebugAgentLib | MdeModulePkg/Library/DebugAgentLibNul= l/DebugAgentLibNull.inf + + DebugLib | MdePkg/Library/BaseDebugLibSerialPort= /BaseDebugLibSerialPort.inf + + + + +##########################################################################= ###### +# +# Pcd Section - list of all EDK II PCD Entries defined by this Platform. +# +##########################################################################= ###### +[PcdsFixedAtBuild] +## BaseLib ## + gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength | 1= 000000 + gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength | 1= 000000 + gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength | 1= 000000 + + gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel | 0= x8000004F + # DEBUG_INIT 0x00000001 // Initialization + # DEBUG_WARN 0x00000002 // Warnings + # DEBUG_LOAD 0x00000004 // Load events + # DEBUG_FS 0x00000008 // EFI File system + # DEBUG_POOL 0x00000010 // Alloc & Free (pool) + # DEBUG_PAGE 0x00000020 // Alloc & Free (page) + # DEBUG_INFO 0x00000040 // Informational debug messages + # DEBUG_DISPATCH 0x00000080 // PEI/DXE/SMM Dispatchers + # DEBUG_VARIABLE 0x00000100 // Variable + # DEBUG_BM 0x00000400 // Boot Manager + # DEBUG_BLKIO 0x00001000 // BlkIo Driver + # DEBUG_NET 0x00004000 // Network Io Driver + # DEBUG_UNDI 0x00010000 // UNDI Driver + # DEBUG_LOADFILE 0x00020000 // LoadFile + # DEBUG_EVENT 0x00080000 // Event messages + # DEBUG_GCD 0x00100000 // Global Coherency Database changes + # DEBUG_CACHE 0x00200000 // Memory range cachability changes + # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may + # DEBUG_ERROR 0x80000000 // Error + +!if $(TARGET) =3D=3D RELEASE + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask | 0= x21 +!else + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask | 0= x2f +!endif + # DEBUG_ASSERT_ENABLED 0x01 + # DEBUG_PRINT_ENABLED 0x02 + # DEBUG_CODE_ENABLED 0x04 + # CLEAR_MEMORY_ENABLED 0x08 + # ASSERT_BREAKPOINT_ENABLED 0x10 + # ASSERT_DEADLOOP_ENABLED 0x20 + + gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress | 0= x90000000 + gLoongArchQemuPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize | 0= x10000 + gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamBase | 0= x90010000 + gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamSize | 0= x10000 + + +[Components] + + # + # SEC Phase modules + # + Platform/Loongson/LoongArchQemuPkg/Sec/SecMain.inf diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf b/Platform/Loo= ngson/LoongArchQemuPkg/Loongson.fdf new file mode 100644 index 0000000000..128b3843db --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf @@ -0,0 +1,53 @@ +## @file +# +# Copyright (c) 2021 Loongson Technology Corporation Limited. All rights = reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +##########################################################################= ########################### +[Defines] +!include Loongson.fdf.inc + +##########################################################################= ########################### +[FD.QEMU_EFI] +BaseAddress =3D $(FD_BASE_ADDRESS) +Size =3D $(FD_SIZE) +ErasePolarity =3D 1 +BlockSize =3D $(BLOCK_SIZE) +NumBlocks =3D $(FD_BLOCKS) + +$(SECFV_OFFSET)|$(SECFV_SIZE) +gLoongArchQemuPkgTokenSpaceGuid.PcdFlashSecFvBase|gLoongArchQemuPkgTokenSp= aceGuid.PcdFlashSecFvSize +FV =3D SECFV + +##########################################################################= ########################### +[FV.SECFV] +FvNameGuid =3D 587d4265-5e71-41da-9c35-4258551f1e22 +BlockSize =3D $(BLOCK_SIZE) +FvAlignment =3D 16 +ERASE_POLARITY =3D 1 +MEMORY_MAPPED =3D TRUE +STICKY_WRITE =3D TRUE +LOCK_CAP =3D TRUE +LOCK_STATUS =3D TRUE +WRITE_DISABLED_CAP =3D TRUE +WRITE_ENABLED_CAP =3D TRUE +WRITE_STATUS =3D TRUE +WRITE_LOCK_CAP =3D TRUE +WRITE_LOCK_STATUS =3D TRUE +READ_DISABLED_CAP =3D TRUE +READ_ENABLED_CAP =3D TRUE +READ_STATUS =3D TRUE +READ_LOCK_CAP =3D TRUE +READ_LOCK_STATUS =3D TRUE + +INF Platform/Loongson/LoongArchQemuPkg/Sec/SecMain.inf + +##########################################################################= ########################### +[Rule.Common.SEC] + FILE SEC =3D $(NAMED_GUID) { + TE TE Align =3D Auto $(INF_OUTPUT)/$(MODULE_NAME).efi + UI STRING =3D"$(MODULE_NAME)" Optional + } diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf.inc b/Platform= /Loongson/LoongArchQemuPkg/Loongson.fdf.inc new file mode 100644 index 0000000000..a1a2d537e3 --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf.inc @@ -0,0 +1,21 @@ +## @file +# +# Copyright (c) 2021 Loongson Technology Corporation Limited. All rights = reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +DEFINE BLOCK_SIZE =3D 0x1000 + +##########################################################################= ## +# fd total +DEFINE FD_BASE_ADDRESS =3D 0x1c000000 +DEFINE FD_BLOCKS =3D 0x400 +DEFINE FD_SIZE =3D 0x400000 + +##########################################################################= ## +#flash code layout +#Set Sec base address and size in flash +DEFINE SECFV_OFFSET =3D 0x00000000 +DEFINE SECFV_SIZE =3D 0x00010000 diff --git a/Platform/Loongson/LoongArchQemuPkg/Readme.md b/Platform/Loongs= on/LoongArchQemuPkg/Readme.md new file mode 100644 index 0000000000..b0d172f829 --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Readme.md @@ -0,0 +1,59 @@ +# Introduction + + This document provides the guideline to build UEFI firmware for Qemu of = LoongArch. + + LoongArch is the general processor architecture of Loongson. + + We can get the latest LoongArch documents or LoongArch tools at https://= github.com/loongson/. + +# How to build (X86 Linux Environment) + + 1. Install LoongArch cross-tools on X86 machines. + Download cross-tools from https://github.com/loongson/ ,Then config cr= oss-tools env. + For Example: + + $ wget https://github.com/loongson/build-tools/releases/latest/downloa= d/loongarch64-clfs-20211202-cross-tools.tar.xz + $ tar -vxf loongarch64-clfs-20211202-cross-tools.tar.xz -C /opt + $ export PATH=3D/opt/cross-tools/bin:$PATH + + 2. Follow edk2-platforms/Readme.md to obtaining source code,And config b= uild env. + For Example: + + $ export WORKSPACE=3D/work/git/tianocore + $ mkdir -p $WORKSPACE + $ cd $WORKSPACE + $ git clone https://github.com/tianocore/edk2.git + $ git submodule update --init + $ git clone https://github.com/tianocore/edk2-platforms.git + $ git submodule update --init + $ git clone https://github.com/tianocore/edk2-non-osi.git + $ export PACKAGES_PATH=3D$PWD/edk2:$PWD/edk2-platforms:$PWD/edk2-non-o= si + + 3. Config cross compiler prefix. + For Example: + + $ export GCC5_LOONGARCH64_PREFIX=3Dloongarch64-unknown-linux-gnu- + + 4.Set up the build environment And build BaseTool. + For Example: + + $. edk2/edksetup.sh + $make -C edk2/BaseTools + + 5.Build platform. + For Exmaple: + + $build --buildtarget=3DDEBUG --tagname=3DGCC5 --arch=3DLOONGARCH64 --= platform=3DPlatform/Loongson/LoongArchQemuPkg/Loongson.dsc + + After a successful build, the resulting images can be found in `Build/{P= latform Name}/{TARGET}_{TOOL_CHAIN_TAG}/FV/QEMU_EFI.fd`. + + A compile script is provided here: + + #!/bin/bash + export WORKSPACE=3D/work/git/tianocore + export PACKAGES_PATH=3D$WORKSPACE/edk2:$WORKSPACE/edk2-platforms + export GCC5_LOONGARCH64_PREFIX=3Dloongarch64-unknown-linux-gnu- + . edk2/edksetup.sh + make -C edk2/BaseTools + build --buildtarget=3DDEBUG --tagname=3DGCC5 --arch=3DLOONGARCH64 --p= latform=3DPlatform/Loongson/LoongArchQemuPkg/Loongson.dsc + diff --git a/Platform/Loongson/LoongArchQemuPkg/Sec/LoongArch64/Start.S b/P= latform/Loongson/LoongArchQemuPkg/Sec/LoongArch64/Start.S new file mode 100644 index 0000000000..48c044fe28 --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Sec/LoongArch64/Start.S @@ -0,0 +1,76 @@ +#-------------------------------------------------------------------------= ----- +# +# Start for LoongArch +# +# Copyright (c) 2021 Loongson Technology Corporation Limited. All rights r= eserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# @par Glossary: +# - CSR - CPU Status Register +# - EBASE - Exception Base Address +#-------------------------------------------------------------------------= ----- +#ifndef __ASSEMBLY__ +#define __ASSEMBLY__ +#endif + +#include +#include "LoongArchAsmMacro.h" + + .text + .globl _ModuleEntryPoint +_ModuleEntryPoint: + + /* configure reset ebase */ + li.d T0, 0x1c000000 + csrwr T0, LOONGARCH_CSR_EBASE + + /*disable interrupt*/ + li.d T0, (1 << 2) + csrxchg ZERO, T0, LOONGARCH_CSR_CRMD + + /* read physical cpu number id */ + csrrd T0, LOONGARCH_CSR_CPUNUM + andi T0, T0, 0x3ff + li.d A0, BOOTCORE_ID //0 + bne T0, A0, slave_main + +call_centry: + /*call C function make sure parameter true*/ + li.d A1, FixedPcdGet64(PcdSecPeiTempRamBase) + FixedPcdGet32(PcdSec= PeiTempRamSize) # stack base + li.d A0, FixedPcdGet64(PcdFlashPeiFvBase) # PEI Fv base + move SP, A1 + addi.d SP, SP, -0x8 + bl SecCoreStartupWithStack + +slave_main: + # clear mailbox + li.d T1, LOONGSON_CSR_MAIL_BUF0 + iocsrwr.d ZERO, T1 + + # enable IPI interrupt + li.d T0, (1 << 12) + csrxchg T0, T0, LOONGARCH_CSR_ECFG + +1: + # wait for wakeup + idle 0 + nop + iocsrrd.w T0, T1 + beqz T0, 1b + + # read and clear ipi interrupt + li.d T1, LOONGSON_IOCSR_IPI_STATUS + iocsrrd.w T0, T1 + li.d T1, LOONGSON_IOCSR_IPI_CLEAR + iocsrwr.w T0, T1 + + # disable IPI interrupt + li.d T0, (1 << 12) + csrxchg ZERO, T0, LOONGARCH_CSR_ECFG + + # read mail buf and jump to specified entry + li.d T1, LOONGSON_CSR_MAIL_BUF0 + iocsrrd.d T0, T1 + or RA, T0, ZERO + jirl ZERO, RA, 0x0 diff --git a/Platform/Loongson/LoongArchQemuPkg/Sec/SecMain.c b/Platform/Lo= ongson/LoongArchQemuPkg/Sec/SecMain.c new file mode 100644 index 0000000000..73d3a2c1a3 --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Sec/SecMain.c @@ -0,0 +1,510 @@ +/** @file + Main SEC phase code. Transitions to PEI. + + Copyright (c) 2021 Loongson Technology Corporation Limited. All rights r= eserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/** + temporary memory to permanent memory and do stack switching. + + @param[in] PeiServices Pointer to the PEI Services Table. + @param[in] TemporaryMemoryBase Temporary Memory Base address. + @param[in] PermanentMemoryBase Permanent Memory Base address. + @param[in] CopySize The size of memory that needs to be migrated. + + @retval EFI_SUCCESS Migration successful. +**/ +EFI_STATUS +EFIAPI +TemporaryRamMigration ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, + IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, + IN UINTN CopySize + ); + +EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mTemporaryRamSupportPpi =3D { + TemporaryRamMigration +}; + +EFI_PEI_PPI_DESCRIPTOR mPrivateDispatchTable[] =3D { + { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiTemporaryRamSupportPpiGuid, + &mTemporaryRamSupportPpi + }, +}; + +/** + Locates a section within a series of sections + with the specified section type. + + The Instance parameter indicates which instance of the section + type to return. (0 is first instance, 1 is second...) + + @param[in] Sections The sections to search + @param[in] SizeOfSections Total size of all sections + @param[in] SectionType The section type to locate + @param[in] Instance The section instance number + @param[out] FoundSection The FFS section if found + + @retval EFI_SUCCESS The file and section was found + @retval EFI_NOT_FOUND The file and section was not found + @retval EFI_VOLUME_CORRUPTED The firmware volume was corrupted + +**/ +EFI_STATUS +FindFfsSectionInstance ( + IN VOID *Sections, + IN UINTN SizeOfSections, + IN EFI_SECTION_TYPE SectionType, + IN UINTN Instance, + OUT EFI_COMMON_SECTION_HEADER **FoundSection + ) +{ + EFI_PHYSICAL_ADDRESS CurrentAddress; + UINT32 Size; + EFI_PHYSICAL_ADDRESS EndOfSections; + EFI_COMMON_SECTION_HEADER *Section; + EFI_PHYSICAL_ADDRESS EndOfSection; + + // + // Loop through the FFS file sections within the PEI Core FFS file + // + EndOfSection =3D (EFI_PHYSICAL_ADDRESS) (UINTN) Sections; + EndOfSections =3D EndOfSection + SizeOfSections; + for (;;) { + if (EndOfSection =3D=3D EndOfSections) { + break; + } + CurrentAddress =3D (EndOfSection + 3) & ~(3ULL); + if (CurrentAddress >=3D EndOfSections) { + return EFI_VOLUME_CORRUPTED; + } + + Section =3D (EFI_COMMON_SECTION_HEADER*) (UINTN) CurrentAddress; + + Size =3D SECTION_SIZE (Section); + if (Size < sizeof (*Section)) { + return EFI_VOLUME_CORRUPTED; + } + + EndOfSection =3D CurrentAddress + Size; + if (EndOfSection > EndOfSections) { + return EFI_VOLUME_CORRUPTED; + } + + // + // Look for the requested section type + // + if (Section->Type =3D=3D SectionType) { + if (Instance =3D=3D 0) { + *FoundSection =3D Section; + return EFI_SUCCESS; + } else { + Instance--; + } + } + } + + return EFI_NOT_FOUND; +} + +/** + Locates a section within a series of sections + with the specified section type. + + @param[in] Sections The sections to search + @param[in] SizeOfSections Total size of all sections + @param[in] SectionType The section type to locate + @param[out] FoundSection The FFS section if found + + @retval EFI_SUCCESS The file and section was found + @retval EFI_NOT_FOUND The file and section was not found + @retval EFI_VOLUME_CORRUPTED The firmware volume was corrupted + +**/ +EFI_STATUS +FindFfsSectionInSections ( + IN VOID *Sections, + IN UINTN SizeOfSections, + IN EFI_SECTION_TYPE SectionType, + OUT EFI_COMMON_SECTION_HEADER **FoundSection + ) +{ + return FindFfsSectionInstance ( + Sections, + SizeOfSections, + SectionType, + 0, + FoundSection + ); +} + +/** + Locates a FFS file with the specified file type and a section + within that file with the specified section type. + + @param[in] Fv The firmware volume to search + @param[in] FileType The file type to locate + @param[in] SectionType The section type to locate + @param[out] FoundSection The FFS section if found + + @retval EFI_SUCCESS The file and section was found + @retval EFI_NOT_FOUND The file and section was not found + @retval EFI_VOLUME_CORRUPTED The firmware volume was corrupted + +**/ +EFI_STATUS +FindFfsFileAndSection ( + IN EFI_FIRMWARE_VOLUME_HEADER *Fv, + IN EFI_FV_FILETYPE FileType, + IN EFI_SECTION_TYPE SectionType, + OUT EFI_COMMON_SECTION_HEADER **FoundSection + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS CurrentAddress; + EFI_PHYSICAL_ADDRESS EndOfFirmwareVolume; + EFI_FFS_FILE_HEADER *File; + UINT32 Size; + EFI_PHYSICAL_ADDRESS EndOfFile; + + if (Fv->Signature !=3D EFI_FVH_SIGNATURE) { + DEBUG ((DEBUG_ERROR, "FV at %p does not have FV header signature\n", F= v)); + return EFI_VOLUME_CORRUPTED; + } + + CurrentAddress =3D (EFI_PHYSICAL_ADDRESS) (UINTN) Fv; + EndOfFirmwareVolume =3D CurrentAddress + Fv->FvLength; + + // + // Loop through the FFS files in the Boot Firmware Volume + // + for (EndOfFile =3D CurrentAddress + Fv->HeaderLength; ; ) { + + CurrentAddress =3D (EndOfFile + 7) & ~(7ULL); + if (CurrentAddress > EndOfFirmwareVolume) { + return EFI_VOLUME_CORRUPTED; + } + + File =3D (EFI_FFS_FILE_HEADER*) (UINTN) CurrentAddress; + Size =3D *(UINT32*) File->Size & 0xffffff; + if (Size < (sizeof (*File) + sizeof (EFI_COMMON_SECTION_HEADER))) { + return EFI_VOLUME_CORRUPTED; + } + + EndOfFile =3D CurrentAddress + Size; + if (EndOfFile > EndOfFirmwareVolume) { + return EFI_VOLUME_CORRUPTED; + } + + // + // Look for the request file type + // + if (File->Type !=3D FileType) { + continue; + } + + Status =3D FindFfsSectionInSections ( + (VOID*) (File + 1), + (UINTN) EndOfFile - (UINTN) (File + 1), + SectionType, + FoundSection + ); + if (!EFI_ERROR (Status) + || (Status =3D=3D EFI_VOLUME_CORRUPTED)) + { + return Status; + } + } +} + +/** + Locates the PEI Core entry point address + + @param[in] Fv The firmware volume to search + @param[out] PeiCoreEntryPoint The entry point of the PEI Core image + + @retval EFI_SUCCESS The file and section was found + @retval EFI_NOT_FOUND The file and section was not found + @retval EFI_VOLUME_CORRUPTED The firmware volume was corrupted + +**/ +EFI_STATUS +FindPeiCoreImageBaseInFv ( + IN EFI_FIRMWARE_VOLUME_HEADER *Fv, + OUT EFI_PHYSICAL_ADDRESS *PeiCoreImageBase + ) +{ + EFI_STATUS Status; + EFI_COMMON_SECTION_HEADER *Section; + + Status =3D FindFfsFileAndSection ( + Fv, + EFI_FV_FILETYPE_PEI_CORE, + EFI_SECTION_PE32, + &Section + ); + if (EFI_ERROR (Status)) { + Status =3D FindFfsFileAndSection ( + Fv, + EFI_FV_FILETYPE_PEI_CORE, + EFI_SECTION_TE, + &Section + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Unable to find PEI Core image\n")); + return Status; + } + } + + *PeiCoreImageBase =3D (EFI_PHYSICAL_ADDRESS)(UINTN)(Section + 1); + return EFI_SUCCESS; +} + +/** + Find and return Pei Core entry point. + + It also find SEC and PEI Core file debug information. It will report the= m if + remote debug is enabled. + +**/ +VOID +FindAndReportEntryPoints ( + IN EFI_FIRMWARE_VOLUME_HEADER **BootFirmwareVolumePtr, + OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS PeiCoreImageBase =3D 0; + PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; + + Status =3D FindPeiCoreImageBaseInFv (*BootFirmwareVolumePtr, &PeiCoreIma= geBase); + ASSERT (Status =3D=3D EFI_SUCCESS); + + ZeroMem ((VOID *) &ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT)); + + // + // Report PEI Core debug information when remote debug is enabled + // + ImageContext.ImageAddress =3D (EFI_PHYSICAL_ADDRESS)(UINTN)PeiCoreImageB= ase; + ImageContext.PdbPointer =3D PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) I= mageContext.ImageAddress); + PeCoffLoaderRelocateImageExtraAction (&ImageContext); + + // + // Find PEI Core entry point + // + Status =3D PeCoffLoaderGetEntryPoint ((VOID *) (UINTN) PeiCoreImageBase,= (VOID**) PeiCoreEntryPoint); + if (EFI_ERROR (Status)) { + *PeiCoreEntryPoint =3D 0; + } + + return; +} + +/** + Find the peicore entry point and jump to the entry point to execute. + + @param[in] Context The first input parameter of InitializeDebugAgent(= ). + +**/ +VOID +EFIAPI +SecStartupPhase2 ( + IN VOID *Context + ) +{ + EFI_SEC_PEI_HAND_OFF *SecCoreData; + EFI_FIRMWARE_VOLUME_HEADER *BootFv; + EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint; + + SecCoreData =3D (EFI_SEC_PEI_HAND_OFF *) Context; + + // + // Find PEI Core entry point. It will report SEC and Pei Core debug info= rmation if remote debug + // is enabled. + // + BootFv =3D (EFI_FIRMWARE_VOLUME_HEADER *)SecCoreData->BootFirmwareVolume= Base; + FindAndReportEntryPoints (&BootFv, &PeiCoreEntryPoint); + SecCoreData->BootFirmwareVolumeBase =3D BootFv; + SecCoreData->BootFirmwareVolumeSize =3D (UINTN) BootFv->FvLength; + + DEBUG ((DEBUG_INFO, "Find Pei EntryPoint=3D%p\n", PeiCoreEntryPoint)); + + // + // Transfer the control to the PEI core + // + DEBUG ((DEBUG_INFO, "SecStartupPhase2 %p\n", PeiCoreEntryPoint)); + + (*PeiCoreEntryPoint) (SecCoreData, (EFI_PEI_PPI_DESCRIPTOR *)&mPrivateDi= spatchTable); + + // + // If we get here then the PEI Core returned, which is not recoverable. + // + ASSERT (FALSE); + CpuDeadLoop (); +} +/** + Entry point to the C language phase of SEC. initialize some temporary me= mory and set up the stack, + the control is transferred to this function. + + @param[in] BootFv The pointer to the PEI FV in memory. + @param[in] TopOfCurrentStack Top of Current Stack. +**/ +VOID +EFIAPI +SecCoreStartupWithStack ( + IN EFI_FIRMWARE_VOLUME_HEADER *BootFv, + IN VOID *TopOfCurrentStack + ) +{ + EFI_SEC_PEI_HAND_OFF SecCoreData; + EFI_FIRMWARE_VOLUME_HEADER *BootPeiFv =3D (EFI_FIRMWARE_VOLUME_HEA= DER*) BootFv; + + DEBUG ((DEBUG_INFO, "Entering C environment\n")); + + ProcessLibraryConstructorList (NULL, NULL); + + DEBUG ((DEBUG_INFO, + "SecCoreStartupWithStack (0x%lx, 0x%lx)\n", + (UINTN)BootFv, + (UINTN)TopOfCurrentStack + )); + DEBUG ((DEBUG_INFO, + "(0x%lx, 0x%lx)\n", + (UINTN) (PcdGet64 (PcdSecPeiTempRamBase)), + (UINTN) (PcdGet32 (PcdSecPeiTempRamSize)) + )); + + // |-------------| <-- TopOfCurrentStack + // | Stack | 32k + // |-------------| + // | Heap | 32k + // |-------------| <-- SecCoreData.TemporaryRamBase + // + + ASSERT ((UINTN) (PcdGet64 (PcdSecPeiTempRamBase) + + PcdGet32 (PcdSecPeiTempRamSize)) =3D=3D + (UINTN) TopOfCurrentStack); + + // + // Initialize SEC hand-off state + // + SecCoreData.DataSize =3D sizeof (EFI_SEC_PEI_HAND_OFF); + + SecCoreData.TemporaryRamSize =3D (UINTN) PcdGet32 (PcdSecPeiTempRa= mSize); + SecCoreData.TemporaryRamBase =3D (VOID *) PcdGet64 (PcdSecPeiTempR= amBase); + + SecCoreData.PeiTemporaryRamBase =3D SecCoreData.TemporaryRamBase; + SecCoreData.PeiTemporaryRamSize =3D SecCoreData.TemporaryRamSize >> 1; + + SecCoreData.StackBase =3D (UINT8 *)SecCoreData.TemporaryRam= Base + SecCoreData.PeiTemporaryRamSize; + SecCoreData.StackSize =3D SecCoreData.TemporaryRamSize >> 1; + + SecCoreData.BootFirmwareVolumeBase =3D BootPeiFv; + SecCoreData.BootFirmwareVolumeSize =3D (UINTN) BootPeiFv->FvLength; + + DEBUG ((DEBUG_INFO, + "&SecCoreData.BootFirmwareVolumeBase=3D%lx SecCoreData.BootFirmwareVol= umeBase=3D%lx\n", + (UINT64)&(SecCoreData.BootFirmwareVolumeBase), + (UINT64) (SecCoreData.BootFirmwareVolumeBase))); + DEBUG ((DEBUG_INFO, + "&SecCoreData.BootFirmwareVolumeSize=3D%lx SecCoreData.BootFirmwareVol= umeSize=3D%lx\n", + (UINT64)&(SecCoreData.BootFirmwareVolumeSize), + (UINT64) (SecCoreData.BootFirmwareVolumeSize))); + + // + // Initialize Debug Agent to support source level debug in SEC/PEI phase= s before memory ready. + // + InitializeDebugAgent (DEBUG_AGENT_INIT_PREMEM_SEC, NULL, NULL); + SecStartupPhase2 (&SecCoreData); +} + +/** + temporary memory to permanent memory and do stack switching. + + @param[in] PeiServices Pointer to the PEI Services Table. + @param[in] TemporaryMemoryBase Temporary Memory Base address. + @param[in] PermanentMemoryBase Permanent Memory Base address. + @param[in] CopySize The size of memory that needs to be migrated. + + @retval EFI_SUCCESS Migration successful. +**/ +EFI_STATUS +EFIAPI +TemporaryRamMigration ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, + IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, + IN UINTN CopySize + ) +{ + VOID *OldHeap; + VOID *NewHeap; + VOID *OldStack; + VOID *NewStack; + BASE_LIBRARY_JUMP_BUFFER JumpBuffer; + + DEBUG ((DEBUG_INFO, + "TemporaryRamMigration (0x%Lx, 0x%Lx, 0x%Lx)\n", + TemporaryMemoryBase, + PermanentMemoryBase, + (UINT64)CopySize + )); + + OldHeap =3D (VOID*) (UINTN)TemporaryMemoryBase; + NewHeap =3D (VOID*) ((UINTN)PermanentMemoryBase + (CopySize >> 1)); + + OldStack =3D (VOID*) ((UINTN)TemporaryMemoryBase + (CopySize >> 1)); + NewStack =3D (VOID*) (UINTN)PermanentMemoryBase; + +#if 0 + DebugAgentContext.HeapMigrateOffset =3D (UINTN)NewHeap - (UINTN)OldHeap; + DebugAgentContext.StackMigrateOffset =3D (UINTN)NewStack - (UINTN)OldSta= ck; + + OldStatus =3D SaveAndSetDebugTimerInterrupt (FALSE); + InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, (VOID *) &DebugAgent= Context, NULL); +#endif + + // + // Migrate Heap + // + CopyMem (NewHeap, OldHeap, CopySize >> 1); + + // + // Migrate Stack + // + CopyMem (NewStack, OldStack, CopySize >> 1); + + // Use SetJump ()/LongJump () to switch to a new stack. + // + if (SetJump (&JumpBuffer) =3D=3D 0) { + JumpBuffer.SP =3D JumpBuffer.SP - (UINTN)OldStack + (UINTN)NewStack ; + LongJump (&JumpBuffer, (UINTN)-1); + } + + //SaveAndSetDebugTimerInterrupt (OldStatus); + + return EFI_SUCCESS; +} diff --git a/Platform/Loongson/LoongArchQemuPkg/Sec/SecMain.inf b/Platform/= Loongson/LoongArchQemuPkg/Sec/SecMain.inf new file mode 100644 index 0000000000..03d4ea5b00 --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Sec/SecMain.inf @@ -0,0 +1,49 @@ +## @file +# SEC Driver +# +# Copyright (c) 2021 Loongson Technology Corporation Limited. All rights = reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D SecMain + FILE_GUID =3D 57d02d4f-5a5d-4bfa-b7d6-ba0a4d2c72ce + MODULE_TYPE =3D SEC + VERSION_STRING =3D 1.0 + +[Sources.LOONGARCH64] + LoongArch64/Start.S + SecMain.c + +[Packages] + Platform/Loongson/LoongArchQemuPkg/Loongson.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + BaseMemoryLib + PcdLib + DebugAgentLib + IoLib + PeCoffLib + PeCoffGetEntryPointLib + PeCoffExtraActionLib + +[Ppis] + gEfiTemporaryRamSupportPpiGuid # PPI ALWAYS_PRODUCED + +[FixedPcd] + gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamBase + gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamSize + gLoongArchQemuPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress + gLoongArchQemuPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize + + gLoongArchQemuPkgTokenSpaceGuid.PcdFlashSecFvBase + gLoongArchQemuPkgTokenSpaceGuid.PcdFlashSecFvSize + gLoongArchQemuPkgTokenSpaceGuid.PcdFlashPeiFvBase + gLoongArchQemuPkgTokenSpaceGuid.PcdFlashPeiFvSize diff --git a/Readme.md b/Readme.md index 62876b4b7d..5ae58bca20 100644 --- a/Readme.md +++ b/Readme.md @@ -57,6 +57,7 @@ IA32 | i?86-linux-gnu-* _or_ x86_64-linux-= gnu- IPF | ia64-linux-gnu X64 | x86_64-linux-gnu- RISCV64 | riscv64-unknown-elf- +LOONGARCH64 | loongarch64-unknown-linux-gnu- =20 \* i386, i486, i586 or i686 =20 @@ -71,6 +72,11 @@ RISC-V open source community provides GCC toolchains for [riscv64-unknown-elf](https://github.com/riscv/riscv-gnu-toolchain) compiled to run on x86 Linux. =20 +### GCC for LoongArch +Loonson open source community provides GCC toolchains for +[loongarch64-unknown-elf](https://github.com/loongson/build-tools) +compiled to run on x86 Linux + ### clang Clang does not require separate cross compilers, but it does need a target-specific binutils. These are included with any prepackaged GCC tool= chain @@ -257,6 +263,9 @@ For more information, see the ##### Minnowboard Max/Turbot based on Intel Valleyview2 SoC * [Minnowboard Max](Platform/Intel/Vlv2TbltDevicePkg) =20 +## Loongson +* [LoongArchQemu](Platform/Loongson/LoongArchQemuPkg) + ## Marvell * [Armada 70x0](Platform/Marvell/Armada70x0Db) * [Armada 80x0](Platform/Marvell/Armada80x0Db) --=20 2.31.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#93892): https://edk2.groups.io/g/devel/message/93892 Mute This Topic: https://groups.io/mt/93715811/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-