Hi Lianbo,
On 2023/05/18 16:53, HAGIO KAZUHITO(萩尾 一仁) wrote:
> From: Kazuhito Hagio <k-hagio-ab@nec.com>
>
> Kernel commit fb799447ae29 ("x86,objtool: Split UNWIND_HINT_EMPTY in
> two"), which is contained in Linux 6.4 and later kernels, changed
> ORC_TYPE_CALL macro from 0 to 2. As a result, the "bt" command cannot
> use ORC entries, and can display stale entries in a call trace.
>
> crash> bt 1
> PID: 1 TASK: ffff93cd06294180 CPU: 51 COMMAND: "systemd"
> #0 [ffffb72bc00cbc98] __schedule at ffffffff86e52aae
> #1 [ffffb72bc00cbd00] schedule at ffffffff86e52f6a
> #2 [ffffb72bc00cbd18] schedule_hrtimeout_range_clock at ffffffff86e58ef5
> #3 [ffffb72bc00cbd88] ep_poll at ffffffff8669624d
> #4 [ffffb72bc00cbe28] do_epoll_wait at ffffffff86696371
> #5 [ffffb72bc00cbe30] do_timerfd_settime at ffffffff8669902b <<
> #6 [ffffb72bc00cbe60] __x64_sys_epoll_wait at ffffffff86696bf0
> #7 [ffffb72bc00cbeb0] do_syscall_64 at ffffffff86e3feb9
> #8 [ffffb72bc00cbee0] __task_pid_nr_ns at ffffffff863330d7 <<
> #9 [ffffb72bc00cbf08] syscall_exit_to_user_mode at ffffffff86e466b2 << stale entries
> #10 [ffffb72bc00cbf18] do_syscall_64 at ffffffff86e3fec9 <<
> #11 [ffffb72bc00cbf50] entry_SYSCALL_64_after_hwframe at ffffffff870000aa
>
> Also, kernel commit ffb1b4a41016 added a member to struct orc_entry.
> Although this does not affect the crash's unwinder, its debugging
> information can be displayed incorrectly.
>
> To fix these,
> (1) introduce "kernel_orc_entry_6_4" structure corresponding to 6.4 and
> abstruction layer "orc_entry" structure in crash,
> (2) switch ORC_TYPE_CALL to 2 or 0 with kernel's orc_entry structure.
>
> Related orc_entry history:
> v4.14 39358a033b2e introduced struct orc_entry
> v4.19 d31a580266ee added orc_entry.end member
> v6.3 ffb1b4a41016 added orc_entry.signal member
> v6.4 fb799447ae29 removed end member and changed type member to 3 bits
>
> Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
> ---
> v2:
> - better debugging information for orc_entry.{signal,end}.
>
> defs.h | 27 ++++++++++++-
> x86_64.c | 119 +++++++++++++++++++++++++++++++++++++++++++------------
> 2 files changed, 118 insertions(+), 28 deletions(-)
>
> diff --git a/defs.h b/defs.h
> index 21cc760444d1..c1ac347c8e26 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -6354,9 +6354,29 @@ typedef struct __attribute__((__packed__)) {
> unsigned int sp_reg:4;
> unsigned int bp_reg:4;
> unsigned int type:2;
> + unsigned int signal:1;
> unsigned int end:1;
> } kernel_orc_entry;
>
> +typedef struct __attribute__((__packed__)) {
> + signed short sp_offset;
> + signed short bp_offset;
> + unsigned int sp_reg:4;
> + unsigned int bp_reg:4;
> + unsigned int type:3;
> + unsigned int signal:1;
> +} kernel_orc_entry_6_4;
> +
> +typedef struct orc_entry {
> + signed short sp_offset;
> + signed short bp_offset;
> + unsigned int sp_reg;
> + unsigned int bp_reg;
> + unsigned int type;
> + unsigned int signal;
> + unsigned int end;
> +} orc_entry;
> +
> struct ORC_data {
> int module_ORC;
> uint lookup_num_blocks;
> @@ -6367,10 +6387,12 @@ struct ORC_data {
> ulong orc_lookup;
> ulong ip_entry;
> ulong orc_entry;
> - kernel_orc_entry kernel_orc_entry;
> + orc_entry orc_entry_data;
> + int has_signal;
> + int has_end;
> };
>
> -#define ORC_TYPE_CALL 0
> +#define ORC_TYPE_CALL ((machdep->flags & ORC_6_4) ? 2 : 0)
> #define ORC_TYPE_REGS 1
> #define ORC_TYPE_REGS_IRET 2
> #define UNWIND_HINT_TYPE_SAVE 3
These entries are not used in crash so far, remove them?
or add a comment like this?
/* The below entries are not used and must be updated if we use them. */
Agree. And the v2 looks good to me, so: Ack(with the above changes).
BTW: no need to post again, you can apply the v2 with the above changes.
Thanks.
Lianbo