Patchwork [U-Boot,02/17] x86: Speed up copy-to-RAM and clear BSS operations

login
register
mail settings
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

Graeme Russ - Jan. 2, 2012, 4:09 a.m.
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(-)
Simon Glass - Jan. 4, 2012, 5:21 a.m.
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
Graeme Russ - Jan. 4, 2012, 10:04 a.m.
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;
 }