[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH 1/2] kernel2: Debugging für kernel2 "aktiviert"
+ debug.c: debug_parse_cmdline aus kernel1 kopiert
* init.c: #if 0 entfernt, damit es mitkompilliert wird
* multiboot.h: mi_cmdline zu char* geändert
Signed-off-by: Alexander Kluth <hartmut@xxxxxxxxxx>
---
src/kernel2/include/multiboot.h | 2 +-
src/kernel2/src/debug.c | 36 +++++++++++++++++++++++++++++++++++-
src/kernel2/src/init.c | 30 +++++++++++++++---------------
3 files changed, 51 insertions(+), 17 deletions(-)
diff --git a/src/kernel2/include/multiboot.h b/src/kernel2/include/multiboot.h
index 687fee9..046df51 100644
--- a/src/kernel2/include/multiboot.h
+++ b/src/kernel2/include/multiboot.h
@@ -103,7 +103,7 @@ struct multiboot_info {
uint8_t mi_boot_device_drive;
/* Valid if mi_flags sets MULTIBOOT_INFO_HAS_CMDLINE. */
- uint32_t mi_cmdline;
+ char* mi_cmdline;
/* Valid if mi_flags sets MULTIBOOT_INFO_HAS_MODS. */
uint32_t mi_mods_count;
diff --git a/src/kernel2/src/debug.c b/src/kernel2/src/debug.c
index 45c8a11..28312db 100644
--- a/src/kernel2/src/debug.c
+++ b/src/kernel2/src/debug.c
@@ -59,7 +59,7 @@ bool debug_test_flag(uint32_t flag)
/**
* Gibt die Debug-Meldung aus, wenn das Flag gesetzt ist.
- *
+ *
* @param flag Flag-Nummer
*/
void debug_print(uint32_t flag, const char* message)
@@ -69,3 +69,37 @@ void debug_print(uint32_t flag, const char* message)
}
}
+///Setzt die richtigen Debug-Flags anhand der Commandline vom Bootloader
+void debug_parse_cmdline(char* cmdline)
+{
+ char* pos = strstr(cmdline, "debug=");
+ debug_flags = 0;
+
+ if(pos == NULL) return;
+
+ //Debug= ueberspringen
+ pos += 6;
+ while((*pos != 0) && (*pos != ' '))
+ {
+ switch(*pos)
+ {
+ case 'i':
+ debug_flags |= DEBUG_FLAG_INIT;
+ break;
+
+ case 'p':
+ debug_flags |= DEBUG_FLAG_PEDANTIC;
+ break;
+
+ case 's':
+ debug_flags |= DEBUG_FLAG_STACK_BACKTRACE;
+ break;
+
+ case 'c':
+ debug_flags |= DEBUG_FLAG_SYSCALL;
+ break;
+ }
+ pos++;
+ }
+}
+
diff --git a/src/kernel2/src/init.c b/src/kernel2/src/init.c
index f754122..e025564 100644
--- a/src/kernel2/src/init.c
+++ b/src/kernel2/src/init.c
@@ -66,8 +66,10 @@ lock_t init_lock = 0;
void smp_init(void);
void gdt_init(void);
void vm86_init(void);
+void panic(char* message, ...);
-/**
+
+/**
* Kernel-Initialisierung erfolgt hier,
* die Funktion init wird von header.asm aufgerufen (BSP = true) oder aus
* smp_trampoline.asm
@@ -93,13 +95,11 @@ void init(int multiboot_magic, struct multiboot_info *boot_info, bool bsp)
init_thread.process = &init_process;
cpu_get(0)->thread = &init_thread;
- #if 0
// 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);
}
- #endif
#if CONFIG_ARCH == ARCH_I386
// IVT fuer den VM86 sichern
@@ -109,17 +109,17 @@ void init(int multiboot_magic, struct multiboot_info *boot_info, bool bsp)
debug_print(DEBUG_FLAG_INIT, "Initialisiere physikalische"
"Speicherverwaltung");
pmm_init(&multiboot_info);
-
+
// APIC initialisieren (Wird bei der SMP-Initialisierung genutzt
apic_init();
-
+
// SMP muss _direkt nach_ der physikalischen Speicherverwaltung
// initialisiert werden, da sonst notwendige Strukturen im Speicher
// dazu ueberschrieben werden koennten.
debug_print(DEBUG_FLAG_INIT, "Initialisiere Mehrprozessor-"
"Unterstuetzung");
smp_init();
-
+
// GDT und IDT vorbereiten
gdt_init();
im_init();
@@ -152,8 +152,8 @@ void init(int multiboot_magic, struct multiboot_info *boot_info, bool bsp)
unlock(&mm_prepare_lock);
} else {
// Warten, bis wir das Signal vom BSP haben, zum fortfahren
- lock_wait(&mm_prepare_lock);
-
+ lock_wait(&mm_prepare_lock);
+
// TODO: Was tun, wenn dieses identity-Mapping schief geht?
// Dies ist naehmlich sher warscheinlich.
uintptr_t sp;
@@ -165,7 +165,7 @@ void init(int multiboot_magic, struct multiboot_info *boot_info, bool bsp)
mmc_map(init_context, (vaddr_t) PAGE_ALIGN_ROUND_DOWN(sp),
(paddr_t) PAGE_ALIGN_ROUND_DOWN(sp), MM_FLAGS_KERNEL_DATA, 1);
}
-
+
// Warten, bis alle CPUs hier angekommen sind.
// TODO: Timeout?
@@ -197,7 +197,7 @@ void init(int multiboot_magic, struct multiboot_info *boot_info, bool bsp)
);
#endif
- static volatile lock_t vmm_lock = LOCK_LOCKED;
+ static volatile lock_t vmm_lock = LOCK_LOCKED;
// ACHTUNG: Hier besteht ein kleines Problem: Da in vmm_init der APIC
// gemappt wird, kann nicht mehr darauf zugegriffen werden, bis Paging
// aktiviert ist. Das geht sonst schief! Genau das geschieht aber, wenn
@@ -247,7 +247,7 @@ void init(int multiboot_magic, struct multiboot_info *boot_info, bool bsp)
// Warten, bis wir das Signal vom BSP haben, zum fortfahren
lock_wait(&final_lock);
}
-
+
// Ersten Thread auf dieser CPU starten
current_thread = pm_scheduler_pop();
@@ -270,7 +270,7 @@ __attribute__((noreturn)) void panic(char * message, ...)
"PANIC: ");
kaprintf(message, args);
kprintf("\n");
-
+
// FIXME
#undef CONFIG_DEBUG_LAST_SYSCALL
#ifdef CONFIG_DEBUG_LAST_SYSCALL
@@ -283,12 +283,12 @@ __attribute__((noreturn)) void panic(char * message, ...)
}
kprintf("\n");
}
- #endif
+ #endif
stack_backtrace(0, 0);
-
+
kprintf("\033[0;37m\033[40m");
-
+
while(1) {
cpu_halt();
--
1.7.2.5