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        mov pc,lr
  61
  62        .align
  63
  64        .globl kexec_start_address
  65kexec_start_address:
  66        .long   0x0
  67
  68        .globl kexec_indirection_page
  69kexec_indirection_page:
  70        .long   0x0
  71
  72        .globl kexec_mach_type
  73kexec_mach_type:
  74        .long   0x0
  75
  76        /* phy addr of the atags for the new kernel */
  77        .globl kexec_boot_atags
  78kexec_boot_atags:
  79        .long   0x0
  80
  81relocate_new_kernel_end:
  82
  83        .globl relocate_new_kernel_size
  84relocate_new_kernel_size:
  85        .long relocate_new_kernel_end - relocate_new_kernel
  86
  87
  88