|
|
1.1 root 1:
2: #include "vddc.h"
3: #define GATE_CLOSED (0xff)
4: #define NBPG 1024
5: asm(".set NBPG,1024");
6: asm(".set IPL,0x8");
7:
8: struct ccb /* CHANNEL CONTROL BLOCK */
9: {
10: char ccw ; /* 0x11 normal; 0x09 clear non_vect interrupt */
11: char gate; /* This is "the" GATE */
12: char pt_tpb[4] ; /* pointer to ->TAPE OPERATION BLOCK or MOVE BLOCK */
13: };
14: extern long Probe, iob0, iob1, iob2, iob3, iob4;
15: extern long Multi, cmd_done, Vdone;
16: extern long tape_ON, vddc_ON, vioc_ON;
17:
18: extern struct DEVPAR devpar[];
19: extern struct tpb tpb;
20: extern struct ccb ccblk;
21: extern struct DCB vdcb;
22: extern struct tpblk *tblk;
23:
24: long disk_buf[2*NBPG/4];
25: long mul_err = 0;
26:
27:
28: multi()
29: {
30: register long tm_bsiz, drno;
31:
32: writes("\n\t** Multiple interrupts test **\n");
33: drno = get_unit();
34: if (tape_ON) {
35: tm_bsiz = tape_op(CONFIG,0,0);
36: tm_rew(); /* rewind tape */
37: tblk = (struct tpblk *)&tpb;
38: }
39: mul_err = 0;
40: multi_ex(&iob0, &iob2, &iob4, disk_buf, drno);
41: if (!mul_err) writes("\nPassed..\n");
42: else writes("\nFailed..\n");
43: }
44:
45:
46: /* This test tries by create memory contention between Tahoe
47: and the tape master by the following actions :
48: (1) Sent a command to Tape master to move 2 blocks
49: of data in Tahoe memory to buffer X, X+1
50: (2) use movblk instruction to move the same 2 blocks
51: to buffer Y, Y+1 and keep doing this until cmd_done
52: (indicate tape master done with command)
53: (3) compare buffer X, X+1 with Y, Y+1.
54: */
55: multi_ex(srcbuf, tdest, sdest, dbuff,drno)
56: char *srcbuf, *tdest, *sdest, *dbuff;
57: long drno;
58: { register long ix, *lptr;
59: register short *sptr;
60:
61: sptr = (short *)srcbuf; /* Write pattern to source buffers */
62: for (ix=0; ix<NBPG; ix++) *sptr++ = ix;
63: for (ix=0; ix<(NBPG*2); ix++) {
64: sdest[ix] = tdest[ix] = dbuff[ix] = 0; /* Clear destination */
65: }
66:
67: /* Set up Tpb to move 2 blocks */
68: if (tape_ON) tblk_mv(srcbuf,tdest,NBPG*2);
69: mul_int(srcbuf,sdest,drno,dbuff);
70:
71: for (ix=0; ix<(NBPG*2); ix++) {
72: if (tape_ON) {
73: if (srcbuf[ix] != tdest[ix]) {
74: writes("\nBlockmv tape error, expected ");
75: writeh(srcbuf[ix]&0xff);
76: writes(" , actual "); writeh(tdest[ix]&0xff);
77: writes(" , address "); writeh(&tdest[ix]);
78: mul_err = 1;
79: }
80: }
81: if (vddc_ON) {
82: if (srcbuf[ix] != dbuff[ix]) {
83: writes("\nBlockmv disk error, expected ");
84: writeh(srcbuf[ix]&0xff);
85: writes(" , actual "); writeh(dbuff[ix]&0xff);
86: writes(" , address "); writeh(&dbuff[ix]);
87: mul_err = 1;
88: }
89: }
90: if (srcbuf[ix] != sdest[ix]) {
91: writes("\nBlockmv Tahoe error, expected ");
92: writeh(srcbuf[ix]&0xff);
93: writes(" , actual "); writeh(sdest[ix]&0xff);
94: writes(" , address "); writeh(&sdest[ix]);
95: mul_err = 1;
96: }
97: }
98: }
99:
100:
101: get_unit()
102: { register long unit;
103: for (unit=0;devpar[unit].nocyl;unit++)
104: { if (devpar[unit].alive) return(unit); }
105: return(-1);
106: }
107:
108:
109: /* Routine to create memory contention
110: return -1 if error
111: */
112: mul_int(src,sdest,dno,dbuff)
113: char *src, *sdest, *dbuff;
114: long dno;
115: { register long *r12, cntr, rtn_cnt, ix, save;
116:
117: Multi = 1;
118: if (tape_ON) get_taperdy(); /* Get Tape ready */
119: cmd_done = 0;
120:
121: asm("mtpr $0x1f,$IPL"); /* NO interrupt yet ! */
122: if (vddc_ON) vddc_op(WR_COMP,dno,0x2025a,2,src);
123: if (tape_ON) cy_attn(); /* Execute command */
124:
125: for (ix=0;ix<6;ix++) { /* Burns some time,TAHOE do some block move */
126: asm("movl 4(fp),r0"); /* Source */
127: asm("movl 8(fp),r1"); /* Destination */
128: asm("movl $NBPG*2,r2"); /* Count */
129: asm("movblk"); /* Move it */
130: }
131: ix =1;
132: asm("mtpr $0x1,$IPL"); /* NOW interrupt me.. */
133: if (tape_ON) {
134: if (!isvddc_done()) return(-1);
135: if (cmd_done == 2) return(-1); /* operation has error */
136: }
137: if (vddc_ON) {
138: while (!Vdone);
139: Multi = 0;
140: vddc_op(RD_DATA,dno,0x2025a,2,dbuff);
141: }
142: Multi = 0;
143: return(0);
144: }
145:
146: isvddc_done()
147: { register long count;
148: count = 400;
149: while (!cmd_done) {
150: DELAY(0x1fffff);
151: if (--count==0) return(0);
152: }
153: return(1);
154: }
155:
156: get_taperdy()
157: {
158: while (g_open()==0) /* Is gate open ? */
159: { tm_init();
160: error("tape not ready yet..\n");
161: return(-1);
162: }
163: ccblk.gate = (char)GATE_CLOSED; /* Close gate */
164: }
165:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.