mirror of
https://git.suyu.dev/suyu/breakpad.git
synced 2026-03-26 13:28:41 +00:00
Added riscv and riscv64 support for Linux
Change-Id: I62cd157d00a87720db001072662a81d8eb9112b0 Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/3873291 Reviewed-by: Mike Frysinger <vapier@chromium.org>
This commit is contained in:
committed by
Mike Frysinger
parent
e059dad5ea
commit
28cf16bc34
@@ -526,8 +526,102 @@ breakpad_getcontext:
|
||||
.cfi_endproc
|
||||
.size breakpad_getcontext, . - breakpad_getcontext
|
||||
|
||||
#elif defined(__riscv)
|
||||
|
||||
# define SIG_BLOCK 0
|
||||
# define _NSIG8 8
|
||||
# define __NR_rt_sigprocmask 135
|
||||
|
||||
.text
|
||||
.globl breakpad_getcontext
|
||||
.type breakpad_getcontext, @function
|
||||
.align 0
|
||||
.cfi_startproc
|
||||
breakpad_getcontext:
|
||||
REG_S ra, MCONTEXT_GREGS_PC(a0)
|
||||
REG_S ra, MCONTEXT_GREGS_RA(a0)
|
||||
REG_S sp, MCONTEXT_GREGS_SP(a0)
|
||||
REG_S gp, MCONTEXT_GREGS_SP(a0)
|
||||
REG_S tp, MCONTEXT_GREGS_TP(a0)
|
||||
REG_S t0, MCONTEXT_GREGS_T0(a0)
|
||||
REG_S t1, MCONTEXT_GREGS_T1(a0)
|
||||
REG_S t2, MCONTEXT_GREGS_T2(a0)
|
||||
REG_S s0, MCONTEXT_GREGS_S0(a0)
|
||||
REG_S s1, MCONTEXT_GREGS_S1(a0)
|
||||
REG_S a0, MCONTEXT_GREGS_A0(a0)
|
||||
REG_S a1, MCONTEXT_GREGS_A1(a0)
|
||||
REG_S a2, MCONTEXT_GREGS_A2(a0)
|
||||
REG_S a3, MCONTEXT_GREGS_A3(a0)
|
||||
REG_S a4, MCONTEXT_GREGS_A4(a0)
|
||||
REG_S a5, MCONTEXT_GREGS_A5(a0)
|
||||
REG_S a6, MCONTEXT_GREGS_A6(a0)
|
||||
REG_S a7, MCONTEXT_GREGS_A7(a0)
|
||||
REG_S s2, MCONTEXT_GREGS_S2(a0)
|
||||
REG_S s3, MCONTEXT_GREGS_S3(a0)
|
||||
REG_S s4, MCONTEXT_GREGS_S4(a0)
|
||||
REG_S s5, MCONTEXT_GREGS_S5(a0)
|
||||
REG_S s6, MCONTEXT_GREGS_S6(a0)
|
||||
REG_S s7, MCONTEXT_GREGS_S7(a0)
|
||||
REG_S s8, MCONTEXT_GREGS_S8(a0)
|
||||
REG_S s9, MCONTEXT_GREGS_S9(a0)
|
||||
REG_S s10, MCONTEXT_GREGS_S10(a0)
|
||||
REG_S s11, MCONTEXT_GREGS_S11(a0)
|
||||
REG_S t3, MCONTEXT_GREGS_T3(a0)
|
||||
REG_S t4, MCONTEXT_GREGS_T4(a0)
|
||||
REG_S t5, MCONTEXT_GREGS_T5(a0)
|
||||
REG_S t6 , MCONTEXT_GREGS_T6(a0)
|
||||
# ifndef __riscv_float_abi_soft
|
||||
frsr a1
|
||||
|
||||
FREG_S ft0, MCONTEXT_FPREGS_FT0(a0)
|
||||
FREG_S ft1, MCONTEXT_FPREGS_FT1(a0)
|
||||
FREG_S ft2, MCONTEXT_FPREGS_FT2(a0)
|
||||
FREG_S ft3, MCONTEXT_FPREGS_FT3(a0)
|
||||
FREG_S ft4, MCONTEXT_FPREGS_FT4(a0)
|
||||
FREG_S ft5, MCONTEXT_FPREGS_FT5(a0)
|
||||
FREG_S ft6, MCONTEXT_FPREGS_FT6(a0)
|
||||
FREG_S ft7, MCONTEXT_FPREGS_FT7(a0)
|
||||
FREG_S fs0, MCONTEXT_FPREGS_FS0(a0)
|
||||
FREG_S fs1, MCONTEXT_FPREGS_FS1(a0)
|
||||
FREG_S fa0, MCONTEXT_FPREGS_FA0(a0)
|
||||
FREG_S fa1, MCONTEXT_FPREGS_FA1(a0)
|
||||
FREG_S fa2, MCONTEXT_FPREGS_FA2(a0)
|
||||
FREG_S fa3, MCONTEXT_FPREGS_FA3(a0)
|
||||
FREG_S fa4, MCONTEXT_FPREGS_FA4(a0)
|
||||
FREG_S fa5, MCONTEXT_FPREGS_FA5(a0)
|
||||
FREG_S fa6, MCONTEXT_FPREGS_FA6(a0)
|
||||
FREG_S fa7, MCONTEXT_FPREGS_FA7(a0)
|
||||
FREG_S fs2, MCONTEXT_FPREGS_FS2(a0)
|
||||
FREG_S fs3, MCONTEXT_FPREGS_FS3(a0)
|
||||
FREG_S fs4, MCONTEXT_FPREGS_FS4(a0)
|
||||
FREG_S fs5, MCONTEXT_FPREGS_FS5(a0)
|
||||
FREG_S fs6, MCONTEXT_FPREGS_FS6(a0)
|
||||
FREG_S fs7, MCONTEXT_FPREGS_FS7(a0)
|
||||
FREG_S fs8, MCONTEXT_FPREGS_FS8(a0)
|
||||
FREG_S fs9, MCONTEXT_FPREGS_FS9(a0)
|
||||
FREG_S fs10, MCONTEXT_FPREGS_FS10(a0)
|
||||
FREG_S fs11, MCONTEXT_FPREGS_FS11(a0)
|
||||
FREG_S ft8, MCONTEXT_FPREGS_FT8(a0)
|
||||
FREG_S ft9, MCONTEXT_FPREGS_FT9(a0)
|
||||
FREG_S ft10, MCONTEXT_FPREGS_FT10(a0)
|
||||
FREG_S ft11, MCONTEXT_FPREGS_FT11(a0)
|
||||
|
||||
sw a1, MCONTEXT_FPC_CSR(a0)
|
||||
# endif // __riscv_float_abi_soft
|
||||
mv a1, zero
|
||||
add a2, a0, UCONTEXT_SIGMASK_OFFSET
|
||||
li a3, _NSIG8
|
||||
mv a0, zero
|
||||
li a7, __NR_rt_sigprocmask
|
||||
ecall
|
||||
mv a0, zero
|
||||
ret
|
||||
|
||||
.cfi_endproc
|
||||
.size breakpad_getcontext, . - breakpad_getcontext
|
||||
|
||||
#else
|
||||
#error "This file has not been ported for your CPU!"
|
||||
# error "This file has not been ported for your CPU!"
|
||||
#endif
|
||||
|
||||
#if defined(__aarch64__)
|
||||
|
||||
@@ -113,6 +113,25 @@ TEST(AndroidUContext, GRegsOffset) {
|
||||
|
||||
ASSERT_EQ(static_cast<size_t>(MCONTEXT_FPC_CSR),
|
||||
offsetof(ucontext_t,uc_mcontext.fpc_csr));
|
||||
#elif defined(__riscv)
|
||||
ASSERT_EQ(static_cast<size_t>(MCONTEXT_GREGS_OFFSET),
|
||||
offsetof(ucontext_t,uc_mcontext.__gregs[0]));
|
||||
|
||||
#define CHECK_REG(x) \
|
||||
ASSERT_EQ(static_cast<size_t>(MCONTEXT_##x##_OFFSET), \
|
||||
offsetof(ucontext_t,uc_mcontext.__gregs[REG_##x]))
|
||||
CHECK_REG(PC)
|
||||
CHECK_REG(RA)
|
||||
CHECK_REG(SP)
|
||||
CHECK_REG(S0)
|
||||
CHECK_REG(S1)
|
||||
CHECK_REG(S2)
|
||||
|
||||
ASSERT_EQ(static_cast<size_t>(MCONTEXT_FPREGS_OFFSET),
|
||||
offsetof(ucontext_t,uc_mcontext.__fpregs));
|
||||
|
||||
ASSERT_EQ(static_cast<size_t>(MCONTEXT_FPC_CSR),
|
||||
offsetof(ucontext_t,uc_mcontext.__fpregs.__fcsr));
|
||||
#elif defined(__x86_64__)
|
||||
|
||||
COMPILE_ASSERT_EQ(static_cast<size_t>(MCONTEXT_GREGS_OFFSET),
|
||||
|
||||
@@ -64,7 +64,8 @@ bool MemoryMappedFile::Map(const char* path, size_t offset) {
|
||||
}
|
||||
|
||||
#if defined(__x86_64__) || defined(__aarch64__) || \
|
||||
(defined(__mips__) && _MIPS_SIM == _ABI64)
|
||||
(defined(__mips__) && _MIPS_SIM == _ABI64) || \
|
||||
(defined(__riscv) && __riscv_xlen == 64)
|
||||
|
||||
struct kernel_stat st;
|
||||
if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
|
||||
|
||||
@@ -145,8 +145,107 @@
|
||||
#endif
|
||||
#define FPREGS_OFFSET_MXCSR 24
|
||||
|
||||
#elif defined(__riscv)
|
||||
|
||||
#if __riscv_xlen == 32
|
||||
#define UCONTEXT_SIGMASK_OFFSET 20
|
||||
#define MCONTEXT_GREGS_OFFSET 148
|
||||
#define MCONTEXT_GREGS_SIZE 4
|
||||
#define REG_S sw
|
||||
#elif __riscv_xlen == 64
|
||||
#define UCONTEXT_SIGMASK_OFFSET 40
|
||||
#define MCONTEXT_GREGS_OFFSET 168
|
||||
#define MCONTEXT_GREGS_SIZE 8
|
||||
#define REG_S sd
|
||||
#else
|
||||
#error "This header has not been ported for your CPU"
|
||||
#error "Unexpected __riscv_xlen"
|
||||
#endif
|
||||
|
||||
#define MCONTEXT_GREGS_PC MCONTEXT_GREGS_OFFSET + 0*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_RA MCONTEXT_GREGS_OFFSET + 1*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_SP MCONTEXT_GREGS_OFFSET + 2*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_GP MCONTEXT_GREGS_OFFSET + 3*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_TP MCONTEXT_GREGS_OFFSET + 4*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_T0 MCONTEXT_GREGS_OFFSET + 5*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_T1 MCONTEXT_GREGS_OFFSET + 6*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_T2 MCONTEXT_GREGS_OFFSET + 7*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S0 MCONTEXT_GREGS_OFFSET + 8*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S1 MCONTEXT_GREGS_OFFSET + 9*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_A0 MCONTEXT_GREGS_OFFSET + 10*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_A1 MCONTEXT_GREGS_OFFSET + 11*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_A2 MCONTEXT_GREGS_OFFSET + 12*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_A3 MCONTEXT_GREGS_OFFSET + 13*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_A4 MCONTEXT_GREGS_OFFSET + 14*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_A5 MCONTEXT_GREGS_OFFSET + 15*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_A6 MCONTEXT_GREGS_OFFSET + 16*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_A7 MCONTEXT_GREGS_OFFSET + 17*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S2 MCONTEXT_GREGS_OFFSET + 18*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S3 MCONTEXT_GREGS_OFFSET + 19*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S4 MCONTEXT_GREGS_OFFSET + 20*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S5 MCONTEXT_GREGS_OFFSET + 21*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S6 MCONTEXT_GREGS_OFFSET + 22*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S7 MCONTEXT_GREGS_OFFSET + 23*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S8 MCONTEXT_GREGS_OFFSET + 24*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S9 MCONTEXT_GREGS_OFFSET + 25*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S10 MCONTEXT_GREGS_OFFSET + 26*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_S11 MCONTEXT_GREGS_OFFSET + 27*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_T3 MCONTEXT_GREGS_OFFSET + 28*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_T4 MCONTEXT_GREGS_OFFSET + 29*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_T5 MCONTEXT_GREGS_OFFSET + 30*MCONTEXT_GREGS_SIZE
|
||||
#define MCONTEXT_GREGS_T6 MCONTEXT_GREGS_OFFSET + 31*MCONTEXT_GREGS_SIZE
|
||||
|
||||
#define MCONTEXT_FPREGS_OFFSET MCONTEXT_GREGS_OFFSET + 32*MCONTEXT_GREGS_SIZE
|
||||
|
||||
#if __riscv_flen == 32
|
||||
#define MCONTEXT_FPREGS_SIZE 4
|
||||
#define FREG_S fsw
|
||||
#elif __riscv_flen == 64
|
||||
#define MCONTEXT_FPREGS_SIZE 8
|
||||
#define FREG_S fsd
|
||||
#elif __riscv_flen == 128
|
||||
#define MCONTEXT_FPREGS_SIZE 16
|
||||
#define FREG_S fsq
|
||||
#else
|
||||
#error "Unexpected __riscv_flen"
|
||||
#endif
|
||||
|
||||
#define MCONTEXT_FPREGS_FT0 MCONTEXT_FPREGS_OFFSET + 0*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT1 MCONTEXT_FPREGS_OFFSET + 1*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT2 MCONTEXT_FPREGS_OFFSET + 2*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT3 MCONTEXT_FPREGS_OFFSET + 3*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT4 MCONTEXT_FPREGS_OFFSET + 4*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT5 MCONTEXT_FPREGS_OFFSET + 5*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT6 MCONTEXT_FPREGS_OFFSET + 6*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT7 MCONTEXT_FPREGS_OFFSET + 7*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS0 MCONTEXT_FPREGS_OFFSET + 8*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS1 MCONTEXT_FPREGS_OFFSET + 9*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FA0 MCONTEXT_FPREGS_OFFSET + 10*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FA1 MCONTEXT_FPREGS_OFFSET + 11*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FA2 MCONTEXT_FPREGS_OFFSET + 12*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FA3 MCONTEXT_FPREGS_OFFSET + 13*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FA4 MCONTEXT_FPREGS_OFFSET + 14*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FA5 MCONTEXT_FPREGS_OFFSET + 15*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FA6 MCONTEXT_FPREGS_OFFSET + 16*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FA7 MCONTEXT_FPREGS_OFFSET + 17*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS2 MCONTEXT_FPREGS_OFFSET + 18*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS3 MCONTEXT_FPREGS_OFFSET + 19*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS4 MCONTEXT_FPREGS_OFFSET + 20*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS5 MCONTEXT_FPREGS_OFFSET + 21*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS6 MCONTEXT_FPREGS_OFFSET + 22*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS7 MCONTEXT_FPREGS_OFFSET + 23*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS8 MCONTEXT_FPREGS_OFFSET + 24*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS9 MCONTEXT_FPREGS_OFFSET + 25*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS10 MCONTEXT_FPREGS_OFFSET + 26*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FS11 MCONTEXT_FPREGS_OFFSET + 27*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT8 MCONTEXT_FPREGS_OFFSET + 28*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT9 MCONTEXT_FPREGS_OFFSET + 29*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT10 MCONTEXT_FPREGS_OFFSET + 30*MCONTEXT_FPREGS_SIZE
|
||||
#define MCONTEXT_FPREGS_FT11 MCONTEXT_FPREGS_OFFSET + 31*MCONTEXT_FPREGS_SIZE
|
||||
|
||||
#define MCONTEXT_FPC_CSR MCONTEXT_FPREGS_OFFSET + 32*MCONTEXT_FPREGS_SIZE
|
||||
|
||||
#else
|
||||
# error "This header has not been ported for your CPU"
|
||||
#endif
|
||||
|
||||
#endif // GOOGLEBREAKPAD_COMMON_ANDROID_UCONTEXT_CONSTANTS_H
|
||||
|
||||
Reference in New Issue
Block a user