]> git.proxmox.com Git - mirror_qemu.git/commitdiff
Merge branch 'trivial-patches' of git://github.com/stefanha/qemu
authorBlue Swirl <blauwirbel@gmail.com>
Sat, 3 Nov 2012 12:55:05 +0000 (12:55 +0000)
committerBlue Swirl <blauwirbel@gmail.com>
Sat, 3 Nov 2012 12:55:05 +0000 (12:55 +0000)
* 'trivial-patches' of git://github.com/stefanha/qemu:
  pc: Drop redundant test for ROM memory region
  exec: make some functions static
  target-ppc: make some functions static
  ppc: add missing static
  vnc: add missing static
  vl.c: add missing static
  target-sparc: make do_unaligned_access static
  m68k: Return semihosting errno values correctly
  cadence_uart: More debug information

Conflicts:
target-m68k/m68k-semi.c

1  2 
console.h
exec-all.h
exec.c
hw/ppc.c
target-ppc/cpu.h
target-sparc/cpu.h
ui/vnc-jobs.c
ui/vnc.c
ui/vnc.h
vl.c

diff --combined console.h
index 33ad69b48ca32caacc3076f316130b5db32dfcdb,5ad361510a2467980b547123eba5a700047c6a78..0df033d674064d03862468693e375957e5c43136
+++ b/console.h
@@@ -2,7 -2,6 +2,7 @@@
  #define CONSOLE_H
  
  #include "qemu-char.h"
 +#include "qemu-pixman.h"
  #include "qdict.h"
  #include "notify.h"
  #include "monitor.h"
@@@ -108,6 -107,7 +108,6 @@@ void kbd_put_keysym(int keysym)
  
  #define QEMU_BIG_ENDIAN_FLAG    0x01
  #define QEMU_ALLOCATED_FLAG     0x02
 -#define QEMU_REALPIXELS_FLAG    0x04
  
  struct PixelFormat {
      uint8_t bits_per_pixel;
  };
  
  struct DisplaySurface {
 +    pixman_format_code_t format;
 +    pixman_image_t *image;
      uint8_t flags;
 -    int width;
 -    int height;
 -    int linesize;        /* bytes per line */
 -    uint8_t *data;
  
      struct PixelFormat pf;
  };
@@@ -152,32 -154,35 +152,32 @@@ struct DisplayChangeListener 
      int idle;
      uint64_t gui_timer_interval;
  
 -    void (*dpy_update)(struct DisplayState *s, int x, int y, int w, int h);
 -    void (*dpy_resize)(struct DisplayState *s);
 -    void (*dpy_setdata)(struct DisplayState *s);
      void (*dpy_refresh)(struct DisplayState *s);
 -    void (*dpy_copy)(struct DisplayState *s, int src_x, int src_y,
 -                     int dst_x, int dst_y, int w, int h);
 -    void (*dpy_fill)(struct DisplayState *s, int x, int y,
 -                     int w, int h, uint32_t c);
 +
 +    void (*dpy_gfx_update)(struct DisplayState *s, int x, int y, int w, int h);
 +    void (*dpy_gfx_resize)(struct DisplayState *s);
 +    void (*dpy_gfx_setdata)(struct DisplayState *s);
 +    void (*dpy_gfx_copy)(struct DisplayState *s, int src_x, int src_y,
 +                         int dst_x, int dst_y, int w, int h);
 +
      void (*dpy_text_cursor)(struct DisplayState *s, int x, int y);
 +    void (*dpy_text_resize)(struct DisplayState *s, int w, int h);
 +    void (*dpy_text_update)(struct DisplayState *s, int x, int y, int w, int h);
  
 -    struct DisplayChangeListener *next;
 -};
 +    void (*dpy_mouse_set)(struct DisplayState *s, int x, int y, int on);
 +    void (*dpy_cursor_define)(struct DisplayState *s, QEMUCursor *cursor);
  
 -struct DisplayAllocator {
 -    DisplaySurface* (*create_displaysurface)(int width, int height);
 -    DisplaySurface* (*resize_displaysurface)(DisplaySurface *surface, int width, int height);
 -    void (*free_displaysurface)(DisplaySurface *surface);
 +    QLIST_ENTRY(DisplayChangeListener) next;
  };
  
  struct DisplayState {
      struct DisplaySurface *surface;
      void *opaque;
      struct QEMUTimer *gui_timer;
 +    bool have_gfx;
 +    bool have_text;
  
 -    struct DisplayAllocator* allocator;
 -    struct DisplayChangeListener* listeners;
 -
 -    void (*mouse_set)(int x, int y, int on);
 -    void (*cursor_define)(QEMUCursor *cursor);
 +    QLIST_HEAD(, DisplayChangeListener) listeners;
  
      struct DisplayState *next;
  };
@@@ -186,195 -191,143 +186,195 @@@ void register_displaystate(DisplayStat
  DisplayState *get_displaystate(void);
  DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp,
                                                  int linesize, uint8_t *data);
 -void qemu_alloc_display(DisplaySurface *surface, int width, int height,
 -                        int linesize, PixelFormat pf, int newflags);
  PixelFormat qemu_different_endianness_pixelformat(int bpp);
  PixelFormat qemu_default_pixelformat(int bpp);
  
 -DisplayAllocator *register_displayallocator(DisplayState *ds, DisplayAllocator *da);
 +DisplaySurface *qemu_create_displaysurface(DisplayState *ds,
 +                                           int width, int height);
 +DisplaySurface *qemu_resize_displaysurface(DisplayState *ds,
 +                                           int width, int height);
 +void qemu_free_displaysurface(DisplayState *ds);
  
 -static inline DisplaySurface* qemu_create_displaysurface(DisplayState *ds, int width, int height)
 +static inline int is_surface_bgr(DisplaySurface *surface)
  {
 -    return ds->allocator->create_displaysurface(width, height);    
 +    if (surface->pf.bits_per_pixel == 32 && surface->pf.rshift == 0)
 +        return 1;
 +    else
 +        return 0;
  }
  
 -static inline DisplaySurface* qemu_resize_displaysurface(DisplayState *ds, int width, int height)
 +static inline int is_buffer_shared(DisplaySurface *surface)
  {
 -    trace_displaysurface_resize(ds, ds->surface, width, height);
 -    return ds->allocator->resize_displaysurface(ds->surface, width, height);
 +    return !(surface->flags & QEMU_ALLOCATED_FLAG);
  }
  
 -static inline void qemu_free_displaysurface(DisplayState *ds)
 +void gui_setup_refresh(DisplayState *ds);
 +
 +static inline void register_displaychangelistener(DisplayState *ds, DisplayChangeListener *dcl)
  {
 -    trace_displaysurface_free(ds, ds->surface);
 -    ds->allocator->free_displaysurface(ds->surface);
 +    QLIST_INSERT_HEAD(&ds->listeners, dcl, next);
 +    gui_setup_refresh(ds);
 +    if (dcl->dpy_gfx_resize) {
 +        dcl->dpy_gfx_resize(ds);
 +    }
  }
  
 -static inline int is_surface_bgr(DisplaySurface *surface)
 +static inline void unregister_displaychangelistener(DisplayState *ds,
 +                                                    DisplayChangeListener *dcl)
  {
 -    if (surface->pf.bits_per_pixel == 32 && surface->pf.rshift == 0)
 -        return 1;
 -    else
 -        return 0;
 +    QLIST_REMOVE(dcl, next);
 +    gui_setup_refresh(ds);
  }
  
 -static inline int is_buffer_shared(DisplaySurface *surface)
 +static inline void dpy_gfx_update(DisplayState *s, int x, int y, int w, int h)
  {
 -    return (!(surface->flags & QEMU_ALLOCATED_FLAG) &&
 -            !(surface->flags & QEMU_REALPIXELS_FLAG));
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_gfx_update) {
 +            dcl->dpy_gfx_update(s, x, y, w, h);
 +        }
 +    }
  }
  
 -static inline void register_displaychangelistener(DisplayState *ds, DisplayChangeListener *dcl)
 +static inline void dpy_gfx_resize(DisplayState *s)
  {
 -    dcl->next = ds->listeners;
 -    ds->listeners = dcl;
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_gfx_resize) {
 +            dcl->dpy_gfx_resize(s);
 +        }
 +    }
  }
  
 -static inline void dpy_update(DisplayState *s, int x, int y, int w, int h)
 +static inline void dpy_gfx_setdata(DisplayState *s)
  {
 -    struct DisplayChangeListener *dcl = s->listeners;
 -    while (dcl != NULL) {
 -        dcl->dpy_update(s, x, y, w, h);
 -        dcl = dcl->next;
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_gfx_setdata) {
 +            dcl->dpy_gfx_setdata(s);
 +        }
      }
  }
  
 -static inline void dpy_resize(DisplayState *s)
 +static inline void dpy_refresh(DisplayState *s)
  {
 -    struct DisplayChangeListener *dcl = s->listeners;
 -    while (dcl != NULL) {
 -        dcl->dpy_resize(s);
 -        dcl = dcl->next;
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_refresh) {
 +            dcl->dpy_refresh(s);
 +        }
      }
  }
  
 -static inline void dpy_setdata(DisplayState *s)
 +static inline void dpy_gfx_copy(struct DisplayState *s, int src_x, int src_y,
 +                             int dst_x, int dst_y, int w, int h)
  {
 -    struct DisplayChangeListener *dcl = s->listeners;
 -    while (dcl != NULL) {
 -        if (dcl->dpy_setdata) dcl->dpy_setdata(s);
 -        dcl = dcl->next;
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_gfx_copy) {
 +            dcl->dpy_gfx_copy(s, src_x, src_y, dst_x, dst_y, w, h);
 +        } else { /* TODO */
 +            dcl->dpy_gfx_update(s, dst_x, dst_y, w, h);
 +        }
      }
  }
  
 -static inline void dpy_refresh(DisplayState *s)
 +static inline void dpy_text_cursor(struct DisplayState *s, int x, int y)
  {
 -    struct DisplayChangeListener *dcl = s->listeners;
 -    while (dcl != NULL) {
 -        if (dcl->dpy_refresh) dcl->dpy_refresh(s);
 -        dcl = dcl->next;
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_text_cursor) {
 +            dcl->dpy_text_cursor(s, x, y);
 +        }
      }
  }
  
 -static inline void dpy_copy(struct DisplayState *s, int src_x, int src_y,
 -                             int dst_x, int dst_y, int w, int h) {
 -    struct DisplayChangeListener *dcl = s->listeners;
 -    while (dcl != NULL) {
 -        if (dcl->dpy_copy)
 -            dcl->dpy_copy(s, src_x, src_y, dst_x, dst_y, w, h);
 -        else /* TODO */
 -            dcl->dpy_update(s, dst_x, dst_y, w, h);
 -        dcl = dcl->next;
 +static inline void dpy_text_update(DisplayState *s, int x, int y, int w, int h)
 +{
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_text_update) {
 +            dcl->dpy_text_update(s, x, y, w, h);
 +        }
      }
  }
  
 -static inline void dpy_fill(struct DisplayState *s, int x, int y,
 -                             int w, int h, uint32_t c) {
 -    struct DisplayChangeListener *dcl = s->listeners;
 -    while (dcl != NULL) {
 -        if (dcl->dpy_fill) dcl->dpy_fill(s, x, y, w, h, c);
 -        dcl = dcl->next;
 +static inline void dpy_text_resize(DisplayState *s, int w, int h)
 +{
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_text_resize) {
 +            dcl->dpy_text_resize(s, w, h);
 +        }
      }
  }
  
 -static inline void dpy_cursor(struct DisplayState *s, int x, int y) {
 -    struct DisplayChangeListener *dcl = s->listeners;
 -    while (dcl != NULL) {
 -        if (dcl->dpy_text_cursor) dcl->dpy_text_cursor(s, x, y);
 -        dcl = dcl->next;
 +static inline void dpy_mouse_set(struct DisplayState *s, int x, int y, int on)
 +{
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_mouse_set) {
 +            dcl->dpy_mouse_set(s, x, y, on);
 +        }
      }
  }
  
 +static inline void dpy_cursor_define(struct DisplayState *s, QEMUCursor *cursor)
 +{
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_cursor_define) {
 +            dcl->dpy_cursor_define(s, cursor);
 +        }
 +    }
 +}
 +
 +static inline bool dpy_cursor_define_supported(struct DisplayState *s)
 +{
 +    struct DisplayChangeListener *dcl;
 +    QLIST_FOREACH(dcl, &s->listeners, next) {
 +        if (dcl->dpy_cursor_define) {
 +            return true;
 +        }
 +    }
 +    return false;
 +}
 +
  static inline int ds_get_linesize(DisplayState *ds)
  {
 -    return ds->surface->linesize;
 +    return pixman_image_get_stride(ds->surface->image);
  }
  
  static inline uint8_t* ds_get_data(DisplayState *ds)
  {
 -    return ds->surface->data;
 +    return (void *)pixman_image_get_data(ds->surface->image);
  }
  
  static inline int ds_get_width(DisplayState *ds)
  {
 -    return ds->surface->width;
 +    return pixman_image_get_width(ds->surface->image);
  }
  
  static inline int ds_get_height(DisplayState *ds)
  {
 -    return ds->surface->height;
 +    return pixman_image_get_height(ds->surface->image);
  }
  
  static inline int ds_get_bits_per_pixel(DisplayState *ds)
  {
 -    return ds->surface->pf.bits_per_pixel;
 +    int bits = PIXMAN_FORMAT_BPP(ds->surface->format);
 +    return bits;
  }
  
  static inline int ds_get_bytes_per_pixel(DisplayState *ds)
  {
 -    return ds->surface->pf.bytes_per_pixel;
 +    int bits = PIXMAN_FORMAT_BPP(ds->surface->format);
 +    return (bits + 7) / 8;
 +}
 +
 +static inline pixman_format_code_t ds_get_format(DisplayState *ds)
 +{
 +    return ds->surface->format;
  }
  
  #ifdef CONFIG_CURSES
@@@ -424,10 -377,8 +424,8 @@@ void cocoa_display_init(DisplayState *d
  
  /* vnc.c */
  void vnc_display_init(DisplayState *ds);
- void vnc_display_close(DisplayState *ds);
  void vnc_display_open(DisplayState *ds, const char *display, Error **errp);
  void vnc_display_add_client(DisplayState *ds, int csock, int skipauth);
- int vnc_display_disable_login(DisplayState *ds);
  char *vnc_display_local_addr(DisplayState *ds);
  #ifdef CONFIG_VNC
  int vnc_display_password(DisplayState *ds, const char *password);
diff --combined exec-all.h
index ad6d22b6c56c16aa6dfab045de122a3ff91416b1,8db47f5c9b939370831370955eb0b5c6bd1c9f45..898fe2d8628a757e9ed59225adebb680dd3b90b1
@@@ -194,8 -194,6 +194,6 @@@ static inline unsigned int tb_phys_hash
  
  void tb_free(TranslationBlock *tb);
  void tb_flush(CPUArchState *env);
- void tb_link_page(TranslationBlock *tb,
-                   tb_page_addr_t phys_pc, tb_page_addr_t phys_page2);
  void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr);
  
  extern TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE];
@@@ -310,42 -308,6 +308,42 @@@ extern uintptr_t tci_tb_ptr
  # define GETPC() ((uintptr_t)__builtin_return_address(0) - 1)
  #endif
  
 +#if defined(CONFIG_QEMU_LDST_OPTIMIZATION) && defined(CONFIG_SOFTMMU)
 +/* qemu_ld/st optimization split code generation to fast and slow path, thus,
 +   it needs special handling for an MMU helper which is called from the slow
 +   path, to get the fast path's pc without any additional argument.
 +   It uses a tricky solution which embeds the fast path pc into the slow path.
 +
 +   Code flow in slow path:
 +   (1) pre-process
 +   (2) call MMU helper
 +   (3) jump to (5)
 +   (4) fast path information (implementation specific)
 +   (5) post-process (e.g. stack adjust)
 +   (6) jump to corresponding code of the next of fast path
 + */
 +# if defined(__i386__) || defined(__x86_64__)
 +/* To avoid broken disassembling, long jmp is used for embedding fast path pc,
 +   so that the destination is the next code of fast path, though this jmp is
 +   never executed.
 +
 +   call MMU helper
 +   jmp POST_PROC (2byte)    <- GETRA()
 +   jmp NEXT_CODE (5byte)
 +   POST_PROCESS ...         <- GETRA() + 7
 + */
 +#  define GETRA() ((uintptr_t)__builtin_return_address(0))
 +#  define GETPC_LDST() ((uintptr_t)(GETRA() + 7 + \
 +                                    *(int32_t *)((void *)GETRA() + 3) - 1))
 +# else
 +#  error "CONFIG_QEMU_LDST_OPTIMIZATION needs GETPC_LDST() implementation!"
 +# endif
 +bool is_tcg_gen_code(uintptr_t pc_ptr);
 +# define GETPC_EXT() (is_tcg_gen_code(GETRA()) ? GETPC_LDST() : GETPC())
 +#else
 +# define GETPC_EXT() GETPC()
 +#endif
 +
  #if !defined(CONFIG_USER_ONLY)
  
  struct MemoryRegion *iotlb_to_region(hwaddr index);
diff --combined exec.c
index 8bff743a623a2e0c371954a53ea20255f07139b9,42cc0975e61b2005b3124a0f87b2e0c48581ab6c..af94f9cd86a4dced74c84b183cc3216eab1fc230
--- 1/exec.c
--- 2/exec.c
+++ b/exec.c
@@@ -188,9 -188,12 +188,12 @@@ static unsigned phys_map_nodes_nb, phys
  
  static void io_mem_init(void);
  static void memory_map_init(void);
+ static void *qemu_safe_ram_ptr(ram_addr_t addr);
  
  static MemoryRegion io_mem_watch;
  #endif
+ static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc,
+                          tb_page_addr_t phys_page2);
  
  /* statistics */
  static int tb_flush_count;
@@@ -689,9 -692,6 +692,9 @@@ CPUArchState *qemu_get_cpu(int cpu
  
  void cpu_exec_init(CPUArchState *env)
  {
 +#ifndef CONFIG_USER_ONLY
 +    CPUState *cpu = ENV_GET_CPU(env);
 +#endif
      CPUArchState **penv;
      int cpu_index;
  
      QTAILQ_INIT(&env->breakpoints);
      QTAILQ_INIT(&env->watchpoints);
  #ifndef CONFIG_USER_ONLY
 -    env->thread_id = qemu_get_thread_id();
 +    cpu->thread_id = qemu_get_thread_id();
  #endif
      *penv = env;
  #if defined(CONFIG_USER_ONLY)
@@@ -1352,8 -1352,8 +1355,8 @@@ static inline void tb_alloc_page(Transl
  
  /* add a new TB and link it to the physical page tables. phys_page2 is
     (-1) to indicate that only one page contains the TB. */
void tb_link_page(TranslationBlock *tb,
-                   tb_page_addr_t phys_pc, tb_page_addr_t phys_page2)
static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc,
+                          tb_page_addr_t phys_page2)
  {
      unsigned int h;
      TranslationBlock **ptb;
      mmap_unlock();
  }
  
 +#if defined(CONFIG_QEMU_LDST_OPTIMIZATION) && defined(CONFIG_SOFTMMU)
 +/* check whether the given addr is in TCG generated code buffer or not */
 +bool is_tcg_gen_code(uintptr_t tc_ptr)
 +{
 +    /* This can be called during code generation, code_gen_buffer_max_size
 +       is used instead of code_gen_ptr for upper boundary checking */
 +    return (tc_ptr >= (uintptr_t)code_gen_buffer &&
 +            tc_ptr < (uintptr_t)(code_gen_buffer + code_gen_buffer_max_size));
 +}
 +#endif
 +
  /* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
     tb[1].tc_ptr. Return NULL if not found */
  TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
@@@ -1707,7 -1696,6 +1710,7 @@@ static void cpu_unlink_tb(CPUArchState 
  /* mask must never be zero, except for A20 change call */
  static void tcg_handle_interrupt(CPUArchState *env, int mask)
  {
 +    CPUState *cpu = ENV_GET_CPU(env);
      int old_mask;
  
      old_mask = env->interrupt_request;
       * If called from iothread context, wake the target cpu in
       * case its halted.
       */
 -    if (!qemu_cpu_is_self(env)) {
 -        qemu_cpu_kick(env);
 +    if (!qemu_cpu_is_self(cpu)) {
 +        qemu_cpu_kick(cpu);
          return;
      }
  
@@@ -1874,7 -1862,7 +1877,7 @@@ void cpu_physical_memory_reset_dirty(ra
      }
  }
  
- int cpu_physical_memory_set_dirty_tracking(int enable)
static int cpu_physical_memory_set_dirty_tracking(int enable)
  {
      int ret = 0;
      in_migration = enable;
@@@ -2756,7 -2744,7 +2759,7 @@@ void *qemu_get_ram_ptr(ram_addr_t addr
  /* Return a host pointer to ram allocated with qemu_ram_alloc.
   * Same as qemu_get_ram_ptr but avoid reordering ramblocks.
   */
- void *qemu_safe_ram_ptr(ram_addr_t addr)
static void *qemu_safe_ram_ptr(ram_addr_t addr)
  {
      RAMBlock *block;
  
  
  /* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
   * but takes a size argument */
- void *qemu_ram_ptr_length(ram_addr_t addr, ram_addr_t *size)
static void *qemu_ram_ptr_length(ram_addr_t addr, ram_addr_t *size)
  {
      if (*size == 0) {
          return NULL;
@@@ -3534,7 -3522,7 +3537,7 @@@ void *cpu_register_map_client(void *opa
      return client;
  }
  
- void cpu_unregister_map_client(void *_client)
static void cpu_unregister_map_client(void *_client)
  {
      MapClient *client = (MapClient *)_client;
  
diff --combined hw/ppc.c
index fa7ae74f0d06104cfb28735cf35ab032f02b82c2,e4a0a3e822ce247313dc0127902dd33bc17c1150..11fd199eaab4b9ef25605c824abe207500c7bd1e
+++ b/hw/ppc.c
@@@ -75,10 -75,9 +75,10 @@@ void ppc_set_irq(CPUPPCState *env, int 
  }
  
  /* PowerPC 6xx / 7xx internal IRQ controller */
 -static void ppc6xx_set_irq (void *opaque, int pin, int level)
 +static void ppc6xx_set_irq(void *opaque, int pin, int level)
  {
 -    CPUPPCState *env = opaque;
 +    PowerPCCPU *cpu = opaque;
 +    CPUPPCState *env = &cpu->env;
      int cur_level;
  
      LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
      }
  }
  
 -void ppc6xx_irq_init (CPUPPCState *env)
 +void ppc6xx_irq_init(CPUPPCState *env)
  {
 -    env->irq_inputs = (void **)qemu_allocate_irqs(&ppc6xx_set_irq, env,
 +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
 +
 +    env->irq_inputs = (void **)qemu_allocate_irqs(&ppc6xx_set_irq, cpu,
                                                    PPC6xx_INPUT_NB);
  }
  
  #if defined(TARGET_PPC64)
  /* PowerPC 970 internal IRQ controller */
 -static void ppc970_set_irq (void *opaque, int pin, int level)
 +static void ppc970_set_irq(void *opaque, int pin, int level)
  {
 -    CPUPPCState *env = opaque;
 +    PowerPCCPU *cpu = opaque;
 +    CPUPPCState *env = &cpu->env;
      int cur_level;
  
      LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
              } else {
                  LOG_IRQ("%s: restart the CPU\n", __func__);
                  env->halted = 0;
 -                qemu_cpu_kick(env);
 +                qemu_cpu_kick(CPU(cpu));
              }
              break;
          case PPC970_INPUT_HRESET:
      }
  }
  
 -void ppc970_irq_init (CPUPPCState *env)
 +void ppc970_irq_init(CPUPPCState *env)
  {
 -    env->irq_inputs = (void **)qemu_allocate_irqs(&ppc970_set_irq, env,
 +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
 +
 +    env->irq_inputs = (void **)qemu_allocate_irqs(&ppc970_set_irq, cpu,
                                                    PPC970_INPUT_NB);
  }
  
  /* POWER7 internal IRQ controller */
 -static void power7_set_irq (void *opaque, int pin, int level)
 +static void power7_set_irq(void *opaque, int pin, int level)
  {
 -    CPUPPCState *env = opaque;
 +    PowerPCCPU *cpu = opaque;
 +    CPUPPCState *env = &cpu->env;
  
      LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
                  env, pin, level);
      }
  }
  
 -void ppcPOWER7_irq_init (CPUPPCState *env)
 +void ppcPOWER7_irq_init(CPUPPCState *env)
  {
 -    env->irq_inputs = (void **)qemu_allocate_irqs(&power7_set_irq, env,
 +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
 +
 +    env->irq_inputs = (void **)qemu_allocate_irqs(&power7_set_irq, cpu,
                                                    POWER7_INPUT_NB);
  }
  #endif /* defined(TARGET_PPC64) */
  
  /* PowerPC 40x internal IRQ controller */
 -static void ppc40x_set_irq (void *opaque, int pin, int level)
 +static void ppc40x_set_irq(void *opaque, int pin, int level)
  {
 -    CPUPPCState *env = opaque;
 +    PowerPCCPU *cpu = opaque;
 +    CPUPPCState *env = &cpu->env;
      int cur_level;
  
      LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
              } else {
                  LOG_IRQ("%s: restart the CPU\n", __func__);
                  env->halted = 0;
 -                qemu_cpu_kick(env);
 +                qemu_cpu_kick(CPU(cpu));
              }
              break;
          case PPC40x_INPUT_DEBUG:
      }
  }
  
 -void ppc40x_irq_init (CPUPPCState *env)
 +void ppc40x_irq_init(CPUPPCState *env)
  {
 +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
 +
      env->irq_inputs = (void **)qemu_allocate_irqs(&ppc40x_set_irq,
 -                                                  env, PPC40x_INPUT_NB);
 +                                                  cpu, PPC40x_INPUT_NB);
  }
  
  /* PowerPC E500 internal IRQ controller */
 -static void ppce500_set_irq (void *opaque, int pin, int level)
 +static void ppce500_set_irq(void *opaque, int pin, int level)
  {
 -    CPUPPCState *env = opaque;
 +    PowerPCCPU *cpu = opaque;
 +    CPUPPCState *env = &cpu->env;
      int cur_level;
  
      LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
      }
  }
  
 -void ppce500_irq_init (CPUPPCState *env)
 +void ppce500_irq_init(CPUPPCState *env)
  {
 +    PowerPCCPU *cpu = ppc_env_get_cpu(env);
 +
      env->irq_inputs = (void **)qemu_allocate_irqs(&ppce500_set_irq,
 -                                        env, PPCE500_INPUT_NB);
 +                                                  cpu, PPCE500_INPUT_NB);
  }
  /*****************************************************************************/
  /* PowerPC time base and decrementer emulation */
@@@ -736,7 -721,7 +736,7 @@@ static void cpu_ppc_hdecr_cb (void *opa
      _cpu_ppc_store_hdecr(opaque, 0x00000000, 0xFFFFFFFF, 1);
  }
  
void cpu_ppc_store_purr (CPUPPCState *env, uint64_t value)
static void cpu_ppc_store_purr(CPUPPCState *env, uint64_t value)
  {
      ppc_tb_t *tb_env = env->tb_env;
  
@@@ -1167,23 -1152,23 +1167,23 @@@ static inline void nvram_write (nvram_
      (*nvram->write_fn)(nvram->opaque, addr, val);
  }
  
void NVRAM_set_byte (nvram_t *nvram, uint32_t addr, uint8_t value)
static void NVRAM_set_byte(nvram_t *nvram, uint32_t addr, uint8_t value)
  {
      nvram_write(nvram, addr, value);
  }
  
uint8_t NVRAM_get_byte (nvram_t *nvram, uint32_t addr)
static uint8_t NVRAM_get_byte(nvram_t *nvram, uint32_t addr)
  {
      return nvram_read(nvram, addr);
  }
  
void NVRAM_set_word (nvram_t *nvram, uint32_t addr, uint16_t value)
static void NVRAM_set_word(nvram_t *nvram, uint32_t addr, uint16_t value)
  {
      nvram_write(nvram, addr, value >> 8);
      nvram_write(nvram, addr + 1, value & 0xFF);
  }
  
uint16_t NVRAM_get_word (nvram_t *nvram, uint32_t addr)
static uint16_t NVRAM_get_word(nvram_t *nvram, uint32_t addr)
  {
      uint16_t tmp;
  
      return tmp;
  }
  
void NVRAM_set_lword (nvram_t *nvram, uint32_t addr, uint32_t value)
static void NVRAM_set_lword(nvram_t *nvram, uint32_t addr, uint32_t value)
  {
      nvram_write(nvram, addr, value >> 24);
      nvram_write(nvram, addr + 1, (value >> 16) & 0xFF);
@@@ -1213,8 -1198,8 +1213,8 @@@ uint32_t NVRAM_get_lword (nvram_t *nvra
      return tmp;
  }
  
void NVRAM_set_string (nvram_t *nvram, uint32_t addr,
-                        const char *str, uint32_t max)
static void NVRAM_set_string(nvram_t *nvram, uint32_t addr, const char *str,
+                              uint32_t max)
  {
      int i;
  
diff --combined target-ppc/cpu.h
index c3cbad737180665f0eb1f48b68dfc0158919e4ac,bb5b0a4a998c1a2632345d0cd58c2c0f72db83e4..5f1dc8b7d508337900d2686f198f943b2dbd8a62
@@@ -963,7 -963,7 +963,7 @@@ struct CPUPPCState 
      /* floating point registers */
      float64 fpr[32];
      /* floating point status and control register */
 -    uint32_t fpscr;
 +    target_ulong fpscr;
  
      /* Next instruction pointer */
      target_ulong nip;
      /* Altivec registers */
      ppc_avr_t avr[32];
      uint32_t vscr;
 +    /* VSX registers */
 +    uint64_t vsr[32];
      /* SPE registers */
      uint64_t spe_acc;
      uint32_t spe_fscr;
  #endif
  
  #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
 -    hwaddr vpa_addr;
 -    hwaddr slb_shadow_addr, slb_shadow_size;
 -    hwaddr dtl_addr, dtl_size;
 +    uint64_t vpa_addr;
 +    uint64_t slb_shadow_addr, slb_shadow_size;
 +    uint64_t dtl_addr, dtl_size;
  #endif /* TARGET_PPC64 */
  
      int error_code;
@@@ -1142,10 -1140,6 +1142,6 @@@ int cpu_ppc_signal_handler (int host_si
  int cpu_ppc_handle_mmu_fault (CPUPPCState *env, target_ulong address, int rw,
                                int mmu_idx);
  #define cpu_handle_mmu_fault cpu_ppc_handle_mmu_fault
- #if !defined(CONFIG_USER_ONLY)
- int get_physical_address (CPUPPCState *env, mmu_ctx_t *ctx, target_ulong vaddr,
-                           int rw, int access_type);
- #endif
  void do_interrupt (CPUPPCState *env);
  void ppc_hw_interrupt (CPUPPCState *env);
  
@@@ -1179,7 -1173,6 +1175,6 @@@ void cpu_ppc_store_decr (CPUPPCState *e
  uint32_t cpu_ppc_load_hdecr (CPUPPCState *env);
  void cpu_ppc_store_hdecr (CPUPPCState *env, uint32_t value);
  uint64_t cpu_ppc_load_purr (CPUPPCState *env);
- void cpu_ppc_store_purr (CPUPPCState *env, uint64_t value);
  uint32_t cpu_ppc601_load_rtcl (CPUPPCState *env);
  uint32_t cpu_ppc601_load_rtcu (CPUPPCState *env);
  #if !defined(CONFIG_USER_ONLY)
@@@ -1191,8 -1184,6 +1186,6 @@@ void store_40x_dbcr0 (CPUPPCState *env
  void store_40x_sler (CPUPPCState *env, uint32_t val);
  void store_booke_tcr (CPUPPCState *env, target_ulong val);
  void store_booke_tsr (CPUPPCState *env, target_ulong val);
- void booke206_flush_tlb(CPUPPCState *env, int flags, const int check_iprot);
- hwaddr booke206_tlb_to_page_size(CPUPPCState *env, ppcmas_tlb_t *tlb);
  int ppcmas_tlb_check(CPUPPCState *env, ppcmas_tlb_t *tlb,
                       hwaddr *raddrp, target_ulong address,
                       uint32_t pid);
@@@ -2222,12 -2213,10 +2215,12 @@@ static inline bool msr_is_64bit(CPUPPCS
      return msr & (1ULL << MSR_SF);
  }
  
 -extern void (*cpu_ppc_hypercall)(CPUPPCState *);
 +extern void (*cpu_ppc_hypercall)(PowerPCCPU *);
  
 -static inline bool cpu_has_work(CPUPPCState *env)
 +static inline bool cpu_has_work(CPUState *cpu)
  {
 +    CPUPPCState *env = &POWERPC_CPU(cpu)->env;
 +
      return msr_ee && (env->interrupt_request & CPU_INTERRUPT_HARD);
  }
  
diff --combined target-sparc/cpu.h
index 6aa82b371a109fe009a2545b6c42de714589e352,7c689ee3bb9c1c61aabba493b297ec9c8360d7a8..042d52a31033674f9b3fbdc2d3ca7c325e117616
@@@ -711,9 -711,6 +711,6 @@@ uint64_t cpu_tick_get_count(CPUTimer *t
  void cpu_tick_set_limit(CPUTimer *timer, uint64_t limit);
  trap_state* cpu_tsptr(CPUSPARCState* env);
  #endif
- void QEMU_NORETURN do_unaligned_access(CPUSPARCState *env, target_ulong addr,
-                                        int is_write, int is_user,
-                                        uintptr_t retaddr);
  void cpu_restore_state2(CPUSPARCState *env, uintptr_t retaddr);
  
  #define TB_FLAG_FPU_ENABLED (1 << 4)
@@@ -764,10 -761,8 +761,10 @@@ static inline bool tb_am_enabled(int tb
  #endif
  }
  
 -static inline bool cpu_has_work(CPUSPARCState *env1)
 +static inline bool cpu_has_work(CPUState *cpu)
  {
 +    CPUSPARCState *env1 = &SPARC_CPU(cpu)->env;
 +
      return (env1->interrupt_request & CPU_INTERRUPT_HARD) &&
             cpu_interrupts_enabled(env1);
  }
diff --combined ui/vnc-jobs.c
index 04f139b56f942c7920e87b709b2d89a613db14ed,dfe482dc0fd0ca60edcf5939f100ef2fffafa395..57c091683b3803024616e2038192416c037af2d9
@@@ -187,8 -187,7 +187,8 @@@ static void vnc_async_encoding_start(Vn
      local->vd = orig->vd;
      local->lossy_rect = orig->lossy_rect;
      local->write_pixels = orig->write_pixels;
 -    local->clientds = orig->clientds;
 +    local->client_pf = orig->client_pf;
 +    local->client_be = orig->client_be;
      local->tight = orig->tight;
      local->zlib = orig->zlib;
      local->hextile = orig->hextile;
@@@ -321,6 -320,11 +321,11 @@@ static void *vnc_worker_thread(void *ar
      return NULL;
  }
  
+ static bool vnc_worker_thread_running(void)
+ {
+     return queue; /* Check global queue */
+ }
  void vnc_start_worker_thread(void)
  {
      VncJobQueue *q;
      queue = q; /* Set global queue */
  }
  
- bool vnc_worker_thread_running(void)
- {
-     return queue; /* Check global queue */
- }
  void vnc_stop_worker_thread(void)
  {
      if (!vnc_worker_thread_running())
diff --combined ui/vnc.c
index 7c120e6f061baed27acd3e3a665ea40d1941bf2c,d95e6ef5f316421ce5e184d25d84893a1d51baa8..61f120e315710aba9cfb31cf7ad776fe6a5b45a0
+++ b/ui/vnc.c
@@@ -436,8 -436,6 +436,8 @@@ static void vnc_dpy_update(DisplayStat
      int i;
      VncDisplay *vd = ds->opaque;
      struct VncSurface *s = &vd->guest;
 +    int width = ds_get_width(ds);
 +    int height = ds_get_height(ds);
  
      h += y;
  
      w += (x % 16);
      x -= (x % 16);
  
 -    x = MIN(x, s->ds->width);
 -    y = MIN(y, s->ds->height);
 -    w = MIN(x + w, s->ds->width) - x;
 -    h = MIN(h, s->ds->height);
 +    x = MIN(x, width);
 +    y = MIN(y, height);
 +    w = MIN(x + w, width) - x;
 +    h = MIN(h, height);
  
      for (; y < h; y++)
          for (i = 0; i < w; i += 16)
@@@ -481,12 -479,12 +481,12 @@@ void buffer_reserve(Buffer *buffer, siz
      }
  }
  
- int buffer_empty(Buffer *buffer)
static int buffer_empty(Buffer *buffer)
  {
      return buffer->offset == 0;
  }
  
- uint8_t *buffer_end(Buffer *buffer)
static uint8_t *buffer_end(Buffer *buffer)
  {
      return buffer->buffer + buffer->offset;
  }
@@@ -552,21 -550,6 +552,21 @@@ static void vnc_abort_display_jobs(VncD
      }
  }
  
 +int vnc_server_fb_stride(VncDisplay *vd)
 +{
 +    return pixman_image_get_stride(vd->server);
 +}
 +
 +void *vnc_server_fb_ptr(VncDisplay *vd, int x, int y)
 +{
 +    uint8_t *ptr;
 +
 +    ptr  = (uint8_t *)pixman_image_get_data(vd->server);
 +    ptr += y * vnc_server_fb_stride(vd);
 +    ptr += x * VNC_SERVER_FB_BYTES;
 +    return ptr;
 +}
 +
  static void vnc_dpy_resize(DisplayState *ds)
  {
      VncDisplay *vd = ds->opaque;
      vnc_abort_display_jobs(vd);
  
      /* server surface */
 -    if (!vd->server)
 -        vd->server = g_malloc0(sizeof(*vd->server));
 -    if (vd->server->data)
 -        g_free(vd->server->data);
 -    *(vd->server) = *(ds->surface);
 -    vd->server->data = g_malloc0(vd->server->linesize *
 -                                    vd->server->height);
 +    qemu_pixman_image_unref(vd->server);
 +    vd->server = pixman_image_create_bits(VNC_SERVER_FB_FORMAT,
 +                                          ds_get_width(ds),
 +                                          ds_get_height(ds),
 +                                          NULL, 0);
  
      /* guest surface */
 -    if (!vd->guest.ds)
 -        vd->guest.ds = g_malloc0(sizeof(*vd->guest.ds));
 +#if 0 /* FIXME */
      if (ds_get_bytes_per_pixel(ds) != vd->guest.ds->pf.bytes_per_pixel)
          console_color_init(ds);
 -    *(vd->guest.ds) = *(ds->surface);
 +#endif
 +    qemu_pixman_image_unref(vd->guest.fb);
 +    vd->guest.fb = pixman_image_ref(ds->surface->image);
 +    vd->guest.format = ds->surface->format;
      memset(vd->guest.dirty, 0xFF, sizeof(vd->guest.dirty));
  
      QTAILQ_FOREACH(vs, &vd->clients, next) {
  }
  
  /* fastest code */
 -static void vnc_write_pixels_copy(VncState *vs, struct PixelFormat *pf,
 +static void vnc_write_pixels_copy(VncState *vs,
                                    void *pixels, int size)
  {
      vnc_write(vs, pixels, size);
  void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v)
  {
      uint8_t r, g, b;
 -    VncDisplay *vd = vs->vd;
  
 -    r = ((((v & vd->server->pf.rmask) >> vd->server->pf.rshift) << vs->clientds.pf.rbits) >>
 -        vd->server->pf.rbits);
 -    g = ((((v & vd->server->pf.gmask) >> vd->server->pf.gshift) << vs->clientds.pf.gbits) >>
 -        vd->server->pf.gbits);
 -    b = ((((v & vd->server->pf.bmask) >> vd->server->pf.bshift) << vs->clientds.pf.bbits) >>
 -        vd->server->pf.bbits);
 -    v = (r << vs->clientds.pf.rshift) |
 -        (g << vs->clientds.pf.gshift) |
 -        (b << vs->clientds.pf.bshift);
 -    switch(vs->clientds.pf.bytes_per_pixel) {
 +#if VNC_SERVER_FB_FORMAT == PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
 +    r = (((v & 0x00ff0000) >> 16) << vs->client_pf.rbits) >> 8;
 +    g = (((v & 0x0000ff00) >>  8) << vs->client_pf.gbits) >> 8;
 +    b = (((v & 0x000000ff) >>  0) << vs->client_pf.bbits) >> 8;
 +#else
 +# error need some bits here if you change VNC_SERVER_FB_FORMAT
 +#endif
 +    v = (r << vs->client_pf.rshift) |
 +        (g << vs->client_pf.gshift) |
 +        (b << vs->client_pf.bshift);
 +    switch (vs->client_pf.bytes_per_pixel) {
      case 1:
          buf[0] = v;
          break;
      case 2:
 -        if (vs->clientds.flags & QEMU_BIG_ENDIAN_FLAG) {
 +        if (vs->client_be) {
              buf[0] = v >> 8;
              buf[1] = v;
          } else {
          break;
      default:
      case 4:
 -        if (vs->clientds.flags & QEMU_BIG_ENDIAN_FLAG) {
 +        if (vs->client_be) {
              buf[0] = v >> 24;
              buf[1] = v >> 16;
              buf[2] = v >> 8;
      }
  }
  
 -static void vnc_write_pixels_generic(VncState *vs, struct PixelFormat *pf,
 +static void vnc_write_pixels_generic(VncState *vs,
                                       void *pixels1, int size)
  {
      uint8_t buf[4];
  
 -    if (pf->bytes_per_pixel == 4) {
 +    if (VNC_SERVER_FB_BYTES == 4) {
          uint32_t *pixels = pixels1;
          int n, i;
          n = size >> 2;
 -        for(i = 0; i < n; i++) {
 -            vnc_convert_pixel(vs, buf, pixels[i]);
 -            vnc_write(vs, buf, vs->clientds.pf.bytes_per_pixel);
 -        }
 -    } else if (pf->bytes_per_pixel == 2) {
 -        uint16_t *pixels = pixels1;
 -        int n, i;
 -        n = size >> 1;
 -        for(i = 0; i < n; i++) {
 +        for (i = 0; i < n; i++) {
              vnc_convert_pixel(vs, buf, pixels[i]);
 -            vnc_write(vs, buf, vs->clientds.pf.bytes_per_pixel);
 +            vnc_write(vs, buf, vs->client_pf.bytes_per_pixel);
          }
 -    } else if (pf->bytes_per_pixel == 1) {
 -        uint8_t *pixels = pixels1;
 -        int n, i;
 -        n = size;
 -        for(i = 0; i < n; i++) {
 -            vnc_convert_pixel(vs, buf, pixels[i]);
 -            vnc_write(vs, buf, vs->clientds.pf.bytes_per_pixel);
 -        }
 -    } else {
 -        fprintf(stderr, "vnc_write_pixels_generic: VncState color depth not supported\n");
      }
  }
  
@@@ -675,10 -676,10 +675,10 @@@ int vnc_raw_send_framebuffer_update(Vnc
      uint8_t *row;
      VncDisplay *vd = vs->vd;
  
 -    row = vd->server->data + y * ds_get_linesize(vs->ds) + x * ds_get_bytes_per_pixel(vs->ds);
 +    row = vnc_server_fb_ptr(vd, x, y);
      for (i = 0; i < h; i++) {
 -        vs->write_pixels(vs, &vd->server->pf, row, w * ds_get_bytes_per_pixel(vs->ds));
 -        row += ds_get_linesize(vs->ds);
 +        vs->write_pixels(vs, row, w * VNC_SERVER_FB_BYTES);
 +        row += vnc_server_fb_stride(vd);
      }
      return 1;
  }
@@@ -735,7 -736,7 +735,7 @@@ static void vnc_dpy_copy(DisplayState *
      VncState *vs, *vn;
      uint8_t *src_row;
      uint8_t *dst_row;
 -    int i,x,y,pitch,depth,inc,w_lim,s;
 +    int i, x, y, pitch, inc, w_lim, s;
      int cmp_bytes;
  
      vnc_refresh_server_surface(vd);
      }
  
      /* do bitblit op on the local surface too */
 -    pitch = ds_get_linesize(vd->ds);
 -    depth = ds_get_bytes_per_pixel(vd->ds);
 -    src_row = vd->server->data + pitch * src_y + depth * src_x;
 -    dst_row = vd->server->data + pitch * dst_y + depth * dst_x;
 +    pitch = vnc_server_fb_stride(vd);
 +    src_row = vnc_server_fb_ptr(vd, src_x, src_y);
 +    dst_row = vnc_server_fb_ptr(vd, dst_x, dst_y);
      y = dst_y;
      inc = 1;
      if (dst_y > src_y) {
              } else {
                  s = 16;
              }
 -            cmp_bytes = s * depth;
 +            cmp_bytes = s * VNC_SERVER_FB_BYTES;
              if (memcmp(src_row, dst_row, cmp_bytes) == 0)
                  continue;
              memmove(dst_row, src_row, cmp_bytes);
                  }
              }
          }
 -        src_row += pitch - w * depth;
 -        dst_row += pitch - w * depth;
 +        src_row += pitch - w * VNC_SERVER_FB_BYTES;
 +        dst_row += pitch - w * VNC_SERVER_FB_BYTES;
          y += inc;
      }
  
      }
  }
  
 -static void vnc_mouse_set(int x, int y, int visible)
 +static void vnc_mouse_set(DisplayState *ds, int x, int y, int visible)
  {
      /* can we ask the client(s) to move the pointer ??? */
  }
  static int vnc_cursor_define(VncState *vs)
  {
      QEMUCursor *c = vs->vd->cursor;
 -    PixelFormat pf = qemu_default_pixelformat(32);
      int isize;
  
      if (vnc_has_feature(vs, VNC_FEATURE_RICH_CURSOR)) {
          vnc_write_u16(vs, 1);  /*  # of rects  */
          vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height,
                                 VNC_ENCODING_RICH_CURSOR);
 -        isize = c->width * c->height * vs->clientds.pf.bytes_per_pixel;
 -        vnc_write_pixels_generic(vs, &pf, c->data, isize);
 +        isize = c->width * c->height * vs->client_pf.bytes_per_pixel;
 +        vnc_write_pixels_generic(vs, c->data, isize);
          vnc_write(vs, vs->vd->cursor_mask, vs->vd->cursor_msize);
          vnc_unlock_output(vs);
          return 0;
      return -1;
  }
  
 -static void vnc_dpy_cursor_define(QEMUCursor *c)
 +static void vnc_dpy_cursor_define(DisplayState *ds, QEMUCursor *c)
  {
      VncDisplay *vd = vnc_display;
      VncState *vs;
@@@ -895,8 -898,8 +895,8 @@@ static int vnc_update_client(VncState *
           */
          job = vnc_job_new(vs);
  
 -        width = MIN(vd->server->width, vs->client_width);
 -        height = MIN(vd->server->height, vs->client_height);
 +        width = MIN(pixman_image_get_width(vd->server), vs->client_width);
 +        height = MIN(pixman_image_get_height(vd->server), vs->client_height);
  
          for (y = 0; y < height; y++) {
              int x;
@@@ -1373,17 -1376,17 +1373,17 @@@ void vnc_flush(VncState *vs
      vnc_unlock_output(vs);
  }
  
- uint8_t read_u8(uint8_t *data, size_t offset)
static uint8_t read_u8(uint8_t *data, size_t offset)
  {
      return data[offset];
  }
  
- uint16_t read_u16(uint8_t *data, size_t offset)
static uint16_t read_u16(uint8_t *data, size_t offset)
  {
      return ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF);
  }
  
- int32_t read_s32(uint8_t *data, size_t offset)
static int32_t read_s32(uint8_t *data, size_t offset)
  {
      return (int32_t)((data[offset] << 24) | (data[offset + 1] << 16) |
                       (data[offset + 2] << 8) | data[offset + 3]);
@@@ -1858,9 -1861,9 +1858,9 @@@ static void set_encodings(VncState *vs
  
  static void set_pixel_conversion(VncState *vs)
  {
 -    if ((vs->clientds.flags & QEMU_BIG_ENDIAN_FLAG) ==
 -        (vs->ds->surface->flags & QEMU_BIG_ENDIAN_FLAG) && 
 -        !memcmp(&(vs->clientds.pf), &(vs->ds->surface->pf), sizeof(PixelFormat))) {
 +    pixman_format_code_t fmt = qemu_pixman_get_format(&vs->client_pf);
 +
 +    if (fmt == VNC_SERVER_FB_FORMAT) {
          vs->write_pixels = vnc_write_pixels_copy;
          vnc_hextile_set_pixel_conversion(vs, 0);
      } else {
@@@ -1880,22 -1883,23 +1880,22 @@@ static void set_pixel_format(VncState *
          return;
      }
  
 -    vs->clientds = *(vs->vd->guest.ds);
 -    vs->clientds.pf.rmax = red_max;
 -    vs->clientds.pf.rbits = hweight_long(red_max);
 -    vs->clientds.pf.rshift = red_shift;
 -    vs->clientds.pf.rmask = red_max << red_shift;
 -    vs->clientds.pf.gmax = green_max;
 -    vs->clientds.pf.gbits = hweight_long(green_max);
 -    vs->clientds.pf.gshift = green_shift;
 -    vs->clientds.pf.gmask = green_max << green_shift;
 -    vs->clientds.pf.bmax = blue_max;
 -    vs->clientds.pf.bbits = hweight_long(blue_max);
 -    vs->clientds.pf.bshift = blue_shift;
 -    vs->clientds.pf.bmask = blue_max << blue_shift;
 -    vs->clientds.pf.bits_per_pixel = bits_per_pixel;
 -    vs->clientds.pf.bytes_per_pixel = bits_per_pixel / 8;
 -    vs->clientds.pf.depth = bits_per_pixel == 32 ? 24 : bits_per_pixel;
 -    vs->clientds.flags = big_endian_flag ? QEMU_BIG_ENDIAN_FLAG : 0x00;
 +    vs->client_pf.rmax = red_max;
 +    vs->client_pf.rbits = hweight_long(red_max);
 +    vs->client_pf.rshift = red_shift;
 +    vs->client_pf.rmask = red_max << red_shift;
 +    vs->client_pf.gmax = green_max;
 +    vs->client_pf.gbits = hweight_long(green_max);
 +    vs->client_pf.gshift = green_shift;
 +    vs->client_pf.gmask = green_max << green_shift;
 +    vs->client_pf.bmax = blue_max;
 +    vs->client_pf.bbits = hweight_long(blue_max);
 +    vs->client_pf.bshift = blue_shift;
 +    vs->client_pf.bmask = blue_max << blue_shift;
 +    vs->client_pf.bits_per_pixel = bits_per_pixel;
 +    vs->client_pf.bytes_per_pixel = bits_per_pixel / 8;
 +    vs->client_pf.depth = bits_per_pixel == 32 ? 24 : bits_per_pixel;
 +    vs->client_be = big_endian_flag;
  
      set_pixel_conversion(vs);
  
  static void pixel_format_message (VncState *vs) {
      char pad[3] = { 0, 0, 0 };
  
 -    vnc_write_u8(vs, vs->ds->surface->pf.bits_per_pixel); /* bits-per-pixel */
 -    vnc_write_u8(vs, vs->ds->surface->pf.depth); /* depth */
 +    vs->client_pf = qemu_default_pixelformat(32);
 +
 +    vnc_write_u8(vs, vs->client_pf.bits_per_pixel); /* bits-per-pixel */
 +    vnc_write_u8(vs, vs->client_pf.depth); /* depth */
  
  #ifdef HOST_WORDS_BIGENDIAN
      vnc_write_u8(vs, 1);             /* big-endian-flag */
      vnc_write_u8(vs, 0);             /* big-endian-flag */
  #endif
      vnc_write_u8(vs, 1);             /* true-color-flag */
 -    vnc_write_u16(vs, vs->ds->surface->pf.rmax);     /* red-max */
 -    vnc_write_u16(vs, vs->ds->surface->pf.gmax);     /* green-max */
 -    vnc_write_u16(vs, vs->ds->surface->pf.bmax);     /* blue-max */
 -    vnc_write_u8(vs, vs->ds->surface->pf.rshift);    /* red-shift */
 -    vnc_write_u8(vs, vs->ds->surface->pf.gshift);    /* green-shift */
 -    vnc_write_u8(vs, vs->ds->surface->pf.bshift);    /* blue-shift */
 +    vnc_write_u16(vs, vs->client_pf.rmax);     /* red-max */
 +    vnc_write_u16(vs, vs->client_pf.gmax);     /* green-max */
 +    vnc_write_u16(vs, vs->client_pf.bmax);     /* blue-max */
 +    vnc_write_u8(vs, vs->client_pf.rshift);    /* red-shift */
 +    vnc_write_u8(vs, vs->client_pf.gshift);    /* green-shift */
 +    vnc_write_u8(vs, vs->client_pf.bshift);    /* blue-shift */
 +    vnc_write(vs, pad, 3);           /* padding */
  
      vnc_hextile_set_pixel_conversion(vs, 0);
 -
 -    vs->clientds = *(vs->ds->surface);
 -    vs->clientds.flags &= ~QEMU_ALLOCATED_FLAG;
      vs->write_pixels = vnc_write_pixels_copy;
 -
 -    vnc_write(vs, pad, 3);           /* padding */
  }
  
  static void vnc_dpy_setdata(DisplayState *ds)
  {
      VncDisplay *vd = ds->opaque;
  
 -    *(vd->guest.ds) = *(ds->surface);
 +    qemu_pixman_image_unref(vd->guest.fb);
 +    vd->guest.fb = pixman_image_ref(ds->surface->image);
 +    vd->guest.format = ds->surface->format;
      vnc_dpy_update(ds, 0, 0, ds_get_width(ds), ds_get_height(ds));
  }
  
@@@ -2439,14 -2443,12 +2439,14 @@@ static int vnc_refresh_lossy_rect(VncDi
  
  static int vnc_update_stats(VncDisplay *vd,  struct timeval * tv)
  {
 +    int width = pixman_image_get_width(vd->guest.fb);
 +    int height = pixman_image_get_height(vd->guest.fb);
      int x, y;
      struct timeval res;
      int has_dirty = 0;
  
 -    for (y = 0; y < vd->guest.ds->height; y += VNC_STAT_RECT) {
 -        for (x = 0; x < vd->guest.ds->width; x += VNC_STAT_RECT) {
 +    for (y = 0; y < height; y += VNC_STAT_RECT) {
 +        for (x = 0; x < width; x += VNC_STAT_RECT) {
              VncRectStat *rect = vnc_stat_rect(vd, x, y);
  
              rect->updated = false;
      }
      vd->guest.last_freq_check = *tv;
  
 -    for (y = 0; y < vd->guest.ds->height; y += VNC_STAT_RECT) {
 -        for (x = 0; x < vd->guest.ds->width; x += VNC_STAT_RECT) {
 +    for (y = 0; y < height; y += VNC_STAT_RECT) {
 +        for (x = 0; x < width; x += VNC_STAT_RECT) {
              VncRectStat *rect= vnc_stat_rect(vd, x, y);
              int count = ARRAY_SIZE(rect->times);
              struct timeval min, max;
@@@ -2530,15 -2532,12 +2530,15 @@@ static void vnc_rect_updated(VncDispla
  
  static int vnc_refresh_server_surface(VncDisplay *vd)
  {
 +    int width = pixman_image_get_width(vd->guest.fb);
 +    int height = pixman_image_get_height(vd->guest.fb);
      int y;
      uint8_t *guest_row;
      uint8_t *server_row;
      int cmp_bytes;
      VncState *vs;
      int has_dirty = 0;
 +    pixman_image_t *tmpbuf = NULL;
  
      struct timeval tv = { 0, 0 };
  
       * Check and copy modified bits from guest to server surface.
       * Update server dirty map.
       */
 -    cmp_bytes = 16 * ds_get_bytes_per_pixel(vd->ds);
 -    if (cmp_bytes > vd->ds->surface->linesize) {
 -        cmp_bytes = vd->ds->surface->linesize;
 +    cmp_bytes = 64;
 +    if (cmp_bytes > vnc_server_fb_stride(vd)) {
 +        cmp_bytes = vnc_server_fb_stride(vd);
      }
 -    guest_row  = vd->guest.ds->data;
 -    server_row = vd->server->data;
 -    for (y = 0; y < vd->guest.ds->height; y++) {
 +    if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
 +        int width = pixman_image_get_width(vd->server);
 +        tmpbuf = qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, width);
 +    }
 +    guest_row = (uint8_t *)pixman_image_get_data(vd->guest.fb);
 +    server_row = (uint8_t *)pixman_image_get_data(vd->server);
 +    for (y = 0; y < height; y++) {
          if (!bitmap_empty(vd->guest.dirty[y], VNC_DIRTY_BITS)) {
              int x;
              uint8_t *guest_ptr;
              uint8_t *server_ptr;
  
 -            guest_ptr  = guest_row;
 +            if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
 +                qemu_pixman_linebuf_fill(tmpbuf, vd->guest.fb, width, y);
 +                guest_ptr = (uint8_t *)pixman_image_get_data(tmpbuf);
 +            } else {
 +                guest_ptr = guest_row;
 +            }
              server_ptr = server_row;
  
 -            for (x = 0; x + 15 < vd->guest.ds->width;
 +            for (x = 0; x + 15 < width;
                      x += 16, guest_ptr += cmp_bytes, server_ptr += cmp_bytes) {
                  if (!test_and_clear_bit((x / 16), vd->guest.dirty[y]))
                      continue;
                  has_dirty++;
              }
          }
 -        guest_row  += ds_get_linesize(vd->ds);
 -        server_row += ds_get_linesize(vd->ds);
 +        guest_row  += pixman_image_get_stride(vd->guest.fb);
 +        server_row += pixman_image_get_stride(vd->server);
      }
 +    qemu_pixman_image_unref(tmpbuf);
      return has_dirty;
  }
  
@@@ -2764,17 -2753,17 +2764,17 @@@ void vnc_display_init(DisplayState *ds
      qemu_mutex_init(&vs->mutex);
      vnc_start_worker_thread();
  
 -    dcl->dpy_copy = vnc_dpy_copy;
 -    dcl->dpy_update = vnc_dpy_update;
 -    dcl->dpy_resize = vnc_dpy_resize;
 -    dcl->dpy_setdata = vnc_dpy_setdata;
 +    dcl->dpy_gfx_copy = vnc_dpy_copy;
 +    dcl->dpy_gfx_update = vnc_dpy_update;
 +    dcl->dpy_gfx_resize = vnc_dpy_resize;
 +    dcl->dpy_gfx_setdata = vnc_dpy_setdata;
 +    dcl->dpy_mouse_set = vnc_mouse_set;
 +    dcl->dpy_cursor_define = vnc_dpy_cursor_define;
      register_displaychangelistener(ds, dcl);
 -    ds->mouse_set = vnc_mouse_set;
 -    ds->cursor_define = vnc_dpy_cursor_define;
  }
  
  
- void vnc_display_close(DisplayState *ds)
static void vnc_display_close(DisplayState *ds)
  {
      VncDisplay *vs = ds ? (VncDisplay *)ds->opaque : vnc_display;
  
  #endif
  }
  
- int vnc_display_disable_login(DisplayState *ds)
static int vnc_display_disable_login(DisplayState *ds)
  {
      VncDisplay *vs = ds ? (VncDisplay *)ds->opaque : vnc_display;
  
diff --combined ui/vnc.h
index d003afbbfd3084747b023f24753a6a51028eab9e,c89f6934b40154ff953c0750b8d4fa7d2271513f..6141e88b4e969eeee2ceed3742a5554a43f20078
+++ b/ui/vnc.h
@@@ -69,7 -69,7 +69,7 @@@ typedef struct VncRectEntry VncRectEntr
  
  typedef int VncReadEvent(VncState *vs, uint8_t *data, size_t len);
  
 -typedef void VncWritePixels(VncState *vs, struct PixelFormat *pf, void *data, int size);
 +typedef void VncWritePixels(VncState *vs, void *data, int size);
  
  typedef void VncSendHextileTile(VncState *vs,
                                  int x, int y, int w, int h,
@@@ -117,8 -117,7 +117,8 @@@ struct VncSurfac
      struct timeval last_freq_check;
      DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT], VNC_MAX_WIDTH / 16);
      VncRectStat stats[VNC_STAT_ROWS][VNC_STAT_COLS];
 -    DisplaySurface *ds;
 +    pixman_image_t *fb;
 +    pixman_format_code_t format;
  };
  
  typedef enum VncShareMode {
@@@ -152,7 -151,7 +152,7 @@@ struct VncDispla
      uint8_t *cursor_mask;
  
      struct VncSurface guest;   /* guest visible surface (aka ds->surface) */
 -    DisplaySurface *server;  /* vnc server surface */
 +    pixman_image_t *server;    /* vnc server surface */
  
      char *display;
      char *password;
@@@ -276,9 -275,7 +276,9 @@@ struct VncStat
      Buffer input;
      /* current output mode information */
      VncWritePixels *write_pixels;
 -    DisplaySurface clientds;
 +    PixelFormat client_pf;
 +    pixman_format_code_t client_format;
 +    bool client_be;
  
      CaptureVoiceOut *audio_cap;
      struct audsettings as;
@@@ -496,9 -493,6 +496,6 @@@ void vnc_read_when(VncState *vs, VncRea
  
  
  /* Buffer I/O functions */
- uint8_t read_u8(uint8_t *data, size_t offset);
- uint16_t read_u16(uint8_t *data, size_t offset);
- int32_t read_s32(uint8_t *data, size_t offset);
  uint32_t read_u32(uint8_t *data, size_t offset);
  
  /* Protocol stage functions */
@@@ -510,8 -504,6 +507,6 @@@ void start_auth_vnc(VncState *vs)
  
  /* Buffer management */
  void buffer_reserve(Buffer *buffer, size_t len);
- int buffer_empty(Buffer *buffer);
- uint8_t *buffer_end(Buffer *buffer);
  void buffer_reset(Buffer *buffer);
  void buffer_free(Buffer *buffer);
  void buffer_append(Buffer *buffer, const void *data, size_t len);
@@@ -530,14 -522,6 +525,14 @@@ static inline uint32_t vnc_has_feature(
  void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
                              int32_t encoding);
  
 +/* server fb is in PIXMAN_x8r8g8b8 */
 +#define VNC_SERVER_FB_FORMAT PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
 +#define VNC_SERVER_FB_BITS   (PIXMAN_FORMAT_BPP(VNC_SERVER_FB_FORMAT))
 +#define VNC_SERVER_FB_BYTES  ((VNC_SERVER_FB_BITS+7)/8)
 +
 +void *vnc_server_fb_ptr(VncDisplay *vd, int x, int y);
 +int vnc_server_fb_stride(VncDisplay *vd);
 +
  void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v);
  double vnc_update_freq(VncState *vs, int x, int y, int w, int h);
  void vnc_sent_lossy_rect(VncState *vs, int x, int y, int w, int h);
diff --combined vl.c
index 0f5b07bbde67f29097367857dd3c22bda47134fa,d840c321616cd2b6a1fde9a06bbb89a917fbf702..4f03a72e5854e45ca3232596e3cb39ec29158328
--- 1/vl.c
--- 2/vl.c
+++ b/vl.c
@@@ -180,7 -180,7 +180,7 @@@ static const char *data_dir
  const char *bios_name = NULL;
  enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
  DisplayType display_type = DT_DEFAULT;
int display_remote = 0;
static int display_remote;
  const char* keyboard_layout = NULL;
  ram_addr_t ram_size;
  const char *mem_path = NULL;
@@@ -214,7 -214,7 +214,7 @@@ const char *vnc_display
  int acpi_enabled = 1;
  int no_hpet = 0;
  int fd_bootchk = 1;
int no_reboot = 0;
static int no_reboot;
  int no_shutdown = 0;
  int cursor_hide = 1;
  int graphic_rotate = 0;
@@@ -242,7 -242,8 +242,8 @@@ struct FWBootEntry 
      char *suffix;
  };
  
- QTAILQ_HEAD(, FWBootEntry) fw_boot_order = QTAILQ_HEAD_INITIALIZER(fw_boot_order);
+ static QTAILQ_HEAD(, FWBootEntry) fw_boot_order =
+     QTAILQ_HEAD_INITIALIZER(fw_boot_order);
  
  int nb_numa_nodes;
  uint64_t node_mem[MAX_NODES];
@@@ -396,7 -397,7 +397,7 @@@ bool runstate_check(RunState state
      return current_run_state == state;
  }
  
- void runstate_init(void)
static void runstate_init(void)
  {
      const RunStateTransition *p;
  
@@@ -1359,51 -1360,19 +1360,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;
@@@ -1489,14 -1458,14 +1490,14 @@@ int qemu_reset_requested_get(void
      return reset_requested;
  }
  
- int qemu_shutdown_requested(void)
static int qemu_shutdown_requested(void)
  {
      int r = shutdown_requested;
      shutdown_requested = 0;
      return r;
  }
  
- void qemu_kill_report(void)
static void qemu_kill_report(void)
  {
      if (!qtest_enabled() && shutdown_signal != -1) {
          fprintf(stderr, "qemu: terminating on signal %d", shutdown_signal);
      }
  }
  
- int qemu_reset_requested(void)
static int qemu_reset_requested(void)
  {
      int r = reset_requested;
      reset_requested = 0;
@@@ -1533,7 -1502,7 +1534,7 @@@ static int qemu_wakeup_requested(void
      return r;
  }
  
- int qemu_powerdown_requested(void)
static int qemu_powerdown_requested(void)
  {
      int r = powerdown_requested;
      powerdown_requested = 0;
@@@ -2159,7 -2128,9 +2160,9 @@@ struct device_config 
      Location loc;
      QTAILQ_ENTRY(device_config) next;
  };
- QTAILQ_HEAD(, device_config) device_configs = QTAILQ_HEAD_INITIALIZER(device_configs);
+ static QTAILQ_HEAD(, device_config) device_configs =
+     QTAILQ_HEAD_INITIALIZER(device_configs);
  
  static void add_device_config(int type, const char *cmdline)
  {
@@@ -2473,6 -2444,11 +2476,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();
  
 +    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);
      }
              add_device_config(DEV_VIRTCON, "vc:80Cx24C");
      }
  
 -    if (init_timer_alarm() < 0) {
 -        fprintf(stderr, "could not initialize alarm timer\n");
 -        exit(1);
 -    }
 -
      socket_init();
  
      if (qemu_opts_foreach(qemu_find_opts("chardev"), chardev_init_func, NULL, 1) != 0)
  
      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");
  
      os_set_line_buffering();
  
 +    qemu_init_cpu_loop();
 +    qemu_mutex_lock_iothread();
 +
  #ifdef CONFIG_SPICE
      /* spice needs the timers to be initialized by this point */
      qemu_spice_init();
  #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) {