| Submitter | Graeme Russ |
|---|---|
| Date | Jan. 2, 2012, 4:09 a.m. |
| Message ID | <1325477374-6417-3-git-send-email-graeme.russ@gmail.com> |
| Download | mbox | patch |
| Permalink | /patch/133777/ |
| State | Superseded |
| Headers | show |
Comments
Hi Graeme, On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote: > The implementations of memcpy and memset are now the optimised versions > from glibc, so use them instead of simple copy loops > > Signed-off-by: Graeme Russ <graeme.russ@gmail.com> > --- > arch/x86/lib/board.c | 17 +++++------------ > 1 files changed, 5 insertions(+), 12 deletions(-) > > diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c > index d742fec..ba6b59f 100644 > --- a/arch/x86/lib/board.c > +++ b/arch/x86/lib/board.c > @@ -188,26 +188,19 @@ static int calculate_relocation_address(void) > > static int copy_uboot_to_ram(void) > { > - ulong *dst_addr = (ulong *)gd->relocaddr; > - ulong *src_addr = (ulong *)&__text_start; > - ulong *end_addr = (ulong *)&__data_end; > + size_t len = (size_t)(&__data_end) - (size_t)(&__text_start); Extra brackets here. Also is the type of these not char[] already? Same Q below. > > - while (src_addr < end_addr) > - *dst_addr++ = *src_addr++; > + memcpy((void *)gd->relocaddr, (void *)&__text_start, len); > > return 0; > } > > static int clear_bss(void) > { > - void *bss_start = &__bss_start; > - void *bss_end = &__bss_end; > + ulong dst_addr = (ulong)(&__bss_start) + gd->reloc_off; > + size_t len = (size_t)(&__bss_end) - (size_t)(&__bss_start); > > - ulong *dst_addr = (ulong *)(bss_start + gd->reloc_off); > - ulong *end_addr = (ulong *)(bss_end + gd->reloc_off); > - > - while (dst_addr < end_addr) > - *dst_addr++ = 0x00000000; > + memset((void *)dst_addr, 0x00, len); > > return 0; > } > -- > 1.7.5.2.317.g391b14 > > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot
Hi Simon, On 04/01/12 16:21, Simon Glass wrote: > Hi Graeme, > > On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote: >> The implementations of memcpy and memset are now the optimised versions >> from glibc, so use them instead of simple copy loops >> >> Signed-off-by: Graeme Russ <graeme.russ@gmail.com> >> --- >> arch/x86/lib/board.c | 17 +++++------------ >> 1 files changed, 5 insertions(+), 12 deletions(-) >> >> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c >> index d742fec..ba6b59f 100644 >> --- a/arch/x86/lib/board.c >> +++ b/arch/x86/lib/board.c >> @@ -188,26 +188,19 @@ static int calculate_relocation_address(void) >> >> static int copy_uboot_to_ram(void) >> { >> - ulong *dst_addr = (ulong *)gd->relocaddr; >> - ulong *src_addr = (ulong *)&__text_start; >> - ulong *end_addr = (ulong *)&__data_end; >> + size_t len = (size_t)(&__data_end) - (size_t)(&__text_start); > > Extra brackets here. Also is the type of these not char[] already? Same Q below. I removed the brackets for v2 - The cast is required because &__data_end is a ulong * Actually: size_t len = &__data_end - &__text_start; works, but is dangerous - I have been caught out several times in this code doing raw arithmetic, particularly using increment and decrement operators. I prefer to make the casts explicit now Regards, Graeme
Patch
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c index d742fec..ba6b59f 100644 --- a/arch/x86/lib/board.c +++ b/arch/x86/lib/board.c @@ -188,26 +188,19 @@ static int calculate_relocation_address(void) static int copy_uboot_to_ram(void) { - ulong *dst_addr = (ulong *)gd->relocaddr; - ulong *src_addr = (ulong *)&__text_start; - ulong *end_addr = (ulong *)&__data_end; + size_t len = (size_t)(&__data_end) - (size_t)(&__text_start); - while (src_addr < end_addr) - *dst_addr++ = *src_addr++; + memcpy((void *)gd->relocaddr, (void *)&__text_start, len); return 0; } static int clear_bss(void) { - void *bss_start = &__bss_start; - void *bss_end = &__bss_end; + ulong dst_addr = (ulong)(&__bss_start) + gd->reloc_off; + size_t len = (size_t)(&__bss_end) - (size_t)(&__bss_start); - ulong *dst_addr = (ulong *)(bss_start + gd->reloc_off); - ulong *end_addr = (ulong *)(bss_end + gd->reloc_off); - - while (dst_addr < end_addr) - *dst_addr++ = 0x00000000; + memset((void *)dst_addr, 0x00, len); return 0; }
The implementations of memcpy and memset are now the optimised versions from glibc, so use them instead of simple copy loops Signed-off-by: Graeme Russ <graeme.russ@gmail.com> --- arch/x86/lib/board.c | 17 +++++------------ 1 files changed, 5 insertions(+), 12 deletions(-)