From 9c0b896ee1d4edfe30c783b027ed5c081845a63d Mon Sep 17 00:00:00 2001 From: Philipp Rudo Date: Tue, 23 Jan 2018 13:37:43 +0100 Subject: 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. --- gdb/ChangeLog | 6 ++++++ gdb/s390-linux-tdep.c | 22 ++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 636ac81f042..05cb6dea72f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2018-01-23 Philipp Rudo + + * 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. + 2018-01-23 Philipp Rudo * s390-linux-tdep.c (osabi.h): New include. diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c index 681f665cee1..b61a249ee44 100644 --- a/gdb/s390-linux-tdep.c +++ b/gdb/s390-linux-tdep.c @@ -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. */ -- cgit v1.2.1