1 /* (c) 2008, Zheng Cui <cuizheng@cs.unm.edu> */
2 /* (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> */
3 /* (c) 2008, The V3VEE Project <http://www.v3vee.org> */
5 #include <devices/cdrom.h>
6 #include <palacios/vmm.h>
9 #define Ramdisk_Print_CD(_f, _a...) PrintTrace("cdrom.c(%d) "_f, __LINE__, ## _a)
11 #define Ramdisk_Print_CD(_f, _a...)
15 extern ulong_t g_ramdiskImage;
16 extern ulong_t s_ramdiskSize;
19 void cdrom_init(struct cdrom_interface * cdrom)
22 Ramdisk_Print_CD("[cdrom_init]\n");
23 V3_ASSERT(g_ramdiskImage);
24 cdrom->fd = g_ramdiskImage;
25 PrintDebug("CDIMAGE located at: %x\n", cdrom->fd);
26 cdrom->capacity_B = s_ramdiskSize;
33 * Load CD-ROM. Returns false if CD is not ready.
37 rd_bool cdrom_insert(struct cdrom_interface * cdrom, char *dev /*= NULL*/)
39 Ramdisk_Print_CD("[cdrom_insert]\n");
44 * Logically eject the CD.
47 void cdrom_eject(struct cdrom_interface *cdrom)
49 Ramdisk_Print_CD("[cdrom_eject]\n");
54 * Read CD TOC. Returns false if start track is out of bounds.
57 rd_bool cdrom_read_toc(struct cdrom_interface *cdrom, uint8_t* buf, int* length, rd_bool msf, int start_track)
59 Ramdisk_Print_CD("[cdrom_read_toc]\n");
64 * Return CD-ROM capacity (in 2048 byte frames)
67 uint32_t cdrom_capacity(struct cdrom_interface *cdrom)
69 Ramdisk_Print_CD("[cdrom_capacity] s_ramdiskSize = %d\n", cdrom->capacity_B);
71 if (cdrom->capacity_B % 2048) {
72 Ramdisk_Print_CD("\t\t capacity in LBA is %d\n", cdrom->capacity_B/2048 + 1);
73 return cdrom->capacity_B/2048 + 1;
75 Ramdisk_Print_CD("\t\t capacity in LBA is %d\n", cdrom->capacity_B/2048);
76 return cdrom->capacity_B/2048;
85 * Read a single block from the CD
88 void cdrom_read_block(struct cdrom_interface *cdrom, uint8_t* buf, int lba)// __attribute__(regparm(2));
93 Ramdisk_Print_CD("[cdrom_read_block] lba = %d (cdrom_image_start=%x)\n", lba, cdrom->fd);
94 memcpy(buf, (uint8_t *)(cdrom->fd + lba * 2048), 2048);
95 PrintDebug("Returning from read block\n");
100 * Start (spin up) the CD.
103 int cdrom_start(struct cdrom_interface *cdrom)
105 Ramdisk_Print_CD("[cdrom_start]\n");
110 void init_cdrom(struct cdrom_interface *cdrom)
112 V3_ASSERT(cdrom != NULL);
114 cdrom->ops.init = &cdrom_init;
115 cdrom->ops.insert_cdrom = &cdrom_insert;
116 cdrom->ops.eject_cdrom = &cdrom_eject;
117 cdrom->ops.read_toc = &cdrom_read_toc;
118 cdrom->ops.capacity = &cdrom_capacity;
119 cdrom->ops.read_block = &cdrom_read_block;
120 cdrom->ops.start_cdrom = &cdrom_start;