mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-20 01:50:24 +08:00
Implement xfer_partial TARGET_OBJECT_SIGNAL_INFO for NetBSD
NetBSD implements reading and overwriting siginfo_t received by the tracee. With TARGET_OBJECT_SIGNAL_INFO signal information can be examined and modified through the special variable $_siginfo. Implement the "get_siginfo_type" gdbarch method for NetBSD architectures. As with Linux architectures, cache the created type in the gdbarch when it is first created. Currently NetBSD uses an identical siginfo type on all architectures, so there is no support for architecture-specific fields. gdb/ChangeLog: * nbsd-nat.h (nbsd_nat_target::xfer_partial): New declaration. * nbsd-nat.c (nbsd_nat_target::xfer_partial): New function. * nbsd-tdep.c (nbsd_gdbarch_data_handle, struct nbsd_gdbarch_data) (init_nbsd_gdbarch_data, get_nbsd_gdbarch_data) (nbsd_get_siginfo_type): New. (nbsd_init_abi): Install gdbarch "get_siginfo_type" method. (_initialize_nbsd_tdep): New
This commit is contained in:
@ -845,3 +845,48 @@ nbsd_nat_target::supports_multi_process ()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Implement the "xfer_partial" target_ops method. */
|
||||
|
||||
enum target_xfer_status
|
||||
nbsd_nat_target::xfer_partial (enum target_object object,
|
||||
const char *annex, gdb_byte *readbuf,
|
||||
const gdb_byte *writebuf,
|
||||
ULONGEST offset, ULONGEST len,
|
||||
ULONGEST *xfered_len)
|
||||
{
|
||||
pid_t pid = inferior_ptid.pid ();
|
||||
|
||||
switch (object)
|
||||
{
|
||||
case TARGET_OBJECT_SIGNAL_INFO:
|
||||
{
|
||||
ptrace_siginfo_t psi;
|
||||
|
||||
if (offset > sizeof (siginfo_t))
|
||||
return TARGET_XFER_E_IO;
|
||||
|
||||
if (ptrace (PT_GET_SIGINFO, pid, &psi, sizeof (psi)) == -1)
|
||||
return TARGET_XFER_E_IO;
|
||||
|
||||
if (offset + len > sizeof (siginfo_t))
|
||||
len = sizeof (siginfo_t) - offset;
|
||||
|
||||
if (readbuf != NULL)
|
||||
memcpy (readbuf, ((gdb_byte *) &psi.psi_siginfo) + offset, len);
|
||||
else
|
||||
{
|
||||
memcpy (((gdb_byte *) &psi.psi_siginfo) + offset, writebuf, len);
|
||||
|
||||
if (ptrace (PT_SET_SIGINFO, pid, &psi, sizeof (psi)) == -1)
|
||||
return TARGET_XFER_E_IO;
|
||||
}
|
||||
*xfered_len = len;
|
||||
return TARGET_XFER_OK;
|
||||
}
|
||||
default:
|
||||
return inf_ptrace_target::xfer_partial (object, annex,
|
||||
readbuf, writebuf, offset,
|
||||
len, xfered_len);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user