Lines Matching refs:sr
616 push (struct unw_state_record *sr) in push() argument
625 memcpy(rs, &sr->curr, sizeof(*rs)); in push()
626 sr->curr.next = rs; in push()
630 pop (struct unw_state_record *sr) in pop() argument
632 struct unw_reg_state *rs = sr->curr.next; in pop()
638 memcpy(&sr->curr, rs, sizeof(*rs)); in pop()
746 finish_prologue (struct unw_state_record *sr) in finish_prologue() argument
757 reg = sr->curr.reg + unw.save_order[i]; in finish_prologue()
760 reg->val = sr->gr_save_loc++; in finish_prologue()
770 if (sr->imask) { in finish_prologue()
771 unsigned char kind, mask = 0, *cp = sr->imask; in finish_prologue()
778 regs[0] = sr->curr.reg + UNW_REG_F2; in finish_prologue()
779 regs[1] = sr->curr.reg + UNW_REG_R4; in finish_prologue()
780 regs[2] = sr->curr.reg + UNW_REG_B1; in finish_prologue()
782 for (t = 0; t < sr->region_len; ++t) { in finish_prologue()
787 spill_next_when(®s[kind - 1], sr->curr.reg + limit[kind - 1], in finish_prologue()
788 sr->region_start + t); in finish_prologue()
794 if (sr->any_spills) { in finish_prologue()
795 off = sr->spill_offset; in finish_prologue()
796 alloc_spill_area(&off, 16, sr->curr.reg + UNW_REG_F2, sr->curr.reg + UNW_REG_F31); in finish_prologue()
797 alloc_spill_area(&off, 8, sr->curr.reg + UNW_REG_B1, sr->curr.reg + UNW_REG_B5); in finish_prologue()
798 alloc_spill_area(&off, 8, sr->curr.reg + UNW_REG_R4, sr->curr.reg + UNW_REG_R7); in finish_prologue()
808 struct unw_state_record *sr) in desc_prologue() argument
812 if (!(sr->in_body || sr->first_region)) in desc_prologue()
813 finish_prologue(sr); in desc_prologue()
814 sr->first_region = 0; in desc_prologue()
817 if (sr->when_target < sr->region_start + sr->region_len) { in desc_prologue()
818 sr->done = 1; in desc_prologue()
822 region_start = sr->region_start + sr->region_len; in desc_prologue()
824 for (i = 0; i < sr->epilogue_count; ++i) in desc_prologue()
825 pop(sr); in desc_prologue()
826 sr->epilogue_count = 0; in desc_prologue()
827 sr->epilogue_start = UNW_WHEN_NEVER; in desc_prologue()
829 sr->region_start = region_start; in desc_prologue()
830 sr->region_len = rlen; in desc_prologue()
831 sr->in_body = body; in desc_prologue()
834 push(sr); in desc_prologue()
838 set_reg(sr->curr.reg + unw.save_order[i], UNW_WHERE_GR, in desc_prologue()
839 sr->region_start + sr->region_len - 1, grsave++); in desc_prologue()
842 sr->gr_save_loc = grsave; in desc_prologue()
843 sr->any_spills = 0; in desc_prologue()
844 sr->imask = NULL; in desc_prologue()
845 sr->spill_offset = 0x10; /* default to psp+16 */ in desc_prologue()
854 desc_abi (unsigned char abi, unsigned char context, struct unw_state_record *sr) in desc_abi() argument
857 sr->flags |= UNW_FLAG_INTERRUPT_FRAME; in desc_abi()
866 desc_br_gr (unsigned char brmask, unsigned char gr, struct unw_state_record *sr) in desc_br_gr() argument
872 set_reg(sr->curr.reg + UNW_REG_B1 + i, UNW_WHERE_GR, in desc_br_gr()
873 sr->region_start + sr->region_len - 1, gr++); in desc_br_gr()
879 desc_br_mem (unsigned char brmask, struct unw_state_record *sr) in desc_br_mem() argument
885 set_reg(sr->curr.reg + UNW_REG_B1 + i, UNW_WHERE_SPILL_HOME, in desc_br_mem()
886 sr->region_start + sr->region_len - 1, 0); in desc_br_mem()
887 sr->any_spills = 1; in desc_br_mem()
894 desc_frgr_mem (unsigned char grmask, unw_word frmask, struct unw_state_record *sr) in desc_frgr_mem() argument
900 set_reg(sr->curr.reg + UNW_REG_R4 + i, UNW_WHERE_SPILL_HOME, in desc_frgr_mem()
901 sr->region_start + sr->region_len - 1, 0); in desc_frgr_mem()
902 sr->any_spills = 1; in desc_frgr_mem()
909 set_reg(sr->curr.reg + base + i, UNW_WHERE_SPILL_HOME, in desc_frgr_mem()
910 sr->region_start + sr->region_len - 1, 0); in desc_frgr_mem()
911 sr->any_spills = 1; in desc_frgr_mem()
918 desc_fr_mem (unsigned char frmask, struct unw_state_record *sr) in desc_fr_mem() argument
924 set_reg(sr->curr.reg + UNW_REG_F2 + i, UNW_WHERE_SPILL_HOME, in desc_fr_mem()
925 sr->region_start + sr->region_len - 1, 0); in desc_fr_mem()
926 sr->any_spills = 1; in desc_fr_mem()
933 desc_gr_gr (unsigned char grmask, unsigned char gr, struct unw_state_record *sr) in desc_gr_gr() argument
939 set_reg(sr->curr.reg + UNW_REG_R4 + i, UNW_WHERE_GR, in desc_gr_gr()
940 sr->region_start + sr->region_len - 1, gr++); in desc_gr_gr()
946 desc_gr_mem (unsigned char grmask, struct unw_state_record *sr) in desc_gr_mem() argument
952 set_reg(sr->curr.reg + UNW_REG_R4 + i, UNW_WHERE_SPILL_HOME, in desc_gr_mem()
953 sr->region_start + sr->region_len - 1, 0); in desc_gr_mem()
954 sr->any_spills = 1; in desc_gr_mem()
961 desc_mem_stack_f (unw_word t, unw_word size, struct unw_state_record *sr) in desc_mem_stack_f() argument
963 set_reg(sr->curr.reg + UNW_REG_PSP, UNW_WHERE_NONE, in desc_mem_stack_f()
964 sr->region_start + min_t(int, t, sr->region_len - 1), 16*size); in desc_mem_stack_f()
968 desc_mem_stack_v (unw_word t, struct unw_state_record *sr) in desc_mem_stack_v() argument
970 sr->curr.reg[UNW_REG_PSP].when = sr->region_start + min_t(int, t, sr->region_len - 1); in desc_mem_stack_v()
974 desc_reg_gr (unsigned char reg, unsigned char dst, struct unw_state_record *sr) in desc_reg_gr() argument
976 set_reg(sr->curr.reg + reg, UNW_WHERE_GR, sr->region_start + sr->region_len - 1, dst); in desc_reg_gr()
980 desc_reg_psprel (unsigned char reg, unw_word pspoff, struct unw_state_record *sr) in desc_reg_psprel() argument
982 set_reg(sr->curr.reg + reg, UNW_WHERE_PSPREL, sr->region_start + sr->region_len - 1, in desc_reg_psprel()
987 desc_reg_sprel (unsigned char reg, unw_word spoff, struct unw_state_record *sr) in desc_reg_sprel() argument
989 set_reg(sr->curr.reg + reg, UNW_WHERE_SPREL, sr->region_start + sr->region_len - 1, in desc_reg_sprel()
994 desc_rp_br (unsigned char dst, struct unw_state_record *sr) in desc_rp_br() argument
996 sr->return_link_reg = dst; in desc_rp_br()
1000 desc_reg_when (unsigned char regnum, unw_word t, struct unw_state_record *sr) in desc_reg_when() argument
1002 struct unw_reg_info *reg = sr->curr.reg + regnum; in desc_reg_when()
1006 reg->when = sr->region_start + min_t(int, t, sr->region_len - 1); in desc_reg_when()
1010 desc_spill_base (unw_word pspoff, struct unw_state_record *sr) in desc_spill_base() argument
1012 sr->spill_offset = 0x10 - 4*pspoff; in desc_spill_base()
1016 desc_spill_mask (unsigned char *imaskp, struct unw_state_record *sr) in desc_spill_mask() argument
1018 sr->imask = imaskp; in desc_spill_mask()
1019 return imaskp + (2*sr->region_len + 7)/8; in desc_spill_mask()
1026 desc_epilogue (unw_word t, unw_word ecount, struct unw_state_record *sr) in desc_epilogue() argument
1028 sr->epilogue_start = sr->region_start + sr->region_len - 1 - t; in desc_epilogue()
1029 sr->epilogue_count = ecount + 1; in desc_epilogue()
1033 desc_copy_state (unw_word label, struct unw_state_record *sr) in desc_copy_state() argument
1037 for (ls = sr->labeled_states; ls; ls = ls->next) { in desc_copy_state()
1039 free_state_stack(&sr->curr); in desc_copy_state()
1040 memcpy(&sr->curr, &ls->saved_state, sizeof(sr->curr)); in desc_copy_state()
1041 sr->curr.next = dup_state_stack(ls->saved_state.next); in desc_copy_state()
1049 desc_label_state (unw_word label, struct unw_state_record *sr) in desc_label_state() argument
1059 memcpy(&ls->saved_state, &sr->curr, sizeof(ls->saved_state)); in desc_label_state()
1060 ls->saved_state.next = dup_state_stack(sr->curr.next); in desc_label_state()
1063 ls->next = sr->labeled_states; in desc_label_state()
1064 sr->labeled_states = ls; in desc_label_state()
1072 desc_is_active (unsigned char qp, unw_word t, struct unw_state_record *sr) in desc_is_active() argument
1074 if (sr->when_target <= sr->region_start + min_t(int, t, sr->region_len - 1)) in desc_is_active()
1077 if ((sr->pr_val & (1UL << qp)) == 0) in desc_is_active()
1079 sr->pr_mask |= (1UL << qp); in desc_is_active()
1085 desc_restore_p (unsigned char qp, unw_word t, unsigned char abreg, struct unw_state_record *sr) in desc_restore_p() argument
1089 if (!desc_is_active(qp, t, sr)) in desc_restore_p()
1092 r = sr->curr.reg + decode_abreg(abreg, 0); in desc_restore_p()
1100 unsigned char ytreg, struct unw_state_record *sr) in desc_spill_reg_p() argument
1105 if (!desc_is_active(qp, t, sr)) in desc_spill_reg_p()
1113 r = sr->curr.reg + decode_abreg(abreg, 0); in desc_spill_reg_p()
1115 r->when = sr->region_start + min_t(int, t, sr->region_len - 1); in desc_spill_reg_p()
1121 struct unw_state_record *sr) in desc_spill_psprel_p() argument
1125 if (!desc_is_active(qp, t, sr)) in desc_spill_psprel_p()
1128 r = sr->curr.reg + decode_abreg(abreg, 1); in desc_spill_psprel_p()
1130 r->when = sr->region_start + min_t(int, t, sr->region_len - 1); in desc_spill_psprel_p()
1136 struct unw_state_record *sr) in desc_spill_sprel_p() argument
1140 if (!desc_is_active(qp, t, sr)) in desc_spill_sprel_p()
1143 r = sr->curr.reg + decode_abreg(abreg, 1); in desc_spill_sprel_p()
1145 r->when = sr->region_start + min_t(int, t, sr->region_len - 1); in desc_spill_sprel_p()
1333 script_finalize (struct unw_script *script, struct unw_state_record *sr) in script_finalize() argument
1335 script->pr_mask = sr->pr_mask; in script_finalize()
1336 script->pr_val = sr->pr_val; in script_finalize()
1357 emit_nat_info (struct unw_state_record *sr, int i, struct unw_script *script) in emit_nat_info() argument
1359 struct unw_reg_info *r = sr->curr.reg + i; in emit_nat_info()
1402 compile_reg (struct unw_state_record *sr, int i, struct unw_script *script) in compile_reg() argument
1404 struct unw_reg_info *r = sr->curr.reg + i; in compile_reg()
1410 if (r->where == UNW_WHERE_NONE || r->when >= sr->when_target) in compile_reg()
1485 emit_nat_info(sr, i, script); in compile_reg()
1533 struct unw_state_record sr; in build_script() local
1545 memset(&sr, 0, sizeof(sr)); in build_script()
1546 for (r = sr.curr.reg; r < sr.curr.reg + UNW_NUM_REGS; ++r) in build_script()
1548 sr.pr_val = info->pr; in build_script()
1588 sr.curr.reg[UNW_REG_RP].where = UNW_WHERE_BR; in build_script()
1589 sr.curr.reg[UNW_REG_RP].when = -1; in build_script()
1590 sr.curr.reg[UNW_REG_RP].val = 0; in build_script()
1591 compile_reg(&sr, UNW_REG_RP, script); in build_script()
1592 script_finalize(script, &sr); in build_script()
1598 sr.when_target = (3*((ip & ~0xfUL) - (table->segment_base + e->start_offset))/16 in build_script()
1604 while (!sr.done && dp < desc_end) in build_script()
1605 dp = unw_decode(dp, sr.in_body, &sr); in build_script()
1607 if (sr.when_target > sr.epilogue_start) { in build_script()
1612 sr.curr.reg[UNW_REG_PSP].val = 0; in build_script()
1613 sr.curr.reg[UNW_REG_PSP].where = UNW_WHERE_NONE; in build_script()
1614 sr.curr.reg[UNW_REG_PSP].when = UNW_WHEN_NEVER; in build_script()
1615 for (r = sr.curr.reg; r < sr.curr.reg + UNW_NUM_REGS; ++r) in build_script()
1625 script->flags = sr.flags; in build_script()
1631 if (sr.curr.reg[UNW_REG_RP].when >= sr.when_target) { in build_script()
1632 sr.curr.reg[UNW_REG_RP].where = UNW_WHERE_BR; in build_script()
1633 sr.curr.reg[UNW_REG_RP].when = -1; in build_script()
1634 sr.curr.reg[UNW_REG_RP].val = sr.return_link_reg; in build_script()
1636 __func__, ip, sr.curr.reg[UNW_REG_RP].where, in build_script()
1637 sr.curr.reg[UNW_REG_RP].val); in build_script()
1642 __func__, table->segment_base + e->start_offset, sr.when_target); in build_script()
1643 for (r = sr.curr.reg; r < sr.curr.reg + UNW_NUM_REGS; ++r) { in build_script()
1645 UNW_DPRINT(1, " %s <- ", unw.preg_name[r - sr.curr.reg]); in build_script()
1653 UNW_DPRINT(1, "%s+0x%lx", unw.preg_name[r - sr.curr.reg], r->val); in build_script()
1673 if (sr.when_target > sr.curr.reg[UNW_REG_PSP].when in build_script()
1674 && (sr.curr.reg[UNW_REG_PSP].where == UNW_WHERE_NONE) in build_script()
1675 && sr.curr.reg[UNW_REG_PSP].val != 0) { in build_script()
1679 insn.val = sr.curr.reg[UNW_REG_PSP].val; /* frame size */ in build_script()
1684 if (sr.when_target < sr.curr.reg[UNW_REG_PRI_UNAT_GR].when) in build_script()
1686 else if (sr.when_target < sr.curr.reg[UNW_REG_PRI_UNAT_MEM].when) in build_script()
1688 else if (sr.curr.reg[UNW_REG_PRI_UNAT_MEM].when > sr.curr.reg[UNW_REG_PRI_UNAT_GR].when) in build_script()
1693 compile_reg(&sr, i, script); in build_script()
1696 compile_reg(&sr, i, script); in build_script()
1701 for (ls = sr.labeled_states; ls; ls = next) { in build_script()
1706 free_state_stack(&sr.curr); in build_script()
1709 script_finalize(script, &sr); in build_script()