aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlec Murphy <alec@checksum.fail>2019-09-24 13:13:40 -0400
committerAlec Murphy <alec@checksum.fail>2019-09-24 13:13:40 -0400
commit527b324d1fc28620d795e387d208996f2ceda405 (patch)
tree8f17b56bb70c48dff044a2d1fac2aa41e55d021f
parent03e697708087ef71dce9b905572614cd9bf86f66 (diff)
Flush cache after write request; Limit max_blk to 2G by default
-rw-r--r--DskVIO.HC35
-rw-r--r--Virtio-blk.HC7
2 files changed, 39 insertions, 3 deletions
diff --git a/DskVIO.HC b/DskVIO.HC
index 4984494..375c3c8 100644
--- a/DskVIO.HC
+++ b/DskVIO.HC
@@ -1,3 +1,28 @@
+U0 VIOFlush()
+{
+ I64 j;
+ I64 vq_idx;
+ CVirtioBlkRequest *brq = CAlloc(sizeof(CVirtioBlkRequest));
+ brq->type = VIRTIO_BLK_T_FLUSH;
+ brq->sector = NULL;
+ vq_idx = virtio_blk.vq->available.index % 128;
+ virtio_blk.vq->buffers[virtio_blk.vq_index%128].address = brq;
+ virtio_blk.vq->buffers[virtio_blk.vq_index%128].length = sizeof(CVirtioBlkRequest);
+ virtio_blk.vq->buffers[virtio_blk.vq_index%128].flags = VRING_DESC_F_NEXT;
+ virtio_blk.vq->buffers[virtio_blk.vq_index%128].next = (virtio_blk.vq_index+1)%128;
+ virtio_blk.vq->buffers[(virtio_blk.vq_index+1)%128].address = &virtio_blk.status;
+ virtio_blk.vq->buffers[(virtio_blk.vq_index+1)%128].length = 1;
+ virtio_blk.vq->buffers[(virtio_blk.vq_index+1)%128].flags = VRING_DESC_F_WRITE;
+ virtio_blk.vq->buffers[(virtio_blk.vq_index+1)%128].next = 0;
+ virtio_blk.vq->available.ring[vq_idx] = virtio_blk.vq_index%128;
+ virtio_blk.vq_index += 2;
+ j = virtio_blk.vq->used.index;
+ virtio_blk.vq->available.index++;
+ OutU16(virtio_blk.port + VIRTIO_PCI_QUEUE_NOTIFY, 0);
+ while (j==virtio_blk.vq->used.index){Yield;}
+ Free(brq);
+}
+
Bool VIORBlks(CDrv *dv, U8 *buf, I64 blk, I64 cnt)
{
I64 i, j;
@@ -65,6 +90,7 @@ Bool VIOWBlks(CDrv *dv, U8 *buf, I64 blk, I64 cnt)
while (j==virtio_blk.vq->used.index){Yield;}
}
Free(brq);
+ VIOFlush;
return TRUE;
}
@@ -76,7 +102,14 @@ U8 MountVirtioBlk()
bd->max_blk = 512;
BlkDevAdd(bd,,TRUE,TRUE);
bd->type = BDT_VIRTIO_BLK;
- bd->max_blk = virtio_blk.blks;
+ if (VIRTIO_BLK_MAX_BLK)
+ {
+ bd->max_blk = VIRTIO_BLK_MAX_BLK;
+ }
+ else
+ {
+ bd->max_blk = virtio_blk.blks;
+ }
Free(bd->RAM_dsk);
dv->size=bd->max_blk+1-bd->drv_offset;
VIORBlks(dv,bs,0,1);
diff --git a/Virtio-blk.HC b/Virtio-blk.HC
index 78cccc5..1f6ee4f 100644
--- a/Virtio-blk.HC
+++ b/Virtio-blk.HC
@@ -1,5 +1,8 @@
-#define VIRTIO_BLK_T_IN 0
-#define VIRTIO_BLK_T_OUT 1
+#define VIRTIO_BLK_T_IN 0
+#define VIRTIO_BLK_T_OUT 1
+#define VIRTIO_BLK_T_FLUSH 4
+
+#define VIRTIO_BLK_MAX_BLK 0x400000 // Limit blkdev to 2G max, set to NULL to use entire disk (not recommended for RedSea)
class CVirtioBlk
{