From 4c8f8270ebd9b7a90c6eafab1abb5d1a56204fae Mon Sep 17 00:00:00 2001 From: sybapp Date: Thu, 13 Feb 2025 11:33:58 +0000 Subject: [PATCH] add initial loongarch64 architecture support Change-Id: Idacdb4866ee22eaf812898ecc6f26d7a8314eff8 Signed-off-by: sybapp --- include/register.h | 40 ++++++++++++++++++++++++++++++++++++++++ script/hiperf_utils.py | 4 ++++ src/callstack.cpp | 5 ++++- src/hiperf_libreport.cpp | 3 +++ src/register.cpp | 11 +++++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) diff --git a/include/register.h b/include/register.h index ec74cd5..9be4dd7 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 6e06c17..fe3d900 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 7be78a6..96376d3 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 08794ee..38cff1a 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 658fb27..5c4b5b6 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; -- Gitee