PERFORCE change 52498 for review
Marcel Moolenaar
marcel at FreeBSD.org
Fri May 7 22:25:22 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=52498
Change 52498 by marcel at marcel_nfs on 2004/05/07 22:24:58
First rough implementation for thread support. The global
ddb_regs is copied to the current KDB frame prior to switching
the thread. When a new thread is selected, its trapframe is
copied into ddb_regs. Consequently, the type of ddb_regs has
to be struct trapframe. Except for powerpc, this already is the
case.
While here, remove db_trap.c. It's unused.
Affected files ...
.. //depot/projects/gdb/sys/ddb/db_main.c#5 edit
.. //depot/projects/gdb/sys/ddb/db_thread.c#2 edit
.. //depot/projects/gdb/sys/ddb/db_trap.c#2 delete
Differences ...
==== //depot/projects/gdb/sys/ddb/db_main.c#5 (text+ko) ====
@@ -213,6 +213,7 @@
db_printf("After %d instructions (%d loads, %d stores),\n",
db_inst_count, db_load_count, db_store_count);
}
+ db_printf("[thread 0x%x]\n", kdb_thread->td_tid);
if (bkpt)
db_printf("Breakpoint at\t");
else if (watchpt)
==== //depot/projects/gdb/sys/ddb/db_thread.c#2 (text+ko) ====
@@ -33,31 +33,51 @@
#include <sys/proc.h>
#include <ddb/ddb.h>
+#include <ddb/db_command.h>
+#include <ddb/db_sym.h>
void
-db_set_thread(db_expr_t addr, boolean_t hasaddr, db_expr_t cnt, char *mod)
+db_set_thread(db_expr_t tid, boolean_t hastid, db_expr_t cnt, char *mod)
{
+ struct thread *thr;
+ int err;
- db_printf("Current thread is %d\n", kdb_thread->td_tid);
+ if (hastid) {
+ thr = kdb_thr_lookup(tid);
+ if (thr != NULL) {
+ *kdb_frame = ddb_regs;
+ err= kdb_thr_select(thr);
+ if (err == 0) {
+ db_printf("switching to thread 0x%x\n",
+ thr->td_tid);
+ ddb_regs = *kdb_frame;
+ db_dot = PC_REGS(DDB_REGS);
+ db_print_loc_and_inst(db_dot);
+ } else
+ db_printf("unable to switch to thread 0x%x\n",
+ thr->td_tid);
+ } else
+ db_printf("0x%x: invalid thread\n", (int)tid);
+ } else {
+ db_printf("current thread is 0x%x\n", kdb_thread->td_tid);
+ db_print_loc_and_inst(PC_REGS(DDB_REGS));
+ }
}
void
db_show_threads(db_expr_t addr, boolean_t hasaddr, db_expr_t cnt, char *mod)
{
- struct proc *p;
- struct thread *t;
+ struct thread *thr;
int pager_quit;
db_setup_paging(db_simple_pager, &pager_quit, DB_LINES_PER_PAGE);
- p = LIST_FIRST(&allproc);
pager_quit = 0;
- while (!pager_quit && p != NULL) {
- t = TAILQ_FIRST(&p->p_threads);
- while (!pager_quit && t != NULL) {
- db_printf(" %d (%p)\n", t->td_tid, t);
- t = TAILQ_NEXT(t, td_plist);
- }
- p = LIST_NEXT(p, p_list);
+ thr = kdb_thr_first();
+ while (!pager_quit && thr != NULL) {
+ db_printf(" 0x%x (%p) ", thr->td_tid, thr);
+ db_printsym(PC_REGS(thr->td_last_frame), DB_STGY_PROC);
+ db_printf("\n");
+ thr = kdb_thr_next(thr);
}
}
More information about the p4-projects
mailing list