mRegs.c revision a1d73b4b
1c06b6b69Smrg#include <unistd.h>
2c06b6b69Smrg#include <stdio.h>
3c06b6b69Smrg#include <stdlib.h>
4c06b6b69Smrg
5a1d73b4bSmrg#include "iopl.h"
6c06b6b69Smrg
7c06b6b69Smrgint hex2int(char* str);
8c06b6b69Smrg
9c06b6b69Smrgint main(int argc, char** argv)
10c06b6b69Smrg{
11c06b6b69Smrg    int i, value, index = 0;
12c06b6b69Smrg    char c, cport;
13c06b6b69Smrg    char* str;
14c06b6b69Smrg    unsigned int port, port1 = 0;
15c06b6b69Smrg    int query = 0;
16c06b6b69Smrg
17c06b6b69Smrg    if(argc < 2) {
18c06b6b69Smrg	printf("usage: %s [Cvvxx [Cvvxx]] [Dxx]\n",argv[0]);
19c06b6b69Smrg        printf("     where C = A|a write vv to ARxx\n");
20c06b6b69Smrg        printf("             = C|c write vv to CRxx\n");
21c06b6b69Smrg        printf("             = F|f write vv to FRxx (6555x only)\n");
22c06b6b69Smrg        printf("             = G|g write vv to GRxx\n");
23c06b6b69Smrg        printf("             = M|m write vv to MRxx (6555x only)\n");
24c06b6b69Smrg        printf("             = S|s write vv to SRxx\n");
25c06b6b69Smrg        printf("             = X|x write vv to XRxx\n");
26c06b6b69Smrg        printf("     where D = Y|y write xx to FCR\n");
27c06b6b69Smrg        printf("             = Z|z write vv to MSR\n");
28c06b6b69Smrg        printf("     xx is in hexadecimal\n");
29c06b6b69Smrg	printf("     vv is in hexadecimal or '?' for query\n");
30c06b6b69Smrg    }
31c06b6b69Smrg
32c06b6b69Smrg    SET_IOPL();
33c06b6b69Smrg
34c06b6b69Smrg    for(i = 1; i < argc; i++){
35c06b6b69Smrg	value = 0;
36c06b6b69Smrg	str = argv[i];
37c06b6b69Smrg	c = *str++;
38c06b6b69Smrg	switch (c) {
39c06b6b69Smrg	  case 'f':
40c06b6b69Smrg	  case 'F':
41c06b6b69Smrg	    cport = 'F';
42c06b6b69Smrg	    port = 0x3D0;
43c06b6b69Smrg	    break;
44c06b6b69Smrg	  case 'c':
45c06b6b69Smrg	  case 'C':
46c06b6b69Smrg	    cport = 'C';
47c06b6b69Smrg	    port = 0x3D4;
48c06b6b69Smrg	    break;
49c06b6b69Smrg	  case 'x':
50c06b6b69Smrg	  case 'X':
51c06b6b69Smrg	    cport = 'X';
52c06b6b69Smrg	    port = 0x3D6;
53c06b6b69Smrg	    break;
54c06b6b69Smrg	  case 'g':
55c06b6b69Smrg	  case 'G':
56c06b6b69Smrg	    cport = 'G';
57c06b6b69Smrg	    port = 0x3CE;
58c06b6b69Smrg	    break;
59c06b6b69Smrg	  case 'a':
60c06b6b69Smrg	  case 'A':
61c06b6b69Smrg	    cport = 'A';
62c06b6b69Smrg	    port = 0x3C0;
63c06b6b69Smrg	    break;
64c06b6b69Smrg	  case 's':
65c06b6b69Smrg	  case 'S':
66c06b6b69Smrg	    cport = 'S';
67c06b6b69Smrg	    port = 0x3C4;
68c06b6b69Smrg	    break;
69c06b6b69Smrg	  case 'm':
70c06b6b69Smrg	  case 'M':
71c06b6b69Smrg	    cport = 'M';
72c06b6b69Smrg	    port = 0x3D2;
73c06b6b69Smrg	    break;
74c06b6b69Smrg	  case 'y':
75c06b6b69Smrg	  case 'Y':
76c06b6b69Smrg	    cport = 'Y';
77c06b6b69Smrg	    port = 0x3DA;
78c06b6b69Smrg            port1 = 0x3CA;
79c06b6b69Smrg	    break;
80c06b6b69Smrg	  case 'z':
81c06b6b69Smrg	  case 'Z':
82c06b6b69Smrg	    cport = 'Z';
83c06b6b69Smrg	    port = 0x3C2;
84c06b6b69Smrg	    port1 = 0x3CC;
85c06b6b69Smrg	    break;
86c06b6b69Smrg	  default:
87c06b6b69Smrg	    continue;
88c06b6b69Smrg	    break;
89c06b6b69Smrg	}
90c06b6b69Smrg	if ((cport != 'Z') && (cport != 'Y')) index = inb(port);
91c06b6b69Smrg	while ((c = *str++)) {
92c06b6b69Smrg	    if (c == '?') {
93c06b6b69Smrg	      query = 1;
94c06b6b69Smrg	    }
95c06b6b69Smrg	    if(c >= '0' && c <= '9')
96c06b6b69Smrg	    value = (value << 4) | (c - '0');  /*ASCII assumed*/
97c06b6b69Smrg	    else if(c >= 'A' && c < 'G')
98c06b6b69Smrg	    value = (value << 4) | (c - 'A'+10);  /*ASCII assumed*/
99c06b6b69Smrg	    else if(c >= 'a' && c < 'g')
100c06b6b69Smrg	    value = (value << 4) | (c - 'a'+10);  /*ASCII assumed*/
101c06b6b69Smrg	}
102c06b6b69Smrg	if ((cport != 'Z') && (cport != 'Y')) outb(port,value&0xFF);
103c06b6b69Smrg	if (query) {
104c06b6b69Smrg	    if ((cport != 'Z') && (cport != 'Y'))
105c06b6b69Smrg		printf("%cR%X: 0x%X\n", cport, value & 0xFF,
106c06b6b69Smrg		   inb(port+1)&0xFF);
107c06b6b69Smrg	    else
108c06b6b69Smrg	        if (cport == 'Z')
109c06b6b69Smrg		    printf("MSR: 0x%X\n", inb(port1)&0xFF);
110c06b6b69Smrg		else
111c06b6b69Smrg		    printf("FCR: 0x%X\n", inb(port1)&0xFF);
112c06b6b69Smrg	} else {
113c06b6b69Smrg	    if ((cport != 'Z') && (cport != 'Y')) {
114c06b6b69Smrg		printf("%cR%X: 0x%X -> 0x%X\n", cport, value & 0xFF,
115c06b6b69Smrg		   inb(port+1)&0xFF, (value&0xFF00)>>8);
116c06b6b69Smrg		outw(port, value);
117c06b6b69Smrg		outb(port, index &0xFF);
118c06b6b69Smrg	    } else {
119c06b6b69Smrg	        if (cport == 'Z')
120c06b6b69Smrg		    printf("MSR: 0x%X -> 0x%X\n", inb(port1)&0xFF, value&0xFF);
121c06b6b69Smrg		else
122c06b6b69Smrg		    printf("FCR: 0x%X -> 0x%X\n", inb(port1)&0xFF, value&0xFF);
123c06b6b69Smrg		outb(port, value & 0xFF);
124c06b6b69Smrg	    }
125c06b6b69Smrg	}
126c06b6b69Smrg    }
127c06b6b69Smrg    RESET_IOPL();
128c06b6b69Smrg    return 0;
129c06b6b69Smrg}
130