]> Zhao Yanbai Git Server - kernel.git/commitdiff
read root device from cmdline
authorAceVest <zhaoyanbai@126.com>
Mon, 7 Jul 2014 16:03:27 +0000 (00:03 +0800)
committerAceVest <zhaoyanbai@126.com>
Mon, 7 Jul 2014 16:03:27 +0000 (00:03 +0800)
16 files changed:
boot/boot.c
boot/cmdline.c
drivers/ide.c
drivers/keyboard.c
drivers/vga.c
include/printk.h
include/string.h
include/system.h
kernel/clock.c
kernel/init.c
kernel/irq.c
kernel/printk.c
kernel/setup.c
kernel/wait.c
lib/string.c
scripts/grub.cfg

index 59d4a26936d055c79c559a42f7d33a7c16fdb412..a2e3e7425877fa3a004b24d887d92be13b986df2 100644 (file)
 
 struct boot_params boot_params __attribute__((aligned(32)));
 
+void parse_cmdline(const char *cmdline);
+
 void init_boot_params(multiboot_info_t *p)
 {
     boot_params.cmdline = (char *) p->cmdline;
 
+    parse_cmdline(boot_params.cmdline);
+
     // KB to Bytes
     // no need to concern about 64bit
     boot_params.mem_lower = p->mem_lower << 10;
index 2937e01c76182d1a5b8eeecb77b222e94e3afafb..b37eaaf1c937873bd33e44771c88f80d3ef4177d 100644 (file)
 #include <string.h>
 #include <stdlib.h>
 
-void get_variable_value(const char *name, char *value);
-
-void parse_root_dev()
+static void get_value(const char *name, char *value)
 {
-    char    value[128];
-    int    n;
-    get_variable_value("root", value);
-
-    /* 目前只支持通道一的一个硬盘 */
-    /*
-    printk("D:%s\n", value);
-    assert(    value[0] == '(' &&
-        value[1] == 'h' &&
-        value[2] == 'd' &&
-        value[3] == '0' &&
-        value[4] == ',');
-    */
-    value[0] = '(';
-    value[1] = 'h';
-    value[2] = 'd';
-    value[3] = '0';
-    value[4] = ')';
-    value[5] = ',';
-    value[6] = '0';
-    value[7] = '\0';
-    n = atoi(value+5);
-
-    system.root_dev = MAKE_DEV(DEV_MAJOR_HD, n+1);
-}
-void parse_debug()
-{
-    char value[128];
-    int n;
-    get_variable_value("debug", value);
-    n = atoi(value);
+    const char *p;
+    if(0 != (p = strstr(system.cmdline, name)) )
+    {
+        if(0 != (p = strstr(p, "=")))
+        {
+            p++;
+            while(*p != ' ' && *p != 0)
+                *value++ = *p++;
+        }
+    }
 
-    system.debug = (n != 0);
+    *value = 0;
 }
 
 
-void parse_cmdline(char *cmdline)
+void parse_cmdline(const char *cmdline)
 {
+    char value[128];
     system.cmdline = cmdline;
     printk("cmdline: %s\n", system.cmdline);
-    parse_root_dev();
-    parse_debug();
-#if 0
-    get_variable_value("root", value);
-    printk("root : %s\n", value, n);
-    get_variable_value("debug", value);
-    n = atoi(value);
-    printk("debug : %s %d\n", value, n);
-    while(1);
-#endif
-}
-
-
-void get_variable_value(const char *name, char *value)
-{
-    char *p = system.cmdline;
-    char buf[256];
-    int  i;
-    *value = 0;
-
-    while(*p)
-    {
-        while(*p != ' ')
-        {
-            if(*p++ == 0)
-                return;
-        }
-        p++;
-        i = 0;
-        while(*p != '=' && *p != 0)
-            buf[i++] = *p++;
-        if(*p++ == 0)
-            return;
-        buf[i] = 0;
-        //printk("%s %s %d\n",buf, name, strcmp(buf, name));
-
-        if(strcmp(buf, name) != 0)
-        {
-            while(*p != ' ' && *p != 0)
-                p++;
-            continue;
-        }
-
-        i = 0;
-        while(*p != ' ' && *p != 0)
-            value[i++] = *p++;
-        value[i] = 0;
-        //printk("DD %s", value);
-        return ;
-    }
 
+    get_value("root", value);
+    printk("root device %s\n", value);
+    assert(value[0]=='h' && value[1]=='d' && value[2] == 'a');
+    system.root_dev = MAKE_DEV(DEV_MAJOR_HD, atoi(value+3));
+    printk("root device %08x\n", system.root_dev);
 }
index a9a25869bafcd0c240bb8b6639840a9fe9f4e741..56f890284adccb8c407194a42b488157df2e829c 100644 (file)
@@ -73,9 +73,9 @@ unsigned int HD_CHL1_CMD_BASE = 0x170;
 unsigned int HD_CHL0_CTL_BASE = 0x3F6;
 unsigned int HD_CHL1_CTL_BASE = 0x376;
 
-void ide_printd()
+void ide_printl()
 {
-    printd(MPL_IDE, "ide pio_cnt %d dma_cnt %d irq_cnt %d", drv.pio_cnt,  drv.dma_cnt, drv.irq_cnt);
+    printl(MPL_IDE, "ide pio_cnt %d dma_cnt %d irq_cnt %d", drv.pio_cnt,  drv.dma_cnt, drv.irq_cnt);
 }
 
 void ide_cmd_out(dev_t dev, u32 sect_cnt, u64 sect_nr, u32 cmd)
@@ -83,7 +83,7 @@ void ide_cmd_out(dev_t dev, u32 sect_cnt, u64 sect_nr, u32 cmd)
     drv.pio_cnt++;
     drv.read_mode = cmd;
 
-    ide_printd();
+    ide_printl();
 
     outb(0x00,                      REG_CTL(dev));
     outb(0x40|0x00,                 REG_DEVSEL(dev));
@@ -124,7 +124,7 @@ void ide_do_read(u64_t lba, u32_t scnt, char *buf)
     
     while(true)
     {
-        printl("%s pid %d is going to wait\n", __func__, sysc_getpid());
+        printd("%s pid %d is going to wait\n", __func__, sysc_getpid());
         task->state = TASK_WAIT;
         irq_save(flags);
         finish = r->finish;
@@ -134,10 +134,10 @@ void ide_do_read(u64_t lba, u32_t scnt, char *buf)
             break;
 
         schedule();
-        printl("%s pid %d is running\n", __func__, sysc_getpid());
+        printd("%s pid %d is running\n", __func__, sysc_getpid());
     }
 
-    printl("%s pid %d is really running\n", __func__, sysc_getpid());
+    printd("%s pid %d is really running\n", __func__, sysc_getpid());
     task->state = TASK_RUNNING;
     del_wait_queue(&r->wait, &wait);
 }
@@ -180,7 +180,7 @@ void ide_pci_init(pci_device_t *pci)
     HD_CHL1_CTL_BASE = pci->bars[3] ? pci->bars[3] : HD_CHL1_CTL_BASE;
 
     printk("channel0: cmd %04x ctl %04x channel1: cmd %04x ctl %04x\n", HD_CHL0_CMD_BASE, HD_CHL0_CTL_BASE, HD_CHL1_CMD_BASE, HD_CHL1_CTL_BASE);
-    printd(18, "channel0: cmd %04x ctl %04x channel1: cmd %04x ctl %04x", HD_CHL0_CMD_BASE, HD_CHL0_CTL_BASE, HD_CHL1_CMD_BASE, HD_CHL1_CTL_BASE);
+    printl(18, "channel0: cmd %04x ctl %04x channel1: cmd %04x ctl %04x", HD_CHL0_CMD_BASE, HD_CHL0_CTL_BASE, HD_CHL1_CMD_BASE, HD_CHL1_CTL_BASE);
 }
 
 
@@ -211,7 +211,7 @@ void init_pci_controller(unsigned int classcode)
     if(pci != 0 && pci->intr_line < 16)
     {
         printk("Found PCI Vendor %04x Device %04x Class %04x IntrLine %d\n", pci->vendor, pci->device, pci->classcode, pci->intr_line);
-        printd(17, "Found PCI Vendor %04x Device %04x Class %04x IntrLine %d", pci->vendor, pci->device, pci->classcode, pci->intr_line);
+        printl(17, "Found PCI Vendor %04x Device %04x Class %04x IntrLine %d", pci->vendor, pci->device, pci->classcode, pci->intr_line);
         ide_pci_init(pci);
         drv.pci = pci;
     }
@@ -246,10 +246,10 @@ void ide_default_intr()
         sig = *((u16_t *) (dma_data+510));
     }
 
-    ide_printd();
+    ide_printl();
 
-    printl(" hard disk sig %04x read mode %x cnt %d\n", sig, drv.read_mode, drv.irq_cnt);
-    printd(MPL_IDE_INTR, "hard disk sig %x read mode %x cnt %d", sig, drv.read_mode, drv.irq_cnt);
+    printd(" hard disk sig %04x read mode %x cnt %d\n", sig, drv.read_mode, drv.irq_cnt);
+    printl(MPL_IDE_INTR, "hard disk sig %x read mode %x cnt %d", sig, drv.read_mode, drv.irq_cnt);
 
     outb(PCI_IDE_CMD_STOP, drv.bus_cmd);
 
@@ -289,7 +289,7 @@ void ide_dma_pci_lba48()
     prd.eot  = 1;
     gprdt = va2pa(&prd);
 
-    printd(16, "gprdt %08x &prdt %08x prd.addr %08x addr %08x",
+    printl(16, "gprdt %08x &prdt %08x prd.addr %08x addr %08x",
             gprdt, &prd, prd.addr, addr);
 
     outb(PCI_IDE_CMD_STOP, drv.bus_cmd);
@@ -379,7 +379,7 @@ void ide_read_extended_partition(u64_t lba, unsigned int inx)
         panic("bad partition sect");
 
     hd_part_t *p = (hd_part_t *)(buf+PARTITION_TABLE_OFFSET);
-    printl("%s:%d lba %d \n", __func__, __LINE__, lba);
+    printd("%s:%d lba %d \n", __func__, __LINE__, lba);
 
     for(i=0; i<PARTITION_CNT; ++i, ++p)
     {
@@ -467,5 +467,5 @@ void ide_init()
 
     ide_read_partition();
 
-    ide_printd();
+    ide_printl();
 }
index 48d6013b52328534d3a6d5f6d81aa36041e38b0a..1998cb35a56fd322b489289e2ef129867349fdcf 100644 (file)
@@ -36,7 +36,7 @@ void kbd_handler(unsigned int irq, pt_regs_t * regs, void *dev_id)
     unsigned char scan_code;
     scan_code = inb(0x60);
 
-    printd(MPL_KEYBOARD, "keyboard:%d scan code %02x", kbd_cnt++, scan_code);
+    printl(MPL_KEYBOARD, "keyboard:%d scan code %02x", kbd_cnt++, scan_code);
 
     if(scan_code == 0x01) // Esc
         reboot();
index 51c52c0015c528dc312f63fcb1c176eeeec128b8..03ad7540502a5923a4477d700a14911e6044595e 100644 (file)
@@ -231,14 +231,14 @@ void vga_dbg_clear()
     }
 }
 
-void vga_dbg_puts(unsigned int line, const char *buf)
+void vga_dbg_puts(unsigned int line, unsigned int offset, const char *buf)
 {
+    assert(line   < LINES_PER_SCREEN);
+    assert(offset < CHARS_PER_LINE);
+
     int i;
     char *p = (char *) buf;
-    vga_char_t * const pv = (vga_char_t * const) (VIDEO_ADDR + (VIDEO_DBG_LINE + line) * BYTES_PER_LINE);
-
-    for(i=0; i<CHARS_PER_LINE; ++i)
-        pv[i] = vga_char(0, vga_dbg_color);
+    vga_char_t * const pv = (vga_char_t * const) (VIDEO_ADDR + (VIDEO_DBG_LINE + line) * BYTES_PER_LINE + offset*sizeof(vga_char_t));
 
     for(i=0; *p; ++i, ++p)
     {
index bd4c2fc67e128a41589f0e1561a5cef87697ebc6..db25352fd7df46af2ce4157816cbac1473e95ca3 100644 (file)
 
 void switch_printk_screen();
 int printk(const char *fmtstr, ...);
-int printl(const char *fmtstr, ...);
-int printd(unsigned int line, const char *fmtstr, ...);
+int printd(const char *fmtstr, ...);
+int printlo(unsigned int line, unsigned int offset, const char *fmtstr, ...);
+
+#define printl(line, fmt, args...) printlo(line, 0, fmt, ## args)
+#define printll(line, fmt, args...) printlo(line, 0, fmt, ## args)
+#define printlr(line, fmt, args...) printlo(line, 40, fmt, ## args)
 
 // monitor print line
 enum {
+    MPL_TITLE,
+    MPL_ROOTDEV,
     MPL_CLOCK,
     MPL_KEYBOARD,
     MPL_IDE,
index 393bebfb8646855da21bade0d632c9138f23427e..b40d15c67c2b4c990ce9ec67ed35667d097be835 100644 (file)
@@ -23,9 +23,11 @@ size_t strlen(const char *str);
 int    strcmp(const char *a, const char *b);
 int    strncmp(const char *a, const char *b, size_t count);
 char   *strcat(char *dest, const char *src);
+char *strstr(const char *a, const char *b);
 
 
-void    *memcpy(void *dest, const void *src, size_t size);
-void    memset(void *dest, char ch, size_t size);
+void *memcpy(void *dest, const void *src, size_t size);
+void memset(void *dest, char ch, size_t size);
+int memcmp(const void *a, const void *b, size_t count);
 
 #endif //_STRING_H
index 572cbb210c5b01f34fed97d95063293262079912..f9dcb85047f64b96bbd935c1acbaa0fdf21d644b 100644 (file)
@@ -186,7 +186,7 @@ typedef struct system
 
     dev_t root_dev;
 #define CMD_LINE_SIZE    128
-    char *cmdline;
+    const char *cmdline;
 
     u32 debug;
 } System, *pSystem;
index 370a159887dee91679c35fc471a9ce5b8328f13e..b5d1c046cb1b3f2c478c9f23515ec159562034e7 100644 (file)
@@ -24,6 +24,6 @@ void clk_handler(unsigned int irq, pt_regs_t * regs, void *dev_id)
 {
     jiffies++;
 
-    printl("^");
-    printd(MPL_CLOCK, "clock:%d", jiffies);
+    printd("^");
+    printl(MPL_CLOCK, "clock:%d", jiffies);
 }
index b03b442e9e41ab2e6ac4dbbf653a1ffb526e3824..141370ab51dce3879f0f3c4b40fb0d66e80a1079 100644 (file)
@@ -29,7 +29,7 @@ void init_task_entry()
 
     while(1)
     {
-        printd(MPL_TASK_1+id-1, "task:%d [%08x] weight %d cnt %d", id, current, current->weight, cnt++);
+        printl(MPL_TASK_1+id-1, "task:%d [%08x] weight %d cnt %d", id, current, current->weight, cnt++);
         int v = debug_wait_queue_get();
         printk("task:%d wait queue get %d\n", id, v);
     }
@@ -52,7 +52,7 @@ void root_task_entry()
     int cnt = 0;
     while(1)
     {
-        printd(MPL_ROOT, "root:0 [%08x] weight %d cnt %d", current, root_task.weight, cnt++);
+        printl(MPL_ROOT, "root:0 [%08x] weight %d cnt %d", current, root_task.weight, cnt++);
         asm("sti;hlt;");
         //sysc_test();
         //syscall0(SYSC_TEST);
index 0c4b7e9f7d3b0583d9be29523c7a9352062f4563..6ab45b2ee580fabbeee36dda385a764b59ee4b39 100644 (file)
@@ -58,7 +58,7 @@ __attribute__ ((regparm(1))) void irq_handler(pt_regs_t *regs)
 
     unsigned long esp;
     asm("movl %%esp, %%eax":"=a"(esp));
-    printd(MPL_PREEMPT, "current %08x  preempt %d esp %08x", current, current->preempt_cnt, esp);
+    printl(MPL_PREEMPT, "current %08x  preempt %d esp %08x", current, current->preempt_cnt, esp);
 
     p->chip->ack(irq);
     sti();
index 7e9e5c6bbc0c278ed1730bfc9802214d0021f5dd..bfe105aa749dd34b1d7b7eb5920442b5a0f2e219 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 extern void vga_puts(unsigned int nr, const char *buf, unsigned char color);
-extern void vga_dbg_puts(unsigned long line, const char *buf, unsigned char color);
+extern void vga_dbg_puts(unsigned int line, unsigned int offset, const char *buf);
 
 unsigned int printk_screen_nr = 0;
 
@@ -36,22 +36,21 @@ int printk(const char *fmtstr, ...)
     return 0;
 }
 
-//char plbuf[1024];
-int printl(const char *fmtstr, ...)
+int printd(const char *fmtstr, ...)
 {
-    char *plbuf = (char *)kmalloc(1024, 0);
+    char *pdbuf = (char *)kmalloc(1024, 0);
     char *args = (char*)(((char*)&fmtstr)+4);
-    vsprintf(pkbuf, fmtstr, args);
-    vga_puts(3, pkbuf, 0x4);
-    kfree(plbuf);
+    vsprintf(pdbuf, fmtstr, args);
+    vga_puts(3, pdbuf, 0x4);
+    kfree(pdbuf);
     return 0;
 }
 
-char pdbuf[1024];
-int printd(unsigned int line, const char *fmtstr, ...)
+char plobuf[1024];
+int printlo(unsigned int line, unsigned int offset, const char *fmtstr, ...)
 {
     char *args = (char*)(((char*)&fmtstr)+4);
-    vsprintf(pdbuf, fmtstr, args);
-    vga_dbg_puts(line, pdbuf, 0x7);
+    vsprintf(plobuf, fmtstr, args);
+    vga_dbg_puts(line, offset, plobuf);
     return 0;
 }
index a6558a873ee18a14c9f95f37f0cffe0c932b5284..fbe49984eded445bccd9bd47a5a020a608fac537 100644 (file)
@@ -79,6 +79,8 @@ void setup_kernel()
 
     cnsl_init();
 
+    printl(MPL_TITLE, "                                 SYSTEM MONITOR");
+    printl(MPL_ROOTDEV, "root device %08x", system.root_dev);
 
     setup_tasks();
 
index 92f15a9182941191058f1071c9f534dfe2f5eef7..658ae85f216c9b20c228e2779aae959bbfd6544e 100644 (file)
@@ -59,7 +59,7 @@ int debug_wait_queue_get()
 
     while(1)
     {
-        printl("pid %d is going to wait\n", sysc_getpid());
+        printd("pid %d is going to wait\n", sysc_getpid());
         task->state = TASK_WAIT;
 
         disable_irq();
@@ -72,10 +72,10 @@ int debug_wait_queue_get()
             break;
 
         schedule();
-        printl("pid %d is running\n", sysc_getpid());
+        printd("pid %d is running\n", sysc_getpid());
     }
 
-    printl("pid %d is really running\n", sysc_getpid());
+    printd("pid %d is really running\n", sysc_getpid());
     task->state = TASK_RUNNING;
     del_wait_queue(&debug_wq, &wait);
 
index 82663bfaee0dc4887a49e45881d1d768043a5374..ad82cd85d7902fb8de00f8773f3dcca9e1d940c0 100644 (file)
@@ -73,3 +73,31 @@ void memset(void *dest, char ch, size_t size)
     char *d = (char *) dest;
     while(size--) *d++ = ch;
 }
+
+int memcmp(const void *a, const void *b, size_t count)
+{
+    const unsigned char *sa, *sb;
+    int delta = 0;
+    for(sa=a, sb=b; count>0; ++sa, ++sb, --count)
+        if((delta = *sa - *sb) != 0)
+            break;
+    return delta;
+}
+
+char *strstr(const char *a, const char *b)
+{
+    size_t la, lb;
+    lb = strlen(b);
+    if(lb == 0)
+        return (char *) a;
+    la = strlen(a);
+    while(la >= lb)
+    {
+        la--;
+        if(memcmp(a, b, lb) == 0)
+            return (char *)a;
+        a++;
+    }
+
+    return 0;
+}
index 7fc3b72acfa979f4491640cea0eeb9dff8f64f84..536311e7587af33a7c727dd91ede6f592bd9f200 100644 (file)
@@ -8,5 +8,5 @@ insmod ext2
 root=(hd0,msdos1)
 
 menuentry 'Kernel' --class os {
-    multiboot /boot/Kernel root=0
+    multiboot /boot/Kernel root=hda0
 }