~jderose/ubuntu/raring/qemu/vde-again

« back to all changes in this revision

Viewing changes to hw/serial.c

Tags: upstream-0.9.0+20070816
ImportĀ upstreamĀ versionĀ 0.9.0+20070816

Show diffs side-by-side

added added

removed removed

Lines of Context:
83
83
    /* NOTE: this hidden state is necessary for tx irq generation as
84
84
       it can be reset while reading iir */
85
85
    int thr_ipending;
86
 
    SetIRQFunc *set_irq;
87
 
    void *irq_opaque;
88
 
    int irq;
 
86
    qemu_irq irq;
89
87
    CharDriverState *chr;
90
88
    int last_break_enable;
91
 
    target_ulong base;
 
89
    target_phys_addr_t base;
92
90
    int it_shift;
93
91
};
94
92
 
102
100
        s->iir = UART_IIR_NO_INT;
103
101
    }
104
102
    if (s->iir != UART_IIR_NO_INT) {
105
 
        s->set_irq(s->irq_opaque, s->irq, 1);
 
103
        qemu_irq_raise(s->irq);
106
104
    } else {
107
 
        s->set_irq(s->irq_opaque, s->irq, 0);
 
105
        qemu_irq_lower(s->irq);
108
106
    }
109
107
}
110
108
 
345
343
}
346
344
 
347
345
/* If fd is zero, it means that the serial device uses the console */
348
 
SerialState *serial_init(SetIRQFunc *set_irq, void *opaque,
349
 
                         int base, int irq, CharDriverState *chr)
 
346
SerialState *serial_init(int base, qemu_irq irq, CharDriverState *chr)
350
347
{
351
348
    SerialState *s;
352
349
 
353
350
    s = qemu_mallocz(sizeof(SerialState));
354
351
    if (!s)
355
352
        return NULL;
356
 
    s->set_irq = set_irq;
357
 
    s->irq_opaque = opaque;
358
353
    s->irq = irq;
359
354
    s->lsr = UART_LSR_TEMT | UART_LSR_THRE;
360
355
    s->iir = UART_IIR_NO_INT;
371
366
}
372
367
 
373
368
/* Memory mapped interface */
374
 
static uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr)
 
369
uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr)
375
370
{
376
371
    SerialState *s = opaque;
377
372
 
378
373
    return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFF;
379
374
}
380
375
 
381
 
static void serial_mm_writeb (void *opaque,
382
 
                              target_phys_addr_t addr, uint32_t value)
 
376
void serial_mm_writeb (void *opaque,
 
377
                       target_phys_addr_t addr, uint32_t value)
383
378
{
384
379
    SerialState *s = opaque;
385
380
 
386
381
    serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFF);
387
382
}
388
383
 
389
 
static uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr)
 
384
uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr)
390
385
{
391
386
    SerialState *s = opaque;
 
387
    uint32_t val;
392
388
 
393
 
    return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF;
 
389
    val = serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF;
 
390
#ifdef TARGET_WORDS_BIGENDIAN
 
391
    val = bswap16(val);
 
392
#endif
 
393
    return val;
394
394
}
395
395
 
396
 
static void serial_mm_writew (void *opaque,
397
 
                              target_phys_addr_t addr, uint32_t value)
 
396
void serial_mm_writew (void *opaque,
 
397
                       target_phys_addr_t addr, uint32_t value)
398
398
{
399
399
    SerialState *s = opaque;
400
 
 
 
400
#ifdef TARGET_WORDS_BIGENDIAN
 
401
    value = bswap16(value);
 
402
#endif
401
403
    serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFFFF);
402
404
}
403
405
 
404
 
static uint32_t serial_mm_readl (void *opaque, target_phys_addr_t addr)
 
406
uint32_t serial_mm_readl (void *opaque, target_phys_addr_t addr)
405
407
{
406
408
    SerialState *s = opaque;
 
409
    uint32_t val;
407
410
 
408
 
    return serial_ioport_read(s, (addr - s->base) >> s->it_shift);
 
411
    val = serial_ioport_read(s, (addr - s->base) >> s->it_shift);
 
412
#ifdef TARGET_WORDS_BIGENDIAN
 
413
    val = bswap32(val);
 
414
#endif
 
415
    return val;
409
416
}
410
417
 
411
 
static void serial_mm_writel (void *opaque,
412
 
                              target_phys_addr_t addr, uint32_t value)
 
418
void serial_mm_writel (void *opaque,
 
419
                       target_phys_addr_t addr, uint32_t value)
413
420
{
414
421
    SerialState *s = opaque;
415
 
 
 
422
#ifdef TARGET_WORDS_BIGENDIAN
 
423
    value = bswap32(value);
 
424
#endif
416
425
    serial_ioport_write(s, (addr - s->base) >> s->it_shift, value);
417
426
}
418
427
 
428
437
    &serial_mm_writel,
429
438
};
430
439
 
431
 
SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque,
432
 
                             target_ulong base, int it_shift,
433
 
                             int irq, CharDriverState *chr)
 
440
SerialState *serial_mm_init (target_phys_addr_t base, int it_shift,
 
441
                             qemu_irq irq, CharDriverState *chr,
 
442
                             int ioregister)
434
443
{
435
444
    SerialState *s;
436
445
    int s_io_memory;
438
447
    s = qemu_mallocz(sizeof(SerialState));
439
448
    if (!s)
440
449
        return NULL;
441
 
    s->set_irq = set_irq;
442
 
    s->irq_opaque = opaque;
443
450
    s->irq = irq;
444
451
    s->lsr = UART_LSR_TEMT | UART_LSR_THRE;
445
452
    s->iir = UART_IIR_NO_INT;
449
456
 
450
457
    register_savevm("serial", base, 2, serial_save, serial_load, s);
451
458
 
452
 
    s_io_memory = cpu_register_io_memory(0, serial_mm_read,
453
 
                                         serial_mm_write, s);
454
 
    cpu_register_physical_memory(base, 8 << it_shift, s_io_memory);
 
459
    if (ioregister) {
 
460
        s_io_memory = cpu_register_io_memory(0, serial_mm_read,
 
461
                                             serial_mm_write, s);
 
462
        cpu_register_physical_memory(base, 8 << it_shift, s_io_memory);
 
463
    }
455
464
    s->chr = chr;
456
465
    qemu_chr_add_handlers(chr, serial_can_receive1, serial_receive1,
457
466
                          serial_event, s);