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".
21 #include <devices/cdrom.h>
22 #include <devices/ide.h>
23 #include <palacios/vmm.h>
27 #define PrintDebug(fmt, args...)
33 uchar_t * image_addr; //memory address
34 ulong_t capacity_in_bytes;
35 ulong_t head; //current position
37 struct vm_device * ide_dev;
46 * Load CD-ROM. Returns false if CD is not ready.
49 static rd_bool cdrom_insert(void * private_data) {
50 PrintDebug("[cdrom_insert]\n");
55 * Logically eject the CD.
57 static void cdrom_eject(void * private_data) {
58 PrintDebug("[cdrom_eject]\n");
63 * Read CD TOC. Returns false if start track is out of bounds.
65 static rd_bool cdrom_read_toc(void * private_data, uint8_t* buf, int* length, rd_bool msf, int start_track)
67 PrintDebug("[cdrom_read_toc]\n");
72 * Return CD-ROM capacity (in 2048 byte frames)
74 static uint32_t cdrom_capacity(void * private_data) {
75 struct cdrom_state * cdrom = (struct cdrom_state *)private_data;
77 PrintDebug("[cdrom_capacity] s_ramdiskSize = %d\n", cdrom->capacity_in_bytes);
80 if (cdrom->capacity_in_bytes % 2048) {
81 PrintDebug("\t\t capacity in LBA is %d\n", (cdrom->capacity_in_bytes / 2048) + 1);
82 return (cdrom->capacity_in_bytes / 2048) + 1;
84 PrintDebug("\t\t capacity in LBA is %d\n", cdrom->capacity_in_bytes / 2048);
85 return cdrom->capacity_in_bytes / 2048;
88 PrintError("Unsupported CDROM mode in capacity query\n");
95 * Read a single block from the CD
97 static void cdrom_read_block(void * private_data, uint8_t * buf, int lba)/* __attribute__(regparm(2)); */ {
98 struct cdrom_state * cdrom = (struct cdrom_state *)private_data;
102 PrintDebug("[cdrom_read_block] lba = %d (cdrom_image_start=%x)\n", lba, cdrom->image_addr);
103 memcpy(buf, (uchar_t *)(cdrom->image_addr + lba * 2048), 2048);
104 PrintDebug("Returning from read block\n");
108 static void set_LBA(void * private_data, uchar_t lba) {
109 struct cdrom_state * cdrom = (struct cdrom_state *)private_data;
115 * Start (spin up) the CD.
117 static int cdrom_start(void * private_data) {
118 PrintDebug("[cdrom_start]\n");
123 static struct cdrom_ops cd_ops = {
124 .insert_cdrom = cdrom_insert,
125 .eject_cdrom = cdrom_eject,
126 .read_toc = cdrom_read_toc,
127 .capacity = cdrom_capacity,
128 .read_block = cdrom_read_block,
129 .start_cdrom = cdrom_start,
136 static int cdrom_device_init(struct vm_device * dev) {
137 struct cdrom_state * cdrom = (struct cdrom_state *)dev->private_data;
138 PrintDebug("[cdrom_init]\n");
139 PrintDebug("CDIMAGE located at: %x\n", cdrom->image_addr);
144 v3_ramdisk_register_cdrom(cdrom->ide_dev, 1, 0, &cd_ops, cdrom);
150 static int cdrom_device_deinit(struct vm_device * dev) {
154 static struct vm_device_ops dev_ops = {
155 .init = cdrom_device_init,
156 .deinit = cdrom_device_deinit,
162 struct vm_device * v3_create_cdrom(struct vm_device * ramdisk_dev, void * ramdisk, uint_t ramdisk_size){
163 struct cdrom_state * cd = (struct cdrom_state *)V3_Malloc(sizeof(struct cdrom_state));
164 V3_ASSERT(cd != NULL);
166 memset(cd, 0, sizeof(struct cdrom_state));
168 cd->image_addr = (uchar_t *)ramdisk;
169 cd->capacity_in_bytes = ramdisk_size;
170 cd->ide_dev = ramdisk_dev;
172 PrintDebug("Creating RamDISK CDROM\n");
174 struct vm_device * cd_dev = create_device("Ram Based CD", &dev_ops, cd);