Index: cbv2/src/arch/i386/boot/tables.c
===================================================================
--- cbv2.orig/src/arch/i386/boot/tables.c	2009-05-13 15:35:16.000000000 -0600
+++ cbv2/src/arch/i386/boot/tables.c	2009-05-13 15:35:25.000000000 -0600
@@ -57,140 +57,105 @@
 	printk_debug("ok\n");
 }
 
-#if HAVE_HIGH_TABLES == 1
-uint64_t high_tables_base = 0;
-uint64_t high_tables_size;
-#endif
-
-/* HIGH_TABLES means a table in very low memory + at the end of RAM. */
-/* LOW_TABLES means a table in very low memory + at 0xf0000 (rom_table_*). */
-struct lb_memory *write_tables(void)
+void write_table(unsigned long dir_start, unsigned long *dir_end,
+		 unsigned long table_start, unsigned long *table_end)
 {
-	unsigned long low_table_start, low_table_end;
-	unsigned long rom_table_start, rom_table_end;
-
-#if HAVE_HIGH_TABLES == 1
-	/* Even if high tables are configured, all tables are copied both to the
-	 * low and the high area, so payloads and OSes don't need to know about
-	 * the high tables.
-	 */
-	unsigned long high_table_start=0, high_table_end=0;
-
-	if (high_tables_base) {
-		printk_debug("High Tables Base is %llx.\n", high_tables_base);
-		high_table_start = high_tables_base;
-		high_table_end = high_tables_base;
-	} else {
-		printk_debug("High Tables Base is not set.\n");
-	}
-#endif
+	unsigned long dir_table_start = dir_start, dir_table_end = *dir_end;
+	unsigned long rom_table_start = table_start, rom_table_end = *table_end;
 
-	rom_table_start = 0xf0000; 
-	rom_table_end =   0xf0000;
-	/* Start low addr at 16 bytes instead of 0 because of a buglet
-	 * in the generic linux unzip code, as it tests for the a20 line.
-	 */
-	low_table_start = 0;
-	low_table_end = 16;
-
-	post_code(0x9a);
-
-#if HAVE_LOW_TABLES == 1
 	/* This table must be betweeen 0xf0000 & 0x100000 */
 	rom_table_end = write_pirq_routing_table(rom_table_end);
 	rom_table_end = (rom_table_end + 1023) & ~1023;
-#endif
-#if HAVE_HIGH_TABLES == 1
-	if (high_tables_base) {
-		high_table_end = write_pirq_routing_table(high_table_end);
-		high_table_end = (high_table_end + 1023) & ~1023;
-	}
-#endif
 
 	/* Write ACPI tables */
 	/* write them in the rom area because DSDT can be large (8K on epia-m) which
 	 * pushes coreboot table out of first 4K if set up in low table area 
 	 */
 #if HAVE_ACPI_TABLES == 1
-#if HAVE_HIGH_TABLES == 1
-	if (high_tables_base) {
-		high_table_end = write_acpi_tables(high_table_end);
-		high_table_end = (high_table_end+1023) & ~1023;
-	}
-#else
-#if HAVE_LOW_TABLES == 1
 	rom_table_end = write_acpi_tables(rom_table_end);
-	rom_table_end = (rom_table_end+1023) & ~1023;
-#endif
-#endif
+	rom_table_end = (rom_table_end + 1023) & ~1023;
 #endif
 	/* copy the smp block to address 0 */
 	post_code(0x96);
 
 #if HAVE_MP_TABLE == 1
-
 	/* The smp table must be in 0-1K, 639K-640K, or 960K-1M */
 	/* Put it in the largest spot (960K-1M). */
-#if HAVE_LOW_TABLES == 1
-	mpc_start = rom_table_end;
+	unsigned long mpc_start = rom_table_end;
 	rom_table_end = write_smp_table(rom_table_end);
-	rom_table_end = (rom_table_end+1023) & ~1023;
+	rom_table_end = (rom_table_end + 1023) & ~1023;
 	if (mpc_start < 0x100000 && rom_table_end > 0x100000)
 		printk_err("MP table too big to fit below 1M %lx-%lx\n",
 			   mpc_start, rom_table_end);
-#endif /* HAVE_LOW_TABLES */
+	smp_write_floating_table_physaddr(dir_table_end, mpc_start);
+	dir_table_end += SMP_FLOATING_TABLE_LEN;
+#endif	/* HAVE_MP_TABLE */
 
-#if HAVE_HIGH_TABLES == 1
-#if HAVE_LOW_TABLES == 0
-	mpc_start = high_table_end;
-#endif
-	if (high_tables_base) {
-		high_table_end = write_smp_table(high_table_end);
-		high_table_end = (high_table_end+1023) & ~1023;
+	if (dir_table_end < 0x500) {
+		dir_table_end = 0x500;
 	}
-#endif
-	smp_write_floating_table_physaddr(low_table_end, mpc_start);
-	low_table_end += SMP_FLOATING_TABLE_LEN;
-#endif /* HAVE_MP_TABLE */
 
-	if (low_table_end < 0x500) {
-		low_table_end = 0x500;
-	}
-
-	// Relocate the GDT to reserved memory, so it won't get clobbered
-#if HAVE_HIGH_TABLES == 1
-	if (high_tables_base) {
-		move_gdt(high_table_end);
-		high_table_end += &gdt_end - &gdt;
-		high_table_end = (high_table_end+1023) & ~1023;
-	} else {
-#endif
-		move_gdt(low_table_end);
-		low_table_end += &gdt_end - &gdt;
-		low_table_end = (low_table_end+1023) & ~1023;
-#if HAVE_HIGH_TABLES == 1
-	}
-#endif
+	/* Relocate the GDT to reserved memory, so it won't get clobbered. */
+	move_gdt(rom_table_end);
+	rom_table_end += &gdt_end - &gdt;
+	rom_table_end = (rom_table_end + 1023) & ~1023;
 
 #if CONFIG_MULTIBOOT
 	/* The Multiboot information structure */
 	mbi = (struct multiboot_info *)rom_table_end;
-	rom_table_end = write_multiboot_info(
-				low_table_start, low_table_end,
-				rom_table_start, rom_table_end);
+	rom_table_end = write_multiboot_info(dir_table_start, dir_table_end,
+					     rom_table_start, rom_table_end);
 #endif
 
+	*dir_end = dir_table_end;
+	*table_end = rom_table_end;
+}
+
 #if HAVE_HIGH_TABLES == 1
+uint64_t high_tables_base = 0;
+uint64_t high_tables_size;
+#endif
+
+/* HIGH_TABLES means a table in very low memory + at the end of RAM. */
+/* LOW_TABLES means a table in very low memory + at 0xf0000 (rom_table_*). */
+struct lb_memory *write_tables(void)
+{
+	unsigned long low_table_start, low_table_end;
+	unsigned long rom_table_start, rom_table_end;
+
+	rom_table_start = 0xf0000;
+	rom_table_end = 0xf0000;
+
+	/* Start low addr at 16 bytes instead of 0 because of a buglet
+	 * in the generic linux unzip code, as it tests for the a20 line.
+	 */
+	low_table_start = 0;
+	low_table_end = 16;
+
+	post_code(0x9a);
+
+#if HAVE_HIGH_TABLES == 1
+	unsigned long high_table_start=0, high_table_end=0;
+
 	if (high_tables_base) {
+		printk_debug("High Tables Base is %llx.\n", high_tables_base);
+		high_table_start = high_tables_base;
+		high_table_end = high_tables_base;
+		write_table(low_table_start, &low_table_end,
+			    high_table_start, &high_table_end);
 		write_coreboot_table(low_table_start, low_table_end,
 				     high_table_start, high_table_end);
 	} else {
 		printk_err("ERROR: No high_tables_base.\n");
+		write_table(low_table_start, &low_table_end,
+			    rom_table_start, &rom_table_end);
 		write_coreboot_table(low_table_start, low_table_end,
 				     rom_table_start, rom_table_end);
 	}
 #else
 	/* The coreboot table must be in 0-4K or 960K-1M */
+	write_table(low_table_start, &low_table_end,
+		    rom_table_start, &rom_table_end);
 	write_coreboot_table(low_table_start, low_table_end,
 			      rom_table_start, rom_table_end);
 #endif
