linux/arch/arm/kernel/relocate_kernel.S
<<
>>
Prefs
   1/*
   2 * relocate_kernel.S - put the kernel image in place to boot
   3 */
   4
   5#include <asm/kexec.h>
   6
   7        .globl relocate_new_kernel
   8relocate_new_kernel:
   9
  10        ldr     r0,kexec_indirection_page
  11        ldr     r1,kexec_start_address
  12
  13        /*
  14         * If there is no indirection page (we are doing crashdumps)
  15         * skip any relocation.
  16         */
  17        cmp     r0, #0
  18        beq     2f
  19
  200:      /* top, read another word for the indirection page */
  21        ldr     r3, [r0],#4
  22
  23        /* Is it a destination page. Put destination address to r4 */
  24        tst     r3,#1,0
  25        beq     1f
  26        bic     r4,r3,#1
  27        b       0b
  281:
  29        /* Is it an indirection page */
  30        tst     r3,#2,0
  31        beq     1f
  32        bic     r0,r3,#2
  33        b       0b
  341:
  35
  36        /* are we done ? */
  37        tst     r3,#4,0
  38        beq     1f
  39        b       2f
  40
  411:
  42        /* is it source ? */
  43        tst     r3,#8,0
  44        beq     0b
  45        bic r3,r3,#8
  46        mov r6,#1024
  479:
  48        ldr r5,[r3],#4
  49        str r5,[r4],#4
  50        subs r6,r6,#1
  51        bne 9b
  52        b 0b
  53
  542:
  55        /* Jump to relocated kernel */
  56        mov lr,r1
  57        mov r0,#0
  58        ldr r1,kexec_mach_type
  59        ldr r2,kexec_boot_atags
  60 ARM(   mov pc, lr      )
  61 THUMB( bx lr           )
  62
  63        .align
  64
  65        .globl kexec_start_address
  66kexec_start_address:
  67        .long   0x0
  68
  69        .globl kexec_indirection_page
  70kexec_indirection_page:
  71        .long   0x0
  72
  73        .globl kexec_mach_type
  74kexec_mach_type:
  75        .long   0x0
  76
  77        /* phy addr of the atags for the new kernel */
  78        .globl kexec_boot_atags
  79kexec_boot_atags:
  80        .long   0x0
  81
  82relocate_new_kernel_end:
  83
  84        .globl relocate_new_kernel_size
  85relocate_new_kernel_size:
  86        .long relocate_new_kernel_end - relocate_new_kernel
  87
  88
  89