[Buildroot] [PATCH] arch: add support for OpenRISC architecture

Romain Naour romain.naour at gmail.com
Sat Jan 7 23:09:53 UTC 2017


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 <wbx at openadk.org>
> ---
>  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 <shorne at gmail.com>

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 <asm/cache.h>
> + #include <asm-generic/vmlinux.lds.h>
> + 
> +-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
> 




More information about the buildroot mailing list