7 #include "v3_guest_mem.h"
10 # Warning FIX THE PARSER TO CONFORM TO NEW /proc/v3 VM output format
13 #define GUEST_FILE "/proc/v3vee/v3-guests"
14 //#define GUEST_FILE "/441/pdinda/test.proc"
17 struct v3_guest_mem_map * v3_guest_mem_get_map(char *vmdev)
27 if (!(f=fopen(GUEST_FILE,"r"))) {
28 fprintf(stderr,"Cannot open %s - is Palacios active?\n",GUEST_FILE);
32 // This is using the current "single memory region" model
33 // and will change when /proc convention changes to conform to
34 // multiple region model
35 while (fgets(buf,MAXLINE,f)) {
37 "%s %s %s [0x%llx-0x%llx]",
43 fprintf(stderr, "Cannot parse following line\n%s\n",buf);
47 if (!strcmp(dev,vmdev)) {
48 struct v3_guest_mem_map *m =
49 (struct v3_guest_mem_map *) malloc(sizeof(struct v3_guest_mem_map)+1*sizeof(struct v3_guest_mem_block));
51 fprintf(stderr, "Cannot allocate space\n");
56 memset(m,0,sizeof(struct v3_guest_mem_map)+1*sizeof(struct v3_guest_mem_block));
60 m->block[0].hpa=(void*)start;
61 m->block[0].numpages = (end-start+1) / 4096;
67 fprintf(stderr,"%s not found\n",vmdev);
73 int v3_map_guest_mem(struct v3_guest_mem_map *map)
78 fprintf(stderr, "Memory appears to already be mapped\n");
82 map->fd = open("/dev/mem", O_RDWR | O_SYNC);
85 fprintf(stderr, "Cannot open /dev/mem - are you root?\n");
90 for (i=0; i<map->numblocks; i++) {
91 fprintf(stderr,"Mapping %llu bytes of /dev/mem offset 0x%llx\n",
92 map->block[i].numpages*4096, (off_t)(map->block[i].hpa));
93 map->block[i].uva = mmap(NULL,
94 map->block[i].numpages*4096,
95 PROT_READ | PROT_WRITE,
98 (off_t) (map->block[i].hpa));
100 if (map->block[i].uva == MAP_FAILED) {
101 fprintf(stderr, "Failed to map block %llu\n",i);
103 v3_unmap_guest_mem(map);
112 int v3_unmap_guest_mem(struct v3_guest_mem_map *map)
116 for (i=0; i<map->numblocks; i++) {
117 if (map->block[i].uva) {
118 munmap(map->block[i].uva, map->block[i].numpages*4096);