From owner-p4-projects@FreeBSD.ORG Sun May 30 19:29:20 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D322E16A4D0; Sun, 30 May 2004 19:29:19 -0700 (PDT) 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 910D016A4CE for ; Sun, 30 May 2004 19:29:19 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 749F843D2D for ; Sun, 30 May 2004 19:29:19 -0700 (PDT) (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 i4V2SJRY055688 for ; Sun, 30 May 2004 19:28:19 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id i4V2SI7u055685 for perforce@freebsd.org; Sun, 30 May 2004 19:28:18 -0700 (PDT) (envelope-from marcel@freebsd.org) Date: Sun, 30 May 2004 19:28:18 -0700 (PDT) Message-Id: <200405310228.i4V2SI7u055685@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 53836 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, 31 May 2004 02:29:20 -0000 http://perforce.freebsd.org/chv.cgi?CH=53836 Change 53836 by marcel@marcel_sledge on 2004/05/30 19:28:12 MFi386 Affected files ... .. //depot/projects/gdb/sys/amd64/amd64/db_interface.c#8 edit Differences ... ==== //depot/projects/gdb/sys/amd64/amd64/db_interface.c#8 (text+ko) ==== @@ -32,6 +32,7 @@ */ #include #include +#include #include #include #include @@ -45,259 +46,95 @@ #include -#include - -static jmp_buf *db_nofault = 0; -extern jmp_buf db_jmpbuf; - -extern void gdb_handle_exception(db_regs_t *, int, int); - -#if 0 -int db_active; -db_regs_t ddb_regs; -static jmp_buf db_global_jmpbuf; - /* - * ddb_trap - field a TRACE or BPT trap + * Read bytes from kernel address space for debugger. */ int -ddb_trap(int type, int code, struct amd64_saved_state *regs) +db_read_bytes(vm_offset_t addr, size_t size, char *data) { - u_long ef; - volatile int ddb_mode = !(boothowto & RB_GDB); + jmp_buf jb; + void *prev_jb; + char *src; + int ret; - /* - * XXX try to do nothing if the console is in graphics mode. - * Handle trace traps (and hardware breakpoints...) by ignoring - * them except for forgetting about them. Return 0 for other - * traps to say that we haven't done anything. The trap handler - * will usually panic. We should handle breakpoint traps for - * our breakpoints by disarming our breakpoints and fixing up - * %eip. - */ - if (cnunavailable() != 0 && ddb_mode) { - if (type == T_TRCTRAP) { - regs->tf_rflags &= ~PSL_T; - return (1); - } - return (0); + prev_jb = kdb_jmpbuf(jb); + ret = setjmp(jb); + if (ret == 0) { + src = (char *)addr; + while (size-- > 0) + *data++ = *src++; } - - ef = read_rflags(); - disable_intr(); - -#ifdef SMP - -#if defined(VERBOSE_CPUSTOP_ON_DDBBREAK) - db_printf("\nCPU%d stopping CPUs: 0x%08x...", PCPU_GET(cpuid), - PCPU_GET(other_cpus)); -#endif /* VERBOSE_CPUSTOP_ON_DDBBREAK */ - - /* We stop all CPUs except ourselves (obviously) */ - stop_cpus(PCPU_GET(other_cpus)); - -#if defined(VERBOSE_CPUSTOP_ON_DDBBREAK) - db_printf(" stopped.\n"); -#endif /* VERBOSE_CPUSTOP_ON_DDBBREAK */ - -#endif /* SMP */ - - switch (type) { - case T_BPTFLT: /* breakpoint */ - case T_TRCTRAP: /* debug exception */ - break; - - default: - /* - * XXX this is almost useless now. In most cases, - * trap_fatal() has already printed a much more verbose - * message. However, it is dangerous to print things in - * trap_fatal() - printf() might be reentered and trap. - * The debugger should be given control first. - */ - if (ddb_mode) - db_printf("kernel: type %d trap, code=%x\n", type, code); - - if (db_nofault) { - jmp_buf *no_fault = db_nofault; - db_nofault = 0; - longjmp(*no_fault, 1); - } - } - - /* - * This handles unexpected traps in ddb commands, including calls to - * non-ddb functions. db_nofault only applies to memory accesses by - * internal ddb commands. - */ - if (db_active) - longjmp(db_global_jmpbuf, 1); - - /* - * XXX We really should switch to a local stack here. - */ - ddb_regs = *regs; - - /* - * If in kernel mode, esp and ss are not saved, so dummy them up. - */ - if (ISPL(regs->tf_cs) == 0) { - ddb_regs.tf_rsp = (long)®s->tf_rsp; - ddb_regs.tf_ss = rss(); - } - - (void) setjmp(db_global_jmpbuf); - if (ddb_mode) { - if (!db_active) - cndbctl(TRUE); - db_active = 1; - db_trap(type, code); - cndbctl(FALSE); - } else { - db_active = 1; - gdb_handle_exception(&ddb_regs, type, code); - } - db_active = 0; - - regs->tf_rip = ddb_regs.tf_rip; - regs->tf_rflags = ddb_regs.tf_rflags; - regs->tf_rax = ddb_regs.tf_rax; - regs->tf_rcx = ddb_regs.tf_rcx; - regs->tf_rdx = ddb_regs.tf_rdx; - regs->tf_rbx = ddb_regs.tf_rbx; - - /* - * If in user mode, the saved ESP and SS were valid, restore them. - */ - if (ISPL(regs->tf_cs)) { - regs->tf_rsp = ddb_regs.tf_rsp; - regs->tf_ss = ddb_regs.tf_ss & 0xffff; - } - - regs->tf_rbp = ddb_regs.tf_rbp; - regs->tf_rsi = ddb_regs.tf_rsi; - regs->tf_rdi = ddb_regs.tf_rdi; - - regs->tf_r8 = ddb_regs.tf_r8; - regs->tf_r9 = ddb_regs.tf_r9; - regs->tf_r10 = ddb_regs.tf_r10; - regs->tf_r11 = ddb_regs.tf_r11; - regs->tf_r12 = ddb_regs.tf_r12; - regs->tf_r13 = ddb_regs.tf_r13; - regs->tf_r14 = ddb_regs.tf_r14; - regs->tf_r15 = ddb_regs.tf_r15; - -#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 - -#ifdef SMP - -#if defined(VERBOSE_CPUSTOP_ON_DDBBREAK) - db_printf("\nCPU%d restarting CPUs: 0x%08x...", PCPU_GET(cpuid), - stopped_cpus); -#endif /* VERBOSE_CPUSTOP_ON_DDBBREAK */ - - /* Restart all the CPUs we previously stopped */ - if (stopped_cpus != PCPU_GET(other_cpus) && smp_started != 0) { - db_printf("whoa, other_cpus: 0x%08x, stopped_cpus: 0x%08x\n", - PCPU_GET(other_cpus), stopped_cpus); - panic("stop_cpus() failed"); - } - restart_cpus(stopped_cpus); - -#if defined(VERBOSE_CPUSTOP_ON_DDBBREAK) - db_printf(" restarted.\n"); -#endif /* VERBOSE_CPUSTOP_ON_DDBBREAK */ - -#endif /* SMP */ - - write_rflags(ef); - - return (1); + (void)kdb_jmpbuf(prev_jb); + return (ret); } -#endif /* - * Read bytes from kernel address space for debugger. - */ -void -db_read_bytes(vm_offset_t addr, size_t size, char *data) -{ - char *src; - - db_nofault = &db_jmpbuf; - - src = (char *)addr; - while (size-- > 0) - *data++ = *src++; - - db_nofault = 0; -} - -/* * Write bytes to kernel address space for debugger. */ -void +int db_write_bytes(vm_offset_t addr, size_t size, char *data) { - char *dst; - + jmp_buf jb; + void *prev_jb; + char *dst; pt_entry_t *ptep0 = NULL; pt_entry_t oldmap0 = 0; vm_offset_t addr1; pt_entry_t *ptep1 = NULL; pt_entry_t oldmap1 = 0; + int ret; - db_nofault = &db_jmpbuf; + prev_jb = kdb_jmpbuf(jb); + ret = setjmp(jb); + if (ret == 0) { + if (addr > trunc_page((vm_offset_t)btext) - size && + addr < round_page((vm_offset_t)etext)) { - if (addr > trunc_page((vm_offset_t)btext) - size && - addr < round_page((vm_offset_t)etext)) { + ptep0 = vtopte(addr); + oldmap0 = *ptep0; + *ptep0 |= PG_RW; - ptep0 = vtopte(addr); - oldmap0 = *ptep0; - *ptep0 |= PG_RW; + /* + * Map another page if the data crosses a page + * boundary. + */ + if ((*ptep0 & PG_PS) == 0) { + addr1 = trunc_page(addr + size - 1); + if (trunc_page(addr) != addr1) { + ptep1 = vtopte(addr1); + oldmap1 = *ptep1; + *ptep1 |= PG_RW; + } + } else { + addr1 = trunc_2mpage(addr + size - 1); + if (trunc_2mpage(addr) != addr1) { + ptep1 = vtopte(addr1); + oldmap1 = *ptep1; + *ptep1 |= PG_RW; + } + } - /* Map another page if the data crosses a page boundary. */ - if ((*ptep0 & PG_PS) == 0) { - addr1 = trunc_page(addr + size - 1); - if (trunc_page(addr) != addr1) { - ptep1 = vtopte(addr1); - oldmap1 = *ptep1; - *ptep1 |= PG_RW; - } - } else { - addr1 = trunc_2mpage(addr + size - 1); - if (trunc_2mpage(addr) != addr1) { - ptep1 = vtopte(addr1); - oldmap1 = *ptep1; - *ptep1 |= PG_RW; + invltlb(); } - } + + dst = (char *)addr; - invltlb(); + while (size-- > 0) + *dst++ = *data++; } - dst = (char *)addr; - - while (size-- > 0) - *dst++ = *data++; + (void)kdb_jmpbuf(prev_jb); - db_nofault = 0; - if (ptep0) { - *ptep0 = oldmap0; + *ptep0 = oldmap0; - if (ptep1) - *ptep1 = oldmap1; + if (ptep1) + *ptep1 = oldmap1; - invltlb(); + invltlb(); } + + return (ret); } void