Merge remote branch 'mst/for_anthony' into staging
[qemu/aliguori-queue.git] / rwhandler.c
blobc50c4bf6035b2206fa74e406c0e09e7af8f40fe6
1 #include "rwhandler.h"
2 #include "ioport.h"
3 #include "cpu-all.h"
5 #if !defined(CONFIG_USER_ONLY)
7 #define RWHANDLER_WRITE(name, len, type) \
8 static void name(void *opaque, type addr, uint32_t value) \
9 {\
10 struct ReadWriteHandler *handler = opaque;\
11 handler->write(handler, addr, value, len);\
14 #define RWHANDLER_READ(name, len, type) \
15 static uint32_t name(void *opaque, type addr) \
16 { \
17 struct ReadWriteHandler *handler = opaque; \
18 return handler->read(handler, addr, len); \
21 RWHANDLER_WRITE(cpu_io_memory_simple_writeb, 1, target_phys_addr_t);
22 RWHANDLER_READ(cpu_io_memory_simple_readb, 1, target_phys_addr_t);
23 RWHANDLER_WRITE(cpu_io_memory_simple_writew, 2, target_phys_addr_t);
24 RWHANDLER_READ(cpu_io_memory_simple_readw, 2, target_phys_addr_t);
25 RWHANDLER_WRITE(cpu_io_memory_simple_writel, 4, target_phys_addr_t);
26 RWHANDLER_READ(cpu_io_memory_simple_readl, 4, target_phys_addr_t);
28 static CPUWriteMemoryFunc * const cpu_io_memory_simple_write[] = {
29 &cpu_io_memory_simple_writeb,
30 &cpu_io_memory_simple_writew,
31 &cpu_io_memory_simple_writel,
34 static CPUReadMemoryFunc * const cpu_io_memory_simple_read[] = {
35 &cpu_io_memory_simple_readb,
36 &cpu_io_memory_simple_readw,
37 &cpu_io_memory_simple_readl,
40 int cpu_register_io_memory_simple(struct ReadWriteHandler *handler)
42 if (!handler->read || !handler->write) {
43 return -1;
45 return cpu_register_io_memory(cpu_io_memory_simple_read,
46 cpu_io_memory_simple_write,
47 handler);
50 RWHANDLER_WRITE(ioport_simple_writeb, 1, uint32_t);
51 RWHANDLER_READ(ioport_simple_readb, 1, uint32_t);
52 RWHANDLER_WRITE(ioport_simple_writew, 2, uint32_t);
53 RWHANDLER_READ(ioport_simple_readw, 2, uint32_t);
54 RWHANDLER_WRITE(ioport_simple_writel, 4, uint32_t);
55 RWHANDLER_READ(ioport_simple_readl, 4, uint32_t);
57 int register_ioport_simple(ReadWriteHandler* handler,
58 pio_addr_t start, int length, int size)
60 IOPortWriteFunc *write;
61 IOPortReadFunc *read;
62 int r;
63 switch (size) {
64 case 1:
65 write = ioport_simple_writeb;
66 read = ioport_simple_readb;
67 break;
68 case 2:
69 write = ioport_simple_writew;
70 read = ioport_simple_readw;
71 break;
72 default:
73 write = ioport_simple_writel;
74 read = ioport_simple_readl;
76 if (handler->write) {
77 r = register_ioport_write(start, length, size, write, handler);
78 if (r < 0) {
79 return r;
82 if (handler->read) {
83 r = register_ioport_read(start, length, size, read, handler);
84 if (r < 0) {
85 return r;
88 return 0;
91 #endif