diff options
author | H. Peter Anvin <hpa@zytor.com> | 2009-05-23 19:42:19 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2009-05-23 19:42:19 -0400 |
commit | ee0736627d3347be0be2769fa7b26431f9726c9d (patch) | |
tree | 203e2204daaec4cf005463fdf2c7bf380d6eef36 /arch/cris/boot/compressed/head_v10.S | |
parent | cf9972a921470b0a2da7906104bcd540b20e33bf (diff) | |
parent | 0af48f42df15b97080b450d24219dd95db7b929a (diff) |
Merge branch 'x86/urgent' into x86/setup
Resolved conflicts:
arch/x86/boot/memory.c
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch/cris/boot/compressed/head_v10.S')
-rw-r--r-- | arch/cris/boot/compressed/head_v10.S | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/arch/cris/boot/compressed/head_v10.S b/arch/cris/boot/compressed/head_v10.S new file mode 100644 index 000000000000..9edb8ade7e1f --- /dev/null +++ b/arch/cris/boot/compressed/head_v10.S | |||
@@ -0,0 +1,126 @@ | |||
1 | /* | ||
2 | * arch/cris/boot/compressed/head.S | ||
3 | * | ||
4 | * Copyright (C) 1999, 2001 Axis Communications AB | ||
5 | * | ||
6 | * Code that sets up the DRAM registers, calls the | ||
7 | * decompressor to unpack the piggybacked kernel, and jumps. | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #define ASSEMBLER_MACROS_ONLY | ||
12 | #include <arch/sv_addr_ag.h> | ||
13 | |||
14 | #define RAM_INIT_MAGIC 0x56902387 | ||
15 | #define COMMAND_LINE_MAGIC 0x87109563 | ||
16 | |||
17 | ;; Exported symbols | ||
18 | |||
19 | .globl input_data | ||
20 | |||
21 | |||
22 | .text | ||
23 | |||
24 | nop | ||
25 | di | ||
26 | |||
27 | ;; We need to initialze DRAM registers before we start using the DRAM | ||
28 | |||
29 | cmp.d RAM_INIT_MAGIC, $r8 ; Already initialized? | ||
30 | beq dram_init_finished | ||
31 | nop | ||
32 | |||
33 | #include "../../arch-v10/lib/dram_init.S" | ||
34 | |||
35 | dram_init_finished: | ||
36 | |||
37 | ;; Initiate the PA and PB ports | ||
38 | |||
39 | move.b CONFIG_ETRAX_DEF_R_PORT_PA_DATA, $r0 | ||
40 | move.b $r0, [R_PORT_PA_DATA] | ||
41 | |||
42 | move.b CONFIG_ETRAX_DEF_R_PORT_PA_DIR, $r0 | ||
43 | move.b $r0, [R_PORT_PA_DIR] | ||
44 | |||
45 | move.b CONFIG_ETRAX_DEF_R_PORT_PB_DATA, $r0 | ||
46 | move.b $r0, [R_PORT_PB_DATA] | ||
47 | |||
48 | move.b CONFIG_ETRAX_DEF_R_PORT_PB_DIR, $r0 | ||
49 | move.b $r0, [R_PORT_PB_DIR] | ||
50 | |||
51 | ;; Setup the stack to a suitably high address. | ||
52 | ;; We assume 8 MB is the minimum DRAM in an eLinux | ||
53 | ;; product and put the sp at the top for now. | ||
54 | |||
55 | move.d 0x40800000, $sp | ||
56 | |||
57 | ;; Figure out where the compressed piggyback image is | ||
58 | ;; in the flash (since we wont try to copy it to DRAM | ||
59 | ;; before unpacking). It is at _edata, but in flash. | ||
60 | ;; Use (_edata - basse) as offset to the current PC. | ||
61 | |||
62 | basse: move.d $pc, $r5 | ||
63 | and.d 0x7fffffff, $r5 ; strip any non-cache bit | ||
64 | subq 2, $r5 ; compensate for the move.d $pc instr | ||
65 | move.d $r5, $r0 ; save for later - flash address of 'basse' | ||
66 | add.d _edata, $r5 | ||
67 | sub.d basse, $r5 ; $r5 = flash address of '_edata' | ||
68 | |||
69 | ;; Copy text+data to DRAM | ||
70 | |||
71 | move.d basse, $r1 ; destination | ||
72 | move.d _edata, $r2 ; end destination | ||
73 | 1: move.w [$r0+], $r3 | ||
74 | move.w $r3, [$r1+] | ||
75 | cmp.d $r2, $r1 | ||
76 | bcs 1b | ||
77 | nop | ||
78 | |||
79 | move.d $r5, [input_data] ; for the decompressor | ||
80 | |||
81 | |||
82 | ;; Clear the decompressors BSS (between _edata and _end) | ||
83 | |||
84 | moveq 0, $r0 | ||
85 | move.d _edata, $r1 | ||
86 | move.d _end, $r2 | ||
87 | 1: move.w $r0, [$r1+] | ||
88 | cmp.d $r2, $r1 | ||
89 | bcs 1b | ||
90 | nop | ||
91 | |||
92 | ;; Save command line magic and address. | ||
93 | move.d _cmd_line_magic, $r12 | ||
94 | move.d $r10, [$r12] | ||
95 | move.d _cmd_line_addr, $r12 | ||
96 | move.d $r11, [$r12] | ||
97 | |||
98 | ;; Do the decompression and save compressed size in inptr | ||
99 | |||
100 | jsr decompress_kernel | ||
101 | |||
102 | ;; Put start address of root partition in $r9 so the kernel can use it | ||
103 | ;; when mounting from flash | ||
104 | |||
105 | move.d [input_data], $r9 ; flash address of compressed kernel | ||
106 | add.d [inptr], $r9 ; size of compressed kernel | ||
107 | |||
108 | ;; Restore command line magic and address. | ||
109 | move.d _cmd_line_magic, $r10 | ||
110 | move.d [$r10], $r10 | ||
111 | move.d _cmd_line_addr, $r11 | ||
112 | move.d [$r11], $r11 | ||
113 | |||
114 | ;; Enter the decompressed kernel | ||
115 | move.d RAM_INIT_MAGIC, $r8 ; Tell kernel that DRAM is initialized | ||
116 | jump 0x40004000 ; kernel is linked to this address | ||
117 | |||
118 | .data | ||
119 | |||
120 | input_data: | ||
121 | .dword 0 ; used by the decompressor | ||
122 | _cmd_line_magic: | ||
123 | .dword 0 | ||
124 | _cmd_line_addr: | ||
125 | .dword 0 | ||
126 | #include "../../arch-v10/lib/hw_settings.S" | ||