Add more CPU architectures for register dumping on haiku OS, avoid copying mcontext_t on most operating systems

This commit is contained in:
UnknownShadow200 2023-06-15 22:56:15 +10:00
parent a6e226ce94
commit 4a3bae7dce

View File

@ -626,16 +626,16 @@ static void PrintRegisters(cc_string* str, void* ctx) {
/* -> usr/src/uts/[ARCH]/sys/mcontext.h */ /* -> usr/src/uts/[ARCH]/sys/mcontext.h */
/* -> usr/src/uts/[ARCH]/sys/regset.h */ /* -> usr/src/uts/[ARCH]/sys/regset.h */
static void PrintRegisters(cc_string* str, void* ctx) { static void PrintRegisters(cc_string* str, void* ctx) {
mcontext_t r = ((ucontext_t*)ctx)->uc_mcontext; mcontext_t* r = &((ucontext_t*)ctx)->uc_mcontext;
#if defined __i386__ #if defined __i386__
#define REG_GET(ign, reg) &r.gregs[E##reg] #define REG_GET(ign, reg) &r->gregs[E##reg]
Dump_X86() Dump_X86()
#elif defined __x86_64__ #elif defined __x86_64__
#define REG_GET(ign, reg) &r.gregs[REG_R##reg] #define REG_GET(ign, reg) &r->gregs[REG_R##reg]
Dump_X64() Dump_X64()
#elif defined __sparc__ #elif defined __sparc__
#define REG_GET(ign, reg) &r.gregs[REG_##reg] #define REG_GET(ign, reg) &r->gregs[REG_##reg]
Dump_SPARC() Dump_SPARC()
#else #else
#error "Unknown CPU architecture" #error "Unknown CPU architecture"
@ -645,43 +645,43 @@ static void PrintRegisters(cc_string* str, void* ctx) {
/* See /usr/include/[ARCH]/mcontext.h */ /* See /usr/include/[ARCH]/mcontext.h */
/* -> src/sys/arch/[ARCH]/include/mcontext.h */ /* -> src/sys/arch/[ARCH]/include/mcontext.h */
static void PrintRegisters(cc_string* str, void* ctx) { static void PrintRegisters(cc_string* str, void* ctx) {
mcontext_t r = ((ucontext_t*)ctx)->uc_mcontext; mcontext_t* r = &((ucontext_t*)ctx)->uc_mcontext;
#if defined __i386__ #if defined __i386__
#define REG_GET(ign, reg) &r.__gregs[_REG_E##reg] #define REG_GET(ign, reg) &r->__gregs[_REG_E##reg]
Dump_X86() Dump_X86()
#elif defined __x86_64__ #elif defined __x86_64__
#define REG_GET(ign, reg) &r.__gregs[_REG_R##reg] #define REG_GET(ign, reg) &r->__gregs[_REG_R##reg]
Dump_X64() Dump_X64()
#elif defined __aarch64__ #elif defined __aarch64__
#define REG_GNUM(num) &r.__gregs[num] #define REG_GNUM(num) &r->__gregs[num]
#define REG_GET_FP() &r.__gregs[_REG_FP] #define REG_GET_FP() &r->__gregs[_REG_FP]
#define REG_GET_LR() &r.__gregs[_REG_LR] #define REG_GET_LR() &r->__gregs[_REG_LR]
#define REG_GET_SP() &r.__gregs[_REG_SP] #define REG_GET_SP() &r->__gregs[_REG_SP]
#define REG_GET_PC() &r.__gregs[_REG_PC] #define REG_GET_PC() &r->__gregs[_REG_PC]
Dump_ARM64() Dump_ARM64()
#elif defined __arm__ #elif defined __arm__
#define REG_GNUM(num) &r.__gregs[num] #define REG_GNUM(num) &r->__gregs[num]
#define REG_GET_FP() &r.__gregs[_REG_FP] #define REG_GET_FP() &r->__gregs[_REG_FP]
#define REG_GET_IP() &r.__gregs[12] #define REG_GET_IP() &r->__gregs[12]
#define REG_GET_SP() &r.__gregs[_REG_SP] #define REG_GET_SP() &r->__gregs[_REG_SP]
#define REG_GET_LR() &r.__gregs[_REG_LR] #define REG_GET_LR() &r->__gregs[_REG_LR]
#define REG_GET_PC() &r.__gregs[_REG_PC] #define REG_GET_PC() &r->__gregs[_REG_PC]
Dump_ARM32() Dump_ARM32()
#elif defined __powerpc__ #elif defined __powerpc__
#define REG_GNUM(num) &r.__gregs[num] #define REG_GNUM(num) &r->__gregs[num]
#define REG_GET_PC() &r.__gregs[_REG_PC] #define REG_GET_PC() &r->__gregs[_REG_PC]
#define REG_GET_LR() &r.__gregs[_REG_LR] #define REG_GET_LR() &r->__gregs[_REG_LR]
#define REG_GET_CTR() &r.__gregs[_REG_CTR] #define REG_GET_CTR() &r->__gregs[_REG_CTR]
Dump_PPC() Dump_PPC()
#elif defined __mips__ #elif defined __mips__
#define REG_GNUM(num) &r.__gregs[num] #define REG_GNUM(num) &r->__gregs[num]
#define REG_GET_PC() &r.__gregs[_REG_EPC] #define REG_GET_PC() &r->__gregs[_REG_EPC]
#define REG_GET_LO() &r.__gregs[_REG_MDLO] #define REG_GET_LO() &r->__gregs[_REG_MDLO]
#define REG_GET_HI() &r.__gregs[_REG_MDHI] #define REG_GET_HI() &r->__gregs[_REG_MDHI]
Dump_MIPS() Dump_MIPS()
#elif defined __riscv #elif defined __riscv
#define REG_GNUM(num) &r.__gregs[num] #define REG_GNUM(num) &r->__gregs[num]
#define REG_GET_PC() &r.__gregs[_REG_PC] #define REG_GET_PC() &r->__gregs[_REG_PC]
Dump_RISCV() Dump_RISCV()
#else #else
#error "Unknown CPU architecture" #error "Unknown CPU architecture"
@ -691,39 +691,39 @@ static void PrintRegisters(cc_string* str, void* ctx) {
/* See /usr/include/machine/ucontext.h */ /* See /usr/include/machine/ucontext.h */
/* -> src/sys/[ARCH]/include/ucontext.h */ /* -> src/sys/[ARCH]/include/ucontext.h */
static void PrintRegisters(cc_string* str, void* ctx) { static void PrintRegisters(cc_string* str, void* ctx) {
mcontext_t r = ((ucontext_t*)ctx)->uc_mcontext; mcontext_t* r = &((ucontext_t*)ctx)->uc_mcontext;
#if defined __i386__ #if defined __i386__
#define REG_GET(reg, ign) &r.mc_e##reg #define REG_GET(reg, ign) &r->mc_e##reg
Dump_X86() Dump_X86()
#elif defined __x86_64__ #elif defined __x86_64__
#define REG_GET(reg, ign) &r.mc_r##reg #define REG_GET(reg, ign) &r->mc_r##reg
Dump_X64() Dump_X64()
#elif defined __aarch64__ #elif defined __aarch64__
#define REG_GNUM(num) &r.mc_gpregs.gp_x[num] #define REG_GNUM(num) &r->mc_gpregs.gp_x[num]
#define REG_GET_FP() &r.mc_gpregs.gp_x[29] #define REG_GET_FP() &r->mc_gpregs.gp_x[29]
#define REG_GET_LR() &r.mc_gpregs.gp_lr #define REG_GET_LR() &r->mc_gpregs.gp_lr
#define REG_GET_SP() &r.mc_gpregs.gp_sp #define REG_GET_SP() &r->mc_gpregs.gp_sp
#define REG_GET_PC() &r.mc_gpregs.gp_elr #define REG_GET_PC() &r->mc_gpregs.gp_elr
Dump_ARM64() Dump_ARM64()
#elif defined __arm__ #elif defined __arm__
#define REG_GNUM(num) &r.__gregs[num] #define REG_GNUM(num) &r->__gregs[num]
#define REG_GET_FP() &r.__gregs[_REG_FP] #define REG_GET_FP() &r->__gregs[_REG_FP]
#define REG_GET_IP() &r.__gregs[12] #define REG_GET_IP() &r->__gregs[12]
#define REG_GET_SP() &r.__gregs[_REG_SP] #define REG_GET_SP() &r->__gregs[_REG_SP]
#define REG_GET_LR() &r.__gregs[_REG_LR] #define REG_GET_LR() &r->__gregs[_REG_LR]
#define REG_GET_PC() &r.__gregs[_REG_PC] #define REG_GET_PC() &r->__gregs[_REG_PC]
Dump_ARM32() Dump_ARM32()
#elif defined __powerpc__ #elif defined __powerpc__
#define REG_GNUM(num) &r.mc_frame[##num] #define REG_GNUM(num) &r->mc_frame[##num]
#define REG_GET_PC() &r.mc_srr0 #define REG_GET_PC() &r->mc_srr0
#define REG_GET_LR() &r.mc_lr #define REG_GET_LR() &r->mc_lr
#define REG_GET_CTR() &r.mc_ctr #define REG_GET_CTR() &r->mc_ctr
Dump_PPC() Dump_PPC()
#elif defined __mips__ #elif defined __mips__
#define REG_GNUM(num) &r.mc_regs[num] #define REG_GNUM(num) &r->mc_regs[num]
#define REG_GET_PC() &r.mc_pc #define REG_GET_PC() &r->mc_pc
#define REG_GET_LO() &r.mullo #define REG_GET_LO() &r->mullo
#define REG_GET_HI() &r.mulhi #define REG_GET_HI() &r->mulhi
Dump_MIPS() Dump_MIPS()
#else #else
#error "Unknown CPU architecture" #error "Unknown CPU architecture"
@ -772,26 +772,46 @@ static void PrintRegisters(cc_string* str, void* ctx) {
#endif #endif
} }
#elif defined CC_BUILD_HAIKU #elif defined CC_BUILD_HAIKU
/* See /headers/posix/arch/[ARCH]/signal.h */
static void PrintRegisters(cc_string* str, void* ctx) { static void PrintRegisters(cc_string* str, void* ctx) {
mcontext_t r = ((ucontext_t*)ctx)->uc_mcontext; mcontext_t* r = &((ucontext_t*)ctx)->uc_mcontext;
#if defined __i386__ #if defined __i386__
#define REG_GET(reg, ign) &r.me##reg #define REG_GET(reg, ign) &r->e##reg
Dump_X86() Dump_X86()
#elif defined __x86_64__ #elif defined __x86_64__
#define REG_GET(reg, ign) &r.r##reg #define REG_GET(reg, ign) &r->r##reg
Dump_X64() Dump_X64()
#elif defined __aarch64__
#define REG_GNUM(num) &r->x[num]
#define REG_GET_FP() &r->x[29]
#define REG_GET_LR() &r->lr
#define REG_GET_SP() &r->sp
#define REG_GET_PC() &r->elr
Dump_ARM64()
#elif defined __arm__
#define REG_GNUM(num) &r->r##num
#define REG_GET_FP() &r->r11
#define REG_GET_IP() &r->r12
#define REG_GET_SP() &r->r13
#define REG_GET_LR() &r->r14
#define REG_GET_PC() &r->r15
Dump_ARM32()
#elif defined __riscv
#define REG_GNUM(num) &r->x[num - 1]
#define REG_GET_PC() &r->pc
Dump_RISCV()
#else #else
#error "Unknown CPU architecture" #error "Unknown CPU architecture"
#endif #endif
} }
#elif defined CC_BUILD_SERENITY #elif defined CC_BUILD_SERENITY
static void PrintRegisters(cc_string* str, void* ctx) { static void PrintRegisters(cc_string* str, void* ctx) {
mcontext_t r = ((ucontext_t*)ctx)->uc_mcontext; mcontext_t* r = &((ucontext_t*)ctx)->uc_mcontext;
#if defined __i386__ #if defined __i386__
#define REG_GET(reg, ign) &r.e##reg #define REG_GET(reg, ign) &r->e##reg
Dump_X86() Dump_X86()
#elif defined __x86_64__ #elif defined __x86_64__
#define REG_GET(reg, ign) &r.r##reg #define REG_GET(reg, ign) &r->r##reg
Dump_X64() Dump_X64()
#else #else
#error "Unknown CPU architecture" #error "Unknown CPU architecture"