]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/seg.c
cpu: make -p work with explicit service in dialstring (same as import)
[plan9front.git] / sys / src / cmd / seg.c
1 #include <u.h>
2 #include <libc.h>
3
4 const char datac[] = {0,'b','w',0,'l'};
5
6 void
7 main(int argc, char** argv) {
8         ulong size, segsize, op, port;
9         char* segment;
10         ulong data;
11         uchar *seg;
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 'r': op = OREAD; break;
20                 case 'w': op = OWRITE; break;
21                 default: sysfatal("bad flag %c", ARGC());
22         } ARGEND;
23         if(op == -1) sysfatal("no operation selected");
24         if(argc < 3) sysfatal("no address, no segsize or no segment selected");
25         if(op == OWRITE && argc < 4) sysfatal("no data selected");
26         segment = argv[0];
27         segsize = strtoul(argv[1], 0, 0);
28         port = strtoul(argv[2], 0, 0);
29         if(op == OWRITE) data = strtoul(argv[3], 0, 0);
30         
31         seg = segattach(0, segment, 0, segsize);
32         if(seg == (uchar*)-1) sysfatal("segattach: %r");
33         
34         if(op == OWRITE) {
35                 switch(size) {
36                         case 1: *(uchar*)(seg+port) = data; break;
37                         case 2: *(ushort*)(seg+port) = data; break;
38                         case 4: *(ulong*)(seg+port) = data; break;
39                 }
40         }
41         else {
42                 data = seg[port];
43                 if(size >= 2) data |= seg[port+1] << 8;
44                 if(size >= 4) data |= (seg[port+2] << 16) | (seg[port+3] << 24);
45                 print("0x%ulx\n", data);
46         }
47         exits(nil);
48 }