void update_total_processes() 
{
    /* It's easier to use kvm here than sysctl */
	
    int n_processes;

    info.procs = 0;
	
    if (init_kvm() < 0)
        return;
    else
        kvm_getproc2(kd, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc2), 
		&n_processes);
    
    info.procs = n_processes;
}
void update_running_processes() 
{
    struct kinfo_proc2 *p;
    int n_processes;
    int i, cnt = 0;

    info.run_procs = 0;

    if (init_kvm() < 0)
        return;
    else {
        p = kvm_getproc2(kd, KERN_PROC_ALL, 0, 
    	    sizeof(struct kinfo_proc2), &n_processes);
        for (i = 0; i<n_processes; i++)
	    if (p[i].p_stat == LSRUN || p[i].p_stat == LSIDL || 
		    p[i].p_stat == LSONPROC) 
	        cnt++;
    }
		
    info.run_procs = cnt;
}
Exemple #3
0
int main(int argc, char **argv){
  int ram_fd;
  char *ram, *ram_filename;
  struct stat ram_fs;
  //int num_vms;
  int num_vcpus;
  pid_t creator;
  int vmfd;
  int rv;
  int sc[3];
  struct kvm_regs regs;
  struct kvm_sregs sregs;
  union event_data event_data;
  
  go = 1;
  
  signal(SIGINT, sig_handler);
  
  
  if (argc < 3){
    printf("Usage: [qemu pid] [guest ram filename]\n");
    return -1;
  }
  
  ram_filename = argv[2];
  
  printf("Mapping Guest Memory...\n");
  if (stat(ram_filename, &ram_fs) == -1){
    perror("stat");
    return -1;
  }
  
  if ((ram_fd = open(ram_filename,O_RDWR)) == -1){
    perror("open");
    return -1;
  }
  
  if((ram = mmap(NULL, ram_fs.st_size, (PROT_READ | PROT_WRITE), MAP_SHARED, ram_fd, 0)) == (void*)-1){
    perror("mmap");
    close(ram_fd);
    return -1;
  }
  
  
  
  printf("Initializing KVM...\n");
  if(init_kvm()){
    printf("Unable to initialize kvm, exiting.\n");
    return -1;
  }
  printf("Initialized\n\n");
  
  creator = (pid_t)atoi(argv[1]);
  printf("calling attach_vm() with creator pid: %d...\n",creator);
  vmfd = attach_vm(creator);
  if(vmfd < 0){
    printf("Error attaching to VM, exiting\n");
    return -1;
  }
  printf("attach_vm() returned %d\n\n",vmfd);
  
  printf("calling attach_vcpus()...\n");
  num_vcpus = attach_vcpus();
  printf("attach_vcpus() returned %d\n\n",num_vcpus);
  
/*
  printf("calling get_regs()...\n");
  if(get_regs(0,&regs)){
    printf("Error getting regs, exiting\n");
    return -1;
  }
  printf("get_regs() returned rip: 0x%llX\n\n",regs.rip);
  
  printf("calling get_sregs()...\n");
  if(get_sregs(0,&sregs)){
    printf("Error getting sregs, exiting\n");
    return -1;
  }
  printf("get_sregs() returned cr0: 0x%llX\n\n",sregs.cr0);
*/

  
  printf("calling set_syscall_trap()...\n");
  sc[0] = 0x9f;
  sc[1] = 0x4a;
  sc[2] = 0xaa;
  rv = set_syscall_trap(sc,3);
  printf("set_syscall_trap() returned %d\n\n",rv);
  
  while(go){
    rv = get_event(0,&event_data);
    
    if(get_regs(0,&regs)){
      printf("Error getting regs, exiting\n");
      continue_vm(0);
      break;
    }
    if(get_sregs(0,&sregs)){
      printf("Error getting sregs, exiting\n");
      continue_vm(0);
      break;
    }
    if(rv == KVM_NITRO_EVENT_SYSCALL)
      printf("Syscall trapped key: 0x%lX cr3: 0x%llX rax: 0x%llX\n",event_data.syscall,sregs.cr3,regs.rax);
    else if(rv == KVM_NITRO_EVENT_SYSRET)
      printf("Sysret trapped key: 0x%lX cr3: 0x%llX\n",event_data.syscall,sregs.cr3);
    rv = continue_vm(0);
  }

  
  printf("calling unset_syscall_trap()...\n");
  rv = unset_syscall_trap();
  printf("unset_syscall_trap() returned %d\n\n",rv);
  
  close_kvm();
  
  munmap(ram,ram_fs.st_size);
  close(ram_fd);
  
  return 0;
}