ソースを参照

Damn Broadcom and their damned incorrect assumptions about x86 memory

allocation.
tags/v0.9.3
Michael Brown 18年前
コミット
86171c53f4
1個のファイルの変更24行の追加3行の削除
  1. 24
    3
      src/arch/i386/prefix/libprefix.S

+ 24
- 3
src/arch/i386/prefix/libprefix.S ファイルの表示

@@ -17,6 +17,26 @@
17 17
  *
18 18
  */
19 19
 
20
+/**
21
+ * High memory temporary load address
22
+ *
23
+ * Temporary buffer into which to copy (or decompress) our runtime
24
+ * image, prior to calling get_memmap() and relocate().  We don't
25
+ * actually leave anything here once install() has returned.
26
+ *
27
+ * We use the start of an even megabyte so that we don't have to worry
28
+ * about the current state of the A20 line.
29
+ *
30
+ * We use 4MB rather than 2MB because there is at least one commercial
31
+ * PXE ROM ("Broadcom UNDI, PXE-2.1 (build 082) v2.0.4") which stores
32
+ * data required by the UNDI ROM loader (yes, the ROM loader; that's
33
+ * the component which should be impossible to damage short of
34
+ * screwing with the MMU) around the 2MB mark.  Sadly, this is not a
35
+ * joke.
36
+ *
37
+ */
38
+#define HIGHMEM_LOADPOINT ( 4 << 20 )
39
+
20 40
 #define CR0_PE 1
21 41
 
22 42
 	.arch i386
@@ -345,11 +365,12 @@ install_prealloc:
345 365
 	movw	%ax, (init_librm_vector+2)
346 366
 	movw	%ax, (prot_call_vector+2)
347 367
 	
348
-	/* Install .text and .data to 2MB mark.  Use 2MB to avoid
349
-	 * problems with A20.
368
+	/* Install .text and .data to temporary area in high memory,
369
+	 * prior to reading the E820 memory map and relocating
370
+	 * properly.
350 371
 	 */
351 372
 	call	flatten_real_mode
352
-	movl	$(2<<20), %edi
373
+	movl	$HIGHMEM_LOADPOINT, %edi
353 374
 	call	install_highmem
354 375
 
355 376
 	/* Set up initial protected-mode GDT, call relocate().

読み込み中…
キャンセル
保存