void ide_driver_thread(void) { static struct Message m; while (TRUE) { receive(ANY, &m); if (m.src == MSG_HARD_INTR) { if (m.type == IDE_WRITEBACK) { int i; for (i = 0; i < NR_SEC_CACHE; i ++) { if (cache[i].dirty == TRUE) { ide_prepare(cache[i].sector); do_write(&cache[i].content); cache[i].dirty = FALSE; } } } else { panic("IDE interrupt is leaking"); } } else if (m.type == DEV_READ) { //printk("IDE driver receive request!\n"); //printk("rr\n"); uint_32 i, data; struct PCB *pcb = fetch_pcb(m.src); //printk("length = %d\n", m.dev_io.length); for (i = 0; i < m.dev_io.length; i ++) { //printk("%d\n", i); data = read_byte(m.dev_io.offset + i); //printk("after data\n"); copy_from_kernel(pcb, m.dev_io.buf + i, &data, 1); } m.type = -1; m.int_msg.p1 = i; //printk("Almost Finished!\n"); send(m.src, &m); //printk("ss\n"); } else if (m.type == DEV_WRITE) { uint_32 i, data; struct PCB *pcb = fetch_pcb(m.src); for (i = 0; i < m.dev_io.length; i ++) { copy_to_kernel(pcb, &data, m.dev_io.buf + i, 1); write_byte(m.dev_io.offset + i, data); } m.type = -1; m.int_msg.p1 = i; send(m.src, &m); } } }
static void ide_driver_thread(void) { static Msg m; while (true) { receive(ANY, &m,1); if (m.src == MSG_HARD_INTR) { if (m.type == IDE_WRITEBACK) { cache_writeback(); } else { panic("IDE interrupt is leaking"); } } else if (m.type == DEV_READ) { uint32_t i; uint8_t data; for (i = 0; i < m.len; i ++) { data = read_byte(m.offset + i); copy_from_kernel(fetch_pcb(m.req_pid), m.buf + i, &data, 1); } m.ret = i; m.dest = m.src; m.src = IDE; send(m.dest, &m,1); } else if (m.type == DEV_WRITE) { uint32_t i; uint8_t data; for (i = 0; i < m.len; i ++) { copy_to_kernel(fetch_pcb(m.req_pid), &data, m.buf + i, 1); write_byte(m.offset + i, data); } m.ret = i; m.dest = m.src; m.src = IDE; send(m.dest, &m,1); } else { assert(0); } } }