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