int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,

                   const char *version, const char *serial, const char *model,

                   uint64_t wwn)

{

    int cylinders, heads, secs;

    uint64_t nb_sectors;



    s->bs = bs;

    s->drive_kind = kind;



    bdrv_get_geometry(bs, &nb_sectors);

    bdrv_guess_geometry(bs, &cylinders, &heads, &secs);

    if (cylinders < 1 || cylinders > 16383) {

        error_report("cyls must be between 1 and 16383");

        return -1;

    }

    if (heads < 1 || heads > 16) {

        error_report("heads must be between 1 and 16");

        return -1;

    }

    if (secs < 1 || secs > 63) {

        error_report("secs must be between 1 and 63");

        return -1;

    }

    s->cylinders = cylinders;

    s->heads = heads;

    s->sectors = secs;

    s->nb_sectors = nb_sectors;

    s->wwn = wwn;

    /* The SMART values should be preserved across power cycles

       but they aren't.  */

    s->smart_enabled = 1;

    s->smart_autosave = 1;

    s->smart_errors = 0;

    s->smart_selftest_count = 0;

    if (kind == IDE_CD) {

        bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);

        bdrv_set_buffer_alignment(bs, 2048);

    } else {

        if (!bdrv_is_inserted(s->bs)) {

            error_report("Device needs media, but drive is empty");

            return -1;

        }

        if (bdrv_is_read_only(bs)) {

            error_report("Can't use a read-only drive");

            return -1;

        }

    }

    if (serial) {

        pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);

    } else {

        snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),

                 "QM%05d", s->drive_serial);

    }

    if (model) {

        pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model);

    } else {

        switch (kind) {

        case IDE_CD:

            strcpy(s->drive_model_str, "QEMU DVD-ROM");

            break;

        case IDE_CFATA:

            strcpy(s->drive_model_str, "QEMU MICRODRIVE");

            break;

        default:

            strcpy(s->drive_model_str, "QEMU HARDDISK");

            break;

        }

    }



    if (version) {

        pstrcpy(s->version, sizeof(s->version), version);

    } else {

        pstrcpy(s->version, sizeof(s->version), qemu_get_version());

    }



    ide_reset(s);

    bdrv_iostatus_enable(bs);

    return 0;

}

int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,

                   const char *version, const char *serial, const char *model,

                   uint64_t wwn)

{

    int cylinders, heads, secs;

    uint64_t nb_sectors;



    s->bs = bs;

    s->drive_kind = kind;



    bdrv_get_geometry(bs, &nb_sectors);

    bdrv_guess_geometry(bs, &cylinders, &heads, &secs);

    if (cylinders < 1 || cylinders > 16383) {

        error_report("cyls must be between 1 and 16383");

        return -1;

    }

    if (heads < 1 || heads > 16) {

        error_report("heads must be between 1 and 16");

        return -1;

    }

    if (secs < 1 || secs > 63) {

        error_report("secs must be between 1 and 63");

        return -1;

    }

    s->cylinders = cylinders;

    s->heads = heads;

    s->sectors = secs;

    s->nb_sectors = nb_sectors;

    s->wwn = wwn;

    



    s->smart_enabled = 1;

    s->smart_autosave = 1;

    s->smart_errors = 0;

    s->smart_selftest_count = 0;

    if (kind == IDE_CD) {

        bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);

        bdrv_set_buffer_alignment(bs, 2048);

    } else {

        if (!bdrv_is_inserted(s->bs)) {

            error_report("Device needs media, but drive is empty");

            return -1;

        }

        if (bdrv_is_read_only(bs)) {

            error_report("Can't use a read-only drive");

            return -1;

        }

    }

    if (serial) {

        pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);

    } else {

        snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),

                 "QM%05d", s->drive_serial);

    }

    if (model) {

        pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model);

    } else {

        switch (kind) {

        case IDE_CD:

            strcpy(s->drive_model_str, "QEMU DVD-ROM");

            break;

        case IDE_CFATA:

            strcpy(s->drive_model_str, "QEMU MICRODRIVE");

            break;

        default:

            strcpy(s->drive_model_str, "QEMU HARDDISK");

            break;

        }

    }



    if (version) {

        pstrcpy(s->version, sizeof(s->version), version);

    } else {

        pstrcpy(s->version, sizeof(s->version), qemu_get_version());

    }



    ide_reset(s);

    bdrv_iostatus_enable(bs);

    return 0;

}

int FUNC_0(IDEState *VAR_0, BlockDriverState *VAR_1, IDEDriveKind VAR_2,

                   const char *VAR_3, const char *VAR_4, const char *VAR_5,

                   uint64_t VAR_6)

{

    int VAR_7, VAR_8, VAR_9;

    uint64_t nb_sectors;



    VAR_0->VAR_1 = VAR_1;

    VAR_0->drive_kind = VAR_2;



    bdrv_get_geometry(VAR_1, &nb_sectors);

    bdrv_guess_geometry(VAR_1, &VAR_7, &VAR_8, &VAR_9);

    if (VAR_7 < 1 || VAR_7 > 16383) {

        error_report("cyls must be between 1 and 16383");

        return -1;

    }

    if (VAR_8 < 1 || VAR_8 > 16) {

        error_report("VAR_8 must be between 1 and 16");

        return -1;

    }

    if (VAR_9 < 1 || VAR_9 > 63) {

        error_report("VAR_9 must be between 1 and 63");

        return -1;

    }

    VAR_0->VAR_7 = VAR_7;

    VAR_0->VAR_8 = VAR_8;

    VAR_0->sectors = VAR_9;

    VAR_0->nb_sectors = nb_sectors;

    VAR_0->VAR_6 = VAR_6;

    



    VAR_0->smart_enabled = 1;

    VAR_0->smart_autosave = 1;

    VAR_0->smart_errors = 0;

    VAR_0->smart_selftest_count = 0;

    if (VAR_2 == IDE_CD) {

        bdrv_set_dev_ops(VAR_1, &ide_cd_block_ops, VAR_0);

        bdrv_set_buffer_alignment(VAR_1, 2048);

    } else {

        if (!bdrv_is_inserted(VAR_0->VAR_1)) {

            error_report("Device needs media, but drive is empty");

            return -1;

        }

        if (bdrv_is_read_only(VAR_1)) {

            error_report("Can't use a read-only drive");

            return -1;

        }

    }

    if (VAR_4) {

        pstrcpy(VAR_0->drive_serial_str, sizeof(VAR_0->drive_serial_str), VAR_4);

    } else {

        snprintf(VAR_0->drive_serial_str, sizeof(VAR_0->drive_serial_str),

                 "QM%05d", VAR_0->drive_serial);

    }

    if (VAR_5) {

        pstrcpy(VAR_0->drive_model_str, sizeof(VAR_0->drive_model_str), VAR_5);

    } else {

        switch (VAR_2) {

        case IDE_CD:

            strcpy(VAR_0->drive_model_str, "QEMU DVD-ROM");

            break;

        case IDE_CFATA:

            strcpy(VAR_0->drive_model_str, "QEMU MICRODRIVE");

            break;

        default:

            strcpy(VAR_0->drive_model_str, "QEMU HARDDISK");

            break;

        }

    }



    if (VAR_3) {

        pstrcpy(VAR_0->VAR_3, sizeof(VAR_0->VAR_3), VAR_3);

    } else {

        pstrcpy(VAR_0->VAR_3, sizeof(VAR_0->VAR_3), qemu_get_version());

    }



    ide_reset(VAR_0);

    bdrv_iostatus_enable(VAR_1);

    return 0;

}

int FUNC_0(IDEState *VAR_0, BlockDriverState *VAR_1, IDEDriveKind VAR_2,
const char *VAR_3, const char *VAR_4, const char *VAR_5,
uint64_t VAR_6)
{ int VAR_7, VAR_8, VAR_9; uint64_t nb_sectors; VAR_0->VAR_1 = VAR_1; VAR_0->drive_kind = VAR_2; bdrv_get_geometry(VAR_1, &nb_sectors); bdrv_guess_geometry(VAR_1, &VAR_7, &VAR_8, &VAR_9); if (VAR_7 < 1 || VAR_7 > 16383) { error_report("cyls must be between 1 and 16383"); return -1; } if (VAR_8 < 1 || VAR_8 > 16) { error_report("VAR_8 must be between 1 and 16"); return -1; } if (VAR_9 < 1 || VAR_9 > 63) { error_report("VAR_9 must be between 1 and 63"); return -1; } VAR_0->VAR_7 = VAR_7; VAR_0->VAR_8 = VAR_8; VAR_0->sectors = VAR_9; VAR_0->nb_sectors = nb_sectors; VAR_0->VAR_6 = VAR_6; VAR_0->smart_enabled = 1; VAR_0->smart_autosave = 1; VAR_0->smart_errors = 0; VAR_0->smart_selftest_count = 0; if (VAR_2 == IDE_CD) { bdrv_set_dev_ops(VAR_1, &ide_cd_block_ops, VAR_0); bdrv_set_buffer_alignment(VAR_1, 2048); } else { if (!bdrv_is_inserted(VAR_0->VAR_1)) { error_report("Device needs media, but drive is empty"); return -1; } if (bdrv_is_read_only(VAR_1)) { error_report("Can't use a read-only drive"); return -1; } } if (VAR_4) { pstrcpy(VAR_0->drive_serial_str, sizeof(VAR_0->drive_serial_str), VAR_4); } else { snprintf(VAR_0->drive_serial_str, sizeof(VAR_0->drive_serial_str),
"QM%05d", VAR_0->drive_serial); } if (VAR_5) { pstrcpy(VAR_0->drive_model_str, sizeof(VAR_0->drive_model_str), VAR_5); } else { switch (VAR_2) { case IDE_CD:
strcpy(VAR_0->drive_model_str, "QEMU DVD-ROM"); break; case IDE_CFATA:
strcpy(VAR_0->drive_model_str, "QEMU MICRODRIVE"); break; default:
strcpy(VAR_0->drive_model_str, "QEMU HARDDISK"); break; } } if (VAR_3) { pstrcpy(VAR_0->VAR_3, sizeof(VAR_0->VAR_3), VAR_3); } else { pstrcpy(VAR_0->VAR_3, sizeof(VAR_0->VAR_3), qemu_get_version()); } ide_reset(VAR_0); bdrv_iostatus_enable(VAR_1); return 0; }