⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hv_vm.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Cisco router simulation platform. * Copyright (c) 2006 Christophe Fillot (cf@utc.fr) * * Hypervisor generic VM routines. */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/mman.h>#include <signal.h>#include <fcntl.h>#include <errno.h>#include <assert.h>#include <stdarg.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <pthread.h>#include "cpu.h"#include "vm.h"#include "dynamips.h"#include "device.h"#include "dev_c7200.h"#include "dev_vtty.h"#include "utils.h"#include "base64.h"#include "net.h"#include "atm.h"#include "frame_relay.h"#include "crc.h"#include "net_io.h"#include "net_io_bridge.h"#ifdef GEN_ETH#include "gen_eth.h"#endif#include "registry.h"#include "hypervisor.h"/* Find the specified CPU */static cpu_gen_t *find_cpu(hypervisor_conn_t *conn,vm_instance_t *vm,                           u_int cpu_id){   cpu_gen_t *cpu;   cpu = cpu_group_find_id(vm->cpu_group,cpu_id);   if (!cpu) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_BAD_OBJ,1,"Bad CPU specified");      return NULL;   }      return cpu;}/* Create a VM instance */static int cmd_create(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = vm_create_instance(argv[0],atoi(argv[1]),argv[2]))) {      hypervisor_send_reply(conn,HSC_ERR_CREATE,1,                            "unable to create VM instance '%s'",                            argv[0]);      return(-1);   }   vm->vtty_con_type = VTTY_TYPE_NONE;   vm->vtty_aux_type = VTTY_TYPE_NONE;      vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"VM '%s' created",argv[0]);   return(0);}/* Delete a VM instance */static int cmd_delete(hypervisor_conn_t *conn,int argc,char *argv[]){   int res;   res = vm_delete_instance(argv[0]);   if (res == 1) {      hypervisor_send_reply(conn,HSC_INFO_OK,1,"VM '%s' deleted",argv[0]);   } else {      hypervisor_send_reply(conn,HSC_ERR_DELETE,1,                            "unable to delete VM '%s'",argv[0]);   }   return(res);}/* Start a VM instance */static int cmd_start(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (vm->vtty_con_type == VTTY_TYPE_NONE) {      hypervisor_send_reply(conn,HSC_INFO_MSG,0,                            "Warning: no console port defined for "                            "VM '%s'",argv[0]);   }   if (vm_init_instance(vm) == -1) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_START,1,                            "unable to start VM instance '%s'",                            argv[0]);      return(-1);   }      vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"VM '%s' started",argv[0]);   return(0);}/* Stop a VM instance */static int cmd_stop(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (vm_stop_instance(vm) == -1) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_STOP,1,                            "unable to stop VM instance '%s'",                            argv[0]);      return(-1);   }      vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"VM '%s' stopped",argv[0]);   return(0);}/* Set debugging level */static int cmd_set_debug_level(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->debug_level = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"O",argv[0]);   return(0);}/* Set IOS image filename */static int cmd_set_ios(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (vm_ios_set_image(vm,argv[1]) == -1) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_CREATE,1,                            "unable to store IOS image name for router '%s'",                            argv[0]);      return(-1);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"IOS image set for '%s'",argv[0]);   return(0);}/* Set IOS configuration filename to load at startup */static int cmd_set_config(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (vm_ios_set_config(vm,argv[1]) == -1) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_CREATE,1,                            "unable to store IOS config for router '%s'",                            argv[0]);      return(-1);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"IOS config file set for '%s'",                         argv[0]);   return(0);}/* Set RAM size */static int cmd_set_ram(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->ram_size = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set NVRAM size */static int cmd_set_nvram(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->nvram_size = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Enable/disable use of a memory-mapped file to simulate RAM */static int cmd_set_ram_mmap(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->ram_mmap = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Enable/disable use of sparse memory */static int cmd_set_sparse_mem(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->sparse_mem = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set the clock divisor */static int cmd_set_clock_divisor(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   u_int clock_div;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if ((clock_div = atoi(argv[1])) != 0)      vm->clock_divisor = clock_div;   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Enable/disable use of block direct jump (compatibility option) */static int cmd_set_blk_direct_jump(hypervisor_conn_t *conn,                                   int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->exec_blk_direct_jump = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set the idle PC */static int cmd_set_idle_pc(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->idle_pc = strtoull(argv[1],NULL,0);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set the idle PC value when the CPU is online */static int cmd_set_idle_pc_online(hypervisor_conn_t *conn,                                  int argc,char *argv[]){   vm_instance_t *vm;   cpu_gen_t *cpu;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (!(cpu = find_cpu(conn,vm,atoi(argv[1]))))      return(-1);   cpu->set_idle_pc(cpu,strtoull(argv[2],NULL,0));   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Get the idle PC proposals */static int cmd_get_idle_pc_prop(hypervisor_conn_t *conn,int argc,char *argv[]){     vm_instance_t *vm;   cpu_gen_t *cpu;   int i;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (!(cpu = find_cpu(conn,vm,atoi(argv[1]))))      return(-1);   cpu->get_idling_pc(cpu);   for(i=0;i<cpu->idle_pc_prop_count;i++) {      hypervisor_send_reply(conn,HSC_INFO_MSG,0,"0x%llx [%d]",                            cpu->idle_pc_prop[i].pc,                            cpu->idle_pc_prop[i].count);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Dump the idle PC proposals */static int cmd_show_idle_pc_prop(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   cpu_gen_t *cpu;   int i;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (!(cpu = find_cpu(conn,vm,atoi(argv[1]))))      return(-1);   for(i=0;i<cpu->idle_pc_prop_count;i++) {      hypervisor_send_reply(conn,HSC_INFO_MSG,0,"0x%llx [%d]",                            cpu->idle_pc_prop[i].pc,                            cpu->idle_pc_prop[i].count);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set CPU idle max value */static int cmd_set_idle_max(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   cpu_gen_t *cpu;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (!(cpu = find_cpu(conn,vm,atoi(argv[1]))))      return(-1);   cpu->idle_max = atoi(argv[2]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set CPU idle sleep time value */static int cmd_set_idle_sleep_time(hypervisor_conn_t *conn,                                   int argc,char *argv[]){   vm_instance_t *vm;   cpu_gen_t *cpu;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (!(cpu = find_cpu(conn,vm,atoi(argv[1]))))      return(-1);   cpu->idle_sleep_time = atoi(argv[2]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Show info about potential timer drift */static int cmd_show_timer_drift(hypervisor_conn_t *conn,                                int argc,char *argv[]){   vm_instance_t *vm;   cpu_gen_t *cpu;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (!(cpu = find_cpu(conn,vm,atoi(argv[1]))))      return(-1);   switch(cpu->type) {      case CPU_TYPE_MIPS64:         hypervisor_send_reply(conn,HSC_INFO_MSG,0,"Timer Drift: %u",                               CPU_MIPS64(cpu)->timer_drift);         hypervisor_send_reply(conn,HSC_INFO_MSG,0,"Pending Timer IRQ: %u",                               CPU_MIPS64(cpu)->timer_irq_pending);         break;     case CPU_TYPE_PPC32:         hypervisor_send_reply(conn,HSC_INFO_MSG,0,"Timer Drift: %u",                               CPU_PPC32(cpu)->timer_drift);         hypervisor_send_reply(conn,HSC_INFO_MSG,0,"Pending Timer IRQ: %u",                               CPU_PPC32(cpu)->timer_irq_pending);         break;   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set the exec area size */static int cmd_set_exec_area(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->exec_area_size = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set ghost RAM file */static int cmd_set_ghost_file(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->ghost_ram_filename = strdup(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set ghost RAM status */static int cmd_set_ghost_status(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->ghost_status = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set PCMCIA ATA disk0 size */static int cmd_set_disk0(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->pcmcia_disk_size[0] = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set PCMCIA ATA disk1 size */static int cmd_set_disk1(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->pcmcia_disk_size[1] = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set the config register used at startup */static int cmd_set_conf_reg(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -