hppa.h revision 12027
16145Snate@binkert.org/*
26145Snate@binkert.org * QuickThreads -- Threads-building toolkit.
36145Snate@binkert.org * Copyright (c) 1993 by David Keppel
46145Snate@binkert.org *
56145Snate@binkert.org * Permission to use, copy, modify and distribute this software and
66145Snate@binkert.org * its documentation for any purpose and without fee is hereby
76145Snate@binkert.org * granted, provided that the above copyright notice and this notice
86145Snate@binkert.org * appear in all copies.  This software is provided as a
96145Snate@binkert.org * proof-of-concept and for demonstration purposes; there is no
106145Snate@binkert.org * representation about the suitability of this software for any
116145Snate@binkert.org * purpose.
126145Snate@binkert.org */
136145Snate@binkert.org
146145Snate@binkert.org/*
156145Snate@binkert.org * This file (pa-risc.h) is part of the port of QuickThreads for the
166145Snate@binkert.org * PA-RISC 1.1 architecture.  This file is a machine dependent header
176145Snate@binkert.org * file.  It was written in 1994 by Uwe Reder
186145Snate@binkert.org * (`uereder@cip.informatik.uni-erlangen.de') for the Operating Systems
196145Snate@binkert.org * Department (IMMD4) at the University of Erlangen/Nuernberg Germany.
206145Snate@binkert.org */
216145Snate@binkert.org
226145Snate@binkert.org
236145Snate@binkert.org#ifndef QUICKTHREADS_PA_RISC_H
246145Snate@binkert.org#define QUICKTHREADS_PA_RISC_H
256145Snate@binkert.org
266145Snate@binkert.org#if 0
276145Snate@binkert.org#include <qt.h>
286145Snate@binkert.org#endif
296145Snate@binkert.org
306145Snate@binkert.org/* size of an integer-register (32 bit) */
316145Snate@binkert.orgtypedef unsigned long qt_word_t;
326145Snate@binkert.org
336145Snate@binkert.org/* PA-RISC's stack grows up */
346145Snate@binkert.org#define QUICKTHREADS_GROW_UP
356145Snate@binkert.org
366145Snate@binkert.org/* Stack layout on PA-RISC according to PA-RISC Procedure Calling Conventions:
376145Snate@binkert.org
386145Snate@binkert.org    Callee-save registers are: gr3-gr18, fr12-fr21.
396145Snate@binkert.org    Also save gr2, return pointer.
406145Snate@binkert.org
416145Snate@binkert.org    +---
426145Snate@binkert.org    | fr12          Each floating register is a double word (8 bytes).
436145Snate@binkert.org    | fr13          Floating registers are only saved if `qt_block' is
446145Snate@binkert.org    | fr14          called, in which case it saves the floating-point
456145Snate@binkert.org    | fr15          registers then calls `qt_blocki' to save the integer
466284Snate@binkert.org    | fr16	    registers.
476145Snate@binkert.org    | fr17
486284Snate@binkert.org    | fr18
496145Snate@binkert.org    | fr19
506145Snate@binkert.org    | fr20
516145Snate@binkert.org    | fr21
526145Snate@binkert.org    | <arg word 3>  fixed arguments (must be allocated; may remain unused)
536145Snate@binkert.org    | <arg word 2>
546154Snate@binkert.org    | <arg word 1>
556154Snate@binkert.org    | <arg word 0>
566154Snate@binkert.org    | <LPT>         frame marker
576154Snate@binkert.org    | <LPT'>
586154Snate@binkert.org    | <RP'>
596154Snate@binkert.org    | <Current RP>
606154Snate@binkert.org    | <Static Link>
616154Snate@binkert.org    | <Clean Up>
626154Snate@binkert.org    | <RP''>
636154Snate@binkert.org    | <Previous SP>
646154Snate@binkert.org    +---
656145Snate@binkert.org    | gr3           word each (4 bytes)
666876Ssteve.reinhardt@amd.com    | gr4
676876Ssteve.reinhardt@amd.com    | gr5
686145Snate@binkert.org    | gr6
696145Snate@binkert.org    | gr7
706145Snate@binkert.org    | gr8
716145Snate@binkert.org    | gr9
726145Snate@binkert.org    | gr10
736145Snate@binkert.org    | gr11
746145Snate@binkert.org    | gr12
756145Snate@binkert.org    | gr13
766876Ssteve.reinhardt@amd.com    | gr14
776876Ssteve.reinhardt@amd.com    | gr15
786145Snate@binkert.org    | gr16
796145Snate@binkert.org    | gr17
806145Snate@binkert.org    | gr18
816285Snate@binkert.org    | <16 bytes filled in (sp has to be 64-bytes aligned)>
826285Snate@binkert.org    | <arg word 3>  fixed arguments (must be allocated; may remain unused)
836285Snate@binkert.org    | <arg word 2>
846145Snate@binkert.org    | <arg word 1>
856145Snate@binkert.org    | <arg word 0>
866145Snate@binkert.org    | <LPT>         frame marker
876145Snate@binkert.org    | <LPT'>
886876Ssteve.reinhardt@amd.com    | <RP'>
896876Ssteve.reinhardt@amd.com    | <Current RP>
906876Ssteve.reinhardt@amd.com    | <Static Link>
916889SBrad.Beckmann@amd.com    | <Clean Up>
926889SBrad.Beckmann@amd.com    | <RP''>
936889SBrad.Beckmann@amd.com    | <Previous SP>
946889SBrad.Beckmann@amd.com    +---            <--- sp
956889SBrad.Beckmann@amd.com*/
966889SBrad.Beckmann@amd.com
976889SBrad.Beckmann@amd.com/* When a never-before-run thread is restored, the return pc points
986889SBrad.Beckmann@amd.com   to a fragment of code that starts the thread running.  For
996889SBrad.Beckmann@amd.com   non-vargs functions, it just calls the client's `only' function.
1006889SBrad.Beckmann@amd.com   For varargs functions, it calls the startup, user, and cleanup
1016889SBrad.Beckmann@amd.com   functions. */
1026889SBrad.Beckmann@amd.com
1036889SBrad.Beckmann@amd.com/* Note: Procedue Labels on PA-RISC
1046889SBrad.Beckmann@amd.com
1056889SBrad.Beckmann@amd.com   <--2--><-------28---------><1-><1->
1066889SBrad.Beckmann@amd.com   -----------------------------------
1076889SBrad.Beckmann@amd.com   | SID |    Adress Part    | L | X |
1086889SBrad.Beckmann@amd.com   -----------------------------------
1096889SBrad.Beckmann@amd.com
1106889SBrad.Beckmann@amd.com   On HP-UX the L field is used to flag wheather the procedure
1116889SBrad.Beckmann@amd.com   label (plabel) is a pointer to an LT entry or to the entry point
1126145Snate@binkert.org   of the procedure (PA-RISC Procedure Calling Conventions Reference
1136889SBrad.Beckmann@amd.com   Manual, 5.3.2 Procedure Labels and Dynamic Calls). */
1146889SBrad.Beckmann@amd.com
1156889SBrad.Beckmann@amd.com#define QUICKTHREADS_PA_RISC_READ_PLABEL(plabel) \
1166889SBrad.Beckmann@amd.com    ( (((int)plabel) & 2) ? \
1176145Snate@binkert.org        ( (*((int *)(((int)plabel) & 0xfffffffc)))) : ((int)plabel) )
1186889SBrad.Beckmann@amd.com
1196889SBrad.Beckmann@amd.com/* Stack must be 64 bytes aligned. */
1206889SBrad.Beckmann@amd.com#define QUICKTHREADS_STKALIGN (64)
1216285Snate@binkert.org
1226889SBrad.Beckmann@amd.com/* Internal helper for putting stuff on stack (negative index!). */
1236889SBrad.Beckmann@amd.com#define QUICKTHREADS_SPUT(top, at, val)   \
1246285Snate@binkert.org    (((qt_word_t *)(top))[-(at)] = (qt_word_t)(val))
1256285Snate@binkert.org
1266285Snate@binkert.org/* Offsets of various registers which are modified on the stack.
1276285Snate@binkert.org   rp (return-pointer) has to be stored in the frame-marker-area
1286285Snate@binkert.org   of the "older" stack-segment. */
1296285Snate@binkert.org
1306285Snate@binkert.org#define QUICKTHREADS_crp  (12+4+16+5)
1316285Snate@binkert.org#define QUICKTHREADS_15   (12+4+4)
1326285Snate@binkert.org#define QUICKTHREADS_16   (12+4+3)
1336285Snate@binkert.org#define QUICKTHREADS_17   (12+4+2)
1346285Snate@binkert.org#define QUICKTHREADS_18   (12+4+1)
1356285Snate@binkert.org
1366285Snate@binkert.org
1376285Snate@binkert.org/** This stuff is for NON-VARARGS. **/
1386285Snate@binkert.org
1396889SBrad.Beckmann@amd.com/* Stack looks like this (2 stack frames):
1406889SBrad.Beckmann@amd.com
1416889SBrad.Beckmann@amd.com    <--- 64-bytes aligned --><------- 64-bytes aligned ------------>
1426889SBrad.Beckmann@amd.com   |                        ||                                      |
1436889SBrad.Beckmann@amd.com    <--16--><------48-------><----16*4-----><--16-><------48------->
1446889SBrad.Beckmann@amd.com   ||      |                ||             |      |                ||
1456889SBrad.Beckmann@amd.com   ||filler|arg|frame-marker||register-save|filler|arg|frame-marker||
1466889SBrad.Beckmann@amd.com   ------------------------------------------------------------------
1476889SBrad.Beckmann@amd.com */
1486889SBrad.Beckmann@amd.com
1496889SBrad.Beckmann@amd.com#define QUICKTHREADS_STKBASE  (16+48+(16*sizeof(qt_word_t))+16+48)
1506889SBrad.Beckmann@amd.com
1516889SBrad.Beckmann@amd.com/* The index, relative to sp, of where to put each value. */
1526889SBrad.Beckmann@amd.com#define QUICKTHREADS_ONLY_INDEX   (QUICKTHREADS_15)
1536889SBrad.Beckmann@amd.com#define QUICKTHREADS_USER_INDEX   (QUICKTHREADS_16)
1546145Snate@binkert.org#define QUICKTHREADS_ARGT_INDEX   (QUICKTHREADS_17)
1556145Snate@binkert.org#define QUICKTHREADS_ARGU_INDEX   (QUICKTHREADS_18)
1566145Snate@binkert.org
1576145Snate@binkert.orgextern void qt_start(void);
1586145Snate@binkert.org#define QUICKTHREADS_ARGS_MD(sp)  \
1596285Snate@binkert.org    (QUICKTHREADS_SPUT (sp, QUICKTHREADS_crp, QUICKTHREADS_PA_RISC_READ_PLABEL(qt_start)))
1606145Snate@binkert.org
1616285Snate@binkert.org
1626285Snate@binkert.org/** This is for VARARGS. **/
1636145Snate@binkert.org
1646145Snate@binkert.org#define QUICKTHREADS_VARGS_DEFAULT
1656145Snate@binkert.org
1666145Snate@binkert.org/* Stack looks like this (2 stack frames):
1676285Snate@binkert.org
1686145Snate@binkert.org    <------ 64-bytes aligned -------><--------- 64-bytes aligned ---------->
1696145Snate@binkert.org   |                                ||                                      |
1706145Snate@binkert.org    <---?--><--?---><16><----32-----><----16*4-----><-16--><16><----32----->
1716889SBrad.Beckmann@amd.com   ||      |       |   |            ||             |      |   |            ||
1726889SBrad.Beckmann@amd.com   ||filler|varargs|arg|frame-marker||register-save|filler|arg|frame-marker||
1736889SBrad.Beckmann@amd.com   --------------------------------------------------------------------------
1746889SBrad.Beckmann@amd.com */
1756889SBrad.Beckmann@amd.com
1766889SBrad.Beckmann@amd.com/* Sp is moved to the end of the first stack frame. */
1776889SBrad.Beckmann@amd.com#define QUICKTHREADS_VARGS_MD0(sp, vasize) \
1786889SBrad.Beckmann@amd.com    ((qt_t *)(((char *)sp) + QUICKTHREADS_STKROUNDUP(vasize + 4*4 + 32)))
1796889SBrad.Beckmann@amd.com
1806889SBrad.Beckmann@amd.com/* To reach the arguments from the end of the first stack frame use 32
1816889SBrad.Beckmann@amd.com   as a negative adjustment. */
1826889SBrad.Beckmann@amd.com#define QUICKTHREADS_VARGS_ADJUST(sp)	((qt_t *)(((char *)sp) - 32))
1836889SBrad.Beckmann@amd.com
1846889SBrad.Beckmann@amd.com/* Offset to reach the end of the second stack frame. */
1856889SBrad.Beckmann@amd.com#define QUICKTHREADS_VSTKBASE	((16*sizeof(qt_word_t)) + 16 + 4*4 + 32)
1866889SBrad.Beckmann@amd.com
1876889SBrad.Beckmann@amd.comextern void qt_vstart(void);
1886889SBrad.Beckmann@amd.com#define QUICKTHREADS_VARGS_MD1(sp) \
1896889SBrad.Beckmann@amd.com    (QUICKTHREADS_SPUT (sp, QUICKTHREADS_crp, QUICKTHREADS_PA_RISC_READ_PLABEL(qt_vstart)))
1906889SBrad.Beckmann@amd.com
1916889SBrad.Beckmann@amd.com#define QUICKTHREADS_VARGT_INDEX      (QUICKTHREADS_15)
1926889SBrad.Beckmann@amd.com#define QUICKTHREADS_VSTARTUP_INDEX   (QUICKTHREADS_16)
1936889SBrad.Beckmann@amd.com#define QUICKTHREADS_VUSERF_INDEX     (QUICKTHREADS_17)
1946889SBrad.Beckmann@amd.com#define QUICKTHREADS_VCLEANUP_INDEX   (QUICKTHREADS_18)
1956889SBrad.Beckmann@amd.com
1966889SBrad.Beckmann@amd.com#endif /* ndef QUICKTHREADS_PA_RISC_H */
1976889SBrad.Beckmann@amd.com