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

📄 dev_c7200.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
📖 第 1 页 / 共 5 页
字号:
   }   /* Launch the simulation */   printf("\nC7200P '%s': starting simulation (CPU0 IA=0x%8.8x), "          "JIT %sabled.\n",          vm->name,cpu->ia,vm->jit_use ? "en":"dis");   vm_log(vm,"C7200P_BOOT",          "starting instance (CPU0 IA=0x%8.8x,idle_pc=0x%8.8x,JIT %s)\n",          cpu->ia,cpu->idle_pc,vm->jit_use ? "on":"off");      /* Start main CPU */   if (vm->ghost_status != VM_GHOST_RAM_GENERATE) {      vm->status = VM_STATUS_RUNNING;      cpu_start(vm->boot_cpu);   } else {      vm->status = VM_STATUS_SHUTDOWN;   }   return(0);}/* Set an IRQ */static void c7200m_set_irq(vm_instance_t *vm,u_int irq){   c7200_t *router = VM_C7200(vm);   cpu_mips_t *cpu0 = CPU_MIPS64(vm->boot_cpu);   u_int slot,port;   switch(irq) {      case 0 ... 7:         mips64_set_irq(cpu0,irq);         if (cpu0->irq_idle_preempt[irq])            cpu_idle_break_wait(cpu0->gen);         break;      case C7200_NETIO_IRQ_BASE ... C7200_NETIO_IRQ_END:         c7200_net_irq_get_slot_port(irq,&slot,&port);         dev_c7200_mpfpga_net_set_irq(router->mpfpga_data,slot,port);         break;   }}/* Clear an IRQ */static void c7200m_clear_irq(vm_instance_t *vm,u_int irq){   c7200_t *router = VM_C7200(vm);   cpu_mips_t *cpu0 = CPU_MIPS64(vm->boot_cpu);   u_int slot,port;   switch(irq) {      case 0 ... 7:         mips64_clear_irq(cpu0,irq);         break;      case C7200_NETIO_IRQ_BASE ... C7200_NETIO_IRQ_END:         c7200_net_irq_get_slot_port(irq,&slot,&port);         dev_c7200_mpfpga_net_clear_irq(router->mpfpga_data,slot,port);         break;   }}/* Initialize a Cisco 7200 instance (MIPS) */static int c7200m_init_instance(c7200_t *router){   vm_instance_t *vm = router->vm;   m_uint32_t rom_entry_point;   cpu_mips_t *cpu0;   /* Initialize the C7200 platform */   if (c7200m_init_platform(router) == -1) {      vm_error(vm,"unable to initialize the platform hardware.\n");      return(-1);   }   /* IRQ routing */   vm->set_irq = c7200m_set_irq;   vm->clear_irq = c7200m_clear_irq;   /* Load IOS configuration file */   if (vm->ios_config != NULL) {      vm_nvram_push_config(vm,vm->ios_config);      vm->conf_reg &= ~0x40;   }   /* Load ROM (ELF image or embedded) */   cpu0 = CPU_MIPS64(vm->boot_cpu);   rom_entry_point = (m_uint32_t)MIPS_ROM_PC;      if ((vm->rom_filename != NULL) &&       (mips64_load_elf_image(cpu0,vm->rom_filename,0,&rom_entry_point) < 0))   {      vm_error(vm,"unable to load alternate ROM '%s', "               "fallback to embedded ROM.\n\n",vm->rom_filename);      vm->rom_filename = NULL;   }   /* Load symbol file */   if (vm->sym_filename) {      mips64_sym_load_file(cpu0,vm->sym_filename);      cpu0->sym_trace = 1;   }   return(c7200m_boot_ios(router));}/* Set an IRQ */static void c7200p_set_irq(vm_instance_t *vm,u_int irq){   c7200_t *router = VM_C7200(vm);   cpu_ppc_t *cpu0 = CPU_PPC32(vm->boot_cpu);   u_int slot,port;   switch(irq) {      case C7200_VTIMER_IRQ:         ppc32_trigger_timer_irq(cpu0);         break;      case C7200_DUART_IRQ:         dev_mv64460_set_gpp_intr(router->mv64460_sysctr,10);         break;      case C7200_NETIO_IRQ:         dev_mv64460_set_gpp_intr(router->mv64460_sysctr,24);         break;      case C7200_PA_MGMT_IRQ:         dev_mv64460_set_gpp_intr(router->mv64460_sysctr,20);         break;      case C7200_OIR_IRQ:         dev_mv64460_set_gpp_intr(router->mv64460_sysctr,0);         break;      case C7200_NETIO_IRQ_BASE ... C7200_NETIO_IRQ_END:         c7200_net_irq_get_slot_port(irq,&slot,&port);         dev_c7200_mpfpga_net_set_irq(router->mpfpga_data,slot,port);         break;   }   if (vm->irq_idle_preempt[irq])      cpu_idle_break_wait(cpu0->gen);}/* Clear an IRQ */static void c7200p_clear_irq(vm_instance_t *vm,u_int irq){   c7200_t *router = VM_C7200(vm);   u_int slot,port;   switch(irq) {      case C7200_DUART_IRQ:         dev_mv64460_clear_gpp_intr(router->mv64460_sysctr,10);         break;      case C7200_NETIO_IRQ:         dev_mv64460_clear_gpp_intr(router->mv64460_sysctr,24);         break;      case C7200_PA_MGMT_IRQ:         dev_mv64460_clear_gpp_intr(router->mv64460_sysctr,20);         break;      case C7200_OIR_IRQ:          dev_mv64460_clear_gpp_intr(router->mv64460_sysctr,0);         break;      case C7200_NETIO_IRQ_BASE ... C7200_NETIO_IRQ_END:         c7200_net_irq_get_slot_port(irq,&slot,&port);         dev_c7200_mpfpga_net_clear_irq(router->mpfpga_data,slot,port);         break;   }}/* Initialize a Cisco 7200 instance (PowerPC) */static int c7200p_init_instance(c7200_t *router){   vm_instance_t *vm = router->vm;   m_uint32_t rom_entry_point;   cpu_ppc_t *cpu0;   int i;   /* Initialize the C7200 platform */   if (c7200p_init_platform(router) == -1) {      vm_error(vm,"unable to initialize the platform hardware.\n");      return(-1);   }   /* IRQ routing */   vm->set_irq = c7200p_set_irq;   vm->clear_irq = c7200p_clear_irq;   /* Load ROM (ELF image or embedded) */   cpu0 = CPU_PPC32(vm->boot_cpu);   rom_entry_point = (m_uint32_t)PPC32_ROM_START;   if ((vm->rom_filename != NULL) &&       (ppc32_load_elf_image(cpu0,vm->rom_filename,0,&rom_entry_point) < 0))   {      vm_error(vm,"unable to load alternate ROM '%s', "               "fallback to embedded ROM.\n\n",vm->rom_filename);      vm->rom_filename = NULL;   }   /* Initialize the MMU (TEST) */   for(i=0;i<PPC32_SR_NR;i++)      cpu0->sr[i] = i << 16;   ppc32_set_sdr1(cpu0,((vm->ram_size - 2) * 1048576) + 0x1F);   ppc32_init_page_table(cpu0);   ppc32_map_zone(cpu0,cpu0->sr[C7200_G2_BOOTFLASH_ADDR >> 28],                  C7200_G2_BOOTFLASH_ADDR,C7200_G2_BOOTFLASH_ADDR,                  64*1048576,0,0x02);   ppc32_map_zone(cpu0,cpu0->sr[0xD8000000 >> 28],                  0xD8000000,0xD8000000,0x400000,0,0x02);   ppc32_map_zone(cpu0,cpu0->sr[0xDC000000 >> 28],                  0xDC000000,0xDC000000,0x400000,0,0x02);   /* FIXME */   ppc32_map_zone(cpu0,cpu0->sr[0xDF000000 >> 28],                  0xDF000000,0xDF000000,0x400000,0,0x02);   /* INST */   cpu0->bat[PPC32_IBAT_IDX][0].reg[0] = 0x00007FFE;   cpu0->bat[PPC32_IBAT_IDX][0].reg[1] = 0x00000003;   cpu0->bat[PPC32_IBAT_IDX][3].reg[0] = 0xF0001FFE;   cpu0->bat[PPC32_IBAT_IDX][3].reg[1] = 0xF0000003;   /* DATA */   cpu0->bat[PPC32_DBAT_IDX][0].reg[0] = 0x00007FFE;   cpu0->bat[PPC32_DBAT_IDX][0].reg[1] = 0x00000003;   cpu0->bat[PPC32_DBAT_IDX][3].reg[0] = 0xF0001FFE;   cpu0->bat[PPC32_DBAT_IDX][3].reg[1] = 0xF0000003;   return(c7200p_boot_ios(router));}/* Initialize a Cisco 7200 instance */static int c7200_init_instance(vm_instance_t *vm){   c7200_t *router = VM_C7200(vm);   switch(router->npe_driver->npe_family) {      case C7200_NPE_FAMILY_MIPS:         return(c7200m_init_instance(router));      case C7200_NPE_FAMILY_PPC:         return(c7200p_init_instance(router));               default:         vm_error(router->vm,"unsupported NPE family %d",                  router->npe_driver->npe_family);         return(-1);   }}/* Stop a Cisco 7200 instance */static int c7200_stop_instance(vm_instance_t *vm){   printf("\nC7200 '%s': stopping simulation.\n",vm->name);   vm_log(vm,"C7200_STOP","stopping simulation.\n");   /* Stop all CPUs */   if (vm->cpu_group != NULL) {      vm_stop(vm);            if (cpu_group_sync_state(vm->cpu_group) == -1) {         vm_error(vm,"unable to sync with system CPUs.\n");         return(-1);      }   }   /* Free resources that were used during execution to emulate hardware */   c7200_free_hw_ressources(VM_C7200(vm));   vm_hardware_shutdown(vm);   return(0);}/* Trigger an OIR event */int c7200_trigger_oir_event(c7200_t *router,u_int slot_mask){   /* An OIR IRQ without reason could lead to stop the system */   if (!slot_mask) return(-1);   router->oir_status = slot_mask;   vm_set_irq(router->vm,C7200_OIR_IRQ);   return(0);}/* Initialize a new PA while the virtual router is online (OIR) */int c7200_pa_init_online(c7200_t *router,u_int pa_bay){   vm_instance_t *vm = router->vm;   if (!pa_bay) {      vm_error(vm,"OIR not supported on slot 0.\n");      return(-1);   }   /*     * Suspend CPU activity while adding new hardware (since we change the    * memory maps).    */   vm_suspend(vm);   /* Check that CPU activity is really suspended */   if (cpu_group_sync_state(vm->cpu_group) == -1) {      vm_error(vm,"unable to sync with system CPUs.\n");      return(-1);   }   /* Add the new hardware elements */   if (vm_slot_init(vm,pa_bay) == -1)      return(-1);   /* Resume normal operations */   vm_resume(vm);   /* Now, we can safely trigger the OIR event */   c7200_trigger_oir_event(router,1 << pa_bay);   return(0);}/* Stop a PA while the virtual router is online (OIR) */int c7200_pa_stop_online(c7200_t *router,u_int pa_bay){      vm_instance_t *vm = router->vm;   if (!pa_bay) {      vm_error(vm,"OIR not supported on slot 0.\n");      return(-1);   }   /* The PA driver must be initialized */   if (!vm_slot_get_card_ptr(vm,pa_bay)) {      vm_error(vm,"trying to shut down empty slot %u.\n",pa_bay);      return(-1);   }   /* Disable all NIOs to stop traffic forwarding */   vm_slot_disable_all_nio(vm,pa_bay);   /* We can safely trigger the OIR event */   c7200_trigger_oir_event(router,1 << pa_bay);   /*     * Suspend CPU activity while removing the hardware (since we change the    * memory maps).    */   vm_suspend(vm);   /* Device removal */   vm_slot_shutdown(vm,pa_bay);   /* Resume normal operations */   vm_resume(vm);   return(0);}/* Get MAC address MSB */static u_int c7200_get_mac_addr_msb(void){   return(0xCA);}/* Parse specific options for the Cisco 7200 platform */static int c7200_cli_parse_options(vm_instance_t *vm,int option){   c7200_t *router = VM_C7200(vm);   switch(option) {      /* NPE type */      case 't':         c7200_npe_set_type(router,optarg);         break;      /* Midplane type */      case 'M':         c7200_midplane_set_type(router,optarg);         break;      /* Set the base MAC address */      case 'm':         if (!c7200_midplane_set_mac_addr(router,optarg))            printf("MAC address set to '%s'.\n",optarg);         break;      /* Unknown option */      default:         return(-1);   }   return(0);}/* Show specific CLI options */static void c7200_cli_show_options(vm_instance_t *vm){   printf("  -t <npe_type>      : Select NPE type (default: \"%s\")\n"          "  -M <midplane>      : Select Midplane (\"std\" or \"vxr\")\n"          "  -p <pa_desc>       : Define a Port Adapter\n"          "  -s <pa_nio>        : Bind a Network IO interface to a "          "Port Adapter\n",          C7200_DEFAULT_NPE_TYPE);}/* Platform definition */static vm_platform_t c7200_platform = {   "c7200", "C7200", "7200",   c7200_create_instance,   c7200_delete_instance,   c7200_init_instance,   c7200_stop_instance,   c7200_nvram_extract_config,   c7200_nvram_push_config,   c7200_get_mac_addr_msb,   c7200_save_config,   c7200_cli_parse_options,   c7200_cli_show_options,   c7200_npe_show_drivers,};/* Register the c7200 platform */int c7200_platform_register(void){   if (vm_platform_register(&c7200_platform) == -1)      return(-1);   return(hypervisor_c7200_init(&c7200_platform));}

⌨️ 快捷键说明

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