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