Example #1
0
//----------------------------------------------------------------------
// 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;
}
Example #2
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();
}