disk 3 kernel/buf.h int disk; // does disk "own" buf? disk 59 kernel/virtio_disk.c } disk; disk 66 kernel/virtio_disk.c initlock(&disk.vdisk_lock, "virtio_disk"); disk 121 kernel/virtio_disk.c disk.desc = kalloc(); disk 122 kernel/virtio_disk.c disk.avail = kalloc(); disk 123 kernel/virtio_disk.c disk.used = kalloc(); disk 124 kernel/virtio_disk.c if(!disk.desc || !disk.avail || !disk.used) disk 126 kernel/virtio_disk.c memset(disk.desc, 0, PGSIZE); disk 127 kernel/virtio_disk.c memset(disk.avail, 0, PGSIZE); disk 128 kernel/virtio_disk.c memset(disk.used, 0, PGSIZE); disk 134 kernel/virtio_disk.c *R(VIRTIO_MMIO_QUEUE_DESC_LOW) = (uint64)disk.desc; disk 135 kernel/virtio_disk.c *R(VIRTIO_MMIO_QUEUE_DESC_HIGH) = (uint64)disk.desc >> 32; disk 136 kernel/virtio_disk.c *R(VIRTIO_MMIO_DRIVER_DESC_LOW) = (uint64)disk.avail; disk 137 kernel/virtio_disk.c *R(VIRTIO_MMIO_DRIVER_DESC_HIGH) = (uint64)disk.avail >> 32; disk 138 kernel/virtio_disk.c *R(VIRTIO_MMIO_DEVICE_DESC_LOW) = (uint64)disk.used; disk 139 kernel/virtio_disk.c *R(VIRTIO_MMIO_DEVICE_DESC_HIGH) = (uint64)disk.used >> 32; disk 146 kernel/virtio_disk.c disk.free[i] = 1; disk 160 kernel/virtio_disk.c if(disk.free[i]){ disk 161 kernel/virtio_disk.c disk.free[i] = 0; disk 174 kernel/virtio_disk.c if(disk.free[i]) disk 176 kernel/virtio_disk.c disk.desc[i].addr = 0; disk 177 kernel/virtio_disk.c disk.desc[i].len = 0; disk 178 kernel/virtio_disk.c disk.desc[i].flags = 0; disk 179 kernel/virtio_disk.c disk.desc[i].next = 0; disk 180 kernel/virtio_disk.c disk.free[i] = 1; disk 181 kernel/virtio_disk.c wakeup(&disk.free[0]); disk 189 kernel/virtio_disk.c int flag = disk.desc[i].flags; disk 190 kernel/virtio_disk.c int nxt = disk.desc[i].next; disk 220 kernel/virtio_disk.c acquire(&disk.vdisk_lock); disk 232 kernel/virtio_disk.c sleep(&disk.free[0], &disk.vdisk_lock); disk 238 kernel/virtio_disk.c struct virtio_blk_req *buf0 = &disk.ops[idx[0]]; disk 247 kernel/virtio_disk.c disk.desc[idx[0]].addr = (uint64) buf0; disk 248 kernel/virtio_disk.c disk.desc[idx[0]].len = sizeof(struct virtio_blk_req); disk 249 kernel/virtio_disk.c disk.desc[idx[0]].flags = VRING_DESC_F_NEXT; disk 250 kernel/virtio_disk.c disk.desc[idx[0]].next = idx[1]; disk 252 kernel/virtio_disk.c disk.desc[idx[1]].addr = (uint64) b->data; disk 253 kernel/virtio_disk.c disk.desc[idx[1]].len = BSIZE; disk 255 kernel/virtio_disk.c disk.desc[idx[1]].flags = 0; // device reads b->data disk 257 kernel/virtio_disk.c disk.desc[idx[1]].flags = VRING_DESC_F_WRITE; // device writes b->data disk 258 kernel/virtio_disk.c disk.desc[idx[1]].flags |= VRING_DESC_F_NEXT; disk 259 kernel/virtio_disk.c disk.desc[idx[1]].next = idx[2]; disk 261 kernel/virtio_disk.c disk.info[idx[0]].status = 0xff; // device writes 0 on success disk 262 kernel/virtio_disk.c disk.desc[idx[2]].addr = (uint64) &disk.info[idx[0]].status; disk 263 kernel/virtio_disk.c disk.desc[idx[2]].len = 1; disk 264 kernel/virtio_disk.c disk.desc[idx[2]].flags = VRING_DESC_F_WRITE; // device writes the status disk 265 kernel/virtio_disk.c disk.desc[idx[2]].next = 0; disk 268 kernel/virtio_disk.c b->disk = 1; disk 269 kernel/virtio_disk.c disk.info[idx[0]].b = b; disk 272 kernel/virtio_disk.c disk.avail->ring[disk.avail->idx % NUM] = idx[0]; disk 277 kernel/virtio_disk.c disk.avail->idx += 1; // not % NUM ... disk 284 kernel/virtio_disk.c while(b->disk == 1) { disk 285 kernel/virtio_disk.c sleep(b, &disk.vdisk_lock); disk 288 kernel/virtio_disk.c disk.info[idx[0]].b = 0; disk 291 kernel/virtio_disk.c release(&disk.vdisk_lock); disk 297 kernel/virtio_disk.c acquire(&disk.vdisk_lock); disk 312 kernel/virtio_disk.c while(disk.used_idx != disk.used->idx){ disk 314 kernel/virtio_disk.c int id = disk.used->ring[disk.used_idx % NUM].id; disk 316 kernel/virtio_disk.c if(disk.info[id].status != 0) disk 319 kernel/virtio_disk.c struct buf *b = disk.info[id].b; disk 320 kernel/virtio_disk.c b->disk = 0; // disk is done with buf disk 323 kernel/virtio_disk.c disk.used_idx += 1; disk 326 kernel/virtio_disk.c release(&disk.vdisk_lock);