--- upstream/dynamips-0.2.5/device.h 2007/10/06 16:01:44 1 +++ upstream/dynamips-0.2.7-RC1/device.h 2007/10/06 16:23:47 7 @@ -1,5 +1,5 @@ /* - * Cisco 7200 (Predator) simulation platform. + * Cisco router simulation platform. * Copyright (c) 2005,2006 Christophe Fillot (cf@utc.fr) */ @@ -8,18 +8,21 @@ #include #include "utils.h" -#include "mips64.h" #include "cpu.h" #include "net_io.h" #include "vm.h" /* Device Flags */ -#define VDEVICE_FLAG_NO_MTS_MMAP 0x01 /* Prevent MMAPed access by MTS */ -#define VDEVICE_FLAG_CACHING 0x02 /* Device does support caching */ -#define VDEVICE_FLAG_REMAP 0x04 /* Physical address remapping */ -#define VDEVICE_FLAG_SYNC 0x08 /* Forced sync */ +#define VDEVICE_FLAG_NO_MTS_MMAP 0x01 /* Prevent MMAPed access by MTS */ +#define VDEVICE_FLAG_CACHING 0x02 /* Device does support caching */ +#define VDEVICE_FLAG_REMAP 0x04 /* Physical address remapping */ +#define VDEVICE_FLAG_SYNC 0x08 /* Forced sync */ +#define VDEVICE_FLAG_SPARSE 0x10 /* Sparse device */ +#define VDEVICE_FLAG_GHOST 0x20 /* Ghost device */ -typedef void *(*dev_handler_t)(cpu_mips_t *cpu,struct vdevice *dev, +#define VDEVICE_PTE_DIRTY 0x01 + +typedef void *(*dev_handler_t)(cpu_gen_t *cpu,struct vdevice *dev, m_uint32_t offset,u_int op_size,u_int op_type, m_uint64_t *data); @@ -34,6 +37,7 @@ int flags; int fd; dev_handler_t handler; + m_iptr_t *sparse_map; struct vdevice *next,**pprev; }; @@ -42,7 +46,7 @@ /* device access function */ static forced_inline -void *dev_access_fast(cpu_mips_t *cpu,u_int dev_id,m_uint32_t offset, +void *dev_access_fast(cpu_gen_t *cpu,u_int dev_id,m_uint32_t offset, u_int op_size,u_int op_type,m_uint64_t *data) { struct vdevice *dev = cpu->vm->dev_array[dev_id]; @@ -56,13 +60,6 @@ return(dev->handler(cpu,dev,offset,op_size,op_type,data)); } - -/* Map a memory zone from a file */ -u_char *memzone_map_file(int fd,size_t len); - -/* Create a file to serve as a memory zone */ -int memzone_create_file(char *filename,size_t len,u_char **ptr); - /* Get device by ID */ struct vdevice *dev_get_by_id(vm_instance_t *vm,u_int dev_id); @@ -92,21 +89,40 @@ void dev_show_list(vm_instance_t *vm); /* device access function */ -void *dev_access(cpu_mips_t *cpu,u_int dev_id,m_uint32_t offset, +void *dev_access(cpu_gen_t *cpu,u_int dev_id,m_uint32_t offset, u_int op_size,u_int op_type,m_uint64_t *data); +/* Synchronize memory for a memory-mapped (mmap) device */ +int dev_sync(struct vdevice *dev); + /* Remap a device at specified physical address */ struct vdevice *dev_remap(char *name,struct vdevice *orig, m_uint64_t paddr,m_uint32_t len); /* Create a RAM device */ -struct vdevice *dev_create_ram(vm_instance_t *vm,char *name,char *filename, +struct vdevice *dev_create_ram(vm_instance_t *vm,char *name, + int sparse,char *filename, m_uint64_t paddr,m_uint32_t len); +/* Create a ghosted RAM device */ +struct vdevice * +dev_create_ghost_ram(vm_instance_t *vm,char *name,int sparse,char *filename, + m_uint64_t paddr,m_uint32_t len); + /* Create a memory alias */ struct vdevice *dev_create_ram_alias(vm_instance_t *vm,char *name,char *orig, m_uint64_t paddr,m_uint32_t len); +/* Initialize a sparse device */ +int dev_sparse_init(struct vdevice *dev); + +/* Shutdown sparse device structures */ +int dev_sparse_shutdown(struct vdevice *dev); + +/* Get an host address for a sparse device */ +m_iptr_t dev_sparse_get_host_addr(vm_instance_t *vm,struct vdevice *dev, + m_uint64_t paddr,u_int op_type,int *cow); + /* Create a dummy console */ int dev_create_dummy_console(vm_instance_t *vm); @@ -114,12 +130,18 @@ int dev_zero_init(vm_instance_t *vm,char *name, m_uint64_t paddr,m_uint32_t len); +/* Initialized a byte-swap device */ +int dev_bswap_init(vm_instance_t *vm,char *name, + m_uint64_t paddr,m_uint32_t len,m_uint64_t remap_addr); + /* Initialize a RAM zone */ -int dev_ram_init(vm_instance_t *vm,char *name,int use_mmap, +int dev_ram_init(vm_instance_t *vm,char *name,int use_mmap,int delete_file, + char *alternate_name,int sparse, m_uint64_t paddr,m_uint32_t len); -/* Initialize a ROM zone */ -int dev_rom_init(vm_instance_t *vm,char *name,m_uint64_t paddr,m_uint32_t len); +/* Initialize a ghosted RAM zone */ +int dev_ram_ghost_init(vm_instance_t *vm,char *name,int sparse,char *filename, + m_uint64_t paddr,m_uint32_t len); /* Create the NVRAM device */ int dev_nvram_init(vm_instance_t *vm,char *name, @@ -130,18 +152,13 @@ int dev_bootflash_init(vm_instance_t *vm,char *name, m_uint64_t paddr,m_uint32_t len); -/* Create a PLX9060 device */ -vm_obj_t *dev_plx9060_init(vm_instance_t *vm,char *name, - struct pci_bus *pci_bus,int pci_device, - struct vdevice *dev); - -/* Create a new GT64010 controller */ -int dev_gt64010_init(vm_instance_t *vm,char *name, - m_uint64_t paddr,m_uint32_t len,u_int irq); - -/* Create a new GT64120 controller */ -int dev_gt64120_init(vm_instance_t *vm,char *name, - m_uint64_t paddr,m_uint32_t len,u_int irq); +/* Create a Flash device */ +vm_obj_t *dev_flash_init(vm_instance_t *vm,char *name, + m_uint64_t paddr,m_uint32_t len); + +/* Copy data directly to a flash device */ +int dev_flash_copy_data(vm_obj_t *obj,m_uint32_t offset, + u_char *ptr,ssize_t len); /* dev_dec21050_init() */ int dev_dec21050_init(struct pci_bus *pci_bus,int pci_device, @@ -159,14 +176,26 @@ int dev_dec21152_init(struct pci_bus *pci_bus,int pci_device, struct pci_bus *sec_bus); +/* dev_dec21154_init() */ +int dev_dec21154_init(struct pci_bus *pci_bus,int pci_device, + struct pci_bus *sec_bus); + /* dev_pericom_init() */ int dev_pericom_init(struct pci_bus *pci_bus,int pci_device, struct pci_bus *sec_bus); +/* dev_ti2050b_init() */ +int dev_ti2050b_init(struct pci_bus *pci_bus,int pci_device, + struct pci_bus *sec_bus); + /* Create an AP1011 Sturgeon HyperTransport-PCI Bridge */ int dev_ap1011_init(struct pci_bus *pci_bus,int pci_device, struct pci_bus *sec_bus); +/* dev_plx6520cb_init() */ +int dev_plx6520cb_init(struct pci_bus *pci_bus,int pci_device, + struct pci_bus *sec_bus); + /* dev_clpd6729_init() */ int dev_clpd6729_init(vm_instance_t *vm, struct pci_bus *pci_bus,int pci_device, @@ -175,7 +204,7 @@ /* Create a NS16552 device */ int dev_ns16552_init(vm_instance_t *vm,m_uint64_t paddr,m_uint32_t len, - u_int irq,vtty_t *vtty_portA,vtty_t *vtty_portB); + u_int reg_div,u_int irq,vtty_t *vtty_A,vtty_t *vtty_B); /* Initialize an SRAM device */ int dev_c7200_sram_init(vm_instance_t *vm,char *name, @@ -185,7 +214,10 @@ /* Initialize a PCMCIA disk */ vm_obj_t *dev_pcmcia_disk_init(vm_instance_t *vm,char *name, m_uint64_t paddr,m_uint32_t len, - u_int disk_size); + u_int disk_size,int mode); + +/* Get the device associated with a PCMCIA disk object */ +struct vdevice *dev_pcmcia_disk_get_device(vm_obj_t *obj); /* Create SB-1 system control devices */ int dev_sb1_init(vm_instance_t *vm);