static device_instance * hw_pal_create_instance(device *me, const char *path, const char *args) { return device_create_instance_from(me, NULL, device_data(me), path, args, &hw_pal_instance_callbacks); }
static device_instance * hw_com_create_instance(device *me, const char *path, const char *args) { /* point an instance directly at the device */ return device_create_instance_from(me, NULL, device_data(me), path, args, &hw_com_instance_callbacks); }
static device_instance * hw_eeprom_create_instance(device *me, const char *path, const char *args) { hw_eeprom_device *eeprom = device_data(me); hw_eeprom_instance *data = ZALLOC(hw_eeprom_instance); data->eeprom = eeprom; data->me = me; return device_create_instance_from(me, NULL, data, path, args, &hw_eeprom_instance_callbacks); }
static device_instance * hw_disk_create_instance(device *me, const char *path, const char *args) { device_instance *instance; hw_disk_device *disk = device_data(me); hw_disk_instance *data = ZALLOC(hw_disk_instance); data->disk = disk; data->pos = 0; instance = device_create_instance_from(me, NULL, data, path, args, &hw_disk_instance_callbacks); DITRACE(disk, ("create - path=%s(%s) instance=%ld\n", path, args, (unsigned long)device_instance_to_external(instance))); return pk_disklabel_create_instance(instance, args); }
device_instance * pk_disklabel_create_instance(device_instance *raw_disk, const char *args) { int partition; char *filename; /* parse the arguments */ if (args == NULL) { partition = 0; filename = NULL; } else { partition = strtoul((char*)args, &filename, 0); if (filename == args) partition = -1; /* not specified */ if (*filename == ',') filename++; if (*filename == '\0') filename = NULL; /* easier */ } if (partition == 0) { /* select the raw disk */ return raw_disk; } else { unsigned8 boot_block[512]; /* get the boot block for examination */ if (device_instance_seek(raw_disk, 0, 0) < 0) device_error(device_instance_device(raw_disk), "Problem seeking on raw disk"); if (device_instance_read(raw_disk, &boot_block, sizeof(boot_block)) != sizeof(boot_block)) device_error(device_instance_device(raw_disk), "Problem reading boot block"); if (partition < 0) { /* select the active partition */ if (block0_is_bpb(boot_block)) { device_error(device_instance_device(raw_disk), "Unimplemented active BPB"); } else if (block0_is_fdisk(boot_block)) { int active = block0_is_fdisk(boot_block); device_error(device_instance_device(raw_disk), "Unimplemented active FDISK (%d)", active); } else if (is_iso9660(raw_disk)) { device_error(device_instance_device(raw_disk), "Unimplemented active ISO9660"); } else if (block0_is_mac_disk(boot_block)) { device_error(device_instance_device(raw_disk), "Unimplemented active MAC DISK"); } else { device_error(device_instance_device(raw_disk), "Unreconized bootblock"); } } else { /* select the specified disk partition */ if (block0_is_bpb(boot_block)) { device_error(device_instance_device(raw_disk), "Unimplemented BPB"); } else if (block0_is_fdisk(boot_block)) { /* return an instance */ ppcboot_partition_t *partition_table = (ppcboot_partition_t*) &boot_block[446]; ppcboot_partition_t *partition_entry; disklabel *label; if (partition > 4) device_error(device_instance_device(raw_disk), "Only FDISK partitions 1..4 supported"); partition_entry = &partition_table[partition - 1]; label = ZALLOC(disklabel); label->raw_disk = raw_disk; label->pos = 0; label->sector_begin = 512 * sector2uw(partition_entry->sector_begin); label->sector_length = 512 * sector2uw(partition_entry->sector_length); PTRACE(disklabel, ("partition %ld, sector-begin %ld, length %ld\n", (long)partition, (long)label->sector_begin, (long)label->sector_length)); if (filename != NULL) device_error(device_instance_device(raw_disk), "FDISK file names not yet supported"); return device_create_instance_from(NULL, raw_disk, label, NULL, args, &package_disklabel_callbacks); } else if (block0_is_mac_disk(boot_block)) { device_error(device_instance_device(raw_disk), "Unimplemented MAC DISK"); } else { device_error(device_instance_device(raw_disk), "Unreconized bootblock"); } } } return NULL; }