Subject: Re: mmap problems
To: Jared D. McNeill <jmcneill@invisible.yi.org>
From: Chuck Silvers <chuq@chuq.com>
List: tech-kern
Date: 05/27/2001 11:09:35
hi,

if "offset" is a signed 32-bit variable then what's happening is that
it's being sign-extended what cast to off_t, making the offset negative,
which isn't what you want.  make sure that the upper bits of the value
passed to mmap() as the offset are zero.

-Chuck


On Sun, May 27, 2001 at 02:02:17PM -0300, Jared D. McNeill wrote:
> I've been working on updating the emulators/snes9x package to 1.37c, and
> in the process I remembered that DGA didn't work in the current package.
> So, I've been poking around with things, and it looks like mmap is failing
> where it shouldn't be.
> 
> >From XF86DGA.c:
>    /* This requires linux-0.99.pl10 or above */
>    *addr = (void *)mmap(NULL, *bank, PROT_READ,
>                         MAP_FILE | MAP_SHARED, fd,
>                         (off_t)offset + bus_base_addr);
> #ifdef DEBUG
>    fprintf(stderr, "XF86DGAGetVideo: physaddr: 0x%08x, size: %d\n",
>            (long)offset, *bank);
> #endif
>    if (*addr == (char *) -1) {
>         fprintf(stderr, "XF86DGAGetVideo: failed to mmap %s (%s)\n",
>                            DEV_MEM, strerror(errno));
>         exit (-2);
>    }
> 
> Running snes9x (with DGA support) at securelevel -1 (with or without the
> aperture driver loaded) yields the following:
> 
> sun:/home/jmcneill/roms# snes9x -y starfox.zip
> Rate: 22050, Buffer size: 1024, 16-bit: yes, Stereo: yes, Encoded: yes
> Found ROM file header (and ignored it).
> "STAR FOX" [checksum ok] LoROM, 8Mbits, Type: ROM+SuperFX, Mode: 20, TV:
> NTSC, S-RAM: 64Kb, ROMId: ???? Company: ??
> XF86DGAGetVideo: physaddr: 0xca000000, size: 16646144
> XF86DGAGetVideo: failed to mmap /dev/mem (Invalid argument)
> 
> According to the mmap(2) man page, mmap should only fail with EINVAL and
> the flags that XF86DGAGetVideo uses if len (in this case, size (which is
> 16646144)) is less than zero.
> 
> The current xmame package exhibits the same behavior. Is this a bug with
> UVM, mmap, or libXxf86dga?
> 
> Thanks,
> Jared