112027Sjungma@eit.uni-kl.de/*
212027Sjungma@eit.uni-kl.de * QuickThreads -- Threads-building toolkit.
312027Sjungma@eit.uni-kl.de * Copyright (c) 1993 by David Keppel
412027Sjungma@eit.uni-kl.de *
512027Sjungma@eit.uni-kl.de * Permission to use, copy, modify and distribute this software and
612027Sjungma@eit.uni-kl.de * its documentation for any purpose and without fee is hereby
712027Sjungma@eit.uni-kl.de * granted, provided that the above copyright notice and this notice
812027Sjungma@eit.uni-kl.de * appear in all copies.  This software is provided as a
912027Sjungma@eit.uni-kl.de * proof-of-concept and for demonstration purposes; there is no
1012027Sjungma@eit.uni-kl.de * representation about the suitability of this software for any
1112027Sjungma@eit.uni-kl.de * purpose.
1212027Sjungma@eit.uni-kl.de */
1312027Sjungma@eit.uni-kl.de
1412027Sjungma@eit.uni-kl.de/*
1512027Sjungma@eit.uni-kl.de * This file (pa-risc.h) is part of the port of QuickThreads for the
1612027Sjungma@eit.uni-kl.de * PA-RISC 1.1 architecture.  This file is a machine dependent header
1712027Sjungma@eit.uni-kl.de * file.  It was written in 1994 by Uwe Reder
1812027Sjungma@eit.uni-kl.de * (`uereder@cip.informatik.uni-erlangen.de') for the Operating Systems
1912027Sjungma@eit.uni-kl.de * Department (IMMD4) at the University of Erlangen/Nuernberg Germany.
2012027Sjungma@eit.uni-kl.de */
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de
2312027Sjungma@eit.uni-kl.de#ifndef QUICKTHREADS_PA_RISC_H
2412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_PA_RISC_H
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de#if 0
2712027Sjungma@eit.uni-kl.de#include <qt.h>
2812027Sjungma@eit.uni-kl.de#endif
2912027Sjungma@eit.uni-kl.de
3012027Sjungma@eit.uni-kl.de/* size of an integer-register (32 bit) */
3112027Sjungma@eit.uni-kl.detypedef unsigned long qt_word_t;
3212027Sjungma@eit.uni-kl.de
3312027Sjungma@eit.uni-kl.de/* PA-RISC's stack grows up */
3412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_GROW_UP
3512027Sjungma@eit.uni-kl.de
3612027Sjungma@eit.uni-kl.de/* Stack layout on PA-RISC according to PA-RISC Procedure Calling Conventions:
3712027Sjungma@eit.uni-kl.de
3812027Sjungma@eit.uni-kl.de    Callee-save registers are: gr3-gr18, fr12-fr21.
3912027Sjungma@eit.uni-kl.de    Also save gr2, return pointer.
4012027Sjungma@eit.uni-kl.de
4112027Sjungma@eit.uni-kl.de    +---
4212027Sjungma@eit.uni-kl.de    | fr12          Each floating register is a double word (8 bytes).
4312027Sjungma@eit.uni-kl.de    | fr13          Floating registers are only saved if `qt_block' is
4412027Sjungma@eit.uni-kl.de    | fr14          called, in which case it saves the floating-point
4512027Sjungma@eit.uni-kl.de    | fr15          registers then calls `qt_blocki' to save the integer
4612027Sjungma@eit.uni-kl.de    | fr16	    registers.
4712027Sjungma@eit.uni-kl.de    | fr17
4812027Sjungma@eit.uni-kl.de    | fr18
4912027Sjungma@eit.uni-kl.de    | fr19
5012027Sjungma@eit.uni-kl.de    | fr20
5112027Sjungma@eit.uni-kl.de    | fr21
5212027Sjungma@eit.uni-kl.de    | <arg word 3>  fixed arguments (must be allocated; may remain unused)
5312027Sjungma@eit.uni-kl.de    | <arg word 2>
5412027Sjungma@eit.uni-kl.de    | <arg word 1>
5512027Sjungma@eit.uni-kl.de    | <arg word 0>
5612027Sjungma@eit.uni-kl.de    | <LPT>         frame marker
5712027Sjungma@eit.uni-kl.de    | <LPT'>
5812027Sjungma@eit.uni-kl.de    | <RP'>
5912027Sjungma@eit.uni-kl.de    | <Current RP>
6012027Sjungma@eit.uni-kl.de    | <Static Link>
6112027Sjungma@eit.uni-kl.de    | <Clean Up>
6212027Sjungma@eit.uni-kl.de    | <RP''>
6312027Sjungma@eit.uni-kl.de    | <Previous SP>
6412027Sjungma@eit.uni-kl.de    +---
6512027Sjungma@eit.uni-kl.de    | gr3           word each (4 bytes)
6612027Sjungma@eit.uni-kl.de    | gr4
6712027Sjungma@eit.uni-kl.de    | gr5
6812027Sjungma@eit.uni-kl.de    | gr6
6912027Sjungma@eit.uni-kl.de    | gr7
7012027Sjungma@eit.uni-kl.de    | gr8
7112027Sjungma@eit.uni-kl.de    | gr9
7212027Sjungma@eit.uni-kl.de    | gr10
7312027Sjungma@eit.uni-kl.de    | gr11
7412027Sjungma@eit.uni-kl.de    | gr12
7512027Sjungma@eit.uni-kl.de    | gr13
7612027Sjungma@eit.uni-kl.de    | gr14
7712027Sjungma@eit.uni-kl.de    | gr15
7812027Sjungma@eit.uni-kl.de    | gr16
7912027Sjungma@eit.uni-kl.de    | gr17
8012027Sjungma@eit.uni-kl.de    | gr18
8112027Sjungma@eit.uni-kl.de    | <16 bytes filled in (sp has to be 64-bytes aligned)>
8212027Sjungma@eit.uni-kl.de    | <arg word 3>  fixed arguments (must be allocated; may remain unused)
8312027Sjungma@eit.uni-kl.de    | <arg word 2>
8412027Sjungma@eit.uni-kl.de    | <arg word 1>
8512027Sjungma@eit.uni-kl.de    | <arg word 0>
8612027Sjungma@eit.uni-kl.de    | <LPT>         frame marker
8712027Sjungma@eit.uni-kl.de    | <LPT'>
8812027Sjungma@eit.uni-kl.de    | <RP'>
8912027Sjungma@eit.uni-kl.de    | <Current RP>
9012027Sjungma@eit.uni-kl.de    | <Static Link>
9112027Sjungma@eit.uni-kl.de    | <Clean Up>
9212027Sjungma@eit.uni-kl.de    | <RP''>
9312027Sjungma@eit.uni-kl.de    | <Previous SP>
9412027Sjungma@eit.uni-kl.de    +---            <--- sp
9512027Sjungma@eit.uni-kl.de*/
9612027Sjungma@eit.uni-kl.de
9712027Sjungma@eit.uni-kl.de/* When a never-before-run thread is restored, the return pc points
9812027Sjungma@eit.uni-kl.de   to a fragment of code that starts the thread running.  For
9912027Sjungma@eit.uni-kl.de   non-vargs functions, it just calls the client's `only' function.
10012027Sjungma@eit.uni-kl.de   For varargs functions, it calls the startup, user, and cleanup
10112027Sjungma@eit.uni-kl.de   functions. */
10212027Sjungma@eit.uni-kl.de
10312027Sjungma@eit.uni-kl.de/* Note: Procedue Labels on PA-RISC
10412027Sjungma@eit.uni-kl.de
10512027Sjungma@eit.uni-kl.de   <--2--><-------28---------><1-><1->
10612027Sjungma@eit.uni-kl.de   -----------------------------------
10712027Sjungma@eit.uni-kl.de   | SID |    Adress Part    | L | X |
10812027Sjungma@eit.uni-kl.de   -----------------------------------
10912027Sjungma@eit.uni-kl.de
11012027Sjungma@eit.uni-kl.de   On HP-UX the L field is used to flag wheather the procedure
11112027Sjungma@eit.uni-kl.de   label (plabel) is a pointer to an LT entry or to the entry point
11212027Sjungma@eit.uni-kl.de   of the procedure (PA-RISC Procedure Calling Conventions Reference
11312027Sjungma@eit.uni-kl.de   Manual, 5.3.2 Procedure Labels and Dynamic Calls). */
11412027Sjungma@eit.uni-kl.de
11512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_PA_RISC_READ_PLABEL(plabel) \
11612027Sjungma@eit.uni-kl.de    ( (((int)plabel) & 2) ? \
11712027Sjungma@eit.uni-kl.de        ( (*((int *)(((int)plabel) & 0xfffffffc)))) : ((int)plabel) )
11812027Sjungma@eit.uni-kl.de
11912027Sjungma@eit.uni-kl.de/* Stack must be 64 bytes aligned. */
12012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKALIGN (64)
12112027Sjungma@eit.uni-kl.de
12212027Sjungma@eit.uni-kl.de/* Internal helper for putting stuff on stack (negative index!). */
12312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_SPUT(top, at, val)   \
12412027Sjungma@eit.uni-kl.de    (((qt_word_t *)(top))[-(at)] = (qt_word_t)(val))
12512027Sjungma@eit.uni-kl.de
12612027Sjungma@eit.uni-kl.de/* Offsets of various registers which are modified on the stack.
12712027Sjungma@eit.uni-kl.de   rp (return-pointer) has to be stored in the frame-marker-area
12812027Sjungma@eit.uni-kl.de   of the "older" stack-segment. */
12912027Sjungma@eit.uni-kl.de
13012027Sjungma@eit.uni-kl.de#define QUICKTHREADS_crp  (12+4+16+5)
13112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_15   (12+4+4)
13212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_16   (12+4+3)
13312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_17   (12+4+2)
13412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_18   (12+4+1)
13512027Sjungma@eit.uni-kl.de
13612027Sjungma@eit.uni-kl.de
13712027Sjungma@eit.uni-kl.de/** This stuff is for NON-VARARGS. **/
13812027Sjungma@eit.uni-kl.de
13912027Sjungma@eit.uni-kl.de/* Stack looks like this (2 stack frames):
14012027Sjungma@eit.uni-kl.de
14112027Sjungma@eit.uni-kl.de    <--- 64-bytes aligned --><------- 64-bytes aligned ------------>
14212027Sjungma@eit.uni-kl.de   |                        ||                                      |
14312027Sjungma@eit.uni-kl.de    <--16--><------48-------><----16*4-----><--16-><------48------->
14412027Sjungma@eit.uni-kl.de   ||      |                ||             |      |                ||
14512027Sjungma@eit.uni-kl.de   ||filler|arg|frame-marker||register-save|filler|arg|frame-marker||
14612027Sjungma@eit.uni-kl.de   ------------------------------------------------------------------
14712027Sjungma@eit.uni-kl.de */
14812027Sjungma@eit.uni-kl.de
14912027Sjungma@eit.uni-kl.de#define QUICKTHREADS_STKBASE  (16+48+(16*sizeof(qt_word_t))+16+48)
15012027Sjungma@eit.uni-kl.de
15112027Sjungma@eit.uni-kl.de/* The index, relative to sp, of where to put each value. */
15212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ONLY_INDEX   (QUICKTHREADS_15)
15312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_USER_INDEX   (QUICKTHREADS_16)
15412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGT_INDEX   (QUICKTHREADS_17)
15512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGU_INDEX   (QUICKTHREADS_18)
15612027Sjungma@eit.uni-kl.de
15712027Sjungma@eit.uni-kl.deextern void qt_start(void);
15812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_ARGS_MD(sp)  \
15912027Sjungma@eit.uni-kl.de    (QUICKTHREADS_SPUT (sp, QUICKTHREADS_crp, QUICKTHREADS_PA_RISC_READ_PLABEL(qt_start)))
16012027Sjungma@eit.uni-kl.de
16112027Sjungma@eit.uni-kl.de
16212027Sjungma@eit.uni-kl.de/** This is for VARARGS. **/
16312027Sjungma@eit.uni-kl.de
16412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_DEFAULT
16512027Sjungma@eit.uni-kl.de
16612027Sjungma@eit.uni-kl.de/* Stack looks like this (2 stack frames):
16712027Sjungma@eit.uni-kl.de
16812027Sjungma@eit.uni-kl.de    <------ 64-bytes aligned -------><--------- 64-bytes aligned ---------->
16912027Sjungma@eit.uni-kl.de   |                                ||                                      |
17012027Sjungma@eit.uni-kl.de    <---?--><--?---><16><----32-----><----16*4-----><-16--><16><----32----->
17112027Sjungma@eit.uni-kl.de   ||      |       |   |            ||             |      |   |            ||
17212027Sjungma@eit.uni-kl.de   ||filler|varargs|arg|frame-marker||register-save|filler|arg|frame-marker||
17312027Sjungma@eit.uni-kl.de   --------------------------------------------------------------------------
17412027Sjungma@eit.uni-kl.de */
17512027Sjungma@eit.uni-kl.de
17612027Sjungma@eit.uni-kl.de/* Sp is moved to the end of the first stack frame. */
17712027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD0(sp, vasize) \
17812027Sjungma@eit.uni-kl.de    ((qt_t *)(((char *)sp) + QUICKTHREADS_STKROUNDUP(vasize + 4*4 + 32)))
17912027Sjungma@eit.uni-kl.de
18012027Sjungma@eit.uni-kl.de/* To reach the arguments from the end of the first stack frame use 32
18112027Sjungma@eit.uni-kl.de   as a negative adjustment. */
18212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_ADJUST(sp)	((qt_t *)(((char *)sp) - 32))
18312027Sjungma@eit.uni-kl.de
18412027Sjungma@eit.uni-kl.de/* Offset to reach the end of the second stack frame. */
18512027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTKBASE	((16*sizeof(qt_word_t)) + 16 + 4*4 + 32)
18612027Sjungma@eit.uni-kl.de
18712027Sjungma@eit.uni-kl.deextern void qt_vstart(void);
18812027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGS_MD1(sp) \
18912027Sjungma@eit.uni-kl.de    (QUICKTHREADS_SPUT (sp, QUICKTHREADS_crp, QUICKTHREADS_PA_RISC_READ_PLABEL(qt_vstart)))
19012027Sjungma@eit.uni-kl.de
19112027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VARGT_INDEX      (QUICKTHREADS_15)
19212027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VSTARTUP_INDEX   (QUICKTHREADS_16)
19312027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VUSERF_INDEX     (QUICKTHREADS_17)
19412027Sjungma@eit.uni-kl.de#define QUICKTHREADS_VCLEANUP_INDEX   (QUICKTHREADS_18)
19512027Sjungma@eit.uni-kl.de
19612027Sjungma@eit.uni-kl.de#endif /* ndef QUICKTHREADS_PA_RISC_H */
197