diff options
Diffstat (limited to 'libc/sysdeps/linux/riscv64')
-rw-r--r-- | libc/sysdeps/linux/riscv64/bits/fcntl.h | 3 | ||||
-rw-r--r-- | libc/sysdeps/linux/riscv64/getcontext.S | 74 | ||||
-rw-r--r-- | libc/sysdeps/linux/riscv64/setcontext.S | 112 | ||||
-rw-r--r-- | libc/sysdeps/linux/riscv64/swapcontext.S | 122 | ||||
-rw-r--r-- | libc/sysdeps/linux/riscv64/sys/ucontext.h | 4 |
5 files changed, 5 insertions, 310 deletions
diff --git a/libc/sysdeps/linux/riscv64/bits/fcntl.h b/libc/sysdeps/linux/riscv64/bits/fcntl.h index a9d7c84e0..fdfb1805d 100644 --- a/libc/sysdeps/linux/riscv64/bits/fcntl.h +++ b/libc/sysdeps/linux/riscv64/bits/fcntl.h @@ -229,3 +229,6 @@ extern ssize_t tee (int __fdin, int __fdout, size_t __len, #endif __END_DECLS + +/* Include generic Linux declarations. */ +#include <bits/fcntl-linux.h> diff --git a/libc/sysdeps/linux/riscv64/getcontext.S b/libc/sysdeps/linux/riscv64/getcontext.S deleted file mode 100644 index 0b9e7c2d3..000000000 --- a/libc/sysdeps/linux/riscv64/getcontext.S +++ /dev/null @@ -1,74 +0,0 @@ -/* Save current context. - Copyright (C) 2009-2018 Free Software Foundation, Inc. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include "ucontext-macros.h" - -/* int getcontext (ucontext_t *ucp) */ - - .text -LEAF (getcontext) - SAVE_INT_REG (ra, 0, a0) - SAVE_INT_REG (ra, 1, a0) - SAVE_INT_REG (sp, 2, a0) - SAVE_INT_REG (s0, 8, a0) - SAVE_INT_REG (s1, 9, a0) - SAVE_INT_REG (x0, 10, a0) /* return 0 by overwriting a0. */ - SAVE_INT_REG (s2, 18, a0) - SAVE_INT_REG (s3, 19, a0) - SAVE_INT_REG (s4, 20, a0) - SAVE_INT_REG (s5, 21, a0) - SAVE_INT_REG (s6, 22, a0) - SAVE_INT_REG (s7, 23, a0) - SAVE_INT_REG (s8, 24, a0) - SAVE_INT_REG (s9, 25, a0) - SAVE_INT_REG (s10, 26, a0) - SAVE_INT_REG (s11, 27, a0) - -#ifndef __riscv_float_abi_soft - frsr a1 - - SAVE_FP_REG (fs0, 8, a0) - SAVE_FP_REG (fs1, 9, a0) - SAVE_FP_REG (fs2, 18, a0) - SAVE_FP_REG (fs3, 19, a0) - SAVE_FP_REG (fs4, 20, a0) - SAVE_FP_REG (fs5, 21, a0) - SAVE_FP_REG (fs6, 22, a0) - SAVE_FP_REG (fs7, 23, a0) - SAVE_FP_REG (fs8, 24, a0) - SAVE_FP_REG (fs9, 25, a0) - SAVE_FP_REG (fs10, 26, a0) - SAVE_FP_REG (fs11, 27, a0) - - sw a1, MCONTEXT_FSR(a0) -#endif /* __riscv_float_abi_soft */ - -/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */ - li a3, _NSIG8 - add a2, a0, UCONTEXT_SIGMASK - mv a1, zero - li a0, SIG_BLOCK - - li a7, SYS_ify (rt_sigprocmask) - scall - bltz a0, 99f - - ret - -99: j __syscall_error - -PSEUDO_END (getcontext) diff --git a/libc/sysdeps/linux/riscv64/setcontext.S b/libc/sysdeps/linux/riscv64/setcontext.S deleted file mode 100644 index 15cc17bd8..000000000 --- a/libc/sysdeps/linux/riscv64/setcontext.S +++ /dev/null @@ -1,112 +0,0 @@ -/* Set current context. - Copyright (C) 2009-2018 Free Software Foundation, Inc. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include "ucontext-macros.h" - -/* int __setcontext (const ucontext_t *ucp) - - Restores the machine context in UCP and thereby resumes execution - in that context. - - This implementation is intended to be used for *synchronous* context - switches only. Therefore, it does not have to restore anything - other than the PRESERVED state. */ - - .text -LEAF (setcontext) - - mv t0, a0 /* Save ucp into t0. */ - -/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */ - li a3, _NSIG8 - mv a2, zero - add a1, a0, UCONTEXT_SIGMASK - li a0, SIG_SETMASK - - li a7, SYS_ify (rt_sigprocmask) - scall - - bltz a0, 99f - - cfi_def_cfa (t0, 0) - -#ifndef __riscv_float_abi_soft - lw t1, MCONTEXT_FSR(t0) - - RESTORE_FP_REG_CFI (fs0, 8, t0) - RESTORE_FP_REG_CFI (fs1, 9, t0) - RESTORE_FP_REG_CFI (fs2, 18, t0) - RESTORE_FP_REG_CFI (fs3, 19, t0) - RESTORE_FP_REG_CFI (fs4, 20, t0) - RESTORE_FP_REG_CFI (fs5, 21, t0) - RESTORE_FP_REG_CFI (fs6, 22, t0) - RESTORE_FP_REG_CFI (fs7, 23, t0) - RESTORE_FP_REG_CFI (fs8, 24, t0) - RESTORE_FP_REG_CFI (fs9, 25, t0) - RESTORE_FP_REG_CFI (fs10, 26, t0) - RESTORE_FP_REG_CFI (fs11, 27, t0) - - fssr t1 -#endif /* __riscv_float_abi_soft */ - - /* Note the contents of argument registers will be random - unless makecontext() has been called. */ - RESTORE_INT_REG (t1, 0, t0) - RESTORE_INT_REG_CFI (ra, 1, t0) - RESTORE_INT_REG (sp, 2, t0) - RESTORE_INT_REG_CFI (s0, 8, t0) - RESTORE_INT_REG_CFI (s1, 9, t0) - RESTORE_INT_REG (a0, 10, t0) - RESTORE_INT_REG (a1, 11, t0) - RESTORE_INT_REG (a2, 12, t0) - RESTORE_INT_REG (a3, 13, t0) - RESTORE_INT_REG (a4, 14, t0) - RESTORE_INT_REG (a5, 15, t0) - RESTORE_INT_REG (a6, 16, t0) - RESTORE_INT_REG (a7, 17, t0) - RESTORE_INT_REG_CFI (s2, 18, t0) - RESTORE_INT_REG_CFI (s3, 19, t0) - RESTORE_INT_REG_CFI (s4, 20, t0) - RESTORE_INT_REG_CFI (s5, 21, t0) - RESTORE_INT_REG_CFI (s6, 22, t0) - RESTORE_INT_REG_CFI (s7, 23, t0) - RESTORE_INT_REG_CFI (s8, 24, t0) - RESTORE_INT_REG_CFI (s9, 25, t0) - RESTORE_INT_REG_CFI (s10, 26, t0) - RESTORE_INT_REG_CFI (s11, 27, t0) - - jr t1 - -99: j __syscall_error - -PSEUDO_END (setcontext) - -LEAF (start_context) - - /* Terminate call stack by noting ra == 0. Happily, s0 == 0 here. */ - cfi_register (ra, s0) - - /* Call the function passed to makecontext. */ - jalr s1 - - /* Invoke subsequent context if present, else exit(0). */ - mv a0, s2 - beqz s2, 1f - jal setcontext -1: j exit - -PSEUDO_END (start_context) diff --git a/libc/sysdeps/linux/riscv64/swapcontext.S b/libc/sysdeps/linux/riscv64/swapcontext.S deleted file mode 100644 index f5e12b2db..000000000 --- a/libc/sysdeps/linux/riscv64/swapcontext.S +++ /dev/null @@ -1,122 +0,0 @@ -/* Save and set current context. - Copyright (C) 2009-2018 Free Software Foundation, Inc. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include "ucontext-macros.h" - -/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */ - -LEAF (swapcontext) - mv t0, a1 /* Save ucp into t0. */ - - SAVE_INT_REG (ra, 0, a0) - SAVE_INT_REG (ra, 1, a0) - SAVE_INT_REG (sp, 2, a0) - SAVE_INT_REG (s0, 8, a0) - SAVE_INT_REG (s1, 9, a0) - SAVE_INT_REG (x0, 10, a0) /* return 0 by overwriting a0. */ - SAVE_INT_REG (s2, 18, a0) - SAVE_INT_REG (s3, 19, a0) - SAVE_INT_REG (s4, 20, a0) - SAVE_INT_REG (s5, 21, a0) - SAVE_INT_REG (s6, 22, a0) - SAVE_INT_REG (s7, 23, a0) - SAVE_INT_REG (s8, 24, a0) - SAVE_INT_REG (s9, 25, a0) - SAVE_INT_REG (s10, 26, a0) - SAVE_INT_REG (s11, 27, a0) - -#ifndef __riscv_float_abi_soft - frsr a1 - - SAVE_FP_REG (fs0, 8, a0) - SAVE_FP_REG (fs1, 9, a0) - SAVE_FP_REG (fs2, 18, a0) - SAVE_FP_REG (fs3, 19, a0) - SAVE_FP_REG (fs4, 20, a0) - SAVE_FP_REG (fs5, 21, a0) - SAVE_FP_REG (fs6, 22, a0) - SAVE_FP_REG (fs7, 23, a0) - SAVE_FP_REG (fs8, 24, a0) - SAVE_FP_REG (fs9, 25, a0) - SAVE_FP_REG (fs10, 26, a0) - SAVE_FP_REG (fs11, 27, a0) - - sw a1, MCONTEXT_FSR(a0) -#endif /* __riscv_float_abi_soft */ - -/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8) */ - li a3, _NSIG8 - add a2, a0, UCONTEXT_SIGMASK - add a1, t0, UCONTEXT_SIGMASK - li a0, SIG_SETMASK - - li a7, SYS_ify (rt_sigprocmask) - scall - - bltz a0, 99f - -#ifndef __riscv_float_abi_soft - lw t1, MCONTEXT_FSR(t0) - - RESTORE_FP_REG (fs0, 8, t0) - RESTORE_FP_REG (fs1, 9, t0) - RESTORE_FP_REG (fs2, 18, t0) - RESTORE_FP_REG (fs3, 19, t0) - RESTORE_FP_REG (fs4, 20, t0) - RESTORE_FP_REG (fs5, 21, t0) - RESTORE_FP_REG (fs6, 22, t0) - RESTORE_FP_REG (fs7, 23, t0) - RESTORE_FP_REG (fs8, 24, t0) - RESTORE_FP_REG (fs9, 25, t0) - RESTORE_FP_REG (fs10, 26, t0) - RESTORE_FP_REG (fs11, 27, t0) - - fssr t1 -#endif /* __riscv_float_abi_soft */ - - /* Note the contents of argument registers will be random - unless makecontext() has been called. */ - RESTORE_INT_REG (t1, 0, t0) - RESTORE_INT_REG (ra, 1, t0) - RESTORE_INT_REG (sp, 2, t0) - RESTORE_INT_REG (s0, 8, t0) - RESTORE_INT_REG (s1, 9, t0) - RESTORE_INT_REG (a0, 10, t0) - RESTORE_INT_REG (a1, 11, t0) - RESTORE_INT_REG (a2, 12, t0) - RESTORE_INT_REG (a3, 13, t0) - RESTORE_INT_REG (a4, 14, t0) - RESTORE_INT_REG (a5, 15, t0) - RESTORE_INT_REG (a6, 16, t0) - RESTORE_INT_REG (a7, 17, t0) - RESTORE_INT_REG (s2, 18, t0) - RESTORE_INT_REG (s3, 19, t0) - RESTORE_INT_REG (s4, 20, t0) - RESTORE_INT_REG (s5, 21, t0) - RESTORE_INT_REG (s6, 22, t0) - RESTORE_INT_REG (s7, 23, t0) - RESTORE_INT_REG (s8, 24, t0) - RESTORE_INT_REG (s9, 25, t0) - RESTORE_INT_REG (s10, 26, t0) - RESTORE_INT_REG (s11, 27, t0) - - jr t1 - - -99: j __syscall_error - -PSEUDO_END (swapcontext) diff --git a/libc/sysdeps/linux/riscv64/sys/ucontext.h b/libc/sysdeps/linux/riscv64/sys/ucontext.h index 2893ff359..308ccb8c2 100644 --- a/libc/sysdeps/linux/riscv64/sys/ucontext.h +++ b/libc/sysdeps/linux/riscv64/sys/ucontext.h @@ -83,10 +83,10 @@ typedef struct mcontext_t } mcontext_t; /* Userlevel context. */ -typedef struct ucontext_t +typedef struct ucontext { unsigned long int __uc_flags; - struct ucontext_t *uc_link; + struct ucontext *uc_link; stack_t uc_stack; sigset_t uc_sigmask; /* There's some padding here to allow sigset_t to be expanded in the |