The current ioport callbacks are not type-safe, in that they accept an "opaque" pointer as an argument whose type must match the argument to the registration function; this is not checked by the compiler. This patch adds an alternative that is type-safe. Instead of an opaque argument, both registation and the callback use a new IOPort type. The callback then uses container_of() to access its main structures. Currently the old and new methods exist side by side; once the old way is gone, we can also save a bunch of memory since the new method requires one pointer per ioport instead of 6. Acked-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
		
			
				
	
	
		
			31 lines
		
	
	
		
			663 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			663 B
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef IORANGE_H
 | 
						|
#define IORANGE_H
 | 
						|
 | 
						|
#include <stdint.h>
 | 
						|
 | 
						|
typedef struct IORange IORange;
 | 
						|
typedef struct IORangeOps IORangeOps;
 | 
						|
 | 
						|
struct IORangeOps {
 | 
						|
    void (*read)(IORange *iorange, uint64_t offset, unsigned width,
 | 
						|
                 uint64_t *data);
 | 
						|
    void (*write)(IORange *iorange, uint64_t offset, unsigned width,
 | 
						|
                  uint64_t data);
 | 
						|
};
 | 
						|
 | 
						|
struct IORange {
 | 
						|
    const IORangeOps *ops;
 | 
						|
    uint64_t base;
 | 
						|
    uint64_t len;
 | 
						|
};
 | 
						|
 | 
						|
static inline void iorange_init(IORange *iorange, const IORangeOps *ops,
 | 
						|
                                uint64_t base, uint64_t len)
 | 
						|
{
 | 
						|
    iorange->ops = ops;
 | 
						|
    iorange->base = base;
 | 
						|
    iorange->len = len;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |