mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
tools/nolibc: add support for OpenRISC / or1k
Add support for OpenRISC / or1k to nolibc. _start() uses the same wrapper construct as in arch-sh.h. libgcc is necessary as OpenRISC is missing 64-bit multiplication. Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Acked-by: Stafford Horne <shorne@gmail.com> Acked-by: Willy Tarreau <w@1wt.eu> Link: https://patch.msgid.link/20260429-nolibc-openrisc-v2-1-8d7d7a2f3fec@weissschuh.net
This commit is contained in:
parent
92f1d3340a
commit
97d6655082
|
|
@ -17,7 +17,7 @@ endif
|
|||
# it defaults to this nolibc directory.
|
||||
OUTPUT ?= $(CURDIR)/
|
||||
|
||||
architectures := arm arm64 loongarch m68k mips powerpc riscv s390 sh sparc x86
|
||||
architectures := arm arm64 loongarch m68k mips openrisc powerpc riscv s390 sh sparc x86
|
||||
arch_files := arch.h $(addsuffix .h, $(addprefix arch-, $(architectures)))
|
||||
all_files := \
|
||||
alloca.h \
|
||||
|
|
|
|||
160
tools/include/nolibc/arch-openrisc.h
Normal file
160
tools/include/nolibc/arch-openrisc.h
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
|
||||
/*
|
||||
* OpenRISC specific definitions for NOLIBC
|
||||
* Copyright (C) 2026 Thomas Weißschuh <linux@weissschuh.net>
|
||||
*/
|
||||
|
||||
#ifndef _NOLIBC_ARCH_OPENRISC_H
|
||||
#define _NOLIBC_ARCH_OPENRISC_H
|
||||
|
||||
#include "compiler.h"
|
||||
#include "crt.h"
|
||||
|
||||
/*
|
||||
* Syscalls for OpenRISC:
|
||||
* - syscall number is passed in r11
|
||||
* - arguments are in r3, r4, r5, r6, r7, r8
|
||||
* - the system call is performed by calling l.sys 1
|
||||
* - syscall return value is in r11
|
||||
*/
|
||||
|
||||
#define _NOLIBC_SYSCALL_CLOBBERLIST \
|
||||
"r12", "r13", "r15", "r17", "r19", "r21", "r23", "r25", "r27", "r29", "r31", "memory"
|
||||
|
||||
#define __nolibc_syscall0(num) \
|
||||
({ \
|
||||
register long _num __asm__ ("r11") = (num); \
|
||||
\
|
||||
__asm__ volatile ( \
|
||||
"l.sys 1\n" \
|
||||
: "+r"(_num) \
|
||||
: \
|
||||
: "r3", "r4", "r5", "r6", "r7", "r8", \
|
||||
_NOLIBC_SYSCALL_CLOBBERLIST \
|
||||
); \
|
||||
_num; \
|
||||
})
|
||||
|
||||
#define __nolibc_syscall1(num, arg1) \
|
||||
({ \
|
||||
register long _num __asm__ ("r11") = (num); \
|
||||
register long _arg1 __asm__ ("r3") = (long)(arg1); \
|
||||
\
|
||||
__asm__ volatile ( \
|
||||
"l.sys 1\n" \
|
||||
: "+r"(_num) \
|
||||
: "r"(_arg1) \
|
||||
: "r4", "r5", "r6", "r7", "r8", _NOLIBC_SYSCALL_CLOBBERLIST \
|
||||
); \
|
||||
_num; \
|
||||
})
|
||||
|
||||
#define __nolibc_syscall2(num, arg1, arg2) \
|
||||
({ \
|
||||
register long _num __asm__ ("r11") = (num); \
|
||||
register long _arg1 __asm__ ("r3") = (long)(arg1); \
|
||||
register long _arg2 __asm__ ("r4") = (long)(arg2); \
|
||||
\
|
||||
__asm__ volatile ( \
|
||||
"l.sys 1\n" \
|
||||
: "+r"(_num) \
|
||||
: "r"(_arg1), "r"(_arg2) \
|
||||
: "r5", "r6", "r7", "r8", _NOLIBC_SYSCALL_CLOBBERLIST \
|
||||
); \
|
||||
_num; \
|
||||
})
|
||||
|
||||
#define __nolibc_syscall3(num, arg1, arg2, arg3) \
|
||||
({ \
|
||||
register long _num __asm__ ("r11") = (num); \
|
||||
register long _arg1 __asm__ ("r3") = (long)(arg1); \
|
||||
register long _arg2 __asm__ ("r4") = (long)(arg2); \
|
||||
register long _arg3 __asm__ ("r5") = (long)(arg3); \
|
||||
\
|
||||
__asm__ volatile ( \
|
||||
"l.sys 1\n" \
|
||||
: "+r"(_num) \
|
||||
: "r"(_arg1), "r"(_arg2), "r"(_arg3) \
|
||||
: "r6", "r7", "r8", _NOLIBC_SYSCALL_CLOBBERLIST \
|
||||
); \
|
||||
_num; \
|
||||
})
|
||||
|
||||
#define __nolibc_syscall4(num, arg1, arg2, arg3, arg4) \
|
||||
({ \
|
||||
register long _num __asm__ ("r11") = (num); \
|
||||
register long _arg1 __asm__ ("r3") = (long)(arg1); \
|
||||
register long _arg2 __asm__ ("r4") = (long)(arg2); \
|
||||
register long _arg3 __asm__ ("r5") = (long)(arg3); \
|
||||
register long _arg4 __asm__ ("r6") = (long)(arg4); \
|
||||
\
|
||||
__asm__ volatile ( \
|
||||
"l.sys 1\n" \
|
||||
: "+r"(_num) \
|
||||
: "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4) \
|
||||
: "r7", "r8", _NOLIBC_SYSCALL_CLOBBERLIST \
|
||||
); \
|
||||
_num; \
|
||||
})
|
||||
|
||||
#define __nolibc_syscall5(num, arg1, arg2, arg3, arg4, arg5) \
|
||||
({ \
|
||||
register long _num __asm__ ("r11") = (num); \
|
||||
register long _arg1 __asm__ ("r3") = (long)(arg1); \
|
||||
register long _arg2 __asm__ ("r4") = (long)(arg2); \
|
||||
register long _arg3 __asm__ ("r5") = (long)(arg3); \
|
||||
register long _arg4 __asm__ ("r6") = (long)(arg4); \
|
||||
register long _arg5 __asm__ ("r7") = (long)(arg5); \
|
||||
\
|
||||
__asm__ volatile ( \
|
||||
"l.sys 1\n" \
|
||||
: "+r"(_num) \
|
||||
: "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5) \
|
||||
: "r8", _NOLIBC_SYSCALL_CLOBBERLIST \
|
||||
); \
|
||||
_num; \
|
||||
})
|
||||
|
||||
#define __nolibc_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6) \
|
||||
({ \
|
||||
register long _num __asm__ ("r11") = (num); \
|
||||
register long _arg1 __asm__ ("r3") = (long)(arg1); \
|
||||
register long _arg2 __asm__ ("r4") = (long)(arg2); \
|
||||
register long _arg3 __asm__ ("r5") = (long)(arg3); \
|
||||
register long _arg4 __asm__ ("r6") = (long)(arg4); \
|
||||
register long _arg5 __asm__ ("r7") = (long)(arg5); \
|
||||
register long _arg6 __asm__ ("r8") = (long)(arg6); \
|
||||
\
|
||||
__asm__ volatile ( \
|
||||
"l.sys 1\n" \
|
||||
: "+r"(_num) \
|
||||
: "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \
|
||||
"r"(_arg6) \
|
||||
: _NOLIBC_SYSCALL_CLOBBERLIST \
|
||||
); \
|
||||
_num; \
|
||||
})
|
||||
|
||||
#ifndef NOLIBC_NO_RUNTIME
|
||||
/* startup code */
|
||||
void _start_wrapper(void);
|
||||
void __attribute__((weak,noreturn))
|
||||
__nolibc_entrypoint __nolibc_no_stack_protector
|
||||
_start_wrapper(void)
|
||||
{
|
||||
__asm__ volatile (
|
||||
".global _start\n" /* The C function will have a prologue, */
|
||||
".type _start, @function\n" /* corrupting "sp/r1" */
|
||||
".weak _start\n"
|
||||
"_start:\n"
|
||||
|
||||
"l.jal _start_c\n" /* transfer to c runtime */
|
||||
"l.or r3,r1,r1\n" /* save stack pointer to r3, as arg1 of _start_c */
|
||||
|
||||
".size _start, .-_start\n"
|
||||
);
|
||||
__nolibc_entrypoint_epilogue();
|
||||
}
|
||||
#endif /* NOLIBC_NO_RUNTIME */
|
||||
|
||||
#endif /* _NOLIBC_ARCH_OPENRISC_H */
|
||||
|
|
@ -28,6 +28,8 @@
|
|||
#include "arch-m68k.h"
|
||||
#elif defined(__sh__)
|
||||
#include "arch-sh.h"
|
||||
#elif defined(__or1k__)
|
||||
#include "arch-openrisc.h"
|
||||
#else
|
||||
#error Unsupported Architecture
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -102,6 +102,7 @@ DEFCONFIG_sparc32 = sparc32_defconfig
|
|||
DEFCONFIG_sparc64 = sparc64_defconfig
|
||||
DEFCONFIG_m68k = virt_defconfig
|
||||
DEFCONFIG_sh4 = rts7751r2dplus_defconfig
|
||||
DEFCONFIG_openrisc = virt_defconfig
|
||||
DEFCONFIG = $(or $(DEFCONFIG_$(XARCH)),defconfig)
|
||||
|
||||
EXTRACONFIG_x32 = -e CONFIG_X86_X32_ABI
|
||||
|
|
@ -128,6 +129,7 @@ QEMU_ARCH_mips64be = mips64
|
|||
QEMU_ARCH_ppc64le = ppc64
|
||||
QEMU_ARCH_loongarch = loongarch64
|
||||
QEMU_ARCH_sparc32 = sparc
|
||||
QEMU_ARCH_openrisc = or1k
|
||||
QEMU_ARCH = $(or $(QEMU_ARCH_$(XARCH)),$(XARCH))
|
||||
|
||||
QEMU_ARCH_USER_ppc64le = ppc64le
|
||||
|
|
@ -167,6 +169,7 @@ QEMU_ARGS_sparc32 = -M SS-5 -m 256M -append "console=ttyS0,115200 panic=-1 $(
|
|||
QEMU_ARGS_sparc64 = -M sun4u -append "console=ttyS0,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
|
||||
QEMU_ARGS_m68k = -M virt -append "console=ttyGF0,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
|
||||
QEMU_ARGS_sh4 = -M r2d -serial file:/dev/stdout -append "console=ttySC1,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
|
||||
QEMU_ARGS_openrisc = -M virt -m 512M -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
|
||||
QEMU_ARGS = -m 1G $(QEMU_ARGS_$(XARCH)) $(QEMU_ARGS_BIOS) $(QEMU_ARGS_EXTRA)
|
||||
|
||||
# OUTPUT is only set when run from the main makefile, otherwise
|
||||
|
|
@ -201,6 +204,7 @@ CFLAGS_XARCH = $(CFLAGS_$(XARCH))
|
|||
endif
|
||||
|
||||
LDLIBS_ppc = $(if $(LLVM),,-lgcc)
|
||||
LDLIBS_openrisc = $(if $(LLVM),,-lgcc)
|
||||
LDLIBS = $(LDLIBS_$(XARCH))
|
||||
|
||||
include Makefile.include
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ all_archs=(
|
|||
i386 x86_64 x32
|
||||
arm64 arm armthumb
|
||||
mips32le mips32be mipsn32le mipsn32be mips64le mips64be
|
||||
openrisc
|
||||
ppc ppc64 ppc64le
|
||||
riscv32 riscv64
|
||||
s390x
|
||||
|
|
@ -107,6 +108,7 @@ crosstool_arch() {
|
|||
case "$1" in
|
||||
arm64) echo aarch64;;
|
||||
armthumb) echo arm;;
|
||||
openrisc) echo or1k;;
|
||||
ppc) echo powerpc;;
|
||||
ppc64) echo powerpc64;;
|
||||
ppc64le) echo powerpc64;;
|
||||
|
|
@ -185,7 +187,7 @@ test_arch() {
|
|||
exit 1
|
||||
esac
|
||||
printf '%-15s' "$arch:"
|
||||
if [ "$arch" = "m68k" -o "$arch" = "sh4" ] && [ "$llvm" = "1" ]; then
|
||||
if [ "$arch" = "m68k" -o "$arch" = "sh4" -o "$arch" = "openrisc" ] && [ "$llvm" = "1" ]; then
|
||||
echo "Unsupported configuration"
|
||||
return
|
||||
fi
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user