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