Changeset e629076 in rtems for cpukit/libdebugger


Ignore:
Timestamp:
Nov 29, 2016, 10:19:05 PM (3 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
aadd318
Parents:
de7b174e
git-author:
Chris Johns <chrisj@…> (11/29/16 22:19:05)
git-committer:
Chris Johns <chrisj@…> (12/02/16 04:39:56)
Message:

libdebugger: Build for ARM's without a CP15.

File:
1 edited

Legend:

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

    rde7b174e re629076  
    3737#include <rtems/score/threadimpl.h>
    3838
    39 #include <libcpu/arm-cp15.h>
    4039#include <bsp/linker-symbols.h>
    4140
     
    4544#if TARGET_DEBUG
    4645#include <rtems/bspIo.h>
     46#endif
     47
     48/*
     49 * ARM Variant controls.
     50 */
     51#if defined(__ARM_ARCH_7A__) || \
     52    defined(__ARM_ARCH_7R__)
     53  #define ARM_CP15 1
     54#endif
     55
     56#if (defined(__ARM_ARCH_7M__) || \
     57     defined(__ARM_ARCH_7EM__))
     58  #define ARM_THUMB_ONLY 1
     59#else
     60  #define ARM_THUMB_ONLY 0
     61#endif
     62
     63#if defined(ARM_MULTILIB_ARCH_V4)
     64 #define ARM_PSR_HAS_INT_MASK 1
     65 #define ARM_PSR_HAS_THUMB    1
     66#else
     67 #define ARM_PSR_HAS_INT_MASK 0
     68 #define ARM_PSR_HAS_THUMB    0
     69#endif
     70
     71#if ARM_CP15
     72#include <libcpu/arm-cp15.h>
     73#endif
     74
     75/**
     76 * If thumb build of code switch the asm to thumb as required.
     77 *
     78 * If the variant only supports thumb insturctions disable the support.
     79 */
     80#define ARM_SWITCH_REG     uint32_t arm_switch_reg
     81#define ARM_SWITCH_REG_ASM [arm_switch_reg] "=&r" (arm_switch_reg)
     82#if !ARM_THUMB_ONLY && defined(__thumb__)
     83  #define ASM_ARM_MODE   ".align 2\nbx pc\n.arm\n"
     84  #define ASM_THUMB_MODE "add %[arm_switch_reg], pc, #1\nbx %[arm_switch_reg]\n.thumb\n"
     85#else
     86  #define ASM_ARM_MODE
     87  #define ASM_THUMB_MODE
     88#endif
     89
     90/*
     91 * Hack to work around ARMv7-M not having a the T and I bits in the PSR.
     92 *
     93 * This needs to be fixed when real support for this ARM variant is added.
     94 */
     95#if !defined(ARM_PSR_I)
     96  #define ARM_PSR_I 0
     97#endif
     98#if !defined(ARM_PSR_T)
     99  #define ARM_PSR_T 0
    47100#endif
    48101
     
    113166 static const uint8_t breakpoint[2] = { 0x55, 0xbe };
    114167#else
    115  static const uint8_t breakpoint[4] = { 0x75, 0xe0a, 0x20, 0xe1 };
     168 static const uint8_t breakpoint[4] = { 0x75, 0xe0, 0x20, 0xe1 };
    116169#endif
    117170
     
    120173 */
    121174RTEMS_INTERRUPT_LOCK_DEFINE(static, target_lock, "target_lock")
    122 
    123 /**
    124  * The init value for the text section.
    125  */
    126 static uint32_t text_section_flags;
    127175
    128176/**
     
    226274#define ARM_CP14_WRITE(_val, _CRn, _CRm, _opc2)            \
    227275  do {                                                     \
    228     ARM_SWITCH_REGISTERS;                                  \
     276    ARM_SWITCH_REG;                                        \
    229277    asm volatile(                                          \
    230       ARM_SWITCH_TO_ARM                                    \
     278      ASM_ARM_MODE                                         \
    231279      ARM_CP14_INSTR(mcr, val, _CRn, _CRm, _opc2)          \
    232       ARM_SWITCH_BACK                                      \
    233       :  ARM_SWITCH_OUTPUT : [val] "r" (_val));            \
     280      ASM_THUMB_MODE                                       \
     281      : ARM_SWITCH_REG_ASM                                 \
     282      : [val] "r" (_val));                                 \
    234283  } while (0)
    235284
    236285#define ARM_CP14_READ(_val, _CRn, _CRm, _opc2)             \
    237286  do {                                                     \
    238     ARM_SWITCH_REGISTERS;                                  \
     287    ARM_SWITCH_REG;                                        \
    239288    asm volatile(                                          \
    240       ARM_SWITCH_TO_ARM                                    \
     289      ASM_ARM_MODE                                         \
    241290      ARM_CP14_INSTR(mrc, val, _CRn, _CRm, _opc2)          \
    242       ARM_SWITCH_BACK                                      \
    243       : [val] "=&r" (_val) ARM_SWITCH_ADDITIONAL_OUTPUT);  \
     291      ASM_THUMB_MODE                                       \
     292      : ARM_SWITCH_REG_ASM,                                \
     293        [val] "=&r" (_val));                               \
    244294  } while (0)
    245295
     
    558608
    559609/**
    560  * If thumb build of code switch the asm to thumb as required.
    561  */
    562 #ifdef __thumb__
    563   #define ASM_ARM_MODE   ".align 2\nbx pc\n.arm\n"
    564   #define ASM_THUMB_MODE "add %[arm_switch_reg], pc, #1\nbx %[arm_switch_reg]\n.thumb\n"
    565   #define ARM_SWITCH_REG uint32_t arm_switch_reg
    566 #else
    567   #define ASM_ARM_MODE
    568   #define ASM_THUMB_MODE
    569   #define ARM_SWITCH_REG
    570 #endif
    571 
    572 /**
    573610 * Exception stack frame size.
    574611 *
     
    608645    "str  lr, [sp]\n"                           /* save the link reg */ \
    609646    ASM_THUMB_MODE                                                      \
    610     : [arm_switch_reg] "=&r" (arm_switch_reg)                           \
     647    : ARM_SWITCH_REG_ASM                                                \
    611648    : [frame_size] "i" (EXCEPTION_FRAME_SIZE)                           \
    612649    : "memory")
     
    683720    "msr  cpsr, r1\n"                        /* restore the irq mask */ \
    684721    ASM_THUMB_MODE                                                      \
    685     : [arm_switch_reg] "=&r" (arm_switch_reg),                          \
     722    : ARM_SWITCH_REG_ASM,                                               \
    686723      [o_frame] "=r" (_frame)                                           \
    687724    : [psr_t] "i" (ARM_PSR_T),                                          \
     
    756793    "str  lr, [sp]\n"                           /* save the link reg */ \
    757794    ASM_THUMB_MODE                                                      \
    758     : [arm_switch_reg] "=&r" (arm_switch_reg)                           \
     795    : ARM_SWITCH_REG_ASM                                                \
    759796    : [psr_i] "i" (ARM_PSR_I),                                          \
    760797      [r0_r12_size] "i" (13 * sizeof(uint32_t)),                        \
     
    822859  arm_debug_break_unload();
    823860  EXCEPTION_ENTRY_THREAD(frame);
     861#if ARM_CP15
    824862  if ((arm_cp15_get_instruction_fault_status() & 0x1f) == 0x02)
    825863    frame->vector = 2;
    826864  else
    827865    frame->vector = 3;
     866#else
     867  frame->vector = 3;
     868#endif
    828869  target_exception(frame);
    829870  EXCEPTION_EXIT_THREAD(frame);
     
    847888}
    848889
    849 int
    850 rtems_debugger_target_enable(void)
    851 {
    852   rtems_interrupt_lock_context lock_context;
    853   void*                        text_begin;
    854   void*                        text_end;
    855   debug_session_active = true;
     890#if ARM_CP15
     891/**
     892 * The init value for the text section.
     893 */
     894static uint32_t text_section_flags;
     895
     896static void
     897rtems_debugger_target_set_vectors(void)
     898{
     899  void* text_begin;
     900  void* text_end;
    856901  text_begin = &bsp_section_text_begin[0];
    857902  text_end = &bsp_section_text_end[0];
    858   rtems_interrupt_lock_acquire(&target_lock, &lock_context);
    859   arm_debug_break_unload();
    860   arm_debug_break_clear();
    861903  text_section_flags =
    862904    arm_cp15_set_translation_table_entries(text_begin,
     
    871913  arm_cp15_set_exception_handler(ARM_EXCEPTION_DATA_ABORT,
    872914                                 target_exception_data_abort);
     915}
     916#else
     917static void
     918rtems_debugger_target_set_vectors(void)
     919{
     920  /*
     921   * Dummy, please add support for your ARM variant.
     922   */
     923  void* ui = target_exception_undefined_instruction;
     924  void* sc = target_exception_supervisor_call;
     925  void* pa = target_exception_prefetch_abort;
     926  void* da = target_exception_data_abort;
     927  (void) ui;
     928  (void) sc;
     929  (void) pa;
     930  (void) da;
     931}
     932#endif
     933
     934int
     935rtems_debugger_target_enable(void)
     936{
     937  rtems_interrupt_lock_context lock_context;
     938  debug_session_active = true;
     939  rtems_interrupt_lock_acquire(&target_lock, &lock_context);
     940  arm_debug_break_unload();
     941  arm_debug_break_clear();
     942  rtems_debugger_target_set_vectors();
    873943  rtems_interrupt_lock_release(&target_lock, &lock_context);
    874944  return 0;
     
    11221192         * Save the interrupt state before stepping if set.
    11231193         */
     1194#if ARM_PSR_HAS_INT_MASK
    11241195        if ((FRAME_SR & CPSR_INTS_MASK) != 0) {
    11251196          uint32_t int_state;
     
    11321203         */
    11331204        FRAME_SR |= CPSR_INTS_MASK;
     1205#endif
    11341206        break;
    11351207      }
     
    11431215{
    11441216  int sig = RTEMS_DEBUGGER_SIGNAL_HUP;
     1217#if defined(ARM_EXCEPTION_RESET)
    11451218  switch (frame->vector) {
    11461219  case ARM_EXCEPTION_RESET:
     
    11651238    break;
    11661239  }
     1240#endif
    11671241  return sig;
    11681242}
Note: See TracChangeset for help on using the changeset viewer.