Subject: Re: Any way to get virtual addr from pci_mapreg_map()?
To: Chris G. Demetriou <cgd@pa.dec.com>
From: Dave Huang <khym@bga.com>
List: tech-kern
Date: 08/12/1997 17:32:31
On Tue, 12 Aug 1997, Chris G. Demetriou wrote:
> "so, fix it."  That is not portable code.  Device memory may not be
> mapped linearly, and indeed on many systems _is not_ mapped inearly.

Okay, done, I think :) Well, almost... see below...

> Do you know off-hand whether the mapping registers say that the region
> is prefetchable or not?  (I'm just wondering for my own curiosity; it
> doesn't affect anything i've said here.)

How can I tell? Is this the PCI_MAPREG_MEM_CACHEABLE bit from pcireg.h? If
so, no, it's not set on my 53c875 (ASUS SC875 card).

So, I've got everything using the bus_space_* stuff, and it seems to be
working just fine... except I tried using bus_space_write_multi_4 to
copy the microcode over to the card, and it made my machine reboot. So,
I'm currently using bus_space_write_4 in a loop, which works okay.

I think it's a gcc optimizer bug, but I'm not sure... it looks like gcc
isn't paying attention to the list of registers that are used by the
__asm() code in bus_space_write_multi_4. The following demonstrates the
bug when compiled with -O or -O2:

#include <sys/time.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <machine/bus.h>

struct z {
  bus_space_handle_t h;
  bus_space_tag_t t;
  char *p;
};

void bla(struct z *p)
{
    bus_space_write_1 (p->t, p->h, 2, 3);

    bus_space_write_multi_4(p->t, p->h, 0, p->p, 1);
}

cc -S -O generates:

L204:
        movl (%ebx),%eax
        movl 8(%ebx),%esi
        movl $1,%ecx
#APP

cld     
                                ;                       1:      lodsl           
                        ;                               movl %eax,(%eax)        
                        ;                               loop 1b
#NO_APP
L202:

notice how gcc decides to use eax as the destination pointer, ignoring
that the lodsl has put its own stuff in eax.

Removing the bus_space_write_1 line makes the code work again.

This is on an i386, btw... feel free to redirect replies to port-i386 or
wherever it's most appropriate :)
-- 
Name: Dave Huang     |   Mammal, mammal / their names are called /
INet: khym@bga.com   |   they raise a paw / the bat, the cat /
FurryMUCK: Dahan     |   dolphin and dog / koala bear and hog -- TMBG
Dahan: Hani G Y+C 21 Y++ L+++ W- C++ T++ A+ E+ S++ V++ F- Q+++ P+ B+ PA+ PL++