Message ID | 20240816170949.238511-8-itachis@FreeBSD.org |
---|---|
State | New |
Headers | show |
Series | bsd-user: Comprehensive RISCV Support | expand |
On 8/17/24 03:09, Ajeet Singh wrote: > From: Mark Corbin <mark@dibsco.co.uk> > > Implemented the `setup_sigtramp` function for setting up the signal > trampoline code in the RISC-V architecture. > > Signed-off-by: Mark Corbin <mark@dibsco.co.uk> > Signed-off-by: Ajeet Singh <itachis@FreeBSD.org> > Reviewed-by: Richard Henderson <richard.henderson@linaro.org> > --- > bsd-user/riscv/target_arch_sigtramp.h | 46 +++++++++++++++++++++++++++ > 1 file changed, 46 insertions(+) > create mode 100644 bsd-user/riscv/target_arch_sigtramp.h > > diff --git a/bsd-user/riscv/target_arch_sigtramp.h b/bsd-user/riscv/target_arch_sigtramp.h > new file mode 100644 > index 0000000000..39c878db22 > --- /dev/null > +++ b/bsd-user/riscv/target_arch_sigtramp.h > @@ -0,0 +1,46 @@ > +/* > + * RISC-V sigcode > + * > + * Copyright (c) 2019 Mark Corbin > + * > + * This 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 of the License, or (at your option) any later version. > + * > + * This 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 this library; if not, see <http://www.gnu.org/licenses/>. > + */ > + > +#ifndef TARGET_ARCH_SIGTRAMP_H > +#define TARGET_ARCH_SIGTRAMP_H > + > +/* Compare with sigcode() in riscv/riscv/locore.S */ > +static inline abi_long setup_sigtramp(abi_ulong offset, unsigned sigf_uc, > + unsigned sys_sigreturn) > +{ > + int i; > + uint32_t sys_exit = TARGET_FREEBSD_NR_exit; > + > + uint32_t sigtramp_code[] = { > + /* 1 */ 0x00010513, /* mv a0, sp */ > + /* 2 */ 0x00050513 + (sigf_uc << 20), /* addi a0, a0, sigf_uc */ > + /* 3 */ 0x00000293 + (sys_sigreturn << 20), /* li t0, sys_sigreturn */ > + /* 4 */ 0x00000073, /* ecall */ > + /* 5 */ 0x00000293 + (sys_exit << 20), /* li t0, sys_exit */ > + /* 6 */ 0x00000073, /* ecall */ > + /* 7 */ 0xFF1FF06F /* b -16 */ > + }; > + > + for (i = 0; i < 7; i++) { > + tswap32s(&sigtramp_code[i]); > + } Use static const uint32_t sigtramp_code[] = { const_le32(...), }; r~ > + > + return memcpy_to_target(offset, sigtramp_code, TARGET_SZSIGCODE); > +} > +#endif /* TARGET_ARCH_SIGTRAMP_H */
diff --git a/bsd-user/riscv/target_arch_sigtramp.h b/bsd-user/riscv/target_arch_sigtramp.h new file mode 100644 index 0000000000..39c878db22 --- /dev/null +++ b/bsd-user/riscv/target_arch_sigtramp.h @@ -0,0 +1,46 @@ +/* + * RISC-V sigcode + * + * Copyright (c) 2019 Mark Corbin + * + * This 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 of the License, or (at your option) any later version. + * + * This 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 this library; if not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef TARGET_ARCH_SIGTRAMP_H +#define TARGET_ARCH_SIGTRAMP_H + +/* Compare with sigcode() in riscv/riscv/locore.S */ +static inline abi_long setup_sigtramp(abi_ulong offset, unsigned sigf_uc, + unsigned sys_sigreturn) +{ + int i; + uint32_t sys_exit = TARGET_FREEBSD_NR_exit; + + uint32_t sigtramp_code[] = { + /* 1 */ 0x00010513, /* mv a0, sp */ + /* 2 */ 0x00050513 + (sigf_uc << 20), /* addi a0, a0, sigf_uc */ + /* 3 */ 0x00000293 + (sys_sigreturn << 20), /* li t0, sys_sigreturn */ + /* 4 */ 0x00000073, /* ecall */ + /* 5 */ 0x00000293 + (sys_exit << 20), /* li t0, sys_exit */ + /* 6 */ 0x00000073, /* ecall */ + /* 7 */ 0xFF1FF06F /* b -16 */ + }; + + for (i = 0; i < 7; i++) { + tswap32s(&sigtramp_code[i]); + } + + return memcpy_to_target(offset, sigtramp_code, TARGET_SZSIGCODE); +} +#endif /* TARGET_ARCH_SIGTRAMP_H */