Merge remote-tracking branch 'kraxel/pixman.v3' into staging
authorAnthony Liguori <aliguori@us.ibm.com>
Thu, 1 Nov 2012 16:14:39 +0000 (11:14 -0500)
committerAnthony Liguori <aliguori@us.ibm.com>
Thu, 1 Nov 2012 16:14:39 +0000 (11:14 -0500)
* kraxel/pixman.v3: (22 commits)
  pixman: drop obsolete fields from DisplaySurface
  pixman/vnc: remove dead code.
  pixman/vnc: remove rgb_prepare_row* functions
  pixman/vnc: use pixman images in vnc.
  pixman: switch screendump function.
  vga: stop direct access to DisplaySurface fields.
  qxl: stop direct access to DisplaySurface fields.
  console: don't set PixelFormat alpha fields for 32bpp
  console: make qemu_alloc_display static
  pixman: add pixman image to DisplaySurface
  pixman: helper functions
  pixman: windup in configure & makefiles
  pixman: add submodule
  console: remove DisplayAllocator
  console: remove dpy_gfx_fill
  vga: fix text mode updating
  console: init displaychangelisteners on register
  console: untangle gfx & txt updates
  console: s/TextConsole/QemuConsole/
  console: move set_mouse + cursor_define callbacks
  ...

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
1  2 
Makefile
Makefile.objs
hw/nseries.c
hw/pl110.c
qemu-common.h
vl.c

diff --combined Makefile
+++ b/Makefile
@@@ -118,6 -118,15 +118,15 @@@ endi
  
  subdir-libcacard: $(oslib-obj-y) $(trace-obj-y) qemu-timer-common.o
  
+ subdir-pixman: pixman/Makefile
+       $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pixman V="$(V)" all,)
+ pixman/Makefile: $(SRC_PATH)/pixman/configure
+       (cd pixman; $(SRC_PATH)/pixman/configure --disable-shared --enable-static)
+ $(SRC_PATH)/pixman/configure:
+       (cd $(SRC_PATH)/pixman; autoreconf -v --install)
  $(filter %-softmmu,$(SUBDIR_RULES)): $(universal-obj-y) $(trace-obj-y) $(common-obj-y) $(extra-obj-y) subdir-libdis
  
  $(filter %-user,$(SUBDIR_RULES)): $(universal-obj-y) $(trace-obj-y) subdir-libdis-user subdir-libuser
@@@ -171,7 -180,8 +180,7 @@@ endi
  qemu-img.o: qemu-img-cmds.h
  
  tools-obj-y = $(oslib-obj-y) $(trace-obj-y) qemu-tool.o qemu-timer.o \
 -      qemu-timer-common.o main-loop.o notify.o \
 -      iohandler.o cutils.o iov.o async.o error.o
 +      main-loop.o iohandler.o error.o
  tools-obj-$(CONFIG_POSIX) += compatfd.o
  
  qemu-img$(EXESUF): qemu-img.o $(tools-obj-y) $(block-obj-y)
@@@ -180,7 -190,7 +189,7 @@@ qemu-io$(EXESUF): qemu-io.o cmd.o $(too
  
  qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o
  
 -vscclient$(EXESUF): $(libcacard-y) $(oslib-obj-y) $(trace-obj-y) $(tools-obj-y) qemu-timer-common.o libcacard/vscclient.o
 +vscclient$(EXESUF): $(libcacard-y) $(oslib-obj-y) $(trace-obj-y) libcacard/vscclient.o
        $(call quiet-command,$(CC) $(LDFLAGS) -o $@ $^ $(libcacard_libs) $(LIBS),"  LINK  $@")
  
  fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/virtio-9p-marshal.o oslib-posix.o $(trace-obj-y)
@@@ -223,7 -233,7 +232,7 @@@ $(SRC_PATH)/qapi-schema.json $(SRC_PATH
  QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qmp-commands.h)
  $(qga-obj-y) qemu-ga.o: $(QGALIB_GEN)
  
 -qemu-ga$(EXESUF): qemu-ga.o $(qga-obj-y) $(tools-obj-y) $(qapi-obj-y) $(qobject-obj-y) $(version-obj-y)
 +qemu-ga$(EXESUF): qemu-ga.o $(qga-obj-y) $(oslib-obj-y) $(trace-obj-y) $(qapi-obj-y) $(qobject-obj-y) $(version-obj-y)
  
  QEMULIBS=libuser libdis libdis-user
  
diff --combined Makefile.objs
@@@ -19,7 -19,7 +19,7 @@@ universal-obj-y += $(qom-obj-y
  
  #######################################################################
  # oslib-obj-y is code depending on the OS (win32 vs posix)
 -oslib-obj-y = osdep.o
 +oslib-obj-y = osdep.o cutils.o qemu-timer-common.o
  oslib-obj-$(CONFIG_WIN32) += oslib-win32.o qemu-thread-win32.o
  oslib-obj-$(CONFIG_POSIX) += oslib-posix.o qemu-thread-posix.o
  
@@@ -41,12 -41,12 +41,12 @@@ coroutine-obj-$(CONFIG_WIN32) += corout
  #######################################################################
  # block-obj-y is code used by both qemu system emulation and qemu-img
  
 -block-obj-y = cutils.o iov.o cache-utils.o qemu-option.o module.o async.o
 -block-obj-y += nbd.o block.o blockjob.o aio.o aes.o qemu-config.o
 -block-obj-y += qemu-progress.o qemu-sockets.o uri.o notify.o
 +block-obj-y = iov.o cache-utils.o qemu-option.o module.o async.o
 +block-obj-y += nbd.o block.o blockjob.o aes.o qemu-config.o
 +block-obj-y += thread-pool.o qemu-progress.o qemu-sockets.o uri.o notify.o
  block-obj-y += $(coroutine-obj-y) $(qobject-obj-y) $(version-obj-y)
 -block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
 -block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
 +block-obj-$(CONFIG_POSIX) += event_notifier-posix.o aio-posix.o
 +block-obj-$(CONFIG_WIN32) += event_notifier-win32.o aio-win32.o
  block-obj-y += block/
  block-obj-y += $(qapi-obj-y) qapi-types.o qapi-visit.o
  
@@@ -65,6 -65,7 +65,7 @@@ common-obj-y = $(block-obj-y) blockdev.
  common-obj-y += net.o net/
  common-obj-y += qom/
  common-obj-y += readline.o console.o cursor.o
+ common-obj-y += qemu-pixman.o
  common-obj-y += $(oslib-obj-y)
  common-obj-$(CONFIG_WIN32) += os-win32.o
  common-obj-$(CONFIG_POSIX) += os-posix.o
@@@ -92,8 -93,9 +93,8 @@@ common-obj-y += ui
  common-obj-y += bt-host.o bt-vhci.o
  
  common-obj-y += dma-helpers.o
 -common-obj-y += iov.o acl.o
 +common-obj-y += acl.o
  common-obj-$(CONFIG_POSIX) += compatfd.o
 -common-obj-y += event_notifier.o
  common-obj-y += qemu-timer.o qemu-timer-common.o
  common-obj-y += qtest.o
  common-obj-y += vl.o
@@@ -112,7 -114,7 +113,7 @@@ endi
  user-obj-y =
  user-obj-y += envlist.o path.o
  user-obj-y += tcg-runtime.o host-utils.o
 -user-obj-y += cutils.o iov.o cache-utils.o
 +user-obj-y += cache-utils.o
  user-obj-y += module.o
  user-obj-y += qemu-user.o
  user-obj-y += $(trace-obj-y)
@@@ -227,8 -229,9 +228,8 @@@ universal-obj-y += $(qapi-obj-y
  ######################################################################
  # guest agent
  
 -qga-obj-y = qga/ qemu-ga.o module.o
 -qga-obj-$(CONFIG_WIN32) += oslib-win32.o
 -qga-obj-$(CONFIG_POSIX) += oslib-posix.o qemu-sockets.o qemu-option.o
 +qga-obj-y = qga/ qemu-ga.o module.o qemu-tool.o
 +qga-obj-$(CONFIG_POSIX) += qemu-sockets.o qemu-option.o
  
  vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
  
diff --combined hw/nseries.c
@@@ -1284,15 -1284,17 +1284,15 @@@ static int n810_atag_setup(const struc
      return n8x0_atag_setup(p, 810);
  }
  
 -static void n8x0_init(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, struct arm_boot_info *binfo, int model)
 +static void n8x0_init(QEMUMachineInitArgs *args,
 +                      struct arm_boot_info *binfo, int model)
  {
      MemoryRegion *sysmem = get_system_memory();
      struct n800_s *s = (struct n800_s *) g_malloc0(sizeof(*s));
      int sdram_size = binfo->ram_size;
      DisplayState *ds;
  
 -    s->mpu = omap2420_mpu_init(sysmem, sdram_size, cpu_model);
 +    s->mpu = omap2420_mpu_init(sysmem, sdram_size, args->cpu_model);
  
      /* Setup peripherals
       *
          n8x0_usb_setup(s);
      }
  
 -    if (kernel_filename) {
 +    if (args->kernel_filename) {
          /* Or at the linux loader.  */
 -        binfo->kernel_filename = kernel_filename;
 -        binfo->kernel_cmdline = kernel_cmdline;
 -        binfo->initrd_filename = initrd_filename;
 +        binfo->kernel_filename = args->kernel_filename;
 +        binfo->kernel_cmdline = args->kernel_cmdline;
 +        binfo->initrd_filename = args->initrd_filename;
          arm_load_kernel(s->mpu->cpu, binfo);
  
          qemu_register_reset(n8x0_boot_init, s);
      }
  
 -    if (option_rom[0].name && (boot_device[0] == 'n' || !kernel_filename)) {
 +    if (option_rom[0].name &&
 +        (args->boot_device[0] == 'n' || !args->kernel_filename)) {
          int rom_size;
          uint8_t nolo_tags[0x10000];
          /* No, wait, better start at the ROM.  */
         size until the guest activates the display.  */
      ds = get_displaystate();
      ds->surface = qemu_resize_displaysurface(ds, 800, 480);
-     dpy_resize(ds);
+     dpy_gfx_resize(ds);
  }
  
  static struct arm_boot_info n800_binfo = {
@@@ -1399,12 -1400,28 +1399,12 @@@ static struct arm_boot_info n810_binfo 
  
  static void n800_init(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;
 -    return n8x0_init(ram_size, boot_device,
 -                    kernel_filename, kernel_cmdline, initrd_filename,
 -                    cpu_model, &n800_binfo, 800);
 +    return n8x0_init(args, &n800_binfo, 800);
  }
  
  static void n810_init(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;
 -    return n8x0_init(ram_size, boot_device,
 -                    kernel_filename, kernel_cmdline, initrd_filename,
 -                    cpu_model, &n810_binfo, 810);
 +    return n8x0_init(args, &n810_binfo, 810);
  }
  
  static QEMUMachine n800_machine = {
diff --combined hw/pl110.c
@@@ -239,7 -239,7 +239,7 @@@ static void pl110_update_display(void *
                                 fn, s->palette,
                                 &first, &last);
      if (first >= 0) {
-         dpy_update(s->ds, 0, first, s->cols, last - first + 1);
+         dpy_gfx_update(s->ds, 0, first, s->cols, last - first + 1);
      }
      s->invalidate = 0;
  }
@@@ -349,8 -349,7 +349,8 @@@ static uint64_t pl110_read(void *opaque
      case 12: /* LCDLPCURR */
          return s->lpbase;
      default:
 -        hw_error("pl110_read: Bad offset %x\n", (int)offset);
 +        qemu_log_mask(LOG_GUEST_ERROR,
 +                      "pl110_read: Bad offset %x\n", (int)offset);
          return 0;
      }
  }
@@@ -418,8 -417,7 +418,8 @@@ static void pl110_write(void *opaque, h
          pl110_update(s);
          break;
      default:
 -        hw_error("pl110_write: Bad offset %x\n", (int)offset);
 +        qemu_log_mask(LOG_GUEST_ERROR,
 +                      "pl110_write: Bad offset %x\n", (int)offset);
      }
  }
  
diff --combined qemu-common.h
@@@ -14,7 -14,6 +14,7 @@@
  
  typedef struct QEMUTimer QEMUTimer;
  typedef struct QEMUFile QEMUFile;
 +typedef struct QEMUBH QEMUBH;
  typedef struct DeviceState DeviceState;
  
  struct Monitor;
@@@ -168,6 -167,7 +168,6 @@@ int qemu_fls(int i)
  int qemu_fdatasync(int fd);
  int fcntl_setfl(int fd, int flag);
  int qemu_parse_fd(const char *param);
 -int qemu_parse_fdset(const char *param);
  
  /*
   * strtosz() suffixes used to specify the default treatment of an
@@@ -218,6 -218,7 +218,6 @@@ ssize_t qemu_recv_full(int fd, void *bu
      QEMU_WARN_UNUSED_RESULT;
  
  #ifndef _WIN32
 -int qemu_eventfd(int pipefd[2]);
  int qemu_pipe(int pipefd[2]);
  #endif
  
@@@ -261,10 -262,8 +261,8 @@@ typedef struct DriveInfo DriveInfo
  typedef struct DisplayState DisplayState;
  typedef struct DisplayChangeListener DisplayChangeListener;
  typedef struct DisplaySurface DisplaySurface;
- typedef struct DisplayAllocator DisplayAllocator;
  typedef struct PixelFormat PixelFormat;
- typedef struct TextConsole TextConsole;
- typedef TextConsole QEMUConsole;
+ typedef struct QemuConsole QemuConsole;
  typedef struct CharDriverState CharDriverState;
  typedef struct MACAddr MACAddr;
  typedef struct NetClientState NetClientState;
@@@ -323,7 -322,9 +321,7 @@@ void cpu_save(QEMUFile *f, void *opaque
  int cpu_load(QEMUFile *f, void *opaque, int version_id);
  
  /* Unblock cpu */
 -void qemu_cpu_kick(void *env);
  void qemu_cpu_kick_self(void);
 -int qemu_cpu_is_self(void *env);
  
  /* work queue */
  struct qemu_work_item {
diff --combined vl.c
--- 1/vl.c
--- 2/vl.c
+++ b/vl.c
@@@ -1359,19 -1359,51 +1359,51 @@@ static void gui_update(void *opaque
  {
      uint64_t interval = GUI_REFRESH_INTERVAL;
      DisplayState *ds = opaque;
-     DisplayChangeListener *dcl = ds->listeners;
+     DisplayChangeListener *dcl;
  
      dpy_refresh(ds);
  
-     while (dcl != NULL) {
+     QLIST_FOREACH(dcl, &ds->listeners, next) {
          if (dcl->gui_timer_interval &&
              dcl->gui_timer_interval < interval)
              interval = dcl->gui_timer_interval;
-         dcl = dcl->next;
      }
      qemu_mod_timer(ds->gui_timer, interval + qemu_get_clock_ms(rt_clock));
  }
  
+ void gui_setup_refresh(DisplayState *ds)
+ {
+     DisplayChangeListener *dcl;
+     bool need_timer = false;
+     bool have_gfx = false;
+     bool have_text = false;
+     QLIST_FOREACH(dcl, &ds->listeners, next) {
+         if (dcl->dpy_refresh != NULL) {
+             need_timer = true;
+         }
+         if (dcl->dpy_gfx_update != NULL) {
+             have_gfx = true;
+         }
+         if (dcl->dpy_text_update != NULL) {
+             have_text = true;
+         }
+     }
+     if (need_timer && ds->gui_timer == NULL) {
+         ds->gui_timer = qemu_new_timer_ms(rt_clock, gui_update, ds);
+         qemu_mod_timer(ds->gui_timer, qemu_get_clock_ms(rt_clock));
+     }
+     if (!need_timer && ds->gui_timer != NULL) {
+         qemu_del_timer(ds->gui_timer);
+         qemu_free_timer(ds->gui_timer);
+         ds->gui_timer = NULL;
+     }
+     ds->have_gfx = have_gfx;
+     ds->have_text = have_text;
+ }
  struct vm_change_state_entry {
      VMChangeStateHandler *cb;
      void *opaque;
@@@ -2441,6 -2473,11 +2473,6 @@@ static void free_and_trace(gpointer mem
      free(mem);
  }
  
 -int qemu_init_main_loop(void)
 -{
 -    return main_loop_init();
 -}
 -
  int main(int argc, char **argv, char **envp)
  {
      int i;
      const char *kernel_filename, *kernel_cmdline;
      char boot_devices[33] = "cad"; /* default to HD->floppy->CD-ROM */
      DisplayState *ds;
-     DisplayChangeListener *dcl;
      int cyls, heads, secs, translation;
      QemuOpts *hda_opts = NULL, *opts, *machine_opts;
      QemuOptsList *olist;
              case QEMU_OPTION_M:
                  machine = machine_parse(optarg);
                  break;
 +            case QEMU_OPTION_no_kvm_irqchip: {
 +                olist = qemu_find_opts("machine");
 +                qemu_opts_parse(olist, "kernel_irqchip=off", 0);
 +                break;
 +            }
              case QEMU_OPTION_cpu:
                  /* hw initialization will check this */
                  cpu_model = optarg;
                      machine = machine_parse(optarg);
                  }
                  break;
 +             case QEMU_OPTION_no_kvm:
 +                olist = qemu_find_opts("machine");
 +                qemu_opts_parse(olist, "accel=tcg", 0);
 +                break;
 +            case QEMU_OPTION_no_kvm_pit: {
 +                fprintf(stderr, "Warning: KVM PIT can no longer be disabled "
 +                                "separately.\n");
 +                break;
 +            }
 +            case QEMU_OPTION_no_kvm_pit_reinjection: {
 +                static GlobalProperty kvm_pit_lost_tick_policy[] = {
 +                    {
 +                        .driver   = "kvm-pit",
 +                        .property = "lost_tick_policy",
 +                        .value    = "discard",
 +                    },
 +                    { /* end of list */ }
 +                };
 +
 +                fprintf(stderr, "Warning: option deprecated, use "
 +                        "lost_tick_policy property of kvm-pit instead.\n");
 +                qdev_prop_register_global_list(kvm_pit_lost_tick_policy);
 +                break;
 +            }
              case QEMU_OPTION_usb:
                  machine_opts = qemu_opts_find(qemu_find_opts("machine"), 0);
                  if (machine_opts) {
              case QEMU_OPTION_semihosting:
                  semihosting_enabled = 1;
                  break;
 +            case QEMU_OPTION_tdf:
 +                fprintf(stderr, "Warning: user space PIT time drift fix "
 +                                "is no longer supported.\n");
 +                break;
              case QEMU_OPTION_name:
                  qemu_name = g_strdup(optarg);
                 {
      }
      loc_set_none();
  
 +    qemu_init_cpu_loop();
 +    if (qemu_init_main_loop()) {
 +        fprintf(stderr, "qemu_init_main_loop failed\n");
 +        exit(1);
 +    }
 +
      if (qemu_opts_foreach(qemu_find_opts("sandbox"), parse_sandbox, NULL, 0)) {
          exit(1);
      }
  
      configure_accelerator();
  
 -    qemu_init_cpu_loop();
 -    if (qemu_init_main_loop()) {
 -        fprintf(stderr, "qemu_init_main_loop failed\n");
 -        exit(1);
 -    }
 -
      machine_opts = qemu_opts_find(qemu_find_opts("machine"), 0);
      if (machine_opts) {
          kernel_filename = qemu_opt_get(machine_opts, "kernel");
  #endif
  
      /* display setup */
-     dpy_resize(ds);
-     dcl = ds->listeners;
-     while (dcl != NULL) {
-         if (dcl->dpy_refresh != NULL) {
-             ds->gui_timer = qemu_new_timer_ms(rt_clock, gui_update, ds);
-             qemu_mod_timer(ds->gui_timer, qemu_get_clock_ms(rt_clock));
-             break;
-         }
-         dcl = dcl->next;
-     }
      text_consoles_set_display(ds);
  
      if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {