PERFORCE change 53836 for review

Marcel Moolenaar marcel at FreeBSD.org
Sun May 30 19:29:20 PDT 2004


http://perforce.freebsd.org/chv.cgi?CH=53836

Change 53836 by marcel at 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 <sys/param.h>
 #include <sys/systm.h>
+#include <sys/kdb.h>
 #include <sys/reboot.h>
 #include <sys/cons.h>
 #include <sys/pcpu.h>
@@ -45,259 +46,95 @@
 
 #include <ddb/ddb.h>
 
-#include <machine/setjmp.h>
-
-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)&regs->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


More information about the p4-projects mailing list