Date: Fri, 19 Dec 1997 09:21:06 -0800 From: Amancio Hasty <hasty@rah.star-gate.com> To: Bruce Evans <bde@zeta.org.au> Cc: pb@fasterix.freenix.org, current@FreeBSD.ORG, gjp@erols.com, gjp@erols.net Subject: Re: cvs commit: src/sys/i386/linux linux.h linux_ioctl.c Message-ID: <199712191721.JAA01709@rah.star-gate.com> In-Reply-To: Your message of "Fri, 19 Dec 1997 23:32:20 %2B1100." <199712191232.XAA12685@godzilla.zeta.org.au>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi,
I know what ioperm does and I first implemented it for 386bsd 0.0 8)
Not sure if it is worth any hazzle to implement it the way that
that svgalib uses it . The problem comes in when they want to
do any kind of video acceleration how to then enable all those
i/o registers for something like an S3 chipset.
At any rate, there may be other valid uses for ioperm other than
for svgalib.
Tnks!
Amancio
> >With respect to ioperm , I moved linux_ioperm from linux_dummy.c to
> >linux_misc.c and just have this for now:
> >
> >
> >int
> >linux_ioperm(struct proc *p, struct linux_ioperm_args *args)
> >{
> > int error;
> >
> > error = suser(p->p_ucred, &p->p_acflag);
> > if (error != 0)
> > return error;
> > if (securelevel > 0)
> > return EPERM;
> > p->p_md.md_regs->tf_eflags |= PSL_IOPL;
> > return 0;
> >}
>
> That's not what Linux ioperm does. Linux ioperm sets or clears bits in
> the i/o permissions bitmap. It is like FreeBSD ioperm except it has a
> cleaner interface and is presumably less buggy. FreeBSD ioperm is not
> completely implemented. It is only available if the kernel was configured
> with `options "VM86"'. It is a subcall of sysarch(undocumented). You
> have to pass it a pointer to a poorly laid out struct giving the args,
> something like this:
>
> Linux: int ioperm(u_long from, u_long num, int turn_on);
> FreeBSD: struct i386_ioperm_args { u_short from, num; u_char turn_on; } foo;
> sysarch(I386_SET_IOPERM, /* XXX 1970's interface */ (char *)&foo);
>
> Here are some fixes for the bugs. They are untested.
>
> diff -c2 sys_machdep.c~ sys_machdep.c
> *** sys_machdep.c~ Fri Nov 28 14:37:35 1997
> --- sys_machdep.c Fri Nov 28 17:28:16 1997
> ***************
> *** 181,185 ****
> char *args;
> {
> ! int i, error = 0;
> struct i386_ioperm_args ua;
> char *iomap;
> --- 181,185 ----
> char *args;
> {
> ! int i, error;
> struct i386_ioperm_args ua;
> char *iomap;
> ***************
> *** 188,194 ****
> return (error);
>
> - /* Only root can do this */
> if (error = suser(p->p_ucred, &p->p_acflag))
> return (error);
> /*
> * XXX
> --- 188,195 ----
> return (error);
>
> if (error = suser(p->p_ucred, &p->p_acflag))
> return (error);
> + if (securelevel > 0)
> + return (EPERM);
> /*
> * XXX
> ***************
> *** 203,207 ****
> iomap = (char *)p->p_addr->u_pcb.pcb_ext->ext_iomap;
>
> ! if ((int)(ua.start + ua.length) > 0xffff)
> return (EINVAL);
>
> --- 204,208 ----
> iomap = (char *)p->p_addr->u_pcb.pcb_ext->ext_iomap;
>
> ! if (ua.start + ua.length > IOPAGES * PAGE_SIZE * NBBY)
> return (EINVAL);
>
> ***************
> *** 220,224 ****
> char *args;
> {
> ! int i, state, error = 0;
> struct i386_ioperm_args ua;
> char *iomap;
> --- 221,225 ----
> char *args;
> {
> ! int i, state, error;
> struct i386_ioperm_args ua;
> char *iomap;
> ***************
> *** 226,229 ****
> --- 227,232 ----
> if (error = copyin(args, &ua, sizeof(struct i386_ioperm_args)))
> return (error);
> + if (ua.start >= IOPAGES * PAGE_SIZE * NBBY)
> + return (EINVAL);
>
> if (p->p_addr->u_pcb.pcb_ext == 0) {
> ***************
> *** 234,237 ****
> --- 237,242 ----
> iomap = (char *)p->p_addr->u_pcb.pcb_ext->ext_iomap;
>
> + i = ua.start;
> + state = (iomap[i >> 3] >> (i & 7)) & 1;
> ua.enable = !state;
> ua.length = 1;
>
> Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199712191721.JAA01709>
