PERFORCE change 77406 for review

Peter Wemm peter at FreeBSD.org
Tue May 24 20:33:17 GMT 2005


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

Change 77406 by peter at peter_daintree on 2005/05/24 20:33:08

	Begin inflicting unspeakable evil

Affected files ...

.. //depot/projects/hammer/sys/kern/sys_process.c#22 edit

Differences ...

==== //depot/projects/hammer/sys/kern/sys_process.c#22 (text+ko) ====

@@ -55,6 +55,12 @@
 #include <vm/vm_object.h>
 #include <vm/vm_page.h>
 
+#ifdef COMPAT_IA32
+#include <comapt/ia32/ia32_reg.h>
+
+extern struct sysentvec ia32_freebsd_sysvec;
+#endif
+
 /*
  * Functions implemented using PROC_ACTION():
  *
@@ -96,28 +102,52 @@
 proc_read_regs(struct thread *td, struct reg *regs)
 {
 
-	PROC_ACTION(fill_regs(td, regs));
+#ifdef COMPAT_IA32
+	if (td->td_proc->p_sysent == &ia32_freebsd_sysvec &&
+	    curthread->td_proc->p_sysent == &ia32_freebsd_sysvec)
+		PROC_ACTION(fill_regs32(td, regs));
+	else
+#endif
+		PROC_ACTION(fill_regs(td, regs));
 }
 
 int
 proc_write_regs(struct thread *td, struct reg *regs)
 {
 
-	PROC_ACTION(set_regs(td, regs));
+#ifdef COMPAT_IA32
+	if (td->td_proc->p_sysent == &ia32_freebsd_sysvec &&
+	    curthread->td_proc->p_sysent == &ia32_freebsd_sysvec)
+		PROC_ACTION(set_regs32(td, regs));
+	else
+#endif
+		PROC_ACTION(set_regs(td, regs));
 }
 
 int
 proc_read_dbregs(struct thread *td, struct dbreg *dbregs)
 {
 
-	PROC_ACTION(fill_dbregs(td, dbregs));
+#ifdef COMPAT_IA32
+	if (td->td_proc->p_sysent == &ia32_freebsd_sysvec &&
+	    curthread->td_proc->p_sysent == &ia32_freebsd_sysvec)
+		PROC_ACTION(fill_dbregs32(td, dbregs));
+	else
+#endif
+		PROC_ACTION(fill_dbregs(td, dbregs));
 }
 
 int
 proc_write_dbregs(struct thread *td, struct dbreg *dbregs)
 {
 
-	PROC_ACTION(set_dbregs(td, dbregs));
+#ifdef COMPAT_IA32
+	if (td->td_proc->p_sysent == &ia32_freebsd_sysvec &&
+	    curthread->td_proc->p_sysent == &ia32_freebsd_sysvec)
+		PROC_ACTION(set_dbregs32(td, dbregs));
+	else
+#endif
+		PROC_ACTION(set_dbregs(td, dbregs));
 }
 
 /*
@@ -128,14 +158,26 @@
 proc_read_fpregs(struct thread *td, struct fpreg *fpregs)
 {
 
-	PROC_ACTION(fill_fpregs(td, fpregs));
+#ifdef COMPAT_IA32
+	if (td->td_proc->p_sysent == &ia32_freebsd_sysvec &&
+	    curthread->td_proc->p_sysent == &ia32_freebsd_sysvec)
+		PROC_ACTION(fill_fpregs32(td, fpregs));
+	else
+#endif
+		PROC_ACTION(fill_fpregs(td, fpregs));
 }
 
 int
 proc_write_fpregs(struct thread *td, struct fpreg *fpregs)
 {
 
-	PROC_ACTION(set_fpregs(td, fpregs));
+#ifdef COMPAT_IA32
+	if (td->td_proc->p_sysent == &ia32_freebsd_sysvec &&
+	    curthread->td_proc->p_sysent == &ia32_freebsd_sysvec)
+		PROC_ACTION(set_fpregs32(td, fpregs));
+	else
+#endif
+		PROC_ACTION(set_fpregs(td, fpregs));
 }
 
 int
@@ -306,10 +348,21 @@
 		struct dbreg dbreg;
 		struct fpreg fpreg;
 		struct reg reg;
+#ifdef COMPAT_IA32
+		struct dbreg32 dbreg32;
+		struct fpreg32 fpreg32;
+		struct reg32 reg32;
+#endif
 	} r;
 	void *addr;
 	int error = 0;
+#ifdef COMPAT_IA32
+	int wrap32 = 0;
 
+	if (td->td_proc->p_sysent == &ia32_freebsd_sysvec &&
+	    curthread->td_proc->p_sysent == &ia32_freebsd_sysvec)
+		wrap32 = 1;
+#endif
 	addr = &r;
 	switch (uap->req) {
 	case PT_GETREGS:
@@ -318,13 +371,28 @@
 	case PT_LWPINFO:
 		break;
 	case PT_SETREGS:
-		error = copyin(uap->addr, &r.reg, sizeof r.reg);
+#ifdef COMPAT_IA32
+		if (wrap32)
+			error = copyin(uap->addr, &r.reg32, sizeof r.reg32);
+		else
+#endif
+			error = copyin(uap->addr, &r.reg, sizeof r.reg);
 		break;
 	case PT_SETFPREGS:
-		error = copyin(uap->addr, &r.fpreg, sizeof r.fpreg);
+#ifdef COMPAT_IA32
+		if (wrap32)
+			error = copyin(uap->addr, &r.fpreg32, sizeof r.fpreg32);
+		else
+#endif
+			error = copyin(uap->addr, &r.fpreg, sizeof r.fpreg);
 		break;
 	case PT_SETDBREGS:
-		error = copyin(uap->addr, &r.dbreg, sizeof r.dbreg);
+#ifdef COMPAT_IA32
+		if (wrap32)
+			error = copyin(uap->addr, &r.dbreg32, sizeof r.dbreg32);
+		else
+#endif
+			error = copyin(uap->addr, &r.dbreg, sizeof r.dbreg);
 		break;
 	case PT_IO:
 		error = copyin(uap->addr, &r.piod, sizeof r.piod);
@@ -345,13 +413,28 @@
 		(void)copyout(&r.piod, uap->addr, sizeof r.piod);
 		break;
 	case PT_GETREGS:
-		error = copyout(&r.reg, uap->addr, sizeof r.reg);
+#ifdef COMPAT_IA32
+		if (wrap32)
+			error = copyout(&r.reg32, uap->addr, sizeof r.reg32);
+		else
+#endif
+			error = copyout(&r.reg, uap->addr, sizeof r.reg);
 		break;
 	case PT_GETFPREGS:
-		error = copyout(&r.fpreg, uap->addr, sizeof r.fpreg);
+#ifdef COMPAT_IA32
+		if (wrap32)
+			error = copyout(&r.fpreg32, uap->addr, sizeof r.fpreg32);
+		else
+#endif
+			error = copyout(&r.fpreg, uap->addr, sizeof r.fpreg);
 		break;
 	case PT_GETDBREGS:
-		error = copyout(&r.dbreg, uap->addr, sizeof r.dbreg);
+#ifdef COMPAT_IA32
+		if (wrap32)
+			error = copyout(&r.dbreg32, uap->addr, sizeof r.dbreg32);
+		else
+#endif
+			error = copyout(&r.dbreg, uap->addr, sizeof r.dbreg);
 		break;
 	case PT_LWPINFO:
 		error = copyout(&r.pl, uap->addr, uap->data);


More information about the p4-projects mailing list