[U-Boot-Users] ARM missing __udivdi3 in lib_arm or fix 64bit division in nand_util.c?

Dirk Behme dirk.behme at googlemail.com
Wed Aug 1 19:55:52 CEST 2007


Wolfgang Denk wrote:
> In message <46AF8CF0.7090600 at googlemail.com> you wrote:
> 
>>Something like in attachment?
> 
> Probably not.

Thanks for commenting!

>>+/* The unnecessary pointer compare is there
>>+ * to check for type safety (n must be 64bit)
>>+ */
>>+# define do_div(n,base) ({				\
>>+	uint32_t __base = (base);			\
>>+	uint32_t __rem;					\
>>+	(void)(((typeof((n)) *)0) == ((uint64_t *)0));	\
>>+	if (((n) >> 32) == 0) {			\
>>+		__rem = (uint32_t)(n) % __base;		\
>>+		(n) = (uint32_t)(n) / __base;		\
>>+	} else 						\
>>+		__rem = __div64_32(&(n), __base);	\
>>+	__rem;						\
>>+ })
> 
> 
> CodingStyle: Generally, inline functions are preferable to macros
> resembling functions.

I know that this is no excuse for bad coding style, but please note 
that this stuff is already part of U-Boot, see lib_avr32/div64.c and 
include/asm-avr32/div64.h. My patch only moves the *unmodfied* files 
to lib_generic for general use, as proposed by Håvard. Same as U-Boot 
NG did ;)

>>Index: uboot/lib_generic/Makefile
>>===================================================================
>>--- uboot.orig/lib_generic/Makefile
>>+++ uboot/lib_generic/Makefile
>>@@ -27,7 +27,7 @@ LIB	= $(obj)libgeneric.a
>> 
>> COBJS	= bzlib.o bzlib_crctable.o bzlib_decompress.o \
>> 	  bzlib_randtable.o bzlib_huffman.o \
>>-	  crc32.o ctype.o display_options.o ldiv.o sha1.o \
>>+	  crc32.o ctype.o display_options.o div64.o ldiv.o sha1.o \
>> 	  string.o vsprintf.o zlib.o
> 
> 
> Why should I link this code and increase the memory footprint for all
> boards, when 99% of them don't need this?

Sorry if I misunderstood anything here. But with putting 
do_div/__div64_32 to a *library* boards use it only if they need it? 
Here, if they explicitly use do_div()? If they don't use do_div(), the 
memory footprint isn't increased because it simply isn't used?

Please find below some tests with omap5912osk_config which doesn't use 
do_div/__div64_32. The first numbers are with clean recent git, the 
second with my patch with div64 stuff moved to lib_generic. As 
expected, library size increases but image size stays the same. 
Anything wrong with this?

> Rejected.

What's your proposal then with the 64bit division issue in nand_util.c?

Best regards

Dirk


==> Clean recent git:

 > make omap5912osk_config
 > make
 > ll u-boot.bin
... 100016 ... u-boot.bin
 > ll lib_generic/libgeneric.a
... 102740 ... lib_generic/libgeneric.a
 > arm-elf-ar -t lib_generic/libgeneric.a
bzlib.o
bzlib_crctable.o
bzlib_decompress.o
bzlib_randtable.o
bzlib_huffman.o
crc32.o
ctype.o
display_options.o
ldiv.o
sha1.o
string.o
vsprintf.o
zlib.o
 >

==> Clean recent git + div64_generic_patch.txt:

 > make omap5912osk_config
 > make
 > ll u-boot.bin
... 100016 ... u-boot.bin
 > ll lib_generic/libgeneric.a
... 106208 ... lib_generic/libgeneric.a
 > arm-elf-ar -t lib_generic/libgeneric.a
bzlib.o
bzlib_crctable.o
bzlib_decompress.o
bzlib_randtable.o
bzlib_huffman.o
crc32.o
ctype.o
display_options.o
div64.o
ldiv.o
sha1.o
string.o
vsprintf.o
zlib.o
 >




More information about the U-Boot mailing list