Index: kernel/arch/amd64/src/boot/multiboot.S
===================================================================
--- kernel/arch/amd64/src/boot/multiboot.S	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ kernel/arch/amd64/src/boot/multiboot.S	(revision 8781e9d05ac3f6aeaa3ad709c5af9efa3209b87a)
@@ -38,4 +38,6 @@
 #include <arch/cpu.h>
 
+// TODO: most of this file can be rewritten in C
+
 #define START_STACK  (BOOT_OFFSET - BOOT_STACK_SIZE)
 
@@ -50,5 +52,5 @@
 
 .macro pm_status msg
-#ifdef CONFIG_EGA
+#if defined(CONFIG_EGA) && !defined(CONFIG_FB)
 	pushl %esi
 	movl \msg, %esi
@@ -67,6 +69,11 @@
 multiboot_header:
 	.long MULTIBOOT_HEADER_MAGIC
+#ifdef CONFIG_FB
 	.long MULTIBOOT_HEADER_FLAGS
 	.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)  /* checksum */
+#else
+	.long MULTIBOOT_HEADER_FLAGS_NOFB
+	.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS_NOFB)  /* checksum */
+#endif
 	.long multiboot_header
 	.long unmapped_start
@@ -74,4 +81,10 @@
 	.long 0
 	.long multiboot_image_start
+#ifdef CONFIG_FB
+	.long 0
+	.long CONFIG_BFB_WIDTH
+	.long CONFIG_BFB_HEIGHT
+	.long CONFIG_BFB_BPP
+#endif
 
 SYMBOL(multiboot_image_start)
@@ -158,6 +171,4 @@
 	sse2_supported:
 
-#include "vesa_prot.inc"
-
 	pm2_status $status_prot2
 
@@ -568,6 +579,4 @@
 
 	ret
-
-#include "vesa_real.inc"
 
 .section K_INI_PTLS, "aw", @progbits
@@ -708,10 +717,6 @@
 status_prot:
 	.asciz "[prot] "
-status_vesa_copy:
-	.asciz "[vesa_copy] "
 status_multiboot_cmdline:
 	.asciz "[multiboot_cmdline] "
-status_vesa_real:
-	.asciz "[vesa_real] "
 status_prot2:
 	.asciz "[prot2] "
Index: rnel/arch/amd64/src/boot/vesa_prot.inc
===================================================================
--- kernel/arch/amd64/src/boot/vesa_prot.inc	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ 	(revision )
@@ -1,1 +1,0 @@
-../../../ia32/src/boot/vesa_prot.inc
Index: rnel/arch/amd64/src/boot/vesa_real.inc
===================================================================
--- kernel/arch/amd64/src/boot/vesa_real.inc	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ 	(revision )
@@ -1,1 +1,0 @@
-../../../ia32/src/boot/vesa_real.inc
Index: rnel/arch/amd64/src/boot/vesa_ret.inc
===================================================================
--- kernel/arch/amd64/src/boot/vesa_ret.inc	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ 	(revision )
@@ -1,24 +1,0 @@
-.code32
-vesa_init_protected:
-	cli
-	cld
-
-	/* Initialize stack pointer */
-	movl $START_STACK, %esp
-
-	/* Kernel data + stack */
-	movw $GDT_SELECTOR(KDATA_DES), %cx
-	movw %cx, %es
-	movw %cx, %ds
-	movw %cx, %ss
-
-	/*
-	 * Simics seems to remove hidden part of GS on entering user mode
-	 * when _visible_ part of GS does not point to user-mode segment.
-	 */
-
-	movw $GDT_SELECTOR(UDATA_DES), %cx
-	movw %cx, %fs
-	movw %cx, %gs
-
-	jmpl $GDT_SELECTOR(KTEXT32_DES), $vesa_meeting_point
Index: rnel/arch/amd64/src/boot/vga323.pal
===================================================================
--- kernel/arch/amd64/src/boot/vga323.pal	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ 	(revision )
@@ -1,1 +1,0 @@
-../../../ia32/src/boot/vga323.pal
Index: kernel/arch/ia32/src/boot/multiboot.S
===================================================================
--- kernel/arch/ia32/src/boot/multiboot.S	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ kernel/arch/ia32/src/boot/multiboot.S	(revision 8781e9d05ac3f6aeaa3ad709c5af9efa3209b87a)
@@ -38,4 +38,6 @@
 #include <arch/cpu.h>
 
+// TODO: most of this file can be rewritten in C
+
 #define START_STACK  (BOOT_OFFSET - BOOT_STACK_SIZE)
 
@@ -50,5 +52,5 @@
 
 .macro pm_status msg
-#ifdef CONFIG_EGA
+#if defined(CONFIG_EGA) && !defined(CONFIG_FB)
 	pushl %esi
 	movl \msg, %esi
@@ -66,6 +68,11 @@
 multiboot_header:
 	.long MULTIBOOT_HEADER_MAGIC
+#ifdef CONFIG_FB
 	.long MULTIBOOT_HEADER_FLAGS
 	.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)  /* checksum */
+#else
+	.long MULTIBOOT_HEADER_FLAGS_NOFB
+	.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS_NOFB)  /* checksum */
+#endif
 	.long multiboot_header
 	.long unmapped_start
@@ -73,4 +80,10 @@
 	.long 0
 	.long multiboot_image_start
+#ifdef CONFIG_FB
+	.long 0
+	.long CONFIG_BFB_WIDTH
+	.long CONFIG_BFB_HEIGHT
+	.long CONFIG_BFB_BPP
+#endif
 
 SYMBOL(multiboot_image_start)
@@ -104,6 +117,4 @@
 
 	pm_status $status_prot
-
-#include "vesa_prot.inc"
 
 #ifndef PROCESSOR_i486
@@ -685,6 +696,4 @@
 	ret
 
-#include "vesa_real.inc"
-
 .section K_DATA_START, "aw", @progbits
 
@@ -720,10 +729,6 @@
 status_non_pse:
 	.asciz "[non_pse] "
-status_vesa_copy:
-	.asciz "[vesa_copy] "
 status_multiboot_cmdline:
 	.asciz "[multiboot_cmdline] "
-status_vesa_real:
-	.asciz "[vesa_real] "
 status_prot2:
 	.asciz "[prot2] "
Index: rnel/arch/ia32/src/boot/vesa_prot.inc
===================================================================
--- kernel/arch/ia32/src/boot/vesa_prot.inc	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ 	(revision )
@@ -1,127 +1,0 @@
-#ifdef CONFIG_FB
-
-#define MBINFO_BIT_CMDLINE      2
-#define MBINFO_OFFSET_CMDLINE   16
-
-	/* Copy real mode VESA initialization code */
-
-	pm_status $status_vesa_copy
-
-	mov $vesa_init, %esi
-	mov $VESA_INIT_SEGMENT << 4, %edi
-	mov $e_vesa_init - vesa_init, %ecx
-	rep movsb
-
-	/* Check for multiboot command line */
-
-	pm_status $status_multiboot_cmdline
-
-	mov multiboot_eax, %eax
-	cmp $MULTIBOOT_LOADER_MAGIC, %eax
-	jne no_cmdline
-
-	mov multiboot_ebx, %ebx
-	mov (%ebx), %eax
-	bt $MBINFO_BIT_CMDLINE, %eax
-	jnc no_cmdline
-
-	/* Skip the kernel path in command line */
-
-	mov MBINFO_OFFSET_CMDLINE(%ebx), %esi
-
-	skip_loop:
-		lodsb
-
-		cmp $0, %al
-		je no_cmdline
-
-		cmp $' ', %al
-		je skip_loop_done
-
-		jmp skip_loop
-	skip_loop_done:
-
-	space_loop:
-		mov (%esi), %al
-
-		cmp $0, %al
-		je no_cmdline
-
-		cmp $' ', %al
-		jne space_loop_done
-
-		inc %esi
-		jmp space_loop
-	space_loop_done:
-
-	/* Copy at most 23 characters from command line */
-
-	mov $VESA_INIT_SEGMENT << 4, %edi
-	add $default_mode - vesa_init, %edi
-	mov $23, %ecx
-
-	cmd_loop:
-		lodsb
-		stosb
-
-		cmp $0, %al
-		je cmd_loop_done
-
-		loop cmd_loop
-	cmd_loop_done:
-
-	/* Zero termination */
-
-	xor %eax, %eax
-	stosb
-
-	no_cmdline:
-
-	/* Jump to the real mode */
-
-	pm_status $status_vesa_real
-
-	mov $VESA_INIT_SEGMENT << 4, %edi
-	jmpl *%edi
-
-	vesa_meeting_point:
-		/* Returned back to protected mode */
-
-		/*
-		 * Initialize Global Descriptor Table and
-		 * Interrupt Descriptor Table registers
-		 */
-		lgdtl bootstrap_gdtr
-		lidtl bootstrap_idtr
-
-		movzx %ax, %ecx
-		mov %ecx, KA2PA(bfb_scanline)
-
-		shr $16, %eax
-		mov %ax, KA2PA(bfb_bpp)
-
-		movzx %bx, %ecx
-		mov %ecx, KA2PA(bfb_height)
-
-		shr $16, %ebx
-		mov %ebx, KA2PA(bfb_width)
-
-		mov %dl, KA2PA(bfb_green_pos)
-
-		shr $8, %edx
-		mov %dl, KA2PA(bfb_green_size)
-
-		shr $8, %edx
-		mov %dl, KA2PA(bfb_red_pos)
-
-		shr $8, %edx
-		mov %dl, KA2PA(bfb_red_size)
-
-		mov %esi, %edx
-		mov %dl, KA2PA(bfb_blue_pos)
-
-		shr $8, %edx
-		mov %dl, KA2PA(bfb_blue_size)
-
-		mov %edi, KA2PA(bfb_addr)
-#endif
Index: rnel/arch/ia32/src/boot/vesa_real.inc
===================================================================
--- kernel/arch/ia32/src/boot/vesa_real.inc	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ 	(revision )
@@ -1,415 +1,0 @@
-#ifdef CONFIG_FB
-
-#include <macros.h>
-
-#define VESA_INFO_SIZE 1024
-
-#define VESA_MODE_ATTRIBUTES_OFFSET  0
-#define VESA_MODE_LIST_PTR_OFFSET    14
-#define VESA_MODE_SCANLINE_OFFSET    16
-#define VESA_MODE_WIDTH_OFFSET       18
-#define VESA_MODE_HEIGHT_OFFSET      20
-#define VESA_MODE_BPP_OFFSET         25
-#define VESA_MODE_RED_MASK_OFFSET    31
-#define VESA_MODE_RED_POS_OFFSET     32
-#define VESA_MODE_GREEN_MASK_OFFSET  33
-#define VESA_MODE_GREEN_POS_OFFSET   34
-#define VESA_MODE_BLUE_MASK_OFFSET   35
-#define VESA_MODE_BLUE_POS_OFFSET    36
-#define VESA_MODE_PHADDR_OFFSET      40
-
-#define VESA_END_OF_MODES  0xffff
-
-#define VESA_OK  0x4f
-
-#define VESA_GET_INFO       0x4f00
-#define VESA_GET_MODE_INFO  0x4f01
-#define VESA_SET_MODE       0x4f02
-#define VESA_SET_PALETTE    0x4f09
-
-.code32
-vesa_init:
-	lidtl vesa_idtr
-
-	mov $GDT_SELECTOR(VESA_INIT_DATA_DES), %bx
-
-	mov %bx, %es
-	mov %bx, %fs
-	mov %bx, %gs
-	mov %bx, %ds
-	mov %bx, %ss
-
-	jmp $GDT_SELECTOR(VESA_INIT_CODE_DES), $vesa_init_real - vesa_init
-
-vesa_idtr:
-	.word 0x3ff
-	.long 0
-
-.code16
-vesa_init_real:
-	mov %cr0, %eax
-	and $~CR0_PE, %eax
-	mov %eax, %cr0
-
-	jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init
-
-vesa_init_real2:
-	mov $VESA_INIT_SEGMENT, %bx
-
-	mov %bx, %es
-	mov %bx, %fs
-	mov %bx, %gs
-	mov %bx, %ds
-	mov %bx, %ss
-
-	movl %esp, %eax
-	movl $0x0000fffc, %esp
-	movl $0x0000fffc, %ebp
-	pushl %eax
-
-	/* Parse default mode string */
-
-	mov $default_mode - vesa_init, %di
-	xor %eax, %eax
-	xor %ebx, %ebx
-
-	mov $8, %ecx
-	parse_width:
-		mov (%di), %al
-
-		/* Check for digit */
-
-		cmp $'0', %al
-		jb parse_width_done
-
-		cmp $'9', %al
-		ja parse_width_done
-
-		sub $'0', %al
-
-		/* Multiply default_width by 10 and add digit */
-
-		mov default_width - vesa_init, %bx
-		lea (%ebx, %ebx, 4), %ebx
-		shl $1, %ebx
-		add %ax, %bx
-		mov %bx, default_width - vesa_init
-
-		inc %di
-		loop parse_width
-	parse_width_done:
-
-	mov (%di), %al
-	cmp $0, %al
-	jz parse_done
-	inc %di
-
-	mov $8, %ecx
-	parse_height:
-		mov (%di), %al
-
-		/* Check for digit */
-
-		cmp $'0', %al
-		jb parse_height_done
-
-		cmp $'9', %al
-		ja parse_height_done
-
-		sub $'0', %al
-
-		/* Multiply default_height by 10 and add digit */
-
-		mov default_height - vesa_init, %bx
-		lea (%ebx, %ebx, 4), %ebx
-		shl $1, %ebx
-		add %ax, %bx
-		mov %bx, default_height - vesa_init
-
-		inc %di
-		loop parse_height
-	parse_height_done:
-
-	mov (%di), %al
-	cmp $0, %al
-	jz parse_done
-	inc %di
-
-	mov $4, %ecx
-	parse_bpp:
-		mov (%di), %al
-
-		/* Check for digit */
-
-		cmp $'0', %al
-		jb parse_bpp_done
-
-		cmp $'9', %al
-		ja parse_bpp_done
-
-		sub $'0', %al
-
-		/* Multiply default_bpp by 10 and add digit */
-
-		mov default_bpp - vesa_init, %bx
-		lea (%ebx, %ebx, 4), %ebx
-		shl $1, %ebx
-		add %ax, %bx
-		mov %bx, default_bpp - vesa_init
-
-		inc %di
-		loop parse_bpp
-	parse_bpp_done:
-
-	parse_done:
-
-	mov $VESA_GET_INFO, %ax
-	mov $e_vesa_init - vesa_init, %di
-	push %di
-	/* Write the "VBE2" signature into the info structure in order
-	 * to get proper mode information. The presence of "VBE2"
-	 * indicates two things:
-	 *
-	 *  - VBE controller information structure is expected to be
-	 *    512 bytes long instead of 256 bytes.
-	 *  - The BIOS should report VBE 3.0 information (potentially
-	 *    including non-standard modes in the mode list).
-	 */
-	movl $0x32454256, (%di)
-	int $0x10
-
-	pop %di
-	cmp $VESA_OK, %al
-	jnz no_mode
-
-	mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si
-	mov %si, %gs
-	mov VESA_MODE_LIST_PTR_OFFSET(%di), %si
-
-	add $VESA_INFO_SIZE, %di
-
-	next_mode:
-		/* Try next mode */
-
-		mov %gs:(%si), %cx
-		cmp $VESA_END_OF_MODES, %cx
-		je no_mode
-
-		inc %si
-		inc %si
-		push %cx
-		push %di
-		push %si
-		mov $VESA_GET_MODE_INFO, %ax
-		int $0x10
-
-		pop %si
-		pop %di
-		pop %cx
-		cmp $VESA_OK, %al
-		jne no_mode
-
-		/*
-		 * Check for proper attributes (supported,
-		 * color, graphics, linear framebuffer).
-		 */
-
-		mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax
-		and $0x99, %ax
-		cmp $0x99, %ax
-		jne next_mode
-
-		/* Check for proper resolution */
-
-		mov default_width - vesa_init, %ax
-		cmp VESA_MODE_WIDTH_OFFSET(%di), %ax
-		jne next_mode
-
-		mov default_height - vesa_init, %ax
-		cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax
-		jne next_mode
-
-		/* Check for proper bpp */
-
-		mov default_bpp - vesa_init, %al
-		cmp VESA_MODE_BPP_OFFSET(%di), %al
-		je set_mode
-
-		mov $24, %al
-		cmp default_bpp - vesa_init, %al
-		jne next_mode
-
-		/* For 24 bpp modes accept also 32 bit bpp */
-
-		mov $32, %al
-		cmp VESA_MODE_BPP_OFFSET(%di), %al
-		jne next_mode
-
-	set_mode:
-		mov %cx, %bx
-		or $0xc000, %bx
-		push %di
-		mov $VESA_SET_MODE, %ax
-		int $0x10
-
-		pop %di
-		cmp $VESA_OK, %al
-		jnz no_mode
-
-		/* Set 3:2:3 VGA palette */
-
-		mov VESA_MODE_BPP_OFFSET(%di), %al
-		cmp $8, %al
-		jnz vga_not_set
-
-		mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax
-		push %di
-		mov $vga323 - vesa_init, %di
-		mov $0x100, %ecx
-
-		/* Test if VGA compatible registers are present */
-		bt $5, %ax
-		jnc vga_compat
-
-			/* Use VESA routine to set the palette */
-
-			mov $VESA_SET_PALETTE, %ax
-			xor %bl, %bl
-			xor %dx, %dx
-			int $0x10
-
-			cmp $0x00, %ah
-			je vga_not_compat
-
-		vga_compat:
-
-			/* Use VGA registers to set the palette */
-
-			movw $0x3c6, %dx  /* set palette mask */
-			movb $0xff, %al
-			outb %al, %dx
-
-			movw $0x3c8, %dx  /* first index to set */
-			xor %al, %al
-			outb %al, %dx
-
-			movw $0x3c9, %dx  /* data port */
-
-			vga_loop:
-				movb %es:2(%di), %al
-				outb %al, %dx
-
-				movb %es:1(%di), %al
-				outb %al, %dx
-
-				movb %es:(%di), %al
-				outb %al, %dx
-
-				addw $4, %di
-			loop vga_loop
-
-		vga_not_compat:
-
-			pop %di
-
-		vga_not_set:
-
-		/*
-		 * Store mode parameters:
-		 *  eax = bpp[16] scanline[16]
-		 *  ebx = width[16]  height[16]
-		 *  edx = red_mask[8] red_pos[8] green_mask[8] green_pos[8]
-		 *  esi = blue_mask[8] blue_pos[8]
-		 *  edi = linear frame buffer
-		 */
-
-		mov VESA_MODE_BPP_OFFSET(%di), %al
-		xor %ah, %ah
-		shl $16, %eax
-		mov VESA_MODE_SCANLINE_OFFSET(%di), %ax
-
-		mov VESA_MODE_WIDTH_OFFSET(%di), %bx
-		shl $16, %ebx
-		mov VESA_MODE_HEIGHT_OFFSET(%di), %bx
-
-		mov VESA_MODE_BLUE_MASK_OFFSET(%di), %dl
-		shl $8, %edx
-		mov VESA_MODE_BLUE_POS_OFFSET(%di), %dl
-		mov %edx, %esi
-
-		mov VESA_MODE_RED_MASK_OFFSET(%di), %dl
-		shl $8, %edx
-		mov VESA_MODE_RED_POS_OFFSET(%di), %dl
-
-		shl $8, %edx
-		mov VESA_MODE_GREEN_MASK_OFFSET(%di), %dl
-		shl $8, %edx
-		mov VESA_MODE_GREEN_POS_OFFSET(%di), %dl
-
-		mov VESA_MODE_PHADDR_OFFSET(%di), %edi
-
-		vesa_leave_real:
-
-			mov %cr0, %ecx
-			or $CR0_PE, %ecx
-			mov %ecx, %cr0
-
-			jmp vesa_leave_real2
-
-		vesa_leave_real2:
-
-			ljmpl $GDT_SELECTOR(KTEXT32_DES), $(vesa_init_protected - vesa_init + VESA_INIT_SEGMENT << 4)
-
-	no_mode:
-
-		/* No prefered mode found */
-
-		mov $0x111, %cx
-		push %di
-		push %cx
-		mov $VESA_GET_MODE_INFO, %ax
-		int $0x10
-
-		pop %cx
-		pop %di
-		cmp $VESA_OK, %al
-		jnz text_mode
-		jz set_mode  /* force relative jump */
-
-	text_mode:
-
-		/* Reset to EGA text mode (because of problems with VESA) */
-
-		mov $0x0003, %ax
-		int $0x10
-
-		xor %eax, %eax
-		xor %ebx, %ebx
-		xor %edx, %edx
-		xor %edi, %edi
-
-		jz vesa_leave_real  /* force relative jump */
-
-vga323:
-#include "vga323.pal"
-
-default_width:
-	.word 0
-
-default_height:
-	.word 0
-
-default_bpp:
-	.byte 0
-
-default_mode:
-	.ascii STRING(CONFIG_BFB_MODE)
-	.ascii "-"
-	.asciz STRING(CONFIG_BFB_BPP)
-	.fill 24
-
-#include "vesa_ret.inc"
-
-.align 4
-e_vesa_init:
-#endif
Index: rnel/arch/ia32/src/boot/vesa_ret.inc
===================================================================
--- kernel/arch/ia32/src/boot/vesa_ret.inc	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ 	(revision )
@@ -1,17 +1,0 @@
-.code32
-vesa_init_protected:
-	cli
-	cld
-
-	/* Initialize stack pointer */
-	movl $START_STACK, %esp
-
-	/* Kernel data + stack */
-	movw $GDT_SELECTOR(KDATA_DES), %cx
-	movw %cx, %es
-	movw %cx, %fs
-	movw %cx, %gs
-	movw %cx, %ds
-	movw %cx, %ss
-
-	jmpl $GDT_SELECTOR(KTEXT_DES), $vesa_meeting_point
Index: rnel/arch/ia32/src/boot/vga323.pal
===================================================================
--- kernel/arch/ia32/src/boot/vga323.pal	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ 	(revision )
@@ -1,256 +1,0 @@
-	.byte 0x3f, 0x3f, 0x3f, 0x00
-	.byte 0x36, 0x3f, 0x3f, 0x00
-	.byte 0x2d, 0x3f, 0x3f, 0x00
-	.byte 0x24, 0x3f, 0x3f, 0x00
-	.byte 0x1b, 0x3f, 0x3f, 0x00
-	.byte 0x12, 0x3f, 0x3f, 0x00
-	.byte 0x09, 0x3f, 0x3f, 0x00
-	.byte 0x00, 0x3f, 0x3f, 0x00
-	.byte 0x3f, 0x2a, 0x3f, 0x00
-	.byte 0x36, 0x2a, 0x3f, 0x00
-	.byte 0x2d, 0x2a, 0x3f, 0x00
-	.byte 0x24, 0x2a, 0x3f, 0x00
-	.byte 0x1b, 0x2a, 0x3f, 0x00
-	.byte 0x12, 0x2a, 0x3f, 0x00
-	.byte 0x09, 0x2a, 0x3f, 0x00
-	.byte 0x00, 0x2a, 0x3f, 0x00
-	.byte 0x3f, 0x15, 0x3f, 0x00
-	.byte 0x36, 0x15, 0x3f, 0x00
-	.byte 0x2d, 0x15, 0x3f, 0x00
-	.byte 0x24, 0x15, 0x3f, 0x00
-	.byte 0x1b, 0x15, 0x3f, 0x00
-	.byte 0x12, 0x15, 0x3f, 0x00
-	.byte 0x09, 0x15, 0x3f, 0x00
-	.byte 0x00, 0x15, 0x3f, 0x00
-	.byte 0x3f, 0x00, 0x3f, 0x00
-	.byte 0x36, 0x00, 0x3f, 0x00
-	.byte 0x2d, 0x00, 0x3f, 0x00
-	.byte 0x24, 0x00, 0x3f, 0x00
-	.byte 0x1b, 0x00, 0x3f, 0x00
-	.byte 0x12, 0x00, 0x3f, 0x00
-	.byte 0x09, 0x00, 0x3f, 0x00
-	.byte 0x00, 0x00, 0x3f, 0x00
-	.byte 0x3f, 0x3f, 0x36, 0x00
-	.byte 0x36, 0x3f, 0x36, 0x00
-	.byte 0x2d, 0x3f, 0x36, 0x00
-	.byte 0x24, 0x3f, 0x36, 0x00
-	.byte 0x1b, 0x3f, 0x36, 0x00
-	.byte 0x12, 0x3f, 0x36, 0x00
-	.byte 0x09, 0x3f, 0x36, 0x00
-	.byte 0x00, 0x3f, 0x36, 0x00
-	.byte 0x3f, 0x2a, 0x36, 0x00
-	.byte 0x36, 0x2a, 0x36, 0x00
-	.byte 0x2d, 0x2a, 0x36, 0x00
-	.byte 0x24, 0x2a, 0x36, 0x00
-	.byte 0x1b, 0x2a, 0x36, 0x00
-	.byte 0x12, 0x2a, 0x36, 0x00
-	.byte 0x09, 0x2a, 0x36, 0x00
-	.byte 0x00, 0x2a, 0x36, 0x00
-	.byte 0x3f, 0x15, 0x36, 0x00
-	.byte 0x36, 0x15, 0x36, 0x00
-	.byte 0x2d, 0x15, 0x36, 0x00
-	.byte 0x24, 0x15, 0x36, 0x00
-	.byte 0x1b, 0x15, 0x36, 0x00
-	.byte 0x12, 0x15, 0x36, 0x00
-	.byte 0x09, 0x15, 0x36, 0x00
-	.byte 0x00, 0x15, 0x36, 0x00
-	.byte 0x3f, 0x00, 0x36, 0x00
-	.byte 0x36, 0x00, 0x36, 0x00
-	.byte 0x2d, 0x00, 0x36, 0x00
-	.byte 0x24, 0x00, 0x36, 0x00
-	.byte 0x1b, 0x00, 0x36, 0x00
-	.byte 0x12, 0x00, 0x36, 0x00
-	.byte 0x09, 0x00, 0x36, 0x00
-	.byte 0x00, 0x00, 0x36, 0x00
-	.byte 0x3f, 0x3f, 0x2d, 0x00
-	.byte 0x36, 0x3f, 0x2d, 0x00
-	.byte 0x2d, 0x3f, 0x2d, 0x00
-	.byte 0x24, 0x3f, 0x2d, 0x00
-	.byte 0x1b, 0x3f, 0x2d, 0x00
-	.byte 0x12, 0x3f, 0x2d, 0x00
-	.byte 0x09, 0x3f, 0x2d, 0x00
-	.byte 0x00, 0x3f, 0x2d, 0x00
-	.byte 0x3f, 0x2a, 0x2d, 0x00
-	.byte 0x36, 0x2a, 0x2d, 0x00
-	.byte 0x2d, 0x2a, 0x2d, 0x00
-	.byte 0x24, 0x2a, 0x2d, 0x00
-	.byte 0x1b, 0x2a, 0x2d, 0x00
-	.byte 0x12, 0x2a, 0x2d, 0x00
-	.byte 0x09, 0x2a, 0x2d, 0x00
-	.byte 0x00, 0x2a, 0x2d, 0x00
-	.byte 0x3f, 0x15, 0x2d, 0x00
-	.byte 0x36, 0x15, 0x2d, 0x00
-	.byte 0x2d, 0x15, 0x2d, 0x00
-	.byte 0x24, 0x15, 0x2d, 0x00
-	.byte 0x1b, 0x15, 0x2d, 0x00
-	.byte 0x12, 0x15, 0x2d, 0x00
-	.byte 0x09, 0x15, 0x2d, 0x00
-	.byte 0x00, 0x15, 0x2d, 0x00
-	.byte 0x3f, 0x00, 0x2d, 0x00
-	.byte 0x36, 0x00, 0x2d, 0x00
-	.byte 0x2d, 0x00, 0x2d, 0x00
-	.byte 0x24, 0x00, 0x2d, 0x00
-	.byte 0x1b, 0x00, 0x2d, 0x00
-	.byte 0x12, 0x00, 0x2d, 0x00
-	.byte 0x09, 0x00, 0x2d, 0x00
-	.byte 0x00, 0x00, 0x2d, 0x00
-	.byte 0x3f, 0x3f, 0x24, 0x00
-	.byte 0x36, 0x3f, 0x24, 0x00
-	.byte 0x2d, 0x3f, 0x24, 0x00
-	.byte 0x24, 0x3f, 0x24, 0x00
-	.byte 0x1b, 0x3f, 0x24, 0x00
-	.byte 0x12, 0x3f, 0x24, 0x00
-	.byte 0x09, 0x3f, 0x24, 0x00
-	.byte 0x00, 0x3f, 0x24, 0x00
-	.byte 0x3f, 0x2a, 0x24, 0x00
-	.byte 0x36, 0x2a, 0x24, 0x00
-	.byte 0x2d, 0x2a, 0x24, 0x00
-	.byte 0x24, 0x2a, 0x24, 0x00
-	.byte 0x1b, 0x2a, 0x24, 0x00
-	.byte 0x12, 0x2a, 0x24, 0x00
-	.byte 0x09, 0x2a, 0x24, 0x00
-	.byte 0x00, 0x2a, 0x24, 0x00
-	.byte 0x3f, 0x15, 0x24, 0x00
-	.byte 0x36, 0x15, 0x24, 0x00
-	.byte 0x2d, 0x15, 0x24, 0x00
-	.byte 0x24, 0x15, 0x24, 0x00
-	.byte 0x1b, 0x15, 0x24, 0x00
-	.byte 0x12, 0x15, 0x24, 0x00
-	.byte 0x09, 0x15, 0x24, 0x00
-	.byte 0x00, 0x15, 0x24, 0x00
-	.byte 0x3f, 0x00, 0x24, 0x00
-	.byte 0x36, 0x00, 0x24, 0x00
-	.byte 0x2d, 0x00, 0x24, 0x00
-	.byte 0x24, 0x00, 0x24, 0x00
-	.byte 0x1b, 0x00, 0x24, 0x00
-	.byte 0x12, 0x00, 0x24, 0x00
-	.byte 0x09, 0x00, 0x24, 0x00
-	.byte 0x00, 0x00, 0x24, 0x00
-	.byte 0x3f, 0x3f, 0x1b, 0x00
-	.byte 0x36, 0x3f, 0x1b, 0x00
-	.byte 0x2d, 0x3f, 0x1b, 0x00
-	.byte 0x24, 0x3f, 0x1b, 0x00
-	.byte 0x1b, 0x3f, 0x1b, 0x00
-	.byte 0x12, 0x3f, 0x1b, 0x00
-	.byte 0x09, 0x3f, 0x1b, 0x00
-	.byte 0x00, 0x3f, 0x1b, 0x00
-	.byte 0x3f, 0x2a, 0x1b, 0x00
-	.byte 0x36, 0x2a, 0x1b, 0x00
-	.byte 0x2d, 0x2a, 0x1b, 0x00
-	.byte 0x24, 0x2a, 0x1b, 0x00
-	.byte 0x1b, 0x2a, 0x1b, 0x00
-	.byte 0x12, 0x2a, 0x1b, 0x00
-	.byte 0x09, 0x2a, 0x1b, 0x00
-	.byte 0x00, 0x2a, 0x1b, 0x00
-	.byte 0x3f, 0x15, 0x1b, 0x00
-	.byte 0x36, 0x15, 0x1b, 0x00
-	.byte 0x2d, 0x15, 0x1b, 0x00
-	.byte 0x24, 0x15, 0x1b, 0x00
-	.byte 0x1b, 0x15, 0x1b, 0x00
-	.byte 0x12, 0x15, 0x1b, 0x00
-	.byte 0x09, 0x15, 0x1b, 0x00
-	.byte 0x00, 0x15, 0x1b, 0x00
-	.byte 0x3f, 0x00, 0x1b, 0x00
-	.byte 0x36, 0x00, 0x1b, 0x00
-	.byte 0x2d, 0x00, 0x1b, 0x00
-	.byte 0x24, 0x00, 0x1b, 0x00
-	.byte 0x1b, 0x00, 0x1b, 0x00
-	.byte 0x12, 0x00, 0x1b, 0x00
-	.byte 0x09, 0x00, 0x1b, 0x00
-	.byte 0x00, 0x00, 0x1b, 0x00
-	.byte 0x3f, 0x3f, 0x12, 0x00
-	.byte 0x36, 0x3f, 0x12, 0x00
-	.byte 0x2d, 0x3f, 0x12, 0x00
-	.byte 0x24, 0x3f, 0x12, 0x00
-	.byte 0x1b, 0x3f, 0x12, 0x00
-	.byte 0x12, 0x3f, 0x12, 0x00
-	.byte 0x09, 0x3f, 0x12, 0x00
-	.byte 0x00, 0x3f, 0x12, 0x00
-	.byte 0x3f, 0x2a, 0x12, 0x00
-	.byte 0x36, 0x2a, 0x12, 0x00
-	.byte 0x2d, 0x2a, 0x12, 0x00
-	.byte 0x24, 0x2a, 0x12, 0x00
-	.byte 0x1b, 0x2a, 0x12, 0x00
-	.byte 0x12, 0x2a, 0x12, 0x00
-	.byte 0x09, 0x2a, 0x12, 0x00
-	.byte 0x00, 0x2a, 0x12, 0x00
-	.byte 0x3f, 0x15, 0x12, 0x00
-	.byte 0x36, 0x15, 0x12, 0x00
-	.byte 0x2d, 0x15, 0x12, 0x00
-	.byte 0x24, 0x15, 0x12, 0x00
-	.byte 0x1b, 0x15, 0x12, 0x00
-	.byte 0x12, 0x15, 0x12, 0x00
-	.byte 0x09, 0x15, 0x12, 0x00
-	.byte 0x00, 0x15, 0x12, 0x00
-	.byte 0x3f, 0x00, 0x12, 0x00
-	.byte 0x36, 0x00, 0x12, 0x00
-	.byte 0x2d, 0x00, 0x12, 0x00
-	.byte 0x24, 0x00, 0x12, 0x00
-	.byte 0x1b, 0x00, 0x12, 0x00
-	.byte 0x12, 0x00, 0x12, 0x00
-	.byte 0x09, 0x00, 0x12, 0x00
-	.byte 0x00, 0x00, 0x12, 0x00
-	.byte 0x3f, 0x3f, 0x09, 0x00
-	.byte 0x36, 0x3f, 0x09, 0x00
-	.byte 0x2d, 0x3f, 0x09, 0x00
-	.byte 0x24, 0x3f, 0x09, 0x00
-	.byte 0x1b, 0x3f, 0x09, 0x00
-	.byte 0x12, 0x3f, 0x09, 0x00
-	.byte 0x09, 0x3f, 0x09, 0x00
-	.byte 0x00, 0x3f, 0x09, 0x00
-	.byte 0x3f, 0x2a, 0x09, 0x00
-	.byte 0x36, 0x2a, 0x09, 0x00
-	.byte 0x2d, 0x2a, 0x09, 0x00
-	.byte 0x24, 0x2a, 0x09, 0x00
-	.byte 0x1b, 0x2a, 0x09, 0x00
-	.byte 0x12, 0x2a, 0x09, 0x00
-	.byte 0x09, 0x2a, 0x09, 0x00
-	.byte 0x00, 0x2a, 0x09, 0x00
-	.byte 0x3f, 0x15, 0x09, 0x00
-	.byte 0x36, 0x15, 0x09, 0x00
-	.byte 0x2d, 0x15, 0x09, 0x00
-	.byte 0x24, 0x15, 0x09, 0x00
-	.byte 0x1b, 0x15, 0x09, 0x00
-	.byte 0x12, 0x15, 0x09, 0x00
-	.byte 0x09, 0x15, 0x09, 0x00
-	.byte 0x00, 0x15, 0x09, 0x00
-	.byte 0x3f, 0x00, 0x09, 0x00
-	.byte 0x36, 0x00, 0x09, 0x00
-	.byte 0x2d, 0x00, 0x09, 0x00
-	.byte 0x24, 0x00, 0x09, 0x00
-	.byte 0x1b, 0x00, 0x09, 0x00
-	.byte 0x12, 0x00, 0x09, 0x00
-	.byte 0x09, 0x00, 0x09, 0x00
-	.byte 0x00, 0x00, 0x09, 0x00
-	.byte 0x3f, 0x3f, 0x00, 0x00
-	.byte 0x36, 0x3f, 0x00, 0x00
-	.byte 0x2d, 0x3f, 0x00, 0x00
-	.byte 0x24, 0x3f, 0x00, 0x00
-	.byte 0x1b, 0x3f, 0x00, 0x00
-	.byte 0x12, 0x3f, 0x00, 0x00
-	.byte 0x09, 0x3f, 0x00, 0x00
-	.byte 0x00, 0x3f, 0x00, 0x00
-	.byte 0x3f, 0x2a, 0x00, 0x00
-	.byte 0x36, 0x2a, 0x00, 0x00
-	.byte 0x2d, 0x2a, 0x00, 0x00
-	.byte 0x24, 0x2a, 0x00, 0x00
-	.byte 0x1b, 0x2a, 0x00, 0x00
-	.byte 0x12, 0x2a, 0x00, 0x00
-	.byte 0x09, 0x2a, 0x00, 0x00
-	.byte 0x00, 0x2a, 0x00, 0x00
-	.byte 0x3f, 0x15, 0x00, 0x00
-	.byte 0x36, 0x15, 0x00, 0x00
-	.byte 0x2d, 0x15, 0x00, 0x00
-	.byte 0x24, 0x15, 0x00, 0x00
-	.byte 0x1b, 0x15, 0x00, 0x00
-	.byte 0x12, 0x15, 0x00, 0x00
-	.byte 0x09, 0x15, 0x00, 0x00
-	.byte 0x00, 0x15, 0x00, 0x00
-	.byte 0x3f, 0x00, 0x00, 0x00
-	.byte 0x36, 0x00, 0x00, 0x00
-	.byte 0x2d, 0x00, 0x00, 0x00
-	.byte 0x24, 0x00, 0x00, 0x00
-	.byte 0x1b, 0x00, 0x00, 0x00
-	.byte 0x12, 0x00, 0x00, 0x00
-	.byte 0x09, 0x00, 0x00, 0x00
-	.byte 0x00, 0x00, 0x00, 0x00
Index: kernel/genarch/include/genarch/multiboot/multiboot.h
===================================================================
--- kernel/genarch/include/genarch/multiboot/multiboot.h	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ kernel/genarch/include/genarch/multiboot/multiboot.h	(revision 8781e9d05ac3f6aeaa3ad709c5af9efa3209b87a)
@@ -39,16 +39,23 @@
 #include <genarch/multiboot/multiboot_info_struct.h>
 
-#define MULTIBOOT_HEADER_MAGIC  0x1badb002
-#define MULTIBOOT_HEADER_FLAGS  0x00010003
+#define MULTIBOOT_HEADER_MAGIC       0x1badb002
+#define MULTIBOOT_HEADER_FLAGS       0x00010007
+#define MULTIBOOT_HEADER_FLAGS_NOFB  0x00010003
 
 #define MULTIBOOT_LOADER_MAGIC  0x2badb002
 
-#define MULTIBOOT_INFO_FLAGS_MEM	0x01
-#define MULTIBOOT_INFO_FLAGS_BOOT	0x02
-#define MULTIBOOT_INFO_FLAGS_CMDLINE	0x04
-#define MULTIBOOT_INFO_FLAGS_MODS	0x08
-#define MULTIBOOT_INFO_FLAGS_SYMS1	0x10
-#define MULTIBOOT_INFO_FLAGS_SYMS2	0x20
-#define MULTIBOOT_INFO_FLAGS_MMAP	0x40
+#define MULTIBOOT_INFO_FLAGS_MEM               0x0001
+#define MULTIBOOT_INFO_FLAGS_BOOT              0x0002
+#define MULTIBOOT_INFO_FLAGS_CMDLINE           0x0004
+#define MULTIBOOT_INFO_FLAGS_MODS              0x0008
+#define MULTIBOOT_INFO_FLAGS_SYMS_AOUT         0x0010
+#define MULTIBOOT_INFO_FLAGS_SYMS_ELF          0x0020
+#define MULTIBOOT_INFO_FLAGS_MMAP              0x0040
+#define MULTIBOOT_INFO_FLAGS_DRIVES            0x0080
+#define MULTIBOOT_INFO_FLAGS_CONFIG_TABLE      0x0100
+#define MULTIBOOT_INFO_FLAGS_BOOT_LOADER_NAME  0x0200
+#define MULTIBOOT_INFO_FLAGS_APM               0x0400
+#define MULTIBOOT_INFO_FLAGS_VBE               0x0800
+#define MULTIBOOT_INFO_FLAGS_FB                0x1000
 
 #ifndef __ASSEMBLER__
Index: kernel/genarch/include/genarch/multiboot/multiboot_info_struct.h
===================================================================
--- kernel/genarch/include/genarch/multiboot/multiboot_info_struct.h	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ kernel/genarch/include/genarch/multiboot/multiboot_info_struct.h	(revision 8781e9d05ac3f6aeaa3ad709c5af9efa3209b87a)
@@ -30,15 +30,43 @@
 #define KERN_MULTIBOOT_INFO_STRUCT_H_
 
-#define MULTIBOOT_INFO_OFFSET_FLAGS        0x00
-#define MULTIBOOT_INFO_OFFSET_MEM_LOWER    0x04
-#define MULTIBOOT_INFO_OFFSET_MEM_UPPER    0x08
-#define MULTIBOOT_INFO_OFFSET_BOOT_DEVICE  0x0c
-#define MULTIBOOT_INFO_OFFSET_CMD_LINE     0x10
-#define MULTIBOOT_INFO_OFFSET_MODS_COUNT   0x14
-#define MULTIBOOT_INFO_OFFSET_MODS_ADDR    0x18
-#define MULTIBOOT_INFO_OFFSET_SYMS         0x1c
-#define MULTIBOOT_INFO_OFFSET_MMAP_LENGTH  0x2c
-#define MULTIBOOT_INFO_OFFSET_MMAP_ADDR    0x30
-#define MULTIBOOT_INFO_SIZE                0x34
+#define MULTIBOOT_INFO_OFFSET_FLAGS               0x00
+#define MULTIBOOT_INFO_OFFSET_MEM_LOWER           0x04
+#define MULTIBOOT_INFO_OFFSET_MEM_UPPER           0x08
+#define MULTIBOOT_INFO_OFFSET_BOOT_DEVICE         0x0c
+#define MULTIBOOT_INFO_OFFSET_CMD_LINE            0x10
+#define MULTIBOOT_INFO_OFFSET_MODS_COUNT          0x14
+#define MULTIBOOT_INFO_OFFSET_MODS_ADDR           0x18
+#define MULTIBOOT_INFO_OFFSET_SYMS                0x1c
+#define MULTIBOOT_INFO_OFFSET_MMAP_LENGTH         0x2c
+#define MULTIBOOT_INFO_OFFSET_MMAP_ADDR           0x30
+#define MULTIBOOT_INFO_OFFSET_DRIVES_LENGTH       0x34
+#define MULTIBOOT_INFO_OFFSET_DRIVES_ADDR         0x38
+#define MULTIBOOT_INFO_OFFSET_CONFIG_TABLE        0x3c
+#define MULTIBOOT_INFO_OFFSET_BOOT_LOADER_NAME    0x40
+#define MULTIBOOT_INFO_OFFSET_APM_TABLE           0x44
+#define MULTIBOOT_INFO_OFFSET_VBE_CONTROL_INFO    0x48
+#define MULTIBOOT_INFO_OFFSET_VBE_MODE_INFO       0x4c
+#define MULTIBOOT_INFO_OFFSET_VBE_MODE            0x50
+#define MULTIBOOT_INFO_OFFSET_VBE_INTERFACE_SEG   0x52
+#define MULTIBOOT_INFO_OFFSET_VBE_INTERFACE_OFF   0x54
+#define MULTIBOOT_INFO_OFFSET_VBE_INTERFACE_LEN   0x56
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_ADDR    0x58
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_PITCH   0x60
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_WIDTH   0x64
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_HEIGHT  0x68
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_BPP     0x6c
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_TYPE    0x6d
+
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_PALETTE_ADDR          0x6e
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_PALETTE_NUM_COLORS    0x72
+
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_RED_FIELD_POSITION    0x6e
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_RED_MASK_SIZE         0x6f
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_GREEN_FIELD_POSITION  0x70
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_GREEN_MASK_SIZE       0x71
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_BLUE_FIELD_POSITION   0x72
+#define MULTIBOOT_INFO_OFFSET_FRAMEBUFFER_BLUE_MASK_SIZE        0x73
+
+#define MULTIBOOT_INFO_SIZE                0x76
 
 #ifndef __ASSEMBLER__
@@ -57,4 +85,35 @@
 	uint32_t mmap_length;
 	uint32_t mmap_addr;
+	uint32_t drives_length;
+	uint32_t drives_addr;
+	uint32_t config_table;
+	uint32_t boot_loader_name;
+	uint32_t apm_table;
+	uint32_t vbe_control_info;
+	uint32_t vbe_mode_info;
+	uint16_t vbe_mode;
+	uint16_t vbe_interface_seg;
+	uint16_t vbe_interface_off;
+	uint16_t vbe_interface_len;
+	uint64_t framebuffer_addr;
+	uint32_t framebuffer_pitch;
+	uint32_t framebuffer_width;
+	uint32_t framebuffer_height;
+	uint8_t framebuffer_bpp;
+	uint8_t framebuffer_type;
+	union {
+		struct {
+			uint32_t framebuffer_palette_addr;
+			uint32_t framebuffer_palette_num_colors;
+		} __attribute__((packed));
+		struct {
+			uint8_t framebuffer_red_field_position;
+			uint8_t framebuffer_red_mask_size;
+			uint8_t framebuffer_green_field_position;
+			uint8_t framebuffer_green_mask_size;
+			uint8_t framebuffer_blue_field_position;
+			uint8_t framebuffer_blue_mask_size;
+		} __attribute__((packed));
+	} __attribute__((packed));
 } __attribute__((packed)) multiboot_info_t;
 
Index: kernel/genarch/src/multiboot/multiboot.c
===================================================================
--- kernel/genarch/src/multiboot/multiboot.c	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ kernel/genarch/src/multiboot/multiboot.c	(revision 8781e9d05ac3f6aeaa3ad709c5af9efa3209b87a)
@@ -35,4 +35,5 @@
 #include <typedefs.h>
 #include <genarch/multiboot/multiboot.h>
+#include <genarch/fb/bfb.h>
 #include <config.h>
 #include <stddef.h>
@@ -168,4 +169,29 @@
 		multiboot_memmap(info->mmap_length,
 		    (multiboot_memmap_t *) MULTIBOOT_PTR(info->mmap_addr));
+
+#ifdef CONFIG_FB
+
+	/* Initialize framebuffer. */
+	if ((info->flags & MULTIBOOT_INFO_FLAGS_FB) != 0) {
+		if (info->framebuffer_type != 1) {
+			/* Can't use this framebuffer. */
+			// FIXME: framebuffer_type == 2 is EGA mode, we should be able to use that.
+			return;
+		}
+
+		bfb_addr = info->framebuffer_addr;
+		bfb_width = info->framebuffer_width;
+		bfb_height = info->framebuffer_height;
+		bfb_bpp = info->framebuffer_bpp;
+		bfb_scanline = info->framebuffer_pitch;
+		bfb_red_pos = info->framebuffer_red_field_position;
+		bfb_red_size = info->framebuffer_red_mask_size;
+		bfb_green_pos = info->framebuffer_green_field_position;
+		bfb_green_size = info->framebuffer_green_mask_size;
+		bfb_blue_pos = info->framebuffer_blue_field_position;
+		bfb_blue_size = info->framebuffer_blue_mask_size;
+	}
+
+#endif
 }
 
Index: tools/autocheck.awk
===================================================================
--- tools/autocheck.awk	(revision 15639eccad9c8be4e57a86cf372ff060b025baa3)
+++ tools/autocheck.awk	(revision 8781e9d05ac3f6aeaa3ad709c5af9efa3209b87a)
@@ -38,16 +38,14 @@
 
 /}.*;/ {
-	pattern = "}( __attribute__\\(.*\\))? (" struct_name "_t)?;"
-	if ($0 !~ pattern) {
-		print("Bad struct ending: " $0) > "/dev/stderr"
-		exit 1
+	pattern = "}( __attribute__\\(.*\\))? " struct_name "_t;"
+	if ($0 ~ pattern) {
+		macro_name = toupper(struct_name) "_SIZE"
+		print "_Static_assert(" macro_name " == sizeof(struct " struct_name "), \"\");"
+		struct_name = ""
 	}
-	macro_name = toupper(struct_name) "_SIZE"
-	print "_Static_assert(" macro_name " == sizeof(struct " struct_name "), \"\");"
-	struct_name = ""
 }
 
 /;$/ {
-	if (struct_name != "") {
+	if (struct_name != "" && $0 !~ "}") {
 		# Remove array subscript, if any.
 		sub("(\\[.*\\])?;", "", $0)
