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