sh: SMP support for SH2 entry.S
authorRich Felker <dalias@libc.org>
Mon, 15 Feb 2016 18:32:31 +0000 (18:32 +0000)
committerRich Felker <dalias@libc.org>
Fri, 5 Aug 2016 03:29:37 +0000 (03:29 +0000)
The SH2 version of entry.S uses global variables, which need to be
cpu-local in order to work with SMP. For ease of access from asm,
simply use arrays indexed by cpu number, and require the availability
of an address (mmio register or properly setup per-cpu memory) from
which the current cpu's index can be read.

Signed-off-by: Rich Felker <dalias@libc.org>
arch/sh/kernel/cpu/sh2/entry.S

index 16bde0e..1ee0a6e 100644 (file)
@@ -47,6 +47,13 @@ ENTRY(exception_handler)
        mov.l   r3,@-sp
        cli
        mov.l   $cpu_mode,r2
+#ifdef CONFIG_SMP
+       mov.l   $cpuid,r3
+       mov.l   @r3,r3
+       mov.l   @r3,r3
+       shll2   r3
+       add     r3,r2
+#endif
        mov.l   @r2,r0
        mov.l   @(5*4,r15),r3   ! previous SR
        or      r0,r3           ! set MD
@@ -57,6 +64,13 @@ ENTRY(exception_handler)
        mov.l   __md_bit,r0
        mov.l   r0,@r2          ! enter kernel mode
        mov.l   $current_thread_info,r2
+#ifdef CONFIG_SMP
+       mov.l   $cpuid,r0
+       mov.l   @r0,r0
+       mov.l   @r0,r0
+       shll2   r0
+       add     r0,r2
+#endif
        mov.l   @r2,r2
        mov     #(THREAD_SIZE >> 8),r0
        shll8   r0
@@ -265,6 +279,13 @@ restore_all:
        lds.l   @r0+,macl
        mov     r15,r0
        mov.l   $cpu_mode,r2
+#ifdef CONFIG_SMP
+       mov.l   $cpuid,r3
+       mov.l   @r3,r3
+       mov.l   @r3,r3
+       shll2   r3
+       add     r3,r2
+#endif
        mov     #OFF_SR,r3
        mov.l   @(r0,r3),r1
        mov.l   __md_bit,r3
@@ -281,6 +302,13 @@ restore_all:
        mov.l   r1,@r2                          ! set pc
        get_current_thread_info r0, r1
        mov.l   $current_thread_info,r1
+#ifdef CONFIG_SMP
+       mov.l   $cpuid,r3
+       mov.l   @r3,r3
+       mov.l   @r3,r3
+       shll2   r3
+       add     r3,r1
+#endif
        mov.l   r0,@r1
        mov.l   @r15+,r0
        mov.l   @r15+,r1
@@ -308,19 +336,41 @@ $current_thread_info:
        .long   __current_thread_info
 $cpu_mode:     
        .long   __cpu_mode
+#ifdef CONFIG_SMP
+$cpuid:
+       .long sh2_cpuid_addr
+#endif
                
 ! common exception handler
 #include "../../entry-common.S"
+
+#ifdef CONFIG_NR_CPUS
+#define NR_CPUS CONFIG_NR_CPUS
+#else
+#define NR_CPUS 1
+#endif
        
        .data
 ! cpu operation mode 
 ! bit30 = MD (compatible SH3/4)
 __cpu_mode:
+       .rept   NR_CPUS
        .long   0x40000000
+       .endr
+
+#ifdef CONFIG_SMP
+.global sh2_cpuid_addr
+sh2_cpuid_addr:
+       .long   dummy_cpuid
+dummy_cpuid:
+       .long   0
+#endif
                
        .section        .bss
 __current_thread_info:
+       .rept   NR_CPUS
        .long   0
+       .endr
 
 ENTRY(exception_handling_table)
        .space  4*32