From mboxrd@z Thu Jan 1 00:00:00 1970 From: Romain Naour Date: Sun, 8 Jan 2017 00:09:53 +0100 Subject: [Buildroot] [PATCH] arch: add support for OpenRISC architecture In-Reply-To: <20170107084803.GA6034@waldemar-brodkorb.de> References: <20170107084803.GA6034@waldemar-brodkorb.de> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: buildroot@busybox.net Hi Waldemar, Le 07/01/2017 ? 09:48, Waldemar Brodkorb a ?crit : > Add a sample defconfig which can be used to create a system for Qemu. > Openrisc community is getting more active recently and tries > to add missing patches upstream to gcc/gdb. I'm wondering if all Binutils version (2.25.1, 2.26.1 and 2.27) can be used on openRISC? Have you considered to use the openrisc fork [1] ? [1] https://github.com/openrisc/binutils-gdb > > Signed-off-by: Waldemar Brodkorb > --- > Makefile | 1 + > arch/Config.in | 11 +++++++++++ > arch/Config.in.or1k | 5 +++++ > board/qemu/or1k/linux-4.9.config | 29 ++++++++++++++++++++++++++++ > board/qemu/or1k/patches/linux/kallsyms.patch | 24 +++++++++++++++++++++++ > board/qemu/or1k/patches/linux/ld-or1k.patch | 12 ++++++++++++ > board/qemu/or1k/readme.txt | 9 +++++++++ > configs/qemu_or1k_defconfig | 22 +++++++++++++++++++++ > package/gcc/Config.in.host | 15 +++++++++++--- > package/gcc/gcc.hash | 2 ++ > package/gcc/gcc.mk | 6 ++++-- > package/uclibc/Config.in | 5 +++-- > toolchain/toolchain-buildroot/Config.in | 8 ++++---- > 13 files changed, 138 insertions(+), 11 deletions(-) > create mode 100644 arch/Config.in.or1k > create mode 100644 board/qemu/or1k/linux-4.9.config > create mode 100644 board/qemu/or1k/patches/linux/kallsyms.patch > create mode 100644 board/qemu/or1k/patches/linux/ld-or1k.patch > create mode 100644 board/qemu/or1k/readme.txt > create mode 100644 configs/qemu_or1k_defconfig > > diff --git a/Makefile b/Makefile > index b80b9e1..b99996e 100644 > --- a/Makefile > +++ b/Makefile > @@ -420,6 +420,7 @@ KERNEL_ARCH := $(shell echo "$(ARCH)" | sed -e "s/-.*//" \ > -e s/arm.*/arm/ -e s/sa110/arm/ \ > -e s/aarch64.*/arm64/ \ > -e s/bfin/blackfin/ \ > + -e s/or1k/openrisc/ \ > -e s/parisc64/parisc/ \ > -e s/powerpc64.*/powerpc/ \ > -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ > diff --git a/arch/Config.in b/arch/Config.in > index d59cbd7..7149b2c 100644 > --- a/arch/Config.in > +++ b/arch/Config.in > @@ -159,6 +159,13 @@ config BR2_nios2 > http://www.altera.com/ > http://en.wikipedia.org/wiki/Nios_II > > +config BR2_or1k > + bool "OpenRISC" > + select BR2_ARCH_HAS_MMU_MANDATORY > + help > + OpenRISC is a free and open processor for embedded system. > + http://openrisc.io > + > config BR2_powerpc > bool "PowerPC" > select BR2_ARCH_HAS_MMU_MANDATORY > @@ -378,6 +385,10 @@ if BR2_nios2 > source "arch/Config.in.nios2" > endif > > +if BR2_or1k > +source "arch/Config.in.or1k" > +endif > + > if BR2_powerpc || BR2_powerpc64 || BR2_powerpc64le > source "arch/Config.in.powerpc" > endif > diff --git a/arch/Config.in.or1k b/arch/Config.in.or1k > new file mode 100644 > index 0000000..dba64a6 > --- /dev/null > +++ b/arch/Config.in.or1k > @@ -0,0 +1,5 @@ > +config BR2_ARCH > + default "or1k" > + > +config BR2_ENDIAN > + default "BIG" > diff --git a/board/qemu/or1k/linux-4.9.config b/board/qemu/or1k/linux-4.9.config > new file mode 100644 > index 0000000..5ba03c3 > --- /dev/null > +++ b/board/qemu/or1k/linux-4.9.config > @@ -0,0 +1,29 @@ > +CONFIG_BLK_DEV_INITRD=y > +CONFIG_INITRAMFS_SOURCE="${BR_BINARIES_DIR}/rootfs.cpio" > +CONFIG_OPENRISC_BUILTIN_DTB="or1ksim" > +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set > +CONFIG_NET=y > +CONFIG_PACKET=y > +CONFIG_UNIX=y > +CONFIG_INET=y > +CONFIG_IP_MULTICAST=y > +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set > +# CONFIG_INET_XFRM_MODE_TUNNEL is not set > +# CONFIG_INET_XFRM_MODE_BEET is not set > +# CONFIG_IPV6 is not set > +# CONFIG_WIRELESS is not set > +CONFIG_DEVTMPFS=y > +CONFIG_DEVTMPFS_MOUNT=y > +CONFIG_NETDEVICES=y > +CONFIG_ETHOC=y > +# CONFIG_WLAN is not set > +# CONFIG_INPUT_MOUSEDEV is not set > +# CONFIG_INPUT_KEYBOARD is not set > +# CONFIG_INPUT_MOUSE is not set > +# CONFIG_SERIO is not set > +CONFIG_SERIAL_8250=y > +CONFIG_SERIAL_8250_CONSOLE=y > +CONFIG_SERIAL_OF_PLATFORM=y > +# CONFIG_HWMON is not set > +# CONFIG_VGA_CONSOLE is not set > +# CONFIG_USB_SUPPORT is not set > diff --git a/board/qemu/or1k/patches/linux/kallsyms.patch b/board/qemu/or1k/patches/linux/kallsyms.patch > new file mode 100644 > index 0000000..fe6f9c0 > --- /dev/null > +++ b/board/qemu/or1k/patches/linux/kallsyms.patch Maybe sort the kernel patches with a number. > @@ -0,0 +1,24 @@ > +From: https://lkml.org/lkml/2016/12/31/13 > + > +The build robot reports: > + > + .tmp_kallsyms1.o: In function `kallsyms_relative_base': > +>> (.rodata+0x8a18): undefined reference to `_text' > + > +This is when using 'make alldefconfig'. Adding this _text symbol to mark > +the start of the kernel as in other architecture fixes this. > + > +Signed-off-by: Stafford Horne Missing your SoB line here. > + > +diff -Nur linux-4.9.orig/arch/openrisc/kernel/vmlinux.lds.S linux-4.9/arch/openrisc/kernel/vmlinux.lds.S > +--- linux-4.9.orig/arch/openrisc/kernel/vmlinux.lds.S 2016-12-11 20:17:54.000000000 +0100 > ++++ linux-4.9/arch/openrisc/kernel/vmlinux.lds.S 2017-01-01 12:13:43.039107518 +0100 > +@@ -38,6 +38,8 @@ > + /* Read-only sections, merged into text segment: */ > + . = LOAD_BASE ; > + > ++ _text = .; > ++ > + /* _s_kernel_ro must be page aligned */ > + . = ALIGN(PAGE_SIZE); > + _s_kernel_ro = .; > diff --git a/board/qemu/or1k/patches/linux/ld-or1k.patch b/board/qemu/or1k/patches/linux/ld-or1k.patch > new file mode 100644 > index 0000000..264f916 > --- /dev/null > +++ b/board/qemu/or1k/patches/linux/ld-or1k.patch Missing patch description and your SoB line here. > @@ -0,0 +1,12 @@ > +diff -Nur linux-4.4.5.orig/arch/openrisc/kernel/vmlinux.lds.S linux-4.4.5/arch/openrisc/kernel/vmlinux.lds.S > +--- linux-4.4.5.orig/arch/openrisc/kernel/vmlinux.lds.S 2016-03-10 00:35:58.000000000 +0100 > ++++ linux-4.4.5/arch/openrisc/kernel/vmlinux.lds.S 2016-03-16 09:21:07.933535532 +0100 > +@@ -30,7 +30,7 @@ > + #include > + #include > + > +-OUTPUT_FORMAT("elf32-or32", "elf32-or32", "elf32-or32") > ++OUTPUT_FORMAT("elf32-or1k", "elf32-or1k", "elf32-or1k") > + jiffies = jiffies_64 + 4; > + > + SECTIONS > diff --git a/board/qemu/or1k/readme.txt b/board/qemu/or1k/readme.txt > new file mode 100644 > index 0000000..53c66ad > --- /dev/null > +++ b/board/qemu/or1k/readme.txt > @@ -0,0 +1,9 @@ > +Run the emulation with: > + > + qemu-system-or32 -kernel output/images/vmlinux -nographic > + > +The login prompt will appear in the terminal that started Qemu. > + > +Ethernet support is not working, yet. > + > +Tested with QEMU 2.8.0. > diff --git a/configs/qemu_or1k_defconfig b/configs/qemu_or1k_defconfig > new file mode 100644 > index 0000000..111afc2 > --- /dev/null > +++ b/configs/qemu_or1k_defconfig > @@ -0,0 +1,22 @@ > +# Architecture > +BR2_or1k=y > + > +# System > +BR2_TARGET_GENERIC_GETTY_PORT="ttyS0" > + > +# Patches > +BR2_GLOBAL_PATCH_DIR="board/qemu/or1k/patches" > + > +# Filesystem > +# BR2_TARGET_ROOTFS_TAR is not set > +BR2_TARGET_ROOTFS_INITRAMFS=y > + > +# Linux headers same as kernel, a 4,9 series > +BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_9=y > + > +# Kernel > +BR2_LINUX_KERNEL=y > +BR2_LINUX_KERNEL_CUSTOM_VERSION=y > +BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="4.9" > +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y > +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/qemu/or1k/linux-4.9.config" > diff --git a/package/gcc/Config.in.host b/package/gcc/Config.in.host > index d8fbc18..eb41aa4 100644 > --- a/package/gcc/Config.in.host > +++ b/package/gcc/Config.in.host > @@ -3,6 +3,7 @@ comment "GCC Options" > choice > prompt "GCC compiler Version" > default BR2_GCC_VERSION_ARC if BR2_arc > + default BR2_GCC_VERSION_OR1K if BR2_or1k > default BR2_GCC_VERSION_5_X > help > Select the version of gcc you wish to use. > @@ -10,7 +11,7 @@ choice > config BR2_GCC_VERSION_4_8_X > bool "gcc 4.8.x" > # Broken or unsupported architectures > - depends on !BR2_microblaze && !BR2_arc \ > + depends on !BR2_microblaze && !BR2_arc && !BR2_or1k \ > && !BR2_powerpc64le && !BR2_nios2 && !BR2_bfin > # Broken or unsupported ARM cores > depends on !BR2_cortex_a12 && !BR2_cortex_a17 && !BR2_ARM_CPU_ARMV8 > @@ -36,10 +37,16 @@ choice > depends on BR2_arc > select BR2_TOOLCHAIN_GCC_AT_LEAST_6 > > + config BR2_GCC_VERSION_OR1K > + bool "gcc or1k (5.x)" > + # Only supported architecture > + depends on BR2_or1k > + select BR2_TOOLCHAIN_GCC_AT_LEAST_5 > + > config BR2_GCC_VERSION_4_9_X > bool "gcc 4.9.x" > # Broken or unsupported architectures > - depends on !BR2_arc && !BR2_bfin > + depends on !BR2_arc && !BR2_bfin && !BR2_or1k > # Broken or unsupported ARM cores > depends on !BR2_cortex_a17 && !BR2_cortex_a72 > # Unsupported MIPS cores > @@ -60,7 +67,7 @@ choice > config BR2_GCC_VERSION_5_X > bool "gcc 5.x" > # Broken or unsupported architectures > - depends on !BR2_arc && !BR2_bfin > + depends on !BR2_arc && !BR2_bfin && !BR2_or1k > # musl ppc64 unsupported > depends on !(BR2_TOOLCHAIN_USES_MUSL && (BR2_powerpc64 || BR2_powerpc64le)) > # Unsupported MIPS cores > @@ -75,6 +82,7 @@ choice > # Broken or unsupported architectures > depends on !BR2_arc > depends on !BR2_microblaze > + depends on !BR2_or1k > # Unsupported MIPS cores > depends on !BR2_mips_m6250 && !BR2_mips_p6600 > select BR2_TOOLCHAIN_GCC_AT_LEAST_6 > @@ -99,6 +107,7 @@ config BR2_GCC_VERSION > default "5.4.0" if BR2_GCC_VERSION_5_X > default "6.3.0" if BR2_GCC_VERSION_6_X > default "arc-2016.09-release" if BR2_GCC_VERSION_ARC > + default "musl-5.4.0" if BR2_GCC_VERSION_OR1K It's weird to have musl in the gcc archive name. What's about or1k-5.4.0 branch or the release archive [2] ? [2] https://github.com/openrisc/or1k-gcc/releases/tag/or1k-5.3.0-release Otherwise looks good. I'm able to boot the system using Qemu v2.7.0. Best regards, Romain > > config BR2_EXTRA_GCC_CONFIG_OPTIONS > string "Additional gcc options" > diff --git a/package/gcc/gcc.hash b/package/gcc/gcc.hash > index 1988237..4376db4 100644 > --- a/package/gcc/gcc.hash > +++ b/package/gcc/gcc.hash > @@ -13,3 +13,5 @@ sha512 234dd9b1bdc9a9c6e352216a7ef4ccadc6c07f156006a59759c5e0e6a69f0abcdc14630e > > # Locally calculated (fetched from Github) > sha512 faae6dc3f7843412068a52de5919797cd23e6ed1b8d140c230d0381f13fd38af67baaa4a09e581c03602127da3dd2fab6f9f5d7ac5d4270585bd079c673dda9a gcc-arc-2016.09-release.tar.gz > +# Locally calculated (fetched from Github) > +sha512 841101f7de45f327bf2e92f3efc73ca88a021e4b9b541458ce80a16e55882bd8606a8492d75c57c589ee2c10d42ae2865b67690155d7289a541df1d68096402f gcc-musl-5.4.0.tar.gz > diff --git a/package/gcc/gcc.mk b/package/gcc/gcc.mk > index 464e4c9..7b7a5cf 100644 > --- a/package/gcc/gcc.mk > +++ b/package/gcc/gcc.mk > @@ -13,11 +13,13 @@ GCC_VERSION = $(call qstrip,$(BR2_GCC_VERSION)) > ifeq ($(BR2_arc),y) > GCC_SITE = $(call github,foss-for-synopsys-dwc-arc-processors,gcc,$(GCC_VERSION)) > GCC_SOURCE = gcc-$(GCC_VERSION).tar.gz > +else ifeq ($(BR2_or1k),y) > +GCC_SITE = $(call github,openrisc,or1k-gcc,$(GCC_VERSION)) > +GCC_SOURCE = gcc-$(GCC_VERSION).tar.gz > else > GCC_SITE = $(BR2_GNU_MIRROR:/=)/gcc/gcc-$(GCC_VERSION) > -endif > - > GCC_SOURCE ?= gcc-$(GCC_VERSION).tar.bz2 > +endif > > # > # Xtensa special hook > diff --git a/package/uclibc/Config.in b/package/uclibc/Config.in > index a200154..4d5f629 100644 > --- a/package/uclibc/Config.in > +++ b/package/uclibc/Config.in > @@ -57,12 +57,12 @@ choice > select BR2_TOOLCHAIN_HAS_THREADS > select BR2_TOOLCHAIN_HAS_THREADS_NPTL > depends on BR2_USE_MMU > - depends on !BR2_m68k && !BR2_microblaze > + depends on !BR2_m68k && !BR2_microblaze && !BR2_or1k > > config BR2_PTHREADS > bool "linuxthreads" > select BR2_TOOLCHAIN_HAS_THREADS > - depends on BR2_bfin || BR2_m68k || BR2_microblaze || BR2_arm || BR2_armeb || BR2_xtensa > + depends on BR2_bfin || BR2_m68k || BR2_microblaze || BR2_or1k || BR2_arm || BR2_armeb || BR2_xtensa > > config BR2_PTHREADS_NONE > bool "none" > @@ -106,6 +106,7 @@ config BR2_UCLIBC_TARGET_ARCH > default "m68k" if BR2_m68k > default "microblaze" if BR2_microblaze > default "mips" if BR2_mips || BR2_mipsel || BR2_mips64 || BR2_mips64el > + default "or1k" if BR2_or1k > default "powerpc" if BR2_powerpc > default "sh" if BR2_sh > default "sparc" if BR2_sparc > diff --git a/toolchain/toolchain-buildroot/Config.in b/toolchain/toolchain-buildroot/Config.in > index c8436cc..d5f98a9 100644 > --- a/toolchain/toolchain-buildroot/Config.in > +++ b/toolchain/toolchain-buildroot/Config.in > @@ -32,8 +32,8 @@ config BR2_TOOLCHAIN_BUILDROOT_UCLIBC > depends on BR2_arcle || BR2_arceb || BR2_arm || BR2_armeb || \ > BR2_bfin || BR2_i386 || BR2_m68k || BR2_microblaze || \ > BR2_mips || BR2_mipsel || BR2_mips64 || BR2_mips64el || \ > - BR2_powerpc || BR2_sh2a || BR2_sh4 || BR2_sh4eb || \ > - BR2_sparc || BR2_xtensa || BR2_x86_64 > + BR2_or1k || BR2_powerpc || BR2_sh2a || BR2_sh4 || \ > + BR2_sh4eb || BR2_sparc || BR2_xtensa || BR2_x86_64 > # Unsupported for MIPS R6 > depends on !BR2_MIPS_CPU_MIPS32R6 && !BR2_MIPS_CPU_MIPS64R6 > help >