All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] Fix wrap around bug in MBR sector counts
@ 2015-11-25 17:08 Stefan Monnier
  2015-11-25 17:08 ` [U-Boot] [PATCH] Don't wrap to negative after 2G sectors Stefan Monnier
  0 siblings, 1 reply; 3+ messages in thread
From: Stefan Monnier @ 2015-11-25 17:08 UTC (permalink / raw)
  To: u-boot

I just bumped into a problem where U-Boot refused to boot from my disk's
second partition because the sector number is "negative".

More specifically, my disk drive is 2TB, which means that the number of
512B blocks fits into an unsigned 32bit int but not into a signed 32bit
int. U-boot's "scsi part" displays the size (in blocks) correctly, but
the size of the first partition (which is around 1.8TB) is printed as
a negative number, and so is the start sector of the second partition.

This was tested on a BananaPi using v2015-07.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [U-Boot] [PATCH] Don't wrap to negative after 2G sectors
  2015-11-25 17:08 [U-Boot] Fix wrap around bug in MBR sector counts Stefan Monnier
@ 2015-11-25 17:08 ` Stefan Monnier
  2016-01-12 15:29   ` Stefan Monnier
  0 siblings, 1 reply; 3+ messages in thread
From: Stefan Monnier @ 2015-11-25 17:08 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Stefan Monnier <monnier@iro.umontreal.ca>
---
 disk/part_dos.c | 29 +++++++++++++++++------------
 include/ide.h   |  8 ++++----
 2 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/disk/part_dos.c b/disk/part_dos.c
index 89263d3..6280660 100644
--- a/disk/part_dos.c
+++ b/disk/part_dos.c
@@ -26,7 +26,7 @@
 
 /* Convert char[4] in little endian format to the host format integer
  */
-static inline int le32_to_int(unsigned char *le32)
+static inline unsigned int le32_to_int(unsigned char *le32)
 {
     return ((le32[3] << 24) +
 	    (le32[2] << 16) +
@@ -47,13 +47,14 @@ static inline int is_bootable(dos_partition_t *p)
 	return p->boot_ind == 0x80;
 }
 
-static void print_one_part(dos_partition_t *p, int ext_part_sector,
+static void print_one_part(dos_partition_t *p, lbaint_t ext_part_sector,
 			   int part_num, unsigned int disksig)
 {
-	int lba_start = ext_part_sector + le32_to_int (p->start4);
-	int lba_size  = le32_to_int (p->size4);
+	lbaint_t lba_start = ext_part_sector + le32_to_int (p->start4);
+	lbaint_t lba_size  = le32_to_int (p->size4);
 
-	printf("%3d\t%-10d\t%-10d\t%08x-%02x\t%02x%s%s\n",
+	printf("%3d\t%-10" LBAFlength "u\t%-10" LBAFlength
+		"u\t%08x-%02x\t%02x%s%s\n",
 		part_num, lba_start, lba_size, disksig, part_num, p->sys_ind,
 		(is_extended(p->sys_ind) ? " Extd" : ""),
 		(is_bootable(p) ? " Boot" : ""));
@@ -102,7 +103,8 @@ int test_part_dos (block_dev_desc_t *dev_desc)
 /*  Print a partition that is relative to its Extended partition table
  */
 static void print_partition_extended(block_dev_desc_t *dev_desc,
-				     int ext_part_sector, int relative,
+				     lbaint_t ext_part_sector,
+				     lbaint_t relative,
 				     int part_num, unsigned int disksig)
 {
 	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz);
@@ -110,7 +112,7 @@ static void print_partition_extended(block_dev_desc_t *dev_desc,
 	int i;
 
 	if (dev_desc->block_read(dev_desc->dev, ext_part_sector, 1, (ulong *) buffer) != 1) {
-		printf ("** Can't read partition table on %d:%d **\n",
+		printf ("** Can't read partition table on %d:" LBAFU " **\n",
 			dev_desc->dev, ext_part_sector);
 		return;
 	}
@@ -149,7 +151,8 @@ static void print_partition_extended(block_dev_desc_t *dev_desc,
 	pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET);
 	for (i = 0; i < 4; i++, pt++) {
 		if (is_extended (pt->sys_ind)) {
-			int lba_start = le32_to_int (pt->start4) + relative;
+			lbaint_t lba_start
+				= le32_to_int (pt->start4) + relative;
 
 			print_partition_extended(dev_desc, lba_start,
 				ext_part_sector == 0  ? lba_start : relative,
@@ -163,8 +166,9 @@ static void print_partition_extended(block_dev_desc_t *dev_desc,
 
 /*  Print a partition that is relative to its Extended partition table
  */
-static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part_sector,
-				 int relative, int part_num,
+static int get_partition_info_extended (block_dev_desc_t *dev_desc,
+				 lbaint_t ext_part_sector,
+				 lbaint_t relative, int part_num,
 				 int which_part, disk_partition_t *info,
 				 unsigned int disksig)
 {
@@ -174,7 +178,7 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part
 	int dos_type;
 
 	if (dev_desc->block_read (dev_desc->dev, ext_part_sector, 1, (ulong *) buffer) != 1) {
-		printf ("** Can't read partition table on %d:%d **\n",
+		printf ("** Can't read partition table on %d:" LBAFU " **\n",
 			dev_desc->dev, ext_part_sector);
 		return -1;
 	}
@@ -250,7 +254,8 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part
 	pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET);
 	for (i = 0; i < 4; i++, pt++) {
 		if (is_extended (pt->sys_ind)) {
-			int lba_start = le32_to_int (pt->start4) + relative;
+			lbaint_t lba_start
+				= le32_to_int (pt->start4) + relative;
 
 			return get_partition_info_extended (dev_desc, lba_start,
 				 ext_part_sector == 0 ? lba_start : relative,
diff --git a/include/ide.h b/include/ide.h
index d5e05e9..f9b43cb 100644
--- a/include/ide.h
+++ b/include/ide.h
@@ -28,13 +28,13 @@ void ide_led(uchar led, uchar status);
 
 #ifdef CONFIG_SYS_64BIT_LBA
 typedef uint64_t lbaint_t;
-#define LBAF "%llx"
-#define LBAFU "%llu"
+#define LBAFlength "ll"
 #else
 typedef ulong lbaint_t;
-#define LBAF "%lx"
-#define LBAFU "%lu"
+#define LBAFlength "l"
 #endif
+#define LBAF "%" LBAFlength "x"
+#define LBAFU "%" LBAFlength "u"
 
 /*
  * Function Prototypes
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [U-Boot] [PATCH] Don't wrap to negative after 2G sectors
  2015-11-25 17:08 ` [U-Boot] [PATCH] Don't wrap to negative after 2G sectors Stefan Monnier
@ 2016-01-12 15:29   ` Stefan Monnier
  0 siblings, 0 replies; 3+ messages in thread
From: Stefan Monnier @ 2016-01-12 15:29 UTC (permalink / raw)
  To: u-boot

Ping yet again!?


        Stefan

>>>>> "Stefan" == Stefan Monnier <monnier@iro.umontreal.ca> writes:

> Signed-off-by: Stefan Monnier <monnier@iro.umontreal.ca>
> ---
>  disk/part_dos.c | 29 +++++++++++++++++------------
>  include/ide.h   |  8 ++++----
>  2 files changed, 21 insertions(+), 16 deletions(-)

> diff --git a/disk/part_dos.c b/disk/part_dos.c
> index 89263d3..6280660 100644
> --- a/disk/part_dos.c
> +++ b/disk/part_dos.c
> @@ -26,7 +26,7 @@
 
>  /* Convert char[4] in little endian format to the host format integer
>   */
> -static inline int le32_to_int(unsigned char *le32)
> +static inline unsigned int le32_to_int(unsigned char *le32)
>  {
>      return ((le32[3] << 24) +
>  	    (le32[2] << 16) +
> @@ -47,13 +47,14 @@ static inline int is_bootable(dos_partition_t *p)
>  	return p->boot_ind == 0x80;
>  }
 
> -static void print_one_part(dos_partition_t *p, int ext_part_sector,
> +static void print_one_part(dos_partition_t *p, lbaint_t ext_part_sector,
>  			   int part_num, unsigned int disksig)
>  {
> -	int lba_start = ext_part_sector + le32_to_int (p->start4);
> -	int lba_size  = le32_to_int (p->size4);
> +	lbaint_t lba_start = ext_part_sector + le32_to_int (p->start4);
> +	lbaint_t lba_size  = le32_to_int (p->size4);
 
> -	printf("%3d\t%-10d\t%-10d\t%08x-%02x\t%02x%s%s\n",
> +	printf("%3d\t%-10" LBAFlength "u\t%-10" LBAFlength
> +		"u\t%08x-%02x\t%02x%s%s\n",
>  		part_num, lba_start, lba_size, disksig, part_num, p->sys_ind,
>  		(is_extended(p->sys_ind) ? " Extd" : ""),
>  		(is_bootable(p) ? " Boot" : ""));
> @@ -102,7 +103,8 @@ int test_part_dos (block_dev_desc_t *dev_desc)
>  /*  Print a partition that is relative to its Extended partition table
>   */
>  static void print_partition_extended(block_dev_desc_t *dev_desc,
> -				     int ext_part_sector, int relative,
> +				     lbaint_t ext_part_sector,
> +				     lbaint_t relative,
>  				     int part_num, unsigned int disksig)
>  {
>  	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz);
> @@ -110,7 +112,7 @@ static void print_partition_extended(block_dev_desc_t *dev_desc,
>  	int i;
 
>  	if (dev_desc->block_read(dev_desc->dev, ext_part_sector, 1, (ulong *) buffer) != 1) {
> -		printf ("** Can't read partition table on %d:%d **\n",
> +		printf ("** Can't read partition table on %d:" LBAFU " **\n",
dev_desc-> dev, ext_part_sector);
>  		return;
>  	}
> @@ -149,7 +151,8 @@ static void print_partition_extended(block_dev_desc_t *dev_desc,
>  	pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET);
>  	for (i = 0; i < 4; i++, pt++) {
>  		if (is_extended (pt->sys_ind)) {
> -			int lba_start = le32_to_int (pt->start4) + relative;
> +			lbaint_t lba_start
> +				= le32_to_int (pt->start4) + relative;
 
>  			print_partition_extended(dev_desc, lba_start,
>  				ext_part_sector == 0  ? lba_start : relative,
> @@ -163,8 +166,9 @@ static void print_partition_extended(block_dev_desc_t *dev_desc,
 
>  /*  Print a partition that is relative to its Extended partition table
>   */
> -static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part_sector,
> -				 int relative, int part_num,
> +static int get_partition_info_extended (block_dev_desc_t *dev_desc,
> +				 lbaint_t ext_part_sector,
> +				 lbaint_t relative, int part_num,
>  				 int which_part, disk_partition_t *info,
>  				 unsigned int disksig)
>  {
> @@ -174,7 +178,7 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part
>  	int dos_type;
 
>  	if (dev_desc->block_read (dev_desc->dev, ext_part_sector, 1, (ulong *) buffer) != 1) {
> -		printf ("** Can't read partition table on %d:%d **\n",
> +		printf ("** Can't read partition table on %d:" LBAFU " **\n",
dev_desc-> dev, ext_part_sector);
>  		return -1;
>  	}
> @@ -250,7 +254,8 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part
>  	pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET);
>  	for (i = 0; i < 4; i++, pt++) {
>  		if (is_extended (pt->sys_ind)) {
> -			int lba_start = le32_to_int (pt->start4) + relative;
> +			lbaint_t lba_start
> +				= le32_to_int (pt->start4) + relative;
 
>  			return get_partition_info_extended (dev_desc, lba_start,
>  				 ext_part_sector == 0 ? lba_start : relative,
> diff --git a/include/ide.h b/include/ide.h
> index d5e05e9..f9b43cb 100644
> --- a/include/ide.h
> +++ b/include/ide.h
> @@ -28,13 +28,13 @@ void ide_led(uchar led, uchar status);
 
>  #ifdef CONFIG_SYS_64BIT_LBA
>  typedef uint64_t lbaint_t;
> -#define LBAF "%llx"
> -#define LBAFU "%llu"
> +#define LBAFlength "ll"
>  #else
>  typedef ulong lbaint_t;
> -#define LBAF "%lx"
> -#define LBAFU "%lu"
> +#define LBAFlength "l"
>  #endif
> +#define LBAF "%" LBAFlength "x"
> +#define LBAFU "%" LBAFlength "u"
 
>  /*
>   * Function Prototypes
> -- 
> 2.1.4

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-01-12 15:29 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-25 17:08 [U-Boot] Fix wrap around bug in MBR sector counts Stefan Monnier
2015-11-25 17:08 ` [U-Boot] [PATCH] Don't wrap to negative after 2G sectors Stefan Monnier
2016-01-12 15:29   ` Stefan Monnier

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.