4 #include "v3_guest_mem.h"
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");
16 int start(char *vm, char *reset_str, char *period_str, char *access_str)
18 v3_mem_track_access_t access;
19 v3_mem_track_reset_t reset;
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;
31 if (!strcasecmp(access_str,"rwx")) {
32 access=V3_MEM_TRACK_ACCESS;
38 period=atoll(period_str);
40 return v3_guest_mem_track_start(vm,access,reset,period);
46 return v3_guest_mem_track_stop(vm);
49 int text_out(char *vm, char *target, v3_mem_track_snapshot *s)
59 thetime = tv.tv_sec + ((double)tv.tv_usec)/1.0e6;
61 if (!strcasecmp(target,"_")) {
64 if (!(fd=fopen(target,"w"))) {
65 fprintf(stderr,"Cannot open %s for write\n",target);
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%llu 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" : "");
83 fprintf(fd,"Cores:\t%llu\n",s->num_cores);
84 fprintf(fd,"Pages:\t%llu\n\n",s->core[0].num_pages);
87 for (i=0;i<s->num_cores;i++) {
88 fprintf(fd,"Core %llu (%llu to %llu, ",
89 i, s->core[i].start_time, s->core[i].end_time);
91 for (j=0;j<s->core[i].num_pages;j++) {
92 count+=GET_BIT(s->core[i].access_bitmap,j);
94 fprintf(fd," %llu pages touched) : ", count);
95 for (j=0;j<s->core[i].num_pages;j++) {
96 if (GET_BIT(s->core[i].access_bitmap,j)) {
115 int write_all(int fd, void *buf, int n)
131 int bin_out(char *vm, char *target, v3_mem_track_snapshot *s)
140 thetime = tv.tv_sec + ((double)tv.tv_usec)/1.0e6;
142 if (!strcasecmp(target,"_")) {
145 if ((fd=open(target,O_WRONLY | O_CREAT, 0600))<0) {
146 fprintf(stderr,"Cannot open %s for write\n",target);
152 #define WRITE(x) write_all(fd, &(x), sizeof(x))
155 WRITE(s->reset_type);
157 WRITE(s->access_type);
159 WRITE(s->core[0].num_pages);
160 for (i=0;i<s->num_cores;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));
175 int snapshot(char *vm, char *format, char *target)
177 v3_mem_track_snapshot *snap;
179 if (!(snap=v3_guest_mem_track_snapshot(vm))) {
183 if (!strcasecmp(format,"bin")) {
184 int rc = bin_out(vm,target, snap);
185 v3_guest_mem_track_free_snapshot(snap);
187 } else if (!strcasecmp(format,"text")) {
188 int rc = text_out(vm,target, snap);
189 v3_guest_mem_track_free_snapshot(snap);
197 int main(int argc, char *argv[])
207 if (!strcasecmp(cmd,"start")) {
212 return start(vm,argv[3],argv[4],argv[5]);
214 } else if (!strcasecmp(cmd,"stop")) {
221 } else if (!strcasecmp(cmd,"snapshot")) {
226 return snapshot(vm,argv[3],argv[4]);