29
29
//#define DEBUG_PIC
32
#define PIC_DPRINTF(fmt, args...) \
33
do { printf("PIC: " fmt , ##args); } while (0)
32
#define PIC_DPRINTF(fmt, ...) \
33
do { printf("PIC: " fmt , ## __VA_ARGS__); } while (0)
35
#define PIC_DPRINTF(fmt, args...)
35
#define PIC_DPRINTF(fmt, ...)
38
38
typedef struct HeathrowPIC {
65
static void pic_writel (void *opaque, target_phys_addr_t addr, uint32_t value)
66
static void pic_write(void *opaque, target_phys_addr_t addr,
67
uint64_t value, unsigned size)
67
69
HeathrowPICS *s = opaque;
71
#ifdef TARGET_WORDS_BIGENDIAN
72
value = bswap32(value);
74
73
n = ((addr & 0xfff) - 0x10) >> 4;
75
74
PIC_DPRINTF("writel: " TARGET_FMT_plx " %u: %08x\n", addr, n, value);
122
122
PIC_DPRINTF("readl: " TARGET_FMT_plx " %u: %08x\n", addr, n, value);
123
#ifdef TARGET_WORDS_BIGENDIAN
124
value = bswap32(value);
129
static CPUWriteMemoryFunc *pic_write[] = {
135
static CPUReadMemoryFunc *pic_read[] = {
126
static const MemoryRegionOps heathrow_pic_ops = {
129
.endianness = DEVICE_LITTLE_ENDIAN,
142
132
static void heathrow_pic_set_irq(void *opaque, int num, int level)
165
155
heathrow_pic_update(s);
168
static void heathrow_pic_save_one(QEMUFile *f, HeathrowPIC *s)
170
qemu_put_be32s(f, &s->events);
171
qemu_put_be32s(f, &s->mask);
172
qemu_put_be32s(f, &s->levels);
173
qemu_put_be32s(f, &s->level_triggered);
176
static void heathrow_pic_save(QEMUFile *f, void *opaque)
178
HeathrowPICS *s = (HeathrowPICS *)opaque;
180
heathrow_pic_save_one(f, &s->pics[0]);
181
heathrow_pic_save_one(f, &s->pics[1]);
184
static void heathrow_pic_load_one(QEMUFile *f, HeathrowPIC *s)
186
qemu_get_be32s(f, &s->events);
187
qemu_get_be32s(f, &s->mask);
188
qemu_get_be32s(f, &s->levels);
189
qemu_get_be32s(f, &s->level_triggered);
192
static int heathrow_pic_load(QEMUFile *f, void *opaque, int version_id)
194
HeathrowPICS *s = (HeathrowPICS *)opaque;
199
heathrow_pic_load_one(f, &s->pics[0]);
200
heathrow_pic_load_one(f, &s->pics[1]);
158
static const VMStateDescription vmstate_heathrow_pic_one = {
159
.name = "heathrow_pic_one",
161
.minimum_version_id = 0,
162
.minimum_version_id_old = 0,
163
.fields = (VMStateField[]) {
164
VMSTATE_UINT32(events, HeathrowPIC),
165
VMSTATE_UINT32(mask, HeathrowPIC),
166
VMSTATE_UINT32(levels, HeathrowPIC),
167
VMSTATE_UINT32(level_triggered, HeathrowPIC),
168
VMSTATE_END_OF_LIST()
172
static const VMStateDescription vmstate_heathrow_pic = {
173
.name = "heathrow_pic",
175
.minimum_version_id = 1,
176
.minimum_version_id_old = 1,
177
.fields = (VMStateField[]) {
178
VMSTATE_STRUCT_ARRAY(pics, HeathrowPICS, 2, 1,
179
vmstate_heathrow_pic_one, HeathrowPIC),
180
VMSTATE_END_OF_LIST()
205
184
static void heathrow_pic_reset_one(HeathrowPIC *s)
218
197
s->pics[1].level_triggered = 0x1ff00000;
221
qemu_irq *heathrow_pic_init(int *pmem_index,
200
qemu_irq *heathrow_pic_init(MemoryRegion **pmem,
222
201
int nb_cpus, qemu_irq **irqs)
226
s = qemu_mallocz(sizeof(HeathrowPICS));
205
s = g_malloc0(sizeof(HeathrowPICS));
228
207
s->irqs = irqs[0];
229
*pmem_index = cpu_register_io_memory(0, pic_read, pic_write, s);
208
memory_region_init_io(&s->mem, &heathrow_pic_ops, s,
209
"heathrow-pic", 0x1000);
231
register_savevm("heathrow_pic", -1, 1, heathrow_pic_save,
232
heathrow_pic_load, s);
212
vmstate_register(NULL, -1, &vmstate_heathrow_pic, s);
233
213
qemu_register_reset(heathrow_pic_reset, s);
234
heathrow_pic_reset(s);
235
214
return qemu_allocate_irqs(heathrow_pic_set_irq, s, 64);