diff options
author | Kung Hsu <kung@cygnus> | 1994-06-10 01:30:06 +0000 |
---|---|---|
committer | Kung Hsu <kung@cygnus> | 1994-06-10 01:30:06 +0000 |
commit | 7d1699ae198f387f725f21f43a64da41362bcd06 (patch) | |
tree | 9a6ec06f01e259c8b02437bd85d6d380158e9d7d /gdb/sparclite-tdep.c | |
parent | cd3508f16ed7c81a9cec0c8314d5c1bb9b04a4de (diff) | |
download | gdb-7d1699ae198f387f725f21f43a64da41362bcd06.zip gdb-7d1699ae198f387f725f21f43a64da41362bcd06.tar.gz gdb-7d1699ae198f387f725f21f43a64da41362bcd06.tar.bz2 |
Modified Files:
breakpoint.c breakpoint.h ChangeLog
Added Files:
sparclite-tdep.c sparclite-stub.c
* sparclite-tdep.c: new file, contains hardware breakpoint support
code.
* sparclite-stub.c: new file, stub code that add support hardware
breakpoint support.
* breakpoint.c: add hardware breakpoint support.
* breakpoint.h: add new breakpoint type to support hardware
breakpoint.
Diffstat (limited to 'gdb/sparclite-tdep.c')
-rw-r--r-- | gdb/sparclite-tdep.c | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/gdb/sparclite-tdep.c b/gdb/sparclite-tdep.c new file mode 100644 index 0000000..b3af30b --- /dev/null +++ b/gdb/sparclite-tdep.c @@ -0,0 +1,210 @@ +/* Target-dependent code for the Fujitsu SPARCLITE for GDB, the GNU debugger. + Copyright 1994 Free Software Foundation, Inc. + +This file is part of GDB. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "defs.h" +#include "gdbcore.h" +#include "breakpoint.h" + +#define DDA2_SUP_ASI 0xb000000 +#define DDA1_SUP_ASI 0xb0000 + +#define DDA2_ASI_MASK 0xff000000 +#define DDA1_ASI_MASK 0xff0000 +#define DIA2_SUP_MODE 0x8000 +#define DIA1_SUP_MODE 0x4000 +#define DDA2_ENABLE 0x100 +#define DDA1_ENABLE 0x80 +#define DIA2_ENABLE 0x40 +#define DIA1_ENABLE 0x20 +#define DSINGLE_STEP 0x10 +#define DDV_TYPE_MASK 0xc +#define DDV_TYPE_LOAD 0x0 +#define DDV_TYPE_STORE 0x4 +#define DDV_TYPE_ACCESS 0x8 +#define DDV_TYPE_ALWAYS 0xc +#define DDV_COND 0x2 +#define DDV_MASK 0x1 + +int +sparclite_insert_watchpoint(addr, len, type) + CORE_ADDR addr; + int len; + int type; +{ +CORE_ADDR dcr; + + dcr = read_register (DCR_REGNUM); + + if (!(dcr & DDA1_ENABLE)) + { + write_register (DDA1_REGNUM, addr); + dcr &= ~(DDA1_ASI_MASK | DDV_TYPE_MASK); + dcr |= (DDA1_SUP_ASI | DDA1_ENABLE); + if (type == 1) + { + write_register (DDV1_REGNUM, 0); + write_register (DDV2_REGNUM, 0xffffffff); + dcr |= (DDV_TYPE_LOAD & (~DDV_COND & ~DDV_MASK)); + } + else if (type == 0) + { + write_register (DDV1_REGNUM, 0); + write_register (DDV2_REGNUM, 0xffffffff); + dcr |= (DDV_TYPE_STORE & (~DDV_COND & ~DDV_MASK)); + } + else + { + write_register (DDV1_REGNUM, 0); + write_register (DDV2_REGNUM, 0xffffffff); + dcr |= (DDV_TYPE_ACCESS); + } + write_register (DCR_REGNUM, dcr); + } + else if (!(dcr & DDA2_ENABLE)) + { + write_register (DDA2_REGNUM, addr); + dcr &= ~(DDA2_ASI_MASK & DDV_TYPE_MASK); + dcr |= (DDA2_SUP_ASI | DDA2_ENABLE); + if (type == 1) + { + write_register (DDV1_REGNUM, 0); + write_register (DDV2_REGNUM, 0xffffffff); + dcr |= (DDV_TYPE_LOAD & ~DDV_COND & ~DDV_MASK); + } + else if (type == 0) + { + write_register (DDV1_REGNUM, 0); + write_register (DDV2_REGNUM, 0xffffffff); + dcr |= (DDV_TYPE_STORE & ~DDV_COND & ~DDV_MASK); + } + else + { + write_register (DDV1_REGNUM, 0); + write_register (DDV2_REGNUM, 0xffffffff); + dcr |= (DDV_TYPE_ACCESS); + } + write_register (DCR_REGNUM, dcr); + } + else + return -1; + + return 0; +} + +int +sparclite_remove_watchpoint(addr, len, type) + CORE_ADDR addr; + int len; + int type; +{ +CORE_ADDR dcr, dda1, dda2; + + dcr = read_register (DCR_REGNUM); + dda1 = read_register (DDA1_REGNUM); + dda2 = read_register (DDA2_REGNUM); + + if ((dcr & DDA1_ENABLE) && addr == dda1) { + write_register (DCR_REGNUM, (dcr & ~DDA1_ENABLE)); + } + else if ((dcr & DDA2_ENABLE) && addr == dda2) { + write_register (DCR_REGNUM, (dcr & ~DDA2_ENABLE)); + } + else + return -1; + + return 0; +} + +int +sparclite_insert_hw_breakpoint(addr, len) + CORE_ADDR addr; + int len; +{ +CORE_ADDR dcr; + + dcr = read_register (DCR_REGNUM); + + if (!(dcr & DIA1_ENABLE)) { + write_register (DIA1_REGNUM, addr); + write_register (DCR_REGNUM, (dcr | DIA1_ENABLE | DIA1_SUP_MODE)); + } + else if (!(dcr & DIA2_ENABLE)) { + write_register (DIA2_REGNUM, addr); + write_register (DCR_REGNUM, (dcr | DIA2_ENABLE | DIA2_SUP_MODE)); + } + else + return -1; + + return 0; +} + +int +sparclite_remove_hw_breakpoint(addr, shadow) + CORE_ADDR addr; + int shadow; +{ +CORE_ADDR dcr, dia1, dia2; + + dcr = read_register (DCR_REGNUM); + dia1 = read_register (DIA1_REGNUM); + dia2 = read_register (DIA2_REGNUM); + + if ((dcr & DIA1_ENABLE) && addr == dia1) { + write_register (DCR_REGNUM, (dcr & ~DIA1_ENABLE)); + } + else if ((dcr & DIA2_ENABLE) && addr == dia2) { + write_register (DCR_REGNUM, (dcr & ~DIA2_ENABLE)); + } + else + return -1; + + return 0; +} + +int +sparclite_check_watch_resources(type, cnt, ot) + int type; + int cnt; + int ot; +{ + if (type == bp_hardware_breakpoint) { + if (TARGET_HW_BREAK_LIMIT == 0) return 0; + else if (cnt <= TARGET_HW_BREAK_LIMIT) return 1; + } + else { + if (TARGET_HW_WATCH_LIMIT == 0) return 0; + else if (ot) return -1; + else if (cnt <= TARGET_HW_WATCH_LIMIT) return 1; + } + return -1; +} + +CORE_ADDR +sparclite_stopped_data_address() +{ + CORE_ADDR dsr, dda1, dda2; + + dsr = read_register (DSR_REGNUM); + dda1 = read_register (DDA1_REGNUM); + dda2 = read_register (DDA2_REGNUM); + + if (dsr & 0x10) return dda1; + else if (dsr & 0x20) return dda2; + else return 0; +} |