@ -424,15 +424,18 @@ static void pci_set_default_subsystem_id(PCIDevice *pci_dev)
}
/*
* Parse [ [ < domain > : ] < bus > : ] < slot > , return - 1 on error
* Parse [ [ < domain > : ] < bus > : ] < slot > , return - 1 on error if funcp = = NULL
* [ [ < domain > : ] < bus > : ] < slot > . < func > , return - 1 on error
*/
static int pci_parse_devaddr ( const char * addr , int * domp , int * busp , unsigned * slotp )
int pci_parse_devaddr ( const char * addr , int * domp , int * busp ,
unsigned int * slotp , unsigned int * funcp )
{
const char * p ;
char * e ;
unsigned long val ;
unsigned long dom = 0 , bus = 0 ;
unsigned slot = 0 ;
unsigned int slot = 0 ;
unsigned int func = 0 ;
p = addr ;
val = strtoul ( p , & e , 16 ) ;
@ -454,11 +457,24 @@ static int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned *s
}
}
if ( dom > 0xffff | | bus > 0xff | | val > 0x1f )
return - 1 ;
slot = val ;
if ( funcp ! = NULL ) {
if ( * e ! = ' . ' )
return - 1 ;
p = e + 1 ;
val = strtoul ( p , & e , 16 ) ;
if ( e = = p )
return - 1 ;
func = val ;
}
/* if funcp == NULL func is 0 */
if ( dom > 0xffff | | bus > 0xff | | slot > 0x1f | | func > 7 )
return - 1 ;
if ( * e )
return - 1 ;
@ -469,6 +485,8 @@ static int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned *s
* domp = dom ;
* busp = bus ;
* slotp = slot ;
if ( funcp ! = NULL )
* funcp = func ;
return 0 ;
}
@ -479,7 +497,7 @@ int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
if ( ! strncmp ( addr , " pci_addr= " , 9 ) ) {
addr + = 9 ;
}
if ( pci_parse_devaddr ( addr , domp , busp , slotp ) ) {
if ( pci_parse_devaddr ( addr , domp , busp , slotp , NULL ) ) {
monitor_printf ( mon , " Invalid pci address \n " ) ;
return - 1 ;
}
@ -496,7 +514,7 @@ PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
return pci_find_bus ( pci_find_root_bus ( 0 ) , 0 ) ;
}
if ( pci_parse_devaddr ( devaddr , & dom , & bus , & slot ) < 0 ) {
if ( pci_parse_devaddr ( devaddr , & dom , & bus , & slot , NULL ) < 0 ) {
return NULL ;
}