static void mips64_fbsd_sigframe_init (const struct tramp_frame *self, struct frame_info *this_frame, struct trad_frame_cache *cache, CORE_ADDR func) { struct gdbarch *gdbarch = get_frame_arch (this_frame); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR sp, ucontext_addr, addr; int regnum; gdb_byte buf[4]; /* We find the appropriate instance of `ucontext_t' at a fixed offset in the signal frame. */ sp = get_frame_register_signed (this_frame, MIPS_SP_REGNUM + gdbarch_num_regs (gdbarch)); ucontext_addr = sp + N64_SIGFRAME_UCONTEXT_OFFSET; /* PC. */ regnum = mips_regnum (gdbarch)->pc; trad_frame_set_reg_addr (cache, regnum + gdbarch_num_regs (gdbarch), ucontext_addr + N64_UCONTEXT_PC); /* GPRs. */ for (regnum = MIPS_ZERO_REGNUM, addr = ucontext_addr + N64_UCONTEXT_REGS; regnum <= MIPS_RA_REGNUM; regnum++, addr += N64_UCONTEXT_REG_SIZE) trad_frame_set_reg_addr (cache, regnum + gdbarch_num_regs (gdbarch), addr); regnum = MIPS_PS_REGNUM; trad_frame_set_reg_addr (cache, regnum + gdbarch_num_regs (gdbarch), ucontext_addr + N64_UCONTEXT_SR); /* HI and LO. */ regnum = mips_regnum (gdbarch)->lo; trad_frame_set_reg_addr (cache, regnum + gdbarch_num_regs (gdbarch), ucontext_addr + N64_UCONTEXT_LO); regnum = mips_regnum (gdbarch)->hi; trad_frame_set_reg_addr (cache, regnum + gdbarch_num_regs (gdbarch), ucontext_addr + N64_UCONTEXT_HI); if (target_read_memory (ucontext_addr + N64_UCONTEXT_FPUSED, buf, 4) == 0 && extract_unsigned_integer (buf, 4, byte_order) != 0) { for (regnum = 0, addr = ucontext_addr + N64_UCONTEXT_FPREGS; regnum < 32; regnum++, addr += N64_UCONTEXT_REG_SIZE) trad_frame_set_reg_addr (cache, regnum + gdbarch_fp0_regnum (gdbarch), addr); trad_frame_set_reg_addr (cache, mips_regnum (gdbarch)->fp_control_status, addr); } trad_frame_set_id (cache, frame_id_build (sp, func)); }
static void mips64obsd_sigframe_init (const struct tramp_frame *self, struct frame_info *this_frame, struct trad_frame_cache *cache, CORE_ADDR func) { struct gdbarch *gdbarch = get_frame_arch (this_frame); CORE_ADDR sp, sigcontext_addr, addr; int regnum; /* We find the appropriate instance of `struct sigcontext' at a fixed offset in the signal frame. */ sp = get_frame_register_signed (this_frame, MIPS_SP_REGNUM + gdbarch_num_regs (gdbarch)); sigcontext_addr = sp + 32; /* PC. */ regnum = mips_regnum (gdbarch)->pc; trad_frame_set_reg_addr (cache, regnum + gdbarch_num_regs (gdbarch), sigcontext_addr + 16); /* GPRs. */ for (regnum = MIPS_AT_REGNUM, addr = sigcontext_addr + 32; regnum <= MIPS_RA_REGNUM; regnum++, addr += 8) trad_frame_set_reg_addr (cache, regnum + gdbarch_num_regs (gdbarch), addr); /* HI and LO. */ regnum = mips_regnum (gdbarch)->lo; trad_frame_set_reg_addr (cache, regnum + gdbarch_num_regs (gdbarch), sigcontext_addr + 280); regnum = mips_regnum (gdbarch)->hi; trad_frame_set_reg_addr (cache, regnum + gdbarch_num_regs (gdbarch), sigcontext_addr + 288); /* TODO: Handle the floating-point registers. */ trad_frame_set_id (cache, frame_id_build (sp, func)); }
/* Implement the "init" routine in struct tramp_frame for the N32 ABI on mips-irix. */ static void mips_irix_n32_tramp_frame_init (const struct tramp_frame *self, struct frame_info *this_frame, struct trad_frame_cache *this_cache, CORE_ADDR func) { struct gdbarch *gdbarch = get_frame_arch (this_frame); const int num_regs = gdbarch_num_regs (gdbarch); int sp_cooked_regno = num_regs + MIPS_SP_REGNUM; const CORE_ADDR sp = get_frame_register_signed (this_frame, sp_cooked_regno); const CORE_ADDR sigcontext_base = sp + 48; const struct mips_regnum *regs = mips_regnum (gdbarch); int ireg; trad_frame_set_reg_addr (this_cache, regs->pc + gdbarch_num_regs (gdbarch), sigcontext_base + SIGCONTEXT_PC_OFF); for (ireg = 1; ireg < 32; ireg++) trad_frame_set_reg_addr (this_cache, ireg + MIPS_ZERO_REGNUM + num_regs, sigcontext_base + SIGCONTEXT_REGS_OFF + ireg * 8); for (ireg = 0; ireg < 32; ireg++) trad_frame_set_reg_addr (this_cache, ireg + regs->fp0 + num_regs, sigcontext_base + SIGCONTEXT_FPREGS_OFF + ireg * 8); trad_frame_set_reg_addr (this_cache, regs->fp_control_status + num_regs, sigcontext_base + SIGCONTEXT_FPCSR_OFF); trad_frame_set_reg_addr (this_cache, regs->hi + num_regs, sigcontext_base + SIGCONTEXT_HI_OFF); trad_frame_set_reg_addr (this_cache, regs->lo + num_regs, sigcontext_base + SIGCONTEXT_LO_OFF); trad_frame_set_id (this_cache, frame_id_build (sigcontext_base, func)); }
static void armobsd_sigframe_init (const struct tramp_frame *self, struct frame_info *this_frame, struct trad_frame_cache *cache, CORE_ADDR func) { CORE_ADDR sp, sigcontext_addr, addr; int regnum; /* We find the appropriate instance of `struct sigcontext' at a fixed offset in the signal frame. */ sp = get_frame_register_signed (this_frame, ARM_SP_REGNUM); sigcontext_addr = sp + 16; /* PC. */ trad_frame_set_reg_addr (cache, ARM_PC_REGNUM, sigcontext_addr + 76); /* GPRs. */ for (regnum = ARM_A1_REGNUM, addr = sigcontext_addr + 12; regnum <= ARM_LR_REGNUM; regnum++, addr += 4) trad_frame_set_reg_addr (cache, regnum, addr); trad_frame_set_id (cache, frame_id_build (sp, func)); }
static struct trad_frame_cache * mips_sde_frame_cache (struct frame_info *this_frame, void **this_cache) { struct gdbarch *gdbarch = get_frame_arch (this_frame); const struct mips_regnum *regs = mips_regnum (gdbarch); const int sizeof_reg_t = mips_abi_regsize (gdbarch); enum mips_abi abi = mips_abi (gdbarch); struct trad_frame_cache *cache; CORE_ADDR xcpt_frame; CORE_ADDR start_addr; CORE_ADDR stack_addr; CORE_ADDR pc; int i; if (*this_cache != NULL) return (struct trad_frame_cache *) *this_cache; cache = trad_frame_cache_zalloc (this_frame); *this_cache = cache; /* The previous registers are held in struct xcptcontext which is at $sp+offs struct xcptcontext { reg_t sr; CP0 Status reg_t cr; CP0 Cause reg_t epc; CP0 EPC reg_t vaddr; CP0 BadVAddr reg_t regs[32]; General registers reg_t mdlo; LO reg_t mdhi; HI reg_t mdex; ACX ... }; */ stack_addr = get_frame_register_signed (this_frame, gdbarch_sp_regnum (gdbarch)); switch (abi) { case MIPS_ABI_O32: /* 40: XCPTCONTEXT 24: xcpt_gen() argspace (16 bytes) 16: _xcptcall() saved ra, rounded up ( 8 bytes) 00: _xcptcall() argspace (16 bytes) */ xcpt_frame = stack_addr + 40; break; case MIPS_ABI_N32: case MIPS_ABI_N64: default: /* Wild guess. */ /* 16: XCPTCONTEXT 16: xcpt_gen() argspace ( 0 bytes) 00: _xcptcall() saved ra, rounded up (16 bytes) */ xcpt_frame = stack_addr + 16; break; } trad_frame_set_reg_addr (cache, MIPS_PS_REGNUM + gdbarch_num_regs (gdbarch), xcpt_frame + 0 * sizeof_reg_t); trad_frame_set_reg_addr (cache, regs->cause + gdbarch_num_regs (gdbarch), xcpt_frame + 1 * sizeof_reg_t); trad_frame_set_reg_addr (cache, regs->pc + gdbarch_num_regs (gdbarch), xcpt_frame + 2 * sizeof_reg_t); trad_frame_set_reg_addr (cache, regs->badvaddr + gdbarch_num_regs (gdbarch), xcpt_frame + 3 * sizeof_reg_t); for (i = 0; i < MIPS_NUMREGS; i++) trad_frame_set_reg_addr (cache, i + MIPS_ZERO_REGNUM + gdbarch_num_regs (gdbarch), xcpt_frame + (4 + i) * sizeof_reg_t); trad_frame_set_reg_addr (cache, regs->lo + gdbarch_num_regs (gdbarch), xcpt_frame + 36 * sizeof_reg_t); trad_frame_set_reg_addr (cache, regs->hi + gdbarch_num_regs (gdbarch), xcpt_frame + 37 * sizeof_reg_t); pc = get_frame_pc (this_frame); find_pc_partial_function (pc, NULL, &start_addr, NULL); trad_frame_set_id (cache, frame_id_build (start_addr, stack_addr)); return cache; }