Date: Tue, 16 Nov 2004 18:46:34 +0100 From: Juergen Lock <qemu-l@jelal.kn-bremen.de> To: qemu-devel@nongnu.org Cc: freebsd-hackers@FreeBSD.org Subject: Re: [Qemu-devel] qemu -boot d -cdrom /dev/cd0 on FreeBSD is not good Message-ID: <20041116184633.A84696@saturn.kn-bremen.de> In-Reply-To: <200411151748.iAFHmYQ1019323@sakura.ninth-nine.com> References: <200411151748.iAFHmYQ1019323@sakura.ninth-nine.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Nov 16, 2004 at 02:48:34AM +0900, Norikatsu Shigemura wrote: > I tried to install Windows XP SP2 on qemu over FreeBSD 6-current > like following command, but failed. > > # qemu -boot d -cdrom /dev/cd0 windows.img > Yeah physical cdroms don't work currently as mentioned in the pkg-message... > Because find_image_format on qemu/block.c is failed. This > problem can be confirmed like following program. > - - - - - - - - - - - - - - - - - - - - - - - - > #include <fcntl.h> > #include <unistd.h> > #include <stdio.h> > int main(void) > { > char buf[2048]; > int fd = open("/dev/cd0", O_RDONLY); > if( read(fd, buf, sizeof(buf)) < 0 ) { /* no problem */ > perror("[1] read error."); > } > if( read(fd, buf, sizeof(buf) / 2) < 0 ) { /* problem */ > perror("[2] read error."); > } > } > - - - - - - - - - - - - - - - - - - - - - - - - > > Adhoc-ly, I changed "buf" size to 2048. and confirmed this > problem was fixed. > - - - - - - - - - - - - - - - - - - - - - - - - > static BlockDriver *find_image_format(const char *filename) > { > int fd, ret, score, score_max; > BlockDriver *drv1, *drv; > uint8_t buf[1024]; => buf[2048] > (snip) > ret = read(fd, buf, sizeof(buf)); > if (ret < 0) { > close(fd); > return NULL; > } > (snip) > - - - - - - - - - - - - - - - - - - - - - - - - > Obtained from: qemu-0.6.1 > That's all there is to it? Heh. Antony made it sound like it needs much more! :) > I think magic number 2048 is sector size, but I don't know > how to get valid read size. Anyone, do you have any idea? > On 5.x and later you can use the DIOCGSECTORSIZE ioctl. Here's the relevant part of the patch I'll use in the next port update: Index: qemu/block.c @@ -103,14 +103,25 @@ { int fd, ret, score, score_max; BlockDriver *drv1, *drv; - uint8_t buf[1024]; + uint8_t *buf; + size_t bufsize = 1024; + u_int sectorsize = 512; fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE); if (fd < 0) return NULL; - ret = read(fd, buf, sizeof(buf)); +#ifdef DIOCGSECTORSIZE + if (!ioctl(fd, DIOCGSECTORSIZE, §orsize) && + sectorsize > bufsize) + bufsize = sectorsize; +#endif + buf = malloc(bufsize); + if (!buf) + return NULL; + ret = read(fd, buf, bufsize); if (ret < 0) { close(fd); + free(buf); return NULL; } close(fd); @@ -124,6 +135,7 @@ drv = drv1; } } + free(buf); return drv; } Cheers, Juergen
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041116184633.A84696>