*** vl.c Fri Feb 16 13:27:06 2007
--- /home/reddawg/qemu/work/qemu-0.9.0/vl.c Fri Feb 16 13:30:09 2007
***************
*** 1,9 ****
--- 1,10 ----
/*
* QEMU System Emulator
*
* Copyright (c) 2003-2007 Fabrice Bellard
+ * Copyright (C) 2007 Christopher Olsen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
***************
*** 45,54 ****
--- 46,60 ----
#ifdef _BSD
#include
#ifndef __APPLE__
#include
#endif
+ #ifdef __FreeBSD__
+ #include
+ #include
+ #include
+ #endif
#else
#ifndef __sun__
#include
#include
#include
***************
*** 87,101 ****
--- 93,109 ----
#include "disas.h"
#include "exec-all.h"
#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
+ #ifndef SMBD_COMMAND
#ifdef __sun__
#define SMBD_COMMAND "/usr/sfw/sbin/smbd"
#else
#define SMBD_COMMAND "/usr/sbin/smbd"
#endif
+ #endif
//#define DEBUG_UNUSED_IOPORT
//#define DEBUG_IOPORT
#define PHYS_RAM_MAX_SIZE (2047 * 1024 * 1024)
***************
*** 156,165 ****
--- 164,174 ----
#endif
int usb_enabled = 0;
static VLANState *first_vlan;
int smp_cpus = 1;
const char *vnc_display;
+ const char *vnc_name;
#if defined(TARGET_SPARC)
#define MAX_CPUS 16
#elif defined(TARGET_I386)
#define MAX_CPUS 255
#else
***************
*** 626,636 ****
static int use_rt_clock;
static void init_get_clock(void)
{
use_rt_clock = 0;
! #if defined(__linux__)
{
struct timespec ts;
if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
use_rt_clock = 1;
}
--- 635,645 ----
static int use_rt_clock;
static void init_get_clock(void)
{
use_rt_clock = 0;
! #if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000)
{
struct timespec ts;
if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
use_rt_clock = 1;
}
***************
*** 638,648 ****
#endif
}
static int64_t get_clock(void)
{
! #if defined(__linux__)
if (use_rt_clock) {
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return ts.tv_sec * 1000000000LL + ts.tv_nsec;
} else
--- 647,657 ----
#endif
}
static int64_t get_clock(void)
{
! #if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000)
if (use_rt_clock) {
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return ts.tv_sec * 1000000000LL + ts.tv_nsec;
} else
***************
*** 1639,1649 ****
term_init();
}
return chr;
}
! #if defined(__linux__)
static CharDriverState *qemu_chr_open_pty(void)
{
struct termios tty;
char slave_name[1024];
int master_fd, slave_fd;
--- 1648,1658 ----
term_init();
}
return chr;
}
! #if defined(__linux__) || defined(__FreeBSD__)
static CharDriverState *qemu_chr_open_pty(void)
{
struct termios tty;
char slave_name[1024];
int master_fd, slave_fd;
***************
*** 1718,1731 ****
cfsetispeed(&tty, spd);
cfsetospeed(&tty, spd);
tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
! |INLCR|IGNCR|ICRNL|IXON);
! tty.c_oflag |= OPOST;
tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS|CSTOPB);
switch(data_bits) {
default:
case 8:
tty.c_cflag |= CS8;
break;
--- 1727,1743 ----
cfsetispeed(&tty, spd);
cfsetospeed(&tty, spd);
tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
! |INLCR|IGNCR|ICRNL|IXON|IMAXBEL);
! tty.c_oflag &= ~OPOST; /* Don't do any output processing! */
tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS|CSTOPB);
+ #ifdef __FreeBSD__
+ cfmakeraw(&tty);
+ #endif
switch(data_bits) {
default:
case 8:
tty.c_cflag |= CS8;
break;
***************
*** 1797,1806 ****
--- 1809,1819 ----
chr->chr_ioctl = tty_serial_ioctl;
qemu_chr_reset(chr);
return chr;
}
+ #if defined(__linux__)
static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
{
int fd = (int)chr->opaque;
uint8_t b;
***************
*** 1861,1870 ****
--- 1874,1941 ----
qemu_chr_reset(chr);
return chr;
}
+ #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
static CharDriverState *qemu_chr_open_pty(void)
{
return NULL;
***************
*** 2737,2746 ****
--- 2808,2824 ----
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)) {
+ return qemu_chr_open_tty(filename);
+ } else
#endif
#ifdef _WIN32
if (strstart(filename, "COM", NULL)) {
return qemu_chr_open_win(filename);
} else
***************
*** 3169,3178 ****
--- 3247,3284 ----
#endif /* !defined(_WIN32) */
#endif /* CONFIG_SLIRP */
+ #ifdef __FreeBSD__
+ #define LOAD_QUIETLY 1
+ #define LOAD_VERBOSLY 2
+
+ int
+ loadmodules(int how, const char *module, ...)
+ {
+ int loaded = 0;
+ va_list ap;
+
+ va_start(ap, module);
+ #ifndef NO_MODULES
+ while (module != NULL) {
+ if (modfind(module) == -1) {
+ if (kldload(module) == -1) {
+ if (how == LOAD_VERBOSLY)
+ fprintf(stderr, "%s: Cannot load module\n", module);
+ } else
+ loaded++;
+ }
+ module = va_arg(ap, const char *);
+ }
+ va_end(ap);
+ #endif
+ return loaded;
+ }
+ #endif
+
#if !defined(_WIN32)
typedef struct TAPState {
VLANClientState *vc;
int fd;
***************
*** 3224,3238 ****
{
int fd;
char *dev;
struct stat s;
fd = open("/dev/tap", O_RDWR);
if (fd < 0) {
! fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
return -1;
}
fstat(fd, &s);
dev = devname(s.st_rdev, S_IFCHR);
pstrcpy(ifname, ifname_size, dev);
--- 3330,3388 ----
{
int fd;
char *dev;
struct stat s;
+ #ifdef __FreeBSD__
+ int i, kldtried = 0, enoentcount = 0, err = 0;
+ char dname[100];
+ #ifdef USE_DEVTAP
+ /*
+ * 5.x has /dev/tap, but that seems to just blindly increase its
+ * couter on every open() for some people(??), i.e. on every qemu run.
+ */
+ i = -1;
+ #else
+ i = 0;
+ #endif
+ for (; i < 10; i++) {
+ if (i == -1)
+ strcpy(dname, "/dev/tap");
+ else
+ snprintf(dname, sizeof dname, "%s%d",
+ "/dev/tap", i);
+ fd = open(dname, O_RDWR);
+ if (fd >= 0)
+ break;
+ else if (errno == ENXIO || errno == ENOENT) {
+ if (i == 0 && !kldtried++) {
+ /*
+ * Attempt to load the tunnel interface KLD if it isn't loaded
+ * already.
+ */
+ if (loadmodules(LOAD_VERBOSLY, "if_tap", NULL))
+ i = -1;
+ continue;
+ }
+ if (errno != ENOENT || ++enoentcount > 3) {
+ err = errno;
+ break;
+ }
+ } else
+ err = errno;
+ }
+ if (fd < 0) {
+ fprintf(stderr, "warning: could not open %s (%s): no virtual network emulation\n", dname, strerror(err));
+ return -1;
+ }
+ #else
fd = open("/dev/tap", O_RDWR);
if (fd < 0) {
! fprintf(stderr, "warning: could not open /dev/tap (%s): no virtual network emulation\n", strerror(errno));
return -1;
}
+ #endif
fstat(fd, &s);
dev = devname(s.st_rdev, S_IFCHR);
pstrcpy(ifname, ifname_size, dev);
***************
*** 6199,6208 ****
--- 6349,6359 ----
QEMU_OPTION_win2k_hack,
QEMU_OPTION_usb,
QEMU_OPTION_usbdevice,
QEMU_OPTION_smp,
QEMU_OPTION_vnc,
+ QEMU_OPTION_vncname,
QEMU_OPTION_no_acpi,
QEMU_OPTION_no_reboot,
QEMU_OPTION_daemonize,
QEMU_OPTION_option_rom,
QEMU_OPTION_semihosting
***************
*** 6279,6288 ****
--- 6430,6440 ----
{ "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
{ "win2k-hack", 0, QEMU_OPTION_win2k_hack },
{ "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
{ "smp", HAS_ARG, QEMU_OPTION_smp },
{ "vnc", HAS_ARG, QEMU_OPTION_vnc },
+ { "vncname", HAS_ARG, QEMU_OPTION_vncname },
/* temporary options */
{ "usb", 0, QEMU_OPTION_usb },
{ "cirrusvga", 0, QEMU_OPTION_cirrusvga },
{ "no-acpi", 0, QEMU_OPTION_no_acpi },
***************
*** 6704,6713 ****
--- 6856,6866 ----
}
break;
case QEMU_OPTION_nographic:
pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "stdio");
+ pstrcpy(parallel_devices[0], sizeof(parallel_devices[0]), "null");
nographic = 1;
break;
case QEMU_OPTION_kernel:
kernel_filename = optarg;
break;
***************
*** 6936,6945 ****
--- 7089,7101 ----
}
break;
case QEMU_OPTION_vnc:
vnc_display = optarg;
break;
+ case QEMU_OPTION_vncname:
+ vnc_name = optarg;
+ break;
case QEMU_OPTION_no_acpi:
acpi_enabled = 0;
break;
case QEMU_OPTION_no_reboot:
no_reboot = 1;
*** vl.h Fri Feb 16 13:27:06 2007
--- /home/reddawg/qemu/work/qemu-0.9.0/vl.h Fri Feb 16 13:30:23 2007
***************
*** 1,9 ****
--- 1,10 ----
/*
* QEMU System Emulator header
*
* Copyright (c) 2003 Fabrice Bellard
+ * Copyright (C) 2007 Christopher Olsen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
***************
*** 28,37 ****
--- 29,44 ----
#include
#include
#include
#include
#include
+ #ifndef PRId64
+ #define PRId64 "lld" /* int64_t */
+ #define PRIo64 "llo" /* int64_t */
+ #define PRIx64 "llx" /* int64_t */
+ #define PRIu64 "llu" /* int64_t */
+ #endif
#include
#include
#include
#include
#include
***************
*** 110,119 ****
--- 117,129 ----
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c);
void hw_error(const char *fmt, ...);
extern const char *bios_dir;
+
+ //UBU
+ extern const char *vnc_name;
extern int vm_running;
typedef struct vm_change_state_entry VMChangeStateEntry;
typedef void VMChangeStateHandler(void *opaque, int running);
*** vnc.c Fri Feb 16 13:27:06 2007
--- /home/reddawg/qemu/work/qemu-0.9.0/vnc.c Fri Feb 16 13:29:13 2007
***************
*** 1,10 ****
--- 1,11 ----
/*
* QEMU VNC display driver
*
* Copyright (C) 2006 Anthony Liguori
* Copyright (C) 2006 Fabrice Bellard
+ * Copyright (C) 2007 Christopher Olsen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
***************
*** 1054,1063 ****
--- 1055,1065 ----
}
static int protocol_client_init(VncState *vs, char *data, size_t len)
{
char pad[3] = { 0, 0, 0 };
+ char name[64];
vs->width = vs->ds->width;
vs->height = vs->ds->height;
vnc_write_u16(vs, vs->ds->width);
vnc_write_u16(vs, vs->ds->height);
***************
*** 1098,1109 ****
}
vs->write_pixels = vnc_write_pixels_copy;
vnc_write(vs, pad, 3); /* padding */
! vnc_write_u32(vs, 4);
! vnc_write(vs, "QEMU", 4);
vnc_flush(vs);
vnc_read_when(vs, protocol_client_msg, 1);
return 0;
--- 1100,1115 ----
}
vs->write_pixels = vnc_write_pixels_copy;
vnc_write(vs, pad, 3); /* padding */
! if (vnc_name == 0x0)
! sprintf(name, "QEMU: Unknown");
! else
! sprintf(name, "QEMU: %s",vnc_name);
! vnc_write_u32(vs, strlen(name));
! vnc_write(vs, name, strlen(name));
vnc_flush(vs);
vnc_read_when(vs, protocol_client_msg, 1);
return 0;