[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