Пример #1
0
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);
		}
	}
}
Пример #2
0
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);
		}
	}
}