]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/io.c
merge
[plan9front.git] / sys / src / cmd / io.c
1 #include <u.h>
2 #include <libc.h>
3
4 char *datac[] = {0,"#P/iob","#P/iow",0,"#P/iol",0,0,0,"#P/msr"};
5
6 void
7 main(int argc, char** argv) {
8         int fd, size, op;
9         ulong port;
10         uvlong data;
11         uchar datab[8];
12         
13         data = 0;
14         size = 1;
15         op = -1;
16         ARGBEGIN {
17                 case 'W': size = 2; break;
18                 case 'L': size = 4; break;
19                 case 'M': size = 8; break;
20                 case 'E': datac[1] = datac[2] = datac[4] = datac[8] = "#P/ec"; break;
21                 case 'r': op = OREAD; break;
22                 case 'w': op = OWRITE; break;
23                 default: sysfatal("bad flag %c", ARGC());
24         } ARGEND;
25         if(op == -1) sysfatal("no operation selected");
26         if(argc < 1) sysfatal("no port selected");
27         if(op == OWRITE && argc < 2) sysfatal("no data selected");
28         port = strtoul(argv[0], 0, 0);
29         if(op == OWRITE) data = strtoull(argv[1], 0, 0);
30         
31         fd = open(datac[size], op);
32         if(fd == -1) sysfatal("open: %r");
33         
34         if(op == OWRITE) {
35                 datab[0] = data;
36                 datab[1] = data >> 8;
37                 datab[2] = data >> 16;
38                 datab[3] = data >> 24;
39                 datab[4] = data >> 32;
40                 datab[5] = data >> 40;
41                 datab[6] = data >> 48;
42                 datab[7] = data >> 56;
43                 if(pwrite(fd, datab, size, port) != size)
44                         sysfatal("pwrite: %r");
45         }
46         else {
47                 memset(datab, 0, 8);
48                 if(pread(fd, datab, size, port) != size)
49                         sysfatal("pread: %r");
50                 data = datab[0] | (datab[1] << 8) | (datab[2] << 16) |
51                         (datab[3] << 24) | ((vlong)datab[4] << 32) |
52                         ((vlong)datab[5] << 40) | ((vlong)datab[6] << 48) | 
53                         ((vlong)datab[7] << 56);
54                 print("0x%ullx\n", data);
55         }
56         exits(nil);
57 }