diff options
author | cognet <cognet@FreeBSD.org> | 2005-06-23 11:38:47 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2005-06-23 11:38:47 +0000 |
commit | 215aefc937add7fc664f1452c5a47b63612a5186 (patch) | |
tree | 509d41e3f559a1104cd0a561255f1443037d8ae7 /sys/arm | |
parent | 39c5af124eeab5652dcbcec8d0288dfc5c89bcfb (diff) | |
download | FreeBSD-src-215aefc937add7fc664f1452c5a47b63612a5186.zip FreeBSD-src-215aefc937add7fc664f1452c5a47b63612a5186.tar.gz |
Implement db_frame() and use it to obtain the registers value.
Approved by: re (blanket)
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/arm/db_interface.c | 67 |
1 files changed, 45 insertions, 22 deletions
diff --git a/sys/arm/arm/db_interface.c b/sys/arm/arm/db_interface.c index 2788ca2..cb3c968 100644 --- a/sys/arm/arm/db_interface.c +++ b/sys/arm/arm/db_interface.c @@ -71,27 +71,29 @@ int db_access_und_sp (struct db_variable *, db_expr_t *, int); int db_access_abt_sp (struct db_variable *, db_expr_t *, int); int db_access_irq_sp (struct db_variable *, db_expr_t *, int); +static db_varfcn_t db_frame; + #define DB_OFFSET(x) (db_expr_t *)offsetof(struct trapframe, x) struct db_variable db_regs[] = { - { "spsr", DB_OFFSET(tf_spsr), FCN_NULL, }, - { "r0", DB_OFFSET(tf_r0), FCN_NULL, }, - { "r1", DB_OFFSET(tf_r1), FCN_NULL, }, - { "r2", DB_OFFSET(tf_r2), FCN_NULL, }, - { "r3", DB_OFFSET(tf_r3), FCN_NULL, }, - { "r4", DB_OFFSET(tf_r4), FCN_NULL, }, - { "r5", DB_OFFSET(tf_r5), FCN_NULL, }, - { "r6", DB_OFFSET(tf_r6), FCN_NULL, }, - { "r7", DB_OFFSET(tf_r7), FCN_NULL, }, - { "r8", DB_OFFSET(tf_r8), FCN_NULL, }, - { "r9", DB_OFFSET(tf_r9), FCN_NULL, }, - { "r10", DB_OFFSET(tf_r10), FCN_NULL, }, - { "r11", DB_OFFSET(tf_r11), FCN_NULL, }, - { "r12", DB_OFFSET(tf_r12), FCN_NULL, }, - { "usr_sp", DB_OFFSET(tf_usr_sp), FCN_NULL, }, - { "usr_lr", DB_OFFSET(tf_usr_lr), FCN_NULL, }, - { "svc_sp", DB_OFFSET(tf_svc_sp), FCN_NULL, }, - { "svc_lr", DB_OFFSET(tf_svc_lr), FCN_NULL, }, - { "pc", DB_OFFSET(tf_pc), FCN_NULL, }, + { "spsr", DB_OFFSET(tf_spsr), db_frame }, + { "r0", DB_OFFSET(tf_r0), db_frame }, + { "r1", DB_OFFSET(tf_r1), db_frame }, + { "r2", DB_OFFSET(tf_r2), db_frame }, + { "r3", DB_OFFSET(tf_r3), db_frame }, + { "r4", DB_OFFSET(tf_r4), db_frame }, + { "r5", DB_OFFSET(tf_r5), db_frame }, + { "r6", DB_OFFSET(tf_r6), db_frame }, + { "r7", DB_OFFSET(tf_r7), db_frame }, + { "r8", DB_OFFSET(tf_r8), db_frame }, + { "r9", DB_OFFSET(tf_r9), db_frame }, + { "r10", DB_OFFSET(tf_r10), db_frame }, + { "r11", DB_OFFSET(tf_r11), db_frame }, + { "r12", DB_OFFSET(tf_r12), db_frame }, + { "usr_sp", DB_OFFSET(tf_usr_sp), db_frame }, + { "usr_lr", DB_OFFSET(tf_usr_lr), db_frame }, + { "svc_sp", DB_OFFSET(tf_svc_sp), db_frame }, + { "svc_lr", DB_OFFSET(tf_svc_lr), db_frame }, + { "pc", DB_OFFSET(tf_pc), db_frame }, { "und_sp", &nil, db_access_und_sp, }, { "abt_sp", &nil, db_access_abt_sp, }, { "irq_sp", &nil, db_access_irq_sp, }, @@ -103,8 +105,10 @@ int db_access_und_sp(struct db_variable *vp, db_expr_t *valp, int rw) { - if (rw == DB_VAR_GET) + if (rw == DB_VAR_GET) { *valp = get_stackptr(PSR_UND32_MODE); + return (1); + } return(0); } @@ -112,8 +116,10 @@ int db_access_abt_sp(struct db_variable *vp, db_expr_t *valp, int rw) { - if (rw == DB_VAR_GET) + if (rw == DB_VAR_GET) { *valp = get_stackptr(PSR_ABT32_MODE); + return (1); + } return(0); } @@ -121,11 +127,28 @@ int db_access_irq_sp(struct db_variable *vp, db_expr_t *valp, int rw) { - if (rw == DB_VAR_GET) + if (rw == DB_VAR_GET) { *valp = get_stackptr(PSR_IRQ32_MODE); + return (1); + } return(0); } +int db_frame(struct db_variable *vp, db_expr_t *valp, int rw) +{ + int *reg; + + if (kdb_frame == NULL) + return (0); + + reg = (int *)((uintptr_t)kdb_frame + (db_expr_t)vp->valuep); + if (rw == DB_VAR_GET) + *valp = *reg; + else + *reg = *valp; + return(1); +} + void db_show_mdpcpu(struct pcpu *pc) { |