PERFORCE change 56477 for review
Marcel Moolenaar
marcel at FreeBSD.org
Sun Jul 4 17:59:35 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=56477
Change 56477 by marcel at marcel_sledge on 2004/07/05 00:59:13
Update to PCB-based context.
Affected files ...
.. //depot/projects/gdb/sys/amd64/amd64/db_trace.c#4 edit
Differences ...
==== //depot/projects/gdb/sys/amd64/amd64/db_trace.c#4 (text+ko) ====
@@ -55,54 +55,49 @@
static db_varfcn_t db_dr5;
static db_varfcn_t db_dr6;
static db_varfcn_t db_dr7;
+static db_varfcn_t db_frame;
+static db_varfcn_t db_rsp;
static db_varfcn_t db_ss;
-static db_varfcn_t db_rsp;
-
-static __inline long
-get_rsp(struct trapframe *tf)
-{
- return ((ISPL(tf->tf_cs)) ? tf->tf_rsp :
- (db_expr_t)tf + offsetof(struct trapframe, tf_rsp));
-}
/*
* Machine register set.
*/
+#define DB_OFFSET(x) (db_expr_t *)offsetof(struct trapframe, x)
struct db_variable db_regs[] = {
- { "cs", &ddb_regs.tf_cs, FCN_NULL },
+ { "cs", DB_OFFSET(tf_cs), db_frame },
#if 0
- { "ds", &ddb_regs.tf_ds, FCN_NULL },
- { "es", &ddb_regs.tf_es, FCN_NULL },
- { "fs", &ddb_regs.tf_fs, FCN_NULL },
- { "gs", &ddb_regs.tf_gs, FCN_NULL },
+ { "ds", DB_OFFSET(tf_ds), db_frame },
+ { "es", DB_OFFSET(tf_es), db_frame },
+ { "fs", DB_OFFSET(tf_fs), db_frame },
+ { "gs", DB_OFFSET(tf_gs), db_frame },
#endif
- { "ss", NULL, db_ss },
- { "rax", &ddb_regs.tf_rax, FCN_NULL },
- { "rcx", &ddb_regs.tf_rcx, FCN_NULL },
- { "rdx", &ddb_regs.tf_rdx, FCN_NULL },
- { "rbx", &ddb_regs.tf_rbx, FCN_NULL },
- { "rsp", NULL, db_rsp },
- { "rbp", &ddb_regs.tf_rbp, FCN_NULL },
- { "rsi", &ddb_regs.tf_rsi, FCN_NULL },
- { "rdi", &ddb_regs.tf_rdi, FCN_NULL },
- { "r8", &ddb_regs.tf_r8, FCN_NULL },
- { "r9", &ddb_regs.tf_r9, FCN_NULL },
- { "r10", &ddb_regs.tf_r10, FCN_NULL },
- { "r11", &ddb_regs.tf_r11, FCN_NULL },
- { "r12", &ddb_regs.tf_r12, FCN_NULL },
- { "r13", &ddb_regs.tf_r13, FCN_NULL },
- { "r14", &ddb_regs.tf_r14, FCN_NULL },
- { "r15", &ddb_regs.tf_r15, FCN_NULL },
- { "rip", &ddb_regs.tf_rip, FCN_NULL },
- { "rflags", &ddb_regs.tf_rflags, FCN_NULL },
- { "dr0", NULL, db_dr0 },
- { "dr1", NULL, db_dr1 },
- { "dr2", NULL, db_dr2 },
- { "dr3", NULL, db_dr3 },
- { "dr4", NULL, db_dr4 },
- { "dr5", NULL, db_dr5 },
- { "dr6", NULL, db_dr6 },
- { "dr7", NULL, db_dr7 },
+ { "ss", NULL, db_ss },
+ { "rax", DB_OFFSET(tf_rax), db_frame },
+ { "rcx", DB_OFFSET(tf_rcx), db_frame },
+ { "rdx", DB_OFFSET(tf_rdx), db_frame },
+ { "rbx", DB_OFFSET(tf_rbx), db_frame },
+ { "rsp", NULL, db_rsp },
+ { "rbp", DB_OFFSET(tf_rbp), db_frame },
+ { "rsi", DB_OFFSET(tf_rsi), db_frame },
+ { "rdi", DB_OFFSET(tf_rdi), 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 },
+ { "r13", DB_OFFSET(tf_r13), db_frame },
+ { "r14", DB_OFFSET(tf_r14), db_frame },
+ { "r15", DB_OFFSET(tf_r15), db_frame },
+ { "rip", DB_OFFSET(tf_rip), db_frame },
+ { "rflags", DB_OFFSET(tf_rflags), db_frame },
+ { "dr0", NULL, db_dr0 },
+ { "dr1", NULL, db_dr1 },
+ { "dr2", NULL, db_dr2 },
+ { "dr3", NULL, db_dr3 },
+ { "dr4", NULL, db_dr4 },
+ { "dr5", NULL, db_dr5 },
+ { "dr6", NULL, db_dr6 },
+ { "dr7", NULL, db_dr7 },
};
struct db_variable *db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]);
@@ -117,7 +112,7 @@
*valuep = r ## reg (); \
else \
load_ ## reg (*valuep); \
- return (0); \
+ return (1); \
}
DB_DRX_FUNC(dr0)
@@ -129,24 +124,55 @@
DB_DRX_FUNC(dr6)
DB_DRX_FUNC(dr7)
+static __inline long
+get_rsp(struct trapframe *tf)
+{
+ return ((ISPL(tf->tf_cs)) ? tf->tf_rsp :
+ (db_expr_t)tf + offsetof(struct trapframe, tf_rsp));
+}
+
static int
-db_rsp (struct db_variable *vp, db_expr_t *valuep, int op)
+db_frame(struct db_variable *vp, db_expr_t *valuep, int op)
+{
+ long *reg;
+
+ if (kdb_frame == NULL)
+ return (0);
+
+ reg = (long *)((uintptr_t)kdb_frame + (db_expr_t)vp->valuep);
+ if (op == DB_VAR_GET)
+ *valuep = *reg;
+ else
+ *reg = *valuep;
+ return (1);
+}
+
+static int
+db_rsp(struct db_variable *vp, db_expr_t *valuep, int op)
{
+
+ if (kdb_frame == NULL)
+ return (0);
+
if (op == DB_VAR_GET)
*valuep = get_rsp(kdb_frame);
- else if (ISPL(ddb_regs.tf_cs))
- ddb_regs.tf_rsp = *valuep;
- return (0);
+ else if (ISPL(kdb_frame->tf_cs))
+ kdb_frame->tf_rsp = *valuep;
+ return (1);
}
static int
-db_ss (struct db_variable *vp, db_expr_t *valuep, int op)
+db_ss(struct db_variable *vp, db_expr_t *valuep, int op)
{
+
+ if (kdb_frame == NULL)
+ return (0);
+
if (op == DB_VAR_GET)
- *valuep = (ISPL(ddb_regs.tf_cs)) ? ddb_regs.tf_ss : rss();
- else if (ISPL(ddb_regs.tf_cs))
- ddb_regs.tf_ss = *valuep;
- return (0);
+ *valuep = (ISPL(kdb_frame->tf_cs)) ? kdb_frame->tf_ss : rss();
+ else if (ISPL(kdb_frame->tf_cs))
+ kdb_frame->tf_ss = *valuep;
+ return (1);
}
/*
@@ -178,7 +204,6 @@
int db_md_clr_watchpoint(db_expr_t addr, db_expr_t size);
void db_md_list_watchpoints(void);
-
/*
* Figure out how many arguments were passed into the frame at "fp".
*/
@@ -441,7 +466,6 @@
db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count,
char *modif)
{
- struct trapframe *tf;
struct thread *td;
td = (have_addr) ? kdb_thr_lookup(addr) : kdb_thread;
@@ -449,9 +473,7 @@
db_printf("Thread %ld not found\n", addr);
return;
}
- tf = td->td_last_frame;
- db_backtrace(td, tf, (struct amd64_frame *)tf->tf_rbp,
- (db_addr_t)tf->tf_rip, count);
+ db_trace_thread(td, count);
}
void
@@ -471,11 +493,11 @@
int
db_trace_thread(struct thread *thr, int count)
{
- struct trapframe *tf;
+ struct pcb *ctx;
- tf = thr->td_last_frame;
- return (db_backtrace(thr, tf, (struct amd64_frame *)tf->tf_rbp,
- (db_addr_t)tf->tf_rip, count));
+ ctx = kdb_thr_ctx(thr);
+ return (db_backtrace(thr, NULL, (struct amd64_frame *)ctx->pcb_rbp,
+ ctx->pcb_rip, count));
}
int
More information about the p4-projects
mailing list