xref: /dragonfly/test/debug/kwrite.c (revision d4ef6694)
1 /*
2  * Tool to read/write kernel memory.
3  *
4  * Compile with
5 	cc -o kwrite kwrite.c -lkvm
6  *
7  * $DragonFly: src/test/debug/kwrite.c,v 1.1 2006/01/09 15:05:45 corecode Exp $
8  */
9 
10 #include <fcntl.h>
11 #include <kvm.h>
12 #include <limits.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <errno.h>
16 #include <err.h>
17 
18 static void
19 usage(void)
20 {
21 	fprintf(stderr, "usage: kwrite addr[/width] [bval] [bval]\n");
22 	exit(1);
23 }
24 
25 int
26 main(int argc, char **argv)
27 {
28 	char errbuf[_POSIX2_LINE_MAX];
29 	kvm_t *kvm;
30 	unsigned long addr, width = 1, i;
31 	char *endptr, *endptr2;
32 
33 	if (argc < 2)
34 		usage();
35 
36 	errno = 0;
37 	addr = strtoul(argv[1], &endptr, 0);
38 	if (endptr == argv[1])
39 		errx(1, "no addr");
40 	if (errno != 0)
41 		err(1, "addr '%s'", argv[1]);
42 	switch (*endptr) {
43 	case 0:
44 		break;
45 	case '/':
46 		endptr++;
47 		width = strtoul(endptr, &endptr2, 0);
48 		if (endptr2 == endptr)
49 			errx(1, "no width");
50 		if (errno != 0)
51 			err(1, "width '%s'", endptr);
52 		break;
53 	default:
54 		errx(1, "invalid addr '%s'", argv[1]);
55 	}
56 
57 	kvm = kvm_openfiles(NULL, NULL, NULL, O_RDWR, errbuf);
58 	if (kvm == NULL)
59 		errx(1, "%s", errbuf);
60 
61 	if (argc < 3) {
62 		for (i = 0; i < width; i++) {
63 			char b;
64 
65 			if (kvm_read(kvm, addr + i, &b, 1) != 1)
66 				errx(1, "%s", kvm_geterr(kvm));
67 			printf("%#0*lx %02x\n", sizeof(addr) * 2, addr + i, b);
68 		}
69 	} else {
70 		if (argc < width + 2)
71 			errx(1, "too few values for width %ld", width);
72 		width = argc - 2;
73 		for (i = 0; i < width; i++) {
74 			long v;
75 			char b, bo;
76 
77 			errno = 0;
78 			v = strtol(argv[2 + i], &endptr, 0);
79 			if (endptr == argv[2 + i] || *endptr != 0)
80 				errx(1, "invalid value '%s'", argv[2 + i]);
81 			if (errno != 0 || v < 0 || v > 256) {
82 				if (errno == 0) errno = ERANGE;
83 				errx(1, "value '%s'", argv[2 + i]);
84 			}
85 			b = v;
86 
87 			if (kvm_read(kvm, addr + i, &bo, 1) != 1)
88 				errx(1, "%s", kvm_geterr(kvm));
89 			printf("%#0*lx %02x -> %02x\n", sizeof(addr) * 2, addr + i, bo, b);
90 			if (kvm_write(kvm, addr + i, &b, 1) != 1)
91 				errx(1, "%s", kvm_geterr(kvm));
92 		}
93 	}
94 
95 	return 0;
96 }
97