xref: /linux-tools/drivers/mremap/module/remap.c (revision 74ce4ce33d5b8318cee71b38976a25818e666ff3)
1*74ce4ce3SDavid Wang #include <stdio.h>
2*74ce4ce3SDavid Wang #include <stdlib.h>
3*74ce4ce3SDavid Wang #include <sys/types.h>
4*74ce4ce3SDavid Wang #include <sys/stat.h>
5*74ce4ce3SDavid Wang #include <fcntl.h>
6*74ce4ce3SDavid Wang #include <unistd.h>
7*74ce4ce3SDavid Wang #include <sys/ioctl.h>
8*74ce4ce3SDavid Wang 
9*74ce4ce3SDavid Wang 
10*74ce4ce3SDavid Wang enum {
11*74ce4ce3SDavid Wang     PTRACEXX_REMAP = 1,
12*74ce4ce3SDavid Wang };
13*74ce4ce3SDavid Wang 
14*74ce4ce3SDavid Wang typedef struct {
15*74ce4ce3SDavid Wang     int pid;
16*74ce4ce3SDavid Wang     unsigned long old_start, old_end;
17*74ce4ce3SDavid Wang     unsigned long new_start, new_end;
18*74ce4ce3SDavid Wang } RemapDataT;
19*74ce4ce3SDavid Wang 
20*74ce4ce3SDavid Wang typedef union {
21*74ce4ce3SDavid Wang     RemapDataT remap;
22*74ce4ce3SDavid Wang } IoctlDataT;
23*74ce4ce3SDavid Wang 
main()24*74ce4ce3SDavid Wang int main() {
25*74ce4ce3SDavid Wang     char fb[64];
26*74ce4ce3SDavid Wang     IoctlDataT d;
27*74ce4ce3SDavid Wang     int fd, w=0;
28*74ce4ce3SDavid Wang     long rc;
29*74ce4ce3SDavid Wang     int pid=2024;
30*74ce4ce3SDavid Wang     // 7fffbebcf000-7fffbebd1000
31*74ce4ce3SDavid Wang     unsigned long start=0x7fffbebcf000L;
32*74ce4ce3SDavid Wang     unsigned long end=0x7fffbebd1000L;
33*74ce4ce3SDavid Wang     unsigned long nstart=0x7ffff0000000L;
34*74ce4ce3SDavid Wang     unsigned int magic = 0x12345678;
35*74ce4ce3SDavid Wang     unsigned int v, vv;
36*74ce4ce3SDavid Wang     size_t n;
37*74ce4ce3SDavid Wang     fd = open("/dev/ptracexx", O_NONBLOCK);
38*74ce4ce3SDavid Wang     if (fd<0) { perror("fail to open ptracexx\n"); return -1; }
39*74ce4ce3SDavid Wang     sprintf(fb, "/proc/%d/mem", pid);
40*74ce4ce3SDavid Wang     FILE *mem = fopen(fb, "rb");
41*74ce4ce3SDavid Wang     if (mem==NULL) {
42*74ce4ce3SDavid Wang         printf("fail to open virtual mem space for pid %d\n", pid);
43*74ce4ce3SDavid Wang         close(fd);
44*74ce4ce3SDavid Wang         return -1;
45*74ce4ce3SDavid Wang     }
46*74ce4ce3SDavid Wang     d.remap.pid = pid;;
47*74ce4ce3SDavid Wang     d.remap.old_start = start;
48*74ce4ce3SDavid Wang     d.remap.old_end = end;
49*74ce4ce3SDavid Wang     d.remap.new_start = nstart;
50*74ce4ce3SDavid Wang     d.remap.new_end = end-start+nstart;
51*74ce4ce3SDavid Wang     fseek(mem, start, SEEK_SET);
52*74ce4ce3SDavid Wang     if (w) {
53*74ce4ce3SDavid Wang         n = fwrite(&magic, 1, sizeof(magic), mem);
54*74ce4ce3SDavid Wang         printf("write magic ==> %ld\n", n);
55*74ce4ce3SDavid Wang     }
56*74ce4ce3SDavid Wang     fread(&v, 1, sizeof(v), mem);
57*74ce4ce3SDavid Wang     fclose(mem); mem=NULL;
58*74ce4ce3SDavid Wang     // remap
59*74ce4ce3SDavid Wang     rc = ioctl(fd, PTRACEXX_REMAP, &d);
60*74ce4ce3SDavid Wang     if (rc<0) {
61*74ce4ce3SDavid Wang         printf("fail to remap %ld\n", rc);
62*74ce4ce3SDavid Wang     } else {
63*74ce4ce3SDavid Wang         mem = fopen(fb, "rb");
64*74ce4ce3SDavid Wang         fseek(mem, nstart, SEEK_SET);
65*74ce4ce3SDavid Wang         if (w) {
66*74ce4ce3SDavid Wang             n = fread(&vv, 1, sizeof(vv), mem);
67*74ce4ce3SDavid Wang             printf("read back(%ld) %d, expect %d\n", n, vv, magic);
68*74ce4ce3SDavid Wang         }
69*74ce4ce3SDavid Wang         n = fread(&vv, 1, sizeof(vv), mem);
70*74ce4ce3SDavid Wang         printf("read after remap(%ld) %d, old value %d\n",n, vv, v);
71*74ce4ce3SDavid Wang     }
72*74ce4ce3SDavid Wang     if (mem) fclose(mem);
73*74ce4ce3SDavid Wang     close(fd);
74*74ce4ce3SDavid Wang     return 0;
75*74ce4ce3SDavid Wang }
76