Cleanup of the d_mmap_t interface.
- Get rid of the useless atop() / pmap_phys_address() detour. The device mmap handlers must now give back the physical address without atop()'ing it. - Don't borrow the physical address of the mapping in the returned int. Now we properly pass a vm_offset_t * and expect it to be filled by the mmap handler when the mapping was successful. The mmap handler must now return 0 when successful, any other value is considered as an error. Previously, returning -1 was the only way to fail. This change thus accidentally fixes some devices which were bogusly returning errno constants which would have been considered as addresses by the device pager. - Garbage collect the poorly named pmap_phys_address() now that it's no longer used. - Convert all the d_mmap_t consumers to the new API. I'm still not sure wheter we need a __FreeBSD_version bump for this, since and we didn't guarantee API/ABI stability until 5.1-RELEASE. Discussed with: alc, phk, jake Reviewed by: peter Compile-tested on: LINT (i386), GENERIC (alpha and sparc64) Runtime-tested on: i386
This commit is contained in:
parent
f81df38eca
commit
aaed4e8c72
@ -222,7 +222,7 @@ mmrw(dev_t dev, struct uio *uio, int flags)
|
||||
* instead of going through read/write *
|
||||
\*******************************************************/
|
||||
static int
|
||||
memmmap(dev_t dev, vm_offset_t offset, int prot)
|
||||
memmmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
/*
|
||||
* /dev/mem is the only one that makes sense through this
|
||||
@ -238,7 +238,8 @@ memmmap(dev_t dev, vm_offset_t offset, int prot)
|
||||
*/
|
||||
if ((prot & alpha_pa_access(atop((vm_offset_t)offset))) != prot)
|
||||
return (-1);
|
||||
return (alpha_btop(ALPHA_PHYS_TO_K0SEG(offset)));
|
||||
*paddr = ALPHA_PHYS_TO_K0SEG(offset);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -2807,13 +2807,6 @@ pmap_page_protect(vm_page_t m, vm_prot_t prot)
|
||||
}
|
||||
}
|
||||
|
||||
vm_offset_t
|
||||
pmap_phys_address(ppn)
|
||||
int ppn;
|
||||
{
|
||||
return (alpha_ptob(ppn));
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_ts_referenced:
|
||||
*
|
||||
|
@ -215,22 +215,25 @@ mmrw(dev_t dev, struct uio *uio, int flags)
|
||||
* instead of going through read/write *
|
||||
\*******************************************************/
|
||||
static int
|
||||
memmmap(dev_t dev, vm_offset_t offset, int prot)
|
||||
memmmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
switch (minor(dev))
|
||||
{
|
||||
|
||||
/* minor device 0 is physical memory */
|
||||
case 0:
|
||||
return (i386_btop(offset));
|
||||
*paddr = offset;
|
||||
break;
|
||||
|
||||
/* minor device 1 is kernel memory */
|
||||
case 1:
|
||||
return (i386_btop(vtophys(offset)));
|
||||
*paddr = vtophys(offset);
|
||||
break;
|
||||
|
||||
default:
|
||||
return (-1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3124,13 +3124,6 @@ pmap_page_protect(vm_page_t m, vm_prot_t prot)
|
||||
}
|
||||
}
|
||||
|
||||
vm_offset_t
|
||||
pmap_phys_address(ppn)
|
||||
int ppn;
|
||||
{
|
||||
return (i386_ptob(ppn));
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_ts_referenced:
|
||||
*
|
||||
|
@ -722,14 +722,15 @@ agp_ioctl(dev_t kdev, u_long cmd, caddr_t data, int fflag, struct thread *td)
|
||||
}
|
||||
|
||||
static int
|
||||
agp_mmap(dev_t kdev, vm_offset_t offset, int prot)
|
||||
agp_mmap(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
device_t dev = KDEV2DEV(kdev);
|
||||
struct agp_softc *sc = device_get_softc(dev);
|
||||
|
||||
if (offset > AGP_GET_APERTURE(dev))
|
||||
return -1;
|
||||
return atop(rman_get_start(sc->as_aperture) + offset);
|
||||
*paddr = rman_get_start(sc->as_aperture) + offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Implementation of the kernel api */
|
||||
|
@ -753,7 +753,7 @@ bktr_ioctl( dev_t dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct thread *td
|
||||
*
|
||||
*/
|
||||
static int
|
||||
bktr_mmap( dev_t dev, vm_offset_t offset, int nprot )
|
||||
bktr_mmap( dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot )
|
||||
{
|
||||
int unit;
|
||||
bktr_ptr_t bktr;
|
||||
@ -779,7 +779,8 @@ bktr_mmap( dev_t dev, vm_offset_t offset, int nprot )
|
||||
if (offset >= bktr->alloc_pages * PAGE_SIZE)
|
||||
return( -1 );
|
||||
|
||||
return( atop(vtophys(bktr->bigbuf) + offset) );
|
||||
*paddr = vtophys(bktr->bigbuf) + offset;
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -5,7 +5,8 @@
|
||||
#include <vm/vm.h>
|
||||
#include <vm/pmap.h>
|
||||
|
||||
static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot)
|
||||
static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr,
|
||||
int prot)
|
||||
{
|
||||
drm_device_t *dev = kdev->si_drv1;
|
||||
drm_device_dma_t *dma = dev->dma;
|
||||
@ -19,10 +20,11 @@ static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot)
|
||||
physical = dma->pagelist[page];
|
||||
|
||||
DRM_DEBUG("0x%08x (page %lu) => 0x%08lx\n", offset, page, physical);
|
||||
return atop(physical);
|
||||
*paddr = physical;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot)
|
||||
int DRM(mmap)(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
drm_device_t *dev = kdev->si_drv1;
|
||||
drm_map_t *map = NULL;
|
||||
@ -43,7 +45,7 @@ int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot)
|
||||
if (dev->dma
|
||||
&& offset >= 0
|
||||
&& offset < ptoa(dev->dma->page_count))
|
||||
return DRM(dma_mmap)(kdev, offset, prot);
|
||||
return DRM(dma_mmap)(kdev, offset, paddr, prot);
|
||||
|
||||
/* A sequential search of a linked list is
|
||||
fine here because: 1) there will only be
|
||||
@ -72,9 +74,11 @@ int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot)
|
||||
case _DRM_FRAME_BUFFER:
|
||||
case _DRM_REGISTERS:
|
||||
case _DRM_AGP:
|
||||
return atop(offset);
|
||||
*paddr = offset;
|
||||
return 0;
|
||||
case _DRM_SHM:
|
||||
return atop(vtophys(offset));
|
||||
*paddr = vtophys(offset);
|
||||
return 0;
|
||||
default:
|
||||
return -1; /* This should never happen. */
|
||||
}
|
||||
|
@ -501,7 +501,7 @@ fbioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td)
|
||||
}
|
||||
|
||||
static int
|
||||
fbmmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
fbmmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
int unit;
|
||||
|
||||
@ -509,7 +509,7 @@ fbmmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
if (vidcdevsw[unit] == NULL)
|
||||
return ENXIO;
|
||||
return (*vidcdevsw[unit]->d_mmap)(makedev(0, adapter[unit]->va_minor),
|
||||
offset, nprot);
|
||||
offset, paddr, nprot);
|
||||
}
|
||||
|
||||
#if experimental
|
||||
@ -591,9 +591,9 @@ int genfbioctl(genfb_softc_t *sc, video_adapter_t *adp, u_long cmd,
|
||||
}
|
||||
|
||||
int genfbmmap(genfb_softc_t *sc, video_adapter_t *adp, vm_offset_t offset,
|
||||
int prot)
|
||||
vm_offset_t *paddr, int prot)
|
||||
{
|
||||
return (*vidsw[adp->va_index]->mmap)(adp, offset, prot);
|
||||
return (*vidsw[adp->va_index]->mmap)(adp, offset, paddr, prot);
|
||||
}
|
||||
|
||||
#endif /* FB_INSTALL_CDEV */
|
||||
|
@ -81,7 +81,8 @@ typedef int vi_blank_display_t(video_adapter_t *adp, int mode);
|
||||
#define V_DISPLAY_STAND_BY 2
|
||||
#define V_DISPLAY_SUSPEND 3
|
||||
*/
|
||||
typedef int vi_mmap_t(video_adapter_t *adp, vm_offset_t offset, int prot);
|
||||
typedef int vi_mmap_t(video_adapter_t *adp, vm_offset_t offset,
|
||||
vm_offset_t *paddr, int prot);
|
||||
typedef int vi_ioctl_t(video_adapter_t *adp, u_long cmd, caddr_t data);
|
||||
typedef int vi_clear_t(video_adapter_t *adp);
|
||||
typedef int vi_fill_rect_t(video_adapter_t *adp, int val, int x, int y,
|
||||
@ -212,7 +213,7 @@ int genfbwrite(genfb_softc_t *sc, video_adapter_t *adp,
|
||||
int genfbioctl(genfb_softc_t *sc, video_adapter_t *adp,
|
||||
u_long cmd, caddr_t arg, int flag, struct thread *td);
|
||||
int genfbmmap(genfb_softc_t *sc, video_adapter_t *adp,
|
||||
vm_offset_t offset, int prot);
|
||||
vm_offset_t offset, vm_offset_t *paddr, int prot);
|
||||
|
||||
#endif /* FB_INSTALL_CDEV */
|
||||
|
||||
|
@ -451,20 +451,14 @@ gfb_set_hw_cursor_shape(video_adapter_t *adp, int base, int height,
|
||||
}
|
||||
|
||||
int
|
||||
gfb_mmap(video_adapter_t *adp, vm_offset_t offset, int prot)
|
||||
gfb_mmap(video_adapter_t *adp, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
int error;
|
||||
|
||||
/* XXX */
|
||||
if(offset > adp->va_window_size - PAGE_SIZE)
|
||||
error = ENXIO;
|
||||
#ifdef __i386__
|
||||
error = i386_btop(adp->va_info.vi_window + offset);
|
||||
#elsif defined(__alpha__)
|
||||
error = alpha_btop(adp->va_info.vi_window + offset);
|
||||
#else
|
||||
error = ENXIO;
|
||||
#endif
|
||||
return(error);
|
||||
return(ENXIO);
|
||||
*paddr = adp->va_info.vi_window + offset;
|
||||
return(0);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -389,9 +389,10 @@ s3lfb_blank_display(video_adapter_t *adp, int mode)
|
||||
}
|
||||
|
||||
static int
|
||||
s3lfb_mmap(video_adapter_t *adp, vm_offset_t offset, int prot)
|
||||
s3lfb_mmap(video_adapter_t *adp, vm_offset_t offset, vm_offset_t *paddr,
|
||||
int prot)
|
||||
{
|
||||
return (*prevvidsw->mmap)(adp, offset, prot);
|
||||
return (*prevvidsw->mmap)(adp, offset, paddr, prot);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -133,9 +133,10 @@ vga_ioctl(dev_t dev, vga_softc_t *sc, u_long cmd, caddr_t arg, int flag,
|
||||
}
|
||||
|
||||
int
|
||||
vga_mmap(dev_t dev, vga_softc_t *sc, vm_offset_t offset, int prot)
|
||||
vga_mmap(dev_t dev, vga_softc_t *sc, vm_offset_t offset, vm_offset_t *paddr,
|
||||
int prot)
|
||||
{
|
||||
return genfbmmap(&sc->gensc, sc->adp, offset, prot);
|
||||
return genfbmmap(&sc->gensc, sc->adp, offset, paddr, prot);
|
||||
}
|
||||
|
||||
#endif /* FB_INSTALL_CDEV */
|
||||
@ -2449,7 +2450,8 @@ vga_blank_display(video_adapter_t *adp, int mode)
|
||||
* all adapters
|
||||
*/
|
||||
static int
|
||||
vga_mmap_buf(video_adapter_t *adp, vm_offset_t offset, int prot)
|
||||
vga_mmap_buf(video_adapter_t *adp, vm_offset_t offset, vm_offset_t *paddr,
|
||||
int prot)
|
||||
{
|
||||
if (adp->va_info.vi_flags & V_INFO_LINEAR)
|
||||
return -1;
|
||||
@ -2463,15 +2465,8 @@ vga_mmap_buf(video_adapter_t *adp, vm_offset_t offset, int prot)
|
||||
if (offset > adp->va_window_size - PAGE_SIZE)
|
||||
return -1;
|
||||
|
||||
#ifdef __i386__
|
||||
return i386_btop(adp->va_info.vi_window + offset);
|
||||
#endif
|
||||
#ifdef __alpha__
|
||||
return alpha_btop(adp->va_info.vi_window + offset);
|
||||
#endif
|
||||
#ifdef __ia64__
|
||||
return ia64_btop(adp->va_info.vi_window + offset);
|
||||
#endif
|
||||
*paddr = adp->va_info.vi_window + offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef VGA_NO_MODE_CHANGE
|
||||
|
@ -87,7 +87,7 @@ int vga_write(dev_t dev, vga_softc_t *sc, struct uio *uio, int flag);
|
||||
int vga_ioctl(dev_t dev, vga_softc_t *sc, u_long cmd, caddr_t arg,
|
||||
int flag, struct thread *td);
|
||||
int vga_mmap(dev_t dev, vga_softc_t *sc, vm_offset_t offset,
|
||||
int prot);
|
||||
vm_offset_t *paddr, int prot);
|
||||
#endif
|
||||
|
||||
extern int (*vga_sub_configure)(int flags);
|
||||
|
@ -921,13 +921,13 @@ fw_poll(dev_t dev, int events, fw_proc *td)
|
||||
}
|
||||
|
||||
static int
|
||||
fw_mmap (dev_t dev, vm_offset_t offset, int nproto)
|
||||
fw_mmap (dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nproto)
|
||||
{
|
||||
struct firewire_softc *fc;
|
||||
int unit = DEV2UNIT(dev);
|
||||
|
||||
if (DEV_FWMEM(dev))
|
||||
return fwmem_mmap(dev, offset, nproto);
|
||||
return fwmem_mmap(dev, offset, paddr, nproto);
|
||||
|
||||
fc = devclass_get_softc(firewire_devclass, unit);
|
||||
|
||||
|
@ -419,7 +419,7 @@ fwmem_poll (dev_t dev, int events, fw_proc *td)
|
||||
return EINVAL;
|
||||
}
|
||||
int
|
||||
fwmem_mmap (dev_t dev, vm_offset_t offset, int nproto)
|
||||
fwmem_mmap (dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nproto)
|
||||
{
|
||||
return EINVAL;
|
||||
}
|
||||
|
@ -313,12 +313,12 @@ pcigfb_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td)
|
||||
}
|
||||
|
||||
int
|
||||
pcigfb_mmap(dev_t dev, vm_offset_t offset, int prot)
|
||||
pcigfb_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
struct gfb_softc *sc;
|
||||
|
||||
sc = (struct gfb_softc *)devclass_get_softc(gfb_devclass, minor(dev));
|
||||
return genfbmmap(&sc->gensc, sc->adp, offset, prot);
|
||||
return genfbmmap(&sc->gensc, sc->adp, offset, paddr, prot);
|
||||
}
|
||||
|
||||
#endif /*FB_INSTALL_CDEV*/
|
||||
|
@ -990,11 +990,10 @@ dsp_poll(dev_t i_dev, int events, struct thread *td)
|
||||
}
|
||||
|
||||
static int
|
||||
dsp_mmap(dev_t i_dev, vm_offset_t offset, int nprot)
|
||||
dsp_mmap(dev_t i_dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
struct pcm_channel *wrch = NULL, *rdch = NULL, *c;
|
||||
intrmask_t s;
|
||||
int ret;
|
||||
|
||||
if (nprot & PROT_EXEC)
|
||||
return -1;
|
||||
@ -1034,11 +1033,11 @@ dsp_mmap(dev_t i_dev, vm_offset_t offset, int nprot)
|
||||
if (!(c->flags & CHN_F_MAPPED))
|
||||
c->flags |= CHN_F_MAPPED;
|
||||
|
||||
ret = atop(vtophys(sndbuf_getbufofs(c->bufsoft, offset)));
|
||||
*paddr = vtophys(sndbuf_getbufofs(c->bufsoft, offset));
|
||||
relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
|
||||
|
||||
splx(s);
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -3364,14 +3364,14 @@ scgetc(sc_softc_t *sc, u_int flags)
|
||||
}
|
||||
|
||||
static int
|
||||
scmmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
scmmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
scr_stat *scp;
|
||||
|
||||
scp = SC_STAT(dev);
|
||||
if (scp != scp->sc->cur_scp)
|
||||
return -1;
|
||||
return (*vidsw[scp->sc->adapter]->mmap)(scp->sc->adp, offset, nprot);
|
||||
return (*vidsw[scp->sc->adapter]->mmap)(scp->sc->adp, offset, paddr, nprot);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -441,7 +441,7 @@ tdfx_close(dev_t dev, int fflag, int devtype, struct thread *td)
|
||||
}
|
||||
|
||||
static int
|
||||
tdfx_mmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
tdfx_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
/*
|
||||
* mmap(2) is called by a user process to request that an area of memory
|
||||
@ -472,14 +472,17 @@ tdfx_mmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
/* We must stay within the bound of our address space */
|
||||
if((offset & 0xff000000) == tdfx_info[0]->addr0) {
|
||||
offset &= 0xffffff;
|
||||
return atop(rman_get_start(tdfx_info[0]->memrange) + offset);
|
||||
*paddr = rman_get_start(tdfx_info[0]->memrange) + offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(tdfx_count > 1) {
|
||||
tdfx_info[1] = (struct tdfx_softc*)devclass_get_softc(tdfx_devclass, 1);
|
||||
if((offset & 0xff000000) == tdfx_info[1]->addr0) {
|
||||
offset &= 0xffffff;
|
||||
return atop(rman_get_start(tdfx_info[1]->memrange) + offset);
|
||||
*paddr = rman_get_start(tdfx_info[1]->memrange) +
|
||||
offset;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -122,15 +122,17 @@ static struct cdevsw geom_stats_cdevsw = {
|
||||
};
|
||||
|
||||
static int
|
||||
g_stat_mmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
g_stat_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
struct statspage *spp;
|
||||
|
||||
if (nprot != VM_PROT_READ)
|
||||
return (-1);
|
||||
TAILQ_FOREACH(spp, &pagelist, list) {
|
||||
if (offset == 0)
|
||||
return (vtophys(spp->stat) >> PAGE_SHIFT);
|
||||
if (offset == 0) {
|
||||
*paddr = vtophys(spp->stat);
|
||||
return (0);
|
||||
}
|
||||
offset -= PAGE_SIZE;
|
||||
}
|
||||
return (-1);
|
||||
|
@ -309,14 +309,15 @@ elan_write(dev_t dev, struct uio *uio, int ioflag)
|
||||
}
|
||||
|
||||
static int
|
||||
elan_mmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
elan_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
|
||||
if (minor(dev) != ELAN_MMCR)
|
||||
return (EOPNOTSUPP);
|
||||
if (offset >= 0x1000)
|
||||
return (-1);
|
||||
return (i386_btop(0xfffef000));
|
||||
*paddr = 0xfffef000;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -215,22 +215,25 @@ mmrw(dev_t dev, struct uio *uio, int flags)
|
||||
* instead of going through read/write *
|
||||
\*******************************************************/
|
||||
static int
|
||||
memmmap(dev_t dev, vm_offset_t offset, int prot)
|
||||
memmmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
switch (minor(dev))
|
||||
{
|
||||
|
||||
/* minor device 0 is physical memory */
|
||||
case 0:
|
||||
return (i386_btop(offset));
|
||||
*paddr = offset;
|
||||
break;
|
||||
|
||||
/* minor device 1 is kernel memory */
|
||||
case 1:
|
||||
return (i386_btop(vtophys(offset)));
|
||||
*paddr = vtophys(offset);
|
||||
break;
|
||||
|
||||
default:
|
||||
return (-1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3124,13 +3124,6 @@ pmap_page_protect(vm_page_t m, vm_prot_t prot)
|
||||
}
|
||||
}
|
||||
|
||||
vm_offset_t
|
||||
pmap_phys_address(ppn)
|
||||
int ppn;
|
||||
{
|
||||
return (i386_ptob(ppn));
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_ts_referenced:
|
||||
*
|
||||
|
@ -420,11 +420,12 @@ pcvt_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td)
|
||||
* driver mmap
|
||||
*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
pcvt_mmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
pcvt_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
if (offset > 0x20000 - PAGE_SIZE)
|
||||
return -1;
|
||||
return i386_btop((0xa0000 + offset));
|
||||
*paddr = 0xa0000 + offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
|
@ -273,7 +273,7 @@ struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[unit];
|
||||
}
|
||||
|
||||
static int
|
||||
spigot_mmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
spigot_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[0];
|
||||
|
||||
@ -285,5 +285,6 @@ struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[0];
|
||||
if(nprot & PROT_EXEC)
|
||||
return -1;
|
||||
|
||||
return i386_btop(ss->maddr);
|
||||
*paddr = ss->maddr;
|
||||
return 0;
|
||||
}
|
||||
|
@ -1278,7 +1278,8 @@ vesa_blank_display(video_adapter_t *adp, int mode)
|
||||
}
|
||||
|
||||
static int
|
||||
vesa_mmap(video_adapter_t *adp, vm_offset_t offset, int prot)
|
||||
vesa_mmap(video_adapter_t *adp, vm_offset_t offset, vm_offset_t *paddr,
|
||||
int prot)
|
||||
{
|
||||
#if VESA_DEBUG > 0
|
||||
printf("vesa_mmap(): window:0x%x, buffer:0x%x, offset:0x%x\n",
|
||||
@ -1290,14 +1291,10 @@ vesa_mmap(video_adapter_t *adp, vm_offset_t offset, int prot)
|
||||
/* XXX: is this correct? */
|
||||
if (offset > adp->va_window_size - PAGE_SIZE)
|
||||
return -1;
|
||||
#ifdef __i386__
|
||||
return i386_btop(adp->va_info.vi_buffer + offset);
|
||||
#endif
|
||||
#ifdef __alpha__ /* XXX */
|
||||
return alpha_btop(adp->va_info.vi_buffer + offset);
|
||||
#endif
|
||||
*paddr = adp->va_info.vi_buffer + offset;
|
||||
return 0;
|
||||
} else {
|
||||
return (*prevvidsw->mmap)(adp, offset, prot);
|
||||
return (*prevvidsw->mmap)(adp, offset, paddr, prot);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -221,7 +221,7 @@ mmrw(dev_t dev, struct uio *uio, int flags)
|
||||
* instead of going through read/write *
|
||||
\*******************************************************/
|
||||
static int
|
||||
memmmap(dev_t dev, vm_offset_t offset, int prot)
|
||||
memmmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
/*
|
||||
* /dev/mem is the only one that makes sense through this
|
||||
@ -237,7 +237,8 @@ memmmap(dev_t dev, vm_offset_t offset, int prot)
|
||||
*/
|
||||
if ((prot & ia64_pa_access(atop((vm_offset_t)offset))) != prot)
|
||||
return (-1);
|
||||
return (ia64_btop(IA64_PHYS_TO_RR7(offset)));
|
||||
*paddr = IA64_PHYS_TO_RR7(offset);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -2236,12 +2236,6 @@ pmap_page_protect(vm_page_t m, vm_prot_t prot)
|
||||
}
|
||||
}
|
||||
|
||||
vm_offset_t
|
||||
pmap_phys_address(int ppn)
|
||||
{
|
||||
return (ia64_ptob(ppn));
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_ts_referenced:
|
||||
*
|
||||
|
@ -196,9 +196,9 @@ isavga_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td)
|
||||
}
|
||||
|
||||
static int
|
||||
isavga_mmap(dev_t dev, vm_offset_t offset, int prot)
|
||||
isavga_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
return vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, prot);
|
||||
return vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, paddr, prot);
|
||||
}
|
||||
|
||||
#endif /* FB_INSTALL_CDEV */
|
||||
|
@ -132,9 +132,10 @@ nokqfilter(dev, kn)
|
||||
}
|
||||
|
||||
int
|
||||
nommap(dev, offset, nprot)
|
||||
nommap(dev, offset, paddr, nprot)
|
||||
dev_t dev;
|
||||
vm_offset_t offset;
|
||||
vm_offset_t *paddr;
|
||||
int nprot;
|
||||
{
|
||||
|
||||
|
@ -397,12 +397,12 @@ gdcioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td)
|
||||
}
|
||||
|
||||
static int
|
||||
gdcmmap(dev_t dev, vm_offset_t offset, int prot)
|
||||
gdcmmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
gdc_softc_t *sc;
|
||||
|
||||
sc = GDC_SOFTC(GDC_UNIT(dev));
|
||||
return genfbmmap(&sc->gensc, sc->adp, offset, prot);
|
||||
return genfbmmap(&sc->gensc, sc->adp, offset, paddr, prot);
|
||||
}
|
||||
|
||||
#endif /* FB_INSTALL_CDEV */
|
||||
|
@ -397,12 +397,12 @@ gdcioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td)
|
||||
}
|
||||
|
||||
static int
|
||||
gdcmmap(dev_t dev, vm_offset_t offset, int prot)
|
||||
gdcmmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
gdc_softc_t *sc;
|
||||
|
||||
sc = GDC_SOFTC(GDC_UNIT(dev));
|
||||
return genfbmmap(&sc->gensc, sc->adp, offset, prot);
|
||||
return genfbmmap(&sc->gensc, sc->adp, offset, paddr, prot);
|
||||
}
|
||||
|
||||
#endif /* FB_INSTALL_CDEV */
|
||||
|
@ -3383,14 +3383,14 @@ scgetc(sc_softc_t *sc, u_int flags)
|
||||
}
|
||||
|
||||
static int
|
||||
scmmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
scmmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
scr_stat *scp;
|
||||
|
||||
scp = SC_STAT(dev);
|
||||
if (scp != scp->sc->cur_scp)
|
||||
return -1;
|
||||
return (*vidsw[scp->sc->adapter]->mmap)(scp->sc->adp, offset, nprot);
|
||||
return (*vidsw[scp->sc->adapter]->mmap)(scp->sc->adp, offset, paddr, nprot);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -722,14 +722,15 @@ agp_ioctl(dev_t kdev, u_long cmd, caddr_t data, int fflag, struct thread *td)
|
||||
}
|
||||
|
||||
static int
|
||||
agp_mmap(dev_t kdev, vm_offset_t offset, int prot)
|
||||
agp_mmap(dev_t kdev, vm_offset_t offset, vm_offset_t *paddr, int prot)
|
||||
{
|
||||
device_t dev = KDEV2DEV(kdev);
|
||||
struct agp_softc *sc = device_get_softc(dev);
|
||||
|
||||
if (offset > AGP_GET_APERTURE(dev))
|
||||
return -1;
|
||||
return atop(rman_get_start(sc->as_aperture) + offset);
|
||||
*paddr = rman_get_start(sc->as_aperture) + offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Implementation of the kernel api */
|
||||
|
@ -2107,7 +2107,7 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td)
|
||||
}
|
||||
|
||||
int
|
||||
meteor_mmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
meteor_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
|
||||
int unit;
|
||||
@ -2126,6 +2126,7 @@ meteor_mmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
if(offset >= mtr->alloc_pages * PAGE_SIZE)
|
||||
return -1;
|
||||
|
||||
return i386_btop(vtophys(mtr->bigbuf) + offset);
|
||||
*paddr = vtophys(mtr->bigbuf) + offset;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -136,12 +136,13 @@ xrpu_close(dev_t dev, int flag, int mode, struct thread *td)
|
||||
}
|
||||
|
||||
static int
|
||||
xrpu_mmap(dev_t dev, vm_offset_t offset, int nprot)
|
||||
xrpu_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int nprot)
|
||||
{
|
||||
struct softc *sc = dev->si_drv1;
|
||||
if (offset >= 0x1000000)
|
||||
return (-1);
|
||||
return (i386_btop(sc->physbase + offset));
|
||||
*paddr = sc->physbase + offset;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1452,13 +1452,6 @@ pmap_protect(pmap_t pm, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
|
||||
}
|
||||
}
|
||||
|
||||
vm_offset_t
|
||||
pmap_phys_address(int ppn)
|
||||
{
|
||||
TODO;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Map a list of wired pages into kernel virtual address space. This is
|
||||
* intended for temporary mappings which do not need page modification or
|
||||
|
@ -1452,13 +1452,6 @@ pmap_protect(pmap_t pm, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
|
||||
}
|
||||
}
|
||||
|
||||
vm_offset_t
|
||||
pmap_phys_address(int ppn)
|
||||
{
|
||||
TODO;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Map a list of wired pages into kernel virtual address space. This is
|
||||
* intended for temporary mappings which do not need page modification or
|
||||
|
@ -1452,13 +1452,6 @@ pmap_protect(pmap_t pm, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
|
||||
}
|
||||
}
|
||||
|
||||
vm_offset_t
|
||||
pmap_phys_address(int ppn)
|
||||
{
|
||||
TODO;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Map a list of wired pages into kernel virtual address space. This is
|
||||
* intended for temporary mappings which do not need page modification or
|
||||
|
@ -1778,13 +1778,6 @@ pmap_page_protect(vm_page_t m, vm_prot_t prot)
|
||||
}
|
||||
}
|
||||
|
||||
vm_offset_t
|
||||
pmap_phys_address(int ppn)
|
||||
{
|
||||
|
||||
return (sparc64_ptob(ppn));
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_ts_referenced:
|
||||
*
|
||||
|
@ -157,7 +157,8 @@ typedef int d_read_t(dev_t dev, struct uio *uio, int ioflag);
|
||||
typedef int d_write_t(dev_t dev, struct uio *uio, int ioflag);
|
||||
typedef int d_poll_t(dev_t dev, int events, struct thread *td);
|
||||
typedef int d_kqfilter_t(dev_t dev, struct knote *kn);
|
||||
typedef int d_mmap_t(dev_t dev, vm_offset_t offset, int nprot);
|
||||
typedef int d_mmap_t(dev_t dev, vm_offset_t offset, vm_offset_t *paddr,
|
||||
int nprot);
|
||||
|
||||
typedef int l_open_t(dev_t dev, struct tty *tp);
|
||||
typedef int l_close_t(struct tty *tp, int flag);
|
||||
|
@ -157,7 +157,8 @@ typedef int d_read_t(dev_t dev, struct uio *uio, int ioflag);
|
||||
typedef int d_write_t(dev_t dev, struct uio *uio, int ioflag);
|
||||
typedef int d_poll_t(dev_t dev, int events, struct thread *td);
|
||||
typedef int d_kqfilter_t(dev_t dev, struct knote *kn);
|
||||
typedef int d_mmap_t(dev_t dev, vm_offset_t offset, int nprot);
|
||||
typedef int d_mmap_t(dev_t dev, vm_offset_t offset, vm_offset_t *paddr,
|
||||
int nprot);
|
||||
|
||||
typedef int l_open_t(dev_t dev, struct tty *tp);
|
||||
typedef int l_close_t(struct tty *tp, int flag);
|
||||
|
@ -107,7 +107,7 @@ dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, vm_ooffset_t fo
|
||||
d_mmap_t *mapfunc;
|
||||
vm_object_t object;
|
||||
unsigned int npages;
|
||||
vm_offset_t off;
|
||||
vm_offset_t off, paddr;
|
||||
|
||||
/*
|
||||
* Offset should be page aligned.
|
||||
@ -137,7 +137,7 @@ dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, vm_ooffset_t fo
|
||||
*/
|
||||
npages = OFF_TO_IDX(size);
|
||||
for (off = foff; npages--; off += PAGE_SIZE)
|
||||
if ((*mapfunc)(dev, off, (int) prot) == -1) {
|
||||
if ((*mapfunc)(dev, off, &paddr, (int)prot) != 0) {
|
||||
mtx_unlock(&Giant);
|
||||
return (NULL);
|
||||
}
|
||||
@ -205,7 +205,7 @@ dev_pager_getpages(object, m, count, reqpage)
|
||||
vm_offset_t paddr;
|
||||
vm_page_t page;
|
||||
dev_t dev;
|
||||
int i;
|
||||
int i, ret;
|
||||
d_mmap_t *mapfunc;
|
||||
int prot;
|
||||
|
||||
@ -218,11 +218,11 @@ dev_pager_getpages(object, m, count, reqpage)
|
||||
if (mapfunc == NULL || mapfunc == (d_mmap_t *)nullop)
|
||||
panic("dev_pager_getpage: no map function");
|
||||
|
||||
paddr = pmap_phys_address((*mapfunc) (dev, (vm_offset_t) offset << PAGE_SHIFT, prot));
|
||||
KASSERT(paddr != -1,("dev_pager_getpage: map function returns error"));
|
||||
ret = (*mapfunc)(dev, (vm_offset_t)offset << PAGE_SHIFT, &paddr, prot);
|
||||
KASSERT(ret == 0, ("dev_pager_getpage: map function returns error"));
|
||||
/*
|
||||
* Replace the passed in reqpage page with our own fake page and free up the
|
||||
* all of the original pages.
|
||||
* Replace the passed in reqpage page with our own fake page and
|
||||
* free up the all of the original pages.
|
||||
*/
|
||||
page = dev_pager_getfake(paddr);
|
||||
TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist, page, pageq);
|
||||
|
@ -119,7 +119,6 @@ void pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
|
||||
int pagelimit);
|
||||
boolean_t pmap_page_exists_quick(pmap_t pmap, vm_page_t m);
|
||||
void pmap_page_protect(vm_page_t m, vm_prot_t prot);
|
||||
vm_offset_t pmap_phys_address(int);
|
||||
void pmap_pinit(pmap_t);
|
||||
void pmap_pinit0(pmap_t);
|
||||
void pmap_pinit2(pmap_t);
|
||||
|
Loading…
Reference in New Issue
Block a user