]> git.proxmox.com Git - qemu.git/blob - rwhandler.c
rwhandler: simplified way to register for mem/io
[qemu.git] / rwhandler.c
1 #include "rwhandler.h"
2 #include "ioport.h"
3 #include "cpu-all.h"
4
5 #if !defined(CONFIG_USER_ONLY)
6
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);\
12 }
13
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); \
19 }
20
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);
27
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,
32 };
33
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,
38 };
39
40 int cpu_register_io_memory_simple(struct ReadWriteHandler *handler)
41 {
42 if (!handler->read || !handler->write) {
43 return -1;
44 }
45 return cpu_register_io_memory(cpu_io_memory_simple_read,
46 cpu_io_memory_simple_write,
47 handler);
48 }
49
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);
56
57 int register_ioport_simple(ReadWriteHandler* handler,
58 pio_addr_t start, int length, int size)
59 {
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;
75 }
76 if (handler->write) {
77 r = register_ioport_write(start, length, size, write, handler);
78 if (r < 0) {
79 return r;
80 }
81 }
82 if (handler->read) {
83 r = register_ioport_read(start, length, size, read, handler);
84 if (r < 0) {
85 return r;
86 }
87 }
88 return 0;
89 }
90
91 #endif