Esempio n. 1
0
void show_disk(struct s_hardware *hardware, ZZJSON_CONFIG *conf, ZZJSON **it, int drive) {
	config=conf;
	item=it;
	int i = drive - 0x80;
	struct driveinfo *d = &hardware->disk_info[i];
	char mbr_name[50]={0};
	char disk_size[11]={0};

	get_mbr_string(hardware->mbr_ids[i], &mbr_name,sizeof(mbr_name));
	if ((int)d->edd_params.sectors > 0)
		sectors_to_size((int)d->edd_params.sectors, disk_size);

	char disk[5]={0};
	char edd_version[5]={0};
	snprintf(disk,sizeof(disk),"0x%X",d->disk);
	snprintf(edd_version,sizeof(edd_version),"%X",d->edd_version);
	zzjson_print(config, *item);
	zzjson_free(config, *item);

	CREATE_ARRAY
		add_as("disk->number",disk) 
		add_ai("disk->cylinders",d->legacy_max_cylinder +1) 
		add_ai("disk->heads",d->legacy_max_head +1)
		add_ai("disk->sectors_per_track",d->legacy_sectors_per_track)
		add_as("disk->edd_version",edd_version)
		add_as("disk->size",disk_size)
		add_ai("disk->bytes_per_sector",(int)d->edd_params.bytes_per_sector)
		add_ai("disk->sectors_per_track",(int)d->edd_params.sectors_per_track)
		add_as("disk->host_bus",remove_spaces((char *)d->edd_params.host_bus_type))
		add_as("disk->interface_type",remove_spaces((char *)d->edd_params.interface_type))
		add_as("disk->mbr_name",mbr_name)
		add_ai("disk->mbr_id",hardware->mbr_ids[i])
	END_OF_ARRAY;

	if (parse_partition_table(d, &show_partition_information)) {
	        if (errno_disk) { 
			APPEND_ARRAY
				add_as("disk->error", "IO Error")
			END_OF_APPEND;
		} else  {
			APPEND_ARRAY
				add_as("disk->error", "Unrecognized Partition Layout")
			END_OF_APPEND;
		}
	}
}
Esempio n. 2
0
void main_show_disk(int argc, char **argv, struct s_hardware *hardware)
{
    if (!argc) {
	more_printf("Which disk?\n");
	return;
    }

    int drive = strtol(argv[0], (char **)NULL, 16);

    if (drive < 0x80 || drive >= 0xff) {
	more_printf("Invalid disk: %d.\n", drive);
	return;
    }

    int i = drive - 0x80;
    struct driveinfo *d = &hardware->disk_info[i];
    char disk_size[11];
    char mbr_name[50];

    reset_more_printf();

    if (!hardware->disk_info[i].cbios) {
	more_printf("No disk found\n");
	return;			/* Invalid geometry */
    }

    get_mbr_string(hardware->mbr_ids[i], &mbr_name, 50);

    if ((int)d->edd_params.sectors > 0)
	sectors_to_size((int)d->edd_params.sectors, disk_size);
    else
	memset(disk_size, 0, sizeof disk_size);

    more_printf("DISK 0x%X:\n"
		"  C/H/S: %d cylinders, %d heads, %d sectors/track\n"
		"    EDD: Version: %X\n"
		"         Size: %s, %d bytes/sector, %d sectors/track\n"
		"         Host bus: %s, Interface type: %s\n"
		"    MBR: %s (id 0x%X)\n\n",
		d->disk,
		d->legacy_max_cylinder + 1, d->legacy_max_head + 1,
		d->legacy_sectors_per_track, d->edd_version, disk_size,
		(int)d->edd_params.bytes_per_sector,
		(int)d->edd_params.sectors_per_track,
		remove_spaces((char *)d->edd_params.host_bus_type),
		remove_spaces((char *)d->edd_params.interface_type), mbr_name,
		hardware->mbr_ids[i]);
    display_line_nb += 6;

    if (parse_partition_table(d, &show_partition_information)) {
	if (errno_disk) {
	    fprintf(stderr, "I/O error parsing disk 0x%X\n", d->disk);
	    get_error("parse_partition_table");
	} else {
	    fprintf(stderr, "Disk 0x%X: unrecognized partition layout\n",
		    d->disk);
	}
	fprintf(stderr, "\n");
    }

    more_printf("\n");
}
Esempio n. 3
0
static int ata_port_init(struct ata_port *port)
{
	int rc;
	struct ata_port_operations *ops = port->ops;
	struct device_d *dev = &port->class_dev;

	if (ops->init) {
		rc = ops->init(port);
		if (rc)
			return rc;
	}

	port->id = dma_alloc(SECTOR_SIZE);

	port->blk.dev = dev;
	port->blk.ops = &ata_ops;

	if (ops->reset) {
		rc = ops->reset(port);
		if (rc) {
			dev_dbg(dev, "Resetting failed\n");
			goto on_error;
		}
	}

	rc = ops->read_id(port, port->id);
	if (rc != 0) {
		dev_dbg(dev, "Reading ID failed\n");
		goto on_error;
	}

	ata_fix_endianess(port->id, SECTOR_SIZE / sizeof(uint16_t));

	rc = ata_id_is_valid(port->id);
	if (rc) {
		dev_err(dev, "ata id invalid\n");
		free(port->id);
		return rc;
	}

#ifdef DEBUG
	ata_dump_id(port->id);
#endif
	rc = cdev_find_free_index("ata");
	if (rc == -1)
		pr_err("Cannot find a free index for the disk node\n");

	port->blk.num_blocks = ata_id_n_sectors(port->id);
	port->blk.cdev.name = asprintf("ata%d", rc);
	port->blk.blockbits = SECTOR_SHIFT;

	rc = blockdevice_register(&port->blk);
	if (rc != 0) {
		dev_err(dev, "Failed to register blockdevice\n");
		goto on_error;
	}

	dev_info(dev, "registered /dev/%s\n", port->blk.cdev.name);

	/* create partitions on demand */
	rc = parse_partition_table(&port->blk);
	if (rc != 0)
		dev_warn(dev, "No partition table found\n");

	return 0;

on_error:
	return rc;
}