ARC: Linux ABI

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Vineet Gupta 2018-10-23 14:56:39 -07:00
parent add5071a5c
commit e5ccf113cd
13 changed files with 600 additions and 0 deletions

View File

@ -0,0 +1,32 @@
/* pthread machine parameter definitions, ARC version.
Copyright (C) 2020 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/>. */
/* Default stack size. */
#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
/* Required stack pointer alignment at beginning. */
#define STACK_ALIGN 4
/* Minimal stack size after allocating thread descriptor and guard size. */
#define MINIMAL_REST_STACK 2048
/* Alignment requirement for TCB. */
#define TCB_ALIGNMENT 4
/* Location of current stack frame. */
#define CURRENT_STACK_FRAME __builtin_frame_address (0)

View File

@ -0,0 +1,35 @@
/* Types for registers for sys/procfs.h. ARC version.
Copyright (C) 2020 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/>. */
#ifndef _SYS_PROCFS_H
# error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
#endif
#include <sys/ucontext.h>
/* And the whole bunch of them. We could have used `struct
user_regs' directly in the typedef, but tradition says that
the register set is an array, which does have some peculiar
semantics, so leave it that way. */
#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t))
typedef unsigned long int elf_greg_t;
typedef unsigned long int elf_gregset_t[ELF_NGREG];
/* There's no seperate floating point reg file in ARCv2. */
typedef struct { } elf_fpregset_t;

View File

@ -0,0 +1,12 @@
/* Architecture-specific __sigset_t definition. ARC version. */
#ifndef ____sigset_t_defined
#define ____sigset_t_defined
/* Linux asm-generic syscall ABI expects sigset_t to hold 64 signals. */
#define _SIGSET_NWORDS (64 / (8 * sizeof (unsigned long int)))
typedef struct
{
unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;
#endif

View File

@ -0,0 +1,64 @@
/* Save current context for ARC.
Copyright (C) 2020 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 "ucontext-macros.h"
/* int getcontext (ucontext_t *ucp)
Save machine context in @ucp and return 0 on success, -1 on error
- saves callee saved registers only
- layout mandated by uncontext_t:uc_mcontext (hence different from setjmp). */
ENTRY (__getcontext)
/* Callee saved registers. */
add r2, r0, UCONTEXT_MCONTEXT
STR (r13, r2, 37)
STR (r14, r2, 36)
STR (r15, r2, 35)
STR (r16, r2, 34)
STR (r17, r2, 33)
STR (r18, r2, 32)
STR (r19, r2, 31)
STR (r20, r2, 30)
STR (r21, r2, 29)
STR (r22, r2, 28)
STR (r23, r2, 27)
STR (r24, r2, 26)
STR (blink, r2, 7)
STR (fp, r2, 8)
STR (gp, r2, 9)
STR (sp, r2, 23)
/* Save 0 in r0 placeholder to return 0 when this @ucp activated. */
mov r9, 0
STR (r9, r2, 22)
/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8). */
mov r3, _NSIG8
add r2, r0, UCONTEXT_SIGMASK
mov r1, 0
mov r0, SIG_BLOCK
mov r8, __NR_rt_sigprocmask
ARC_TRAP_INSN
brhi r0, -1024, L (call_syscall_err)
j.d [blink]
mov r0, 0 /* Success, error handled in .Lcall_syscall_err. */
PSEUDO_END (__getcontext)
weak_alias (__getcontext, getcontext)

View File

@ -0,0 +1,73 @@
/* Create new context for ARC.
Copyright (C) 2020 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>
#include <stdarg.h>
#include <stdint.h>
#include <sys/ucontext.h>
void
__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
{
extern void __startcontext (void) attribute_hidden;
unsigned long int sp, *r;
va_list vl;
int i, reg_args, stack_args;
sp = ((unsigned long int) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & ~7;
ucp->uc_mcontext.__sp = sp;
ucp->uc_mcontext.__fp = 0;
/* __startcontext is sort of trampoline to invoke @func
From setcontext pov, the resume address is __startcontext,
set it up in BLINK place holder. */
ucp->uc_mcontext.__blink = (unsigned long int) &__startcontext;
/* __startcontext passed 2 types of args
- args to @func setup in canonical r0-r7
- @func and next function in r14,r15. */
ucp->uc_mcontext.__r14 = (unsigned long int) func;
ucp->uc_mcontext.__r15 = (unsigned long int) ucp->uc_link;
r = &ucp->uc_mcontext.__r0;
va_start (vl, argc);
reg_args = argc > 8 ? 8 : argc;
for (i = 0; i < reg_args; i++)
*r-- = va_arg (vl, unsigned long int);
stack_args = argc - reg_args;
if (__glibc_unlikely (stack_args > 0))
{
sp -= stack_args * sizeof (unsigned long int);
ucp->uc_mcontext.__sp = sp;
r = (unsigned long int *) sp;
for (i = 0; i < stack_args; i++)
*r++ = va_arg (vl, unsigned long int);
}
va_end (vl);
}
weak_alias (__makecontext, makecontext)

View File

@ -0,0 +1,93 @@
/* Set current context for ARC.
Copyright (C) 2020 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 "ucontext-macros.h"
/* int setcontext (const ucontext_t *ucp)
- Restores the machine context in @ucp and resumes execution
(doesn't return to caller). */
ENTRY (__setcontext)
mov r9, r0 /* Stash @ucp across syscall. */
/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8). */
mov r3, _NSIG8
mov r2, 0
add r1, r0, UCONTEXT_SIGMASK
mov r0, SIG_SETMASK
mov r8, __NR_rt_sigprocmask
ARC_TRAP_INSN
brhi r0, -1024, L (call_syscall_err)
/* Restore scratch/arg regs for makecontext case. */
add r9, r9, UCONTEXT_MCONTEXT
LDR (r0, r9, 22)
LDR (r1, r9, 21)
LDR (r2, r9, 20)
LDR (r3, r9, 19)
LDR (r4, r9, 18)
LDR (r5, r9, 17)
LDR (r6, r9, 16)
LDR (r7, r9, 15)
/* Restore callee saved registers. */
LDR (r13, r9, 37)
LDR (r14, r9, 36)
LDR (r15, r9, 35)
LDR (r16, r9, 34)
LDR (r17, r9, 33)
LDR (r18, r9, 32)
LDR (r19, r9, 31)
LDR (r20, r9, 30)
LDR (r21, r9, 29)
LDR (r22, r9, 28)
LDR (r23, r9, 27)
LDR (r24, r9, 26)
LDR (blink, r9, 7)
LDR (fp, r9, 8)
LDR (gp, r9, 9)
LDR (sp, r9, 23)
j [blink]
PSEUDO_END (__setcontext)
weak_alias (__setcontext, setcontext)
/* Helper for activating makecontext created context
- r14 has @func, r15 has uc_link. */
ENTRY (__startcontext)
.cfi_label .Ldummy
cfi_undefined (blink)
/* Call user @func, loaded in r14 by setcontext. */
jl [r14]
/* If uc_link (r15) call setcontext with that. */
mov r0, r15
breq r0, 0, 1f
bl __setcontext
1:
/* Exit with status 0. */
b HIDDEN_JUMPTARGET(exit)
END (__startcontext)

View File

@ -0,0 +1,28 @@
/* ARC definitions for signal handling calling conventions.
Copyright (C) 2020 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/>. */
#ifndef _SIGCONTEXTINFO_H
#define _SIGCONTEXTINFO_H
static inline uintptr_t
sigcontext_get_pc (const ucontext_t *ctx)
{
return ctx->uc_mcontext.__ret;
}
#endif

View File

@ -0,0 +1,94 @@
/* Save and set current context for ARC.
Copyright (C) 2020 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 "ucontext-macros.h"
/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp). */
ENTRY (__swapcontext)
/* Save context into @oucp pointed to by r0. */
add r2, r0, UCONTEXT_MCONTEXT
STR (r13, r2, 37)
STR (r14, r2, 36)
STR (r15, r2, 35)
STR (r16, r2, 34)
STR (r17, r2, 33)
STR (r18, r2, 32)
STR (r19, r2, 31)
STR (r20, r2, 30)
STR (r21, r2, 29)
STR (r22, r2, 28)
STR (r23, r2, 27)
STR (r24, r2, 26)
STR (blink, r2, 7)
STR (fp, r2, 8)
STR (gp, r2, 9)
STR (sp, r2, 23)
/* Save 0 in r0 placeholder to return 0 when @oucp activated. */
mov r9, 0
STR (r9, r2, 22)
/* Load context from @ucp. */
mov r9, r1 /* Safekeep @ucp across syscall. */
/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8) */
mov r3, _NSIG8
add r2, r0, UCONTEXT_SIGMASK
add r1, r1, UCONTEXT_SIGMASK
mov r0, SIG_SETMASK
mov r8, __NR_rt_sigprocmask
ARC_TRAP_INSN
brhi r0, -1024, L (call_syscall_err)
add r9, r9, UCONTEXT_MCONTEXT
LDR (r0, r9, 22)
LDR (r1, r9, 21)
LDR (r2, r9, 20)
LDR (r3, r9, 19)
LDR (r4, r9, 18)
LDR (r5, r9, 17)
LDR (r6, r9, 16)
LDR (r7, r9, 15)
LDR (r13, r9, 37)
LDR (r14, r9, 36)
LDR (r15, r9, 35)
LDR (r16, r9, 34)
LDR (r17, r9, 33)
LDR (r18, r9, 32)
LDR (r19, r9, 31)
LDR (r20, r9, 30)
LDR (r21, r9, 29)
LDR (r22, r9, 28)
LDR (r23, r9, 27)
LDR (r24, r9, 26)
LDR (blink, r9, 7)
LDR (fp, r9, 8)
LDR (gp, r9, 9)
LDR (sp, r9, 23)
j [blink]
PSEUDO_END (__swapcontext)
weak_alias (__swapcontext, swapcontext)

View File

@ -0,0 +1,35 @@
/* cacheflush - flush contents of instruction and/or data cache.
Copyright (C) 2020 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/>. */
#ifndef _SYS_CACHECTL_H
#define _SYS_CACHECTL_H 1
#include <features.h>
/* Get the kernel definition for the op bits. */
#include <asm/cachectl.h>
__BEGIN_DECLS
#ifdef __USE_MISC
extern int cacheflush (void *__addr, int __nbytes, int __op) __THROW;
#endif
__END_DECLS
#endif

View File

@ -0,0 +1,57 @@
/* struct ucontext definition, ARC version.
Copyright (C) 2020 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/>. */
/* System V/ARC ABI compliant context switching support. */
#ifndef _SYS_UCONTEXT_H
#define _SYS_UCONTEXT_H 1
#include <features.h>
#include <bits/types/sigset_t.h>
#include <bits/types/stack_t.h>
typedef struct
{
unsigned long int __pad;
unsigned long int __bta;
unsigned long int __lp_start, __lp_end, __lp_count;
unsigned long int __status32, __ret, __blink;
unsigned long int __fp, __gp;
unsigned long int __r12, __r11, __r10, __r9, __r8, __r7;
unsigned long int __r6, __r5, __r4, __r3, __r2, __r1, __r0;
unsigned long int __sp;
unsigned long int __r26;
unsigned long int __r25, __r24, __r23, __r22, __r21, __r20;
unsigned long int __r19, __r18, __r17, __r16, __r15, __r14, __r13;
unsigned long int __efa;
unsigned long int __stop_pc;
unsigned long int __r30, __r58, __r59;
} mcontext_t;
/* Userlevel context. */
typedef struct ucontext_t
{
unsigned long int __uc_flags;
struct ucontext_t *uc_link;
stack_t uc_stack;
mcontext_t uc_mcontext;
sigset_t uc_sigmask;
} ucontext_t;
#endif

View File

@ -0,0 +1,32 @@
/* ptrace register data format definitions.
Copyright (C) 2020 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/>. */
#ifndef _SYS_USER_H
#define _SYS_USER_H 1
/* Struct user_regs_struct is exported by kernel header
However apps like strace also expect a struct user, so it's better to
have a dummy implementation. */
#include <asm/ptrace.h>
struct user
{
long int dummy;
};
#endif

View File

@ -0,0 +1,25 @@
/* Macros for ucontext routines, ARC version.
Copyright (C) 2020 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/>. */
#ifndef _LINUX_ARC_UCONTEXT_MACROS_H
#define _LINUX_ARC_UCONTEXT_MACROS_H
#include <sysdep.h>
#include "ucontext_i.h"
#endif

View File

@ -0,0 +1,20 @@
#include <inttypes.h>
#include <signal.h>
#include <stddef.h>
#include <sys/ucontext.h>
SIG_BLOCK
SIG_SETMASK
-- sizeof(sigset_t) expected by kernel: see comment in ARC sigaction.c for details
_NSIG8 (_NSIG / 8)
-- Offsets of the fields in the ucontext_t structure.
#define ucontext(member) offsetof (ucontext_t, member)
UCONTEXT_FLAGS ucontext (__uc_flags)
UCONTEXT_LINK ucontext (uc_link)
UCONTEXT_STACK ucontext (uc_stack)
UCONTEXT_MCONTEXT ucontext (uc_mcontext)
UCONTEXT_SIGMASK ucontext (uc_sigmask)
UCONTEXT_SIZE sizeof (ucontext_t)