Loading...
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
22ENTRY(_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
271: 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
331: initd 0(r1)
34 sub r1, r1, r2
35 bgt r1, r0, 1b
36
37 nextpc r1 /* Find out where we are */
38chkadr:
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 */
461: 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
541: 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
60finish_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. */
641: 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
901: 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
961: 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
105fake_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
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
22ENTRY(_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
271: 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
331: initd 0(r1)
34 sub r1, r1, r2
35 bgt r1, r0, 1b
36
37 nextpc r1 /* Find out where we are */
38chkadr:
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 */
461: 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
541: 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
60finish_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. */
641: 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
901: 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
961: 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
105fake_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