Pristine Ack-5.5
[Ack-5.5.git] / util / int / rsb.c
1 /* $Id: rsb.c,v 2.4 1994/06/24 10:48:54 ceriel Exp $ */
2
3 /*      The Return Status Block contains, in push order:
4         FIL, LIN, LB, PC, PI, rsbcode
5 */
6
7 #include        "logging.h"
8 #include        "global.h"
9 #include        "mem.h"
10 #include        "rsb.h"
11 #include        "proctab.h"
12 #include        "linfil.h"
13 #include        "shadow.h"
14 #include        "warn.h"
15
16 /* offsets to be added to a local base */
17 int rsb_rsbcode;
18 int rsb_PI;
19 int rsb_PC;
20 int rsb_LB;
21 int rsb_LIN;
22 int rsb_FIL;
23 int rsbsize;
24
25 init_rsb()
26 {
27         rsb_rsbcode = 0;
28         rsb_PI = wsize;
29         rsb_PC = rsb_PI + psize;
30         rsb_LB = rsb_PC + psize;
31         rsb_LIN = rsb_LB + psize;
32         rsb_FIL = rsb_LIN + LINSIZE;
33         rsbsize = rsb_FIL + psize;
34 }
35
36 pushrsb(rsbcode)
37         int rsbcode;
38 {
39         /* fill Return Status Block */
40         incSP((size)rsbsize);
41
42         st_stdp(SP + rsb_FIL, getFIL());
43         st_prot(SP + rsb_FIL, psize);
44
45         st_stn(SP + rsb_LIN, (long)getLIN(), LINSIZE);
46         st_prot(SP + rsb_LIN, LINSIZE);
47
48         st_stdp(SP + rsb_LB, LB);
49         st_prot(SP + rsb_LB, psize);
50
51         st_stip(SP + rsb_PC, PC);
52         st_prot(SP + rsb_PC, psize);
53
54         st_stn(SP + rsb_PI, PI, psize);
55         st_prot(SP + rsb_PI, psize);
56
57         st_stw(SP + rsb_rsbcode, (long)rsbcode);
58         st_prot(SP + rsb_rsbcode, wsize);
59
60         newLB(SP);
61 }
62
63 /*ARGSUSED*/
64 int poprsb(rtt)
65         int rtt;                        /* set to 1 if working for RTT */
66 {
67         /* pops the RSB and returns the rsbcode, for further testing */
68         register int rsbcode;
69
70 #ifdef  LOGGING
71         {
72                 /* check SP */
73                 register ptr properSP = LB - proctab[PI].pr_nloc;
74
75                 if (SP < properSP)
76                         warning(rtt ? WRTTSTL : WRETSTL);
77                 if (SP > properSP)
78                         warning(rtt ? WRTTSTS : WRETSTS);
79         }
80 #endif  /* LOGGING */
81
82         /* discard stack up to RSB */
83         newSP(LB);
84
85         /* get RSB code and test it for applicability */
86         rsbcode = st_lduw(SP + rsb_rsbcode);
87         if ((rsbcode & RSBMASK) != RSBCODE)     /* no RSB at all */
88                 return rsbcode;
89
90         if (rsbcode != RSB_STP) {
91                 /*      Restore registers PI, PC, LB, LIN and FIL
92                         from Return Status Block
93                 */
94                 PI = st_lds(SP + rsb_PI, psize);
95                 newPC(st_ldip(SP + rsb_PC));
96                 newLB(st_lddp(SP + rsb_LB));
97                 putLIN((long) st_ldu(SP + rsb_LIN, LINSIZE));
98                 putFIL(st_lddp(SP + rsb_FIL));
99
100                 /* remove RSB */
101                 st_dec(rsbsize);
102
103                 pop_frames();
104         }
105
106         return rsbcode;
107 }
108