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