78 lines
2.2 KiB
C
78 lines
2.2 KiB
C
/*
|
|
* Cisco router simulation platform.
|
|
* Copyright (c) 2005,2006 Christophe Fillot (cf@utc.fr)
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) yajin 2008 <yajinzhou@gmail.com >
|
|
*
|
|
* This file is part of the virtualmips distribution.
|
|
* See LICENSE file for terms of the license.
|
|
*
|
|
*/
|
|
|
|
#ifndef __DEVICE_H__
|
|
#define __DEVICE_H__
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include "utils.h"
|
|
#include "mips.h"
|
|
#include "vm.h"
|
|
#include "cpu.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_COW 0x08 /* Copy on write device */
|
|
|
|
#define VDEVICE_PTE_DIRTY 0x01
|
|
|
|
/*device handler */
|
|
typedef void *(*dev_handler_t) (cpu_mips_t * cpu, vdevice_t * dev,
|
|
m_uint32_t offset, u_int op_size, u_int op_type,
|
|
m_reg_t * data, m_uint8_t * has_set_value);
|
|
|
|
typedef void (*dev_reset_handler_t) (cpu_mips_t * cpu, vdevice_t * dev);
|
|
|
|
/* Virtual Device */
|
|
struct vdevice {
|
|
char *name;
|
|
u_int id;
|
|
m_pa_t phys_addr;
|
|
m_uint32_t phys_len;
|
|
m_iptr_t host_addr;
|
|
void *priv_data;
|
|
int flags;
|
|
int fd;
|
|
dev_handler_t handler;
|
|
dev_reset_handler_t reset_handler;
|
|
struct vdevice *next, **pprev;
|
|
};
|
|
|
|
/* device access function */
|
|
static forced_inline
|
|
void *dev_access_fast (cpu_mips_t * cpu, u_int dev_id, m_uint32_t offset,
|
|
u_int op_size, u_int op_type, m_reg_t * data, m_uint8_t * has_set_value)
|
|
{
|
|
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;
|
|
}
|
|
return (dev->handler (cpu, dev, offset, op_size, op_type, data,
|
|
has_set_value));
|
|
}
|
|
|
|
struct vdevice *dev_lookup (vm_instance_t * vm, m_pa_t phys_addr);
|
|
void dev_init (struct vdevice *dev);
|
|
int dev_ram_init (vm_instance_t * vm, char *name, m_pa_t paddr, m_uint32_t len);
|
|
struct vdevice *dev_create (char *name);
|
|
struct vdevice *dev_create_ram (vm_instance_t * vm, char *name, m_pa_t paddr,
|
|
m_uint32_t len);
|
|
void dev_reset_all (vm_instance_t * vm);
|
|
|
|
#endif
|