函数逻辑报告

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source Code:arch\x86\kernel\unwind_orc.c Create Date:2022-07-27 09:50:21
Last Modify:2020-03-12 14:18:49 Copyright©Brick
首页 函数Tree
注解内核,赢得工具下载SCCTEnglish

函数名称:unwind_next_frame

函数原型:bool unwind_next_frame(struct unwind_state *state)

返回类型:bool

参数:

类型参数名称
struct unwind_state *state
383  orig_ip等于ip, prev_sp等于sp
384  prev_type等于type
386  bool indirect = false
388  如果unwind_done(state)则返回:false
392  禁止抢占()
395  如果regsser_mode(regs) determines whether a register set came from user* mode则转到:the_end
404  orc等于orc_find(signal ? ip : ip - 1)
405  如果非orc
412  orc等于Fake frame pointer entry -- used as a fallback for generated code
413  error = true
417  如果sp_reg恒等于The ORC_REG_* registers are base registers which are used to find other* registers on the stack
418  如果非end则转到:err
421  转到:the_end
426  :sp_reg恒等于ORC_REG_SP
427  sp等于spsp_offset
428  退出
430  :sp_reg恒等于ORC_REG_BP
431  sp等于bpsp_offset
432  退出
435  sp等于spsp_offset
436  indirect = true
437  退出
440  sp等于bpsp_offset
441  indirect = true
442  退出
444  :sp_reg恒等于ORC_REG_R10
445  如果非regs或非full_regs
446  orc_warn("missing regs for base reg R10 at ip %pB\n", (void * )ip)
448  转到:err
450  sp等于r10
451  退出
453  :sp_reg恒等于ORC_REG_R13
454  如果非regs或非full_regs
455  orc_warn("missing regs for base reg R13 at ip %pB\n", (void * )ip)
457  转到:err
459  sp等于r13
460  退出
462  :sp_reg恒等于ORC_REG_DI
463  如果非regs或非full_regs
464  orc_warn("missing regs for base reg DI at ip %pB\n", (void * )ip)
466  转到:err
468  sp等于di
469  退出
471  :sp_reg恒等于ORC_REG_DX
472  如果非regs或非full_regs
473  orc_warn("missing regs for base reg DX at ip %pB\n", (void * )ip)
475  转到:err
477  sp等于dx
478  退出
480  默认
481  orc_warn("unknown SP base reg %d for ip %pB\n", sp_reg, (void * )ip)
483  转到:err
486  如果indirect
487  如果非deref_stack_reg(state, sp, & sp)则转到:err
494  ip_p等于spsizeof(long)
496  如果非deref_stack_reg(state, ip_p, & ip)则转到:err
499  ip等于ftrace_graph_ret_addr(task, & graph_idx, ip, (void * )ip_p)
502  sp等于sp
503  regs = NULL
504  signal = false
505  退出
507  :type恒等于ORC_TYPE_REGS
508  如果非deref_stack_regs(state, sp, & ip, & sp)则
509  orc_warn("can't dereference registers at %p for ip %pB\n", (void * )sp, (void * )orig_ip)
511  转到:err
514  regs等于sp
515  full_regs = true
516  signal = true
517  退出
519  :type恒等于ORC_TYPE_REGS_IRET
520  如果非deref_stack_iret_regs(state, sp, & ip, & sp)则
521  orc_warn("can't dereference iret registers at %p for ip %pB\n", (void * )sp, (void * )orig_ip)
523  转到:err
526  regs等于spIRET_FRAME_OFFSET
527  full_regs = false
528  signal = true
529  退出
531  默认
532  orc_warn("unknown .orc_unwind entry type %d for ip %pB\n", type, (void * )orig_ip)
534  退出
540  如果regsfull_regsbp等于bp
542  退出
544  :bp_reg恒等于ORC_REG_PREV_SP
545  如果非deref_stack_reg(state, sp + bp_offset, & bp)则转到:err
547  退出
549  :bp_reg恒等于ORC_REG_BP
550  如果非deref_stack_reg(state, bp + bp_offset, & bp)则转到:err
552  退出
554  默认
555  orc_warn("unknown BP base reg %d for ip %pB\n", bp_reg, (void * )orig_ip)
557  转到:err
561  如果type恒等于prev_typeon_stack( & stack_info, (void * )sp, sizeof(long))且sp小于等于prev_sp
564  orc_warn("stack going in the wrong direction? ip=%pB\n", (void * )orig_ip)
566  转到:err
570  返回:true
572  err :
573  error = true
575  the_end :
578  返回:false
调用者
名称描述
__unwind_start