This allows running programs under gdb.

ok?


Index: devel/gdb/Makefile
===================================================================
RCS file: /cvs/ports/devel/gdb/Makefile,v
retrieving revision 1.67
diff -u -p -r1.67 Makefile
--- devel/gdb/Makefile  3 Jul 2020 21:12:38 -0000       1.67
+++ devel/gdb/Makefile  18 Oct 2020 14:53:04 -0000
@@ -4,7 +4,7 @@ COMMENT=        GNU debugger
 CATEGORIES=    devel
 
 DISTNAME=      gdb-7.12.1
-REVISION=      12
+REVISION=      13
 
 HOMEPAGE=      https://www.gnu.org/software/gdb/
 
Index: devel/gdb/patches/patch-gdb_ppc64obsd-nat_c
===================================================================
RCS file: /cvs/ports/devel/gdb/patches/patch-gdb_ppc64obsd-nat_c,v
retrieving revision 1.1
diff -u -p -r1.1 patch-gdb_ppc64obsd-nat_c
--- devel/gdb/patches/patch-gdb_ppc64obsd-nat_c 9 Oct 2020 19:22:42 -0000       
1.1
+++ devel/gdb/patches/patch-gdb_ppc64obsd-nat_c 18 Oct 2020 14:53:04 -0000
@@ -3,5 +3,228 @@ $OpenBSD: patch-gdb_ppc64obsd-nat_c,v 1.
 Index: gdb/ppc64obsd-nat.c
 --- gdb/ppc64obsd-nat.c.orig
 +++ gdb/ppc64obsd-nat.c
-@@ -0,0 +1 @@
-+/* Empty */
+@@ -0,0 +1,224 @@
++/* Native-dependent code for OpenBSD/powerpc64.
++
++   Copyright (C) 2004-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 <http://www.gnu.org/licenses/>.  */
++
++#include "defs.h"
++#include "gdbcore.h"
++#include "inferior.h"
++#include "regcache.h"
++
++#include <sys/types.h>
++#include <sys/ptrace.h>
++#include <sys/signal.h>
++#include <machine/frame.h>
++#include <machine/pcb.h>
++#include <machine/reg.h>
++
++#include "ppc-tdep.h"
++#include "ppc64-tdep.h"
++#include "ppc64obsd-tdep.h"
++#include "inf-ptrace.h"
++#include "obsd-nat.h"
++#include "bsd-kvm.h"
++
++#if 0
++
++/* Returns true if PT_GETFPREGS fetches this register.  */
++
++static int
++getfpregs_supplies (struct gdbarch *gdbarch, int regnum)
++{
++  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
++
++  /* FIXME: jimb/2004-05-05: Some PPC variants don't have floating
++     point registers.  Traditionally, GDB's register set has still
++     listed the floating point registers for such machines, so this
++     code is harmless.  However, the new E500 port actually omits the
++     floating point registers entirely from the register set --- they
++     don't even have register numbers assigned to them.
++
++     It's not clear to me how best to update this code, so this assert
++     will alert the first person to encounter the NetBSD/E500
++     combination to the problem.  */
++  gdb_assert (ppc_floating_point_unit_p (gdbarch));
++
++  return ((regnum >= tdep->ppc_fp0_regnum
++           && regnum < tdep->ppc_fp0_regnum + ppc_num_fprs)
++        || regnum == tdep->ppc_fpscr_regnum);
++}
++
++#endif
++
++/* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
++   for all registers.  */
++
++static void
++ppc64obsd_fetch_registers (struct target_ops *ops,
++                         struct regcache *regcache, int regnum)
++{
++  struct reg regs;
++
++  if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid),
++            (PTRACE_TYPE_ARG3) &regs, 0) == -1)
++    perror_with_name (_("Couldn't get registers"));
++
++  ppc64obsd_supply_gregset (&ppc64obsd_gregset, regcache, -1,
++                          &regs, sizeof regs);
++
++#if 0
++  if (regnum == -1
++      || getfpregs_supplies (get_regcache_arch (regcache), regnum))
++    {
++      struct fpreg fpregs;
++
++      if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid),
++                (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
++      perror_with_name (_("Couldn't get floating point status"));
++
++      ppc64obsd_supply_fpregset (&ppc64obsd_fpregset, regcache, -1,
++                               &fpregs, sizeof fpregs);
++    }
++#endif
++}
++
++/* Store register REGNUM back into the inferior.  If REGNUM is -1, do
++   this for all registers.  */
++
++static void
++ppc64obsd_store_registers (struct target_ops *ops,
++                       struct regcache *regcache, int regnum)
++{
++  struct reg regs;
++
++  if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid),
++            (PTRACE_TYPE_ARG3) &regs, 0) == -1)
++    perror_with_name (_("Couldn't get registers"));
++
++  ppc64obsd_collect_gregset (&ppc64obsd_gregset, regcache,
++                           regnum, &regs, sizeof regs);
++
++  if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid),
++            (PTRACE_TYPE_ARG3) &regs, 0) == -1)
++    perror_with_name (_("Couldn't write registers"));
++
++#if 0
++  if (regnum == -1
++      || getfpregs_supplies (get_regcache_arch (regcache), regnum))
++    {
++      struct fpreg fpregs;
++
++      if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid),
++                (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
++      perror_with_name (_("Couldn't get floating point status"));
++
++      ppc64obsd_collect_fpregset (&ppc64obsd_fpregset, regcache,
++                                regnum, &fpregs, sizeof fpregs);
++
++      if (ptrace (PT_SETFPREGS, get_ptrace_pid (inferior_ptid),
++                (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
++      perror_with_name (_("Couldn't write floating point status"));
++    }
++#endif
++}
++
++
++#if 0
++
++static int
++ppc64obsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
++{
++  struct gdbarch *gdbarch = get_regcache_arch (regcache);
++  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
++  struct switchframe sf;
++  struct callframe cf;
++  int i, regnum;
++
++  /* The following is true for OpenBSD 3.7:
++
++     The pcb contains %r1 (the stack pointer) at the point of the
++     context switch in cpu_switch().  At that point we have a stack
++     frame as described by `struct switchframe', and below that a call
++     frame as described by `struct callframe'.  From this information
++     we reconstruct the register state as it would look when we are in
++     cpu_switch().  */
++
++  /* The stack pointer shouldn't be zero.  */
++  if (pcb->pcb_sp == 0)
++    return 0;
++
++  read_memory (pcb->pcb_sp, (gdb_byte *)&sf, sizeof sf);
++  regcache_raw_supply (regcache, gdbarch_sp_regnum (gdbarch), &sf.sp);
++  regcache_raw_supply (regcache, tdep->ppc_cr_regnum, &sf.cr);
++  regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 2, &sf.fixreg2);
++  for (i = 0, regnum = tdep->ppc_gp0_regnum + 13; i < 19; i++, regnum++)
++    regcache_raw_supply (regcache, regnum, &sf.fixreg[i]);
++
++  read_memory (sf.sp, (gdb_byte *)&cf, sizeof cf);
++  regcache_raw_supply (regcache, gdbarch_pc_regnum (gdbarch), &cf.lr);
++  regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 30, &cf.r30);
++  regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 31, &cf.r31);
++
++  return 1;
++}
++
++#endif
++
++
++/* Provide a prototype to silence -Wmissing-prototypes.  */
++void _initialize_ppc64obsd_nat (void);
++
++void
++_initialize_ppc64obsd_nat (void)
++{
++  struct target_ops *t;
++
++  /* Add in local overrides.  */
++  t = inf_ptrace_target ();
++  t->to_fetch_registers = ppc64obsd_fetch_registers;
++  t->to_store_registers = ppc64obsd_store_registers;
++  obsd_add_target (t);
++
++  /* General-purpose registers.  */
++  ppc64obsd_reg_offsets.r0_offset = offsetof (struct reg, r_reg[0]);
++  ppc64obsd_reg_offsets.gpr_size = 8;
++  ppc64obsd_reg_offsets.xr_size = 8;
++  ppc64obsd_reg_offsets.pc_offset = offsetof (struct reg, r_pc);
++  ppc64obsd_reg_offsets.ps_offset = offsetof (struct reg, r_ps);
++  ppc64obsd_reg_offsets.cr_offset = offsetof (struct reg, r_cr);
++  ppc64obsd_reg_offsets.lr_offset = offsetof (struct reg, r_lr);
++  ppc64obsd_reg_offsets.ctr_offset = offsetof (struct reg, r_ctr);
++  ppc64obsd_reg_offsets.xer_offset = offsetof (struct reg, r_xer);
++  ppc64obsd_reg_offsets.mq_offset = -1;
++
++  /* Floating-point registers.  */
++  ppc64obsd_reg_offsets.f0_offset = -1;
++  ppc64obsd_reg_offsets.fpscr_offset = -1;
++  ppc64obsd_fpreg_offsets.f0_offset = -1;
++  ppc64obsd_fpreg_offsets.fpscr_offset = -1;
++  ppc64obsd_fpreg_offsets.fpscr_size = 8;
++
++  /* AltiVec registers.  */
++  ppc64obsd_reg_offsets.vr0_offset = -1;
++  ppc64obsd_reg_offsets.vscr_offset = -1;
++  ppc64obsd_reg_offsets.vrsave_offset = -1;
++
++#if 0
++  /* Support debugging kernel virtual memory images.  */
++  bsd_kvm_add_target (ppc64obsd_supply_pcb);
++#endif
++}
Index: devel/gdb/patches/patch-gdb_ppc64obsd-tdep_c
===================================================================
RCS file: /cvs/ports/devel/gdb/patches/patch-gdb_ppc64obsd-tdep_c,v
retrieving revision 1.1
diff -u -p -r1.1 patch-gdb_ppc64obsd-tdep_c
--- devel/gdb/patches/patch-gdb_ppc64obsd-tdep_c        9 Oct 2020 19:22:42 
-0000       1.1
+++ devel/gdb/patches/patch-gdb_ppc64obsd-tdep_c        18 Oct 2020 14:53:04 
-0000
@@ -3,7 +3,7 @@ $OpenBSD: patch-gdb_ppc64obsd-tdep_c,v 1
 Index: gdb/ppc64obsd-tdep.c
 --- gdb/ppc64obsd-tdep.c.orig
 +++ gdb/ppc64obsd-tdep.c
-@@ -0,0 +1,414 @@
+@@ -0,0 +1,415 @@
 +/* Target-dependent code for OpenBSD/powerpc64.
 +
 +   Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
@@ -414,7 +414,8 @@ Index: gdb/ppc64obsd-tdep.c
 +  if (ppc64obsd_fpreg_offsets.fpscr_offset == 0)
 +    {
 +      /* Floating-point registers.  */
-+      ppc64obsd_reg_offsets.f0_offset = -1;
-+      ppc64obsd_reg_offsets.fpscr_offset = -1;
++      ppc64obsd_fpreg_offsets.f0_offset = -1;
++      ppc64obsd_fpreg_offsets.fpscr_offset = -1;
++      ppc64obsd_fpreg_offsets.fpscr_size = 8;
 +    }
 +}

Reply via email to