Disallow unaligned access to I/O ports.
This commit is contained in:
parent
d2cec7db49
commit
c082f607df
@ -119,22 +119,54 @@ register message *m_ptr; /* pointer to request message */
|
|||||||
outb( pvb[i].port, pvb[i].value);
|
outb( pvb[i].port, pvb[i].value);
|
||||||
break;
|
break;
|
||||||
case _DIO_WORD: /* word values */
|
case _DIO_WORD: /* word values */
|
||||||
if (io_in) for (i=0; i<vec_size; i++)
|
if (io_in)
|
||||||
|
{
|
||||||
|
for (i=0; i<vec_size; i++)
|
||||||
|
{
|
||||||
|
port= pvw[i].port;
|
||||||
|
if (port & 1) goto bad;
|
||||||
pvw[i].value = inw( pvw[i].port);
|
pvw[i].value = inw( pvw[i].port);
|
||||||
else for (i=0; i<vec_size; i++)
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i=0; i<vec_size; i++)
|
||||||
|
{
|
||||||
|
port= pvw[i].port;
|
||||||
|
if (port & 1) goto bad;
|
||||||
outw( pvw[i].port, pvw[i].value);
|
outw( pvw[i].port, pvw[i].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default: /* long values */
|
default: /* long values */
|
||||||
if (io_in) for (i=0; i<vec_size; i++)
|
if (io_in)
|
||||||
|
{
|
||||||
|
for (i=0; i<vec_size; i++)
|
||||||
|
{
|
||||||
|
port= pvl[i].port;
|
||||||
|
if (port & 3) goto bad;
|
||||||
pvl[i].value = inl(pvl[i].port);
|
pvl[i].value = inl(pvl[i].port);
|
||||||
else for (i=0; i<vec_size; i++)
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i=0; i<vec_size; i++)
|
||||||
|
{
|
||||||
|
port= pvl[i].port;
|
||||||
|
if (port & 3) goto bad;
|
||||||
outl( pvb[i].port, pvl[i].value);
|
outl( pvb[i].port, pvl[i].value);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
unlock(13);
|
unlock(13);
|
||||||
|
|
||||||
/* Almost done, copy back results for input requests. */
|
/* Almost done, copy back results for input requests. */
|
||||||
if (io_in) phys_copy(vir2phys(vdevio_buf), caller_phys, (phys_bytes) bytes);
|
if (io_in) phys_copy(vir2phys(vdevio_buf), caller_phys, (phys_bytes) bytes);
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
||||||
|
bad:
|
||||||
|
panic("do_vdevio: unaligned port\n", port);
|
||||||
|
return EPERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* USE_VDEVIO */
|
#endif /* USE_VDEVIO */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user