Thread (15 messages) 15 messages, 4 authors, 2017-10-03
STALE3205d
Revisions (6)
  1. v1 [diff vs current]
  2. v1 [diff vs current]
  3. v2 [diff vs current]
  4. v2 current
  5. v2 [diff vs current]
  6. v2 [diff vs current]

[PATCH v2 1/5] ARM: head-common.S: speed up startup code

From: geert@linux-m68k.org (Geert Uytterhoeven)
Date: 2017-10-03 12:41:29
Also in: linux-renesas-soc

Hi Nicolas,

On Wed, Aug 30, 2017 at 4:55 AM, Nicolas Pitre [off-list ref] wrote:
Let's use optimized routines such as memcpy to copy .data and memzero
to clear .bss in the startup code instead of doing it one word at a
time. Those routines don't use any global data so they're safe to use
even if .data and .bss segments are not initialized.

In the .data copy case a temporary stack is installed in the .bss area
as the actual kernel stack is located within the copied data area. The
XIP kernel linker script ensures a 8 byte alignment for that purpose.

Finally, make the .data copy and related pointers surrounded by
CONFIG_XIP_KERNEL to make it obvious what it is all about. This will
allow for further cleanups in the non-XIP linker script.

Signed-off-by: Nicolas Pitre <redacted>
Reviewed-by: Ard Biesheuvel <redacted>
This is now commit 9520b1a1b5f7a348 ("ARM: head-common.S: speed up startup
code") in arm/for-next.

If CONFIG_DEBUG_LOCK_ALLOC=y, the kernel log is spammed with a few hundred
identical messages on various Renesas systems:

    unwind: Unknown symbol address c0800300
    unwind: Index not found c0800300

I've bisected this to the aforementioned commit.

c0800300 points to the instruction just after the __memzero call, cfr. below.

Do you have a clue? Thanks!
quoted hunk ↗ jump to hunk
--- a/arch/arm/kernel/head-common.S
+++ b/arch/arm/kernel/head-common.S
@@ -79,47 +79,59 @@ ENDPROC(__vet_atags)
  */
        __INIT
 __mmap_switched:
-       adr     r3, __mmap_switched_data
-
-       ldmia   r3!, {r4, r5, r6, r7}
-       cmp     r4, r5                          @ Copy data segment if needed
-1:     cmpne   r5, r6
-       ldrne   fp, [r4], #4
-       strne   fp, [r5], #4
-       bne     1b
-
-       mov     fp, #0                          @ Clear BSS (and zero fp)
-1:     cmp     r6, r7
-       strcc   fp, [r6],#4
-       bcc     1b
-
- ARM(  ldmia   r3, {r4, r5, r6, r7, sp})
- THUMB(        ldmia   r3, {r4, r5, r6, r7}    )
- THUMB(        ldr     sp, [r3, #16]           )
-       str     r9, [r4]                        @ Save processor ID
-       str     r1, [r5]                        @ Save machine type
-       str     r2, [r6]                        @ Save atags pointer
-       cmp     r7, #0
-       strne   r0, [r7]                        @ Save control register values
+
+       mov     r7, r1
+       mov     r8, r2
+       mov     r10, r0
+
+       adr     r4, __mmap_switched_data
+       mov     fp, #0
+
+#ifdef CONFIG_XIP_KERNEL
+   ARM(        ldmia   r4!, {r0, r1, r2, sp} )
+ THUMB(        ldmia   r4!, {r0, r1, r2, r3} )
+ THUMB(        mov     sp, r3 )
+       sub     r2, r2, r1
+       bl      memcpy                          @ copy .data to RAM
+#endif
+
+   ARM(        ldmia   r4!, {r0, r1, sp} )
+ THUMB(        ldmia   r4!, {r0, r1, r3} )
+ THUMB(        mov     sp, r3 )
+       sub     r1, r1, r0
+       bl      __memzero                       @ clear .bss
+
c0800300 is the address of the next instruction:
+       ldmia   r4, {r0, r1, r2, r3}
+       str     r9, [r0]                        @ Save processor ID
+       str     r7, [r1]                        @ Save machine type
+       str     r8, [r2]                        @ Save atags pointer
+       cmp     r3, #0
+       strne   r10, [r3]                       @ Save control register values
        b       start_kernel
 ENDPROC(__mmap_switched)

        .align  2
        .type   __mmap_switched_data, %object
 __mmap_switched_data:
-       .long   __data_loc                      @ r4
-       .long   _sdata                          @ r5
-       .long   __bss_start                     @ r6
-       .long   _end                            @ r7
-       .long   processor_id                    @ r4
-       .long   __machine_arch_type             @ r5
-       .long   __atags_pointer                 @ r6
+#ifdef CONFIG_XIP_KERNEL
+       .long   _sdata                          @ r0
+       .long   __data_loc                      @ r1
+       .long   _edata_loc                      @ r2
+       .long   __bss_stop                      @ sp (temporary stack in .bss)
+#endif
+
+       .long   __bss_start                     @ r0
+       .long   __bss_stop                      @ r1
+       .long   init_thread_union + THREAD_START_SP @ sp
+
+       .long   processor_id                    @ r0
+       .long   __machine_arch_type             @ r1
+       .long   __atags_pointer                 @ r2
 #ifdef CONFIG_CPU_CP15
-       .long   cr_alignment                    @ r7
+       .long   cr_alignment                    @ r3
 #else
-       .long   0                               @ r7
+       .long   0                               @ r3
 #endif
-       .long   init_thread_union + THREAD_START_SP @ sp
        .size   __mmap_switched_data, . - __mmap_switched_data
Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert at linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help