mirror of
https://github.com/qemu/qemu.git
synced 2024-12-15 23:43:31 +08:00
acd1c812b5
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
|