X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fmain.c;h=6996bfaf62fb77474ad2a652e636b98f87221d3c;hb=700ce14388ea852b7599b73b0d5a9f94fd873045;hp=098d8f13b07d61a9e1c19621f629a1a5e0890300;hpb=ffd6d915b585a4a17a2d5b081313f0968885a105;p=palacios.git diff --git a/linux_module/main.c b/linux_module/main.c index 098d8f1..6996bfa 100644 --- a/linux_module/main.c +++ b/linux_module/main.c @@ -141,7 +141,14 @@ out_err: } case V3_FREE_GUEST: { unsigned long vm_idx = arg; - struct v3_guest * guest = guest_map[vm_idx]; + struct v3_guest * guest; + + if (vm_idx > MAX_VMS) { + ERROR("Invalid VM index: %ld\n", vm_idx); + return -1; + } + + guest = guest_map[vm_idx]; if (!guest) { ERROR("No VM at index %ld\n",vm_idx); @@ -150,7 +157,11 @@ out_err: INFO("Freeing VM (%s) (%p)\n", guest->name, guest); - free_palacios_vm(guest); + if (free_palacios_vm(guest)<0) { + ERROR("Cannot free guest at index %ld\n",vm_idx); + return -1; + } + guest_map[vm_idx] = NULL; break; } @@ -174,6 +185,13 @@ out_err: break; } + case V3_RESET_MEMORY: { + if (palacios_init_mm() == -1) { + ERROR("Error resetting Palacios memory\n"); + return -EFAULT; + } + break; + } default: { struct global_ctrl * ctrl = get_global_ctrl(ioctl); @@ -206,22 +224,95 @@ struct proc_dir_entry *palacios_get_procdir(void) return dir; } + +#define MAX_VCORES 32 + static int read_guests(char * buf, char ** start, off_t off, int count, int * eof, void * data) { int len = 0; unsigned int i = 0; + + struct v3_vm_state *s =palacios_alloc(sizeof(struct v3_vm_state)+MAX_VCORES*sizeof(struct v3_vcore_state)); + + if (!s) { + ERROR("No space for state structure\n"); + goto out; + } for(i = 0; i < MAX_VMS; i++) { - if (guest_map[i] != NULL) { - if (lenname, i); + if (guest_map[i] != NULL) { + if (len>=count) { + goto out; + } else { + len += snprintf(buf+len, count-len, + "%s\t/dev/v3-vm%d ", + guest_map[i]->name, i); + + if (len>=count) { + *(buf+len-1)='\n'; + goto out; + } else { + // Get extended data + s->num_vcores=MAX_VCORES; // max we can handle + if (v3_get_state_vm(guest_map[i]->v3_ctx, s)) { + ERROR("Cannot get VM info\n"); + *(buf+len-1)='\n'; + goto out; + } else { + unsigned long j; + + len+=snprintf(buf+len, count-len, + "%s [0x%p-0x%p] %lu vcores ", + s->state==V3_VM_INVALID ? "INVALID" : + s->state==V3_VM_RUNNING ? "running" : + s->state==V3_VM_STOPPED ? "stopped" : + s->state==V3_VM_PAUSED ? "paused" : + s->state==V3_VM_ERROR ? "ERROR" : + s->state==V3_VM_SIMULATING ? "simulating" : "UNKNOWN", + s->mem_base_paddr, s->mem_base_paddr+s->mem_size-1, + s->num_vcores); + if (len>=count) { + *(buf+len-1)='\n'; + goto out; + } + for (j=0;jnum_vcores;j++) { + len+=snprintf(buf+len, count-len, + "[vcore %lu %s on pcore %lu %llu exits rip=0x%p %s %s %s] ", + j, + s->vcore[j].state==V3_VCORE_INVALID ? "INVALID" : + s->vcore[j].state==V3_VCORE_RUNNING ? "running" : + s->vcore[j].state==V3_VCORE_STOPPED ? "stopped" : "UNKNOWN", + s->vcore[j].pcore, + s->vcore[j].num_exits, + s->vcore[j].last_rip, + s->vcore[j].cpu_mode==V3_VCORE_CPU_REAL ? "real" : + s->vcore[j].cpu_mode==V3_VCORE_CPU_PROTECTED ? "protected" : + s->vcore[j].cpu_mode==V3_VCORE_CPU_PROTECTED_PAE ? "protectedpae" : + s->vcore[j].cpu_mode==V3_VCORE_CPU_LONG ? "long" : + s->vcore[j].cpu_mode==V3_VCORE_CPU_LONG_32_COMPAT ? "long32" : + s->vcore[j].cpu_mode==V3_VCORE_CPU_LONG_16_COMPAT ? "long16" : "UNKNOWN", + s->vcore[j].mem_mode==V3_VCORE_MEM_MODE_PHYSICAL ? "physical" : + s->vcore[j].mem_mode==V3_VCORE_MEM_MODE_VIRTUAL ? "virtual" : "UNKNOWN", + s->vcore[j].mem_state==V3_VCORE_MEM_STATE_SHADOW ? "shadow" : + s->vcore[j].mem_state==V3_VCORE_MEM_STATE_NESTED ? "nested" : "UNKNOWN"); + if (len>=count) { + *(buf+len-1)='\n'; + goto out; + } + } + + *(buf+len-1)='\n'; + } + } } + } } - + + out: + if (s) { palacios_free(s); } + return len; }