From owner-p4-projects@FreeBSD.ORG Wed May 25 03:13:36 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7E13616A420; Wed, 25 May 2005 03:13:36 +0000 (GMT) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 55E4B16A41C for ; Wed, 25 May 2005 03:13:36 +0000 (GMT) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1C79D43D1F for ; Wed, 25 May 2005 03:13:36 +0000 (GMT) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j4P3DZXP041688 for ; Wed, 25 May 2005 03:13:35 GMT (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j4P3DZqA041685 for perforce@freebsd.org; Wed, 25 May 2005 03:13:35 GMT (envelope-from peter@freebsd.org) Date: Wed, 25 May 2005 03:13:35 GMT Message-Id: <200505250313.j4P3DZqA041685@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Cc: Subject: PERFORCE change 77438 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 May 2005 03:13:37 -0000 http://perforce.freebsd.org/chv.cgi?CH=77438 Change 77438 by peter@peter_melody on 2005/05/25 03:12:50 Inflict more evil Affected files ... .. //depot/projects/hammer/sys/fs/procfs/procfs_dbregs.c#6 edit .. //depot/projects/hammer/sys/fs/procfs/procfs_fpregs.c#6 edit .. //depot/projects/hammer/sys/fs/procfs/procfs_ioctl.c#7 edit .. //depot/projects/hammer/sys/fs/procfs/procfs_map.c#8 edit .. //depot/projects/hammer/sys/fs/procfs/procfs_regs.c#6 edit Differences ... ==== //depot/projects/hammer/sys/fs/procfs/procfs_dbregs.c#6 (text+ko) ==== @@ -43,6 +43,8 @@ * $FreeBSD: src/sys/fs/procfs/procfs_dbregs.c,v 1.25 2004/10/01 05:01:17 das Exp $ */ +#include "opt_compat.h" + #include #include #include @@ -56,11 +58,29 @@ #include #include +#ifdef COMPAT_IA32 +#include +#include +#include + +extern struct sysentvec ia32_freebsd_sysvec; +#define PROC(d, w, t, r) wrap32 ? proc_ ## d ## _ ## w ## 32(t, r ## 32) : proc_ ## d ## _ ## w(t, r) +#define UIOMOVE_FROMBUF(k, u) wrap32 ? uiomove_frombuf(& k ## 32, sizeof(k ## 32), u) : uiomove_frombuf(& k, sizeof(k), u) +#else +#define PROC(d, w, t, r) proc_ ## d ## _ ## w(t, r) +#define UIOMOVE_FROMBUF(k, u) uiomove_frombuf(& k, sizeof(k), u) +#endif + int procfs_doprocdbregs(PFS_FILL_ARGS) { int error; struct dbreg r; + struct thread *td2; +#ifdef COMPAT_IA32 + struct dbreg32 r32; + int wrap32 = 0; +#endif PROC_LOCK(p); KASSERT(p->p_lock > 0, ("proc not held")); @@ -70,10 +90,20 @@ } /* XXXKSE: */ - error = proc_read_dbregs(FIRST_THREAD_IN_PROC(p), &r); + td2 = FIRST_THREAD_IN_PROC(p); +#ifdef COMPAT_IA32 + if (td->td_proc->p_sysent == &ia32_freebsd_sysvec) { + if (td2->td_proc->p_sysent != &ia32_freebsd_sysvec) { + PROC_UNLOCK(p); + return (EINVAL); + } + wrap32 = 1; + } +#endif + error = PROC(read, dbregs, td2, &r); if (error == 0) { PROC_UNLOCK(p); - error = uiomove_frombuf(&r, sizeof(r), uio); + error = UIOMOVE_FROMBUF(r, uio); PROC_LOCK(p); } if (error == 0 && uio->uio_rw == UIO_WRITE) { @@ -81,7 +111,7 @@ error = EBUSY; else /* XXXKSE: */ - error = proc_write_dbregs(FIRST_THREAD_IN_PROC(p), &r); + error = PROC(write, dbregs, td2, &r); } PROC_UNLOCK(p); ==== //depot/projects/hammer/sys/fs/procfs/procfs_fpregs.c#6 (text+ko) ==== @@ -37,6 +37,8 @@ * $FreeBSD: src/sys/fs/procfs/procfs_fpregs.c,v 1.31 2004/10/01 05:01:17 das Exp $ */ +#include "opt_compat.h" + #include #include #include @@ -50,11 +52,29 @@ #include #include +#ifdef COMPAT_IA32 +#include +#include +#include + +extern struct sysentvec ia32_freebsd_sysvec; +#define PROC(d, w, t, r) wrap32 ? proc_ ## d ## _ ## w ## 32(t, r ## 32) : proc_ ## d ## _ ## w(t, r) +#define UIOMOVE_FROMBUF(k, u) wrap32 ? uiomove_frombuf(& k ## 32, sizeof(k ## 32), u) : uiomove_frombuf(& k, sizeof(k), u) +#else +#define PROC(d, w, t, r) proc_ ## d ## _ ## w(t, r) +#define UIOMOVE_FROMBUF(k, u) uiomove_frombuf(& k, sizeof(k), u) +#endif + int procfs_doprocfpregs(PFS_FILL_ARGS) { int error; struct fpreg r; + struct thread *td2; +#ifdef COMPAT_IA32 + struct fpreg32 r32; + int wrap32 = 0; +#endif PROC_LOCK(p); KASSERT(p->p_lock > 0, ("proc not held")); @@ -64,10 +84,20 @@ } /* XXXKSE: */ - error = proc_read_fpregs(FIRST_THREAD_IN_PROC(p), &r); + td2 = FIRST_THREAD_IN_PROC(p); +#ifdef COMPAT_IA32 + if (td->td_proc->p_sysent == &ia32_freebsd_sysvec) { + if (td2->td_proc->p_sysent != &ia32_freebsd_sysvec) { + PROC_UNLOCK(p); + return (EINVAL); + } + wrap32 = 1; + } +#endif + error = PROC(read, fpregs, td2, &r); if (error == 0) { PROC_UNLOCK(p); - error = uiomove_frombuf(&r, sizeof(r), uio); + error = UIOMOVE_FROMBUF(r, uio); PROC_LOCK(p); } if (error == 0 && uio->uio_rw == UIO_WRITE) { @@ -75,7 +105,7 @@ error = EBUSY; else /* XXXKSE: */ - error = proc_write_fpregs(FIRST_THREAD_IN_PROC(p), &r); + error = PROC(write, fpregs, td2, &r); } PROC_UNLOCK(p); ==== //depot/projects/hammer/sys/fs/procfs/procfs_ioctl.c#7 (text+ko) ==== @@ -42,6 +42,19 @@ #include #include +#ifdef COMPAT_IA32 +struct procfs_status32 { + int state; /* Running, stopped, something else? */ + int flags; /* Any flags */ + unsigned int events; /* Events to stop on */ + int why; /* What event, if any, proc stopped on */ + unsigned int val; /* Any extra data */ +}; + +#define PIOCWAIT32 _IOR('p', 4, struct procfs_status32) +#define PIOCSTATUS32 _IOR('p', 6, struct procfs_status32) +#endif + /* * Process ioctls */ @@ -49,6 +62,9 @@ procfs_ioctl(PFS_IOCTL_ARGS) { struct procfs_status *ps; +#ifdef COMPAT_IA32 + struct procfs_status32 *ps32; +#endif int error, flags, sig; int l; @@ -100,6 +116,25 @@ ps->why = p->p_step ? p->p_stype : 0; ps->val = p->p_step ? p->p_xstat : 0; break; +#ifdef COMPAT_IA32 + case PIOCWAIT32: + while (p->p_step == 0) { + /* sleep until p stops */ + error = msleep(&p->p_stype, &p->p_mtx, + PWAIT|PCATCH, "pioctl", 0); + if (error != 0) + break; + } + /* fall through to PIOCSTATUS32 */ + case PIOCSTATUS32: + ps32 = (struct procfs_status32 *)data; + ps32->state = (p->p_step == 0); + ps32->flags = 0; /* nope */ + ps32->events = p->p_stops; + ps32->why = p->p_step ? p->p_stype : 0; + ps32->val = p->p_step ? p->p_xstat : 0; + break; +#endif #if defined(COMPAT_FREEBSD5) || defined(COMPAT_FREEBSD4) case _IOC(IOC_IN, 'p', 5, 0): #endif ==== //depot/projects/hammer/sys/fs/procfs/procfs_map.c#8 (text+ko) ==== @@ -35,6 +35,8 @@ * $FreeBSD: src/sys/fs/procfs/procfs_map.c,v 1.37 2005/01/06 18:10:40 imp Exp $ */ +#include "opt_compat.h" + #include #include #include @@ -54,7 +56,15 @@ #include #include +#ifdef COMPAT_IA32 +#include +#include +#include + +extern struct sysentvec ia32_freebsd_sysvec; +#endif + #define MEBUFFERSIZE 256 /* @@ -77,6 +87,9 @@ vm_map_entry_t entry; char mebuffer[MEBUFFERSIZE]; char *fullpath, *freepath; +#ifdef COMPAT_IA32 + int wrap32 = 0; +#endif GIANT_REQUIRED; @@ -92,6 +105,13 @@ if (uio->uio_offset != 0) return (0); +#ifdef COMPAT_IA32 + if (curthread->td_proc->p_sysent == &ia32_freebsd_sysvec) { + if (p->p_sysent != &ia32_freebsd_sysvec) + return (EOPNOTSUPP); + wrap32 = 1; + } +#endif error = 0; if (map != &curthread->td_proc->p_vmspace->vm_map) vm_map_lock_read(map); @@ -164,7 +184,12 @@ snprintf(mebuffer, sizeof mebuffer, "0x%lx 0x%lx %d %d %p %s%s%s %d %d 0x%x %s %s %s %s\n", (u_long)entry->start, (u_long)entry->end, - resident, privateresident, obj, + resident, privateresident, +#ifdef COMPAT_IA32 + wrap32 ? NULL : obj, +#else + obj, +#endif (entry->protection & VM_PROT_READ)?"r":"-", (entry->protection & VM_PROT_WRITE)?"w":"-", (entry->protection & VM_PROT_EXECUTE)?"x":"-", ==== //depot/projects/hammer/sys/fs/procfs/procfs_regs.c#6 (text+ko) ==== @@ -37,6 +37,8 @@ * $FreeBSD: src/sys/fs/procfs/procfs_regs.c,v 1.30 2004/10/01 05:01:17 das Exp $ */ +#include "opt_compat.h" + #include #include #include @@ -50,11 +52,29 @@ #include #include +#ifdef COMPAT_IA32 +#include +#include +#include + +extern struct sysentvec ia32_freebsd_sysvec; +#define PROC(d, w, t, r) wrap32 ? proc_ ## d ## _ ## w ## 32(t, r ## 32) : proc_ ## d ## _ ## w(t, r) +#define UIOMOVE_FROMBUF(k, u) wrap32 ? uiomove_frombuf(& k ## 32, sizeof(k ## 32), u) : uiomove_frombuf(& k, sizeof(k), u) +#else +#define PROC(d, w, t, r) proc_ ## d ## _ ## w(t, r) +#define UIOMOVE_FROMBUF(k, u) uiomove_frombuf(& k, sizeof(k), u) +#endif + int procfs_doprocregs(PFS_FILL_ARGS) { int error; struct reg r; + struct thread *td2; +#ifdef COMPAT_IA32 + struct reg32 r32; + int wrap32 = 0; +#endif PROC_LOCK(p); KASSERT(p->p_lock > 0, ("proc not held")); @@ -64,10 +84,20 @@ } /* XXXKSE: */ - error = proc_read_regs(FIRST_THREAD_IN_PROC(p), &r); + td2 = FIRST_THREAD_IN_PROC(p); +#ifdef COMPAT_IA32 + if (td->td_proc->p_sysent == &ia32_freebsd_sysvec) { + if (td2->td_proc->p_sysent != &ia32_freebsd_sysvec) { + PROC_UNLOCK(p); + return (EINVAL); + } + wrap32 = 1; + } +#endif + error = PROC(read, regs, td2, &r); if (error == 0) { PROC_UNLOCK(p); - error = uiomove_frombuf(&r, sizeof(r), uio); + error = UIOMOVE_FROMBUF(r, uio); PROC_LOCK(p); } if (error == 0 && uio->uio_rw == UIO_WRITE) { @@ -75,7 +105,7 @@ error = EBUSY; else /* XXXKSE: */ - error = proc_write_regs(FIRST_THREAD_IN_PROC(p), &r); + error = PROC(write, regs, td2, &r); } PROC_UNLOCK(p);