| 154 |
int win2k_install_hack = 0; |
int win2k_install_hack = 0; |
| 155 |
#endif |
#endif |
| 156 |
int usb_enabled = 0; |
int usb_enabled = 0; |
| 157 |
|
USBPort *vm_usb_ports[MAX_VM_USB_PORTS]; |
| 158 |
|
USBDevice *vm_usb_hub; |
| 159 |
|
|
| 160 |
/***********************************************************/ |
/***********************************************************/ |
| 161 |
/* x86 ISA bus support */ |
/* x86 ISA bus support */ |
| 1740 |
#endif /* !_WIN32 */ |
#endif /* !_WIN32 */ |
| 1741 |
|
|
| 1742 |
/***********************************************************/ |
/***********************************************************/ |
| 1743 |
|
/* USB devices */ |
| 1744 |
|
|
| 1745 |
|
static int usb_device_add(const char *devname) |
| 1746 |
|
{ |
| 1747 |
|
const char *p; |
| 1748 |
|
USBDevice *dev; |
| 1749 |
|
int i; |
| 1750 |
|
|
| 1751 |
|
if (!vm_usb_hub) |
| 1752 |
|
return -1; |
| 1753 |
|
for(i = 0;i < MAX_VM_USB_PORTS; i++) { |
| 1754 |
|
if (!vm_usb_ports[i]->dev) |
| 1755 |
|
break; |
| 1756 |
|
} |
| 1757 |
|
if (i == MAX_VM_USB_PORTS) |
| 1758 |
|
return -1; |
| 1759 |
|
|
| 1760 |
|
if (strstart(devname, "host:", &p)) { |
| 1761 |
|
dev = usb_host_device_open(p); |
| 1762 |
|
if (!dev) |
| 1763 |
|
return -1; |
| 1764 |
|
} else if (!strcmp(devname, "mouse")) { |
| 1765 |
|
dev = usb_mouse_init(); |
| 1766 |
|
if (!dev) |
| 1767 |
|
return -1; |
| 1768 |
|
} else { |
| 1769 |
|
return -1; |
| 1770 |
|
} |
| 1771 |
|
usb_attach(vm_usb_ports[i], dev); |
| 1772 |
|
return 0; |
| 1773 |
|
} |
| 1774 |
|
|
| 1775 |
|
static int usb_device_del(const char *devname) |
| 1776 |
|
{ |
| 1777 |
|
USBDevice *dev; |
| 1778 |
|
int bus_num, addr, i; |
| 1779 |
|
const char *p; |
| 1780 |
|
|
| 1781 |
|
if (!vm_usb_hub) |
| 1782 |
|
return -1; |
| 1783 |
|
|
| 1784 |
|
p = strchr(devname, '.'); |
| 1785 |
|
if (!p) |
| 1786 |
|
return -1; |
| 1787 |
|
bus_num = strtoul(devname, NULL, 0); |
| 1788 |
|
addr = strtoul(p + 1, NULL, 0); |
| 1789 |
|
if (bus_num != 0) |
| 1790 |
|
return -1; |
| 1791 |
|
for(i = 0;i < MAX_VM_USB_PORTS; i++) { |
| 1792 |
|
dev = vm_usb_ports[i]->dev; |
| 1793 |
|
if (dev && dev->addr == addr) |
| 1794 |
|
break; |
| 1795 |
|
} |
| 1796 |
|
if (i == MAX_VM_USB_PORTS) |
| 1797 |
|
return -1; |
| 1798 |
|
usb_attach(vm_usb_ports[i], NULL); |
| 1799 |
|
return 0; |
| 1800 |
|
} |
| 1801 |
|
|
| 1802 |
|
void do_usb_add(const char *devname) |
| 1803 |
|
{ |
| 1804 |
|
int ret; |
| 1805 |
|
ret = usb_device_add(devname); |
| 1806 |
|
if (ret < 0) |
| 1807 |
|
term_printf("Could not add USB device '%s'\n", devname); |
| 1808 |
|
} |
| 1809 |
|
|
| 1810 |
|
void do_usb_del(const char *devname) |
| 1811 |
|
{ |
| 1812 |
|
int ret; |
| 1813 |
|
ret = usb_device_del(devname); |
| 1814 |
|
if (ret < 0) |
| 1815 |
|
term_printf("Could not remove USB device '%s'\n", devname); |
| 1816 |
|
} |
| 1817 |
|
|
| 1818 |
|
void usb_info(void) |
| 1819 |
|
{ |
| 1820 |
|
USBDevice *dev; |
| 1821 |
|
int i; |
| 1822 |
|
const char *speed_str; |
| 1823 |
|
|
| 1824 |
|
if (!vm_usb_hub) { |
| 1825 |
|
term_printf("USB support not enabled\n"); |
| 1826 |
|
return; |
| 1827 |
|
} |
| 1828 |
|
|
| 1829 |
|
for(i = 0; i < MAX_VM_USB_PORTS; i++) { |
| 1830 |
|
dev = vm_usb_ports[i]->dev; |
| 1831 |
|
if (dev) { |
| 1832 |
|
term_printf("Hub port %d:\n", i); |
| 1833 |
|
switch(dev->speed) { |
| 1834 |
|
case USB_SPEED_LOW: |
| 1835 |
|
speed_str = "1.5"; |
| 1836 |
|
break; |
| 1837 |
|
case USB_SPEED_FULL: |
| 1838 |
|
speed_str = "12"; |
| 1839 |
|
break; |
| 1840 |
|
case USB_SPEED_HIGH: |
| 1841 |
|
speed_str = "480"; |
| 1842 |
|
break; |
| 1843 |
|
default: |
| 1844 |
|
speed_str = "?"; |
| 1845 |
|
break; |
| 1846 |
|
} |
| 1847 |
|
term_printf(" Device %d.%d, speed %s Mb/s\n", |
| 1848 |
|
0, dev->addr, speed_str); |
| 1849 |
|
} |
| 1850 |
|
} |
| 1851 |
|
} |
| 1852 |
|
|
| 1853 |
|
/***********************************************************/ |
| 1854 |
/* pid file */ |
/* pid file */ |
| 1855 |
|
|
| 1856 |
static char *pid_filename; |
static char *pid_filename; |
| 3102 |
QEMU_OPTION_no_kqemu, |
QEMU_OPTION_no_kqemu, |
| 3103 |
QEMU_OPTION_win2k_hack, |
QEMU_OPTION_win2k_hack, |
| 3104 |
QEMU_OPTION_usb, |
QEMU_OPTION_usb, |
| 3105 |
|
QEMU_OPTION_usbdevice, |
| 3106 |
}; |
}; |
| 3107 |
|
|
| 3108 |
typedef struct QEMUOption { |
typedef struct QEMUOption { |
| 3177 |
{ "full-screen", 0, QEMU_OPTION_full_screen }, |
{ "full-screen", 0, QEMU_OPTION_full_screen }, |
| 3178 |
{ "pidfile", HAS_ARG, QEMU_OPTION_pidfile }, |
{ "pidfile", HAS_ARG, QEMU_OPTION_pidfile }, |
| 3179 |
{ "win2k-hack", 0, QEMU_OPTION_win2k_hack }, |
{ "win2k-hack", 0, QEMU_OPTION_win2k_hack }, |
| 3180 |
{ "usb", 0, QEMU_OPTION_usb }, |
{ "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice }, |
| 3181 |
|
|
| 3182 |
/* temporary options */ |
/* temporary options */ |
| 3183 |
|
{ "usb", 0, QEMU_OPTION_usb }, |
| 3184 |
{ "pci", 0, QEMU_OPTION_pci }, |
{ "pci", 0, QEMU_OPTION_pci }, |
| 3185 |
{ "cirrusvga", 0, QEMU_OPTION_cirrusvga }, |
{ "cirrusvga", 0, QEMU_OPTION_cirrusvga }, |
| 3186 |
{ NULL }, |
{ NULL }, |
| 3354 |
int parallel_device_index; |
int parallel_device_index; |
| 3355 |
const char *loadvm = NULL; |
const char *loadvm = NULL; |
| 3356 |
QEMUMachine *machine; |
QEMUMachine *machine; |
| 3357 |
|
char usb_devices[MAX_VM_USB_PORTS][128]; |
| 3358 |
|
int usb_devices_index; |
| 3359 |
|
|
| 3360 |
#if !defined(CONFIG_SOFTMMU) |
#if !defined(CONFIG_SOFTMMU) |
| 3361 |
/* we never want that malloc() uses mmap() */ |
/* we never want that malloc() uses mmap() */ |
| 3362 |
mallopt(M_MMAP_THRESHOLD, 4096 * 1024); |
mallopt(M_MMAP_THRESHOLD, 4096 * 1024); |
| 3399 |
parallel_devices[i][0] = '\0'; |
parallel_devices[i][0] = '\0'; |
| 3400 |
parallel_device_index = 0; |
parallel_device_index = 0; |
| 3401 |
|
|
| 3402 |
|
usb_devices_index = 0; |
| 3403 |
|
|
| 3404 |
nb_tun_fds = 0; |
nb_tun_fds = 0; |
| 3405 |
net_if_type = -1; |
net_if_type = -1; |
| 3406 |
nb_nics = 1; |
nb_nics = 1; |
| 3772 |
case QEMU_OPTION_usb: |
case QEMU_OPTION_usb: |
| 3773 |
usb_enabled = 1; |
usb_enabled = 1; |
| 3774 |
break; |
break; |
| 3775 |
|
case QEMU_OPTION_usbdevice: |
| 3776 |
|
usb_enabled = 1; |
| 3777 |
|
if (usb_devices_index >= MAX_VM_USB_PORTS) { |
| 3778 |
|
fprintf(stderr, "Too many USB devices\n"); |
| 3779 |
|
exit(1); |
| 3780 |
|
} |
| 3781 |
|
pstrcpy(usb_devices[usb_devices_index], |
| 3782 |
|
sizeof(usb_devices[usb_devices_index]), |
| 3783 |
|
optarg); |
| 3784 |
|
usb_devices_index++; |
| 3785 |
|
break; |
| 3786 |
} |
} |
| 3787 |
} |
} |
| 3788 |
} |
} |
| 3947 |
} |
} |
| 3948 |
} |
} |
| 3949 |
} |
} |
| 3950 |
|
|
| 3951 |
|
/* init USB devices */ |
| 3952 |
|
if (usb_enabled) { |
| 3953 |
|
vm_usb_hub = usb_hub_init(vm_usb_ports, MAX_VM_USB_PORTS); |
| 3954 |
|
for(i = 0; i < usb_devices_index; i++) { |
| 3955 |
|
if (usb_device_add(usb_devices[i]) < 0) { |
| 3956 |
|
fprintf(stderr, "Warning: could not add USB device %s\n", |
| 3957 |
|
usb_devices[i]); |
| 3958 |
|
} |
| 3959 |
|
} |
| 3960 |
|
} |
| 3961 |
|
|
| 3962 |
/* init CPU state */ |
/* init CPU state */ |
| 3963 |
env = cpu_init(); |
env = cpu_init(); |