From 8e1d09292902cff8325b08a64fa5a918c7f9aa4f Mon Sep 17 00:00:00 2001 From: Kamil Rytarowski Date: Tue, 6 Oct 2020 18:10:26 +0200 Subject: [PATCH] Add NetBSD/aarch64 gdbserver support The support is on par with NetBSD/amd64, thus GPR works, single step and software breakpoint are operational, and the SVR4 r_debug integration is functional. gdbserver/ChangeLog: * netbsd-aarch64-low.cc: Add. * Makefile.in (SFILES): Register "netbsd-aarch64-low.c". * configure.srv: Add aarch64*-*-netbsd*. --- gdbserver/configure.srv | 6 ++ gdbserver/netbsd-aarch64-low.cc | 113 ++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 gdbserver/netbsd-aarch64-low.cc diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv index c4fe4ca81ee..cd25b1574e0 100644 --- a/gdbserver/configure.srv +++ b/gdbserver/configure.srv @@ -61,6 +61,12 @@ case "${gdbserver_host}" in ipa_obj="${ipa_obj} linux-aarch64-tdesc-ipa.o" ipa_obj="${ipa_obj} arch/aarch64-ipa.o" ;; + aarch64*-*-netbsd*) srv_regobj="" + srv_tgtobj="netbsd-low.o netbsd-aarch64-low.o fork-child.o" + srv_tgtobj="${srv_tgtobj} nat/fork-inferior.o" + srv_tgtobj="${srv_tgtobj} nat/netbsd-nat.o" + srv_tgtobj="${srv_tgtobj} arch/aarch64-insn.o arch/aarch64.o" + ;; arm*-*-linux*) srv_tgtobj="$srv_linux_obj linux-arm-low.o" srv_tgtobj="$srv_tgtobj linux-arm-tdesc.o" srv_tgtobj="$srv_tgtobj linux-aarch32-low.o" diff --git a/gdbserver/netbsd-aarch64-low.cc b/gdbserver/netbsd-aarch64-low.cc new file mode 100644 index 00000000000..ca76119a0e9 --- /dev/null +++ b/gdbserver/netbsd-aarch64-low.cc @@ -0,0 +1,113 @@ +/* Copyright (C) 2020 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include +#include + +#include "server.h" +#include "netbsd-low.h" +#include "arch/aarch64.h" +#include "arch/aarch64-insn.h" +#include "tdesc.h" + +/* The fill_function for the general-purpose register set. */ + +static void +netbsd_aarch64_fill_gregset (struct regcache *regcache, char *buf) +{ + struct reg *r = (struct reg *) buf; + +#define netbsd_aarch64_collect_gp(regnum, fld) do { \ + collect_register (regcache, regnum, &r->fld); \ + } while (0) + + for (size_t i = 0; i < ARRAY_SIZE (r->r_reg); i++) + netbsd_aarch64_collect_gp (AARCH64_X0_REGNUM + i, r_reg[i]); + + netbsd_aarch64_collect_gp (AARCH64_SP_REGNUM, r_sp); + netbsd_aarch64_collect_gp (AARCH64_PC_REGNUM, r_pc); +} + +/* The store_function for the general-purpose register set. */ + +static void +netbsd_aarch64_store_gregset (struct regcache *regcache, const char *buf) +{ + struct reg *r = (struct reg *) buf; + +#define netbsd_aarch64_supply_gp(regnum, fld) do { \ + supply_register (regcache, regnum, &r->fld); \ + } while(0) + + for (size_t i = 0; i < ARRAY_SIZE (r->r_reg); i++) + netbsd_aarch64_supply_gp (AARCH64_X0_REGNUM + i, r_reg[i]); + + netbsd_aarch64_supply_gp (AARCH64_SP_REGNUM, r_sp); + netbsd_aarch64_supply_gp (AARCH64_PC_REGNUM, r_pc); +} + +/* Description of all the aarch64-netbsd register sets. */ + +static const struct netbsd_regset_info netbsd_target_regsets[] = +{ + /* General Purpose Registers. */ + {PT_GETREGS, PT_SETREGS, sizeof (struct reg), + netbsd_aarch64_fill_gregset, netbsd_aarch64_store_gregset}, + /* End of list marker. */ + {0, 0, -1, NULL, NULL } +}; + +/* NetBSD target op definitions for the aarch64 architecture. */ + +class netbsd_aarch64_target : public netbsd_process_target +{ +protected: + const netbsd_regset_info *get_regs_info () override; + + void low_arch_setup () override; +}; + +/* Return the information to access registers. */ + +const netbsd_regset_info * +netbsd_aarch64_target::get_regs_info () +{ + return netbsd_target_regsets; +} + +/* Architecture-specific setup for the current process. */ + +void +netbsd_aarch64_target::low_arch_setup () +{ + target_desc *tdesc + = aarch64_create_target_description (0, false); + + static const char *expedite_regs_aarch64[] = { "x29", "sp", "pc", NULL }; + init_target_desc (tdesc, expedite_regs_aarch64); + + current_process ()->tdesc = tdesc; +} + +/* The singleton target ops object. */ + +static netbsd_aarch64_target the_netbsd_aarch64_target; + +/* The NetBSD target ops object. */ + +netbsd_process_target *the_netbsd_target = &the_netbsd_aarch64_target; -- 2.30.2