88 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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;
 | |
| }
 | 
