#include <palacios/vmm.h>
#include <palacios/vmm_dev_mgr.h>
+#include <devices/lnx_virtio_blk.h>
-
-
+#define SWAP_CAPACITY (150 * 1024 * 1024)
struct swap_state {
struct vm_device * blk_dev;
+ uint64_t capacity;
+ uint8_t * swap_space;
+ addr_t swap_base_addr;
+
};
+static uint64_t swap_get_capacity(void * private_data) {
+ struct vm_device * dev = (struct vm_device *)private_data;
+ struct swap_state * swap = (struct swap_state *)(dev->private_data);
+
+ PrintDebug("SymSwap: Getting Capacity %d\n", (uint32_t)(swap->capacity));
+
+ return swap->capacity / HD_SECTOR_SIZE;
+}
+
+static int swap_read(uint8_t * buf, int sector_count, uint64_t lba, void * private_data) {
+ struct vm_device * dev = (struct vm_device *)private_data;
+ struct swap_state * swap = (struct swap_state *)(dev->private_data);
+ int offset = lba * HD_SECTOR_SIZE;
+ int length = sector_count * HD_SECTOR_SIZE;
+
+ PrintDebug("SymSwap: Reading %d bytes to %p from %p\n", length,
+ buf, (void *)(swap->swap_space + offset));
+
+ memcpy(buf, swap->swap_space + offset, length);
+
+ return 0;
+}
+
+static int swap_write(uint8_t * buf, int sector_count, uint64_t lba, void * private_data) {
+ struct vm_device * dev = (struct vm_device *)private_data;
+ struct swap_state * swap = (struct swap_state *)(dev->private_data);
+ int offset = lba * HD_SECTOR_SIZE;
+ int length = sector_count * HD_SECTOR_SIZE;
+
+ PrintDebug("SymSwap: Writing %d bytes to %p from %p\n", length,
+ (void *)(swap->swap_space + offset), buf);
+
+ memcpy(swap->swap_space + offset, buf, length);
+
+ return 0;
+}
+
static int swap_free(struct vm_device * dev) {
return -1;
}
+static struct v3_hd_ops hd_ops = {
+ .read = swap_read,
+ .write = swap_write,
+ .get_capacity = swap_get_capacity,
+};
+
+
static struct v3_device_ops dev_ops = {
.free = swap_free,
swap = (struct swap_state *)V3_Malloc(sizeof(struct swap_state));
swap->blk_dev = virtio_blk;
+ swap->capacity = SWAP_CAPACITY;
+
+ swap->swap_base_addr = (addr_t)V3_AllocPages(swap->capacity / 4096);
+ swap->swap_space = (uint8_t *)V3_VAddr((void *)(swap->swap_base_addr));
+ memset(swap->swap_space, 0, SWAP_CAPACITY);
+
struct vm_device * dev = v3_allocate_device("SYM_SWAP", &dev_ops, swap);
return -1;
}
+
+ v3_virtio_register_harddisk(virtio_blk, &hd_ops, dev);
+
return 0;
}