Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/nios2/boot/compressed/head.S
26489 views
1
/*
2
* Copyright (C) 2009 Thomas Chou <[email protected]>
3
*
4
* Based on arch/nios2/kernel/head.S
5
*
6
* This file is subject to the terms and conditions of the GNU General Public
7
* License. See the file "COPYING" in the main directory of this archive
8
* for more details.
9
*
10
*/
11
12
/*
13
* This code can be loaded anywhere, eg FLASH ROM as reset vector,
14
* as long as output does not overlap it.
15
*/
16
17
#include <linux/linkage.h>
18
#include <asm/cache.h>
19
20
.text
21
.set noat
22
ENTRY(_start)
23
wrctl status, r0 /* disable interrupt */
24
/* invalidate all instruction cache */
25
movia r1, NIOS2_ICACHE_SIZE
26
movui r2, NIOS2_ICACHE_LINE_SIZE
27
1: initi r1
28
sub r1, r1, r2
29
bgt r1, r0, 1b
30
/* invalidate all data cache */
31
movia r1, NIOS2_DCACHE_SIZE
32
movui r2, NIOS2_DCACHE_LINE_SIZE
33
1: initd 0(r1)
34
sub r1, r1, r2
35
bgt r1, r0, 1b
36
37
nextpc r1 /* Find out where we are */
38
chkadr:
39
movia r2, chkadr
40
beq r1, r2, finish_move /* We are running in correct address,
41
done */
42
/* move code, r1: src, r2: dest, r3: last dest */
43
addi r1, r1, (_start - chkadr) /* Source */
44
movia r2, _start /* Destination */
45
movia r3, __bss_start /* End of copy */
46
1: ldw r8, 0(r1) /* load a word from [r1] */
47
stw r8, 0(r2) /* stort a word to dest [r2] */
48
addi r1, r1, 4 /* inc the src addr */
49
addi r2, r2, 4 /* inc the dest addr */
50
blt r2, r3, 1b
51
/* flush the data cache after moving */
52
movia r1, NIOS2_DCACHE_SIZE
53
movui r2, NIOS2_DCACHE_LINE_SIZE
54
1: flushd 0(r1)
55
sub r1, r1, r2
56
bgt r1, r0, 1b
57
movia r1, finish_move
58
jmp r1 /* jmp to linked address */
59
60
finish_move:
61
/* zero out the .bss segment (uninitialized common data) */
62
movia r2, __bss_start /* presume nothing is between */
63
movia r1, _end /* the .bss and _end. */
64
1: stb r0, 0(r2)
65
addi r2, r2, 1
66
bne r1, r2, 1b
67
/*
68
* set up the stack pointer, some where higher than _end.
69
* The stack space must be greater than 32K for decompress.
70
*/
71
movia sp, 0x10000
72
add sp, sp, r1
73
/* save args passed from u-boot, maybe */
74
addi sp, sp, -16
75
stw r4, 0(sp)
76
stw r5, 4(sp)
77
stw r6, 8(sp)
78
stw r7, 12(sp)
79
/* decompress the kernel */
80
call decompress_kernel
81
/* pass saved args to kernel */
82
ldw r4, 0(sp)
83
ldw r5, 4(sp)
84
ldw r6, 8(sp)
85
ldw r7, 12(sp)
86
87
/* flush all data cache after decompressing */
88
movia r1, NIOS2_DCACHE_SIZE
89
movui r2, NIOS2_DCACHE_LINE_SIZE
90
1: flushd 0(r1)
91
sub r1, r1, r2
92
bgt r1, r0, 1b
93
/* flush all instruction cache */
94
movia r1, NIOS2_ICACHE_SIZE
95
movui r2, NIOS2_ICACHE_LINE_SIZE
96
1: flushi r1
97
sub r1, r1, r2
98
bgt r1, r0, 1b
99
flushp
100
/* jump to start real kernel */
101
movia r1, (CONFIG_NIOS2_MEM_BASE | CONFIG_NIOS2_KERNEL_REGION_BASE)
102
jmp r1
103
104
.balign 512
105
fake_headers_as_bzImage:
106
.short 0
107
.ascii "HdrS"
108
.short 0x0202
109
.short 0
110
.short 0
111
.byte 0x00, 0x10
112
.short 0
113
.byte 0
114
.byte 1
115
.byte 0x00, 0x80
116
.long 0
117
.long 0
118
119