4 const char const * datac[] = {0,"#P/iob","#P/iow",0,"#P/iol",0,0,0,"#P/msr"};
7 main(int argc, char** argv) {
17 case 'W': size = 2; break;
18 case 'L': size = 4; break;
19 case 'M': size = 8; break;
20 case 'r': op = OREAD; break;
21 case 'w': op = OWRITE; break;
22 default: sysfatal("bad flag %c", ARGC());
24 if(op == -1) sysfatal("no operation selected");
25 if(argc < 1) sysfatal("no port selected");
26 if(op == OWRITE && argc < 2) sysfatal("no data selected");
27 port = strtoul(argv[0], 0, 0);
28 if(op == OWRITE) data = strtoull(argv[1], 0, 0);
30 fd = open(datac[size], op);
31 if(fd == -1) sysfatal("open: %r");
36 datab[2] = data >> 16;
37 datab[3] = data >> 24;
38 datab[4] = data >> 32;
39 datab[5] = data >> 40;
40 datab[6] = data >> 48;
41 datab[7] = data >> 56;
42 if(pwrite(fd, datab, size, port) != size)
43 sysfatal("pwrite: %r");
47 if(pread(fd, datab, size, port) != size)
48 sysfatal("pread: %r");
49 data = datab[0] | (datab[1] << 8) | (datab[2] << 16) |
50 (datab[3] << 24) | ((vlong)datab[4] << 32) |
51 ((vlong)datab[5] << 40) | ((vlong)datab[6] << 48) |
52 ((vlong)datab[7] << 56);
53 print("0x%llx\n", data);