1b4406d2a8
Use the raw instruction code and macros to identify memory instructions, extract register fields and also offset. The implementation addresses the D-form, X-form, DS-form instructions. Adds "mem_ref" field to check whether source/target has memory reference. Add function "get_powerpc_regs" which will set these fields: reg1, reg2, offset depending of where it is source or target ops. Update "parse" callback for "struct ins_ops" to also pass "struct disasm_line" as argument. This is needed in parse functions where opcode is used to determine whether to set multi_regs and other fields Reviewed-by: Kajol Jain <kjain@linux.ibm.com> Reviewed-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Tested-by: Kajol Jain <kjain@linux.ibm.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Akanksha J N <akanksha@linux.ibm.com> Cc: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Disha Goel <disgoel@linux.vnet.ibm.com> Cc: Hari Bathini <hbathini@linux.ibm.com> Cc: Ian Rogers <irogers@google.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Madhavan Srinivasan <maddy@linux.ibm.com> Cc: Segher Boessenkool <segher@kernel.crashing.org> Link: https://lore.kernel.org/lkml/20240718084358.72242-7-atrajeev@linux.vnet.ibm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
54 lines
1.5 KiB
C
54 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _PERF_DWARF_REGS_H_
|
|
#define _PERF_DWARF_REGS_H_
|
|
#include "annotate.h"
|
|
|
|
#define DWARF_REG_PC 0xd3af9c /* random number */
|
|
#define DWARF_REG_FB 0xd3affb /* random number */
|
|
|
|
#ifdef HAVE_DWARF_SUPPORT
|
|
const char *get_arch_regstr(unsigned int n);
|
|
/*
|
|
* get_dwarf_regstr - Returns ftrace register string from DWARF regnum
|
|
* n: DWARF register number
|
|
* machine: ELF machine signature (EM_*)
|
|
*/
|
|
const char *get_dwarf_regstr(unsigned int n, unsigned int machine);
|
|
|
|
int get_arch_regnum(const char *name);
|
|
/*
|
|
* get_dwarf_regnum - Returns DWARF regnum from register name
|
|
* name: architecture register name
|
|
* machine: ELF machine signature (EM_*)
|
|
*/
|
|
int get_dwarf_regnum(const char *name, unsigned int machine);
|
|
|
|
#else /* HAVE_DWARF_SUPPORT */
|
|
|
|
static inline int get_dwarf_regnum(const char *name __maybe_unused,
|
|
unsigned int machine __maybe_unused)
|
|
{
|
|
return -1;
|
|
}
|
|
#endif
|
|
|
|
#if !defined(__powerpc__) || !defined(HAVE_DWARF_SUPPORT)
|
|
static inline void get_powerpc_regs(u32 raw_insn __maybe_unused, int is_source __maybe_unused,
|
|
struct annotated_op_loc *op_loc __maybe_unused)
|
|
{
|
|
return;
|
|
}
|
|
#else
|
|
void get_powerpc_regs(u32 raw_insn, int is_source, struct annotated_op_loc *op_loc);
|
|
#endif
|
|
|
|
#ifdef HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
|
|
/*
|
|
* Arch should support fetching the offset of a register in pt_regs
|
|
* by its name. See kernel's regs_query_register_offset in
|
|
* arch/xxx/kernel/ptrace.c.
|
|
*/
|
|
int regs_query_register_offset(const char *name);
|
|
#endif
|
|
#endif
|