ARM: move mode functions out of header

They're really too big to inline, at least for code that's
not in any performance-critical loops.

Also move the associated string table to the rodata section.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
This commit is contained in:
David Brownell 2009-11-16 15:27:36 -08:00
parent a7c04a0e49
commit 2fb58116a5
2 changed files with 56 additions and 40 deletions

View File

@ -53,13 +53,63 @@ char* armv4_5_core_reg_list[] =
"cpsr", "spsr_fiq", "spsr_irq", "spsr_svc", "spsr_abt", "spsr_und"
};
char * armv4_5_mode_strings_list[] =
static const char *armv4_5_mode_strings_list[] =
{
"Illegal mode value", "User", "FIQ", "IRQ", "Supervisor", "Abort", "Undefined", "System"
};
/* Hack! Yuk! allow -1 index, which simplifies codepaths elsewhere in the code */
char** armv4_5_mode_strings = armv4_5_mode_strings_list + 1;
const char **armv4_5_mode_strings = armv4_5_mode_strings_list + 1;
/** Map PSR mode bits to linear number */
int armv4_5_mode_to_number(enum armv4_5_mode mode)
{
switch (mode) {
case ARMV4_5_MODE_ANY:
/* map MODE_ANY to user mode */
case ARMV4_5_MODE_USR:
return 0;
case ARMV4_5_MODE_FIQ:
return 1;
case ARMV4_5_MODE_IRQ:
return 2;
case ARMV4_5_MODE_SVC:
return 3;
case ARMV4_5_MODE_ABT:
return 4;
case ARMV4_5_MODE_UND:
return 5;
case ARMV4_5_MODE_SYS:
return 6;
default:
LOG_ERROR("invalid mode value encountered %d", mode);
return -1;
}
}
/** Map linear number to PSR mode bits. */
enum armv4_5_mode armv4_5_number_to_mode(int number)
{
switch (number) {
case 0:
return ARMV4_5_MODE_USR;
case 1:
return ARMV4_5_MODE_FIQ;
case 2:
return ARMV4_5_MODE_IRQ;
case 3:
return ARMV4_5_MODE_SVC;
case 4:
return ARMV4_5_MODE_ABT;
case 5:
return ARMV4_5_MODE_UND;
case 6:
return ARMV4_5_MODE_SYS;
default:
LOG_ERROR("mode index out of bounds %d", number);
return ARMV4_5_MODE_ANY;
}
}
char* armv4_5_state_strings[] =
{

View File

@ -41,7 +41,10 @@ typedef enum armv4_5_mode
ARMV4_5_MODE_ANY = -1
} armv4_5_mode_t;
extern char** armv4_5_mode_strings;
int armv4_5_mode_to_number(enum armv4_5_mode mode);
enum armv4_5_mode armv4_5_number_to_mode(int number);
extern const char **armv4_5_mode_strings;
typedef enum armv4_5_state
{
@ -136,43 +139,6 @@ struct armv4_5_core_reg
struct reg_cache* armv4_5_build_reg_cache(struct target *target,
struct arm *armv4_5_common);
/* 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 %d", mode);
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 %d", number);
return ARMV4_5_MODE_ANY;
}
};
int armv4_5_arch_state(struct target *target);
int armv4_5_get_gdb_reg_list(struct target *target,
struct reg **reg_list[], int *reg_list_size);