xref: /csrg-svn/sys/vax/stand/drtest.c (revision 23224)
1 /*
2  * Copyright (c) 1982 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)drtest.c	6.2 (Berkeley) 06/08/85
7  */
8 
9 /*
10  * Standalone program to test a disk and driver
11  * by reading the disk a track at a time.
12  */
13 #include "../h/param.h"
14 #include "../h/inode.h"
15 #include "../h/fs.h"
16 #include "saio.h"
17 
18 #define SECTSIZ	512
19 
20 extern	int end;
21 char	*malloc();
22 char	*prompt();
23 
24 main()
25 {
26 	char *cp, *bp;
27 	int fd, tracksize, debug;
28 	register int sector, lastsector;
29 	struct st st;
30 
31 	printf("Testprogram for stand-alone driver\n\n");
32 again:
33 	cp = prompt("Enable debugging (1=bse, 2=ecc, 3=bse+ecc)? ");
34 	debug = atoi(cp);
35 	if (debug < 0)
36 		debug = 0;
37 	fd = getdevice();
38 	ioctl(fd, SAIODEVDATA, (char *)&st);
39 	printf("Device data: #cylinders=%d, #tracks=%d, #sectors=%d\n",
40 		st.ncyl, st.ntrak, st.nsect);
41 	ioctl(fd, SAIODEBUG, (char *)debug);
42 	tracksize = st.nsect * SECTSIZ;
43 	bp = malloc(tracksize);
44 	printf("Reading in %d byte records\n", tracksize);
45 	printf("Start ...make sure drive is on-line\n");
46 	lseek(fd, 0, 0);
47 	lastsector = st.ncyl * st.nspc;
48 	for (sector = 0; sector < lastsector; sector += st.nsect) {
49 		if (sector && (sector % (st.nspc * 10)) == 0)
50 			printf("cylinder %d\n", sector/st.nspc);
51 		read(fd, bp, tracksize);
52 	}
53 	goto again;
54 }
55 
56 /*
57  * Prompt and verify a device name from the user.
58  */
59 getdevice()
60 {
61 	register char *cp;
62 	register struct devsw *dp;
63 	int fd;
64 
65 top:
66 	cp = prompt("Device to read? ");
67 	if ((fd = open(cp, 2)) < 0) {
68 		printf("Known devices are: ");
69 		for (dp = devsw; dp->dv_name; dp++)
70 			printf("%s ",dp->dv_name);
71 		printf("\n");
72 		goto top;
73 	}
74 	return (fd);
75 }
76 
77 char *
78 prompt(msg)
79 	char *msg;
80 {
81 	static char buf[132];
82 
83 	printf("%s", msg);
84 	gets(buf);
85 	return (buf);
86 }
87 
88 /*
89  * Allocate memory on a page-aligned address.
90  * Round allocated chunk to a page multiple to
91  * ease next request.
92  */
93 char *
94 malloc(size)
95 	int size;
96 {
97 	char *result;
98 	static caddr_t last = 0;
99 
100 	if (last == 0)
101 		last = (caddr_t)(((int)&end + 511) & ~0x1ff);
102 	size = (size + 511) & ~0x1ff;
103 	result = (char *)last;
104 	last += size;
105 	return (result);
106 }
107