mRegs.c revision c06b6b69
1c06b6b69Smrg/* $XConsortium: mRegs.c /main/2 1996/10/27 11:49:43 kaleb $ */
2c06b6b69Smrg
3c06b6b69Smrg
4c06b6b69Smrg
5c06b6b69Smrg
6c06b6b69Smrg
7c06b6b69Smrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/mRegs.c,v 1.5 2000/10/23 12:10:13 alanh Exp $ */
8c06b6b69Smrg
9c06b6b69Smrg#ifdef __NetBSD__
10c06b6b69Smrg#  include <sys/types.h>
11c06b6b69Smrg#  include <machine/pio.h>
12c06b6b69Smrg#  include <machine/sysarch.h>
13c06b6b69Smrg#else
14c06b6b69Smrg#  if defined(SVR4) && defined(i386)
15c06b6b69Smrg#    include <sys/types.h>
16c06b6b69Smrg#    ifdef NCR
17c06b6b69Smrg       /* broken NCR <sys/sysi86.h> */
18c06b6b69Smrg#      define __STDC
19c06b6b69Smrg#      include <sys/sysi86.h>
20c06b6b69Smrg#      undef __STDC
21c06b6b69Smrg#    else
22c06b6b69Smrg#      include <sys/sysi86.h>
23c06b6b69Smrg#    endif
24c06b6b69Smrg#    ifdef SVR4
25c06b6b69Smrg#      if !defined(sun)
26c06b6b69Smrg#        include <sys/seg.h>
27c06b6b69Smrg#      endif
28c06b6b69Smrg#    endif
29c06b6b69Smrg#    include <sys/v86.h>
30c06b6b69Smrg#    if defined(sun)
31c06b6b69Smrg#      include <sys/psw.h>
32c06b6b69Smrg#    endif
33c06b6b69Smrg#  endif
34c06b6b69Smrg#  include "AsmMacros.h"
35c06b6b69Smrg#endif /* NetBSD */
36c06b6b69Smrg
37c06b6b69Smrg#include <unistd.h>
38c06b6b69Smrg#include <stdio.h>
39c06b6b69Smrg#include <stdlib.h>
40c06b6b69Smrg
41c06b6b69Smrg#ifdef __NetBSD__
42c06b6b69Smrg#  define SET_IOPL() i386_iopl(3)
43c06b6b69Smrg#  define RESET_IOPL() i386_iopl(0)
44c06b6b69Smrg#else
45c06b6b69Smrg#  if defined(SVR4) && defined(i386)
46c06b6b69Smrg#    ifndef SI86IOPL
47c06b6b69Smrg#      define SET_IOPL() sysi86(SI86V86,V86SC_IOPL,PS_IOPL)
48c06b6b69Smrg#      define RESET_IOPL() sysi86(SI86V86,V86SC_IOPL,0)
49c06b6b69Smrg#    else
50c06b6b69Smrg#      define SET_IOPL() sysi86(SI86IOPL,3)
51c06b6b69Smrg#      define RESET_IOPL() sysi86(SI86IOPL,0)
52c06b6b69Smrg#    endif
53c06b6b69Smrg#  else
54c06b6b69Smrg#    ifdef linux
55c06b6b69Smrg#      define SET_IOPL() iopl(3)
56c06b6b69Smrg#      define RESET_IOPL() iopl(0)
57c06b6b69Smrg#    else
58c06b6b69Smrg#      define SET_IOPL() (void)0
59c06b6b69Smrg#      define RESET_IOPL() (void)0
60c06b6b69Smrg#    endif
61c06b6b69Smrg#  endif
62c06b6b69Smrg#endif
63c06b6b69Smrg
64c06b6b69Smrgint hex2int(char* str);
65c06b6b69Smrg
66c06b6b69Smrgint main(int argc, char** argv)
67c06b6b69Smrg{
68c06b6b69Smrg    int i, value, index = 0;
69c06b6b69Smrg    char c, cport;
70c06b6b69Smrg    char* str;
71c06b6b69Smrg    unsigned int port, port1 = 0;
72c06b6b69Smrg    int query = 0;
73c06b6b69Smrg
74c06b6b69Smrg    if(argc < 2) {
75c06b6b69Smrg	printf("usage: %s [Cvvxx [Cvvxx]] [Dxx]\n",argv[0]);
76c06b6b69Smrg        printf("     where C = A|a write vv to ARxx\n");
77c06b6b69Smrg        printf("             = C|c write vv to CRxx\n");
78c06b6b69Smrg        printf("             = F|f write vv to FRxx (6555x only)\n");
79c06b6b69Smrg        printf("             = G|g write vv to GRxx\n");
80c06b6b69Smrg        printf("             = M|m write vv to MRxx (6555x only)\n");
81c06b6b69Smrg        printf("             = S|s write vv to SRxx\n");
82c06b6b69Smrg        printf("             = X|x write vv to XRxx\n");
83c06b6b69Smrg        printf("     where D = Y|y write xx to FCR\n");
84c06b6b69Smrg        printf("             = Z|z write vv to MSR\n");
85c06b6b69Smrg        printf("     xx is in hexadecimal\n");
86c06b6b69Smrg	printf("     vv is in hexadecimal or '?' for query\n");
87c06b6b69Smrg    }
88c06b6b69Smrg
89c06b6b69Smrg    SET_IOPL();
90c06b6b69Smrg
91c06b6b69Smrg    for(i = 1; i < argc; i++){
92c06b6b69Smrg	value = 0;
93c06b6b69Smrg	str = argv[i];
94c06b6b69Smrg	c = *str++;
95c06b6b69Smrg	switch (c) {
96c06b6b69Smrg	  case 'f':
97c06b6b69Smrg	  case 'F':
98c06b6b69Smrg	    cport = 'F';
99c06b6b69Smrg	    port = 0x3D0;
100c06b6b69Smrg	    break;
101c06b6b69Smrg	  case 'c':
102c06b6b69Smrg	  case 'C':
103c06b6b69Smrg	    cport = 'C';
104c06b6b69Smrg	    port = 0x3D4;
105c06b6b69Smrg	    break;
106c06b6b69Smrg	  case 'x':
107c06b6b69Smrg	  case 'X':
108c06b6b69Smrg	    cport = 'X';
109c06b6b69Smrg	    port = 0x3D6;
110c06b6b69Smrg	    break;
111c06b6b69Smrg	  case 'g':
112c06b6b69Smrg	  case 'G':
113c06b6b69Smrg	    cport = 'G';
114c06b6b69Smrg	    port = 0x3CE;
115c06b6b69Smrg	    break;
116c06b6b69Smrg	  case 'a':
117c06b6b69Smrg	  case 'A':
118c06b6b69Smrg	    cport = 'A';
119c06b6b69Smrg	    port = 0x3C0;
120c06b6b69Smrg	    break;
121c06b6b69Smrg	  case 's':
122c06b6b69Smrg	  case 'S':
123c06b6b69Smrg	    cport = 'S';
124c06b6b69Smrg	    port = 0x3C4;
125c06b6b69Smrg	    break;
126c06b6b69Smrg	  case 'm':
127c06b6b69Smrg	  case 'M':
128c06b6b69Smrg	    cport = 'M';
129c06b6b69Smrg	    port = 0x3D2;
130c06b6b69Smrg	    break;
131c06b6b69Smrg	  case 'y':
132c06b6b69Smrg	  case 'Y':
133c06b6b69Smrg	    cport = 'Y';
134c06b6b69Smrg	    port = 0x3DA;
135c06b6b69Smrg            port1 = 0x3CA;
136c06b6b69Smrg	    break;
137c06b6b69Smrg	  case 'z':
138c06b6b69Smrg	  case 'Z':
139c06b6b69Smrg	    cport = 'Z';
140c06b6b69Smrg	    port = 0x3C2;
141c06b6b69Smrg	    port1 = 0x3CC;
142c06b6b69Smrg	    break;
143c06b6b69Smrg	  default:
144c06b6b69Smrg	    continue;
145c06b6b69Smrg	    break;
146c06b6b69Smrg	}
147c06b6b69Smrg	if ((cport != 'Z') && (cport != 'Y')) index = inb(port);
148c06b6b69Smrg	while ((c = *str++)) {
149c06b6b69Smrg	    if (c == '?') {
150c06b6b69Smrg	      query = 1;
151c06b6b69Smrg	    }
152c06b6b69Smrg	    if(c >= '0' && c <= '9')
153c06b6b69Smrg	    value = (value << 4) | (c - '0');  /*ASCII assumed*/
154c06b6b69Smrg	    else if(c >= 'A' && c < 'G')
155c06b6b69Smrg	    value = (value << 4) | (c - 'A'+10);  /*ASCII assumed*/
156c06b6b69Smrg	    else if(c >= 'a' && c < 'g')
157c06b6b69Smrg	    value = (value << 4) | (c - 'a'+10);  /*ASCII assumed*/
158c06b6b69Smrg	}
159c06b6b69Smrg	if ((cport != 'Z') && (cport != 'Y')) outb(port,value&0xFF);
160c06b6b69Smrg	if (query) {
161c06b6b69Smrg	    if ((cport != 'Z') && (cport != 'Y'))
162c06b6b69Smrg		printf("%cR%X: 0x%X\n", cport, value & 0xFF,
163c06b6b69Smrg		   inb(port+1)&0xFF);
164c06b6b69Smrg	    else
165c06b6b69Smrg	        if (cport == 'Z')
166c06b6b69Smrg		    printf("MSR: 0x%X\n", inb(port1)&0xFF);
167c06b6b69Smrg		else
168c06b6b69Smrg		    printf("FCR: 0x%X\n", inb(port1)&0xFF);
169c06b6b69Smrg	} else {
170c06b6b69Smrg	    if ((cport != 'Z') && (cport != 'Y')) {
171c06b6b69Smrg		printf("%cR%X: 0x%X -> 0x%X\n", cport, value & 0xFF,
172c06b6b69Smrg		   inb(port+1)&0xFF, (value&0xFF00)>>8);
173c06b6b69Smrg		outw(port, value);
174c06b6b69Smrg		outb(port, index &0xFF);
175c06b6b69Smrg	    } else {
176c06b6b69Smrg	        if (cport == 'Z')
177c06b6b69Smrg		    printf("MSR: 0x%X -> 0x%X\n", inb(port1)&0xFF, value&0xFF);
178c06b6b69Smrg		else
179c06b6b69Smrg		    printf("FCR: 0x%X -> 0x%X\n", inb(port1)&0xFF, value&0xFF);
180c06b6b69Smrg		outb(port, value & 0xFF);
181c06b6b69Smrg	    }
182c06b6b69Smrg	}
183c06b6b69Smrg    }
184c06b6b69Smrg    RESET_IOPL();
185c06b6b69Smrg    return 0;
186c06b6b69Smrg}
187