or1k: ABI Implementation

This code deals with the OpenRISC ABI.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Stafford Horne 2021-10-20 06:47:26 +09:00
parent 9dde3a24f1
commit 6e5964311d
12 changed files with 419 additions and 0 deletions

50
sysdeps/or1k/__longjmp.S Normal file
View File

@ -0,0 +1,50 @@
/* longjmp, OpenRISC version.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sysdep.h>
#define _ASM
#define _SETJMP_H
#include <bits/setjmp.h>
ENTRY (__longjmp)
l.lwz r1, 0(r3)
l.lwz r2, 4(r3)
/* if r4 is 0, something wrong, so set it to 1 */
l.sfeqi r4, 0x0
l.bnf 1f /* r4 != 0, longjmp value sensible */
l.nop
l.ori r4, r0, 0x1 /* make nonzero */
1:
l.addi r11, r4, 0
l.lwz r9, 8(r3)
l.lwz r10, 12(r3)
l.lwz r14, 16(r3)
l.lwz r16, 20(r3)
l.lwz r18, 24(r3)
l.lwz r20, 28(r3)
l.lwz r22, 32(r3)
l.lwz r24, 36(r3)
l.lwz r26, 40(r3)
l.lwz r28, 44(r3)
l.lwz r30, 48(r3)
l.jr r9
l.nop
END (__longjmp)
libc_hidden_def (__longjmp)

View File

@ -0,0 +1,11 @@
#ifndef _BITS_ENDIANNESS_H
#define _BITS_ENDIANNESS_H 1
#ifndef _BITS_ENDIAN_H
# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
#endif
/* OpenRISC is big-endian. */
#define __BYTE_ORDER __BIG_ENDIAN
#endif /* bits/endianness.h */

View File

@ -0,0 +1,32 @@
/* Define the machine-dependent type `jmp_buf'. OpenRISC version.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#ifndef _OR1K_BITS_SETJMP_H
#define _OR1K_BITS_SETJMP_H 1
#if !defined _SETJMP_H && !defined _PTHREAD_H
# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
#endif
#ifndef _ASM
typedef long int __jmp_buf[13];
#endif
#endif /* _OR1K_BITS_SETJMP_H */

View File

@ -0,0 +1 @@
/* _setjmp is in setjmp.S */

View File

@ -0,0 +1 @@
/* setjmp is in setjmp.S */

View File

@ -0,0 +1,73 @@
/* Machine-dependent ELF runtime symbol resolution, OpenRISC version.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sysdep.h>
/* This code is plugged into the PLT and used by the dynamic linker to
call _dl_fixup (dl-runtime.c).
We assume that R11 contains the relocation offset and R12 contains
link_map (_DYNAMIC). This must be consistent with the JUMP_SLOT
layout generated by binutils. */
ENTRY (_dl_runtime_resolve)
l.sw -4(r1), r9
l.sw -8(r1), r1
/* save function arguments. */
l.sw -12(r1), r3
l.sw -16(r1), r4
l.sw -20(r1), r5
l.sw -24(r1), r6
l.sw -28(r1), r7
l.sw -32(r1), r8
.cfi_offset 9, -4
.cfi_offset 1, -8
.cfi_offset 3, -12
.cfi_offset 4, -16
.cfi_offset 5, -20
.cfi_offset 6, -24
.cfi_offset 7, -28
.cfi_offset 8, -32
l.addi r1,r1, -32
.cfi_def_cfa_offset 32
l.ori r3, r12, 0
l.ori r4, r11, 0
l.jal _dl_fixup
l.nop
/* Restore function arguments. */
l.addi r1,r1, 32
l.lwz r8, -32(r1)
l.lwz r7, -28(r1)
l.lwz r6, -24(r1)
l.lwz r5, -20(r1)
l.lwz r4, -16(r1)
l.lwz r3, -12(r1)
/* restore return address. */
l.lwz r9, -4(r1)
l.jr r11
l.nop
END (_dl_runtime_resolve)

View File

@ -0,0 +1,23 @@
/* Private macros for accessing __jmp_buf contents. OpenRISC version.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<https://www.gnu.org/licenses/>. */
#define __JMP_BUF_SP 0
/* Helper for generic function ____longjmp_chk. */
#define JB_FRAME_ADDRESS(buf) \
((void *) (unsigned long) (buf[__JMP_BUF_SP]))

View File

@ -0,0 +1,36 @@
/* Macros to help frame unwinding using jmpbuf. OpenRISC version.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<https://www.gnu.org/licenses/>. */
#include <setjmp.h>
#include <jmpbuf-offsets.h>
#include <stdint.h>
#include <unwind.h>
/* Test if longjmp to JMPBUF would unwind the frame
containing a local variable at ADDRESS. */
#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \
((void *) (address) < (void *) demangle (jmpbuf[__JMP_BUF_SP]))
#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
_JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[__JMP_BUF_SP] - (_adj))
/* We use the normal longjmp for unwinding. */
#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)

View File

@ -0,0 +1,35 @@
/* Machine-dependent definitions for profiling support. OpenRISC version.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<https://www.gnu.org/licenses/>. */
#include <sysdep.h>
#define _MCOUNT_DECL(frompc, selfpc) \
static void \
__mcount_internal (unsigned long int frompc, unsigned long int selfpc)
/* This is very simple as gcc does all the heavy lifting at the _mcount
call site. GCC passes in the return address of the function calling
_mcount. */
#define MCOUNT \
void \
_mcount (void *frompc) \
{ \
__mcount_internal ((unsigned long int) frompc, \
(unsigned long int) __builtin_return_address (0)); \
}

21
sysdeps/or1k/memusage.h Normal file
View File

@ -0,0 +1,21 @@
/* Definitions for memory usage profiling. OpenRISC version.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#define GETSP() ({ register uintptr_t stack_ptr asm ("r1"); stack_ptr; })
#include <sysdeps/generic/memusage.h>

56
sysdeps/or1k/setjmp.S Normal file
View File

@ -0,0 +1,56 @@
/* setjmp, OpenRISC version.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sysdep.h>
#define _ASM
#define _SETJMP_H
#include <bits/setjmp.h>
ENTRY (_setjmp)
l.addi r4, r0, 0 /* Set second argument to 0. */
l.j .Local__sigsetjmp
l.nop
END (_setjmp)
libc_hidden_def (_setjmp)
ENTRY (setjmp)
l.addi r4, r0, 1 /* Set second argument to 1. */
l.j .Local__sigsetjmp
l.nop
END (setjmp)
ENTRY (__sigsetjmp)
.Local__sigsetjmp:
l.sw 0(r3), r1
l.sw 4(r3), r2
l.sw 8(r3), r9
l.sw 12(r3), r10
l.sw 16(r3), r14
l.sw 20(r3), r16
l.sw 24(r3), r18
l.sw 28(r3), r20
l.sw 32(r3), r22
l.sw 36(r3), r24
l.sw 40(r3), r26
l.sw 44(r3), r28
l.sw 48(r3), r30
l.j __sigjmp_save
l.nop
END (__sigsetjmp)
hidden_def (__sigsetjmp)

80
sysdeps/or1k/sysdep.h Normal file
View File

@ -0,0 +1,80 @@
/* Assembler macro definitions. OpenRISC version.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<https://www.gnu.org/licenses/>. */
#include <sysdeps/generic/sysdep.h>
#include <features.h>
#if defined __ASSEMBLER__ || defined REQUEST_ASSEMBLER_MACROS
/* Make use of .size directive. */
#define ASM_SIZE_DIRECTIVE(name) .size name,.-name;
/* Define an entry point visible from C. */
#define ENTRY(name) \
.globl C_SYMBOL_NAME(name); \
.type C_SYMBOL_NAME(name),@function; \
.align 4; \
C_LABEL(name) \
cfi_startproc; \
CALL_MCOUNT
#undef END
#define END(name) \
cfi_endproc; \
ASM_SIZE_DIRECTIVE(name)
/* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the
C name space. Make sure we use an innocuous name. */
#define syscall_error __syscall_error
/* If compiled for profiling, call `mcount' at the start of each function. */
#ifdef PROF
# ifdef __PIC__
# define CALL_MCOUNT \
l.addi r1, r1, -8; \
l.sw 0(r1), r9; \
l.sw 4(r1), r3; \
l.ori r3, r9, 0; \
l.j plt(_mcount); \
l.nop; \
l.lwz r9, 0(r1); \
l.lwz r3, 4(r1); \
l.addi r1, r1, 8;
# else
# define CALL_MCOUNT \
l.addi r1, r1, -8; \
l.sw 0(r1), r9; \
l.sw 4(r1), r3; \
l.ori r3, r9, 0; \
l.movhi r15, hi(_mcount); \
l.ori r15, r15, lo(_mcount); \
l.jr r15; \
l.nop; \
l.lwz r9, 0(r1); \
l.lwz r3, 4(r1); \
l.addi r1, r1, 8;
# endif
#else
# define CALL_MCOUNT /* Do nothing. */
#endif
/* Local label name for asm code. */
#define L(name) .L##name
#endif /* __ASSEMBLER__ */