コード例 #1
0
ファイル: nvapoke.c プロジェクト: TomWij/envytools
int main(int argc, char **argv) {
	if (nva_init()) {
		fprintf (stderr, "PCI init failure!\n");
		return 1;
	}
	int c;
	struct nva_regspace rs = { 0 };
	while ((c = getopt (argc, argv, "c:i:b:t:")) != -1)
		switch (c) {
			case 'c':
				sscanf(optarg, "%d", &rs.cnum);
				break;
			case 'i':
				sscanf(optarg, "%d", &rs.idx);
				break;
			case 'b':
				sscanf(optarg, "%d", &rs.regsz);
				if (rs.regsz != 1 && rs.regsz != 2 && rs.regsz != 4 && rs.regsz != 8) {
					fprintf (stderr, "Invalid size.\n");
					return 1;
				}
				break;
			case 't':
				rs.type = nva_rstype(optarg);
				if (rs.type == -1) {
					fprintf (stderr, "Unknown register space.\n");
					return 1;
				}
				break;
		}
	if (rs.cnum >= nva_cardsnum) {
		if (nva_cardsnum)
			fprintf (stderr, "No such card.\n");
		else
			fprintf (stderr, "No cards found.\n");
		return 1;
	}
	rs.card = &nva_cards[rs.cnum];
	if (rs.regsz == 0)
		rs.regsz = nva_rsdefsz(&rs);
	uint32_t a, b = rs.regsz;
	uint64_t val, step = 0;
	if (optind >= argc) {
		fprintf (stderr, "No address specified.\n");
		return 1;
	}
	sscanf (argv[optind], "%x", &a);
	if (optind + 1 >= argc) {
		fprintf (stderr, "No value specified.\n");
		return 1;
	}
	if (optind + 2 >= argc) {
		sscanf (argv[optind + 1], "%"SCNx64, &val);
	} else {
		sscanf (argv[optind + 1], "%x", &b);
		sscanf (argv[optind + 2], "%"SCNx64, &val);
	}
	if (optind + 3 < argc)
		sscanf (argv[optind + 3], "%"SCNx64, &step);
	while (b > 0) {
		int e = nva_wr(&rs, a, val);
		if (e)
			printf("%08x: ERR %c\n", a, nva_rserrc(e));
		a += rs.regsz;
		b -= rs.regsz;
		val += step;
	}
	return 0;
}
コード例 #2
0
ファイル: nvascan.c プロジェクト: plaes/envytools
int main(int argc, char **argv) {
	if (nva_init()) {
		fprintf (stderr, "PCI init failure!\n");
		return 1;
	}
	int alias = 0;
	int slow = 0;
	int c;
	struct nva_regspace rs = { 0 };
	while ((c = getopt (argc, argv, "asc:i:b:t:")) != -1)
		switch (c) {
			case 'a':
				alias = 1;
				break;
			case 's':
				slow = 1;
				break;
			case 'c':
				sscanf(optarg, "%d", &rs.cnum);
				break;
			case 'i':
				sscanf(optarg, "%d", &rs.idx);
				break;
			case 'b':
				sscanf(optarg, "%d", &rs.regsz);
				if (rs.regsz != 1 && rs.regsz != 2 && rs.regsz != 4 && rs.regsz != 8) {
					fprintf (stderr, "Invalid size.\n");
					return 1;
				}
				break;
			case 't':
				rs.type = nva_rstype(optarg);
				if (rs.type == NVA_REGSPACE_UNKNOWN) {
					fprintf (stderr, "Unknown register space.\n");
					return 1;
				}
				break;
		}
	if (rs.cnum >= nva_cardsnum) {
		if (nva_cardsnum)
			fprintf (stderr, "No such card.\n");
		else
			fprintf (stderr, "No cards found.\n");
		return 1;
	}
	rs.card = &nva_cards[rs.cnum];
	if (rs.regsz == 0)
		rs.regsz = nva_rsdefsz(&rs);
	int32_t a, b = rs.regsz, i;
	if (optind >= argc) {
		fprintf (stderr, "No address specified.\n");
		return 1;
	}
	sscanf (argv[optind], "%x", &a);
	if (optind + 1 < argc)
		sscanf (argv[optind + 1], "%x", &b);
	int ls = 1;
	for (i = 0; i < b; i+=rs.regsz) {
		uint64_t x, y, z;
		int ex = nva_rd(&rs, a+i, &x);
		int ew = 0, ey = 0, ev = 0, ez = 0, eb = 0;
		if (!ex) {
			ew = nva_wr(&rs, a+i, -1ll);
			ey = nva_rd(&rs, a+i, &y);
			ev = nva_wr(&rs, a+i, 0);
			ez = nva_rd(&rs, a+i, &z);
			eb = nva_wr(&rs, a+i, x);
		}
		if (ex || ey || ez || ey || ev || eb || x || y || z) {
			if (ex) {
				printf ("%06x: %c\n", a+i, nva_rserrc(ex));
			} else {
				int cool = (x != y) || (y != z);
				int isalias = 0, areg;
				if (cool && alias) {
					int j;
					nva_wr(&rs, a+i, -1ll);
					for (j = 0; j < i; j+=4) {
						uint64_t sv;
						uint64_t ch;
						int es = nva_rd(&rs, a+j, &sv);
						if (!es) {
							es |= nva_wr(&rs, a+j, 0);
							es |= nva_rd(&rs, a+i, &ch);
							es |= nva_wr(&rs, a+j, sv);
							if (ch == z && !es) {
								areg = a + j;
								isalias = 1;
								break;
							}
						}
					}
					nva_wr(&rs, a+i, x);
				}
				printf ("%06x:", a+i);
				nva_rsprint(&rs, ex, x);
				nva_rsprint(&rs, ey, y);
				nva_rsprint(&rs, ez, z);
				if (ew || ev || eb)
					printf(" WERR");
				if (cool)
					printf(" *");
				if (isalias) {
					printf(" ALIASES %06x", areg);
				}
				printf("\n");
			}
			ls = 1;
		} else {
			if (ls)
				printf("...\n");
			ls = 0;
		}
		if (slow) {
			int j;
			for (j = 0; j < 100; j++)
				nva_rd32(rs.cnum, 0);
			usleep(10000);
			for (j = 0; j < 100; j++)
				nva_rd32(rs.cnum, 0);
		}
	}
	return 0;
}