diff --git a/include/register.h b/include/register.h index ec74cd5cd133d0f285e042791679afb7cc459f3f..9be4dd7d2b69f13970f7fd9b66abebaa8dd4446e 100644 --- a/include/register.h +++ b/include/register.h @@ -94,6 +94,44 @@ enum PerfEventArm64Regs { PERF_REG_ARM64_MAX, }; +enum PerfEventLoongArch64Regs { + PERF_REG_LOONGARCH64_R0, + PERF_REG_LOONGARCH64_R1, + PERF_REG_LOONGARCH64_R2, + PERF_REG_LOONGARCH64_R3, + PERF_REG_LOONGARCH64_R4, + PERF_REG_LOONGARCH64_R5, + PERF_REG_LOONGARCH64_R6, + PERF_REG_LOONGARCH64_R7, + PERF_REG_LOONGARCH64_R8, + PERF_REG_LOONGARCH64_R9, + PERF_REG_LOONGARCH64_R10, + PERF_REG_LOONGARCH64_R11, + PERF_REG_LOONGARCH64_R12, + PERF_REG_LOONGARCH64_R13, + PERF_REG_LOONGARCH64_R14, + PERF_REG_LOONGARCH64_R15, + PERF_REG_LOONGARCH64_R16, + PERF_REG_LOONGARCH64_R17, + PERF_REG_LOONGARCH64_R18, + PERF_REG_LOONGARCH64_R19, + PERF_REG_LOONGARCH64_R20, + PERF_REG_LOONGARCH64_R21, + PERF_REG_LOONGARCH64_R22, + PERF_REG_LOONGARCH64_R23, + PERF_REG_LOONGARCH64_R24, + PERF_REG_LOONGARCH64_R25, + PERF_REG_LOONGARCH64_R26, + PERF_REG_LOONGARCH64_R27, + PERF_REG_LOONGARCH64_R28, + PERF_REG_LOONGARCH64_R29, + PERF_REG_LOONGARCH64_R30, + PERF_REG_LOONGARCH64_R31, + PERF_REG_LOONGARCH64_SP, + PERF_REG_LOONGARCH64_PC, + PERF_REG_LOONGARCH64_MAX, +}; + enum PerfEventArmRegs { PERF_REG_ARM_R0, PERF_REG_ARM_R1, @@ -131,6 +169,8 @@ constexpr ArchType BUILD_ARCH_TYPE = ArchType::ARCH_X86_64; constexpr ArchType BUILD_ARCH_TYPE = ArchType::ARCH_ARM64; #elif defined(target_cpu_arm) constexpr ArchType BUILD_ARCH_TYPE = ArchType::ARCH_ARM; +#elif defined(target_cpu_loongarch64) +constexpr ArchType BUILD_ARCH_TYPE = ArchType::ARCH_LOONGARCH; #else #error NOT SUPPORT ARCH #endif diff --git a/script/hiperf_utils.py b/script/hiperf_utils.py index 6e06c17dee73c0bb101177d0ee49ebcafbc5dfa4..fe3d900b1d9d104d429f1e32df8869c91db5a87b 100644 --- a/script/hiperf_utils.py +++ b/script/hiperf_utils.py @@ -161,6 +161,8 @@ def get_arch(arch): return 'x86_64' if '86' in arch: return 'x86' + if 'loongarch64' in arch: + return 'loongarch64' raise Exception('unsupported architecture: %s' % arch.strip()) @@ -356,6 +358,8 @@ class LocalLibDownload: return ['arm', 'arm64'] if device_arch == 'arm': return ['arm'] + if device_arch == 'loongarch64': + return ['loongarch64'] return [] diff --git a/src/callstack.cpp b/src/callstack.cpp index 7be78a696c8d8a2153ae61bcd5e423e82664b0eb..96376d309ff4576229a7c83ac2d9e5b215fe3eae 100644 --- a/src/callstack.cpp +++ b/src/callstack.cpp @@ -279,9 +279,12 @@ bool CallStack::DoUnwind2(const VirtualThread &thread, std::vector &ca tempRegs.push_back(static_cast(regs_[i])); } regs->SetRegsData(tempRegs); -#else +#elif defined(target_cpu_arm64) static std::shared_ptr regs = std::make_shared(); regs->SetRegsData(reinterpret_cast(regs_), regsNum_); +#elif defined(target_cpu_loongarch64) + static std::shared_ptr regs = std::make_shared(); + regs->SetRegsData(reinterpret_cast(regs_), regsNum_); #endif CHECK_TRUE(unwinder == nullptr, false, 0, ""); unwinder->SetRegs(regs); diff --git a/src/hiperf_libreport.cpp b/src/hiperf_libreport.cpp index 08794ee636298841ce90cb27035bc628ba203d7d..38cff1afff86c67c4c0be5ed68ebe881083cceca 100644 --- a/src/hiperf_libreport.cpp +++ b/src/hiperf_libreport.cpp @@ -179,6 +179,9 @@ const char *ReportGetElfArch(const char *elfPath) case ArchType::ARCH_X86_64: machineName = "x86_64"; break; + case ArchType::ARCH_LOONGARCH: + machineName = "loongarch64"; + break; default: break; } diff --git a/src/register.cpp b/src/register.cpp index 658fb270b66e97aa1b2a67a7e6afedf807a7856d..5c4b5b634032941fad6f87a8c9496fd5dfd1741f 100644 --- a/src/register.cpp +++ b/src/register.cpp @@ -58,6 +58,9 @@ uint64_t GetSupportedRegMask(ArchType arch) case ArchType::ARCH_ARM64: result = ((1ULL << PERF_REG_ARM64_MAX) - 1); break; + case ArchType::ARCH_LOONGARCH: + result = ((1ULL << PERF_REG_LOONGARCH64_MAX) - 1); + break; default: result = std::numeric_limits::max(); HLOGE("unsupport arch %u", arch); @@ -88,6 +91,8 @@ const std::string GetArchName(ArchType arch) return "ARM"; case ArchType::ARCH_ARM64: return "ARM64"; + case ArchType::ARCH_LOONGARCH: + return "LOONGARCH64"; default: return "Unsupport"; } @@ -103,6 +108,8 @@ size_t RegisterGetIP(ArchType arch) return PERF_REG_ARM_PC; case ArchType::ARCH_ARM64: return PERF_REG_ARM64_PC; + case ArchType::ARCH_LOONGARCH: + return PERF_REG_LOONGARCH64_PC; default: return std::numeric_limits::max(); } @@ -118,6 +125,8 @@ size_t RegisterGetSP(ArchType arch) return PERF_REG_ARM_SP; case ArchType::ARCH_ARM64: return PERF_REG_ARM64_SP; + case ArchType::ARCH_LOONGARCH: + return PERF_REG_LOONGARCH64_SP; default: return std::numeric_limits::max(); } @@ -161,6 +170,8 @@ ArchType GetArchTypeFromUname(const std::string &machine) return ArchType::ARCH_X86_64; } else if (machine == "x86" || machine == "i686") { return ArchType::ARCH_X86; + } else if (machine == "loongarch64") { + return ArchType::ARCH_LOONGARCH; } else { HLOGE("unsupport machine %s", machine.c_str()); return ArchType::ARCH_UNKNOWN;