@ -41,28 +41,20 @@ struct DeviceProperty {
DeviceProperty * next ;
} ;
struct DeviceType {
DeviceInfo * info ;
DeviceType * next ;
} ;
/* This is a nasty hack to allow passing a NULL bus to qdev_create. */
static BusState * main_system_bus ;
extern struct BusInfo system_bus_info ;
static DeviceType * device_type _list ;
static DeviceInfo * device_info_list ;
/* Register a new device type. */
void qdev_register ( DeviceInfo * info )
{
DeviceType * t ;
assert ( info - > size > = sizeof ( DeviceState ) ) ;
assert ( ! info - > next ) ;
t = qemu_mallocz ( sizeof ( DeviceType ) ) ;
t - > next = device_type_list ;
device_type_list = t ;
t - > info = info ;
info - > next = device_info_list ;
device_info_list = info ;
}
/* Create a new device. This only initializes the device state structure
@ -70,7 +62,7 @@ void qdev_register(DeviceInfo *info)
initialize the actual device emulation . */
DeviceState * qdev_create ( BusState * bus , const char * name )
{
DeviceType * t ;
DeviceInfo * info ;
DeviceState * dev ;
if ( ! bus ) {
@ -80,19 +72,19 @@ DeviceState *qdev_create(BusState *bus, const char *name)
bus = main_system_bus ;
}
for ( t = device_type_list ; t ; t = t - > next ) {
if ( t - > info - > bus_info ! = bus - > info )
for ( info = device_info_list ; info ! = NULL ; info = info - > next ) {
if ( info - > bus_info ! = bus - > info )
continue ;
if ( strcmp ( t - > info - > name , name ) ! = 0 )
if ( strcmp ( info - > name , name ) ! = 0 )
continue ;
break ;
}
if ( ! t ) {
if ( ! info ) {
hw_error ( " Unknown device '%s' for bus '%s' \n " , name , bus - > info - > name ) ;
}
dev = qemu_mallocz ( t - > info - > size ) ;
dev - > type = t ;
dev = qemu_mallocz ( info - > size ) ;
dev - > info = info ;
dev - > parent_bus = bus ;
LIST_INSERT_HEAD ( & bus - > children , dev , sibling ) ;
return dev ;
@ -103,7 +95,7 @@ DeviceState *qdev_create(BusState *bus, const char *name)
calling this function . */
void qdev_init ( DeviceState * dev )
{
dev - > type - > info - > init ( dev , dev - > type - > info ) ;
dev - > info - > init ( dev , dev - > info ) ;
}
/* Unlink device from bus and free the structure. */
@ -165,7 +157,7 @@ CharDriverState *qdev_init_chardev(DeviceState *dev)
static int next_serial ;
static int next_virtconsole ;
/* FIXME: This is a nasty hack that needs to go away. */
if ( strncmp ( dev - > type - > info - > name , " virtio " , 6 ) = = 0 ) {
if ( strncmp ( dev - > info - > name , " virtio " , 6 ) = = 0 ) {
return virtcon_hds [ next_virtconsole + + ] ;
} else {
return serial_hds [ next_serial + + ] ;
@ -338,7 +330,7 @@ static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
{
DeviceProperty * prop ;
BusState * child ;
qdev_printf ( " dev: %s \n " , dev - > type - > info - > name ) ;
qdev_printf ( " dev: %s \n " , dev - > info - > name ) ;
indent + = 2 ;
if ( dev - > num_gpio_in ) {
qdev_printf ( " gpio-in %d \n " , dev - > num_gpio_in ) ;
@ -357,7 +349,7 @@ static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
break ;
case PROP_TYPE_DEV :
qdev_printf ( " prop-dev %s %s \n " , prop - > name ,
( ( DeviceState * ) prop - > value . ptr ) - > type - > info - > name ) ;
( ( DeviceState * ) prop - > value . ptr ) - > info - > name ) ;
break ;
default :
qdev_printf ( " prop-unknown%d %s \n " , prop - > type , prop - > name ) ;