diff --git a/linux-core/drm_bufs.c b/linux-core/drm_bufs.c index e0bce2aa..df780716 100644 --- a/linux-core/drm_bufs.c +++ b/linux-core/drm_bufs.c @@ -121,13 +121,33 @@ int DRM(addmap)( DRM_OS_IOCTL ) } DRM_DEBUG( "offset = 0x%08lx, size = 0x%08lx, type = %d\n", map->offset, map->size, map->type ); +#ifdef __linux__ if ( (map->offset & (~PAGE_MASK)) || (map->size & (~PAGE_MASK)) ) { +#endif +#ifdef __FreeBSD__ + if ( (map->offset & PAGE_MASK) || (map->size & PAGE_MASK) ) { +#endif DRM(free)( map, sizeof(*map), DRM_MEM_MAPS ); DRM_OS_RETURN(EINVAL); } map->mtrr = -1; map->handle = 0; +#ifdef __FreeBSD__ + TAILQ_FOREACH(list, dev->maplist, link) { + drm_map_t *entry = list->map; + if ( (entry->offset >= map->offset + && (entry->offset) < (map->offset + map->size) ) + || ((entry->offset + entry->size) >= map->offset + && (entry->offset + entry->size) < (map->offset + map->size) ) + || ((entry->offset < map->offset) + && (entry->offset + entry->size) >= (map->offset + map->size) ) ) + DRM_DEBUG("map collission: add(0x%x-0x%x), current(0x%x-0x%x)\n", + entry->offset, entry->offset + entry->size - 1, + map->offset, map->offset + map->size - 1); + } +#endif + switch ( map->type ) { case _DRM_REGISTERS: case _DRM_FRAME_BUFFER: diff --git a/linux/drm_bufs.h b/linux/drm_bufs.h index e0bce2aa..df780716 100644 --- a/linux/drm_bufs.h +++ b/linux/drm_bufs.h @@ -121,13 +121,33 @@ int DRM(addmap)( DRM_OS_IOCTL ) } DRM_DEBUG( "offset = 0x%08lx, size = 0x%08lx, type = %d\n", map->offset, map->size, map->type ); +#ifdef __linux__ if ( (map->offset & (~PAGE_MASK)) || (map->size & (~PAGE_MASK)) ) { +#endif +#ifdef __FreeBSD__ + if ( (map->offset & PAGE_MASK) || (map->size & PAGE_MASK) ) { +#endif DRM(free)( map, sizeof(*map), DRM_MEM_MAPS ); DRM_OS_RETURN(EINVAL); } map->mtrr = -1; map->handle = 0; +#ifdef __FreeBSD__ + TAILQ_FOREACH(list, dev->maplist, link) { + drm_map_t *entry = list->map; + if ( (entry->offset >= map->offset + && (entry->offset) < (map->offset + map->size) ) + || ((entry->offset + entry->size) >= map->offset + && (entry->offset + entry->size) < (map->offset + map->size) ) + || ((entry->offset < map->offset) + && (entry->offset + entry->size) >= (map->offset + map->size) ) ) + DRM_DEBUG("map collission: add(0x%x-0x%x), current(0x%x-0x%x)\n", + entry->offset, entry->offset + entry->size - 1, + map->offset, map->offset + map->size - 1); + } +#endif + switch ( map->type ) { case _DRM_REGISTERS: case _DRM_FRAME_BUFFER: