]> Zhao Yanbai Git Server - kernel.git/commitdiff
support read partition on my laptop
authorAceVest <zhaoyanbai@126.com>
Sat, 5 Jul 2014 15:36:45 +0000 (23:36 +0800)
committerAceVest <zhaoyanbai@126.com>
Sat, 5 Jul 2014 15:36:45 +0000 (23:36 +0800)
drivers/ide.c
drivers/vga.c
fs/fs.c
kernel/setup.c
kernel/system.c
scripts/grub.cfg

index 03c5340c28b81c9d30188925ba683a78c588a559..6c11252f55bde673007f62963bce085ee2851020 100644 (file)
@@ -386,16 +386,14 @@ void ide_dma_pci_lba48()
 }
 
 typedef struct {
-    unsigned char a;
-    unsigned char b;
-    unsigned char c;
-    unsigned char d;
-    unsigned char type;
-    unsigned char f;
-    unsigned char g;
-    unsigned char h;
-    unsigned int lba;
-    unsigned int sect_cnt;
+    u8_t a;
+    u8_t b;
+    u16_t lbah;         // Lba High
+    u8_t type;
+    u8_t f;
+    u16_t scnth;        // Sector Count High
+    u32_t lba;   // Lba Low
+    u32_t scnt;  // Sector Count
 } hd_part_t ;
 
 
@@ -403,12 +401,25 @@ typedef struct {
 char *ide_init_buf = 0;
 void ide_init_intr()
 {
+    //printk("%s\n", __func__);
     drv.irq_cnt++;
 
     u8_t status = inb(REG_STATUS(0));
 
+    status = inb(drv.bus_status);
+    if(0 == (status & PCI_IDE_STATUS_INTR))
+    {
+        return ;
+    }
+
+    status |= PCI_IDE_STATUS_INTR;
+    outb(status, drv.bus_status);
+    outb(0x00,   drv.bus_cmd);
+
     insl(REG_DATA(0), ide_init_buf, (512>>2));
 
+    outb(PCI_IDE_CMD_STOP, drv.bus_cmd);
+
     ide_init_inted = true;
 }
 
@@ -426,55 +437,16 @@ void ide_init_wait_intr()
 void ide_init_wait_read(u64 lba, char *buf)
 {
     ide_init_buf = buf;
+    ide_intr_func = ide_init_intr;
     _ide_cmd_out(0, 1, lba, HD_CMD_READ_EXT, true);
     ide_init_wait_intr();
 }
 
-#if 0
-void ide_read_partition(u64_t lba, bool extended)
-{
-    unsigned int i;
-    char *buf = kmalloc(512, 0);
-    if(buf == 0)
-        panic("no memory");
-
-    ide_init_wait_read(lba, buf);
-
-    u16_t sig = *((u16_t *) (buf+510));
-    if(sig != 0xAA55)
-        panic("bad partition sect");
-
-    hd_part_t *p = (hd_part_t *)(buf+PARTITION_TABLE_OFFSET);
-    printk("-------------------------\n");
-    for(i=0; i<PARTITION_CNT; ++i, ++p)
-    {
-        if(p->type == 0)
-            continue;
-
-        u64_t   part_lba    = p->lba;       // TODO
-        u64_t   part_scnt   = p->sect_cnt;
-
-        if(p->type == 0x05)
-            printk(" Partition[%d] [%02x] LBA %d %d\n", i, p->type, (unsigned int)part_lba, (unsigned int)((extended?drv.ext_lba_base:0)+part_lba));
-        else
-            printk(" Partition[%d] [%02x] LBA %d %d\n", i, p->type, (unsigned int)part_lba, (unsigned int)(lba+part_lba));
-
-        if(p->type == 0x05)
-        {
-            if(drv.ext_lba_base == 0)
-                drv.ext_lba_base =part_lba; 
-
-
-            ide_read_partition(part_lba+(extended?drv.ext_lba_base:0), true);
-        }
-    }
-
-    kfree(buf);
-}
-#endif
-
 void ide_read_extended_partition(u64_t lba, unsigned int inx)
 {
+    if(inx >= MAX_SUPPORT_PARTITION_CNT)
+        return ;
+
     unsigned int i;
     char *buf = kmalloc(512, 0);
     if(buf == 0)
@@ -494,8 +466,10 @@ void ide_read_extended_partition(u64_t lba, unsigned int inx)
         if(p->type == 0)
             continue;
 
-        u64_t   part_lba = lba + p->lba;       // TODO
-        u64_t   part_scnt   = p->sect_cnt;
+        //u64_t   part_lba = lba + (p->lba|((p->lbah*1ULL)<<32));
+        //u64_t   part_scnt= p->scnt | ((p->scnth*1ULL)<<32);
+        u64_t   part_lba = lba + p->lba;
+        u64_t   part_scnt   = p->scnt;
 
         if(p->type != 0x05)
         {
@@ -532,13 +506,15 @@ void ide_read_partition()
 
     unsigned int ext_inx = ~0U;
 
-    for(i=1; i<PARTITION_CNT; ++i, ++p)
+    for(i=0; i<PARTITION_CNT; ++i, ++p)
     {
         if(p->type == 0)
             continue;
 
-        u64_t   part_lba    = p->lba;       // TODO
-        u64_t   part_scnt   = p->sect_cnt;
+        //u64_t   part_lba = p->lba|((p->lbah*1ULL)<<32);
+        //u64_t   part_scnt= p->scnt | ((p->scnth*1ULL)<<32);
+        u64_t   part_lba    = p->lba;
+        u64_t   part_scnt   = p->scnt;
 
         drv.part[i].lba_start  = part_lba;
         drv.part[i].lba_end    = part_lba+part_scnt;
@@ -559,18 +535,7 @@ void ide_read_partition()
     kfree(buf);
 
     if(ext_inx != ~0U)
-        ide_read_extended_partition(drv.part[ext_inx].lba_start, 5);
-}
-
-
-
-void ide_init_partition()
-{
-    ide_intr_func = ide_init_intr;
-
-    ide_read_partition();
-
-    ide_intr_func = ide_default_intr;
+        ide_read_extended_partition(drv.part[ext_inx].lba_start, 4);
 }
 
 void ide_init()
@@ -584,5 +549,7 @@ void ide_init()
     ide_printd();
 #endif
 
-    ide_init_partition();
+    ide_read_partition();
+
+    ide_intr_func = ide_default_intr;
 }
index 8964eccdb026c62bdce32f97c956424a9160626a..00c639cd808466b09c8313ab513a6cc1030484d8 100644 (file)
@@ -242,6 +242,7 @@ void vga_dbg_puts(unsigned int line, const char *buf, unsigned char color)
 
     for(i=0; *p; ++i, ++p)
     {
+        color = 0x1F;
         pv[i] = vga_char(*p, color);
     }
 }
diff --git a/fs/fs.c b/fs/fs.c
index 8d7d41eb079c947de8750e872487bf9bfe223bd2..c98d4ad48cb41da3a4d759ea41314abe77aff507 100644 (file)
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -62,78 +62,6 @@ void setup_fs()
 
 
     return ;
-    //int j = 0xF0000000;
-    //while(j--);
-    
-
-/*
-    minor = 5;    
-    if(minor >= 5)
-    {
-        for(i=0; i<4; i++)
-        {
-            p = (pPartition)(buf+PARTS_POS) + i;
-            if(p->Type == 0x05)
-                break;
-        }
-        assert(i<4);
-        //read_ext_part(0, p->AbsoluteSectNo);
-        read_ext_part(p->AbsoluteSectNo, 0);
-    }
-*/
-#if 0
-    outb(0x00, 0x1F1);
-    outb(1, 0x1F2);
-    outb(0x00, 0x1F3);
-    outb(0x00, 0x1F4);
-    outb(0x00, 0x1F5);
-    outb(0xE0, 0x1F6);
-    outb(0xEC, 0x1F7);
-    while(!(inb(0x1F7) & 0x08)){}
-    /*
-    while(1)
-    {
-        printk("%02x ", inb(0x1F7));
-    }*/
-    asm("cld;rep;insw;"::"c"(256), "d"(0x1F0), "D"(buf));
-
-    for(i=0; i<512; i++)
-        printk("%02x ", buf[i]);
-#endif
-
-#if 0
-#define SZ    512
-    hd_read(ROOT_DEV, 0, buf, SZ);
-    //hd_read(0, 1, buf+512, 512);
-    //hd_read(0,0,buf, 1023);
-    pPartition p;
-#if 0
-    for(i=0; i<SZ; i++)
-        printk("%02x ", buf[i]);
-    while(1);
-#endif
-#endif
-#if 0
-    for(i=0; i<4; i++)
-    {
-        p = (pPartition)(buf+PARTS_POS)+i;
-        printk(    "State:%02x Head:%d StartSC:%d Type:%02x "
-            "EndHead:%d EndSC:%d AboluteSectNo:%d "
-            "PartitionSize:%d\n",
-        p->State, p->Head, p->StartSC, p->Type,
-        p->EndHead, p->EndSC, p->AbsoluteSectNo, p->PartitionSize);
-    }
-#endif
-
-#if 0
-    int j, k;
-    j = 0x10000;
-    while(j--)
-    {
-        k = 0x10000;
-        while(k--);
-    }
-#endif
 }
 
 void init_file_table()
index 6d6ac65fe22cbf4e7a37d5cae413c6841c533534..2e78ea789a1510ebcd608e7ee134576725e2650d 100644 (file)
@@ -25,7 +25,6 @@ extern void detect_cpu();
 extern void setup_sysc();
 extern void setup_pci();
 extern void set_tss();
-extern void show_logo();
 extern void setup_tasks();
 extern void setup_root_dev();
 extern void ide_init();
@@ -66,7 +65,7 @@ void setup_kernel()
     printk("kernel: %08x - %08x\n", &kernel_begin, &kernel_end);
 
     init_mm();
-    //while(1);
+
     setup_gdt();
     setup_idt();
     setup_gate();
@@ -95,7 +94,6 @@ void setup_kernel()
 
     printk("%s\n", version);
 
-    open_irq(0);
 
     return;
     while(1); // TODO MODIFY CODE BELOW
@@ -104,7 +102,5 @@ void setup_kernel()
     setup_root_dev();
     setup_fs();
     setup_ext2();
-
-    show_logo();
 }
 
index 9aeeae02a4cc33d3a7f150b186a771188fb7a510..84586d4764a8d54aa53948705dba9c30263f99a6 100644 (file)
@@ -132,7 +132,7 @@ void setup_irqs()
             request_irq(i, default_irq_handler,   "default",    "default");
     }
 
-    for(i=1; i<16; i++)
+    for(i=0; i<16; i++)
         open_irq(i);
 
     enable_irq();
index b2e84677dc120eba0c683406bfd0ca200b94f77d..7fc3b72acfa979f4491640cea0eeb9dff8f64f84 100644 (file)
@@ -8,5 +8,5 @@ insmod ext2
 root=(hd0,msdos1)
 
 menuentry 'Kernel' --class os {
-    multiboot /boot/Kernel root=(hd0,0) debug=1
+    multiboot /boot/Kernel root=0
 }