📄 dev_c7200.c
字号:
} /* 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 + -