Skip site navigation (1)Skip section navigation (2)
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>