Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Linux user updates for more recent distros (Ubuntu 14.04 as target)
[palacios.git] / linux_usr / v3_guest_mem_track.c
1 #include <stdint.h>
2 #include <stdio.h>
3
4 #include "v3_guest_mem.h"
5
6 void usage() 
7 {
8     fprintf(stderr,"usage: v3_guest_mem_track /dev/v3-vmN command\n");
9     fprintf(stderr,"    where command is one of the following\n");
10     fprintf(stderr,"           start oneshot|periodic period access\n");
11     fprintf(stderr,"               access=combination of rwx (only rwx currently)\n");
12     fprintf(stderr,"           stop\n");
13     fprintf(stderr,"           snapshot bin|text file|_\n\n");
14 }
15
16 int start(char *vm, char *reset_str, char *period_str, char *access_str)
17 {
18   v3_mem_track_access_t access;
19   v3_mem_track_reset_t reset;
20   uint64_t period;
21
22   if (!strcasecmp(reset_str,"oneshot")) { 
23     reset=V3_MEM_TRACK_ONESHOT;
24   } else if (!strcasecmp(reset_str,"periodic")) { 
25     reset=V3_MEM_TRACK_PERIODIC;
26   } else {
27     usage();
28     return -1;
29   }
30
31   if (!strcasecmp(access_str,"rwx")) {
32     access=V3_MEM_TRACK_ACCESS;
33   } else {
34     usage();
35     return -1;
36   }
37
38   period=atoll(period_str);
39
40   return v3_guest_mem_track_start(vm,access,reset,period);
41 }
42
43
44 int stop(char *vm)
45 {
46   return v3_guest_mem_track_stop(vm);
47 }
48
49 int text_out(char *vm, char *target, v3_mem_track_snapshot *s)
50 {
51   FILE *fd;
52   int close=0;
53   struct timeval tv;
54   double thetime;
55   uint64_t i,j;
56   uint64_t count;
57
58   gettimeofday(&tv,0);
59   thetime = tv.tv_sec + ((double)tv.tv_usec)/1.0e6;
60
61   if (!strcasecmp(target,"_")) { 
62     fd = stdout;
63   } else {
64     if (!(fd=fopen(target,"w"))) { 
65       fprintf(stderr,"Cannot open %s for write\n",target);
66       return -1;
67     }
68     close=1;
69   }
70
71   fprintf(fd,"Memory Tracking Snapshot\n\n");
72   fprintf(fd,"VM:\t%s\n",vm);
73   fprintf(fd,"Time:\t%lf\n\n",thetime);
74   fprintf(fd,"Reset:\t%s\n", 
75           s->reset_type==V3_MEM_TRACK_ONESHOT ? "oneshot" :
76           s->reset_type==V3_MEM_TRACK_PERIODIC ? "periodic" : "UNKNOWN");
77   fprintf(fd,"Interval:\t%lu cycles\n", s->period);
78   fprintf(fd,"Access:\t%s%s%s\n",
79           s->access_type&V3_MEM_TRACK_READ ? "r" : "",
80           s->access_type&V3_MEM_TRACK_WRITE ? "w" : "",
81           s->access_type&V3_MEM_TRACK_EXEC ? "x" : "");
82           
83   fprintf(fd,"Cores:\t%u\n",s->num_cores);
84   fprintf(fd,"Pages:\t%lu\n\n",s->core[0].num_pages);
85
86   
87   for (i=0;i<s->num_cores;i++) { 
88     fprintf(fd,"Core %lu (%lu to %lu, ",
89             i, s->core[i].start_time, s->core[i].end_time);
90     count=0;
91     for (j=0;j<s->core[i].num_pages;j++) {
92         count+=GET_BIT(s->core[i].access_bitmap,j);
93     }
94     fprintf(fd," %lu pages touched) : ", count);
95     for (j=0;j<s->core[i].num_pages;j++) {
96       if (GET_BIT(s->core[i].access_bitmap,j)) { 
97         fprintf(fd,"X");
98       } else {
99         fprintf(fd,".");
100       }
101     }
102     fprintf(fd,"\n");
103   }
104
105   fprintf(fd,"\n");
106
107   if (close) { 
108     fclose(fd);
109   }
110   
111   return 0;
112
113 }
114   
115 int write_all(int fd, void *buf, int n)
116 {
117   int rc;
118
119   while (n) { 
120     rc=write(fd,buf,n);
121     if (rc<=0) { 
122       return -1;
123     } 
124     buf+=rc;
125     n-=rc;
126   }
127   return 0;
128 }
129
130
131 int bin_out(char *vm, char *target, v3_mem_track_snapshot *s)
132 {
133   int fd;
134   int doclose=0;
135   struct timeval tv;
136   double thetime;
137   uint64_t i;
138
139   gettimeofday(&tv,0);
140   thetime = tv.tv_sec + ((double)tv.tv_usec)/1.0e6;
141
142   if (!strcasecmp(target,"_")) { 
143     fd = fileno(stdout);
144   } else {
145     if ((fd=open(target,O_WRONLY | O_CREAT, 0600))<0) { 
146       fprintf(stderr,"Cannot open %s for write\n",target);
147       return -1;
148     }
149     doclose=1;
150   }
151
152 #define WRITE(x) write_all(fd, &(x), sizeof(x))
153
154   WRITE(thetime);
155   WRITE(s->reset_type);
156   WRITE(s->period);
157   WRITE(s->access_type);
158   WRITE(s->num_cores);
159   WRITE(s->core[0].num_pages);
160   for (i=0;i<s->num_cores;i++) { 
161     WRITE(i);
162     WRITE(s->core[i].start_time);
163     WRITE(s->core[i].end_time);
164     write_all(fd,s->core[i].access_bitmap,s->core[i].num_pages/8 + !!(s->core[i].num_pages%8));
165   }
166
167   if (doclose) { 
168     close(fd);
169   }
170   
171   return 0;
172
173 }
174
175 int snapshot(char *vm, char *format, char *target)
176 {
177   v3_mem_track_snapshot *snap;
178
179   if (!(snap=v3_guest_mem_track_snapshot(vm))) { 
180     return -1;
181   }
182
183   if (!strcasecmp(format,"bin")) { 
184     int rc = bin_out(vm,target, snap);
185     v3_guest_mem_track_free_snapshot(snap);
186     return rc;
187   } else if (!strcasecmp(format,"text")) { 
188     int rc = text_out(vm,target, snap);
189     v3_guest_mem_track_free_snapshot(snap);
190     return rc;
191   } else {
192     return -1;
193   }
194 }
195   
196
197 int main(int argc, char *argv[])
198 {
199   char *vm=argv[1];
200   char *cmd=argv[2];
201
202   if (argc<3) { 
203     usage();
204     return -1;
205   }
206
207   if (!strcasecmp(cmd,"start")) { 
208     if (argc!=6) { 
209       usage();
210       return -1;
211     } else {
212       return start(vm,argv[3],argv[4],argv[5]);
213     }
214   } else if (!strcasecmp(cmd,"stop")) { 
215     if (argc!=3) { 
216       usage();
217       return -1;
218     } else {
219       return stop(vm);
220     } 
221   } else if (!strcasecmp(cmd,"snapshot")) { 
222     if (argc!=5) { 
223       usage();
224       return -1;
225     } else {
226       return snapshot(vm,argv[3],argv[4]);
227     }
228   } else {
229     usage();
230     return -1;
231   }
232
233   return 0;
234 }
235