4 #include "v3_guest_mem.h"
8 fprintf(stderr,"usage: v3_guest_mem_example /dev/v3-vmN read|write gpa_hex numbytes [<data]\n");
11 int main(int argc, char *argv[])
14 enum {READ, WRITE} mode;
17 struct v3_guest_mem_map *map;
27 if (toupper(argv[2][0])=='R') {
29 } else if (toupper(argv[2][0]=='W')) {
32 fprintf(stderr,"Unknown mode %s\n", argv[2]);
36 if (sscanf(argv[3],"%llx",&gpa)!=1) {
37 fprintf(stderr,"Don't understand address %s\n",argv[3]);
41 numbytes=atol(argv[4]);
43 if (!(map=v3_guest_mem_get_map(vmdev))) {
44 fprintf(stderr,"Cannot get guest memory map for %s\n",vmdev);
48 for (i=0; i< map->numblocks; i++) {
49 fprintf(stderr,"Region %llu: gpa=%p, hpa=%p, numpages=%llu\n",
50 i, map->block[i].gpa, map->block[i].hpa, map->block[i].numpages);
53 if (map->numblocks!=1) {
54 fprintf(stderr,"Don't handle multiregion map yet\n");
58 if (!( ((void*)(gpa) >= map->block[0].gpa) &&
59 (numbytes <= map->block[0].numpages*4096))) {
60 fprintf(stderr,"request (%p to %p) is out of range\n",
65 if (v3_map_guest_mem(map)) {
66 fprintf(stderr, "Cannot map guest memory\n");
71 for (i=0; i<numbytes; i++) {
74 if (read(0,&cur,1)!=1) {
75 fprintf(stderr,"can't get data from stdin for byte %llu\n", i);
78 *((uint8_t*)(map->block[0].uva+gpa+i))=cur;
80 cur = *((uint8_t *)(map->block[0].uva+gpa+i));
81 // fprintf(stderr, "read %llu from uva=%p, ptr=%p\n",i,map->block[0].uva, map->block[0].uva+gpa+i);
82 if (write(1,&cur,1)!=1) {
83 fprintf(stderr,"can't write data to stdout for byte %llu\n", i);
90 if (v3_unmap_guest_mem(map)) {
91 fprintf(stderr, "Cannot unmap guest memory\n");