X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Farmv4_5.h;h=3868fa3847b44f3c622c0051bf1719e52522af07;hb=e2b6de3d66bae70cb08fea17f5b66ee875dbb636;hp=36264f3583bcb5c29b4f20bfa6a0da71207352f2;hpb=237e894805dd757cc24029af1b4b1e824c51712b;p=openocd.git diff --git a/src/target/armv4_5.h b/src/target/armv4_5.h index 36264f3583..3868fa3847 100644 --- a/src/target/armv4_5.h +++ b/src/target/armv4_5.h @@ -22,6 +22,7 @@ #include "register.h" #include "target.h" +#include "log.h" typedef enum armv4_5_mode { @@ -35,7 +36,7 @@ typedef enum armv4_5_mode ARMV4_5_MODE_ANY = -1 } armv4_5_mode_t; -extern char* armv4_5_mode_strings[]; +extern char** armv4_5_mode_strings; typedef enum armv4_5_state { @@ -95,10 +96,46 @@ typedef struct armv4_5_core_reg_s } armv4_5_core_reg_t; extern reg_cache_t* armv4_5_build_reg_cache(target_t *target, armv4_5_common_t *armv4_5_common); -extern enum armv4_5_mode armv4_5_number_to_mode(int number); -extern int armv4_5_mode_to_number(enum armv4_5_mode mode); -extern int armv4_5_arch_state(struct target_s *target, char *buf, int buf_size); +/* map psr mode bits to linear number */ +static __inline int armv4_5_mode_to_number(enum armv4_5_mode mode) +{ + switch (mode) + { + case ARMV4_5_MODE_USR: return 0; break; + case ARMV4_5_MODE_FIQ: return 1; break; + case ARMV4_5_MODE_IRQ: return 2; break; + case ARMV4_5_MODE_SVC: return 3; break; + case ARMV4_5_MODE_ABT: return 4; break; + case ARMV4_5_MODE_UND: return 5; break; + case ARMV4_5_MODE_SYS: return 6; break; + case ARMV4_5_MODE_ANY: return 0; break; /* map MODE_ANY to user mode */ + default: + LOG_ERROR("invalid mode value encountered"); + return -1; + } +} + +/* map linear number to mode bits */ +static __inline enum armv4_5_mode armv4_5_number_to_mode(int number) +{ + switch(number) + { + case 0: return ARMV4_5_MODE_USR; break; + case 1: return ARMV4_5_MODE_FIQ; break; + case 2: return ARMV4_5_MODE_IRQ; break; + case 3: return ARMV4_5_MODE_SVC; break; + case 4: return ARMV4_5_MODE_ABT; break; + case 5: return ARMV4_5_MODE_UND; break; + case 6: return ARMV4_5_MODE_SYS; break; + default: + LOG_ERROR("mode index out of bounds"); + return -1; + } +}; + + +extern int armv4_5_arch_state(struct target_s *target); extern int armv4_5_get_gdb_reg_list(target_t *target, reg_t **reg_list[], int *reg_list_size); extern int armv4_5_invalidate_core_regs(target_t *target);