From 9bed62d7af4f64fa3fd1f320d05da3d45bb4ea0a Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 6 Oct 2004 08:57:38 +0000 Subject: [PATCH] * sh-tdep.c (sh_pseudo_register_read): Add PSEUDO_BANK_REGNUM handling. (sh_pseudo_register_write): Ditto. --- gdb/ChangeLog | 5 +++++ gdb/sh-tdep.c | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e94e4ae1b12..18148ea2730 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2004-10-06 Corinna Vinschen + + * sh-tdep.c (sh_pseudo_register_read): Add PSEUDO_BANK_REGNUM handling. + (sh_pseudo_register_write): Ditto. + 2004-10-06 Corinna Vinschen * sh-tdep.c (IS_MACL_STS): New define. diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c index 80a6be9fc87..bfed7033545 100644 --- a/gdb/sh-tdep.c +++ b/gdb/sh-tdep.c @@ -1866,6 +1866,9 @@ sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int base_regnum, portion; char temp_buffer[MAX_REGISTER_SIZE]; + if (reg_nr == PSEUDO_BANK_REGNUM) + regcache_raw_read (regcache, BANK_REGNUM, buffer); + else if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM) { base_regnum = dr_reg_base_num (reg_nr); @@ -1902,7 +1905,19 @@ sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, int base_regnum, portion; char temp_buffer[MAX_REGISTER_SIZE]; - if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM) + if (reg_nr == PSEUDO_BANK_REGNUM) + { + /* When the bank register is written to, the whole register bank + is switched and all values in the bank registers must be read + from the target/sim again. We're just invalidating the regcache + so that a re-read happens next time it's necessary. */ + int bregnum; + + regcache_raw_write (regcache, BANK_REGNUM, buffer); + for (bregnum = R0_BANK0_REGNUM; bregnum < MACLB_REGNUM; ++bregnum) + set_register_cached (bregnum, 0); + } + else if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM) { base_regnum = dr_reg_base_num (reg_nr); -- 2.30.2