execkern.S revision 1.2 1 |
2 | execute NetBSD kernel
3 |
4 | written by Yasha (ITOH Yasufumi)
5 | public domain
6 |
7 | $NetBSD: execkern.S,v 1.2 2001/06/12 16:57:27 minoura Exp $
8
9 /* XXX this value is from <machine/exec_aout.h> */
10 #define __LDPGSZ 8192
11
12 #define MFP 0x00E88000 /* MFP */
13 #define MFP_IERA (MFP+0x07) /* (B) interrupt enable reg A */
14 #define MFP_IERB (MFP+0x09) /* (B) interrupt enable reg B */
15 #define MFP_RSR (MFP+0x2B) /* (B) USART receiver status reg */
16
17 #ifndef SRAM_MEMSZ
18 #define SRAM 0x00ED0000 /* SRAM start addr */
19 #define SRAM_MEMSZ (SRAM + 8) /* (L) size of main memory */
20 #endif
21
22 | %a3+0 kernel image top address (a.out header is excluded)
23 | %a3+4 load address
24 | %a3+8 text size
25 | %a3+12 data size
26 | %a3+16 bss size
27 | %a3+20 symbol size
28 | %a3+24 (reserved) (%d5)
29 | %a3+28 bootdev (%d6)
30 | %a3+32 boothowto (%d7)
31 | %a3+36 entry address (absolute address)
32
33 #ifndef XK_NO_C_INTERFACE
34 .text
35 .even
36 ENTRY_NOPROFILE(exec_kernel)
37 addql #4,%sp
38 moveal %sp@+,%a3 | struct execkern_arg *
39 #endif
40
41 moveal %a3@+,%a0 | image address
42 moveal %a3@+,%a1 | load address
43 movel %a1,%d3
44
45 |
46 | copy image
47 |
48
49 | copy text segment
50 movel %a3@+,%d0 | text size
51 movel %d0,%d1
52 jbsr copy
53
54 | clear gap between text and data
55 negl %d1
56 andil #__LDPGSZ-1,%d1
57 movel %d1,%d0 | gap size between text and data
58 jbsr clear
59
60 | copy data segment
61 movel %a3@+,%d0 | data size
62 jbsr copy
63
64 | clear bss
65 movel %a3@+,%d0 | bss size
66 jbsr clear
67
68 | copy symbol table
69 movel %a3@+,%d0 | symbol table size
70 movel %d0,%a1@+
71 beqs Lnotable
72 jbsr copy
73
74 | copy string table size
75 movel %a0@+,%d0
76 movel %d0,%a1@+
77 beqs Lnotable
78
79 | copy string table
80 subql #4,%d0 | table size is already copied
81 jbsr copy
82
83 Lnotable:
84
85 | stop MFP interrupts (for compatibility)
86 clrb MFP_IERA
87 clrb MFP_IERB
88 clrb MFP_RSR
89
90 |
91 | execute kernel
92 | start(load_addr, mem_max, kernel_end)
93 |
94 movel %a1,%d0
95 addql #3,%d0
96 andib #0xFC,%d0
97 subl %d3,%d0
98 movel %d0,%sp@- | arg #3 (kernel size)
99 movel SRAM_MEMSZ,%sp@- | arg #2 (RAM size from SRAM)
100 movel %d3,%sp@- | arg #1 (load address)
101
102 #if 0
103 movel %a3@+,%d5 | (reserved)
104 movel %a3@+,%d6 | boot device
105 movel %a3@+,%d7 | boot howto
106
107 movel %a3@+,%a0 | entry address
108 #else /* optimized */
109 moveml %a3@+,%d5-%d7/%a0
110 #endif
111
112 | clear unused registers
113 moveq #0,%d0
114 moveq #0,%d1
115 moveq #0,%d2
116 moveq #0,%d3
117 moveq #0,%d4
118 moveal %d0,%a1
119 moveal %d0,%a2
120 moveal %d0,%a3
121 moveal %d0,%a4
122 moveal %d0,%a5
123 moveal %d0,%a6
124
125 jsr %a0@ | execute NetBSD kernel
126 | NOTREACHED
127
128 | ??? returned from kernel -- issue software reset
129 subal %a1,%a1
130 moveml 0x00ff0000,#0x0101 | get RESET vectors (%d0: ssp, %a0: pc)
131 moveml #0x0101,%a1@ | put them at 0x00000000 (for Xellent)
132 .long 0x4E7B9801 | movec %a1,%vbr
133 jmp %a0@ | go to reset address
134
135
136 |
137 | utility routines
138 |
139
140 | copy %d0 bytes from higher (%a0) to lower (%a1) address
141 1: moveb %a0@+,%a1@+
142 copy: subql #1,%d0
143 bpls 1b
144 rts
145
146 | clear %d0 bytes at %a1
147 | do nothing if %d0 is zero
148 1: clrb %a1@+
149 clear: subql #1,%d0
150 bpls 1b
151 rts
152