Deleted Added
sdiff udiff text old ( 8008:257eb95aead3 ) new ( 8012:2f71125bf413 )
full compact
1
2/* taken from ebfw/rom/dbmentry.s */
3
4#define EB164
5/*#ifndef LINT
6.data
7.asciiz "$Id: dbmentry.s,v 1.1.1.1 1997/10/30 23:27:12 verghese Exp $"
8.text
9#endif
10*/
11/*
12 * Debug Monitor Entry code
13 */
14
15#ifndef MAKEDEPEND
16#include "ev5_impure.h"
17#include "cserve.h"
18#include "fromHudsonOsf.h"
19#endif
20
21//#include "paldefs.h"
22#include "regdefs.h"
23#include "eb164.h"
24//#include "ledcodes.h"
25
26 .text
27
28/* return address and padding to octaword align */
29#define STARTFRM 16
30
31 .globl __start
32 .ent __start, 0
33__start:
34_entry:
35 br t0, 2f # get the current PC
362: ldgp gp, 0(t0) # init gp
37
38
39#ifdef original_xxm
40 lda a2, CSERVE_K_RD_IMPURE
41 call_pal PAL_CSERVE_ENTRY
42 lda v0, CNS_Q_BASE(v0)
43
44 # Add KSEG offset to the impure area
45 subq zero, 1, t0
46 sll t0, 42, t0
47 addq t0, v0, v0
48
49 lda t0, CNS_Q_SIGNATURE(v0)
50 bic t0, 0x07, t0 # Clear bottom 3 bits to avoid
51 # allignment errors if the
52 # impure area is total rubbish
53 ldq t0, 0x00(t0)
54 srl t0, 16, t0 # Shift signature into bottom 16 bits.
55 lda t6, 0xDECB(zero) # Load the expected valid signature.
56 zap t6, 0xFC, t6 # Clear the upper bits.
57 cmpeq t0, t6, t0 # Is this a valid signature?
58 beq t0, 1f # Not valid, don't trust input params.
59
60/*
61 * Init the stack at the first 8K boundary
62 * below the top of memory.
63 */
64 lda t0, CNS_Q_MEM_SIZE(v0)
65 ldq t0, 0x00(t0) # Load memory size.
66 subq t0, 1, t0 # Last address in memory
67 srl t0, 13, t0 # Align to first 8KB boundary
68 sll t0, 13, sp # below the top of memory.
69 br zero, 2f
70
71/*
72 * If memory size was not passed in via the
73 * PALcode impure data use the system specific
74 * MINIMUM_SYSTEM_MEMORY definition.
75 */
761:
77 lda sp, (MINIMUM_SYSTEM_MEMORY&0xffff)(zero)
78 ldah sp, ((MINIMUM_SYSTEM_MEMORY+0x8000)>>16)(sp)
79 lda t0, (8*1024)(zero) # Allow for 8KB guard page.
80 subq sp, t0, sp
81
822:
83
84#endif /* original_xxm */
85
86
87 /*
88 * SimOS. Stack pointer is start of a valid phys or KSEG page
89 */
90
91 bis sp,sp,s0 /* save sp */
92
93slave: lda v0,(8*1024)(sp) /* end of page */
94
95 subq zero, 1, t0
96 sll t0, 42, t0
97 bis t0, v0, sp
98
99#ifdef original_xxm
100 # Add KSEG offset to the stack pointer
101 subq zero, 1, t0
102 sll t0, 42, t0
103 addq t0, sp, sp
104#endif
105
106 lda sp, -STARTFRM(sp) # Create a stack frame
107 stq ra, 0(sp) # Place return address on the stack
108
109 .mask 0x84000000, -8
110 .frame sp, STARTFRM, ra
111
112/*
113 * Enable the Floating Point Unit
114 */
115 lda a0, 1(zero)
116 call_pal PAL_WRFEN_ENTRY
117
118/*
119 * Every good C program has a main()
120 */
121
122 beq s0,master
123
124 call_pal PAL_WHAMI_ENTRY
125 bis v0,v0,a0
126 jsr ra, SlaveLoop
127master:
128 jsr ra, main
129
130
131
132/*
133 * The Debug Monitor should never return.
134 * However, just incase...
135 */
136 ldgp gp, 0(ra)
137 bsr zero, _exit
138
139.end __start
140
141
142
143 .globl _exit
144 .ent _exit, 0
145_exit:
146
147 ldq ra, 0(sp) # restore return address
148 lda sp, STARTFRM(sp) # prune back the stack
149 ret zero, (ra) # Back from whence we came
150.end _exit
151
152 .globl cServe
153 .ent cServe 2
154cServe:
155 .option O1
156 .frame sp, 0, ra
157 call_pal PAL_CSERVE_ENTRY
158 ret zero, (ra)
159 .end cServe
160
161 .globl wrfen
162 .ent wrfen 2
163wrfen:
164 .option O1
165 .frame sp, 0, ra
166 call_pal PAL_WRFEN_ENTRY
167 ret zero, (ra)
168 .end wrfen
169 .globl consoleCallback
170 .ent consoleCallback 2
171consoleCallback:
172 br t0, 2f # get the current PC
1732: ldgp gp, 0(t0) # init gp
174 lda sp,-64(sp)
175 stq ra,0(sp)
176 jsr CallBackDispatcher
177 ldq ra,0(sp)
178 lda sp,64(sp)
179 ret zero,(ra)
180 .end consoleCallback
181
182
183 .globl consoleFixup
184 .ent consoleFixup 2
185consoleFixup:
186 br t0, 2f # get the current PC
1872: ldgp gp, 0(t0) # init gp
188 lda sp,-64(sp)
189 stq ra,0(sp)
190 jsr CallBackFixup
191 ldq ra,0(sp)
192 lda sp,64(sp)
193 ret zero,(ra)
194 .end consoleFixup
195
196
197
198 .globl SpinLock
199 .ent SpinLock 2
200SpinLock:
2011:
202 ldq_l a1,0(a0) # interlock complete lock state
203 subl ra,3,v0 # get calling addr[31:0] + 1
204 blbs a1,2f # branch if lock is busy
205 stq_c v0,0(a0) # attempt to acquire lock
206 beq v0,2f # branch if lost atomicity
207 mb # ensure memory coherence
208 ret zero,(ra) # return to caller (v0 is 1)
2092:
210 br zero,1b
211 .end SpinLock
212
213 .globl loadContext
214 .ent loadContext 2
215loadContext:
216 .option O1
217 .frame sp, 0, ra
218 call_pal PAL_SWPCTX_ENTRY
219 ret zero, (ra)
220 .end loadContext
221
222
223 .globl SlaveSpin # Very carefully spin wait
224 .ent SlaveSpin 2 # and swap context without
225SlaveSpin: # using any stack space
226 .option O1
227 .frame sp, 0, ra
228 mov a0, t0 # cpu number
229 mov a1, t1 # cpu rpb pointer (virtual)
230 mov a2, t2 # what to spin on
231
232test: ldl t3, 0(t2)
233 beq t3, test
234 zapnot t1,0x1f,a0 # make rpb physical
235 call_pal PAL_SWPCTX_ENTRY # switch to pcb
236 mov t0, a0 # setup args for SlaveCmd
237 mov t1, a1
238 jsr SlaveCmd # call SlaveCmd
239 ret zero, (ra) # Should never be reached
240 .end SlaveSpin
241
242