================
@@ -0,0 +1,81 @@
+//===-- NativeRegisterContextFreeBSD_riscv64.h --------------------*- C++
+//-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#if defined(__riscv) && __riscv_xlen == 64
+
+#ifndef lldb_NativeRegisterContextFreeBSD_riscv64_h
+#define lldb_NativeRegisterContextFreeBSD_riscv64_h
+
+// clang-format off
+#include <sys/types.h>
+#include <sys/param.h>
+#include <machine/reg.h>
+// clang-format on
+
+#include "Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD.h"
+#include "Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.h"
+
+namespace lldb_private {
+namespace process_freebsd {
+
+class NativeRegisterContextFreeBSD_riscv64
+ : public NativeRegisterContextFreeBSD {
+public:
+ NativeRegisterContextFreeBSD_riscv64(const ArchSpec &target_arch,
+ NativeThreadFreeBSD &native_thread);
+
+ uint32_t GetRegisterSetCount() const override;
+ uint32_t GetUserRegisterCount() const override;
+ const RegisterSet *GetRegisterSet(uint32_t set_index) const override;
+
+ Status ReadRegister(const RegisterInfo *reg_info,
+ RegisterValue ®_value) override;
+ Status WriteRegister(const RegisterInfo *reg_info,
+ const RegisterValue ®_value) override;
+ Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;
+ Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
+
+ void InvalidateAllRegisters() override;
+
+private:
+ // FreeBSD's native register structures
+ struct reg m_gpr;
+ struct fpreg m_fpr;
+
+ bool m_gpr_is_valid;
+ bool m_fpr_is_valid;
+
+ // Ptrace wrappers
+ Status ReadGPR();
+ Status WriteGPR();
+ Status ReadFPR();
+ Status WriteFPR();
+
+ // Conversion functions between FreeBSD and POSIX layouts
----------------
mchoo7 wrote:
For i386, x86_64, and powerpc we have RegisterContextFreeBSD. For arm, there is
a clever workaround using byte offsets.
For riscv, it's a bit complicated.
FreeBSD:
```c
struct reg {
__uint64_t ra; /* return address */
__uint64_t sp; /* stack pointer */
__uint64_t gp; /* global pointer */
__uint64_t tp; /* thread pointer */
__uint64_t t[7]; /* temporaries */
__uint64_t s[12]; /* saved registers */
__uint64_t a[8]; /* function arguments */
__uint64_t sepc; /* exception program counter */
__uint64_t sstatus; /* status register */
};
struct fpreg {
__uint64_t fp_x[32][2]; /* Floating point registers */
__uint64_t fp_fcsr; /* Floating point control reg */
};
```
LLDB:
```c
struct GPR {
// note: gpr[0] is pc, not x0
uint64_t gpr[32];
};
struct FPR {
uint64_t fpr[32];
uint32_t fcsr;
};
```
For GPR reg.h doesn't have pc. For FPR the floating point registers have
different sizes. That's why I asked if I'm supposed to create and use
RegisterContextFreeBSD_riscv64 over RegisterContextPOSIX_riscv64
https://github.com/llvm/llvm-project/pull/180549
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits