Skip to content
Snippets Groups Projects
Commit 11b9e3e5 authored by Dor Laor's avatar Dor Laor
Browse files

Implement a basic virtio make request function and add

a tests that uses it and adds plenty of block requests to the host.
parent e6fddd63
No related branches found
No related tags found
No related merge requests found
......@@ -40,17 +40,38 @@ namespace virtio {
return true;
}
void virtio_blk::make_virtio_req(sglist* sg, u64 sector)
{
virtio_blk_outhdr* hdr = reinterpret_cast<virtio_blk_outhdr*>(malloc(sizeof(virtio_blk_outhdr)));
hdr->type = VIRTIO_BLK_T_OUT;
hdr->ioprio = 0;
hdr->sector = sector;
sg->add(mmu::virt_to_phys(hdr), sizeof(struct virtio_blk_outhdr), true);
virtio_blk_res* res = reinterpret_cast<virtio_blk_res*>(malloc(sizeof(virtio_blk_res)));
res->status = 0;
sg->add(mmu::virt_to_phys(res), sizeof (struct virtio_blk_res));
}
void virtio_blk::test() {
int i;
sglist* sg = new sglist();
for (i=0;i<10;i++) {
debug("test virtio blk");
for (i=0;i<200;i++) {
sglist* sg = new sglist();
void* buf = malloc(page_size);
memset(buf, 0, page_size);
sg->add(mmu::virt_to_phys(buf), page_size);
make_virtio_req(sg, i*8*512);
if (!_queues[0]->add_buf(sg,2,1,sg)) {
debug(fmt("virtio blk test - added too many %i, expected") % i);
break;
}
}
debug("test virtio blk");
_queues[0]->add_buf(sg,0,i,nullptr);
_queues[0]->kick();
_queues[0]->kick();
debug("test end");
}
......
......@@ -129,6 +129,10 @@ namespace virtio {
u32 residual;
};
struct virtio_blk_res {
u8 status;
};
virtio_blk();
virtual ~virtio_blk();
......@@ -136,6 +140,8 @@ namespace virtio {
virtual u32 get_driver_features(void) { return ((1 << VIRTIO_BLK_F_SIZE_MAX)); }
void make_virtio_req(sglist* sg, u64 sector);
void test();
private:
......
......@@ -274,11 +274,13 @@ void* do_main_thread(void *_args)
Driver *vnet = new virtio::virtio_net();
DriverFactory::Instance()->RegisterDriver(vnet);
Driver *vblk = new virtio::virtio_blk();
virtio::virtio_blk *vblk = new virtio::virtio_blk();
DriverFactory::Instance()->RegisterDriver(vblk);
DeviceFactory::Instance()->InitializeDrivers();
vblk->test();
DriverFactory::Instance()->Destroy();
auto t1 = clock::get()->time();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment