dbmentry.S revision 8012
114205Sandreas.sandberg@arm.com/*
214205Sandreas.sandberg@arm.comCopyright (c) 2003, 2004
314205Sandreas.sandberg@arm.comThe Regents of The University of Michigan
414205Sandreas.sandberg@arm.comAll Rights Reserved
514205Sandreas.sandberg@arm.com
614205Sandreas.sandberg@arm.comThis code is part of the M5 simulator, developed by Nathan Binkert,
714205Sandreas.sandberg@arm.comErik Hallnor, Steve Raasch, and Steve Reinhardt, with contributions
814205Sandreas.sandberg@arm.comfrom Ron Dreslinski, Dave Greene, Lisa Hsu, Ali Saidi, and Andrew
914205Sandreas.sandberg@arm.comSchultz.
1014205Sandreas.sandberg@arm.com
1114205Sandreas.sandberg@arm.comPermission is granted to use, copy, create derivative works and
1214205Sandreas.sandberg@arm.comredistribute this software and such derivative works for any purpose,
1314205Sandreas.sandberg@arm.comso long as the copyright notice above, this grant of permission, and
1414205Sandreas.sandberg@arm.comthe disclaimer below appear in all copies made; and so long as the
1514205Sandreas.sandberg@arm.comname of The University of Michigan is not used in any advertising or
1614205Sandreas.sandberg@arm.compublicity pertaining to the use or distribution of this software
1714205Sandreas.sandberg@arm.comwithout specific, written prior authorization.
1814205Sandreas.sandberg@arm.com
1914205Sandreas.sandberg@arm.comTHIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE
2014205Sandreas.sandberg@arm.comUNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND WITHOUT
2114205Sandreas.sandberg@arm.comWARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER EXPRESS OR
2214205Sandreas.sandberg@arm.comIMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF
2314205Sandreas.sandberg@arm.comMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE REGENTS OF
2414205Sandreas.sandberg@arm.comTHE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE FOR ANY DAMAGES,
2514205Sandreas.sandberg@arm.comINCLUDING DIRECT, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
2614205Sandreas.sandberg@arm.comDAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OF OR IN CONNECTION
2714205Sandreas.sandberg@arm.comWITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR IS HEREAFTER
2814205Sandreas.sandberg@arm.comADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
2914205Sandreas.sandberg@arm.com*/
3014205Sandreas.sandberg@arm.com/*
3114205Sandreas.sandberg@arm.comCopyright 1993 Hewlett-Packard Development Company, L.P.
3214205Sandreas.sandberg@arm.com
3314205Sandreas.sandberg@arm.comPermission is hereby granted, free of charge, to any person obtaining a copy of
3414205Sandreas.sandberg@arm.comthis software and associated documentation files (the "Software"), to deal in
3514205Sandreas.sandberg@arm.comthe Software without restriction, including without limitation the rights to
3614205Sandreas.sandberg@arm.comuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
3714205Sandreas.sandberg@arm.comof the Software, and to permit persons to whom the Software is furnished to do
3814205Sandreas.sandberg@arm.comso, subject to the following conditions:
3914205Sandreas.sandberg@arm.com
4014205Sandreas.sandberg@arm.comThe above copyright notice and this permission notice shall be included in all
4114205Sandreas.sandberg@arm.comcopies or substantial portions of the Software.
4214205Sandreas.sandberg@arm.com
4314205Sandreas.sandberg@arm.comTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4414205Sandreas.sandberg@arm.comIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4514205Sandreas.sandberg@arm.comFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4614205Sandreas.sandberg@arm.comAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4714205Sandreas.sandberg@arm.comLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
4814205Sandreas.sandberg@arm.comOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
4914205Sandreas.sandberg@arm.comSOFTWARE.
5014205Sandreas.sandberg@arm.com*/
5114205Sandreas.sandberg@arm.com
5214205Sandreas.sandberg@arm.com/* taken from ebfw/rom/dbmentry.s */
5314205Sandreas.sandberg@arm.com
5414205Sandreas.sandberg@arm.com#define EB164
5514205Sandreas.sandberg@arm.com/*#ifndef LINT
5614205Sandreas.sandberg@arm.com.data
5714205Sandreas.sandberg@arm.com.asciiz "$Id: dbmentry.s,v 1.1.1.1 1997/10/30 23:27:12 verghese Exp $"
5814205Sandreas.sandberg@arm.com.text
5914205Sandreas.sandberg@arm.com#endif
6014205Sandreas.sandberg@arm.com*/
6114205Sandreas.sandberg@arm.com/*
6214205Sandreas.sandberg@arm.com * Debug Monitor Entry code
6314205Sandreas.sandberg@arm.com */
6414205Sandreas.sandberg@arm.com
6514205Sandreas.sandberg@arm.com#ifndef MAKEDEPEND
6614205Sandreas.sandberg@arm.com#include "ev5_impure.h"
6714205Sandreas.sandberg@arm.com#include "cserve.h"
6814205Sandreas.sandberg@arm.com#include "fromHudsonOsf.h"
6914205Sandreas.sandberg@arm.com#endif
7014205Sandreas.sandberg@arm.com
7114205Sandreas.sandberg@arm.com//#include "paldefs.h"
7214205Sandreas.sandberg@arm.com#include "regdefs.h"
7314205Sandreas.sandberg@arm.com#include "eb164.h"
7414205Sandreas.sandberg@arm.com//#include "ledcodes.h"
7514205Sandreas.sandberg@arm.com
7614205Sandreas.sandberg@arm.com        .text
7714205Sandreas.sandberg@arm.com
7814205Sandreas.sandberg@arm.com/* return address and padding to octaword align */
7914205Sandreas.sandberg@arm.com#define STARTFRM 16
8014205Sandreas.sandberg@arm.com
8114205Sandreas.sandberg@arm.com        .globl  __start
8214205Sandreas.sandberg@arm.com        .ent    __start, 0
8314205Sandreas.sandberg@arm.com__start:
8414205Sandreas.sandberg@arm.com_entry:
8514205Sandreas.sandberg@arm.com        br      t0, 2f			# get the current PC
8614205Sandreas.sandberg@arm.com2:	ldgp    gp, 0(t0)               # init gp
8714205Sandreas.sandberg@arm.com
8814205Sandreas.sandberg@arm.com
8914205Sandreas.sandberg@arm.com#ifdef original_xxm
9014205Sandreas.sandberg@arm.com        lda	a2, CSERVE_K_RD_IMPURE
9114205Sandreas.sandberg@arm.com        call_pal PAL_CSERVE_ENTRY
9214205Sandreas.sandberg@arm.com        lda	v0,  CNS_Q_BASE(v0)
9314205Sandreas.sandberg@arm.com
9414205Sandreas.sandberg@arm.com        # Add KSEG offset to the impure area
9514205Sandreas.sandberg@arm.com        subq	zero, 1, t0
9614205Sandreas.sandberg@arm.com        sll	t0, 42, t0
9714205Sandreas.sandberg@arm.com        addq	t0, v0, v0
9814205Sandreas.sandberg@arm.com
9914205Sandreas.sandberg@arm.com        lda	t0, CNS_Q_SIGNATURE(v0)
10014205Sandreas.sandberg@arm.com        bic 	t0, 0x07, t0		# Clear bottom 3 bits to avoid
10114205Sandreas.sandberg@arm.com                                        # allignment errors if the
10214205Sandreas.sandberg@arm.com                                        # impure area is total rubbish
10314205Sandreas.sandberg@arm.com        ldq	t0, 0x00(t0)
10414205Sandreas.sandberg@arm.com        srl	t0, 16, t0		# Shift signature into bottom 16 bits.
10514205Sandreas.sandberg@arm.com        lda	t6, 0xDECB(zero)	# Load the expected valid signature.
10614205Sandreas.sandberg@arm.com        zap	t6, 0xFC, t6		# Clear the upper bits.
10714205Sandreas.sandberg@arm.com        cmpeq	t0, t6, t0		# Is this a valid signature?
10814205Sandreas.sandberg@arm.com        beq	t0, 1f			# Not valid, don't trust input params.
10914205Sandreas.sandberg@arm.com
11014205Sandreas.sandberg@arm.com/*
11114205Sandreas.sandberg@arm.com *	Init the stack at the first 8K boundary
11214205Sandreas.sandberg@arm.com *	below the top of memory.
11314205Sandreas.sandberg@arm.com */
11414205Sandreas.sandberg@arm.com        lda	t0, CNS_Q_MEM_SIZE(v0)
11514205Sandreas.sandberg@arm.com        ldq	t0, 0x00(t0)		# Load memory size.
11614205Sandreas.sandberg@arm.com        subq	t0, 1, t0		# Last address in memory
11714205Sandreas.sandberg@arm.com        srl	t0, 13, t0		# Align to first 8KB boundary
11814205Sandreas.sandberg@arm.com        sll	t0, 13, sp		# below the top of memory.
11914205Sandreas.sandberg@arm.com        br	zero, 2f
12014205Sandreas.sandberg@arm.com
12114205Sandreas.sandberg@arm.com/*
12214205Sandreas.sandberg@arm.com *	If memory size was not passed in via the
12314205Sandreas.sandberg@arm.com *	PALcode impure data use the system specific
12414205Sandreas.sandberg@arm.com *	MINIMUM_SYSTEM_MEMORY definition.
12514205Sandreas.sandberg@arm.com */
12614205Sandreas.sandberg@arm.com1:
12714205Sandreas.sandberg@arm.com        lda	sp, (MINIMUM_SYSTEM_MEMORY&0xffff)(zero)
12814205Sandreas.sandberg@arm.com        ldah	sp, ((MINIMUM_SYSTEM_MEMORY+0x8000)>>16)(sp)
12914205Sandreas.sandberg@arm.com        lda	t0, (8*1024)(zero)	# Allow for 8KB guard page.
13014205Sandreas.sandberg@arm.com        subq	sp, t0, sp
13114205Sandreas.sandberg@arm.com
13214205Sandreas.sandberg@arm.com2:
13314205Sandreas.sandberg@arm.com
13414205Sandreas.sandberg@arm.com#endif /* original_xxm */
13514205Sandreas.sandberg@arm.com
13614205Sandreas.sandberg@arm.com
13714205Sandreas.sandberg@arm.com        /*
13814205Sandreas.sandberg@arm.com         * SimOS. Stack pointer is start of a valid phys or KSEG page
13914205Sandreas.sandberg@arm.com         */
14014205Sandreas.sandberg@arm.com
14114205Sandreas.sandberg@arm.com        bis	sp,sp,s0 /* save sp */
14214205Sandreas.sandberg@arm.com
14314205Sandreas.sandberg@arm.comslave:	lda	v0,(8*1024)(sp) /* end of page  */
14414205Sandreas.sandberg@arm.com
14514205Sandreas.sandberg@arm.com        subq	zero, 1, t0
14614205Sandreas.sandberg@arm.com        sll	t0, 42, t0
14714205Sandreas.sandberg@arm.com        bis	t0, v0, sp
14814205Sandreas.sandberg@arm.com
14914205Sandreas.sandberg@arm.com#ifdef original_xxm
15014205Sandreas.sandberg@arm.com        # Add KSEG offset to the stack pointer
15114205Sandreas.sandberg@arm.com        subq	zero, 1, t0
15214205Sandreas.sandberg@arm.com        sll	t0, 42, t0
15314205Sandreas.sandberg@arm.com        addq	t0, sp, sp
15414205Sandreas.sandberg@arm.com#endif
15514205Sandreas.sandberg@arm.com
15614205Sandreas.sandberg@arm.com        lda     sp, -STARTFRM(sp)	# Create a stack frame
15714205Sandreas.sandberg@arm.com        stq     ra, 0(sp)		# Place return address on the stack
15814205Sandreas.sandberg@arm.com
15914205Sandreas.sandberg@arm.com        .mask   0x84000000, -8
16014205Sandreas.sandberg@arm.com        .frame  sp, STARTFRM, ra
16114205Sandreas.sandberg@arm.com
16214205Sandreas.sandberg@arm.com/*
16314205Sandreas.sandberg@arm.com *	Enable the Floating Point Unit
16414205Sandreas.sandberg@arm.com */
16514205Sandreas.sandberg@arm.com        lda	a0, 1(zero)
16614205Sandreas.sandberg@arm.com        call_pal PAL_WRFEN_ENTRY
16714205Sandreas.sandberg@arm.com
16814205Sandreas.sandberg@arm.com/*
16914205Sandreas.sandberg@arm.com *	Every good C program has a main()
17014205Sandreas.sandberg@arm.com */
17114205Sandreas.sandberg@arm.com
17214205Sandreas.sandberg@arm.com        beq	s0,master
17314205Sandreas.sandberg@arm.com
17414205Sandreas.sandberg@arm.com        call_pal PAL_WHAMI_ENTRY
17514205Sandreas.sandberg@arm.com        bis	v0,v0,a0
176        jsr	ra, SlaveLoop
177master:
178        jsr	ra, main
179
180
181
182/*
183 *	The Debug Monitor should never return.
184 *	However, just incase...
185 */
186        ldgp	gp, 0(ra)
187        bsr	zero, _exit
188
189.end	__start
190
191
192
193        .globl  _exit
194        .ent    _exit, 0
195_exit:
196
197        ldq     ra, 0(sp)		# restore return address
198        lda	sp, STARTFRM(sp)	# prune back the stack
199        ret	zero, (ra)		# Back from whence we came
200.end	_exit
201
202                .globl	cServe
203        .ent	cServe 2
204cServe:
205        .option	O1
206        .frame	sp, 0, ra
207        call_pal PAL_CSERVE_ENTRY
208        ret	zero, (ra)
209        .end	cServe
210
211        .globl	wrfen
212        .ent	wrfen 2
213wrfen:
214        .option	O1
215        .frame	sp, 0, ra
216        call_pal PAL_WRFEN_ENTRY
217        ret	zero, (ra)
218        .end	wrfen
219        .globl	consoleCallback
220        .ent	consoleCallback 2
221consoleCallback:
222        br      t0, 2f			# get the current PC
2232:	ldgp    gp, 0(t0)               # init gp
224        lda     sp,-64(sp)
225        stq     ra,0(sp)
226        jsr     CallBackDispatcher
227        ldq     ra,0(sp)
228        lda     sp,64(sp)
229        ret     zero,(ra)
230        .end    consoleCallback
231
232
233        .globl	consoleFixup
234        .ent	consoleFixup 2
235consoleFixup:
236        br      t0, 2f			# get the current PC
2372:	ldgp    gp, 0(t0)               # init gp
238        lda     sp,-64(sp)
239        stq     ra,0(sp)
240        jsr     CallBackFixup
241        ldq     ra,0(sp)
242        lda     sp,64(sp)
243        ret     zero,(ra)
244        .end    consoleFixup
245
246
247
248        .globl	SpinLock
249        .ent	SpinLock 2
250SpinLock:
2511:
252        ldq_l	a1,0(a0)		# interlock complete lock state
253        subl	ra,3,v0			# get calling addr[31:0] + 1
254        blbs	a1,2f			# branch if lock is busy
255        stq_c	v0,0(a0)		# attempt to acquire lock
256        beq	v0,2f			# branch if lost atomicity
257        mb				# ensure memory coherence
258        ret	zero,(ra)		# return to caller (v0 is 1)
2592:
260        br	zero,1b
261        .end	SpinLock
262
263        .globl	loadContext
264        .ent	loadContext 2
265loadContext:
266        .option	O1
267        .frame	sp, 0, ra
268        call_pal PAL_SWPCTX_ENTRY
269        ret	zero, (ra)
270        .end	loadContext
271
272
273        .globl	SlaveSpin          # Very carefully spin wait
274        .ent	SlaveSpin 2        # and swap context without
275SlaveSpin:                         # using any stack space
276        .option	O1
277        .frame	sp, 0, ra
278        mov a0, t0                 # cpu number
279        mov a1, t1                 # cpu rpb pointer (virtual)
280        mov a2, t2                 # what to spin on
281
282test:   ldl  t3, 0(t2)
283        beq  t3, test
284        zapnot t1,0x1f,a0          # make rpb physical
285        call_pal PAL_SWPCTX_ENTRY  # switch to pcb
286        mov t0, a0                 # setup args for SlaveCmd
287        mov t1, a1
288        jsr SlaveCmd               # call SlaveCmd
289        ret	zero, (ra)         # Should never be reached
290        .end	SlaveSpin
291
292
293