]> Zhao Yanbai Git Server - kernel.git/commitdiff
在硬盘中断处理中添加停止DMA的逻辑;添加硬盘中断的后半部处理逻辑只打印信息
authoracevest <zhaoyanbai@126.com>
Tue, 24 Sep 2024 14:40:17 +0000 (22:40 +0800)
committeracevest <zhaoyanbai@126.com>
Tue, 24 Sep 2024 14:40:17 +0000 (22:40 +0800)
drivers/ide.c
kernel/task_disk.c

index c9d9193f4dea13267ede3e16fa039238e6d2e0dd..902a97131e860941c32e3f70dacaa0a0174b5164 100644 (file)
@@ -110,47 +110,31 @@ void ata_dma_stop(int channel);
 void ide_irq_bh_handler(void *arg) {
     int channel = (int)arg;
 
-    // printk("channel %08x\n", channel);
     assert(channel <= 1);
     assert(channel >= 0);
 
     ide_pci_controller_t *ide_ctrl = ide_pci_controller + channel;
-    // printlxy(MPL_IDE, MPO_IDE, "disk irq %u req %u consumed %u ", disk_inter_cnt, disk_request_cnt,
-    // disk_handled_cnt);
 
-    printlxy(MPL_IDE0 + channel, MPO_IDE, "IDE%d req %u irq %u consumed %u", channel,
-             atomic_read(&(ide_ctrl->request_cnt)), ide_ctrl->irq_cnt, ide_ctrl->consumed_cnt);
+    int r = atomic_read(&(ide_ctrl->request_cnt));
+    int i = atomic_read(&(ide_ctrl->irq_cnt));
+    int c = atomic_read(&(ide_ctrl->consumed_cnt));
 
-    // 之前这里是用up()来唤醒磁盘任务
-    // 但在中断的底半处理,不应该切换任务,因为会引起irq里的reenter问题,导致不能再进底半处理,也无法切换任务
-    // 所以就移除了up()里的 schedule()
-    // 后来就改用完成量来通知磁盘任务,就不存在这个问题了
-
-    // complete会唤醒进程,但不会立即重新调度进程
-    complete(&ide_ctrl->intr_complete);
+    printlxy(MPL_IDE0 + channel, MPO_IDE, "IDE%d req %u irq %u consumed %u", channel, r, i, c);
 }
 
 void ide_irq_handler(unsigned int irq, pt_regs_t *regs, void *devid) {
     // printk("ide irq %d handler pci status: 0x%02x\n", irq, ata_pci_bus_status());
     int channel = irq == ide_pci_controller[0].irq_line ? 0 : 1;
 
-#if 0
-    // printk("ide[%d] irq %d handler\n", channel, irq);
-
+    const int drvid = (channel << 1);  // 虚拟一个
     ide_pci_controller_t *ide_ctrl = ide_pci_controller + channel;
+    ide_ctrl->status = inb(REG_STATUS(drvid));
+    ide_ctrl->pci_status = inb(ide_ctrl->bus_status);
 
     atomic_inc(&ide_ctrl->irq_cnt);
 
     ata_dma_stop(channel);
 
-    add_irq_bh_handler(ide_irq_bh_handler, (void *)channel);
-#endif
-
-    const int drvid = (channel << 1);  // 虚拟一个
-    ide_pci_controller_t *ide_ctrl = ide_pci_controller + channel;
-    ide_ctrl->status = inb(REG_STATUS(drvid));
-    ide_ctrl->pci_status = inb(ide_ctrl->bus_status);
-
     // 之前这里是用up()来唤醒磁盘任务
     // 但在中断的底半处理,不应该切换任务,因为会引起irq里的reenter问题,导致不能再进底半处理,也无法切换任务
     // 所以就移除了up()里的 schedule()
@@ -158,6 +142,9 @@ void ide_irq_handler(unsigned int irq, pt_regs_t *regs, void *devid) {
 
     // complete会唤醒进程,但不会立即重新调度进程
     complete(&ide_ctrl->intr_complete);
+
+    // 纯debug打印
+    add_irq_bh_handler(ide_irq_bh_handler, (void *)channel);
 }
 
 unsigned int IDE_CHL0_CMD_BASE = 0x1F0;
index 60d1ca30a0ebd075bd9e1e7e0670ef3d99dae989..e1f15d199a89efd675b92150d7f28d62f9b56985 100644 (file)
@@ -69,11 +69,13 @@ void disk_task_entry(void *arg) {
         int channel = (int)arg;
         ide_pci_controller_t *ide_ctrl = ide_pci_controller + channel;
 
+#if 0
         // 为了在DEBUG时看到RUN
         int cnt = 2;
         for (int i = 0; i < cnt; i++) {
             asm("hlt;");
         }
+#endif
 
         // printk("wait request for hard disk channel %d\n", channel);
         down(&ide_ctrl->request_queue.sem);