Date: Thu, 29 May 2003 15:35:39 -0700 (PDT) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 32063 for review Message-ID: <200305292235.h4TMZdXs067768@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=32063 Change 32063 by peter@peter_hammer on 2003/05/29 15:35:17 Make this compile. No way is it usable yet, especially since there is no setjmp/longjmp yet. The stack trace stuff needs to be updated too, even with -fno-omit-frame-pointer, because it has the 32 bit prologue instructions compiled in. And so on. Affected files ... .. //depot/projects/hammer/sys/amd64/amd64/db_interface.c#4 edit .. //depot/projects/hammer/sys/amd64/amd64/db_trace.c#3 edit Differences ... ==== //depot/projects/hammer/sys/amd64/amd64/db_interface.c#4 (text+ko) ==== @@ -74,7 +74,7 @@ int kdb_trap(int type, int code, struct amd64_saved_state *regs) { - u_int ef; + u_long ef; volatile int ddb_mode = !(boothowto & RB_GDB); /* @@ -94,7 +94,7 @@ return (0); } - ef = read_eflags(); + ef = read_rflags(); disable_intr(); switch (type) { @@ -172,12 +172,16 @@ regs->tf_rbp = ddb_regs.tf_rbp; regs->tf_rsi = ddb_regs.tf_rsi; regs->tf_rdi = ddb_regs.tf_rdi; +#if 0 regs->tf_es = ddb_regs.tf_es & 0xffff; regs->tf_fs = ddb_regs.tf_fs & 0xffff; +#endif regs->tf_cs = ddb_regs.tf_cs & 0xffff; +#if 0 regs->tf_ds = ddb_regs.tf_ds & 0xffff; +#endif - write_eflags(ef); + write_rflags(ef); return (1); } @@ -231,8 +235,8 @@ *ptep1 |= PG_RW; } } else { - addr1 = trunc_4mpage(addr + size - 1); - if (trunc_4mpage(addr) != addr1) { + addr1 = trunc_2mpage(addr + size - 1); + if (trunc_2mpage(addr) != addr1) { ptep1 = pmap_pte_quick(kernel_pmap, addr1); oldmap1 = *ptep1; *ptep1 |= PG_RW; @@ -289,5 +293,7 @@ db_show_mdpcpu(struct pcpu *pc) { +#if 0 db_printf("currentldt = 0x%x\n", pc->pc_currentldt); +#endif } ==== //depot/projects/hammer/sys/amd64/amd64/db_trace.c#3 (text+ko) ==== @@ -45,6 +45,7 @@ #include <ddb/db_sym.h> #include <ddb/db_variables.h> +#if 0 db_varfcn_t db_dr0; db_varfcn_t db_dr1; db_varfcn_t db_dr2; @@ -53,29 +54,31 @@ db_varfcn_t db_dr5; db_varfcn_t db_dr6; db_varfcn_t db_dr7; +#endif /* * Machine register set. */ struct db_variable db_regs[] = { { "cs", &ddb_regs.tf_cs, FCN_NULL }, +#if 0 { "ds", &ddb_regs.tf_ds, FCN_NULL }, { "es", &ddb_regs.tf_es, FCN_NULL }, { "fs", &ddb_regs.tf_fs, FCN_NULL }, -#if 0 { "gs", &ddb_regs.tf_gs, FCN_NULL }, #endif { "ss", &ddb_regs.tf_ss, FCN_NULL }, - { "eax", &ddb_regs.tf_rax, FCN_NULL }, - { "ecx", &ddb_regs.tf_rcx, FCN_NULL }, - { "edx", &ddb_regs.tf_rdx, FCN_NULL }, - { "ebx", &ddb_regs.tf_rbx, FCN_NULL }, - { "esp", &ddb_regs.tf_rsp, FCN_NULL }, - { "ebp", &ddb_regs.tf_rbp, FCN_NULL }, - { "esi", &ddb_regs.tf_rsi, FCN_NULL }, - { "edi", &ddb_regs.tf_rdi, FCN_NULL }, - { "eip", &ddb_regs.tf_rip, FCN_NULL }, - { "efl", &ddb_regs.tf_rflags, FCN_NULL }, + { "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", &ddb_regs.tf_rsp, FCN_NULL }, + { "rbp", &ddb_regs.tf_rbp, FCN_NULL }, + { "rsi", &ddb_regs.tf_rsi, FCN_NULL }, + { "rdi", &ddb_regs.tf_rdi, FCN_NULL }, + { "rip", &ddb_regs.tf_rip, FCN_NULL }, + { "rfl", &ddb_regs.tf_rflags, FCN_NULL }, +#if 0 { "dr0", NULL, db_dr0 }, { "dr1", NULL, db_dr1 }, { "dr2", NULL, db_dr2 }, @@ -84,6 +87,7 @@ { "dr5", NULL, db_dr5 }, { "dr6", NULL, db_dr6 }, { "dr7", NULL, db_dr7 }, +#endif }; struct db_variable *db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]); @@ -95,7 +99,7 @@ struct amd64_frame { struct amd64_frame *f_frame; int f_retaddr; - int f_arg0; + long f_arg0; }; #define NORMAL 0 @@ -105,12 +109,13 @@ static void db_nextframe(struct amd64_frame **, db_addr_t *, struct proc *); static int db_numargs(struct amd64_frame *); -static void db_print_stack_entry(const char *, int, char **, int *, db_addr_t); +static void db_print_stack_entry(const char *, int, char **, long *, db_addr_t); static void decode_syscall(int, struct proc *); static void db_trace_one_stack(int count, boolean_t have_addr, struct proc *p, struct amd64_frame *frame, db_addr_t callpc); +#if 0 static char * watchtype_str(int type); int amd64_set_watch(int watchnum, unsigned int watchaddr, int size, int access, struct dbreg * d); @@ -118,6 +123,7 @@ int db_md_set_watchpoint(db_expr_t addr, db_expr_t size); int db_md_clr_watchpoint(db_expr_t addr, db_expr_t size); void db_md_list_watchpoints(void); +#endif /* @@ -127,20 +133,20 @@ db_numargs(fp) struct amd64_frame *fp; { - int *argp; + long *argp; int inst; int args; - argp = (int *)db_get_value((int)&fp->f_retaddr, 4, FALSE); + argp = (long *)db_get_value((long)&fp->f_retaddr, 4, FALSE); /* * XXX etext is wrong for LKMs. We should attempt to interpret * the instruction at the return address in all cases. This * may require better fault handling. */ - if (argp < (int *)btext || argp >= (int *)etext) { + if (argp < (long *)btext || argp >= (long *)etext) { args = 5; } else { - inst = db_get_value((int)argp, 4, FALSE); + inst = db_get_value((long)argp, 4, FALSE); if ((inst & 0xff) == 0x59) /* popl %ecx */ args = 1; else if ((inst & 0xffff) == 0xc483) /* addl $Ibs, %esp */ @@ -156,14 +162,14 @@ const char *name; int narg; char **argnp; - int *argp; + long *argp; db_addr_t callpc; { db_printf("%s(", name); while (narg) { if (argnp) db_printf("%s=", *argnp++); - db_printf("%r", db_get_value((int)argp, 4, FALSE)); + db_printf("%lr", (long)db_get_value((long)argp, 4, FALSE)); argp++; if (--narg != 0) db_printf(","); @@ -206,19 +212,19 @@ { struct trapframe *tf; int frame_type; - int eip, esp, ebp; + long rip, rsp, rbp; db_expr_t offset; c_db_sym_t sym; const char *name; - eip = db_get_value((int) &(*fp)->f_retaddr, 4, FALSE); - ebp = db_get_value((int) &(*fp)->f_frame, 4, FALSE); + rip = db_get_value((long) &(*fp)->f_retaddr, 4, FALSE); + rbp = db_get_value((long) &(*fp)->f_frame, 4, FALSE); /* * Figure out frame type. */ frame_type = NORMAL; - sym = db_search_symbol(eip, DB_STGY_ANY, &offset); + sym = db_search_symbol(rip, DB_STGY_ANY, &offset); db_symbol_values(sym, &name, NULL); if (name != NULL) { if (strcmp(name, "calltrap") == 0 || @@ -236,30 +242,30 @@ * Normal frames need no special processing. */ if (frame_type == NORMAL) { - *ip = (db_addr_t) eip; - *fp = (struct amd64_frame *) ebp; + *ip = (db_addr_t) rip; + *fp = (struct amd64_frame *) rbp; return; } - db_print_stack_entry(name, 0, 0, 0, eip); + db_print_stack_entry(name, 0, 0, 0, rip); /* * Point to base of trapframe which is just above the * current frame. */ if (frame_type == INTERRUPT) - tf = (struct trapframe *)((int)*fp + 12); + tf = (struct trapframe *)((long)*fp + 12); else - tf = (struct trapframe *)((int)*fp + 8); + tf = (struct trapframe *)((long)*fp + 8); - if (INKERNEL((int) tf)) { - esp = (ISPL(tf->tf_cs) == SEL_UPL) ? - tf->tf_rsp : (int)&tf->tf_rsp; - eip = tf->tf_rip; - ebp = tf->tf_rbp; + if (INKERNEL((long) tf)) { + rsp = (ISPL(tf->tf_cs) == SEL_UPL) ? + tf->tf_rsp : (long)&tf->tf_rsp; + rip = tf->tf_rip; + rbp = tf->tf_rbp; switch (frame_type) { case TRAP: - db_printf("--- trap %#r", tf->tf_trapno); + db_printf("--- trap %#lr", tf->tf_trapno); break; case SYSCALL: db_printf("--- syscall"); @@ -271,12 +277,12 @@ default: panic("The moon has moved again."); } - db_printf(", eip = %#r, esp = %#r, ebp = %#r ---\n", eip, - esp, ebp); + db_printf(", rip = %#lr, rsp = %#lr, rbp = %#lr ---\n", rip, + rsp, rbp); } - *ip = (db_addr_t) eip; - *fp = (struct amd64_frame *) ebp; + *ip = (db_addr_t) rip; + *fp = (struct amd64_frame *) rbp; } void @@ -336,16 +342,16 @@ return; } pcb = FIRST_THREAD_IN_PROC(p)->td_pcb; /* XXXKSE */ - frame = (struct amd64_frame *)pcb->pcb_ebp; + frame = (struct amd64_frame *)pcb->pcb_rbp; if (frame == NULL) frame = (struct amd64_frame *) - (pcb->pcb_esp - 8); - callpc = (db_addr_t)pcb->pcb_eip; + (pcb->pcb_rsp - 8); + callpc = (db_addr_t)pcb->pcb_rip; } } else { p = NULL; frame = (struct amd64_frame *)addr; - callpc = (db_addr_t)db_get_value((int)&frame->f_retaddr, 4, FALSE); + callpc = (db_addr_t)db_get_value((long)&frame->f_retaddr, 4, FALSE); frame = frame->f_frame; } db_trace_one_stack(count, have_addr, p, frame, callpc); @@ -382,10 +388,10 @@ callpc = (db_addr_t)ddb_regs.tf_rip; } else { pcb = td->td_pcb; - frame = (struct amd64_frame *)pcb->pcb_ebp; + frame = (struct amd64_frame *)pcb->pcb_rbp; if (frame == NULL) - frame = (struct amd64_frame *) (pcb->pcb_esp - 8); - callpc = (db_addr_t)pcb->pcb_eip; + frame = (struct amd64_frame *) (pcb->pcb_rsp - 8); + callpc = (db_addr_t)pcb->pcb_rip; } db_trace_one_stack(count, have_addr, p, frame, callpc); } @@ -394,7 +400,7 @@ db_trace_one_stack(int count, boolean_t have_addr, struct proc *p, struct amd64_frame *frame, db_addr_t callpc) { - int *argp; + long *argp; boolean_t first; first = TRUE; @@ -472,19 +478,19 @@ if (actframe != frame) { /* `frame' belongs to caller. */ callpc = (db_addr_t) - db_get_value((int)&actframe->f_retaddr, 4, FALSE); + db_get_value((long)&actframe->f_retaddr, 4, FALSE); continue; } db_nextframe(&frame, &callpc, p); - if (INKERNEL((int) callpc) && !INKERNEL((int) frame)) { + if (INKERNEL((long) callpc) && !INKERNEL((long) frame)) { sym = db_search_symbol(callpc, DB_STGY_ANY, &offset); db_symbol_values(sym, &name, NULL); db_print_stack_entry(name, 0, 0, 0, callpc); break; } - if (!INKERNEL((int) frame)) { + if (!INKERNEL((long) frame)) { break; } } @@ -495,10 +501,11 @@ { register_t ebp; - __asm __volatile("movl %%ebp,%0" : "=r" (ebp)); + __asm __volatile("movq %%rbp,%0" : "=r" (ebp)); db_stack_trace_cmd(ebp, 1, -1, NULL); } +#if 0 #define DB_DRX_FUNC(reg) \ int \ db_ ## reg (vp, valuep, op) \ @@ -706,4 +713,4 @@ db_printf("\n"); } - +#endif
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305292235.h4TMZdXs067768>