[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <b1cdd754-fa38-4b2e-0a93-b13d9cfd7a8a@loongson.cn>
Date: Mon, 17 Apr 2023 17:22:32 +0800
From: Youling Tang <tangyouling@...ngson.cn>
To: Huacai Chen <chenhuacai@...nel.org>
Cc: Huacai Chen <chenhuacai@...ngson.cn>,
Peter Zijlstra <peterz@...radead.org>,
Ingo Molnar <mingo@...hat.com>,
Arnaldo Carvalho de Melo <acme@...nel.org>,
Mark Rutland <mark.rutland@....com>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Jiri Olsa <jolsa@...nel.org>,
Namhyung Kim <namhyung@...nel.org>, loongarch@...ts.linux.dev,
Xuefeng Li <lixuefeng@...ngson.cn>,
Tiezhu Yang <yangtiezhu@...ngson.cn>,
Xuerui Wang <kernel@...0n.name>, linux-kernel@...r.kernel.org,
linux-perf-users@...r.kernel.org,
loongson-kernel@...ts.loongnix.cn,
Ming Wang <wangming01@...ngson.cn>
Subject: Re: [PATCH V2] tools/perf: Add basic support for LoongArch
/* snip */
>>>> --- /dev/null
>>>> +++ b/tools/perf/arch/loongarch/util/dwarf-regs.c
>>>> @@ -0,0 +1,44 @@
>>>> +// SPDX-License-Identifier: GPL-2.0
>>>> +/*
>>>> + * dwarf-regs.c : Mapping of DWARF debug register numbers into
>>>> register names.
>>>> + *
>>>> + * Copyright (C) 2020-2023 Loongson Technology Corporation Limited
>>>> + */
>>>> +
>>>> +#include <stdio.h>
>>>> +#include <errno.h> /* for EINVAL */
>>>> +#include <string.h> /* for strcmp */
>>>> +#include <dwarf-regs.h>
>>>> +
>>>> +struct pt_regs_dwarfnum {
>>>> + const char *name;
>>>> + unsigned int dwarfnum;
>>>> +};
>>>> +
>>>> +static struct pt_regs_dwarfnum loongarch_gpr_table[] = {
>>>> + {"$0", 0}, {"$1", 1}, {"$2", 2}, {"$3", 3},
>>>> + {"$4", 4}, {"$5", 5}, {"$6", 6}, {"$7", 7},
>>>> + {"$8", 8}, {"$9", 9}, {"$10", 10}, {"$11", 11},
>>>> + {"$12", 12}, {"$13", 13}, {"$14", 14}, {"$15", 15},
>>>> + {"$16", 16}, {"$17", 17}, {"$18", 18}, {"$19", 19},
>>>> + {"$20", 20}, {"$21", 21}, {"$22", 22}, {"$23", 23},
>>>> + {"$24", 24}, {"$25", 25}, {"$26", 26}, {"$27", 27},
>>>> + {"$28", 28}, {"$29", 29}, {"$30", 30}, {"$31", 31},
>>>> + {NULL, 0}
>>>> +};
>>> Do you need to change it to the following:
>>>
>>> #define GPR_DWARFNUM_NAME(num) {.name = __stringify($r##num), .dwarfnum
>>> = num}
>>> #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
>>>
>>> static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
>>> GPR_DWARFNUM_NAME(0),
>>> GPR_DWARFNUM_NAME(1),
>>> GPR_DWARFNUM_NAME(2),
>>> GPR_DWARFNUM_NAME(3),
>>> GPR_DWARFNUM_NAME(4),
>>> GPR_DWARFNUM_NAME(5),
>>> GPR_DWARFNUM_NAME(6),
>>> GPR_DWARFNUM_NAME(7),
>>> GPR_DWARFNUM_NAME(8),
>>> GPR_DWARFNUM_NAME(9),
>>> GPR_DWARFNUM_NAME(10),
>>> GPR_DWARFNUM_NAME(11),
>>> GPR_DWARFNUM_NAME(12),
>>> GPR_DWARFNUM_NAME(13),
>>> GPR_DWARFNUM_NAME(14),
>>> GPR_DWARFNUM_NAME(15),
>>> GPR_DWARFNUM_NAME(16),
>>> GPR_DWARFNUM_NAME(17),
>>> GPR_DWARFNUM_NAME(18),
>>> GPR_DWARFNUM_NAME(19),
>>> GPR_DWARFNUM_NAME(20),
>>> GPR_DWARFNUM_NAME(21),
>>> GPR_DWARFNUM_NAME(22),
>>> GPR_DWARFNUM_NAME(23),
>>> GPR_DWARFNUM_NAME(24),
>>> GPR_DWARFNUM_NAME(25),
>>> GPR_DWARFNUM_NAME(26),
>>> GPR_DWARFNUM_NAME(27),
>>> GPR_DWARFNUM_NAME(28),
>>> GPR_DWARFNUM_NAME(29),
>>> REG_DWARFNUM_NAME(30),
>>> REG_DWARFNUM_NAME(31),
>>> REG_DWARFNUM_END,
>>> };
>>>
>>> At the same time, "$rx" is used in __perf_reg_name_loongarch and
>>> loongarch_regstr_tbl, which is consistent with assembly.
>> OK, I will use the "$rx" format, but I don't want to use macros.
> Use the "rx" format to make regs_query_register_offset consistent with
> arch/loongarch/kernel/ptrace.c (that is, the names in
> loongarch_gpr_table and regoffset_table are consistent)
If we want to be consistent with the usage of `trace probe`, we should
use "%rx".
eg:
# echo "p:myuprobe /tmp/test:0x4194 %r4 %r5" > uprobe_events
parse_probe_arg()
case '%': regs_query_register_offset()
Youling.
>
> Youling.
>>
>> Huacai
>>>
>>>> +
>>>> +const char *get_arch_regstr(unsigned int n)
>>>> +{
>>>> + n %= 32;
>>>> + return loongarch_gpr_table[n].name;
>>>> +}
>>>> +
>>>> +int regs_query_register_offset(const char *name)
>>>> +{
>>>> + const struct pt_regs_dwarfnum *roff;
>>>> +
>>>> + for (roff = loongarch_gpr_table; roff->name != NULL; roff++)
>>>> + if (!strcmp(roff->name, name))
>>>> + return roff->dwarfnum;
>>>> + return -EINVAL;
>>>> +}
>
Powered by blists - more mailing lists