sparc.h revision 12027
12567SN/A/* 214128Sgiacomo.travaglini@arm.com * QuickThreads -- Threads-building toolkit. 37585SAli.Saidi@arm.com * Copyright (c) 1993 by David Keppel 47585SAli.Saidi@arm.com * 57585SAli.Saidi@arm.com * Permission to use, copy, modify and distribute this software and 67585SAli.Saidi@arm.com * its documentation for any purpose and without fee is hereby 77585SAli.Saidi@arm.com * granted, provided that the above copyright notice and this notice 87585SAli.Saidi@arm.com * appear in all copies. This software is provided as a 97585SAli.Saidi@arm.com * proof-of-concept and for demonstration purposes; there is no 107585SAli.Saidi@arm.com * representation about the suitability of this software for any 117585SAli.Saidi@arm.com * purpose. 127585SAli.Saidi@arm.com */ 137585SAli.Saidi@arm.com 142567SN/A#ifndef QUICKTHREADS_SPARC_H 152567SN/A#define QUICKTHREADS_SPARC_H 162567SN/A 172567SN/Atypedef unsigned long qt_word_t; 182567SN/A 192567SN/A/* Stack layout on the sparc: 202567SN/A 212567SN/A non-varargs: 222567SN/A 232567SN/A +--- 242567SN/A | <blank space for alignment> 252567SN/A | %o7 == return address -> qt_start 262567SN/A | %i7 272567SN/A | %i6 == frame pointer -> 0 (NULL-terminated stack frame chain) 282567SN/A | %i5 -> only 292567SN/A | %i4 -> userf 302567SN/A | %i3 312567SN/A | %i2 -> pt 322567SN/A | %i1 -> pu 332567SN/A | %i0 342567SN/A | %l7 352567SN/A | %l6 362567SN/A | %l5 372567SN/A | %l4 382567SN/A | %l3 392665SN/A | %l2 402665SN/A | %l1 412567SN/A | %l0 <--- qt_t.sp 422567SN/A +--- 4311793Sbrandon.potter@amd.com 4411793Sbrandon.potter@amd.com varargs: 458229Snate@binkert.org 468229Snate@binkert.org | : 4712531Sandreas.sandberg@arm.com | : 488286SAli.Saidi@ARM.com | argument list 498286SAli.Saidi@ARM.com | one-word aggregate return pointer 508286SAli.Saidi@ARM.com +--- 5113531Sjairo.balart@metempsy.com | <blank space for alignment> 5211793Sbrandon.potter@amd.com | %o7 == return address -> qt_vstart 538286SAli.Saidi@ARM.com | %i7 5410037SARM gem5 Developers | %i6 == frame pointer -> 0 (NULL-terminated stack frame chain) 552567SN/A | %i5 -> startup 567650SAli.Saidi@ARM.com | %i4 -> userf 577650SAli.Saidi@ARM.com | %i3 -> cleanup 582567SN/A | %i2 -> pt 596757SAli.Saidi@ARM.com | %i1 6011234Sandreas.sandberg@arm.com | %i0 6111234Sandreas.sandberg@arm.com | %l7 6211234Sandreas.sandberg@arm.com | %l6 6310037SARM gem5 Developers | %l5 6410037SARM gem5 Developers | %l4 6513173Sgiacomo.travaglini@arm.com | %l3 6610537Sandreas.hansson@arm.com | %l2 6713531Sjairo.balart@metempsy.com | %l1 6813396Sgiacomo.travaglini@arm.com | %l0 <--- qt_t.sp 6913396Sgiacomo.travaglini@arm.com +--- 7013396Sgiacomo.travaglini@arm.com 7110037SARM gem5 Developers */ 7210037SARM gem5 Developers 7310037SARM gem5 Developers 7413759Sgiacomo.gabrielli@arm.com/* What to do to start a thread running. */ 7513759Sgiacomo.gabrielli@arm.comextern void qt_start (void); 7614133Sjordi.vaquero@metempsy.comextern void qt_vstart (void); 7714128Sgiacomo.travaglini@arm.com 7812005Sandreas.sandberg@arm.com 7912005Sandreas.sandberg@arm.com/* Hold 17 saved registers + 1 word for alignment. */ 8012005Sandreas.sandberg@arm.com#define QUICKTHREADS_STKBASE (18 * 4) 8112531Sandreas.sandberg@arm.com#define QUICKTHREADS_VSTKBASE QUICKTHREADS_STKBASE 8210037SARM gem5 Developers 832567SN/A 8410037SARM gem5 Developers/* Stack must be doubleword aligned. */ 8510037SARM gem5 Developers#define QUICKTHREADS_STKALIGN (8) /* Doubleword aligned. */ 8610037SARM gem5 Developers 8710037SARM gem5 Developers#define QUICKTHREADS_ONLY_INDEX (QUICKTHREADS_I5) 8810037SARM gem5 Developers#define QUICKTHREADS_USER_INDEX (QUICKTHREADS_I4) 8910037SARM gem5 Developers#define QUICKTHREADS_ARGT_INDEX (QUICKTHREADS_I2) 9010037SARM gem5 Developers#define QUICKTHREADS_ARGU_INDEX (QUICKTHREADS_I1) 9110037SARM gem5 Developers 9211234Sandreas.sandberg@arm.com#define QUICKTHREADS_VSTARTUP_INDEX (QUICKTHREADS_I5) 9311234Sandreas.sandberg@arm.com#define QUICKTHREADS_VUSERF_INDEX (QUICKTHREADS_I4) 9411234Sandreas.sandberg@arm.com#define QUICKTHREADS_VCLEANUP_INDEX (QUICKTHREADS_I3) 9511234Sandreas.sandberg@arm.com#define QUICKTHREADS_VARGT_INDEX (QUICKTHREADS_I2) 968885SAli.Saidi@ARM.com 9711234Sandreas.sandberg@arm.com#define QUICKTHREADS_O7 (16) 9811234Sandreas.sandberg@arm.com#define QUICKTHREADS_I6 (14) 9911234Sandreas.sandberg@arm.com#define QUICKTHREADS_I5 (13) 1008885SAli.Saidi@ARM.com#define QUICKTHREADS_I4 (12) 10111234Sandreas.sandberg@arm.com#define QUICKTHREADS_I3 (11) 10211234Sandreas.sandberg@arm.com#define QUICKTHREADS_I2 (10) 10311234Sandreas.sandberg@arm.com#define QUICKTHREADS_I1 ( 9) 10411234Sandreas.sandberg@arm.com 10511234Sandreas.sandberg@arm.com 10611234Sandreas.sandberg@arm.com/* The thread will ``return'' to the `qt_start' routine to get things 10711234Sandreas.sandberg@arm.com going. The normal return sequence takes us to QUICKTHREADS_O7+8, so we 10811234Sandreas.sandberg@arm.com pre-subtract 8. The frame pointer chain is 0-terminated to prevent 10911234Sandreas.sandberg@arm.com the trap handler from chasing off in to random memory when flushing 11011234Sandreas.sandberg@arm.com stack windows. */ 11111234Sandreas.sandberg@arm.com 11211234Sandreas.sandberg@arm.com#define QUICKTHREADS_ARGS_MD(top) \ 11313397Sgiacomo.travaglini@arm.com (QUICKTHREADS_SPUT ((top), QUICKTHREADS_O7, ((void *)(((int)qt_start)-8))), \ 11413397Sgiacomo.travaglini@arm.com QUICKTHREADS_SPUT ((top), QUICKTHREADS_I6, 0)) 11513397Sgiacomo.travaglini@arm.com 11613397Sgiacomo.travaglini@arm.com 11713397Sgiacomo.travaglini@arm.com/* The varargs startup routine always reads 6 words of arguments 11813397Sgiacomo.travaglini@arm.com (6 argument registers) from the stack, offset by one word to 11910037SARM gem5 Developers allow for an aggregate return area pointer. If the varargs 12010037SARM gem5 Developers routine actually pushed fewer words than that, qt_vstart could read 12110037SARM gem5 Developers off the top of the stack. To prevent errors, we always allocate 8 12210037SARM gem5 Developers words. The space is often just wasted. */ 12310037SARM gem5 Developers 12410037SARM gem5 Developers#define QUICKTHREADS_VARGS_MD0(sp, vabytes) \ 12510037SARM gem5 Developers ((qt_t *)(((char *)(sp)) - 8*4 - QUICKTHREADS_STKROUNDUP(vabytes))) 12610037SARM gem5 Developers 12710037SARM gem5 Developers#define QUICKTHREADS_VARGS_MD1(sp) \ 12811234Sandreas.sandberg@arm.com (QUICKTHREADS_SPUT (sp, QUICKTHREADS_O7, ((void *)(((int)qt_vstart)-8)))) 12910037SARM gem5 Developers 1308885SAli.Saidi@ARM.com/* The SPARC has wierdo calling conventions which stores a hidden 1318706Sandreas.hansson@arm.com parameter for returning aggregate values, so the rest of the 1328706Sandreas.hansson@arm.com parameters are shoved up the stack by one place. */ 1338706Sandreas.hansson@arm.com#define QUICKTHREADS_VARGS_ADJUST(sp) (((char *)sp)+4) 1348706Sandreas.hansson@arm.com 1358706Sandreas.hansson@arm.com#define QUICKTHREADS_VARGS_DEFAULT 1368706Sandreas.hansson@arm.com 1378706Sandreas.hansson@arm.com 1388706Sandreas.hansson@arm.com#define QUICKTHREADS_GROW_DOWN 1398706Sandreas.hansson@arm.com 1408706Sandreas.hansson@arm.com#endif /* ndef QUICKTHREADS_SPARC_H */ 1418706Sandreas.hansson@arm.com