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