[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] SMP: An den richtigen Stellen nach der FPS suchen



From: Max Reitz <max@xxxxxxxxxx>

* Die Floating Point Structure liegt nicht im Kilobyte ab NULL,
  sondern in der EBDA (deren Adresse in der BDA steht) und es ist
  vermutlich sicherer, die genaue Größe des konventionellen
  Speichers ebenfalls aus der BDA zu lesen als sie zu erraten

Signed-off-by: Max Reitz <max@xxxxxxxxxx>
---
 src/kernel2/src/smp/smp.c |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/kernel2/src/smp/smp.c b/src/kernel2/src/smp/smp.c
index 3c22a41..f1c3d58 100644
--- a/src/kernel2/src/smp/smp.c
+++ b/src/kernel2/src/smp/smp.c
@@ -153,17 +153,22 @@ static struct MP_floating_pointer* find_floating_pointer(void)
     // Die Adresse dieser Struktur ist nicht genau festgelegt. In der Intel
     // Multiprozessor-Spezifikation sind drei Bereiche festgelegt, in denen sie
     // sich befinden kann. Hier wird versucht sie zu finden.
-    
-    floating_pointer = find_floating_pointer_in(0, 0x400);
+
+    // EBDA (Real-Mode-Segment steht im Word am Offset 0x0E der BIOS Data Area)
+    floating_pointer = find_floating_pointer_in(*((uint16_t*) 0x040E) << 4,
+        0x400);
     if (floating_pointer != NULL) {
         return floating_pointer;
     }
-    
-    floating_pointer = find_floating_pointer_in(0x9FC00, 0x400);
+
+    // Letztes Kilobyte des konventionellen Speichers (Größe des Speichers in
+    // Kilobyte steht im Word am Offset 0x13 der BIOS Data Area)
+    floating_pointer =
+        find_floating_pointer_in((*((uint16_t*) 0x0413) - 1) << 10, 0x400);
     if (floating_pointer != NULL) {
         return floating_pointer;
     }
-    
+
     floating_pointer = find_floating_pointer_in(0xE0000, 0x20000);
 
     return floating_pointer;
-- 
1.6.4.2