diff --git a/src/arch/riscv64/intr/plic.cpp b/src/arch/riscv64/intr/plic.cpp index f54fff536..27e8877fb 100755 --- a/src/arch/riscv64/intr/plic.cpp +++ b/src/arch/riscv64/intr/plic.cpp @@ -34,6 +34,8 @@ static int32_t external_intr(int, char**) { auto no = PLIC::get_instance().get(); // 根据中断号判断设备 printf("external_intr: 0x%X.\n", no); + PLIC::get_instance().do_externel_interrupt(no); + info("external_intr done: 0x%X.\n", no); return 0; } diff --git a/src/device/device_base.cpp b/src/device/device_base.cpp index 10ca02ca3..35ce680ff 100644 --- a/src/device/device_base.cpp +++ b/src/device/device_base.cpp @@ -34,23 +34,34 @@ device_base_t::~device_base_t(void) { return; } -int device_base_t::read(void) { - auto res = drv->read(buf); +int device_base_t::read(buf_t& _buf) { + buf.sector = _buf.sector; + auto res = drv->read(buf); + // 等待中断完成 while (buf.valid == false) { ; } + + memcpy(_buf.data, buf.data, COMMON::BUFFFER_SIZE); + buf.valid = false; + return res; } -int device_base_t::write(void) { +int device_base_t::write(buf_t& _buf) { auto res = drv->write(buf); + // 等待中断完成 while (buf.valid == false) { ; } + + memcpy(buf.data, _buf.data, COMMON::BUFFFER_SIZE); + buf.valid = false; + return res; } diff --git a/src/device/include/device_base.h b/src/device/include/device_base.h index 67137549c..9c4d46632 100644 --- a/src/device/include/device_base.h +++ b/src/device/include/device_base.h @@ -63,13 +63,15 @@ class device_base_t { /** * @brief 从设备读 + * @param _buf 缓冲区 */ - virtual int read(void); + virtual int read(buf_t& _buf); /** * @brief 向设备写 + * @param _buf 缓冲区 */ - virtual int write(void); + virtual int write(buf_t& _buf); /** * @brief ioctl 控制 diff --git a/src/drv/virtio/virtio_mmio_drv.cpp b/src/drv/virtio/virtio_mmio_drv.cpp index 3c6aedb60..706f8931b 100644 --- a/src/drv/virtio/virtio_mmio_drv.cpp +++ b/src/drv/virtio/virtio_mmio_drv.cpp @@ -277,7 +277,6 @@ int virtio_mmio_drv_t::read(buf_t& _buf) { req->sector = _buf.sector; req->data = _buf.data; auto ret = blk_rw(*req); - _buf.valid = true; return ret; } @@ -288,7 +287,6 @@ int virtio_mmio_drv_t::write(buf_t& _buf) { req->sector = _buf.sector; req->data = _buf.data; auto ret = blk_rw(*req); - _buf.valid = true; return ret; } diff --git a/src/drv/virtio/virtio_mmio_intr.cpp b/src/drv/virtio/virtio_mmio_intr.cpp index 54a800781..59361fb13 100644 --- a/src/drv/virtio/virtio_mmio_intr.cpp +++ b/src/drv/virtio/virtio_mmio_intr.cpp @@ -80,8 +80,6 @@ static void virtio_blk_handle_used(device_base_t* _dev, uint32_t _usedidx) { delete req; - _dev->buf.valid = true; - drv->queue.free_desc(desc1); drv->queue.free_desc(desc2); drv->queue.free_desc(desc3); @@ -106,5 +104,7 @@ void virtio_mmio_intr(uint8_t _no) { drv->queue.virtq->seen_used = drv->queue.virtq->used->idx % len; + dev->buf.valid = true; + return; } diff --git a/src/kernel/dev_drv_manager.cpp b/src/kernel/dev_drv_manager.cpp index 9a8b6acbd..fb00c32e1 100644 --- a/src/kernel/dev_drv_manager.cpp +++ b/src/kernel/dev_drv_manager.cpp @@ -21,11 +21,6 @@ #include "virtio_dev.h" #include "virtio_mmio_drv.h" -void virtio_intr_handler(void) { - warn("virtio irq handler.\n"); - return; -} - void DEV_DRV_MANAGER::show(void) const { info("bus count: 0x%X\n", buss.size()); for (auto i : buss) { diff --git a/src/kernel/kernel_main.cpp b/src/kernel/kernel_main.cpp index 19ba7c019..88971b760 100644 --- a/src/kernel/kernel_main.cpp +++ b/src/kernel/kernel_main.cpp @@ -56,12 +56,13 @@ void kernel_main(void) { TIMER::get_instance().init(); // 初始化设备 DEV_DRV_MANAGER::get_instance().init(); - // 测试设备 - test_device(); // 允许中断 CPU::ENABLE_INTR(); + // 测试设备 + test_device(); + // 显示基本信息 show_info(); // 进入死循环 diff --git a/src/kernel/test.cpp b/src/kernel/test.cpp index ea6e82697..c845d37d5 100644 --- a/src/kernel/test.cpp +++ b/src/kernel/test.cpp @@ -235,12 +235,14 @@ int test_device(void) { device_base_t* dev = (device_base_t*)DEV_DRV_MANAGER::get_instance().get_dev_via_intr_no(1); - dev->buf.sector = 0; - dev->read(); + buf_t buf; + buf.sector = 0; + + dev->read(buf); // fat 第一个扇区的最后两字节 - assert(dev->buf.data[COMMON::BUFFFER_SIZE - 1] == 0xAA); - assert(dev->buf.data[COMMON::BUFFFER_SIZE - 2] == 0x55); + assert(buf.data[COMMON::BUFFFER_SIZE - 1] == 0xAA); + assert(buf.data[COMMON::BUFFFER_SIZE - 2] == 0x55); info("device test done.\n"); return 0;