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