root/arch/sh/boot/compressed/head_32.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  *  linux/arch/sh/boot/compressed/head.S
   4  *
   5  *  Copyright (C) 1999 Stuart Menefy
   6  *  Copyright (C) 2003 SUGIOKA Toshinobu
   7  */
   8 
   9 .text
  10 
  11 #include <asm/page.h>
  12 
  13         .global startup
  14 startup:
  15         /* Load initial status register */
  16         mov.l   init_sr, r1
  17         ldc     r1, sr
  18 
  19         /* Move myself to proper location if necessary */
  20         mova    1f, r0
  21         mov.l   1f, r2
  22         cmp/eq  r2, r0
  23         bt      clear_bss
  24         sub     r0, r2
  25         mov.l   bss_start_addr, r0
  26         mov     #0xffffffe0, r1
  27         and     r1, r0                  ! align cache line
  28         mov.l   text_start_addr, r3
  29         mov     r0, r1
  30         sub     r2, r1
  31 3:
  32         mov.l   @r1, r4
  33         mov.l   @(4,r1), r5
  34         mov.l   @(8,r1), r6
  35         mov.l   @(12,r1), r7
  36         mov.l   @(16,r1), r8
  37         mov.l   @(20,r1), r9
  38         mov.l   @(24,r1), r10
  39         mov.l   @(28,r1), r11
  40         mov.l   r4, @r0
  41         mov.l   r5, @(4,r0)
  42         mov.l   r6, @(8,r0)
  43         mov.l   r7, @(12,r0)
  44         mov.l   r8, @(16,r0)
  45         mov.l   r9, @(20,r0)
  46         mov.l   r10, @(24,r0)
  47         mov.l   r11, @(28,r0)
  48 #ifdef CONFIG_CPU_SH4
  49         ocbwb   @r0
  50 #endif
  51         cmp/hi  r3, r0
  52         add     #-32, r0
  53         bt/s    3b
  54          add    #-32, r1
  55         mov.l   2f, r0
  56         jmp     @r0
  57          nop
  58 
  59         .align 2
  60 1:      .long   1b
  61 2:      .long   clear_bss
  62 text_start_addr:
  63         .long   startup
  64 
  65         /* Clear BSS */
  66 clear_bss:
  67         mov.l   end_addr, r1
  68         mov.l   bss_start_addr, r2
  69         mov     #0, r0
  70 l1:
  71         mov.l   r0, @-r1
  72         cmp/eq  r1,r2
  73         bf      l1
  74 
  75         /* Set the initial pointer. */
  76         mov.l   init_stack_addr, r0
  77         mov.l   @r0, r15
  78 
  79         /* Decompress the kernel */
  80         mov.l   decompress_kernel_addr, r0
  81         jsr     @r0
  82         nop
  83 
  84         /* Jump to the start of the decompressed kernel */
  85         mov.l   kernel_start_addr, r0
  86         jmp     @r0
  87         nop
  88         
  89         .align  2
  90 bss_start_addr:
  91         .long   __bss_start
  92 end_addr:
  93         .long   _end
  94 init_sr:
  95         .long   0x500000F0      /* Privileged mode, Bank=0, Block=1, IMASK=0xF */
  96 kexec_magic:
  97         .long   0x400000F0      /* magic used by kexec to parse zImage format */
  98 init_stack_addr:
  99         .long   stack_start
 100 decompress_kernel_addr:
 101         .long   decompress_kernel
 102 kernel_start_addr:
 103 #ifdef CONFIG_32BIT
 104         .long   ___pa(_text+PAGE_SIZE)
 105 #else
 106         .long   _text+PAGE_SIZE
 107 #endif
 108 
 109         .align  9
 110 fake_headers_as_bzImage:
 111         .word   0
 112         .ascii  "HdrS"          ! header signature
 113         .word   0x0202          ! header version number (>= 0x0105)
 114                                 ! or else old loadlin-1.5 will fail)
 115         .word   0               ! default_switch
 116         .word   0               ! SETUPSEG
 117         .word   0x1000
 118         .word   0               ! pointing to kernel version string
 119         .byte   0               ! = 0, old one (LILO, Loadlin,
 120                                 ! 0xTV: T=0 for LILO
 121                                 !       V = version
 122         .byte   1               ! Load flags bzImage=1
 123         .word   0x8000          ! size to move, when setup is not
 124         .long   0x100000        ! 0x100000 = default for big kernel
 125         .long   0               ! address of loaded ramdisk image
 126         .long   0               # its size in bytes

/* [<][>][^][v][top][bottom][index][help] */