* [PATCH] cleanup arm startup a bit
@ 2012-10-05 16:45 Sascha Hauer
2012-10-05 16:45 ` [PATCH 1/4] ARM: add assembly function for setting up C environment Sascha Hauer
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Sascha Hauer @ 2012-10-05 16:45 UTC (permalink / raw)
To: barebox
Some cleanups to the arm start files.
Sascha
----------------------------------------------------------------
Sascha Hauer (4):
ARM: add assembly function for setting up C environment
introduce region_overlap() function
ARM: cleanup piggydata copy check
ARM: simplify start.c
arch/arm/cpu/Makefile | 4 +--
arch/arm/cpu/setupc.S | 34 ++++++++++++++++++++++++
arch/arm/cpu/start-pbl.c | 51 +++++++++---------------------------
arch/arm/cpu/start.c | 41 +++++------------------------
arch/arm/include/asm/barebox-arm.h | 2 ++
include/common.h | 13 +++++++++
6 files changed, 70 insertions(+), 75 deletions(-)
create mode 100644 arch/arm/cpu/setupc.S
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/4] ARM: add assembly function for setting up C environment
2012-10-05 16:45 [PATCH] cleanup arm startup a bit Sascha Hauer
@ 2012-10-05 16:45 ` Sascha Hauer
2012-10-05 16:45 ` [PATCH 2/4] introduce region_overlap() function Sascha Hauer
` (2 subsequent siblings)
3 siblings, 0 replies; 9+ messages in thread
From: Sascha Hauer @ 2012-10-05 16:45 UTC (permalink / raw)
To: barebox
Sometimes Assembler beats C. In this case a small assembler
function called without parameters can:
- copy a binary to its link address
- clear the bss
- return to the same position in the copied binary
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
arch/arm/cpu/Makefile | 4 ++--
arch/arm/cpu/setupc.S | 34 ++++++++++++++++++++++++++++++++++
arch/arm/cpu/start-pbl.c | 19 ++-----------------
arch/arm/cpu/start.c | 23 +++++------------------
arch/arm/include/asm/barebox-arm.h | 2 ++
5 files changed, 45 insertions(+), 37 deletions(-)
create mode 100644 arch/arm/cpu/setupc.S
diff --git a/arch/arm/cpu/Makefile b/arch/arm/cpu/Makefile
index f7ab276..b3122c8 100644
--- a/arch/arm/cpu/Makefile
+++ b/arch/arm/cpu/Makefile
@@ -1,7 +1,7 @@
obj-y += cpu.o
obj-$(CONFIG_ARM_EXCEPTIONS) += exceptions.o
obj-$(CONFIG_ARM_EXCEPTIONS) += interrupts.o
-obj-y += start.o
+obj-y += start.o setupc.o
#
# Any variants can be called as start-armxyz.S
@@ -19,4 +19,4 @@ obj-$(CONFIG_CPU_32v7) += cache-armv7.o
pbl-$(CONFIG_CPU_32v7) += cache-armv7.o
obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o
-pbl-y += start-pbl.o
+pbl-y += start-pbl.o setupc.o
diff --git a/arch/arm/cpu/setupc.S b/arch/arm/cpu/setupc.S
new file mode 100644
index 0000000..9a8d54c
--- /dev/null
+++ b/arch/arm/cpu/setupc.S
@@ -0,0 +1,34 @@
+#include <linux/linkage.h>
+
+.section .text.setupc
+
+/*
+ * setup_c: copy binary to link address, clear bss and
+ * continue executing at new address.
+ *
+ * This function does not return to the address it is
+ * called from, but to the same location in the copied
+ * binary.
+ */
+ENTRY(setup_c)
+ push {r4, r5}
+ mov r5, lr
+ bl get_runtime_offset
+ subs r4, r0, #0
+ beq 1f /* skip memcpy if already at correct address */
+ ldr r0,=_text
+ ldr r2,=__bss_start
+ sub r2, r2, r0
+ sub r1, r0, r4
+ bl memcpy /* memcpy(_text, _text - offset, __bss_start - _text) */
+1: ldr r0, =__bss_start
+ mov r1, #0
+ ldr r2, =__bss_stop
+ sub r2, r2, r0
+ bl memset /* clear bss */
+ mov r0, #0
+ mcr p15, 0, r0, c7, c5, 0 /* flush icache */
+ add lr, r5, r4 /* adjust return address to new location */
+ pop {r4, r5}
+ mov pc, lr
+ENDPROC(setup_c)
diff --git a/arch/arm/cpu/start-pbl.c b/arch/arm/cpu/start-pbl.c
index 0467dfe..1298ca0 100644
--- a/arch/arm/cpu/start-pbl.c
+++ b/arch/arm/cpu/start-pbl.c
@@ -208,23 +208,8 @@ copy_piggy_link:
pg_start = (uint32_t)&input_data;
copy_link:
- /* relocate to link address if necessary */
- if (offset)
- memcpy((void *)_text, (void *)(_text - offset),
- __bss_start - _text);
- /* clear bss */
- memset(__bss_start, 0, __bss_stop - __bss_start);
+ setup_c();
- flush_icache();
-
- r = (unsigned int)&barebox_uncompress;
- /* call barebox_uncompress with its absolute address */
- __asm__ __volatile__(
- "mov r0, %1\n"
- "mov r1, %2\n"
- "mov pc, %0\n"
- :
- : "r"(r), "r"(pg_start), "r"(pg_len)
- : "r0", "r1");
+ barebox_uncompress((void *)pg_start, pg_len);
}
diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
index 8676267..7e0a29a 100644
--- a/arch/arm/cpu/start.c
+++ b/arch/arm/cpu/start.c
@@ -37,8 +37,8 @@ void __naked __section(.text_entry) start(void)
/* Setup the stack */
r = STACK_BASE + STACK_SIZE - 16;
__asm__ __volatile__("mov sp, %0" : : "r"(r));
- /* clear bss */
- memset(__bss_start, 0, __bss_stop - __bss_start);
+
+ setup_c();
start_barebox();
}
@@ -70,27 +70,14 @@ void __naked __bare_init reset(void)
*/
void __naked board_init_lowlevel_return(void)
{
- uint32_t r, offset;
+ uint32_t r;
/* Setup the stack */
r = STACK_BASE + STACK_SIZE - 16;
__asm__ __volatile__("mov sp, %0" : : "r"(r));
- /* Get offset between linked address and runtime address */
- offset = get_runtime_offset();
-
- /* relocate to link address if necessary */
- if (offset)
- memcpy((void *)_text, (void *)(_text - offset),
- __bss_start - _text);
-
- /* clear bss */
- memset(__bss_start, 0, __bss_stop - __bss_start);
+ setup_c();
- flush_icache();
-
- /* call start_barebox with its absolute address */
- r = (unsigned int)&start_barebox;
- __asm__ __volatile__("mov pc, %0" : : "r"(r));
+ start_barebox();
}
#endif
diff --git a/arch/arm/include/asm/barebox-arm.h b/arch/arm/include/asm/barebox-arm.h
index 9e17b4f..993130d 100644
--- a/arch/arm/include/asm/barebox-arm.h
+++ b/arch/arm/include/asm/barebox-arm.h
@@ -38,4 +38,6 @@ void board_init_lowlevel(void);
void board_init_lowlevel_return(void);
uint32_t get_runtime_offset(void);
+void setup_c(void);
+
#endif /* _BAREBOX_ARM_H_ */
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/4] introduce region_overlap() function
2012-10-05 16:45 [PATCH] cleanup arm startup a bit Sascha Hauer
2012-10-05 16:45 ` [PATCH 1/4] ARM: add assembly function for setting up C environment Sascha Hauer
@ 2012-10-05 16:45 ` Sascha Hauer
2012-10-05 19:55 ` Robert Jarzmik
2012-10-05 16:45 ` [PATCH 3/4] ARM: cleanup piggydata copy check Sascha Hauer
2012-10-05 16:45 ` [PATCH 4/4] ARM: simplify start.c Sascha Hauer
3 siblings, 1 reply; 9+ messages in thread
From: Sascha Hauer @ 2012-10-05 16:45 UTC (permalink / raw)
To: barebox
To check if two regions overlap
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
include/common.h | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/include/common.h b/include/common.h
index c1f44b4..e30774a 100644
--- a/include/common.h
+++ b/include/common.h
@@ -256,4 +256,17 @@ static inline void barebox_banner(void) {}
(__x < 0) ? -__x : __x; \
})
+/*
+ * Check if two regions overlap. returns true if they do, false otherwise
+ */
+static inline bool region_overlap(unsigned long starta, unsigned long lena,
+ unsigned long startb, unsigned long lenb)
+{
+ if (starta + lena <= startb)
+ return 0;
+ if (startb + lenb <= starta)
+ return 0;
+ return 1;
+}
+
#endif /* __COMMON_H_ */
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 3/4] ARM: cleanup piggydata copy check
2012-10-05 16:45 [PATCH] cleanup arm startup a bit Sascha Hauer
2012-10-05 16:45 ` [PATCH 1/4] ARM: add assembly function for setting up C environment Sascha Hauer
2012-10-05 16:45 ` [PATCH 2/4] introduce region_overlap() function Sascha Hauer
@ 2012-10-05 16:45 ` Sascha Hauer
2012-10-05 16:45 ` [PATCH 4/4] ARM: simplify start.c Sascha Hauer
3 siblings, 0 replies; 9+ messages in thread
From: Sascha Hauer @ 2012-10-05 16:45 UTC (permalink / raw)
To: barebox
Replace to gotos with a single if().
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
arch/arm/cpu/start-pbl.c | 28 ++++++++--------------------
1 file changed, 8 insertions(+), 20 deletions(-)
diff --git a/arch/arm/cpu/start-pbl.c b/arch/arm/cpu/start-pbl.c
index 1298ca0..29d82e5 100644
--- a/arch/arm/cpu/start-pbl.c
+++ b/arch/arm/cpu/start-pbl.c
@@ -188,26 +188,14 @@ void __naked board_init_lowlevel_return(void)
pg_end = (uint32_t)&input_data_end - offset;
pg_len = pg_end - pg_start;
- if (IS_ENABLED(CONFIG_PBL_FORCE_PIGGYDATA_COPY))
- goto copy_piggy_link;
-
- /*
- * Check if the piggydata binary will be overwritten
- * by the uncompressed binary or by the pbl relocation
- */
- if (!offset ||
- !((pg_start >= TEXT_BASE && pg_start < TEXT_BASE + pg_len * 4) ||
- ((uint32_t)_text >= pg_start && (uint32_t)_text <= pg_end)))
- goto copy_link;
-
-copy_piggy_link:
- /*
- * copy piggydata binary to its link address
- */
- memcpy(&input_data, (void *)pg_start, pg_len);
- pg_start = (uint32_t)&input_data;
-
-copy_link:
+ if (offset && (IS_ENABLED(CONFIG_PBL_FORCE_PIGGYDATA_COPY) ||
+ region_overlap(pg_start, pg_len, TEXT_BASE, pg_len * 4))) {
+ /*
+ * copy piggydata binary to its link address
+ */
+ memcpy(&input_data, (void *)pg_start, pg_len);
+ pg_start = (uint32_t)&input_data;
+ }
setup_c();
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 4/4] ARM: simplify start.c
2012-10-05 16:45 [PATCH] cleanup arm startup a bit Sascha Hauer
` (2 preceding siblings ...)
2012-10-05 16:45 ` [PATCH 3/4] ARM: cleanup piggydata copy check Sascha Hauer
@ 2012-10-05 16:45 ` Sascha Hauer
3 siblings, 0 replies; 9+ messages in thread
From: Sascha Hauer @ 2012-10-05 16:45 UTC (permalink / raw)
To: barebox
start() for the PBL case is a duplicate of board_init_lowlevel_return().
Instead of duplicating it just call it.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
arch/arm/cpu/start.c | 22 ++++------------------
1 file changed, 4 insertions(+), 18 deletions(-)
diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
index 7e0a29a..7e72eec 100644
--- a/arch/arm/cpu/start.c
+++ b/arch/arm/cpu/start.c
@@ -24,32 +24,19 @@
#include <asm-generic/memory_layout.h>
#include <asm/sections.h>
#include <asm/cache.h>
+#include <memory.h>
-#ifdef CONFIG_PBL_IMAGE
/*
* First function in the uncompressed image. We get here from
* the pbl.
*/
void __naked __section(.text_entry) start(void)
{
- u32 r;
-
- /* Setup the stack */
- r = STACK_BASE + STACK_SIZE - 16;
- __asm__ __volatile__("mov sp, %0" : : "r"(r));
-
- setup_c();
-
- start_barebox();
-}
+#ifdef CONFIG_PBL_IMAGE
+ board_init_lowlevel_return();
#else
-
-/*
- * First function in the image without pbl support
- */
-void __naked __section(.text_entry) start(void)
-{
barebox_arm_head();
+#endif
}
/*
@@ -80,4 +67,3 @@ void __naked board_init_lowlevel_return(void)
start_barebox();
}
-#endif
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] introduce region_overlap() function
2012-10-05 16:45 ` [PATCH 2/4] introduce region_overlap() function Sascha Hauer
@ 2012-10-05 19:55 ` Robert Jarzmik
2012-10-05 21:33 ` Sascha Hauer
0 siblings, 1 reply; 9+ messages in thread
From: Robert Jarzmik @ 2012-10-05 19:55 UTC (permalink / raw)
To: Sascha Hauer; +Cc: barebox
Sascha Hauer <s.hauer@pengutronix.de> writes:
> To check if two regions overlap
>
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
> include/common.h | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/include/common.h b/include/common.h
> index c1f44b4..e30774a 100644
> --- a/include/common.h
> +++ b/include/common.h
> @@ -256,4 +256,17 @@ static inline void barebox_banner(void) {}
> (__x < 0) ? -__x : __x; \
> })
>
> +/*
> + * Check if two regions overlap. returns true if they do, false otherwise
> + */
> +static inline bool region_overlap(unsigned long starta, unsigned long lena,
> + unsigned long startb, unsigned long lenb)
> +{
> + if (starta + lena <= startb)
> + return 0;
> + if (startb + lenb <= starta)
> + return 0;
> + return 1;
> +}
> +
> #endif /* __COMMON_H_ */
Or if you look for perfomance (I presume not in barebox) :
static inline bool region_overlap(unsigned long starta, unsigned long lena,
unsigned long startb, unsigned long lenb)
{
return starta <= startb + lenb && starta + lena >= startb;
}
It's a bit more obfuscated, but performance wise no branch prediction :)
Cheers.
--
Robert
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] introduce region_overlap() function
2012-10-05 19:55 ` Robert Jarzmik
@ 2012-10-05 21:33 ` Sascha Hauer
2012-10-06 19:44 ` Robert Jarzmik
2012-10-07 6:59 ` Antony Pavlov
0 siblings, 2 replies; 9+ messages in thread
From: Sascha Hauer @ 2012-10-05 21:33 UTC (permalink / raw)
To: Robert Jarzmik; +Cc: barebox
On Fri, Oct 05, 2012 at 09:55:04PM +0200, Robert Jarzmik wrote:
> Sascha Hauer <s.hauer@pengutronix.de> writes:
>
> > To check if two regions overlap
> >
> > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> > ---
> > include/common.h | 13 +++++++++++++
> > 1 file changed, 13 insertions(+)
> >
> > diff --git a/include/common.h b/include/common.h
> > index c1f44b4..e30774a 100644
> > --- a/include/common.h
> > +++ b/include/common.h
> > @@ -256,4 +256,17 @@ static inline void barebox_banner(void) {}
> > (__x < 0) ? -__x : __x; \
> > })
> >
> > +/*
> > + * Check if two regions overlap. returns true if they do, false otherwise
> > + */
> > +static inline bool region_overlap(unsigned long starta, unsigned long lena,
> > + unsigned long startb, unsigned long lenb)
> > +{
> > + if (starta + lena <= startb)
> > + return 0;
> > + if (startb + lenb <= starta)
> > + return 0;
> > + return 1;
> > +}
> > +
> > #endif /* __COMMON_H_ */
>
> Or if you look for perfomance (I presume not in barebox) :
> static inline bool region_overlap(unsigned long starta, unsigned long lena,
> unsigned long startb, unsigned long lenb)
> {
> return starta <= startb + lenb && starta + lena >= startb;
> }
>
> It's a bit more obfuscated, but performance wise no branch prediction :)
You made me curious. I tried to compile both and here is the result on
ARM (I swapped the arguments left and right of the &&):
00025000 <_region_overlap>:
25000: e0811000 add r1, r1, r0
25004: e1510002 cmp r1, r2
25008: 9a000004 bls 25020 <_region_overlap+0x20>
2500c: e0832002 add r2, r3, r2
25010: e1520000 cmp r2, r0
25014: 93a00000 movls r0, #0
25018: 83a00001 movhi r0, #1
2501c: e12fff1e bx lr
25020: e3a00000 mov r0, #0
25024: e12fff1e bx lr
00025000 <__region_overlap>:
25000: e0811000 add r1, r1, r0
25004: e1510002 cmp r1, r2
25008: 3a000004 bcc 25020 <__region_overlap+0x20>
2500c: e0832002 add r2, r3, r2
25010: e1500002 cmp r0, r2
25014: 83a00000 movhi r0, #0
25018: 93a00001 movls r0, #1
2501c: e12fff1e bx lr
25020: e3a00000 mov r0, #0
25024: e12fff1e bx lr
Maybe gcc isn't so clever on other architectures, I don't know ;)
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] introduce region_overlap() function
2012-10-05 21:33 ` Sascha Hauer
@ 2012-10-06 19:44 ` Robert Jarzmik
2012-10-07 6:59 ` Antony Pavlov
1 sibling, 0 replies; 9+ messages in thread
From: Robert Jarzmik @ 2012-10-06 19:44 UTC (permalink / raw)
To: Sascha Hauer; +Cc: barebox
Sascha Hauer <s.hauer@pengutronix.de> writes:
> You made me curious. I tried to compile both and here is the result on
> ARM (I swapped the arguments left and right of the &&):
>
...zip...
>
> Maybe gcc isn't so clever on other architectures, I don't know ;)
You're right.
Same conclusion on x86 with gcc 4.7. I had tried that a long time ago (maybe 10
years or so) on x86, benchmarking both pure C and Java on this very function (it
was for aircrafts timeslots conflicts discovery).
At that time, the "startA <= endB && endA >= startB" was fastest. So compilation
technique have improved enough to write maintainable code after all :)
Cheers.
--
Robert
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] introduce region_overlap() function
2012-10-05 21:33 ` Sascha Hauer
2012-10-06 19:44 ` Robert Jarzmik
@ 2012-10-07 6:59 ` Antony Pavlov
1 sibling, 0 replies; 9+ messages in thread
From: Antony Pavlov @ 2012-10-07 6:59 UTC (permalink / raw)
To: Sascha Hauer; +Cc: barebox
On 6 October 2012 01:33, Sascha Hauer <s.hauer@pengutronix.de> wrote:
> On Fri, Oct 05, 2012 at 09:55:04PM +0200, Robert Jarzmik wrote:
>> Sascha Hauer <s.hauer@pengutronix.de> writes:
>>
>> > To check if two regions overlap
>> >
>> > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
>> > ---
>> > include/common.h | 13 +++++++++++++
>> > 1 file changed, 13 insertions(+)
>> >
>> > diff --git a/include/common.h b/include/common.h
>> > index c1f44b4..e30774a 100644
>> > --- a/include/common.h
>> > +++ b/include/common.h
>> > @@ -256,4 +256,17 @@ static inline void barebox_banner(void) {}
>> > (__x < 0) ? -__x : __x; \
>> > })
>> >
>> > +/*
>> > + * Check if two regions overlap. returns true if they do, false otherwise
>> > + */
>> > +static inline bool region_overlap(unsigned long starta, unsigned long lena,
>> > + unsigned long startb, unsigned long lenb)
>> > +{
>> > + if (starta + lena <= startb)
>> > + return 0;
>> > + if (startb + lenb <= starta)
>> > + return 0;
>> > + return 1;
>> > +}
>> > +
>> > #endif /* __COMMON_H_ */
>>
>> Or if you look for perfomance (I presume not in barebox) :
>> static inline bool region_overlap(unsigned long starta, unsigned long lena,
>> unsigned long startb, unsigned long lenb)
>> {
>> return starta <= startb + lenb && starta + lena >= startb;
>> }
>>
>> It's a bit more obfuscated, but performance wise no branch prediction :)
>
> You made me curious. I tried to compile both and here is the result on
> ARM (I swapped the arguments left and right of the &&):
>
> 00025000 <_region_overlap>:
> 25000: e0811000 add r1, r1, r0
> 25004: e1510002 cmp r1, r2
> 25008: 9a000004 bls 25020 <_region_overlap+0x20>
> 2500c: e0832002 add r2, r3, r2
> 25010: e1520000 cmp r2, r0
> 25014: 93a00000 movls r0, #0
> 25018: 83a00001 movhi r0, #1
> 2501c: e12fff1e bx lr
> 25020: e3a00000 mov r0, #0
> 25024: e12fff1e bx lr
>
> 00025000 <__region_overlap>:
> 25000: e0811000 add r1, r1, r0
> 25004: e1510002 cmp r1, r2
> 25008: 3a000004 bcc 25020 <__region_overlap+0x20>
> 2500c: e0832002 add r2, r3, r2
> 25010: e1500002 cmp r0, r2
> 25014: 83a00000 movhi r0, #0
> 25018: 93a00001 movls r0, #1
> 2501c: e12fff1e bx lr
> 25020: e3a00000 mov r0, #0
> 25024: e12fff1e bx lr
>
> Maybe gcc isn't so clever on other architectures, I don't know ;)
You made me curious too.
I compiled this piece of code for MIPS:
--- code ---
#include <stdbool.h>
bool _region_overlap(unsigned long starta, unsigned long lena,
unsigned long startb, unsigned long lenb)
{
if (starta + lena <= startb)
return 0;
if (startb + lenb <= starta)
return 0;
return 1;
}
bool __region_overlap(unsigned long starta, unsigned long lena,
unsigned long startb, unsigned long lenb)
{
return starta <= startb + lenb && starta + lena >= startb;
}
--- /code ---
I used gcc 4.6.2 with the '-O2' option.
Here is the result:
00000000 <_region_overlap>:
0: 00a42821 addu a1,a1,a0
4: 00c5282b sltu a1,a2,a1
8: 10a00003 beqz a1,18 <_region_overlap+0x18>
c: 00e63021 addu a2,a3,a2
10: 03e00008 jr ra
14: 0086102b sltu v0,a0,a2
18: 03e00008 jr ra
1c: 00001021 move v0,zero
00000020 <__region_overlap>:
20: 00e63821 addu a3,a3,a2
24: 00e4382b sltu a3,a3,a0
28: 14e00004 bnez a3,3c <__region_overlap+0x1c>
2c: 00a42021 addu a0,a1,a0
30: 0086302b sltu a2,a0,a2
34: 03e00008 jr ra
38: 38c20001 xori v0,a2,0x1
3c: 03e00008 jr ra
40: 00001021 move v0,zero
You can see that the shorten obfuscated function (__region_overlap)
has ONE MORE processor instruction!
--
Best regards,
Antony Pavlov
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-10-07 6:59 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-05 16:45 [PATCH] cleanup arm startup a bit Sascha Hauer
2012-10-05 16:45 ` [PATCH 1/4] ARM: add assembly function for setting up C environment Sascha Hauer
2012-10-05 16:45 ` [PATCH 2/4] introduce region_overlap() function Sascha Hauer
2012-10-05 19:55 ` Robert Jarzmik
2012-10-05 21:33 ` Sascha Hauer
2012-10-06 19:44 ` Robert Jarzmik
2012-10-07 6:59 ` Antony Pavlov
2012-10-05 16:45 ` [PATCH 3/4] ARM: cleanup piggydata copy check Sascha Hauer
2012-10-05 16:45 ` [PATCH 4/4] ARM: simplify start.c Sascha Hauer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox