//---------------------------------------------------------------------- // MAIN Program //---------------------------------------------------------------------- int main(int argc, char **argv) { // FxU32 vendorID = 0x1002; // ATI // FxU32 deviceID = 0x4758; // Mach64 int configSpace = 0, loop = 0; FxU32 vendorID = _3DFX_PCI_ID; // 3Dfx FxU32 deviceID = 0xFFFF; // any card FxI32 sizeOfCard = 0x1000000; // 16 Mbytes FxU32 deviceNumber; FxU32 instance = 0; FxU32 *sst, addr,data; CmdCode cmd = CMD_SCAN; //------------------------------------------------------------------ // parse the command line while (--argc > 0 && **++argv == '-') { char *token, *ctmp; for (token = argv[0] + 1; *token; token++) switch (*token) { case '?': usage(); break; case 'b': // set the baseAddress of the card to this value sscanf(GETARG,"%i",&addr); cmd = CMD_BASE; break; case 'c': configSpace = 1; break; case 'd': // override default deviceID sscanf(GETARG,"%i",&deviceID); break; case 'i': // override default instance sscanf(GETARG,"%i",&instance); break; case 'l': loop = 1; break; case 'r': cmd = CMD_READ; sscanf(GETARG,"%i",&addr); break; case 's': cmd = CMD_STATUS; break; case 'v': // override default deviceID sscanf(GETARG,"%i",&vendorID); break; case 'w': cmd = CMD_WRITE; sscanf(GETARG,"%i",&addr); sscanf(GETARG,"%i",&data); break; default: fprintf(stderr,"illegal option %c\n", *token); break; } } if (argc > 2) usage(); if (argc > 0) { sscanf(argv[0],"%i",&addr); if (argc > 1) { cmd = CMD_WRITE; sscanf(argv[1],"%i",&data); } else cmd = CMD_READ; } // if scanning or status, then do it and exit. if (cmd == CMD_SCAN) { cmdScan(); return 0; } if (cmd == CMD_STATUS) { // display PCI status if (pciFindCard(vendorID, deviceID, &deviceNumber)) cmdStatus(deviceNumber, vendorID == _3DFX_PCI_ID); else { fprintf(stderr, "error: could not find card 0x%04x,0x%04x.\n", vendorID, deviceID); exit(2); } return 0; } if (cmd == CMD_BASE) sizeOfCard = -1; // hack //------------------------------------------------------------------ // find and map the card into virtual memory //sst = pciMapCard(vendorID,deviceID,sizeOfCard, &deviceNumber); sst = pciMapCardMulti(vendorID,deviceID,sizeOfCard, &deviceNumber, instance, 0); if (sst == NULL) { fprintf(stderr, "error: could not find card 0x%04x,0x%04x.\n", vendorID, deviceID); exit(2); } //------------------------------------------------------------------ // execute the requested action switch(cmd) { case CMD_BASE: // change the base address of the card pciSetConfigData( PCI_BASE_ADDRESS_0, deviceNumber, &addr ); break; case CMD_READ: // read a DWORD if (addr & 0x3) { fprintf(stderr,"unaligned accesses NYI, addr=0x%x\n",addr); exit(4); } addr >>= 2; // make it a dword index data = sst[addr]; fprintf(stdout,"read 0x%08x(%d) from 0x%x\n",data,data,addr<<2); while (loop) data = sst[addr]; break; case CMD_WRITE: // write a DWORD if (addr & 0x3) { fprintf(stderr,"unaligned accesses NYI, addr=0x%x\n",addr); exit(4); } if (configSpace) { int i; for (i=0; i<sizeof(pciRegArray)/sizeof(*pciRegArray); i++) { if (pciRegArray[i]->regAddress == addr) { if (pciRegArray[i]->rwFlag == READ_ONLY) { fprintf(stderr,"cannot write READ_ONLY address\n"); exit(5); } pciSetConfigData( *pciRegArray[i], deviceNumber, &data ); goto found; } } fprintf(stderr,"config address register 0x%x descriptor not found\n",addr); exit(6); found: ; } else { addr >>= 2; // make it a dword index do {sst[addr] = data;} while (loop); } break; default: usage(); } //---------------------------------------------------------------------- // cleanup: unmap the card, close down the PCI bus and return pciUnmapPhysical( (unsigned long)sst, sizeOfCard ); if ( !pciClose() ) { fprintf(stderr, pciGetErrorString()); exit(3); } return 0; }
void userCmdLoop() { TSSAnalyzer analyzer; analyzer.Init(); bool fAutoMode = true, lastAutoMode = false; const size_t USERCMD_MAX = 128; char cmd[USERCMD_MAX + 1] = { 0 }; char lastCmd[USERCMD_MAX + 1] = { 0 }; do { if (lastAutoMode != fAutoMode) { myPrintf(fAutoMode ? "Auto mode ON\n" : "Auto mode OFF\n"); lastAutoMode = fAutoMode; } myPrintf(">"); memset(cmd, 0, sizeof(cmd)); fgets(cmd, USERCMD_MAX, stdin); char *newline = strchr(cmd, '\n'); if (newline) *newline = 0; myPrintfToLog("%s\n", cmd); if (cmd[0] == 0) memcpy(cmd, lastCmd, USERCMD_MAX); wchar_t wcmd[USERCMD_MAX + 1] = {0}; mbstowcs(wcmd, cmd, USERCMD_MAX); int argc = 0; wchar_t **argv = NULL; argv = CommandLineToArgvW(wcmd, &argc); if (argv == NULL) { continue; } if (_wcsicmp(argv[0], L"exit") == 0) { break; } else if (_wcsicmp(argv[0], L"clear") == 0 || _wcsicmp(argv[0], L"cls") == 0) { system("cls"); } else if (_wcsicmp(argv[0], L"logfile") == 0) { cmdLogFile(argc - 1, argv + 1); } else if (_wcsicmp(argv[0], L"status") == 0) { cmdStatus(); } else if (_wcsicmp(argv[0], L"auto") == 0) { if (argc > 1 && _wcsicmp(argv[1], L"off") == 0) fAutoMode = false; else fAutoMode = true; } else if (_wcsicmp(argv[0], L"snapshot") == 0 || _wcsicmp(argv[0], L"ss") == 0) { cmdSnapshot(analyzer); fAutoMode = false; } else if (_wcsicmp(argv[0], L"check") == 0) { cmdCheck(argc - 1, argv + 1); } else if (_wcsicmp(argv[0], L"use") == 0) { cmdUse(analyzer, argc, argv); } else { if (fAutoMode) analyzer.UpdateSnapshot(); bool fKnown = analyzer.Command(argc, argv); if (!fKnown) myPrintf("Unknown command\n"); } myPrintf("\n"); LocalFree(argv); memcpy(lastCmd, cmd, USERCMD_MAX); } while (true); analyzer.Term(); }