···11+// SPDX-License-Identifier: GPL-2.022+33+#include <errno.h>44+#include <libunwind.h>55+#include "perf_regs.h"66+#include "../../util/unwind.h"77+#include "util/debug.h"88+99+int libunwind__arch_reg_id(int regnum)1010+{1111+ switch (regnum) {1212+ case UNW_LOONGARCH64_R1:1313+ return PERF_REG_LOONGARCH_R1;1414+ case UNW_LOONGARCH64_R2:1515+ return PERF_REG_LOONGARCH_R2;1616+ case UNW_LOONGARCH64_R3:1717+ return PERF_REG_LOONGARCH_R3;1818+ case UNW_LOONGARCH64_R4:1919+ return PERF_REG_LOONGARCH_R4;2020+ case UNW_LOONGARCH64_R5:2121+ return PERF_REG_LOONGARCH_R5;2222+ case UNW_LOONGARCH64_R6:2323+ return PERF_REG_LOONGARCH_R6;2424+ case UNW_LOONGARCH64_R7:2525+ return PERF_REG_LOONGARCH_R7;2626+ case UNW_LOONGARCH64_R8:2727+ return PERF_REG_LOONGARCH_R8;2828+ case UNW_LOONGARCH64_R9:2929+ return PERF_REG_LOONGARCH_R9;3030+ case UNW_LOONGARCH64_R10:3131+ return PERF_REG_LOONGARCH_R10;3232+ case UNW_LOONGARCH64_R11:3333+ return PERF_REG_LOONGARCH_R11;3434+ case UNW_LOONGARCH64_R12:3535+ return PERF_REG_LOONGARCH_R12;3636+ case UNW_LOONGARCH64_R13:3737+ return PERF_REG_LOONGARCH_R13;3838+ case UNW_LOONGARCH64_R14:3939+ return PERF_REG_LOONGARCH_R14;4040+ case UNW_LOONGARCH64_R15:4141+ return PERF_REG_LOONGARCH_R15;4242+ case UNW_LOONGARCH64_R16:4343+ return PERF_REG_LOONGARCH_R16;4444+ case UNW_LOONGARCH64_R17:4545+ return PERF_REG_LOONGARCH_R17;4646+ case UNW_LOONGARCH64_R18:4747+ return PERF_REG_LOONGARCH_R18;4848+ case UNW_LOONGARCH64_R19:4949+ return PERF_REG_LOONGARCH_R19;5050+ case UNW_LOONGARCH64_R20:5151+ return PERF_REG_LOONGARCH_R20;5252+ case UNW_LOONGARCH64_R21:5353+ return PERF_REG_LOONGARCH_R21;5454+ case UNW_LOONGARCH64_R22:5555+ return PERF_REG_LOONGARCH_R22;5656+ case UNW_LOONGARCH64_R23:5757+ return PERF_REG_LOONGARCH_R23;5858+ case UNW_LOONGARCH64_R24:5959+ return PERF_REG_LOONGARCH_R24;6060+ case UNW_LOONGARCH64_R25:6161+ return PERF_REG_LOONGARCH_R25;6262+ case UNW_LOONGARCH64_R26:6363+ return PERF_REG_LOONGARCH_R26;6464+ case UNW_LOONGARCH64_R27:6565+ return PERF_REG_LOONGARCH_R27;6666+ case UNW_LOONGARCH64_R28:6767+ return PERF_REG_LOONGARCH_R28;6868+ case UNW_LOONGARCH64_R29:6969+ return PERF_REG_LOONGARCH_R29;7070+ case UNW_LOONGARCH64_R30:7171+ return PERF_REG_LOONGARCH_R30;7272+ case UNW_LOONGARCH64_R31:7373+ return PERF_REG_LOONGARCH_R31;7474+ case UNW_LOONGARCH64_PC:7575+ return PERF_REG_LOONGARCH_PC;7676+ default:7777+ pr_err("unwind: invalid reg id %d\n", regnum);7878+ return -EINVAL;7979+ }8080+8181+ return -EINVAL;8282+}
···28282929#include "../../arch/arm/include/uapi/asm/perf_regs.h"3030#include "../../arch/csky/include/uapi/asm/perf_regs.h"3131+#include "../../arch/loongarch/include/uapi/asm/perf_regs.h"3132#include "../../arch/mips/include/uapi/asm/perf_regs.h"3233#include "../../arch/powerpc/include/uapi/asm/perf_regs.h"3334#include "../../arch/riscv/include/uapi/asm/perf_regs.h"···234233 return NULL;235234 }236235236236+ return NULL;237237+}238238+239239+static inline const char *__perf_reg_name_loongarch(int id)240240+{241241+ switch (id) {242242+ case PERF_REG_LOONGARCH_PC:243243+ return "PC";244244+ case PERF_REG_LOONGARCH_R1:245245+ return "%r1";246246+ case PERF_REG_LOONGARCH_R2:247247+ return "%r2";248248+ case PERF_REG_LOONGARCH_R3:249249+ return "%r3";250250+ case PERF_REG_LOONGARCH_R4:251251+ return "%r4";252252+ case PERF_REG_LOONGARCH_R5:253253+ return "%r5";254254+ case PERF_REG_LOONGARCH_R6:255255+ return "%r6";256256+ case PERF_REG_LOONGARCH_R7:257257+ return "%r7";258258+ case PERF_REG_LOONGARCH_R8:259259+ return "%r8";260260+ case PERF_REG_LOONGARCH_R9:261261+ return "%r9";262262+ case PERF_REG_LOONGARCH_R10:263263+ return "%r10";264264+ case PERF_REG_LOONGARCH_R11:265265+ return "%r11";266266+ case PERF_REG_LOONGARCH_R12:267267+ return "%r12";268268+ case PERF_REG_LOONGARCH_R13:269269+ return "%r13";270270+ case PERF_REG_LOONGARCH_R14:271271+ return "%r14";272272+ case PERF_REG_LOONGARCH_R15:273273+ return "%r15";274274+ case PERF_REG_LOONGARCH_R16:275275+ return "%r16";276276+ case PERF_REG_LOONGARCH_R17:277277+ return "%r17";278278+ case PERF_REG_LOONGARCH_R18:279279+ return "%r18";280280+ case PERF_REG_LOONGARCH_R19:281281+ return "%r19";282282+ case PERF_REG_LOONGARCH_R20:283283+ return "%r20";284284+ case PERF_REG_LOONGARCH_R21:285285+ return "%r21";286286+ case PERF_REG_LOONGARCH_R22:287287+ return "%r22";288288+ case PERF_REG_LOONGARCH_R23:289289+ return "%r23";290290+ case PERF_REG_LOONGARCH_R24:291291+ return "%r24";292292+ case PERF_REG_LOONGARCH_R25:293293+ return "%r25";294294+ case PERF_REG_LOONGARCH_R26:295295+ return "%r26";296296+ case PERF_REG_LOONGARCH_R27:297297+ return "%r27";298298+ case PERF_REG_LOONGARCH_R28:299299+ return "%r28";300300+ case PERF_REG_LOONGARCH_R29:301301+ return "%r29";302302+ case PERF_REG_LOONGARCH_R30:303303+ return "%r30";304304+ case PERF_REG_LOONGARCH_R31:305305+ return "%r31";306306+ default:307307+ break;308308+ }237309 return NULL;238310}239311···744670745671 if (!strcmp(arch, "csky"))746672 reg_name = __perf_reg_name_csky(id);673673+ else if (!strcmp(arch, "loongarch"))674674+ reg_name = __perf_reg_name_loongarch(id);747675 else if (!strcmp(arch, "mips"))748676 reg_name = __perf_reg_name_mips(id);749677 else if (!strcmp(arch, "powerpc"))