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

📄 dev_bswap.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
字号:
/* * Cisco router simulation platform. * Copyright (c) 2007 Christophe Fillot (cf@utc.fr) * * Byte-swapping device. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <assert.h>#include "cpu.h"#include "vm.h"#include "dynamips.h"#include "memory.h"#include "device.h"struct bswap_data {   /* VM object info */   vm_obj_t vm_obj;      /* VM instance */   vm_instance_t *vm;   /* Byte-swap device */   struct vdevice dev;   /* Physical address base for rewrite */   m_uint64_t phys_base;};/* * Byte swapped access. */static void *dev_bswap_access(cpu_gen_t *cpu,struct vdevice *dev,                              m_uint32_t offset,u_int op_size,u_int op_type,                              m_uint64_t *data){   struct bswap_data *d = dev->priv_data;   m_uint64_t paddr;   paddr = d->phys_base + offset;   switch(op_size) {      case 1:         if (op_type == MTS_READ)            *data = physmem_copy_u8_from_vm(d->vm,paddr ^ 0x03);         else            physmem_copy_u8_to_vm(d->vm,paddr ^ 0x03,*data);         break;      case 2:         if (op_type == MTS_READ)            *data = swap16(physmem_copy_u16_from_vm(d->vm,paddr ^ 0x02));         else            physmem_copy_u16_to_vm(d->vm,paddr ^ 0x02,swap16(*data));         break;      case 4:         if (op_type == MTS_READ)            *data = swap32(physmem_copy_u32_from_vm(d->vm,paddr));         else            physmem_copy_u32_to_vm(d->vm,paddr,swap32(*data));         break;   }   return NULL;}/* Shutdown an byte-swap device */void dev_bswap_shutdown(vm_instance_t *vm,struct bswap_data *d){   if (d != NULL) {      /* Remove the alias, the byte-swapped and the main device */      dev_remove(vm,&d->dev);      /* Free the structure itself */      free(d);   }}/* 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){   struct bswap_data *d;   if (!(d = malloc(sizeof(*d)))) {      fprintf(stderr,"BSWAP: unable to create device.\n");      return(-1);   }   vm_object_init(&d->vm_obj);   d->vm = vm;   d->phys_base = remap_addr;   d->vm_obj.name = name;   d->vm_obj.data = d;   d->vm_obj.shutdown = (vm_shutdown_t)dev_bswap_shutdown;   dev_init(&d->dev);   d->dev.name      = name;   d->dev.phys_addr = paddr;   d->dev.phys_len  = len;   d->dev.handler   = dev_bswap_access;   d->dev.priv_data = d;   /* Map this device to the VM */   vm_bind_device(vm,&d->dev);   vm_object_add(vm,&d->vm_obj);   return(0);}

⌨️ 快捷键说明

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