[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