Module Name:    src
Committed By:   reinoud
Date:           Sun Aug  5 18:42:49 UTC 2018

Modified Files:
        src/sys/arch/usermode/include: db_machdep.h ucontext.h
        src/sys/arch/usermode/usermode: cpufunc.S kgdb_machdep.c

Log Message:
Add KGDB definitions for i386


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/usermode/include/db_machdep.h
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/usermode/include/ucontext.h
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/usermode/usermode/cpufunc.S
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/usermode/usermode/kgdb_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/usermode/include/db_machdep.h
diff -u src/sys/arch/usermode/include/db_machdep.h:1.3 src/sys/arch/usermode/include/db_machdep.h:1.4
--- src/sys/arch/usermode/include/db_machdep.h:1.3	Wed Aug  1 09:50:57 2018
+++ src/sys/arch/usermode/include/db_machdep.h	Sun Aug  5 18:42:48 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: db_machdep.h,v 1.3 2018/08/01 09:50:57 reinoud Exp $ */
+/* $NetBSD: db_machdep.h,v 1.4 2018/08/05 18:42:48 reinoud Exp $ */
 
 #ifndef _USERMODE_DB_MACHDEP_H
 #define _USERMODE_DB_MACHDEP_H
@@ -27,6 +27,7 @@ extern db_regs_t *ddb_regp;
 #define ddb_regs	(*ddb_regp)
 #endif
 
+/* copied here in verbatim to remove dependencies */
 #if defined(__i386__)
 
 #define BKPT_SIZE 1
@@ -34,8 +35,30 @@ extern db_regs_t *ddb_regp;
 #define	BKPT_ADDR(addr)	(addr)
 #define BKPT_SET(inst, addr) (BKPT_INST)
 
-#error append db_machdep.h for i386
+#define	db_clear_single_step(regs)	_UC_MACHINE_EFLAGS(regs) &= ~PSL_T
+#define	db_set_single_step(regs)	_UC_MACHINE_EFLAGS(regs) |= PSL_T
 
+#define	IS_BREAKPOINT_TRAP(type, code)	((type) == T_BPTFLT)
+#define IS_WATCHPOINT_TRAP(type, code)	((type) == T_TRCTRAP && (code) & 15)
+
+#define	I_CALL		0xe8
+#define	I_CALLI		0xff
+#define	I_RET		0xc3
+#define	I_IRET		0xcf
+
+#define	inst_trap_return(ins)	(((ins)&0xff) == I_IRET)
+#define	inst_return(ins)	(((ins)&0xff) == I_RET)
+#define	inst_call(ins)		(((ins)&0xff) == I_CALL || \
+				 (((ins)&0xff) == I_CALLI && \
+				  ((ins)&0x3800) == 0x1000))
+#define inst_load(ins)		0
+#define inst_store(ins)		0
+
+typedef	int		kgdb_reg_t;
+#define	KGDB_NUMREGS	16
+#define	KGDB_BUFLEN	512
+
+/* copied here in verbatim to remove dependencies */
 #elif defined(__x86_64__)
 
 #define	DDB_EXPR_FMT	"l"	/* expression is long */

Index: src/sys/arch/usermode/include/ucontext.h
diff -u src/sys/arch/usermode/include/ucontext.h:1.1 src/sys/arch/usermode/include/ucontext.h:1.2
--- src/sys/arch/usermode/include/ucontext.h:1.1	Wed Aug  1 09:52:15 2018
+++ src/sys/arch/usermode/include/ucontext.h	Sun Aug  5 18:42:48 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ucontext.h,v 1.1 2018/08/01 09:52:15 reinoud Exp $ */
+/* $NetBSD: ucontext.h,v 1.2 2018/08/05 18:42:48 reinoud Exp $ */
 
 #ifndef _USERMODE_UCONTEXT_H
 #define _USERMODE_UCONTEXT_H
@@ -9,6 +9,8 @@
 
 #if defined(__i386__)
 
+#define _UC_MACHINE_EFLAGS(uc) ((uc)->uc_mcontext.__gregs[_REG_EFL])
+
 #elif defined(__x86_64__)
 
 #define _UC_MACHINE_RFLAGS(uc) ((uc)->uc_mcontext.__gregs[26])

Index: src/sys/arch/usermode/usermode/cpufunc.S
diff -u src/sys/arch/usermode/usermode/cpufunc.S:1.1 src/sys/arch/usermode/usermode/cpufunc.S:1.2
--- src/sys/arch/usermode/usermode/cpufunc.S:1.1	Wed Aug  1 10:22:20 2018
+++ src/sys/arch/usermode/usermode/cpufunc.S	Sun Aug  5 18:42:48 2018
@@ -5,10 +5,14 @@
 #if defined(__i386__)
 
 ENTRY(breakpoint)
-	.byte 0xcc	// BKPT_INST
+	pushl	%ebp
+	movl	%esp, %ebp
+	int	$0x03		/* paranoid, not 'int3' */
+	popl	%ebp
 	ret
+END(breakpoint)
 
-#error implement setjmp/longjmp for i386
+//#error TODO implement setjmp/longjmp for i386?
 
 #elif defined(__amd64__)
 ENTRY(breakpoint)

Index: src/sys/arch/usermode/usermode/kgdb_machdep.c
diff -u src/sys/arch/usermode/usermode/kgdb_machdep.c:1.3 src/sys/arch/usermode/usermode/kgdb_machdep.c:1.4
--- src/sys/arch/usermode/usermode/kgdb_machdep.c:1.3	Wed Aug  1 10:24:41 2018
+++ src/sys/arch/usermode/usermode/kgdb_machdep.c	Sun Aug  5 18:42:48 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: kgdb_machdep.c,v 1.3 2018/08/01 10:24:41 reinoud Exp $	*/
+/*	$NetBSD: kgdb_machdep.c,v 1.4 2018/08/05 18:42:48 reinoud Exp $	*/
 
 /*
  * Copyright (c) 1996 Matthias Pfaller.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kgdb_machdep.c,v 1.3 2018/08/01 10:24:41 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kgdb_machdep.c,v 1.4 2018/08/05 18:42:48 reinoud Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -127,34 +127,25 @@ kgdb_getregs(db_regs_t *regs, kgdb_reg_t
 	gdb_regs[19] = gregs[_REG_SS];
 		
 #elif defined(__i386)
-	gdb_regs[ 0] = regs->tf_eax;
-	gdb_regs[ 1] = regs->tf_ecx;
-	gdb_regs[ 2] = regs->tf_edx;
-	gdb_regs[ 3] = regs->tf_ebx;
-	gdb_regs[ 4] = regs->tf_esp;
-	gdb_regs[ 5] = regs->tf_ebp;
-	gdb_regs[ 6] = regs->tf_esi;
-	gdb_regs[ 7] = regs->tf_edi;
-	gdb_regs[ 8] = regs->tf_eip;
-	gdb_regs[ 9] = regs->tf_eflags;
-	gdb_regs[10] = regs->tf_cs;
-	gdb_regs[11] = regs->tf_ss;
-	gdb_regs[12] = regs->tf_ds;
-	gdb_regs[13] = regs->tf_es;
-	gdb_regs[14] = regs->tf_fs;
-	gdb_regs[15] = regs->tf_gs;
+	kgdb_reg_t *gregs = regs->uc_mcontext.__gregs;
+
+	gdb_regs[ 0] = gregs[_REG_EAX];
+	gdb_regs[ 1] = gregs[_REG_ECX];
+	gdb_regs[ 2] = gregs[_REG_EDX];
+	gdb_regs[ 3] = gregs[_REG_EBX];
+	gdb_regs[ 4] = gregs[_REG_ESP];
+	gdb_regs[ 5] = gregs[_REG_EBP];
+	gdb_regs[ 6] = gregs[_REG_ESI];
+	gdb_regs[ 7] = gregs[_REG_EDI];
+	gdb_regs[ 8] = gregs[_REG_EIP];
+	gdb_regs[ 9] = gregs[_REG_EFL];
+	gdb_regs[10] = gregs[_REG_CS];
+	gdb_regs[11] = gregs[_REG_SS];
+	gdb_regs[12] = gregs[_REG_DS];
+	gdb_regs[13] = gregs[_REG_ES];
+	gdb_regs[14] = gregs[_REG_FS];
+	gdb_regs[15] = gregs[_REG_GS];
 
-/*XXX OOPS XXX? */
-#if 0
-	if (KERNELMODE(regs->tf_cs)) {
-		/*
-		 * Kernel mode - esp and ss not saved.
-		 */
-		gdb_regs[ 4] = (kgdb_reg_t)&regs->tf_esp; /* kernel stack
-							     pointer */
-		gdb_regs[11] = x86_getss();
-	}
-#endif
 #else
 #error port kgdb_machdep.c kgdb_getregs
 #endif
@@ -192,26 +183,21 @@ kgdb_setregs(db_regs_t *regs, kgdb_reg_t
 	gregs[_REG_SS ] = gdb_regs[19];
 #elif defined(__i386)
 panic("%s", __func__);
-	regs->tf_eax    = gdb_regs[ 0];
-	regs->tf_ecx    = gdb_regs[ 1];
-	regs->tf_edx    = gdb_regs[ 2];
-	regs->tf_ebx    = gdb_regs[ 3];
-	regs->tf_ebp    = gdb_regs[ 5];
-	regs->tf_esi    = gdb_regs[ 6];
-	regs->tf_edi    = gdb_regs[ 7];
-	regs->tf_eip    = gdb_regs[ 8];
-	regs->tf_eflags = gdb_regs[ 9];
-	regs->tf_cs     = gdb_regs[10];
-	regs->tf_ds     = gdb_regs[12];
-	regs->tf_es     = gdb_regs[13];
-
-	if (KERNELMODE(regs->tf_cs) == 0) {
-		/*
-		 * Trapped in user mode - restore esp and ss.
-		 */
-		regs->tf_esp = gdb_regs[ 4];
-		regs->tf_ss  = gdb_regs[11];
-	}
+	kgdb_reg_t *gregs = regs->uc_mcontext.__gregs;
+
+	gregs[_REG_EAX] = gdb_regs[ 0];
+	gregs[_REG_ECX] = gdb_regs[ 1];
+	gregs[_REG_EDX] = gdb_regs[ 2];
+	gregs[_REG_EBX] = gdb_regs[ 3];
+	gregs[_REG_EBP] = gdb_regs[ 5];
+	gregs[_REG_ESI] = gdb_regs[ 6];
+	gregs[_REG_EDI] = gdb_regs[ 7];
+	gregs[_REG_EIP] = gdb_regs[ 8];
+	gregs[_REG_EFL] = gdb_regs[ 9];
+	gregs[_REG_CS]  = gdb_regs[10];
+	gregs[_REG_DS]  = gdb_regs[12];
+	gregs[_REG_ES]  = gdb_regs[13];
+
 #else
 panic("%s", __func__);
 #endif

Reply via email to