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