Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/genarch/src/fb/fb.c	(revision b254b3b9cf2ab6ddfb7a668c8739854bc5da0efb)
@@ -61,4 +61,9 @@
 static unsigned int bitspp = 0;
 static unsigned int pixelbytes = 0;
+#ifdef FB_INVERT_COLORS
+static bool invert_colors = true;
+#else
+static bool invert_colors = false;
+#endif
 
 static unsigned int position = 0;
@@ -66,5 +71,4 @@
 static unsigned int rows = 0;
 
-
 #define COL_WIDTH	8
 #define ROW_BYTES	(scanline * FONT_SCANLINES)
@@ -85,4 +89,9 @@
 static void (*rgb2scr)(void *, int);
 static int (*scr2rgb)(void *);
+
+static inline int COLOR(int color)
+{
+	return invert_colors ? ~color : color;
+}
 
 /* Conversion routines between different color representations */
@@ -160,9 +169,9 @@
 static void putpixel(unsigned int x, unsigned int y, int color)
 {
-	(*rgb2scr)(&fbaddress[POINTPOS(x,y)],color);
+	(*rgb2scr)(&fbaddress[POINTPOS(x,y)], COLOR(color));
 
 	if (dbbuffer) {
 		int dline = (y + dboffset) % yres;
-		(*rgb2scr)(&dbbuffer[POINTPOS(x,dline)],color);
+		(*rgb2scr)(&dbbuffer[POINTPOS(x,dline)], COLOR(color));
 	}
 }
@@ -173,7 +182,7 @@
 	if (dbbuffer) {
 		int dline = (y + dboffset) % yres;
-		return (*scr2rgb)(&dbbuffer[POINTPOS(x,dline)]);
-	}
-	return (*scr2rgb)(&fbaddress[POINTPOS(x,y)]);
+		return COLOR((*scr2rgb)(&dbbuffer[POINTPOS(x,dline)]));
+	}
+	return COLOR((*scr2rgb)(&fbaddress[POINTPOS(x,y)]));
 }
 
@@ -275,5 +284,5 @@
 			byte >>= x % 8;
 			if (byte & 1)
-				putpixel(startx + x, starty + y, LOGOCOLOR);
+				putpixel(startx + x, starty + y, COLOR(LOGOCOLOR));
 		}
 }
@@ -398,4 +407,5 @@
 	sysinfo_set_item_val("fb.scanline", NULL, scan);
 	sysinfo_set_item_val("fb.address.physical", NULL, addr);
+	sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors);
 
 	/* Allocate double buffer */
@@ -417,7 +427,9 @@
 	if (!blankline)
 		panic("Failed to allocate blank line for framebuffer.");
-	for (y=0; y < FONT_SCANLINES; y++)
-		for (x=0; x < xres; x++)
-			(*rgb2scr)(&blankline[POINTPOS(x,y)],BGCOLOR);
+	for (y=0; y < FONT_SCANLINES; y++) {
+		for (x=0; x < xres; x++) {
+			(*rgb2scr)(&blankline[POINTPOS(x,y)], COLOR(BGCOLOR));
+		}
+	}
 
 	clear_screen();
