|
|
1.1 root 1: /* CALLF RET instruction test */
2: /* Privilege registers */
3:
4: .set IPL,8
5: .set MAPEN,9
6: .set KSP,19
7:
8: /* PSL fields */
9: .set IV,32
10: .set T,16
11: .set N,8
12: .set Z,4
13: .set V,2
14: .set C,1
15:
16: /* constants */
17: .set DISABLE,0
18: .set ENABLE,1
19: .set HIGH,31 /* highest interrupt priority */
20:
21: .set NOARG1,3
22: .set NOARG2,2
23: .set ARG1,0xf
24: .set ARG2,0xff
25: .set ARG3,0xfff
26: .set R0_12,0x3fff /* mask to save r0 thru r12 */
27: .set R2_12,0x1ffc /* mask to save r2 thru r12 */
28: .set R357911,0xaa8 /* mask to save r3,r5,r7,r9,r11 */
29: .set MASK1,R2_12 /* save r2-r12 */
30: .set MASK2,R357911 /* save r3,5,7,9,11 */
31:
32:
33: .globl _callfx
34: _callfx:
35: bicpsw $(IV|T) /* disable exceptions */
36: /* */
37: strt:
38: callf $4,_setjmp /* save context for error return */
39: movab strt,_stpc /* save subtest address */
40: movl $1,_subtst /* subtest number */
41: movl $2,_no_opr /* number of operands in use */
42: movl $NOARG1,_opr /* first operand */
43: movl $MASK1,_opr + 4 /* second operand */
44: 0: movab stkbase,sp /* init. stack pointer */
45: movab stkbase,fp /* init. frame pointer */
46: movl fp,bfp /* save fp */
47: movw $MASK1,proc1 /* set entry mask in called procedure */
48: pushl $ARG1
49: pushl $ARG2
50: pushl $ARG3 /* push 3 arguments on stacks */
51: movl $2,r2 /* initialize r2 - r12 */
52: movl $3,r3
53: movl $4,r4
54: movl $5,r5
55: movl $6,r6
56: movl $7,r7
57: movl $0x8,r8
58: movl $0x9,r9
59: movl $0xa,r10
60: movl $0xb,r11
61: movl $0xc,r12
62: movab (r14),estk /* save sp */
63: /* compute expected sp after callf */
64: subl2 $(3*4),estk /* Space for fp,MASK,PC */
65: subl2 $(11*4),estk /* Space for r2-r12 */
66: /* compute expected fp after callf */
67: movl fp,efp
68: subl2 $(4*4),efp
69: bicpsw $(N|Z|V|C) /* clear all flags */
70: bispsw $(N|V|C) /* set all flags */
71: callf $(4*NOARG1+4),proc1 /* call procedure with 3 arguments */
72: retcall1:
73: blss error1 /* error if any of the n,z,v,c flags set */
74: beql error1
75: bvs error1
76: bcs error1
77: jmp 1f
78: error1: movpsl _actual /* actual = psl */
79: bbs $0,_scoplp,0b
80: movl $2,_ercode /* error code flag miscompare */
81: jmp *badrtn
82: 1: cmpl r2,$2 /* check if r2 - r12 get restored properly */
83: beql 1f
84: bbs $0,_scoplp,0b
85: movl $1,_ercode /* error code data miscompare */
86: movl r2,_actual /* actual data */
87: movl $2,_expected /* expected data */
88: jmp *badrtn
89: 1: cmpl r3,$3
90: beql 1f
91: bbs $0,_scoplp,0b
92: movl $1,_ercode /* error code data miscompare */
93: movl r3,_actual /* actual data */
94: movl $3,_expected /* expected data */
95: jmp *badrtn
96: 1: cmpl r4,$4
97: beql 1f
98: bbs $0,_scoplp,0b
99: movl $1,_ercode /* error code data miscompare */
100: movl r4,_actual /* actual data */
101: movl $4,_expected /* expected data */
102: jmp *badrtn
103: 1: cmpl r5,$5
104: beql 1f
105: bbs $0,_scoplp,0b
106: movl $1,_ercode /* error code data miscompare */
107: movl r5,_actual /* actual data */
108: movl $5,_expected /* expected data */
109: jmp *badrtn
110: 1: cmpl r6,$6
111: beql 1f
112: bbs $0,_scoplp,0b
113: movl $1,_ercode /* error code data miscompare */
114: movl r6,_actual /* actual data */
115: movl $6,_expected /* expected data */
116: jmp *badrtn
117: 1: cmpl r7,$7
118: beql 1f
119: bbs $0,_scoplp,0b
120: movl $1,_ercode /* error code data miscompare */
121: movl r7,_actual /* actual data */
122: movl $7,_expected /* expected data */
123: jmp *badrtn
124: 1: cmpl r8,$0x8
125: beql 1f
126: bbs $0,_scoplp,0b
127: movl $1,_ercode /* error code data miscompare */
128: movl r8,_actual /* actual data */
129: movl $8,_expected /* expected data */
130: jmp *badrtn
131: 1: cmpl r9,$0x9
132: beql 1f
133: bbs $0,_scoplp,0b
134: movl $1,_ercode /* error code data miscompare */
135: movl r9,_actual /* actual data */
136: movl $9,_expected /* expected data */
137: jmp *badrtn
138: 1: cmpl r10,$0xa
139: beql 1f
140: bbs $0,_scoplp,0b
141: movl $1,_ercode /* error code data miscompare */
142: movl r10,_actual /* actual data */
143: movl $0xa,_expected /* expected data */
144: jmp *badrtn
145: 1: cmpl r11,$0xb
146: beql 1f
147: bbs $0,_scoplp,0b
148: movl $1,_ercode /* error code data miscompare */
149: movl r11,_actual /* actual data */
150: movl $0xb,_expected /* expected data */
151: jmp *badrtn
152: 1: cmpl r12,$0xc
153: beql 1f
154: bbs $0,_scoplp,0b
155: movl $1,_ercode /* error code data miscompare */
156: movl r11,_actual /* actual data */
157: movl $0xc,_expected /* expected data */
158: jmp *badrtn
159: 1: movab (r14),r0
160: cmpl r0,bfp /* check if sp,fp get restored properly */
161: beql 1f
162: bbs $0,_scoplp,0b
163: movl $1,_ercode /* error code data miscompare */
164: movl r0,_actual /* actual data */
165: movl bfp,_expected /* expected data */
166: jmp *badrtn
167: 1: cmpl fp,bfp
168: beql 1f
169: bbs $0,_scoplp,0b
170: movl $1,_ercode /* error code data miscompare */
171: movl fp,_actual /* actual data */
172: movl bfp,_expected /* expected data */
173: jmp *badrtn
174: 1: jmp callp2 /* call procedure no. 2 */
175:
176:
177: callp2:
178: bbs $0,_force_lp,0b /* if set loop on last subtest */
179: c2: callf $4,_setjmp /* save context for error return */
180: movab c2,_stpc /* save subtest address */
181: movl $2,_subtst /* subtest number */
182: movl $2,_no_opr /* number of operands in use */
183: movl $NOARG2,_opr /* first operand */
184: movl $MASK2,_opr + 4 /* second operand */
185: 0: movw $MASK2,proc2 /* set entry mask in called procedure */
186: pushl $ARG1
187: pushl $ARG2
188: movl $3,r3 /* init. r3,r5,r7,r9,r11 */
189: movl $5,r5
190: movl $7,r7
191: movl $0x9,r9
192: movl $0xb,r11
193: movab (r14),estk /* save sp */
194: /* compute expected sp after callf */
195: subl2 $(3*4),estk /* Space for fp,MASK,PC */
196: subl2 $(5*4),estk /* Space for r3,5,7,9,11 */
197: /* compute expected fp after callf */
198: movl fp,efp
199: subl2 $(3*4),efp
200: movab proc2,r12
201: movl $(NOARG2*4+4),r6 /* load reg with argument data */
202: bispsw $(N|V) /* set n,v flags */
203: bicpsw $(Z|C) /* clear z,c flags */
204: callf $(NOARG2*4+4),proc2 /* cll procedure with 2 argu */
205: retcall2:
206: jneq error2 /* error if z,c flags clear */
207: jcc error2
208: jlss error2 /* error if n,v flags set */
209: jvs error2
210: jmp 1f
211: error2: movpsl _actual /* actual = psl */
212: bbs $0,_scoplp,0b
213: movl $2,_ercode /* error code flag miscompare */
214: jmp *badrtn
215: 1: cmpl r3,$3 /* check if r3,5,7,9,11 restored properly */
216: beql 1f
217: bbs $0,_scoplp,0b
218: movl $1,_ercode /* error code data miscompare */
219: movl r3,_actual /* actual data */
220: movl $3,_expected /* expected data */
221: jmp *badrtn
222: 1: cmpl r5,$5
223: beql 1f
224: bbs $0,_scoplp,0b
225: movl $1,_ercode /* error code data miscompare */
226: movl r5,_actual /* actual data */
227: movl $5,_expected /* expected data */
228: jmp *badrtn
229: 1: cmpl r7,$7
230: beql 1f
231: bbs $0,_scoplp,0b
232: movl $1,_ercode /* error code data miscompare */
233: movl r7,_actual /* actual data */
234: movl $7,_expected /* expected data */
235: jmp *badrtn
236: 1: cmpl r9,$0x9
237: beql 1f
238: bbs $0,_scoplp,0b
239: movl $1,_ercode /* error code data miscompare */
240: movl r9,_actual /* actual data */
241: movl $0x9,_expected /* expected data */
242: jmp *badrtn
243: 1: cmpl r11,$0xb
244: beql 1f
245: bbs $0,_scoplp,0b
246: movl $1,_ercode /* error code data miscompare */
247: movl r11,_actual /* actual data */
248: movl $0xb,_expected /* expected data */
249: jmp *badrtn
250: 1: movab (r14),r0
251: cmpl r0,bfp /* check if sp,fp restored properly */
252: beql 1f
253: bbs $0,_scoplp,0b
254: movl $1,_ercode /* error code data miscompare */
255: movl r0,_actual /* actual data */
256: movl bfp,_expected /* expected data */
257: jmp *badrtn
258: 1: cmpl fp,bfp
259: beql 1f
260: bbs $0,_scoplp,0b
261: movl $1,_ercode /* error code data miscompare */
262: movl fp,_actual /* actual data */
263: movl bfp,_expected /* expected data */
264: jmp *badrtn
265: 1: bbs $0,_force_lp,0b /* if set loop on last subtest */
266: jmp *return
267:
268:
269: /* TEST DATA */
270: .align 2
271: stack:
272: .space 400 /* 400 bytes for the stack */
273: stkbase:
274: .long 0
275: prevpc1:
276: .long retcall1
277: prevpc2:
278: .long retcall2
279: prono:
280: .long 0 /* current procedure called : 1/2 */
281: astk:
282: .long 0 /* actual sp after callf */
283: estk:
284: .long 0 /* expected sp after callf */
285: efp: .long 0 /* expected fp after callf */
286: bfp: .long 0 /* fp before callf */
287:
288: temp0: .long 0
289: temp1: .long 0
290:
291: /* PROCEDURE 1 */
292: proc1:
293: .word 0 /* entry mask */
294: jgeq err1 /* error if any of n,v,c flag clear */
295: jeql err1
296: jvc err1
297: jcc err1
298: jmp 1f
299: err1: movpsl _actual /* actal psl MAYBE it is incorrect */
300: bbs $0,_scoplp,0b
301: movl $2,_ercode /* error code flag failure */
302: jmp *badrtn
303: 1: movab (r14),astk
304: cmpl astk,estk /* check if sp decremented properly */
305: jeql 1f
306: bbs $0,_scoplp,0b
307: movl $1,_ercode /* error code data miscompare */
308: movl astk,_actual /* actual data */
309: movl estk,_expected /* expected data */
310: jmp *badrtn
311: 1: cmpl fp,efp /* check if fp decrmented properly */
312: jeql 1f
313: bbs $0,_scoplp,0b
314: movl $1,_ercode /* error code data miscompare */
315: movl fp,_actual /* actual data */
316: movl efp,_expected /* expected data */
317: jmp *badrtn
318: 1: cmpl (fp),bfp /* check previous fp saved on the stack */
319: jeql 1f
320: bbs $0,_scoplp,0b
321: movl $1,_ercode /* error code data miscompare */
322: movl (fp),_actual /* actual data */
323: movl bfp,_expected /* expected data */
324: jmp *badrtn
325: 1: movl fp,temp0
326: subl2 $4,temp0
327: movl *(temp0),temp0 /* get mask/argument longword from stack */
328: movl $MASK1,temp1
329: shll $16,temp1,temp1
330: addl2 $(4*NOARG1+4),temp1
331: cmpl temp0,temp1 /* check mask/argnum longword */
332: jeql 1f
333: bbs $0,_scoplp,0b
334: movl $1,_ercode /* error code data miscompare */
335: movl temp0,_actual /* actual data */
336: movl temp1,_expected /* expected data */
337: jmp *badrtn
338: cmpl -8(fp),prevpc1 /* check saved PC on the stack */
339: jeql 1f
340: bbs $0,_scoplp,0b
341: movl $1,_ercode /* error code data miscompare */
342: movl -8(fp),_actual /* actual data */
343: movl prevpc1,_expected /* expected data */
344: jmp *badrtn
345: 1: cmpl (sp),$2 /* check saved r2 - r12 on stack */
346: jeql 1f
347: bbs $0,_scoplp,0b
348: movl $1,_ercode /* error code data miscompare */
349: movl (sp),_actual /* actual data */
350: movl $2,_expected /* expected data */
351: jmp *badrtn
352: 1: cmpl 4(sp),$3
353: jeql 1f
354: bbs $0,_scoplp,0b
355: movl $1,_ercode /* error code data miscompare */
356: movl 4(sp),_actual /* actual data */
357: movl $3,_expected /* expected data */
358: jmp *badrtn
359: 1: cmpl 8(sp),$4
360: jeql 1f
361: bbs $0,_scoplp,0b
362: movl $1,_ercode /* error code data miscompare */
363: movl 8(sp),_actual /* actual data */
364: movl $4,_expected /* expected data */
365: jmp *badrtn
366: 1: cmpl 12(sp),$5
367: jeql 1f
368: bbs $0,_scoplp,0b
369: movl $1,_ercode /* error code data miscompare */
370: movl 12(sp),_actual /* actual data */
371: movl $5,_expected /* expected data */
372: jmp *badrtn
373: 1: cmpl 16(sp),$6
374: jeql 1f
375: bbs $0,_scoplp,0b
376: movl $1,_ercode /* error code data miscompare */
377: movl 16(sp),_actual /* actual data */
378: movl $6,_expected /* expected data */
379: jmp *badrtn
380: 1: cmpl 20(sp),$7
381: jeql 1f
382: bbs $0,_scoplp,0b
383: movl $1,_ercode /* error code data miscompare */
384: movl 20(sp),_actual /* actual data */
385: movl $7,_expected /* expected data */
386: jmp *badrtn
387: 1: cmpl 24(sp),$0x8
388: jeql 1f
389: bbs $0,_scoplp,0b
390: movl $1,_ercode /* error code data miscompare */
391: movl 24(sp),_actual /* actual data */
392: movl $8,_expected /* expected data */
393: jmp *badrtn
394: 1: cmpl 28(sp),$0x9
395: jeql 1f
396: bbs $0,_scoplp,0b
397: movl $1,_ercode /* error code data miscompare */
398: movl 28(sp),_actual /* actual data */
399: movl $9,_expected /* expected data */
400: jmp *badrtn
401: 1: cmpl 32(sp),$0xa
402: jeql 1f
403: bbs $0,_scoplp,0b
404: movl $1,_ercode /* error code data miscompare */
405: movl 32(sp),_actual /* actual data */
406: movl $0xa,_expected /* expected data */
407: jmp *badrtn
408: 1: cmpl 36(sp),$0xb
409: jeql 1f
410: bbs $0,_scoplp,0b
411: movl $1,_ercode /* error code data miscompare */
412: movl 36(sp),_actual /* actual data */
413: movl $0xb,_expected /* expected data */
414: jmp *badrtn
415: 1: cmpl 40(sp),$0xc
416: jeql 1f
417: bbs $0,_scoplp,0b
418: movl $1,_ercode /* error code data miscompare */
419: movl 40(sp),_actual /* actual data */
420: movl $0xc,_expected /* expected data */
421: jmp *badrtn
422:
423: /* all checked out */
424: 1: movl $0,r2 /* zero out r2 - r12 */
425: movl r2,r3
426: movl r2,r4
427: movl r2,r5
428: movl r2,r6
429: movl r2,r7
430: movl r2,r8
431: movl r2,r9
432: movl r2,r10
433: movl r2,r11
434: movl r2,r12
435: bicpsw $(N|Z|V|C) /* clear all flags */
436: ret /* TESTING RET ..... */
437: bbs $0,_scoplp,0b
438: movl $3,_ercode /* error code operand was modified did not ret*/
439: jmp *badrtn
440:
441:
442: /* PROCEDURE 2 */
443: .align 2
444: proc2:
445: .word 0 /* entry mask */
446: jgeq error4 /* error if n,v flag clear */
447: jvc error4
448: jeql error4 /* error if z,c flag set */
449: jcs error4
450: jmp 1f
451: error4: movpsl _actual /* actal psl MAYBE it is incorrect */
452: bbs $0,_scoplp,0b
453: movl $2,_ercode /* error code flag failure */
454: jmp *badrtn
455: 1: movab (r14),astk
456: cmpl astk,estk /* check if sp get decrement */
457: jeql 1f
458: bbs $0,_scoplp,0b
459: movl $1,_ercode /* error code data miscompare */
460: movl astk,_actual /* actual data */
461: movl estk,_expected /* expected data */
462: jmp *badrtn
463: 1: cmpl fp,efp /* check if fp get decrement properly */
464: jeql 1f
465: bbs $0,_scoplp,0b
466: movl $1,_ercode /* error code data miscompare */
467: movl fp,_actual /* actual data */
468: movl efp,_expected /* expected data */
469: jmp *badrtn
470: 1: cmpl (fp),bfp /* check previous fp saved on stack */
471: jeql 1f
472: bbs $0,_scoplp,0b
473: movl $1,_ercode /* error code data miscompare */
474: movl (fp),_actual /* actual data */
475: movl bfp,_expected /* expected data */
476: jmp *badrtn
477:
478: 1: movl fp,temp0
479: subl2 $4,temp0
480: movl *(temp0),temp0 /* get mask/argument longword from stack */
481: movl $MASK2,temp1
482: shll $16,temp1,temp1
483: addl2 $(4*NOARG2+4),temp1
484: 1: cmpl temp0,temp1 /* check mask/argnum longword */
485: jeql 1f
486: bbs $0,_scoplp,0b
487: movl $1,_ercode /* error code data miscompare */
488: movl temp0,_actual /* actual data */
489: movl temp1,_expected /* expected data */
490: jmp *badrtn
491: cmpl -8(fp),prevpc2 /* check saved PC on the stack */
492: jeql 1f
493: bbs $0,_scoplp,0b
494: movl $1,_ercode /* error code data miscompare */
495: movl -8(fp),_actual /* actual data */
496: movl prevpc2,_expected /* expected data */
497: jmp *badrtn
498:
499: 1: cmpl (sp),$3 /* check saved r3,5,7,9,11 saved on stack */
500: jeql 1f
501: bbs $0,_scoplp,0b
502: movl $1,_ercode /* error code data miscompare */
503: movl (sp),_actual /* actual data */
504: movl $0x3,_expected /* expected data */
505: jmp *badrtn
506: 1: cmpl 4(sp),$5
507: jeql 1f
508: bbs $0,_scoplp,0b
509: movl $1,_ercode /* error code data miscompare */
510: movl 4(sp),_actual /* actual data */
511: movl $0x5,_expected /* expected data */
512: jmp *badrtn
513: 1: cmpl 8(sp),$7
514: jeql 1f
515: bbs $0,_scoplp,0b
516: movl $1,_ercode /* error code data miscompare */
517: movl 8(sp),_actual /* actual data */
518: movl $0x7,_expected /* expected data */
519: jmp *badrtn
520: 1: cmpl 12(sp),$9
521: jeql 1f
522: bbs $0,_scoplp,0b
523: movl $1,_ercode /* error code data miscompare */
524: movl 12(sp),_actual /* actual data */
525: movl $0x9,_expected /* expected data */
526: jmp *badrtn
527: 1: cmpl 16(sp),$0xb
528: jeql 1f
529: bbs $0,_scoplp,0b
530: movl $1,_ercode /* error code data miscompare */
531: movl 16(sp),_actual /* actual data */
532: movl $0xb,_expected /* expected data */
533: jmp *badrtn
534: /* all checked out */
535: 1: movl $0,r3 /* zero out r3,5,7,9,11 */
536: movl $0,r5
537: movl $0,r7
538: movl $0,r9
539: movl $0,r11
540: bispsw $(Z|C) /* set z,c flags */
541: bicpsw $(N|V) /* clear n,v flags */
542: ret /* TESTING RET */
543:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.