X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=disk%2Fpart_dos.c;h=887b75ec8874fb409d08e2c13098fcd3cba9806c;hb=944a4894c047f9fc17d21f1e4ca92d5909b8405b;hp=d585b357083c5f4a5ae58b5f5b86fb5697c9571f;hpb=8bde7f776c77b343aca29b8c7b58464d915ac245;p=u-boot diff --git a/disk/part_dos.c b/disk/part_dos.c index d585b35708..887b75ec88 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -33,10 +33,15 @@ #include #include #include -#include #include "part_dos.h" -#if ((CONFIG_COMMANDS & CFG_CMD_IDE) || (CONFIG_COMMANDS & CFG_CMD_SCSI)) && defined(CONFIG_DOS_PARTITION) +#if defined(CONFIG_CMD_IDE) || \ + defined(CONFIG_CMD_MG_DISK) || \ + defined(CONFIG_CMD_SATA) || \ + defined(CONFIG_CMD_SCSI) || \ + defined(CONFIG_CMD_USB) || \ + defined(CONFIG_MMC) || \ + defined(CONFIG_SYSTEMACE) /* Convert char[4] in little endian format to the host format integer */ @@ -66,6 +71,17 @@ static void print_one_part (dos_partition_t *p, int ext_part_sector, int part_nu (is_extended (p->sys_ind) ? " Extd" : "")); } +static int test_block_type(unsigned char *buffer) +{ + if((buffer[DOS_PART_MAGIC_OFFSET + 0] != 0x55) || + (buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) ) { + return (-1); + } /* no DOS Signature at all */ + if(strncmp((char *)&buffer[DOS_PBR_FSTYPE_OFFSET],"FAT",3)==0) + return DOS_PBR; /* is PBR */ + return DOS_MBR; /* Is MBR */ +} + int test_part_dos (block_dev_desc_t *dev_desc) { @@ -93,14 +109,18 @@ static void print_partition_extended (block_dev_desc_t *dev_desc, int ext_part_s dev_desc->dev, ext_part_sector); return; } - if (buffer[DOS_PART_MAGIC_OFFSET] != 0x55 || - buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) { + i=test_block_type(buffer); + if(i==-1) { printf ("bad MBR sector signature 0x%02x%02x\n", buffer[DOS_PART_MAGIC_OFFSET], buffer[DOS_PART_MAGIC_OFFSET + 1]); return; } - + if(i==DOS_PBR) { + printf (" 1\t\t 0\t%10ld\t%2x\n", + dev_desc->lba, buffer[DOS_PBR_MEDIA_TYPE_OFFSET]); + return; + } /* Print all primary/logical partitions */ pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET); for (i = 0; i < 4; i++, pt++) { @@ -168,7 +188,8 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part * fdisk does not show the extended partitions that * are not in the MBR */ - if ((pt->sys_ind != 0) && + if (((pt->boot_ind & ~0x80) == 0) && + (pt->sys_ind != 0) && (part_num == which_part) && (is_extended(pt->sys_ind) == 0)) { info->blksz = 512; @@ -176,24 +197,30 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part info->size = le32_to_int (pt->size4); switch(dev_desc->if_type) { case IF_TYPE_IDE: + case IF_TYPE_SATA: case IF_TYPE_ATAPI: - sprintf (info->name, "hd%c%d\n", 'a' + dev_desc->dev, part_num); + sprintf ((char *)info->name, "hd%c%d", + 'a' + dev_desc->dev, part_num); break; case IF_TYPE_SCSI: - sprintf (info->name, "sd%c%d\n", 'a' + dev_desc->dev, part_num); + sprintf ((char *)info->name, "sd%c%d", + 'a' + dev_desc->dev, part_num); break; case IF_TYPE_USB: - sprintf (info->name, "usbd%c%d\n", 'a' + dev_desc->dev, part_num); + sprintf ((char *)info->name, "usbd%c%d", + 'a' + dev_desc->dev, part_num); break; case IF_TYPE_DOC: - sprintf (info->name, "docd%c%d\n", 'a' + dev_desc->dev, part_num); + sprintf ((char *)info->name, "docd%c%d", + 'a' + dev_desc->dev, part_num); break; default: - sprintf (info->name, "xx%c%d\n", 'a' + dev_desc->dev, part_num); + sprintf ((char *)info->name, "xx%c%d", + 'a' + dev_desc->dev, part_num); break; } /* sprintf(info->type, "%d, pt->sys_ind); */ - sprintf (info->type, "U-Boot"); + sprintf ((char *)info->type, "U-Boot"); return 0; } @@ -230,4 +257,4 @@ int get_partition_info_dos (block_dev_desc_t *dev_desc, int part, disk_partition } -#endif /* (CONFIG_COMMANDS & CFG_CMD_IDE) && CONFIG_DOS_PARTITION */ +#endif