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