Skip to content

Commit

Permalink
Merge pull request #109 from nathanchance/loongarch
Browse files Browse the repository at this point in the history
Initial LoongArch support
  • Loading branch information
nathanchance authored Jul 7, 2023
2 parents 8ffe148 + 09087cf commit c5048c4
Show file tree
Hide file tree
Showing 11 changed files with 261 additions and 36 deletions.
32 changes: 32 additions & 0 deletions boot-qemu.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
'arm32_v7',
'arm64',
'arm64be',
'loongarch',
'm68k',
'mips',
'mipsel',
Expand Down Expand Up @@ -476,6 +477,35 @@ def __init__(self):
self._initrd_arch = 'arm64be'


class LoongArchQEMURunner(QEMURunner):

def __init__(self):
super().__init__()

self.cmdline.append('console=ttyS0,115200')
self._default_kernel_path = Path('arch/loongarch/boot/vmlinuz.efi')
self._initrd_arch = 'loongarch'

bios = Path(utils.BOOT_UTILS, 'images', self._initrd_arch,
'edk2-loongarch64-code.fd')
if not bios.exists():
firmware_url = f"https://github.com/loongson/Firmware/raw/main/LoongArchVirtMachine/{bios.name}"
utils.green(
f"Downloading LoongArch firmware from {firmware_url}...")
curl_cmd = ['curl', '-LSs', '-o', bios, firmware_url]
subprocess.run(curl_cmd, check=True)

self._qemu_arch = 'loongarch64'
self._qemu_args += [
'-M', 'virt',
'-cpu', 'la464',
'-bios', bios,
'-no-reboot',
] # yapf: disable
self._ram = '2G'
self.smp = 2


class M68KQEMURunner(QEMURunner):

def __init__(self):
Expand Down Expand Up @@ -699,6 +729,7 @@ def guess_arch(kernel_arg):
'ELF 64-bit MSB executable, ARM aarch64': 'arm64be',
'ELF 64-bit LSB pie executable, ARM aarch64': 'arm64',
'ELF 64-bit MSB pie executable, ARM aarch64': 'arm64be',
'ELF 64-bit LSB executable, LoongArch': 'loongarch',
'ELF 32-bit MSB executable, Motorola m68k, 68020': 'm68k',
'ELF 32-bit MSB executable, MIPS, MIPS32': 'mips',
'ELF 32-bit LSB executable, MIPS, MIPS32': 'mipsel',
Expand Down Expand Up @@ -802,6 +833,7 @@ def parse_arguments():
'arm32_v7': ARMV7QEMURunner,
'arm64': ARM64QEMURunner,
'arm64be': ARM64BEQEMURunner,
'loongarch': LoongArchQEMURunner,
'm68k': M68KQEMURunner,
'mips': MIPSQEMURunner,
'mipsel': MIPSELQEMURunner,
Expand Down
1 change: 0 additions & 1 deletion buildroot/buildroot-2022.02.tar.gz.sha256

This file was deleted.

1 change: 1 addition & 0 deletions buildroot/buildroot-2023.02.2.tar.gz.sha256
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
44cced15a58505c93a87b215a632eba25f65560da64782fea50111f62b5ae86c buildroot-2023.02.2.tar.gz
8 changes: 8 additions & 0 deletions buildroot/loongarch.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
BR2_loongarch64=y
BR2_BINUTILS_VERSION_2_39_X=y
BR2_GCC_VERSION_12_X=y
BR2_TARGET_GENERIC_ROOT_PASSWD="root"
BR2_TARGET_GENERIC_GETTY_PORT="ttyS0"
BR2_ROOTFS_OVERLAY="../overlay-reboot"
BR2_TARGET_ROOTFS_CPIO=y
# BR2_TARGET_ROOTFS_TAR is not set
1 change: 0 additions & 1 deletion buildroot/ppc64le.config
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
BR2_powerpc64le=y
BR2_powerpc_power8=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_POWERPC64LE_POWER8_GLIBC_STABLE=y
BR2_TARGET_GENERIC_ROOT_PASSWD="root"
Expand Down
53 changes: 23 additions & 30 deletions buildroot/rebuild.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@
import shutil
import subprocess

BUILDROOT_VERSION = '2022.02'
BUILDROOT_VERSION = '2023.02.2'
SUPPORTED_ARCHES = [
'arm64',
'arm64be',
'arm',
'loongarch',
'm68k',
'mips',
'mipsel',
Expand Down Expand Up @@ -72,16 +73,17 @@ def build_image(architecture, edit_config):


def download_and_extract_buildroot():
if SRC_FOLDER.exists():
shutil.rmtree(SRC_FOLDER)
SRC_FOLDER.mkdir(parents=True)

tarball = Path(ROOT_FOLDER, f"buildroot-{BUILDROOT_VERSION}.tar.gz")
tarball.unlink(missing_ok=True)

curl_cmd = [
'curl', '-LSs', '-o', tarball,
f"https://buildroot.org/downloads/{tarball.name}"
]
subprocess.run(curl_cmd, check=True)
if not tarball.exists():
curl_cmd = [
'curl', '-LSs', '-o', tarball,
f"https://buildroot.org/downloads/{tarball.name}"
]
subprocess.run(curl_cmd, check=True)

sha256_cmd = ['sha256sum', '--quiet', '-c', f"{tarball.name}.sha256"]
subprocess.run(sha256_cmd, check=True, cwd=ROOT_FOLDER)
Expand All @@ -91,27 +93,18 @@ def download_and_extract_buildroot():
]
subprocess.run(tar_cmd, check=True)

tarball.unlink(missing_ok=True)


def download_buildroot_if_necessary():
if SRC_FOLDER.exists():
# Make support/scripts/setlocalversion do nothing because we are in a
# git repository so it will return information about this repo, not
# Buildroot
setlocalversion = Path(SRC_FOLDER, 'support/scripts/setlocalversion')
setlocalversion.write_text('', encoding='utf-8')

installed_version = subprocess.run(['make', 'print-version'],
capture_output=True,
check=True,
cwd=SRC_FOLDER,
text=True).stdout.strip()
if installed_version != BUILDROOT_VERSION:
shutil.rmtree(SRC_FOLDER)
download_and_extract_buildroot()
else:
download_and_extract_buildroot()
if (patches := list(ROOT_FOLDER.glob('*.patch'))):
for patch in patches:
patch_cmd = [
'patch', '--directory', SRC_FOLDER, '--input', patch,
'--strip', '1'
]
try:
subprocess.run(patch_cmd, check=True)
except subprocess.CalledProcessError as err:
raise RuntimeError(
f"{patch} did not apply to Buildroot {BUILDROOT_VERSION}, does it need to be updated?"
) from err


def release_images():
Expand Down Expand Up @@ -161,7 +154,7 @@ def parse_arguments():

architectures = SUPPORTED_ARCHES if 'all' in args.architectures else args.architectures

download_buildroot_if_necessary()
download_and_extract_buildroot()
for arch in architectures:
build_image(arch, args.edit_config)

Expand Down
2 changes: 1 addition & 1 deletion buildroot/riscv.config
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
BR2_riscv=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_RISCV64_LP64D_GLIBC_STABLE=y
BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_RISCV64_LP64D_UCLIBC_STABLE=y
BR2_TARGET_GENERIC_ROOT_PASSWD="root"
BR2_TARGET_GENERIC_GETTY_PORT="ttyS0"
BR2_ROOTFS_OVERLAY="../overlay-poweroff"
Expand Down
5 changes: 2 additions & 3 deletions buildroot/s390.config
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
BR2_s390x=y
BR2_KERNEL_HEADERS_4_4=y
BR2_BINUTILS_VERSION_2_35_X=y
BR2_GCC_VERSION_10_X=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_S390X_Z13_GLIBC_STABLE=y
BR2_TARGET_GENERIC_ROOT_PASSWD="root"
BR2_TARGET_GENERIC_GETTY_PORT="ttyS0"
BR2_ROOTFS_OVERLAY="../overlay-poweroff"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
From git@z Thu Jan 1 00:00:00 1970
Subject: [PATCH v3] buildroot: Add basic support for LoongArch architecture
(toolchain only)
From: Zhiwei Duan <duanzhiwei@loongson.cn>
Date: Mon, 12 Dec 2022 16:34:57 +0800
Message-Id: <20221212083457.8308-1-duanzhiwei@loongson.cn>
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit

With this patch, the buildroot can compile the rootfs of the loongarch architecture.
Both external toolchain and buildroot toolchain can compile rootfs.
buildroot toolchain: binutils>=2.38 GCC>=12 Linux>=5.19 glibc>=2.36.

Signed-off-by: Zhiwei Duan <duanzhiwei@loongson.cn>
Link: https://lore.kernel.org/r/20221212083457.8308-1-duanzhiwei@loongson.cn
---
arch/Config.in | 16 +++++++++++
arch/Config.in.loongarch | 52 ++++++++++++++++++++++++++++++++++++
package/glibc/Config.in | 1 +
support/gnuconfig/config.sub | 11 ++++++--
toolchain/Config.in | 2 +-
5 files changed, 79 insertions(+), 3 deletions(-)
create mode 100644 arch/Config.in.loongarch

diff --git a/arch/Config.in b/arch/Config.in
index 1c0c400a98..88f805bb1e 100644
--- a/arch/Config.in
+++ b/arch/Config.in
@@ -251,6 +251,17 @@ config BR2_xtensa
http://en.wikipedia.org/wiki/Xtensa
http://www.tensilica.com/

+config BR2_loongarch64
+ bool "LOONGARCH64 (little endian)"
+ select BR2_ARCH_IS_64
+ select BR2_USE_MMU
+ help
+ LOONGARCH is a RISC microprocessor from LOONGARCH Technologies. Little
+ endian.
+ https://www.loongson.cn/
+ #http://en.wikipedia.org/wiki/MIPS_Technologies
+
+
endchoice

# For some architectures or specific cores, our internal toolchain
@@ -414,6 +425,11 @@ if BR2_xtensa
source "arch/Config.in.xtensa"
endif

+if BR2_loongarch64
+source "arch/Config.in.loongarch"
+endif
+
+
# Set up target binary format
choice
prompt "Target Binary Format"
diff --git a/arch/Config.in.loongarch b/arch/Config.in.loongarch
new file mode 100644
index 0000000000..bf86490cff
--- /dev/null
+++ b/arch/Config.in.loongarch
@@ -0,0 +1,52 @@
+# loongarch config
+config BR2_LOONGARCH_CPU_LOONGARCH64
+ bool
+ select BR2_LOONGARCH_NAN_LEGACY
+
+choice
+ prompt "Target Architecture Variant"
+ default BR2_loongarch_64 if BR2_loongarch64
+ depends on BR2_loongarch64
+ help
+ Specific CPU variant to use
+
+config BR2_loongarch_64
+ bool "Generic LOONGARCH64"
+ depends on BR2_ARCH_IS_64
+ select BR2_LOONGARCH_CPU_LOONGARCH64
+endchoice
+
+config BR2_LOONGARCH_NAN_LEGACY
+ bool
+
+#config BR2_GCC_TARGET_NAN
+# default "legacy" if BR2_LOONGARCH_NAN_LEGACY
+
+config BR2_ARCH
+ default "loongarch64" if BR2_loongarch64
+
+config BR2_NORMALIZED_ARCH
+ default "loongarch"
+
+config BR2_ENDIAN
+ default "LITTLE" if BR2_loongarch64
+
+config BR2_GCC_TARGET_ARCH
+ default "loongarch64" if BR2_loongarch_64
+
+config BR2_READELF_ARCH_NAME
+ default "LoongArch"
+
+config BR2_LOONGARCH_SOFT_FLOAT
+ bool "Use soft-float"
+ #default y
+ select BR2_SOFT_FLOAT
+ help
+ If your target CPU does not have a Floating Point Unit (FPU)
+ or a kernel FPU emulator, but you still wish to support
+ floating point functions, then everything will need to be
+ compiled with soft floating point support (-msoft-float).
+
+
+# vim: ft=kconfig
+# -*- mode:kconfig; -*-
diff --git a/package/glibc/Config.in b/package/glibc/Config.in
index 71c50504ac..d8325610f5 100644
--- a/package/glibc/Config.in
+++ b/package/glibc/Config.in
@@ -21,6 +21,7 @@ config BR2_PACKAGE_GLIBC_ARCH_SUPPORTS
default y if BR2_microblaze
default y if BR2_nios2
default y if BR2_arc && BR2_ARC_ATOMIC_EXT
+ default y if BR2_loongarch64
depends on !BR2_powerpc_SPE
depends on BR2_RISCV_ISA_RVA || !BR2_riscv
depends on BR2_USE_MMU
diff --git a/support/gnuconfig/config.sub b/support/gnuconfig/config.sub
index 9bc49a7e92..c751ddf15a 100755
--- a/support/gnuconfig/config.sub
+++ b/support/gnuconfig/config.sub
@@ -164,7 +164,7 @@ case $1 in
basic_os=$field2
;;
# Manufacturers
- dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+ dec* | mips* | loongarch* | sequent* | encore* | pc533* | sgi* | sony* \
| att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
| unicom* | ibm* | next | hp | isi* | apollo | altos* \
| convergent* | ncr* | news | 32* | 3600* | 3100* \
@@ -632,6 +632,11 @@ case $1 in
basic_machine=ymp-cray
basic_os=unicos
;;
+ loongarch)
+ basic_machine=loongarch-loongson
+ basic_os=
+ ;;
+
*)
basic_machine=$1
basic_os=
@@ -1211,6 +1216,7 @@ case $cpu-$vendor in
| mipsisa64sr71k | mipsisa64sr71kel \
| mipsr5900 | mipsr5900el \
| mipstx39 | mipstx39el \
+ | loongarch | loongarch64 \
| mmix \
| mn10200 | mn10300 \
| moxie \
@@ -1253,7 +1259,8 @@ case $cpu-$vendor in
| x86 | x86_64 | xc16x | xgate | xps100 \
| xstormy16 | xtensa* \
| ymp \
- | z8k | z80)
+ | z8k | z80 \
+ | loongarch | loongarch64)
;;

*)
diff --git a/toolchain/Config.in b/toolchain/Config.in
index 4947ab3aae..a4939af6fb 100644
--- a/toolchain/Config.in
+++ b/toolchain/Config.in
@@ -24,7 +24,7 @@ config BR2_TOOLCHAIN_USES_UCLIBC
# architectures
select BR2_TOOLCHAIN_HAS_UCONTEXT if BR2_ARM_CPU_HAS_ARM || BR2_i386 \
|| BR2_mips || BR2_mipsel || BR2_mips64 || BR2_mips64el \
- || BR2_sparc || BR2_x86_64
+ || BR2_sparc || BR2_x86_64 || BR2_loongarch64
select BR2_TOOLCHAIN_SUPPORTS_PIE if !BR2_m68k && !BR2_microblaze && !BR2_STATIC_LIBS

config BR2_TOOLCHAIN_USES_MUSL
--
2.20.1

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

1 change: 1 addition & 0 deletions images/loongarch/.release
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
20230609-194440
Binary file added images/loongarch/rootfs.cpio.zst
Binary file not shown.

0 comments on commit c5048c4

Please sign in to comment.