]> git.proxmox.com Git - qemu.git/commitdiff
Merge remote-tracking branch 'bonzini/hw-dirs' into staging
authorAnthony Liguori <aliguori@us.ibm.com>
Mon, 11 Mar 2013 00:39:07 +0000 (19:39 -0500)
committerAnthony Liguori <aliguori@us.ibm.com>
Mon, 11 Mar 2013 00:56:35 +0000 (19:56 -0500)
* bonzini/hw-dirs:
  sh: move files referencing CPU to hw/sh4/
  ppc: move more files to hw/ppc
  ppc: move files referencing CPU to hw/ppc/
  m68k: move files referencing CPU to hw/m68k/
  i386: move files referencing CPU to hw/i386/
  arm: move files referencing CPU to hw/arm/
  hw: move boards and other isolated files to hw/ARCH
  ppc: express FDT dependency of pSeries and e500 boards via default-configs/
  build: always link device_tree.o into emulators if libfdt available
  hw: include hw header files with full paths
  ppc: do not use ../ in include files
  vt82c686: vt82c686 is not a PCI host bridge
  virtio-9p: remove PCI dependencies from hw/9pfs/
  virtio-9p: use CONFIG_VIRTFS, not CONFIG_LINUX
  hw: move device-hotplug.o to toplevel, compile it once
  hw: move qdev-monitor.o to toplevel directory
  hw: move fifo.[ch] to libqemuutil
  hw: move char backends to backends/

Conflicts:
backends/baum.c
backends/msmouse.c
hw/a15mpcore.c
hw/arm/Makefile.objs
hw/arm/pic_cpu.c
hw/dataplane/event-poll.c
hw/dataplane/virtio-blk.c
include/char/baum.h
include/char/msmouse.h
qemu-char.c
vl.c

Resolve conflicts caused by header movements.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
33 files changed:
1  2 
backends/baum.c
backends/msmouse.c
configure
hw/a15mpcore.c
hw/arm/Makefile.objs
hw/arm/pic_cpu.c
hw/arm_gic.c
hw/arm_gic_common.c
hw/arm_gic_internal.h
hw/armv7m_nvic.c
hw/dataplane/virtio-blk.c
hw/e1000.c
hw/i386/pc_piix.c
hw/ich9.h
hw/lpc_ich9.c
hw/macio.c
hw/milkymist-hw.h
hw/nand.c
hw/pc.h
hw/piix_pci.c
hw/scsi-bus.c
hw/scsi-disk.c
hw/serial.c
hw/serial.h
hw/sysbus.c
hw/sysbus.h
hw/vhost.c
hw/virtio-blk.c
hw/virtio-console.c
hw/virtio-net.c
hw/virtio-pci.c
hw/virtio-serial-bus.c
vl.c

diff --cc backends/baum.c
index 0000000000000000000000000000000000000000,37ccca8211078e208ca0cce711fbcad62fc383a0..9063aea2cf7681d8b102134623f772b10e46e8e1
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,627 +1,633 @@@
 -#include "char/baum.h"
+ /*
+  * QEMU Baum Braille Device
+  *
+  * Copyright (c) 2008 Samuel Thibault
+  *
+  * 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
+  * copies of the Software, and to permit persons to whom the Software is
+  * furnished to do so, subject to the following conditions:
+  *
+  * The above copyright notice and this permission notice shall be included in
+  * all copies or substantial portions of the Software.
+  *
+  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  * THE SOFTWARE.
+  */
+ #include "qemu-common.h"
+ #include "char/char.h"
+ #include "qemu/timer.h"
+ #include "hw/usb.h"
 -CharDriverState *chr_baum_init(QemuOpts *opts)
+ #include <brlapi.h>
+ #include <brlapi_constants.h>
+ #include <brlapi_keycodes.h>
+ #ifdef CONFIG_SDL
+ #include <SDL_syswm.h>
+ #endif
+ #if 0
+ #define DPRINTF(fmt, ...) \
+         printf(fmt, ## __VA_ARGS__)
+ #else
+ #define DPRINTF(fmt, ...)
+ #endif
+ #define ESC 0x1B
+ #define BAUM_REQ_DisplayData          0x01
+ #define BAUM_REQ_GetVersionNumber     0x05
+ #define BAUM_REQ_GetKeys              0x08
+ #define BAUM_REQ_SetMode              0x12
+ #define BAUM_REQ_SetProtocol          0x15
+ #define BAUM_REQ_GetDeviceIdentity    0x84
+ #define BAUM_REQ_GetSerialNumber      0x8A
+ #define BAUM_RSP_CellCount            0x01
+ #define BAUM_RSP_VersionNumber                0x05
+ #define BAUM_RSP_ModeSetting          0x11
+ #define BAUM_RSP_CommunicationChannel 0x16
+ #define BAUM_RSP_PowerdownSignal      0x17
+ #define BAUM_RSP_HorizontalSensors    0x20
+ #define BAUM_RSP_VerticalSensors      0x21
+ #define BAUM_RSP_RoutingKeys          0x22
+ #define BAUM_RSP_Switches             0x23
+ #define BAUM_RSP_TopKeys              0x24
+ #define BAUM_RSP_HorizontalSensor     0x25
+ #define BAUM_RSP_VerticalSensor               0x26
+ #define BAUM_RSP_RoutingKey           0x27
+ #define BAUM_RSP_FrontKeys6           0x28
+ #define BAUM_RSP_BackKeys6            0x29
+ #define BAUM_RSP_CommandKeys          0x2B
+ #define BAUM_RSP_FrontKeys10          0x2C
+ #define BAUM_RSP_BackKeys10           0x2D
+ #define BAUM_RSP_EntryKeys            0x33
+ #define BAUM_RSP_JoyStick             0x34
+ #define BAUM_RSP_ErrorCode            0x40
+ #define BAUM_RSP_InfoBlock            0x42
+ #define BAUM_RSP_DeviceIdentity               0x84
+ #define BAUM_RSP_SerialNumber         0x8A
+ #define BAUM_RSP_BluetoothName                0x8C
+ #define BAUM_TL1 0x01
+ #define BAUM_TL2 0x02
+ #define BAUM_TL3 0x04
+ #define BAUM_TR1 0x08
+ #define BAUM_TR2 0x10
+ #define BAUM_TR3 0x20
+ #define BUF_SIZE 256
+ typedef struct {
+     CharDriverState *chr;
+     brlapi_handle_t *brlapi;
+     int brlapi_fd;
+     unsigned int x, y;
+     uint8_t in_buf[BUF_SIZE];
+     uint8_t in_buf_used;
+     uint8_t out_buf[BUF_SIZE];
+     uint8_t out_buf_used, out_buf_ptr;
+     QEMUTimer *cellCount_timer;
+ } BaumDriverState;
+ /* Let's assume NABCC by default */
+ static const uint8_t nabcc_translation[256] = {
+     [0] = ' ',
+ #ifndef BRLAPI_DOTS
+ #define BRLAPI_DOTS(d1,d2,d3,d4,d5,d6,d7,d8) \
+     ((d1?BRLAPI_DOT1:0)|\
+      (d2?BRLAPI_DOT2:0)|\
+      (d3?BRLAPI_DOT3:0)|\
+      (d4?BRLAPI_DOT4:0)|\
+      (d5?BRLAPI_DOT5:0)|\
+      (d6?BRLAPI_DOT6:0)|\
+      (d7?BRLAPI_DOT7:0)|\
+      (d8?BRLAPI_DOT8:0))
+ #endif
+     [BRLAPI_DOTS(1,0,0,0,0,0,0,0)] = 'a',
+     [BRLAPI_DOTS(1,1,0,0,0,0,0,0)] = 'b',
+     [BRLAPI_DOTS(1,0,0,1,0,0,0,0)] = 'c',
+     [BRLAPI_DOTS(1,0,0,1,1,0,0,0)] = 'd',
+     [BRLAPI_DOTS(1,0,0,0,1,0,0,0)] = 'e',
+     [BRLAPI_DOTS(1,1,0,1,0,0,0,0)] = 'f',
+     [BRLAPI_DOTS(1,1,0,1,1,0,0,0)] = 'g',
+     [BRLAPI_DOTS(1,1,0,0,1,0,0,0)] = 'h',
+     [BRLAPI_DOTS(0,1,0,1,0,0,0,0)] = 'i',
+     [BRLAPI_DOTS(0,1,0,1,1,0,0,0)] = 'j',
+     [BRLAPI_DOTS(1,0,1,0,0,0,0,0)] = 'k',
+     [BRLAPI_DOTS(1,1,1,0,0,0,0,0)] = 'l',
+     [BRLAPI_DOTS(1,0,1,1,0,0,0,0)] = 'm',
+     [BRLAPI_DOTS(1,0,1,1,1,0,0,0)] = 'n',
+     [BRLAPI_DOTS(1,0,1,0,1,0,0,0)] = 'o',
+     [BRLAPI_DOTS(1,1,1,1,0,0,0,0)] = 'p',
+     [BRLAPI_DOTS(1,1,1,1,1,0,0,0)] = 'q',
+     [BRLAPI_DOTS(1,1,1,0,1,0,0,0)] = 'r',
+     [BRLAPI_DOTS(0,1,1,1,0,0,0,0)] = 's',
+     [BRLAPI_DOTS(0,1,1,1,1,0,0,0)] = 't',
+     [BRLAPI_DOTS(1,0,1,0,0,1,0,0)] = 'u',
+     [BRLAPI_DOTS(1,1,1,0,0,1,0,0)] = 'v',
+     [BRLAPI_DOTS(0,1,0,1,1,1,0,0)] = 'w',
+     [BRLAPI_DOTS(1,0,1,1,0,1,0,0)] = 'x',
+     [BRLAPI_DOTS(1,0,1,1,1,1,0,0)] = 'y',
+     [BRLAPI_DOTS(1,0,1,0,1,1,0,0)] = 'z',
+     [BRLAPI_DOTS(1,0,0,0,0,0,1,0)] = 'A',
+     [BRLAPI_DOTS(1,1,0,0,0,0,1,0)] = 'B',
+     [BRLAPI_DOTS(1,0,0,1,0,0,1,0)] = 'C',
+     [BRLAPI_DOTS(1,0,0,1,1,0,1,0)] = 'D',
+     [BRLAPI_DOTS(1,0,0,0,1,0,1,0)] = 'E',
+     [BRLAPI_DOTS(1,1,0,1,0,0,1,0)] = 'F',
+     [BRLAPI_DOTS(1,1,0,1,1,0,1,0)] = 'G',
+     [BRLAPI_DOTS(1,1,0,0,1,0,1,0)] = 'H',
+     [BRLAPI_DOTS(0,1,0,1,0,0,1,0)] = 'I',
+     [BRLAPI_DOTS(0,1,0,1,1,0,1,0)] = 'J',
+     [BRLAPI_DOTS(1,0,1,0,0,0,1,0)] = 'K',
+     [BRLAPI_DOTS(1,1,1,0,0,0,1,0)] = 'L',
+     [BRLAPI_DOTS(1,0,1,1,0,0,1,0)] = 'M',
+     [BRLAPI_DOTS(1,0,1,1,1,0,1,0)] = 'N',
+     [BRLAPI_DOTS(1,0,1,0,1,0,1,0)] = 'O',
+     [BRLAPI_DOTS(1,1,1,1,0,0,1,0)] = 'P',
+     [BRLAPI_DOTS(1,1,1,1,1,0,1,0)] = 'Q',
+     [BRLAPI_DOTS(1,1,1,0,1,0,1,0)] = 'R',
+     [BRLAPI_DOTS(0,1,1,1,0,0,1,0)] = 'S',
+     [BRLAPI_DOTS(0,1,1,1,1,0,1,0)] = 'T',
+     [BRLAPI_DOTS(1,0,1,0,0,1,1,0)] = 'U',
+     [BRLAPI_DOTS(1,1,1,0,0,1,1,0)] = 'V',
+     [BRLAPI_DOTS(0,1,0,1,1,1,1,0)] = 'W',
+     [BRLAPI_DOTS(1,0,1,1,0,1,1,0)] = 'X',
+     [BRLAPI_DOTS(1,0,1,1,1,1,1,0)] = 'Y',
+     [BRLAPI_DOTS(1,0,1,0,1,1,1,0)] = 'Z',
+     [BRLAPI_DOTS(0,0,1,0,1,1,0,0)] = '0',
+     [BRLAPI_DOTS(0,1,0,0,0,0,0,0)] = '1',
+     [BRLAPI_DOTS(0,1,1,0,0,0,0,0)] = '2',
+     [BRLAPI_DOTS(0,1,0,0,1,0,0,0)] = '3',
+     [BRLAPI_DOTS(0,1,0,0,1,1,0,0)] = '4',
+     [BRLAPI_DOTS(0,1,0,0,0,1,0,0)] = '5',
+     [BRLAPI_DOTS(0,1,1,0,1,0,0,0)] = '6',
+     [BRLAPI_DOTS(0,1,1,0,1,1,0,0)] = '7',
+     [BRLAPI_DOTS(0,1,1,0,0,1,0,0)] = '8',
+     [BRLAPI_DOTS(0,0,1,0,1,0,0,0)] = '9',
+     [BRLAPI_DOTS(0,0,0,1,0,1,0,0)] = '.',
+     [BRLAPI_DOTS(0,0,1,1,0,1,0,0)] = '+',
+     [BRLAPI_DOTS(0,0,1,0,0,1,0,0)] = '-',
+     [BRLAPI_DOTS(1,0,0,0,0,1,0,0)] = '*',
+     [BRLAPI_DOTS(0,0,1,1,0,0,0,0)] = '/',
+     [BRLAPI_DOTS(1,1,1,0,1,1,0,0)] = '(',
+     [BRLAPI_DOTS(0,1,1,1,1,1,0,0)] = ')',
+     [BRLAPI_DOTS(1,1,1,1,0,1,0,0)] = '&',
+     [BRLAPI_DOTS(0,0,1,1,1,1,0,0)] = '#',
+     [BRLAPI_DOTS(0,0,0,0,0,1,0,0)] = ',',
+     [BRLAPI_DOTS(0,0,0,0,1,1,0,0)] = ';',
+     [BRLAPI_DOTS(1,0,0,0,1,1,0,0)] = ':',
+     [BRLAPI_DOTS(0,1,1,1,0,1,0,0)] = '!',
+     [BRLAPI_DOTS(1,0,0,1,1,1,0,0)] = '?',
+     [BRLAPI_DOTS(0,0,0,0,1,0,0,0)] = '"',
+     [BRLAPI_DOTS(0,0,1,0,0,0,0,0)] ='\'',
+     [BRLAPI_DOTS(0,0,0,1,0,0,0,0)] = '`',
+     [BRLAPI_DOTS(0,0,0,1,1,0,1,0)] = '^',
+     [BRLAPI_DOTS(0,0,0,1,1,0,0,0)] = '~',
+     [BRLAPI_DOTS(0,1,0,1,0,1,1,0)] = '[',
+     [BRLAPI_DOTS(1,1,0,1,1,1,1,0)] = ']',
+     [BRLAPI_DOTS(0,1,0,1,0,1,0,0)] = '{',
+     [BRLAPI_DOTS(1,1,0,1,1,1,0,0)] = '}',
+     [BRLAPI_DOTS(1,1,1,1,1,1,0,0)] = '=',
+     [BRLAPI_DOTS(1,1,0,0,0,1,0,0)] = '<',
+     [BRLAPI_DOTS(0,0,1,1,1,0,0,0)] = '>',
+     [BRLAPI_DOTS(1,1,0,1,0,1,0,0)] = '$',
+     [BRLAPI_DOTS(1,0,0,1,0,1,0,0)] = '%',
+     [BRLAPI_DOTS(0,0,0,1,0,0,1,0)] = '@',
+     [BRLAPI_DOTS(1,1,0,0,1,1,0,0)] = '|',
+     [BRLAPI_DOTS(1,1,0,0,1,1,1,0)] ='\\',
+     [BRLAPI_DOTS(0,0,0,1,1,1,0,0)] = '_',
+ };
+ /* The serial port can receive more of our data */
+ static void baum_accept_input(struct CharDriverState *chr)
+ {
+     BaumDriverState *baum = chr->opaque;
+     int room, first;
+     if (!baum->out_buf_used)
+         return;
+     room = qemu_chr_be_can_write(chr);
+     if (!room)
+         return;
+     if (room > baum->out_buf_used)
+         room = baum->out_buf_used;
+     first = BUF_SIZE - baum->out_buf_ptr;
+     if (room > first) {
+         qemu_chr_be_write(chr, baum->out_buf + baum->out_buf_ptr, first);
+         baum->out_buf_ptr = 0;
+         baum->out_buf_used -= first;
+         room -= first;
+     }
+     qemu_chr_be_write(chr, baum->out_buf + baum->out_buf_ptr, room);
+     baum->out_buf_ptr += room;
+     baum->out_buf_used -= room;
+ }
+ /* We want to send a packet */
+ static void baum_write_packet(BaumDriverState *baum, const uint8_t *buf, int len)
+ {
+     uint8_t io_buf[1 + 2 * len], *cur = io_buf;
+     int room;
+     *cur++ = ESC;
+     while (len--)
+         if ((*cur++ = *buf++) == ESC)
+             *cur++ = ESC;
+     room = qemu_chr_be_can_write(baum->chr);
+     len = cur - io_buf;
+     if (len <= room) {
+         /* Fits */
+         qemu_chr_be_write(baum->chr, io_buf, len);
+     } else {
+         int first;
+         uint8_t out;
+         /* Can't fit all, send what can be, and store the rest. */
+         qemu_chr_be_write(baum->chr, io_buf, room);
+         len -= room;
+         cur = io_buf + room;
+         if (len > BUF_SIZE - baum->out_buf_used) {
+             /* Can't even store it, drop the previous data... */
+             assert(len <= BUF_SIZE);
+             baum->out_buf_used = 0;
+             baum->out_buf_ptr = 0;
+         }
+         out = baum->out_buf_ptr;
+         baum->out_buf_used += len;
+         first = BUF_SIZE - baum->out_buf_ptr;
+         if (len > first) {
+             memcpy(baum->out_buf + out, cur, first);
+             out = 0;
+             len -= first;
+             cur += first;
+         }
+         memcpy(baum->out_buf + out, cur, len);
+     }
+ }
+ /* Called when the other end seems to have a wrong idea of our display size */
+ static void baum_cellCount_timer_cb(void *opaque)
+ {
+     BaumDriverState *baum = opaque;
+     uint8_t cell_count[] = { BAUM_RSP_CellCount, baum->x * baum->y };
+     DPRINTF("Timeout waiting for DisplayData, sending cell count\n");
+     baum_write_packet(baum, cell_count, sizeof(cell_count));
+ }
+ /* Try to interpret a whole incoming packet */
+ static int baum_eat_packet(BaumDriverState *baum, const uint8_t *buf, int len)
+ {
+     const uint8_t *cur = buf;
+     uint8_t req = 0;
+     if (!len--)
+         return 0;
+     if (*cur++ != ESC) {
+         while (*cur != ESC) {
+             if (!len--)
+                 return 0;
+             cur++;
+         }
+         DPRINTF("Dropped %d bytes!\n", cur - buf);
+     }
+ #define EAT(c) do {\
+     if (!len--) \
+         return 0; \
+     if ((c = *cur++) == ESC) { \
+         if (!len--) \
+             return 0; \
+         if (*cur++ != ESC) { \
+             DPRINTF("Broken packet %#2x, tossing\n", req); \
+               if (qemu_timer_pending(baum->cellCount_timer)) { \
+                 qemu_del_timer(baum->cellCount_timer); \
+                 baum_cellCount_timer_cb(baum); \
+             } \
+             return (cur - 2 - buf); \
+         } \
+     } \
+ } while (0)
+     EAT(req);
+     switch (req) {
+     case BAUM_REQ_DisplayData:
+     {
+         uint8_t cells[baum->x * baum->y], c;
+         uint8_t text[baum->x * baum->y];
+         uint8_t zero[baum->x * baum->y];
+         int cursor = BRLAPI_CURSOR_OFF;
+         int i;
+         /* Allow 100ms to complete the DisplayData packet */
+         qemu_mod_timer(baum->cellCount_timer, qemu_get_clock_ns(vm_clock) +
+                        get_ticks_per_sec() / 10);
+         for (i = 0; i < baum->x * baum->y ; i++) {
+             EAT(c);
+             cells[i] = c;
+             if ((c & (BRLAPI_DOT7|BRLAPI_DOT8))
+                     == (BRLAPI_DOT7|BRLAPI_DOT8)) {
+                 cursor = i + 1;
+                 c &= ~(BRLAPI_DOT7|BRLAPI_DOT8);
+             }
+             if (!(c = nabcc_translation[c]))
+                 c = '?';
+             text[i] = c;
+         }
+         qemu_del_timer(baum->cellCount_timer);
+         memset(zero, 0, sizeof(zero));
+         brlapi_writeArguments_t wa = {
+             .displayNumber = BRLAPI_DISPLAY_DEFAULT,
+             .regionBegin = 1,
+             .regionSize = baum->x * baum->y,
+             .text = (char *)text,
+             .textSize = baum->x * baum->y,
+             .andMask = zero,
+             .orMask = cells,
+             .cursor = cursor,
+             .charset = (char *)"ISO-8859-1",
+         };
+         if (brlapi__write(baum->brlapi, &wa) == -1)
+             brlapi_perror("baum brlapi_write");
+         break;
+     }
+     case BAUM_REQ_SetMode:
+     {
+         uint8_t mode, setting;
+         DPRINTF("SetMode\n");
+         EAT(mode);
+         EAT(setting);
+         /* ignore */
+         break;
+     }
+     case BAUM_REQ_SetProtocol:
+     {
+         uint8_t protocol;
+         DPRINTF("SetProtocol\n");
+         EAT(protocol);
+         /* ignore */
+         break;
+     }
+     case BAUM_REQ_GetDeviceIdentity:
+     {
+         uint8_t identity[17] = { BAUM_RSP_DeviceIdentity,
+             'B','a','u','m',' ','V','a','r','i','o' };
+         DPRINTF("GetDeviceIdentity\n");
+         identity[11] = '0' + baum->x / 10;
+         identity[12] = '0' + baum->x % 10;
+         baum_write_packet(baum, identity, sizeof(identity));
+         break;
+     }
+     case BAUM_REQ_GetVersionNumber:
+     {
+         uint8_t version[] = { BAUM_RSP_VersionNumber, 1 }; /* ? */
+         DPRINTF("GetVersionNumber\n");
+         baum_write_packet(baum, version, sizeof(version));
+         break;
+     }
+     case BAUM_REQ_GetSerialNumber:
+     {
+         uint8_t serial[] = { BAUM_RSP_SerialNumber,
+             '0','0','0','0','0','0','0','0' };
+         DPRINTF("GetSerialNumber\n");
+         baum_write_packet(baum, serial, sizeof(serial));
+         break;
+     }
+     case BAUM_REQ_GetKeys:
+     {
+         DPRINTF("Get%0#2x\n", req);
+         /* ignore */
+         break;
+     }
+     default:
+         DPRINTF("unrecognized request %0#2x\n", req);
+         do
+             if (!len--)
+                 return 0;
+         while (*cur++ != ESC);
+         cur--;
+         break;
+     }
+     return cur - buf;
+ }
+ /* The other end is writing some data.  Store it and try to interpret */
+ static int baum_write(CharDriverState *chr, const uint8_t *buf, int len)
+ {
+     BaumDriverState *baum = chr->opaque;
+     int tocopy, cur, eaten, orig_len = len;
+     if (!len)
+         return 0;
+     if (!baum->brlapi)
+         return len;
+     while (len) {
+         /* Complete our buffer as much as possible */
+         tocopy = len;
+         if (tocopy > BUF_SIZE - baum->in_buf_used)
+             tocopy = BUF_SIZE - baum->in_buf_used;
+         memcpy(baum->in_buf + baum->in_buf_used, buf, tocopy);
+         baum->in_buf_used += tocopy;
+         buf += tocopy;
+         len -= tocopy;
+         /* Interpret it as much as possible */
+         cur = 0;
+         while (cur < baum->in_buf_used &&
+                 (eaten = baum_eat_packet(baum, baum->in_buf + cur, baum->in_buf_used - cur)))
+             cur += eaten;
+         /* Shift the remainder */
+         if (cur) {
+             memmove(baum->in_buf, baum->in_buf + cur, baum->in_buf_used - cur);
+             baum->in_buf_used -= cur;
+         }
+         /* And continue if any data left */
+     }
+     return orig_len;
+ }
+ /* Send the key code to the other end */
+ static void baum_send_key(BaumDriverState *baum, uint8_t type, uint8_t value) {
+     uint8_t packet[] = { type, value };
+     DPRINTF("writing key %x %x\n", type, value);
+     baum_write_packet(baum, packet, sizeof(packet));
+ }
+ /* We got some data on the BrlAPI socket */
+ static void baum_chr_read(void *opaque)
+ {
+     BaumDriverState *baum = opaque;
+     brlapi_keyCode_t code;
+     int ret;
+     if (!baum->brlapi)
+         return;
+     while ((ret = brlapi__readKey(baum->brlapi, 0, &code)) == 1) {
+         DPRINTF("got key %"BRLAPI_PRIxKEYCODE"\n", code);
+         /* Emulate */
+         switch (code & BRLAPI_KEY_TYPE_MASK) {
+         case BRLAPI_KEY_TYPE_CMD:
+             switch (code & BRLAPI_KEY_CMD_BLK_MASK) {
+             case BRLAPI_KEY_CMD_ROUTE:
+                 baum_send_key(baum, BAUM_RSP_RoutingKey, (code & BRLAPI_KEY_CMD_ARG_MASK)+1);
+                 baum_send_key(baum, BAUM_RSP_RoutingKey, 0);
+                 break;
+             case 0:
+                 switch (code & BRLAPI_KEY_CMD_ARG_MASK) {
+                 case BRLAPI_KEY_CMD_FWINLT:
+                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL2);
+                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                     break;
+                 case BRLAPI_KEY_CMD_FWINRT:
+                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TR2);
+                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                     break;
+                 case BRLAPI_KEY_CMD_LNUP:
+                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TR1);
+                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                     break;
+                 case BRLAPI_KEY_CMD_LNDN:
+                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TR3);
+                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                     break;
+                 case BRLAPI_KEY_CMD_TOP:
+                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL1|BAUM_TR1);
+                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                     break;
+                 case BRLAPI_KEY_CMD_BOT:
+                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL3|BAUM_TR3);
+                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                     break;
+                 case BRLAPI_KEY_CMD_TOP_LEFT:
+                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL2|BAUM_TR1);
+                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                     break;
+                 case BRLAPI_KEY_CMD_BOT_LEFT:
+                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL2|BAUM_TR3);
+                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                     break;
+                 case BRLAPI_KEY_CMD_HOME:
+                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL2|BAUM_TR1|BAUM_TR3);
+                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                     break;
+                 case BRLAPI_KEY_CMD_PREFMENU:
+                     baum_send_key(baum, BAUM_RSP_TopKeys, BAUM_TL1|BAUM_TL3|BAUM_TR1);
+                     baum_send_key(baum, BAUM_RSP_TopKeys, 0);
+                     break;
+                 }
+             }
+             break;
+         case BRLAPI_KEY_TYPE_SYM:
+             break;
+         }
+     }
+     if (ret == -1 && (brlapi_errno != BRLAPI_ERROR_LIBCERR || errno != EINTR)) {
+         brlapi_perror("baum: brlapi_readKey");
+         brlapi__closeConnection(baum->brlapi);
+         g_free(baum->brlapi);
+         baum->brlapi = NULL;
+     }
+ }
+ static void baum_close(struct CharDriverState *chr)
+ {
+     BaumDriverState *baum = chr->opaque;
+     qemu_free_timer(baum->cellCount_timer);
+     if (baum->brlapi) {
+         brlapi__closeConnection(baum->brlapi);
+         g_free(baum->brlapi);
+     }
+     g_free(baum);
+ }
++static CharDriverState *chr_baum_init(QemuOpts *opts)
+ {
+     BaumDriverState *baum;
+     CharDriverState *chr;
+     brlapi_handle_t *handle;
+ #ifdef CONFIG_SDL
+     SDL_SysWMinfo info;
+ #endif
+     int tty;
+     baum = g_malloc0(sizeof(BaumDriverState));
+     baum->chr = chr = g_malloc0(sizeof(CharDriverState));
+     chr->opaque = baum;
+     chr->chr_write = baum_write;
+     chr->chr_accept_input = baum_accept_input;
+     chr->chr_close = baum_close;
+     handle = g_malloc0(brlapi_getHandleSize());
+     baum->brlapi = handle;
+     baum->brlapi_fd = brlapi__openConnection(handle, NULL, NULL);
+     if (baum->brlapi_fd == -1) {
+         brlapi_perror("baum_init: brlapi_openConnection");
+         goto fail_handle;
+     }
+     baum->cellCount_timer = qemu_new_timer_ns(vm_clock, baum_cellCount_timer_cb, baum);
+     if (brlapi__getDisplaySize(handle, &baum->x, &baum->y) == -1) {
+         brlapi_perror("baum_init: brlapi_getDisplaySize");
+         goto fail;
+     }
+ #ifdef CONFIG_SDL
+     memset(&info, 0, sizeof(info));
+     SDL_VERSION(&info.version);
+     if (SDL_GetWMInfo(&info))
+         tty = info.info.x11.wmwindow;
+     else
+ #endif
+         tty = BRLAPI_TTY_DEFAULT;
+     if (brlapi__enterTtyMode(handle, tty, NULL) == -1) {
+         brlapi_perror("baum_init: brlapi_enterTtyMode");
+         goto fail;
+     }
+     qemu_set_fd_handler(baum->brlapi_fd, baum_chr_read, NULL, baum);
+     qemu_chr_generic_open(chr);
+     return chr;
+ fail:
+     qemu_free_timer(baum->cellCount_timer);
+     brlapi__closeConnection(handle);
+ fail_handle:
+     g_free(handle);
+     g_free(chr);
+     g_free(baum);
+     return NULL;
+ }
++
++static void register_types(void)
++{
++    register_char_driver("braille", chr_baum_init);
++}
++
++type_init(register_types);
index 0000000000000000000000000000000000000000,bf2ff2aca86256e9e64b9e6f09029ead72330a1f..407ec8778451558193920fb0f0abe49a5919b345
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,78 +1,84 @@@
 -#include "char/msmouse.h"
+ /*
+  * QEMU Microsoft serial mouse emulation
+  *
+  * Copyright (c) 2008 Lubomir Rintel
+  *
+  * 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
+  * copies of the Software, and to permit persons to whom the Software is
+  * furnished to do so, subject to the following conditions:
+  *
+  * The above copyright notice and this permission notice shall be included in
+  * all copies or substantial portions of the Software.
+  *
+  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  * THE SOFTWARE.
+  */
+ #include <stdlib.h>
+ #include "qemu-common.h"
+ #include "char/char.h"
+ #include "ui/console.h"
 -CharDriverState *qemu_chr_open_msmouse(QemuOpts *opts)
+ #define MSMOUSE_LO6(n) ((n) & 0x3f)
+ #define MSMOUSE_HI2(n) (((n) & 0xc0) >> 6)
+ static void msmouse_event(void *opaque,
+                           int dx, int dy, int dz, int buttons_state)
+ {
+     CharDriverState *chr = (CharDriverState *)opaque;
+     unsigned char bytes[4] = { 0x40, 0x00, 0x00, 0x00 };
+     /* Movement deltas */
+     bytes[0] |= (MSMOUSE_HI2(dy) << 2) | MSMOUSE_HI2(dx);
+     bytes[1] |= MSMOUSE_LO6(dx);
+     bytes[2] |= MSMOUSE_LO6(dy);
+     /* Buttons */
+     bytes[0] |= (buttons_state & 0x01 ? 0x20 : 0x00);
+     bytes[0] |= (buttons_state & 0x02 ? 0x10 : 0x00);
+     bytes[3] |= (buttons_state & 0x04 ? 0x20 : 0x00);
+     /* We always send the packet of, so that we do not have to keep track
+        of previous state of the middle button. This can potentially confuse
+        some very old drivers for two button mice though. */
+     qemu_chr_be_write(chr, bytes, 4);
+ }
+ static int msmouse_chr_write (struct CharDriverState *s, const uint8_t *buf, int len)
+ {
+     /* Ignore writes to mouse port */
+     return len;
+ }
+ static void msmouse_chr_close (struct CharDriverState *chr)
+ {
+     g_free (chr);
+ }
++static CharDriverState *qemu_chr_open_msmouse(QemuOpts *opts)
+ {
+     CharDriverState *chr;
+     chr = g_malloc0(sizeof(CharDriverState));
+     chr->chr_write = msmouse_chr_write;
+     chr->chr_close = msmouse_chr_close;
+     qemu_add_mouse_event_handler(msmouse_event, chr, 0, "QEMU Microsoft Mouse");
+     return chr;
+ }
++
++static void register_types(void)
++{
++    register_char_driver("msmouse", qemu_chr_open_msmouse);
++}
++
++type_init(register_types);
diff --cc configure
Simple merge
diff --cc hw/a15mpcore.c
index 97abe413c884eb6307cc816393ad5e76eaf9c8d4,d973d53f0a4cb6417f0d471a323baaf5fc3e2870..648656d5b48b6911e382f7f214fb613ad97889f0
@@@ -18,8 -18,7 +18,8 @@@
   * with this program; if not, see <http://www.gnu.org/licenses/>.
   */
  
- #include "sysbus.h"
+ #include "hw/sysbus.h"
 +#include "sysemu/kvm.h"
  
  /* A15MP private memory region.  */
  
index 0e7df6098ad2088b7eb09b89b491ed12d6ecd134,aebbc866e24ecd847fef04a1f2dac9656a9d851f..2d9c69dfce2b208825f1e7b0391df2c5d081ed26
@@@ -10,28 -8,28 +8,30 @@@ obj-y += exynos4210_uart.o exynos4210_p
  obj-y += exynos4210_pmu.o exynos4210_mct.o exynos4210_fimd.o
  obj-y += exynos4210_rtc.o exynos4210_i2c.o
  obj-y += arm_mptimer.o a15mpcore.o
- obj-y += armv7m.o armv7m_nvic.o stellaris.o stellaris_enet.o
- obj-y += highbank.o
- obj-y += pxa2xx.o pxa2xx_pic.o pxa2xx_gpio.o pxa2xx_timer.o pxa2xx_dma.o
+ obj-y += armv7m_nvic.o stellaris_enet.o
+ obj-y += pxa2xx_timer.o pxa2xx_dma.o
  obj-y += pxa2xx_lcd.o pxa2xx_mmci.o pxa2xx_pcmcia.o pxa2xx_keypad.o
- obj-y += gumstix.o
- obj-y += zaurus.o ide/microdrive.o spitz.o tosa.o tc6393xb.o
- obj-y += omap1.o omap_lcdc.o omap_dma.o omap_clk.o omap_mmc.o omap_i2c.o \
+ obj-y += zaurus.o ide/microdrive.o tc6393xb.o
+ obj-y += omap_lcdc.o omap_dma.o omap_clk.o omap_mmc.o omap_i2c.o \
                  omap_gpio.o omap_intc.o omap_uart.o
- obj-y += omap2.o omap_dss.o soc_dma.o omap_gptimer.o omap_synctimer.o \
+ obj-y += omap_dss.o soc_dma.o omap_gptimer.o omap_synctimer.o \
                  omap_gpmc.o omap_sdrc.o omap_spi.o omap_tap.o omap_l4.o
- obj-y += omap_sx1.o palm.o tsc210x.o
- obj-y += nseries.o blizzard.o onenand.o cbus.o tusb6010.o usb/hcd-musb.o
- obj-y += mst_fpga.o mainstone.o
- obj-y += z2.o
- obj-y += musicpal.o bitbang_i2c.o marvell_88w8618_audio.o
+ obj-y += tsc210x.o
+ obj-y += blizzard.o onenand.o cbus.o tusb6010.o usb/hcd-musb.o
+ obj-y += mst_fpga.o
+ obj-y += bitbang_i2c.o marvell_88w8618_audio.o
  obj-y += framebuffer.o
- obj-y += vexpress.o
  obj-y += strongarm.o
- obj-y += collie.o
  obj-y += imx_serial.o imx_ccm.o imx_timer.o imx_avic.o
- obj-y += kzm.o
 +obj-$(CONFIG_FDT) += ../device_tree.o
 +obj-$(CONFIG_KVM) += kvm/arm_gic.o
  
  obj-y := $(addprefix ../,$(obj-y))
+ obj-y += boot.o collie.o exynos4_boards.o gumstix.o highbank.o
+ obj-y += integratorcp.o kzm.o mainstone.o musicpal.o nseries.o
+ obj-y += omap_sx1.o palm.o pic_cpu.o realview.o spitz.o stellaris.o
+ obj-y += tosa.o versatilepb.o vexpress.o xilinx_zynq.o z2.o
+ obj-y += armv7m.o exynos4210.o pxa2xx.o pxa2xx_gpio.o pxa2xx_pic.o
+ obj-y += omap1.o omap2.o
index 0000000000000000000000000000000000000000,a7ad893cc2f89b4fc0ac3a147813e39ad42982a6..82236006d2ad98d5f9820a8ec78962c2eff173d1
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,40 +1,66 @@@
+ /*
+  * Generic ARM Programmable Interrupt Controller support.
+  *
+  * Copyright (c) 2006 CodeSourcery.
+  * Written by Paul Brook
+  *
+  * This code is licensed under the LGPL
+  */
+ #include "hw/hw.h"
+ #include "hw/arm-misc.h"
++#include "sysemu/kvm.h"
+ /* Input 0 is IRQ and input 1 is FIQ.  */
+ static void arm_pic_cpu_handler(void *opaque, int irq, int level)
+ {
+     ARMCPU *cpu = opaque;
+     CPUARMState *env = &cpu->env;
+     switch (irq) {
+     case ARM_PIC_CPU_IRQ:
+         if (level)
+             cpu_interrupt(env, CPU_INTERRUPT_HARD);
+         else
+             cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
+         break;
+     case ARM_PIC_CPU_FIQ:
+         if (level)
+             cpu_interrupt(env, CPU_INTERRUPT_FIQ);
+         else
+             cpu_reset_interrupt(env, CPU_INTERRUPT_FIQ);
+         break;
+     default:
+         hw_error("arm_pic_cpu_handler: Bad interrupt line %d\n", irq);
+     }
+ }
++static void kvm_arm_pic_cpu_handler(void *opaque, int irq, int level)
++{
++#ifdef CONFIG_KVM
++    ARMCPU *cpu = opaque;
++    CPUState *cs = CPU(cpu);
++    int kvm_irq = KVM_ARM_IRQ_TYPE_CPU << KVM_ARM_IRQ_TYPE_SHIFT;
++
++    switch (irq) {
++    case ARM_PIC_CPU_IRQ:
++        kvm_irq |= KVM_ARM_IRQ_CPU_IRQ;
++        break;
++    case ARM_PIC_CPU_FIQ:
++        kvm_irq |= KVM_ARM_IRQ_CPU_FIQ;
++        break;
++    default:
++        hw_error("kvm_arm_pic_cpu_handler: Bad interrupt line %d\n", irq);
++    }
++    kvm_irq |= cs->cpu_index << KVM_ARM_IRQ_VCPU_SHIFT;
++    kvm_set_irq(kvm_state, kvm_irq, level ? 1 : 0);
++#endif
++}
++
+ qemu_irq *arm_pic_init_cpu(ARMCPU *cpu)
+ {
++    if (kvm_enabled()) {
++        return qemu_allocate_irqs(kvm_arm_pic_cpu_handler, cpu, 2);
++    }
+     return qemu_allocate_irqs(arm_pic_cpu_handler, cpu, 2);
+ }
diff --cc hw/arm_gic.c
Simple merge
Simple merge
Simple merge
Simple merge
index aa9b04078bb59296d4a40d3372231814265810d6,8319c94b766e979821a43389856ceeb1428bd89a..dfe5f9b9cdd3d4a5edfd76625beee50194c34f7a
  
  #include "trace.h"
  #include "qemu/iov.h"
 -#include "event-poll.h"
  #include "qemu/thread.h"
+ #include "qemu/error-report.h"
  #include "vring.h"
  #include "ioq.h"
  #include "migration/migration.h"
+ #include "block/block.h"
  #include "hw/virtio-blk.h"
 -#include "virtio-blk.h"
 +#include "hw/dataplane/virtio-blk.h"
 +#include "block/aio.h"
  
  enum {
      SEG_MAX = 126,                  /* maximum number of I/O segments */
diff --cc hw/e1000.c
Simple merge
index 0000000000000000000000000000000000000000,73a8656df82b25d03b181e47dc057fab194d3489..0ee3b3b806e2887a8b07a0d2166ec0231327dfc0
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,713 +1,717 @@@
+ /*
+  * QEMU PC System Emulator
+  *
+  * Copyright (c) 2003-2004 Fabrice Bellard
+  *
+  * 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
+  * copies of the Software, and to permit persons to whom the Software is
+  * furnished to do so, subject to the following conditions:
+  *
+  * The above copyright notice and this permission notice shall be included in
+  * all copies or substantial portions of the Software.
+  *
+  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  * THE SOFTWARE.
+  */
+ #include <glib.h>
+ #include "hw/hw.h"
+ #include "hw/pc.h"
+ #include "hw/apic.h"
+ #include "hw/pci/pci.h"
+ #include "hw/pci/pci_ids.h"
+ #include "hw/usb.h"
+ #include "net/net.h"
+ #include "hw/boards.h"
+ #include "hw/ide.h"
+ #include "sysemu/kvm.h"
+ #include "hw/kvm/clock.h"
+ #include "sysemu/sysemu.h"
+ #include "hw/sysbus.h"
+ #include "sysemu/arch_init.h"
+ #include "sysemu/blockdev.h"
+ #include "hw/smbus.h"
+ #include "hw/xen.h"
+ #include "exec/memory.h"
+ #include "exec/address-spaces.h"
+ #include "cpu.h"
+ #ifdef CONFIG_XEN
+ #  include <xen/hvm/hvm_info_table.h>
+ #endif
+ #define MAX_IDE_BUS 2
+ static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
+ static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
+ static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
+ /* PC hardware initialisation */
+ static void pc_init1(MemoryRegion *system_memory,
+                      MemoryRegion *system_io,
+                      ram_addr_t ram_size,
+                      const char *boot_device,
+                      const char *kernel_filename,
+                      const char *kernel_cmdline,
+                      const char *initrd_filename,
+                      const char *cpu_model,
+                      int pci_enabled,
+                      int kvmclock_enabled)
+ {
+     int i;
+     ram_addr_t below_4g_mem_size, above_4g_mem_size;
+     PCIBus *pci_bus;
+     ISABus *isa_bus;
+     PCII440FXState *i440fx_state;
+     int piix3_devfn = -1;
+     qemu_irq *cpu_irq;
+     qemu_irq *gsi;
+     qemu_irq *i8259;
+     qemu_irq *smi_irq;
+     GSIState *gsi_state;
+     DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
+     BusState *idebus[MAX_IDE_BUS];
+     ISADevice *rtc_state;
+     ISADevice *floppy;
+     MemoryRegion *ram_memory;
+     MemoryRegion *pci_memory;
+     MemoryRegion *rom_memory;
+     void *fw_cfg = NULL;
+     pc_cpus_init(cpu_model);
+     pc_acpi_init("acpi-dsdt.aml");
+     if (kvmclock_enabled) {
+         kvmclock_create();
+     }
+     if (ram_size >= 0xe0000000 ) {
+         above_4g_mem_size = ram_size - 0xe0000000;
+         below_4g_mem_size = 0xe0000000;
+     } else {
+         above_4g_mem_size = 0;
+         below_4g_mem_size = ram_size;
+     }
+     if (pci_enabled) {
+         pci_memory = g_new(MemoryRegion, 1);
+         memory_region_init(pci_memory, "pci", INT64_MAX);
+         rom_memory = pci_memory;
+     } else {
+         pci_memory = NULL;
+         rom_memory = system_memory;
+     }
+     /* allocate ram and load rom/bios */
+     if (!xen_enabled()) {
+         fw_cfg = pc_memory_init(system_memory,
+                        kernel_filename, kernel_cmdline, initrd_filename,
+                        below_4g_mem_size, above_4g_mem_size,
+                        rom_memory, &ram_memory);
+     }
+     gsi_state = g_malloc0(sizeof(*gsi_state));
+     if (kvm_irqchip_in_kernel()) {
+         kvm_pc_setup_irq_routing(pci_enabled);
+         gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
+                                  GSI_NUM_PINS);
+     } else {
+         gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
+     }
+     if (pci_enabled) {
+         pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, &isa_bus, gsi,
+                               system_memory, system_io, ram_size,
+                               below_4g_mem_size,
+                               0x100000000ULL - below_4g_mem_size,
+                               0x100000000ULL + above_4g_mem_size,
+                               (sizeof(hwaddr) == 4
+                                ? 0
+                                : ((uint64_t)1 << 62)),
+                               pci_memory, ram_memory);
+     } else {
+         pci_bus = NULL;
+         i440fx_state = NULL;
+         isa_bus = isa_bus_new(NULL, system_io);
+         no_hpet = 1;
+     }
+     isa_bus_irqs(isa_bus, gsi);
+     if (kvm_irqchip_in_kernel()) {
+         i8259 = kvm_i8259_init(isa_bus);
+     } else if (xen_enabled()) {
+         i8259 = xen_interrupt_controller_init();
+     } else {
+         cpu_irq = pc_allocate_cpu_irq();
+         i8259 = i8259_init(isa_bus, cpu_irq[0]);
+     }
+     for (i = 0; i < ISA_NUM_IRQS; i++) {
+         gsi_state->i8259_irq[i] = i8259[i];
+     }
+     if (pci_enabled) {
+         ioapic_init_gsi(gsi_state, "i440fx");
+     }
+     pc_register_ferr_irq(gsi[13]);
+     pc_vga_init(isa_bus, pci_enabled ? pci_bus : NULL);
+     if (xen_enabled()) {
+         pci_create_simple(pci_bus, -1, "xen-platform");
+     }
+     /* init basic PC hardware */
+     pc_basic_device_init(isa_bus, gsi, &rtc_state, &floppy, xen_enabled());
+     pc_nic_init(isa_bus, pci_bus);
+     ide_drive_get(hd, MAX_IDE_BUS);
+     if (pci_enabled) {
+         PCIDevice *dev;
+         if (xen_enabled()) {
+             dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1);
+         } else {
+             dev = pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1);
+         }
+         idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0");
+         idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1");
+     } else {
+         for(i = 0; i < MAX_IDE_BUS; i++) {
+             ISADevice *dev;
+             dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
+                                ide_irq[i],
+                                hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
+             idebus[i] = qdev_get_child_bus(&dev->qdev, "ide.0");
+         }
+     }
+     audio_init(isa_bus, pci_enabled ? pci_bus : NULL);
+     pc_cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device,
+                  floppy, idebus[0], idebus[1], rtc_state);
+     if (pci_enabled && usb_enabled(false)) {
+         pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci");
+     }
+     if (pci_enabled && acpi_enabled) {
+         i2c_bus *smbus;
+         smi_irq = qemu_allocate_irqs(pc_acpi_smi_interrupt, first_cpu, 1);
+         /* TODO: Populate SPD eeprom data.  */
+         smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
+                               gsi[9], *smi_irq,
+                               kvm_enabled(), fw_cfg);
+         smbus_eeprom_init(smbus, 8, NULL, 0);
+     }
+     if (pci_enabled) {
+         pc_pci_device_init(pci_bus);
+     }
+ }
+ static void pc_init_pci(QEMUMachineInitArgs *args)
+ {
+     ram_addr_t ram_size = args->ram_size;
+     const char *cpu_model = args->cpu_model;
+     const char *kernel_filename = args->kernel_filename;
+     const char *kernel_cmdline = args->kernel_cmdline;
+     const char *initrd_filename = args->initrd_filename;
+     const char *boot_device = args->boot_device;
+     pc_init1(get_system_memory(),
+              get_system_io(),
+              ram_size, boot_device,
+              kernel_filename, kernel_cmdline,
+              initrd_filename, cpu_model, 1, 1);
+ }
+ static void pc_init_pci_1_3(QEMUMachineInitArgs *args)
+ {
+     enable_compat_apic_id_mode();
+     pc_init_pci(args);
+ }
+ /* PC machine init function for pc-0.14 to pc-1.2 */
+ static void pc_init_pci_1_2(QEMUMachineInitArgs *args)
+ {
+     disable_kvm_pv_eoi();
+     pc_init_pci_1_3(args);
+ }
+ /* PC init function for pc-0.10 to pc-0.13, and reused by xenfv */
+ static void pc_init_pci_no_kvmclock(QEMUMachineInitArgs *args)
+ {
+     ram_addr_t ram_size = args->ram_size;
+     const char *cpu_model = args->cpu_model;
+     const char *kernel_filename = args->kernel_filename;
+     const char *kernel_cmdline = args->kernel_cmdline;
+     const char *initrd_filename = args->initrd_filename;
+     const char *boot_device = args->boot_device;
+     disable_kvm_pv_eoi();
+     enable_compat_apic_id_mode();
+     pc_init1(get_system_memory(),
+              get_system_io(),
+              ram_size, boot_device,
+              kernel_filename, kernel_cmdline,
+              initrd_filename, cpu_model, 1, 0);
+ }
+ static void pc_init_isa(QEMUMachineInitArgs *args)
+ {
+     ram_addr_t ram_size = args->ram_size;
+     const char *cpu_model = args->cpu_model;
+     const char *kernel_filename = args->kernel_filename;
+     const char *kernel_cmdline = args->kernel_cmdline;
+     const char *initrd_filename = args->initrd_filename;
+     const char *boot_device = args->boot_device;
+     if (cpu_model == NULL)
+         cpu_model = "486";
+     disable_kvm_pv_eoi();
+     enable_compat_apic_id_mode();
+     pc_init1(get_system_memory(),
+              get_system_io(),
+              ram_size, boot_device,
+              kernel_filename, kernel_cmdline,
+              initrd_filename, cpu_model, 0, 1);
+ }
+ #ifdef CONFIG_XEN
+ static void pc_xen_hvm_init(QEMUMachineInitArgs *args)
+ {
+     if (xen_hvm_init() != 0) {
+         hw_error("xen hardware virtual machine initialisation failed");
+     }
+     pc_init_pci_no_kvmclock(args);
+     xen_vcpu_init();
+ }
+ #endif
+ static QEMUMachine pc_i440fx_machine_v1_5 = {
+     .name = "pc-i440fx-1.5",
+     .alias = "pc",
+     .desc = "Standard PC (i440FX + PIIX, 1996)",
+     .init = pc_init_pci,
+     .max_cpus = 255,
+     .is_default = 1,
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ static QEMUMachine pc_i440fx_machine_v1_4 = {
+     .name = "pc-i440fx-1.4",
+     .desc = "Standard PC (i440FX + PIIX, 1996)",
+     .init = pc_init_pci,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_1_4,
+         { /* end of list */ }
+     },
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #define PC_COMPAT_1_3 \
+       PC_COMPAT_1_4, \
+         {\
+             .driver   = "usb-tablet",\
+             .property = "usb_version",\
+             .value    = stringify(1),\
+         },{\
+             .driver   = "virtio-net-pci",\
+             .property = "ctrl_mac_addr",\
+             .value    = "off",      \
+         },{ \
+             .driver   = "virtio-net-pci", \
+             .property = "mq", \
+             .value    = "off", \
++        }, {\
++            .driver   = "e1000",\
++            .property = "autonegotiation",\
++            .value    = "off",\
+         }
+ static QEMUMachine pc_machine_v1_3 = {
+     .name = "pc-1.3",
+     .desc = "Standard PC",
+     .init = pc_init_pci_1_3,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_1_3,
+         { /* end of list */ }
+     },
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #define PC_COMPAT_1_2 \
+         PC_COMPAT_1_3,\
+         {\
+             .driver   = "nec-usb-xhci",\
+             .property = "msi",\
+             .value    = "off",\
+         },{\
+             .driver   = "nec-usb-xhci",\
+             .property = "msix",\
+             .value    = "off",\
+         },{\
+             .driver   = "ivshmem",\
+             .property = "use64",\
+             .value    = "0",\
+         },{\
+             .driver   = "qxl",\
+             .property = "revision",\
+             .value    = stringify(3),\
+         },{\
+             .driver   = "qxl-vga",\
+             .property = "revision",\
+             .value    = stringify(3),\
+         },{\
+             .driver   = "VGA",\
+             .property = "mmio",\
+             .value    = "off",\
+         }
+ static QEMUMachine pc_machine_v1_2 = {
+     .name = "pc-1.2",
+     .desc = "Standard PC",
+     .init = pc_init_pci_1_2,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_1_2,
+         { /* end of list */ }
+     },
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #define PC_COMPAT_1_1 \
+         PC_COMPAT_1_2,\
+         {\
+             .driver   = "virtio-scsi-pci",\
+             .property = "hotplug",\
+             .value    = "off",\
+         },{\
+             .driver   = "virtio-scsi-pci",\
+             .property = "param_change",\
+             .value    = "off",\
+         },{\
+             .driver   = "VGA",\
+             .property = "vgamem_mb",\
+             .value    = stringify(8),\
+         },{\
+             .driver   = "vmware-svga",\
+             .property = "vgamem_mb",\
+             .value    = stringify(8),\
+         },{\
+             .driver   = "qxl-vga",\
+             .property = "vgamem_mb",\
+             .value    = stringify(8),\
+         },{\
+             .driver   = "qxl",\
+             .property = "vgamem_mb",\
+             .value    = stringify(8),\
+         },{\
+             .driver   = "virtio-blk-pci",\
+             .property = "config-wce",\
+             .value    = "off",\
+         }
+ static QEMUMachine pc_machine_v1_1 = {
+     .name = "pc-1.1",
+     .desc = "Standard PC",
+     .init = pc_init_pci_1_2,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_1_1,
+         { /* end of list */ }
+     },
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #define PC_COMPAT_1_0 \
+         PC_COMPAT_1_1,\
+         {\
+             .driver   = "pc-sysfw",\
+             .property = "rom_only",\
+             .value    = stringify(1),\
+         }, {\
+             .driver   = "isa-fdc",\
+             .property = "check_media_rate",\
+             .value    = "off",\
+         }, {\
+             .driver   = "virtio-balloon-pci",\
+             .property = "class",\
+             .value    = stringify(PCI_CLASS_MEMORY_RAM),\
+         },{\
+             .driver   = "apic",\
+             .property = "vapic",\
+             .value    = "off",\
+         },{\
+             .driver   = TYPE_USB_DEVICE,\
+             .property = "full-path",\
+             .value    = "no",\
+         }
+ static QEMUMachine pc_machine_v1_0 = {
+     .name = "pc-1.0",
+     .desc = "Standard PC",
+     .init = pc_init_pci_1_2,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_1_0,
+         { /* end of list */ }
+     },
+     .hw_version = "1.0",
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #define PC_COMPAT_0_15 \
+         PC_COMPAT_1_0
+ static QEMUMachine pc_machine_v0_15 = {
+     .name = "pc-0.15",
+     .desc = "Standard PC",
+     .init = pc_init_pci_1_2,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_0_15,
+         { /* end of list */ }
+     },
+     .hw_version = "0.15",
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #define PC_COMPAT_0_14 \
+         PC_COMPAT_0_15,\
+         {\
+             .driver   = "virtio-blk-pci",\
+             .property = "event_idx",\
+             .value    = "off",\
+         },{\
+             .driver   = "virtio-serial-pci",\
+             .property = "event_idx",\
+             .value    = "off",\
+         },{\
+             .driver   = "virtio-net-pci",\
+             .property = "event_idx",\
+             .value    = "off",\
+         },{\
+             .driver   = "virtio-balloon-pci",\
+             .property = "event_idx",\
+             .value    = "off",\
+         }
+ static QEMUMachine pc_machine_v0_14 = {
+     .name = "pc-0.14",
+     .desc = "Standard PC",
+     .init = pc_init_pci_1_2,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_0_14, 
+         {
+             .driver   = "qxl",
+             .property = "revision",
+             .value    = stringify(2),
+         },{
+             .driver   = "qxl-vga",
+             .property = "revision",
+             .value    = stringify(2),
+         },
+         { /* end of list */ }
+     },
+     .hw_version = "0.14",
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #define PC_COMPAT_0_13 \
+         PC_COMPAT_0_14,\
+         {\
+             .driver   = TYPE_PCI_DEVICE,\
+             .property = "command_serr_enable",\
+             .value    = "off",\
+         },{\
+             .driver   = "AC97",\
+             .property = "use_broken_id",\
+             .value    = stringify(1),\
+         }
+ static QEMUMachine pc_machine_v0_13 = {
+     .name = "pc-0.13",
+     .desc = "Standard PC",
+     .init = pc_init_pci_no_kvmclock,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_0_13,
+         {
+             .driver   = "virtio-9p-pci",
+             .property = "vectors",
+             .value    = stringify(0),
+         },{
+             .driver   = "VGA",
+             .property = "rombar",
+             .value    = stringify(0),
+         },{
+             .driver   = "vmware-svga",
+             .property = "rombar",
+             .value    = stringify(0),
+         },
+         { /* end of list */ }
+     },
+     .hw_version = "0.13",
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #define PC_COMPAT_0_12 \
+         PC_COMPAT_0_13,\
+         {\
+             .driver   = "virtio-serial-pci",\
+             .property = "max_ports",\
+             .value    = stringify(1),\
+         },{\
+             .driver   = "virtio-serial-pci",\
+             .property = "vectors",\
+             .value    = stringify(0),\
+         }
+ static QEMUMachine pc_machine_v0_12 = {
+     .name = "pc-0.12",
+     .desc = "Standard PC",
+     .init = pc_init_pci_no_kvmclock,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_0_12,
+         {
+             .driver   = "VGA",
+             .property = "rombar",
+             .value    = stringify(0),
+         },{
+             .driver   = "vmware-svga",
+             .property = "rombar",
+             .value    = stringify(0),
+         },
+         { /* end of list */ }
+     },
+     .hw_version = "0.12",
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #define PC_COMPAT_0_11 \
+         PC_COMPAT_0_12,\
+         {\
+             .driver   = "virtio-blk-pci",\
+             .property = "vectors",\
+             .value    = stringify(0),\
+         },{\
+             .driver   = TYPE_PCI_DEVICE,\
+             .property = "rombar",\
+             .value    = stringify(0),\
+         }
+ static QEMUMachine pc_machine_v0_11 = {
+     .name = "pc-0.11",
+     .desc = "Standard PC, qemu 0.11",
+     .init = pc_init_pci_no_kvmclock,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_0_11,
+         {
+             .driver   = "ide-drive",
+             .property = "ver",
+             .value    = "0.11",
+         },{
+             .driver   = "scsi-disk",
+             .property = "ver",
+             .value    = "0.11",
+         },
+         { /* end of list */ }
+     },
+     .hw_version = "0.11",
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ static QEMUMachine pc_machine_v0_10 = {
+     .name = "pc-0.10",
+     .desc = "Standard PC, qemu 0.10",
+     .init = pc_init_pci_no_kvmclock,
+     .max_cpus = 255,
+     .compat_props = (GlobalProperty[]) {
+         PC_COMPAT_0_11,
+         {
+             .driver   = "virtio-blk-pci",
+             .property = "class",
+             .value    = stringify(PCI_CLASS_STORAGE_OTHER),
+         },{
+             .driver   = "virtio-serial-pci",
+             .property = "class",
+             .value    = stringify(PCI_CLASS_DISPLAY_OTHER),
+         },{
+             .driver   = "virtio-net-pci",
+             .property = "vectors",
+             .value    = stringify(0),
+         },{
+             .driver   = "ide-drive",
+             .property = "ver",
+             .value    = "0.10",
+         },{
+             .driver   = "scsi-disk",
+             .property = "ver",
+             .value    = "0.10",
+         },
+         { /* end of list */ }
+     },
+     .hw_version = "0.10",
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ static QEMUMachine isapc_machine = {
+     .name = "isapc",
+     .desc = "ISA-only PC",
+     .init = pc_init_isa,
+     .max_cpus = 1,
+     .compat_props = (GlobalProperty[]) {
+         {
+             .driver   = "pc-sysfw",
+             .property = "rom_only",
+             .value    = stringify(1),
+         },
+         { /* end of list */ }
+     },
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #ifdef CONFIG_XEN
+ static QEMUMachine xenfv_machine = {
+     .name = "xenfv",
+     .desc = "Xen Fully-virtualized PC",
+     .init = pc_xen_hvm_init,
+     .max_cpus = HVM_MAX_VCPUS,
+     .default_machine_opts = "accel=xen",
+     DEFAULT_MACHINE_OPTIONS,
+ };
+ #endif
+ static void pc_machine_init(void)
+ {
+     qemu_register_machine(&pc_i440fx_machine_v1_5);
+     qemu_register_machine(&pc_i440fx_machine_v1_4);
+     qemu_register_machine(&pc_machine_v1_3);
+     qemu_register_machine(&pc_machine_v1_2);
+     qemu_register_machine(&pc_machine_v1_1);
+     qemu_register_machine(&pc_machine_v1_0);
+     qemu_register_machine(&pc_machine_v0_15);
+     qemu_register_machine(&pc_machine_v0_14);
+     qemu_register_machine(&pc_machine_v0_13);
+     qemu_register_machine(&pc_machine_v0_12);
+     qemu_register_machine(&pc_machine_v0_11);
+     qemu_register_machine(&pc_machine_v0_10);
+     qemu_register_machine(&isapc_machine);
+ #ifdef CONFIG_XEN
+     qemu_register_machine(&xenfv_machine);
+ #endif
+ }
+ machine_init(pc_machine_init);
diff --cc hw/ich9.h
Simple merge
diff --cc hw/lpc_ich9.c
Simple merge
diff --cc hw/macio.c
Simple merge
Simple merge
diff --cc hw/nand.c
Simple merge
diff --cc hw/pc.h
Simple merge
diff --cc hw/piix_pci.c
Simple merge
diff --cc hw/scsi-bus.c
Simple merge
diff --cc hw/scsi-disk.c
Simple merge
diff --cc hw/serial.c
Simple merge
diff --cc hw/serial.h
Simple merge
diff --cc hw/sysbus.c
Simple merge
diff --cc hw/sysbus.h
Simple merge
diff --cc hw/vhost.c
Simple merge
diff --cc hw/virtio-blk.c
Simple merge
Simple merge
diff --cc hw/virtio-net.c
Simple merge
diff --cc hw/virtio-pci.c
Simple merge
Simple merge
diff --cc vl.c
Simple merge