s390: gdbarch_tdep add hook for syscall record

Most parts of s390_process_record are common for the architecture.  Only
the system call handling differs between the OSes.  In order to be able to
move s390_process_record to a common code file add a hook to record
syscalls to gdbarch_tdep.  So every OS can implement their own handling.

gdb/ChangeLog:

	* s390-linux-tdep.c (gdbarch_tdep.s390_syscall_record): New hook.
	(s390_process_record, s390_gdbarch_tdep_alloc)
	(s390_linux_init_abi_any): Use/set new hook.
This commit is contained in:
Philipp Rudo 2018-01-23 13:37:43 +01:00 committed by Andreas Arnez
parent 7042632bf7
commit 9c0b896ee1
2 changed files with 26 additions and 2 deletions

View file

@ -122,6 +122,9 @@ struct gdbarch_tdep
bool have_tdb;
bool have_vx;
bool have_gs;
/* Hook to record OS specific systemcall. */
int (*s390_syscall_record) (struct regcache *regcache, LONGEST svc_number);
};
@ -3808,6 +3811,7 @@ static int
s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
CORE_ADDR addr)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
uint16_t insn[3] = {0};
/* Instruction as bytes. */
uint8_t ibyte[6];
@ -3964,8 +3968,16 @@ ex:
case 0x0a:
/* SVC - supervisor call */
if (s390_linux_syscall_record (regcache, ibyte[1]))
return -1;
if (tdep->s390_syscall_record != NULL)
{
if (tdep->s390_syscall_record (regcache, ibyte[1]))
return -1;
}
else
{
printf_unfiltered (_("no syscall record support\n"));
return -1;
}
break;
case 0x0b: /* BSM - branch and set mode */
@ -7997,6 +8009,8 @@ s390_gdbarch_tdep_alloc ()
tdep->have_vx = false;
tdep->have_gs = false;
tdep->s390_syscall_record = NULL;
return tdep;
}
@ -8195,6 +8209,10 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
static void
s390_linux_init_abi_any (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
tdep->s390_syscall_record = s390_linux_syscall_record;
linux_init_abi (info, gdbarch);
/* Register handling. */