ports/emulators/qemu/files/patch-vl.c-ppbus
Juergen Lock 3c8cb897ad Update to 2007-02-03 snapshot:
- Fix `could not open hard disk image '/dev/ad0'' (e.g.) when open(2)
fails with EPERM instead of EACCES for ro devices.
- PIIX4 support, by Aurelien Jarno.
- Gallileo GT64xxx support, by Aurelien Jarno.
- MIPS Malta system and devices support, by Aurelien Jarno and Stefan Weil.
- ARM ELF loader.
- Improved console handling, thanks Stefan Weil.
- Disable Malta floppy controller for now, by Aurelien Jarno.
- Big endian support for Gallileo, by Aurelien Jarno.
- Add more ATAPI CDROM DMA support, by Juergen Keil.
- Add ARM Angel semihosting to system emulation.
- Don't resume guest when gdb connection terminates and -S specified.
- mips: Implementing dmfc/dmtc.
- Fix DMA timeouts on FreeBSD, by Carlo Marcelo Arenas Belon.
- New multiple snapshot support for VMDK, by Igor Lvovsky.
- Add support for 82371FB (Step A1) and Improved support for 82371SB
(Function 1), by Carlo Marcelo Arenas Belon.
- Accept -help.
- Accept --foo as an alias for -foo.
- Add nodelay option for TCP character devices.
- Use standard character device interface for gdbstub.
- GDB hosted syscalls.
- Upgrade the apic version_id, by Don Laor.
- Save some vm space for the regular program loading zone, by
Pierre d'Herbemont
- script=no for the TUN/TAP net option, by Jean-Christian de Rivaz
- Sparc arm/mips/sparc register patch, by Martin Bochnig.
- PIIX4 SMBus host, EEPROM device emulation, by Ed Swierk.
- sem* and msg* for qemu, by Kirill Shutemov.
- And some more bugfixes.

Approved by:	miwi (mentor, implicit)
2007-02-03 22:15:28 +00:00

91 lines
2.2 KiB
Text

--- vl.c.orig Mon Aug 21 23:06:11 2006
+++ vl.c Mon Aug 21 23:04:49 2006
@@ -48,6 +48,8 @@
#endif
#ifdef __FreeBSD__
#include <sys/module.h>
+#include <dev/ppbus/ppi.h>
+#include <dev/ppbus/ppbconf.h>
#endif
#else
#ifndef __sun__
@@ -1728,7 +1730,64 @@
chr->chr_ioctl = pp_ioctl;
return chr;
}
-#endif /* defined(__linux__) */
+#elif defined(__FreeBSD__)
+static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
+{
+ int fd = (int)chr->opaque;
+ uint8_t b;
+
+ switch(cmd) {
+ case CHR_IOCTL_PP_READ_DATA:
+ if (ioctl(fd, PPIGDATA, &b) < 0)
+ return -ENOTSUP;
+ *(uint8_t *)arg = b;
+ break;
+ case CHR_IOCTL_PP_WRITE_DATA:
+ b = *(uint8_t *)arg;
+ if (ioctl(fd, PPISDATA, &b) < 0)
+ return -ENOTSUP;
+ break;
+ case CHR_IOCTL_PP_READ_CONTROL:
+ if (ioctl(fd, PPIGCTRL, &b) < 0)
+ return -ENOTSUP;
+ *(uint8_t *)arg = b;
+ break;
+ case CHR_IOCTL_PP_WRITE_CONTROL:
+ b = *(uint8_t *)arg;
+ if (ioctl(fd, PPISCTRL, &b) < 0)
+ return -ENOTSUP;
+ break;
+ case CHR_IOCTL_PP_READ_STATUS:
+ if (ioctl(fd, PPIGSTATUS, &b) < 0)
+ return -ENOTSUP;
+ *(uint8_t *)arg = b;
+ break;
+ default:
+ return -ENOTSUP;
+ }
+ return 0;
+}
+
+CharDriverState *qemu_chr_open_pp(const char *filename)
+{
+ CharDriverState *chr;
+ int fd;
+
+ fd = open(filename, O_RDWR);
+ if (fd < 0)
+ return NULL;
+
+ chr = qemu_mallocz(sizeof(CharDriverState));
+ if (!chr) {
+ close(fd);
+ return NULL;
+ }
+ chr->opaque = (void *)fd;
+ chr->chr_write = null_chr_write;
+ chr->chr_ioctl = pp_ioctl;
+ return chr;
+}
+#endif
#else
CharDriverState *qemu_chr_open_pty(void)
@@ -2562,6 +2622,13 @@
#endif
#if defined(__linux__)
if (strstart(filename, "/dev/parport", NULL)) {
+ return qemu_chr_open_pp(filename);
+ } else
+ if (strstart(filename, "/dev/", NULL)) {
+ return qemu_chr_open_tty(filename);
+ } else
+#elif defined(__FreeBSD__)
+ if (strstart(filename, "/dev/ppi", NULL)) {
return qemu_chr_open_pp(filename);
} else
if (strstart(filename, "/dev/", NULL)) {