Store resource lists for drivers. Limited checks to enforce those lists.

This commit is contained in:
Philip Homburg
2006-01-27 13:21:12 +00:00
parent ee2253ec52
commit 38a16399f8
5 changed files with 221 additions and 35 deletions
+40
View File
@@ -19,6 +19,46 @@
PUBLIC int do_devio(m_ptr)
register message *m_ptr; /* pointer to request message */
{
struct proc *rp;
struct priv *privp;
port_t port;
struct io_range *iorp;
int i, size, nr_io_range;
rp= proc_addr(m_ptr->m_source);
privp= priv(rp);
if (!privp)
{
kprintf("no priv structure!\n");
goto doit;
}
if (privp->s_flags & CHECK_IO_PORT)
{
switch (m_ptr->DIO_TYPE)
{
case DIO_BYTE: size= 1; break;
case DIO_WORD: size= 2; break;
case DIO_LONG: size= 4; break;
default: size= 4; break; /* Be conservative */
}
port= m_ptr->DIO_PORT;
nr_io_range= privp->s_nr_io_range;
for (i= 0, iorp= privp->s_io_tab; i<nr_io_range; i++, iorp++)
{
if (port >= iorp->ior_base && port+size-1 <= iorp->ior_limit)
break;
}
if (i >= nr_io_range)
{
kprintf(
"do_devio: I/O port check failed for proc %d, port 0x%x\n",
m_ptr->m_source, port);
return EPERM;
}
}
doit:
/* Process a single I/O request for byte, word, and long values. */
if (m_ptr->DIO_REQUEST == DIO_INPUT) {
switch (m_ptr->DIO_TYPE) {