qemu/rwhandler.c
<<
>>
Prefs
   1#include "rwhandler.h"
   2#include "ioport.h"
   3#include "cpu-all.h"
   4
   5#define RWHANDLER_WRITE(name, len, type) \
   6static void name(void *opaque, type addr, uint32_t value) \
   7{\
   8    struct ReadWriteHandler *handler = opaque;\
   9    handler->write(handler, addr, value, len);\
  10}
  11
  12#define RWHANDLER_READ(name, len, type) \
  13static uint32_t name(void *opaque, type addr) \
  14{ \
  15    struct ReadWriteHandler *handler = opaque; \
  16    return handler->read(handler, addr, len); \
  17}
  18
  19RWHANDLER_WRITE(cpu_io_memory_simple_writeb, 1, target_phys_addr_t);
  20RWHANDLER_READ(cpu_io_memory_simple_readb, 1, target_phys_addr_t);
  21RWHANDLER_WRITE(cpu_io_memory_simple_writew, 2, target_phys_addr_t);
  22RWHANDLER_READ(cpu_io_memory_simple_readw, 2, target_phys_addr_t);
  23RWHANDLER_WRITE(cpu_io_memory_simple_writel, 4, target_phys_addr_t);
  24RWHANDLER_READ(cpu_io_memory_simple_readl, 4, target_phys_addr_t);
  25
  26static CPUWriteMemoryFunc * const cpu_io_memory_simple_write[] = {
  27    &cpu_io_memory_simple_writeb,
  28    &cpu_io_memory_simple_writew,
  29    &cpu_io_memory_simple_writel,
  30};
  31
  32static CPUReadMemoryFunc * const cpu_io_memory_simple_read[] = {
  33    &cpu_io_memory_simple_readb,
  34    &cpu_io_memory_simple_readw,
  35    &cpu_io_memory_simple_readl,
  36};
  37
  38int cpu_register_io_memory_simple(struct ReadWriteHandler *handler, int endian)
  39{
  40    if (!handler->read || !handler->write) {
  41        return -1;
  42    }
  43    return cpu_register_io_memory(cpu_io_memory_simple_read,
  44                                  cpu_io_memory_simple_write,
  45                                  handler, endian);
  46}
  47
  48RWHANDLER_WRITE(ioport_simple_writeb, 1, uint32_t);
  49RWHANDLER_READ(ioport_simple_readb, 1, uint32_t);
  50RWHANDLER_WRITE(ioport_simple_writew, 2, uint32_t);
  51RWHANDLER_READ(ioport_simple_readw, 2, uint32_t);
  52RWHANDLER_WRITE(ioport_simple_writel, 4, uint32_t);
  53RWHANDLER_READ(ioport_simple_readl, 4, uint32_t);
  54
  55int register_ioport_simple(ReadWriteHandler* handler,
  56                           pio_addr_t start, int length, int size)
  57{
  58    IOPortWriteFunc *write;
  59    IOPortReadFunc *read;
  60    int r;
  61    switch (size) {
  62    case 1:
  63        write = ioport_simple_writeb;
  64        read = ioport_simple_readb;
  65        break;
  66    case 2:
  67        write = ioport_simple_writew;
  68        read = ioport_simple_readw;
  69        break;
  70    default:
  71        write = ioport_simple_writel;
  72        read = ioport_simple_readl;
  73    }
  74    if (handler->write) {
  75        r = register_ioport_write(start, length, size, write, handler);
  76        if (r < 0) {
  77            return r;
  78        }
  79    }
  80    if (handler->read) {
  81        r = register_ioport_read(start, length, size, read, handler);
  82        if (r < 0) {
  83            return r;
  84        }
  85    }
  86    return 0;
  87}
  88