diff options
author | aiju <devnull@localhost> | 2011-04-15 21:01:29 +0200 |
---|---|---|
committer | aiju <devnull@localhost> | 2011-04-15 21:01:29 +0200 |
commit | 2c6802e80f2bc7be660981b183fe89ecd72061ce (patch) | |
tree | bf95f457935e7fbbc3899e9b9c8a395fe3849e04 /sys/src/cmd/seg.c | |
parent | 68d6b0808bbd57a91abf2a5ac4571e4372a8d3fc (diff) |
added io/seg utility
Diffstat (limited to 'sys/src/cmd/seg.c')
-rw-r--r-- | sys/src/cmd/seg.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/sys/src/cmd/seg.c b/sys/src/cmd/seg.c new file mode 100644 index 000000000..367aad988 --- /dev/null +++ b/sys/src/cmd/seg.c @@ -0,0 +1,47 @@ +#include <u.h> +#include <libc.h> + +const char datac[] = {0,'b','w',0,'l'}; + +void +main(int argc, char** argv) { + ulong size, segsize, op, port; + char* segment; + ulong data; + uchar *seg; + + data = 0; + size = 1; + op = -1; + ARGBEGIN { + case 'W': size = 2; break; + case 'L': size = 4; break; + case 'r': op = OREAD; break; + case 'w': op = OWRITE; break; + default: sysfatal("bad flag %c", ARGC()); + } ARGEND; + if(op == -1) sysfatal("no operation selected"); + if(argc < 3) sysfatal("no address, no segsize or no segment selected"); + if(op == OWRITE && argc < 4) sysfatal("no data selected"); + segment = argv[0]; + segsize = strtoul(argv[1], 0, 0); + port = strtoul(argv[2], 0, 0); + if(op == OWRITE) data = strtoul(argv[3], 0, 0); + + seg = segattach(0, segment, 0, segsize); + if(seg == (uchar*)-1) sysfatal("segattach: %r"); + + if(op == OWRITE) { + switch(size) { + case 1: *(uchar*)(seg+port) = data; break; + case 2: *(ushort*)(seg+port) = data; break; + case 4: *(ulong*)(seg+port) = data; break; + } + } + else { + data = seg[port]; + if(size >= 2) data |= seg[port+1] << 8; + if(size >= 4) data |= (seg[port+2] << 16) | (seg[port+3] << 24); + print("0x%ulx\n", data); + } +}
\ No newline at end of file |