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

[tyndur-devel] [PATCH] kernel2: Kommandozeilenoption "smp"



* kernel2: SMP wird nur initialisiert, wenn die Kernelkommandozeile
  die Option "smp" enthält. Standardmäßig bootet das System damit auch
  auf einem Mehrprozessorsystem wieder, wenn auch mit nur einem aktiven
  Prozessor.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/kernel2/src/init.c    |   32 +++++++++++++++++++++++++++++++-
 src/kernel2/src/smp/smp.c |    6 +++++-
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/src/kernel2/src/init.c b/src/kernel2/src/init.c
index 1e9c1b3..359af08 100644
--- a/src/kernel2/src/init.c
+++ b/src/kernel2/src/init.c
@@ -68,6 +68,36 @@ void gdt_init(void);
 void vm86_init(void);
 void panic(char* message, ...);
 
+/**
+ * Liest die Kernelkommandozeile ein
+ *
+ * Als erster Teilstring wird einfach irgendwas akzeptiert, weil davon
+ * auszugehen ist, dass das der Kernelname ist. GRUB 2 übergibt den
+ * Kernelnamen allerdings nicht, deswegen werden auch an erster Position
+ * Parameter ausgewertet, wenn sie bekannt sind.
+ */
+static void parse_cmdline(char* cmdline)
+{
+    char* p;
+    extern bool enable_smp;
+    bool kernel_name = true;
+
+    p = strtok(cmdline, " ");
+
+    while (p) {
+        if (!strncmp(p, "debug=", 6)) {
+            debug_parse_cmdline(multiboot_info.mi_cmdline);
+        } else if (!strcmp(p, "smp")) {
+            enable_smp = true;
+        } else if (kernel_name) {
+            kernel_name = false;
+        } else {
+            kprintf("Unbekannte Option: '%s'\n", p);
+        }
+
+        p = strtok(NULL, " ");
+    }
+}
 
 /**
  * Kernel-Initialisierung erfolgt hier,
@@ -98,7 +128,7 @@ void init(int multiboot_magic, struct multiboot_info *boot_info, bool bsp)
         // Debugparameter verarbeiten, das ist aber nur moeglich, wenn eine
         // Kernelkommandozeile existiert.
         if ((multiboot_info.mi_flags & MULTIBOOT_INFO_HAS_CMDLINE) != 0) {
-            debug_parse_cmdline(multiboot_info.mi_cmdline);
+            parse_cmdline(multiboot_info.mi_cmdline);
         }
 
 #if CONFIG_ARCH == ARCH_I386
diff --git a/src/kernel2/src/smp/smp.c b/src/kernel2/src/smp/smp.c
index 0954960..732282b 100644
--- a/src/kernel2/src/smp/smp.c
+++ b/src/kernel2/src/smp/smp.c
@@ -35,6 +35,7 @@
 #include <types.h>
 #include <string.h>
 #include <stdint.h>
+#include <stdbool.h>
 #include <lost/config.h>
 
 #include "lock.h"
@@ -100,6 +101,9 @@ extern lock_t init_lock;
 /// Anzahl der Installierten CPUs
 extern size_t cpu_count;
 
+/// Weitere Prozessoren werden nur mit enable_smp = true initialisiert
+bool enable_smp = false;
+
 /**
  * Suchen des MP-Floating pointers in einem festgelegten Bereich. Diese
  * Struktur wird anhand der Signatur gesucht. Wenn die Signatur uebereinstimmt,
@@ -203,7 +207,7 @@ void smp_init(void)
     // Wenn der Floating-Pointer nicht gefunden wurde, wird abgebrochen, denn
     // dann wurde er entweder ueberschrieben, oder oder aber kein SMP wird
     // unterstuetzt.
-    if ((floating_pointer == NULL) || (!CONFIG_SMP)) {
+    if ((floating_pointer == NULL) || (!CONFIG_SMP) || !enable_smp) {
         // Wenn kein SMP aktiviert ist, muss der Bootstrapprozessor manuell in
         // die CPU-Liste eingetragen werden, damit im Rest des Codes nicht
         // unterschieden werden muss.
-- 
1.6.0.2