Revision 477e3edf

b/vl.c
260 260
target_phys_addr_t isa_mem_base = 0;
261 261
PicState2 *isa_pic;
262 262

  
263
static IOPortReadFunc default_ioport_readb, default_ioport_readw, default_ioport_readl;
264
static IOPortWriteFunc default_ioport_writeb, default_ioport_writew, default_ioport_writel;
265

  
266
static uint32_t ioport_read(int index, uint32_t address)
267
{
268
    static IOPortReadFunc *default_func[3] = {
269
        default_ioport_readb,
270
        default_ioport_readw,
271
        default_ioport_readl
272
    };
273
    IOPortReadFunc *func = ioport_read_table[index][address];
274
    if (!func)
275
        func = default_func[index];
276
    return func(ioport_opaque[address], address);
277
}
278

  
279
static void ioport_write(int index, uint32_t address, uint32_t data)
280
{
281
    static IOPortWriteFunc *default_func[3] = {
282
        default_ioport_writeb,
283
        default_ioport_writew,
284
        default_ioport_writel
285
    };
286
    IOPortWriteFunc *func = ioport_write_table[index][address];
287
    if (!func)
288
        func = default_func[index];
289
    func(ioport_opaque[address], address, data);
290
}
291

  
263 292
static uint32_t default_ioport_readb(void *opaque, uint32_t address)
264 293
{
265 294
#ifdef DEBUG_UNUSED_IOPORT
......
279 308
static uint32_t default_ioport_readw(void *opaque, uint32_t address)
280 309
{
281 310
    uint32_t data;
282
    data = ioport_read_table[0][address](ioport_opaque[address], address);
311
    data = ioport_read(0, address);
283 312
    address = (address + 1) & (MAX_IOPORTS - 1);
284
    data |= ioport_read_table[0][address](ioport_opaque[address], address) << 8;
313
    data |= ioport_read(0, address) << 8;
285 314
    return data;
286 315
}
287 316

  
288 317
static void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
289 318
{
290
    ioport_write_table[0][address](ioport_opaque[address], address, data & 0xff);
319
    ioport_write(0, address, data & 0xff);
291 320
    address = (address + 1) & (MAX_IOPORTS - 1);
292
    ioport_write_table[0][address](ioport_opaque[address], address, (data >> 8) & 0xff);
321
    ioport_write(0, address, (data >> 8) & 0xff);
293 322
}
294 323

  
295 324
static uint32_t default_ioport_readl(void *opaque, uint32_t address)
......
307 336
#endif
308 337
}
309 338

  
310
static void init_ioports(void)
311
{
312
    int i;
313

  
314
    for(i = 0; i < MAX_IOPORTS; i++) {
315
        ioport_read_table[0][i] = default_ioport_readb;
316
        ioport_write_table[0][i] = default_ioport_writeb;
317
        ioport_read_table[1][i] = default_ioport_readw;
318
        ioport_write_table[1][i] = default_ioport_writew;
319
        ioport_read_table[2][i] = default_ioport_readl;
320
        ioport_write_table[2][i] = default_ioport_writel;
321
    }
322
}
323

  
324 339
/* size is the word size in byte */
325 340
int register_ioport_read(int start, int length, int size,
326 341
                         IOPortReadFunc *func, void *opaque)
......
394 409
    if (loglevel & CPU_LOG_IOPORT)
395 410
        fprintf(logfile, "outb: %04x %02x\n", addr, val);
396 411
#endif
397
    ioport_write_table[0][addr](ioport_opaque[addr], addr, val);
412
    ioport_write(0, addr, val);
398 413
#ifdef USE_KQEMU
399 414
    if (env)
400 415
        env->last_io_time = cpu_get_time_fast();
......
407 422
    if (loglevel & CPU_LOG_IOPORT)
408 423
        fprintf(logfile, "outw: %04x %04x\n", addr, val);
409 424
#endif
410
    ioport_write_table[1][addr](ioport_opaque[addr], addr, val);
425
    ioport_write(1, addr, val);
411 426
#ifdef USE_KQEMU
412 427
    if (env)
413 428
        env->last_io_time = cpu_get_time_fast();
......
420 435
    if (loglevel & CPU_LOG_IOPORT)
421 436
        fprintf(logfile, "outl: %04x %08x\n", addr, val);
422 437
#endif
423
    ioport_write_table[2][addr](ioport_opaque[addr], addr, val);
438
    ioport_write(2, addr, val);
424 439
#ifdef USE_KQEMU
425 440
    if (env)
426 441
        env->last_io_time = cpu_get_time_fast();
......
430 445
int cpu_inb(CPUState *env, int addr)
431 446
{
432 447
    int val;
433
    val = ioport_read_table[0][addr](ioport_opaque[addr], addr);
448
    val = ioport_read(0, addr);
434 449
#ifdef DEBUG_IOPORT
435 450
    if (loglevel & CPU_LOG_IOPORT)
436 451
        fprintf(logfile, "inb : %04x %02x\n", addr, val);
......
445 460
int cpu_inw(CPUState *env, int addr)
446 461
{
447 462
    int val;
448
    val = ioport_read_table[1][addr](ioport_opaque[addr], addr);
463
    val = ioport_read(1, addr);
449 464
#ifdef DEBUG_IOPORT
450 465
    if (loglevel & CPU_LOG_IOPORT)
451 466
        fprintf(logfile, "inw : %04x %04x\n", addr, val);
......
460 475
int cpu_inl(CPUState *env, int addr)
461 476
{
462 477
    int val;
463
    val = ioport_read_table[2][addr](ioport_opaque[addr], addr);
478
    val = ioport_read(2, addr);
464 479
#ifdef DEBUG_IOPORT
465 480
    if (loglevel & CPU_LOG_IOPORT)
466 481
        fprintf(logfile, "inl : %04x %08x\n", addr, val);
......
8832 8847
    register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
8833 8848
    register_savevm("ram", 0, 2, ram_save, ram_load, NULL);
8834 8849

  
8835
    init_ioports();
8836

  
8837 8850
    /* terminal init */
8838 8851
    memset(&display_state, 0, sizeof(display_state));
8839 8852
    if (nographic) {

Also available in: Unified diff