Patched fbcon to compile on newer Linux kernels that don't #define PAGE_SIZE, SDL-1.2
authorRyan C. Gordon <icculus@icculus.org>
Thu, 15 Feb 2007 23:50:45 +0000
branchSDL-1.2
changeset 3917 8a3a0f1179f3
parent 3916 16f7767f9580
child 3918 f16c15f3bc2b
Patched fbcon to compile on newer Linux kernels that don't #define PAGE_SIZE, since a memory page's size may vary on various architectures and kernel configurations. Will use getpagesize() if it exists, the PAGE_SIZE #define from older kernels if that doesn't, and #error out if that's not there either...but it's probably 4096 in that case. We may revisit this. Fixes Bugzilla #392.
configure.in
include/SDL_config.h.in
src/video/fbcon/SDL_fbvideo.c
--- a/configure.in	Thu Feb 15 11:06:22 2007 +0000
+++ b/configure.in	Thu Feb 15 23:50:45 2007 +0000
@@ -1125,6 +1125,7 @@
         ])
         AC_MSG_RESULT($video_fbcon)
         if test x$video_fbcon = xyes; then
+            AC_CHECK_FUNCS(getpagesize)
             AC_DEFINE(SDL_VIDEO_DRIVER_FBCON)
             SOURCES="$SOURCES $srcdir/src/video/fbcon/*.c"
             have_video=yes
--- a/include/SDL_config.h.in	Thu Feb 15 11:06:22 2007 +0000
+++ b/include/SDL_config.h.in	Thu Feb 15 23:50:45 2007 +0000
@@ -130,6 +130,7 @@
 #undef HAVE_NANOSLEEP
 #undef HAVE_CLOCK_GETTIME
 #undef HAVE_DLVSYM
+#undef HAVE_GETPAGESIZE
 
 #else
 /* We may need some replacement for stdarg.h here */
--- a/src/video/fbcon/SDL_fbvideo.c	Thu Feb 15 11:06:22 2007 +0000
+++ b/src/video/fbcon/SDL_fbvideo.c	Thu Feb 15 23:50:45 2007 +0000
@@ -149,6 +149,19 @@
                                   struct fb_var_screeninfo *vinfo);
 static void FB_RestorePalette(_THIS);
 
+static int SDL_getpagesize(void)
+{
+#ifdef HAVE_GETPAGESIZE
+	return getpagesize();
+#elif defined(PAGE_SIZE)
+	return PAGE_SIZE;
+#else
+#error Can not determine system page size.
+	return 4096;  /* this is what it USED to be in Linux... */
+#endif
+}
+
+
 /* Small wrapper for mmap() so we can play nicely with no-mmu hosts
  * (non-mmu hosts disallow the MAP_SHARED flag) */
 
@@ -466,6 +479,7 @@
 
 static int FB_VideoInit(_THIS, SDL_PixelFormat *vformat)
 {
+	const int pagesize = SDL_getpagesize();
 	struct fb_fix_screeninfo finfo;
 	struct fb_var_screeninfo vinfo;
 	int i, j;
@@ -547,7 +561,7 @@
 
 	/* Memory map the device, compensating for buggy PPC mmap() */
 	mapped_offset = (((long)finfo.smem_start) -
-	                (((long)finfo.smem_start)&~(PAGE_SIZE-1)));
+	                (((long)finfo.smem_start)&~(pagesize-1)));
 	mapped_memlen = finfo.smem_len+mapped_offset;
 	mapped_mem = do_mmap(NULL, mapped_memlen,
 	                  PROT_READ|PROT_WRITE, MAP_SHARED, console_fd, 0);