Lines Matching refs:state
277 static void init_insn_state(struct objtool_file *file, struct insn_state *state,
280 memset(state, 0, sizeof(*state));
281 init_cfi_state(&state->cfi);
289 state->noinstr = sec->noinstr;
1787 * nop) will propagate the new state to the shared CFI array.
2195 static void set_func_state(struct cfi_state *state)
2197 state->cfa = initial_func_cfi.cfa;
2198 memcpy(&state->regs, &initial_func_cfi.regs,
2200 state->stack_size = initial_func_cfi.cfa.offset;
2201 state->type = UNWIND_HINT_TYPE_CALL;
2668 static bool has_modified_stack_frame(struct instruction *insn, struct insn_state *state)
2670 struct cfi_state *cfi = &state->cfi;
2698 static bool has_valid_stack_frame(struct insn_state *state)
2700 struct cfi_state *cfi = &state->cfi;
2820 WARN_INSN(insn, "undefined stack state");
3259 struct insn_state *state)
3265 if (update_cfi_state(insn, next_insn, &state->cfi, op))
3272 if (!state->uaccess_stack) {
3273 state->uaccess_stack = 1;
3274 } else if (state->uaccess_stack >> 31) {
3278 state->uaccess_stack <<= 1;
3279 state->uaccess_stack |= state->uaccess;
3283 if (state->uaccess_stack) {
3284 state->uaccess = state->uaccess_stack & 1;
3285 state->uaccess_stack >>= 1;
3286 if (state->uaccess_stack == 1)
3287 state->uaccess_stack = 0;
3307 WARN_INSN(insn, "stack state mismatch: cfa1=%d%+d cfa2=%d%+d",
3317 WARN_INSN(insn, "stack state mismatch: reg1[%d]=%d%+d reg2[%d]=%d%+d",
3325 WARN_INSN(insn, "stack state mismatch: type1=%d type2=%d",
3332 WARN_INSN(insn, "stack state mismatch: drap1=%d(%d,%d) drap2=%d(%d,%d)",
3436 struct insn_state *state)
3438 if (state->noinstr && state->instr <= 0 &&
3444 if (state->uaccess && !func_uaccess_safe(insn_call_dest(insn))) {
3449 if (state->df) {
3459 struct insn_state *state)
3461 if (insn_func(insn) && has_modified_stack_frame(insn, state)) {
3466 return validate_call(file, insn, state);
3469 static int validate_return(struct symbol *func, struct instruction *insn, struct insn_state *state)
3471 if (state->noinstr && state->instr > 0) {
3476 if (state->uaccess && !func_uaccess_safe(func)) {
3481 if (!state->uaccess && func_uaccess_safe(func)) {
3486 if (state->df) {
3491 if (func && has_modified_stack_frame(insn, state)) {
3496 if (state->cfi.bp_scratch) {
3539 * any other branches (jumps). Meanwhile, track the frame pointer state at
3544 struct instruction *insn, struct insn_state state)
3573 visited = VISITED_BRANCH << state.uaccess;
3575 if (!insn->hint && !insn_cfi_match(insn, &state.cfi))
3584 if (state.noinstr)
3585 state.instr += insn->instr;
3627 state.cfi = *insn->cfi;
3629 /* XXX track if we actually changed state.cfi */
3631 if (prev_insn && !cficmp(prev_insn->cfi, &state.cfi)) {
3635 insn->cfi = cfi_hash_find_or_add(&state.cfi);
3651 ret = validate_branch(file, func, alt->insn, state);
3662 if (handle_insn_ops(insn, next_insn, &state))
3668 return validate_return(func, insn, &state);
3672 ret = validate_call(file, insn, &state);
3677 !has_valid_stack_frame(&state)) {
3690 ret = validate_sibling_call(file, insn, &state);
3696 insn->jump_dest, state);
3711 ret = validate_sibling_call(file, insn, &state);
3729 if (state.uaccess) {
3734 state.uaccess = true;
3738 if (!state.uaccess && func) {
3743 if (func_uaccess_safe(func) && !state.uaccess_stack) {
3748 state.uaccess = false;
3752 if (state.df) {
3757 state.df = true;
3761 if (!state.df && func) {
3766 state.df = false;
3777 if (state.cfi.cfa.base == CFI_UNDEFINED)
3792 struct insn_state *state)
3795 int ret = validate_branch(file, insn_func(insn), insn, *state);
3807 struct insn_state state;
3813 init_insn_state(file, &state, sec);
3817 warnings += validate_unwind_hint(file, insn, &state);
3820 warnings += validate_unwind_hint(file, insn, &state);
4185 struct symbol *sym, struct insn_state *state)
4202 state->uaccess = sym->uaccess_safe;
4204 ret = validate_branch(file, insn_func(insn), insn, *state);
4212 struct insn_state state;
4220 init_insn_state(file, &state, sec);
4221 set_func_state(&state.cfi);
4223 warnings += validate_symbol(file, sec, func, &state);