Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

file 87 lines (79 sloc) 2.681 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
#include "rwhandler.h"
#include "ioport.h"
#include "cpu-all.h"

#define RWHANDLER_WRITE(name, len, type) \
static void name(void *opaque, type addr, uint32_t value) \
{\
struct ReadWriteHandler *handler = opaque;\
handler->write(handler, addr, value, len);\
}

#define RWHANDLER_READ(name, len, type) \
static uint32_t name(void *opaque, type addr) \
{ \
struct ReadWriteHandler *handler = opaque; \
return handler->read(handler, addr, len); \
}

RWHANDLER_WRITE(cpu_io_memory_simple_writeb, 1, target_phys_addr_t);
RWHANDLER_READ(cpu_io_memory_simple_readb, 1, target_phys_addr_t);
RWHANDLER_WRITE(cpu_io_memory_simple_writew, 2, target_phys_addr_t);
RWHANDLER_READ(cpu_io_memory_simple_readw, 2, target_phys_addr_t);
RWHANDLER_WRITE(cpu_io_memory_simple_writel, 4, target_phys_addr_t);
RWHANDLER_READ(cpu_io_memory_simple_readl, 4, target_phys_addr_t);

static CPUWriteMemoryFunc * const cpu_io_memory_simple_write[] = {
    &cpu_io_memory_simple_writeb,
    &cpu_io_memory_simple_writew,
    &cpu_io_memory_simple_writel,
};

static CPUReadMemoryFunc * const cpu_io_memory_simple_read[] = {
    &cpu_io_memory_simple_readb,
    &cpu_io_memory_simple_readw,
    &cpu_io_memory_simple_readl,
};

int cpu_register_io_memory_simple(struct ReadWriteHandler *handler, int endian)
{
    if (!handler->read || !handler->write) {
        return -1;
    }
    return cpu_register_io_memory(cpu_io_memory_simple_read,
                                  cpu_io_memory_simple_write,
                                  handler, endian);
}

RWHANDLER_WRITE(ioport_simple_writeb, 1, uint32_t);
RWHANDLER_READ(ioport_simple_readb, 1, uint32_t);
RWHANDLER_WRITE(ioport_simple_writew, 2, uint32_t);
RWHANDLER_READ(ioport_simple_readw, 2, uint32_t);
RWHANDLER_WRITE(ioport_simple_writel, 4, uint32_t);
RWHANDLER_READ(ioport_simple_readl, 4, uint32_t);

int register_ioport_simple(ReadWriteHandler* handler,
                           pio_addr_t start, int length, int size)
{
    IOPortWriteFunc *write;
    IOPortReadFunc *read;
    int r;
    switch (size) {
    case 1:
        write = ioport_simple_writeb;
        read = ioport_simple_readb;
        break;
    case 2:
        write = ioport_simple_writew;
        read = ioport_simple_readw;
        break;
    default:
        write = ioport_simple_writel;
        read = ioport_simple_readl;
    }
    if (handler->write) {
        r = register_ioport_write(start, length, size, write, handler);
        if (r < 0) {
            return r;
        }
    }
    if (handler->read) {
        r = register_ioport_read(start, length, size, read, handler);
        if (r < 0) {
            return r;
        }
    }
    return 0;
}
Something went wrong with that request. Please try again.