Fixed a bug that would report a device more than once. Added safecopy

version of do_dev_name and do_slot_name.
This commit is contained in:
Philip Homburg 2006-07-10 12:39:54 +00:00
parent ee09d50403
commit fd62815e73

View file

@ -23,7 +23,9 @@ FORWARD _PROTOTYPE( void do_next_dev, (message *mp) );
FORWARD _PROTOTYPE( void do_find_dev, (message *mp) ); FORWARD _PROTOTYPE( void do_find_dev, (message *mp) );
FORWARD _PROTOTYPE( void do_ids, (message *mp) ); FORWARD _PROTOTYPE( void do_ids, (message *mp) );
FORWARD _PROTOTYPE( void do_dev_name, (message *mp) ); FORWARD _PROTOTYPE( void do_dev_name, (message *mp) );
FORWARD _PROTOTYPE( void do_dev_name_s, (message *mp) );
FORWARD _PROTOTYPE( void do_slot_name, (message *mp) ); FORWARD _PROTOTYPE( void do_slot_name, (message *mp) );
FORWARD _PROTOTYPE( void do_slot_name_s, (message *mp) );
FORWARD _PROTOTYPE( void do_reserve, (message *mp) ); FORWARD _PROTOTYPE( void do_reserve, (message *mp) );
FORWARD _PROTOTYPE( void do_attr_r8, (message *mp) ); FORWARD _PROTOTYPE( void do_attr_r8, (message *mp) );
FORWARD _PROTOTYPE( void do_attr_r16, (message *mp) ); FORWARD _PROTOTYPE( void do_attr_r16, (message *mp) );
@ -68,6 +70,8 @@ int main(void)
case BUSC_PCI_ATTR_W16: do_attr_w16(&m); break; case BUSC_PCI_ATTR_W16: do_attr_w16(&m); break;
case BUSC_PCI_ATTR_W32: do_attr_w32(&m); break; case BUSC_PCI_ATTR_W32: do_attr_w32(&m); break;
case BUSC_PCI_RESCAN: do_rescan_bus(&m); break; case BUSC_PCI_RESCAN: do_rescan_bus(&m); break;
case BUSC_PCI_DEV_NAME_S: do_dev_name_s(&m); break;
case BUSC_PCI_SLOT_NAME_S: do_slot_name_s(&m); break;
case PROC_EVENT: do_sig_handler(); break; case PROC_EVENT: do_sig_handler(); break;
default: default:
printf("PCI: got message from %d, type %d\n", printf("PCI: got message from %d, type %d\n",
@ -112,13 +116,19 @@ message *mp;
if (strcmp(names[i].name, mp->m3_ca1) == 0) if (strcmp(names[i].name, mp->m3_ca1) == 0)
break; break;
} }
if (i < NR_DRIVERS) if (i >= NR_DRIVERS)
pci_release(names[i].name);
else
{ {
if (empty == -1)
panic("pci", "do_init: too many clients", NR_DRIVERS);
i= empty; i= empty;
strcpy(names[i].name, mp->m3_ca1); strcpy(names[i].name, mp->m3_ca1);
} }
else if (names[i].tasknr == mp->m_source)
{
/* Ignore all init calls for a process after the first one */
}
else
pci_release(names[i].name);
names[i].tasknr= mp->m_source; names[i].tasknr= mp->m_source;
mp->m_type= 0; mp->m_type= 0;
@ -238,6 +248,7 @@ message *mp;
len= strlen(name)+1; len= strlen(name)+1;
if (len > name_len) if (len > name_len)
len= name_len; len= name_len;
printf("pci`do_dev_name: calling do_vircopy\n");
r= sys_vircopy(SELF, D, (vir_bytes)name, mp->m_source, D, r= sys_vircopy(SELF, D, (vir_bytes)name, mp->m_source, D,
(vir_bytes)name_ptr, len); (vir_bytes)name_ptr, len);
} }
@ -251,6 +262,43 @@ message *mp;
} }
} }
PRIVATE void do_dev_name_s(mp)
message *mp;
{
int r, name_len, len;
u16_t vid, did;
cp_grant_id_t name_gid;
char *name;
vid= mp->m7_i1;
did= mp->m7_i2;
name_len= mp->m7_i3;
name_gid= mp->m7_i4;
name= pci_dev_name(vid, did);
if (name == NULL)
{
/* No name */
r= ENOENT;
}
else
{
len= strlen(name)+1;
if (len > name_len)
len= name_len;
r= sys_safecopyto(mp->m_source, name_gid, 0, (vir_bytes)name,
len, D);
}
mp->m_type= r;
r= send(mp->m_source, mp);
if (r != 0)
{
printf("do_dev_name: unable to send to %d: %d\n",
mp->m_source, r);
}
}
PRIVATE void do_slot_name(mp) PRIVATE void do_slot_name(mp)
message *mp; message *mp;
{ {
@ -266,6 +314,7 @@ message *mp;
len= strlen(name)+1; len= strlen(name)+1;
if (len > name_len) if (len > name_len)
len= name_len; len= name_len;
printf("pci`do_slot_name: calling do_vircopy\n");
r= sys_vircopy(SELF, D, (vir_bytes)name, mp->m_source, D, r= sys_vircopy(SELF, D, (vir_bytes)name, mp->m_source, D,
(vir_bytes)name_ptr, len); (vir_bytes)name_ptr, len);
@ -278,6 +327,33 @@ message *mp;
} }
} }
PRIVATE void do_slot_name_s(mp)
message *mp;
{
int r, devind, name_len, len;
cp_grant_id_t gid;
char *name;
devind= mp->m1_i1;
name_len= mp->m1_i2;
gid= mp->m1_i3;
name= pci_slot_name(devind);
len= strlen(name)+1;
if (len > name_len)
len= name_len;
r= sys_safecopyto(mp->m_source, gid, 0, (vir_bytes)name, len, D);
mp->m_type= r;
r= send(mp->m_source, mp);
if (r != 0)
{
printf("do_slot_name: unable to send to %d: %d\n",
mp->m_source, r);
}
}
PRIVATE void do_reserve(mp) PRIVATE void do_reserve(mp)
message *mp; message *mp;
{ {