Revision 1452411b
b/hw/pc.c | ||
---|---|---|
88 | 88 |
qemu_register_reset(option_rom_reset, rrd); |
89 | 89 |
} |
90 | 90 |
|
91 |
typedef struct isa_irq_state { |
|
92 |
qemu_irq *i8259; |
|
93 |
} IsaIrqState; |
|
94 |
|
|
95 |
static void isa_irq_handler(void *opaque, int n, int level) |
|
96 |
{ |
|
97 |
IsaIrqState *isa = (IsaIrqState *)opaque; |
|
98 |
|
|
99 |
qemu_set_irq(isa->i8259[n], level); |
|
100 |
} |
|
101 |
|
|
91 | 102 |
static void ioport80_write(void *opaque, uint32_t addr, uint32_t data) |
92 | 103 |
{ |
93 | 104 |
} |
... | ... | |
1122 | 1133 |
int piix3_devfn = -1; |
1123 | 1134 |
CPUState *env; |
1124 | 1135 |
qemu_irq *cpu_irq; |
1136 |
qemu_irq *isa_irq; |
|
1125 | 1137 |
qemu_irq *i8259; |
1138 |
IsaIrqState *isa_irq_state; |
|
1126 | 1139 |
DriveInfo *dinfo; |
1127 | 1140 |
BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; |
1128 | 1141 |
BlockDriverState *fd[MAX_FD]; |
... | ... | |
1267 | 1280 |
|
1268 | 1281 |
cpu_irq = qemu_allocate_irqs(pic_irq_request, NULL, 1); |
1269 | 1282 |
i8259 = i8259_init(cpu_irq[0]); |
1270 |
ferr_irq = i8259[13]; |
|
1283 |
isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state)); |
|
1284 |
isa_irq_state->i8259 = i8259; |
|
1285 |
isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 16); |
|
1286 |
ferr_irq = isa_irq[13]; |
|
1271 | 1287 |
|
1272 | 1288 |
if (pci_enabled) { |
1273 |
pci_bus = i440fx_init(&i440fx_state, i8259);
|
|
1289 |
pci_bus = i440fx_init(&i440fx_state, isa_irq);
|
|
1274 | 1290 |
piix3_devfn = piix3_init(pci_bus, -1); |
1275 | 1291 |
} else { |
1276 | 1292 |
pci_bus = NULL; |
... | ... | |
1300 | 1316 |
} |
1301 | 1317 |
} |
1302 | 1318 |
|
1303 |
rtc_state = rtc_init(0x70, i8259[8], 2000);
|
|
1319 |
rtc_state = rtc_init(0x70, isa_irq[8], 2000);
|
|
1304 | 1320 |
|
1305 | 1321 |
qemu_register_boot_set(pc_boot_set, rtc_state); |
1306 | 1322 |
|
... | ... | |
1310 | 1326 |
if (pci_enabled) { |
1311 | 1327 |
ioapic = ioapic_init(); |
1312 | 1328 |
} |
1313 |
pit = pit_init(0x40, i8259[0]);
|
|
1329 |
pit = pit_init(0x40, isa_irq[0]);
|
|
1314 | 1330 |
pcspk_init(pit); |
1315 | 1331 |
if (!no_hpet) { |
1316 |
hpet_init(i8259);
|
|
1332 |
hpet_init(isa_irq);
|
|
1317 | 1333 |
} |
1318 | 1334 |
if (pci_enabled) { |
1319 | 1335 |
pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic); |
... | ... | |
1321 | 1337 |
|
1322 | 1338 |
for(i = 0; i < MAX_SERIAL_PORTS; i++) { |
1323 | 1339 |
if (serial_hds[i]) { |
1324 |
serial_init(serial_io[i], i8259[serial_irq[i]], 115200,
|
|
1340 |
serial_init(serial_io[i], isa_irq[serial_irq[i]], 115200,
|
|
1325 | 1341 |
serial_hds[i]); |
1326 | 1342 |
} |
1327 | 1343 |
} |
1328 | 1344 |
|
1329 | 1345 |
for(i = 0; i < MAX_PARALLEL_PORTS; i++) { |
1330 | 1346 |
if (parallel_hds[i]) { |
1331 |
parallel_init(parallel_io[i], i8259[parallel_irq[i]],
|
|
1347 |
parallel_init(parallel_io[i], isa_irq[parallel_irq[i]],
|
|
1332 | 1348 |
parallel_hds[i]); |
1333 | 1349 |
} |
1334 | 1350 |
} |
... | ... | |
1339 | 1355 |
NICInfo *nd = &nd_table[i]; |
1340 | 1356 |
|
1341 | 1357 |
if (!pci_enabled || (nd->model && strcmp(nd->model, "ne2k_isa") == 0)) |
1342 |
pc_init_ne2k_isa(nd, i8259);
|
|
1358 |
pc_init_ne2k_isa(nd, isa_irq);
|
|
1343 | 1359 |
else |
1344 | 1360 |
pci_nic_init(nd, "ne2k_pci", NULL); |
1345 | 1361 |
} |
... | ... | |
1357 | 1373 |
} |
1358 | 1374 |
|
1359 | 1375 |
if (pci_enabled) { |
1360 |
pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1, i8259);
|
|
1376 |
pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1, isa_irq);
|
|
1361 | 1377 |
} else { |
1362 | 1378 |
for(i = 0; i < MAX_IDE_BUS; i++) { |
1363 |
isa_ide_init(ide_iobase[i], ide_iobase2[i], i8259[ide_irq[i]],
|
|
1379 |
isa_ide_init(ide_iobase[i], ide_iobase2[i], isa_irq[ide_irq[i]],
|
|
1364 | 1380 |
hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]); |
1365 | 1381 |
} |
1366 | 1382 |
} |
1367 | 1383 |
|
1368 | 1384 |
isa_dev = isa_create_simple("i8042", 0x60, 0x64); |
1369 |
isa_connect_irq(isa_dev, 0, i8259[1]);
|
|
1370 |
isa_connect_irq(isa_dev, 1, i8259[12]);
|
|
1385 |
isa_connect_irq(isa_dev, 0, isa_irq[1]);
|
|
1386 |
isa_connect_irq(isa_dev, 1, isa_irq[12]);
|
|
1371 | 1387 |
DMA_init(0); |
1372 | 1388 |
#ifdef HAS_AUDIO |
1373 |
audio_init(pci_enabled ? pci_bus : NULL, i8259);
|
|
1389 |
audio_init(pci_enabled ? pci_bus : NULL, isa_irq);
|
|
1374 | 1390 |
#endif |
1375 | 1391 |
|
1376 | 1392 |
for(i = 0; i < MAX_FD; i++) { |
1377 | 1393 |
dinfo = drive_get(IF_FLOPPY, 0, i); |
1378 | 1394 |
fd[i] = dinfo ? dinfo->bdrv : NULL; |
1379 | 1395 |
} |
1380 |
floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd);
|
|
1396 |
floppy_controller = fdctrl_init(isa_irq[6], 2, 0, 0x3f0, fd);
|
|
1381 | 1397 |
|
1382 | 1398 |
cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd); |
1383 | 1399 |
|
... | ... | |
1390 | 1406 |
i2c_bus *smbus; |
1391 | 1407 |
|
1392 | 1408 |
/* TODO: Populate SPD eeprom data. */ |
1393 |
smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, i8259[9]);
|
|
1409 |
smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, isa_irq[9]);
|
|
1394 | 1410 |
for (i = 0; i < 8; i++) { |
1395 | 1411 |
DeviceState *eeprom; |
1396 | 1412 |
eeprom = qdev_create((BusState *)smbus, "smbus-eeprom"); |
Also available in: Unified diff