Changeset 18b1a591 in rtems


Ignore:
Timestamp:
10/27/22 18:47:03 (7 months ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
b4ffaa7c
Parents:
d64e10e
git-author:
Chris Johns <chrisj@…> (10/27/22 18:47:03)
git-committer:
Chris Johns <chrisj@…> (10/30/22 21:04:00)
Message:

cpukit/libdebugger: Fix stepping on ARM architectures

Closes #4744

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libdebugger/rtems-debugger-arm.c

    rd64e10e r18b1a591  
    11/*
    2  * Copyright (c) 2016-2019 Chris Johns <chrisj@rtems.org>.
     2 * Copyright (c) 2016-2022 Chris Johns <chrisj@rtems.org>.
    33 * All rights reserved.
    44 *
     
    8787  #define ARM_SWITCH_REG_ASM   [arm_switch_reg] "=&r" (arm_switch_reg)
    8888  #define ARM_SWITCH_REG_ASM_L ARM_SWITCH_REG_ASM,
     89  #define ASM_ARM_ASM          ".align 2\n.arm\n"
    8990  #define ASM_ARM_MODE         ".align 2\nbx pc\n.arm\n"
    9091  #define ASM_THUMB_MODE       "add %[arm_switch_reg], pc, #1\nbx %[arm_switch_reg]\n.thumb\n"
     92  #define ARM_THUMB_MODE()     __asm__ volatile(ASM_THUMB_MODE : ARM_SWITCH_REG_ASM : :);
     93  #define ARM_ARM_MODE()       __asm__ volatile(ASM_ARM_MODE : : :);
    9194#else
    9295  #define ARM_SWITCH_REG
    9396  #define ARM_SWITCH_REG_ASM
    9497  #define ARM_SWITCH_REG_ASM_L
     98  #define ASM_ARM_ASM
    9599  #define ASM_ARM_MODE
    96100  #define ASM_THUMB_MODE
     101  #define ARM_THUMB_MODE()
     102  #define ARM_ARM_MODE()
     103#endif
     104
     105#ifdef ARM_MULTILIB_HAS_BARRIER_INSTRUCTIONS
     106#define ARM_SYNC_INST  "isb\n"
     107#else
     108#define ARM_SYNC_INST
    97109#endif
    98110
     
    288300
    289301/*
    290  * ARM debug hardware.
     302 * ARM debug hardware. These variables are directly access
     303 * from assembler so do not change types.
    291304 */
    292305static int   debug_version;
    293306static void* debug_registers;
    294307static int   debug_revision;
    295 static bool  debug_disable_ints;
     308static int   debug_disable_ints;
    296309static int   hw_breakpoints;
    297310static int   hw_watchpoints;
     
    300313 * Hardware break and watch points.
    301314 */
    302 typedef struct
    303 {
    304   bool                 enabled;
    305   bool                 loaded;
    306   void*                address;
    307   size_t               length;
    308   CPU_Exception_frame* frame;
    309   uint32_t             control;
    310   uint32_t             value;
    311 } arm_debug_hwbreak;
    312 
    313315#define ARM_HW_BREAKPOINT_MAX (16)
    314316#define ARM_HW_WATCHPOINT_MAX (16)
     
    328330#define ARM_HW_BP_PRIV_ALL_MODES   (0x03)
    329331
    330 static arm_debug_hwbreak hw_breaks[ARM_HW_BREAKPOINT_MAX];
    331 //static arm_debug_hwbreak hw_watches[ARM_HW_WATCHPOINT_MAX];
     332/*
     333 * A hw breakpoint has DBGBCR and DBGBVR registers. Allocate memory
     334 * for each.
     335 *
     336 * Maintian the values ready to load into the hardware. The loader is
     337 * a load of the value and then control for enabled BPs.
     338 */
     339static uint32_t hw_breaks[ARM_HW_BREAKPOINT_MAX * 2];
     340
     341/*
     342 * The order in the array is important
     343 */
     344#define ARM_HWB_BCR(_bp) (hw_breaks[((_bp) * 2) + 1])
     345#define ARM_HWB_VCR(_bp) (hw_breaks[(_bp) * 2])
     346#define ARM_HWB_ENALBED(_bp) ((ARM_HWB_BCR(_bp) & 1) != 0)
     347#define ARM_HWB_CLEAR(_bp) ARM_HWB_BCR(_bp) = 0; ARM_HWB_VCR(_bp) = 0
     348#define ARM_HWB_CLEAR_ALL() memset(&hw_breaks[0], 0, sizeof(hw_breaks))
    332349
    333350/*
     
    440457      ASM_ARM_MODE                                         \
    441458      ARM_CP_INSTR(mcr, _cp, _op1, val, _CRn, _CRm, _op2)  \
     459      ARM_SYNC_INST                                        \
    442460      ASM_THUMB_MODE                                       \
    443461      : ARM_SWITCH_REG_ASM                                 \
     
    450468    asm volatile(                                          \
    451469      ASM_ARM_MODE                                         \
     470      ARM_SYNC_INST                                        \
    452471      ARM_CP_INSTR(mrc, _cp, _op1, val, _CRn, _CRm, _op2)  \
    453472      ASM_THUMB_MODE                                       \
     
    492511 * offset from the base address.
    493512 */
    494 #define ARM_MMAP_ADDR(reg)       (((volatile uint32_t*) debug_registers) + (reg))
    495 #define ARM_MMAP_WRITE(reg, val) *ARM_MMAP_ADDR(reg) = (val); _ARM_Data_synchronization_barrier()
    496 #define ARM_MMAP_READ(reg)       *ARM_MMAP_ADDR(reg)
     513#define ARM_MMAP_ADDR(reg) \
     514  (((volatile uint32_t*) debug_registers) + (reg))
     515#define ARM_MMAP_WRITE(reg, val) *ARM_MMAP_ADDR(reg) = (val)
     516#define ARM_MMAP_READ(reg) *ARM_MMAP_ADDR(reg)
     517#define ARM_MMAP_WRITE_SYNC(reg, val) \
     518  ARM_MMAP_WRITE(reg, val); \
     519  _ARM_Data_synchronization_barrier(); \
     520  _ARM_Instruction_synchronization_barrier()
     521
     522/*
     523 * Debug hardware breakpoint registers.
     524 */
     525#define ARM_MMAP_DBGDSCR 34
     526#define ARM_MMAP_DBGBCR  80
     527#define ARM_MMAP_DBGBVR  64
    497528
    498529static bool
     
    903934       */
    904935      if (ARM_MMAP_READ(1005) == 3) {
    905         ARM_MMAP_WRITE(1004, 0xC5ACCE55);
     936        ARM_MMAP_WRITE_SYNC(1004, 0xC5ACCE55);
    906937      }
    907938      /*
    908939       * Are we already in debug mode?
    909940       */
    910       val = ARM_MMAP_READ(34);
     941      val = ARM_MMAP_READ(ARM_MMAP_DBGDSCR);
    911942      if ((val & (1 << 15)) == 0) {
    912943        rtems_debugger_printf("rtems-db: arm debug: enable debug mode\n");
    913         val = ARM_MMAP_READ(34);
    914         ARM_MMAP_WRITE(34, ARM_MMAP_READ(34) | (1 << 15));
     944        val = ARM_MMAP_READ(ARM_MMAP_DBGDSCR);
     945        ARM_MMAP_WRITE_SYNC(ARM_MMAP_DBGDSCR,
     946                            ARM_MMAP_READ(ARM_MMAP_DBGDSCR) | (1 << 15));
    915947        arm_debug_retries = 0;
    916948      }
     
    10031035
    10041036static inline void
    1005 arm_debug_break_setup(arm_debug_hwbreak* bp,
    1006                       uint32_t           address,
    1007                       uint32_t           type,
    1008                       uint32_t           byte_address_select,
    1009                       uint32_t           privilege)
    1010 {
    1011   bp->control = (((type & 0xf) << 20) |
    1012                  ((byte_address_select & 0xf) << 5) |
    1013                  ((privilege & 0x3) << 1) | 1);
    1014   bp->value = (intptr_t) address;
     1037arm_debug_break_setup(int      bp,
     1038                      uint32_t address,
     1039                      uint32_t type,
     1040                      uint32_t byte_address_select,
     1041                      uint32_t privilege)
     1042{
     1043  ARM_HWB_BCR(bp) = (((type & 0xf) << 20) |
     1044                     ((byte_address_select & 0xf) << 5) |
     1045                     ((privilege & 0x3) << 1) | 1);
     1046  ARM_HWB_VCR(bp) = (intptr_t) (address & (~3));
    10151047}
    10161048
    10171049static void
    1018 arm_debug_break_write_control(int bp, uint32_t control)
    1019 {
    1020   if (bp < 15) {
    1021     if (debug_registers != NULL) {
    1022       ARM_MMAP_WRITE(80 + bp, control);
     1050arm_debug_break_c14_write_control(int bp, uint32_t control)
     1051{
     1052  switch (bp) {
     1053    case 0:
     1054      ARM_CP14_WRITE(control, 0, 0, 5);
     1055      break;
     1056    case 1:
     1057      ARM_CP14_WRITE(control, 0, 1, 5);
     1058      break;
     1059    case 2:
     1060      ARM_CP14_WRITE(control, 0, 2, 5);
     1061      break;
     1062    case 3:
     1063      ARM_CP14_WRITE(control, 0, 3, 5);
     1064      break;
     1065    case 4:
     1066      ARM_CP14_WRITE(control, 0, 4, 5);
     1067      break;
     1068    case 5:
     1069      ARM_CP14_WRITE(control, 0, 5, 5);
     1070      break;
     1071    case 6:
     1072      ARM_CP14_WRITE(control, 0, 6, 5);
     1073      break;
     1074    case 7:
     1075      ARM_CP14_WRITE(control, 0, 7, 5);
     1076      break;
     1077    case 8:
     1078      ARM_CP14_WRITE(control, 0, 8, 5);
     1079      break;
     1080    case 9:
     1081      ARM_CP14_WRITE(control, 0, 9, 5);
     1082      break;
     1083    case 10:
     1084      ARM_CP14_WRITE(control, 0, 10, 5);
     1085      break;
     1086    case 11:
     1087      ARM_CP14_WRITE(control, 0, 11, 5);
     1088      break;
     1089    case 12:
     1090      ARM_CP14_WRITE(control, 0, 12, 5);
     1091      break;
     1092    case 13:
     1093      ARM_CP14_WRITE(control, 0, 13, 5);
     1094      break;
     1095    case 14:
     1096      ARM_CP14_WRITE(control, 0, 14, 5);
     1097      break;
     1098    case 15:
     1099      ARM_CP14_WRITE(control, 0, 15, 5);
     1100      break;
     1101  }
     1102}
     1103
     1104static void
     1105arm_debug_break_c14_write_value(int bp, uint32_t value)
     1106{
     1107  switch (bp) {
     1108    case 0:
     1109      ARM_CP14_WRITE(value, 0, 0, 4);
     1110      break;
     1111    case 1:
     1112      ARM_CP14_WRITE(value, 0, 1, 4);
     1113      break;
     1114    case 2:
     1115      ARM_CP14_WRITE(value, 0, 2, 4);
     1116      break;
     1117    case 3:
     1118      ARM_CP14_WRITE(value, 0, 3, 4);
     1119      break;
     1120    case 4:
     1121      ARM_CP14_WRITE(value, 0, 4, 4);
     1122      break;
     1123    case 5:
     1124      ARM_CP14_WRITE(value, 0, 5, 4);
     1125      break;
     1126    case 6:
     1127      ARM_CP14_WRITE(value, 0, 6, 4);
     1128      break;
     1129    case 7:
     1130      ARM_CP14_WRITE(value, 0, 7, 4);
     1131      break;
     1132    case 8:
     1133      ARM_CP14_WRITE(value, 0, 8, 4);
     1134      break;
     1135    case 9:
     1136      ARM_CP14_WRITE(value, 0, 9, 4);
     1137      break;
     1138    case 10:
     1139      ARM_CP14_WRITE(value, 0, 10, 4);
     1140      break;
     1141    case 11:
     1142      ARM_CP14_WRITE(value, 0, 11, 4);
     1143      break;
     1144    case 12:
     1145      ARM_CP14_WRITE(value, 0, 12, 4);
     1146      break;
     1147    case 13:
     1148      ARM_CP14_WRITE(value, 0, 13, 4);
     1149      break;
     1150    case 14:
     1151      ARM_CP14_WRITE(value, 0, 14, 4);
     1152      break;
     1153    case 15:
     1154      ARM_CP14_WRITE(value, 0, 15, 4);
     1155      break;
     1156  }
     1157}
     1158
     1159static uint32_t
     1160arm_debug_dbgdscr_read(void)
     1161{
     1162  uint32_t val;
     1163  if (debug_registers != NULL) {
     1164    val = ARM_MMAP_READ(ARM_MMAP_DBGDSCR);
     1165  }
     1166  else {
     1167    ARM_CP14_READ(val, 0, 1, 0);
     1168  }
     1169  return val;
     1170}
     1171
     1172static void
     1173arm_debug_dbgdscr_write(uint32_t val)
     1174{
     1175  if (debug_registers != NULL) {
     1176    ARM_MMAP_WRITE_SYNC(ARM_MMAP_DBGDSCR, val);
     1177  }
     1178  else {
     1179    ARM_CP14_WRITE(val, 0, 1, 0);
     1180  }
     1181}
     1182
     1183static uint32_t
     1184arm_debug_method_of_entry(void)
     1185{
     1186  return (arm_debug_dbgdscr_read() >> 2) & 0xf;
     1187}
     1188
     1189static void
     1190arm_debug_disable_interrupts(void)
     1191{
     1192  debug_disable_ints = 1;
     1193}
     1194
     1195static void
     1196arm_debug_enable_interrupts(void)
     1197{
     1198  arm_debug_dbgdscr_write(arm_debug_dbgdscr_read() & ~(1 << 11));
     1199}
     1200
     1201static void
     1202arm_debug_break_clear(int bp)
     1203{
     1204  rtems_interrupt_lock_context lock_context;
     1205  rtems_interrupt_lock_acquire(&target_lock, &lock_context);
     1206  ARM_HWB_CLEAR(bp);
     1207  rtems_interrupt_lock_release(&target_lock, &lock_context);
     1208}
     1209
     1210static void
     1211arm_debug_break_clear_all(void)
     1212{
     1213  rtems_interrupt_lock_context lock_context;
     1214  rtems_interrupt_lock_acquire(&target_lock, &lock_context);
     1215  ARM_HWB_CLEAR_ALL();
     1216  rtems_interrupt_lock_release(&target_lock, &lock_context);
     1217}
     1218
     1219static inline void
     1220arm_debug_set_context_id(const uint32_t id)
     1221{
     1222#if ARM_CP15
     1223  ARM_CP15_WRITE(id, 0, 13, 0, 1);
     1224#endif
     1225}
     1226
     1227static void
     1228arm_debug_break_unload(void)
     1229{
     1230  rtems_interrupt_lock_context lock_context;
     1231  int i;
     1232  rtems_interrupt_lock_acquire(&target_lock, &lock_context);
     1233  if (debug_registers != NULL) {
     1234    for (i = 0; i < hw_breakpoints; ++i) {
     1235      ARM_MMAP_WRITE(ARM_MMAP_DBGBCR + i, 0);
     1236      ARM_MMAP_WRITE(ARM_MMAP_DBGBVR + i, 0);
     1237    }
     1238  } else {
     1239    for (i = 0; i < hw_breakpoints; ++i) {
     1240      arm_debug_break_c14_write_control(i, 0);
     1241      arm_debug_break_c14_write_value(i, 0);
     1242    }
     1243  }
     1244  rtems_interrupt_lock_release(&target_lock, &lock_context);
     1245}
     1246
     1247static void
     1248arm_debug_break_exec_enable(int bp, uintptr_t addr, bool thumb, bool step) {
     1249  uint32_t bas;
     1250
     1251  /*
     1252   * See table C3-2 Effect of byte address selection on Breakpoint
     1253   * generation and "Instruction address comparision programming
     1254   * examples.
     1255   */
     1256  if (thumb) {
     1257    /*
     1258     * Thumb
     1259     */
     1260    if ((addr & (1 << 1)) == 0) {
     1261      /*
     1262       * Instruction address: DBGBVR[31:2]:00 BAS: 0bxx11 Mismatch: Miss
     1263       */
     1264      bas = 0x3; /* bxx11 */
    10231265    }
    10241266    else {
    1025       switch (bp) {
    1026       case 0:
    1027         ARM_CP14_WRITE(control, 0, 0, 5);
    1028         break;
    1029       case 1:
    1030         ARM_CP14_WRITE(control, 0, 1, 5);
    1031         break;
    1032       case 2:
    1033         ARM_CP14_WRITE(control, 0, 2, 5);
    1034         break;
    1035       case 3:
    1036         ARM_CP14_WRITE(control, 0, 3, 5);
    1037         break;
    1038       case 4:
    1039         ARM_CP14_WRITE(control, 0, 4, 5);
    1040         break;
    1041       case 5:
    1042         ARM_CP14_WRITE(control, 0, 5, 5);
    1043         break;
    1044       case 6:
    1045         ARM_CP14_WRITE(control, 0, 6, 5);
    1046         break;
    1047       case 7:
    1048         ARM_CP14_WRITE(control, 0, 7, 5);
    1049         break;
    1050       case 8:
    1051         ARM_CP14_WRITE(control, 0, 8, 5);
    1052         break;
    1053       case 9:
    1054         ARM_CP14_WRITE(control, 0, 9, 5);
    1055         break;
    1056       case 10:
    1057         ARM_CP14_WRITE(control, 0, 10, 5);
    1058         break;
    1059       case 11:
    1060         ARM_CP14_WRITE(control, 0, 11, 5);
    1061         break;
    1062       case 12:
    1063         ARM_CP14_WRITE(control, 0, 12, 5);
    1064         break;
    1065       case 13:
    1066         ARM_CP14_WRITE(control, 0, 13, 5);
    1067         break;
    1068       case 14:
    1069         ARM_CP14_WRITE(control, 0, 14, 5);
    1070         break;
    1071       case 15:
    1072         ARM_CP14_WRITE(control, 0, 15, 5);
    1073         break;
    1074       }
     1267      /*
     1268       * Instruction address: DBGBVR[31:2]:10 BAS: 0b11xx Mismatch: Miss
     1269       */
     1270      bas = 0xc; /* b11xx */
    10751271    }
    10761272  }
    1077 }
    1078 
    1079 static void
    1080 arm_debug_break_write_value(int bp, uint32_t value)
    1081 {
    1082   if (bp < 15) {
    1083     if (debug_registers != NULL) {
    1084       ARM_MMAP_WRITE(64 + bp, value);
    1085     }
    1086     else {
    1087       switch (bp) {
    1088       case 0:
    1089         ARM_CP14_WRITE(value, 0, 0, 4);
    1090         break;
    1091       case 1:
    1092         ARM_CP14_WRITE(value, 0, 1, 4);
    1093         break;
    1094       case 2:
    1095         ARM_CP14_WRITE(value, 0, 2, 4);
    1096         break;
    1097       case 3:
    1098         ARM_CP14_WRITE(value, 0, 3, 4);
    1099         break;
    1100       case 4:
    1101         ARM_CP14_WRITE(value, 0, 4, 4);
    1102         break;
    1103       case 5:
    1104         ARM_CP14_WRITE(value, 0, 5, 4);
    1105         break;
    1106       case 6:
    1107         ARM_CP14_WRITE(value, 0, 6, 4);
    1108         break;
    1109       case 7:
    1110         ARM_CP14_WRITE(value, 0, 7, 4);
    1111         break;
    1112       case 8:
    1113         ARM_CP14_WRITE(value, 0, 8, 4);
    1114         break;
    1115       case 9:
    1116         ARM_CP14_WRITE(value, 0, 9, 4);
    1117         break;
    1118       case 10:
    1119         ARM_CP14_WRITE(value, 0, 10, 4);
    1120         break;
    1121       case 11:
    1122         ARM_CP14_WRITE(value, 0, 11, 4);
    1123         break;
    1124       case 12:
    1125         ARM_CP14_WRITE(value, 0, 12, 4);
    1126         break;
    1127       case 13:
    1128         ARM_CP14_WRITE(value, 0, 13, 4);
    1129         break;
    1130       case 14:
    1131         ARM_CP14_WRITE(value, 0, 14, 4);
    1132         break;
    1133       case 15:
    1134         ARM_CP14_WRITE(value, 0, 15, 4);
    1135         break;
    1136       }
    1137     }
    1138   }
    1139 }
    1140 
    1141 static uint32_t
    1142 arm_debug_dbgdscr_read(void)
    1143 {
    1144   uint32_t val;
    1145   if (debug_registers != NULL) {
    1146     val = ARM_MMAP_READ(34);
    1147   }
    11481273  else {
    1149     ARM_CP14_READ(val, 0, 1, 0);
    1150   }
    1151   return val;
    1152 }
    1153 
    1154 static void
    1155 arm_debug_dbgdscr_write(uint32_t val)
    1156 {
    1157   if (debug_registers != NULL) {
    1158     ARM_MMAP_WRITE(34, val);
    1159   }
    1160   else {
    1161     ARM_CP14_WRITE(val, 0, 1, 0);
    1162   }
    1163 }
    1164 
    1165 static uint32_t
    1166 arm_debug_method_of_entry(void)
    1167 {
    1168   return (arm_debug_dbgdscr_read() >> 2) & 0xf;
    1169 }
    1170 
    1171 static void
    1172 arm_debug_disable_interrupts(void)
    1173 {
    1174   debug_disable_ints = true;
    1175 }
    1176 
    1177 static void
    1178 arm_debug_commit_interrupt_disable(void)
    1179 {
    1180   if (debug_disable_ints) {
    1181     arm_debug_dbgdscr_write(arm_debug_dbgdscr_read() | (1 << 11));
    1182     debug_disable_ints = false;
    1183   }
    1184 }
    1185 
    1186 static void
    1187 arm_debug_enable_interrupts(void)
    1188 {
    1189   arm_debug_dbgdscr_write(arm_debug_dbgdscr_read() & ~(1 << 11));
    1190 }
    1191 
    1192 static void
    1193 arm_debug_break_clear(void)
    1194 {
    1195   rtems_interrupt_lock_context lock_context;
    1196   arm_debug_hwbreak*           bp = &hw_breaks[0];
    1197   int                          i;
    1198   rtems_interrupt_lock_acquire(&target_lock, &lock_context);
    1199   for (i = 0; i < hw_breakpoints; ++i, ++bp) {
    1200     bp->enabled = false;
    1201     bp->loaded = false;
    1202   }
    1203   rtems_interrupt_lock_release(&target_lock, &lock_context);
    1204 }
    1205 
    1206 static inline void
    1207 arm_debug_set_context_id(const uint32_t id)
    1208 {
    1209 #if ARM_CP15
    1210   ARM_CP15_WRITE(id, 0, 13, 0, 1);
    1211 #endif
    1212 }
    1213 
    1214 /*
    1215  * You can only load the hardware breaks points when in the SVC mode or the
    1216  * single step inverted break point will trigger.
    1217  */
    1218 static void
    1219 arm_debug_break_load(void)
    1220 {
    1221   rtems_interrupt_lock_context lock_context;
    1222   arm_debug_hwbreak*           bp = &hw_breaks[0];
    1223   int                          i;
    1224   rtems_interrupt_lock_acquire(&target_lock, &lock_context);
    1225   if (bp->enabled && !bp->loaded) {
    1226     arm_debug_set_context_id(0xdead1111);
    1227     arm_debug_break_write_value(0, bp->value);
    1228     arm_debug_break_write_control(0, bp->control);
    1229   }
    1230   ++bp;
    1231   for (i = 1; i < hw_breakpoints; ++i, ++bp) {
    1232     if (bp->enabled && !bp->loaded) {
    1233       bp->loaded = true;
    1234       arm_debug_break_write_value(i, bp->value);
    1235       arm_debug_break_write_control(i, bp->control);
    1236     }
    1237   }
    1238   rtems_interrupt_lock_release(&target_lock, &lock_context);
    1239 }
    1240 
    1241 static void
    1242 arm_debug_break_unload(void)
    1243 {
    1244   rtems_interrupt_lock_context lock_context;
    1245   arm_debug_hwbreak*           bp = &hw_breaks[0];
    1246   int                          i;
    1247   rtems_interrupt_lock_acquire(&target_lock, &lock_context);
    1248   arm_debug_set_context_id(0);
    1249   for (i = 0; i < hw_breakpoints; ++i, ++bp) {
    1250     bp->loaded = false;
    1251     arm_debug_break_write_control(i, 0);
    1252   }
    1253   rtems_interrupt_lock_release(&target_lock, &lock_context);
     1274    /*
     1275     * ARM
     1276     *
     1277     * Instruction address: DBGBVR[31:2]:00 BAS: 0b1111 Mismatch: Miss
     1278     */
     1279    bas = 0xf; /* b1111 */
     1280  }
     1281
     1282  target_printk("[} break: addr:%08x bas:%x thumb:%s\n",
     1283                addr, bas, thumb ? "yes" : "no");
     1284
     1285  arm_debug_break_setup(
     1286    bp,
     1287    addr,
     1288    step ? ARM_HW_BP_UNLINKED_INSTR_MISMATCH : ARM_HW_BP_UNLINKED_INSTR_MATCH,
     1289    bas,
     1290    ARM_HW_BP_PRIV_PL0_SUP_SYS);
    12541291}
    12551292
     
    12581295{
    12591296#if TARGET_DEBUG
    1260   arm_debug_hwbreak* bp = &hw_breaks[0];
    12611297  int                i;
    1262   for (i = 0; i < hw_breakpoints; ++i, ++bp) {
    1263     if (bp->enabled) {
     1298  for (i = 0; i < hw_breakpoints; ++i) {
     1299    if (ARM_HWB_ENALBED(i)) {
    12641300      target_printk("[} bp: %d: control: %08x addr: %08x\n",
    1265                     i, bp->control, bp->value);
     1301                    i, ARM_HWB_BCR(i), ARM_HWB_VCR(i));
    12661302    }
    12671303  }
     
    13151351#if ARM_CP15
    13161352  const uint32_t ifsr = arm_cp15_get_instruction_fault_status();
     1353  const uint32_t dfsr = arm_cp15_get_data_fault_status();
     1354  const void* far = arm_cp15_get_fault_address();
    13171355#else
    13181356  const uint32_t ifsr = 0;
     
    13421380  target_printk("[} > frame = %08" PRIx32 \
    13431381                " sig=%d vector=%u (%u) dbgdscr=%08" PRIx32 " moe=%s" \
    1344                 " ifsr=%08" PRIx32 " pra=%08x\n",
    1345                 (uint32_t) frame,
     1382                " far=%p ifsr=%08" PRIx32 " dfsr=%08" PRIx32
     1383                " exc-ret-pc=%08x\n", (uint32_t) frame,
    13461384                rtems_debugger_target_exception_to_signal(frame),
    13471385                frame->vector, mvector, dbgdscr, arm_moe_label(moe),
    1348                 ifsr, (intptr_t) frame->register_pc);
     1386                far, ifsr, dfsr, (intptr_t) frame->register_pc);
     1387
     1388  arm_debug_break_dump();
    13491389
    13501390  frame->register_pc = (void*) ((intptr_t) frame->register_pc - exc_offset);
     
    13521392  target_print_frame(frame);
    13531393
     1394  arm_debug_break_clear(0);
    13541395  arm_debug_enable_interrupts();
    1355   arm_debug_break_clear();
    13561396
    13571397  if (!debug_session_active)
     
    13741414                (uint32_t) frame, (intptr_t) frame->register_pc, FRAME_SR(frame));
    13751415  target_print_frame(frame);
    1376   arm_debug_break_dump();
    1377 }
     1416}
     1417
     1418/**
     1419 * Exception Handlers
     1420 *
     1421 * The entry and exit is all assembler and ARM code. This avoids any
     1422 * compiler related optimisations effecting the various pieces.
     1423 */
    13781424
    13791425/**
     
    14091455#define EXCEPTION_ENTRY_EXC()                                           \
    14101456  __asm__ volatile(                                                     \
    1411     ASM_ARM_MODE                                                       \
     1457    ASM_ARM_MODE                 /* force ARM mode for thumb systems */ \
    14121458    "sub  sp, %[frame_size]\n"           /* alloc the frame and CPSR */ \
    14131459    "stm  sp, {r0-r12}\n"                            /* store r0-r12 */ \
    1414     "sub  sp, #4\n"                                                     \
    1415     "str  lr, [sp]\n"                           /* save the link reg */ \
    1416     ASM_THUMB_MODE                                                      \
    1417     : ARM_SWITCH_REG_ASM                                                \
     1460    :                                                                   \
    14181461    : [frame_size] "i" (EXCEPTION_FRAME_SIZE)                           \
    1419     : "memory")
     1462    : "cc", "memory")
     1463
     1464/**
     1465 * Debugger entry
     1466 *
     1467 * Check if using debug registers else use CP14.
     1468 *
     1469 * Set all the break point registers to 0. Enable interrupts.
     1470 */
     1471#if ARM_CP15
     1472#define ARM_HW_BP_UNLOAD(_bp)                                           \
     1473    "cmp r0, #" #_bp "\n"                                               \
     1474    "ble 3f\n"                                                          \
     1475    "mcr p14, 0, r1, c0, c" #_bp ", 5\n"                                \
     1476    "mcr p14, 0, r1, c0, c" #_bp ", 4\n"
     1477#define ARM_DGB_ENABLE_INTS                                             \
     1478    "mrc   p14, 0, r1, c0, c1, 0\n"               /* Get the DBGDSCR */ \
     1479    "bic   r1, r1, #(1 << 11)\n"                /* enable interrupts */ \
     1480    "mcr   p14, 0, r1, c0, c1, 0\n"               /* Set the DBGDSCR */
     1481#else
     1482#define ARM_HW_BP_UNLOAD(_bp)
     1483#define ARM_DGB_ENABLE_INTS
     1484#endif
     1485
     1486#define EXCEPTION_ENTRY_DEBUGGER()                                      \
     1487  __asm__ volatile(                                                     \
     1488    /* Set up r0 and r1 */                                              \
     1489    "movw  r0, #:lower16:hw_breakpoints\n"  /* get the num hw breaks */ \
     1490    "movt  r0, #:upper16:hw_breakpoints\n"                              \
     1491    "ldr   r0, [r0]\n"                        /* r0 = hw_breakpoints */ \
     1492    "mov   r1, #0\n"                                   /* write zero */ \
     1493    /* Check if debug registers are being used */                       \
     1494    "movw  r2, #:lower16:debug_registers\n"    /* get the debug regs */ \
     1495    "movt  r2, #:upper16:debug_registers\n"                             \
     1496    "ldr   r2, [r2]\n"                       /* r2 = debug_registers */ \
     1497    "cmp   r2, #0\n"                                        /* NULL? */ \
     1498    "beq    2f\n"                                /* if NULL use cp14 */ \
     1499    /* Debug registers */                                               \
     1500    "add   r3, r2, %[dbgbvr] - 4\n"        /* a3 = DBGBCR0, adjusted */ \
     1501    "add   r2, r2, %[dbgbcr] - 4\n"        /* a2 = DBGBVR0, adjusted */ \
     1502    "1:\n"                                                              \
     1503    "str   r1, [r3, #4]!\n"   /* Store DBGBVR, pre-indexed, modified */ \
     1504    "str   r1, [r2, #4]!\n"   /* Store DBGBCR, pre-indexed, modified */ \
     1505    "sub   r0, r0, #1\n"                                 /* one less */ \
     1506    "cmp   r0, #0\n"                                    /* all done? */ \
     1507    "bne   1b\n"                                                        \
     1508    "ldr   r1, [r2, %[dbgdscr]]\n"                /* Get the DBGDSCR */ \
     1509    "bic   r1, r1, #(1 << 11)\n"                /* enable interrupts */ \
     1510    "str   r1, [r2, %[dbgdscr]]\n"                /* Set the DBGDSCR */ \
     1511    "b     4f\n"                                                        \
     1512    /* CP14 */                                                          \
     1513    "2:\n"                                                              \
     1514    ARM_HW_BP_UNLOAD(0)                                                 \
     1515    ARM_HW_BP_UNLOAD(1)                                                 \
     1516    ARM_HW_BP_UNLOAD(2)                                                 \
     1517    ARM_HW_BP_UNLOAD(3)                                                 \
     1518    ARM_HW_BP_UNLOAD(4)                                                 \
     1519    ARM_HW_BP_UNLOAD(5)                                                 \
     1520    ARM_HW_BP_UNLOAD(6)                                                 \
     1521    ARM_HW_BP_UNLOAD(7)                                                 \
     1522    ARM_HW_BP_UNLOAD(8)                                                 \
     1523    ARM_HW_BP_UNLOAD(9)                                                 \
     1524    ARM_HW_BP_UNLOAD(10)                                                \
     1525    ARM_HW_BP_UNLOAD(11)                                                \
     1526    ARM_HW_BP_UNLOAD(12)                                                \
     1527    ARM_HW_BP_UNLOAD(12)                                                \
     1528    ARM_HW_BP_UNLOAD(13)                                                \
     1529    ARM_HW_BP_UNLOAD(14)                                                \
     1530    ARM_HW_BP_UNLOAD(15)                                                \
     1531    "3:\n"                                                              \
     1532    ARM_DGB_ENABLE_INTS                                                 \
     1533    "4:\n"                                                              \
     1534    ARM_SYNC_INST                                                       \
     1535    :                                                                   \
     1536    : [dbgdscr] "i" (ARM_MMAP_DBGDSCR * sizeof(uint32_t)),              \
     1537      [dbgbcr] "i" (ARM_MMAP_DBGBCR * sizeof(uint32_t)),                \
     1538      [dbgbvr] "i" (ARM_MMAP_DBGBVR * sizeof(uint32_t))                 \
     1539    : "cc", "r0", "r1", "r2", "r3", "memory")
    14201540
    14211541/*
     
    14311551    "mov    r4, #0\n"                                                   \
    14321552    "adds   r6, r5, #128\n"                                             \
    1433     "3:\n"                                                              \
     1553    "1:\n"                                                              \
    14341554    "stmia  r5!, {r3-r4}\n"                                             \
    14351555    "cmp    r5, r6\n"                                                   \
    1436     "bne    3b\n"
     1556    "bne    1b\n"
    14371557#endif /* ARM_MULTILIB_VFP_D32 */
    14381558#define EXCEPTION_ENTRY_FPU(frame_fpu_size)                             \
     
    14541574#define EXCEPTION_ENTRY_THREAD(_frame)                                  \
    14551575  __asm__ volatile(                                                     \
    1456     ASM_ARM_MODE                                                        \
    1457     "ldr  lr, [sp]\n"                        /* recover the link reg */ \
    1458     "add  sp, #4\n"                                                     \
    14591576    "add  r0, sp, %[r0_r12_size]\n"       /* get the sp in the frame */ \
    14601577    "mrs  r1, spsr\n"                            /* get the saved sr */ \
     
    14691586    "msr  cpsr, r2\n"                            /* back to exc mode */ \
    14701587    "mov  r5, lr\n"                                   /* get the PRA */ \
    1471     "stm  r0, {r3-r6}\n"                      /* save into the frame */ \
     1588    "stm  r0, {r3-r6}\n"       /* save into the frame: sp,lr,pc,cpsr */ \
    14721589    "sub  r4, r3, %[frame_size]\n"            /* destination address */ \
    14731590    "mov  r6, r4\n"                                /* save the frame */ \
     
    14921609    "bic  r1, r1, %[psr_i]\n"        /* clear irq mask, debug checks */ \
    14931610    "msr  cpsr, r1\n"       /* restore the state with irq mask clear */ \
    1494     ASM_THUMB_MODE                                                      \
    1495     : ARM_SWITCH_REG_ASM_L                                              \
     1611    :                                                                   \
    14961612      [o_frame] "=r" (_frame)                                           \
    14971613    : [psr_t] "i" (ARM_PSR_T),                                          \
     
    15021618      [o_frame_fpu] "i" (EXCEPTION_FRAME_FPU_OFFSET),                   \
    15031619      [frame_fpu_size] "i" (EXCEPTION_FRAME_FPU_SIZE + 4)               \
    1504     : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "memory")
     1620    : "cc", "r0", "r1", "r2", "r3", "r4", "r5", "r6", "memory")
    15051621
    15061622/*
     
    15381654#define EXCEPTION_EXIT_THREAD(_frame)                                   \
    15391655  __asm__ volatile(                                                     \
    1540     ASM_ARM_MODE                                                        \
    15411656    "mov  r0, %[i_frame]\n"                         /* get the frame */ \
    1542     "ldr  r0, [r0, %[frame_fpu]]\n"     /* recover FPU frame pointer */ \
     1657    "ldr  r0, [r0, %[frame_fpu]]\n" /* recover aligned FPU frame ptr */ \
    15431658    EXCEPTION_EXIT_FPU(frame_fpu_size)                                  \
    15441659    "ldr  r2, [sp, %[frame_cpsr]]\n" /* recover exc CPSR from thread */ \
     
    15631678    "msr  cpsr, r2\n"            /* switch back to the exc's context */ \
    15641679    "msr  spsr, r6\n"                       /* set the thread's CPSR */ \
    1565     "sub  sp, #4\n"                                                     \
    15661680    "mov  lr, r5\n"                                    /* get the PC */ \
    1567     "str  lr, [sp]\n"                           /* save the link reg */ \
    1568     ASM_THUMB_MODE                                                      \
    1569     : ARM_SWITCH_REG_ASM                                                \
     1681    :                                                                   \
    15701682    : [psr_i] "i" (ARM_PSR_I),                                          \
    15711683      [r0_r12_size] "i" (13 * sizeof(uint32_t)),                        \
     
    15751687      [frame_fpu_size] "i" (EXCEPTION_FRAME_FPU_SIZE + 4),              \
    15761688      [i_frame] "r" (_frame)                                            \
    1577     : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "memory")
     1689    : "cc", "r0", "r1", "r2", "r3", "r4", "r5", "r6", "memory")
     1690
     1691/*
     1692 * Debugger exit
     1693 *
     1694 * Check if using debug registers else use CP14.
     1695 *
     1696 * Set all the break point registers to settgins. Disable interrupts
     1697 * if debug_disable_ints is true. Clear debug_disable_ints.
     1698 */
     1699#if ARM_CP15
     1700#define ARM_HW_BP_LOAD(_bp)                                             \
     1701    "cmp r0, #" #_bp "\n"                                               \
     1702    "ble 5f\n"                                                          \
     1703    "ldm r1!, {r2-r3}\n"                                                \
     1704    "mcr p14, 0, r2, c0, c" #_bp ", 4\n"                    /* value */ \
     1705    "mcr p14, 0, r3, c0, c" #_bp ", 5\n"                  /* control */
     1706#define ARM_DGB_DISABLE_INTS                                            \
     1707    "mrc   p14, 0, r4, c0, c1, 0\n"               /* Get the DBGDSCR */ \
     1708    "orr   r4, r4, #(1 << 11)\n"               /* disable interrupts */ \
     1709    "mcr   p14, 0, r4, c0, c1, 0\n"               /* Set the DBGDSCR */
     1710#else
     1711#define ARM_HW_BP_LOAD(_bp)
     1712#define ARM_DGB_DISABLE_INTS
     1713#endif
     1714
     1715#define EXCEPTION_EXIT_DEBUGGER()                                       \
     1716  __asm__ volatile(                                                     \
     1717    /* Set up r0, r1, r4 and r5 */                                      \
     1718    "movw  r0, #:lower16:hw_breakpoints\n"  /* get the num hw breaks */ \
     1719    "movt  r0, #:upper16:hw_breakpoints\n"                              \
     1720    "ldr   r0, [r0]\n"                        /* r0 = hw_breakpoints */ \
     1721    "movw  r1, #:lower16:hw_breaks\n"   /* get the hw_breaks pointer */ \
     1722    "movt  r1, #:upper16:hw_breaks\n"                                   \
     1723    "movw  r4, #:lower16:debug_disable_ints\n"   /* get disable ints */ \
     1724    "movt  r4, #:upper16:debug_disable_ints\n"                          \
     1725    "ldr   r5, [r4]\n"                                                  \
     1726    "mov   r3, #0\n"                             /* clear debug ints */ \
     1727    "str   r3, [r4]\n"                                                  \
     1728    /* Check if debug registers are being used */                       \
     1729    "movw  r2, #:lower16:debug_registers\n"    /* get the debug regs */ \
     1730    "movt  r2, #:upper16:debug_registers\n"                             \
     1731    "ldr   r2, [r2]\n"                       /* r2 = debug_registers */ \
     1732    "cmp   r2, #0\n"                                        /* NULL? */ \
     1733    "beq   3f\n"                                 /* if NULL use cp14 */ \
     1734    /* Debug registers */                                               \
     1735    "cmp   r5, #0\n"                                       /* false? */ \
     1736    "beq   1f\n"                 /* if false do not set ints disable */ \
     1737    "ldr   r4, [r2, %[dbgdscr]]\n"                /* Get the DBGDSCR */ \
     1738    "orr   r4, r4, #(1 << 11)\n"               /* disable interrupts */ \
     1739    "str   r4, [r2, %[dbgdscr]]\n"                /* Set the DBGDSCR */ \
     1740    "1:\n"                                                              \
     1741    "add   r3, r2, %[dbgbvr] - 4\n"        /* a3 = DBGBCR0, adjusted */ \
     1742    "add   r2, r2, %[dbgbcr] - 4\n"        /* a2 = DBGBVR0, adjusted */ \
     1743    "2:\n"                                                              \
     1744    "ldm   r1!, {r4-r5}\n"                         /* load vr and cr */ \
     1745    "str   r4, [r3, #4]!\n"   /* Store DBGBVR, pre-indexed, modified */ \
     1746    "str   r5, [r2, #4]!\n"   /* Store DBGBCR, pre-indexed, modified */ \
     1747    "sub   r0, r0, #1\n"                                /* one less? */ \
     1748    "cmp   r0, #1\n"                                    /* all done? */ \
     1749    "bne   2b\n"                                                        \
     1750    "b     5f\n"                                                        \
     1751    /* CP14 */                                                          \
     1752    "3:\n"                                                              \
     1753    "cmp   r5, #0\n"                                       /* false? */ \
     1754    "beq   4f\n"                 /* if false do not set ints disable */ \
     1755    ARM_DGB_DISABLE_INTS                                                \
     1756    "4:\n"                                                              \
     1757    ARM_HW_BP_LOAD(0)                                                   \
     1758    ARM_HW_BP_LOAD(1)                                                   \
     1759    ARM_HW_BP_LOAD(2)                                                   \
     1760    ARM_HW_BP_LOAD(3)                                                   \
     1761    ARM_HW_BP_LOAD(4)                                                   \
     1762    ARM_HW_BP_LOAD(5)                                                   \
     1763    ARM_HW_BP_LOAD(6)                                                   \
     1764    ARM_HW_BP_LOAD(7)                                                   \
     1765    ARM_HW_BP_LOAD(8)                                                   \
     1766    ARM_HW_BP_LOAD(9)                                                   \
     1767    ARM_HW_BP_LOAD(10)                                                  \
     1768    ARM_HW_BP_LOAD(11)                                                  \
     1769    ARM_HW_BP_LOAD(12)                                                  \
     1770    ARM_HW_BP_LOAD(13)                                                  \
     1771    ARM_HW_BP_LOAD(14)                                                  \
     1772    ARM_HW_BP_LOAD(15)                                                  \
     1773    "5:\n"                                                              \
     1774     ARM_SYNC_INST                                                      \
     1775    :                                                                   \
     1776    : [disints] "X" (debug_disable_ints),  /* make the sym available */ \
     1777      [dbgdscr] "i" (ARM_MMAP_DBGDSCR * sizeof(uint32_t)),              \
     1778      [dbgbcr] "i" (ARM_MMAP_DBGBCR * sizeof(uint32_t)),                \
     1779      [dbgbvr] "i" (ARM_MMAP_DBGBVR * sizeof(uint32_t))                 \
     1780    : "cc", "r0", "r1", "r2", "r3", "r4", "r5", "memory")
    15781781
    15791782#define EXCEPTION_EXIT_EXC()                                            \
    15801783  __asm__ volatile(                                                     \
    1581     ASM_ARM_MODE                                                        \
    1582     "ldr  lr, [sp]\n"                        /* recover the link reg */ \
    1583     "add  sp, #4\n"                                                     \
    15841784    "ldm  sp, {r0-r12}\n"            /* restore the thread's context */ \
    15851785    "add  sp, %[frame_size]\n"                     /* free the frame */ \
    15861786    "subs pc, lr, #0\n"                       /* return from the exc */ \
     1787    ARM_SYNC_INST                                                       \
    15871788    :                                                                   \
    15881789    : [frame_size] "i" (EXCEPTION_FRAME_SIZE)                           \
    1589     : "memory")
     1790    : "cc", "memory")
     1791
     1792#define ARM_PUSH_LR()                                                   \
     1793  __asm__ volatile(                                                     \
     1794    "push {lr}\n"                                                       \
     1795    : : : )
     1796
     1797#define ARM_POP_LR()                                                    \
     1798  __asm__ volatile(                                                     \
     1799    "pop {lr}\n"                                                        \
     1800    : : : )
     1801
     1802/*
     1803 * Entry and exit stacks
     1804 */
     1805#define EXCEPTION_ENTRY(_frame)                   \
     1806  EXCEPTION_ENTRY_EXC();                          \
     1807  EXCEPTION_ENTRY_DEBUGGER();                     \
     1808  EXCEPTION_ENTRY_THREAD(_frame);                 \
     1809  ARM_THUMB_MODE()                                \
     1810  ARM_PUSH_LR()
     1811
     1812#define EXCEPTION_EXIT(_frame)                    \
     1813  ARM_POP_LR();                                   \
     1814  ARM_ARM_MODE();                                 \
     1815  EXCEPTION_EXIT_THREAD(_frame);                  \
     1816  EXCEPTION_EXIT_DEBUGGER();                      \
     1817  EXCEPTION_EXIT_EXC()
    15901818
    15911819/*
     
    15971825{
    15981826  CPU_Exception_frame* frame;
    1599   ARM_SWITCH_REG;
     1827  ARM_SWITCH_REGISTERS;
    16001828  EXCEPTION_ENTRY_EXC();
    16011829  EXCEPTION_ENTRY_THREAD(frame);
     1830  ARM_SWITCH_BACK;
    16021831  longjmp(unlock_abort_jmpbuf, -1);
    16031832}
     
    16091838  CPU_Exception_frame* frame;
    16101839  ARM_SWITCH_REG;
    1611   EXCEPTION_ENTRY_EXC();
    1612   arm_debug_break_unload();
    1613   arm_debug_enable_interrupts();
    1614   EXCEPTION_ENTRY_THREAD(frame);
     1840  EXCEPTION_ENTRY(frame);
    16151841  frame->vector = 1;
    16161842  target_exception(frame);
    1617   EXCEPTION_EXIT_THREAD(frame);
    1618   arm_debug_commit_interrupt_disable();
    1619   arm_debug_break_load();
    1620   EXCEPTION_EXIT_EXC();
     1843  EXCEPTION_EXIT(frame);
    16211844}
    16221845
     
    16321855   * handler to signal a TRAP.
    16331856   */
    1634   EXCEPTION_ENTRY_EXC();
    1635   arm_debug_break_unload();
    1636   arm_debug_enable_interrupts();
    1637   EXCEPTION_ENTRY_THREAD(frame);
     1857  EXCEPTION_ENTRY(frame);
    16381858  frame->vector = 2;
    16391859  target_exception(frame);
    1640   EXCEPTION_EXIT_THREAD(frame);
    1641   arm_debug_commit_interrupt_disable();
    1642   arm_debug_break_load();
    1643   EXCEPTION_EXIT_EXC();
     1860  EXCEPTION_EXIT(frame);
    16441861}
    16451862
     
    16491866  CPU_Exception_frame* frame;
    16501867  ARM_SWITCH_REG;
    1651   EXCEPTION_ENTRY_EXC();
    1652   arm_debug_break_unload();
    1653   arm_debug_enable_interrupts();
    1654   EXCEPTION_ENTRY_THREAD(frame);
     1868  EXCEPTION_ENTRY(frame);
    16551869  frame->vector = 3;
    16561870  target_exception(frame);
    1657   EXCEPTION_EXIT_THREAD(frame);
    1658   arm_debug_commit_interrupt_disable();
    1659   arm_debug_break_load();
    1660   EXCEPTION_EXIT_EXC();
     1871  EXCEPTION_EXIT(frame);
    16611872}
    16621873
     
    16661877  CPU_Exception_frame* frame;
    16671878  ARM_SWITCH_REG;
    1668   EXCEPTION_ENTRY_EXC();
    1669   arm_debug_break_unload();
    1670   arm_debug_enable_interrupts();
    1671   EXCEPTION_ENTRY_THREAD(frame);
     1879  EXCEPTION_ENTRY(frame);
    16721880  frame->vector = 4;
    16731881  target_exception(frame);
    1674   EXCEPTION_EXIT_THREAD(frame);
    1675   arm_debug_commit_interrupt_disable();
    1676   arm_debug_break_load();
    1677   EXCEPTION_EXIT_EXC();
     1882  EXCEPTION_EXIT(frame);
    16781883}
    16791884
     
    17771982{
    17781983  rtems_interrupt_lock_context lock_context;
    1779   debug_session_active = true;
    17801984  arm_debug_break_unload();
    1781   arm_debug_break_clear();
     1985  arm_debug_break_clear_all();
    17821986  rtems_interrupt_lock_acquire(&target_lock, &lock_context);
    17831987  rtems_debugger_target_set_mmu();
    17841988  rtems_debugger_target_set_vectors();
    17851989  rtems_interrupt_lock_release(&target_lock, &lock_context);
     1990  debug_session_active = true;
    17861991  return 0;
    17871992}
     
    17962001#endif
    17972002  arm_debug_break_unload();
    1798   arm_debug_break_clear();
     2003  arm_debug_break_clear_all();
    17992004  rtems_interrupt_lock_acquire(&target_lock, &lock_context);
     2005  debug_disable_ints = 0;
    18002006  debug_session_active = false;
    18012007#if DOES_NOT_WORK
     
    19802186     */
    19812187    CPU_Exception_frame* frame = thread->frame;
    1982     arm_debug_hwbreak*   bp = &hw_breaks[0];
    1983 
    1984     target_printk("[} stepping: %s\n", bp->enabled ? "yes" : "no");
    1985 
    1986     if (!bp->enabled) {
     2188
     2189    target_printk("[} stepping: hbp[0] enabled: %s\n", ARM_HWB_ENALBED(0) ? "yes" : "no");
     2190
     2191    if (!ARM_HWB_ENALBED(0)) {
    19872192      const uint32_t addr = (intptr_t) frame->register_pc;
    19882193      const bool     thumb = (FRAME_SR(frame) & (1 << 5)) != 0 ? true : false;
    1989       uint32_t       bas;
    1990 
    1991       bp->enabled = true;
    1992       bp->loaded = false;
    1993       bp->address = frame->register_pc;
    1994       bp->frame = frame;
    1995       bp->length = sizeof(uint32_t);
    1996 
    1997       if (thumb) {
    1998         uint16_t instr = *((uint16_t*) frame->register_pc);
    1999         switch (instr & 0xf800) {
    2000         case 0xe800:
    2001         case 0xf000:
    2002         case 0xf800:
    2003           break;
    2004         default:
    2005           bp->length = sizeof(uint16_t);
    2006           break;
    2007         }
    2008       }
    2009 
    2010       /*
    2011        * See table C3-2 Effect of byte address selection on Breakpoint
    2012        * generation and "Instruction address comparision programming
    2013        * examples.
    2014        */
    2015       if (thumb) {
    2016         if ((addr & (1 << 1)) == 0) {
    2017           bas = 0x3; /* b0011 */
    2018         }
    2019         else {
    2020           bas = 0xc; /* b1100 */
    2021         }
    2022       }
    2023       else {
    2024         bas = 0xf; /* b1111 */
    2025       }
    2026 
    2027       arm_debug_break_setup(bp,
    2028                             addr & ~0x3,
    2029                             ARM_HW_BP_UNLINKED_INSTR_MISMATCH,
    2030                             bas,
    2031                             ARM_HW_BP_PRIV_PL0_SUP_SYS);
    2032 
     2194      arm_debug_break_exec_enable(0, addr, thumb, true);
    20332195      arm_debug_disable_interrupts();
    20342196    }
     
    20862248rtems_debugger_target_hwbreak_remove(void)
    20872249{
     2250  target_printk("[} hbreak: remove: unload\n");
    20882251  arm_debug_break_unload();
    20892252  return 0;
     
    20962259                                      DB_UINT                          kind)
    20972260{
    2098   /*
    2099    * To do.
    2100    */
     2261  rtems_interrupt_lock_context lock_context;
     2262  int                          i;
     2263  if (wp != rtems_debugger_target_hw_execute) {
     2264    errno = EIO;
     2265    return -1;
     2266  }
     2267  rtems_interrupt_lock_acquire(&target_lock, &lock_context);
     2268  for (i = 1; i < hw_breakpoints; ++i) {
     2269    if (insert && !ARM_HWB_ENALBED(i)) {
     2270      arm_debug_break_exec_enable(i, addr, kind == 1, false);
     2271      break;
     2272    } else if (!insert && ARM_HWB_ENALBED(i) && ARM_HWB_VCR(i) == (addr & ~3)) {
     2273      arm_debug_break_clear(i);
     2274      break;
     2275    }
     2276  }
     2277  rtems_interrupt_lock_release(&target_lock, &lock_context);
     2278  if (!insert && i == hw_breakpoints) {
     2279    errno = EIO;
     2280    return -1;
     2281  }
    21012282  return 0;
    21022283}
     
    21052286rtems_debugger_target_cache_sync(rtems_debugger_target_swbreak* swbreak)
    21062287{
     2288  target_printk("[} cache: sync: %p\n", swbreak->address);
    21072289  /*
    21082290   * Flush the data cache and invalidate the instruction cache.
Note: See TracChangeset for help on using the changeset viewer.