• Home
  • Raw
  • Download

Lines Matching refs:cfi

247 static void init_cfi_state(struct cfi_state *cfi)  in init_cfi_state()  argument
252 cfi->regs[i].base = CFI_UNDEFINED; in init_cfi_state()
253 cfi->vals[i].base = CFI_UNDEFINED; in init_cfi_state()
255 cfi->cfa.base = CFI_UNDEFINED; in init_cfi_state()
256 cfi->drap_reg = CFI_UNDEFINED; in init_cfi_state()
257 cfi->drap_offset = -1; in init_cfi_state()
263 init_cfi_state(&state->cfi); in init_insn_state()
276 struct cfi_state *cfi = calloc(sizeof(struct cfi_state), 1); in cfi_alloc() local
277 if (!cfi) { in cfi_alloc()
282 return cfi; in cfi_alloc()
295 static inline u32 cfi_key(struct cfi_state *cfi) in cfi_key() argument
297 return jhash((void *)cfi + sizeof(cfi->hash), in cfi_key()
298 sizeof(*cfi) - sizeof(cfi->hash), 0); in cfi_key()
301 static struct cfi_state *cfi_hash_find_or_add(struct cfi_state *cfi) in cfi_hash_find_or_add() argument
303 struct hlist_head *head = &cfi_hash[hash_min(cfi_key(cfi), cfi_bits)]; in cfi_hash_find_or_add()
307 if (!cficmp(cfi, obj)) { in cfi_hash_find_or_add()
314 *obj = *cfi; in cfi_hash_find_or_add()
320 static void cfi_hash_add(struct cfi_state *cfi) in cfi_hash_add() argument
322 struct hlist_head *head = &cfi_hash[hash_min(cfi_key(cfi), cfi_bits)]; in cfi_hash_add()
324 hlist_add_head(&cfi->hash, head); in cfi_hash_add()
1305 orig_alt_group->cfi = calloc(special_alt->orig_len, in handle_group_alt()
1307 if (!orig_alt_group->cfi) { in handle_group_alt()
1422 new_alt_group->cfi = orig_alt_group->cfi; in handle_group_alt()
1724 struct cfi_state cfi = init_cfi; in read_unwind_hints() local
1790 insn->cfi = &func_cfi; in read_unwind_hints()
1794 if (insn->cfi) in read_unwind_hints()
1795 cfi = *(insn->cfi); in read_unwind_hints()
1797 if (arch_decode_hint_reg(hint->sp_reg, &cfi.cfa.base)) { in read_unwind_hints()
1803 cfi.cfa.offset = hint->sp_offset; in read_unwind_hints()
1804 cfi.type = hint->type; in read_unwind_hints()
1805 cfi.end = hint->end; in read_unwind_hints()
1807 insn->cfi = cfi_hash_find_or_add(&cfi); in read_unwind_hints()
2088 struct cfi_state *cfi = &state->cfi; in has_modified_stack_frame() local
2091 if (cfi->cfa.base != initial_func_cfi.cfa.base || cfi->drap) in has_modified_stack_frame()
2094 if (cfi->cfa.offset != initial_func_cfi.cfa.offset) in has_modified_stack_frame()
2097 if (cfi->stack_size != initial_func_cfi.cfa.offset) in has_modified_stack_frame()
2101 if (cfi->regs[i].base != initial_func_cfi.regs[i].base || in has_modified_stack_frame()
2102 cfi->regs[i].offset != initial_func_cfi.regs[i].offset) in has_modified_stack_frame()
2111 struct cfi_state *cfi = &state->cfi; in has_valid_stack_frame() local
2113 if (cfi->cfa.base == CFI_BP && cfi->regs[CFI_BP].base == CFI_CFA && in has_valid_stack_frame()
2114 cfi->regs[CFI_BP].offset == -16) in has_valid_stack_frame()
2117 if (cfi->drap && cfi->regs[CFI_BP].base == CFI_BP) in has_valid_stack_frame()
2124 struct cfi_state *cfi, in update_cfi_state_regs() argument
2127 struct cfi_reg *cfa = &cfi->cfa; in update_cfi_state_regs()
2148 static void save_reg(struct cfi_state *cfi, unsigned char reg, int base, int offset) in save_reg() argument
2151 cfi->regs[reg].base == CFI_UNDEFINED) { in save_reg()
2152 cfi->regs[reg].base = base; in save_reg()
2153 cfi->regs[reg].offset = offset; in save_reg()
2157 static void restore_reg(struct cfi_state *cfi, unsigned char reg) in restore_reg() argument
2159 cfi->regs[reg].base = initial_func_cfi.regs[reg].base; in restore_reg()
2160 cfi->regs[reg].offset = initial_func_cfi.regs[reg].offset; in restore_reg()
2216 static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi, in update_cfi_state() argument
2219 struct cfi_reg *cfa = &cfi->cfa; in update_cfi_state()
2220 struct cfi_reg *regs = cfi->regs; in update_cfi_state()
2231 if (cfi->type == UNWIND_HINT_TYPE_REGS || in update_cfi_state()
2232 cfi->type == UNWIND_HINT_TYPE_REGS_PARTIAL) in update_cfi_state()
2233 return update_cfi_state_regs(insn, cfi, op); in update_cfi_state()
2248 cfi->bp_scratch = false; in update_cfi_state()
2252 op->dest.reg == CFI_BP && cfi->drap) { in update_cfi_state()
2256 regs[CFI_BP].offset = -cfi->stack_size; in update_cfi_state()
2257 cfi->bp_scratch = false; in update_cfi_state()
2272 cfi->vals[op->dest.reg].base = CFI_CFA; in update_cfi_state()
2273 cfi->vals[op->dest.reg].offset = -cfi->stack_size; in update_cfi_state()
2284 cfi->stack_size = -cfi->regs[CFI_BP].offset; in update_cfi_state()
2291 cfi->vals[op->src.reg].base == CFI_CFA) { in update_cfi_state()
2301 cfa->offset = -cfi->vals[op->src.reg].offset; in update_cfi_state()
2302 cfi->stack_size = cfa->offset; in update_cfi_state()
2316 cfi->stack_size -= op->src.offset; in update_cfi_state()
2325 cfi->stack_size = -(op->src.offset + regs[CFI_BP].offset); in update_cfi_state()
2332 cfi->drap_reg = op->dest.reg; in update_cfi_state()
2344 cfi->vals[op->dest.reg].base = CFI_CFA; in update_cfi_state()
2345 cfi->vals[op->dest.reg].offset = \ in update_cfi_state()
2346 -cfi->stack_size + op->src.offset; in update_cfi_state()
2351 if (cfi->drap && op->dest.reg == CFI_SP && in update_cfi_state()
2352 op->src.reg == cfi->drap_reg) { in update_cfi_state()
2356 cfa->offset = cfi->stack_size = -op->src.offset; in update_cfi_state()
2357 cfi->drap_reg = CFI_UNDEFINED; in update_cfi_state()
2358 cfi->drap = false; in update_cfi_state()
2362 if (op->dest.reg == cfi->cfa.base) { in update_cfi_state()
2372 (cfi->drap_reg != CFI_UNDEFINED && cfa->base != CFI_SP) || in update_cfi_state()
2373 (cfi->drap_reg == CFI_UNDEFINED && cfa->base != CFI_BP)) { in update_cfi_state()
2379 if (cfi->drap_reg != CFI_UNDEFINED) { in update_cfi_state()
2381 cfa->base = cfi->drap_reg; in update_cfi_state()
2382 cfa->offset = cfi->stack_size = 0; in update_cfi_state()
2383 cfi->drap = true; in update_cfi_state()
2395 if (!cfi->drap && op->dest.reg == cfa->base) { in update_cfi_state()
2401 if (cfi->drap && cfa->base == CFI_BP_INDIRECT && in update_cfi_state()
2402 op->dest.reg == cfi->drap_reg && in update_cfi_state()
2403 cfi->drap_offset == -cfi->stack_size) { in update_cfi_state()
2406 cfa->base = cfi->drap_reg; in update_cfi_state()
2408 cfi->drap_offset = -1; in update_cfi_state()
2410 } else if (regs[op->dest.reg].offset == -cfi->stack_size) { in update_cfi_state()
2413 restore_reg(cfi, op->dest.reg); in update_cfi_state()
2416 cfi->stack_size -= 8; in update_cfi_state()
2423 if (cfi->drap && op->src.reg == CFI_BP && in update_cfi_state()
2424 op->src.offset == cfi->drap_offset) { in update_cfi_state()
2427 cfa->base = cfi->drap_reg; in update_cfi_state()
2429 cfi->drap_offset = -1; in update_cfi_state()
2432 if (cfi->drap && op->src.reg == CFI_BP && in update_cfi_state()
2436 restore_reg(cfi, op->dest.reg); in update_cfi_state()
2443 restore_reg(cfi, op->dest.reg); in update_cfi_state()
2458 cfi->stack_size += 8; in update_cfi_state()
2465 if (cfi->drap) { in update_cfi_state()
2466 if (op->src.reg == cfa->base && op->src.reg == cfi->drap_reg) { in update_cfi_state()
2470 cfa->offset = -cfi->stack_size; in update_cfi_state()
2473 cfi->drap_offset = -cfi->stack_size; in update_cfi_state()
2475 } else if (op->src.reg == CFI_BP && cfa->base == cfi->drap_reg) { in update_cfi_state()
2478 cfi->stack_size = 0; in update_cfi_state()
2483 save_reg(cfi, op->src.reg, CFI_BP, -cfi->stack_size); in update_cfi_state()
2489 save_reg(cfi, op->src.reg, CFI_CFA, -cfi->stack_size); in update_cfi_state()
2495 cfi->bp_scratch = true; in update_cfi_state()
2500 if (cfi->drap) { in update_cfi_state()
2501 if (op->src.reg == cfa->base && op->src.reg == cfi->drap_reg) { in update_cfi_state()
2508 cfi->drap_offset = op->dest.offset; in update_cfi_state()
2512 save_reg(cfi, op->src.reg, CFI_BP, op->dest.offset); in update_cfi_state()
2519 save_reg(cfi, op->src.reg, CFI_CFA, in update_cfi_state()
2520 op->dest.offset - cfi->cfa.offset); in update_cfi_state()
2526 if ((!cfi->drap && cfa->base != CFI_BP) || in update_cfi_state()
2527 (cfi->drap && cfa->base != cfi->drap_reg)) { in update_cfi_state()
2535 cfi->stack_size = -cfi->regs[CFI_BP].offset - 8; in update_cfi_state()
2536 restore_reg(cfi, CFI_BP); in update_cfi_state()
2538 if (!cfi->drap) { in update_cfi_state()
2553 cfi->stack_size -= 8; in update_cfi_state()
2585 if (!insn->cfi) { in propagate_alt_cfi()
2590 alt_cfi = insn->alt_group->cfi; in propagate_alt_cfi()
2594 alt_cfi[group_off] = insn->cfi; in propagate_alt_cfi()
2596 if (cficmp(alt_cfi[group_off], insn->cfi)) { in propagate_alt_cfi()
2612 if (update_cfi_state(insn, &state->cfi, op)) in handle_insn_ops()
2642 struct cfi_state *cfi1 = insn->cfi; in insn_cfi_match()
2799 if (state->cfi.bp_scratch) { in validate_return()
2858 if (!insn->hint && !insn_cfi_match(insn, &state.cfi)) in validate_branch()
2896 insn->cfi = save_insn->cfi; in validate_branch()
2900 state.cfi = *insn->cfi; in validate_branch()
2904 if (prev_insn && !cficmp(prev_insn->cfi, &state.cfi)) { in validate_branch()
2905 insn->cfi = prev_insn->cfi; in validate_branch()
2908 insn->cfi = cfi_hash_find_or_add(&state.cfi); in validate_branch()
3066 if (state.cfi.cfa.base == CFI_UNDEFINED) in validate_branch()
3410 set_func_state(&state.cfi); in validate_section()