#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)
{
    if (!handler->read || !handler->write) {
        return -1;
    }
    return cpu_register_io_memory(cpu_io_memory_simple_read,
                                  cpu_io_memory_simple_write,
                                  handler);
}

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;
}
