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) ®s, 0) == -1) ++ perror_with_name (_("Couldn't get registers")); ++ ++ ppc64obsd_supply_gregset (&ppc64obsd_gregset, regcache, -1, ++ ®s, 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) ®s, 0) == -1) ++ perror_with_name (_("Couldn't get registers")); ++ ++ ppc64obsd_collect_gregset (&ppc64obsd_gregset, regcache, ++ regnum, ®s, sizeof regs); ++ ++ if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid), ++ (PTRACE_TYPE_ARG3) ®s, 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; + } +}
