
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.
Stefan

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 cf1a36e..adde68a 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -25,7 +25,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) + @@ -46,13 +46,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" : "")); @@ -101,7 +102,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); @@ -109,7 +111,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; } @@ -148,7 +150,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, @@ -162,8 +165,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) { @@ -173,7 +177,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; } @@ -249,7 +253,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

Ping?
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 cf1a36e..adde68a 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -25,7 +25,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) + @@ -46,13 +46,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
part_num, lba_start, lba_size, disksig, part_num, p->sys_ind, (is_extended(p->sys_ind) ? " Extd" : ""), (is_bootable(p) ? " Boot" : ""));"u\t%08x-%02x\t%02x%s%s\n",
@@ -101,7 +102,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); @@ -109,7 +111,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;
} @@ -148,7 +150,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,
@@ -162,8 +165,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)
{ @@ -173,7 +177,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;
} @@ -249,7 +253,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

Any chance this can make it into 2015.10?
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 cf1a36e..adde68a 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -25,7 +25,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) + @@ -46,13 +46,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
part_num, lba_start, lba_size, disksig, part_num, p->sys_ind, (is_extended(p->sys_ind) ? " Extd" : ""), (is_bootable(p) ? " Boot" : ""));"u\t%08x-%02x\t%02x%s%s\n",
@@ -101,7 +102,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); @@ -109,7 +111,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;
} @@ -148,7 +150,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,
@@ -162,8 +165,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)
{ @@ -173,7 +177,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;
} @@ -249,7 +253,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

I haven't received any answer from anyone about my patch. What am I doing wrong?
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 cf1a36e..adde68a 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -25,7 +25,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) + @@ -46,13 +46,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
part_num, lba_start, lba_size, disksig, part_num, p->sys_ind, (is_extended(p->sys_ind) ? " Extd" : ""), (is_bootable(p) ? " Boot" : ""));"u\t%08x-%02x\t%02x%s%s\n",
@@ -101,7 +102,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); @@ -109,7 +111,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;
} @@ -148,7 +150,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,
@@ -162,8 +165,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)
{ @@ -173,7 +177,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;
} @@ -249,7 +253,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

On Sat, Oct 3, 2015 at 5:58 PM, Stefan Monnier monnier@iro.umontreal.ca wrote:
I haven't received any answer from anyone about my patch. What am I doing wrong?
I would suggest you to resend it and put Tom Rini on Cc.
Also, a commit log is always useful.
Regards,
Fabio Estevam

On Tue, Aug 25, 2015 at 03:24:13PM -0400, Stefan Monnier wrote:
Signed-off-by: Stefan Monnier monnier@iro.umontreal.ca
Sorry for the delay: Reviewed-by: Tom Rini trini@konsulko.com
And I'll pop in a short commit message. I also need to test this with one of the toolchains that errors out when we try and mix hard and soft float stuff (I don't see any dangerous math in the patch context but just to be safe). Thanks!

Signed-off-by: Stefan Monnier monnier@iro.umontreal.ca
Sorry for the delay: Reviewed-by: Tom Rini trini@konsulko.com
Great, thank you!
Stefan

On Tue, Aug 25, 2015 at 03:24:13PM -0400, Stefan Monnier wrote:
Signed-off-by: Stefan Monnier monnier@iro.umontreal.ca
Applied to u-boot/master, thanks!
participants (4)
-
Fabio Estevam
-
Stefan Monnier
-
Stefan Monnier
-
Tom Rini