Annotation of cf/dev_bswap.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Cisco router simulation platform.
                      3:  * Copyright (c) 2007 Christophe Fillot ([email protected])
                      4:  *
                      5:  * Byte-swapping device.
                      6:  */
                      7: 
                      8: #include <stdio.h>
                      9: #include <stdlib.h>
                     10: #include <string.h>
                     11: #include <unistd.h>
                     12: #include <assert.h>
                     13: 
                     14: #include "cpu.h"
                     15: #include "vm.h"
                     16: #include "dynamips.h"
                     17: #include "memory.h"
                     18: #include "device.h"
                     19: 
                     20: struct bswap_data {
                     21:    /* VM object info */
                     22:    vm_obj_t vm_obj;
                     23:    
                     24:    /* VM instance */
                     25:    vm_instance_t *vm;
                     26: 
                     27:    /* Byte-swap device */
                     28:    struct vdevice dev;
                     29: 
                     30:    /* Physical address base for rewrite */
                     31:    m_uint64_t phys_base;
                     32: };
                     33: 
                     34: /*
                     35:  * Byte swapped access.
                     36:  */
                     37: static void *dev_bswap_access(cpu_gen_t *cpu,struct vdevice *dev,
                     38:                               m_uint32_t offset,u_int op_size,u_int op_type,
                     39:                               m_uint64_t *data)
                     40: {
                     41:    struct bswap_data *d = dev->priv_data;
                     42:    m_uint64_t paddr;
                     43: 
                     44:    paddr = d->phys_base + offset;
                     45: 
                     46:    //printf("access to paddr = 0x%llx\n",paddr);
                     47: 
                     48:    switch(op_size) {
                     49:       case 1:
                     50:          if (op_type == MTS_READ)
                     51:             *data = physmem_copy_u8_from_vm(d->vm,paddr ^ 0x03);
                     52:          else
                     53:             physmem_copy_u8_to_vm(d->vm,paddr ^ 0x03,*data);
                     54:          break;
                     55: 
                     56:       case 2:
                     57:          if (op_type == MTS_READ)
                     58:             *data = swap16(physmem_copy_u16_from_vm(d->vm,paddr ^ 0x02));
                     59:          else
                     60:             physmem_copy_u16_to_vm(d->vm,paddr ^ 0x02,swap16(*data));
                     61:          break;
                     62: 
                     63:       case 4:
                     64:          if (op_type == MTS_READ)
                     65:             *data = swap32(physmem_copy_u32_from_vm(d->vm,paddr));
                     66:          else
                     67:             physmem_copy_u32_to_vm(d->vm,paddr,swap32(*data));
                     68:          break;
                     69:    }
                     70: 
                     71:    return NULL;
                     72: }
                     73: 
                     74: /* Shutdown an byte-swap device */
                     75: void dev_bswap_shutdown(vm_instance_t *vm,struct bswap_data *d)
                     76: {
                     77:    if (d != NULL) {
                     78:       /* Remove the alias, the byte-swapped and the main device */
                     79:       dev_remove(vm,&d->dev);
                     80: 
                     81:       /* Free the structure itself */
                     82:       free(d);
                     83:    }
                     84: }
                     85: 
                     86: /* Initialized a byte-swap device */
                     87: int dev_bswap_init(vm_instance_t *vm,char *name,
                     88:                    m_uint64_t paddr,m_uint32_t len,
                     89:                    m_uint64_t remap_addr)
                     90: {
                     91:    struct bswap_data *d;
                     92: 
                     93:    if (!(d = malloc(sizeof(*d)))) {
                     94:       fprintf(stderr,"BSWAP: unable to create device.\n");
                     95:       return(-1);
                     96:    }
                     97: 
                     98:    vm_object_init(&d->vm_obj);
                     99:    d->vm = vm;
                    100:    d->phys_base = remap_addr;
                    101:    d->vm_obj.name = name;
                    102:    d->vm_obj.data = d;
                    103:    d->vm_obj.shutdown = (vm_shutdown_t)dev_bswap_shutdown;
                    104: 
                    105:    dev_init(&d->dev);
                    106:    d->dev.name      = name;
                    107:    d->dev.phys_addr = paddr;
                    108:    d->dev.phys_len  = len;
                    109:    d->dev.handler   = dev_bswap_access;
                    110:    d->dev.priv_data = d;
                    111: 
                    112:    /* Map this device to the VM */
                    113:    vm_bind_device(vm,&d->dev);
                    114:    vm_object_add(vm,&d->vm_obj);
                    115:    return(0);
                    116: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.