From owner-p4-projects@FreeBSD.ORG Mon Jul 5 00:59:35 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id CF96116A4D0; Mon, 5 Jul 2004 00:59:34 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A643016A4CE for ; Mon, 5 Jul 2004 00:59:34 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8A61F43D2F for ; Mon, 5 Jul 2004 00:59:34 +0000 (GMT) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.11/8.12.11) with ESMTP id i650xY9B066090 for ; Mon, 5 Jul 2004 00:59:34 GMT (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id i650xYbS066087 for perforce@freebsd.org; Mon, 5 Jul 2004 00:59:34 GMT (envelope-from marcel@freebsd.org) Date: Mon, 5 Jul 2004 00:59:34 GMT Message-Id: <200407050059.i650xYbS066087@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Subject: PERFORCE change 56477 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Jul 2004 00:59:35 -0000 http://perforce.freebsd.org/chv.cgi?CH=56477 Change 56477 by marcel@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