qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] QEMU ARM PXA on FreeBSD issues


From: Mark Tinguely
Subject: [Qemu-devel] QEMU ARM PXA on FreeBSD issues
Date: Fri, 20 Mar 2009 10:14:08 -0500 (CDT)

There are a couple qemu-system-arm issues on the PXA under the OS FreeBSD.
I told the freebsd-arm mailling list that I would bring these issues to
the qemu developers attention.

1) The uart is not discovered (I seen this on qemu 0.9.x and on 0.10.0).

  FreeBSD uses the UART Unit Enable bit on the Interrupt Enable Register
  in the UART probe to determine if a UART is active. Unlike hardware, qemu
  does not raise this bit, and the Full Function UART at 0x40100000 is not
  being enabled. It appears that NetBSD and Linux do not check the status
  of the UUE to active a UART.

  It would be nice for FreeBSD, if the UART Unit Enable (UUE) bit is
  raised on the UARTs that qemu activate.

2) qemu 0.10.0 on FreeBSD 8.0-current passes the wrong value of "offset" to the 
   qemu routine smc91c111_readb() in hw/smc91c111.c. This routine works fine
   under FreeBSD 6.4.

    The FreeBSD 8-current error message is:

 qemu: fatal: smc91c111_read: Bad reg 0:30e
 
 R00=00000000 R01=c5e1f300 R02=0000000e R03=c0a778e0
 R04=c0ba8300 R05=c0baab00 R06=00000003 R07=00000001
 R08=00000000 R09=00000000 R10=c0bb4540 R11=c00fbc50
 R12=c00fbc54 R13=c00fbc44 R14=c0403950 R15=c03e8bac
 PSR=a0000113 N-C- A svc32
 
 Notice register 2 has the correct value of 0x0e.

This routine worked fine under qemu 0.9.x compiled under FreeBSD 8-current.
I thought this was caused by FreeBSD 8-current gcc version 4.2.1 20070719
compiler, but this also happens on FreeBSD 8-current when compiling the
code with gcc version 3.6.4 and gcc version 3.4.1.

A temporary solution is to run qemu under FreeBSD 6.4, or FreeBSD 8-current
users can mask the offset before use:

static uint32_t smc91c111_readb(void *opaque, target_phys_addr_t offset)
{
    smc91c111_state *s = (smc91c111_state *)opaque;

+    offset = offset & 0xff;
    if (offset == 14) {
        return s->bank;
    }
    if (offset == 15)
        return 0x33;
    switch (s->bank) {

Thank-you.

--Mark Tinguely




reply via email to

[Prev in Thread] Current Thread [Next in Thread]