PERFORCE change 51729 for review
Marcel Moolenaar
marcel at FreeBSD.org
Sun Apr 25 14:05:18 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=51729
Change 51729 by marcel at marcel_sledge on 2004/04/25 14:05:13
Implement gdb_cpu_getreg() and gdb_cpu_regsz() accordingly.
Don't implement gdb_cpu_signal() the same as on i386. It's
a mistake to translate trap types to signal numbers.
Affected files ...
.. //depot/projects/gdb/sys/amd64/amd64/gdb_machdep.c#2 edit
.. //depot/projects/gdb/sys/amd64/include/gdb_machdep.h#3 edit
Differences ...
==== //depot/projects/gdb/sys/amd64/amd64/gdb_machdep.c#2 (text+ko) ====
@@ -29,7 +29,9 @@
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/kdb.h>
#include <sys/kernel.h>
+#include <sys/proc.h>
#include <sys/signal.h>
#include <machine/frame.h>
@@ -40,73 +42,43 @@
#include <gdb/gdb.h>
-uintmax_t
-gdb_cpu_getreg(int regnum, struct trapframe *tf)
+void *
+gdb_cpu_getreg(int regnum, size_t *regsz)
{
+ struct trapframe *tf = kdb_frame;
+
+ *regsz = gdb_cpu_regsz(regnum);
switch (regnum) {
- case GDB_REG_FP: return ((unsigned int)tf->tf_ebp);
- case GDB_REG_PC: return ((unsigned int)tf->tf_eip);
- case GDB_REG_SP: return ((unsigned int)tf->tf_esp);
+ case 0: return (&tf->tf_rax);
+ case 1: return (&tf->tf_rbx);
+ case 2: return (&tf->tf_rcx);
+ case 3: return (&tf->tf_rdx);
+ case 4: return (&tf->tf_rsi);
+ case 5: return (&tf->tf_rdi);
+ case 6: return (&tf->tf_rbp);
+ case 7: return (&tf->tf_rsp);
+ case 8: return (&tf->tf_r8);
+ case 9: return (&tf->tf_r9);
+ case 10: return (&tf->tf_r10);
+ case 11: return (&tf->tf_r11);
+ case 12: return (&tf->tf_r12);
+ case 13: return (&tf->tf_r13);
+ case 14: return (&tf->tf_r14);
+ case 15: return (&tf->tf_r15);
+ case 16: return (&tf->tf_rip);
+ case 17: return (&tf->tf_rflags);
+ case 18: return (&tf->tf_cs);
+ case 19: return (&tf->tf_ss);
}
- return (0);
+ return (NULL);
}
-ssize_t
-gdb_cpu_getregs(struct trapframe *tf, void *buf, size_t bufsz)
+void
+gdb_cpu_setreg(int regnum, register_t val)
{
- struct reg *r = buf;
-
- if (sizeof(*r) > bufsz)
- return (-1);
- r->r_cs = tf->tf_cs;
- r->r_ds = tf->tf_ds;
- r->r_eax = tf->tf_eax;
- r->r_ebp = tf->tf_ebp;
- r->r_ebx = tf->tf_ebx;
- r->r_ecx = tf->tf_ecx;
- r->r_edi = tf->tf_edi;
- r->r_edx = tf->tf_edx;
- r->r_eflags = tf->tf_eflags;
- r->r_eip = tf->tf_eip;
- r->r_es = tf->tf_es;
- r->r_esi = tf->tf_esi;
- r->r_esp = tf->tf_esp;
- r->r_fs = tf->tf_fs;
- r->r_gs = 0;
- r->r_ss = tf->tf_ss;
- return (sizeof(*r));
-}
+ struct trapframe *tf = kdb_frame;
-int
-gdb_cpu_regsz(int regnum)
-{
- return (4); /* XXX not really. */
-}
-
-void
-gdb_cpu_setreg(int regnum, struct trapframe *tf, uintmax_t val)
-{
switch (regnum) {
- case GDB_REG_FP: tf->tf_ebp = val; break;
- case GDB_REG_PC: tf->tf_eip = val; break;
- case GDB_REG_SP: tf->tf_esp = val; break;
+ case GDB_REG_PC: tf->tf_rip = val; break;
}
}
-
-int
-gdb_cpu_signal(int type, int code)
-{
- return (type & ~T_USER);
-}
-
-void
-gdb_cpu_singlestep(int on, struct trapframe *tf)
-{
- tf->tf_eflags &= ~PSL_T;
- tf->tf_eflags |= (on) ? PSL_T : 0;
-}
-
-void
-gdb_cpu_trap(int type, int code, struct trapframe *tf)
-{
-}
==== //depot/projects/gdb/sys/amd64/include/gdb_machdep.h#3 (text+ko) ====
@@ -29,14 +29,20 @@
#ifndef _MACHINE_GDB_MACHDEP_H_
#define _MACHINE_GDB_MACHDEP_H_
-#define GDB_BUFSZ 400
-#define GDB_NREGS 14
-#define GDB_REG_PC 8
+#define GDB_BUFSZ 500
+#define GDB_NREGS 56
+#define GDB_REG_PC 18
static __inline size_t
-gdb_cpu_regsz(int regnum __unused)
+gdb_cpu_regsz(int regnum)
+{
+ return ((regnum > 16 && regnum < 24) ? 4 : 8);
+}
+
+static __inline int
+gdb_cpu_signal(int type, int code __unused)
{
- return (sizeof(int));
+ return (type);
}
static __inline int
@@ -47,6 +53,5 @@
void *gdb_cpu_getreg(int, size_t *);
void gdb_cpu_setreg(int, register_t);
-int gdb_cpu_signal(int, int);
#endif /* !_MACHINE_GDB_MACHDEP_H_ */
More information about the p4-projects
mailing list