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

📄 ppc32_vmtest.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
字号:
/* * Cisco router simulation platform. * Copyright (c) 2006 Christophe Fillot (cf@utc.fr) * * PowerPC VM experimentations. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <assert.h>#include "cpu.h"#include "vm.h"#include "dynamips.h"#include "memory.h"#include "device.h"#include "dev_rom.h"#include "pci_io.h"#include "dev_vtty.h"#include "registry.h"#include "net.h"#include "ppc32_mem.h"#include "ppc32_vmtest.h"static struct ppc32_bat_prog bat_array[] = {   { PPC32_IBAT_IDX, 0, 0xfff0001e, 0xfff00001 },   { PPC32_IBAT_IDX, 1, 0x00001ffe, 0x00000001 },   { PPC32_IBAT_IDX, 2, 0x00000000, 0xee3e0072 },   { PPC32_IBAT_IDX, 3, 0x80001ffe, 0x80000001 },   { PPC32_DBAT_IDX, 0, 0x80001ffe, 0x80000042 },   { PPC32_DBAT_IDX, 1, 0x00001ffe, 0x0000002a },   { PPC32_DBAT_IDX, 2, 0x60001ffe, 0x6000002a },   { PPC32_DBAT_IDX, 3, 0xfc0007fe, 0xfc00002a },   { -1, -1, 0, 0 },};/* Create a new router instance */static int ppc32_vmtest_create_instance(vm_instance_t *vm){   vm->ram_size = PPC32_VMTEST_DEFAULT_RAM_SIZE;   return(0);}/* Free resources used by a test instance */static int ppc32_vmtest_delete_instance(vm_instance_t *vm){   /* 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(FALSE);      }   }   /* Free all resources used by VM */   vm_free(vm);   return(TRUE);}/* Set IRQ line */static void ppc32_vmtest_set_irq(vm_instance_t *vm,u_int irq){   cpu_ppc_t *cpu = CPU_PPC32(vm->boot_cpu);   cpu->irq_check = cpu->irq_pending = TRUE;}/* Clear IRQ line */static void ppc32_vmtest_clear_irq(vm_instance_t *vm,u_int irq){   cpu_ppc_t *cpu = CPU_PPC32(vm->boot_cpu);   cpu->irq_check = cpu->irq_pending = FALSE;}/* Initialize the PPC32 VM test Platform */static int ppc32_vmtest_init_platform(vm_instance_t *vm){   cpu_ppc_t *cpu0;    cpu_gen_t *gen0;   /* Create Console and AUX ports */   vm_init_vtty(vm);   /* Create a CPU group */   vm->cpu_group = cpu_group_create("System CPU");   /* Initialize the virtual PowerPC processor */   if (!(gen0 = cpu_create(vm,CPU_TYPE_PPC32,0))) {      vm_error(vm,"unable to create CPU0!\n");      return(-1);   }   cpu0 = CPU_PPC32(gen0);   /* Enable as PowerPC 405 */   //ppc32_set_pvr(cpu0,PPC32_PVR_405 | 0x0102);   /* Add this CPU to the system CPU group */   cpu_group_add(vm->cpu_group,gen0);   vm->boot_cpu = gen0;   /* Set IRQ vectors */   vm->set_irq   = ppc32_vmtest_set_irq;   vm->clear_irq = ppc32_vmtest_clear_irq;#if 0   {      vm_obj_t *obj;   /* Initialize ROM (as a Flash) */   if (!(obj = dev_flash_init(vm,"rom",0xFF000000,16*1048576)))      return(-1);   dev_flash_copy_data(obj,0x0F00000,ppc32_microcode,ppc32_microcode_len);   }#endif   //dev_bootflash_init(vm,"bootflash",0xFF000000,8*1048576);#if 1   /* Initialize ROM */   if (!vm->rom_filename) {      /* use embedded ROM */      dev_rom_init(vm,"rom",0xFFF00000,512*1024,                   ppc32_microcode,ppc32_microcode_len);   } else {      /* use alternate ROM */      dev_ram_init(vm,"rom",TRUE,TRUE,NULL,FALSE,                   0xFFF00000,512*1024);   }#endif   dev_ram_init(vm,"nvram",TRUE,FALSE,NULL,FALSE,                0x67c00000,vm->nvram_size*4096);   dev_ns16552_init(vm,0xffe00000,0x1000,0,0,vm->vtty_con,vm->vtty_aux);   /* Remote emulator control */   dev_remote_control_init(vm,0xf6000000,0x1000);   /* Initialize RAM */   vm_ram_init(vm,0x00000000);   /* RAM aliasing */   dev_create_ram_alias(vm,"ram_alias","ram",0x80000000,vm->ram_size*1048576);   /* Display the device list */   dev_show_list(vm);   return(0);}/* Boot the RAW image */static int ppc32_vmtest_boot_raw(vm_instance_t *vm){      cpu_ppc_t *cpu;   if (!vm->boot_cpu)      return(-1);   /* Suspend CPU activity since we will restart directly from ROM */   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);   }   /* Reset the boot CPU */   cpu = CPU_PPC32(vm->boot_cpu);   ppc32_reset(cpu);   /* Load RAW image */   if (ppc32_load_raw_image(cpu,vm->ios_image,0xFFF00000) < 0) {      vm_error(vm,"failed to load RAW image '%s'.\n",vm->ios_image);      return(-1);   }   cpu->ia = 0xFFF00100;   cpu->gpr[1] = 0x2000;   /* Launch the simulation */   printf("\nPPC32_VMTEST '%s': starting simulation (CPU0 IA=0x%8.8x), "          "JIT %sabled.\n",          vm->name,cpu->ia,vm->jit_use ? "en":"dis");   vm_log(vm,"PPC32_VMTEST_BOOT",          "starting instance (CPU0 IA=0x%8.8x,JIT %s)\n",          cpu->ia,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);}/* Boot the ELF image */static int ppc32_vmtest_boot_elf(vm_instance_t *vm){        m_uint32_t rom_entry_point;   cpu_ppc_t *cpu;   if (!vm->boot_cpu)      return(-1);   /* Suspend CPU activity since we will restart directly from ROM */   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);   }   /* Reset the boot CPU */   cpu = CPU_PPC32(vm->boot_cpu);   ppc32_reset(cpu);   /* Load ROM (ELF image or embedded) */   cpu = CPU_PPC32(vm->boot_cpu);   rom_entry_point = (m_uint32_t)PPC32_ROM_START;   if ((vm->rom_filename != NULL) &&       (ppc32_load_elf_image(cpu,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 ELF image */   if (ppc32_load_elf_image(cpu,vm->ios_image,                            (vm->ghost_status == VM_GHOST_RAM_USE),                            &vm->ios_entry_point) < 0)   {      vm_error(vm,"failed to load ELF image '%s'.\n",vm->ios_image);      return(-1);   }   /* Launch the simulation */   printf("\nPPC32_VMTEST '%s': starting simulation (CPU0 IA=0x%8.8x), "          "JIT %sabled.\n",          vm->name,cpu->ia,vm->jit_use ? "en":"dis");   vm_log(vm,"PPC32_VMTEST_BOOT",          "starting instance (CPU0 IA=0x%8.8x,JIT %s)\n",          cpu->ia,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);}/* Initialize a test instance */static int ppc32_vmtest_init_instance(vm_instance_t *vm){   /* Initialize the test platform */   if (ppc32_vmtest_init_platform(vm) == -1) {      vm_error(vm,"unable to initialize the platform hardware.\n");      return(-1);   }   /* Load BAT registers */   ppc32_load_bat_array(CPU_PPC32(vm->boot_cpu),bat_array);   return(ppc32_vmtest_boot_elf(vm));}/* Stop a test instance */static int ppc32_vmtest_stop_instance(vm_instance_t *vm){   printf("\nPPC32_VMTEST '%s': stopping simulation.\n",vm->name);   vm_log(vm,"PPC32_VMTEST_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 */   vm_hardware_shutdown(vm);   return(0);}/* Platform definition */static vm_platform_t ppc32_vmtest_platform = {   "ppc32_test", "PPC32_VMTEST", "PPC32_TEST",   ppc32_vmtest_create_instance,   ppc32_vmtest_delete_instance,   ppc32_vmtest_init_instance,   ppc32_vmtest_stop_instance,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,};/* Register the ppc32_vmtest platform */int ppc32_vmtest_platform_register(void){   return(vm_platform_register(&ppc32_vmtest_platform));}

⌨️ 快捷键说明

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