|
|
1.1 root 1: /* 1.1.1.8 root 2: * Cisco router simulation platform. 1.1 root 3: * Copyright (c) 2005,2006 Christophe Fillot ([email protected]) 4: * 5: * Many thanks to Nicolas Szalay for his patch 6: * for the command line parsing and virtual machine 7: * settings (RAM, ROM, NVRAM, ...) 8: */ 9: 10: #include <stdio.h> 11: #include <stdlib.h> 12: #include <unistd.h> 13: #include <string.h> 1.1.1.4 root 14: #include <errno.h> 1.1 root 15: #include <sys/types.h> 16: #include <sys/stat.h> 17: #include <sys/mman.h> 18: #include <signal.h> 19: #include <fcntl.h> 20: #include <assert.h> 1.1.1.4 root 21: #include <getopt.h> 1.1 root 22: 1.1.1.4 root 23: #include "dynamips.h" 1.1.1.8 root 24: #include "cpu.h" 1.1 root 25: #include "mips64_exec.h" 1.1.1.8 root 26: #include "mips64_jit.h" 27: #include "ppc32_exec.h" 28: #include "ppc32_jit.h" 1.1 root 29: #include "dev_c7200.h" 1.1.1.4 root 30: #include "dev_c3600.h" 1.1.1.6 root 31: #include "dev_c2691.h" 32: #include "dev_c3725.h" 33: #include "dev_c3745.h" 1.1.1.8 root 34: #include "dev_c2600.h" 1.1.1.9 ! root 35: #include "dev_msfc1.h" 1.1.1.8 root 36: #include "ppc32_vmtest.h" 1.1 root 37: #include "dev_vtty.h" 38: #include "ptask.h" 1.1.1.5 root 39: #include "timer.h" 1.1.1.4 root 40: #include "registry.h" 41: #include "hypervisor.h" 1.1.1.2 root 42: #include "net_io.h" 1.1 root 43: #include "net_io_bridge.h" 1.1.1.4 root 44: #include "net_io_filter.h" 45: #include "crc.h" 46: #include "atm.h" 47: #include "frame_relay.h" 48: #include "eth_switch.h" 1.1.1.2 root 49: #ifdef GEN_ETH 50: #include "gen_eth.h" 51: #endif 1.1 root 52: #ifdef PROFILE 53: #include "profiler.h" 54: #endif 55: 56: /* Default name for logfile */ 1.1.1.4 root 57: #define LOGFILE_DEFAULT_NAME "dynamips_log.txt" 1.1 root 58: 59: /* Software version */ 1.1.1.4 root 60: const char *sw_version = DYNAMIPS_VERSION"-"JIT_ARCH; 61: 1.1.1.9 ! root 62: /* Software version tag */ ! 63: const char *sw_version_tag = "2007030219"; ! 64: 1.1.1.4 root 65: /* Hypervisor */ 66: int hypervisor_mode = 0; 67: int hypervisor_tcp_port = 0; 1.1 root 68: 69: /* Log file */ 1.1.1.4 root 70: char *log_file_name = NULL; 1.1 root 71: FILE *log_file = NULL; 72: 73: /* VM flags */ 74: volatile int vm_save_state = 0; 75: 76: /* Generic signal handler */ 77: void signal_gen_handler(int sig) 78: { 79: switch(sig) { 80: case SIGHUP: 1.1.1.4 root 81: /* For future use */ 1.1 root 82: break; 83: 84: case SIGQUIT: 85: /* save VM context */ 86: vm_save_state = TRUE; 1.1.1.4 root 87: break; 88: 89: case SIGINT: 90: /* CTRL+C has been pressed */ 91: if (hypervisor_mode) 92: hypervisor_stopsig(); 93: else { 94: /* In theory, this shouldn't happen thanks to VTTY settings */ 95: vm_instance_t *vm; 96: 97: if ((vm = vm_acquire("default")) != NULL) { 98: /* Only forward ctrl-c if user has requested local terminal */ 99: if (vm->vtty_con_type == VTTY_TYPE_TERM) { 100: vtty_store_ctrlc(vm->vtty_con); 101: } else { 102: vm_stop(vm); 103: } 104: vm_release(vm); 105: } else { 106: fprintf(stderr,"Error: Cannot acquire instance handle.\n"); 107: } 108: } 1.1 root 109: break; 110: 111: default: 112: fprintf(stderr,"Unhandled signal %d\n",sig); 113: } 114: } 115: 116: /* Setups signals */ 117: static void setup_signals(void) 118: { 119: struct sigaction act; 120: 121: memset(&act,0,sizeof(act)); 122: act.sa_handler = signal_gen_handler; 123: act.sa_flags = SA_RESTART; 124: sigaction(SIGHUP,&act,NULL); 125: sigaction(SIGQUIT,&act,NULL); 1.1.1.4 root 126: sigaction(SIGINT,&act,NULL); 1.1 root 127: } 128: 1.1.1.4 root 129: /* Create general log file */ 130: static void create_log_file(void) 131: { 132: /* Set the default value of the log file name */ 133: if (!log_file_name) { 134: if (!(log_file_name = strdup(LOGFILE_DEFAULT_NAME))) { 135: fprintf(stderr,"Unable to set log file name.\n"); 136: exit(EXIT_FAILURE); 137: } 1.1 root 138: } 139: 1.1.1.4 root 140: if (!(log_file = fopen(log_file_name,"w"))) { 141: fprintf(stderr,"Unable to create log file (%s).\n",strerror(errno)); 142: exit(EXIT_FAILURE); 1.1 root 143: } 1.1.1.4 root 144: } 1.1 root 145: 1.1.1.4 root 146: /* Close general log file */ 147: static void close_log_file(void) 148: { 149: if (log_file) fclose(log_file); 150: free(log_file_name); 1.1 root 151: 1.1.1.4 root 152: log_file = NULL; 153: log_file_name = NULL; 154: } 1.1 root 155: 1.1.1.4 root 156: /* Display the command line use */ 157: static void show_usage(int argc,char *argv[],int platform) 158: { 159: u_int def_ram_size,def_rom_size,def_nvram_size; 160: u_int def_conf_reg,def_clock_div; 1.1.1.9 ! root 161: u_int def_disk0_size = 0,def_disk1_size = 0; 1.1.1.4 root 162: u_int def_nm_iomem_size = 0; 163: 164: switch(platform) { 165: case VM_TYPE_C7200: 166: def_ram_size = C7200_DEFAULT_RAM_SIZE; 167: def_rom_size = C7200_DEFAULT_ROM_SIZE; 168: def_nvram_size = C7200_DEFAULT_NVRAM_SIZE; 169: def_conf_reg = C7200_DEFAULT_CONF_REG; 170: def_clock_div = C7200_DEFAULT_CLOCK_DIV; 171: def_disk0_size = C7200_DEFAULT_DISK0_SIZE; 172: def_disk1_size = C7200_DEFAULT_DISK1_SIZE; 173: break; 174: case VM_TYPE_C3600: 175: def_ram_size = C3600_DEFAULT_RAM_SIZE; 176: def_rom_size = C3600_DEFAULT_ROM_SIZE; 177: def_nvram_size = C3600_DEFAULT_NVRAM_SIZE; 178: def_conf_reg = C3600_DEFAULT_CONF_REG; 179: def_clock_div = C3600_DEFAULT_CLOCK_DIV; 180: def_disk0_size = C3600_DEFAULT_DISK0_SIZE; 181: def_disk1_size = C3600_DEFAULT_DISK1_SIZE; 182: def_nm_iomem_size = C3600_DEFAULT_IOMEM_SIZE; 183: break; 1.1.1.6 root 184: case VM_TYPE_C2691: 185: def_ram_size = C2691_DEFAULT_RAM_SIZE; 186: def_rom_size = C2691_DEFAULT_ROM_SIZE; 187: def_nvram_size = C2691_DEFAULT_NVRAM_SIZE; 188: def_conf_reg = C2691_DEFAULT_CONF_REG; 189: def_clock_div = C2691_DEFAULT_CLOCK_DIV; 190: def_disk0_size = C2691_DEFAULT_DISK0_SIZE; 191: def_disk1_size = C2691_DEFAULT_DISK1_SIZE; 192: def_nm_iomem_size = C2691_DEFAULT_IOMEM_SIZE; 193: break; 194: case VM_TYPE_C3725: 195: def_ram_size = C3725_DEFAULT_RAM_SIZE; 196: def_rom_size = C3725_DEFAULT_ROM_SIZE; 197: def_nvram_size = C3725_DEFAULT_NVRAM_SIZE; 198: def_conf_reg = C3725_DEFAULT_CONF_REG; 199: def_clock_div = C3725_DEFAULT_CLOCK_DIV; 200: def_disk0_size = C3725_DEFAULT_DISK0_SIZE; 201: def_disk1_size = C3725_DEFAULT_DISK1_SIZE; 202: def_nm_iomem_size = C3725_DEFAULT_IOMEM_SIZE; 203: break; 204: case VM_TYPE_C3745: 205: def_ram_size = C3745_DEFAULT_RAM_SIZE; 206: def_rom_size = C3745_DEFAULT_ROM_SIZE; 207: def_nvram_size = C3745_DEFAULT_NVRAM_SIZE; 208: def_conf_reg = C3745_DEFAULT_CONF_REG; 209: def_clock_div = C3745_DEFAULT_CLOCK_DIV; 210: def_disk0_size = C3745_DEFAULT_DISK0_SIZE; 211: def_disk1_size = C3745_DEFAULT_DISK1_SIZE; 212: def_nm_iomem_size = C3745_DEFAULT_IOMEM_SIZE; 213: break; 1.1.1.8 root 214: case VM_TYPE_C2600: 215: def_ram_size = C2600_DEFAULT_RAM_SIZE; 216: def_rom_size = C2600_DEFAULT_ROM_SIZE; 217: def_nvram_size = C2600_DEFAULT_NVRAM_SIZE; 218: def_conf_reg = C2600_DEFAULT_CONF_REG; 219: def_clock_div = C2600_DEFAULT_CLOCK_DIV; 220: def_disk0_size = C2600_DEFAULT_DISK0_SIZE; 221: def_disk1_size = C2600_DEFAULT_DISK1_SIZE; 1.1.1.9 ! root 222: def_nm_iomem_size = C2600_DEFAULT_IOMEM_SIZE; ! 223: break; ! 224: case VM_TYPE_MSFC1: ! 225: def_ram_size = MSFC1_DEFAULT_RAM_SIZE; ! 226: def_rom_size = MSFC1_DEFAULT_ROM_SIZE; ! 227: def_nvram_size = MSFC1_DEFAULT_NVRAM_SIZE; ! 228: def_conf_reg = MSFC1_DEFAULT_CONF_REG; ! 229: def_clock_div = MSFC1_DEFAULT_CLOCK_DIV; 1.1.1.8 root 230: break; 231: case VM_TYPE_PPC32_TEST: 232: def_ram_size = PPC32_VMTEST_DEFAULT_RAM_SIZE; 1.1.1.4 root 233: default: 234: fprintf(stderr,"show_usage: invalid platform.\n"); 235: return; 236: } 237: 238: printf("Usage: %s [options] <ios_image>\n\n",argv[0]); 1.1 root 239: 1.1.1.4 root 240: printf("Available options:\n" 1.1.1.5 root 241: " -H <tcp_port> : Run in hypervisor mode\n\n" 1.1.1.6 root 242: " -P <platform> : Platform to emulate (7200, 3600, " 243: "2691, 3725 or 3745) " 1.1.1.4 root 244: "(default: 7200)\n\n" 245: " -l <log_file> : Set logging file (default is %s)\n" 246: " -j : Disable the JIT compiler, very slow\n" 247: " --exec-area <size> : Set the exec area size (default: %d Mb)\n" 248: " --idle-pc <pc> : Set the idle PC (default: disabled)\n" 249: " --timer-itv <val> : Timer IRQ interval check (default: %u)\n" 250: "\n" 251: " -i <instance> : Set instance ID\n" 252: " -r <ram_size> : Set the virtual RAM size (default: %u Mb)\n" 253: " -o <rom_size> : Set the virtual ROM size (default: %u Mb)\n" 254: " -n <nvram_size> : Set the NVRAM size (default: %d Kb)\n" 255: " -c <conf_reg> : Set the configuration register " 256: "(default: 0x%04x)\n" 257: " -m <mac_addr> : Set the MAC address of the chassis\n" 258: " (default: automatically generated)\n" 259: " -C <cfg_file> : Import an IOS configuration file " 260: "into NVRAM\n" 261: " -X : Do not use a file to simulate RAM (faster)\n" 1.1.1.6 root 262: " -G <ghost_file> : Use a ghost file to simulate RAM\n" 263: " -g <ghost_file> : Generate a ghost RAM file\n" 1.1.1.8 root 264: " --sparse-mem : Use sparse memory\n" 1.1.1.4 root 265: " -R <rom_file> : Load an alternate ROM (default: embedded)\n" 266: " -k <clock_div> : Set the clock divisor (default: %d)\n" 267: "\n" 268: " -T <port> : Console is on TCP <port>\n" 269: " -U <si_desc> : Console in on serial interface <si_desc>\n" 270: " (default is on the terminal)\n" 271: "\n" 272: " -A <port> : AUX is on TCP <port>\n" 273: " -B <si_desc> : AUX is on serial interface <si_desc>\n" 274: " (default is no AUX port)\n" 275: "\n" 276: " --disk0 <size> : Set PCMCIA ATA disk0: size " 277: "(default: %u Mb)\n" 278: " --disk1 <size> : Set PCMCIA ATA disk1: size " 279: "(default: %u Mb)\n" 280: "\n", 281: LOGFILE_DEFAULT_NAME,MIPS_EXEC_AREA_SIZE,VM_TIMER_IRQ_CHECK_ITV, 282: def_ram_size,def_rom_size,def_nvram_size,def_conf_reg, 283: def_clock_div,def_disk0_size,def_disk1_size); 284: 285: switch(platform) { 286: case VM_TYPE_C7200: 287: printf(" -t <npe_type> : Select NPE type (default: \"%s\")\n" 288: " -M <midplane> : Select Midplane (\"std\" or \"vxr\")\n" 289: " -p <pa_desc> : Define a Port Adapter\n" 290: " -s <pa_nio> : Bind a Network IO interface to a " 291: "Port Adapter\n", 292: C7200_DEFAULT_NPE_TYPE); 293: break; 1.1 root 294: 1.1.1.4 root 295: case VM_TYPE_C3600: 296: printf(" -t <chassis_type> : Select Chassis type " 297: "(default: \"%s\")\n" 298: " --iomem-size <val> : IO memory (in percents, default: %u)\n" 299: " -p <nm_desc> : Define a Network Module\n" 300: " -s <nm_nio> : Bind a Network IO interface to a " 301: "Network Module\n", 302: C3600_DEFAULT_CHASSIS,def_nm_iomem_size); 303: break; 1.1.1.6 root 304: 305: case VM_TYPE_C2691: 306: printf(" --iomem-size <val> : IO memory (in percents, default: %u)\n" 307: " -p <nm_desc> : Define a Network Module\n" 308: " -s <nm_nio> : Bind a Network IO interface to a " 309: "Network Module\n", 310: def_nm_iomem_size); 311: break; 312: 313: case VM_TYPE_C3725: 314: printf(" --iomem-size <val> : IO memory (in percents, default: %u)\n" 315: " -p <nm_desc> : Define a Network Module\n" 316: " -s <nm_nio> : Bind a Network IO interface to a " 317: "Network Module\n", 318: def_nm_iomem_size); 319: break; 320: 321: case VM_TYPE_C3745: 322: printf(" --iomem-size <val> : IO memory (in percents, default: %u)\n" 323: " -p <nm_desc> : Define a Network Module\n" 324: " -s <nm_nio> : Bind a Network IO interface to a " 325: "Network Module\n", 326: def_nm_iomem_size); 327: break; 1.1.1.8 root 328: 329: case VM_TYPE_C2600: 330: printf(" --iomem-size <val> : IO memory (in percents, default: %u)\n" 331: " -p <nm_desc> : Define a Network Module\n" 332: " -s <nm_nio> : Bind a Network IO interface to a " 333: "Network Module\n", 334: def_nm_iomem_size); 335: break; 1.1.1.9 ! root 336: ! 337: case VM_TYPE_MSFC1: ! 338: printf(" -s <pa_nio> : Bind a Network IO interface to a " ! 339: "Port Adapter\n"); ! 340: break; ! 341: 1.1.1.4 root 342: } 1.1 root 343: 1.1.1.4 root 344: printf("\n" 345: #if DEBUG_SYM_TREE 346: " -S <sym_file> : Load a symbol file\n" 347: #endif 348: " -a <cfg_file> : Virtual ATM switch configuration file\n" 349: " -f <cfg_file> : Virtual Frame-Relay switch configuration " 350: "file\n" 351: " -E <cfg_file> : Virtual Ethernet switch configuration file\n" 352: " -b <cfg_file> : Virtual bridge configuration file\n" 353: " -e : Show network device list of the " 354: "host machine\n" 355: "\n"); 356: 357: printf("<si_desc> format:\n" 358: " \"device{:baudrate{:databits{:parity{:stopbits{:hwflow}}}}}}\"\n" 359: "\n"); 1.1 root 360: 1.1.1.4 root 361: switch(platform) { 362: case VM_TYPE_C7200: 363: printf("<pa_desc> format:\n" 364: " \"slot:pa_driver\"\n" 365: "\n"); 366: 367: printf("<pa_nio> format:\n" 368: " \"slot:port:netio_type{:netio_parameters}\"\n" 369: "\n"); 370: 371: /* Show the possible NPE drivers */ 372: c7200_npe_show_drivers(); 373: 374: /* Show the possible PA drivers */ 375: c7200_pa_show_drivers(); 376: break; 377: 378: case VM_TYPE_C3600: 379: printf("<nm_desc> format:\n" 380: " \"slot:nm_driver\"\n" 381: "\n"); 382: 383: printf("<nm_nio> format:\n" 384: " \"slot:port:netio_type{:netio_parameters}\"\n" 385: "\n"); 386: 387: /* Show the possible chassis types for C3600 platform */ 388: c3600_chassis_show_drivers(); 389: 1.1.1.6 root 390: /* Show the possible NM drivers */ 1.1.1.4 root 391: c3600_nm_show_drivers(); 1.1 root 392: break; 1.1.1.6 root 393: 394: case VM_TYPE_C2691: 395: printf("<nm_desc> format:\n" 396: " \"slot:nm_driver\"\n" 397: "\n"); 398: 399: printf("<nm_nio> format:\n" 400: " \"slot:port:netio_type{:netio_parameters}\"\n" 401: "\n"); 402: 403: /* Show the possible NM drivers */ 404: c2691_nm_show_drivers(); 405: break; 406: 407: case VM_TYPE_C3725: 408: printf("<nm_desc> format:\n" 409: " \"slot:nm_driver\"\n" 410: "\n"); 411: 412: printf("<nm_nio> format:\n" 413: " \"slot:port:netio_type{:netio_parameters}\"\n" 414: "\n"); 415: 416: /* Show the possible NM drivers */ 417: c3725_nm_show_drivers(); 418: break; 419: 420: case VM_TYPE_C3745: 421: printf("<nm_desc> format:\n" 422: " \"slot:nm_driver\"\n" 423: "\n"); 424: 425: printf("<nm_nio> format:\n" 426: " \"slot:port:netio_type{:netio_parameters}\"\n" 427: "\n"); 428: 429: /* Show the possible NM drivers */ 430: c3745_nm_show_drivers(); 431: break; 1.1.1.8 root 432: 433: case VM_TYPE_C2600: 434: printf("<nm_desc> format:\n" 435: " \"slot:nm_driver\"\n" 436: "\n"); 437: 438: printf("<nm_nio> format:\n" 439: " \"slot:port:netio_type{:netio_parameters}\"\n" 440: "\n"); 441: 442: /* Show the possible chassis types for C2600 platform */ 443: c2600_mainboard_show_drivers(); 444: 445: /* Show the possible NM drivers */ 446: c2600_nm_show_drivers(); 447: break; 1.1 root 448: } 449: 1.1.1.4 root 450: /* Show the possible NETIO types */ 451: netio_show_types(); 1.1 root 452: } 453: 1.1.1.4 root 454: /* Find an option in the command line */ 455: static char *cli_find_option(int argc,char *argv[],char *opt) 1.1 root 456: { 1.1.1.4 root 457: int i; 1.1 root 458: 1.1.1.4 root 459: for(i=1;i<argc;i++) { 460: if (!strncmp(argv[i],opt,2)) { 461: if (argv[i][2] != 0) 462: return(&argv[i][2]); 463: else { 464: if (argv[i+1] != NULL) 465: return(argv[i+1]); 466: else { 467: fprintf(stderr,"Error: option '%s': no argument specified.\n", 468: opt); 469: exit(EXIT_FAILURE); 470: } 471: } 472: } 1.1 root 473: } 474: 1.1.1.4 root 475: return NULL; 476: } 1.1 root 477: 1.1.1.4 root 478: /* Determine the platform (Cisco 3600, 7200). Default is Cisco 7200 */ 479: static int cli_get_platform_type(int argc,char *argv[]) 480: { 481: int vm_type = VM_TYPE_C7200; 482: char *str; 1.1 root 483: 1.1.1.4 root 484: if ((str = cli_find_option(argc,argv,"-P"))) { 485: if (!strcmp(str,"3600")) 486: vm_type = VM_TYPE_C3600; 487: else if (!strcmp(str,"7200")) 488: vm_type = VM_TYPE_C7200; 1.1.1.6 root 489: else if (!strcmp(str,"2691")) 490: vm_type = VM_TYPE_C2691; 491: else if (!strcmp(str,"3725")) 492: vm_type = VM_TYPE_C3725; 493: else if (!strcmp(str,"3745")) 494: vm_type = VM_TYPE_C3745; 1.1.1.8 root 495: else if (!strcmp(str,"2600")) 496: vm_type = VM_TYPE_C2600; 1.1.1.9 ! root 497: else if (!strcmp(str,"MSFC1")) ! 498: vm_type = VM_TYPE_MSFC1; 1.1.1.8 root 499: else if (!strcmp(str,"PPC32_TEST")) 500: vm_type = VM_TYPE_PPC32_TEST; 1.1.1.4 root 501: else 502: fprintf(stderr,"Invalid platform type '%s'\n",str); 1.1 root 503: } 504: 1.1.1.4 root 505: return(vm_type); 506: } 1.1 root 507: 1.1.1.4 root 508: /* Command Line long options */ 509: #define OPT_DISK0_SIZE 0x100 510: #define OPT_DISK1_SIZE 0x101 511: #define OPT_EXEC_AREA 0x102 512: #define OPT_IDLE_PC 0x103 513: #define OPT_TIMER_ITV 0x104 514: #define OPT_VM_DEBUG 0x105 515: #define OPT_IOMEM_SIZE 0x106 1.1.1.8 root 516: #define OPT_SPARSE_MEM 0x107 1.1.1.4 root 517: 518: static struct option cmd_line_lopts[] = { 519: { "disk0" , 1, NULL, OPT_DISK0_SIZE }, 520: { "disk1" , 1, NULL, OPT_DISK1_SIZE }, 521: { "exec-area" , 1, NULL, OPT_EXEC_AREA }, 522: { "idle-pc" , 1, NULL, OPT_IDLE_PC }, 523: { "timer-itv" , 1, NULL, OPT_TIMER_ITV }, 524: { "vm-debug" , 1, NULL, OPT_VM_DEBUG }, 525: { "iomem-size" , 1, NULL, OPT_IOMEM_SIZE }, 1.1.1.8 root 526: { "sparse-mem" , 0, NULL, OPT_SPARSE_MEM }, 1.1.1.4 root 527: { NULL , 0, NULL, 0 }, 528: }; 1.1 root 529: 1.1.1.4 root 530: /* Parse specific options for the Cisco 7200 platform */ 531: static int cli_parse_c7200_options(vm_instance_t *vm,int option) 532: { 533: c7200_t *router; 1.1 root 534: 1.1.1.4 root 535: router = VM_C7200(vm); 1.1 root 536: 1.1.1.4 root 537: switch(option) { 538: /* NPE type */ 539: case 't': 540: c7200_npe_set_type(router,optarg); 541: break; 1.1 root 542: 1.1.1.4 root 543: /* Midplane type */ 544: case 'M': 545: c7200_midplane_set_type(router,optarg); 546: break; 1.1 root 547: 1.1.1.4 root 548: /* Set the base MAC address */ 549: case 'm': 550: if (!c7200_midplane_set_mac_addr(router,optarg)) 551: printf("MAC address set to '%s'.\n",optarg); 552: break; 1.1 root 553: 1.1.1.4 root 554: /* PA settings */ 555: case 'p': 556: return(c7200_cmd_pa_create(router,optarg)); 557: 558: /* PA NIO settings */ 559: case 's': 560: return(c7200_cmd_add_nio(router,optarg)); 1.1 root 561: 1.1.1.4 root 562: /* Unknown option */ 563: default: 564: return(-1); 565: } 1.1 root 566: 567: return(0); 568: } 569: 1.1.1.4 root 570: /* Parse specific options for the Cisco 3600 platform */ 571: static int cli_parse_c3600_options(vm_instance_t *vm,int option) 1.1 root 572: { 1.1.1.4 root 573: c3600_t *router; 1.1 root 574: 1.1.1.4 root 575: router = VM_C3600(vm); 1.1 root 576: 1.1.1.4 root 577: switch(option) { 578: /* chassis type */ 579: case 't': 580: c3600_chassis_set_type(router,optarg); 581: break; 1.1 root 582: 1.1.1.4 root 583: /* IO memory reserved for NMs (in percents!) */ 584: case OPT_IOMEM_SIZE: 585: router->nm_iomem_size = 0x8000 | atoi(optarg); 586: break; 1.1 root 587: 1.1.1.4 root 588: /* NM settings */ 589: case 'p': 590: return(c3600_cmd_nm_create(router,optarg)); 591: 592: /* NM NIO settings */ 593: case 's': 594: return(c3600_cmd_add_nio(router,optarg)); 595: 596: /* Unknown option */ 597: default: 598: return(-1); 1.1 root 599: } 600: 601: return(0); 602: } 603: 1.1.1.6 root 604: /* Parse specific options for the Cisco 2691 platform */ 605: static int cli_parse_c2691_options(vm_instance_t *vm,int option) 606: { 607: c2691_t *router; 608: 609: router = VM_C2691(vm); 610: 611: switch(option) { 612: /* IO memory reserved for NMs (in percents!) */ 613: case OPT_IOMEM_SIZE: 614: router->nm_iomem_size = 0x8000 | atoi(optarg); 615: break; 616: 617: /* NM settings */ 618: case 'p': 619: return(c2691_cmd_nm_create(router,optarg)); 620: 621: /* NM NIO settings */ 622: case 's': 623: return(c2691_cmd_add_nio(router,optarg)); 624: 625: /* Unknown option */ 626: default: 627: return(-1); 628: } 629: 630: return(0); 631: } 632: 633: /* Parse specific options for the Cisco 3725 platform */ 634: static int cli_parse_c3725_options(vm_instance_t *vm,int option) 635: { 636: c3725_t *router; 637: 638: router = VM_C3725(vm); 639: 640: switch(option) { 641: /* IO memory reserved for NMs (in percents!) */ 642: case OPT_IOMEM_SIZE: 643: router->nm_iomem_size = 0x8000 | atoi(optarg); 644: break; 645: 646: /* NM settings */ 647: case 'p': 648: return(c3725_cmd_nm_create(router,optarg)); 649: 650: /* NM NIO settings */ 651: case 's': 652: return(c3725_cmd_add_nio(router,optarg)); 653: 654: /* Unknown option */ 655: default: 656: return(-1); 657: } 658: 659: return(0); 660: } 661: 662: /* Parse specific options for the Cisco 3745 platform */ 663: static int cli_parse_c3745_options(vm_instance_t *vm,int option) 664: { 665: c3745_t *router; 666: 667: router = VM_C3745(vm); 668: 669: switch(option) { 670: /* IO memory reserved for NMs (in percents!) */ 671: case OPT_IOMEM_SIZE: 672: router->nm_iomem_size = 0x8000 | atoi(optarg); 673: break; 674: 675: /* NM settings */ 676: case 'p': 677: return(c3745_cmd_nm_create(router,optarg)); 678: 679: /* NM NIO settings */ 680: case 's': 681: return(c3745_cmd_add_nio(router,optarg)); 682: 683: /* Unknown option */ 684: default: 685: return(-1); 686: } 687: 688: return(0); 689: } 690: 1.1.1.8 root 691: /* Parse specific options for the Cisco 2600 platform */ 692: static int cli_parse_c2600_options(vm_instance_t *vm,int option) 693: { 694: c2600_t *router; 695: 696: router = VM_C2600(vm); 697: 698: switch(option) { 699: /* IO memory reserved for NMs (in percents!) */ 700: case OPT_IOMEM_SIZE: 701: router->nm_iomem_size = 0x8000 | atoi(optarg); 702: break; 703: 704: /* Mainboard type */ 705: case 't': 706: c2600_mainboard_set_type(router,optarg); 707: break; 708: 709: /* NM settings */ 710: case 'p': 711: return(c2600_cmd_nm_create(router,optarg)); 712: 713: /* NM NIO settings */ 714: case 's': 715: return(c2600_cmd_add_nio(router,optarg)); 716: 717: /* Unknown option */ 718: default: 719: return(-1); 720: } 721: 722: return(0); 723: } 724: 1.1.1.9 ! root 725: /* Parse specific options for the MSFC1 platform */ ! 726: static int cli_parse_msfc1_options(vm_instance_t *vm,int option) ! 727: { ! 728: msfc1_t *router; ! 729: ! 730: router = VM_MSFC1(vm); ! 731: ! 732: switch(option) { ! 733: /* PA NIO settings */ ! 734: case 's': ! 735: return(msfc1_cmd_add_nio(router,optarg)); ! 736: ! 737: /* Unknown option */ ! 738: default: ! 739: return(-1); ! 740: } ! 741: ! 742: return(0); ! 743: } ! 744: 1.1.1.4 root 745: /* Create a router instance */ 746: static vm_instance_t *cli_create_instance(char *name,int platform_type, 747: int instance_id) 1.1 root 748: { 1.1.1.8 root 749: vm_instance_t *vm; 1.1.1.4 root 750: c7200_t *c7200; 751: c3600_t *c3600; 1.1.1.6 root 752: c2691_t *c2691; 753: c3725_t *c3725; 754: c3745_t *c3745; 1.1.1.8 root 755: c2600_t *c2600; 1.1.1.9 ! root 756: msfc1_t *msfc1; 1.1.1.3 root 757: 1.1.1.4 root 758: switch(platform_type) { 759: case VM_TYPE_C7200: 760: if (!(c7200 = c7200_create_instance(name,instance_id))) { 761: fprintf(stderr,"C7200: unable to create instance!\n"); 762: return NULL; 763: } 764: return(c7200->vm); 1.1 root 765: 1.1.1.4 root 766: case VM_TYPE_C3600: 767: if (!(c3600 = c3600_create_instance(name,instance_id))) { 768: fprintf(stderr,"C3600: unable to create instance!\n"); 769: return NULL; 770: } 771: return(c3600->vm); 1.1 root 772: 1.1.1.6 root 773: case VM_TYPE_C2691: 774: if (!(c2691 = c2691_create_instance(name,instance_id))) { 775: fprintf(stderr,"C2691: unable to create instance!\n"); 776: return NULL; 777: } 778: return(c2691->vm); 779: 780: case VM_TYPE_C3725: 781: if (!(c3725 = c3725_create_instance(name,instance_id))) { 782: fprintf(stderr,"C3725: unable to create instance!\n"); 783: return NULL; 784: } 785: return(c3725->vm); 786: 787: case VM_TYPE_C3745: 788: if (!(c3745 = c3745_create_instance(name,instance_id))) { 789: fprintf(stderr,"C3745: unable to create instance!\n"); 790: return NULL; 791: } 792: return(c3745->vm); 793: 1.1.1.8 root 794: case VM_TYPE_C2600: 795: if (!(c2600 = c2600_create_instance(name,instance_id))) { 796: fprintf(stderr,"C2600: unable to create instance!\n"); 797: return NULL; 798: } 799: return(c2600->vm); 800: 1.1.1.9 ! root 801: case VM_TYPE_MSFC1: ! 802: if (!(msfc1 = msfc1_create_instance(name,instance_id))) { ! 803: fprintf(stderr,"MSFC1: unable to create instance!\n"); ! 804: return NULL; ! 805: } ! 806: return(msfc1->vm); ! 807: 1.1.1.8 root 808: case VM_TYPE_PPC32_TEST: 809: if (!(vm = ppc32_vmtest_create_instance(name,instance_id))) { 810: fprintf(stderr,"PPC32_TEST: unable to create instance!\n"); 811: return NULL; 812: } 813: return(vm); 814: 1.1.1.4 root 815: default: 816: fprintf(stderr,"Unknown platform type '%d'!\n",platform_type); 817: return NULL; 818: } 1.1 root 819: } 820: 1.1.1.4 root 821: /* Parse the command line */ 822: static int parse_std_cmd_line(int argc,char *argv[],int *platform) 1.1 root 823: { 1.1.1.4 root 824: char *options_list = 1.1.1.6 root 825: "r:o:n:c:m:l:C:i:jt:p:s:k:T:U:A:B:a:f:E:b:S:R:M:eXP:N:G:g:"; 1.1.1.4 root 826: vm_instance_t *vm; 827: int instance_id; 828: int res,option; 829: char *str; 1.1 root 830: 1.1.1.4 root 831: /* Get the instance ID */ 832: instance_id = 0; 1.1 root 833: 1.1.1.4 root 834: /* Use the old VM file naming type */ 835: vm_file_naming_type = 1; 1.1 root 836: 1.1.1.4 root 837: if ((str = cli_find_option(argc,argv,"-i"))) { 838: instance_id = atoi(str); 839: printf("Instance ID set to %d.\n",instance_id); 840: } 1.1 root 841: 1.1.1.4 root 842: if ((str = cli_find_option(argc,argv,"-N"))) 843: vm_file_naming_type = atoi(str); 1.1.1.2 root 844: 1.1.1.4 root 845: /* Get the platform type */ 846: *platform = cli_get_platform_type(argc,argv); 847: 848: /* Create the default instance */ 849: if (!(vm = cli_create_instance("default",*platform,instance_id))) 850: exit(EXIT_FAILURE); 1.1 root 851: 852: opterr = 0; 853: 1.1.1.4 root 854: while((option = getopt_long(argc,argv,options_list, 855: cmd_line_lopts,NULL)) != -1) 856: { 1.1 root 857: switch(option) 858: { 1.1.1.4 root 859: /* Instance ID (already managed) */ 860: case 'i': 861: break; 862: 863: /* Platform (already managed) */ 864: case 'P': 865: break; 866: 1.1 root 867: /* RAM size */ 868: case 'r': 1.1.1.4 root 869: vm->ram_size = strtol(optarg, NULL, 10); 870: printf("Virtual RAM size set to %d MB.\n",vm->ram_size); 1.1 root 871: break; 872: 873: /* ROM size */ 874: case 'o': 1.1.1.4 root 875: vm->rom_size = strtol(optarg, NULL, 10); 876: printf("Virtual ROM size set to %d MB.\n",vm->rom_size); 1.1 root 877: break; 878: 879: /* NVRAM size */ 880: case 'n': 1.1.1.4 root 881: vm->nvram_size = strtol(optarg, NULL, 10); 882: printf("NVRAM size set to %d KB.\n",vm->nvram_size); 1.1 root 883: break; 884: 1.1.1.4 root 885: /* Execution area size */ 886: case OPT_EXEC_AREA: 887: vm->exec_area_size = atoi(optarg); 1.1 root 888: break; 889: 1.1.1.4 root 890: /* PCMCIA disk0 size */ 891: case OPT_DISK0_SIZE: 892: vm->pcmcia_disk_size[0] = atoi(optarg); 893: printf("PCMCIA ATA disk0 size set to %u MB.\n", 894: vm->pcmcia_disk_size[0]); 1.1 root 895: break; 896: 1.1.1.4 root 897: /* PCMCIA disk1 size */ 898: case OPT_DISK1_SIZE: 899: vm->pcmcia_disk_size[1] = atoi(optarg); 900: printf("PCMCIA ATA disk1 size set to %u MB.\n", 901: vm->pcmcia_disk_size[1]); 902: break; 903: 904: /* Config Register */ 905: case 'c': 906: vm->conf_reg_setup = strtol(optarg, NULL, 0); 907: printf("Config. Register set to 0x%x.\n",vm->conf_reg_setup); 1.1 root 908: break; 909: 910: /* IOS configuration file */ 911: case 'C': 1.1.1.4 root 912: vm_ios_set_config(vm,optarg); 1.1 root 913: break; 914: 1.1.1.3 root 915: /* Use physical memory to emulate RAM (no-mapped file) */ 916: case 'X': 1.1.1.4 root 917: vm->ram_mmap = 0; 1.1.1.3 root 918: break; 919: 1.1.1.6 root 920: /* Use a ghost file to simulate RAM */ 921: case 'G': 922: vm->ghost_ram_filename = strdup(optarg); 923: vm->ghost_status = VM_GHOST_RAM_USE; 924: break; 925: 926: /* Generate a ghost RAM image */ 927: case 'g': 928: vm->ghost_ram_filename = strdup(optarg); 929: vm->ghost_status = VM_GHOST_RAM_GENERATE; 930: break; 931: 1.1.1.8 root 932: /* Use sparse memory */ 933: case OPT_SPARSE_MEM: 934: vm->sparse_mem = TRUE; 935: break; 936: 1.1 root 937: /* Alternate ROM */ 938: case 'R': 1.1.1.4 root 939: vm->rom_filename = optarg; 1.1 root 940: break; 941: 1.1.1.4 root 942: /* Idle PC */ 943: case OPT_IDLE_PC: 944: vm->idle_pc = strtoull(optarg,NULL,0); 945: printf("Idle PC set to 0x%llx.\n",vm->idle_pc); 1.1 root 946: break; 947: 1.1.1.4 root 948: /* Timer IRQ check interval */ 949: case OPT_TIMER_ITV: 950: vm->timer_irq_check_itv = atoi(optarg); 1.1 root 951: break; 952: 1.1.1.4 root 953: /* Clock divisor */ 954: case 'k': 955: vm->clock_divisor = atoi(optarg); 956: 957: if (!vm->clock_divisor) { 958: fprintf(stderr,"Invalid Clock Divisor specified!\n"); 959: exit(EXIT_FAILURE); 960: } 961: 962: printf("Using a clock divisor of %d.\n",vm->clock_divisor); 1.1.1.3 root 963: break; 964: 1.1.1.4 root 965: /* Disable JIT */ 966: case 'j': 967: vm->jit_use = FALSE; 1.1 root 968: break; 969: 1.1.1.4 root 970: /* VM debug level */ 971: case OPT_VM_DEBUG: 972: vm->debug_level = atoi(optarg); 973: break; 1.1 root 974: 1.1.1.4 root 975: /* Log file */ 976: case 'l': 977: if (!(log_file_name = strdup(optarg))) { 978: fprintf(stderr,"Unable to set log file name.\n"); 1.1 root 979: exit(EXIT_FAILURE); 980: } 1.1.1.4 root 981: printf("Log file: writing to %s\n",log_file_name); 982: break; 1.1 root 983: 1.1.1.4 root 984: #if DEBUG_SYM_TREE 985: /* Symbol file */ 986: case 'S': 987: vm->sym_filename = strdup(optarg); 1.1 root 988: break; 1.1.1.4 root 989: #endif 1.1 root 990: 991: /* TCP server for Console Port */ 992: case 'T': 1.1.1.4 root 993: vm->vtty_con_type = VTTY_TYPE_TCP; 994: vm->vtty_con_tcp_port = atoi(optarg); 995: break; 996: 997: /* Serial interface for Console port */ 998: case 'U': 999: vm->vtty_con_type = VTTY_TYPE_SERIAL; 1000: if (vtty_parse_serial_option(&vm->vtty_con_serial_option,optarg)) { 1001: fprintf(stderr, 1002: "Invalid Console serial interface descriptor!\n"); 1003: exit(EXIT_FAILURE); 1004: } 1.1 root 1005: break; 1006: 1007: /* TCP server for AUX Port */ 1008: case 'A': 1.1.1.4 root 1009: vm->vtty_aux_type = VTTY_TYPE_TCP; 1010: vm->vtty_aux_tcp_port = atoi(optarg); 1011: break; 1012: 1013: /* Serial interface for AUX port */ 1014: case 'B': 1015: vm->vtty_aux_type = VTTY_TYPE_SERIAL; 1016: if (vtty_parse_serial_option(&vm->vtty_aux_serial_option,optarg)) { 1017: fprintf(stderr,"Invalid AUX serial interface descriptor!\n"); 1018: exit(EXIT_FAILURE); 1019: } 1.1 root 1020: break; 1021: 1022: /* Virtual ATM switch */ 1023: case 'a': 1024: if (atmsw_start(optarg) == -1) 1025: exit(EXIT_FAILURE); 1026: break; 1027: 1.1.1.3 root 1028: /* Virtual Frame-Relay switch */ 1029: case 'f': 1030: if (frsw_start(optarg) == -1) 1031: exit(EXIT_FAILURE); 1032: break; 1033: 1.1.1.4 root 1034: /* Virtual Ethernet switch */ 1035: case 'E': 1036: if (ethsw_start(optarg) == -1) 1037: exit(EXIT_FAILURE); 1038: break; 1039: 1.1 root 1040: /* Virtual bridge */ 1041: case 'b': 1042: if (netio_bridge_start(optarg) == -1) 1043: exit(EXIT_FAILURE); 1044: break; 1045: 1.1.1.2 root 1046: #ifdef GEN_ETH 1047: /* Ethernet device list */ 1048: case 'e': 1049: gen_eth_show_dev_list(); 1050: exit(EXIT_SUCCESS); 1051: #endif 1052: 1.1 root 1053: /* Oops ! */ 1054: case '?': 1.1.1.4 root 1055: show_usage(argc,argv,*platform); 1.1 root 1056: exit(EXIT_FAILURE); 1.1.1.4 root 1057: 1058: /* Parse options specific to the platform */ 1059: default: 1060: res = 0; 1061: 1062: switch(vm->type) { 1063: case VM_TYPE_C7200: 1064: res = cli_parse_c7200_options(vm,option); 1065: break; 1066: case VM_TYPE_C3600: 1067: res = cli_parse_c3600_options(vm,option); 1.1.1.6 root 1068: break; 1069: case VM_TYPE_C2691: 1070: res = cli_parse_c2691_options(vm,option); 1071: break; 1072: case VM_TYPE_C3725: 1073: res = cli_parse_c3725_options(vm,option); 1074: break; 1075: case VM_TYPE_C3745: 1076: res = cli_parse_c3745_options(vm,option); 1.1.1.4 root 1077: break; 1.1.1.8 root 1078: case VM_TYPE_C2600: 1079: res = cli_parse_c2600_options(vm,option); 1080: break; 1.1.1.9 ! root 1081: case VM_TYPE_MSFC1: ! 1082: res = cli_parse_msfc1_options(vm,option); ! 1083: break; 1.1.1.4 root 1084: } 1085: 1086: if (res == -1) 1087: exit(EXIT_FAILURE); 1.1 root 1088: } 1089: } 1090: 1091: /* Last argument, this is the IOS filename */ 1092: if (optind == (argc - 1)) { 1093: /* setting IOS image file */ 1.1.1.4 root 1094: vm_ios_set_image(vm,argv[optind]); 1095: printf("IOS image file: %s\n\n",vm->ios_image); 1.1 root 1096: } else { 1097: /* IOS missing */ 1098: fprintf(stderr,"Please specify an IOS image filename\n"); 1.1.1.4 root 1099: show_usage(argc,argv,*platform); 1.1 root 1100: exit(EXIT_FAILURE); 1101: } 1102: 1.1.1.4 root 1103: vm_release(vm); 1104: return(0); 1105: } 1106: 1107: /* 1108: * Run in hypervisor mode with a config file if the "-H" option 1109: * is present in command line. 1110: */ 1111: static int run_hypervisor(int argc,char *argv[]) 1112: { 1113: char *options_list = "H:l:hN:"; 1114: int i,option; 1115: 1116: for(i=1;i<argc;i++) 1117: if (!strcmp(argv[i],"-H")) { 1118: hypervisor_mode = 1; 1119: break; 1.1 root 1120: } 1121: 1.1.1.4 root 1122: /* standard mode with one instance */ 1123: if (!hypervisor_mode) 1124: return(FALSE); 1125: 1126: opterr = 0; 1127: while((option = getopt(argc,argv,options_list)) != -1) { 1128: switch(option) 1129: { 1130: /* Hypervisor TCP port */ 1131: case 'H': 1132: hypervisor_tcp_port = atoi(optarg); 1133: break; 1134: 1135: /* Log file */ 1136: case 'l': 1137: if (!(log_file_name = malloc(strlen(optarg)+1))) { 1138: fprintf(stderr,"Unable to set log file name.\n"); 1139: exit(EXIT_FAILURE); 1140: } 1141: strcpy(log_file_name, optarg); 1142: printf("Log file: writing to %s\n",log_file_name); 1143: break; 1144: 1145: /* VM file naming type */ 1146: case 'N': 1147: vm_file_naming_type = atoi(optarg); 1148: break; 1149: 1150: /* Oops ! */ 1151: case '?': 1152: show_usage(argc,argv,VM_TYPE_C7200); 1153: exit(EXIT_FAILURE); 1154: } 1.1 root 1155: } 1156: 1.1.1.4 root 1157: return(TRUE); 1158: } 1.1 root 1159: 1.1.1.4 root 1160: /* Delete all objects */ 1161: void dynamips_reset(void) 1162: { 1163: printf("Shutdown in progress...\n"); 1.1 root 1164: 1.1.1.6 root 1165: /* Delete all virtual router instances */ 1.1.1.4 root 1166: c7200_delete_all_instances(); 1167: c3600_delete_all_instances(); 1.1.1.6 root 1168: c2691_delete_all_instances(); 1169: c3725_delete_all_instances(); 1170: c3745_delete_all_instances(); 1.1.1.8 root 1171: c2600_delete_all_instances(); 1.1.1.9 ! root 1172: msfc1_delete_all_instances(); 1.1.1.8 root 1173: ppc32_vmtest_delete_all_instances(); 1.1.1.4 root 1174: 1175: /* Delete ATM and Frame-Relay switches + bridges */ 1176: netio_bridge_delete_all(); 1177: atmsw_delete_all(); 1178: frsw_delete_all(); 1179: ethsw_delete_all(); 1.1 root 1180: 1.1.1.4 root 1181: /* Delete all NIO descriptors */ 1182: netio_delete_all(); 1.1 root 1183: 1.1.1.4 root 1184: printf("Shutdown completed.\n"); 1185: } 1.1 root 1186: 1.1.1.4 root 1187: int main(int argc,char *argv[]) 1188: { 1189: vm_instance_t *vm; 1190: int platform,res; 1.1 root 1191: 1.1.1.4 root 1192: /* Default emulation: Cisco 7200 */ 1193: platform = VM_TYPE_C7200; 1.1 root 1194: 1.1.1.4 root 1195: #ifdef PROFILE 1196: atexit(profiler_savestat); 1197: #endif 1198: 1.1.1.8 root 1199: printf("Cisco Router Simulation Platform (version %s)\n",sw_version); 1200: printf("Copyright (c) 2005-2007 Christophe Fillot.\n"); 1.1.1.6 root 1201: printf("Build date: %s %s\n\n",__DATE__,__TIME__); 1.1.1.4 root 1202: 1.1.1.5 root 1203: /* Initialize timers */ 1204: timer_init(); 1205: 1.1.1.4 root 1206: /* Initialize object registry */ 1207: registry_init(); 1208: 1209: /* Initialize ATM module (for HEC checksums) */ 1210: atm_init(); 1211: 1212: /* Initialize CRC functions */ 1213: crc_init(); 1214: 1215: /* Initialize NetIO code */ 1216: netio_rxl_init(); 1217: 1218: /* Initialize NetIO packet filters */ 1219: netio_filter_load_all(); 1220: 1221: /* Initialize VTTY code */ 1222: vtty_init(); 1223: 1224: /* Parse standard command line */ 1225: if (!run_hypervisor(argc,argv)) 1226: parse_std_cmd_line(argc,argv,&platform); 1227: 1228: /* Create general log file */ 1229: create_log_file(); 1230: 1231: /* Periodic tasks initialization */ 1232: if (ptask_init(0) == -1) 1.1 root 1233: exit(EXIT_FAILURE); 1234: 1.1.1.4 root 1235: /* Create instruction lookup tables */ 1236: mips64_jit_create_ilt(); 1237: mips64_exec_create_ilt(); 1.1.1.8 root 1238: ppc32_jit_create_ilt(); 1239: ppc32_exec_create_ilt(); 1.1 root 1240: 1241: setup_signals(); 1242: 1.1.1.4 root 1243: if (!hypervisor_mode) { 1244: /* Initialize the default instance */ 1245: vm = vm_acquire("default"); 1246: assert(vm != NULL); 1247: 1248: switch(platform) { 1249: case VM_TYPE_C7200: 1250: res = c7200_init_instance(VM_C7200(vm)); 1251: break; 1252: case VM_TYPE_C3600: 1253: res = c3600_init_instance(VM_C3600(vm)); 1.1.1.6 root 1254: break; 1255: case VM_TYPE_C2691: 1256: res = c2691_init_instance(VM_C2691(vm)); 1257: break; 1258: case VM_TYPE_C3725: 1259: res = c3725_init_instance(VM_C3725(vm)); 1260: break; 1261: case VM_TYPE_C3745: 1262: res = c3745_init_instance(VM_C3745(vm)); 1.1.1.4 root 1263: break; 1.1.1.8 root 1264: case VM_TYPE_C2600: 1265: res = c2600_init_instance(VM_C2600(vm)); 1266: break; 1.1.1.9 ! root 1267: case VM_TYPE_MSFC1: ! 1268: res = msfc1_init_instance(VM_MSFC1(vm)); ! 1269: break; 1.1.1.8 root 1270: case VM_TYPE_PPC32_TEST: 1271: res = ppc32_vmtest_init_instance(vm); 1272: break; 1.1.1.4 root 1273: default: 1274: res = -1; 1275: } 1276: 1277: if (res == -1) { 1278: fprintf(stderr,"Unable to initialize router instance.\n"); 1279: exit(EXIT_FAILURE); 1280: } 1.1 root 1281: 1.1.1.7 root 1282: #if (DEBUG_INSN_PERF_CNT > 0) || (DEBUG_BLOCK_PERF_CNT > 0) 1.1.1.4 root 1283: { 1.1.1.8 root 1284: m_uint64_t counter,prev = 0,delta; 1.1.1.4 root 1285: while(vm->status == VM_STATUS_RUNNING) { 1.1.1.8 root 1286: counter = cpu_get_perf_counter(vm->boot_cpu); 1287: delta = counter - prev; 1288: prev = counter; 1.1.1.4 root 1289: printf("delta = %llu\n",delta); 1290: sleep(1); 1291: } 1292: } 1293: #else 1294: /* Start instance monitoring */ 1295: vm_monitor(vm); 1296: #endif 1.1 root 1297: 1.1.1.4 root 1298: /* Free resources used by instance */ 1299: vm_release(vm); 1300: } else { 1301: hypervisor_tcp_server(hypervisor_tcp_port); 1302: } 1.1 root 1303: 1.1.1.4 root 1304: dynamips_reset(); 1305: close_log_file(); 1.1 root 1306: return(0); 1307: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.