Revision d537cf6c hw/i8259.c
b/hw/i8259.c | ||
---|---|---|
54 | 54 |
/* 0 is master pic, 1 is slave pic */ |
55 | 55 |
/* XXX: better separation between the two pics */ |
56 | 56 |
PicState pics[2]; |
57 |
IRQRequestFunc *irq_request;
|
|
57 |
qemu_irq parent_irq;
|
|
58 | 58 |
void *irq_request_opaque; |
59 | 59 |
/* IOAPIC callback support */ |
60 | 60 |
SetIRQFunc *alt_irq_func; |
... | ... | |
160 | 160 |
} |
161 | 161 |
printf("pic: cpu_interrupt\n"); |
162 | 162 |
#endif |
163 |
s->irq_request(s->irq_request_opaque, 1);
|
|
163 |
qemu_irq_raise(s->parent_irq);
|
|
164 | 164 |
} |
165 | 165 |
|
166 | 166 |
/* all targets should do this rather than acking the IRQ in the cpu */ |
167 | 167 |
#if defined(TARGET_MIPS) |
168 | 168 |
else { |
169 |
s->irq_request(s->irq_request_opaque, 0);
|
|
169 |
qemu_irq_lower(s->parent_irq);
|
|
170 | 170 |
} |
171 | 171 |
#endif |
172 | 172 |
} |
... | ... | |
175 | 175 |
int64_t irq_time[16]; |
176 | 176 |
#endif |
177 | 177 |
|
178 |
void pic_set_irq_new(void *opaque, int irq, int level)
|
|
178 |
void i8259_set_irq(void *opaque, int irq, int level)
|
|
179 | 179 |
{ |
180 | 180 |
PicState2 *s = opaque; |
181 | 181 |
|
182 | 182 |
#if defined(DEBUG_PIC) || defined(DEBUG_IRQ_COUNT) |
183 | 183 |
if (level != irq_level[irq]) { |
184 | 184 |
#if defined(DEBUG_PIC) |
185 |
printf("pic_set_irq: irq=%d level=%d\n", irq, level);
|
|
185 |
printf("i8259_set_irq: irq=%d level=%d\n", irq, level);
|
|
186 | 186 |
#endif |
187 | 187 |
irq_level[irq] = level; |
188 | 188 |
#ifdef DEBUG_IRQ_COUNT |
... | ... | |
203 | 203 |
pic_update_irq(s); |
204 | 204 |
} |
205 | 205 |
|
206 |
/* obsolete function */ |
|
207 |
void pic_set_irq(int irq, int level) |
|
208 |
{ |
|
209 |
pic_set_irq_new(isa_pic, irq, level); |
|
210 |
} |
|
211 |
|
|
212 | 206 |
/* acknowledge interrupt 'irq' */ |
213 | 207 |
static inline void pic_intack(PicState *s, int irq) |
214 | 208 |
{ |
... | ... | |
297 | 291 |
/* init */ |
298 | 292 |
pic_reset(s); |
299 | 293 |
/* deassert a pending interrupt */ |
300 |
s->pics_state->irq_request(s->pics_state->irq_request_opaque, 0);
|
|
294 |
qemu_irq_lower(s->pics_state->parent_irq);
|
|
301 | 295 |
s->init_state = 1; |
302 | 296 |
s->init4 = val & 1; |
303 | 297 |
s->single_mode = val & 2; |
... | ... | |
546 | 540 |
#endif |
547 | 541 |
} |
548 | 542 |
|
549 |
PicState2 *pic_init(IRQRequestFunc *irq_request, void *irq_request_opaque)
|
|
543 |
qemu_irq *i8259_init(qemu_irq parent_irq)
|
|
550 | 544 |
{ |
551 | 545 |
PicState2 *s; |
546 |
|
|
552 | 547 |
s = qemu_mallocz(sizeof(PicState2)); |
553 | 548 |
if (!s) |
554 | 549 |
return NULL; |
... | ... | |
556 | 551 |
pic_init1(0xa0, 0x4d1, &s->pics[1]); |
557 | 552 |
s->pics[0].elcr_mask = 0xf8; |
558 | 553 |
s->pics[1].elcr_mask = 0xde; |
559 |
s->irq_request = irq_request; |
|
560 |
s->irq_request_opaque = irq_request_opaque; |
|
554 |
s->parent_irq = parent_irq; |
|
561 | 555 |
s->pics[0].pics_state = s; |
562 | 556 |
s->pics[1].pics_state = s; |
563 |
return s; |
|
557 |
isa_pic = s; |
|
558 |
return qemu_allocate_irqs(i8259_set_irq, s, 16); |
|
564 | 559 |
} |
565 | 560 |
|
566 | 561 |
void pic_set_alt_irq_func(PicState2 *s, SetIRQFunc *alt_irq_func, |
Also available in: Unified diff