blob: 29e198cd900d27becc1224262e84780a0e4ec864 [file] [log] [blame]
From 4f0e06249d23629e1d56b296e7a040b6968484e9 Mon Sep 17 00:00:00 2001
From: Mark Hatle <mark.hatle@xilinx.com>
Date: Mon, 20 Jan 2020 12:48:13 -0800
Subject: [PATCH 44/45] gdb/microblaze-linux-nat.c: Fix target compilation of
gdb
Add the nat to the configure file
Remove gdb_assert.h and gdb_string.h.
Adjust include for opcodes as well.
Update to match latest style of components, similar to ppc-linux-nat.c
Update:
get_regcache_arch(regcache) to regcache->arch()
regcache_raw_supply(regcache, ...) to regcache->raw_supply(...)
regcache_raw_collect(regcache, ...) to regcache->raw_collect(...)
Signed-off-by: Mark Hatle <mark.hatle@xilinx.com>
---
gdb/configure.nat | 4 +
gdb/microblaze-linux-nat.c | 149 +++++++++++++------------------------
gdb/microblaze-tdep.c | 3 +-
3 files changed, 57 insertions(+), 99 deletions(-)
diff --git a/gdb/configure.nat b/gdb/configure.nat
index 3118263ac6..b8dc7398a5 100644
--- a/gdb/configure.nat
+++ b/gdb/configure.nat
@@ -260,6 +260,10 @@ case ${gdb_host} in
# Host: Motorola m68k running GNU/Linux.
NATDEPFILES="${NATDEPFILES} m68k-linux-nat.o"
;;
+ microblaze*)
+ # Host: Microblaze, running Linux
+ NATDEPFILES="${NATDEPFILES} microblaze-linux-nat.o"
+ ;;
mips)
# Host: Linux/MIPS
NATDEPFILES="${NATDEPFILES} linux-nat-trad.o \
diff --git a/gdb/microblaze-linux-nat.c b/gdb/microblaze-linux-nat.c
index e9b8c9c522..e09a86bb3f 100644
--- a/gdb/microblaze-linux-nat.c
+++ b/gdb/microblaze-linux-nat.c
@@ -36,11 +36,9 @@
#include "dwarf2-frame.h"
#include "osabi.h"
-#include "gdb_assert.h"
-#include "gdb_string.h"
#include "target-descriptions.h"
-#include "opcodes/microblaze-opcm.h"
-#include "opcodes/microblaze-dis.h"
+#include "../opcodes/microblaze-opcm.h"
+#include "../opcodes/microblaze-dis.h"
#include "linux-nat.h"
#include "target-descriptions.h"
@@ -61,34 +59,27 @@
/* Defines ps_err_e, struct ps_prochandle. */
#include "gdb_proc_service.h"
-/* On GNU/Linux, threads are implemented as pseudo-processes, in which
- case we may be tracing more than one process at a time. In that
- case, inferior_ptid will contain the main process ID and the
- individual thread (process) ID. get_thread_id () is used to get
- the thread id if it's available, and the process id otherwise. */
-
-int
-get_thread_id (ptid_t ptid)
-{
- int tid = TIDGET (ptid);
- if (0 == tid)
- tid = PIDGET (ptid);
- return tid;
-}
-
-#define GET_THREAD_ID(PTID) get_thread_id (PTID)
-
/* Non-zero if our kernel may support the PTRACE_GETREGS and
PTRACE_SETREGS requests, for reading and writing the
general-purpose registers. Zero if we've tried one of
them and gotten an error. */
int have_ptrace_getsetregs = 1;
+struct microblaze_linux_nat_target final : public linux_nat_target
+{
+ /* Add our register access methods. */
+ void fetch_registers (struct regcache *, int) override;
+ void store_registers (struct regcache *, int) override;
+
+ const struct target_desc *read_description () override;
+};
+
+static microblaze_linux_nat_target the_microblaze_linux_nat_target;
+
static int
microblaze_register_u_addr (struct gdbarch *gdbarch, int regno)
{
int u_addr = -1;
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
/* NOTE: cagney/2003-11-25: This is the word size used by the ptrace
interface, and not the wordsize of the program's ABI. */
int wordsize = sizeof (long);
@@ -105,18 +96,16 @@ microblaze_register_u_addr (struct gdbarch *gdbarch, int regno)
static void
fetch_register (struct regcache *regcache, int tid, int regno)
{
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ struct gdbarch *gdbarch = regcache->arch();
/* This isn't really an address. But ptrace thinks of it as one. */
CORE_ADDR regaddr = microblaze_register_u_addr (gdbarch, regno);
int bytes_transferred;
- unsigned int offset; /* Offset of registers within the u area. */
- char buf[MAX_REGISTER_SIZE];
+ char buf[sizeof(long)];
if (regaddr == -1)
{
memset (buf, '\0', register_size (gdbarch, regno)); /* Supply zeroes */
- regcache_raw_supply (regcache, regno, buf);
+ regcache->raw_supply (regno, buf);
return;
}
@@ -149,14 +138,14 @@ fetch_register (struct regcache *regcache, int tid, int regno)
{
/* Little-endian values are always found at the left end of the
bytes transferred. */
- regcache_raw_supply (regcache, regno, buf);
+ regcache->raw_supply (regno, buf);
}
else if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
{
/* Big-endian values are found at the right end of the bytes
transferred. */
size_t padding = (bytes_transferred - register_size (gdbarch, regno));
- regcache_raw_supply (regcache, regno, buf + padding);
+ regcache->raw_supply (regno, buf + padding);
}
else
internal_error (__FILE__, __LINE__,
@@ -175,8 +164,6 @@ fetch_register (struct regcache *regcache, int tid, int regno)
static int
fetch_all_gp_regs (struct regcache *regcache, int tid)
{
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
gdb_gregset_t gregset;
if (ptrace (PTRACE_GETREGS, tid, 0, (void *) &gregset) < 0)
@@ -204,8 +191,6 @@ fetch_all_gp_regs (struct regcache *regcache, int tid)
static void
fetch_gp_regs (struct regcache *regcache, int tid)
{
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
int i;
if (have_ptrace_getsetregs)
@@ -219,17 +204,29 @@ fetch_gp_regs (struct regcache *regcache, int tid)
fetch_register (regcache, tid, i);
}
+/* Fetch registers from the child process. Fetch all registers if
+ regno == -1, otherwise fetch all general registers or all floating
+ point registers depending upon the value of regno. */
+void
+microblaze_linux_nat_target::fetch_registers (struct regcache *regcache, int regno)
+{
+ pid_t tid = get_ptrace_pid (regcache->ptid ());
+
+ if (regno == -1)
+ fetch_gp_regs (regcache, tid);
+ else
+ fetch_register (regcache, tid, regno);
+}
static void
store_register (const struct regcache *regcache, int tid, int regno)
{
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ struct gdbarch *gdbarch = regcache->arch();
/* This isn't really an address. But ptrace thinks of it as one. */
CORE_ADDR regaddr = microblaze_register_u_addr (gdbarch, regno);
int i;
size_t bytes_to_transfer;
- char buf[MAX_REGISTER_SIZE];
+ char buf[sizeof(long)];
if (regaddr == -1)
return;
@@ -242,13 +239,13 @@ store_register (const struct regcache *regcache, int tid, int regno)
if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
{
/* Little-endian values always sit at the left end of the buffer. */
- regcache_raw_collect (regcache, regno, buf);
+ regcache->raw_collect (regno, buf);
}
else if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
{
/* Big-endian values sit at the right end of the buffer. */
size_t padding = (bytes_to_transfer - register_size (gdbarch, regno));
- regcache_raw_collect (regcache, regno, buf + padding);
+ regcache->raw_collect (regno, buf + padding);
}
for (i = 0; i < bytes_to_transfer; i += sizeof (long))
@@ -281,8 +278,6 @@ store_register (const struct regcache *regcache, int tid, int regno)
static int
store_all_gp_regs (const struct regcache *regcache, int tid, int regno)
{
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
gdb_gregset_t gregset;
if (ptrace (PTRACE_GETREGS, tid, 0, (void *) &gregset) < 0)
@@ -319,8 +314,6 @@ store_all_gp_regs (const struct regcache *regcache, int tid, int regno)
static void
store_gp_regs (const struct regcache *regcache, int tid, int regno)
{
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
int i;
if (have_ptrace_getsetregs)
@@ -335,33 +328,10 @@ store_gp_regs (const struct regcache *regcache, int tid, int regno)
}
-/* Fetch registers from the child process. Fetch all registers if
- regno == -1, otherwise fetch all general registers or all floating
- point registers depending upon the value of regno. */
-
-static void
-microblaze_linux_fetch_inferior_registers (struct target_ops *ops,
- struct regcache *regcache, int regno)
-{
- /* Get the thread id for the ptrace call. */
- int tid = GET_THREAD_ID (inferior_ptid);
-
- if (regno == -1)
- fetch_gp_regs (regcache, tid);
- else
- fetch_register (regcache, tid, regno);
-}
-
-/* Store registers back into the inferior. Store all registers if
- regno == -1, otherwise store all general registers or all floating
- point registers depending upon the value of regno. */
-
-static void
-microblaze_linux_store_inferior_registers (struct target_ops *ops,
- struct regcache *regcache, int regno)
+void
+microblaze_linux_nat_target::store_registers (struct regcache *regcache, int regno)
{
- /* Get the thread id for the ptrace call. */
- int tid = GET_THREAD_ID (inferior_ptid);
+ pid_t tid = get_ptrace_pid (regcache->ptid ());
if (regno >= 0)
store_register (regcache, tid, regno);
@@ -373,59 +343,44 @@ microblaze_linux_store_inferior_registers (struct target_ops *ops,
thread debugging. */
void
-fill_gregset (const struct regcache *regcache,
- gdb_gregset_t *gregsetp, int regno)
+supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
{
- microblaze_collect_gregset (NULL, regcache, regno, gregsetp);
+ microblaze_supply_gregset (NULL, regcache, -1, gregsetp);
}
void
-supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
+fill_gregset (const struct regcache *regcache,
+ gdb_gregset_t *gregsetp, int regno)
{
- microblaze_supply_gregset (NULL, regcache, -1, gregsetp);
+ microblaze_collect_gregset (NULL, regcache, regno, gregsetp);
}
void
-fill_fpregset (const struct regcache *regcache,
- gdb_fpregset_t *fpregsetp, int regno)
+supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
{
/* FIXME. */
+ return;
}
void
-supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
+fill_fpregset (const struct regcache *regcache,
+ gdb_fpregset_t *fpregsetp, int regno)
{
/* FIXME. */
+ return;
}
-static const struct target_desc *
-microblaze_linux_read_description (struct target_ops *ops)
+const struct target_desc *
+microblaze_linux_nat_target::read_description ()
{
- CORE_ADDR microblaze_hwcap = 0;
-
- if (target_auxv_search (ops, AT_HWCAP, &microblaze_hwcap) != 1)
- return NULL;
-
return NULL;
}
-
-void _initialize_microblaze_linux_nat (void);
-
void
_initialize_microblaze_linux_nat (void)
{
- struct target_ops *t;
-
- /* Fill in the generic GNU/Linux methods. */
- t = linux_target ();
-
- /* Add our register access methods. */
- t->to_fetch_registers = microblaze_linux_fetch_inferior_registers;
- t->to_store_registers = microblaze_linux_store_inferior_registers;
-
- t->to_read_description = microblaze_linux_read_description;
+ linux_target = &the_microblaze_linux_nat_target;
/* Register the target. */
- linux_nat_add_target (t);
+ add_inf_child_target (linux_target);
}
diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c
index 7a0c2527f4..23deb24d26 100644
--- a/gdb/microblaze-tdep.c
+++ b/gdb/microblaze-tdep.c
@@ -657,7 +657,7 @@ static std::vector<CORE_ADDR>
microblaze_software_single_step (struct regcache *regcache)
{
// struct gdbarch *arch = get_frame_arch(frame);
- struct gdbarch *arch = get_regcache_arch (regcache);
+ struct gdbarch *arch = regcache->arch();
struct address_space *aspace = get_regcache_aspace (regcache);
// struct address_space *aspace = get_frame_address_space (frame);
struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
@@ -876,7 +876,6 @@ microblaze_regset_from_core_section (struct gdbarch *gdbarch,
static void
make_regs (struct gdbarch *arch)
{
- struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
int mach = gdbarch_bfd_arch_info (arch)->mach;
if (mach == bfd_mach_microblaze64)
--
2.17.1