[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] rombios: add support for special CHS layout (spt=32)



>>> On 07.12.12 at 04:25, DuanZhenzhong <zhenzhong.duan@xxxxxxxxxx> wrote:
> When booting up windows VM which converted by dd scsi disk, it fails with
> "Error Loading Operating System", root cause is rombios doesn't simulate 
> disk's
> logical CHS properly. Real bios uses spt=32 here.
> 
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@xxxxxxxxxx>
> --- a/tools/firmware/rombios/rombios.c        2011-12-09 00:50:28.000000000 
> +0800
> +++ b/tools/firmware/rombios/rombios.c        2012-11-20 09:42:50.000000000 
> +0800
> @@ -2674,6 +2674,8 @@ void ata_detect( )
>        Bit32u sectors_low, sectors_high;
>        Bit16u cylinders, heads, spt, blksize;
>        Bit8u  translation, removable, mode;
> +      Bit8u i;
> +      Bit8u *p;
>  
>        // default mode to PIO16
>        mode = ATA_MODE_PIO16;
> @@ -2738,14 +2740,32 @@ void ata_detect( )
>          case ATA_TRANSLATION_NONE:
>            break;
>          case ATA_TRANSLATION_LBA:
> -          spt = 63;
> -          sectors_low /= 63;
> -          heads = sectors_low / 1024;
> -          if (heads>128) heads = 255;
> -          else if (heads>64) heads = 128;
> -          else if (heads>32) heads = 64;
> -          else if (heads>16) heads = 32;
> -          else heads=16;
> +          spt = heads = 0;
> +          if (ata_cmd_data_in(device,ATA_CMD_READ_SECTORS, 1, 0, 0, 1, 0L, 
> 0L, get_SS(),buffer) !=0 )
> +            BX_PANIC("ata-detect: Failed to read first sector\n");
> +          for(i=0; i<4; i++) {
> +            p = buffer + 0x1be + i * 16;
> +            if (read_dword(get_SS(), p+12) && read_byte(get_SS(), p+5)) {
> +              /* We make the assumption that the partition terminates on
> +                 a cylinder boundary */

Which certainly isn't a generally correct assumption, so I strongly
recommend against basing any decisions on that.

Jan

> +              heads = read_byte(get_SS(), p+5) + 1;
> +              spt = read_byte(get_SS(), p+6) & 63;
> +              if (spt != 0)
> +                break;
> +            }
> +          }
> +          if (spt == 32) {
> +            sectors_low /= spt;
> +          } else {
> +            spt = 63;
> +            sectors_low /= 63;
> +            heads = sectors_low / 1024;
> +            if (heads>128) heads = 255;
> +            else if (heads>64) heads = 128;
> +            else if (heads>32) heads = 64;
> +            else if (heads>16) heads = 32;
> +            else heads=16;
> +          }
>            cylinders = sectors_low / heads;
>            break;
>          case ATA_TRANSLATION_RECHS:
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx 
> http://lists.xen.org/xen-devel 




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.