void hd_geometry_guess(BlockDriverState *bs,

                       int *pcyls, int *pheads, int *psecs)

{

    int cylinders, heads, secs, translation;



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

    translation = bdrv_get_translation_hint(bs);



    if (cylinders != 0) {

        /* already got a geometry hint: use it */

        *pcyls = cylinders;

        *pheads = heads;

        *psecs = secs;

        return;

    }



    if (guess_disk_lchs(bs, &cylinders, &heads, &secs) < 0) {

        /* no LCHS guess: use a standard physical disk geometry  */

        guess_chs_for_size(bs, pcyls, pheads, psecs);

    } else if (heads > 16) {

        /* LCHS guess with heads > 16 means that a BIOS LBA

           translation was active, so a standard physical disk

           geometry is OK */

        guess_chs_for_size(bs, pcyls, pheads, psecs);

        if (translation == BIOS_ATA_TRANSLATION_AUTO) {

            bdrv_set_translation_hint(bs,

                                      *pcyls * *pheads <= 131072

                                      ? BIOS_ATA_TRANSLATION_LARGE

                                      : BIOS_ATA_TRANSLATION_LBA);

        }

    } else {

        /* LCHS guess with heads <= 16: use as physical geometry */

        *pcyls = cylinders;

        *pheads = heads;

        *psecs = secs;

        /* disable any translation to be in sync with

           the logical geometry */

        if (translation == BIOS_ATA_TRANSLATION_AUTO) {

            bdrv_set_translation_hint(bs,

                                      BIOS_ATA_TRANSLATION_NONE);

        }

    }

    bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs);

    trace_hd_geometry_guess(bs, *pcyls, *pheads, *psecs, translation);

}

void hd_geometry_guess(BlockDriverState *bs,

                       int *pcyls, int *pheads, int *psecs)

{

    int cylinders, heads, secs, translation;



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

    translation = bdrv_get_translation_hint(bs);



    if (cylinders != 0) {

        

        *pcyls = cylinders;

        *pheads = heads;

        *psecs = secs;

        return;

    }



    if (guess_disk_lchs(bs, &cylinders, &heads, &secs) < 0) {

        

        guess_chs_for_size(bs, pcyls, pheads, psecs);

    } else if (heads > 16) {

        





        guess_chs_for_size(bs, pcyls, pheads, psecs);

        if (translation == BIOS_ATA_TRANSLATION_AUTO) {

            bdrv_set_translation_hint(bs,

                                      *pcyls * *pheads <= 131072

                                      ? BIOS_ATA_TRANSLATION_LARGE

                                      : BIOS_ATA_TRANSLATION_LBA);

        }

    } else {

        

        *pcyls = cylinders;

        *pheads = heads;

        *psecs = secs;

        



        if (translation == BIOS_ATA_TRANSLATION_AUTO) {

            bdrv_set_translation_hint(bs,

                                      BIOS_ATA_TRANSLATION_NONE);

        }

    }

    bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs);

    trace_hd_geometry_guess(bs, *pcyls, *pheads, *psecs, translation);

}

void FUNC_0(BlockDriverState *VAR_0,

                       int *VAR_1, int *VAR_2, int *VAR_3)

{

    int VAR_4, VAR_5, VAR_6, VAR_7;



    bdrv_get_geometry_hint(VAR_0, &VAR_4, &VAR_5, &VAR_6);

    VAR_7 = bdrv_get_translation_hint(VAR_0);



    if (VAR_4 != 0) {

        

        *VAR_1 = VAR_4;

        *VAR_2 = VAR_5;

        *VAR_3 = VAR_6;

        return;

    }



    if (guess_disk_lchs(VAR_0, &VAR_4, &VAR_5, &VAR_6) < 0) {

        

        guess_chs_for_size(VAR_0, VAR_1, VAR_2, VAR_3);

    } else if (VAR_5 > 16) {

        





        guess_chs_for_size(VAR_0, VAR_1, VAR_2, VAR_3);

        if (VAR_7 == BIOS_ATA_TRANSLATION_AUTO) {

            bdrv_set_translation_hint(VAR_0,

                                      *VAR_1 * *VAR_2 <= 131072

                                      ? BIOS_ATA_TRANSLATION_LARGE

                                      : BIOS_ATA_TRANSLATION_LBA);

        }

    } else {

        

        *VAR_1 = VAR_4;

        *VAR_2 = VAR_5;

        *VAR_3 = VAR_6;

        



        if (VAR_7 == BIOS_ATA_TRANSLATION_AUTO) {

            bdrv_set_translation_hint(VAR_0,

                                      BIOS_ATA_TRANSLATION_NONE);

        }

    }

    bdrv_set_geometry_hint(VAR_0, *VAR_1, *VAR_2, *VAR_3);

    trace_hd_geometry_guess(VAR_0, *VAR_1, *VAR_2, *VAR_3, VAR_7);

}

void FUNC_0(BlockDriverState *VAR_0,
int *VAR_1, int *VAR_2, int *VAR_3)
{ int VAR_4, VAR_5, VAR_6, VAR_7; bdrv_get_geometry_hint(VAR_0, &VAR_4, &VAR_5, &VAR_6); VAR_7 = bdrv_get_translation_hint(VAR_0); if (VAR_4 != 0) { *VAR_1 = VAR_4; *VAR_2 = VAR_5; *VAR_3 = VAR_6; return; } if (guess_disk_lchs(VAR_0, &VAR_4, &VAR_5, &VAR_6) < 0) { guess_chs_for_size(VAR_0, VAR_1, VAR_2, VAR_3); } else if (VAR_5 > 16) { guess_chs_for_size(VAR_0, VAR_1, VAR_2, VAR_3); if (VAR_7 == BIOS_ATA_TRANSLATION_AUTO) { bdrv_set_translation_hint(VAR_0,
*VAR_1 * *VAR_2 <= 131072
? BIOS_ATA_TRANSLATION_LARGE
: BIOS_ATA_TRANSLATION_LBA); } } else { *VAR_1 = VAR_4; *VAR_2 = VAR_5; *VAR_3 = VAR_6; if (VAR_7 == BIOS_ATA_TRANSLATION_AUTO) { bdrv_set_translation_hint(VAR_0,
BIOS_ATA_TRANSLATION_NONE); } } bdrv_set_geometry_hint(VAR_0, *VAR_1, *VAR_2, *VAR_3); trace_hd_geometry_guess(VAR_0, *VAR_1, *VAR_2, *VAR_3, VAR_7); }