2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Zheng Cui <cuizheng@cs.unm.edu>
11 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
12 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
13 * All rights reserved.
15 * Author: Zheng Cui <cuizheng@cs.unm.edu>
17 * This is free software. You are permitted to use,
18 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
23 #include <devices/cdrom.h>
24 #include <devices/ide.h>
25 #include <palacios/vmm.h>
29 #define PrintDebug(fmt, args...)
35 uchar_t * image_addr; //memory address
36 ulong_t capacity_in_bytes;
37 ulong_t head; //current position
39 struct vm_device * ide_dev;
48 * Load CD-ROM. Returns false if CD is not ready.
51 static rd_bool cdrom_insert(void * private_data) {
52 PrintDebug("[cdrom_insert]\n");
57 * Logically eject the CD.
59 static void cdrom_eject(void * private_data) {
60 PrintDebug("[cdrom_eject]\n");
65 * Read CD TOC. Returns false if start track is out of bounds.
67 static rd_bool cdrom_read_toc(void * private_data, uint8_t* buf, int* length, rd_bool msf, int start_track)
70 PrintDebug("[cdrom_read_toc]\n");
75 * Return CD-ROM capacity (in 2048 byte frames)
77 static uint32_t cdrom_capacity(void * private_data) {
78 struct cdrom_state * cdrom = (struct cdrom_state *)private_data;
80 PrintDebug("[cdrom_capacity] s_ramdiskSize = %lu\n", cdrom->capacity_in_bytes);
83 if (cdrom->capacity_in_bytes % 2048) {
84 PrintDebug("\t\t capacity in LBA is %lu\n", (cdrom->capacity_in_bytes / 2048) + 1);
85 return (cdrom->capacity_in_bytes / 2048) + 1;
87 PrintDebug("\t\t capacity in LBA is %lu\n", cdrom->capacity_in_bytes / 2048);
88 return cdrom->capacity_in_bytes / 2048;
91 PrintError("Unsupported CDROM mode in capacity query\n");
98 * Read a single block from the CD
100 static void cdrom_read_block(void * private_data, uint8_t * buf, int lba)/* __attribute__(regparm(2)); */ {
101 struct cdrom_state * cdrom = (struct cdrom_state *)private_data;
105 PrintDebug("[cdrom_read_block] lba = %d (cdrom_image_start=%p)\n", lba, (void*)cdrom->image_addr);
106 memcpy(buf, (uchar_t *)(cdrom->image_addr + lba * 2048), 2048);
107 //PrintDebug("Returning from read block\n");
111 static void set_LBA(void * private_data, uchar_t lba) {
112 struct cdrom_state * cdrom = (struct cdrom_state *)private_data;
118 * Start (spin up) the CD.
120 static int cdrom_start(void * private_data) {
121 PrintDebug("[cdrom_start]\n");
126 static struct cdrom_ops cd_ops = {
127 .insert_cdrom = cdrom_insert,
128 .eject_cdrom = cdrom_eject,
129 .read_toc = cdrom_read_toc,
130 .capacity = cdrom_capacity,
131 .read_block = cdrom_read_block,
132 .start_cdrom = cdrom_start,
139 static int cdrom_device_init(struct vm_device * dev) {
140 struct cdrom_state * cdrom = (struct cdrom_state *)dev->private_data;
141 PrintDebug("[cdrom_init]\n");
142 PrintDebug("CDIMAGE located at: %p\n", (void *)cdrom->image_addr);
147 v3_ramdisk_register_cdrom(cdrom->ide_dev, 1, 0, &cd_ops, cdrom);
153 static int cdrom_device_deinit(struct vm_device * dev) {
157 static struct vm_device_ops dev_ops = {
158 .init = cdrom_device_init,
159 .deinit = cdrom_device_deinit,
165 struct vm_device * v3_create_cdrom(struct vm_device * ramdisk_dev, void * ramdisk, uint_t ramdisk_size){
166 struct cdrom_state * cd = (struct cdrom_state *)V3_Malloc(sizeof(struct cdrom_state));
167 V3_ASSERT(cd != NULL);
169 memset(cd, 0, sizeof(struct cdrom_state));
171 cd->image_addr = (uchar_t *)V3_VAddr(ramdisk);
172 cd->capacity_in_bytes = ramdisk_size;
173 cd->ide_dev = ramdisk_dev;
175 PrintDebug("Creating RamDISK CDROM\n");
177 struct vm_device * cd_dev = v3_create_device("Ram Based CD", &dev_ops, cd);