summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authorpst <pst@FreeBSD.org>1996-08-28 17:49:33 +0000
committerpst <pst@FreeBSD.org>1996-08-28 17:49:33 +0000
commit09e1979918339fed9a548be215af8238c25ccd19 (patch)
treee8b399ad7cbeaf8340bff793c44a84d854dbb779 /sys/i386
parent6a84c3f5ef8b191a60eb7409c14a1380f90a4649 (diff)
downloadFreeBSD-src-09e1979918339fed9a548be215af8238c25ccd19.zip
FreeBSD-src-09e1979918339fed9a548be215af8238c25ccd19.tar.gz
Clean up formatting and fix an & -> && bug pointed out by bde
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/i386/db_interface.c139
1 files changed, 52 insertions, 87 deletions
diff --git a/sys/i386/i386/db_interface.c b/sys/i386/i386/db_interface.c
index 159400c..284d2e9 100644
--- a/sys/i386/i386/db_interface.c
+++ b/sys/i386/i386/db_interface.c
@@ -23,7 +23,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: db_interface.c,v 1.19 1996/05/03 21:00:51 phk Exp $
+ * $Id: db_interface.c,v 1.20 1996/08/27 19:45:56 pst Exp $
*/
/*
@@ -35,11 +35,10 @@
#include <sys/proc.h>
#include <sys/reboot.h>
+#include <machine/cons.h>
#include <machine/md_var.h>
#include <machine/segments.h>
-#include <machine/cons.h> /* XXX: import cons_unavail */
-
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
@@ -47,43 +46,26 @@
#include <ddb/ddb.h>
#include <setjmp.h>
-static int db_active = 0;
+static jmp_buf *db_nofault = 0;
+extern jmp_buf db_jmpbuf;
+
extern void gdb_handle_exception __P((db_regs_t *, int, int));
db_regs_t ddb_regs;
-static void kdbprinttrap __P((int type, int code));
-
-#if 0
-/*
- * Received keyboard interrupt sequence.
- */
-void
-kdb_kbd_trap(regs)
- struct i386_saved_state *regs;
-{
- if (db_active == 0 && (boothowto & RB_KDB)) {
- db_printf("\n\nkernel: keyboard interrupt\n");
- kdb_trap(-1, 0, regs);
- }
-}
+#ifdef __GNUC__
+#define rss() ({u_short ss; __asm __volatile("movl %%ss,%0" : "=r" (ss)); ss;})
#endif
/*
* kdb_trap - field a TRACE or BPT trap
*/
-
-static jmp_buf *db_nofault = 0;
-
int
kdb_trap(type, code, regs)
int type, code;
register struct i386_saved_state *regs;
{
-#if 0
- if ((boothowto&RB_KDB) == 0)
- return(0);
-#endif
+ int ddb_mode = !(boothowto & RB_GDB);
/*
* XXX try to do nothing if the console is in graphics mode.
@@ -94,12 +76,12 @@ kdb_trap(type, code, regs)
* our breakpoints by disarming our breakpoints and fixing up
* %eip.
*/
- if (cons_unavail && !(boothowto & RB_GDB)) {
- if (type == T_TRCTRAP) {
- regs->tf_eflags &= ~PSL_T;
- return (1);
- }
- return (0);
+ if (cons_unavail && ddb_mode) {
+ if (type == T_TRCTRAP) {
+ regs->tf_eflags &= ~PSL_T;
+ return (1);
+ }
+ return (0);
}
switch (type) {
@@ -108,7 +90,7 @@ kdb_trap(type, code, regs)
break;
default:
- kdbprinttrap(type, code);
+ db_printf("kernel: type %d trap, code=%x\n", type, code);
if (db_nofault) {
jmp_buf *no_fault = db_nofault;
@@ -117,29 +99,27 @@ kdb_trap(type, code, regs)
}
}
- /* Should switch to kdb`s own stack here. */
-
+ /*
+ * XXX We really should switch to a local stack here.
+ */
ddb_regs = *regs;
+ /*
+ * Kernel mode - esp and ss not saved, so dummy them up
+ */
if (ISPL(regs->tf_cs) == 0) {
- /*
- * Kernel mode - esp and ss not saved
- */
- ddb_regs.tf_esp = (int)&regs->tf_esp; /* kernel stack pointer */
-#ifdef __GNUC__
-#define rss() ({u_short ss; __asm __volatile("movl %%ss,%0" : "=r" (ss)); ss;})
-#endif
+ ddb_regs.tf_esp = (int)&regs->tf_esp;
ddb_regs.tf_ss = rss();
}
- db_active++;
cnpollc(TRUE);
- if (boothowto & RB_GDB)
- gdb_handle_exception(&ddb_regs, type, code);
- else
+
+ if (ddb_mode)
db_trap(type, code);
+ else
+ gdb_handle_exception(&ddb_regs, type, code);
+
cnpollc(FALSE);
- db_active--;
regs->tf_eip = ddb_regs.tf_eip;
regs->tf_eflags = ddb_regs.tf_eflags;
@@ -147,45 +127,27 @@ kdb_trap(type, code, regs)
regs->tf_ecx = ddb_regs.tf_ecx;
regs->tf_edx = ddb_regs.tf_edx;
regs->tf_ebx = ddb_regs.tf_ebx;
+
+ /*
+ * If in user mode, the saved ESP and SS were valid, restore them
+ */
if (ISPL(regs->tf_cs)) {
- /*
- * user mode - saved esp and ss valid
- */
- regs->tf_esp = ddb_regs.tf_esp; /* user stack pointer */
- regs->tf_ss = ddb_regs.tf_ss & 0xffff; /* user stack segment */
+ regs->tf_esp = ddb_regs.tf_esp;
+ regs->tf_ss = ddb_regs.tf_ss & 0xffff;
}
+
regs->tf_ebp = ddb_regs.tf_ebp;
regs->tf_esi = ddb_regs.tf_esi;
regs->tf_edi = ddb_regs.tf_edi;
regs->tf_es = ddb_regs.tf_es & 0xffff;
regs->tf_cs = ddb_regs.tf_cs & 0xffff;
regs->tf_ds = ddb_regs.tf_ds & 0xffff;
-#if 0
- regs->tf_fs = ddb_regs.tf_fs & 0xffff;
- regs->tf_gs = ddb_regs.tf_gs & 0xffff;
-#endif
-
return (1);
}
/*
- * Print trap reason.
- */
-static void
-kdbprinttrap(type, code)
- int type, code;
-{
- db_printf("kernel: ");
- db_printf("type %d", type);
- db_printf(" trap, code=%x\n", code);
-}
-
-/*
* Read bytes from kernel address space for debugger.
*/
-
-extern jmp_buf db_jmpbuf;
-
void
db_read_bytes(addr, size, data)
vm_offset_t addr;
@@ -222,21 +184,21 @@ db_write_bytes(addr, size, data)
db_nofault = &db_jmpbuf;
- if (addr >= VM_MIN_KERNEL_ADDRESS &&
- addr <= (vm_offset_t)&etext)
- {
+ if (addr >= VM_MIN_KERNEL_ADDRESS && addr <= (vm_offset_t)&etext) {
+
ptep0 = pmap_pte(kernel_pmap, addr);
oldmap0 = *ptep0;
*(int *)ptep0 |= /* INTEL_PTE_WRITE */ PG_RW;
addr1 = trunc_page(addr + size - 1);
- if (trunc_page(addr) != addr1) {
- /* data crosses a page boundary */
+ /* data crosses a page boundary */
+ if (trunc_page(addr) != addr1) {
ptep1 = pmap_pte(kernel_pmap, addr1);
oldmap1 = *ptep1;
*(int *)ptep1 |= /* INTEL_PTE_WRITE */ PG_RW;
}
+
pmap_update();
}
@@ -249,15 +211,17 @@ db_write_bytes(addr, size, data)
if (ptep0) {
*ptep0 = oldmap0;
- if (ptep1) {
+
+ if (ptep1)
*ptep1 = oldmap1;
- }
+
pmap_update();
}
}
/*
- * XXX move this to machdep.c and allow it to be called iff any debugger is
+ * XXX
+ * Move this to machdep.c and allow it to be called if any debugger is
* installed.
*/
void
@@ -267,17 +231,18 @@ Debugger(msg)
static volatile u_char in_Debugger;
/*
- * XXX do nothing if the console is in graphics mode. This is
+ * XXX
+ * Do nothing if the console is in graphics mode. This is
* OK if the call is for the debugger hotkey but not if the call
* is a weak form of panicing.
*/
- if (cons_unavail & !(boothowto & RB_GDB))
- return;
+ if (cons_unavail && !(boothowto & RB_GDB))
+ return;
if (!in_Debugger) {
- in_Debugger = 1;
- db_printf("Debugger(\"%s\")\n", msg);
- breakpoint();
- in_Debugger = 0;
+ in_Debugger = 1;
+ db_printf("Debugger(\"%s\")\n", msg);
+ breakpoint();
+ in_Debugger = 0;
}
}
OpenPOWER on IntegriCloud