static struct sparc_frame_cache * sparc64_sol2_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) { struct sparc_frame_cache *cache; CORE_ADDR mcontext_addr, addr; int regnum; if (*this_cache) return *this_cache; cache = sparc_frame_cache (this_frame, this_cache); gdb_assert (cache == *this_cache); cache->saved_regs = trad_frame_alloc_saved_regs (this_frame); /* The third argument is a pointer to an instance of `ucontext_t', which has a member `uc_mcontext' that contains the saved registers. */ regnum = (cache->copied_regs_mask & 0x04) ? SPARC_I2_REGNUM : SPARC_O2_REGNUM; mcontext_addr = get_frame_register_unsigned (this_frame, regnum) + 64; cache->saved_regs[SPARC64_CCR_REGNUM].addr = mcontext_addr + 0 * 8; cache->saved_regs[SPARC64_PC_REGNUM].addr = mcontext_addr + 1 * 8; cache->saved_regs[SPARC64_NPC_REGNUM].addr = mcontext_addr + 2 * 8; cache->saved_regs[SPARC64_Y_REGNUM].addr = mcontext_addr + 3 * 8; cache->saved_regs[SPARC64_ASI_REGNUM].addr = mcontext_addr + 19 * 8; cache->saved_regs[SPARC64_FPRS_REGNUM].addr = mcontext_addr + 20 * 8; /* Since %g0 is always zero, keep the identity encoding. */ for (regnum = SPARC_G1_REGNUM, addr = mcontext_addr + 4 * 8; regnum <= SPARC_O7_REGNUM; regnum++, addr += 8) cache->saved_regs[regnum].addr = addr; if (get_frame_memory_unsigned (this_frame, mcontext_addr + 21 * 8, 8)) { /* The register windows haven't been flushed. */ for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++) trad_frame_set_unknown (cache->saved_regs, regnum); } else { CORE_ADDR sp; addr = cache->saved_regs[SPARC_SP_REGNUM].addr; sp = get_frame_memory_unsigned (this_frame, addr, 8); for (regnum = SPARC_L0_REGNUM, addr = sp + BIAS; regnum <= SPARC_I7_REGNUM; regnum++, addr += 8) cache->saved_regs[regnum].addr = addr; } return cache; }
static struct sparc_frame_cache * sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache) { struct sparc_frame_cache *cache; CORE_ADDR mcontext_addr, addr; int regnum; if (*this_cache) return *this_cache; cache = sparc_frame_cache (next_frame, this_cache); gdb_assert (cache == *this_cache); cache->saved_regs = trad_frame_alloc_saved_regs (next_frame); /* The third argument is a pointer to an instance of `ucontext_t', which has a member `uc_mcontext' that contains the saved registers. */ regnum = (cache->frameless_p ? SPARC_O2_REGNUM : SPARC_I2_REGNUM); mcontext_addr = frame_unwind_register_unsigned (next_frame, regnum) + 40; cache->saved_regs[SPARC32_PSR_REGNUM].addr = mcontext_addr + 0 * 4; cache->saved_regs[SPARC32_PC_REGNUM].addr = mcontext_addr + 1 * 4; cache->saved_regs[SPARC32_NPC_REGNUM].addr = mcontext_addr + 2 * 4; cache->saved_regs[SPARC32_Y_REGNUM].addr = mcontext_addr + 3 * 4; /* Since %g0 is always zero, keep the identity encoding. */ for (regnum = SPARC_G1_REGNUM, addr = mcontext_addr + 4 * 4; regnum <= SPARC_O7_REGNUM; regnum++, addr += 4) cache->saved_regs[regnum].addr = addr; if (get_frame_memory_unsigned (next_frame, mcontext_addr + 19 * 4, 4)) { /* The register windows haven't been flushed. */ for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++) trad_frame_set_unknown (cache->saved_regs, regnum); } else { addr = cache->saved_regs[SPARC_SP_REGNUM].addr; addr = get_frame_memory_unsigned (next_frame, addr, 4); for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++, addr += 4) cache->saved_regs[regnum].addr = addr; } return cache; }