summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2005-06-23 11:38:47 +0000
committercognet <cognet@FreeBSD.org>2005-06-23 11:38:47 +0000
commit215aefc937add7fc664f1452c5a47b63612a5186 (patch)
tree509d41e3f559a1104cd0a561255f1443037d8ae7 /sys/arm
parent39c5af124eeab5652dcbcec8d0288dfc5c89bcfb (diff)
downloadFreeBSD-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.c67
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)
{
OpenPOWER on IntegriCloud