]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - arch/nios2/boot/compressed/head.S
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[mirror_ubuntu-bionic-kernel.git] / arch / nios2 / boot / compressed / head.S
1 /*
2 * Copyright (C) 2009 Thomas Chou <thomas@wytron.com.tw>
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