diff options
-rw-r--r-- | gdb/gdbserver/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/gdbserver/linux-s390-low.c | 44 |
2 files changed, 49 insertions, 1 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index abb182a..6c8fd3a 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2005-05-10 Ulrich Weigand <uweigand@de.ibm.com> + + * linux-s390-low.c (s390_breakpoint, s390_breakpoint_len): Define. + (s390_get_pc, s390_set_pc, s390_breakpoint_at): New functions. + (the_low_target): Add new members. + 2005-05-04 Daniel Jacobowitz <dan@codesourcery.com> * proc-service.c (ps_lgetregs): Search all_processes instead of diff --git a/gdb/gdbserver/linux-s390-low.c b/gdb/gdbserver/linux-s390-low.c index d1a94fb..724e092 100644 --- a/gdb/gdbserver/linux-s390-low.c +++ b/gdb/gdbserver/linux-s390-low.c @@ -1,6 +1,6 @@ /* GNU/Linux S/390 specific low level interface, for the remote server for GDB. - Copyright 2001, 2002 + Copyright 2001, 2002, 2005 Free Software Foundation, Inc. This file is part of GDB. @@ -75,9 +75,51 @@ s390_cannot_store_register (int regno) return 0; } + +static const char s390_breakpoint[] = { 0, 1 }; +#define s390_breakpoint_len 2 + +static CORE_ADDR +s390_get_pc () +{ + unsigned long pc; + collect_register_by_name ("pswa", &pc); +#ifndef __s390x__ + pc &= 0x7fffffff; +#endif + return pc; +} + +static void +s390_set_pc (CORE_ADDR newpc) +{ + unsigned long pc = newpc; +#ifndef __s390x__ + pc |= 0x80000000; +#endif + supply_register_by_name ("pswa", &pc); +} + +static int +s390_breakpoint_at (CORE_ADDR pc) +{ + unsigned char c[s390_breakpoint_len]; + read_inferior_memory (pc, c, s390_breakpoint_len); + return memcmp (c, s390_breakpoint, s390_breakpoint_len) == 0; +} + + struct linux_target_ops the_low_target = { s390_num_regs, s390_regmap, s390_cannot_fetch_register, s390_cannot_store_register, + s390_get_pc, + s390_set_pc, + s390_breakpoint, + s390_breakpoint_len, + NULL, + s390_breakpoint_len, + s390_breakpoint_at, }; + |