diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -95,6 +95,10 @@ void *GetGPRBuffer() override { return &m_gpr_arm64; } + // GetGPRBufferSize returns sizeof arm64 GPR ptrace buffer, it is different + // from GetGPRSize which returns sizeof RegisterInfoPOSIX_arm64::GPR. + size_t GetGPRBufferSize() { return sizeof(m_gpr_arm64); } + void *GetFPRBuffer() override { return &m_fpr; } size_t GetFPRSize() override { return sizeof(m_fpr); } @@ -106,7 +110,7 @@ bool m_sve_header_is_valid; - RegisterInfoPOSIX_arm64::GPR m_gpr_arm64; // 64-bit general purpose registers. + struct user_pt_regs m_gpr_arm64; // 64-bit general purpose registers. RegisterInfoPOSIX_arm64::FPU m_fpr; // floating-point registers including extended register sets. diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -936,9 +936,9 @@ struct iovec ioVec; ioVec.iov_base = GetGPRBuffer(); - ioVec.iov_len = GetGPRSize(); + ioVec.iov_len = GetGPRBufferSize(); - error = ReadRegisterSet(&ioVec, GetGPRSize(), NT_PRSTATUS); + error = ReadRegisterSet(&ioVec, GetGPRBufferSize(), NT_PRSTATUS); if (error.Success()) m_gpr_is_valid = true; @@ -953,11 +953,11 @@ struct iovec ioVec; ioVec.iov_base = GetGPRBuffer(); - ioVec.iov_len = GetGPRSize(); + ioVec.iov_len = GetGPRBufferSize(); m_gpr_is_valid = false; - return WriteRegisterSet(&ioVec, GetGPRSize(), NT_PRSTATUS); + return WriteRegisterSet(&ioVec, GetGPRBufferSize(), NT_PRSTATUS); } Status NativeRegisterContextLinux_arm64::ReadFPR() { diff --git a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h --- a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h +++ b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h @@ -29,6 +29,7 @@ }; // based on RegisterContextDarwin_arm64.h + LLVM_PACKED_START struct GPR { uint64_t x[29]; // x0-x28 uint64_t fp; // x29 @@ -37,6 +38,7 @@ uint64_t pc; // pc uint32_t cpsr; // cpsr }; + LLVM_PACKED_END // based on RegisterContextDarwin_arm64.h struct VReg {