dbmentry.S revision 8012
18012Ssaidi@eecs.umich.edu/*
28012Ssaidi@eecs.umich.eduCopyright (c) 2003, 2004
38012Ssaidi@eecs.umich.eduThe Regents of The University of Michigan
48012Ssaidi@eecs.umich.eduAll Rights Reserved
58012Ssaidi@eecs.umich.edu
68012Ssaidi@eecs.umich.eduThis code is part of the M5 simulator, developed by Nathan Binkert,
78012Ssaidi@eecs.umich.eduErik Hallnor, Steve Raasch, and Steve Reinhardt, with contributions
88012Ssaidi@eecs.umich.edufrom Ron Dreslinski, Dave Greene, Lisa Hsu, Ali Saidi, and Andrew
98012Ssaidi@eecs.umich.eduSchultz.
108012Ssaidi@eecs.umich.edu
118012Ssaidi@eecs.umich.eduPermission is granted to use, copy, create derivative works and
128012Ssaidi@eecs.umich.eduredistribute this software and such derivative works for any purpose,
138012Ssaidi@eecs.umich.eduso long as the copyright notice above, this grant of permission, and
148012Ssaidi@eecs.umich.eduthe disclaimer below appear in all copies made; and so long as the
158012Ssaidi@eecs.umich.eduname of The University of Michigan is not used in any advertising or
168012Ssaidi@eecs.umich.edupublicity pertaining to the use or distribution of this software
178012Ssaidi@eecs.umich.eduwithout specific, written prior authorization.
188012Ssaidi@eecs.umich.edu
198012Ssaidi@eecs.umich.eduTHIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE
208012Ssaidi@eecs.umich.eduUNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND WITHOUT
218012Ssaidi@eecs.umich.eduWARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER EXPRESS OR
228012Ssaidi@eecs.umich.eduIMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF
238012Ssaidi@eecs.umich.eduMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE REGENTS OF
248012Ssaidi@eecs.umich.eduTHE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE FOR ANY DAMAGES,
258012Ssaidi@eecs.umich.eduINCLUDING DIRECT, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
268012Ssaidi@eecs.umich.eduDAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OF OR IN CONNECTION
278012Ssaidi@eecs.umich.eduWITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR IS HEREAFTER
288012Ssaidi@eecs.umich.eduADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
298012Ssaidi@eecs.umich.edu*/
308012Ssaidi@eecs.umich.edu/*
318012Ssaidi@eecs.umich.eduCopyright 1993 Hewlett-Packard Development Company, L.P.
328012Ssaidi@eecs.umich.edu
338012Ssaidi@eecs.umich.eduPermission is hereby granted, free of charge, to any person obtaining a copy of
348012Ssaidi@eecs.umich.eduthis software and associated documentation files (the "Software"), to deal in
358012Ssaidi@eecs.umich.eduthe Software without restriction, including without limitation the rights to
368012Ssaidi@eecs.umich.eduuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
378012Ssaidi@eecs.umich.eduof the Software, and to permit persons to whom the Software is furnished to do
388012Ssaidi@eecs.umich.eduso, subject to the following conditions:
398012Ssaidi@eecs.umich.edu
408012Ssaidi@eecs.umich.eduThe above copyright notice and this permission notice shall be included in all
418012Ssaidi@eecs.umich.educopies or substantial portions of the Software.
428012Ssaidi@eecs.umich.edu
438012Ssaidi@eecs.umich.eduTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
448012Ssaidi@eecs.umich.eduIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
458012Ssaidi@eecs.umich.eduFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
468012Ssaidi@eecs.umich.eduAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
478012Ssaidi@eecs.umich.eduLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
488012Ssaidi@eecs.umich.eduOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
498012Ssaidi@eecs.umich.eduSOFTWARE.
508012Ssaidi@eecs.umich.edu*/
518008Ssaidi@eecs.umich.edu
528008Ssaidi@eecs.umich.edu/* taken from ebfw/rom/dbmentry.s */
538008Ssaidi@eecs.umich.edu
548008Ssaidi@eecs.umich.edu#define EB164
558008Ssaidi@eecs.umich.edu/*#ifndef LINT
568008Ssaidi@eecs.umich.edu.data
578008Ssaidi@eecs.umich.edu.asciiz "$Id: dbmentry.s,v 1.1.1.1 1997/10/30 23:27:12 verghese Exp $"
588008Ssaidi@eecs.umich.edu.text
598008Ssaidi@eecs.umich.edu#endif
608008Ssaidi@eecs.umich.edu*/
618008Ssaidi@eecs.umich.edu/*
628008Ssaidi@eecs.umich.edu * Debug Monitor Entry code
638008Ssaidi@eecs.umich.edu */
648008Ssaidi@eecs.umich.edu
658008Ssaidi@eecs.umich.edu#ifndef MAKEDEPEND
668008Ssaidi@eecs.umich.edu#include "ev5_impure.h"
678008Ssaidi@eecs.umich.edu#include "cserve.h"
688008Ssaidi@eecs.umich.edu#include "fromHudsonOsf.h"
698008Ssaidi@eecs.umich.edu#endif
708008Ssaidi@eecs.umich.edu
718008Ssaidi@eecs.umich.edu//#include "paldefs.h"
728008Ssaidi@eecs.umich.edu#include "regdefs.h"
738008Ssaidi@eecs.umich.edu#include "eb164.h"
748008Ssaidi@eecs.umich.edu//#include "ledcodes.h"
758008Ssaidi@eecs.umich.edu
768008Ssaidi@eecs.umich.edu        .text
778008Ssaidi@eecs.umich.edu
788008Ssaidi@eecs.umich.edu/* return address and padding to octaword align */
798008Ssaidi@eecs.umich.edu#define STARTFRM 16
808008Ssaidi@eecs.umich.edu
818008Ssaidi@eecs.umich.edu        .globl  __start
828008Ssaidi@eecs.umich.edu        .ent    __start, 0
838008Ssaidi@eecs.umich.edu__start:
848008Ssaidi@eecs.umich.edu_entry:
858008Ssaidi@eecs.umich.edu        br      t0, 2f			# get the current PC
868008Ssaidi@eecs.umich.edu2:	ldgp    gp, 0(t0)               # init gp
878008Ssaidi@eecs.umich.edu
888008Ssaidi@eecs.umich.edu
898008Ssaidi@eecs.umich.edu#ifdef original_xxm
908008Ssaidi@eecs.umich.edu        lda	a2, CSERVE_K_RD_IMPURE
918008Ssaidi@eecs.umich.edu        call_pal PAL_CSERVE_ENTRY
928008Ssaidi@eecs.umich.edu        lda	v0,  CNS_Q_BASE(v0)
938008Ssaidi@eecs.umich.edu
948008Ssaidi@eecs.umich.edu        # Add KSEG offset to the impure area
958008Ssaidi@eecs.umich.edu        subq	zero, 1, t0
968008Ssaidi@eecs.umich.edu        sll	t0, 42, t0
978008Ssaidi@eecs.umich.edu        addq	t0, v0, v0
988008Ssaidi@eecs.umich.edu
998008Ssaidi@eecs.umich.edu        lda	t0, CNS_Q_SIGNATURE(v0)
1008008Ssaidi@eecs.umich.edu        bic 	t0, 0x07, t0		# Clear bottom 3 bits to avoid
1018008Ssaidi@eecs.umich.edu                                        # allignment errors if the
1028008Ssaidi@eecs.umich.edu                                        # impure area is total rubbish
1038008Ssaidi@eecs.umich.edu        ldq	t0, 0x00(t0)
1048008Ssaidi@eecs.umich.edu        srl	t0, 16, t0		# Shift signature into bottom 16 bits.
1058008Ssaidi@eecs.umich.edu        lda	t6, 0xDECB(zero)	# Load the expected valid signature.
1068008Ssaidi@eecs.umich.edu        zap	t6, 0xFC, t6		# Clear the upper bits.
1078008Ssaidi@eecs.umich.edu        cmpeq	t0, t6, t0		# Is this a valid signature?
1088008Ssaidi@eecs.umich.edu        beq	t0, 1f			# Not valid, don't trust input params.
1098008Ssaidi@eecs.umich.edu
1108008Ssaidi@eecs.umich.edu/*
1118008Ssaidi@eecs.umich.edu *	Init the stack at the first 8K boundary
1128008Ssaidi@eecs.umich.edu *	below the top of memory.
1138008Ssaidi@eecs.umich.edu */
1148008Ssaidi@eecs.umich.edu        lda	t0, CNS_Q_MEM_SIZE(v0)
1158008Ssaidi@eecs.umich.edu        ldq	t0, 0x00(t0)		# Load memory size.
1168008Ssaidi@eecs.umich.edu        subq	t0, 1, t0		# Last address in memory
1178008Ssaidi@eecs.umich.edu        srl	t0, 13, t0		# Align to first 8KB boundary
1188008Ssaidi@eecs.umich.edu        sll	t0, 13, sp		# below the top of memory.
1198008Ssaidi@eecs.umich.edu        br	zero, 2f
1208008Ssaidi@eecs.umich.edu
1218008Ssaidi@eecs.umich.edu/*
1228008Ssaidi@eecs.umich.edu *	If memory size was not passed in via the
1238008Ssaidi@eecs.umich.edu *	PALcode impure data use the system specific
1248008Ssaidi@eecs.umich.edu *	MINIMUM_SYSTEM_MEMORY definition.
1258008Ssaidi@eecs.umich.edu */
1268008Ssaidi@eecs.umich.edu1:
1278008Ssaidi@eecs.umich.edu        lda	sp, (MINIMUM_SYSTEM_MEMORY&0xffff)(zero)
1288008Ssaidi@eecs.umich.edu        ldah	sp, ((MINIMUM_SYSTEM_MEMORY+0x8000)>>16)(sp)
1298008Ssaidi@eecs.umich.edu        lda	t0, (8*1024)(zero)	# Allow for 8KB guard page.
1308008Ssaidi@eecs.umich.edu        subq	sp, t0, sp
1318008Ssaidi@eecs.umich.edu
1328008Ssaidi@eecs.umich.edu2:
1338008Ssaidi@eecs.umich.edu
1348008Ssaidi@eecs.umich.edu#endif /* original_xxm */
1358008Ssaidi@eecs.umich.edu
1368008Ssaidi@eecs.umich.edu
1378008Ssaidi@eecs.umich.edu        /*
1388008Ssaidi@eecs.umich.edu         * SimOS. Stack pointer is start of a valid phys or KSEG page
1398008Ssaidi@eecs.umich.edu         */
1408008Ssaidi@eecs.umich.edu
1418008Ssaidi@eecs.umich.edu        bis	sp,sp,s0 /* save sp */
1428008Ssaidi@eecs.umich.edu
1438008Ssaidi@eecs.umich.eduslave:	lda	v0,(8*1024)(sp) /* end of page  */
1448008Ssaidi@eecs.umich.edu
1458008Ssaidi@eecs.umich.edu        subq	zero, 1, t0
1468008Ssaidi@eecs.umich.edu        sll	t0, 42, t0
1478008Ssaidi@eecs.umich.edu        bis	t0, v0, sp
1488008Ssaidi@eecs.umich.edu
1498008Ssaidi@eecs.umich.edu#ifdef original_xxm
1508008Ssaidi@eecs.umich.edu        # Add KSEG offset to the stack pointer
1518008Ssaidi@eecs.umich.edu        subq	zero, 1, t0
1528008Ssaidi@eecs.umich.edu        sll	t0, 42, t0
1538008Ssaidi@eecs.umich.edu        addq	t0, sp, sp
1548008Ssaidi@eecs.umich.edu#endif
1558008Ssaidi@eecs.umich.edu
1568008Ssaidi@eecs.umich.edu        lda     sp, -STARTFRM(sp)	# Create a stack frame
1578008Ssaidi@eecs.umich.edu        stq     ra, 0(sp)		# Place return address on the stack
1588008Ssaidi@eecs.umich.edu
1598008Ssaidi@eecs.umich.edu        .mask   0x84000000, -8
1608008Ssaidi@eecs.umich.edu        .frame  sp, STARTFRM, ra
1618008Ssaidi@eecs.umich.edu
1628008Ssaidi@eecs.umich.edu/*
1638008Ssaidi@eecs.umich.edu *	Enable the Floating Point Unit
1648008Ssaidi@eecs.umich.edu */
1658008Ssaidi@eecs.umich.edu        lda	a0, 1(zero)
1668008Ssaidi@eecs.umich.edu        call_pal PAL_WRFEN_ENTRY
1678008Ssaidi@eecs.umich.edu
1688008Ssaidi@eecs.umich.edu/*
1698008Ssaidi@eecs.umich.edu *	Every good C program has a main()
1708008Ssaidi@eecs.umich.edu */
1718008Ssaidi@eecs.umich.edu
1728008Ssaidi@eecs.umich.edu        beq	s0,master
1738008Ssaidi@eecs.umich.edu
1748008Ssaidi@eecs.umich.edu        call_pal PAL_WHAMI_ENTRY
1758008Ssaidi@eecs.umich.edu        bis	v0,v0,a0
1768008Ssaidi@eecs.umich.edu        jsr	ra, SlaveLoop
1778008Ssaidi@eecs.umich.edumaster:
1788008Ssaidi@eecs.umich.edu        jsr	ra, main
1798008Ssaidi@eecs.umich.edu
1808008Ssaidi@eecs.umich.edu
1818008Ssaidi@eecs.umich.edu
1828008Ssaidi@eecs.umich.edu/*
1838008Ssaidi@eecs.umich.edu *	The Debug Monitor should never return.
1848008Ssaidi@eecs.umich.edu *	However, just incase...
1858008Ssaidi@eecs.umich.edu */
1868008Ssaidi@eecs.umich.edu        ldgp	gp, 0(ra)
1878008Ssaidi@eecs.umich.edu        bsr	zero, _exit
1888008Ssaidi@eecs.umich.edu
1898008Ssaidi@eecs.umich.edu.end	__start
1908008Ssaidi@eecs.umich.edu
1918008Ssaidi@eecs.umich.edu
1928008Ssaidi@eecs.umich.edu
1938008Ssaidi@eecs.umich.edu        .globl  _exit
1948008Ssaidi@eecs.umich.edu        .ent    _exit, 0
1958008Ssaidi@eecs.umich.edu_exit:
1968008Ssaidi@eecs.umich.edu
1978008Ssaidi@eecs.umich.edu        ldq     ra, 0(sp)		# restore return address
1988008Ssaidi@eecs.umich.edu        lda	sp, STARTFRM(sp)	# prune back the stack
1998008Ssaidi@eecs.umich.edu        ret	zero, (ra)		# Back from whence we came
2008008Ssaidi@eecs.umich.edu.end	_exit
2018008Ssaidi@eecs.umich.edu
2028008Ssaidi@eecs.umich.edu                .globl	cServe
2038008Ssaidi@eecs.umich.edu        .ent	cServe 2
2048008Ssaidi@eecs.umich.educServe:
2058008Ssaidi@eecs.umich.edu        .option	O1
2068008Ssaidi@eecs.umich.edu        .frame	sp, 0, ra
2078008Ssaidi@eecs.umich.edu        call_pal PAL_CSERVE_ENTRY
2088008Ssaidi@eecs.umich.edu        ret	zero, (ra)
2098008Ssaidi@eecs.umich.edu        .end	cServe
2108008Ssaidi@eecs.umich.edu
2118008Ssaidi@eecs.umich.edu        .globl	wrfen
2128008Ssaidi@eecs.umich.edu        .ent	wrfen 2
2138008Ssaidi@eecs.umich.eduwrfen:
2148008Ssaidi@eecs.umich.edu        .option	O1
2158008Ssaidi@eecs.umich.edu        .frame	sp, 0, ra
2168008Ssaidi@eecs.umich.edu        call_pal PAL_WRFEN_ENTRY
2178008Ssaidi@eecs.umich.edu        ret	zero, (ra)
2188008Ssaidi@eecs.umich.edu        .end	wrfen
2198008Ssaidi@eecs.umich.edu        .globl	consoleCallback
2208008Ssaidi@eecs.umich.edu        .ent	consoleCallback 2
2218008Ssaidi@eecs.umich.educonsoleCallback:
2228008Ssaidi@eecs.umich.edu        br      t0, 2f			# get the current PC
2238008Ssaidi@eecs.umich.edu2:	ldgp    gp, 0(t0)               # init gp
2248008Ssaidi@eecs.umich.edu        lda     sp,-64(sp)
2258008Ssaidi@eecs.umich.edu        stq     ra,0(sp)
2268008Ssaidi@eecs.umich.edu        jsr     CallBackDispatcher
2278008Ssaidi@eecs.umich.edu        ldq     ra,0(sp)
2288008Ssaidi@eecs.umich.edu        lda     sp,64(sp)
2298008Ssaidi@eecs.umich.edu        ret     zero,(ra)
2308008Ssaidi@eecs.umich.edu        .end    consoleCallback
2318008Ssaidi@eecs.umich.edu
2328008Ssaidi@eecs.umich.edu
2338008Ssaidi@eecs.umich.edu        .globl	consoleFixup
2348008Ssaidi@eecs.umich.edu        .ent	consoleFixup 2
2358008Ssaidi@eecs.umich.educonsoleFixup:
2368008Ssaidi@eecs.umich.edu        br      t0, 2f			# get the current PC
2378008Ssaidi@eecs.umich.edu2:	ldgp    gp, 0(t0)               # init gp
2388008Ssaidi@eecs.umich.edu        lda     sp,-64(sp)
2398008Ssaidi@eecs.umich.edu        stq     ra,0(sp)
2408008Ssaidi@eecs.umich.edu        jsr     CallBackFixup
2418008Ssaidi@eecs.umich.edu        ldq     ra,0(sp)
2428008Ssaidi@eecs.umich.edu        lda     sp,64(sp)
2438008Ssaidi@eecs.umich.edu        ret     zero,(ra)
2448008Ssaidi@eecs.umich.edu        .end    consoleFixup
2458008Ssaidi@eecs.umich.edu
2468008Ssaidi@eecs.umich.edu
2478008Ssaidi@eecs.umich.edu
2488008Ssaidi@eecs.umich.edu        .globl	SpinLock
2498008Ssaidi@eecs.umich.edu        .ent	SpinLock 2
2508008Ssaidi@eecs.umich.eduSpinLock:
2518008Ssaidi@eecs.umich.edu1:
2528008Ssaidi@eecs.umich.edu        ldq_l	a1,0(a0)		# interlock complete lock state
2538008Ssaidi@eecs.umich.edu        subl	ra,3,v0			# get calling addr[31:0] + 1
2548008Ssaidi@eecs.umich.edu        blbs	a1,2f			# branch if lock is busy
2558008Ssaidi@eecs.umich.edu        stq_c	v0,0(a0)		# attempt to acquire lock
2568008Ssaidi@eecs.umich.edu        beq	v0,2f			# branch if lost atomicity
2578008Ssaidi@eecs.umich.edu        mb				# ensure memory coherence
2588008Ssaidi@eecs.umich.edu        ret	zero,(ra)		# return to caller (v0 is 1)
2598008Ssaidi@eecs.umich.edu2:
2608008Ssaidi@eecs.umich.edu        br	zero,1b
2618008Ssaidi@eecs.umich.edu        .end	SpinLock
2628008Ssaidi@eecs.umich.edu
2638008Ssaidi@eecs.umich.edu        .globl	loadContext
2648008Ssaidi@eecs.umich.edu        .ent	loadContext 2
2658008Ssaidi@eecs.umich.eduloadContext:
2668008Ssaidi@eecs.umich.edu        .option	O1
2678008Ssaidi@eecs.umich.edu        .frame	sp, 0, ra
2688008Ssaidi@eecs.umich.edu        call_pal PAL_SWPCTX_ENTRY
2698008Ssaidi@eecs.umich.edu        ret	zero, (ra)
2708008Ssaidi@eecs.umich.edu        .end	loadContext
2718008Ssaidi@eecs.umich.edu
2728008Ssaidi@eecs.umich.edu
2738008Ssaidi@eecs.umich.edu        .globl	SlaveSpin          # Very carefully spin wait
2748008Ssaidi@eecs.umich.edu        .ent	SlaveSpin 2        # and swap context without
2758008Ssaidi@eecs.umich.eduSlaveSpin:                         # using any stack space
2768008Ssaidi@eecs.umich.edu        .option	O1
2778008Ssaidi@eecs.umich.edu        .frame	sp, 0, ra
2788008Ssaidi@eecs.umich.edu        mov a0, t0                 # cpu number
2798008Ssaidi@eecs.umich.edu        mov a1, t1                 # cpu rpb pointer (virtual)
2808008Ssaidi@eecs.umich.edu        mov a2, t2                 # what to spin on
2818008Ssaidi@eecs.umich.edu
2828008Ssaidi@eecs.umich.edutest:   ldl  t3, 0(t2)
2838008Ssaidi@eecs.umich.edu        beq  t3, test
2848008Ssaidi@eecs.umich.edu        zapnot t1,0x1f,a0          # make rpb physical
2858008Ssaidi@eecs.umich.edu        call_pal PAL_SWPCTX_ENTRY  # switch to pcb
2868008Ssaidi@eecs.umich.edu        mov t0, a0                 # setup args for SlaveCmd
2878008Ssaidi@eecs.umich.edu        mov t1, a1
2888008Ssaidi@eecs.umich.edu        jsr SlaveCmd               # call SlaveCmd
2898008Ssaidi@eecs.umich.edu        ret	zero, (ra)         # Should never be reached
2908008Ssaidi@eecs.umich.edu        .end	SlaveSpin
2918008Ssaidi@eecs.umich.edu
2928008Ssaidi@eecs.umich.edu
293