Lines Matching refs:cfi
224 static void init_cfi_state(struct cfi_state *cfi) in init_cfi_state() argument
229 cfi->regs[i].base = CFI_UNDEFINED; in init_cfi_state()
230 cfi->vals[i].base = CFI_UNDEFINED; in init_cfi_state()
232 cfi->cfa.base = CFI_UNDEFINED; in init_cfi_state()
233 cfi->drap_reg = CFI_UNDEFINED; in init_cfi_state()
234 cfi->drap_offset = -1; in init_cfi_state()
240 init_cfi_state(&state->cfi); in init_insn_state()
287 init_cfi_state(&insn->cfi); in decode_instructions()
1011 init_cfi_state(&fake_jump->cfi); in handle_group_alt()
1428 cfa = &insn->cfi.cfa; in read_unwind_hints()
1444 insn->cfi.type = hint->type; in read_unwind_hints()
1445 insn->cfi.end = hint->end; in read_unwind_hints()
1700 struct cfi_state *cfi = &state->cfi; in has_modified_stack_frame() local
1703 if (cfi->cfa.base != initial_func_cfi.cfa.base || cfi->drap) in has_modified_stack_frame()
1706 if (cfi->cfa.offset != initial_func_cfi.cfa.offset + ret_offset) in has_modified_stack_frame()
1709 if (cfi->stack_size != initial_func_cfi.cfa.offset + ret_offset) in has_modified_stack_frame()
1721 if (cfi->regs[i].base != initial_func_cfi.regs[i].base || in has_modified_stack_frame()
1722 cfi->regs[i].offset != initial_func_cfi.regs[i].offset) in has_modified_stack_frame()
1731 struct cfi_state *cfi = &state->cfi; in has_valid_stack_frame() local
1733 if (cfi->cfa.base == CFI_BP && cfi->regs[CFI_BP].base == CFI_CFA && in has_valid_stack_frame()
1734 cfi->regs[CFI_BP].offset == -16) in has_valid_stack_frame()
1737 if (cfi->drap && cfi->regs[CFI_BP].base == CFI_BP) in has_valid_stack_frame()
1744 struct cfi_state *cfi, in update_cfi_state_regs() argument
1747 struct cfi_reg *cfa = &cfi->cfa; in update_cfi_state_regs()
1768 static void save_reg(struct cfi_state *cfi, unsigned char reg, int base, int offset) in save_reg() argument
1771 cfi->regs[reg].base == CFI_UNDEFINED) { in save_reg()
1772 cfi->regs[reg].base = base; in save_reg()
1773 cfi->regs[reg].offset = offset; in save_reg()
1777 static void restore_reg(struct cfi_state *cfi, unsigned char reg) in restore_reg() argument
1779 cfi->regs[reg].base = initial_func_cfi.regs[reg].base; in restore_reg()
1780 cfi->regs[reg].offset = initial_func_cfi.regs[reg].offset; in restore_reg()
1836 static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi, in update_cfi_state() argument
1839 struct cfi_reg *cfa = &cfi->cfa; in update_cfi_state()
1840 struct cfi_reg *regs = cfi->regs; in update_cfi_state()
1851 if (cfi->type == UNWIND_HINT_TYPE_REGS || in update_cfi_state()
1852 cfi->type == UNWIND_HINT_TYPE_REGS_PARTIAL) in update_cfi_state()
1853 return update_cfi_state_regs(insn, cfi, op); in update_cfi_state()
1868 cfi->bp_scratch = false; in update_cfi_state()
1872 op->dest.reg == CFI_BP && cfi->drap) { in update_cfi_state()
1876 regs[CFI_BP].offset = -cfi->stack_size; in update_cfi_state()
1877 cfi->bp_scratch = false; in update_cfi_state()
1892 cfi->vals[op->dest.reg].base = CFI_CFA; in update_cfi_state()
1893 cfi->vals[op->dest.reg].offset = -cfi->stack_size; in update_cfi_state()
1904 cfi->stack_size = -cfi->regs[CFI_BP].offset; in update_cfi_state()
1911 cfi->vals[op->src.reg].base == CFI_CFA) { in update_cfi_state()
1921 cfa->offset = -cfi->vals[op->src.reg].offset; in update_cfi_state()
1922 cfi->stack_size = cfa->offset; in update_cfi_state()
1936 cfi->stack_size -= op->src.offset; in update_cfi_state()
1945 cfi->stack_size = -(op->src.offset + regs[CFI_BP].offset); in update_cfi_state()
1952 cfi->drap_reg = op->dest.reg; in update_cfi_state()
1964 cfi->vals[op->dest.reg].base = CFI_CFA; in update_cfi_state()
1965 cfi->vals[op->dest.reg].offset = \ in update_cfi_state()
1966 -cfi->stack_size + op->src.offset; in update_cfi_state()
1971 if (cfi->drap && op->dest.reg == CFI_SP && in update_cfi_state()
1972 op->src.reg == cfi->drap_reg) { in update_cfi_state()
1976 cfa->offset = cfi->stack_size = -op->src.offset; in update_cfi_state()
1977 cfi->drap_reg = CFI_UNDEFINED; in update_cfi_state()
1978 cfi->drap = false; in update_cfi_state()
1982 if (op->dest.reg == cfi->cfa.base) { in update_cfi_state()
1992 (cfi->drap_reg != CFI_UNDEFINED && cfa->base != CFI_SP) || in update_cfi_state()
1993 (cfi->drap_reg == CFI_UNDEFINED && cfa->base != CFI_BP)) { in update_cfi_state()
1999 if (cfi->drap_reg != CFI_UNDEFINED) { in update_cfi_state()
2001 cfa->base = cfi->drap_reg; in update_cfi_state()
2002 cfa->offset = cfi->stack_size = 0; in update_cfi_state()
2003 cfi->drap = true; in update_cfi_state()
2015 if (!cfi->drap && op->dest.reg == cfa->base) { in update_cfi_state()
2021 if (cfi->drap && cfa->base == CFI_BP_INDIRECT && in update_cfi_state()
2022 op->dest.reg == cfi->drap_reg && in update_cfi_state()
2023 cfi->drap_offset == -cfi->stack_size) { in update_cfi_state()
2026 cfa->base = cfi->drap_reg; in update_cfi_state()
2028 cfi->drap_offset = -1; in update_cfi_state()
2030 } else if (regs[op->dest.reg].offset == -cfi->stack_size) { in update_cfi_state()
2033 restore_reg(cfi, op->dest.reg); in update_cfi_state()
2036 cfi->stack_size -= 8; in update_cfi_state()
2043 if (cfi->drap && op->src.reg == CFI_BP && in update_cfi_state()
2044 op->src.offset == cfi->drap_offset) { in update_cfi_state()
2047 cfa->base = cfi->drap_reg; in update_cfi_state()
2049 cfi->drap_offset = -1; in update_cfi_state()
2052 if (cfi->drap && op->src.reg == CFI_BP && in update_cfi_state()
2056 restore_reg(cfi, op->dest.reg); in update_cfi_state()
2063 restore_reg(cfi, op->dest.reg); in update_cfi_state()
2078 cfi->stack_size += 8; in update_cfi_state()
2085 if (cfi->drap) { in update_cfi_state()
2086 if (op->src.reg == cfa->base && op->src.reg == cfi->drap_reg) { in update_cfi_state()
2090 cfa->offset = -cfi->stack_size; in update_cfi_state()
2093 cfi->drap_offset = -cfi->stack_size; in update_cfi_state()
2095 } else if (op->src.reg == CFI_BP && cfa->base == cfi->drap_reg) { in update_cfi_state()
2098 cfi->stack_size = 0; in update_cfi_state()
2103 save_reg(cfi, op->src.reg, CFI_BP, -cfi->stack_size); in update_cfi_state()
2109 save_reg(cfi, op->src.reg, CFI_CFA, -cfi->stack_size); in update_cfi_state()
2115 cfi->bp_scratch = true; in update_cfi_state()
2120 if (cfi->drap) { in update_cfi_state()
2121 if (op->src.reg == cfa->base && op->src.reg == cfi->drap_reg) { in update_cfi_state()
2128 cfi->drap_offset = op->dest.offset; in update_cfi_state()
2132 save_reg(cfi, op->src.reg, CFI_BP, op->dest.offset); in update_cfi_state()
2139 save_reg(cfi, op->src.reg, CFI_CFA, in update_cfi_state()
2140 op->dest.offset - cfi->cfa.offset); in update_cfi_state()
2146 if ((!cfi->drap && cfa->base != CFI_BP) || in update_cfi_state()
2147 (cfi->drap && cfa->base != cfi->drap_reg)) { in update_cfi_state()
2155 cfi->stack_size = -cfi->regs[CFI_BP].offset - 8; in update_cfi_state()
2156 restore_reg(cfi, CFI_BP); in update_cfi_state()
2158 if (!cfi->drap) { in update_cfi_state()
2173 cfi->stack_size -= 8; in update_cfi_state()
2193 struct cfi_state old_cfi = state->cfi; in handle_insn_ops()
2196 res = update_cfi_state(insn, &state->cfi, op); in handle_insn_ops()
2200 if (insn->alt_group && memcmp(&state->cfi, &old_cfi, sizeof(struct cfi_state))) { in handle_insn_ops()
2232 struct cfi_state *cfi1 = &insn->cfi; in insn_cfi_match()
2384 if (state->cfi.bp_scratch) { in validate_return()
2413 insn->cfi = first_insn->cfi; in fill_alternative_cfi()
2451 if (!insn->hint && !insn_cfi_match(insn, &state.cfi)) in validate_branch()
2462 state.cfi = insn->cfi; in validate_branch()
2464 insn->cfi = state.cfi; in validate_branch()
2609 if (state.cfi.cfa.base == CFI_UNDEFINED) in validate_branch()
2807 state.cfi.cfa = initial_func_cfi.cfa; in validate_section()
2808 memcpy(&state.cfi.regs, &initial_func_cfi.regs, in validate_section()
2810 state.cfi.stack_size = initial_func_cfi.cfa.offset; in validate_section()