linux/arch/sh/boot/compressed/head_32.S
<<
>>
Prefs
   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
  14startup:
  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
  313:
  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
  601:      .long   1b
  612:      .long   clear_bss
  62text_start_addr:
  63        .long   startup
  64
  65        /* Clear BSS */
  66clear_bss:
  67        mov.l   end_addr, r1
  68        mov.l   bss_start_addr, r2
  69        mov     #0, r0
  70l1:
  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
  90bss_start_addr:
  91        .long   __bss_start
  92end_addr:
  93        .long   _end
  94init_sr:
  95        .long   0x500000F0      /* Privileged mode, Bank=0, Block=1, IMASK=0xF */
  96kexec_magic:
  97        .long   0x400000F0      /* magic used by kexec to parse zImage format */
  98init_stack_addr:
  99        .long   stack_start
 100decompress_kernel_addr:
 101        .long   decompress_kernel
 102kernel_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
 110fake_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
 127