7 #include "v3_guest_mem.h"
10 #define GUEST_FILE "/proc/v3vee/v3-guests"
11 //#define GUEST_FILE "/441/pdinda/test.proc"
14 struct v3_guest_mem_map * v3_guest_mem_get_map(char *vmdev)
24 if (!(f=fopen(GUEST_FILE,"r"))) {
25 fprintf(stderr,"Cannot open %s - is Palacios active?\n",GUEST_FILE);
29 // This is using the current "single memory region" model
30 // and will change when /proc convention changes to conform to
31 // multiple region model
32 while (fgets(buf,MAXLINE,f)) {
34 "%s %s %s [0x%llx-0x%llx]",
40 fprintf(stderr, "Cannot parse following line\n%s\n",buf);
44 if (!strcmp(dev,vmdev)) {
45 struct v3_guest_mem_map *m =
46 (struct v3_guest_mem_map *) malloc(sizeof(struct v3_guest_mem_map)+1*sizeof(struct v3_guest_mem_block));
48 fprintf(stderr, "Cannot allocate space\n");
53 memset(m,0,sizeof(struct v3_guest_mem_map)+1*sizeof(struct v3_guest_mem_block));
57 m->block[0].hpa=(void*)start;
58 m->block[0].numpages = (end-start+1) / 4096;
64 fprintf(stderr,"%s not found\n",vmdev);
70 int v3_map_guest_mem(struct v3_guest_mem_map *map)
75 fprintf(stderr, "Memory appears to already be mapped\n");
79 map->fd = open("/dev/mem", O_RDWR | O_SYNC);
82 fprintf(stderr, "Cannot open /dev/mem - are you root?\n");
87 for (i=0; i<map->numblocks; i++) {
88 fprintf(stderr,"Mapping %llu bytes of /dev/mem offset 0x%llx\n",
89 map->block[i].numpages*4096, (off_t)(map->block[i].hpa));
90 map->block[i].uva = mmap(NULL,
91 map->block[i].numpages*4096,
92 PROT_READ | PROT_WRITE,
95 (off_t) (map->block[i].hpa));
97 if (map->block[i].uva == MAP_FAILED) {
98 fprintf(stderr, "Failed to map block %llu\n",i);
100 v3_unmap_guest_mem(map);
109 int v3_unmap_guest_mem(struct v3_guest_mem_map *map)
113 for (i=0; i<map->numblocks; i++) {
114 if (map->block[i].uva) {
115 munmap(map->block[i].uva, map->block[i].numpages*4096);