arm64: Treat handle_arch_irq as a function pointer
authorLaura Abbott <lauraa@codeaurora.org>
Fri, 21 Nov 2014 21:50:38 +0000 (21:50 +0000)
committerWill Deacon <will.deacon@arm.com>
Tue, 25 Nov 2014 15:56:44 +0000 (15:56 +0000)
handle_arch_irq isn't actually text, it's just a function pointer.
It doesn't need to be stored in the text section and doing so
causes problesm if we ever want to make the kernel text read only.
Declare handle_arch_irq as a proper function pointer stored in
the data section.

Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Tested-by: Mark Rutland <mark.rutland@arm.com>
Tested-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/include/asm/irq.h
arch/arm64/kernel/entry.S
arch/arm64/kernel/irq.c

index e1f7ecdde11ffd6103bd41ab19e625a9c76c2f85..1eebf5bb0b58c40c8ddad71dbe9dfdc4d6dd3607 100644 (file)
@@ -3,7 +3,6 @@
 
 #include <asm-generic/irq.h>
 
-extern void (*handle_arch_irq)(struct pt_regs *);
 extern void migrate_irqs(void);
 extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));
 
index 622a409916f32cefdc4dd7291bf1b708b5ec70bb..99c8d13fc00dba198f19cffe150ceac8dab90434 100644 (file)
@@ -167,7 +167,8 @@ tsk .req    x28             // current thread_info
  * Interrupt handling.
  */
        .macro  irq_handler
-       ldr     x1, handle_arch_irq
+       adrp    x1, handle_arch_irq
+       ldr     x1, [x1, #:lo12:handle_arch_irq]
        mov     x0, sp
        blr     x1
        .endm
@@ -699,6 +700,3 @@ ENTRY(sys_rt_sigreturn_wrapper)
        mov     x0, sp
        b       sys_rt_sigreturn
 ENDPROC(sys_rt_sigreturn_wrapper)
-
-ENTRY(handle_arch_irq)
-       .quad   0
index 071a6ec13bd8e8beb8324c1ae8557dc20a085cd1..240b75c0e94fdc435a672b740b08d4a848915295 100644 (file)
@@ -40,6 +40,8 @@ int arch_show_interrupts(struct seq_file *p, int prec)
        return 0;
 }
 
+void (*handle_arch_irq)(struct pt_regs *) = NULL;
+
 void __init set_handle_irq(void (*handle_irq)(struct pt_regs *))
 {
        if (handle_arch_irq)