コード例 #1
0
ファイル: loader.c プロジェクト: nohajc/.KEK-on-Rails
bool kexe_load_sym(FILE *f, symbol_t *sym) {
	/* size_t fread_result; */
	sym->name = kexe_load_string(f);
	if (sym->name == NULL) {
		vm_error("sym->name failed\n");
		return (false);
	} else {
		vm_debug(DBG_LOADING, "loaded symbol = \"%s\"\n", sym->name);
	}

	sym->addr = kexe_load_uint32(f);
	if (sym->addr == UINT32_MAX) {
		vm_error("sym->addr failed\n");
		return (false);
	} else {
		vm_debug(DBG_LOADING, "addr of symbol \"%s\" is " P32 "\n", sym->name,
				sym->addr);
	}

	sym->const_ptr = kexe_load_uint32(f);
	if (sym->const_ptr == UINT32_MAX) {
		vm_error("sym->const_ptr failed\n");
		return (false);
	} else {
		vm_debug(DBG_LOADING, "const ptr of symbol \"%s\" is " P32 "\n",
				sym->name, sym->const_ptr);
	}

	sym->const_flag = sym->const_ptr != 0; /* this could work */

	return (true);
}
コード例 #2
0
/* Remove a slot binding */
int vm_slot_remove_binding(vm_instance_t *vm,u_int slot_id,u_int port_id)
{
   struct cisco_card **rc,*sc;
   u_int i,real_port_id;

   if (vm_slot_get_info(vm,slot_id,port_id,&rc,&real_port_id) == -1)
      return(-1);

   if (*rc == NULL)
      return(-1);

   if ((*rc)->drv_info != NULL) {
      vm_error(vm,"slot %u/%u is still active\n",slot_id,port_id);
      return(-1);
   }

   for(i=0;i<CISCO_CARD_MAX_SUBSLOTS;i++) {
      if ((sc = (*rc)->sub_slots[i]) != NULL) {
         vm_error(vm,"sub-slot %u/%u is still active\n",
                  slot_id,sc->subslot_id);
         return(-1);
      }
   }

   /* Remove all NIOs bindings */ 
   vm_slot_remove_all_nio_bindings(vm,slot_id);

   /* Free the card info structure */
   free(*rc);
   *rc = NULL;
   return(0);
}
コード例 #3
0
ファイル: a2_vm.c プロジェクト: eagles125/A2
// set value
static inline void _vm_setvalue(struct a2_vm* vm_p){
	struct a2_obj* _c = callinfo_sfreg(curr_ci, ir_ga(curr_ir));
	struct a2_obj* _k = _getvalue(vm_p, ir_gb(curr_ir));
	struct a2_obj* _v = _getvalue(vm_p, ir_gc(curr_ir));
	struct a2_obj* __d = NULL;
	switch(obj_t(_c)){
		case A2_TARRAY:
	 		if(obj_t(_k)!=A2_TNUMBER)
	 			vm_error("the key is must number at set array.");
			__d = a2_array_get(a2_gcobj2array(obj_vX(_c, obj)), _k);
			if(!__d)  goto SVALUE_ERROR;
			*__d = *_v;
			break;
		case A2_TMAP:
			if(obj_t(_k)!=A2_TNUMBER && obj_t(_k)!=A2_TSTRING)
				vm_error("the key is must number or string at set map.");
			__d = a2_map_query(a2_gcobj2map(obj_vX(_c, obj)), _k);
			if(!__d) goto SVALUE_ERROR;
			*__d = *_v;
			break;
		default:
			vm_error("the varable is not map or array.");
	}

 	curr_pc++;
 	return;
 SVALUE_ERROR:
 	vm_error("the key is overfllow.");
}
コード例 #4
0
ファイル: dev_c1700.c プロジェクト: GNS3/dynamips
/* Set mainboard type */
int c1700_mainboard_set_type(c1700_t *router,char *mainboard_type)
{
   struct c1700_mb_id *mb_info;

   if (router->vm->status == VM_STATUS_RUNNING) {
      vm_error(router->vm,"unable to change mainboard type when online.\n");
      return(-1);
   }

   if (!(mb_info = c1700_get_mb_info(mainboard_type))) {
      vm_error(router->vm,"unknown mainboard '%s'\n",mainboard_type);
      return(-1);
   }

   router->mainboard_type = mainboard_type;

   /* Set the cookie */
   memcpy(router->vm->chassis_cookie,
          eeprom_c1700_mb_data,sizeof(eeprom_c1700_mb_data));

   router->vm->chassis_cookie[6] = mb_info->id;

   /* Set the chassis base MAC address */
   c1700_burn_mac_addr(router,&router->mac_addr);

   /* Set the mainboard driver */
   if (vm_slot_active(router->vm,0,0))
      vm_slot_remove_binding(router->vm,0,0);

   vm_slot_add_binding(router->vm,mb_info->mb_driver,0,0);
   c1700_refresh_systemid(router);

   return(0);
}
コード例 #5
0
ファイル: ppc32_vmtest.c プロジェクト: Legun/dynamips
/* 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);
}
コード例 #6
0
ファイル: cisco_card.c プロジェクト: Legun/dynamips
/* Initialize a card */
static inline
int cisco_card_init(vm_instance_t *vm,struct cisco_card *card,u_int id)
{  
   size_t len;

   /* Check that a device type is defined for this card */
   if (!card || !card->dev_type || !card->driver)
      return(-1);

   /* Allocate device name */
   len = strlen(card->dev_type) + 10;
   if (!(card->dev_name = malloc(len))) {
      vm_error(vm,"unable to allocate device name.\n");
      return(-1);
   }

   snprintf(card->dev_name,len,"%s(%u)",card->dev_type,id);

   /* Initialize card driver */
   if (card->driver->card_init(vm,card) == -1) {
      vm_error(vm,"unable to initialize card type '%s' (id %u)\n",
               card->dev_type,id);
      return(-1);
   }

   return(0);
}
コード例 #7
0
ファイル: dev_c1700.c プロジェクト: GNS3/dynamips
/* Boot the IOS image */
static int c1700_boot_ios(c1700_t *router)
{   
   vm_instance_t *vm = router->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);

   /* Adjust stack pointer */
   cpu->gpr[1] |= 0x80000000;

   /* Load BAT registers */
   printf("Loading BAT registers\n");
   ppc32_load_bat_array(cpu,bat_array);
   cpu->msr |= PPC32_MSR_IR|PPC32_MSR_DR;

   /* IRQ routing */
   vm->set_irq = c1700_set_irq;
   vm->clear_irq = c1700_clear_irq;

   /* Load IOS 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 Cisco IOS image '%s'.\n",vm->ios_image);
      return(-1);
   }

   /* Launch the simulation */
   printf("\nC1700 '%s': starting simulation (CPU0 IA=0x%8.8x), "
          "JIT %sabled.\n",
          vm->name,cpu->ia,vm->jit_use ? "en":"dis");

   vm_log(vm,"C1700_BOOT",
          "starting instance (CPU0 PC=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);
}
コード例 #8
0
ファイル: loader.c プロジェクト: nohajc/.KEK-on-Rails
char *kexe_load_string(FILE *f) {
	uint32_t len;
	uint32_t i;
	char *string;
	size_t fread_result;

	assert(sizeof(char) == sizeof(uint8_t));

	len = kexe_load_uint32(f);
	if (len == UINT32_MAX) {
		vm_error("Failed to read the \"len\" of the string.\n");
		return (NULL);
	} else {
		vm_debug(DBG_LOADING, "Length of the string is " P32 "\n", len);
	}

	string = malloc((len + 1) * sizeof(char));
	assert(string);

	fread_result = fread(string, sizeof(char), len, f);
	if (fread_result != len) {
		vm_error("Reading of \"string\" has failed. len="
		P32 ", fread_result=%zu\n", len, fread_result);
		return (NULL);
	}

	string[len] = '\0';
	assert(strlen(string) == (size_t )len);

	vm_debug(DBG_LOADING, "str=\"%s\", len=%d\n", string, strlen(string));

	return (string);
}
コード例 #9
0
ファイル: dev_vtty.c プロジェクト: GNS3/dynamips
/* Accept a TCP connection */
static int vtty_tcp_conn_accept(vtty_t *vtty, int nsock)
{
   int fd,*fd_slot;
   u_int i;
   
   if (fd_pool_get_free_slot(&vtty->fd_pool,&fd_slot) < 0) {
      vm_error(vtty->vm,"unable to create a new VTTY TCP connection\n");
      return(-1);
   }
   
   if ((fd = accept(vtty->fd_array[nsock],NULL,NULL)) < 0) {
      vm_error(vtty->vm,"vtty_tcp_conn_accept: accept on port %d failed %s\n",
              vtty->tcp_port,strerror(errno));
      return(-1);
   }

   /* Register the new FD */
   *fd_slot = fd;

   vm_log(vtty->vm,"VTTY","%s is now connected (accept_fd=%d,conn_fd=%d)\n",
          vtty->name,vtty->fd_array[nsock],fd);

   /* Adapt Telnet settings */
   if (vtty->terminal_support) {      
      vtty_telnet_do_ttype(fd);
      vtty_telnet_will_echo(fd);
      vtty_telnet_will_suppress_go_ahead(fd);
      vtty_telnet_dont_linemode(fd);
      vtty->input_state = VTTY_INPUT_TEXT;
   }

   if (telnet_message_ok == 1) {
      fd_printf(fd,0,
                "Connected to Dynamips VM \"%s\" (ID %u, type %s) - %s\r\n"
                "Press ENTER to get the prompt.\r\n", 
                vtty->vm->name, vtty->vm->instance_id, vm_get_type(vtty->vm),
                vtty->name);
      /* replay old text */
      for (i = vtty->replay_ptr; i < VTTY_BUFFER_SIZE; i++) {
         if (vtty->replay_buffer[i] != 0) {
            send(fd,&vtty->replay_buffer[i],VTTY_BUFFER_SIZE-i,0);
            break;
         }
      }
      for (i = 0; i < vtty->replay_ptr; i++) {
         if (vtty->replay_buffer[i] != 0) {
            send(fd,&vtty->replay_buffer[i],vtty->replay_ptr-i,0);
            break;
         }
      }
      /* warn if not running */
      if (vtty->vm->status != VM_STATUS_RUNNING)
         fd_printf(fd,0,"\r\n!!! WARNING - VM is not running, will be unresponsive (status=%d) !!!\r\n",vtty->vm->status);
      vtty_flush(vtty);
   }
   return(0);
}
コード例 #10
0
/* Directly extract the configuration from the NVRAM device */
static ssize_t c3725_nvram_extract_config(vm_instance_t *vm,u_char **buffer)
{   
   u_char *base_ptr,*ios_ptr,*cfg_ptr,*end_ptr;
   m_uint32_t start,nvlen;
   m_uint16_t magic1,magic2; 
   struct vdevice *nvram_dev;
   off_t nvram_size;
   int fd;

   if ((nvram_dev = dev_get_by_name(vm,"rom")))
      dev_sync(nvram_dev);

   fd = vm_mmap_open_file(vm,"rom",&base_ptr,&nvram_size);

   if (fd == -1)
      return(-1);

   ios_ptr = base_ptr + C3725_NVRAM_OFFSET;
   end_ptr = base_ptr + nvram_size;

   if ((ios_ptr + 0x30) >= end_ptr) {
      vm_error(vm,"NVRAM file too small\n");
      return(-1);
   }

   magic1  = ntohs(*PTR_ADJUST(m_uint16_t *,ios_ptr,0x06));
   magic2  = ntohs(*PTR_ADJUST(m_uint16_t *,ios_ptr,0x08));

   if ((magic1 != 0xF0A5) || (magic2 != 0xABCD)) {
      vm_error(vm,"unable to find IOS magic numbers (0x%x,0x%x)!\n",
               magic1,magic2);
      return(-1);
   }

   start = ntohl(*PTR_ADJUST(m_uint32_t *,ios_ptr,0x10)) + 1;
   nvlen = ntohl(*PTR_ADJUST(m_uint32_t *,ios_ptr,0x18));

   if (!(*buffer = malloc(nvlen+1))) {
      vm_error(vm,"unable to allocate config buffer (%u bytes)\n",nvlen);
      return(-1);
   }

   cfg_ptr = ios_ptr + start + 0x08;

   if ((cfg_ptr + nvlen) > end_ptr) {
      vm_error(vm,"NVRAM file too small\n");
      return(-1);
   }

   memcpy(*buffer,cfg_ptr,nvlen-1);
   (*buffer)[nvlen-1] = 0;
   return(nvlen-1);
}
コード例 #11
0
ファイル: loader.c プロジェクト: nohajc/.KEK-on-Rails
bool kexe_load_method(FILE *f, method_t **method) {
	*method = malloc(sizeof(method_t));
	assert(*method);
	(*method)->name = kexe_load_string(f);
	if ((*method)->name == NULL) {
		vm_error("loading method.name failed\n");
		return (false);
	} else {
		vm_debug(DBG_LOADING, "method.name = \"%s\"\n", (*method)->name);
	}

	(*method)->args_cnt = kexe_load_uint32(f);
	if ((*method)->args_cnt == UINT32_MAX) {
		vm_error("Reading of method.args_cnt has failed.\n");
		return (false);
	} else {
		vm_debug(DBG_LOADING, "method.args_cnt = " P32 "\n",
				(*method)->args_cnt);
	}

	(*method)->locals_cnt = kexe_load_uint32(f);
	if ((*method)->locals_cnt == UINT32_MAX) {
		vm_error("Reading of method.locals_cnt has failed.\n");
		return (false);
	} else {
		vm_debug(DBG_LOADING, "method.locals_cnt = " P32 "\n",
				(*method)->locals_cnt);
	}

	(*method)->entry.bc_addr = kexe_load_uint32(f);
	if ((*method)->entry.bc_addr == UINT32_MAX) {
		vm_error("Reading of method.entry.bc_addr has failed.\n");
		return (false);
	} else {
		vm_debug(DBG_LOADING, "method.entry.bc_addr = " P32 "\n",
				(*method)->entry.bc_addr);
	}

	(*method)->is_static = kexe_load_uint8(f);
	if ((*method)->is_static == UINT8_MAX) {
		vm_error("Reading of methods.is_static has failed.\n");
		return (false);
	} else {
		vm_debug(DBG_LOADING, "method.is_static = " P8 "\n",
				(*method)->is_static);
	}
	(*method)->is_native = false;

	return (true);
}
コード例 #12
0
ファイル: loader.c プロジェクト: nohajc/.KEK-on-Rails
bool kexe_load_magic(FILE *f) {
	uint32_t kek_magic;
	kek_magic = kexe_load_uint32(f);
	if (kek_magic == UINT32_MAX) {
		vm_error("Failed to load first 32 bits for magic number.\n");
		return (false);
	}

	if (kek_magic != KEK_MAGIC) {
		vm_error("Loaded magic number is not 0x%08x.\n", KEK_MAGIC);
		return false;
	}

	return (true);
}
コード例 #13
0
ファイル: dev_c3725.c プロジェクト: GNS3/dynamips
/* Boot the IOS image */
static int c3725_boot_ios(c3725_t *router)
{   
   vm_instance_t *vm = router->vm;
   cpu_mips_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_MIPS64(vm->boot_cpu);
   mips64_reset(cpu);

   /* Load IOS image */
   if (mips64_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 Cisco IOS image '%s'.\n",vm->ios_image);
      return(-1);
   }

   /* Launch the simulation */
   printf("\nC3725 '%s': starting simulation (CPU0 PC=0x%llx), "
          "JIT %sabled.\n",
          vm->name,cpu->pc,vm->jit_use ? "en":"dis");

   vm_log(vm,"C3725_BOOT",
          "starting instance (CPU0 PC=0x%llx,idle_pc=0x%llx,JIT %s)\n",
          cpu->pc,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);
}
コード例 #14
0
/* Add a network IO binding */
int vm_slot_add_nio_binding(vm_instance_t *vm,u_int slot_id,u_int port_id,
                            char *nio_name)
{
   struct cisco_nio_binding *nb;
   struct cisco_card *card,*rc;
   u_int real_port_id;
   netio_desc_t *nio;

   if (!(card = vm_slot_get_card_ptr(vm,slot_id)))
      return(-1);

   /* Get the real card (in case this is a sub-slot) */
   real_port_id = vm_slot_translate_port_id(vm,slot_id,port_id,&rc);

   if (rc == NULL)
      return(-1);

   /* check that a NIO is not already bound to this port */
   if (cisco_card_find_nio_binding(rc,real_port_id) != NULL) {
      vm_error(vm,"a NIO already exists for interface %u/%u.\n",
               slot_id,port_id);
      return(-1);
   }

   /* acquire a reference on the NIO object */
   if (!(nio = netio_acquire(nio_name))) {
      vm_error(vm,"unable to find NIO '%s'.\n",nio_name);
      return(-1);
   }

   /* create a new binding */
   if (!(nb = malloc(sizeof(*nb)))) {
      vm_error(vm,"unable to create NIO binding for interface %u/%u.\n",
               slot_id,port_id);
      netio_release(nio_name);
      return(-1);
   }

   memset(nb,0,sizeof(*nb));
   nb->nio          = nio;
   nb->port_id      = real_port_id;
   nb->orig_port_id = port_id;

   nb->next = rc->nio_list;
   if (nb->next) nb->next->prev = nb;
   rc->nio_list = nb;
   return(0);
}
コード例 #15
0
/* Create a Network Module (command line) */
int vm_slot_cmd_create(vm_instance_t *vm,char *str)
{
   char *tokens[SLOT_DESC_MAX_TOKENS];
   int i,count,res;
   u_int slot_id,port_id;

   /* A port adapter description is like "1:0:NM-1FE" */
   count = m_strsplit(str,':',tokens,SLOT_DESC_MAX_TOKENS);

   if ((count < 2) || (count > 3)) {
      vm_error(vm,"unable to parse slot description '%s'.\n",str);
      return(-1);
   }

   /* Parse the slot id */
   slot_id = atoi(tokens[0]);

   /* Parse the sub-slot id */
   if (count == 3)
      port_id = atoi(tokens[1]);
   else
      port_id = 0;

   /* Add this new slot to the current slot list */
   res = vm_slot_add_binding(vm,tokens[count-1],slot_id,port_id);

   /* The complete array was cleaned by strsplit */
   for(i=0;i<SLOT_DESC_MAX_TOKENS;i++)
      free(tokens[i]);

   return(res);
}
コード例 #16
0
ファイル: vm.c プロジェクト: ShiningDrops/dynamips
/* Extract IOS configuration from NVRAM and write it to a file */
int vm_nvram_extract_config(vm_instance_t *vm,char *filename)
{
   u_char *cfg_buffer = NULL;
   size_t cfg_len;
   FILE *fd;

   if (!vm->platform->nvram_extract_config)
      return(-1);

   /* Extract the IOS configuration */
   if ((vm->platform->nvram_extract_config(vm,&cfg_buffer,&cfg_len,NULL,NULL)) || 
       (cfg_buffer == NULL))
      return(-1);

   /* Write configuration to the specified filename */
   if (!(fd = fopen(filename,"w"))) {
      vm_error(vm,"unable to create file '%s'\n",filename);
      free(cfg_buffer);
      return(-1);
   }

   fwrite(cfg_buffer,cfg_len,1,fd);

   fclose(fd);
   free(cfg_buffer);
   return(0);
}
コード例 #17
0
ファイル: dev_c3725.c プロジェクト: GNS3/dynamips
/* Create the two main PCI busses for a GT64120 based system */
static int c3725_init_gt96100(c3725_t *router)
{
   vm_instance_t *vm = router->vm;
   vm_obj_t *obj;

   vm->pci_bus[0] = pci_bus_create("PCI bus #0",0);
   vm->pci_bus[1] = pci_bus_create("PCI bus #1",0);

   if (!vm->pci_bus[0] || !vm->pci_bus[1]) {
      vm_error(router->vm,"unable to create PCI data.\n");
      return(-1);
   }
   
   if (dev_gt96100_init(vm,"gt96100",C3725_GT96K_ADDR,0x200000,
                        C3725_GT96K_IRQ,
                        C3725_EXT_IRQ,
                        c3725_net_irq_for_slot_port(0,0),
                        255) == -1)
      return(-1);

   if (!(obj = vm_object_find(router->vm,"gt96100")))
      return(-1);

   router->gt_data = obj->data;
   return(0);
}
コード例 #18
0
ファイル: dev_c3725.c プロジェクト: GNS3/dynamips
/* Set the base MAC address of the chassis */
static int c3725_burn_mac_addr(c3725_t *router,n_eth_addr_t *addr)
{
   m_uint8_t eeprom_ver;
   size_t offset;

   /* Read EEPROM format version */
   cisco_eeprom_get_byte(&router->mb_eeprom,0,&eeprom_ver);

   switch(eeprom_ver) {
      case 0:
         cisco_eeprom_set_region(&router->mb_eeprom,2,addr->eth_addr_byte,6);
         break;

      case 4:
         if (!cisco_eeprom_v4_find_field(&router->mb_eeprom,0xC3,&offset)) {
            cisco_eeprom_set_region(&router->mb_eeprom,offset,
                                    addr->eth_addr_byte,6);
         }
         break;

      default:
         vm_error(router->vm,"c3725_burn_mac_addr: unable to handle "
                  "EEPROM version %u\n",eeprom_ver);
         return(-1);
   }

   return(0);
}
コード例 #19
0
ファイル: dev_c3725.c プロジェクト: GNS3/dynamips
/* Free resources used by a router instance */
static int c3725_delete_instance(vm_instance_t *vm)
{
   c3725_t *router = VM_C3725(vm);
   int i;

   /* 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);
      }
   }

   /* Remove NIO bindings */
   for(i=0;i<vm->nr_slots;i++)
      vm_slot_remove_all_nio_bindings(vm,i);

   /* Shutdown all Network Modules */
   vm_slot_shutdown_all(vm);

   /* Free mainboard EEPROM */
   cisco_eeprom_free(&router->mb_eeprom);

   /* Free all resources used by VM */
   vm_free(vm);

   /* Free the router structure */
   free(router);
   return(TRUE);
}
コード例 #20
0
ファイル: dev_c7200_eth.c プロジェクト: GNS3/dynamips
/*
 * dev_c7200_pa_ge_init()
 *
 * Add a PA-GE port adapter into specified slot.
 */
static int dev_c7200_pa_ge_init(vm_instance_t *vm,struct cisco_card *card)
{
   struct pa_i8254x_data *data;
   u_int slot = card->slot_id;

   /* Allocate the private data structure for the PA-2FE-TX */
   if (!(data = malloc(sizeof(*data)))) {
      vm_error(vm,"%s: out of memory\n",card->dev_name);
      return(-1);
   }

   /* 2 Ethernet ports */
   memset(data,0,sizeof(*data));
   data->nr_port = 1;

   /* Set the PCI bus */
   card->pci_bus = vm->slots_pci_bus[slot];

   /* Set the EEPROM */
   cisco_card_set_eeprom(vm,card,cisco_eeprom_find_pa("PA-GE"));
   c7200_set_slot_eeprom(VM_C7200(vm),slot,&card->eeprom);

   /* Create the Intel i8254x chip */
   data->port[0] = dev_i8254x_init(vm,card->dev_name,0,
                                   card->pci_bus,0,
                                   c7200_net_irq_for_slot_port(slot,0));

   /* Store device info into the router structure */
   card->drv_info = data;
   return(0);
}
コード例 #21
0
ファイル: dev_vtty.c プロジェクト: GNS3/dynamips
/* Put char to vtty */
void vtty_put_char(vtty_t *vtty, char ch)
{
   switch(vtty->type) {
      case VTTY_TYPE_NONE:
         break;

      case VTTY_TYPE_TERM:
      case VTTY_TYPE_SERIAL:
         if (write(vtty->fd_array[0],&ch,1) != 1) {
            vm_log(vtty->vm,"VTTY","%s: put char 0x%x failed (%s)\n",
                   vtty->name,(int)ch,strerror(errno));
         }
         break;

      case VTTY_TYPE_TCP:
         fd_pool_send(&vtty->fd_pool,&ch,1,0);
         break;

      default:
         vm_error(vtty->vm,"vtty_put_char: bad vtty type %d\n",vtty->type);
         exit(1);
   }

   /* store char for replay */
   vtty->replay_buffer[vtty->replay_ptr] = ch;

   ++vtty->replay_ptr;
   if (vtty->replay_ptr == VTTY_BUFFER_SIZE)
      vtty->replay_ptr = 0;
}
コード例 #22
0
ファイル: dev_c7200_eth.c プロジェクト: GNS3/dynamips
/*
 * dev_c7200_iocard_init()
 *
 * Add an IOcard into slot 0.
 */
static int dev_c7200_iocard_init(vm_instance_t *vm,struct cisco_card *card)
{
   struct dec21140_data *data;
   u_int slot = card->slot_id;

   if (slot != 0) {
      vm_error(vm,"cannot put IOCARD in PA bay %u!\n",slot);
      return(-1);
   }

   /* Set the PCI bus */
   card->pci_bus = vm->slots_pci_bus[slot];

   /* Set the EEPROM */
   cisco_card_set_eeprom(vm,card,&eeprom_c7200_io_fe);
   c7200_set_slot_eeprom(VM_C7200(vm),slot,&card->eeprom);

   /* Create the DEC21140 chip */
   data = dev_dec21140_init(vm,card->dev_name,
                            card->pci_bus,
                            VM_C7200(vm)->npe_driver->dec21140_pci_dev,
                            c7200_net_irq_for_slot_port(slot,0));
   if (!data) return(-1);

   /* Store device info into the router structure */
   card->drv_info = data;
   return(0);
}
コード例 #23
0
ファイル: vm.c プロジェクト: nohajc/.KEK-on-Rails
static char *vm_debug_flag(uint32_t flag) {
	switch (flag) {
	case DBG_LOADING:
		return ("loading");
	case DBG_BC:
		return ("bc");
	case DBG_STACK:
		return ("stack");
	case DBG_STACK_FULL:
		return ("stack_full");
	case DBG_VM:
		return ("vm");
	case DBG_GC:
		return ("gc");
	case DBG_MEM:
		return ("mem");
	case DBG_OBJ_TBL:
		return ("obj_tbl");
	case DBG_GC_STATS:
		return ("gc stats");
	case DBG_FC:
		return ("fc");
	case DBG_OLD:
		return ("old");
	case DBG_MAS:
		return ("mas");
	default:
		vm_error("Unknown debug flag=%x\n", flag);
		return ("unknown");
	}
}
コード例 #24
0
ファイル: a2_vm.c プロジェクト: eagles125/A2
// foreachloop
static inline void _vm_foreachloop(struct a2_vm* vm_p){
	struct a2_obj* _k = callinfo_sfreg(curr_ci, ir_ga(curr_ir));
	struct a2_obj* _v = callinfo_sfreg(curr_ci, ir_ga(curr_ir)+1);
	struct a2_obj* _c = callinfo_sfreg(curr_ci, ir_ga(curr_ir)+2);
	struct a2_obj* __v = NULL;

	if(obj_t(_c)!=A2_TMAP && obj_t(_c)!=A2_TARRAY)
		vm_error("the varable is not map or array.");

	// dump next
	switch(obj_t(_c)){
		case A2_TMAP:
			__v = a2_map_next(a2_gcobj2map(obj_vX(_c, obj)), _k);
			if(__v==NULL)
				curr_pc++;
			else{
				*_v = *__v;
				jump(ir_gbx(curr_ir));
			}
			break;
		case A2_TARRAY:
			__v = a2_array_next(a2_gcobj2array(obj_vX(_c, obj)), _k);
			if(__v==NULL)  // dump is end
				curr_pc++;
			else{
				*_v = *__v;
				jump(ir_gbx(curr_ir));
			}
			break;
		default:
			assert(0);
	}
}
コード例 #25
0
ファイル: dev_c7200_eth.c プロジェクト: GNS3/dynamips
/*
 * dev_c7200_pa_8e_init()
 *
 * Add a PA-8E port adapter into specified slot.
 */
static int dev_c7200_pa_8e_init(vm_instance_t *vm,struct cisco_card *card)
{
   struct pa_4e8e_data *data;
   u_int slot = card->slot_id;
   int i;

   /* Allocate the private data structure for the PA-8E */
   if (!(data = malloc(sizeof(*data)))) {
      vm_error(vm,"%s: out of memory\n",card->dev_name);
      return(-1);
   }

   /* 4 Ethernet ports */
   memset(data,0,sizeof(*data));
   data->nr_port = 8;

   /* Set the PCI bus */
   card->pci_bus = vm->slots_pci_bus[slot];

   /* Set the EEPROM */
   cisco_card_set_eeprom(vm,card,cisco_eeprom_find_pa("PA-8E"));
   c7200_set_slot_eeprom(VM_C7200(vm),slot,&card->eeprom);

   /* Create the AMD Am79c971 chips */
   for(i=0;i<data->nr_port;i++) {
      data->port[i] = dev_am79c971_init(vm,card->dev_name,
                                        AM79C971_TYPE_10BASE_T,
                                        card->pci_bus,i,
                                        c7200_net_irq_for_slot_port(slot,i));
   }

   /* Store device info into the router structure */
   card->drv_info = data;
   return(0);
}
コード例 #26
0
/*
 * dev_c2691_nm_eth_init()
 *
 * Add an Ethernet Network Module into specified slot.
 */
static int dev_c2691_nm_eth_init(vm_instance_t *vm,struct cisco_card *card,
                                 int nr_port,int interface_type,
                                 const struct cisco_eeprom *eeprom)
{
   struct nm_eth_data *data;
   u_int slot = card->slot_id;
   int i;

   /* Allocate the private data structure */
   if (!(data = malloc(sizeof(*data)))) {
      vm_error(vm,"%s: out of memory.\n",card->dev_name);
      return(-1);
   }

   memset(data,0,sizeof(*data));
   data->nr_port = nr_port;

   /* Set the PCI bus */
   card->pci_bus = vm->slots_pci_bus[slot];

   /* Set the EEPROM */
   cisco_card_set_eeprom(vm,card,eeprom);
   c2691_set_slot_eeprom(VM_C2691(vm),slot,&card->eeprom);

   /* Create the AMD Am971c971 chip(s) */
   for(i=0;i<data->nr_port;i++) {
      data->port[i] = dev_am79c971_init(vm,card->dev_name,interface_type,
                                        card->pci_bus,6+i,
                                        c2691_net_irq_for_slot_port(slot,i));
   }

   /* Store device info into the router structure */
   card->drv_info = data;
   return(0);
}
コード例 #27
0
ファイル: dev_c3600_eth.c プロジェクト: GNS3/dynamips
/* Add a NM-16ESW */
static int dev_c3600_nm_16esw_init(vm_instance_t *vm,struct cisco_card *card)
{
   struct nm_bay_info *bay_info;
   struct nm_16esw_data *data;
   u_int slot = card->slot_id;
   u_int chassis_id;

   /* Set the PCI bus */
   card->pci_bus = vm->slots_pci_bus[slot];

   /* Set the EEPROM */
   cisco_card_set_eeprom(vm,card,cisco_eeprom_find_nm("NM-16ESW"));
   dev_nm_16esw_burn_mac_addr(vm,slot,&card->eeprom);
   c3600_set_slot_eeprom(VM_C3600(vm),slot,&card->eeprom);

   /* Get PCI bus info about this bay */
   chassis_id = c3600_chassis_get_id(VM_C3600(vm));
   bay_info = c3600_nm_get_bay_info(chassis_id,slot);
      
   if (!bay_info) {
      vm_error(vm,"unable to get info for NM bay %u\n",slot);
      return(-1);
   }

   /* Create the device */
   data = dev_nm_16esw_init(vm,card->dev_name,slot,
                            card->pci_bus,bay_info->pci_device,
                            c3600_net_irq_for_slot_port(slot,0));

   /* Store device info into the router structure */
   card->drv_info = data;
   return(0);
}
コード例 #28
0
ファイル: ppc32_vmtest.c プロジェクト: Legun/dynamips
/* Boot the RAW image */
_unused 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);
}
コード例 #29
0
ファイル: dev_c3725.c プロジェクト: GNS3/dynamips
/* Initialize a Cisco 3725 instance */
static int c3725_init_instance(vm_instance_t *vm)
{   
   c3725_t *router = VM_C3725(vm);
   m_uint32_t rom_entry_point;
   cpu_mips_t *cpu0;

   if (!vm->ios_image) {
      vm_error(vm,"no Cisco IOS image defined.");
      return(-1);
   }

   /* Initialize the C3725 platform */
   if (c3725_init_platform(router) == -1) {
      vm_error(vm,"unable to initialize the platform hardware.\n");
      return(-1);
   }

   /* IRQ routing */
   vm->set_irq = c3725_set_irq;
   vm->clear_irq = c3725_clear_irq;

   /* Load IOS configuration files */
   if (vm->ios_startup_config != NULL || vm->ios_private_config != NULL) {
      vm_nvram_push_config(vm,vm->ios_startup_config,vm->ios_private_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(c3725_boot_ios(router));
}
コード例 #30
0
ファイル: dev_c3600_eth.c プロジェクト: GNS3/dynamips
/*
 * dev_c3600_nm_eth_init()
 *
 * Add an Ethernet Network Module into specified slot.
 */
static int dev_c3600_nm_eth_init(vm_instance_t *vm,struct cisco_card *card,
                                 int nr_port,int interface_type,
                                 const struct cisco_eeprom *eeprom)
{
   struct nm_bay_info *bay_info;
   struct nm_eth_data *data;
   u_int slot = card->slot_id;
   u_int chassis_id;
   int i;

   /* Allocate the private data structure */
   if (!(data = malloc(sizeof(*data)))) {
      vm_error(vm,"%s: out of memory.\n",card->dev_name);
      return(-1);
   }

   memset(data,0,sizeof(*data));
   data->nr_port = nr_port;

   /* Set the PCI bus */
   card->pci_bus = vm->slots_pci_bus[slot];

   /* Set the EEPROM */
   cisco_card_set_eeprom(vm,card,eeprom);
   c3600_set_slot_eeprom(VM_C3600(vm),slot,&card->eeprom);

   /* Get PCI bus info about this bay */
   chassis_id = c3600_chassis_get_id(VM_C3600(vm));
   bay_info = c3600_nm_get_bay_info(chassis_id,slot);
      
   if (!bay_info) {
      vm_error(vm,"unable to get info for NM bay %u\n",slot);
      return(-1);
   }

   /* Create the AMD Am971c971 chip(s) */
   for(i=0;i<data->nr_port;i++) {
      data->port[i] = dev_am79c971_init(vm,card->dev_name,interface_type,
                                        card->pci_bus,bay_info->pci_device+i,
                                        c3600_net_irq_for_slot_port(slot,i));
   }

   /* Store device info into the router structure */
   card->drv_info = data;
   return(0);
}