@@ -91,6 +91,9 @@ protected:
bool low_stopped_by_watchpoint () override;
CORE_ADDR low_stopped_data_address () override;
+
+ bool low_siginfo_fixup (siginfo_t *native, gdb_byte *inf,
+ int direction) override;
};
/* The singleton target ops object. */
@@ -494,10 +497,11 @@ ps_get_thread_area (struct ps_prochandle *ph,
is_64bit_tdesc ());
}
-/* Implementation of linux_target_ops method "siginfo_fixup". */
+/* Implementation of linux target ops method "low_siginfo_fixup". */
-static int
-aarch64_linux_siginfo_fixup (siginfo_t *native, gdb_byte *inf, int direction)
+bool
+aarch64_target::low_siginfo_fixup (siginfo_t *native, gdb_byte *inf,
+ int direction)
{
/* Is the inferior 32-bit? If so, then fixup the siginfo object. */
if (!is_64bit_tdesc ())
@@ -509,10 +513,10 @@ aarch64_linux_siginfo_fixup (siginfo_t *native, gdb_byte *inf, int direction)
aarch64_siginfo_from_compat_siginfo (native,
(struct compat_siginfo *) inf);
- return 1;
+ return true;
}
- return 0;
+ return false;
}
/* Implementation of linux_target_ops method "new_process". */
@@ -3114,7 +3118,6 @@ aarch64_supports_hardware_single_step (void)
struct linux_target_ops the_low_target =
{
- aarch64_linux_siginfo_fixup,
aarch64_linux_new_process,
aarch64_linux_delete_process,
aarch64_linux_new_thread,
@@ -1107,7 +1107,6 @@ arm_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
arm_new_process,
arm_delete_process,
arm_new_thread,
@@ -165,7 +165,6 @@ bfin_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
NULL, /* new_process */
NULL, /* delete_process */
NULL, /* new_thread */
@@ -470,7 +470,6 @@ crisv32_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
NULL, /* new_process */
NULL, /* delete_process */
NULL, /* new_thread */
@@ -6016,16 +6016,11 @@ linux_process_target::qxfer_osdata (const char *annex,
return linux_common_xfer_osdata (annex, readbuf, offset, len);
}
-/* Convert a native/host siginfo object, into/from the siginfo in the
- layout of the inferiors' architecture. */
-
-static void
-siginfo_fixup (siginfo_t *siginfo, gdb_byte *inf_siginfo, int direction)
+void
+linux_process_target::siginfo_fixup (siginfo_t *siginfo,
+ gdb_byte *inf_siginfo, int direction)
{
- int done = 0;
-
- if (the_low_target.siginfo_fixup != NULL)
- done = the_low_target.siginfo_fixup (siginfo, inf_siginfo, direction);
+ bool done = low_siginfo_fixup (siginfo, inf_siginfo, direction);
/* If there was no callback, or the callback didn't do anything,
then just do a straight memcpy. */
@@ -6038,6 +6033,13 @@ siginfo_fixup (siginfo_t *siginfo, gdb_byte *inf_siginfo, int direction)
}
}
+bool
+linux_process_target::low_siginfo_fixup (siginfo_t *native, gdb_byte *inf,
+ int direction)
+{
+ return false;
+}
+
bool
linux_process_target::supports_qxfer_siginfo ()
{
@@ -131,12 +131,6 @@ struct lwp_info;
struct linux_target_ops
{
- /* Hook to convert from target format to ptrace format and back.
- Returns true if any conversion was done; false otherwise.
- If DIRECTION is 1, then copy from INF to NATIVE.
- If DIRECTION is 0, copy from NATIVE to INF. */
- int (*siginfo_fixup) (siginfo_t *native, gdb_byte *inf, int direction);
-
/* Hook to call when a new process is created or attached to.
If extra per-process architecture-specific data is needed,
allocate it here. */
@@ -630,6 +624,11 @@ class linux_process_target : public process_stratum_target
registers meanwhile, we have the cached data we can rely on. */
bool check_stopped_by_watchpoint (lwp_info *child);
+ /* Convert a native/host siginfo object, into/from the siginfo in the
+ layout of the inferiors' architecture. */
+ void siginfo_fixup (siginfo_t *siginfo, gdb_byte *inf_siginfo,
+ int direction);
+
protected:
/* The architecture-specific "low" methods are listed below. */
@@ -685,6 +684,13 @@ class linux_process_target : public process_stratum_target
virtual void low_supply_ptrace_register (regcache *regcache, int regno,
const char *buf);
+ /* Hook to convert from target format to ptrace format and back.
+ Returns true if any conversion was done; false otherwise.
+ If DIRECTION is 1, then copy from INF to NATIVE.
+ If DIRECTION is 0, copy from NATIVE to INF. */
+ virtual bool low_siginfo_fixup (siginfo_t *native, gdb_byte *inf,
+ int direction);
+
/* How many bytes the PC should be decremented after a break. */
int m_decr_pc_after_break;
};
@@ -163,7 +163,6 @@ m32r_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
NULL, /* new_process */
NULL, /* delete_process */
NULL, /* new_thread */
@@ -259,7 +259,6 @@ m68k_supports_hardware_single_step (void)
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
NULL, /* new_process */
NULL, /* delete_process */
NULL, /* new_thread */
@@ -988,7 +988,6 @@ mips_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
mips_linux_new_process,
mips_linux_delete_process,
mips_linux_new_thread,
@@ -3430,7 +3430,6 @@ ppc_get_ipa_tdesc_idx (void)
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
NULL, /* new_process */
NULL, /* delete_process */
NULL, /* new_thread */
@@ -2839,7 +2839,6 @@ s390_emit_ops (void)
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
NULL, /* new_process */
NULL, /* delete_process */
NULL, /* new_thread */
@@ -194,7 +194,6 @@ sh_target::low_arch_setup ()
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
NULL, /* new_process */
NULL, /* delete_process */
NULL, /* new_thread */
@@ -425,7 +425,6 @@ tic6x_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
NULL, /* new_process */
NULL, /* delete_process */
NULL, /* new_thread */
@@ -226,7 +226,6 @@ tile_supports_hardware_single_step (void)
struct linux_target_ops the_low_target =
{
- NULL, /* siginfo_fixup */
NULL, /* new_process */
NULL, /* delete_process */
NULL, /* new_thread */
@@ -141,6 +141,10 @@ protected:
/* collect_ptrace_register/supply_ptrace_register are not needed in the
native i386 case (no registers smaller than an xfer unit), and are not
used in the biarch case (HAVE_LINUX_USRREGS is not defined). */
+
+ /* Need to fix up i386 siginfo if host is amd64. */
+ bool low_siginfo_fixup (siginfo_t *native, gdb_byte *inf,
+ int direction) override;
};
/* The singleton target ops object. */
@@ -750,8 +754,8 @@ x86_debug_reg_state (pid_t pid)
from INF to PTRACE. If DIRECTION is 0, copy from PTRACE to
INF. */
-static int
-x86_siginfo_fixup (siginfo_t *ptrace, gdb_byte *inf, int direction)
+bool
+x86_target::low_siginfo_fixup (siginfo_t *ptrace, gdb_byte *inf, int direction)
{
#ifdef __x86_64__
unsigned int machine;
@@ -768,7 +772,7 @@ x86_siginfo_fixup (siginfo_t *ptrace, gdb_byte *inf, int direction)
FIXUP_X32);
#endif
- return 0;
+ return false;
}
static int use_xml;
@@ -2919,8 +2923,6 @@ x86_get_ipa_tdesc_idx (void)
struct linux_target_ops the_low_target =
{
- /* need to fix up i386 siginfo if host is amd64 */
- x86_siginfo_fixup,
x86_linux_new_process,
x86_linux_delete_process,
x86_linux_new_thread,
@@ -331,7 +331,6 @@ xtensa_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* siginfo_fixup */
NULL, /* new_process */
NULL, /* delete_process */
NULL, /* new_thread */