📄 device.h
字号:
/* * Cisco router simulation platform. * Copyright (c) 2005,2006 Christophe Fillot (cf@utc.fr) */#ifndef __DEVICE_H__#define __DEVICE_H__#include <sys/types.h>#include "utils.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_SPARSE 0x10 /* Sparse device */#define VDEVICE_FLAG_GHOST 0x20 /* Ghost device */#define VDEVICE_PTE_DIRTY 0x01typedef 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);/* Virtual Device */struct vdevice { char *name; u_int id; m_uint64_t phys_addr; m_uint32_t phys_len; m_iptr_t host_addr; void *priv_data; int flags; int fd; dev_handler_t handler; m_iptr_t *sparse_map; struct vdevice *next,**pprev;};/* PCI part */#include "pci_dev.h"/* device access function */static forced_inline 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]; if (unlikely(!dev)) { cpu_log(cpu,"dev_access_fast","null handler (dev_id=%u,offset=0x%x)\n", dev_id,offset); return NULL; }#if DEBUG_DEV_PERF_CNT cpu->dev_access_counter++;#endif return(dev->handler(cpu,dev,offset,op_size,op_type,data));}/* Get device by ID */struct vdevice *dev_get_by_id(vm_instance_t *vm,u_int dev_id);/* Get device by name */struct vdevice *dev_get_by_name(vm_instance_t *vm,char *name);/* Device lookup by physical address */struct vdevice *dev_lookup(vm_instance_t *vm,m_uint64_t phys_addr,int cached);/* Find the next device after the specified address */struct vdevice *dev_lookup_next(vm_instance_t *vm,m_uint64_t phys_addr, struct vdevice *dev_start,int cached);/* Initialize a device */void dev_init(struct vdevice *dev);/* Allocate a device */struct vdevice *dev_create(char *name);/* Remove a device */void dev_remove(vm_instance_t *vm,struct vdevice *dev);/* Show properties of a device */void dev_show(struct vdevice *dev);/* Show the device list */void dev_show_list(vm_instance_t *vm);/* device access function */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, 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);/* Initialized a zeroed memory zone */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 delete_file, char *alternate_name,int sparse, 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, m_uint64_t paddr,m_uint32_t len, u_int *conf_reg);/* Create a 8 Mb bootflash */int dev_bootflash_init(vm_instance_t *vm,char *name,char *model, m_uint64_t paddr);/* 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, struct pci_bus *sec_bus);/* dev_dec21052_init() */int dev_dec21052_init(struct pci_bus *pci_bus,int pci_device, struct pci_bus *sec_bus);/* dev_dec21150_init() */int dev_dec21150_init(struct pci_bus *pci_bus,int pci_device, struct pci_bus *sec_bus);/* dev_dec21152_init() */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, struct pci_io_data *pci_io_data, m_uint32_t io_start,m_uint32_t io_end);/* Create a NS16552 device */int dev_ns16552_init(vm_instance_t *vm,m_uint64_t paddr,m_uint32_t len, 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, m_uint64_t paddr,m_uint32_t len, struct pci_bus *pci_bus,int pci_device);/* 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,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);/* Create SB-1 I/O devices */int dev_sb1_io_init(vm_instance_t *vm,u_int duart_irq);/* Create the SB-1 PCI bus configuration zone */int dev_sb1_pci_init(vm_instance_t *vm,char *name,m_uint64_t paddr);/* dev_sb1_duart_init() */int dev_sb1_duart_init(vm_instance_t *vm,m_uint64_t paddr,m_uint32_t len);/* remote control device */int dev_remote_control_init(vm_instance_t *vm,m_uint64_t paddr,m_uint32_t len);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -