All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement
@ 2017-02-22 17:13 Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 01/24] docs: new design document multi-thread-tcg.txt Alex Bennée
                   ` (24 more replies)
  0 siblings, 25 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée

Hi Richard/Peter,

I'm hoping this is the final version and we are ready to submit a
pull-request to merge MTTCG upstream. Apart from the final set of
architecture reviewed-by's the following patches have had minor
tweaks:

  tcg: handle EXCP_ATOMIC exception for system emulation

  Fixed to handle yet another corner case of tb-flush being triggered
  during an EXCP_ATOMIC exceptions. Also the mmap_lock is now correctly
  taken (as EXCP_ATOMIC can be taken for linux-user).

  tcg: remove global exit_request

  In the single threaded round robin we also check for
  cpu->queued_work_first and bail the loop if needed. Otherwise we run
  into strangeness when the "target-arm: ensure all cross vCPUs TLB
  flushes complete" runs in single-threaded mode. The tail end of the
  commit message has been tweaked to explain this.

  tcg: enable thread-per-vCPU

  Pranith found a regression running linux-user tests/atomic_bench
  which was due to the fact we previously removed a setting of
  cpu->exit_request to 0 in cpu_handle_interrupt. Because the
  linux-user loop doesn't have the outer loop of system emulation this
  caused it to hang - always exiting the TB. There was a knock on
  effect w.r.t to safe work for single-threaded execution but this was
  fixed in commit above.

So if you are happy are you going to be able to submit the pull
request before the soft-freeze kicks in?

Regards,

Alex.

Alex Bennée (18):
  docs: new design document multi-thread-tcg.txt
  tcg: move TCG_MO/BAR types into own file
  tcg: add kick timer for single-threaded vCPU emulation
  tcg: rename tcg_current_cpu to tcg_current_rr_cpu
  tcg: remove global exit_request
  tcg: enable tb_lock() for SoftMMU
  tcg: enable thread-per-vCPU
  cputlb: add assert_cpu_is_self checks
  cputlb: tweak qemu_ram_addr_from_host_nofail reporting
  cputlb and arm/sparc targets: convert mmuidx flushes from varg to
    bitmap
  cputlb: add tlb_flush_by_mmuidx async routines
  cputlb: atomically update tlb fields used by tlb_reset_dirty
  cputlb: introduce tlb_flush_*_all_cpus[_synced]
  target-arm/powerctl: defer cpu reset work to CPU context
  target-arm: don't generate WFE/YIELD calls for MTTCG
  target-arm: ensure all cross vCPUs TLB flushes complete
  hw/misc/imx6_src: defer clearing of SRC_SCR reset bits
  tcg: enable MTTCG by default for ARM on x86 hosts

Jan Kiszka (1):
  tcg: drop global lock during TCG code execution

KONRAD Frederic (2):
  tcg: add options for enabling MTTCG
  cputlb: introduce tlb_flush_* async work.

Pranith Kumar (3):
  mttcg: translate-all: Enable locking debug in a debug build
  mttcg: Add missing tb_lock/unlock() in cpu_exec_step()
  tcg: handle EXCP_ATOMIC exception for system emulation

 configure                  |   6 +
 cpu-exec-common.c          |   3 -
 cpu-exec.c                 |  85 ++++++---
 cpus.c                     | 345 ++++++++++++++++++++++++++-------
 cputlb.c                   | 463 +++++++++++++++++++++++++++++++++++++--------
 docs/multi-thread-tcg.txt  | 350 ++++++++++++++++++++++++++++++++++
 exec.c                     |  12 +-
 hw/core/irq.c              |   1 +
 hw/i386/kvmvapic.c         |   4 +-
 hw/intc/arm_gicv3_cpuif.c  |   3 +
 hw/misc/imx6_src.c         |  58 +++++-
 hw/ppc/ppc.c               |  16 +-
 hw/ppc/spapr.c             |   3 +
 include/exec/cputlb.h      |   2 -
 include/exec/exec-all.h    | 132 +++++++++++--
 include/qom/cpu.h          |  16 ++
 include/sysemu/cpus.h      |   2 +
 memory.c                   |   2 +
 qemu-options.hx            |  20 ++
 qom/cpu.c                  |  10 +
 target/arm/arm-powerctl.c  | 202 +++++++++++++-------
 target/arm/arm-powerctl.h  |   2 +
 target/arm/cpu.c           |   4 +-
 target/arm/cpu.h           |  18 +-
 target/arm/helper.c        | 219 ++++++++++-----------
 target/arm/kvm.c           |   7 +-
 target/arm/machine.c       |  41 +++-
 target/arm/op_helper.c     |  50 ++++-
 target/arm/psci.c          |   4 +-
 target/arm/translate-a64.c |   8 +-
 target/arm/translate.c     |  20 +-
 target/i386/smm_helper.c   |   7 +
 target/s390x/misc_helper.c |   5 +-
 target/sparc/ldst_helper.c |   8 +-
 tcg/i386/tcg-target.h      |  11 ++
 tcg/tcg-mo.h               |  48 +++++
 tcg/tcg.h                  |  27 +--
 translate-all.c            |  66 ++-----
 translate-common.c         |  21 +-
 vl.c                       |  49 ++++-
 40 files changed, 1874 insertions(+), 476 deletions(-)
 create mode 100644 docs/multi-thread-tcg.txt
 create mode 100644 tcg/tcg-mo.h

-- 
2.11.0

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 01/24] docs: new design document multi-thread-tcg.txt
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 02/24] mttcg: translate-all: Enable locking debug in a debug build Alex Bennée
                   ` (23 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée

This documents the current design for upgrading TCG emulation to take
advantage of modern CPUs by running a thread-per-CPU. The document goes
through the various areas of the code affected by such a change and
proposes design requirements for each part of the solution.

The text marked with (Current solution[s]) to document what the current
approaches being used are.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>

---
v1
  - initial version
v2
  - update discussion on locks
  - bit more detail on vCPU scheduling
  - explicitly mention Translation Blocks
  - emulated hardware state already covered by iomutex
  - a few minor rewords
v3
  - mention this covers system-mode
  - describe main main-loop and lookup hot-path
  - mention multi-concurrent-reader lookups
  - enumerate reasons for invalidation
  - add more details on lookup structures
  - describe the softmmu hot-path better
  - mention store-after-load barrier problem
v4
  - mention some cross-over between linux-user/system emulation
  - various minor grammar and scanning fixes
  - fix reference to tb_ctx.htbale
  - describe the solution for hot-path
  - more detail on TB flushing and invalidation
  - add (Current solution) following design requirements
  - more detail on iothread/BQL mutex
  - mention implicit memory barriers
  - add links to current LL/SC and cmpxchg patch sets
  - add TLB flag setting as an additional requirement
v6
 - remove DRAFTING, update copyright dates
 - document current solutions to each design requirement
 - tb_lock() serialisation for codegen/patch
 - cputlb changes to defer cross-vCPU flushes
 - cputlb atomic updates for slow-path
 - BQL usage for hardware serialisation
 - cmpxchg as initial atomic/synchronisation support mechanism
v7
 - minor format fix
 - include target-mips in list of MB aware front-ends
 - mention BQL around IRQ raising
 - update with notes on _all_cpus and the wait flag
---
 docs/multi-thread-tcg.txt | 350 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 350 insertions(+)
 create mode 100644 docs/multi-thread-tcg.txt

diff --git a/docs/multi-thread-tcg.txt b/docs/multi-thread-tcg.txt
new file mode 100644
index 0000000000..a99b4564c6
--- /dev/null
+++ b/docs/multi-thread-tcg.txt
@@ -0,0 +1,350 @@
+Copyright (c) 2015-2016 Linaro Ltd.
+
+This work is licensed under the terms of the GNU GPL, version 2 or
+later. See the COPYING file in the top-level directory.
+
+Introduction
+============
+
+This document outlines the design for multi-threaded TCG system-mode
+emulation. The current user-mode emulation mirrors the thread
+structure of the translated executable. Some of the work will be
+applicable to both system and linux-user emulation.
+
+The original system-mode TCG implementation was single threaded and
+dealt with multiple CPUs with simple round-robin scheduling. This
+simplified a lot of things but became increasingly limited as systems
+being emulated gained additional cores and per-core performance gains
+for host systems started to level off.
+
+vCPU Scheduling
+===============
+
+We introduce a new running mode where each vCPU will run on its own
+user-space thread. This will be enabled by default for all FE/BE
+combinations that have had the required work done to support this
+safely.
+
+In the general case of running translated code there should be no
+inter-vCPU dependencies and all vCPUs should be able to run at full
+speed. Synchronisation will only be required while accessing internal
+shared data structures or when the emulated architecture requires a
+coherent representation of the emulated machine state.
+
+Shared Data Structures
+======================
+
+Main Run Loop
+-------------
+
+Even when there is no code being generated there are a number of
+structures associated with the hot-path through the main run-loop.
+These are associated with looking up the next translation block to
+execute. These include:
+
+    tb_jmp_cache (per-vCPU, cache of recent jumps)
+    tb_ctx.htable (global hash table, phys address->tb lookup)
+
+As TB linking only occurs when blocks are in the same page this code
+is critical to performance as looking up the next TB to execute is the
+most common reason to exit the generated code.
+
+DESIGN REQUIREMENT: Make access to lookup structures safe with
+multiple reader/writer threads. Minimise any lock contention to do it.
+
+The hot-path avoids using locks where possible. The tb_jmp_cache is
+updated with atomic accesses to ensure consistent results. The fall
+back QHT based hash table is also designed for lockless lookups. Locks
+are only taken when code generation is required or TranslationBlocks
+have their block-to-block jumps patched.
+
+Global TCG State
+----------------
+
+We need to protect the entire code generation cycle including any post
+generation patching of the translated code. This also implies a shared
+translation buffer which contains code running on all cores. Any
+execution path that comes to the main run loop will need to hold a
+mutex for code generation. This also includes times when we need flush
+code or entries from any shared lookups/caches. Structures held on a
+per-vCPU basis won't need locking unless other vCPUs will need to
+modify them.
+
+DESIGN REQUIREMENT: Add locking around all code generation and TB
+patching.
+
+(Current solution)
+
+Mainly as part of the linux-user work all code generation is
+serialised with a tb_lock(). For the SoftMMU tb_lock() also takes the
+place of mmap_lock() in linux-user.
+
+Translation Blocks
+------------------
+
+Currently the whole system shares a single code generation buffer
+which when full will force a flush of all translations and start from
+scratch again. Some operations also force a full flush of translations
+including:
+
+  - debugging operations (breakpoint insertion/removal)
+  - some CPU helper functions
+
+This is done with the async_safe_run_on_cpu() mechanism to ensure all
+vCPUs are quiescent when changes are being made to shared global
+structures.
+
+More granular translation invalidation events are typically due
+to a change of the state of a physical page:
+
+  - code modification (self modify code, patching code)
+  - page changes (new page mapping in linux-user mode)
+
+While setting the invalid flag in a TranslationBlock will stop it
+being used when looked up in the hot-path there are a number of other
+book-keeping structures that need to be safely cleared.
+
+Any TranslationBlocks which have been patched to jump directly to the
+now invalid blocks need the jump patches reversing so they will return
+to the C code.
+
+There are a number of look-up caches that need to be properly updated
+including the:
+
+  - jump lookup cache
+  - the physical-to-tb lookup hash table
+  - the global page table
+
+The global page table (l1_map) which provides a multi-level look-up
+for PageDesc structures which contain pointers to the start of a
+linked list of all Translation Blocks in that page (see page_next).
+
+Both the jump patching and the page cache involve linked lists that
+the invalidated TranslationBlock needs to be removed from.
+
+DESIGN REQUIREMENT: Safely handle invalidation of TBs
+                      - safely patch/revert direct jumps
+                      - remove central PageDesc lookup entries
+                      - ensure lookup caches/hashes are safely updated
+
+(Current solution)
+
+The direct jump themselves are updated atomically by the TCG
+tb_set_jmp_target() code. Modification to the linked lists that allow
+searching for linked pages are done under the protect of the
+tb_lock().
+
+The global page table is protected by the tb_lock() in system-mode and
+mmap_lock() in linux-user mode.
+
+The lookup caches are updated atomically and the lookup hash uses QHT
+which is designed for concurrent safe lookup.
+
+
+Memory maps and TLBs
+--------------------
+
+The memory handling code is fairly critical to the speed of memory
+access in the emulated system. The SoftMMU code is designed so the
+hot-path can be handled entirely within translated code. This is
+handled with a per-vCPU TLB structure which once populated will allow
+a series of accesses to the page to occur without exiting the
+translated code. It is possible to set flags in the TLB address which
+will ensure the slow-path is taken for each access. This can be done
+to support:
+
+  - Memory regions (dividing up access to PIO, MMIO and RAM)
+  - Dirty page tracking (for code gen, SMC detection, migration and display)
+  - Virtual TLB (for translating guest address->real address)
+
+When the TLB tables are updated by a vCPU thread other than their own
+we need to ensure it is done in a safe way so no inconsistent state is
+seen by the vCPU thread.
+
+Some operations require updating a number of vCPUs TLBs at the same
+time in a synchronised manner.
+
+DESIGN REQUIREMENTS:
+
+  - TLB Flush All/Page
+    - can be across-vCPUs
+    - cross vCPU TLB flush may need other vCPU brought to halt
+    - change may need to be visible to the calling vCPU immediately
+  - TLB Flag Update
+    - usually cross-vCPU
+    - want change to be visible as soon as possible
+  - TLB Update (update a CPUTLBEntry, via tlb_set_page_with_attrs)
+    - This is a per-vCPU table - by definition can't race
+    - updated by its own thread when the slow-path is forced
+
+(Current solution)
+
+We have updated cputlb.c to defer operations when a cross-vCPU
+operation with async_run_on_cpu() which ensures each vCPU sees a
+coherent state when it next runs its work (in a few instructions
+time).
+
+A new set up operations (tlb_flush_*_all_cpus) take an additional flag
+which when set will force synchronisation by setting the source vCPUs
+work as "safe work" and exiting the cpu run loop. This ensure by the
+time execution restarts all flush operations have completed.
+
+TLB flag updates are all done atomically and are also protected by the
+tb_lock() which is used by the functions that update the TLB in bulk.
+
+(Known limitation)
+
+Not really a limitation but the wait mechanism is overly strict for
+some architectures which only need flushes completed by a barrier
+instruction. This could be a future optimisation.
+
+Emulated hardware state
+-----------------------
+
+Currently thanks to KVM work any access to IO memory is automatically
+protected by the global iothread mutex, also known as the BQL (Big
+Qemu Lock). Any IO region that doesn't use global mutex is expected to
+do its own locking.
+
+However IO memory isn't the only way emulated hardware state can be
+modified. Some architectures have model specific registers that
+trigger hardware emulation features. Generally any translation helper
+that needs to update more than a single vCPUs of state should take the
+BQL.
+
+As the BQL, or global iothread mutex is shared across the system we
+push the use of the lock as far down into the TCG code as possible to
+minimise contention.
+
+(Current solution)
+
+MMIO access automatically serialises hardware emulation by way of the
+BQL. Currently ARM targets serialise all ARM_CP_IO register accesses
+and also defer the reset/startup of vCPUs to the vCPU context by way
+of async_run_on_cpu().
+
+Updates to interrupt state are also protected by the BQL as they can
+often be cross vCPU.
+
+Memory Consistency
+==================
+
+Between emulated guests and host systems there are a range of memory
+consistency models. Even emulating weakly ordered systems on strongly
+ordered hosts needs to ensure things like store-after-load re-ordering
+can be prevented when the guest wants to.
+
+Memory Barriers
+---------------
+
+Barriers (sometimes known as fences) provide a mechanism for software
+to enforce a particular ordering of memory operations from the point
+of view of external observers (e.g. another processor core). They can
+apply to any memory operations as well as just loads or stores.
+
+The Linux kernel has an excellent write-up on the various forms of
+memory barrier and the guarantees they can provide [1].
+
+Barriers are often wrapped around synchronisation primitives to
+provide explicit memory ordering semantics. However they can be used
+by themselves to provide safe lockless access by ensuring for example
+a change to a signal flag will only be visible once the changes to
+payload are.
+
+DESIGN REQUIREMENT: Add a new tcg_memory_barrier op
+
+This would enforce a strong load/store ordering so all loads/stores
+complete at the memory barrier. On single-core non-SMP strongly
+ordered backends this could become a NOP.
+
+Aside from explicit standalone memory barrier instructions there are
+also implicit memory ordering semantics which comes with each guest
+memory access instruction. For example all x86 load/stores come with
+fairly strong guarantees of sequential consistency where as ARM has
+special variants of load/store instructions that imply acquire/release
+semantics.
+
+In the case of a strongly ordered guest architecture being emulated on
+a weakly ordered host the scope for a heavy performance impact is
+quite high.
+
+DESIGN REQUIREMENTS: Be efficient with use of memory barriers
+       - host systems with stronger implied guarantees can skip some barriers
+       - merge consecutive barriers to the strongest one
+
+(Current solution)
+
+The system currently has a tcg_gen_mb() which will add memory barrier
+operations if code generation is being done in a parallel context. The
+tcg_optimize() function attempts to merge barriers up to their
+strongest form before any load/store operations. The solution was
+originally developed and tested for linux-user based systems. All
+backends have been converted to emit fences when required. So far the
+following front-ends have been updated to emit fences when required:
+
+    - target-i386
+    - target-arm
+    - target-aarch64
+    - target-alpha
+    - target-mips
+
+Memory Control and Maintenance
+------------------------------
+
+This includes a class of instructions for controlling system cache
+behaviour. While QEMU doesn't model cache behaviour these instructions
+are often seen when code modification has taken place to ensure the
+changes take effect.
+
+Synchronisation Primitives
+--------------------------
+
+There are two broad types of synchronisation primitives found in
+modern ISAs: atomic instructions and exclusive regions.
+
+The first type offer a simple atomic instruction which will guarantee
+some sort of test and conditional store will be truly atomic w.r.t.
+other cores sharing access to the memory. The classic example is the
+x86 cmpxchg instruction.
+
+The second type offer a pair of load/store instructions which offer a
+guarantee that an region of memory has not been touched between the
+load and store instructions. An example of this is ARM's ldrex/strex
+pair where the strex instruction will return a flag indicating a
+successful store only if no other CPU has accessed the memory region
+since the ldrex.
+
+Traditionally TCG has generated a series of operations that work
+because they are within the context of a single translation block so
+will have completed before another CPU is scheduled. However with
+the ability to have multiple threads running to emulate multiple CPUs
+we will need to explicitly expose these semantics.
+
+DESIGN REQUIREMENTS:
+  - Support classic atomic instructions
+  - Support load/store exclusive (or load link/store conditional) pairs
+  - Generic enough infrastructure to support all guest architectures
+CURRENT OPEN QUESTIONS:
+  - How problematic is the ABA problem in general?
+
+(Current solution)
+
+The TCG provides a number of atomic helpers (tcg_gen_atomic_*) which
+can be used directly or combined to emulate other instructions like
+ARM's ldrex/strex instructions. While they are susceptible to the ABA
+problem so far common guests have not implemented patterns where
+this may be a problem - typically presenting a locking ABI which
+assumes cmpxchg like semantics.
+
+The code also includes a fall-back for cases where multi-threaded TCG
+ops can't work (e.g. guest atomic width > host atomic width). In this
+case an EXCP_ATOMIC exit occurs and the instruction is emulated with
+an exclusive lock which ensures all emulation is serialised.
+
+While the atomic helpers look good enough for now there may be a need
+to look at solutions that can more closely model the guest
+architectures semantics.
+
+==========
+
+[1] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/Documentation/memory-barriers.txt
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 02/24] mttcg: translate-all: Enable locking debug in a debug build
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 01/24] docs: new design document multi-thread-tcg.txt Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 03/24] mttcg: Add missing tb_lock/unlock() in cpu_exec_step() Alex Bennée
                   ` (22 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

From: Pranith Kumar <bobby.prani@gmail.com>

Enable tcg lock debug asserts in a debug build by default instead of
relying on DEBUG_LOCKING. None of the other DEBUG_* macros have
asserts, so this patch removes DEBUG_LOCKING and enable these asserts
in a debug build.

CC: Richard Henderson <rth@twiddle.net>
Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
[AJB: tweak ifdefs so can be early in series]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
 translate-all.c | 52 ++++++++++++++++------------------------------------
 1 file changed, 16 insertions(+), 36 deletions(-)

diff --git a/translate-all.c b/translate-all.c
index 5f44ec844e..8a861cb583 100644
--- a/translate-all.c
+++ b/translate-all.c
@@ -59,7 +59,6 @@
 
 /* #define DEBUG_TB_INVALIDATE */
 /* #define DEBUG_TB_FLUSH */
-/* #define DEBUG_LOCKING */
 /* make various TB consistency checks */
 /* #define DEBUG_TB_CHECK */
 
@@ -74,20 +73,10 @@
  * access to the memory related structures are protected with the
  * mmap_lock.
  */
-#ifdef DEBUG_LOCKING
-#define DEBUG_MEM_LOCKS 1
-#else
-#define DEBUG_MEM_LOCKS 0
-#endif
-
 #ifdef CONFIG_SOFTMMU
 #define assert_memory_lock() do { /* nothing */ } while (0)
 #else
-#define assert_memory_lock() do {               \
-        if (DEBUG_MEM_LOCKS) {                  \
-            g_assert(have_mmap_lock());         \
-        }                                       \
-    } while (0)
+#define assert_memory_lock() tcg_debug_assert(have_mmap_lock())
 #endif
 
 #define SMC_BITMAP_USE_THRESHOLD 10
@@ -169,10 +158,18 @@ static void page_table_config_init(void)
     assert(v_l2_levels >= 0);
 }
 
+#ifdef CONFIG_USER_ONLY
+#define assert_tb_locked() tcg_debug_assert(have_tb_lock)
+#define assert_tb_unlocked() tcg_debug_assert(!have_tb_lock)
+#else
+#define assert_tb_locked()  do { /* nothing */ } while (0)
+#define assert_tb_unlocked()  do { /* nothing */ } while (0)
+#endif
+
 void tb_lock(void)
 {
 #ifdef CONFIG_USER_ONLY
-    assert(!have_tb_lock);
+    assert_tb_unlocked();
     qemu_mutex_lock(&tcg_ctx.tb_ctx.tb_lock);
     have_tb_lock++;
 #endif
@@ -181,7 +178,7 @@ void tb_lock(void)
 void tb_unlock(void)
 {
 #ifdef CONFIG_USER_ONLY
-    assert(have_tb_lock);
+    assert_tb_locked();
     have_tb_lock--;
     qemu_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock);
 #endif
@@ -197,23 +194,6 @@ void tb_lock_reset(void)
 #endif
 }
 
-#ifdef DEBUG_LOCKING
-#define DEBUG_TB_LOCKS 1
-#else
-#define DEBUG_TB_LOCKS 0
-#endif
-
-#ifdef CONFIG_SOFTMMU
-#define assert_tb_lock() do { /* nothing */ } while (0)
-#else
-#define assert_tb_lock() do {               \
-        if (DEBUG_TB_LOCKS) {               \
-            g_assert(have_tb_lock);         \
-        }                                   \
-    } while (0)
-#endif
-
-
 static TranslationBlock *tb_find_pc(uintptr_t tc_ptr);
 
 void cpu_gen_init(void)
@@ -847,7 +827,7 @@ static TranslationBlock *tb_alloc(target_ulong pc)
 {
     TranslationBlock *tb;
 
-    assert_tb_lock();
+    assert_tb_locked();
 
     if (tcg_ctx.tb_ctx.nb_tbs >= tcg_ctx.code_gen_max_blocks) {
         return NULL;
@@ -862,7 +842,7 @@ static TranslationBlock *tb_alloc(target_ulong pc)
 /* Called with tb_lock held.  */
 void tb_free(TranslationBlock *tb)
 {
-    assert_tb_lock();
+    assert_tb_locked();
 
     /* In practice this is mostly used for single use temporary TB
        Ignore the hard cases and just back up if this TB happens to
@@ -1104,7 +1084,7 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
     uint32_t h;
     tb_page_addr_t phys_pc;
 
-    assert_tb_lock();
+    assert_tb_locked();
 
     atomic_set(&tb->invalid, true);
 
@@ -1421,7 +1401,7 @@ static void tb_invalidate_phys_range_1(tb_page_addr_t start, tb_page_addr_t end)
 #ifdef CONFIG_SOFTMMU
 void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end)
 {
-    assert_tb_lock();
+    assert_tb_locked();
     tb_invalidate_phys_range_1(start, end);
 }
 #else
@@ -1464,7 +1444,7 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
 #endif /* TARGET_HAS_PRECISE_SMC */
 
     assert_memory_lock();
-    assert_tb_lock();
+    assert_tb_locked();
 
     p = page_find(start >> TARGET_PAGE_BITS);
     if (!p) {
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 03/24] mttcg: Add missing tb_lock/unlock() in cpu_exec_step()
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 01/24] docs: new design document multi-thread-tcg.txt Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 02/24] mttcg: translate-all: Enable locking debug in a debug build Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 04/24] tcg: move TCG_MO/BAR types into own file Alex Bennée
                   ` (21 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

From: Pranith Kumar <bobby.prani@gmail.com>

The recent patch enabling lock assertions uncovered the missing lock
acquisition in cpu_exec_step(). This patch adds them.

Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
 cpu-exec.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/cpu-exec.c b/cpu-exec.c
index 142a5862fc..ec84fdb3d7 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -233,14 +233,18 @@ static void cpu_exec_step(CPUState *cpu)
     uint32_t flags;
 
     cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
+    tb_lock();
     tb = tb_gen_code(cpu, pc, cs_base, flags,
                      1 | CF_NOCACHE | CF_IGNORE_ICOUNT);
     tb->orig_tb = NULL;
+    tb_unlock();
     /* execute the generated code */
     trace_exec_tb_nocache(tb, pc);
     cpu_tb_exec(cpu, tb);
+    tb_lock();
     tb_phys_invalidate(tb, -1);
     tb_free(tb);
+    tb_unlock();
 }
 
 void cpu_exec_step_atomic(CPUState *cpu)
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 04/24] tcg: move TCG_MO/BAR types into own file
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (2 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 03/24] mttcg: Add missing tb_lock/unlock() in cpu_exec_step() Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 05/24] tcg: add options for enabling MTTCG Alex Bennée
                   ` (20 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée

We'll be using the memory ordering definitions to define values for
both the host and guest. To avoid fighting with circular header
dependencies just move these types into their own minimal header.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>

---
v8
  - add clarifying comment about the form TCG_MO_A_B
---
 tcg/tcg-mo.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 tcg/tcg.h    | 18 +-----------------
 2 files changed, 49 insertions(+), 17 deletions(-)
 create mode 100644 tcg/tcg-mo.h

diff --git a/tcg/tcg-mo.h b/tcg/tcg-mo.h
new file mode 100644
index 0000000000..c2c55704e1
--- /dev/null
+++ b/tcg/tcg-mo.h
@@ -0,0 +1,48 @@
+/*
+ * Tiny Code Generator for QEMU
+ *
+ * Copyright (c) 2008 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.
+ */
+
+#ifndef TCG_MO_H
+#define TCG_MO_H
+
+typedef enum {
+    /* Used to indicate the type of accesses on which ordering
+       is to be ensured.  Modeled after SPARC barriers.
+
+       This is of the form TCG_MO_A_B where A is before B in program order.
+    */
+    TCG_MO_LD_LD  = 0x01,
+    TCG_MO_ST_LD  = 0x02,
+    TCG_MO_LD_ST  = 0x04,
+    TCG_MO_ST_ST  = 0x08,
+    TCG_MO_ALL    = 0x0F,  /* OR of the above */
+
+    /* Used to indicate the kind of ordering which is to be ensured by the
+       instruction.  These types are derived from x86/aarch64 instructions.
+       It should be noted that these are different from C11 semantics.  */
+    TCG_BAR_LDAQ  = 0x10,  /* Following ops will not come forward */
+    TCG_BAR_STRL  = 0x20,  /* Previous ops will not be delayed */
+    TCG_BAR_SC    = 0x30,  /* No ops cross barrier; OR of the above */
+} TCGBar;
+
+#endif /* TCG_MO_H */
diff --git a/tcg/tcg.h b/tcg/tcg.h
index 631c6f69b1..f946452049 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -29,6 +29,7 @@
 #include "cpu.h"
 #include "exec/tb-context.h"
 #include "qemu/bitops.h"
+#include "tcg-mo.h"
 #include "tcg-target.h"
 
 /* XXX: make safe guess about sizes */
@@ -498,23 +499,6 @@ static inline intptr_t QEMU_ARTIFICIAL GET_TCGV_PTR(TCGv_ptr t)
 #define TCG_CALL_DUMMY_TCGV     MAKE_TCGV_I32(-1)
 #define TCG_CALL_DUMMY_ARG      ((TCGArg)(-1))
 
-typedef enum {
-    /* Used to indicate the type of accesses on which ordering
-       is to be ensured.  Modeled after SPARC barriers.  */
-    TCG_MO_LD_LD  = 0x01,
-    TCG_MO_ST_LD  = 0x02,
-    TCG_MO_LD_ST  = 0x04,
-    TCG_MO_ST_ST  = 0x08,
-    TCG_MO_ALL    = 0x0F,  /* OR of the above */
-
-    /* Used to indicate the kind of ordering which is to be ensured by the
-       instruction.  These types are derived from x86/aarch64 instructions.
-       It should be noted that these are different from C11 semantics.  */
-    TCG_BAR_LDAQ  = 0x10,  /* Following ops will not come forward */
-    TCG_BAR_STRL  = 0x20,  /* Previous ops will not be delayed */
-    TCG_BAR_SC    = 0x30,  /* No ops cross barrier; OR of the above */
-} TCGBar;
-
 /* Conditions.  Note that these are laid out for easy manipulation by
    the functions below:
      bit 0 is used for inverting;
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 05/24] tcg: add options for enabling MTTCG
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (3 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 04/24] tcg: move TCG_MO/BAR types into own file Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 21:13   ` Pranith Kumar
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 06/24] tcg: add kick timer for single-threaded vCPU emulation Alex Bennée
                   ` (19 subsequent siblings)
  24 siblings, 1 reply; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

From: KONRAD Frederic <fred.konrad@greensocs.com>

We know there will be cases where MTTCG won't work until additional work
is done in the front/back ends to support. It will however be useful to
be able to turn it on.

As a result MTTCG will default to off unless the combination is
supported. However the user can turn it on for the sake of testing.

Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
[AJB: move to -accel tcg,thread=multi|single, defaults]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
v1:
  - merge with add mttcg option.
  - update commit message
v2:
  - machine_init->opts_init
v3:
  - moved from -tcg to -accel tcg,thread=single|multi
  - fix checkpatch warnings
v4:
  - make mttcg_enabled extern, qemu_tcg_mttcg_enabled() now just macro
  - qemu_tcg_configure now propagates Error instead of exiting
  - better error checking of thread=foo
  - use CONFIG flags for default_mttcg_enabled()
  - disable mttcg with icount, error if both forced on
v7
  - explicitly disable MTTCG for TCG_OVERSIZED_GUEST
  - use check_tcg_memory_orders_compatible() instead of CONFIG_MTTCG_HOST
  - change CONFIG_MTTCG_TARGET to TARGET_SUPPORTS_MTTCG
v8
  - fix missing include tcg.h
  - change mismatched MOs to a warning instead of error
v10
  - TCG_DEFAULT_MO -> TCG_GUEST_DEFAULT_MO
v11
  - tweak warning message
---
 cpus.c                | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++
 include/qom/cpu.h     |  9 +++++++
 include/sysemu/cpus.h |  2 ++
 qemu-options.hx       | 20 ++++++++++++++
 tcg/tcg.h             |  9 +++++++
 vl.c                  | 49 +++++++++++++++++++++++++++++++++-
 6 files changed, 161 insertions(+), 1 deletion(-)

diff --git a/cpus.c b/cpus.c
index 0bcb5b50b6..c296ec715f 100644
--- a/cpus.c
+++ b/cpus.c
@@ -25,6 +25,7 @@
 /* Needed early for CONFIG_BSD etc. */
 #include "qemu/osdep.h"
 #include "qemu-common.h"
+#include "qemu/config-file.h"
 #include "cpu.h"
 #include "monitor/monitor.h"
 #include "qapi/qmp/qerror.h"
@@ -45,6 +46,7 @@
 #include "qemu/main-loop.h"
 #include "qemu/bitmap.h"
 #include "qemu/seqlock.h"
+#include "tcg.h"
 #include "qapi-event.h"
 #include "hw/nmi.h"
 #include "sysemu/replay.h"
@@ -150,6 +152,77 @@ typedef struct TimersState {
 } TimersState;
 
 static TimersState timers_state;
+bool mttcg_enabled;
+
+/*
+ * We default to false if we know other options have been enabled
+ * which are currently incompatible with MTTCG. Otherwise when each
+ * guest (target) has been updated to support:
+ *   - atomic instructions
+ *   - memory ordering primitives (barriers)
+ * they can set the appropriate CONFIG flags in ${target}-softmmu.mak
+ *
+ * Once a guest architecture has been converted to the new primitives
+ * there are two remaining limitations to check.
+ *
+ * - The guest can't be oversized (e.g. 64 bit guest on 32 bit host)
+ * - The host must have a stronger memory order than the guest
+ *
+ * It may be possible in future to support strong guests on weak hosts
+ * but that will require tagging all load/stores in a guest with their
+ * implicit memory order requirements which would likely slow things
+ * down a lot.
+ */
+
+static bool check_tcg_memory_orders_compatible(void)
+{
+#if defined(TCG_GUEST_DEFAULT_MO) && defined(TCG_TARGET_DEFAULT_MO)
+    return (TCG_GUEST_DEFAULT_MO & ~TCG_TARGET_DEFAULT_MO) == 0;
+#else
+    return false;
+#endif
+}
+
+static bool default_mttcg_enabled(void)
+{
+    QemuOpts *icount_opts = qemu_find_opts_singleton("icount");
+    const char *rr = qemu_opt_get(icount_opts, "rr");
+
+    if (rr || TCG_OVERSIZED_GUEST) {
+        return false;
+    } else {
+#ifdef TARGET_SUPPORTS_MTTCG
+        return check_tcg_memory_orders_compatible();
+#else
+        return false;
+#endif
+    }
+}
+
+void qemu_tcg_configure(QemuOpts *opts, Error **errp)
+{
+    const char *t = qemu_opt_get(opts, "thread");
+    if (t) {
+        if (strcmp(t, "multi") == 0) {
+            if (TCG_OVERSIZED_GUEST) {
+                error_setg(errp, "No MTTCG when guest word size > hosts");
+            } else {
+                if (!check_tcg_memory_orders_compatible()) {
+                    error_report("Guest expects a stronger memory ordering than"
+                                 "the host provides");
+                    error_printf("This may cause strange/hard to debug errors");
+                }
+                mttcg_enabled = true;
+            }
+        } else if (strcmp(t, "single") == 0) {
+            mttcg_enabled = false;
+        } else {
+            error_setg(errp, "Invalid 'thread' setting %s", t);
+        }
+    } else {
+        mttcg_enabled = default_mttcg_enabled();
+    }
+}
 
 int64_t cpu_get_icount_raw(void)
 {
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index f69b2407ea..2cf4ecf144 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -416,6 +416,15 @@ extern struct CPUTailQ cpus;
 extern __thread CPUState *current_cpu;
 
 /**
+ * qemu_tcg_mttcg_enabled:
+ * Check whether we are running MultiThread TCG or not.
+ *
+ * Returns: %true if we are in MTTCG mode %false otherwise.
+ */
+extern bool mttcg_enabled;
+#define qemu_tcg_mttcg_enabled() (mttcg_enabled)
+
+/**
  * cpu_paging_enabled:
  * @cpu: The CPU whose state is to be inspected.
  *
diff --git a/include/sysemu/cpus.h b/include/sysemu/cpus.h
index 3728a1ea7e..a73b5d4bce 100644
--- a/include/sysemu/cpus.h
+++ b/include/sysemu/cpus.h
@@ -36,4 +36,6 @@ extern int smp_threads;
 
 void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg);
 
+void qemu_tcg_configure(QemuOpts *opts, Error **errp);
+
 #endif
diff --git a/qemu-options.hx b/qemu-options.hx
index 9936cf38f3..bf458f83c3 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -95,6 +95,26 @@ STEXI
 Select CPU model (@code{-cpu help} for list and additional feature selection)
 ETEXI
 
+DEF("accel", HAS_ARG, QEMU_OPTION_accel,
+    "-accel [accel=]accelerator[,thread=single|multi]\n"
+    "               select accelerator ('-accel help for list')\n"
+    "               thread=single|multi (enable multi-threaded TCG)", QEMU_ARCH_ALL)
+STEXI
+@item -accel @var{name}[,prop=@var{value}[,...]]
+@findex -accel
+This is used to enable an accelerator. Depending on the target architecture,
+kvm, xen, or tcg can be available. By default, tcg is used. If there is more
+than one accelerator specified, the next one is used if the previous one fails
+to initialize.
+@table @option
+@item thread=single|multi
+Controls number of TCG threads. When the TCG is multi-threaded there will be one
+thread per vCPU therefor taking advantage of additional host cores. The default
+is to enable multi-threading where both the back-end and front-ends support it and
+no incompatible TCG features have been enabled (e.g. icount/replay).
+@end table
+ETEXI
+
 DEF("smp", HAS_ARG, QEMU_OPTION_smp,
     "-smp [cpus=]n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]\n"
     "                set the number of CPUs to 'n' [default=1]\n"
diff --git a/tcg/tcg.h b/tcg/tcg.h
index f946452049..4c7f258220 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -80,6 +80,15 @@ typedef uint64_t tcg_target_ulong;
 #error unsupported
 #endif
 
+/* Oversized TCG guests make things like MTTCG hard
+ * as we can't use atomics for cputlb updates.
+ */
+#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
+#define TCG_OVERSIZED_GUEST 1
+#else
+#define TCG_OVERSIZED_GUEST 0
+#endif
+
 #if TCG_TARGET_NB_REGS <= 32
 typedef uint32_t TCGRegSet;
 #elif TCG_TARGET_NB_REGS <= 64
diff --git a/vl.c b/vl.c
index b5d0a19811..ea7f4320af 100644
--- a/vl.c
+++ b/vl.c
@@ -300,6 +300,26 @@ static QemuOptsList qemu_machine_opts = {
     },
 };
 
+static QemuOptsList qemu_accel_opts = {
+    .name = "accel",
+    .implied_opt_name = "accel",
+    .head = QTAILQ_HEAD_INITIALIZER(qemu_accel_opts.head),
+    .merge_lists = true,
+    .desc = {
+        {
+            .name = "accel",
+            .type = QEMU_OPT_STRING,
+            .help = "Select the type of accelerator",
+        },
+        {
+            .name = "thread",
+            .type = QEMU_OPT_STRING,
+            .help = "Enable/disable multi-threaded TCG",
+        },
+        { /* end of list */ }
+    },
+};
+
 static QemuOptsList qemu_boot_opts = {
     .name = "boot-opts",
     .implied_opt_name = "order",
@@ -2928,7 +2948,8 @@ int main(int argc, char **argv, char **envp)
     const char *boot_once = NULL;
     DisplayState *ds;
     int cyls, heads, secs, translation;
-    QemuOpts *hda_opts = NULL, *opts, *machine_opts, *icount_opts = NULL;
+    QemuOpts *opts, *machine_opts;
+    QemuOpts *hda_opts = NULL, *icount_opts = NULL, *accel_opts = NULL;
     QemuOptsList *olist;
     int optind;
     const char *optarg;
@@ -2983,6 +3004,7 @@ int main(int argc, char **argv, char **envp)
     qemu_add_opts(&qemu_trace_opts);
     qemu_add_opts(&qemu_option_rom_opts);
     qemu_add_opts(&qemu_machine_opts);
+    qemu_add_opts(&qemu_accel_opts);
     qemu_add_opts(&qemu_mem_opts);
     qemu_add_opts(&qemu_smp_opts);
     qemu_add_opts(&qemu_boot_opts);
@@ -3675,6 +3697,26 @@ int main(int argc, char **argv, char **envp)
                 qdev_prop_register_global(&kvm_pit_lost_tick_policy);
                 break;
             }
+            case QEMU_OPTION_accel:
+                accel_opts = qemu_opts_parse_noisily(qemu_find_opts("accel"),
+                                                     optarg, true);
+                optarg = qemu_opt_get(accel_opts, "accel");
+
+                olist = qemu_find_opts("machine");
+                if (strcmp("kvm", optarg) == 0) {
+                    qemu_opts_parse_noisily(olist, "accel=kvm", false);
+                } else if (strcmp("xen", optarg) == 0) {
+                    qemu_opts_parse_noisily(olist, "accel=xen", false);
+                } else if (strcmp("tcg", optarg) == 0) {
+                    qemu_opts_parse_noisily(olist, "accel=tcg", false);
+                } else {
+                    if (!is_help_option(optarg)) {
+                        error_printf("Unknown accelerator: %s", optarg);
+                    }
+                    error_printf("Supported accelerators: kvm, xen, tcg\n");
+                    exit(1);
+                }
+                break;
             case QEMU_OPTION_usb:
                 olist = qemu_find_opts("machine");
                 qemu_opts_parse_noisily(olist, "usb=on", false);
@@ -3983,6 +4025,8 @@ int main(int argc, char **argv, char **envp)
 
     replay_configure(icount_opts);
 
+    qemu_tcg_configure(accel_opts, &error_fatal);
+
     machine_class = select_machine();
 
     set_memory_options(&ram_slots, &maxram_size, machine_class);
@@ -4349,6 +4393,9 @@ int main(int argc, char **argv, char **envp)
         if (!tcg_enabled()) {
             error_report("-icount is not allowed with hardware virtualization");
             exit(1);
+        } else if (qemu_tcg_mttcg_enabled()) {
+            error_report("-icount does not currently work with MTTCG");
+            exit(1);
         }
         configure_icount(icount_opts, &error_abort);
         qemu_opts_del(icount_opts);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 06/24] tcg: add kick timer for single-threaded vCPU emulation
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (4 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 05/24] tcg: add options for enabling MTTCG Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 07/24] tcg: rename tcg_current_cpu to tcg_current_rr_cpu Alex Bennée
                   ` (18 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

Currently we rely on the side effect of the main loop grabbing the
iothread_mutex to give any long running basic block chains a kick to
ensure the next vCPU is scheduled. As this code is being re-factored and
rationalised we now do it explicitly here.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Reviewed-by: Pranith Kumar <bobby.prani@gmail.com>

---
v2
  - re-base fixes
  - get_ticks_per_sec() -> NANOSECONDS_PER_SEC
v3
  - add define for TCG_KICK_FREQ
  - fix checkpatch warning
v4
  - wrap next calc in inline qemu_tcg_next_kick() instead of macro
v5
  - move all kick code into own section
  - use global for timer
  - add helper functions to start/stop timer
  - stop timer when all cores paused
v7
  - checkpatch > 80 char fix
---
 cpus.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)

diff --git a/cpus.c b/cpus.c
index c296ec715f..ad9732f826 100644
--- a/cpus.c
+++ b/cpus.c
@@ -768,6 +768,53 @@ void configure_icount(QemuOpts *opts, Error **errp)
 }
 
 /***********************************************************/
+/* TCG vCPU kick timer
+ *
+ * The kick timer is responsible for moving single threaded vCPU
+ * emulation on to the next vCPU. If more than one vCPU is running a
+ * timer event with force a cpu->exit so the next vCPU can get
+ * scheduled.
+ *
+ * The timer is removed if all vCPUs are idle and restarted again once
+ * idleness is complete.
+ */
+
+static QEMUTimer *tcg_kick_vcpu_timer;
+
+static void qemu_cpu_kick_no_halt(void);
+
+#define TCG_KICK_PERIOD (NANOSECONDS_PER_SECOND / 10)
+
+static inline int64_t qemu_tcg_next_kick(void)
+{
+    return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + TCG_KICK_PERIOD;
+}
+
+static void kick_tcg_thread(void *opaque)
+{
+    timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
+    qemu_cpu_kick_no_halt();
+}
+
+static void start_tcg_kick_timer(void)
+{
+    if (!tcg_kick_vcpu_timer && CPU_NEXT(first_cpu)) {
+        tcg_kick_vcpu_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
+                                           kick_tcg_thread, NULL);
+        timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
+    }
+}
+
+static void stop_tcg_kick_timer(void)
+{
+    if (tcg_kick_vcpu_timer) {
+        timer_del(tcg_kick_vcpu_timer);
+        tcg_kick_vcpu_timer = NULL;
+    }
+}
+
+
+/***********************************************************/
 void hw_error(const char *fmt, ...)
 {
     va_list ap;
@@ -1021,9 +1068,12 @@ static void qemu_wait_io_event_common(CPUState *cpu)
 static void qemu_tcg_wait_io_event(CPUState *cpu)
 {
     while (all_cpu_threads_idle()) {
+        stop_tcg_kick_timer();
         qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
     }
 
+    start_tcg_kick_timer();
+
     while (iothread_requesting_mutex) {
         qemu_cond_wait(&qemu_io_proceeded_cond, &qemu_global_mutex);
     }
@@ -1223,6 +1273,15 @@ static void deal_with_unplugged_cpus(void)
     }
 }
 
+/* Single-threaded TCG
+ *
+ * In the single-threaded case each vCPU is simulated in turn. If
+ * there is more than a single vCPU we create a simple timer to kick
+ * the vCPU and ensure we don't get stuck in a tight loop in one vCPU.
+ * This is done explicitly rather than relying on side-effects
+ * elsewhere.
+ */
+
 static void *qemu_tcg_cpu_thread_fn(void *arg)
 {
     CPUState *cpu = arg;
@@ -1249,6 +1308,8 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
         }
     }
 
+    start_tcg_kick_timer();
+
     /* process any pending work */
     atomic_mb_set(&exit_request, 1);
 
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 07/24] tcg: rename tcg_current_cpu to tcg_current_rr_cpu
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (5 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 06/24] tcg: add kick timer for single-threaded vCPU emulation Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 08/24] tcg: drop global lock during TCG code execution Alex Bennée
                   ` (17 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

..and make the definition local to cpus. In preparation for MTTCG the
concept of a global tcg_current_cpu will no longer make sense. However
we still need to keep track of it in the single-threaded case to be able
to exit quickly when required.

qemu_cpu_kick_no_halt() moves and becomes qemu_cpu_kick_rr_cpu() to
emphasise its use-case. qemu_cpu_kick now kicks the relevant cpu as
well as qemu_kick_rr_cpu() which will become a no-op in MTTCG.

For the time being the setting of the global exit_request remains.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Reviewed-by: Pranith Kumar <bobby.prani@gmail.com>
---
v4:
  - keep global exit_request setting for now
  - fix merge conflicts
v5:
  - merge conflicts with kick changes
---
 cpu-exec-common.c       |  1 -
 cpu-exec.c              |  3 ---
 cpus.c                  | 41 ++++++++++++++++++++++-------------------
 include/exec/exec-all.h |  1 -
 4 files changed, 22 insertions(+), 24 deletions(-)

diff --git a/cpu-exec-common.c b/cpu-exec-common.c
index 767d9c6f0c..e2bc053372 100644
--- a/cpu-exec-common.c
+++ b/cpu-exec-common.c
@@ -24,7 +24,6 @@
 #include "exec/memory-internal.h"
 
 bool exit_request;
-CPUState *tcg_current_cpu;
 
 /* exit the current TB, but without causing any exception to be raised */
 void cpu_loop_exit_noexc(CPUState *cpu)
diff --git a/cpu-exec.c b/cpu-exec.c
index ec84fdb3d7..06a6b25564 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -612,7 +612,6 @@ int cpu_exec(CPUState *cpu)
         return EXCP_HALTED;
     }
 
-    atomic_mb_set(&tcg_current_cpu, cpu);
     rcu_read_lock();
 
     if (unlikely(atomic_mb_read(&exit_request))) {
@@ -666,7 +665,5 @@ int cpu_exec(CPUState *cpu)
     /* fail safe : never use current_cpu outside cpu_exec() */
     current_cpu = NULL;
 
-    /* Does not need atomic_mb_set because a spurious wakeup is okay.  */
-    atomic_set(&tcg_current_cpu, NULL);
     return ret;
 }
diff --git a/cpus.c b/cpus.c
index ad9732f826..a6e8e40155 100644
--- a/cpus.c
+++ b/cpus.c
@@ -780,8 +780,7 @@ void configure_icount(QemuOpts *opts, Error **errp)
  */
 
 static QEMUTimer *tcg_kick_vcpu_timer;
-
-static void qemu_cpu_kick_no_halt(void);
+static CPUState *tcg_current_rr_cpu;
 
 #define TCG_KICK_PERIOD (NANOSECONDS_PER_SECOND / 10)
 
@@ -790,10 +789,23 @@ static inline int64_t qemu_tcg_next_kick(void)
     return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + TCG_KICK_PERIOD;
 }
 
+/* Kick the currently round-robin scheduled vCPU */
+static void qemu_cpu_kick_rr_cpu(void)
+{
+    CPUState *cpu;
+    atomic_mb_set(&exit_request, 1);
+    do {
+        cpu = atomic_mb_read(&tcg_current_rr_cpu);
+        if (cpu) {
+            cpu_exit(cpu);
+        }
+    } while (cpu != atomic_mb_read(&tcg_current_rr_cpu));
+}
+
 static void kick_tcg_thread(void *opaque)
 {
     timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
-    qemu_cpu_kick_no_halt();
+    qemu_cpu_kick_rr_cpu();
 }
 
 static void start_tcg_kick_timer(void)
@@ -813,7 +825,6 @@ static void stop_tcg_kick_timer(void)
     }
 }
 
-
 /***********************************************************/
 void hw_error(const char *fmt, ...)
 {
@@ -1324,6 +1335,7 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
         }
 
         for (; cpu != NULL && !exit_request; cpu = CPU_NEXT(cpu)) {
+            atomic_mb_set(&tcg_current_rr_cpu, cpu);
 
             qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
                               (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
@@ -1343,6 +1355,8 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
             }
 
         } /* for cpu.. */
+        /* Does not need atomic_mb_set because a spurious wakeup is okay.  */
+        atomic_set(&tcg_current_rr_cpu, NULL);
 
         /* Pairs with smp_wmb in qemu_cpu_kick.  */
         atomic_mb_set(&exit_request, 0);
@@ -1421,24 +1435,13 @@ static void qemu_cpu_kick_thread(CPUState *cpu)
 #endif
 }
 
-static void qemu_cpu_kick_no_halt(void)
-{
-    CPUState *cpu;
-    /* Ensure whatever caused the exit has reached the CPU threads before
-     * writing exit_request.
-     */
-    atomic_mb_set(&exit_request, 1);
-    cpu = atomic_mb_read(&tcg_current_cpu);
-    if (cpu) {
-        cpu_exit(cpu);
-    }
-}
-
 void qemu_cpu_kick(CPUState *cpu)
 {
     qemu_cond_broadcast(cpu->halt_cond);
     if (tcg_enabled()) {
-        qemu_cpu_kick_no_halt();
+        cpu_exit(cpu);
+        /* Also ensure current RR cpu is kicked */
+        qemu_cpu_kick_rr_cpu();
     } else {
         if (hax_enabled()) {
             /*
@@ -1486,7 +1489,7 @@ void qemu_mutex_lock_iothread(void)
         atomic_dec(&iothread_requesting_mutex);
     } else {
         if (qemu_mutex_trylock(&qemu_global_mutex)) {
-            qemu_cpu_kick_no_halt();
+            qemu_cpu_kick_rr_cpu();
             qemu_mutex_lock(&qemu_global_mutex);
         }
         atomic_dec(&iothread_requesting_mutex);
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index 21ab7bf3fd..4e34fc4cc1 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -405,7 +405,6 @@ bool memory_region_is_unassigned(MemoryRegion *mr);
 extern int singlestep;
 
 /* cpu-exec.c, accessed with atomic_mb_read/atomic_mb_set */
-extern CPUState *tcg_current_cpu;
 extern bool exit_request;
 
 #endif
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 08/24] tcg: drop global lock during TCG code execution
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (6 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 07/24] tcg: rename tcg_current_cpu to tcg_current_rr_cpu Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 09/24] tcg: remove global exit_request Alex Bennée
                   ` (16 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite,
	Eduardo Habkost, Michael S. Tsirkin, David Gibson,
	Alexander Graf, open list:ARM cores, open list:PowerPC

From: Jan Kiszka <jan.kiszka@siemens.com>

This finally allows TCG to benefit from the iothread introduction: Drop
the global mutex while running pure TCG CPU code. Reacquire the lock
when entering MMIO or PIO emulation, or when leaving the TCG loop.

We have to revert a few optimization for the current TCG threading
model, namely kicking the TCG thread in qemu_mutex_lock_iothread and not
kicking it in qemu_cpu_kick. We also need to disable RAM block
reordering until we have a more efficient locking mechanism at hand.

Still, a Linux x86 UP guest and my Musicpal ARM model boot fine here.
These numbers demonstrate where we gain something:

20338 jan       20   0  331m  75m 6904 R   99  0.9   0:50.95 qemu-system-arm
20337 jan       20   0  331m  75m 6904 S   20  0.9   0:26.50 qemu-system-arm

The guest CPU was fully loaded, but the iothread could still run mostly
independent on a second core. Without the patch we don't get beyond

32206 jan       20   0  330m  73m 7036 R   82  0.9   1:06.00 qemu-system-arm
32204 jan       20   0  330m  73m 7036 S   21  0.9   0:17.03 qemu-system-arm

We don't benefit significantly, though, when the guest is not fully
loading a host CPU.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Message-Id: <1439220437-23957-10-git-send-email-fred.konrad@greensocs.com>
[FK: Rebase, fix qemu_devices_reset deadlock, rm address_space_* mutex]
Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
[EGC: fixed iothread lock for cpu-exec IRQ handling]
Signed-off-by: Emilio G. Cota <cota@braap.org>
[AJB: -smp single-threaded fix, clean commit msg, BQL fixes]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Reviewed-by: Pranith Kumar <bobby.prani@gmail.com>
[PM: target-arm changes]
Acked-by: Peter Maydell <peter.maydell@linaro.org>

---
v8:
 - merged in BQL fixes for PPC target: ppc_set_irq
 - merged in BQL fixes for ARM target: ARM_CP_IO helpers
 - merged in BQL fixes for ARM target: arm_call_el_change_hook

v5 (ajb, base patches):
 - added an assert to BQL unlock/lock functions instead of hanging
 - ensure all cpu->interrupt_requests *modifications* protected by BQL
 - add a re-read on cpu->interrupt_request for correctness
 - BQL fixes for:
   - assert BQL held for PPC hypercalls (emulate_spar_hypercall)
   - SCLP service calls on s390x
 - merge conflict with kick timer patch
v4 (ajb, base patches):
 - protect cpu->interrupt updates with BQL
 - fix wording io_mem_notdirty calls
 - s/we/with/
v3 (ajb, base-patches):
  - stale iothread_unlocks removed (cpu_exit/resume_from_signal deals
  with it in the longjmp).
  - fix re-base conflicts
v2 (ajb):
  - merge with tcg: grab iothread lock in cpu-exec interrupt handling
  - use existing fns for tracking lock state
  - lock iothread for mem_region
    - add assert on mem region modification
    - ensure smm_helper holds iothread
  - Add JK s-o-b
  - Fix-up FK s-o-b annotation
v1 (ajb, base-patches):
  - SMP failure now fixed by previous commit

Changes from Fred Konrad (mttcg-v7 via paolo):
  * Rebase on the current HEAD.
  * Fixes a deadlock in qemu_devices_reset().
  * Remove the mutex in address_space_*
---
 cpu-exec.c                 | 19 +++++++++++++++++--
 cpus.c                     | 28 +++++-----------------------
 cputlb.c                   | 21 ++++++++++++++++++++-
 exec.c                     | 12 +++++++++---
 hw/core/irq.c              |  1 +
 hw/i386/kvmvapic.c         |  4 ++--
 hw/intc/arm_gicv3_cpuif.c  |  3 +++
 hw/ppc/ppc.c               | 16 +++++++++++++++-
 hw/ppc/spapr.c             |  3 +++
 include/qom/cpu.h          |  1 +
 memory.c                   |  2 ++
 qom/cpu.c                  | 10 ++++++++++
 target/arm/helper.c        |  6 ++++++
 target/arm/op_helper.c     | 43 +++++++++++++++++++++++++++++++++++++++----
 target/i386/smm_helper.c   |  7 +++++++
 target/s390x/misc_helper.c |  5 ++++-
 translate-all.c            |  9 +++++++--
 translate-common.c         | 21 +++++++++++----------
 18 files changed, 162 insertions(+), 49 deletions(-)

diff --git a/cpu-exec.c b/cpu-exec.c
index 06a6b25564..1d43fc1b2d 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -29,6 +29,7 @@
 #include "qemu/rcu.h"
 #include "exec/tb-hash.h"
 #include "exec/log.h"
+#include "qemu/main-loop.h"
 #if defined(TARGET_I386) && !defined(CONFIG_USER_ONLY)
 #include "hw/i386/apic.h"
 #endif
@@ -388,8 +389,10 @@ static inline bool cpu_handle_halt(CPUState *cpu)
         if ((cpu->interrupt_request & CPU_INTERRUPT_POLL)
             && replay_interrupt()) {
             X86CPU *x86_cpu = X86_CPU(cpu);
+            qemu_mutex_lock_iothread();
             apic_poll_irq(x86_cpu->apic_state);
             cpu_reset_interrupt(cpu, CPU_INTERRUPT_POLL);
+            qemu_mutex_unlock_iothread();
         }
 #endif
         if (!cpu_has_work(cpu)) {
@@ -443,7 +446,9 @@ static inline bool cpu_handle_exception(CPUState *cpu, int *ret)
 #else
             if (replay_exception()) {
                 CPUClass *cc = CPU_GET_CLASS(cpu);
+                qemu_mutex_lock_iothread();
                 cc->do_interrupt(cpu);
+                qemu_mutex_unlock_iothread();
                 cpu->exception_index = -1;
             } else if (!replay_has_interrupt()) {
                 /* give a chance to iothread in replay mode */
@@ -469,9 +474,11 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
                                         TranslationBlock **last_tb)
 {
     CPUClass *cc = CPU_GET_CLASS(cpu);
-    int interrupt_request = cpu->interrupt_request;
 
-    if (unlikely(interrupt_request)) {
+    if (unlikely(atomic_read(&cpu->interrupt_request))) {
+        int interrupt_request;
+        qemu_mutex_lock_iothread();
+        interrupt_request = cpu->interrupt_request;
         if (unlikely(cpu->singlestep_enabled & SSTEP_NOIRQ)) {
             /* Mask out external interrupts for this step. */
             interrupt_request &= ~CPU_INTERRUPT_SSTEP_MASK;
@@ -526,7 +533,12 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
                the program flow was changed */
             *last_tb = NULL;
         }
+
+        /* If we exit via cpu_loop_exit/longjmp it is reset in cpu_exec */
+        qemu_mutex_unlock_iothread();
     }
+
+
     if (unlikely(atomic_read(&cpu->exit_request) || replay_has_interrupt())) {
         atomic_set(&cpu->exit_request, 0);
         cpu->exception_index = EXCP_INTERRUPT;
@@ -643,6 +655,9 @@ int cpu_exec(CPUState *cpu)
 #endif /* buggy compiler */
         cpu->can_do_io = 1;
         tb_lock_reset();
+        if (qemu_mutex_iothread_locked()) {
+            qemu_mutex_unlock_iothread();
+        }
     }
 
     /* if an exception is pending, we execute it here */
diff --git a/cpus.c b/cpus.c
index a6e8e40155..c879b34a92 100644
--- a/cpus.c
+++ b/cpus.c
@@ -1027,8 +1027,6 @@ static void qemu_kvm_init_cpu_signals(CPUState *cpu)
 #endif /* _WIN32 */
 
 static QemuMutex qemu_global_mutex;
-static QemuCond qemu_io_proceeded_cond;
-static unsigned iothread_requesting_mutex;
 
 static QemuThread io_thread;
 
@@ -1042,7 +1040,6 @@ void qemu_init_cpu_loop(void)
     qemu_init_sigbus();
     qemu_cond_init(&qemu_cpu_cond);
     qemu_cond_init(&qemu_pause_cond);
-    qemu_cond_init(&qemu_io_proceeded_cond);
     qemu_mutex_init(&qemu_global_mutex);
 
     qemu_thread_get_self(&io_thread);
@@ -1085,10 +1082,6 @@ static void qemu_tcg_wait_io_event(CPUState *cpu)
 
     start_tcg_kick_timer();
 
-    while (iothread_requesting_mutex) {
-        qemu_cond_wait(&qemu_io_proceeded_cond, &qemu_global_mutex);
-    }
-
     CPU_FOREACH(cpu) {
         qemu_wait_io_event_common(cpu);
     }
@@ -1249,9 +1242,11 @@ static int tcg_cpu_exec(CPUState *cpu)
         cpu->icount_decr.u16.low = decr;
         cpu->icount_extra = count;
     }
+    qemu_mutex_unlock_iothread();
     cpu_exec_start(cpu);
     ret = cpu_exec(cpu);
     cpu_exec_end(cpu);
+    qemu_mutex_lock_iothread();
 #ifdef CONFIG_PROFILER
     tcg_time += profile_getclock() - ti;
 #endif
@@ -1479,27 +1474,14 @@ bool qemu_mutex_iothread_locked(void)
 
 void qemu_mutex_lock_iothread(void)
 {
-    atomic_inc(&iothread_requesting_mutex);
-    /* In the simple case there is no need to bump the VCPU thread out of
-     * TCG code execution.
-     */
-    if (!tcg_enabled() || qemu_in_vcpu_thread() ||
-        !first_cpu || !first_cpu->created) {
-        qemu_mutex_lock(&qemu_global_mutex);
-        atomic_dec(&iothread_requesting_mutex);
-    } else {
-        if (qemu_mutex_trylock(&qemu_global_mutex)) {
-            qemu_cpu_kick_rr_cpu();
-            qemu_mutex_lock(&qemu_global_mutex);
-        }
-        atomic_dec(&iothread_requesting_mutex);
-        qemu_cond_broadcast(&qemu_io_proceeded_cond);
-    }
+    g_assert(!qemu_mutex_iothread_locked());
+    qemu_mutex_lock(&qemu_global_mutex);
     iothread_locked = true;
 }
 
 void qemu_mutex_unlock_iothread(void)
 {
+    g_assert(qemu_mutex_iothread_locked());
     iothread_locked = false;
     qemu_mutex_unlock(&qemu_global_mutex);
 }
diff --git a/cputlb.c b/cputlb.c
index 6c39927455..1cc9d9da51 100644
--- a/cputlb.c
+++ b/cputlb.c
@@ -18,6 +18,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qemu/main-loop.h"
 #include "cpu.h"
 #include "exec/exec-all.h"
 #include "exec/memory.h"
@@ -495,6 +496,7 @@ static uint64_t io_readx(CPUArchState *env, CPUIOTLBEntry *iotlbentry,
     hwaddr physaddr = iotlbentry->addr;
     MemoryRegion *mr = iotlb_to_region(cpu, physaddr, iotlbentry->attrs);
     uint64_t val;
+    bool locked = false;
 
     physaddr = (physaddr & TARGET_PAGE_MASK) + addr;
     cpu->mem_io_pc = retaddr;
@@ -503,7 +505,16 @@ static uint64_t io_readx(CPUArchState *env, CPUIOTLBEntry *iotlbentry,
     }
 
     cpu->mem_io_vaddr = addr;
+
+    if (mr->global_locking) {
+        qemu_mutex_lock_iothread();
+        locked = true;
+    }
     memory_region_dispatch_read(mr, physaddr, &val, size, iotlbentry->attrs);
+    if (locked) {
+        qemu_mutex_unlock_iothread();
+    }
+
     return val;
 }
 
@@ -514,15 +525,23 @@ static void io_writex(CPUArchState *env, CPUIOTLBEntry *iotlbentry,
     CPUState *cpu = ENV_GET_CPU(env);
     hwaddr physaddr = iotlbentry->addr;
     MemoryRegion *mr = iotlb_to_region(cpu, physaddr, iotlbentry->attrs);
+    bool locked = false;
 
     physaddr = (physaddr & TARGET_PAGE_MASK) + addr;
     if (mr != &io_mem_rom && mr != &io_mem_notdirty && !cpu->can_do_io) {
         cpu_io_recompile(cpu, retaddr);
     }
-
     cpu->mem_io_vaddr = addr;
     cpu->mem_io_pc = retaddr;
+
+    if (mr->global_locking) {
+        qemu_mutex_lock_iothread();
+        locked = true;
+    }
     memory_region_dispatch_write(mr, physaddr, val, size, iotlbentry->attrs);
+    if (locked) {
+        qemu_mutex_unlock_iothread();
+    }
 }
 
 /* Return true if ADDR is present in the victim tlb, and has been copied
diff --git a/exec.c b/exec.c
index 865a1e8295..3adf2b1861 100644
--- a/exec.c
+++ b/exec.c
@@ -2134,9 +2134,9 @@ static void check_watchpoint(int offset, int len, MemTxAttrs attrs, int flags)
                 }
                 cpu->watchpoint_hit = wp;
 
-                /* The tb_lock will be reset when cpu_loop_exit or
-                 * cpu_loop_exit_noexc longjmp back into the cpu_exec
-                 * main loop.
+                /* Both tb_lock and iothread_mutex will be reset when
+                 * cpu_loop_exit or cpu_loop_exit_noexc longjmp
+                 * back into the cpu_exec main loop.
                  */
                 tb_lock();
                 tb_check_watchpoint(cpu);
@@ -2371,8 +2371,14 @@ static void io_mem_init(void)
     memory_region_init_io(&io_mem_rom, NULL, &unassigned_mem_ops, NULL, NULL, UINT64_MAX);
     memory_region_init_io(&io_mem_unassigned, NULL, &unassigned_mem_ops, NULL,
                           NULL, UINT64_MAX);
+
+    /* io_mem_notdirty calls tb_invalidate_phys_page_fast,
+     * which can be called without the iothread mutex.
+     */
     memory_region_init_io(&io_mem_notdirty, NULL, &notdirty_mem_ops, NULL,
                           NULL, UINT64_MAX);
+    memory_region_clear_global_locking(&io_mem_notdirty);
+
     memory_region_init_io(&io_mem_watch, NULL, &watch_mem_ops, NULL,
                           NULL, UINT64_MAX);
 }
diff --git a/hw/core/irq.c b/hw/core/irq.c
index 49ff2e64fe..b98d1d69f5 100644
--- a/hw/core/irq.c
+++ b/hw/core/irq.c
@@ -22,6 +22,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qemu/main-loop.h"
 #include "qemu-common.h"
 #include "hw/irq.h"
 #include "qom/object.h"
diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c
index 7135633863..82a49556af 100644
--- a/hw/i386/kvmvapic.c
+++ b/hw/i386/kvmvapic.c
@@ -457,8 +457,8 @@ static void patch_instruction(VAPICROMState *s, X86CPU *cpu, target_ulong ip)
     resume_all_vcpus();
 
     if (!kvm_enabled()) {
-        /* tb_lock will be reset when cpu_loop_exit_noexc longjmps
-         * back into the cpu_exec loop. */
+        /* Both tb_lock and iothread_mutex will be reset when
+         *  longjmps back into the cpu_exec loop. */
         tb_lock();
         tb_gen_code(cs, current_pc, current_cs_base, current_flags, 1);
         cpu_loop_exit_noexc(cs);
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
index c25ee03556..f775aba507 100644
--- a/hw/intc/arm_gicv3_cpuif.c
+++ b/hw/intc/arm_gicv3_cpuif.c
@@ -14,6 +14,7 @@
 
 #include "qemu/osdep.h"
 #include "qemu/bitops.h"
+#include "qemu/main-loop.h"
 #include "trace.h"
 #include "gicv3_internal.h"
 #include "cpu.h"
@@ -733,6 +734,8 @@ void gicv3_cpuif_update(GICv3CPUState *cs)
     ARMCPU *cpu = ARM_CPU(cs->cpu);
     CPUARMState *env = &cpu->env;
 
+    g_assert(qemu_mutex_iothread_locked());
+
     trace_gicv3_cpuif_update(gicv3_redist_affid(cs), cs->hppi.irq,
                              cs->hppi.grp, cs->hppi.prio);
 
diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
index d171e60b5c..5f93083d4a 100644
--- a/hw/ppc/ppc.c
+++ b/hw/ppc/ppc.c
@@ -62,7 +62,16 @@ void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level)
 {
     CPUState *cs = CPU(cpu);
     CPUPPCState *env = &cpu->env;
-    unsigned int old_pending = env->pending_interrupts;
+    unsigned int old_pending;
+    bool locked = false;
+
+    /* We may already have the BQL if coming from the reset path */
+    if (!qemu_mutex_iothread_locked()) {
+        locked = true;
+        qemu_mutex_lock_iothread();
+    }
+
+    old_pending = env->pending_interrupts;
 
     if (level) {
         env->pending_interrupts |= 1 << n_IRQ;
@@ -80,9 +89,14 @@ void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level)
 #endif
     }
 
+
     LOG_IRQ("%s: %p n_IRQ %d level %d => pending %08" PRIx32
                 "req %08x\n", __func__, env, n_IRQ, level,
                 env->pending_interrupts, CPU(cpu)->interrupt_request);
+
+    if (locked) {
+        qemu_mutex_unlock_iothread();
+    }
 }
 
 /* PowerPC 6xx / 7xx internal IRQ controller */
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index e465d7ac98..b1e374f3f9 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1010,6 +1010,9 @@ static void emulate_spapr_hypercall(PPCVirtualHypervisor *vhyp,
 {
     CPUPPCState *env = &cpu->env;
 
+    /* The TCG path should also be holding the BQL at this point */
+    g_assert(qemu_mutex_iothread_locked());
+
     if (msr_pr) {
         hcall_dprintf("Hypercall made with MSR[PR]=1\n");
         env->gpr[3] = H_PRIVILEGE;
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 2cf4ecf144..10db89b16a 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -329,6 +329,7 @@ struct CPUState {
     bool unplug;
     bool crash_occurred;
     bool exit_request;
+    /* updates protected by BQL */
     uint32_t interrupt_request;
     int singlestep_enabled;
     int64_t icount_extra;
diff --git a/memory.c b/memory.c
index ed8b5aa83e..d61caee867 100644
--- a/memory.c
+++ b/memory.c
@@ -917,6 +917,8 @@ void memory_region_transaction_commit(void)
     AddressSpace *as;
 
     assert(memory_region_transaction_depth);
+    assert(qemu_mutex_iothread_locked());
+
     --memory_region_transaction_depth;
     if (!memory_region_transaction_depth) {
         if (memory_region_update_pending) {
diff --git a/qom/cpu.c b/qom/cpu.c
index ed87c50cea..58784bcbea 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -113,9 +113,19 @@ static void cpu_common_get_memory_mapping(CPUState *cpu,
     error_setg(errp, "Obtaining memory mappings is unsupported on this CPU.");
 }
 
+/* Resetting the IRQ comes from across the code base so we take the
+ * BQL here if we need to.  cpu_interrupt assumes it is held.*/
 void cpu_reset_interrupt(CPUState *cpu, int mask)
 {
+    bool need_lock = !qemu_mutex_iothread_locked();
+
+    if (need_lock) {
+        qemu_mutex_lock_iothread();
+    }
     cpu->interrupt_request &= ~mask;
+    if (need_lock) {
+        qemu_mutex_unlock_iothread();
+    }
 }
 
 void cpu_exit(CPUState *cpu)
diff --git a/target/arm/helper.c b/target/arm/helper.c
index 47250bcf16..753a69d40d 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -6769,6 +6769,12 @@ void arm_cpu_do_interrupt(CPUState *cs)
         arm_cpu_do_interrupt_aarch32(cs);
     }
 
+    /* Hooks may change global state so BQL should be held, also the
+     * BQL needs to be held for any modification of
+     * cs->interrupt_request.
+     */
+    g_assert(qemu_mutex_iothread_locked());
+
     arm_call_el_change_hook(cpu);
 
     if (!kvm_enabled()) {
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
index fb366fdc35..5f3e3bdae2 100644
--- a/target/arm/op_helper.c
+++ b/target/arm/op_helper.c
@@ -18,6 +18,7 @@
  */
 #include "qemu/osdep.h"
 #include "qemu/log.h"
+#include "qemu/main-loop.h"
 #include "cpu.h"
 #include "exec/helper-proto.h"
 #include "internals.h"
@@ -487,7 +488,9 @@ void HELPER(cpsr_write_eret)(CPUARMState *env, uint32_t val)
      */
     env->regs[15] &= (env->thumb ? ~1 : ~3);
 
+    qemu_mutex_lock_iothread();
     arm_call_el_change_hook(arm_env_get_cpu(env));
+    qemu_mutex_unlock_iothread();
 }
 
 /* Access to user mode registers from privileged modes.  */
@@ -735,28 +738,58 @@ void HELPER(set_cp_reg)(CPUARMState *env, void *rip, uint32_t value)
 {
     const ARMCPRegInfo *ri = rip;
 
-    ri->writefn(env, ri, value);
+    if (ri->type & ARM_CP_IO) {
+        qemu_mutex_lock_iothread();
+        ri->writefn(env, ri, value);
+        qemu_mutex_unlock_iothread();
+    } else {
+        ri->writefn(env, ri, value);
+    }
 }
 
 uint32_t HELPER(get_cp_reg)(CPUARMState *env, void *rip)
 {
     const ARMCPRegInfo *ri = rip;
+    uint32_t res;
 
-    return ri->readfn(env, ri);
+    if (ri->type & ARM_CP_IO) {
+        qemu_mutex_lock_iothread();
+        res = ri->readfn(env, ri);
+        qemu_mutex_unlock_iothread();
+    } else {
+        res = ri->readfn(env, ri);
+    }
+
+    return res;
 }
 
 void HELPER(set_cp_reg64)(CPUARMState *env, void *rip, uint64_t value)
 {
     const ARMCPRegInfo *ri = rip;
 
-    ri->writefn(env, ri, value);
+    if (ri->type & ARM_CP_IO) {
+        qemu_mutex_lock_iothread();
+        ri->writefn(env, ri, value);
+        qemu_mutex_unlock_iothread();
+    } else {
+        ri->writefn(env, ri, value);
+    }
 }
 
 uint64_t HELPER(get_cp_reg64)(CPUARMState *env, void *rip)
 {
     const ARMCPRegInfo *ri = rip;
+    uint64_t res;
+
+    if (ri->type & ARM_CP_IO) {
+        qemu_mutex_lock_iothread();
+        res = ri->readfn(env, ri);
+        qemu_mutex_unlock_iothread();
+    } else {
+        res = ri->readfn(env, ri);
+    }
 
-    return ri->readfn(env, ri);
+    return res;
 }
 
 void HELPER(msr_i_pstate)(CPUARMState *env, uint32_t op, uint32_t imm)
@@ -989,7 +1022,9 @@ void HELPER(exception_return)(CPUARMState *env)
                       cur_el, new_el, env->pc);
     }
 
+    qemu_mutex_lock_iothread();
     arm_call_el_change_hook(arm_env_get_cpu(env));
+    qemu_mutex_unlock_iothread();
 
     return;
 
diff --git a/target/i386/smm_helper.c b/target/i386/smm_helper.c
index 4dd6a2c544..f051a77c4a 100644
--- a/target/i386/smm_helper.c
+++ b/target/i386/smm_helper.c
@@ -18,6 +18,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qemu/main-loop.h"
 #include "cpu.h"
 #include "exec/helper-proto.h"
 #include "exec/log.h"
@@ -42,11 +43,14 @@ void helper_rsm(CPUX86State *env)
 #define SMM_REVISION_ID 0x00020000
 #endif
 
+/* Called with iothread lock taken */
 void cpu_smm_update(X86CPU *cpu)
 {
     CPUX86State *env = &cpu->env;
     bool smm_enabled = (env->hflags & HF_SMM_MASK);
 
+    g_assert(qemu_mutex_iothread_locked());
+
     if (cpu->smram) {
         memory_region_set_enabled(cpu->smram, smm_enabled);
     }
@@ -333,7 +337,10 @@ void helper_rsm(CPUX86State *env)
     }
     env->hflags2 &= ~HF2_SMM_INSIDE_NMI_MASK;
     env->hflags &= ~HF_SMM_MASK;
+
+    qemu_mutex_lock_iothread();
     cpu_smm_update(cpu);
+    qemu_mutex_unlock_iothread();
 
     qemu_log_mask(CPU_LOG_INT, "SMM: after RSM\n");
     log_cpu_state_mask(CPU_LOG_INT, CPU(cpu), CPU_DUMP_CCOP);
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index c9604ea9c7..3cb942e8bb 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -25,6 +25,7 @@
 #include "exec/helper-proto.h"
 #include "sysemu/kvm.h"
 #include "qemu/timer.h"
+#include "qemu/main-loop.h"
 #include "exec/address-spaces.h"
 #ifdef CONFIG_KVM
 #include <linux/kvm.h>
@@ -109,11 +110,13 @@ void program_interrupt(CPUS390XState *env, uint32_t code, int ilen)
 /* SCLP service call */
 uint32_t HELPER(servc)(CPUS390XState *env, uint64_t r1, uint64_t r2)
 {
+    qemu_mutex_lock_iothread();
     int r = sclp_service_call(env, r1, r2);
     if (r < 0) {
         program_interrupt(env, -r, 4);
-        return 0;
+        r = 0;
     }
+    qemu_mutex_unlock_iothread();
     return r;
 }
 
diff --git a/translate-all.c b/translate-all.c
index 8a861cb583..f810259c41 100644
--- a/translate-all.c
+++ b/translate-all.c
@@ -55,6 +55,7 @@
 #include "translate-all.h"
 #include "qemu/bitmap.h"
 #include "qemu/timer.h"
+#include "qemu/main-loop.h"
 #include "exec/log.h"
 
 /* #define DEBUG_TB_INVALIDATE */
@@ -1523,7 +1524,7 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
 #ifdef CONFIG_SOFTMMU
 /* len must be <= 8 and start must be a multiple of len.
  * Called via softmmu_template.h when code areas are written to with
- * tb_lock held.
+ * iothread mutex not held.
  */
 void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len)
 {
@@ -1725,7 +1726,10 @@ void tb_check_watchpoint(CPUState *cpu)
 
 #ifndef CONFIG_USER_ONLY
 /* in deterministic execution mode, instructions doing device I/Os
-   must be at the end of the TB */
+ * must be at the end of the TB.
+ *
+ * Called by softmmu_template.h, with iothread mutex not held.
+ */
 void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
 {
 #if defined(TARGET_MIPS) || defined(TARGET_SH4)
@@ -1937,6 +1941,7 @@ void dump_opcount_info(FILE *f, fprintf_function cpu_fprintf)
 
 void cpu_interrupt(CPUState *cpu, int mask)
 {
+    g_assert(qemu_mutex_iothread_locked());
     cpu->interrupt_request |= mask;
     cpu->tcg_exit_req = 1;
 }
diff --git a/translate-common.c b/translate-common.c
index 5e989cdf70..d504dd0d33 100644
--- a/translate-common.c
+++ b/translate-common.c
@@ -21,6 +21,7 @@
 #include "qemu-common.h"
 #include "qom/cpu.h"
 #include "sysemu/cpus.h"
+#include "qemu/main-loop.h"
 
 uintptr_t qemu_real_host_page_size;
 intptr_t qemu_real_host_page_mask;
@@ -30,6 +31,7 @@ intptr_t qemu_real_host_page_mask;
 static void tcg_handle_interrupt(CPUState *cpu, int mask)
 {
     int old_mask;
+    g_assert(qemu_mutex_iothread_locked());
 
     old_mask = cpu->interrupt_request;
     cpu->interrupt_request |= mask;
@@ -40,17 +42,16 @@ static void tcg_handle_interrupt(CPUState *cpu, int mask)
      */
     if (!qemu_cpu_is_self(cpu)) {
         qemu_cpu_kick(cpu);
-        return;
-    }
-
-    if (use_icount) {
-        cpu->icount_decr.u16.high = 0xffff;
-        if (!cpu->can_do_io
-            && (mask & ~old_mask) != 0) {
-            cpu_abort(cpu, "Raised interrupt while not in I/O function");
-        }
     } else {
-        cpu->tcg_exit_req = 1;
+        if (use_icount) {
+            cpu->icount_decr.u16.high = 0xffff;
+            if (!cpu->can_do_io
+                && (mask & ~old_mask) != 0) {
+                cpu_abort(cpu, "Raised interrupt while not in I/O function");
+            }
+        } else {
+            cpu->tcg_exit_req = 1;
+        }
     }
 }
 
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 09/24] tcg: remove global exit_request
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (7 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 08/24] tcg: drop global lock during TCG code execution Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 10/24] tcg: enable tb_lock() for SoftMMU Alex Bennée
                   ` (15 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

There are now only two uses of the global exit_request left.

The first ensures we exit the run_loop when we first start to process
pending work and in the kick handler. This is just as easily done by
setting the first_cpu->exit_request flag.

The second use is in the round robin kick routine. The global
exit_request ensured every vCPU would set its local exit_request and
cause a full exit of the loop. Now the iothread isn't being held while
running we can just rely on the kick handler to push us out as intended.

We lightly re-factor the main vCPU thread to ensure cpu->exit_requests
cause us to exit the main loop and process any IO requests that might
come along. As an cpu->exit_request may legitimately get squashed
while processing the EXCP_INTERRUPT exception we also check
cpu->queued_work_first to ensure queued work is expedited as soon as
possible.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
v13
  - also check cpu->queued_work_first in main loop.
v5
  - minor merge conflict with kick patch
v4
  - moved to after iothread unlocking patch
  - needed to remove kick exit_request as well.
  - remove extraneous cpu->exit_request check
  - remove stray exit_request setting
  - remove needless atomic operation
---
 cpu-exec-common.c       |  2 --
 cpu-exec.c              | 20 +++++++-------------
 cpus.c                  | 19 +++++++++++--------
 include/exec/exec-all.h |  3 ---
 4 files changed, 18 insertions(+), 26 deletions(-)

diff --git a/cpu-exec-common.c b/cpu-exec-common.c
index e2bc053372..0504a9457b 100644
--- a/cpu-exec-common.c
+++ b/cpu-exec-common.c
@@ -23,8 +23,6 @@
 #include "exec/exec-all.h"
 #include "exec/memory-internal.h"
 
-bool exit_request;
-
 /* exit the current TB, but without causing any exception to be raised */
 void cpu_loop_exit_noexc(CPUState *cpu)
 {
diff --git a/cpu-exec.c b/cpu-exec.c
index 1d43fc1b2d..64367216e6 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -564,15 +564,13 @@ static inline void cpu_loop_exec_tb(CPUState *cpu, TranslationBlock *tb,
     *tb_exit = ret & TB_EXIT_MASK;
     switch (*tb_exit) {
     case TB_EXIT_REQUESTED:
-        /* Something asked us to stop executing
-         * chained TBs; just continue round the main
-         * loop. Whatever requested the exit will also
-         * have set something else (eg exit_request or
-         * interrupt_request) which we will handle
-         * next time around the loop.  But we need to
-         * ensure the zeroing of tcg_exit_req (see cpu_tb_exec)
-         * comes before the next read of cpu->exit_request
-         * or cpu->interrupt_request.
+        /* Something asked us to stop executing chained TBs; just
+         * continue round the main loop. Whatever requested the exit
+         * will also have set something else (eg interrupt_request)
+         * which we will handle next time around the loop.  But we
+         * need to ensure the tcg_exit_req read in generated code
+         * comes before the next read of cpu->exit_request or
+         * cpu->interrupt_request.
          */
         smp_mb();
         *last_tb = NULL;
@@ -626,10 +624,6 @@ int cpu_exec(CPUState *cpu)
 
     rcu_read_lock();
 
-    if (unlikely(atomic_mb_read(&exit_request))) {
-        cpu->exit_request = 1;
-    }
-
     cc->cpu_exec_enter(cpu);
 
     /* Calculate difference between guest clock and host clock.
diff --git a/cpus.c b/cpus.c
index c879b34a92..9e1e13c2f0 100644
--- a/cpus.c
+++ b/cpus.c
@@ -793,7 +793,6 @@ static inline int64_t qemu_tcg_next_kick(void)
 static void qemu_cpu_kick_rr_cpu(void)
 {
     CPUState *cpu;
-    atomic_mb_set(&exit_request, 1);
     do {
         cpu = atomic_mb_read(&tcg_current_rr_cpu);
         if (cpu) {
@@ -1316,11 +1315,11 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
 
     start_tcg_kick_timer();
 
-    /* process any pending work */
-    atomic_mb_set(&exit_request, 1);
-
     cpu = first_cpu;
 
+    /* process any pending work */
+    cpu->exit_request = 1;
+
     while (1) {
         /* Account partial waits to QEMU_CLOCK_VIRTUAL.  */
         qemu_account_warp_timer();
@@ -1329,7 +1328,8 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
             cpu = first_cpu;
         }
 
-        for (; cpu != NULL && !exit_request; cpu = CPU_NEXT(cpu)) {
+        while (cpu && !cpu->queued_work_first && !cpu->exit_request) {
+
             atomic_mb_set(&tcg_current_rr_cpu, cpu);
 
             qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
@@ -1349,12 +1349,15 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
                 break;
             }
 
-        } /* for cpu.. */
+            cpu = CPU_NEXT(cpu);
+        } /* while (cpu && !cpu->exit_request).. */
+
         /* Does not need atomic_mb_set because a spurious wakeup is okay.  */
         atomic_set(&tcg_current_rr_cpu, NULL);
 
-        /* Pairs with smp_wmb in qemu_cpu_kick.  */
-        atomic_mb_set(&exit_request, 0);
+        if (cpu && cpu->exit_request) {
+            atomic_mb_set(&cpu->exit_request, 0);
+        }
 
         handle_icount_deadline();
 
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index 4e34fc4cc1..82f0e12327 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -404,7 +404,4 @@ bool memory_region_is_unassigned(MemoryRegion *mr);
 /* vl.c */
 extern int singlestep;
 
-/* cpu-exec.c, accessed with atomic_mb_read/atomic_mb_set */
-extern bool exit_request;
-
 #endif
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 10/24] tcg: enable tb_lock() for SoftMMU
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (8 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 09/24] tcg: remove global exit_request Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 11/24] tcg: enable thread-per-vCPU Alex Bennée
                   ` (14 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

tb_lock() has long been used for linux-user mode to protect code
generation. By enabling it now we prepare for MTTCG and ensure all code
generation is serialised by this lock. The other major structure that
needs protecting is the l1_map and its PageDesc structures. For the
SoftMMU case we also use tb_lock() to protect these structures instead
of linux-user mmap_lock() which as the name suggests serialises updates
to the structure as a result of guest mmap operations.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
v4
  - split from main tcg: enable thread-per-vCPU patch
v7
  - fixed up with Pranith's tcg_debug_assert() changes
---
 translate-all.c | 15 +--------------
 1 file changed, 1 insertion(+), 14 deletions(-)

diff --git a/translate-all.c b/translate-all.c
index f810259c41..9bac061c9b 100644
--- a/translate-all.c
+++ b/translate-all.c
@@ -75,7 +75,7 @@
  * mmap_lock.
  */
 #ifdef CONFIG_SOFTMMU
-#define assert_memory_lock() do { /* nothing */ } while (0)
+#define assert_memory_lock() tcg_debug_assert(have_tb_lock)
 #else
 #define assert_memory_lock() tcg_debug_assert(have_mmap_lock())
 #endif
@@ -135,9 +135,7 @@ TCGContext tcg_ctx;
 bool parallel_cpus;
 
 /* translation block context */
-#ifdef CONFIG_USER_ONLY
 __thread int have_tb_lock;
-#endif
 
 static void page_table_config_init(void)
 {
@@ -159,40 +157,29 @@ static void page_table_config_init(void)
     assert(v_l2_levels >= 0);
 }
 
-#ifdef CONFIG_USER_ONLY
 #define assert_tb_locked() tcg_debug_assert(have_tb_lock)
 #define assert_tb_unlocked() tcg_debug_assert(!have_tb_lock)
-#else
-#define assert_tb_locked()  do { /* nothing */ } while (0)
-#define assert_tb_unlocked()  do { /* nothing */ } while (0)
-#endif
 
 void tb_lock(void)
 {
-#ifdef CONFIG_USER_ONLY
     assert_tb_unlocked();
     qemu_mutex_lock(&tcg_ctx.tb_ctx.tb_lock);
     have_tb_lock++;
-#endif
 }
 
 void tb_unlock(void)
 {
-#ifdef CONFIG_USER_ONLY
     assert_tb_locked();
     have_tb_lock--;
     qemu_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock);
-#endif
 }
 
 void tb_lock_reset(void)
 {
-#ifdef CONFIG_USER_ONLY
     if (have_tb_lock) {
         qemu_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock);
         have_tb_lock = 0;
     }
-#endif
 }
 
 static TranslationBlock *tb_find_pc(uintptr_t tc_ptr);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 11/24] tcg: enable thread-per-vCPU
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (9 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 10/24] tcg: enable tb_lock() for SoftMMU Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 12/24] tcg: handle EXCP_ATOMIC exception for system emulation Alex Bennée
                   ` (13 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

There are a couple of changes that occur at the same time here:

  - introduce a single vCPU qemu_tcg_cpu_thread_fn

  One of these is spawned per vCPU with its own Thread and Condition
  variables. qemu_tcg_rr_cpu_thread_fn is the new name for the old
  single threaded function.

  - the TLS current_cpu variable is now live for the lifetime of MTTCG
    vCPU threads. This is for future work where async jobs need to know
    the vCPU context they are operating in.

The user to switch on multi-thread behaviour and spawn a thread
per-vCPU. For a simple test kvm-unit-test like:

  ./arm/run ./arm/locking-test.flat -smp 4 -accel tcg,thread=multi

Will now use 4 vCPU threads and have an expected FAIL (instead of the
unexpected PASS) as the default mode of the test has no protection when
incrementing a shared variable.

We enable the parallel_cpus flag to ensure we generate correct barrier
and atomic code if supported by the front and backends. This doesn't
automatically enable MTTCG until default_mttcg_enabled() is updated to
check the configuration is supported.

Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
[AJB: Some fixes, conditionally, commit rewording]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
v1 (ajb):
  - fix merge conflicts
  - maintain single-thread approach
v2
  - re-base fixes (no longer has tb_find_fast lock tweak ahead)
  - remove bogus break condition on cpu->stop/stopped
  - only process exiting cpus exit_request
  - handle all cpus idle case (fixes shutdown issues)
  - sleep on EXCP_HALTED in mttcg mode (prevent crash on start-up)
  - move icount timer into helper
v3
  - update the commit message
  - rm kick_timer tweaks (move to earlier tcg_current_cpu tweaks)
  - ensure linux-user clears cpu->exit_request in loop
  - purging of global exit_request and tcg_current_cpu in earlier patches
  - fix checkpatch warnings
v4
  - don't break loop on stopped, we may never schedule next in RR mode
  - make sure we flush iorequests of current cpu if we exited on one
  - add tcg_cpu_exec_start/end wraps for async work functions
  - stop killing of current_cpu on loop exit
  - set current_cpu in the single thread function
  - remove sleep special case, add qemu_tcg_should_sleep() for mttcg
  - no need to atomic set cpu->exit_request going into the loop
  - removed extraneous setting of exit_request
  - split tb_lock() part of patch
  - rename single thread fn to qemu_tcg_rr_cpu_thread_fn
v5
  - enable parallel_cpus for MTTCG (for barriers/atomics)
  - expand on CONFIG_ flags in commit message
v7
  - move parallel_cpus down into the mttcg leg
  - minor ws merge fix
v13
  - Allow squashing of cpu->exit_request when setting EXCP_INTERRUPT
    (this is because linux-user doesn't clear this in its loop)
  - slightly re-word end of commit message w.r.t. default_mttcg_enabled
---
 cpu-exec.c |   4 --
 cpus.c     | 134 +++++++++++++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 103 insertions(+), 35 deletions(-)

diff --git a/cpu-exec.c b/cpu-exec.c
index 64367216e6..6514bc77ee 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -396,7 +396,6 @@ static inline bool cpu_handle_halt(CPUState *cpu)
         }
 #endif
         if (!cpu_has_work(cpu)) {
-            current_cpu = NULL;
             return true;
         }
 
@@ -671,8 +670,5 @@ int cpu_exec(CPUState *cpu)
     cc->cpu_exec_exit(cpu);
     rcu_read_unlock();
 
-    /* fail safe : never use current_cpu outside cpu_exec() */
-    current_cpu = NULL;
-
     return ret;
 }
diff --git a/cpus.c b/cpus.c
index 9e1e13c2f0..6315a1f86a 100644
--- a/cpus.c
+++ b/cpus.c
@@ -809,7 +809,7 @@ static void kick_tcg_thread(void *opaque)
 
 static void start_tcg_kick_timer(void)
 {
-    if (!tcg_kick_vcpu_timer && CPU_NEXT(first_cpu)) {
+    if (!mttcg_enabled && !tcg_kick_vcpu_timer && CPU_NEXT(first_cpu)) {
         tcg_kick_vcpu_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
                                            kick_tcg_thread, NULL);
         timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
@@ -1063,27 +1063,34 @@ static void qemu_tcg_destroy_vcpu(CPUState *cpu)
 
 static void qemu_wait_io_event_common(CPUState *cpu)
 {
+    atomic_mb_set(&cpu->thread_kicked, false);
     if (cpu->stop) {
         cpu->stop = false;
         cpu->stopped = true;
         qemu_cond_broadcast(&qemu_pause_cond);
     }
     process_queued_cpu_work(cpu);
-    cpu->thread_kicked = false;
+}
+
+static bool qemu_tcg_should_sleep(CPUState *cpu)
+{
+    if (mttcg_enabled) {
+        return cpu_thread_is_idle(cpu);
+    } else {
+        return all_cpu_threads_idle();
+    }
 }
 
 static void qemu_tcg_wait_io_event(CPUState *cpu)
 {
-    while (all_cpu_threads_idle()) {
+    while (qemu_tcg_should_sleep(cpu)) {
         stop_tcg_kick_timer();
         qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
     }
 
     start_tcg_kick_timer();
 
-    CPU_FOREACH(cpu) {
-        qemu_wait_io_event_common(cpu);
-    }
+    qemu_wait_io_event_common(cpu);
 }
 
 static void qemu_kvm_wait_io_event(CPUState *cpu)
@@ -1154,6 +1161,7 @@ static void *qemu_dummy_cpu_thread_fn(void *arg)
     qemu_thread_get_self(cpu->thread);
     cpu->thread_id = qemu_get_thread_id();
     cpu->can_do_io = 1;
+    current_cpu = cpu;
 
     sigemptyset(&waitset);
     sigaddset(&waitset, SIG_IPI);
@@ -1162,9 +1170,7 @@ static void *qemu_dummy_cpu_thread_fn(void *arg)
     cpu->created = true;
     qemu_cond_signal(&qemu_cpu_cond);
 
-    current_cpu = cpu;
     while (1) {
-        current_cpu = NULL;
         qemu_mutex_unlock_iothread();
         do {
             int sig;
@@ -1175,7 +1181,6 @@ static void *qemu_dummy_cpu_thread_fn(void *arg)
             exit(1);
         }
         qemu_mutex_lock_iothread();
-        current_cpu = cpu;
         qemu_wait_io_event_common(cpu);
     }
 
@@ -1287,7 +1292,7 @@ static void deal_with_unplugged_cpus(void)
  * elsewhere.
  */
 
-static void *qemu_tcg_cpu_thread_fn(void *arg)
+static void *qemu_tcg_rr_cpu_thread_fn(void *arg)
 {
     CPUState *cpu = arg;
 
@@ -1309,6 +1314,7 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
 
         /* process any pending work */
         CPU_FOREACH(cpu) {
+            current_cpu = cpu;
             qemu_wait_io_event_common(cpu);
         }
     }
@@ -1331,6 +1337,7 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
         while (cpu && !cpu->queued_work_first && !cpu->exit_request) {
 
             atomic_mb_set(&tcg_current_rr_cpu, cpu);
+            current_cpu = cpu;
 
             qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
                               (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
@@ -1342,7 +1349,7 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
                     cpu_handle_guest_debug(cpu);
                     break;
                 }
-            } else if (cpu->stop || cpu->stopped) {
+            } else if (cpu->stop) {
                 if (cpu->unplug) {
                     cpu = CPU_NEXT(cpu);
                 }
@@ -1361,7 +1368,7 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
 
         handle_icount_deadline();
 
-        qemu_tcg_wait_io_event(QTAILQ_FIRST(&cpus));
+        qemu_tcg_wait_io_event(cpu ? cpu : QTAILQ_FIRST(&cpus));
         deal_with_unplugged_cpus();
     }
 
@@ -1408,6 +1415,64 @@ static void CALLBACK dummy_apc_func(ULONG_PTR unused)
 }
 #endif
 
+/* Multi-threaded TCG
+ *
+ * In the multi-threaded case each vCPU has its own thread. The TLS
+ * variable current_cpu can be used deep in the code to find the
+ * current CPUState for a given thread.
+ */
+
+static void *qemu_tcg_cpu_thread_fn(void *arg)
+{
+    CPUState *cpu = arg;
+
+    rcu_register_thread();
+
+    qemu_mutex_lock_iothread();
+    qemu_thread_get_self(cpu->thread);
+
+    cpu->thread_id = qemu_get_thread_id();
+    cpu->created = true;
+    cpu->can_do_io = 1;
+    current_cpu = cpu;
+    qemu_cond_signal(&qemu_cpu_cond);
+
+    /* process any pending work */
+    cpu->exit_request = 1;
+
+    while (1) {
+        if (cpu_can_run(cpu)) {
+            int r;
+            r = tcg_cpu_exec(cpu);
+            switch (r) {
+            case EXCP_DEBUG:
+                cpu_handle_guest_debug(cpu);
+                break;
+            case EXCP_HALTED:
+                /* during start-up the vCPU is reset and the thread is
+                 * kicked several times. If we don't ensure we go back
+                 * to sleep in the halted state we won't cleanly
+                 * start-up when the vCPU is enabled.
+                 *
+                 * cpu->halted should ensure we sleep in wait_io_event
+                 */
+                g_assert(cpu->halted);
+                break;
+            default:
+                /* Ignore everything else? */
+                break;
+            }
+        }
+
+        handle_icount_deadline();
+
+        atomic_mb_set(&cpu->exit_request, 0);
+        qemu_tcg_wait_io_event(cpu);
+    }
+
+    return NULL;
+}
+
 static void qemu_cpu_kick_thread(CPUState *cpu)
 {
 #ifndef _WIN32
@@ -1438,7 +1503,7 @@ void qemu_cpu_kick(CPUState *cpu)
     qemu_cond_broadcast(cpu->halt_cond);
     if (tcg_enabled()) {
         cpu_exit(cpu);
-        /* Also ensure current RR cpu is kicked */
+        /* NOP unless doing single-thread RR */
         qemu_cpu_kick_rr_cpu();
     } else {
         if (hax_enabled()) {
@@ -1514,13 +1579,6 @@ void pause_all_vcpus(void)
 
     if (qemu_in_vcpu_thread()) {
         cpu_stop_current();
-        if (!kvm_enabled()) {
-            CPU_FOREACH(cpu) {
-                cpu->stop = false;
-                cpu->stopped = true;
-            }
-            return;
-        }
     }
 
     while (!all_vcpus_paused()) {
@@ -1569,29 +1627,43 @@ void cpu_remove_sync(CPUState *cpu)
 static void qemu_tcg_init_vcpu(CPUState *cpu)
 {
     char thread_name[VCPU_THREAD_NAME_SIZE];
-    static QemuCond *tcg_halt_cond;
-    static QemuThread *tcg_cpu_thread;
+    static QemuCond *single_tcg_halt_cond;
+    static QemuThread *single_tcg_cpu_thread;
 
-    /* share a single thread for all cpus with TCG */
-    if (!tcg_cpu_thread) {
+    if (qemu_tcg_mttcg_enabled() || !single_tcg_cpu_thread) {
         cpu->thread = g_malloc0(sizeof(QemuThread));
         cpu->halt_cond = g_malloc0(sizeof(QemuCond));
         qemu_cond_init(cpu->halt_cond);
-        tcg_halt_cond = cpu->halt_cond;
-        snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
+
+        if (qemu_tcg_mttcg_enabled()) {
+            /* create a thread per vCPU with TCG (MTTCG) */
+            parallel_cpus = true;
+            snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
                  cpu->cpu_index);
-        qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
-                           cpu, QEMU_THREAD_JOINABLE);
+
+            qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
+                               cpu, QEMU_THREAD_JOINABLE);
+
+        } else {
+            /* share a single thread for all cpus with TCG */
+            snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG");
+            qemu_thread_create(cpu->thread, thread_name,
+                               qemu_tcg_rr_cpu_thread_fn,
+                               cpu, QEMU_THREAD_JOINABLE);
+
+            single_tcg_halt_cond = cpu->halt_cond;
+            single_tcg_cpu_thread = cpu->thread;
+        }
 #ifdef _WIN32
         cpu->hThread = qemu_thread_get_handle(cpu->thread);
 #endif
         while (!cpu->created) {
             qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
         }
-        tcg_cpu_thread = cpu->thread;
     } else {
-        cpu->thread = tcg_cpu_thread;
-        cpu->halt_cond = tcg_halt_cond;
+        /* For non-MTTCG cases we share the thread */
+        cpu->thread = single_tcg_cpu_thread;
+        cpu->halt_cond = single_tcg_halt_cond;
     }
 }
 
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 12/24] tcg: handle EXCP_ATOMIC exception for system emulation
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (10 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 11/24] tcg: enable thread-per-vCPU Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 13/24] cputlb: add assert_cpu_is_self checks Alex Bennée
                   ` (12 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

From: Pranith Kumar <bobby.prani@gmail.com>

The patch enables handling atomic code in the guest. This should be
preferably done in cpu_handle_exception(), but the current assumptions
regarding when we can execute atomic sections cause a deadlock.

The current mechanism discards the flags which were set in atomic
execution. We ensure they are properly saved by calling the
cc->cpu_exec_enter/leave() functions around the loop.

As we are running cpu_exec_step_atomic() from the outermost loop we
need to avoid an abort() when single stepping over atomic code since
debug exception longjmp will point to the the setlongjmp in
cpu_exec(). We do this by setting a new jmp_env so that it jumps back
here on an exception.

Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
[AJB: tweak title, merge with new patches, add mmap_lock]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
CC: Paolo Bonzini <pbonzini@redhat.com>

---
v13
  - merge in mttcg: Set jmp_env to handle exit from tb_gen_code
---
 cpu-exec.c | 43 +++++++++++++++++++++++++++++++------------
 cpus.c     |  9 +++++++++
 2 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/cpu-exec.c b/cpu-exec.c
index 6514bc77ee..f3c78a97a4 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -228,24 +228,43 @@ static void cpu_exec_nocache(CPUState *cpu, int max_cycles,
 
 static void cpu_exec_step(CPUState *cpu)
 {
+    CPUClass *cc = CPU_GET_CLASS(cpu);
     CPUArchState *env = (CPUArchState *)cpu->env_ptr;
     TranslationBlock *tb;
     target_ulong cs_base, pc;
     uint32_t flags;
 
     cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
-    tb_lock();
-    tb = tb_gen_code(cpu, pc, cs_base, flags,
-                     1 | CF_NOCACHE | CF_IGNORE_ICOUNT);
-    tb->orig_tb = NULL;
-    tb_unlock();
-    /* execute the generated code */
-    trace_exec_tb_nocache(tb, pc);
-    cpu_tb_exec(cpu, tb);
-    tb_lock();
-    tb_phys_invalidate(tb, -1);
-    tb_free(tb);
-    tb_unlock();
+    if (sigsetjmp(cpu->jmp_env, 0) == 0) {
+        mmap_lock();
+        tb_lock();
+        tb = tb_gen_code(cpu, pc, cs_base, flags,
+                         1 | CF_NOCACHE | CF_IGNORE_ICOUNT);
+        tb->orig_tb = NULL;
+        tb_unlock();
+        mmap_unlock();
+
+        cc->cpu_exec_enter(cpu);
+        /* execute the generated code */
+        trace_exec_tb_nocache(tb, pc);
+        cpu_tb_exec(cpu, tb);
+        cc->cpu_exec_exit(cpu);
+
+        tb_lock();
+        tb_phys_invalidate(tb, -1);
+        tb_free(tb);
+        tb_unlock();
+    } else {
+        /* We may have exited due to another problem here, so we need
+         * to reset any tb_locks we may have taken but didn't release.
+         * The mmap_lock is dropped by tb_gen_code if it runs out of
+         * memory.
+         */
+#ifndef CONFIG_SOFTMMU
+        tcg_debug_assert(!have_mmap_lock());
+#endif
+        tb_lock_reset();
+    }
 }
 
 void cpu_exec_step_atomic(CPUState *cpu)
diff --git a/cpus.c b/cpus.c
index 6315a1f86a..559a0805bc 100644
--- a/cpus.c
+++ b/cpus.c
@@ -1348,6 +1348,11 @@ static void *qemu_tcg_rr_cpu_thread_fn(void *arg)
                 if (r == EXCP_DEBUG) {
                     cpu_handle_guest_debug(cpu);
                     break;
+                } else if (r == EXCP_ATOMIC) {
+                    qemu_mutex_unlock_iothread();
+                    cpu_exec_step_atomic(cpu);
+                    qemu_mutex_lock_iothread();
+                    break;
                 }
             } else if (cpu->stop) {
                 if (cpu->unplug) {
@@ -1458,6 +1463,10 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
                  */
                 g_assert(cpu->halted);
                 break;
+            case EXCP_ATOMIC:
+                qemu_mutex_unlock_iothread();
+                cpu_exec_step_atomic(cpu);
+                qemu_mutex_lock_iothread();
             default:
                 /* Ignore everything else? */
                 break;
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 13/24] cputlb: add assert_cpu_is_self checks
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (11 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 12/24] tcg: handle EXCP_ATOMIC exception for system emulation Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 14/24] cputlb: tweak qemu_ram_addr_from_host_nofail reporting Alex Bennée
                   ` (11 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

For SoftMMU the TLB flushes are an example of a task that can be
triggered on one vCPU by another. To deal with this properly we need to
use safe work to ensure these changes are done safely. The new assert
can be enabled while debugging to catch these cases.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
 cputlb.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/cputlb.c b/cputlb.c
index 1cc9d9da51..af0e65cd2c 100644
--- a/cputlb.c
+++ b/cputlb.c
@@ -58,6 +58,12 @@
     } \
 } while (0)
 
+#define assert_cpu_is_self(this_cpu) do {                         \
+        if (DEBUG_TLB_GATE) {                                     \
+            g_assert(!cpu->created || qemu_cpu_is_self(cpu));     \
+        }                                                         \
+    } while (0)
+
 /* statistics */
 int tlb_flush_count;
 
@@ -70,6 +76,9 @@ void tlb_flush(CPUState *cpu)
 {
     CPUArchState *env = cpu->env_ptr;
 
+    assert_cpu_is_self(cpu);
+    tlb_debug("(count: %d)\n", tlb_flush_count++);
+
     memset(env->tlb_table, -1, sizeof(env->tlb_table));
     memset(env->tlb_v_table, -1, sizeof(env->tlb_v_table));
     memset(cpu->tb_jmp_cache, 0, sizeof(cpu->tb_jmp_cache));
@@ -77,13 +86,13 @@ void tlb_flush(CPUState *cpu)
     env->vtlb_index = 0;
     env->tlb_flush_addr = -1;
     env->tlb_flush_mask = 0;
-    tlb_flush_count++;
 }
 
 static inline void v_tlb_flush_by_mmuidx(CPUState *cpu, va_list argp)
 {
     CPUArchState *env = cpu->env_ptr;
 
+    assert_cpu_is_self(cpu);
     tlb_debug("start\n");
 
     for (;;) {
@@ -128,6 +137,7 @@ void tlb_flush_page(CPUState *cpu, target_ulong addr)
     int i;
     int mmu_idx;
 
+    assert_cpu_is_self(cpu);
     tlb_debug("page :" TARGET_FMT_lx "\n", addr);
 
     /* Check if we need to flush due to large pages.  */
@@ -165,6 +175,7 @@ void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, ...)
 
     va_start(argp, addr);
 
+    assert_cpu_is_self(cpu);
     tlb_debug("addr "TARGET_FMT_lx"\n", addr);
 
     /* Check if we need to flush due to large pages.  */
@@ -253,6 +264,8 @@ void tlb_reset_dirty(CPUState *cpu, ram_addr_t start1, ram_addr_t length)
 
     int mmu_idx;
 
+    assert_cpu_is_self(cpu);
+
     env = cpu->env_ptr;
     for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
         unsigned int i;
@@ -284,6 +297,8 @@ void tlb_set_dirty(CPUState *cpu, target_ulong vaddr)
     int i;
     int mmu_idx;
 
+    assert_cpu_is_self(cpu);
+
     vaddr &= TARGET_PAGE_MASK;
     i = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
     for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
@@ -343,6 +358,7 @@ void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
     unsigned vidx = env->vtlb_index++ % CPU_VTLB_SIZE;
     int asidx = cpu_asidx_from_attrs(cpu, attrs);
 
+    assert_cpu_is_self(cpu);
     assert(size >= TARGET_PAGE_SIZE);
     if (size != TARGET_PAGE_SIZE) {
         tlb_add_large_page(env, vaddr, size);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 14/24] cputlb: tweak qemu_ram_addr_from_host_nofail reporting
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (12 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 13/24] cputlb: add assert_cpu_is_self checks Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 15/24] cputlb: introduce tlb_flush_* async work Alex Bennée
                   ` (10 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

This moves the helper function closer to where it is called and updates
the error message to report via error_report instead of the deprecated
fprintf.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
 cputlb.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/cputlb.c b/cputlb.c
index af0e65cd2c..94fa9977c5 100644
--- a/cputlb.c
+++ b/cputlb.c
@@ -246,18 +246,6 @@ void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry, uintptr_t start,
     }
 }
 
-static inline ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr)
-{
-    ram_addr_t ram_addr;
-
-    ram_addr = qemu_ram_addr_from_host(ptr);
-    if (ram_addr == RAM_ADDR_INVALID) {
-        fprintf(stderr, "Bad ram pointer %p\n", ptr);
-        abort();
-    }
-    return ram_addr;
-}
-
 void tlb_reset_dirty(CPUState *cpu, ram_addr_t start1, ram_addr_t length)
 {
     CPUArchState *env;
@@ -469,6 +457,18 @@ static void report_bad_exec(CPUState *cpu, target_ulong addr)
     log_cpu_state_mask(LOG_GUEST_ERROR, cpu, CPU_DUMP_FPU | CPU_DUMP_CCOP);
 }
 
+static inline ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr)
+{
+    ram_addr_t ram_addr;
+
+    ram_addr = qemu_ram_addr_from_host(ptr);
+    if (ram_addr == RAM_ADDR_INVALID) {
+        error_report("Bad ram pointer %p", ptr);
+        abort();
+    }
+    return ram_addr;
+}
+
 /* NOTE: this function can trigger an exception */
 /* NOTE2: the returned address is not exactly the physical address: it
  * is actually a ram_addr_t (in system mode; the user mode emulation
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 15/24] cputlb: introduce tlb_flush_* async work.
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (13 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 14/24] cputlb: tweak qemu_ram_addr_from_host_nofail reporting Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 16/24] cputlb and arm/sparc targets: convert mmuidx flushes from varg to bitmap Alex Bennée
                   ` (9 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

From: KONRAD Frederic <fred.konrad@greensocs.com>

Some architectures allow to flush the tlb of other VCPUs. This is not a problem
when we have only one thread for all VCPUs but it definitely needs to be an
asynchronous work when we are in true multithreaded work.

We take the tb_lock() when doing this to avoid racing with other threads
which may be invalidating TB's at the same time. The alternative would
be to use proper atomic primitives to clear the tlb entries en-mass.

This patch doesn't do anything to protect other cputlb function being
called in MTTCG mode making cross vCPU changes.

Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
[AJB: remove need for g_malloc on defer, make check fixes, tb_lock]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>

---
v8
  - fix merge failure mentioning global flush
v6 (base patches)
  - don't use cmpxchg_bool (we drop it later anyway)
  - use RUN_ON_CPU macros instead of inlines
  - bug out of tlb_flush if !tcg_enabled() (MacOSX make check failure)
v5 (base patches)
  - take tb_lock() for memset
  - ensure tb_flush_page properly asyncs work for other vCPUs
  - use run_on_cpu_data
v4 (base_patches)
  - brought forward from arm enabling series
  - restore pending_tlb_flush flag
v1
  - Remove tlb_flush_all just do the check in tlb_flush.
  - remove the need to g_malloc
  - tlb_flush calls direct if !cpu->created
---
 cputlb.c                | 66 +++++++++++++++++++++++++++++++++++++++++++++++--
 include/exec/exec-all.h |  1 +
 include/qom/cpu.h       |  6 +++++
 3 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/cputlb.c b/cputlb.c
index 94fa9977c5..5dfd3c3ba9 100644
--- a/cputlb.c
+++ b/cputlb.c
@@ -64,6 +64,10 @@
         }                                                         \
     } while (0)
 
+/* run_on_cpu_data.target_ptr should always be big enough for a
+ * target_ulong even on 32 bit builds */
+QEMU_BUILD_BUG_ON(sizeof(target_ulong) > sizeof(run_on_cpu_data));
+
 /* statistics */
 int tlb_flush_count;
 
@@ -72,13 +76,22 @@ int tlb_flush_count;
  * flushing more entries than required is only an efficiency issue,
  * not a correctness issue.
  */
-void tlb_flush(CPUState *cpu)
+static void tlb_flush_nocheck(CPUState *cpu)
 {
     CPUArchState *env = cpu->env_ptr;
 
+    /* The QOM tests will trigger tlb_flushes without setting up TCG
+     * so we bug out here in that case.
+     */
+    if (!tcg_enabled()) {
+        return;
+    }
+
     assert_cpu_is_self(cpu);
     tlb_debug("(count: %d)\n", tlb_flush_count++);
 
+    tb_lock();
+
     memset(env->tlb_table, -1, sizeof(env->tlb_table));
     memset(env->tlb_v_table, -1, sizeof(env->tlb_v_table));
     memset(cpu->tb_jmp_cache, 0, sizeof(cpu->tb_jmp_cache));
@@ -86,6 +99,27 @@ void tlb_flush(CPUState *cpu)
     env->vtlb_index = 0;
     env->tlb_flush_addr = -1;
     env->tlb_flush_mask = 0;
+
+    tb_unlock();
+
+    atomic_mb_set(&cpu->pending_tlb_flush, false);
+}
+
+static void tlb_flush_global_async_work(CPUState *cpu, run_on_cpu_data data)
+{
+    tlb_flush_nocheck(cpu);
+}
+
+void tlb_flush(CPUState *cpu)
+{
+    if (cpu->created && !qemu_cpu_is_self(cpu)) {
+        if (atomic_cmpxchg(&cpu->pending_tlb_flush, false, true) == true) {
+            async_run_on_cpu(cpu, tlb_flush_global_async_work,
+                             RUN_ON_CPU_NULL);
+        }
+    } else {
+        tlb_flush_nocheck(cpu);
+    }
 }
 
 static inline void v_tlb_flush_by_mmuidx(CPUState *cpu, va_list argp)
@@ -95,6 +129,8 @@ static inline void v_tlb_flush_by_mmuidx(CPUState *cpu, va_list argp)
     assert_cpu_is_self(cpu);
     tlb_debug("start\n");
 
+    tb_lock();
+
     for (;;) {
         int mmu_idx = va_arg(argp, int);
 
@@ -109,6 +145,8 @@ static inline void v_tlb_flush_by_mmuidx(CPUState *cpu, va_list argp)
     }
 
     memset(cpu->tb_jmp_cache, 0, sizeof(cpu->tb_jmp_cache));
+
+    tb_unlock();
 }
 
 void tlb_flush_by_mmuidx(CPUState *cpu, ...)
@@ -131,13 +169,15 @@ static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
     }
 }
 
-void tlb_flush_page(CPUState *cpu, target_ulong addr)
+static void tlb_flush_page_async_work(CPUState *cpu, run_on_cpu_data data)
 {
     CPUArchState *env = cpu->env_ptr;
+    target_ulong addr = (target_ulong) data.target_ptr;
     int i;
     int mmu_idx;
 
     assert_cpu_is_self(cpu);
+
     tlb_debug("page :" TARGET_FMT_lx "\n", addr);
 
     /* Check if we need to flush due to large pages.  */
@@ -167,6 +207,18 @@ void tlb_flush_page(CPUState *cpu, target_ulong addr)
     tb_flush_jmp_cache(cpu, addr);
 }
 
+void tlb_flush_page(CPUState *cpu, target_ulong addr)
+{
+    tlb_debug("page :" TARGET_FMT_lx "\n", addr);
+
+    if (!qemu_cpu_is_self(cpu)) {
+        async_run_on_cpu(cpu, tlb_flush_page_async_work,
+                         RUN_ON_CPU_TARGET_PTR(addr));
+    } else {
+        tlb_flush_page_async_work(cpu, RUN_ON_CPU_TARGET_PTR(addr));
+    }
+}
+
 void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, ...)
 {
     CPUArchState *env = cpu->env_ptr;
@@ -213,6 +265,16 @@ void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, ...)
     tb_flush_jmp_cache(cpu, addr);
 }
 
+void tlb_flush_page_all(target_ulong addr)
+{
+    CPUState *cpu;
+
+    CPU_FOREACH(cpu) {
+        async_run_on_cpu(cpu, tlb_flush_page_async_work,
+                         RUN_ON_CPU_TARGET_PTR(addr));
+    }
+}
+
 /* update the TLBs so that writes to code in the virtual page 'addr'
    can be detected */
 void tlb_protect_code(ram_addr_t ram_addr)
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index 82f0e12327..c694e3482b 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -158,6 +158,7 @@ void tlb_set_page(CPUState *cpu, target_ulong vaddr,
 void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr);
 void probe_write(CPUArchState *env, target_ulong addr, int mmu_idx,
                  uintptr_t retaddr);
+void tlb_flush_page_all(target_ulong addr);
 #else
 static inline void tlb_flush_page(CPUState *cpu, target_ulong addr)
 {
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 10db89b16a..e80bf7a64a 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -402,6 +402,12 @@ struct CPUState {
 
     bool hax_vcpu_dirty;
     struct hax_vcpu_state *hax_vcpu;
+
+    /* The pending_tlb_flush flag is set and cleared atomically to
+     * avoid potential races. The aim of the flag is to avoid
+     * unnecessary flushes.
+     */
+    bool pending_tlb_flush;
 };
 
 QTAILQ_HEAD(CPUTailQ, CPUState);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 16/24] cputlb and arm/sparc targets: convert mmuidx flushes from varg to bitmap
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (14 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 15/24] cputlb: introduce tlb_flush_* async work Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 17/24] cputlb: add tlb_flush_by_mmuidx async routines Alex Bennée
                   ` (8 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite,
	Mark Cave-Ayland, Artyom Tarasenko, open list:ARM

While the vargs approach was flexible the original MTTCG ended up
having munge the bits to a bitmap so the data could be used in
deferred work helpers. Instead of hiding that in cputlb we push the
change to the API to make it take a bitmap of MMU indexes instead.

For ARM some the resulting flushes end up being quite long so to aid
readability I've tended to move the index shifting to a new line so
all the bits being or-ed together line up nicely, for example:

    tlb_flush_page_by_mmuidx(other_cs, pageaddr,
                             (1 << ARMMMUIdx_S1SE1) |
                             (1 << ARMMMUIdx_S1SE0));

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
[AT: SPARC parts only]
Reviewed-by: Artyom Tarasenko <atar4qemu@gmail.com>
Reviewed-by: Richard Henderson <rth@twiddle.net>
[PM: ARM parts only]
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

---
v9
  - use (1 << ARMMMUIdx_foo) form to reduce churn in ARM
  - checkpatch fixes (mostly > 80 chars)
  - add r-b tag
v10
  - add r-b tag
---
 cputlb.c                   |  60 +++++++++--------------
 include/exec/exec-all.h    |  13 ++---
 target/arm/helper.c        | 116 ++++++++++++++++++++++++++++-----------------
 target/sparc/ldst_helper.c |   8 ++--
 4 files changed, 107 insertions(+), 90 deletions(-)

diff --git a/cputlb.c b/cputlb.c
index 5dfd3c3ba9..97e5c12de8 100644
--- a/cputlb.c
+++ b/cputlb.c
@@ -122,26 +122,25 @@ void tlb_flush(CPUState *cpu)
     }
 }
 
-static inline void v_tlb_flush_by_mmuidx(CPUState *cpu, va_list argp)
+static inline void v_tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap)
 {
     CPUArchState *env = cpu->env_ptr;
+    unsigned long mmu_idx_bitmask = idxmap;
+    int mmu_idx;
 
     assert_cpu_is_self(cpu);
     tlb_debug("start\n");
 
     tb_lock();
 
-    for (;;) {
-        int mmu_idx = va_arg(argp, int);
-
-        if (mmu_idx < 0) {
-            break;
-        }
+    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
 
-        tlb_debug("%d\n", mmu_idx);
+        if (test_bit(mmu_idx, &mmu_idx_bitmask)) {
+            tlb_debug("%d\n", mmu_idx);
 
-        memset(env->tlb_table[mmu_idx], -1, sizeof(env->tlb_table[0]));
-        memset(env->tlb_v_table[mmu_idx], -1, sizeof(env->tlb_v_table[0]));
+            memset(env->tlb_table[mmu_idx], -1, sizeof(env->tlb_table[0]));
+            memset(env->tlb_v_table[mmu_idx], -1, sizeof(env->tlb_v_table[0]));
+        }
     }
 
     memset(cpu->tb_jmp_cache, 0, sizeof(cpu->tb_jmp_cache));
@@ -149,12 +148,9 @@ static inline void v_tlb_flush_by_mmuidx(CPUState *cpu, va_list argp)
     tb_unlock();
 }
 
-void tlb_flush_by_mmuidx(CPUState *cpu, ...)
+void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap)
 {
-    va_list argp;
-    va_start(argp, cpu);
-    v_tlb_flush_by_mmuidx(cpu, argp);
-    va_end(argp);
+    v_tlb_flush_by_mmuidx(cpu, idxmap);
 }
 
 static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
@@ -219,13 +215,11 @@ void tlb_flush_page(CPUState *cpu, target_ulong addr)
     }
 }
 
-void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, ...)
+void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, uint16_t idxmap)
 {
     CPUArchState *env = cpu->env_ptr;
-    int i, k;
-    va_list argp;
-
-    va_start(argp, addr);
+    unsigned long mmu_idx_bitmap = idxmap;
+    int i, page, mmu_idx;
 
     assert_cpu_is_self(cpu);
     tlb_debug("addr "TARGET_FMT_lx"\n", addr);
@@ -236,31 +230,23 @@ void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, ...)
                   TARGET_FMT_lx "/" TARGET_FMT_lx ")\n",
                   env->tlb_flush_addr, env->tlb_flush_mask);
 
-        v_tlb_flush_by_mmuidx(cpu, argp);
-        va_end(argp);
+        v_tlb_flush_by_mmuidx(cpu, idxmap);
         return;
     }
 
     addr &= TARGET_PAGE_MASK;
-    i = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
-
-    for (;;) {
-        int mmu_idx = va_arg(argp, int);
+    page = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
 
-        if (mmu_idx < 0) {
-            break;
-        }
-
-        tlb_debug("idx %d\n", mmu_idx);
-
-        tlb_flush_entry(&env->tlb_table[mmu_idx][i], addr);
+    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
+        if (test_bit(mmu_idx, &mmu_idx_bitmap)) {
+            tlb_flush_entry(&env->tlb_table[mmu_idx][page], addr);
 
-        /* check whether there are vltb entries that need to be flushed */
-        for (k = 0; k < CPU_VTLB_SIZE; k++) {
-            tlb_flush_entry(&env->tlb_v_table[mmu_idx][k], addr);
+            /* check whether there are vltb entries that need to be flushed */
+            for (i = 0; i < CPU_VTLB_SIZE; i++) {
+                tlb_flush_entry(&env->tlb_v_table[mmu_idx][i], addr);
+            }
         }
     }
-    va_end(argp);
 
     tb_flush_jmp_cache(cpu, addr);
 }
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index c694e3482b..e94e6849dd 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -106,21 +106,22 @@ void tlb_flush(CPUState *cpu);
  * tlb_flush_page_by_mmuidx:
  * @cpu: CPU whose TLB should be flushed
  * @addr: virtual address of page to be flushed
- * @...: list of MMU indexes to flush, terminated by a negative value
+ * @idxmap: bitmap of MMU indexes to flush
  *
  * Flush one page from the TLB of the specified CPU, for the specified
  * MMU indexes.
  */
-void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, ...);
+void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr,
+                              uint16_t idxmap);
 /**
  * tlb_flush_by_mmuidx:
  * @cpu: CPU whose TLB should be flushed
- * @...: list of MMU indexes to flush, terminated by a negative value
+ * @idxmap: bitmap of MMU indexes to flush
  *
  * Flush all entries from the TLB of the specified CPU, for the specified
  * MMU indexes.
  */
-void tlb_flush_by_mmuidx(CPUState *cpu, ...);
+void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap);
 /**
  * tlb_set_page_with_attrs:
  * @cpu: CPU to add this TLB entry for
@@ -169,11 +170,11 @@ static inline void tlb_flush(CPUState *cpu)
 }
 
 static inline void tlb_flush_page_by_mmuidx(CPUState *cpu,
-                                            target_ulong addr, ...)
+                                            target_ulong addr, uint16_t idxmap)
 {
 }
 
-static inline void tlb_flush_by_mmuidx(CPUState *cpu, ...)
+static inline void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap)
 {
 }
 #endif
diff --git a/target/arm/helper.c b/target/arm/helper.c
index 753a69d40d..b41d0494d1 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -578,8 +578,10 @@ static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
 {
     CPUState *cs = ENV_GET_CPU(env);
 
-    tlb_flush_by_mmuidx(cs, ARMMMUIdx_S12NSE1, ARMMMUIdx_S12NSE0,
-                        ARMMMUIdx_S2NS, -1);
+    tlb_flush_by_mmuidx(cs,
+                        (1 << ARMMMUIdx_S12NSE1) |
+                        (1 << ARMMMUIdx_S12NSE0) |
+                        (1 << ARMMMUIdx_S2NS));
 }
 
 static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -588,8 +590,10 @@ static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
     CPUState *other_cs;
 
     CPU_FOREACH(other_cs) {
-        tlb_flush_by_mmuidx(other_cs, ARMMMUIdx_S12NSE1,
-                            ARMMMUIdx_S12NSE0, ARMMMUIdx_S2NS, -1);
+        tlb_flush_by_mmuidx(other_cs,
+                            (1 << ARMMMUIdx_S12NSE1) |
+                            (1 << ARMMMUIdx_S12NSE0) |
+                            (1 << ARMMMUIdx_S2NS));
     }
 }
 
@@ -611,7 +615,7 @@ static void tlbiipas2_write(CPUARMState *env, const ARMCPRegInfo *ri,
 
     pageaddr = sextract64(value << 12, 0, 40);
 
-    tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdx_S2NS, -1);
+    tlb_flush_page_by_mmuidx(cs, pageaddr, (1 << ARMMMUIdx_S2NS));
 }
 
 static void tlbiipas2_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -627,7 +631,7 @@ static void tlbiipas2_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
     pageaddr = sextract64(value << 12, 0, 40);
 
     CPU_FOREACH(other_cs) {
-        tlb_flush_page_by_mmuidx(other_cs, pageaddr, ARMMMUIdx_S2NS, -1);
+        tlb_flush_page_by_mmuidx(other_cs, pageaddr, (1 << ARMMMUIdx_S2NS));
     }
 }
 
@@ -636,7 +640,7 @@ static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
 {
     CPUState *cs = ENV_GET_CPU(env);
 
-    tlb_flush_by_mmuidx(cs, ARMMMUIdx_S1E2, -1);
+    tlb_flush_by_mmuidx(cs, (1 << ARMMMUIdx_S1E2));
 }
 
 static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -645,7 +649,7 @@ static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
     CPUState *other_cs;
 
     CPU_FOREACH(other_cs) {
-        tlb_flush_by_mmuidx(other_cs, ARMMMUIdx_S1E2, -1);
+        tlb_flush_by_mmuidx(other_cs, (1 << ARMMMUIdx_S1E2));
     }
 }
 
@@ -655,7 +659,7 @@ static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
     CPUState *cs = ENV_GET_CPU(env);
     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
 
-    tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdx_S1E2, -1);
+    tlb_flush_page_by_mmuidx(cs, pageaddr, (1 << ARMMMUIdx_S1E2));
 }
 
 static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -665,7 +669,7 @@ static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
 
     CPU_FOREACH(other_cs) {
-        tlb_flush_page_by_mmuidx(other_cs, pageaddr, ARMMMUIdx_S1E2, -1);
+        tlb_flush_page_by_mmuidx(other_cs, pageaddr, (1 << ARMMMUIdx_S1E2));
     }
 }
 
@@ -2542,8 +2546,10 @@ static void vttbr_write(CPUARMState *env, const ARMCPRegInfo *ri,
 
     /* Accesses to VTTBR may change the VMID so we must flush the TLB.  */
     if (raw_read(env, ri) != value) {
-        tlb_flush_by_mmuidx(cs, ARMMMUIdx_S12NSE1, ARMMMUIdx_S12NSE0,
-                            ARMMMUIdx_S2NS, -1);
+        tlb_flush_by_mmuidx(cs,
+                            (1 << ARMMMUIdx_S12NSE1) |
+                            (1 << ARMMMUIdx_S12NSE0) |
+                            (1 << ARMMMUIdx_S2NS));
         raw_write(env, ri, value);
     }
 }
@@ -2902,9 +2908,13 @@ static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
     CPUState *cs = CPU(cpu);
 
     if (arm_is_secure_below_el3(env)) {
-        tlb_flush_by_mmuidx(cs, ARMMMUIdx_S1SE1, ARMMMUIdx_S1SE0, -1);
+        tlb_flush_by_mmuidx(cs,
+                            (1 << ARMMMUIdx_S1SE1) |
+                            (1 << ARMMMUIdx_S1SE0));
     } else {
-        tlb_flush_by_mmuidx(cs, ARMMMUIdx_S12NSE1, ARMMMUIdx_S12NSE0, -1);
+        tlb_flush_by_mmuidx(cs,
+                            (1 << ARMMMUIdx_S12NSE1) |
+                            (1 << ARMMMUIdx_S12NSE0));
     }
 }
 
@@ -2916,10 +2926,13 @@ static void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
 
     CPU_FOREACH(other_cs) {
         if (sec) {
-            tlb_flush_by_mmuidx(other_cs, ARMMMUIdx_S1SE1, ARMMMUIdx_S1SE0, -1);
+            tlb_flush_by_mmuidx(other_cs,
+                                (1 << ARMMMUIdx_S1SE1) |
+                                (1 << ARMMMUIdx_S1SE0));
         } else {
-            tlb_flush_by_mmuidx(other_cs, ARMMMUIdx_S12NSE1,
-                                ARMMMUIdx_S12NSE0, -1);
+            tlb_flush_by_mmuidx(other_cs,
+                                (1 << ARMMMUIdx_S12NSE1) |
+                                (1 << ARMMMUIdx_S12NSE0));
         }
     }
 }
@@ -2935,13 +2948,19 @@ static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
     CPUState *cs = CPU(cpu);
 
     if (arm_is_secure_below_el3(env)) {
-        tlb_flush_by_mmuidx(cs, ARMMMUIdx_S1SE1, ARMMMUIdx_S1SE0, -1);
+        tlb_flush_by_mmuidx(cs,
+                            (1 << ARMMMUIdx_S1SE1) |
+                            (1 << ARMMMUIdx_S1SE0));
     } else {
         if (arm_feature(env, ARM_FEATURE_EL2)) {
-            tlb_flush_by_mmuidx(cs, ARMMMUIdx_S12NSE1, ARMMMUIdx_S12NSE0,
-                                ARMMMUIdx_S2NS, -1);
+            tlb_flush_by_mmuidx(cs,
+                                (1 << ARMMMUIdx_S12NSE1) |
+                                (1 << ARMMMUIdx_S12NSE0) |
+                                (1 << ARMMMUIdx_S2NS));
         } else {
-            tlb_flush_by_mmuidx(cs, ARMMMUIdx_S12NSE1, ARMMMUIdx_S12NSE0, -1);
+            tlb_flush_by_mmuidx(cs,
+                                (1 << ARMMMUIdx_S12NSE1) |
+                                (1 << ARMMMUIdx_S12NSE0));
         }
     }
 }
@@ -2952,7 +2971,7 @@ static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri,
     ARMCPU *cpu = arm_env_get_cpu(env);
     CPUState *cs = CPU(cpu);
 
-    tlb_flush_by_mmuidx(cs, ARMMMUIdx_S1E2, -1);
+    tlb_flush_by_mmuidx(cs, (1 << ARMMMUIdx_S1E2));
 }
 
 static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -2961,7 +2980,7 @@ static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
     ARMCPU *cpu = arm_env_get_cpu(env);
     CPUState *cs = CPU(cpu);
 
-    tlb_flush_by_mmuidx(cs, ARMMMUIdx_S1E3, -1);
+    tlb_flush_by_mmuidx(cs, (1 << ARMMMUIdx_S1E3));
 }
 
 static void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -2977,13 +2996,18 @@ static void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
 
     CPU_FOREACH(other_cs) {
         if (sec) {
-            tlb_flush_by_mmuidx(other_cs, ARMMMUIdx_S1SE1, ARMMMUIdx_S1SE0, -1);
+            tlb_flush_by_mmuidx(other_cs,
+                                (1 << ARMMMUIdx_S1SE1) |
+                                (1 << ARMMMUIdx_S1SE0));
         } else if (has_el2) {
-            tlb_flush_by_mmuidx(other_cs, ARMMMUIdx_S12NSE1,
-                                ARMMMUIdx_S12NSE0, ARMMMUIdx_S2NS, -1);
+            tlb_flush_by_mmuidx(other_cs,
+                                (1 << ARMMMUIdx_S12NSE1) |
+                                (1 << ARMMMUIdx_S12NSE0) |
+                                (1 << ARMMMUIdx_S2NS));
         } else {
-            tlb_flush_by_mmuidx(other_cs, ARMMMUIdx_S12NSE1,
-                                ARMMMUIdx_S12NSE0, -1);
+            tlb_flush_by_mmuidx(other_cs,
+                                (1 << ARMMMUIdx_S12NSE1) |
+                                (1 << ARMMMUIdx_S12NSE0));
         }
     }
 }
@@ -2994,7 +3018,7 @@ static void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
     CPUState *other_cs;
 
     CPU_FOREACH(other_cs) {
-        tlb_flush_by_mmuidx(other_cs, ARMMMUIdx_S1E2, -1);
+        tlb_flush_by_mmuidx(other_cs, (1 << ARMMMUIdx_S1E2));
     }
 }
 
@@ -3004,7 +3028,7 @@ static void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
     CPUState *other_cs;
 
     CPU_FOREACH(other_cs) {
-        tlb_flush_by_mmuidx(other_cs, ARMMMUIdx_S1E3, -1);
+        tlb_flush_by_mmuidx(other_cs, (1 << ARMMMUIdx_S1E3));
     }
 }
 
@@ -3021,11 +3045,13 @@ static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
     uint64_t pageaddr = sextract64(value << 12, 0, 56);
 
     if (arm_is_secure_below_el3(env)) {
-        tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdx_S1SE1,
-                                 ARMMMUIdx_S1SE0, -1);
+        tlb_flush_page_by_mmuidx(cs, pageaddr,
+                                 (1 << ARMMMUIdx_S1SE1) |
+                                 (1 << ARMMMUIdx_S1SE0));
     } else {
-        tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdx_S12NSE1,
-                                 ARMMMUIdx_S12NSE0, -1);
+        tlb_flush_page_by_mmuidx(cs, pageaddr,
+                                 (1 << ARMMMUIdx_S12NSE1) |
+                                 (1 << ARMMMUIdx_S12NSE0));
     }
 }
 
@@ -3040,7 +3066,7 @@ static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
     CPUState *cs = CPU(cpu);
     uint64_t pageaddr = sextract64(value << 12, 0, 56);
 
-    tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdx_S1E2, -1);
+    tlb_flush_page_by_mmuidx(cs, pageaddr, (1 << ARMMMUIdx_S1E2));
 }
 
 static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -3054,7 +3080,7 @@ static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
     CPUState *cs = CPU(cpu);
     uint64_t pageaddr = sextract64(value << 12, 0, 56);
 
-    tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdx_S1E3, -1);
+    tlb_flush_page_by_mmuidx(cs, pageaddr, (1 << ARMMMUIdx_S1E3));
 }
 
 static void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -3066,11 +3092,13 @@ static void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
 
     CPU_FOREACH(other_cs) {
         if (sec) {
-            tlb_flush_page_by_mmuidx(other_cs, pageaddr, ARMMMUIdx_S1SE1,
-                                     ARMMMUIdx_S1SE0, -1);
+            tlb_flush_page_by_mmuidx(other_cs, pageaddr,
+                                     (1 << ARMMMUIdx_S1SE1) |
+                                     (1 << ARMMMUIdx_S1SE0));
         } else {
-            tlb_flush_page_by_mmuidx(other_cs, pageaddr, ARMMMUIdx_S12NSE1,
-                                     ARMMMUIdx_S12NSE0, -1);
+            tlb_flush_page_by_mmuidx(other_cs, pageaddr,
+                                     (1 << ARMMMUIdx_S12NSE1) |
+                                     (1 << ARMMMUIdx_S12NSE0));
         }
     }
 }
@@ -3082,7 +3110,7 @@ static void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
     uint64_t pageaddr = sextract64(value << 12, 0, 56);
 
     CPU_FOREACH(other_cs) {
-        tlb_flush_page_by_mmuidx(other_cs, pageaddr, ARMMMUIdx_S1E2, -1);
+        tlb_flush_page_by_mmuidx(other_cs, pageaddr, (1 << ARMMMUIdx_S1E2));
     }
 }
 
@@ -3093,7 +3121,7 @@ static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
     uint64_t pageaddr = sextract64(value << 12, 0, 56);
 
     CPU_FOREACH(other_cs) {
-        tlb_flush_page_by_mmuidx(other_cs, pageaddr, ARMMMUIdx_S1E3, -1);
+        tlb_flush_page_by_mmuidx(other_cs, pageaddr, (1 << ARMMMUIdx_S1E3));
     }
 }
 
@@ -3116,7 +3144,7 @@ static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
 
     pageaddr = sextract64(value << 12, 0, 48);
 
-    tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdx_S2NS, -1);
+    tlb_flush_page_by_mmuidx(cs, pageaddr, (1 << ARMMMUIdx_S2NS));
 }
 
 static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -3132,7 +3160,7 @@ static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
     pageaddr = sextract64(value << 12, 0, 48);
 
     CPU_FOREACH(other_cs) {
-        tlb_flush_page_by_mmuidx(other_cs, pageaddr, ARMMMUIdx_S2NS, -1);
+        tlb_flush_page_by_mmuidx(other_cs, pageaddr, (1 << ARMMMUIdx_S2NS));
     }
 }
 
diff --git a/target/sparc/ldst_helper.c b/target/sparc/ldst_helper.c
index 2c05d6af75..57968d9143 100644
--- a/target/sparc/ldst_helper.c
+++ b/target/sparc/ldst_helper.c
@@ -1768,13 +1768,15 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr, target_ulong val,
           case 1:
               env->dmmu.mmu_primary_context = val;
               env->immu.mmu_primary_context = val;
-              tlb_flush_by_mmuidx(CPU(cpu), MMU_USER_IDX, MMU_KERNEL_IDX, -1);
+              tlb_flush_by_mmuidx(CPU(cpu),
+                                  (1 << MMU_USER_IDX) | (1 << MMU_KERNEL_IDX));
               break;
           case 2:
               env->dmmu.mmu_secondary_context = val;
               env->immu.mmu_secondary_context = val;
-              tlb_flush_by_mmuidx(CPU(cpu), MMU_USER_SECONDARY_IDX,
-                                  MMU_KERNEL_SECONDARY_IDX, -1);
+              tlb_flush_by_mmuidx(CPU(cpu),
+                                  (1 << MMU_USER_SECONDARY_IDX) |
+                                  (1 << MMU_KERNEL_SECONDARY_IDX));
               break;
           default:
               cpu_unassigned_access(cs, addr, true, false, 1, size);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 17/24] cputlb: add tlb_flush_by_mmuidx async routines
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (15 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 16/24] cputlb and arm/sparc targets: convert mmuidx flushes from varg to bitmap Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 18/24] cputlb: atomically update tlb fields used by tlb_reset_dirty Alex Bennée
                   ` (7 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

This converts the remaining TLB flush routines to use async work when
detecting a cross-vCPU flush. The only minor complication is having to
serialise the var_list of MMU indexes into a form that can be punted
to an asynchronous job.

The pending_tlb_flush field on QOM's CPU structure also becomes a
bitfield rather than a boolean.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
v7
  - un-merged from the atomic cputlb patch in the last series
  - fix long line reported by checkpatch
v8
  - re-base merge/fixes
---
 cputlb.c          | 110 +++++++++++++++++++++++++++++++++++++++++++-----------
 include/qom/cpu.h |   2 +-
 2 files changed, 89 insertions(+), 23 deletions(-)

diff --git a/cputlb.c b/cputlb.c
index 97e5c12de8..c50254be26 100644
--- a/cputlb.c
+++ b/cputlb.c
@@ -68,6 +68,11 @@
  * target_ulong even on 32 bit builds */
 QEMU_BUILD_BUG_ON(sizeof(target_ulong) > sizeof(run_on_cpu_data));
 
+/* We currently can't handle more than 16 bits in the MMUIDX bitmask.
+ */
+QEMU_BUILD_BUG_ON(NB_MMU_MODES > 16);
+#define ALL_MMUIDX_BITS ((1 << NB_MMU_MODES) - 1)
+
 /* statistics */
 int tlb_flush_count;
 
@@ -102,7 +107,7 @@ static void tlb_flush_nocheck(CPUState *cpu)
 
     tb_unlock();
 
-    atomic_mb_set(&cpu->pending_tlb_flush, false);
+    atomic_mb_set(&cpu->pending_tlb_flush, 0);
 }
 
 static void tlb_flush_global_async_work(CPUState *cpu, run_on_cpu_data data)
@@ -113,7 +118,8 @@ static void tlb_flush_global_async_work(CPUState *cpu, run_on_cpu_data data)
 void tlb_flush(CPUState *cpu)
 {
     if (cpu->created && !qemu_cpu_is_self(cpu)) {
-        if (atomic_cmpxchg(&cpu->pending_tlb_flush, false, true) == true) {
+        if (atomic_mb_read(&cpu->pending_tlb_flush) != ALL_MMUIDX_BITS) {
+            atomic_mb_set(&cpu->pending_tlb_flush, ALL_MMUIDX_BITS);
             async_run_on_cpu(cpu, tlb_flush_global_async_work,
                              RUN_ON_CPU_NULL);
         }
@@ -122,17 +128,18 @@ void tlb_flush(CPUState *cpu)
     }
 }
 
-static inline void v_tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap)
+static void tlb_flush_by_mmuidx_async_work(CPUState *cpu, run_on_cpu_data data)
 {
     CPUArchState *env = cpu->env_ptr;
-    unsigned long mmu_idx_bitmask = idxmap;
+    unsigned long mmu_idx_bitmask = data.host_int;
     int mmu_idx;
 
     assert_cpu_is_self(cpu);
-    tlb_debug("start\n");
 
     tb_lock();
 
+    tlb_debug("start: mmu_idx:0x%04lx\n", mmu_idx_bitmask);
+
     for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
 
         if (test_bit(mmu_idx, &mmu_idx_bitmask)) {
@@ -145,12 +152,30 @@ static inline void v_tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap)
 
     memset(cpu->tb_jmp_cache, 0, sizeof(cpu->tb_jmp_cache));
 
+    tlb_debug("done\n");
+
     tb_unlock();
 }
 
 void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap)
 {
-    v_tlb_flush_by_mmuidx(cpu, idxmap);
+    tlb_debug("mmu_idx: 0x%" PRIx16 "\n", idxmap);
+
+    if (!qemu_cpu_is_self(cpu)) {
+        uint16_t pending_flushes = idxmap;
+        pending_flushes &= ~atomic_mb_read(&cpu->pending_tlb_flush);
+
+        if (pending_flushes) {
+            tlb_debug("reduced mmu_idx: 0x%" PRIx16 "\n", pending_flushes);
+
+            atomic_or(&cpu->pending_tlb_flush, pending_flushes);
+            async_run_on_cpu(cpu, tlb_flush_by_mmuidx_async_work,
+                             RUN_ON_CPU_HOST_INT(pending_flushes));
+        }
+    } else {
+        tlb_flush_by_mmuidx_async_work(cpu,
+                                       RUN_ON_CPU_HOST_INT(idxmap));
+    }
 }
 
 static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
@@ -215,27 +240,26 @@ void tlb_flush_page(CPUState *cpu, target_ulong addr)
     }
 }
 
-void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, uint16_t idxmap)
+/* As we are going to hijack the bottom bits of the page address for a
+ * mmuidx bit mask we need to fail to build if we can't do that
+ */
+QEMU_BUILD_BUG_ON(NB_MMU_MODES > TARGET_PAGE_BITS_MIN);
+
+static void tlb_flush_page_by_mmuidx_async_work(CPUState *cpu,
+                                                run_on_cpu_data data)
 {
     CPUArchState *env = cpu->env_ptr;
-    unsigned long mmu_idx_bitmap = idxmap;
-    int i, page, mmu_idx;
+    target_ulong addr_and_mmuidx = (target_ulong) data.target_ptr;
+    target_ulong addr = addr_and_mmuidx & TARGET_PAGE_MASK;
+    unsigned long mmu_idx_bitmap = addr_and_mmuidx & ALL_MMUIDX_BITS;
+    int page = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
+    int mmu_idx;
+    int i;
 
     assert_cpu_is_self(cpu);
-    tlb_debug("addr "TARGET_FMT_lx"\n", addr);
-
-    /* Check if we need to flush due to large pages.  */
-    if ((addr & env->tlb_flush_mask) == env->tlb_flush_addr) {
-        tlb_debug("forced full flush ("
-                  TARGET_FMT_lx "/" TARGET_FMT_lx ")\n",
-                  env->tlb_flush_addr, env->tlb_flush_mask);
-
-        v_tlb_flush_by_mmuidx(cpu, idxmap);
-        return;
-    }
 
-    addr &= TARGET_PAGE_MASK;
-    page = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
+    tlb_debug("page:%d addr:"TARGET_FMT_lx" mmu_idx:0x%lx\n",
+              page, addr, mmu_idx_bitmap);
 
     for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
         if (test_bit(mmu_idx, &mmu_idx_bitmap)) {
@@ -251,6 +275,48 @@ void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, uint16_t idxmap)
     tb_flush_jmp_cache(cpu, addr);
 }
 
+static void tlb_check_page_and_flush_by_mmuidx_async_work(CPUState *cpu,
+                                                          run_on_cpu_data data)
+{
+    CPUArchState *env = cpu->env_ptr;
+    target_ulong addr_and_mmuidx = (target_ulong) data.target_ptr;
+    target_ulong addr = addr_and_mmuidx & TARGET_PAGE_MASK;
+    unsigned long mmu_idx_bitmap = addr_and_mmuidx & ALL_MMUIDX_BITS;
+
+    tlb_debug("addr:"TARGET_FMT_lx" mmu_idx: %04lx\n", addr, mmu_idx_bitmap);
+
+    /* Check if we need to flush due to large pages.  */
+    if ((addr & env->tlb_flush_mask) == env->tlb_flush_addr) {
+        tlb_debug("forced full flush ("
+                  TARGET_FMT_lx "/" TARGET_FMT_lx ")\n",
+                  env->tlb_flush_addr, env->tlb_flush_mask);
+
+        tlb_flush_by_mmuidx_async_work(cpu,
+                                       RUN_ON_CPU_HOST_INT(mmu_idx_bitmap));
+    } else {
+        tlb_flush_page_by_mmuidx_async_work(cpu, data);
+    }
+}
+
+void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, uint16_t idxmap)
+{
+    target_ulong addr_and_mmu_idx;
+
+    tlb_debug("addr: "TARGET_FMT_lx" mmu_idx:%" PRIx16 "\n", addr, idxmap);
+
+    /* This should already be page aligned */
+    addr_and_mmu_idx = addr & TARGET_PAGE_MASK;
+    addr_and_mmu_idx |= idxmap;
+
+    if (!qemu_cpu_is_self(cpu)) {
+        async_run_on_cpu(cpu, tlb_check_page_and_flush_by_mmuidx_async_work,
+                         RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
+    } else {
+        tlb_check_page_and_flush_by_mmuidx_async_work(
+            cpu, RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
+    }
+}
+
 void tlb_flush_page_all(target_ulong addr)
 {
     CPUState *cpu;
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index e80bf7a64a..3e61c880da 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -407,7 +407,7 @@ struct CPUState {
      * avoid potential races. The aim of the flag is to avoid
      * unnecessary flushes.
      */
-    bool pending_tlb_flush;
+    uint16_t pending_tlb_flush;
 };
 
 QTAILQ_HEAD(CPUTailQ, CPUState);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 18/24] cputlb: atomically update tlb fields used by tlb_reset_dirty
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (16 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 17/24] cputlb: add tlb_flush_by_mmuidx async routines Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 19/24] cputlb: introduce tlb_flush_*_all_cpus[_synced] Alex Bennée
                   ` (6 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

The main use case for tlb_reset_dirty is to set the TLB_NOTDIRTY flags
in TLB entries to force the slow-path on writes. This is used to mark
page ranges containing code which has been translated so it can be
invalidated if written to. To do this safely we need to ensure the TLB
entries in question for all vCPUs are updated before we attempt to run
the code otherwise a race could be introduced.

To achieve this we atomically set the flag in tlb_reset_dirty_range and
take care when setting it when the TLB entry is filled.

On 32 bit systems attempting to emulate 64 bit guests we don't even
bother as we might not have the atomic primitives available. MTTCG is
disabled in this case and can't be forced on. The copy_tlb_helper
function helps keep the atomic semantics in one place to avoid
confusion.

The dirty helper function is made static as it isn't used outside of
cputlb.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
v6
  - use TARGET_PAGE_BITS_MIN
  - use run_on_cpu helpers
v7
  - fix tlb_debug fmt for 32bit build
  - un-merged the mmuidx async work which got mashed in last round
  - introduced copy_tlb_helper function and made TCG_OVERSIZED_GUEST aware
---
 cputlb.c              | 120 +++++++++++++++++++++++++++++++++++++++-----------
 include/exec/cputlb.h |   2 -
 2 files changed, 95 insertions(+), 27 deletions(-)

diff --git a/cputlb.c b/cputlb.c
index c50254be26..65003350e3 100644
--- a/cputlb.c
+++ b/cputlb.c
@@ -342,32 +342,90 @@ void tlb_unprotect_code(ram_addr_t ram_addr)
     cpu_physical_memory_set_dirty_flag(ram_addr, DIRTY_MEMORY_CODE);
 }
 
-static bool tlb_is_dirty_ram(CPUTLBEntry *tlbe)
-{
-    return (tlbe->addr_write & (TLB_INVALID_MASK|TLB_MMIO|TLB_NOTDIRTY)) == 0;
-}
 
-void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry, uintptr_t start,
+/*
+ * Dirty write flag handling
+ *
+ * When the TCG code writes to a location it looks up the address in
+ * the TLB and uses that data to compute the final address. If any of
+ * the lower bits of the address are set then the slow path is forced.
+ * There are a number of reasons to do this but for normal RAM the
+ * most usual is detecting writes to code regions which may invalidate
+ * generated code.
+ *
+ * Because we want other vCPUs to respond to changes straight away we
+ * update the te->addr_write field atomically. If the TLB entry has
+ * been changed by the vCPU in the mean time we skip the update.
+ *
+ * As this function uses atomic accesses we also need to ensure
+ * updates to tlb_entries follow the same access rules. We don't need
+ * to worry about this for oversized guests as MTTCG is disabled for
+ * them.
+ */
+
+static void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry, uintptr_t start,
                            uintptr_t length)
 {
-    uintptr_t addr;
+#if TCG_OVERSIZED_GUEST
+    uintptr_t addr = tlb_entry->addr_write;
 
-    if (tlb_is_dirty_ram(tlb_entry)) {
-        addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend;
+    if ((addr & (TLB_INVALID_MASK | TLB_MMIO | TLB_NOTDIRTY)) == 0) {
+        addr &= TARGET_PAGE_MASK;
+        addr += tlb_entry->addend;
         if ((addr - start) < length) {
             tlb_entry->addr_write |= TLB_NOTDIRTY;
         }
     }
+#else
+    /* paired with atomic_mb_set in tlb_set_page_with_attrs */
+    uintptr_t orig_addr = atomic_mb_read(&tlb_entry->addr_write);
+    uintptr_t addr = orig_addr;
+
+    if ((addr & (TLB_INVALID_MASK | TLB_MMIO | TLB_NOTDIRTY)) == 0) {
+        addr &= TARGET_PAGE_MASK;
+        addr += atomic_read(&tlb_entry->addend);
+        if ((addr - start) < length) {
+            uintptr_t notdirty_addr = orig_addr | TLB_NOTDIRTY;
+            atomic_cmpxchg(&tlb_entry->addr_write, orig_addr, notdirty_addr);
+        }
+    }
+#endif
+}
+
+/* For atomic correctness when running MTTCG we need to use the right
+ * primitives when copying entries */
+static inline void copy_tlb_helper(CPUTLBEntry *d, CPUTLBEntry *s,
+                                   bool atomic_set)
+{
+#if TCG_OVERSIZED_GUEST
+    *d = *s;
+#else
+    if (atomic_set) {
+        d->addr_read = s->addr_read;
+        d->addr_code = s->addr_code;
+        atomic_set(&d->addend, atomic_read(&s->addend));
+        /* Pairs with flag setting in tlb_reset_dirty_range */
+        atomic_mb_set(&d->addr_write, atomic_read(&s->addr_write));
+    } else {
+        d->addr_read = s->addr_read;
+        d->addr_write = atomic_read(&s->addr_write);
+        d->addr_code = s->addr_code;
+        d->addend = atomic_read(&s->addend);
+    }
+#endif
 }
 
+/* This is a cross vCPU call (i.e. another vCPU resetting the flags of
+ * the target vCPU). As such care needs to be taken that we don't
+ * dangerously race with another vCPU update. The only thing actually
+ * updated is the target TLB entry ->addr_write flags.
+ */
 void tlb_reset_dirty(CPUState *cpu, ram_addr_t start1, ram_addr_t length)
 {
     CPUArchState *env;
 
     int mmu_idx;
 
-    assert_cpu_is_self(cpu);
-
     env = cpu->env_ptr;
     for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
         unsigned int i;
@@ -455,7 +513,7 @@ void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
     target_ulong address;
     target_ulong code_address;
     uintptr_t addend;
-    CPUTLBEntry *te;
+    CPUTLBEntry *te, *tv, tn;
     hwaddr iotlb, xlat, sz;
     unsigned vidx = env->vtlb_index++ % CPU_VTLB_SIZE;
     int asidx = cpu_asidx_from_attrs(cpu, attrs);
@@ -490,41 +548,50 @@ void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
 
     index = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
     te = &env->tlb_table[mmu_idx][index];
-
     /* do not discard the translation in te, evict it into a victim tlb */
-    env->tlb_v_table[mmu_idx][vidx] = *te;
+    tv = &env->tlb_v_table[mmu_idx][vidx];
+
+    /* addr_write can race with tlb_reset_dirty_range */
+    copy_tlb_helper(tv, te, true);
+
     env->iotlb_v[mmu_idx][vidx] = env->iotlb[mmu_idx][index];
 
     /* refill the tlb */
     env->iotlb[mmu_idx][index].addr = iotlb - vaddr;
     env->iotlb[mmu_idx][index].attrs = attrs;
-    te->addend = addend - vaddr;
+
+    /* Now calculate the new entry */
+    tn.addend = addend - vaddr;
     if (prot & PAGE_READ) {
-        te->addr_read = address;
+        tn.addr_read = address;
     } else {
-        te->addr_read = -1;
+        tn.addr_read = -1;
     }
 
     if (prot & PAGE_EXEC) {
-        te->addr_code = code_address;
+        tn.addr_code = code_address;
     } else {
-        te->addr_code = -1;
+        tn.addr_code = -1;
     }
+
+    tn.addr_write = -1;
     if (prot & PAGE_WRITE) {
         if ((memory_region_is_ram(section->mr) && section->readonly)
             || memory_region_is_romd(section->mr)) {
             /* Write access calls the I/O callback.  */
-            te->addr_write = address | TLB_MMIO;
+            tn.addr_write = address | TLB_MMIO;
         } else if (memory_region_is_ram(section->mr)
                    && cpu_physical_memory_is_clean(
                         memory_region_get_ram_addr(section->mr) + xlat)) {
-            te->addr_write = address | TLB_NOTDIRTY;
+            tn.addr_write = address | TLB_NOTDIRTY;
         } else {
-            te->addr_write = address;
+            tn.addr_write = address;
         }
-    } else {
-        te->addr_write = -1;
     }
+
+    /* Pairs with flag setting in tlb_reset_dirty_range */
+    copy_tlb_helper(te, &tn, true);
+    /* atomic_mb_set(&te->addr_write, write_address); */
 }
 
 /* Add a new TLB entry, but without specifying the memory
@@ -687,10 +754,13 @@ static bool victim_tlb_hit(CPUArchState *env, size_t mmu_idx, size_t index,
         if (cmp == page) {
             /* Found entry in victim tlb, swap tlb and iotlb.  */
             CPUTLBEntry tmptlb, *tlb = &env->tlb_table[mmu_idx][index];
+
+            copy_tlb_helper(&tmptlb, tlb, false);
+            copy_tlb_helper(tlb, vtlb, true);
+            copy_tlb_helper(vtlb, &tmptlb, true);
+
             CPUIOTLBEntry tmpio, *io = &env->iotlb[mmu_idx][index];
             CPUIOTLBEntry *vio = &env->iotlb_v[mmu_idx][vidx];
-
-            tmptlb = *tlb; *tlb = *vtlb; *vtlb = tmptlb;
             tmpio = *io; *io = *vio; *vio = tmpio;
             return true;
         }
diff --git a/include/exec/cputlb.h b/include/exec/cputlb.h
index d454c005b7..3f941783c5 100644
--- a/include/exec/cputlb.h
+++ b/include/exec/cputlb.h
@@ -23,8 +23,6 @@
 /* cputlb.c */
 void tlb_protect_code(ram_addr_t ram_addr);
 void tlb_unprotect_code(ram_addr_t ram_addr);
-void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry, uintptr_t start,
-                           uintptr_t length);
 extern int tlb_flush_count;
 
 #endif
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 19/24] cputlb: introduce tlb_flush_*_all_cpus[_synced]
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (17 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 18/24] cputlb: atomically update tlb fields used by tlb_reset_dirty Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 20/24] target-arm/powerctl: defer cpu reset work to CPU context Alex Bennée
                   ` (5 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Crosthwaite

This introduces support to the cputlb API for flushing all CPUs TLBs
with one call. This avoids the need for target helpers to iterate
through the vCPUs themselves.

An additional variant of the API (_synced) will cause the source vCPUs
work to be scheduled as "safe work". The result will be all the flush
operations will be complete by the time the originating vCPU executes
its safe work. The calling implementation can either end the TB
straight away (which will then pick up the cpu->exit_request on
entering the next block) or defer the exit until the architectural
sync point (usually a barrier instruction).

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>

---
v7
  - some checkpatch long line fixes
v8
  - change from varg to bitmap calling convention
  - add _synced variants, re-factored helper
v9
  - add r-b tags
v10
 - rm QEMU_NORETURN (leave it to the guests)
 - rm cpu_loop_exit (as above)
 - fixup tlb_flush_all_cpus() to use fn pattern like the rest
 - update documentation of _synced() function
---
 cputlb.c                | 108 +++++++++++++++++++++++++++++++++++++++++---
 include/exec/exec-all.h | 116 ++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 215 insertions(+), 9 deletions(-)

diff --git a/cputlb.c b/cputlb.c
index 65003350e3..7fa7fefa05 100644
--- a/cputlb.c
+++ b/cputlb.c
@@ -73,6 +73,25 @@ QEMU_BUILD_BUG_ON(sizeof(target_ulong) > sizeof(run_on_cpu_data));
 QEMU_BUILD_BUG_ON(NB_MMU_MODES > 16);
 #define ALL_MMUIDX_BITS ((1 << NB_MMU_MODES) - 1)
 
+/* flush_all_helper: run fn across all cpus
+ *
+ * If the wait flag is set then the src cpu's helper will be queued as
+ * "safe" work and the loop exited creating a synchronisation point
+ * where all queued work will be finished before execution starts
+ * again.
+ */
+static void flush_all_helper(CPUState *src, run_on_cpu_func fn,
+                             run_on_cpu_data d)
+{
+    CPUState *cpu;
+
+    CPU_FOREACH(cpu) {
+        if (cpu != src) {
+            async_run_on_cpu(cpu, fn, d);
+        }
+    }
+}
+
 /* statistics */
 int tlb_flush_count;
 
@@ -128,6 +147,20 @@ void tlb_flush(CPUState *cpu)
     }
 }
 
+void tlb_flush_all_cpus(CPUState *src_cpu)
+{
+    const run_on_cpu_func fn = tlb_flush_global_async_work;
+    flush_all_helper(src_cpu, fn, RUN_ON_CPU_NULL);
+    fn(src_cpu, RUN_ON_CPU_NULL);
+}
+
+void tlb_flush_all_cpus_synced(CPUState *src_cpu)
+{
+    const run_on_cpu_func fn = tlb_flush_global_async_work;
+    flush_all_helper(src_cpu, fn, RUN_ON_CPU_NULL);
+    async_safe_run_on_cpu(src_cpu, fn, RUN_ON_CPU_NULL);
+}
+
 static void tlb_flush_by_mmuidx_async_work(CPUState *cpu, run_on_cpu_data data)
 {
     CPUArchState *env = cpu->env_ptr;
@@ -178,6 +211,29 @@ void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap)
     }
 }
 
+void tlb_flush_by_mmuidx_all_cpus(CPUState *src_cpu, uint16_t idxmap)
+{
+    const run_on_cpu_func fn = tlb_flush_by_mmuidx_async_work;
+
+    tlb_debug("mmu_idx: 0x%"PRIx16"\n", idxmap);
+
+    flush_all_helper(src_cpu, fn, RUN_ON_CPU_HOST_INT(idxmap));
+    fn(src_cpu, RUN_ON_CPU_HOST_INT(idxmap));
+}
+
+void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *src_cpu,
+                                                       uint16_t idxmap)
+{
+    const run_on_cpu_func fn = tlb_flush_by_mmuidx_async_work;
+
+    tlb_debug("mmu_idx: 0x%"PRIx16"\n", idxmap);
+
+    flush_all_helper(src_cpu, fn, RUN_ON_CPU_HOST_INT(idxmap));
+    async_safe_run_on_cpu(src_cpu, fn, RUN_ON_CPU_HOST_INT(idxmap));
+}
+
+
+
 static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
 {
     if (addr == (tlb_entry->addr_read &
@@ -317,14 +373,54 @@ void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, uint16_t idxmap)
     }
 }
 
-void tlb_flush_page_all(target_ulong addr)
+void tlb_flush_page_by_mmuidx_all_cpus(CPUState *src_cpu, target_ulong addr,
+                                       uint16_t idxmap)
 {
-    CPUState *cpu;
+    const run_on_cpu_func fn = tlb_check_page_and_flush_by_mmuidx_async_work;
+    target_ulong addr_and_mmu_idx;
 
-    CPU_FOREACH(cpu) {
-        async_run_on_cpu(cpu, tlb_flush_page_async_work,
-                         RUN_ON_CPU_TARGET_PTR(addr));
-    }
+    tlb_debug("addr: "TARGET_FMT_lx" mmu_idx:%"PRIx16"\n", addr, idxmap);
+
+    /* This should already be page aligned */
+    addr_and_mmu_idx = addr & TARGET_PAGE_MASK;
+    addr_and_mmu_idx |= idxmap;
+
+    flush_all_helper(src_cpu, fn, RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
+    fn(src_cpu, RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
+}
+
+void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *src_cpu,
+                                                            target_ulong addr,
+                                                            uint16_t idxmap)
+{
+    const run_on_cpu_func fn = tlb_check_page_and_flush_by_mmuidx_async_work;
+    target_ulong addr_and_mmu_idx;
+
+    tlb_debug("addr: "TARGET_FMT_lx" mmu_idx:%"PRIx16"\n", addr, idxmap);
+
+    /* This should already be page aligned */
+    addr_and_mmu_idx = addr & TARGET_PAGE_MASK;
+    addr_and_mmu_idx |= idxmap;
+
+    flush_all_helper(src_cpu, fn, RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
+    async_safe_run_on_cpu(src_cpu, fn, RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
+}
+
+void tlb_flush_page_all_cpus(CPUState *src, target_ulong addr)
+{
+    const run_on_cpu_func fn = tlb_flush_page_async_work;
+
+    flush_all_helper(src, fn, RUN_ON_CPU_TARGET_PTR(addr));
+    fn(src, RUN_ON_CPU_TARGET_PTR(addr));
+}
+
+void tlb_flush_page_all_cpus_synced(CPUState *src,
+                                                  target_ulong addr)
+{
+    const run_on_cpu_func fn = tlb_flush_page_async_work;
+
+    flush_all_helper(src, fn, RUN_ON_CPU_TARGET_PTR(addr));
+    async_safe_run_on_cpu(src, fn, RUN_ON_CPU_TARGET_PTR(addr));
 }
 
 /* update the TLBs so that writes to code in the virtual page 'addr'
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index e94e6849dd..bcde1e6a14 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -93,6 +93,27 @@ void cpu_address_space_init(CPUState *cpu, AddressSpace *as, int asidx);
  */
 void tlb_flush_page(CPUState *cpu, target_ulong addr);
 /**
+ * tlb_flush_page_all_cpus:
+ * @cpu: src CPU of the flush
+ * @addr: virtual address of page to be flushed
+ *
+ * Flush one page from the TLB of the specified CPU, for all
+ * MMU indexes.
+ */
+void tlb_flush_page_all_cpus(CPUState *src, target_ulong addr);
+/**
+ * tlb_flush_page_all_cpus_synced:
+ * @cpu: src CPU of the flush
+ * @addr: virtual address of page to be flushed
+ *
+ * Flush one page from the TLB of the specified CPU, for all MMU
+ * indexes like tlb_flush_page_all_cpus except the source vCPUs work
+ * is scheduled as safe work meaning all flushes will be complete once
+ * the source vCPUs safe work is complete. This will depend on when
+ * the guests translation ends the TB.
+ */
+void tlb_flush_page_all_cpus_synced(CPUState *src, target_ulong addr);
+/**
  * tlb_flush:
  * @cpu: CPU whose TLB should be flushed
  *
@@ -103,6 +124,21 @@ void tlb_flush_page(CPUState *cpu, target_ulong addr);
  */
 void tlb_flush(CPUState *cpu);
 /**
+ * tlb_flush_all_cpus:
+ * @cpu: src CPU of the flush
+ */
+void tlb_flush_all_cpus(CPUState *src_cpu);
+/**
+ * tlb_flush_all_cpus_synced:
+ * @cpu: src CPU of the flush
+ *
+ * Like tlb_flush_all_cpus except this except the source vCPUs work is
+ * scheduled as safe work meaning all flushes will be complete once
+ * the source vCPUs safe work is complete. This will depend on when
+ * the guests translation ends the TB.
+ */
+void tlb_flush_all_cpus_synced(CPUState *src_cpu);
+/**
  * tlb_flush_page_by_mmuidx:
  * @cpu: CPU whose TLB should be flushed
  * @addr: virtual address of page to be flushed
@@ -114,8 +150,34 @@ void tlb_flush(CPUState *cpu);
 void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr,
                               uint16_t idxmap);
 /**
+ * tlb_flush_page_by_mmuidx_all_cpus:
+ * @cpu: Originating CPU of the flush
+ * @addr: virtual address of page to be flushed
+ * @idxmap: bitmap of MMU indexes to flush
+ *
+ * Flush one page from the TLB of all CPUs, for the specified
+ * MMU indexes.
+ */
+void tlb_flush_page_by_mmuidx_all_cpus(CPUState *cpu, target_ulong addr,
+                                       uint16_t idxmap);
+/**
+ * tlb_flush_page_by_mmuidx_all_cpus_synced:
+ * @cpu: Originating CPU of the flush
+ * @addr: virtual address of page to be flushed
+ * @idxmap: bitmap of MMU indexes to flush
+ *
+ * Flush one page from the TLB of all CPUs, for the specified MMU
+ * indexes like tlb_flush_page_by_mmuidx_all_cpus except the source
+ * vCPUs work is scheduled as safe work meaning all flushes will be
+ * complete once  the source vCPUs safe work is complete. This will
+ * depend on when the guests translation ends the TB.
+ */
+void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *cpu, target_ulong addr,
+                                              uint16_t idxmap);
+/**
  * tlb_flush_by_mmuidx:
  * @cpu: CPU whose TLB should be flushed
+ * @wait: If true ensure synchronisation by exiting the cpu_loop
  * @idxmap: bitmap of MMU indexes to flush
  *
  * Flush all entries from the TLB of the specified CPU, for the specified
@@ -123,6 +185,27 @@ void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr,
  */
 void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap);
 /**
+ * tlb_flush_by_mmuidx_all_cpus:
+ * @cpu: Originating CPU of the flush
+ * @idxmap: bitmap of MMU indexes to flush
+ *
+ * Flush all entries from all TLBs of all CPUs, for the specified
+ * MMU indexes.
+ */
+void tlb_flush_by_mmuidx_all_cpus(CPUState *cpu, uint16_t idxmap);
+/**
+ * tlb_flush_by_mmuidx_all_cpus_synced:
+ * @cpu: Originating CPU of the flush
+ * @idxmap: bitmap of MMU indexes to flush
+ *
+ * Flush all entries from all TLBs of all CPUs, for the specified
+ * MMU indexes like tlb_flush_by_mmuidx_all_cpus except except the source
+ * vCPUs work is scheduled as safe work meaning all flushes will be
+ * complete once  the source vCPUs safe work is complete. This will
+ * depend on when the guests translation ends the TB.
+ */
+void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu, uint16_t idxmap);
+/**
  * tlb_set_page_with_attrs:
  * @cpu: CPU to add this TLB entry for
  * @vaddr: virtual address of page to add entry for
@@ -159,16 +242,26 @@ void tlb_set_page(CPUState *cpu, target_ulong vaddr,
 void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr);
 void probe_write(CPUArchState *env, target_ulong addr, int mmu_idx,
                  uintptr_t retaddr);
-void tlb_flush_page_all(target_ulong addr);
 #else
 static inline void tlb_flush_page(CPUState *cpu, target_ulong addr)
 {
 }
-
+static inline void tlb_flush_page_all_cpus(CPUState *src, target_ulong addr)
+{
+}
+static inline void tlb_flush_page_all_cpus_synced(CPUState *src,
+                                                  target_ulong addr)
+{
+}
 static inline void tlb_flush(CPUState *cpu)
 {
 }
-
+static inline void tlb_flush_all_cpus(CPUState *src_cpu)
+{
+}
+static inline void tlb_flush_all_cpus_synced(CPUState *src_cpu)
+{
+}
 static inline void tlb_flush_page_by_mmuidx(CPUState *cpu,
                                             target_ulong addr, uint16_t idxmap)
 {
@@ -177,6 +270,23 @@ static inline void tlb_flush_page_by_mmuidx(CPUState *cpu,
 static inline void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap)
 {
 }
+static inline void tlb_flush_page_by_mmuidx_all_cpus(CPUState *cpu,
+                                                     target_ulong addr,
+                                                     uint16_t idxmap)
+{
+}
+static inline void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *cpu,
+                                                            target_ulong addr,
+                                                            uint16_t idxmap)
+{
+}
+static inline void tlb_flush_by_mmuidx_all_cpus(CPUState *cpu, uint16_t idxmap)
+{
+}
+static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu,
+                                                       uint16_t idxmap)
+{
+}
 #endif
 
 #define CODE_GEN_ALIGN           16 /* must be >= of the size of a icache line */
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 20/24] target-arm/powerctl: defer cpu reset work to CPU context
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (18 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 19/24] cputlb: introduce tlb_flush_*_all_cpus[_synced] Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 21/24] target-arm: don't generate WFE/YIELD calls for MTTCG Alex Bennée
                   ` (4 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, open list:ARM

When switching a new vCPU on we want to complete a bunch of the setup
work before we start scheduling the vCPU thread. To do this cleanly we
defer vCPU setup to async work which will run the vCPUs execution
context as the thread is woken up. The scheduling of the work will kick
the vCPU awake.

This avoids potential races in MTTCG system emulation.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

---
v7
  - add const to static mode_for_el[] array
  - fix checkpatch long lines
v10
  - use async work for arm_set_cpu_off, arm_reset_cpu as well
  - model ON_PENDING to deal with racing arm_set_cpu_on
v11
  - move to single cpu->power_state protected by BQL
  - bump migration format
v12
  - cpu_on_info -> CpuOnInfo
  - map PSCI_ON/OFF/PENDING to affinity return types to avoid switch
  - maintain backward compatibility in migration stream
---
 target/arm/arm-powerctl.c | 202 +++++++++++++++++++++++++++++++---------------
 target/arm/arm-powerctl.h |   2 +
 target/arm/cpu.c          |   4 +-
 target/arm/cpu.h          |  15 +++-
 target/arm/kvm.c          |   7 +-
 target/arm/machine.c      |  41 +++++++++-
 target/arm/psci.c         |   4 +-
 7 files changed, 201 insertions(+), 74 deletions(-)

diff --git a/target/arm/arm-powerctl.c b/target/arm/arm-powerctl.c
index fbb7a15daa..25207cb850 100644
--- a/target/arm/arm-powerctl.c
+++ b/target/arm/arm-powerctl.c
@@ -14,6 +14,7 @@
 #include "internals.h"
 #include "arm-powerctl.h"
 #include "qemu/log.h"
+#include "qemu/main-loop.h"
 #include "exec/exec-all.h"
 
 #ifndef DEBUG_ARM_POWERCTL
@@ -48,11 +49,93 @@ CPUState *arm_get_cpu_by_id(uint64_t id)
     return NULL;
 }
 
+struct CpuOnInfo {
+    uint64_t entry;
+    uint64_t context_id;
+    uint32_t target_el;
+    bool target_aa64;
+};
+
+
+static void arm_set_cpu_on_async_work(CPUState *target_cpu_state,
+                                      run_on_cpu_data data)
+{
+    ARMCPU *target_cpu = ARM_CPU(target_cpu_state);
+    struct CpuOnInfo *info = (struct CpuOnInfo *) data.host_ptr;
+
+    /* Initialize the cpu we are turning on */
+    cpu_reset(target_cpu_state);
+    target_cpu_state->halted = 0;
+
+    if (info->target_aa64) {
+        if ((info->target_el < 3) && arm_feature(&target_cpu->env,
+                                                 ARM_FEATURE_EL3)) {
+            /*
+             * As target mode is AArch64, we need to set lower
+             * exception level (the requested level 2) to AArch64
+             */
+            target_cpu->env.cp15.scr_el3 |= SCR_RW;
+        }
+
+        if ((info->target_el < 2) && arm_feature(&target_cpu->env,
+                                                 ARM_FEATURE_EL2)) {
+            /*
+             * As target mode is AArch64, we need to set lower
+             * exception level (the requested level 1) to AArch64
+             */
+            target_cpu->env.cp15.hcr_el2 |= HCR_RW;
+        }
+
+        target_cpu->env.pstate = aarch64_pstate_mode(info->target_el, true);
+    } else {
+        /* We are requested to boot in AArch32 mode */
+        static const uint32_t mode_for_el[] = { 0,
+                                                ARM_CPU_MODE_SVC,
+                                                ARM_CPU_MODE_HYP,
+                                                ARM_CPU_MODE_SVC };
+
+        cpsr_write(&target_cpu->env, mode_for_el[info->target_el], CPSR_M,
+                   CPSRWriteRaw);
+    }
+
+    if (info->target_el == 3) {
+        /* Processor is in secure mode */
+        target_cpu->env.cp15.scr_el3 &= ~SCR_NS;
+    } else {
+        /* Processor is not in secure mode */
+        target_cpu->env.cp15.scr_el3 |= SCR_NS;
+    }
+
+    /* We check if the started CPU is now at the correct level */
+    assert(info->target_el == arm_current_el(&target_cpu->env));
+
+    if (info->target_aa64) {
+        target_cpu->env.xregs[0] = info->context_id;
+        target_cpu->env.thumb = false;
+    } else {
+        target_cpu->env.regs[0] = info->context_id;
+        target_cpu->env.thumb = info->entry & 1;
+        info->entry &= 0xfffffffe;
+    }
+
+    /* Start the new CPU at the requested address */
+    cpu_set_pc(target_cpu_state, info->entry);
+
+    g_free(info);
+
+    /* Finally set the power status */
+    assert(qemu_mutex_iothread_locked());
+    target_cpu->power_state = PSCI_ON;
+}
+
 int arm_set_cpu_on(uint64_t cpuid, uint64_t entry, uint64_t context_id,
                    uint32_t target_el, bool target_aa64)
 {
     CPUState *target_cpu_state;
     ARMCPU *target_cpu;
+    struct CpuOnInfo *info;
+
+    assert(qemu_mutex_iothread_locked());
 
     DPRINTF("cpu %" PRId64 " (EL %d, %s) @ 0x%" PRIx64 " with R0 = 0x%" PRIx64
             "\n", cpuid, target_el, target_aa64 ? "aarch64" : "aarch32", entry,
@@ -77,7 +160,7 @@ int arm_set_cpu_on(uint64_t cpuid, uint64_t entry, uint64_t context_id,
     }
 
     target_cpu = ARM_CPU(target_cpu_state);
-    if (!target_cpu->powered_off) {
+    if (target_cpu->power_state == PSCI_ON) {
         qemu_log_mask(LOG_GUEST_ERROR,
                       "[ARM]%s: CPU %" PRId64 " is already on\n",
                       __func__, cpuid);
@@ -109,74 +192,54 @@ int arm_set_cpu_on(uint64_t cpuid, uint64_t entry, uint64_t context_id,
         return QEMU_ARM_POWERCTL_INVALID_PARAM;
     }
 
-    /* Initialize the cpu we are turning on */
-    cpu_reset(target_cpu_state);
-    target_cpu->powered_off = false;
-    target_cpu_state->halted = 0;
-
-    if (target_aa64) {
-        if ((target_el < 3) && arm_feature(&target_cpu->env, ARM_FEATURE_EL3)) {
-            /*
-             * As target mode is AArch64, we need to set lower
-             * exception level (the requested level 2) to AArch64
-             */
-            target_cpu->env.cp15.scr_el3 |= SCR_RW;
-        }
-
-        if ((target_el < 2) && arm_feature(&target_cpu->env, ARM_FEATURE_EL2)) {
-            /*
-             * As target mode is AArch64, we need to set lower
-             * exception level (the requested level 1) to AArch64
-             */
-            target_cpu->env.cp15.hcr_el2 |= HCR_RW;
-        }
-
-        target_cpu->env.pstate = aarch64_pstate_mode(target_el, true);
-    } else {
-        /* We are requested to boot in AArch32 mode */
-        static uint32_t mode_for_el[] = { 0,
-                                          ARM_CPU_MODE_SVC,
-                                          ARM_CPU_MODE_HYP,
-                                          ARM_CPU_MODE_SVC };
-
-        cpsr_write(&target_cpu->env, mode_for_el[target_el], CPSR_M,
-                   CPSRWriteRaw);
-    }
-
-    if (target_el == 3) {
-        /* Processor is in secure mode */
-        target_cpu->env.cp15.scr_el3 &= ~SCR_NS;
-    } else {
-        /* Processor is not in secure mode */
-        target_cpu->env.cp15.scr_el3 |= SCR_NS;
-    }
-
-    /* We check if the started CPU is now at the correct level */
-    assert(target_el == arm_current_el(&target_cpu->env));
-
-    if (target_aa64) {
-        target_cpu->env.xregs[0] = context_id;
-        target_cpu->env.thumb = false;
-    } else {
-        target_cpu->env.regs[0] = context_id;
-        target_cpu->env.thumb = entry & 1;
-        entry &= 0xfffffffe;
+    /*
+     * If another CPU has powered the target on we are in the state
+     * ON_PENDING and additional attempts to power on the CPU should
+     * fail (see 6.6 Implementation CPU_ON/CPU_OFF races in the PSCI
+     * spec)
+     */
+    if (target_cpu->power_state == PSCI_ON_PENDING) {
+        qemu_log_mask(LOG_GUEST_ERROR,
+                      "[ARM]%s: CPU %" PRId64 " is already powering on\n",
+                      __func__, cpuid);
+        return QEMU_ARM_POWERCTL_ON_PENDING;
     }
 
-    /* Start the new CPU at the requested address */
-    cpu_set_pc(target_cpu_state, entry);
+    /* To avoid racing with a CPU we are just kicking off we do the
+     * final bit of preparation for the work in the target CPUs
+     * context.
+     */
+    info = g_new(struct CpuOnInfo, 1);
+    info->entry = entry;
+    info->context_id = context_id;
+    info->target_el = target_el;
+    info->target_aa64 = target_aa64;
 
-    qemu_cpu_kick(target_cpu_state);
+    async_run_on_cpu(target_cpu_state, arm_set_cpu_on_async_work,
+                     RUN_ON_CPU_HOST_PTR(info));
 
     /* We are good to go */
     return QEMU_ARM_POWERCTL_RET_SUCCESS;
 }
 
+static void arm_set_cpu_off_async_work(CPUState *target_cpu_state,
+                                       run_on_cpu_data data)
+{
+    ARMCPU *target_cpu = ARM_CPU(target_cpu_state);
+
+    assert(qemu_mutex_iothread_locked());
+    target_cpu->power_state = PSCI_OFF;
+    target_cpu_state->halted = 1;
+    target_cpu_state->exception_index = EXCP_HLT;
+}
+
 int arm_set_cpu_off(uint64_t cpuid)
 {
     CPUState *target_cpu_state;
     ARMCPU *target_cpu;
 
+    assert(qemu_mutex_iothread_locked());
+
     DPRINTF("cpu %" PRId64 "\n", cpuid);
 
     /* change to the cpu we are powering up */
@@ -185,27 +248,34 @@ int arm_set_cpu_off(uint64_t cpuid)
         return QEMU_ARM_POWERCTL_INVALID_PARAM;
     }
     target_cpu = ARM_CPU(target_cpu_state);
-    if (target_cpu->powered_off) {
+    if (target_cpu->power_state == PSCI_OFF) {
         qemu_log_mask(LOG_GUEST_ERROR,
                       "[ARM]%s: CPU %" PRId64 " is already off\n",
                       __func__, cpuid);
         return QEMU_ARM_POWERCTL_IS_OFF;
     }
 
-    target_cpu->powered_off = true;
-    target_cpu_state->halted = 1;
-    target_cpu_state->exception_index = EXCP_HLT;
-    cpu_loop_exit(target_cpu_state);
-    /* notreached */
+    /* Queue work to run under the target vCPUs context */
+    async_run_on_cpu(target_cpu_state, arm_set_cpu_off_async_work,
+                     RUN_ON_CPU_NULL);
 
     return QEMU_ARM_POWERCTL_RET_SUCCESS;
 }
 
+static void arm_reset_cpu_async_work(CPUState *target_cpu_state,
+                                     run_on_cpu_data data)
+{
+    /* Reset the cpu */
+    cpu_reset(target_cpu_state);
+}
+
 int arm_reset_cpu(uint64_t cpuid)
 {
     CPUState *target_cpu_state;
     ARMCPU *target_cpu;
 
+    assert(qemu_mutex_iothread_locked());
+
     DPRINTF("cpu %" PRId64 "\n", cpuid);
 
     /* change to the cpu we are resetting */
@@ -214,15 +284,17 @@ int arm_reset_cpu(uint64_t cpuid)
         return QEMU_ARM_POWERCTL_INVALID_PARAM;
     }
     target_cpu = ARM_CPU(target_cpu_state);
-    if (target_cpu->powered_off) {
+
+    if (target_cpu->power_state == PSCI_OFF) {
         qemu_log_mask(LOG_GUEST_ERROR,
                       "[ARM]%s: CPU %" PRId64 " is off\n",
                       __func__, cpuid);
         return QEMU_ARM_POWERCTL_IS_OFF;
     }
 
-    /* Reset the cpu */
-    cpu_reset(target_cpu_state);
+    /* Queue work to run under the target vCPUs context */
+    async_run_on_cpu(target_cpu_state, arm_reset_cpu_async_work,
+                     RUN_ON_CPU_NULL);
 
     return QEMU_ARM_POWERCTL_RET_SUCCESS;
 }
diff --git a/target/arm/arm-powerctl.h b/target/arm/arm-powerctl.h
index 98ee04989b..04353923c0 100644
--- a/target/arm/arm-powerctl.h
+++ b/target/arm/arm-powerctl.h
@@ -17,6 +17,7 @@
 #define QEMU_ARM_POWERCTL_INVALID_PARAM QEMU_PSCI_RET_INVALID_PARAMS
 #define QEMU_ARM_POWERCTL_ALREADY_ON QEMU_PSCI_RET_ALREADY_ON
 #define QEMU_ARM_POWERCTL_IS_OFF QEMU_PSCI_RET_DENIED
+#define QEMU_ARM_POWERCTL_ON_PENDING QEMU_PSCI_RET_ON_PENDING
 
 /*
  * arm_get_cpu_by_id:
@@ -43,6 +44,7 @@ CPUState *arm_get_cpu_by_id(uint64_t cpuid);
  * Returns: QEMU_ARM_POWERCTL_RET_SUCCESS on success.
  * QEMU_ARM_POWERCTL_INVALID_PARAM if bad parameters are provided.
  * QEMU_ARM_POWERCTL_ALREADY_ON if the CPU was already started.
+ * QEMU_ARM_POWERCTL_ON_PENDING if the CPU is still powering up
  */
 int arm_set_cpu_on(uint64_t cpuid, uint64_t entry, uint64_t context_id,
                    uint32_t target_el, bool target_aa64);
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 4a069f6985..f7157dc0e5 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -45,7 +45,7 @@ static bool arm_cpu_has_work(CPUState *cs)
 {
     ARMCPU *cpu = ARM_CPU(cs);
 
-    return !cpu->powered_off
+    return (cpu->power_state != PSCI_OFF)
         && cs->interrupt_request &
         (CPU_INTERRUPT_FIQ | CPU_INTERRUPT_HARD
          | CPU_INTERRUPT_VFIQ | CPU_INTERRUPT_VIRQ
@@ -132,7 +132,7 @@ static void arm_cpu_reset(CPUState *s)
     env->vfp.xregs[ARM_VFP_MVFR1] = cpu->mvfr1;
     env->vfp.xregs[ARM_VFP_MVFR2] = cpu->mvfr2;
 
-    cpu->powered_off = cpu->start_powered_off;
+    cpu->power_state = cpu->start_powered_off ? PSCI_OFF : PSCI_ON;
     s->halted = cpu->start_powered_off;
 
     if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index 0956a54e89..e285ba3b4b 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -526,6 +526,15 @@ typedef struct CPUARMState {
  */
 typedef void ARMELChangeHook(ARMCPU *cpu, void *opaque);
 
+
+/* These values map onto the return values for
+ * QEMU_PSCI_0_2_FN_AFFINITY_INFO */
+typedef enum ARMPSCIState {
+    PSCI_OFF = 0,
+    PSCI_ON = 1,
+    PSCI_ON_PENDING = 2
+} ARMPSCIState;
+
 /**
  * ARMCPU:
  * @env: #CPUARMState
@@ -582,8 +591,10 @@ struct ARMCPU {
 
     /* Should CPU start in PSCI powered-off state? */
     bool start_powered_off;
-    /* CPU currently in PSCI powered-off state */
-    bool powered_off;
+
+    /* Current power state, access guarded by BQL */
+    ARMPSCIState power_state;
+
     /* CPU has virtualization extension */
     bool has_el2;
     /* CPU has security extension */
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index c00b94e42a..395e986973 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -488,8 +488,8 @@ int kvm_arm_sync_mpstate_to_kvm(ARMCPU *cpu)
 {
     if (cap_has_mp_state) {
         struct kvm_mp_state mp_state = {
-            .mp_state =
-            cpu->powered_off ? KVM_MP_STATE_STOPPED : KVM_MP_STATE_RUNNABLE
+            .mp_state = (cpu->power_state == PSCI_OFF) ?
+            KVM_MP_STATE_STOPPED : KVM_MP_STATE_RUNNABLE
         };
         int ret = kvm_vcpu_ioctl(CPU(cpu), KVM_SET_MP_STATE, &mp_state);
         if (ret) {
@@ -515,7 +515,8 @@ int kvm_arm_sync_mpstate_to_qemu(ARMCPU *cpu)
                     __func__, ret, strerror(-ret));
             abort();
         }
-        cpu->powered_off = (mp_state.mp_state == KVM_MP_STATE_STOPPED);
+        cpu->power_state = (mp_state.mp_state == KVM_MP_STATE_STOPPED) ?
+            PSCI_OFF : PSCI_ON;
     }
 
     return 0;
diff --git a/target/arm/machine.c b/target/arm/machine.c
index fa5ec76090..d8094a840b 100644
--- a/target/arm/machine.c
+++ b/target/arm/machine.c
@@ -211,6 +211,38 @@ static const VMStateInfo vmstate_cpsr = {
     .put = put_cpsr,
 };
 
+static int get_power(QEMUFile *f, void *opaque, size_t size,
+                    VMStateField *field)
+{
+    ARMCPU *cpu = opaque;
+    bool powered_off = qemu_get_byte(f);
+    cpu->power_state = powered_off ? PSCI_OFF : PSCI_ON;
+    return 0;
+}
+
+static int put_power(QEMUFile *f, void *opaque, size_t size,
+                    VMStateField *field, QJSON *vmdesc)
+{
+    ARMCPU *cpu = opaque;
+
+    /* Migration should never happen while we transition power states */
+
+    if (cpu->power_state == PSCI_ON ||
+        cpu->power_state == PSCI_OFF) {
+        bool powered_off = (cpu->power_state == PSCI_OFF) ? true : false;
+        qemu_put_byte(f, powered_off);
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+static const VMStateInfo vmstate_powered_off = {
+    .name = "powered_off",
+    .get = get_power,
+    .put = put_power,
+};
+
 static void cpu_pre_save(void *opaque)
 {
     ARMCPU *cpu = opaque;
@@ -329,7 +361,14 @@ const VMStateDescription vmstate_arm_cpu = {
         VMSTATE_UINT64(env.exception.vaddress, ARMCPU),
         VMSTATE_TIMER_PTR(gt_timer[GTIMER_PHYS], ARMCPU),
         VMSTATE_TIMER_PTR(gt_timer[GTIMER_VIRT], ARMCPU),
-        VMSTATE_BOOL(powered_off, ARMCPU),
+        {
+            .name = "power_state",
+            .version_id = 0,
+            .size = sizeof(bool),
+            .info = &vmstate_powered_off,
+            .flags = VMS_SINGLE,
+            .offset = 0,
+        },
         VMSTATE_END_OF_LIST()
     },
     .subsections = (const VMStateDescription*[]) {
diff --git a/target/arm/psci.c b/target/arm/psci.c
index 64bf82eea1..ade9fe2ede 100644
--- a/target/arm/psci.c
+++ b/target/arm/psci.c
@@ -127,7 +127,9 @@ void arm_handle_psci_call(ARMCPU *cpu)
                 break;
             }
             target_cpu = ARM_CPU(target_cpu_state);
-            ret = target_cpu->powered_off ? 1 : 0;
+
+            g_assert(qemu_mutex_iothread_locked());
+            ret = target_cpu->power_state;
             break;
         default:
             /* Everything above affinity level 0 is always on. */
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 21/24] target-arm: don't generate WFE/YIELD calls for MTTCG
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (19 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 20/24] target-arm/powerctl: defer cpu reset work to CPU context Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 22/24] target-arm: ensure all cross vCPUs TLB flushes complete Alex Bennée
                   ` (3 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, open list:ARM

The WFE and YIELD instructions are really only hints and in TCG's case
they were useful to move the scheduling on from one vCPU to the next. In
the parallel context (MTTCG) this just causes an unnecessary cpu_exit
and contention of the BQL.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
 target/arm/op_helper.c     |  7 +++++++
 target/arm/translate-a64.c |  8 ++++++--
 target/arm/translate.c     | 20 ++++++++++++++++----
 3 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
index 5f3e3bdae2..d64c8670fa 100644
--- a/target/arm/op_helper.c
+++ b/target/arm/op_helper.c
@@ -436,6 +436,13 @@ void HELPER(yield)(CPUARMState *env)
     ARMCPU *cpu = arm_env_get_cpu(env);
     CPUState *cs = CPU(cpu);
 
+    /* When running in MTTCG we don't generate jumps to the yield and
+     * WFE helpers as it won't affect the scheduling of other vCPUs.
+     * If we wanted to more completely model WFE/SEV so we don't busy
+     * spin unnecessarily we would need to do something more involved.
+     */
+    g_assert(!parallel_cpus);
+
     /* This is a non-trappable hint instruction that generally indicates
      * that the guest is currently busy-looping. Yield control back to the
      * top level loop so that a more deserving VCPU has a chance to run.
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
index e61bbd6b3b..e15eae6d41 100644
--- a/target/arm/translate-a64.c
+++ b/target/arm/translate-a64.c
@@ -1328,10 +1328,14 @@ static void handle_hint(DisasContext *s, uint32_t insn,
         s->is_jmp = DISAS_WFI;
         return;
     case 1: /* YIELD */
-        s->is_jmp = DISAS_YIELD;
+        if (!parallel_cpus) {
+            s->is_jmp = DISAS_YIELD;
+        }
         return;
     case 2: /* WFE */
-        s->is_jmp = DISAS_WFE;
+        if (!parallel_cpus) {
+            s->is_jmp = DISAS_WFE;
+        }
         return;
     case 4: /* SEV */
     case 5: /* SEVL */
diff --git a/target/arm/translate.c b/target/arm/translate.c
index 4436d8f3a2..abc1f77ee4 100644
--- a/target/arm/translate.c
+++ b/target/arm/translate.c
@@ -4404,20 +4404,32 @@ static void gen_exception_return(DisasContext *s, TCGv_i32 pc)
     gen_rfe(s, pc, load_cpu_field(spsr));
 }
 
+/*
+ * For WFI we will halt the vCPU until an IRQ. For WFE and YIELD we
+ * only call the helper when running single threaded TCG code to ensure
+ * the next round-robin scheduled vCPU gets a crack. In MTTCG mode we
+ * just skip this instruction. Currently the SEV/SEVL instructions
+ * which are *one* of many ways to wake the CPU from WFE are not
+ * implemented so we can't sleep like WFI does.
+ */
 static void gen_nop_hint(DisasContext *s, int val)
 {
     switch (val) {
     case 1: /* yield */
-        gen_set_pc_im(s, s->pc);
-        s->is_jmp = DISAS_YIELD;
+        if (!parallel_cpus) {
+            gen_set_pc_im(s, s->pc);
+            s->is_jmp = DISAS_YIELD;
+        }
         break;
     case 3: /* wfi */
         gen_set_pc_im(s, s->pc);
         s->is_jmp = DISAS_WFI;
         break;
     case 2: /* wfe */
-        gen_set_pc_im(s, s->pc);
-        s->is_jmp = DISAS_WFE;
+        if (!parallel_cpus) {
+            gen_set_pc_im(s, s->pc);
+            s->is_jmp = DISAS_WFE;
+        }
         break;
     case 4: /* sev */
     case 5: /* sevl */
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 22/24] target-arm: ensure all cross vCPUs TLB flushes complete
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (20 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 21/24] target-arm: don't generate WFE/YIELD calls for MTTCG Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 23/24] hw/misc/imx6_src: defer clearing of SRC_SCR reset bits Alex Bennée
                   ` (2 subsequent siblings)
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, open list:ARM

Previously flushes on other vCPUs would only get serviced when they
exited their TranslationBlocks. While this isn't overly problematic it
violates the semantics of TLB flush from the point of view of source
vCPU.

To solve this we call the cputlb *_all_cpus_synced() functions to do
the flushes which ensures all flushes are completed by the time the
vCPU next schedules its own work. As the TLB instructions are modelled
as CP writes the TB ends at this point meaning cpu->exit_request will
be checked before the next instruction is executed.

Deferring the work until the architectural sync point is a possible
future optimisation.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

---
v8
  - fixup merge for bitmap based API
  - fixup new _synced API
v9
  - fixup merge conflicts
v10
  - remove the ARM_CP_EXIT_PC flag from vCPU TLB flushes
  - re-word the commit
---
 target/arm/helper.c | 165 ++++++++++++++++++++++------------------------------
 1 file changed, 69 insertions(+), 96 deletions(-)

diff --git a/target/arm/helper.c b/target/arm/helper.c
index b41d0494d1..bcedb4a808 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -536,41 +536,33 @@ static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri,
 static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                              uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush(other_cs);
-    }
+    tlb_flush_all_cpus_synced(cs);
 }
 
 static void tlbiasid_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                              uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush(other_cs);
-    }
+    tlb_flush_all_cpus_synced(cs);
 }
 
 static void tlbimva_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                              uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_page(other_cs, value & TARGET_PAGE_MASK);
-    }
+    tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
 }
 
 static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                              uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_page(other_cs, value & TARGET_PAGE_MASK);
-    }
+    tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
 }
 
 static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -587,14 +579,12 @@ static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
 static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                   uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_by_mmuidx(other_cs,
-                            (1 << ARMMMUIdx_S12NSE1) |
-                            (1 << ARMMMUIdx_S12NSE0) |
-                            (1 << ARMMMUIdx_S2NS));
-    }
+    tlb_flush_by_mmuidx_all_cpus_synced(cs,
+                                        (1 << ARMMMUIdx_S12NSE1) |
+                                        (1 << ARMMMUIdx_S12NSE0) |
+                                        (1 << ARMMMUIdx_S2NS));
 }
 
 static void tlbiipas2_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -621,7 +611,7 @@ static void tlbiipas2_write(CPUARMState *env, const ARMCPRegInfo *ri,
 static void tlbiipas2_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
     uint64_t pageaddr;
 
     if (!arm_feature(env, ARM_FEATURE_EL2) || !(env->cp15.scr_el3 & SCR_NS)) {
@@ -630,9 +620,8 @@ static void tlbiipas2_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
 
     pageaddr = sextract64(value << 12, 0, 40);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_page_by_mmuidx(other_cs, pageaddr, (1 << ARMMMUIdx_S2NS));
-    }
+    tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
+                                             (1 << ARMMMUIdx_S2NS));
 }
 
 static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -646,11 +635,9 @@ static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
 static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                  uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_by_mmuidx(other_cs, (1 << ARMMMUIdx_S1E2));
-    }
+    tlb_flush_by_mmuidx_all_cpus_synced(cs, (1 << ARMMMUIdx_S1E2));
 }
 
 static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -665,12 +652,11 @@ static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
 static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                  uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
     uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_page_by_mmuidx(other_cs, pageaddr, (1 << ARMMMUIdx_S1E2));
-    }
+    tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
+                                             (1 << ARMMMUIdx_S1E2));
 }
 
 static const ARMCPRegInfo cp_reginfo[] = {
@@ -2904,8 +2890,7 @@ static CPAccessResult aa64_cacheop_access(CPUARMState *env,
 static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                     uint64_t value)
 {
-    ARMCPU *cpu = arm_env_get_cpu(env);
-    CPUState *cs = CPU(cpu);
+    CPUState *cs = ENV_GET_CPU(env);
 
     if (arm_is_secure_below_el3(env)) {
         tlb_flush_by_mmuidx(cs,
@@ -2921,19 +2906,17 @@ static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
 static void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                       uint64_t value)
 {
+    CPUState *cs = ENV_GET_CPU(env);
     bool sec = arm_is_secure_below_el3(env);
-    CPUState *other_cs;
 
-    CPU_FOREACH(other_cs) {
-        if (sec) {
-            tlb_flush_by_mmuidx(other_cs,
-                                (1 << ARMMMUIdx_S1SE1) |
-                                (1 << ARMMMUIdx_S1SE0));
-        } else {
-            tlb_flush_by_mmuidx(other_cs,
-                                (1 << ARMMMUIdx_S12NSE1) |
-                                (1 << ARMMMUIdx_S12NSE0));
-        }
+    if (sec) {
+        tlb_flush_by_mmuidx_all_cpus_synced(cs,
+                                            (1 << ARMMMUIdx_S1SE1) |
+                                            (1 << ARMMMUIdx_S1SE0));
+    } else {
+        tlb_flush_by_mmuidx_all_cpus_synced(cs,
+                                            (1 << ARMMMUIdx_S12NSE1) |
+                                            (1 << ARMMMUIdx_S12NSE0));
     }
 }
 
@@ -2990,46 +2973,40 @@ static void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
      * stage 2 translations, whereas most other scopes only invalidate
      * stage 1 translations.
      */
+    CPUState *cs = ENV_GET_CPU(env);
     bool sec = arm_is_secure_below_el3(env);
     bool has_el2 = arm_feature(env, ARM_FEATURE_EL2);
-    CPUState *other_cs;
-
-    CPU_FOREACH(other_cs) {
-        if (sec) {
-            tlb_flush_by_mmuidx(other_cs,
-                                (1 << ARMMMUIdx_S1SE1) |
-                                (1 << ARMMMUIdx_S1SE0));
-        } else if (has_el2) {
-            tlb_flush_by_mmuidx(other_cs,
-                                (1 << ARMMMUIdx_S12NSE1) |
-                                (1 << ARMMMUIdx_S12NSE0) |
-                                (1 << ARMMMUIdx_S2NS));
-        } else {
-            tlb_flush_by_mmuidx(other_cs,
-                                (1 << ARMMMUIdx_S12NSE1) |
-                                (1 << ARMMMUIdx_S12NSE0));
-        }
+
+    if (sec) {
+        tlb_flush_by_mmuidx_all_cpus_synced(cs,
+                                            (1 << ARMMMUIdx_S1SE1) |
+                                            (1 << ARMMMUIdx_S1SE0));
+    } else if (has_el2) {
+        tlb_flush_by_mmuidx_all_cpus_synced(cs,
+                                            (1 << ARMMMUIdx_S12NSE1) |
+                                            (1 << ARMMMUIdx_S12NSE0) |
+                                            (1 << ARMMMUIdx_S2NS));
+    } else {
+          tlb_flush_by_mmuidx_all_cpus_synced(cs,
+                                              (1 << ARMMMUIdx_S12NSE1) |
+                                              (1 << ARMMMUIdx_S12NSE0));
     }
 }
 
 static void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                     uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_by_mmuidx(other_cs, (1 << ARMMMUIdx_S1E2));
-    }
+    tlb_flush_by_mmuidx_all_cpus_synced(cs, (1 << ARMMMUIdx_S1E2));
 }
 
 static void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                     uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_by_mmuidx(other_cs, (1 << ARMMMUIdx_S1E3));
-    }
+    tlb_flush_by_mmuidx_all_cpus_synced(cs, (1 << ARMMMUIdx_S1E3));
 }
 
 static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -3086,43 +3063,40 @@ static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
 static void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                    uint64_t value)
 {
+    ARMCPU *cpu = arm_env_get_cpu(env);
+    CPUState *cs = CPU(cpu);
     bool sec = arm_is_secure_below_el3(env);
-    CPUState *other_cs;
     uint64_t pageaddr = sextract64(value << 12, 0, 56);
 
-    CPU_FOREACH(other_cs) {
-        if (sec) {
-            tlb_flush_page_by_mmuidx(other_cs, pageaddr,
-                                     (1 << ARMMMUIdx_S1SE1) |
-                                     (1 << ARMMMUIdx_S1SE0));
-        } else {
-            tlb_flush_page_by_mmuidx(other_cs, pageaddr,
-                                     (1 << ARMMMUIdx_S12NSE1) |
-                                     (1 << ARMMMUIdx_S12NSE0));
-        }
+    if (sec) {
+        tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
+                                                 (1 << ARMMMUIdx_S1SE1) |
+                                                 (1 << ARMMMUIdx_S1SE0));
+    } else {
+        tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
+                                                 (1 << ARMMMUIdx_S12NSE1) |
+                                                 (1 << ARMMMUIdx_S12NSE0));
     }
 }
 
 static void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                    uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
     uint64_t pageaddr = sextract64(value << 12, 0, 56);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_page_by_mmuidx(other_cs, pageaddr, (1 << ARMMMUIdx_S1E2));
-    }
+    tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
+                                             (1 << ARMMMUIdx_S1E2));
 }
 
 static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                    uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
     uint64_t pageaddr = sextract64(value << 12, 0, 56);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_page_by_mmuidx(other_cs, pageaddr, (1 << ARMMMUIdx_S1E3));
-    }
+    tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
+                                             (1 << ARMMMUIdx_S1E3));
 }
 
 static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
@@ -3150,7 +3124,7 @@ static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
 static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
                                       uint64_t value)
 {
-    CPUState *other_cs;
+    CPUState *cs = ENV_GET_CPU(env);
     uint64_t pageaddr;
 
     if (!arm_feature(env, ARM_FEATURE_EL2) || !(env->cp15.scr_el3 & SCR_NS)) {
@@ -3159,9 +3133,8 @@ static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
 
     pageaddr = sextract64(value << 12, 0, 48);
 
-    CPU_FOREACH(other_cs) {
-        tlb_flush_page_by_mmuidx(other_cs, pageaddr, (1 << ARMMMUIdx_S2NS));
-    }
+    tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
+                                             (1 << ARMMMUIdx_S2NS));
 }
 
 static CPAccessResult aa64_zva_access(CPUARMState *env, const ARMCPRegInfo *ri,
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 23/24] hw/misc/imx6_src: defer clearing of SRC_SCR reset bits
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (21 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 22/24] target-arm: ensure all cross vCPUs TLB flushes complete Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 24/24] tcg: enable MTTCG by default for ARM on x86 hosts Alex Bennée
  2017-02-22 18:17 ` [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement no-reply
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, Peter Chubb,
	open list:i.MX31

The arm_reset_cpu/set_cpu_on/set_cpu_off() functions do their work
asynchronously in the target vCPUs context. As a result we need to
ensure the SRC_SCR reset bits correctly report the reset status at the
right time. To do this we defer the clearing of the bit with an async
job which will run after the work queued by ARM powerctl functions.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---

v12
  - s/src_scr_reset_info/SRCSCRResetInfo/
  - use int for reset_bit;
---
 hw/misc/imx6_src.c | 58 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 49 insertions(+), 9 deletions(-)

diff --git a/hw/misc/imx6_src.c b/hw/misc/imx6_src.c
index 55b817b8d7..edbb756c36 100644
--- a/hw/misc/imx6_src.c
+++ b/hw/misc/imx6_src.c
@@ -14,6 +14,7 @@
 #include "qemu/bitops.h"
 #include "qemu/log.h"
 #include "arm-powerctl.h"
+#include "qom/cpu.h"
 
 #ifndef DEBUG_IMX6_SRC
 #define DEBUG_IMX6_SRC 0
@@ -113,6 +114,45 @@ static uint64_t imx6_src_read(void *opaque, hwaddr offset, unsigned size)
     return value;
 }
 
+
+/* The reset is asynchronous so we need to defer clearing the reset
+ * bit until the work is completed.
+ */
+
+struct SRCSCRResetInfo {
+    IMX6SRCState *s;
+    int reset_bit;
+};
+
+static void imx6_clear_reset_bit(CPUState *cpu, run_on_cpu_data data)
+{
+    struct SRCSCRResetInfo *ri = data.host_ptr;
+    IMX6SRCState *s = ri->s;
+
+    assert(qemu_mutex_iothread_locked());
+
+    s->regs[SRC_SCR] = deposit32(s->regs[SRC_SCR], ri->reset_bit, 1, 0);
+    DPRINTF("reg[%s] <= 0x%" PRIx32 "\n",
+            imx6_src_reg_name(SRC_SCR), s->regs[SRC_SCR]);
+
+    g_free(ri);
+}
+
+static void imx6_defer_clear_reset_bit(int cpuid,
+                                       IMX6SRCState *s,
+                                       unsigned long reset_shift)
+{
+    struct SRCSCRResetInfo *ri;
+
+    ri = g_malloc(sizeof(struct SRCSCRResetInfo));
+    ri->s = s;
+    ri->reset_bit = reset_shift;
+
+    async_run_on_cpu(arm_get_cpu_by_id(cpuid), imx6_clear_reset_bit,
+                     RUN_ON_CPU_HOST_PTR(ri));
+}
+
+
 static void imx6_src_write(void *opaque, hwaddr offset, uint64_t value,
                            unsigned size)
 {
@@ -153,7 +193,7 @@ static void imx6_src_write(void *opaque, hwaddr offset, uint64_t value,
                 arm_set_cpu_off(3);
             }
             /* We clear the reset bits as the processor changed state */
-            clear_bit(CORE3_RST_SHIFT, &current_value);
+            imx6_defer_clear_reset_bit(3, s, CORE3_RST_SHIFT);
             clear_bit(CORE3_RST_SHIFT, &change_mask);
         }
         if (EXTRACT(change_mask, CORE2_ENABLE)) {
@@ -162,11 +202,11 @@ static void imx6_src_write(void *opaque, hwaddr offset, uint64_t value,
                 arm_set_cpu_on(2, s->regs[SRC_GPR5], s->regs[SRC_GPR6],
                                3, false);
             } else {
-                /* CORE 3 is shut down */
+                /* CORE 2 is shut down */
                 arm_set_cpu_off(2);
             }
             /* We clear the reset bits as the processor changed state */
-            clear_bit(CORE2_RST_SHIFT, &current_value);
+            imx6_defer_clear_reset_bit(2, s, CORE2_RST_SHIFT);
             clear_bit(CORE2_RST_SHIFT, &change_mask);
         }
         if (EXTRACT(change_mask, CORE1_ENABLE)) {
@@ -175,28 +215,28 @@ static void imx6_src_write(void *opaque, hwaddr offset, uint64_t value,
                 arm_set_cpu_on(1, s->regs[SRC_GPR3], s->regs[SRC_GPR4],
                                3, false);
             } else {
-                /* CORE 3 is shut down */
+                /* CORE 1 is shut down */
                 arm_set_cpu_off(1);
             }
             /* We clear the reset bits as the processor changed state */
-            clear_bit(CORE1_RST_SHIFT, &current_value);
+            imx6_defer_clear_reset_bit(1, s, CORE1_RST_SHIFT);
             clear_bit(CORE1_RST_SHIFT, &change_mask);
         }
         if (EXTRACT(change_mask, CORE0_RST)) {
             arm_reset_cpu(0);
-            clear_bit(CORE0_RST_SHIFT, &current_value);
+            imx6_defer_clear_reset_bit(0, s, CORE0_RST_SHIFT);
         }
         if (EXTRACT(change_mask, CORE1_RST)) {
             arm_reset_cpu(1);
-            clear_bit(CORE1_RST_SHIFT, &current_value);
+            imx6_defer_clear_reset_bit(1, s, CORE1_RST_SHIFT);
         }
         if (EXTRACT(change_mask, CORE2_RST)) {
             arm_reset_cpu(2);
-            clear_bit(CORE2_RST_SHIFT, &current_value);
+            imx6_defer_clear_reset_bit(2, s, CORE2_RST_SHIFT);
         }
         if (EXTRACT(change_mask, CORE3_RST)) {
             arm_reset_cpu(3);
-            clear_bit(CORE3_RST_SHIFT, &current_value);
+            imx6_defer_clear_reset_bit(3, s, CORE3_RST_SHIFT);
         }
         if (EXTRACT(change_mask, SW_IPU2_RST)) {
             /* We pretend the IPU2 is reset */
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH v13 24/24] tcg: enable MTTCG by default for ARM on x86 hosts
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (22 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 23/24] hw/misc/imx6_src: defer clearing of SRC_SCR reset bits Alex Bennée
@ 2017-02-22 17:13 ` Alex Bennée
  2017-02-22 18:17 ` [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement no-reply
  24 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 17:13 UTC (permalink / raw)
  To: rth, peter.maydell
  Cc: qemu-devel, mttcg, fred.konrad, a.rigo, cota, bobby.prani,
	nikunj, mark.burton, pbonzini, jan.kiszka, serge.fdrv,
	bamvor.zhangjian, Alex Bennée, open list:ARM

This enables the multi-threaded system emulation by default for ARMv7
and ARMv8 guests using the x86_64 TCG backend. This is because on the
guest side:

  - The ARM translate.c/translate-64.c have been converted to
    - use MTTCG safe atomic primitives
    - emit the appropriate barrier ops
  - The ARM machine has been updated to
    - hold the BQL when modifying shared cross-vCPU state
    - defer powerctl changes to async safe work

All the host backends support the barrier and atomic primitives but
need to provide same-or-better support for normal load/store
operations.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Acked-by: Peter Maydell <peter.maydell@linaro.org>
Tested-by: Pranith Kumar <bobby.prani@gmail.com>
Reviewed-by: Pranith Kumar <bobby.prani@gmail.com>

---
v7
  - drop configure check for backend
  - declare backend memory order for x86
  - declare guest memory order for ARM
  - add configure snippet to set TARGET_SUPPORTS_MTTCG
v8
  - TCG_DEFAULT_MO -> TCG_GUEST_DEFAULT_MO
  - ~TCG_MO_LD_ST -> ~TCG_MO_ST_LD
v10
  - moved TCG_DEFAULT_MO -> TCG_GUEST_DEFAULT_MO to original commit
v11
  - add Pranith's tested/review-by tags
  - s/defer reset/defer powerctl/ in commit message
---
 configure             |  6 ++++++
 target/arm/cpu.h      |  3 +++
 tcg/i386/tcg-target.h | 11 +++++++++++
 3 files changed, 20 insertions(+)

diff --git a/configure b/configure
index 1c9655e639..3897dbe583 100755
--- a/configure
+++ b/configure
@@ -5879,6 +5879,7 @@ mkdir -p $target_dir
 echo "# Automatically generated by configure - do not modify" > $config_target_mak
 
 bflt="no"
+mttcg="no"
 interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
 gdb_xml_files=""
 
@@ -5897,11 +5898,13 @@ case "$target_name" in
   arm|armeb)
     TARGET_ARCH=arm
     bflt="yes"
+    mttcg="yes"
     gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
   ;;
   aarch64)
     TARGET_BASE_ARCH=arm
     bflt="yes"
+    mttcg="yes"
     gdb_xml_files="aarch64-core.xml aarch64-fpu.xml arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
   ;;
   cris)
@@ -6066,6 +6069,9 @@ if test "$target_bigendian" = "yes" ; then
 fi
 if test "$target_softmmu" = "yes" ; then
   echo "CONFIG_SOFTMMU=y" >> $config_target_mak
+  if test "$mttcg" = "yes" ; then
+    echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
+  fi
 fi
 if test "$target_user_only" = "yes" ; then
   echo "CONFIG_USER_ONLY=y" >> $config_target_mak
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index e285ba3b4b..38a8e00908 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -30,6 +30,9 @@
 #  define TARGET_LONG_BITS 32
 #endif
 
+/* ARM processors have a weak memory model */
+#define TCG_GUEST_DEFAULT_MO      (0)
+
 #define CPUArchState struct CPUARMState
 
 #include "qemu-common.h"
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
index 21d96ec35c..4275787db9 100644
--- a/tcg/i386/tcg-target.h
+++ b/tcg/i386/tcg-target.h
@@ -165,4 +165,15 @@ static inline void flush_icache_range(uintptr_t start, uintptr_t stop)
 {
 }
 
+/* This defines the natural memory order supported by this
+ * architecture before guarantees made by various barrier
+ * instructions.
+ *
+ * The x86 has a pretty strong memory ordering which only really
+ * allows for some stores to be re-ordered after loads.
+ */
+#include "tcg-mo.h"
+
+#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
+
 #endif
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement
  2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
                   ` (23 preceding siblings ...)
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 24/24] tcg: enable MTTCG by default for ARM on x86 hosts Alex Bennée
@ 2017-02-22 18:17 ` no-reply
  2017-02-22 19:55   ` Alex Bennée
  24 siblings, 1 reply; 32+ messages in thread
From: no-reply @ 2017-02-22 18:17 UTC (permalink / raw)
  To: alex.bennee
  Cc: famz, rth, peter.maydell, mttcg, nikunj, jan.kiszka, mark.burton,
	a.rigo, qemu-devel, cota, serge.fdrv, pbonzini, bobby.prani,
	bamvor.zhangjian, fred.konrad

Hi,

This series failed build test on s390x host. Please find the details below.

Type: series
Subject: [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement
Message-id: 20170222171327.26624-1-alex.bennee@linaro.org

=== TEST SCRIPT BEGIN ===
#!/bin/bash
# Testing script will be invoked under the git checkout with
# HEAD pointing to a commit that has the patches applied on top of "base"
# branch
set -e
echo "=== ENV ==="
env
echo "=== PACKAGES ==="
rpm -qa
echo "=== TEST BEGIN ==="
CC=$HOME/bin/cc
INSTALL=$PWD/install
BUILD=/var/tmp/patchew-qemu-build
echo -n "Using CC: "
realpath $CC
test -e $BUILD && rm -rf $BUILD
mkdir -p $BUILD $INSTALL
SRC=$PWD
cd $BUILD
$SRC/configure --cc=$CC --prefix=$INSTALL
make -j4
make check -j4
make install
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 - [tag update]      patchew/1487763883-4877-1-git-send-email-nikunj@linux.vnet.ibm.com -> patchew/1487763883-4877-1-git-send-email-nikunj@linux.vnet.ibm.com
 - [tag update]      patchew/20170222121527.7009-1-cornelia.huck@de.ibm.com -> patchew/20170222121527.7009-1-cornelia.huck@de.ibm.com
 * [new tag]         patchew/20170222171327.26624-1-alex.bennee@linaro.org -> patchew/20170222171327.26624-1-alex.bennee@linaro.org
Switched to a new branch 'test'
1045fbc tcg: enable MTTCG by default for ARM on x86 hosts
8a28277 hw/misc/imx6_src: defer clearing of SRC_SCR reset bits
b03a900 target-arm: ensure all cross vCPUs TLB flushes complete
d06c981 target-arm: don't generate WFE/YIELD calls for MTTCG
ee4ea53 target-arm/powerctl: defer cpu reset work to CPU context
1dfc884 cputlb: introduce tlb_flush_*_all_cpus[_synced]
6e41ba9 cputlb: atomically update tlb fields used by tlb_reset_dirty
a7636a0 cputlb: add tlb_flush_by_mmuidx async routines
7956595 cputlb and arm/sparc targets: convert mmuidx flushes from varg to bitmap
3bb2a0e cputlb: introduce tlb_flush_* async work.
d9e636a cputlb: tweak qemu_ram_addr_from_host_nofail reporting
a87ddd2 cputlb: add assert_cpu_is_self checks
c7f549b tcg: handle EXCP_ATOMIC exception for system emulation
5b31921 tcg: enable thread-per-vCPU
d6edfc4 tcg: enable tb_lock() for SoftMMU
d650c59 tcg: remove global exit_request
20a3c7d tcg: drop global lock during TCG code execution
c6f8201 tcg: rename tcg_current_cpu to tcg_current_rr_cpu
1473067 tcg: add kick timer for single-threaded vCPU emulation
497072f tcg: add options for enabling MTTCG
f093899 tcg: move TCG_MO/BAR types into own file
cc02aae mttcg: Add missing tb_lock/unlock() in cpu_exec_step()
414fdc5 mttcg: translate-all: Enable locking debug in a debug build
d8651bb docs: new design document multi-thread-tcg.txt

=== OUTPUT BEGIN ===
=== ENV ===
XDG_SESSION_ID=31312
SHELL=/bin/sh
USER=fam
PATCHEW=/home/fam/patchew/patchew-cli -s http://patchew.org --nodebug
PATH=/usr/bin:/bin
PWD=/var/tmp/patchew-tester-tmp-_186415r/src
LANG=en_US.UTF-8
HOME=/home/fam
SHLVL=2
LOGNAME=fam
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1012/bus
XDG_RUNTIME_DIR=/run/user/1012
_=/usr/bin/env
=== PACKAGES ===
gpg-pubkey-873529b8-54e386ff
xz-libs-5.2.2-2.fc24.s390x
libacl-2.2.52-11.fc24.s390x
libxshmfence-1.2-3.fc24.s390x
cdparanoia-libs-10.2-21.fc24.s390x
ustr-1.0.4-21.fc24.s390x
giflib-4.1.6-15.fc24.s390x
libusb-0.1.5-7.fc24.s390x
trousers-lib-0.3.13-6.fc24.s390x
readline-devel-6.3-8.fc24.s390x
python-srpm-macros-3-10.fc25.noarch
ncurses-base-6.0-6.20160709.fc25.noarch
gmp-6.1.1-1.fc25.s390x
chkconfig-1.8-1.fc25.s390x
libidn-1.33-1.fc25.s390x
file-5.28-4.fc25.s390x
slang-2.3.0-7.fc25.s390x
avahi-libs-0.6.32-4.fc25.s390x
libsemanage-2.5-8.fc25.s390x
perl-Unicode-Normalize-1.25-365.fc25.s390x
perl-libnet-3.10-1.fc25.noarch
perl-Thread-Queue-3.11-1.fc25.noarch
perl-podlators-4.09-1.fc25.noarch
jasper-libs-1.900.13-1.fc25.s390x
graphite2-1.3.6-1.fc25.s390x
libblkid-2.28.2-1.fc25.s390x
pkgconfig-0.29.1-1.fc25.s390x
dbus-python-1.2.4-2.fc25.s390x
alsa-lib-1.1.1-2.fc25.s390x
libgnome-keyring-3.12.0-7.fc25.s390x
yum-metadata-parser-1.1.4-17.fc25.s390x
python3-3.5.2-4.fc25.s390x
python3-slip-dbus-0.6.4-4.fc25.noarch
python2-cssselect-0.9.2-1.fc25.noarch
python-backports-1.0-8.fc25.s390x
python-magic-5.28-4.fc25.noarch
python-pycparser-2.14-7.fc25.noarch
python-fedora-0.8.0-2.fc25.noarch
createrepo_c-libs-0.10.0-6.fc25.s390x
initscripts-9.69-1.fc25.s390x
plymouth-scripts-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
cronie-1.5.1-2.fc25.s390x
python2-librepo-1.7.18-3.fc25.s390x
wget-1.18-2.fc25.s390x
python3-dnf-plugins-core-0.1.21-4.fc25.noarch
at-spi2-core-2.22.0-1.fc25.s390x
libXv-1.0.11-1.fc25.s390x
dhcp-client-4.3.5-1.fc25.s390x
python2-dnf-plugins-core-0.1.21-4.fc25.noarch
parted-3.2-21.fc25.s390x
python2-ndg_httpsclient-0.4.0-4.fc25.noarch
bash-completion-2.4-1.fc25.noarch
btrfs-progs-4.6.1-1.fc25.s390x
texinfo-6.1-3.fc25.s390x
perl-Filter-1.55-366.fc25.s390x
flex-2.6.0-3.fc25.s390x
libgcc-6.3.1-1.fc25.s390x
glib2-2.50.2-1.fc25.s390x
dbus-libs-1.11.8-1.fc25.s390x
libgomp-6.3.1-1.fc25.s390x
colord-libs-1.3.4-1.fc25.s390x
perl-Encode-2.88-5.fc25.s390x
gstreamer1-1.10.2-1.fc25.s390x
cracklib-2.9.6-4.fc25.s390x
rpm-build-libs-4.13.0-6.fc25.s390x
libobjc-6.3.1-1.fc25.s390x
pcre-devel-8.40-1.fc25.s390x
mariadb-config-10.1.20-1.fc25.s390x
gcc-6.3.1-1.fc25.s390x
mesa-libGL-13.0.3-1.fc25.s390x
python3-dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch
bind-libs-9.10.4-4.P5.fc25.s390x
python-osbs-client-0.33-3.fc25.noarch
NetworkManager-1.4.4-3.fc25.s390x
audit-2.7.1-1.fc25.s390x
glibc-static-2.24-4.fc25.s390x
perl-Pod-Simple-3.35-1.fc25.noarch
gdb-7.12-36.fc25.s390x
python2-simplejson-3.10.0-1.fc25.s390x
python3-sssdconfig-1.14.2-2.fc25.noarch
texlive-lib-2016-30.20160520.fc25.s390x
boost-random-1.60.0-10.fc25.s390x
brltty-5.4-2.fc25.s390x
libref_array-0.1.5-29.fc25.s390x
librados2-10.2.4-2.fc25.s390x
gnutls-dane-3.5.8-1.fc25.s390x
systemtap-client-3.1-0.20160725git91bfb36.fc25.s390x
libXrender-devel-0.9.10-1.fc25.s390x
libXi-devel-1.7.8-2.fc25.s390x
texlive-pdftex-doc-svn41149-30.fc25.noarch
tcp_wrappers-7.6-83.fc25.s390x
javapackages-tools-4.7.0-6.1.fc25.noarch
texlive-kpathsea-bin-svn40473-30.20160520.fc25.s390x
texlive-url-svn32528.3.4-30.fc25.noarch
texlive-latex-fonts-svn28888.0-30.fc25.noarch
texlive-mptopdf-bin-svn18674.0-30.20160520.fc25.noarch
texlive-underscore-svn18261.0-30.fc25.noarch
texlive-subfig-svn15878.1.3-30.fc25.noarch
texlive-dvipdfmx-def-svn40328-30.fc25.noarch
texlive-plain-svn40274-30.fc25.noarch
texlive-texlive-scripts-svn41433-30.fc25.noarch
texlive-fancyref-svn15878.0.9c-30.fc25.noarch
texlive-csquotes-svn39538-30.fc25.noarch
texlive-pxfonts-svn15878.0-30.fc25.noarch
texlive-cite-svn36428.5.5-30.fc25.noarch
texlive-section-svn20180.0-30.fc25.noarch
texlive-pslatex-svn16416.0-30.fc25.noarch
texlive-tex-gyre-math-svn41264-30.fc25.noarch
texlive-knuth-local-svn38627-30.fc25.noarch
texlive-type1cm-svn21820.0-30.fc25.noarch
texlive-finstrut-svn21719.0.5-30.fc25.noarch
texlive-ucharcat-svn38907-30.fc25.noarch
texlive-environ-svn33821.0.3-30.fc25.noarch
texlive-eso-pic-svn37925.2.0g-30.fc25.noarch
texlive-filehook-svn24280.0.5d-30.fc25.noarch
texlive-luatexbase-svn38550-30.fc25.noarch
texlive-pst-text-svn15878.1.00-30.fc25.noarch
texlive-pst-tree-svn24142.1.12-30.fc25.noarch
texlive-latex-bin-bin-svn14050.0-30.20160520.fc25.noarch
texlive-metalogo-svn18611.0.12-30.fc25.noarch
texlive-cm-super-svn15878.0-30.fc25.noarch
texlive-xetex-svn41438-30.fc25.noarch
keyutils-1.5.9-8.fc24.s390x
libcephfs_jni1-10.2.4-2.fc25.s390x
libcom_err-devel-1.43.3-1.fc25.s390x
mesa-libGLES-devel-13.0.3-1.fc25.s390x
graphite2-devel-1.3.6-1.fc25.s390x
nettle-devel-3.3-1.fc25.s390x
lzo-minilzo-2.08-8.fc24.s390x
bzip2-devel-1.0.6-21.fc25.s390x
libusbx-devel-1.0.21-1.fc25.s390x
SDL2-devel-2.0.5-2.fc25.s390x
virglrenderer-devel-0.5.0-1.20160411git61846f92f.fc25.s390x
glib2-static-2.50.2-1.fc25.s390x
mesa-libgbm-devel-13.0.3-1.fc25.s390x
acpica-tools-20160831-1.fc25.s390x
gdk-pixbuf2-2.36.4-1.fc25.s390x
nss-softokn-3.28.1-1.0.fc25.s390x
python3-dnf-1.1.10-5.fc25.noarch
python-gluster-3.9.1-1.fc25.noarch
perl-IO-1.36-382.fc25.s390x
glusterfs-devel-3.9.1-1.fc25.s390x
gtk3-3.22.7-1.fc25.s390x
vim-enhanced-8.0.206-1.fc25.s390x
nss-tools-3.28.1-1.3.fc25.s390x
libmicrohttpd-0.9.52-1.fc25.s390x
gpg-pubkey-a29cb19c-53bcbba6
libaio-0.3.110-6.fc24.s390x
m4-1.4.17-9.fc24.s390x
libfontenc-1.1.3-3.fc24.s390x
lzo-2.08-8.fc24.s390x
isl-0.14-5.fc24.s390x
libXau-1.0.8-6.fc24.s390x
liblockfile-1.09-4.fc24.s390x
linux-atm-libs-2.5.1-14.fc24.s390x
sg3_utils-1.41-3.fc24.s390x
libXext-1.3.3-4.fc24.s390x
libXinerama-1.1.3-6.fc24.s390x
libXxf86vm-1.1.4-3.fc24.s390x
libXft-2.3.2-4.fc24.s390x
ykpers-1.17.3-2.fc24.s390x
bison-3.0.4-4.fc24.s390x
perl-srpm-macros-1-20.fc25.noarch
gawk-4.1.3-8.fc25.s390x
tcp_wrappers-libs-7.6-83.fc25.s390x
libwayland-client-1.12.0-1.fc25.s390x
iptables-1.6.0-2.fc25.s390x
perl-Exporter-5.72-366.fc25.noarch
perl-Text-Tabs+Wrap-2013.0523-365.fc25.noarch
perl-Error-0.17024-7.fc25.noarch
perl-Term-Cap-1.17-365.fc25.noarch
perl-version-0.99.17-1.fc25.s390x
perl-Pod-Usage-1.69-1.fc25.noarch
fftw-libs-double-3.3.5-3.fc25.s390x
device-mapper-persistent-data-0.6.3-1.fc25.s390x
krb5-libs-1.14.4-4.fc25.s390x
system-python-libs-3.5.2-4.fc25.s390x
net-snmp-libs-5.7.3-13.fc25.s390x
libssh2-1.8.0-1.fc25.s390x
libgusb-0.2.9-1.fc25.s390x
ModemManager-glib-1.6.4-1.fc25.s390x
python3-six-1.10.0-3.fc25.noarch
newt-python3-0.52.19-2.fc25.s390x
python3-pysocks-1.5.6-5.fc25.noarch
python-chardet-2.3.0-1.fc25.noarch
python-munch-2.0.4-3.fc25.noarch
python2-cffi-1.7.0-2.fc25.s390x
python-bugzilla-1.2.2-4.fc25.noarch
openldap-2.4.44-2.fc25.s390x
libedit-3.1-16.20160618cvs.fc25.s390x
gc-devel-7.4.4-1.fc25.s390x
python-pycurl-7.43.0-4.fc25.s390x
createrepo_c-0.10.0-6.fc25.s390x
plymouth-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
device-mapper-multipath-libs-0.4.9-83.fc25.s390x
ebtables-2.0.10-21.fc25.s390x
python3-librepo-1.7.18-3.fc25.s390x
libwmf-lite-0.2.8.4-49.fc25.s390x
net-snmp-5.7.3-13.fc25.s390x
yum-3.4.3-510.fc25.noarch
dnf-plugins-core-0.1.21-4.fc25.noarch
at-spi2-atk-2.22.0-1.fc25.s390x
ImageMagick-libs-6.9.3.0-3.fc25.s390x
dhcp-common-4.3.5-1.fc25.noarch
kernel-modules-4.8.8-300.fc25.s390x
dracut-config-rescue-044-78.fc25.s390x
sendmail-8.15.2-7.fc25.s390x
avahi-autoipd-0.6.32-4.fc25.s390x
teamd-1.26-1.fc25.s390x
kernel-devel-4.8.8-300.fc25.s390x
mozjs17-17.0.0-16.fc25.s390x
libselinux-2.5-13.fc25.s390x
libcrypt-nss-2.24-4.fc25.s390x
systemd-libs-231-12.fc25.s390x
libgo-6.3.1-1.fc25.s390x
libgo-devel-6.3.1-1.fc25.s390x
NetworkManager-libnm-1.4.4-3.fc25.s390x
cpp-6.3.1-1.fc25.s390x
rpm-plugin-selinux-4.13.0-6.fc25.s390x
pcre-utf32-8.40-1.fc25.s390x
packagedb-cli-2.14-1.fc25.noarch
python2-pyparsing-2.1.10-1.fc25.noarch
glibc-devel-2.24-4.fc25.s390x
libdrm-2.4.74-1.fc25.s390x
kernel-modules-4.9.3-200.fc25.s390x
cairo-gobject-1.14.8-1.fc25.s390x
bind99-license-9.9.9-4.P5.fc25.noarch
pyrpkg-1.47-5.fc25.noarch
emacs-25.1-3.fc25.s390x
firewalld-0.4.4.2-2.fc25.noarch
pyparsing-2.1.10-1.fc25.noarch
kernel-devel-4.9.3-200.fc25.s390x
libproxy-0.4.14-1.fc25.s390x
ethtool-4.8-1.fc25.s390x
python3-pyparsing-2.1.10-1.fc25.noarch
xorg-x11-proto-devel-7.7-20.fc25.noarch
brlapi-0.6.5-2.fc25.s390x
libcollection-0.7.0-29.fc25.s390x
librados-devel-10.2.4-2.fc25.s390x
libcephfs-devel-10.2.4-2.fc25.s390x
libXdamage-devel-1.1.4-8.fc24.s390x
libXinerama-devel-1.1.3-6.fc24.s390x
quota-4.03-7.fc25.s390x
texlive-texlive-common-doc-svn40682-30.fc25.noarch
texlive-metafont-bin-svn40987-30.20160520.fc25.s390x
texlive-ifluatex-svn41346-30.fc25.noarch
texlive-dvips-bin-svn40987-30.20160520.fc25.s390x
texlive-marvosym-svn29349.2.2a-30.fc25.noarch
texlive-graphics-cfg-svn40269-30.fc25.noarch
texlive-carlisle-svn18258.0-30.fc25.noarch
texlive-glyphlist-svn28576.0-30.fc25.noarch
texlive-tex-bin-svn40987-30.20160520.fc25.s390x
texlive-texlive-scripts-bin-svn29741.0-30.20160520.fc25.noarch
texlive-mathtools-svn38833-30.fc25.noarch
texlive-euro-svn22191.1.1-30.fc25.noarch
texlive-palatino-svn31835.0-30.fc25.noarch
texlive-anysize-svn15878.0-30.fc25.noarch
texlive-sansmath-svn17997.1.1-30.fc25.noarch
texlive-mfnfss-svn19410.0-30.fc25.noarch
texlive-mathpazo-svn15878.1.003-30.fc25.noarch
texlive-knuth-lib-svn35820.0-30.fc25.noarch
texlive-updmap-map-svn41159-30.fc25.noarch
texlive-beton-svn15878.0-30.fc25.noarch
texlive-xetexconfig-svn41133-30.fc25.noarch
texlive-trimspaces-svn15878.1.1-30.fc25.noarch
texlive-memoir-svn41203-30.fc25.noarch
texlive-latex-svn40218-30.fc25.noarch
texlive-lualatex-math-svn40621-30.fc25.noarch
texlive-pst-grad-svn15878.1.06-30.fc25.noarch
texlive-pst-tools-svn34067.0.05-30.fc25.noarch
texlive-amscls-svn36804.0-30.fc25.noarch
texlive-tex-gyre-svn18651.2.004-30.fc25.noarch
texlive-ltxmisc-svn21927.0-30.fc25.noarch
texlive-xetex-bin-svn41091-30.20160520.fc25.s390x
lua-posix-33.3.1-3.fc25.s390x
gssproxy-0.5.1-3.fc25.s390x
java-1.8.0-openjdk-1.8.0.111-5.b16.fc25.s390x
libverto-devel-0.2.6-6.fc24.s390x
mesa-libGLES-13.0.3-1.fc25.s390x
p11-kit-devel-0.23.2-2.fc24.s390x
snappy-1.1.3-2.fc24.s390x
gnutls-devel-3.5.8-1.fc25.s390x
cairo-gobject-devel-1.14.8-1.fc25.s390x
usbredir-devel-0.7.1-2.fc24.s390x
systemtap-3.1-0.20160725git91bfb36.fc25.s390x
bluez-libs-devel-5.43-1.fc25.s390x
libcurl-devel-7.51.0-4.fc25.s390x
cyrus-sasl-devel-2.1.26-26.2.fc24.s390x
python-libs-2.7.13-1.fc25.s390x
nss-sysinit-3.28.1-1.3.fc25.s390x
dnf-1.1.10-5.fc25.noarch
glusterfs-extra-xlators-3.9.1-1.fc25.s390x
perl-5.24.1-382.fc25.s390x
linux-firmware-20161205-69.git91ddce49.fc25.noarch
libX11-devel-1.6.4-4.fc25.s390x
kernel-devel-4.9.5-200.fc25.s390x
python-devel-2.7.13-1.fc25.s390x
kernel-headers-4.9.5-200.fc25.s390x
gpg-pubkey-efe550f5-5220ba41
python-async-0.6.1-9.fc22.s390x
gpg-pubkey-81b46521-55b3ca9a
dejavu-sans-mono-fonts-2.35-3.fc24.noarch
filesystem-3.2-37.fc24.s390x
popt-1.16-7.fc24.s390x
libffi-3.1-9.fc24.s390x
cyrus-sasl-lib-2.1.26-26.2.fc24.s390x
xz-5.2.2-2.fc24.s390x
keyutils-libs-1.5.9-8.fc24.s390x
libnfnetlink-1.0.1-8.fc24.s390x
libnetfilter_conntrack-1.0.4-6.fc24.s390x
libtheora-1.1.1-14.fc24.s390x
xml-common-0.6.3-44.fc24.noarch
autoconf-2.69-22.fc24.noarch
libpipeline-1.4.1-2.fc24.s390x
libXt-1.1.5-3.fc24.s390x
kbd-legacy-2.0.3-3.fc24.noarch
ghostscript-fonts-5.50-35.fc24.noarch
libcroco-0.6.11-2.fc24.s390x
pinentry-0.9.7-2.fc24.s390x
libXevie-1.0.3-11.fc24.s390x
pth-2.0.7-27.fc24.s390x
python2-rpm-macros-3-10.fc25.noarch
libsepol-2.5-10.fc25.s390x
libcap-2.25-2.fc25.s390x
sqlite-libs-3.14.2-1.fc25.s390x
mpfr-3.1.5-1.fc25.s390x
libxcb-1.12-1.fc25.s390x
libicu-57.1-4.fc25.s390x
perl-Carp-1.40-365.fc25.noarch
perl-IO-Socket-IP-0.38-1.fc25.noarch
libmnl-1.0.4-1.fc25.s390x
perl-Unicode-EastAsianWidth-1.33-8.fc25.noarch
perl-Getopt-Long-2.49.1-1.fc25.noarch
libwayland-cursor-1.12.0-1.fc25.s390x
coreutils-common-8.25-15.fc25.s390x
libmount-2.28.2-1.fc25.s390x
python2-decorator-4.0.10-3.fc25.noarch
avahi-glib-0.6.32-4.fc25.s390x
python3-pip-8.1.2-2.fc25.noarch
python3-libcomps-0.1.7-5.fc25.s390x
python-slip-0.6.4-4.fc25.noarch
python-krbV-1.0.90-12.fc25.s390x
python2-libcomps-0.1.7-5.fc25.s390x
python2-urllib3-1.15.1-3.fc25.noarch
fipscheck-1.4.1-11.fc25.s390x
gc-7.4.4-1.fc25.s390x
libndp-1.6-1.fc25.s390x
libsolv-0.6.24-1.fc25.s390x
gnupg2-2.1.13-2.fc25.s390x
geoclue2-2.4.4-1.fc25.s390x
s390utils-cmsfs-1.36.0-1.fc25.s390x
libXfixes-5.0.3-1.fc25.s390x
libXi-1.7.8-2.fc25.s390x
adwaita-icon-theme-3.22.0-1.fc25.noarch
dconf-0.26.0-1.fc25.s390x
ncurses-devel-6.0-6.20160709.fc25.s390x
newt-python-0.52.19-2.fc25.s390x
perl-Test-Harness-3.36-367.fc25.noarch
valgrind-3.12.0-1.fc25.s390x
dejagnu-1.6-1.fc25.noarch
audit-libs-2.7.1-1.fc25.s390x
libstdc++-devel-6.3.1-1.fc25.s390x
emacs-filesystem-25.1-3.fc25.noarch
libdb-utils-5.3.28-16.fc25.s390x
libidn2-0.11-1.fc25.s390x
python3-rpm-4.13.0-6.fc25.s390x
gnutls-3.5.8-1.fc25.s390x
python-beautifulsoup4-4.5.3-1.fc25.noarch
qt5-srpm-macros-5.7.1-1.fc25.noarch
elfutils-default-yama-scope-0.168-1.fc25.noarch
device-mapper-1.02.136-3.fc25.s390x
device-mapper-event-1.02.136-3.fc25.s390x
systemd-container-231-12.fc25.s390x
python3-distro-1.0.1-2.fc25.noarch
fedpkg-1.26-4.fc25.noarch
gstreamer1-plugins-base-1.10.2-1.fc25.s390x
subversion-1.9.5-1.fc25.s390x
perl-Module-CoreList-5.20170115-1.fc25.noarch
perl-Class-Inspector-1.31-2.fc25.noarch
libtool-ltdl-2.4.6-13.fc25.s390x
python2-sssdconfig-1.14.2-2.fc25.noarch
glib2-devel-2.50.2-1.fc25.s390x
poppler-0.45.0-2.fc25.s390x
libbasicobjects-0.1.1-29.fc25.s390x
libevent-2.0.22-1.fc25.s390x
libradosstriper1-10.2.4-2.fc25.s390x
atk-devel-2.22.0-1.fc25.s390x
libXxf86vm-devel-1.1.4-3.fc24.s390x
libev-4.24-1.fc25.s390x
gsm-1.0.16-1.fc25.s390x
libnfsidmap-0.27-0.fc25.s390x
zziplib-0.13.62-7.fc24.s390x
texlive-metafont-svn40793-30.fc25.noarch
texlive-booktabs-svn40846-30.fc25.noarch
texlive-dvips-svn41149-30.fc25.noarch
texlive-zapfding-svn31835.0-30.fc25.noarch
texlive-graphics-svn41015-30.fc25.noarch
texlive-latexconfig-svn40274-30.fc25.noarch
texlive-gsftopk-bin-svn40473-30.20160520.fc25.s390x
texlive-tex-svn40793-30.fc25.noarch
texlive-xdvi-bin-svn40750-30.20160520.fc25.s390x
texlive-qstest-svn15878.0-30.fc25.noarch
texlive-avantgar-svn31835.0-30.fc25.noarch
texlive-ncntrsbk-svn31835.0-30.fc25.noarch
texlive-cm-svn32865.0-30.fc25.noarch
texlive-rcs-svn15878.0-30.fc25.noarch
texlive-fix2col-svn38770-30.fc25.noarch
texlive-lm-math-svn36915.1.959-30.fc25.noarch
texlive-hyphen-base-svn41138-30.fc25.noarch
texlive-unicode-data-svn39808-30.fc25.noarch
texlive-luatex-svn40963-30.fc25.noarch
texlive-xetex-def-svn40327-30.fc25.noarch
texlive-varwidth-svn24104.0.92-30.fc25.noarch
texlive-l3kernel-svn41246-30.fc25.noarch
texlive-hyperref-svn41396-30.fc25.noarch
texlive-unicode-math-svn38462-30.fc25.noarch
texlive-fancyvrb-svn18492.2.8-30.fc25.noarch
texlive-pst-plot-svn41242-30.fc25.noarch
texlive-rotating-svn16832.2.16b-30.fc25.noarch
texlive-pdfpages-svn40638-30.fc25.noarch
texlive-ae-svn15878.1.4-30.fc25.noarch
libpaper-1.1.24-12.fc24.s390x
texlive-collection-latexrecommended-svn35765.0-30.20160520.fc25.noarch
libini_config-1.3.0-29.fc25.s390x
xorg-x11-fonts-Type1-7.5-16.fc24.noarch
pcre2-devel-10.22-8.fc25.s390x
gnutls-c++-3.5.8-1.fc25.s390x
systemtap-devel-3.1-0.20160725git91bfb36.fc25.s390x
libtasn1-devel-4.10-1.fc25.s390x
pango-devel-1.40.3-1.fc25.s390x
vte291-devel-0.46.1-1.fc25.s390x
snappy-devel-1.1.3-2.fc24.s390x
brlapi-devel-0.6.5-2.fc25.s390x
man-pages-4.06-3.fc25.noarch
libcap-ng-devel-0.7.8-1.fc25.s390x
glusterfs-3.9.1-1.fc25.s390x
nss-util-devel-3.28.1-1.0.fc25.s390x
dnf-conf-1.1.10-5.fc25.noarch
libxkbcommon-devel-0.7.1-1.fc25.s390x
perl-macros-5.24.1-382.fc25.s390x
rpcbind-0.2.4-2.fc25.s390x
pulseaudio-libs-10.0-2.fc25.s390x
kernel-4.9.5-200.fc25.s390x
libnl3-cli-3.2.29-2.fc25.s390x
tzdata-2016j-2.fc25.noarch
gpg-pubkey-34ec9cba-54e38751
gpg-pubkey-030d5aed-55b577f0
basesystem-11-2.fc24.noarch
libattr-2.4.47-16.fc24.s390x
libmpc-1.0.2-5.fc24.s390x
apr-util-1.5.4-3.fc24.s390x
rsync-3.1.2-2.fc24.s390x
libunistring-0.9.4-3.fc24.s390x
jbigkit-libs-2.1-5.fc24.s390x
pixman-0.34.0-2.fc24.s390x
acl-2.2.52-11.fc24.s390x
dwz-0.12-2.fc24.s390x
expect-5.45-22.fc24.s390x
libmodman-2.0.1-12.fc24.s390x
libsigsegv-2.10-10.fc24.s390x
libvisual-0.4.0-20.fc24.s390x
fakeroot-libs-1.20.2-4.fc24.s390x
m17n-lib-1.7.0-5.fc24.s390x
libpcap-1.7.4-2.fc24.s390x
libverto-0.2.6-6.fc24.s390x
lsscsi-0.28-3.fc24.s390x
setup-2.10.4-1.fc25.noarch
rpmconf-base-1.0.18-2.fc25.noarch
bash-4.3.43-4.fc25.s390x
expat-2.2.0-1.fc25.s390x
libxml2-2.9.3-4.fc25.s390x
libgpg-error-1.24-1.fc25.s390x
nspr-4.13.1-1.fc25.s390x
libgcrypt-1.6.6-1.fc25.s390x
file-libs-5.28-4.fc25.s390x
findutils-4.6.0-8.fc25.s390x
libjpeg-turbo-1.5.1-0.fc25.s390x
kmod-23-1.fc25.s390x
libassuan-2.4.3-1.fc25.s390x
libusbx-1.0.21-1.fc25.s390x
newt-0.52.19-2.fc25.s390x
libxslt-1.1.28-13.fc25.s390x
libmetalink-0.1.3-1.fc25.s390x
perl-Socket-2.024-1.fc25.s390x
perl-File-Path-2.12-365.fc25.noarch
perl-MIME-Base64-3.15-365.fc25.s390x
perl-HTTP-Tiny-0.070-1.fc25.noarch
ncurses-6.0-6.20160709.fc25.s390x
libwayland-server-1.12.0-1.fc25.s390x
ipset-6.29-1.fc25.s390x
perl-Text-Unidecode-1.27-3.fc25.noarch
perl-Fedora-VSP-0.001-4.fc25.noarch
perl-libintl-perl-1.26-1.fc25.s390x
plymouth-core-libs-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
hunspell-1.4.1-1.fc25.s390x
which-2.21-1.fc25.s390x
coreutils-8.25-15.fc25.s390x
python2-setuptools-25.1.1-1.fc25.noarch
shadow-utils-4.2.1-11.fc25.s390x
atk-2.22.0-1.fc25.s390x
system-python-3.5.2-4.fc25.s390x
pam-1.3.0-1.fc25.s390x
python2-pyasn1-0.1.9-7.fc25.1.noarch
harfbuzz-icu-1.3.2-1.fc25.s390x
gsettings-desktop-schemas-3.22.0-1.fc25.s390x
libsecret-0.18.5-2.fc25.s390x
s390utils-iucvterm-1.36.0-1.fc25.s390x
python3-setuptools-25.1.1-1.fc25.noarch
python3-decorator-4.0.10-3.fc25.noarch
python3-slip-0.6.4-4.fc25.noarch
python3-magic-5.28-4.fc25.noarch
python3-requests-2.10.0-4.fc25.noarch
python3-systemd-232-1.fc25.s390x
pyusb-1.0.0-2.fc25.noarch
python-slip-dbus-0.6.4-4.fc25.noarch
python-enum34-1.0.4-6.fc25.noarch
python-lockfile-0.11.0-4.fc25.noarch
python2-ply-3.8-2.fc25.noarch
pyOpenSSL-16.0.0-2.fc25.noarch
python2-requests-2.10.0-4.fc25.noarch
pyxattr-0.5.3-8.fc25.s390x
libarchive-3.2.2-1.fc25.s390x
libkadm5-1.14.4-4.fc25.s390x
dtc-1.4.2-1.fc25.s390x
libbabeltrace-1.4.0-3.fc25.s390x
guile-2.0.13-1.fc25.s390x
libthai-0.1.25-1.fc25.s390x
libnghttp2-1.13.0-2.fc25.s390x
deltarpm-3.6-17.fc25.s390x
python-urlgrabber-3.10.1-9.fc25.noarch
iputils-20161105-1.fc25.s390x
s390utils-mon_statd-1.36.0-1.fc25.s390x
cryptsetup-libs-1.7.2-3.fc25.s390x
device-mapper-multipath-0.4.9-83.fc25.s390x
cronie-anacron-1.5.1-2.fc25.s390x
ghostscript-core-9.20-5.fc25.s390x
python3-pygpgme-0.3-18.fc25.s390x
rest-0.8.0-1.fc25.s390x
libreport-filesystem-2.8.0-1.fc25.s390x
libXtst-1.2.3-1.fc25.s390x
iso-codes-3.70-1.fc25.noarch
ghc-srpm-macros-1.4.2-4.fc25.noarch
adwaita-cursor-theme-3.22.0-1.fc25.noarch
rpmdevtools-8.9-1.fc25.noarch
kernel-4.8.8-300.fc25.s390x
python-dnf-plugins-extras-migrate-0.0.12-4.fc25.noarch
s390utils-1.36.0-1.fc25.s390x
authconfig-6.2.10-14.fc25.s390x
fedora-cert-0.6.0.1-1.fc25.noarch
glibc-2.24-4.fc25.s390x
elfutils-libelf-0.168-1.fc25.s390x
libstdc++-6.3.1-1.fc25.s390x
perl-Scalar-List-Utils-1.47-1.fc25.s390x
gdb-headless-7.12-36.fc25.s390x
bzip2-1.0.6-21.fc25.s390x
bind-license-9.10.4-4.P5.fc25.noarch
pcre-cpp-8.40-1.fc25.s390x
perl-threads-2.12-1.fc25.s390x
subversion-libs-1.9.5-1.fc25.s390x
libss-1.43.3-1.fc25.s390x
shared-mime-info-1.8-1.fc25.s390x
libselinux-utils-2.5-13.fc25.s390x
libgfortran-6.3.1-1.fc25.s390x
rpm-4.13.0-6.fc25.s390x
python2-rpm-4.13.0-6.fc25.s390x
policycoreutils-2.5-19.fc25.s390x
libtasn1-4.10-1.fc25.s390x
mesa-libwayland-egl-13.0.3-1.fc25.s390x
pigz-2.3.4-1.fc25.s390x
koji-1.11.0-1.fc25.noarch
python3-enchant-1.6.8-1.fc25.noarch
mariadb-common-10.1.20-1.fc25.s390x
firewalld-filesystem-0.4.4.2-2.fc25.noarch
systemd-231-12.fc25.s390x
device-mapper-libs-1.02.136-3.fc25.s390x
systemd-udev-231-12.fc25.s390x
dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch
mesa-libEGL-13.0.3-1.fc25.s390x
dnsmasq-2.76-2.fc25.s390x
distribution-gpg-keys-1.9-1.fc25.noarch
bind-libs-lite-9.10.4-4.P5.fc25.s390x
mock-1.3.3-1.fc25.noarch
python2-dockerfile-parse-0.0.5-7.fc25.noarch
fedora-packager-0.6.0.1-1.fc25.noarch
openssl-1.0.2j-3.fc25.s390x
lvm2-2.02.167-3.fc25.s390x
systemd-bootchart-231-2.fc25.s390x
gcc-c++-6.3.1-1.fc25.s390x
texlive-base-2016-30.20160520.fc25.noarch
boost-system-1.60.0-10.fc25.s390x
pcre2-10.22-8.fc25.s390x
libpng-devel-1.6.27-1.fc25.s390x
perl-XML-Parser-2.44-5.fc25.s390x
libtirpc-1.0.1-3.rc3.fc25.s390x
lttng-ust-2.8.1-2.fc25.s390x
libasyncns-0.8-10.fc24.s390x
unbound-libs-1.5.10-1.fc25.s390x
libradosstriper-devel-10.2.4-2.fc25.s390x
systemtap-runtime-3.1-0.20160725git91bfb36.fc25.s390x
libXau-devel-1.0.8-6.fc24.s390x
libXfixes-devel-5.0.3-1.fc25.s390x
mesa-libEGL-devel-13.0.3-1.fc25.s390x
libXcomposite-devel-0.4.4-8.fc24.s390x
libverto-libev-0.2.6-6.fc24.s390x
texlive-kpathsea-doc-svn41139-30.fc25.noarch
flac-libs-1.3.2-1.fc25.s390x
quota-nls-4.03-7.fc25.noarch
python3-html5lib-0.999-9.fc25.noarch
python3-javapackages-4.7.0-6.1.fc25.noarch
perl-Digest-1.17-366.fc25.noarch
texlive-texlive.infra-svn41280-30.fc25.noarch
texlive-tetex-svn41059-30.fc25.noarch
texlive-amsfonts-svn29208.3.04-30.fc25.noarch
texlive-etex-pkg-svn39355-30.fc25.noarch
texlive-lm-svn28119.2.004-30.fc25.noarch
texlive-fp-svn15878.0-30.fc25.noarch
texlive-mptopdf-svn41282-30.fc25.noarch
texlive-euler-svn17261.2.5-30.fc25.noarch
texlive-setspace-svn24881.6.7a-30.fc25.noarch
texlive-tools-svn40934-30.fc25.noarch
texlive-colortbl-svn29803.v1.0a-30.fc25.noarch
texlive-natbib-svn20668.8.31b-30.fc25.noarch
texlive-bibtex-svn40768-30.fc25.noarch
texlive-gsftopk-svn40768-30.fc25.noarch
texlive-mfware-svn40768-30.fc25.noarch
texlive-tex-ini-files-svn40533-30.fc25.noarch
texlive-texconfig-bin-svn29741.0-30.20160520.fc25.noarch
libXmu-1.1.2-4.fc24.s390x
libXcursor-1.1.14-6.fc24.s390x
kbd-misc-2.0.3-3.fc24.noarch
libutempter-1.1.6-8.fc24.s390x
python-kitchen-1.2.4-2.fc24.noarch
polkit-libs-0.113-5.fc24.s390x
libgudev-230-3.fc24.s390x
popt-devel-1.16-7.fc24.s390x
make-4.1-5.fc24.s390x
fakeroot-1.20.2-4.fc24.s390x
blktrace-1.1.0-3.fc24.s390x
hicolor-icon-theme-0.15-3.fc24.noarch
usermode-1.111-8.fc24.s390x
kbd-2.0.3-3.fc24.s390x
libaio-devel-0.3.110-6.fc24.s390x
web-assets-filesystem-5-4.fc24.noarch
perl-IO-Socket-SSL-2.038-1.fc25.noarch
python-backports-ssl_match_hostname-3.5.0.1-3.fc25.noarch
mc-4.8.18-2.fc25.s390x
expat-devel-2.2.0-1.fc25.s390x
automake-1.15-7.fc25.noarch
perl-File-ShareDir-1.102-7.fc25.noarch
lua-5.3.3-3.fc25.s390x
tcl-8.6.6-1.fc25.s390x
gcc-objc-6.3.1-1.fc25.s390x
libselinux-devel-2.5-13.fc25.s390x
e2fsprogs-1.43.3-1.fc25.s390x
perl-Storable-2.56-367.fc25.s390x
libstdc++-static-6.3.1-1.fc25.s390x
perl-Time-Local-1.250-1.fc25.noarch
libwebp-0.5.2-1.fc25.s390x
xkeyboard-config-2.19-1.1.fc25.noarch
python-firewall-0.4.4.2-2.fc25.noarch
texlive-xdvi-svn40768-30.fc25.noarch
texlive-wasy2-ps-svn35830.0-30.fc25.noarch
texlive-ltabptch-svn17533.1.74d-30.fc25.noarch
texlive-sauerj-svn15878.0-30.fc25.noarch
texlive-bookman-svn31835.0-30.fc25.noarch
texlive-courier-svn35058.0-30.fc25.noarch
texlive-mflogo-font-svn36898.1.002-30.fc25.noarch
texlive-rsfs-svn15878.0-30.fc25.noarch
texlive-zapfchan-svn31835.0-30.fc25.noarch
texlive-cmap-svn41168-30.fc25.noarch
texlive-parskip-svn19963.2.0-30.fc25.noarch
texlive-sepnum-svn20186.2.0-30.fc25.noarch
texlive-fancyhdr-svn15878.3.1-30.fc25.noarch
texlive-pspicture-svn15878.0-30.fc25.noarch
texlive-fpl-svn15878.1.002-30.fc25.noarch
texlive-utopia-svn15878.0-30.fc25.noarch
texlive-hyph-utf8-svn41189-30.fc25.noarch
texlive-lua-alt-getopt-svn29349.0.7.0-30.fc25.noarch
texlive-texlive-msg-translations-svn41431-30.fc25.noarch
texlive-parallel-svn15878.0-30.fc25.noarch
texlive-luatex-bin-svn41091-30.20160520.fc25.s390x
texlive-lineno-svn21442.4.41-30.fc25.noarch
texlive-kastrup-svn15878.0-30.fc25.noarch
texlive-chngcntr-svn17157.1.0a-30.fc25.noarch
texlive-lualibs-svn40370-30.fc25.noarch
texlive-xunicode-svn30466.0.981-30.fc25.noarch
texlive-l3packages-svn41246-30.fc25.noarch
texlive-pgf-svn40966-30.fc25.noarch
texlive-koma-script-svn41508-30.fc25.noarch
texlive-currfile-svn40725-30.fc25.noarch
texlive-luaotfload-svn40902-30.fc25.noarch
texlive-ifplatform-svn21156.0.4-30.fc25.noarch
texlive-showexpl-svn32737.v0.3l-30.fc25.noarch
texlive-pst-3d-svn17257.1.10-30.fc25.noarch
texlive-pst-node-svn40743-30.fc25.noarch
texlive-pstricks-add-svn40744-30.fc25.noarch
texlive-pst-pdf-svn31660.1.1v-30.fc25.noarch
texlive-latex-bin-svn41438-30.fc25.noarch
texlive-powerdot-svn38984-30.fc25.noarch
texlive-sansmathaccent-svn30187.0-30.fc25.noarch
texlive-typehtml-svn17134.0-30.fc25.noarch
texlive-ucs-svn35853.2.2-30.fc25.noarch
teckit-2.5.1-15.fc24.s390x
texlive-dvipdfmx-svn41149-30.fc25.noarch
texlive-collection-latex-svn41011-30.20160520.fc25.noarch
netpbm-10.76.00-2.fc25.s390x
libpath_utils-0.2.1-29.fc25.s390x
nfs-utils-1.3.4-1.rc3.fc25.s390x
ttmkfdir-3.0.9-48.fc24.s390x
libcephfs_jni-devel-10.2.4-2.fc25.s390x
pcre2-utf16-10.22-8.fc25.s390x
keyutils-libs-devel-1.5.9-8.fc24.s390x
libicu-devel-57.1-4.fc25.s390x
attr-2.4.47-16.fc24.s390x
harfbuzz-devel-1.3.2-1.fc25.s390x
libidn-devel-1.33-1.fc25.s390x
usbredir-0.7.1-2.fc24.s390x
libnfs-1.9.8-2.fc24.s390x
SDL2-2.0.5-2.fc25.s390x
freetype-devel-2.6.5-1.fc25.s390x
cairo-devel-1.14.8-1.fc25.s390x
libepoxy-devel-1.3.1-3.fc25.s390x
libcacard-devel-2.5.2-2.fc24.s390x
lzo-devel-2.08-8.fc24.s390x
libssh2-devel-1.8.0-1.fc25.s390x
pcre-static-8.40-1.fc25.s390x
qemu-sanity-check-nodeps-1.1.5-5.fc24.s390x
libcap-devel-2.25-2.fc25.s390x
alsa-lib-devel-1.1.1-2.fc25.s390x
nss-util-3.28.1-1.0.fc25.s390x
glusterfs-client-xlators-3.9.1-1.fc25.s390x
nss-softokn-freebl-3.28.1-1.0.fc25.s390x
libnl3-3.2.29-2.fc25.s390x
python3-hawkey-0.6.3-6.1.fc25.s390x
git-core-doc-2.9.3-2.fc25.s390x
glusterfs-fuse-3.9.1-1.fc25.s390x
gdk-pixbuf2-devel-2.36.4-1.fc25.s390x
perl-Errno-1.25-382.fc25.s390x
git-2.9.3-2.fc25.s390x
glusterfs-server-3.9.1-1.fc25.s390x
kernel-modules-4.9.5-200.fc25.s390x
pulseaudio-libs-glib2-10.0-2.fc25.s390x
libpsl-0.17.0-1.fc25.s390x
glusterfs-api-devel-3.9.1-1.fc25.s390x
nss-devel-3.28.1-1.3.fc25.s390x
wpa_supplicant-2.6-1.fc25.s390x
xemacs-filesystem-21.5.34-19.20170114hgd0e8ec0fe015.fc25.noarch
opus-1.1.3-2.fc25.s390x
copy-jdk-configs-2.0-1.fc25.noarch
gpg-pubkey-a0a7badb-52844296
fontpackages-filesystem-1.44-17.fc24.noarch
readline-6.3-8.fc24.s390x
cpio-2.12-3.fc24.s390x
groff-base-1.22.3-8.fc24.s390x
ilmbase-2.2.0-5.fc24.s390x
p11-kit-trust-0.23.2-2.fc24.s390x
OpenEXR-libs-2.2.0-5.fc24.s390x
hesiod-3.2.1-6.fc24.s390x
sysfsutils-2.1.0-19.fc24.s390x
qrencode-libs-3.4.2-6.fc24.s390x
GeoIP-1.6.9-2.fc24.s390x
ocaml-srpm-macros-2-4.fc24.noarch
libXcomposite-0.4.4-8.fc24.s390x
procps-ng-3.3.10-11.fc24.s390x
GConf2-3.2.6-16.fc24.s390x
mailx-12.5-19.fc24.s390x
xz-devel-5.2.2-2.fc24.s390x
fedora-logos-22.0.0-3.fc24.s390x
telnet-0.17-65.fc24.s390x
gpg-pubkey-e372e838-56fd7943
fedora-repos-25-1.noarch
ncurses-libs-6.0-6.20160709.fc25.s390x
lua-libs-5.3.3-3.fc25.s390x
kmod-libs-23-1.fc25.s390x
libseccomp-2.3.1-1.fc25.s390x
perl-parent-0.236-1.fc25.noarch
libICE-1.0.9-5.fc25.s390x
ipset-libs-6.29-1.fc25.s390x
perl-TermReadKey-2.37-1.fc25.s390x
dhcp-libs-4.3.5-1.fc25.s390x
gmp-devel-6.1.1-1.fc25.s390x
ncurses-c++-libs-6.0-6.20160709.fc25.s390x
python-pip-8.1.2-2.fc25.noarch
gzip-1.8-1.fc25.s390x
harfbuzz-1.3.2-1.fc25.s390x
python2-iniparse-0.4-20.fc25.noarch
libfdisk-2.28.2-1.fc25.s390x
python3-iniparse-0.4-20.fc25.noarch
python3-gobject-base-3.22.0-1.fc25.s390x
python3-kickstart-2.32-1.fc25.noarch
python2-yubico-1.3.2-3.fc25.noarch
python-idna-2.0-4.fc25.noarch
nss-pem-1.0.2-2.fc25.s390x
perl-Net-SSLeay-1.78-1.fc25.s390x
krb5-workstation-1.14.4-4.fc25.s390x
libepoxy-1.3.1-3.fc25.s390x
drpm-0.3.0-3.fc25.s390x
libsmartcols-2.28.2-1.fc25.s390x
s390utils-ziomon-1.36.0-1.fc25.s390x
librepo-1.7.18-3.fc25.s390x
glib-networking-2.50.0-1.fc25.s390x
librsvg2-2.40.16-2.fc25.s390x
gnat-srpm-macros-4-1.fc25.noarch
webkitgtk3-2.4.11-3.fc25.s390x
libXaw-1.0.13-4.fc25.s390x
sudo-1.8.18p1-1.fc25.s390x
systemtap-sdt-devel-3.1-0.20160725git91bfb36.fc25.s390x
xorg-x11-font-utils-7.5-32.fc25.s390x
python-decoratortools-1.8-12.fc25.noarch
m17n-db-1.7.0-7.fc25.noarch
hardlink-1.1-1.fc25.s390x
glibc-common-2.24-4.fc25.s390x
libcom_err-1.43.3-1.fc25.s390x
grep-2.27-1.fc25.s390x
iproute-4.6.0-6.fc25.s390x
e2fsprogs-libs-1.43.3-1.fc25.s390x
curl-7.51.0-4.fc25.s390x
libvorbis-1.3.5-1.fc25.s390x
python2-dateutil-2.6.0-1.fc25.noarch
python3-firewall-0.4.4.2-2.fc25.noarch
libXpm-3.5.12-1.fc25.s390x
systemd-pam-231-12.fc25.s390x
mesa-libgbm-13.0.3-1.fc25.s390x
rpm-build-4.13.0-6.fc25.s390x
openssl-libs-1.0.2j-3.fc25.s390x
python2-smmap-2.0.1-1.fc25.noarch
bind99-libs-9.9.9-4.P5.fc25.s390x
kernel-4.9.3-200.fc25.s390x
gcc-gdb-plugin-6.3.1-1.fc25.s390x
selinux-policy-targeted-3.13.1-225.6.fc25.noarch
perl-Time-HiRes-1.9741-1.fc25.s390x
npth-1.3-1.fc25.s390x
poppler-data-0.4.7-6.fc25.noarch
nspr-devel-4.13.1-1.fc25.s390x
libcephfs1-10.2.4-2.fc25.s390x
wayland-devel-1.12.0-1.fc25.s390x
librbd1-10.2.4-2.fc25.s390x
libxcb-devel-1.12-1.fc25.s390x
mesa-libGL-devel-13.0.3-1.fc25.s390x
perl-encoding-2.19-5.fc25.s390x
libsndfile-1.0.27-1.fc25.s390x
python3-cssselect-0.9.2-1.fc25.noarch
perl-Digest-MD5-2.55-2.fc25.s390x
texlive-tetex-bin-svn36770.0-30.20160520.fc25.noarch
texlive-etoolbox-svn38031.2.2a-30.fc25.noarch
texlive-babel-svn40706-30.fc25.noarch
texlive-fancybox-svn18304.1.4-30.fc25.noarch
texlive-xkeyval-svn35741.2.7a-30.fc25.noarch
texlive-pdftex-def-svn22653.0.06d-30.fc25.noarch
texlive-makeindex-bin-svn40473-30.20160520.fc25.s390x
texlive-pdftex-bin-svn40987-30.20160520.fc25.s390x
texlive-pst-ovl-svn40873-30.fc25.noarch
texlive-crop-svn15878.1.5-30.fc25.noarch
texlive-manfnt-font-svn35799.0-30.fc25.noarch
texlive-txfonts-svn15878.0-30.fc25.noarch
texlive-ntgclass-svn15878.2.1a-30.fc25.noarch
texlive-dvisvgm-def-svn41011-30.fc25.noarch
texlive-ec-svn25033.1.0-30.fc25.noarch
texlive-etex-svn37057.0-30.fc25.noarch
texlive-texlive-en-svn41185-30.fc25.noarch
texlive-graphics-def-svn41879-30.fc25.noarch
texlive-iftex-svn29654.0.2-30.fc25.noarch
texlive-pst-math-svn34786.0.63-30.fc25.noarch
texlive-bera-svn20031.0-30.fc25.noarch
texlive-ms-svn29849.0-30.fc25.noarch
texlive-luaotfload-bin-svn34647.0-30.20160520.fc25.noarch
texlive-listings-svn37534.1.6-30.fc25.noarch
texlive-pst-fill-svn15878.1.01-30.fc25.noarch
texlive-pst-pdf-bin-svn7838.0-30.20160520.fc25.noarch
texlive-pst-slpe-svn24391.1.31-30.fc25.noarch
texlive-seminar-svn34011.1.62-30.fc25.noarch
texlive-l3experimental-svn41163-30.fc25.noarch
texlive-collection-fontsrecommended-svn35830.0-30.20160520.fc25.noarch
gettext-libs-0.19.8.1-3.fc25.s390x
java-1.8.0-openjdk-headless-1.8.0.111-5.b16.fc25.s390x
pcre2-utf32-10.22-8.fc25.s390x
at-spi2-atk-devel-2.22.0-1.fc25.s390x
wayland-protocols-devel-1.7-1.fc25.noarch
virglrenderer-0.5.0-1.20160411git61846f92f.fc25.s390x
libcacard-2.5.2-2.fc24.s390x
pixman-devel-0.34.0-2.fc24.s390x
libacl-devel-2.2.52-11.fc24.s390x
libnfs-devel-1.9.8-2.fc24.s390x
texi2html-5.0-4.fc24.noarch
libseccomp-devel-2.3.1-1.fc25.s390x
perl-libs-5.24.1-382.fc25.s390x
libxkbcommon-0.7.1-1.fc25.s390x
git-core-2.9.3-2.fc25.s390x
nss-softokn-freebl-devel-3.28.1-1.0.fc25.s390x
gtk-update-icon-cache-3.22.7-1.fc25.s390x
vim-filesystem-8.0.206-1.fc25.s390x
libX11-common-1.6.4-4.fc25.noarch
gtk3-devel-3.22.7-1.fc25.s390x
python2-dnf-1.1.10-5.fc25.noarch
vim-minimal-8.0.206-1.fc25.s390x
GeoIP-GeoLite-data-2017.01-1.fc25.noarch
gpg-pubkey-95a43f54-5284415a
dejavu-fonts-common-2.35-3.fc24.noarch
libSM-1.2.2-4.fc24.s390x
diffutils-3.3-13.fc24.s390x
libogg-1.3.2-5.fc24.s390x
hunspell-en-US-0.20140811.1-5.fc24.noarch
libdaemon-0.14-10.fc24.s390x
patch-2.7.5-3.fc24.s390x
libsysfs-2.1.0-19.fc24.s390x
procmail-3.22-39.fc24.s390x
libXdamage-1.1.4-8.fc24.s390x
libotf-0.9.13-7.fc24.s390x
urw-fonts-2.4-22.fc24.noarch
crontabs-1.11-12.20150630git.fc24.noarch
ppp-2.4.7-9.fc24.s390x
polkit-0.113-5.fc24.s390x
cyrus-sasl-2.1.26-26.2.fc24.s390x
zlib-devel-1.2.8-10.fc24.s390x
time-1.7-49.fc24.s390x
gpg-pubkey-fdb19c98-56fd6333
fedora-release-25-1.noarch
freetype-2.6.5-1.fc25.s390x
libcap-ng-0.7.8-1.fc25.s390x
gdbm-1.12-1.fc25.s390x
binutils-2.26.1-1.fc25.s390x
lcms2-2.8-2.fc25.s390x
libcomps-0.1.7-5.fc25.s390x
less-481-6.fc25.s390x
apr-1.5.2-4.fc25.s390x
perl-constant-1.33-367.fc25.noarch
perl-Data-Dumper-2.161-1.fc25.s390x
ipcalc-0.1.8-1.fc25.s390x
perl-Pod-Perldoc-3.27-1.fc25.noarch
libteam-1.26-1.fc25.s390x
gmp-c++-6.1.1-1.fc25.s390x
fontconfig-2.12.1-1.fc25.s390x
enchant-1.6.0-14.fc25.s390x
json-glib-1.2.2-1.fc25.s390x
pyliblzma-0.5.3-16.fc25.s390x
libsepol-devel-2.5-10.fc25.s390x
python3-libs-3.5.2-4.fc25.s390x
python3-ordered-set-2.0.0-4.fc25.noarch
python3-rpmconf-1.0.18-2.fc25.noarch
python-ipaddress-1.0.16-3.fc25.noarch
python2-kerberos-1.2.5-1.fc25.s390x
python2-pysocks-1.5.6-5.fc25.noarch
fipscheck-lib-1.4.1-11.fc25.s390x
libatomic_ops-7.4.4-1.fc25.s390x
net-snmp-agent-libs-5.7.3-13.fc25.s390x
util-linux-2.28.2-1.fc25.s390x
dracut-044-78.fc25.s390x
python2-pygpgme-0.3-18.fc25.s390x
libsoup-2.56.0-2.fc25.s390x
orc-0.4.26-1.fc25.s390x
yum-utils-1.1.31-511.fc25.noarch
libXrender-0.9.10-1.fc25.s390x
libXrandr-1.5.1-1.fc25.s390x
go-srpm-macros-2-7.fc25.noarch
gnupg2-smime-2.1.13-2.fc25.s390x
guile-devel-2.0.13-1.fc25.s390x
uboot-tools-2016.09.01-2.fc25.s390x
pykickstart-2.32-1.fc25.noarch
python-bunch-1.0.1-9.fc25.noarch
perl-generators-1.10-1.fc25.noarch
perl-Mozilla-CA-20160104-3.fc25.noarch
glibc-all-langpacks-2.24-4.fc25.s390x
bzip2-libs-1.0.6-21.fc25.s390x
libpng-1.6.27-1.fc25.s390x
libtiff-4.0.7-1.fc25.s390x
desktop-file-utils-0.23-2.fc25.s390x
python2-cccolutils-1.4-1.fc25.s390x
libcurl-7.51.0-4.fc25.s390x
rpm-plugin-systemd-inhibit-4.13.0-6.fc25.s390x
cups-libs-2.2.0-5.fc25.s390x
python2-lxml-3.7.2-1.fc25.s390x
redhat-rpm-config-45-1.fc25.noarch
elfutils-libs-0.168-1.fc25.s390x
device-mapper-event-libs-1.02.136-3.fc25.s390x
lvm2-libs-2.02.167-3.fc25.s390x
elfutils-0.168-1.fc25.s390x
openssh-7.4p1-1.fc25.s390x
python2-gitdb-2.0.0-1.fc25.noarch
openssh-server-7.4p1-1.fc25.s390x
gcc-gfortran-6.3.1-1.fc25.s390x
rpm-devel-4.13.0-6.fc25.s390x
libselinux-python-2.5-13.fc25.s390x
openjpeg2-2.1.2-3.fc25.s390x
js-jquery-2.2.4-1.fc25.noarch
boost-thread-1.60.0-10.fc25.s390x
json-c-0.12-7.fc24.s390x
ghostscript-x11-9.20-5.fc25.s390x
libdrm-devel-2.4.74-1.fc25.s390x
libuuid-devel-2.28.2-1.fc25.s390x
librbd-devel-10.2.4-2.fc25.s390x
libXcursor-devel-1.1.14-6.fc24.s390x
python3-beautifulsoup4-4.5.3-1.fc25.noarch
texlive-kpathsea-svn41139-30.fc25.noarch
texlive-amsmath-svn41561-30.fc25.noarch
texlive-thumbpdf-svn34621.3.16-30.fc25.noarch
texlive-multido-svn18302.1.42-30.fc25.noarch
texlive-float-svn15878.1.3d-30.fc25.noarch
texlive-psnfss-svn33946.9.2a-30.fc25.noarch
texlive-wasy-svn35831.0-30.fc25.noarch
texlive-makeindex-svn40768-30.fc25.noarch
texlive-pdftex-svn41149-30.fc25.noarch
texlive-enumitem-svn24146.3.5.2-30.fc25.noarch
texlive-microtype-svn41127-30.fc25.noarch
texlive-helvetic-svn31835.0-30.fc25.noarch
texlive-times-svn35058.0-30.fc25.noarch
texlive-mdwtools-svn15878.1.05.4-30.fc25.noarch
texlive-babel-english-svn30264.3.3p-30.fc25.noarch
texlive-cmextra-svn32831.0-30.fc25.noarch
texlive-enctex-svn34957.0-30.fc25.noarch
texlive-texlive-docindex-svn41430-30.fc25.noarch
texlive-ifetex-svn24853.1.2-30.fc25.noarch
texlive-mparhack-svn15878.1.4-30.fc25.noarch
texlive-paralist-svn39247-30.fc25.noarch
texlive-algorithms-svn38085.0.1-30.fc25.noarch
texlive-geometry-svn19716.5.6-30.fc25.noarch
texlive-fontspec-svn41262-30.fc25.noarch
texlive-oberdiek-svn41346-30.fc25.noarch
texlive-pst-eps-svn15878.1.0-30.fc25.noarch
texlive-pstricks-svn41321-30.fc25.noarch
texlive-pst-blur-svn15878.2.0-30.fc25.noarch
texlive-jknapltx-svn19440.0-30.fc25.noarch
texlive-breqn-svn38099.0.98d-30.fc25.noarch
texlive-collection-basic-svn41149-30.20160520.fc25.noarch
latex2html-2012-7.fc24.noarch
lksctp-tools-1.0.16-5.fc24.s390x
vte291-0.46.1-1.fc25.s390x
openssl-devel-1.0.2j-3.fc25.s390x
at-spi2-core-devel-2.22.0-1.fc25.s390x
libfdt-1.4.2-1.fc25.s390x
libXft-devel-2.3.2-4.fc24.s390x
libattr-devel-2.4.47-16.fc24.s390x
libiscsi-devel-1.15.0-2.fc24.s390x
gettext-0.19.8.1-3.fc25.s390x
libjpeg-turbo-devel-1.5.1-0.fc25.s390x
glusterfs-libs-3.9.1-1.fc25.s390x
glusterfs-api-3.9.1-1.fc25.s390x
hawkey-0.6.3-6.1.fc25.s390x
nss-softokn-devel-3.28.1-1.0.fc25.s390x
glusterfs-cli-3.9.1-1.fc25.s390x
vim-common-8.0.206-1.fc25.s390x
libX11-1.6.4-4.fc25.s390x
pulseaudio-libs-devel-10.0-2.fc25.s390x
dnf-yum-1.1.10-5.fc25.noarch
tzdata-java-2016j-2.fc25.noarch
ccache-3.3.3-1.fc25.s390x
gpg-pubkey-8e1431d5-53bcbac7
zlib-1.2.8-10.fc24.s390x
sed-4.2.2-15.fc24.s390x
p11-kit-0.23.2-2.fc24.s390x
psmisc-22.21-8.fc24.s390x
gpm-libs-1.20.7-9.fc24.s390x
zip-3.0-16.fc24.s390x
hostname-3.15-7.fc24.s390x
libyubikey-1.13-2.fc24.s390x
sg3_utils-libs-1.41-3.fc24.s390x
polkit-pkla-compat-0.1-7.fc24.s390x
passwd-0.79-8.fc24.s390x
trousers-0.3.13-6.fc24.s390x
grubby-8.40-3.fc24.s390x
rootfiles-8.1-19.fc24.noarch
python-rpm-macros-3-10.fc25.noarch
info-6.1-3.fc25.s390x
libuuid-2.28.2-1.fc25.s390x
iptables-libs-1.6.0-2.fc25.s390x
nettle-3.3-1.fc25.s390x
jansson-2.9-1.fc25.s390x
libksba-1.3.5-1.fc25.s390x
perl-Text-ParseWords-3.30-365.fc25.noarch
perl-PathTools-3.63-366.fc25.s390x
perl-File-Temp-0.23.04-365.fc25.noarch
fuse-libs-2.9.7-1.fc25.s390x
perl-Pod-Escapes-1.07-365.fc25.noarch
perl-Term-ANSIColor-4.05-2.fc25.noarch
perl-URI-1.71-5.fc25.noarch
libXfont-1.5.2-1.fc25.s390x
crypto-policies-20160921-2.git75b9b04.fc25.noarch
python-six-1.10.0-3.fc25.noarch
dbus-glib-0.108-1.fc25.s390x
gobject-introspection-1.50.0-1.fc25.s390x
libpwquality-1.3.0-6.fc25.s390x
python-gobject-base-3.22.0-1.fc25.s390x
python-html5lib-0.999-9.fc25.noarch
python3-dbus-1.2.4-2.fc25.s390x
python3-chardet-2.3.0-1.fc25.noarch
python3-urllib3-1.15.1-3.fc25.noarch
python-offtrac-0.1.0-7.fc25.noarch
python2-cryptography-1.5.3-3.fc25.s390x
python2-requests-kerberos-0.10.0-2.fc25.noarch
libserf-1.3.9-1.fc25.s390x
libdatrie-0.2.9-3.fc25.s390x
s390utils-base-1.36.0-1.fc25.s390x
kpartx-0.4.9-83.fc25.s390x
s390utils-cpuplugd-1.36.0-1.fc25.s390x
rpmconf-1.0.18-2.fc25.noarch
s390utils-osasnmpd-1.36.0-1.fc25.s390x
python-dnf-plugins-extras-common-0.0.12-4.fc25.noarch
pango-1.40.3-1.fc25.s390x
fpc-srpm-macros-1.0-1.fc25.noarch
kernel-core-4.8.8-300.fc25.s390x
fedora-upgrade-25.2-1.fc25.noarch
net-tools-2.0-0.38.20160329git.fc25.s390x
libuser-0.62-4.fc25.s390x
screen-4.4.0-4.fc25.s390x
man-db-2.7.5-3.fc25.s390x
sqlite-3.14.2-1.fc25.s390x
python-systemd-doc-232-1.fc25.s390x
pcre-8.40-1.fc25.s390x
libdb-5.3.28-16.fc25.s390x
lz4-1.7.5-1.fc25.s390x
tar-1.29-3.fc25.s390x
emacs-common-25.1-3.fc25.s390x
perl-threads-shared-1.54-1.fc25.s390x
unzip-6.0-31.fc25.s390x
mesa-libglapi-13.0.3-1.fc25.s390x
rpm-libs-4.13.0-6.fc25.s390x
selinux-policy-3.13.1-225.6.fc25.noarch
pcre-utf16-8.40-1.fc25.s390x
bodhi-client-0.9.12.2-6.fc25.noarch
rpmlint-1.9-5.fc25.noarch
glibc-headers-2.24-4.fc25.s390x
dbus-1.11.8-1.fc25.s390x
kernel-core-4.9.3-200.fc25.s390x
cairo-1.14.8-1.fc25.s390x
ca-certificates-2017.2.11-1.0.fc25.noarch
openssh-clients-7.4p1-1.fc25.s390x
python2-GitPython-2.1.1-2.fc25.noarch
mariadb-libs-10.1.20-1.fc25.s390x
NetworkManager-glib-1.4.4-3.fc25.s390x
gcc-go-6.3.1-1.fc25.s390x
cracklib-dicts-2.9.6-4.fc25.s390x
iproute-tc-4.6.0-6.fc25.s390x
libselinux-python3-2.5-13.fc25.s390x
strace-4.15-1.fc25.s390x
python2-enchant-1.6.8-1.fc25.noarch
boost-iostreams-1.60.0-10.fc25.s390x
bluez-libs-5.43-1.fc25.s390x
ghostscript-9.20-5.fc25.s390x
userspace-rcu-0.9.2-2.fc25.s390x
mesa-libwayland-egl-devel-13.0.3-1.fc25.s390x
libXext-devel-1.3.3-4.fc24.s390x
libXrandr-devel-1.5.1-1.fc25.s390x
perl-XML-XPath-1.39-1.fc25.noarch
python3-lxml-3.7.2-1.fc25.s390x
texlive-texlive.infra-bin-svn40312-30.20160520.fc25.s390x
texlive-ifxetex-svn19685.0.5-30.fc25.noarch
texlive-thumbpdf-bin-svn6898.0-30.20160520.fc25.noarch
texlive-babelbib-svn25245.1.31-30.fc25.noarch
texlive-index-svn24099.4.1beta-30.fc25.noarch
texlive-caption-svn41409-30.fc25.noarch
texlive-bibtex-bin-svn40473-30.20160520.fc25.s390x
texlive-mfware-bin-svn40473-30.20160520.fc25.s390x
texlive-texconfig-svn40768-30.fc25.noarch
texlive-footmisc-svn23330.5.5b-30.fc25.noarch
texlive-psfrag-svn15878.3.04-30.fc25.noarch
texlive-eurosym-svn17265.1.4_subrfix-30.fc25.noarch
texlive-symbol-svn31835.0-30.fc25.noarch
texlive-euenc-svn19795.0.1h-30.fc25.noarch
texlive-textcase-svn15878.0-30.fc25.noarch
texlive-charter-svn15878.0-30.fc25.noarch
texlive-wasysym-svn15878.2.0-30.fc25.noarch
texlive-mflogo-svn38628-30.fc25.noarch
texlive-soul-svn15878.2.4-30.fc25.noarch
texlive-marginnote-svn41382-30.fc25.noarch
texlive-filecontents-svn24250.1.3-30.fc25.noarch
texlive-tipa-svn29349.1.3-30.fc25.noarch
texlive-xcolor-svn41044-30.fc25.noarch
texlive-breakurl-svn29901.1.40-30.fc25.noarch
texlive-attachfile-svn38830-30.fc25.noarch
texlive-pst-coil-svn37377.1.07-30.fc25.noarch
texlive-auto-pst-pdf-svn23723.0.6-30.fc25.noarch
texlive-ctable-svn38672-30.fc25.noarch
texlive-extsizes-svn17263.1.4a-30.fc25.noarch
texlive-beamer-svn36461.3.36-30.fc25.noarch
texlive-dvipdfmx-bin-svn40273-30.20160520.fc25.s390x
netpbm-progs-10.76.00-2.fc25.s390x
vte-profile-0.46.1-1.fc25.s390x
krb5-devel-1.14.4-4.fc25.s390x
dbus-devel-1.11.8-1.fc25.s390x
sqlite-devel-3.14.2-1.fc25.s390x
libiscsi-1.15.0-2.fc24.s390x
fontconfig-devel-2.12.1-1.fc25.s390x
libfdt-devel-1.4.2-1.fc25.s390x
ceph-devel-compat-10.2.4-2.fc25.s390x
zlib-static-1.2.8-10.fc24.s390x
chrpath-0.16-3.fc24.s390x
python-2.7.13-1.fc25.s390x
nss-3.28.1-1.3.fc25.s390x
python2-hawkey-0.6.3-6.1.fc25.s390x
gdk-pixbuf2-modules-2.36.4-1.fc25.s390x
perl-Git-2.9.3-2.fc25.noarch
kernel-core-4.9.5-200.fc25.s390x
publicsuffix-list-dafsa-20170116-1.fc25.noarch
perl-SelfLoader-1.23-382.fc25.noarch
perl-open-1.10-382.fc25.noarch
gpgme-1.8.0-8.fc25.s390x
=== TEST BEGIN ===
Using CC: /home/fam/bin/cc
Install prefix    /var/tmp/patchew-tester-tmp-_186415r/src/install
BIOS directory    /var/tmp/patchew-tester-tmp-_186415r/src/install/share/qemu
binary directory  /var/tmp/patchew-tester-tmp-_186415r/src/install/bin
library directory /var/tmp/patchew-tester-tmp-_186415r/src/install/lib
module directory  /var/tmp/patchew-tester-tmp-_186415r/src/install/lib/qemu
libexec directory /var/tmp/patchew-tester-tmp-_186415r/src/install/libexec
include directory /var/tmp/patchew-tester-tmp-_186415r/src/install/include
config directory  /var/tmp/patchew-tester-tmp-_186415r/src/install/etc
local state directory   /var/tmp/patchew-tester-tmp-_186415r/src/install/var
Manual directory  /var/tmp/patchew-tester-tmp-_186415r/src/install/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /var/tmp/patchew-tester-tmp-_186415r/src
C compiler        /home/fam/bin/cc
Host C compiler   cc
C++ compiler      c++
Objective-C compiler /home/fam/bin/cc
ARFLAGS           rv
CFLAGS            -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g 
QEMU_CFLAGS       -I/usr/include/pixman-1  -Werror -DHAS_LIBSSH2_SFTP_FSYNC -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -D_GNU_SOURCE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wendif-labels -Wno-shift-negative-value -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -I/usr/include/p11-kit-1    -I/usr/include/libpng16 -I/usr/include/cacard -I/usr/include/nss3 -I/usr/include/nspr4 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/libusb-1.0 
LDFLAGS           -Wl,--warn-common -m64 -g 
make              make
install           install
python            python -B
smbd              /usr/sbin/smbd
module support    no
host CPU          s390x
host big endian   yes
target list        aarch64-softmmu alpha-softmmu arm-softmmu cris-softmmu i386-softmmu lm32-softmmu m68k-softmmu microblazeel-softmmu microblaze-softmmu mips64el-softmmu mips64-softmmu mipsel-softmmu mips-softmmu moxie-softmmu nios2-softmmu or1k-softmmu ppc64-softmmu ppcemb-softmmu ppc-softmmu s390x-softmmu sh4eb-softmmu sh4-softmmu sparc64-softmmu sparc-softmmu tricore-softmmu unicore32-softmmu x86_64-softmmu xtensaeb-softmmu xtensa-softmmu aarch64-linux-user alpha-linux-user armeb-linux-user arm-linux-user cris-linux-user hppa-linux-user i386-linux-user m68k-linux-user microblazeel-linux-user microblaze-linux-user mips64el-linux-user mips64-linux-user mipsel-linux-user mips-linux-user mipsn32el-linux-user mipsn32-linux-user nios2-linux-user or1k-linux-user ppc64abi32-linux-user ppc64le-linux-user ppc64-linux-user ppc-linux-user s390x-linux-user sh4eb-linux-user sh4-linux-user sparc32plus-linux-user sparc64-linux-user sparc-linux-user tilegx-linux-user x86_64-linux-user
tcg debug enabled no
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
pixman            system
SDL support       yes (2.0.5)
GTK support       yes (3.22.7)
GTK GL support    yes
VTE support       yes (0.46.1)
TLS priority      NORMAL
GNUTLS support    yes
GNUTLS rnd        yes
libgcrypt         no
libgcrypt kdf     no
nettle            yes (3.3)
nettle kdf        yes
libtasn1          yes
curses support    yes
virgl support     yes
curl support      yes
mingw32 support   no
Audio drivers     oss
Block whitelist (rw) 
Block whitelist (ro) 
VirtFS support    yes
VNC support       yes
VNC SASL support  yes
VNC JPEG support  yes
VNC PNG support   yes
xen support       no
brlapi support    yes
bluez  support    yes
Documentation     yes
PIE               no
vde support       no
netmap support    no
Linux AIO support yes
ATTR/XATTR support yes
Install blobs     yes
KVM support       yes
HAX support       no
RDMA support      no
TCG interpreter   no
fdt support       yes
preadv support    yes
fdatasync         yes
madvise           yes
posix_madvise     yes
libcap-ng support yes
vhost-net support yes
vhost-scsi support yes
vhost-vsock support yes
Trace backends    log
spice support     no 
rbd support       yes
xfsctl support    no
smartcard support yes
libusb            yes
usb net redir     yes
OpenGL support    yes
OpenGL dmabufs    yes
libiscsi support  yes
libnfs support    yes
build guest agent yes
QGA VSS support   no
QGA w32 disk info no
QGA MSI support   no
seccomp support   no
coroutine backend ucontext
coroutine pool    yes
debug stack usage no
GlusterFS support yes
Archipelago support no
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   yes
TPM passthrough   no
QOM debugging     yes
lzo support       yes
snappy support    yes
bzip2 support     yes
NUMA host support no
tcmalloc support  no
jemalloc support  no
avx2 optimization no
replication support yes
  GEN     aarch64-softmmu/config-devices.mak.tmp
  GEN     arm-softmmu/config-devices.mak.tmp
  GEN     alpha-softmmu/config-devices.mak.tmp
  GEN     cris-softmmu/config-devices.mak.tmp
  GEN     arm-softmmu/config-devices.mak
  GEN     cris-softmmu/config-devices.mak
  GEN     alpha-softmmu/config-devices.mak
  GEN     aarch64-softmmu/config-devices.mak
  GEN     i386-softmmu/config-devices.mak.tmp
  GEN     lm32-softmmu/config-devices.mak.tmp
  GEN     m68k-softmmu/config-devices.mak.tmp
  GEN     microblazeel-softmmu/config-devices.mak.tmp
  GEN     lm32-softmmu/config-devices.mak
  GEN     m68k-softmmu/config-devices.mak
  GEN     microblaze-softmmu/config-devices.mak.tmp
  GEN     mips64el-softmmu/config-devices.mak.tmp
  GEN     microblazeel-softmmu/config-devices.mak
  GEN     mips64-softmmu/config-devices.mak.tmp
  GEN     microblaze-softmmu/config-devices.mak
  GEN     mipsel-softmmu/config-devices.mak.tmp
  GEN     i386-softmmu/config-devices.mak
  GEN     mips-softmmu/config-devices.mak.tmp
  GEN     mips64-softmmu/config-devices.mak
  GEN     moxie-softmmu/config-devices.mak.tmp
  GEN     mips64el-softmmu/config-devices.mak
  GEN     nios2-softmmu/config-devices.mak.tmp
  GEN     mipsel-softmmu/config-devices.mak
  GEN     or1k-softmmu/config-devices.mak.tmp
  GEN     nios2-softmmu/config-devices.mak
  GEN     moxie-softmmu/config-devices.mak
  GEN     ppc64-softmmu/config-devices.mak.tmp
  GEN     ppcemb-softmmu/config-devices.mak.tmp
  GEN     mips-softmmu/config-devices.mak
  GEN     ppc-softmmu/config-devices.mak.tmp
  GEN     or1k-softmmu/config-devices.mak
  GEN     s390x-softmmu/config-devices.mak.tmp
  GEN     ppcemb-softmmu/config-devices.mak
  GEN     ppc64-softmmu/config-devices.mak
  GEN     sh4eb-softmmu/config-devices.mak.tmp
  GEN     ppc-softmmu/config-devices.mak
  GEN     s390x-softmmu/config-devices.mak
  GEN     sparc64-softmmu/config-devices.mak.tmp
  GEN     sh4-softmmu/config-devices.mak.tmp
  GEN     sparc-softmmu/config-devices.mak.tmp
  GEN     sh4-softmmu/config-devices.mak
  GEN     sparc-softmmu/config-devices.mak
  GEN     tricore-softmmu/config-devices.mak.tmp
  GEN     unicore32-softmmu/config-devices.mak.tmp
  GEN     sparc64-softmmu/config-devices.mak
  GEN     sh4eb-softmmu/config-devices.mak
  GEN     x86_64-softmmu/config-devices.mak.tmp
  GEN     xtensaeb-softmmu/config-devices.mak.tmp
  GEN     tricore-softmmu/config-devices.mak
  GEN     unicore32-softmmu/config-devices.mak
  GEN     aarch64-linux-user/config-devices.mak.tmp
  GEN     xtensa-softmmu/config-devices.mak.tmp
  GEN     xtensaeb-softmmu/config-devices.mak
  GEN     alpha-linux-user/config-devices.mak.tmp
  GEN     xtensa-softmmu/config-devices.mak
  GEN     x86_64-softmmu/config-devices.mak
  GEN     armeb-linux-user/config-devices.mak.tmp
  GEN     aarch64-linux-user/config-devices.mak
  GEN     arm-linux-user/config-devices.mak.tmp
  GEN     alpha-linux-user/config-devices.mak
  GEN     cris-linux-user/config-devices.mak.tmp
  GEN     hppa-linux-user/config-devices.mak.tmp
  GEN     armeb-linux-user/config-devices.mak
  GEN     arm-linux-user/config-devices.mak
  GEN     i386-linux-user/config-devices.mak.tmp
  GEN     hppa-linux-user/config-devices.mak
  GEN     m68k-linux-user/config-devices.mak.tmp
  GEN     cris-linux-user/config-devices.mak
  GEN     microblazeel-linux-user/config-devices.mak.tmp
  GEN     microblaze-linux-user/config-devices.mak.tmp
  GEN     i386-linux-user/config-devices.mak
  GEN     m68k-linux-user/config-devices.mak
  GEN     mips64el-linux-user/config-devices.mak.tmp
  GEN     mips64-linux-user/config-devices.mak.tmp
  GEN     microblazeel-linux-user/config-devices.mak
  GEN     microblaze-linux-user/config-devices.mak
  GEN     mipsel-linux-user/config-devices.mak.tmp
  GEN     mips-linux-user/config-devices.mak.tmp
  GEN     mips64el-linux-user/config-devices.mak
  GEN     mipsn32el-linux-user/config-devices.mak.tmp
  GEN     mips64-linux-user/config-devices.mak
  GEN     mips-linux-user/config-devices.mak
  GEN     mipsn32-linux-user/config-devices.mak.tmp
  GEN     nios2-linux-user/config-devices.mak.tmp
  GEN     mipsel-linux-user/config-devices.mak
  GEN     or1k-linux-user/config-devices.mak.tmp
  GEN     mipsn32-linux-user/config-devices.mak
  GEN     mipsn32el-linux-user/config-devices.mak
  GEN     ppc64le-linux-user/config-devices.mak.tmp
  GEN     or1k-linux-user/config-devices.mak
  GEN     ppc64abi32-linux-user/config-devices.mak.tmp
  GEN     nios2-linux-user/config-devices.mak
  GEN     ppc64-linux-user/config-devices.mak.tmp
  GEN     ppc-linux-user/config-devices.mak.tmp
  GEN     ppc64le-linux-user/config-devices.mak
  GEN     ppc64abi32-linux-user/config-devices.mak
  GEN     sh4eb-linux-user/config-devices.mak.tmp
  GEN     s390x-linux-user/config-devices.mak.tmp
  GEN     ppc64-linux-user/config-devices.mak
  GEN     ppc-linux-user/config-devices.mak
  GEN     sparc32plus-linux-user/config-devices.mak.tmp
  GEN     sh4-linux-user/config-devices.mak.tmp
  GEN     s390x-linux-user/config-devices.mak
  GEN     sparc32plus-linux-user/config-devices.mak
  GEN     sh4eb-linux-user/config-devices.mak
  GEN     sh4-linux-user/config-devices.mak
  GEN     sparc64-linux-user/config-devices.mak.tmp
  GEN     tilegx-linux-user/config-devices.mak.tmp
  GEN     sparc-linux-user/config-devices.mak.tmp
  GEN     x86_64-linux-user/config-devices.mak.tmp
  GEN     sparc64-linux-user/config-devices.mak
  GEN     sparc-linux-user/config-devices.mak
  GEN     tilegx-linux-user/config-devices.mak
  GEN     x86_64-linux-user/config-devices.mak
  GEN     config-host.h
  GEN     qemu-options.def
  GEN     qmp-commands.h
  GEN     qapi-types.h
  GEN     qapi-visit.h
  GEN     qapi-event.h
  GEN     qmp-introspect.h
  GEN     trace/generated-tcg-tracers.h
  GEN     trace/generated-helpers-wrappers.h
  GEN     trace/generated-helpers.h
  GEN     module_block.h
  GEN     tests/test-qapi-types.h
  GEN     tests/test-qapi-visit.h
  GEN     tests/test-qmp-commands.h
  GEN     tests/test-qapi-event.h
  GEN     tests/test-qmp-introspect.h
  GEN     trace-root.h
  GEN     util/trace.h
  GEN     crypto/trace.h
  GEN     io/trace.h
  GEN     migration/trace.h
  GEN     block/trace.h
  GEN     backends/trace.h
  GEN     hw/block/trace.h
  GEN     hw/block/dataplane/trace.h
  GEN     hw/char/trace.h
  GEN     hw/intc/trace.h
  GEN     hw/net/trace.h
  GEN     hw/virtio/trace.h
  GEN     hw/audio/trace.h
  GEN     hw/misc/trace.h
  GEN     hw/usb/trace.h
  GEN     hw/scsi/trace.h
  GEN     hw/nvram/trace.h
  GEN     hw/display/trace.h
  GEN     hw/input/trace.h
  GEN     hw/timer/trace.h
  GEN     hw/dma/trace.h
  GEN     hw/sparc/trace.h
  GEN     hw/sd/trace.h
  GEN     hw/mem/trace.h
  GEN     hw/isa/trace.h
  GEN     hw/i386/trace.h
  GEN     hw/i386/xen/trace.h
  GEN     hw/9pfs/trace.h
  GEN     hw/ppc/trace.h
  GEN     hw/pci/trace.h
  GEN     hw/s390x/trace.h
  GEN     hw/vfio/trace.h
  GEN     hw/acpi/trace.h
  GEN     hw/arm/trace.h
  GEN     hw/alpha/trace.h
  GEN     hw/xen/trace.h
  GEN     audio/trace.h
  GEN     ui/trace.h
  GEN     net/trace.h
  GEN     target/arm/trace.h
  GEN     target/i386/trace.h
  GEN     target/sparc/trace.h
  GEN     target/s390x/trace.h
  GEN     target/ppc/trace.h
  GEN     qom/trace.h
  GEN     linux-user/trace.h
  GEN     qapi/trace.h
  GEN     config-all-devices.mak
  CC      tests/qemu-iotests/socket_scm_helper.o
  GEN     version.texi
  GEN     qemu-img-cmds.texi
  GEN     qemu-options.texi
  GEN     qemu-monitor.texi
  GEN     qemu-monitor-info.texi
  GEN     qemu-img.1
  GEN     qemu-nbd.8
  GEN     qemu-ga.8
  GEN     qemu-qapi.texi
  GEN     qemu-ga-qapi.texi
  GEN     fsdev/virtfs-proxy-helper.1
  GEN     qga/qapi-generated/qga-qapi-types.h
  GEN     qga/qapi-generated/qga-qapi-visit.h
  GEN     qga/qapi-generated/qga-qmp-commands.h
  GEN     qga/qapi-generated/qga-qapi-types.c
  GEN     qga/qapi-generated/qga-qapi-visit.c
  GEN     qga/qapi-generated/qga-qmp-marshal.c
  GEN     trace-root.c
  GEN     util/trace.c
  GEN     io/trace.c
  GEN     crypto/trace.c
  GEN     migration/trace.c
  GEN     block/trace.c
  GEN     backends/trace.c
  GEN     hw/block/trace.c
  GEN     hw/block/dataplane/trace.c
  GEN     hw/char/trace.c
  GEN     hw/intc/trace.c
  GEN     hw/net/trace.c
  GEN     hw/virtio/trace.c
  GEN     hw/audio/trace.c
  GEN     hw/misc/trace.c
  GEN     hw/usb/trace.c
  GEN     hw/scsi/trace.c
  GEN     hw/nvram/trace.c
  GEN     hw/input/trace.c
  GEN     hw/display/trace.c
  GEN     hw/timer/trace.c
  GEN     hw/dma/trace.c
  GEN     hw/sparc/trace.c
  GEN     hw/sd/trace.c
  GEN     hw/isa/trace.c
  GEN     hw/mem/trace.c
  GEN     hw/i386/trace.c
  GEN     hw/9pfs/trace.c
  GEN     hw/i386/xen/trace.c
  GEN     hw/ppc/trace.c
  GEN     hw/pci/trace.c
  GEN     hw/s390x/trace.c
  GEN     hw/vfio/trace.c
  GEN     hw/acpi/trace.c
  GEN     hw/arm/trace.c
  GEN     hw/alpha/trace.c
  GEN     hw/xen/trace.c
  GEN     ui/trace.c
  GEN     audio/trace.c
  GEN     net/trace.c
  GEN     target/arm/trace.c
  GEN     target/i386/trace.c
  GEN     target/sparc/trace.c
  GEN     target/s390x/trace.c
  GEN     target/ppc/trace.c
  GEN     qom/trace.c
  GEN     linux-user/trace.c
  GEN     qapi/trace.c
  GEN     qapi-types.c
  GEN     qapi-visit.c
  GEN     qmp-introspect.c
  GEN     qapi-event.c
  CC      qapi/qapi-visit-core.o
  CC      qapi/qapi-dealloc-visitor.o
  CC      qapi/qobject-input-visitor.o
  CC      qapi/qobject-output-visitor.o
  CC      qapi/qmp-registry.o
  CC      qapi/qmp-dispatch.o
  CC      qapi/string-input-visitor.o
  CC      qapi/string-output-visitor.o
  CC      qapi/opts-visitor.o
  CC      qapi/qapi-clone-visitor.o
  CC      qapi/qmp-event.o
  CC      qapi/qapi-util.o
  CC      qobject/qnull.o
  CC      qobject/qint.o
  CC      qobject/qstring.o
  CC      qobject/qdict.o
  CC      qobject/qlist.o
  CC      qobject/qfloat.o
  CC      qobject/qbool.o
  CC      qobject/qjson.o
  CC      qobject/qobject.o
  CC      qobject/json-lexer.o
  CC      qobject/json-streamer.o
  CC      qobject/json-parser.o
  CC      trace/control.o
  CC      trace/qmp.o
  CC      util/osdep.o
  CC      util/cutils.o
  CC      util/unicode.o
  CC      util/qemu-timer-common.o
  CC      util/bufferiszero.o
  CC      util/lockcnt.o
  CC      util/aiocb.o
  CC      util/async.o
  CC      util/thread-pool.o
  CC      util/qemu-timer.o
  CC      util/main-loop.o
  CC      util/iohandler.o
  CC      util/aio-posix.o
  CC      util/compatfd.o
  CC      util/event_notifier-posix.o
  CC      util/mmap-alloc.o
  CC      util/oslib-posix.o
  CC      util/qemu-openpty.o
  CC      util/memfd.o
  CC      util/qemu-thread-posix.o
  CC      util/envlist.o
  CC      util/path.o
  CC      util/module.o
  CC      util/host-utils.o
  CC      util/bitmap.o
  CC      util/bitops.o
  CC      util/hbitmap.o
  CC      util/fifo8.o
  CC      util/acl.o
  CC      util/error.o
  CC      util/qemu-error.o
  CC      util/id.o
  CC      util/iov.o
  CC      util/qemu-config.o
  CC      util/qemu-sockets.o
  CC      util/uri.o
  CC      util/notify.o
  CC      util/qemu-option.o
  CC      util/qemu-progress.o
  CC      util/hexdump.o
  CC      util/crc32c.o
  CC      util/uuid.o
  CC      util/throttle.o
  CC      util/getauxval.o
  CC      util/readline.o
  CC      util/rcu.o
  CC      util/qemu-coroutine.o
  CC      util/qemu-coroutine-lock.o
  CC      util/qemu-coroutine-io.o
  CC      util/qemu-coroutine-sleep.o
  CC      util/coroutine-ucontext.o
  CC      util/buffer.o
  CC      util/timed-average.o
  CC      util/base64.o
  CC      util/log.o
  CC      util/qdist.o
  CC      util/qht.o
  CC      util/range.o
  CC      crypto/pbkdf-stub.o
  CC      stubs/arch-query-cpu-def.o
  CC      stubs/arch-query-cpu-model-expansion.o
  CC      stubs/arch-query-cpu-model-comparison.o
  CC      stubs/arch-query-cpu-model-baseline.o
  CC      stubs/bdrv-next-monitor-owned.o
  CC      stubs/blk-commit-all.o
  CC      stubs/blockdev-close-all-bdrv-states.o
  CC      stubs/clock-warp.o
  CC      stubs/cpu-get-icount.o
  CC      stubs/cpu-get-clock.o
  CC      stubs/dump.o
  CC      stubs/error-printf.o
  CC      stubs/fdset.o
  CC      stubs/gdbstub.o
  CC      stubs/get-vm-name.o
  CC      stubs/iothread.o
  CC      stubs/iothread-lock.o
  CC      stubs/is-daemonized.o
  CC      stubs/machine-init-done.o
  CC      stubs/linux-aio.o
  CC      stubs/migr-blocker.o
  CC      stubs/monitor.o
  CC      stubs/qtest.o
  CC      stubs/notify-event.o
  CC      stubs/replay.o
  CC      stubs/runstate-check.o
  CC      stubs/set-fd-handler.o
  CC      stubs/slirp.o
  CC      stubs/sysbus.o
  CC      stubs/trace-control.o
  CC      stubs/vm-stop.o
  CC      stubs/vmstate.o
  CC      stubs/uuid.o
  CC      stubs/qmp_pc_dimm_device_list.o
  CC      stubs/target-monitor-defs.o
  CC      stubs/target-get-monitor-def.o
  CC      stubs/pc_madt_cpu_entry.o
  CC      contrib/ivshmem-client/ivshmem-client.o
  CC      contrib/ivshmem-server/ivshmem-server.o
  CC      contrib/ivshmem-client/main.o
  CC      contrib/ivshmem-server/main.o
  CC      block.o
  CC      qemu-nbd.o
  CC      blockjob.o
  CC      qemu-io-cmds.o
  CC      replication.o
  CC      block/raw-format.o
  CC      block/qcow.o
  CC      block/vdi.o
  CC      block/vmdk.o
  CC      block/cloop.o
  CC      block/bochs.o
  CC      block/vpc.o
  CC      block/vvfat.o
  CC      block/dmg.o
  CC      block/qcow2.o
  CC      block/qcow2-refcount.o
  CC      block/qcow2-cluster.o
  CC      block/qcow2-snapshot.o
  CC      block/qcow2-cache.o
  CC      block/qed.o
  CC      block/qed-gencb.o
  CC      block/qed-l2-cache.o
  CC      block/qed-cluster.o
  CC      block/qed-check.o
  CC      block/qed-table.o
  CC      block/vhdx.o
  CC      block/vhdx-endian.o
  CC      block/vhdx-log.o
  CC      block/quorum.o
  CC      block/blkdebug.o
  CC      block/parallels.o
  CC      block/blkverify.o
  CC      block/blkreplay.o
  CC      block/block-backend.o
  CC      block/snapshot.o
  CC      block/qapi.o
  CC      block/file-posix.o
  CC      block/linux-aio.o
  CC      block/null.o
  CC      block/mirror.o
  CC      block/commit.o
  CC      block/throttle-groups.o
  CC      block/io.o
  CC      block/nbd.o
  CC      block/nbd-client.o
  CC      block/sheepdog.o
  CC      block/iscsi-opts.o
  CC      block/accounting.o
  CC      block/write-threshold.o
  CC      block/dirty-bitmap.o
  CC      block/backup.o
  CC      block/replication.o
  CC      block/crypto.o
  CC      nbd/server.o
  CC      nbd/client.o
  CC      nbd/common.o
  CC      block/iscsi.o
  CC      block/nfs.o
  CC      block/curl.o
  CC      block/rbd.o
  CC      block/gluster.o
  CC      block/ssh.o
  CC      block/dmg-bz2.o
  CC      crypto/init.o
  CC      crypto/hash.o
  CC      crypto/hash-nettle.o
  CC      crypto/hmac.o
  CC      crypto/hmac-nettle.o
  CC      crypto/aes.o
  CC      crypto/desrfb.o
  CC      crypto/cipher.o
  CC      crypto/tlscreds.o
  CC      crypto/tlscredsanon.o
  CC      crypto/tlscredsx509.o
  CC      crypto/tlssession.o
  CC      crypto/secret.o
  CC      crypto/random-gnutls.o
  CC      crypto/pbkdf.o
  CC      crypto/pbkdf-nettle.o
  CC      crypto/ivgen.o
  CC      crypto/ivgen-essiv.o
  CC      crypto/ivgen-plain.o
  CC      crypto/ivgen-plain64.o
  CC      crypto/afsplit.o
  CC      crypto/xts.o
  CC      crypto/block.o
  CC      crypto/block-qcow.o
  CC      crypto/block-luks.o
  CC      io/channel.o
  CC      io/channel-buffer.o
  CC      io/channel-command.o
  CC      io/channel-file.o
  CC      io/channel-tls.o
  CC      io/channel-socket.o
  CC      io/channel-watch.o
  CC      io/channel-websock.o
  CC      io/channel-util.o
  CC      io/dns-resolver.o
  CC      io/task.o
  CC      qom/object.o
  CC      qom/container.o
  CC      qom/qom-qobject.o
  CC      qom/object_interfaces.o
  GEN     qemu-img-cmds.h
  CC      qemu-io.o
  CC      fsdev/virtfs-proxy-helper.o
  CC      fsdev/9p-marshal.o
  CC      fsdev/9p-iov-marshal.o
  CC      qemu-bridge-helper.o
  CC      blockdev.o
  CC      blockdev-nbd.o
  CC      iothread.o
  CC      qdev-monitor.o
  CC      os-posix.o
  CC      device-hotplug.o
  CC      page_cache.o
  CC      accel.o
  CC      bt-host.o
  CC      bt-vhci.o
  CC      dma-helpers.o
  CC      vl.o
  CC      tpm.o
  CC      device_tree.o
  GEN     qmp-marshal.c
  CC      qmp.o
  CC      hmp.o
  CC      cpus-common.o
  CC      audio/audio.o
  CC      audio/noaudio.o
  CC      audio/wavaudio.o
  CC      audio/mixeng.o
  CC      audio/sdlaudio.o
  CC      audio/ossaudio.o
  CC      audio/wavcapture.o
  CC      backends/rng.o
  CC      backends/rng-egd.o
  CC      backends/rng-random.o
  CC      backends/msmouse.o
  CC      backends/wctablet.o
  CC      backends/baum.o
  CC      backends/testdev.o
  CC      backends/tpm.o
  CC      backends/hostmem.o
  CC      backends/hostmem-ram.o
  CC      backends/hostmem-file.o
  CC      backends/cryptodev.o
  CC      backends/cryptodev-builtin.o
  CC      block/stream.o
  CC      disas/alpha.o
  CC      disas/arm.o
  CXX     disas/arm-a64.o
  CC      disas/cris.o
  CC      disas/hppa.o
  CC      disas/i386.o
  CC      disas/m68k.o
  CC      disas/microblaze.o
  CC      disas/mips.o
  CC      disas/nios2.o
  CC      disas/moxie.o
  CC      disas/ppc.o
  CC      disas/s390.o
  CC      disas/sh4.o
  CC      disas/sparc.o
  CXX     disas/libvixl/vixl/utils.o
  CC      disas/lm32.o
  CXX     disas/libvixl/vixl/compiler-intrinsics.o
  CXX     disas/libvixl/vixl/a64/instructions-a64.o
  CXX     disas/libvixl/vixl/a64/decoder-a64.o
  CXX     disas/libvixl/vixl/a64/disasm-a64.o
  CC      fsdev/qemu-fsdev.o
  CC      fsdev/qemu-fsdev-opts.o
  CC      fsdev/qemu-fsdev-dummy.o
  CC      hw/9pfs/9p.o
  CC      hw/9pfs/9p-local.o
  CC      hw/9pfs/9p-xattr.o
  CC      hw/9pfs/9p-xattr-user.o
  CC      hw/9pfs/9p-posix-acl.o
  CC      hw/9pfs/coth.o
  CC      hw/9pfs/cofs.o
  CC      hw/9pfs/codir.o
  CC      hw/9pfs/cofile.o
  CC      hw/9pfs/coxattr.o
  CC      hw/9pfs/9p-synth.o
  CC      hw/9pfs/9p-handle.o
  CC      hw/9pfs/9p-proxy.o
  CC      hw/acpi/core.o
  CC      hw/acpi/piix4.o
  CC      hw/acpi/pcihp.o
  CC      hw/acpi/ich9.o
  CC      hw/acpi/tco.o
  CC      hw/acpi/cpu_hotplug.o
  CC      hw/acpi/memory_hotplug.o
  CC      hw/acpi/cpu.o
  CC      hw/acpi/nvdimm.o
  CC      hw/acpi/acpi_interface.o
  CC      hw/acpi/bios-linker-loader.o
  CC      hw/acpi/aml-build.o
  CC      hw/acpi/ipmi.o
  CC      hw/acpi/acpi-stub.o
  CC      hw/acpi/ipmi-stub.o
  CC      hw/audio/sb16.o
  CC      hw/audio/es1370.o
  CC      hw/audio/ac97.o
  CC      hw/audio/fmopl.o
  CC      hw/audio/adlib.o
  CC      hw/audio/gus.o
  CC      hw/audio/gusemu_hal.o
  CC      hw/audio/gusemu_mixer.o
  CC      hw/audio/cs4231a.o
  CC      hw/audio/intel-hda.o
  CC      hw/audio/hda-codec.o
  CC      hw/audio/pcspk.o
  CC      hw/audio/wm8750.o
  CC      hw/audio/pl041.o
  CC      hw/audio/lm4549.o
  CC      hw/audio/cs4231.o
  CC      hw/audio/marvell_88w8618.o
  CC      hw/audio/milkymist-ac97.o
  CC      hw/block/block.o
  CC      hw/block/hd-geometry.o
  CC      hw/block/cdrom.o
  CC      hw/block/fdc.o
  CC      hw/block/m25p80.o
  CC      hw/block/nand.o
  CC      hw/block/pflash_cfi01.o
  CC      hw/block/pflash_cfi02.o
  CC      hw/block/ecc.o
  CC      hw/block/onenand.o
  CC      hw/block/nvme.o
  CC      hw/bt/core.o
  CC      hw/bt/l2cap.o
  CC      hw/bt/sdp.o
  CC      hw/bt/hci.o
  CC      hw/bt/hid.o
  CC      hw/bt/hci-csr.o
  CC      hw/char/ipoctal232.o
  CC      hw/char/escc.o
  CC      hw/char/parallel.o
  CC      hw/char/pl011.o
  CC      hw/char/serial.o
  CC      hw/char/serial-isa.o
  CC      hw/char/serial-pci.o
  CC      hw/char/virtio-console.o
  CC      hw/char/cadence_uart.o
  CC      hw/char/xilinx_uartlite.o
  CC      hw/char/debugcon.o
  CC      hw/char/etraxfs_ser.o
  CC      hw/char/imx_serial.o
  CC      hw/char/grlib_apbuart.o
  CC      hw/char/lm32_juart.o
  CC      hw/char/lm32_uart.o
  CC      hw/char/milkymist-uart.o
  CC      hw/char/sclpconsole.o
  CC      hw/char/sclpconsole-lm.o
  CC      hw/core/qdev.o
  CC      hw/core/qdev-properties.o
  CC      hw/core/bus.o
  CC      hw/core/reset.o
  CC      hw/core/fw-path-provider.o
  CC      hw/core/irq.o
  CC      hw/core/hotplug.o
  CC      hw/core/empty_slot.o
  CC      hw/core/stream.o
  CC      hw/core/ptimer.o
  CC      hw/core/sysbus.o
  CC      hw/core/loader.o
  CC      hw/core/machine.o
  CC      hw/core/register.o
  CC      hw/core/qdev-properties-system.o
  CC      hw/core/or-irq.o
  CC      hw/core/platform-bus.o
  CC      hw/display/ads7846.o
  CC      hw/display/cirrus_vga.o
  CC      hw/display/g364fb.o
  CC      hw/display/jazz_led.o
  CC      hw/display/pl110.o
  CC      hw/display/ssd0303.o
  CC      hw/display/ssd0323.o
  CC      hw/display/vga-pci.o
  CC      hw/display/vga-isa.o
  CC      hw/display/vga-isa-mm.o
  CC      hw/display/vmware_vga.o
  CC      hw/display/blizzard.o
  CC      hw/display/exynos4210_fimd.o
  CC      hw/display/framebuffer.o
  CC      hw/display/milkymist-vgafb.o
  CC      hw/display/tc6393xb.o
  CC      hw/display/milkymist-tmu2.o
  CC      hw/dma/puv3_dma.o
  CC      hw/dma/rc4030.o
  CC      hw/dma/pl080.o
  CC      hw/dma/pl330.o
  CC      hw/dma/i82374.o
  CC      hw/dma/i8257.o
  CC      hw/dma/xilinx_axidma.o
  CC      hw/dma/xlnx-zynq-devcfg.o
  CC      hw/dma/etraxfs_dma.o
  CC      hw/dma/sun4m_iommu.o
  CC      hw/dma/sparc32_dma.o
  CC      hw/gpio/max7310.o
  CC      hw/gpio/pl061.o
  CC      hw/gpio/puv3_gpio.o
  CC      hw/gpio/mpc8xxx.o
  CC      hw/gpio/zaurus.o
  CC      hw/gpio/gpio_key.o
  CC      hw/i2c/core.o
  CC      hw/i2c/smbus.o
  CC      hw/i2c/smbus_eeprom.o
  CC      hw/i2c/i2c-ddc.o
  CC      hw/i2c/versatile_i2c.o
  CC      hw/i2c/smbus_ich9.o
  CC      hw/i2c/pm_smbus.o
  CC      hw/i2c/bitbang_i2c.o
  CC      hw/i2c/exynos4210_i2c.o
  CC      hw/i2c/imx_i2c.o
  CC      hw/i2c/aspeed_i2c.o
  CC      hw/ide/core.o
  CC      hw/ide/atapi.o
  CC      hw/ide/qdev.o
  CC      hw/ide/pci.o
  CC      hw/ide/isa.o
  CC      hw/ide/piix.o
  CC      hw/ide/cmd646.o
  CC      hw/ide/macio.o
  CC      hw/ide/mmio.o
  CC      hw/ide/via.o
  CC      hw/ide/microdrive.o
  CC      hw/ide/ahci.o
  CC      hw/ide/ich.o
  CC      hw/input/adb.o
  CC      hw/input/hid.o
  CC      hw/input/pckbd.o
  CC      hw/input/lm832x.o
  CC      hw/input/ps2.o
  CC      hw/input/pl050.o
  CC      hw/input/stellaris_input.o
  CC      hw/input/tsc2005.o
  CC      hw/input/vmmouse.o
  CC      hw/input/virtio-input.o
  CC      hw/input/virtio-input-hid.o
  CC      hw/input/virtio-input-host.o
  CC      hw/intc/heathrow_pic.o
  CC      hw/intc/i8259_common.o
  CC      hw/intc/i8259.o
  CC      hw/intc/pl190.o
  CC      hw/intc/puv3_intc.o
  CC      hw/intc/xilinx_intc.o
  CC      hw/intc/etraxfs_pic.o
  CC      hw/intc/imx_avic.o
  CC      hw/intc/realview_gic.o
  CC      hw/intc/lm32_pic.o
  CC      hw/intc/slavio_intctl.o
  CC      hw/intc/ioapic_common.o
  CC      hw/intc/arm_gic_common.o
  CC      hw/intc/arm_gic.o
  CC      hw/intc/arm_gicv2m.o
  CC      hw/intc/arm_gicv3_common.o
  CC      hw/intc/arm_gicv3.o
  CC      hw/intc/arm_gicv3_dist.o
  CC      hw/intc/arm_gicv3_redist.o
  CC      hw/intc/arm_gicv3_its_common.o
  CC      hw/intc/openpic.o
  CC      hw/intc/intc.o
  CC      hw/ipack/ipack.o
  CC      hw/ipack/tpci200.o
  CC      hw/ipmi/ipmi.o
  CC      hw/ipmi/ipmi_bmc_sim.o
  CC      hw/ipmi/ipmi_bmc_extern.o
  CC      hw/ipmi/isa_ipmi_kcs.o
  CC      hw/ipmi/isa_ipmi_bt.o
  CC      hw/isa/isa-bus.o
  CC      hw/isa/apm.o
  CC      hw/isa/i82378.o
  CC      hw/isa/pc87312.o
  CC      hw/isa/piix4.o
  CC      hw/isa/vt82c686.o
  CC      hw/mem/pc-dimm.o
  CC      hw/mem/nvdimm.o
  CC      hw/misc/applesmc.o
  CC      hw/misc/max111x.o
  CC      hw/misc/tmp105.o
  CC      hw/misc/debugexit.o
  CC      hw/misc/sga.o
  CC      hw/misc/pc-testdev.o
  CC      hw/misc/unimp.o
  CC      hw/misc/pci-testdev.o
  CC      hw/misc/arm_l2x0.o
  CC      hw/misc/arm_integrator_debug.o
  CC      hw/misc/a9scu.o
  CC      hw/misc/arm11scu.o
  CC      hw/misc/puv3_pm.o
  CC      hw/misc/macio/macio.o
  CC      hw/misc/macio/cuda.o
  CC      hw/misc/macio/mac_dbdma.o
  CC      hw/net/dp8393x.o
  CC      hw/net/ne2000.o
  CC      hw/net/eepro100.o
  CC      hw/net/pcnet-pci.o
  CC      hw/net/pcnet.o
  CC      hw/net/e1000.o
  CC      hw/net/e1000x_common.o
  CC      hw/net/net_tx_pkt.o
  CC      hw/net/net_rx_pkt.o
  CC      hw/net/e1000e.o
  CC      hw/net/e1000e_core.o
  CC      hw/net/rtl8139.o
  CC      hw/net/vmxnet3.o
  CC      hw/net/smc91c111.o
  CC      hw/net/lan9118.o
  CC      hw/net/ne2000-isa.o
  CC      hw/net/opencores_eth.o
  CC      hw/net/xgmac.o
  CC      hw/net/mipsnet.o
  CC      hw/net/xilinx_axienet.o
  CC      hw/net/allwinner_emac.o
  CC      hw/net/imx_fec.o
  CC      hw/net/cadence_gem.o
  CC      hw/net/stellaris_enet.o
  CC      hw/net/lance.o
  CC      hw/net/rocker/rocker.o
  CC      hw/net/rocker/rocker_fp.o
  CC      hw/net/rocker/rocker_desc.o
  CC      hw/net/rocker/rocker_world.o
  CC      hw/net/rocker/rocker_of_dpa.o
  CC      hw/nvram/ds1225y.o
  CC      hw/nvram/eeprom93xx.o
  CC      hw/nvram/fw_cfg.o
  CC      hw/nvram/chrp_nvram.o
  CC      hw/nvram/mac_nvram.o
  CC      hw/pci-bridge/pcie_root_port.o
  CC      hw/pci-bridge/pci_bridge_dev.o
  CC      hw/pci-bridge/gen_pcie_root_port.o
  CC      hw/pci-bridge/pci_expander_bridge.o
  CC      hw/pci-bridge/xio3130_upstream.o
  CC      hw/pci-bridge/xio3130_downstream.o
  CC      hw/pci-bridge/ioh3420.o
  CC      hw/pci-bridge/i82801b11.o
  CC      hw/pci-bridge/dec.o
  CC      hw/pci-host/pam.o
  CC      hw/pci-host/prep.o
  CC      hw/pci-host/grackle.o
  CC      hw/pci-host/uninorth.o
  CC      hw/pci-host/ppce500.o
  CC      hw/pci-host/versatile.o
  CC      hw/pci-host/apb.o
  CC      hw/pci-host/bonito.o
  CC      hw/pci-host/piix.o
  CC      hw/pci-host/q35.o
  CC      hw/pci-host/gpex.o
  CC      hw/pci/pci_bridge.o
  CC      hw/pci/pci.o
  CC      hw/pci/msix.o
  CC      hw/pci/msi.o
  CC      hw/pci/shpc.o
  CC      hw/pci/slotid_cap.o
  CC      hw/pci/pci_host.o
  CC      hw/pci/pcie_host.o
  CC      hw/pci/pcie.o
  CC      hw/pci/pcie_aer.o
  CC      hw/pci/pcie_port.o
  CC      hw/pci/pci-stub.o
  CC      hw/pcmcia/pcmcia.o
  CC      hw/scsi/scsi-disk.o
  CC      hw/scsi/scsi-generic.o
  CC      hw/scsi/scsi-bus.o
  CC      hw/scsi/lsi53c895a.o
  CC      hw/scsi/mptsas.o
  CC      hw/scsi/mptconfig.o
  CC      hw/scsi/mptendian.o
  CC      hw/scsi/megasas.o
  CC      hw/scsi/vmw_pvscsi.o
  CC      hw/scsi/esp.o
  CC      hw/scsi/esp-pci.o
  CC      hw/sd/pl181.o
  CC      hw/sd/ssi-sd.o
  CC      hw/sd/sd.o
  CC      hw/sd/core.o
  CC      hw/sd/sdhci.o
  CC      hw/smbios/smbios.o
  CC      hw/smbios/smbios_type_38.o
  CC      hw/smbios/smbios-stub.o
  CC      hw/ssi/pl022.o
  CC      hw/smbios/smbios_type_38-stub.o
  CC      hw/ssi/ssi.o
  CC      hw/ssi/xilinx_spi.o
  CC      hw/ssi/xilinx_spips.o
  CC      hw/ssi/stm32f2xx_spi.o
  CC      hw/ssi/aspeed_smc.o
  CC      hw/timer/arm_timer.o
  CC      hw/timer/arm_mptimer.o
  CC      hw/timer/a9gtimer.o
  CC      hw/timer/cadence_ttc.o
  CC      hw/timer/ds1338.o
  CC      hw/timer/hpet.o
  CC      hw/timer/i8254_common.o
  CC      hw/timer/i8254.o
  CC      hw/timer/m48t59.o
  CC      hw/timer/m48t59-isa.o
  CC      hw/timer/pl031.o
  CC      hw/timer/puv3_ost.o
  CC      hw/timer/twl92230.o
  CC      hw/timer/xilinx_timer.o
  CC      hw/timer/slavio_timer.o
  CC      hw/timer/etraxfs_timer.o
  CC      hw/timer/grlib_gptimer.o
  CC      hw/timer/imx_epit.o
  CC      hw/timer/imx_gpt.o
  CC      hw/timer/lm32_timer.o
  CC      hw/timer/milkymist-sysctl.o
  CC      hw/timer/stm32f2xx_timer.o
  CC      hw/timer/sun4v-rtc.o
  CC      hw/timer/aspeed_timer.o
  CC      hw/tpm/tpm_tis.o
  CC      hw/usb/core.o
  CC      hw/usb/combined-packet.o
  CC      hw/usb/bus.o
  CC      hw/usb/libhw.o
  CC      hw/usb/desc.o
  CC      hw/usb/desc-msos.o
  CC      hw/usb/hcd-uhci.o
  CC      hw/usb/hcd-ohci.o
  CC      hw/usb/hcd-ehci.o
  CC      hw/usb/hcd-ehci-pci.o
  CC      hw/usb/hcd-ehci-sysbus.o
  CC      hw/usb/hcd-xhci.o
  CC      hw/usb/hcd-musb.o
  CC      hw/usb/dev-hub.o
  CC      hw/usb/dev-hid.o
  CC      hw/usb/dev-wacom.o
  CC      hw/usb/dev-storage.o
  CC      hw/usb/dev-uas.o
  CC      hw/usb/dev-audio.o
  CC      hw/usb/dev-serial.o
  CC      hw/usb/dev-network.o
  CC      hw/usb/dev-bluetooth.o
  CC      hw/usb/dev-smartcard-reader.o
  CC      hw/usb/ccid-card-passthru.o
  CC      hw/usb/ccid-card-emulated.o
  CC      hw/usb/dev-mtp.o
  CC      hw/usb/redirect.o
  CC      hw/usb/quirks.o
  CC      hw/usb/host-libusb.o
  CC      hw/usb/host-legacy.o
  CC      hw/virtio/virtio-rng.o
  CC      hw/virtio/virtio-pci.o
  CC      hw/virtio/virtio-mmio.o
  CC      hw/virtio/virtio-bus.o
  CC      hw/virtio/vhost-stub.o
  CC      hw/watchdog/watchdog.o
  CC      hw/watchdog/wdt_i6300esb.o
  CC      hw/watchdog/wdt_ib700.o
  CC      hw/watchdog/wdt_diag288.o
  CC      hw/watchdog/wdt_aspeed.o
  CC      migration/migration.o
  CC      migration/socket.o
  CC      migration/fd.o
  CC      migration/exec.o
  CC      migration/tls.o
  CC      migration/colo-comm.o
  CC      migration/colo.o
  CC      migration/colo-failover.o
  CC      migration/vmstate.o
  CC      migration/qemu-file.o
  CC      migration/qemu-file-channel.o
  CC      migration/xbzrle.o
  CC      migration/postcopy-ram.o
  CC      migration/qjson.o
  CC      migration/block.o
  CC      net/net.o
  CC      net/queue.o
  CC      net/checksum.o
  CC      net/util.o
  CC      net/hub.o
  CC      net/socket.o
  CC      net/dump.o
  CC      net/eth.o
  CC      net/l2tpv3.o
  CC      net/tap.o
  CC      net/vhost-user.o
  CC      net/tap-linux.o
  CC      net/slirp.o
  CC      net/filter.o
  CC      net/filter-buffer.o
  CC      net/filter-mirror.o
  CC      net/colo-compare.o
  CC      net/colo.o
  CC      net/filter-rewriter.o
  CC      net/filter-replay.o
  CC      qom/cpu.o
  CC      replay/replay.o
  CC      replay/replay-internal.o
  CC      replay/replay-events.o
  CC      replay/replay-time.o
  CC      replay/replay-input.o
  CC      replay/replay-char.o
  CC      replay/replay-snapshot.o
  CC      replay/replay-net.o
  CC      slirp/cksum.o
  CC      slirp/if.o
  CC      slirp/ip_icmp.o
  CC      slirp/ip6_icmp.o
  CC      slirp/ip6_input.o
  CC      slirp/ip6_output.o
  CC      slirp/ip_input.o
  CC      slirp/ip_output.o
  CC      slirp/dnssearch.o
  CC      slirp/slirp.o
  CC      slirp/dhcpv6.o
  CC      slirp/mbuf.o
  CC      slirp/misc.o
  CC      slirp/sbuf.o
  CC      slirp/socket.o
  CC      slirp/tcp_input.o
  CC      slirp/tcp_output.o
  CC      slirp/tcp_subr.o
  CC      slirp/tcp_timer.o
  CC      slirp/udp.o
  CC      slirp/udp6.o
  CC      slirp/bootp.o
  CC      slirp/tftp.o
  CC      slirp/arp_table.o
  CC      slirp/ndp_table.o
  CC      ui/keymaps.o
  CC      ui/console.o
  CC      ui/cursor.o
  CC      ui/qemu-pixman.o
  CC      ui/input.o
  CC      ui/input-keymap.o
  CC      ui/input-legacy.o
  CC      ui/input-linux.o
  CC      ui/sdl2.o
  CC      ui/sdl2-input.o
  CC      ui/sdl2-2d.o
  CC      ui/sdl2-gl.o
  CC      ui/x_keymap.o
  CC      ui/curses.o
  CC      ui/vnc.o
  CC      ui/vnc-enc-zlib.o
  CC      ui/vnc-enc-hextile.o
  CC      ui/vnc-enc-tight.o
  CC      ui/vnc-palette.o
  CC      ui/vnc-enc-zrle.o
  CC      ui/vnc-auth-vencrypt.o
  CC      ui/vnc-auth-sasl.o
  CC      ui/vnc-ws.o
  CC      ui/vnc-jobs.o
  CC      ui/gtk.o
  CC      ui/shader.o
  VERT    ui/shader/texture-blit-vert.h
  FRAG    ui/shader/texture-blit-frag.h
  CC      ui/egl-helpers.o
  CC      ui/egl-context.o
  CC      ui/gtk-gl-area.o
  CC      chardev/char.o
  CC      chardev/char-fd.o
  CC      chardev/char-file.o
  CC      chardev/char-io.o
  CC      chardev/char-mux.o
  CC      chardev/char-null.o
  CC      chardev/char-parallel.o
  CC      chardev/char-pipe.o
  CC      chardev/char-pty.o
  CC      chardev/char-serial.o
  CC      chardev/char-ringbuf.o
  CC      chardev/char-socket.o
  CC      chardev/char-stdio.o
  CC      chardev/char-udp.o
  CCAS    s390-ccw/start.o
  LINK    tests/qemu-iotests/socket_scm_helper
  GEN     qemu-doc.html
  CC      s390-ccw/main.o
  GEN     qemu-doc.txt
  GEN     qemu.1
  CC      s390-ccw/bootmap.o
  CC      s390-ccw/sclp-ascii.o
  CC      s390-ccw/virtio.o
  GEN     docs/qemu-qmp-ref.html
  CC      s390-ccw/virtio-scsi.o
  GEN     docs/qemu-qmp-ref.txt
  BUILD   s390-ccw/s390-ccw.elf
  STRIP   s390-ccw/s390-ccw.img
  GEN     docs/qemu-ga-ref.html
  GEN     docs/qemu-qmp-ref.7
  GEN     docs/qemu-ga-ref.txt
  GEN     docs/qemu-ga-ref.7
  CC      qga/commands.o
  CC      qga/guest-agent-command-state.o
  CC      qga/main.o
  CC      qga/commands-posix.o
  CC      qga/channel-posix.o
  CC      qga/qapi-generated/qga-qapi-types.o
  CC      qga/qapi-generated/qga-qapi-visit.o
  CC      qga/qapi-generated/qga-qmp-marshal.o
  CC      qmp-introspect.o
  CC      qapi-types.o
  CC      qapi-visit.o
  CC      qapi-event.o
  AR      libqemustub.a
  CC      qemu-img.o
  CC      qmp-marshal.o
  CC      ui/console-gl.o
  CC      trace-root.o
  CC      util/trace.o
  CC      crypto/trace.o
  CC      io/trace.o
  CC      migration/trace.o
  CC      block/trace.o
  CC      backends/trace.o
  CC      hw/block/trace.o
  CC      hw/block/dataplane/trace.o
  CC      hw/char/trace.o
  CC      hw/intc/trace.o
  CC      hw/net/trace.o
  CC      hw/virtio/trace.o
  CC      hw/audio/trace.o
  CC      hw/usb/trace.o
  CC      hw/misc/trace.o
  CC      hw/scsi/trace.o
  CC      hw/nvram/trace.o
  CC      hw/display/trace.o
  CC      hw/input/trace.o
  CC      hw/dma/trace.o
  CC      hw/timer/trace.o
  CC      hw/sparc/trace.o
  CC      hw/sd/trace.o
  CC      hw/isa/trace.o
  CC      hw/mem/trace.o
  CC      hw/i386/trace.o
  CC      hw/i386/xen/trace.o
  CC      hw/9pfs/trace.o
  CC      hw/ppc/trace.o
  CC      hw/pci/trace.o
  CC      hw/s390x/trace.o
  CC      hw/vfio/trace.o
  CC      hw/acpi/trace.o
  CC      hw/arm/trace.o
  CC      hw/alpha/trace.o
  CC      hw/xen/trace.o
  CC      ui/trace.o
  CC      audio/trace.o
  CC      net/trace.o
  CC      target/arm/trace.o
  CC      target/i386/trace.o
  CC      target/sparc/trace.o
  CC      target/s390x/trace.o
  CC      target/ppc/trace.o
  CC      qom/trace.o
  CC      linux-user/trace.o
  CC      qapi/trace.o
  AR      libqemuutil.a
  LINK    qemu-ga
  LINK    ivshmem-client
  LINK    ivshmem-server
  LINK    qemu-nbd
  LINK    qemu-img
  LINK    qemu-io
  LINK    fsdev/virtfs-proxy-helper
  LINK    qemu-bridge-helper
  GEN     aarch64-softmmu/hmp-commands.h
  GEN     aarch64-softmmu/hmp-commands-info.h
  GEN     cris-softmmu/hmp-commands.h
  GEN     aarch64-softmmu/config-target.h
  CC      aarch64-softmmu/exec.o
  GEN     cris-softmmu/hmp-commands-info.h
  GEN     alpha-softmmu/hmp-commands.h
  GEN     cris-softmmu/config-target.h
  GEN     alpha-softmmu/hmp-commands-info.h
  CC      cris-softmmu/exec.o
  GEN     alpha-softmmu/config-target.h
  GEN     arm-softmmu/hmp-commands.h
  GEN     arm-softmmu/hmp-commands-info.h
  CC      alpha-softmmu/exec.o
  GEN     arm-softmmu/config-target.h
  CC      arm-softmmu/exec.o
  CC      aarch64-softmmu/translate-all.o
  CC      cris-softmmu/translate-all.o
  CC      alpha-softmmu/translate-all.o
  CC      arm-softmmu/translate-all.o
  CC      aarch64-softmmu/cpu-exec.o
  CC      cris-softmmu/cpu-exec.o
  CC      alpha-softmmu/cpu-exec.o
  CC      arm-softmmu/cpu-exec.o
  CC      alpha-softmmu/translate-common.o
  CC      cris-softmmu/translate-common.o
  CC      aarch64-softmmu/translate-common.o
  CC      alpha-softmmu/cpu-exec-common.o
  CC      cris-softmmu/cpu-exec-common.o
  CC      aarch64-softmmu/cpu-exec-common.o
  CC      alpha-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/tcg/tcg.o
  CC      cris-softmmu/tcg/tcg.o
  CC      arm-softmmu/translate-common.o
  CC      arm-softmmu/cpu-exec-common.o
  CC      arm-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/tcg/tcg-op.o
  CC      alpha-softmmu/tcg/tcg-op.o
  CC      cris-softmmu/tcg/tcg-op.o
  CC      alpha-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/tcg/optimize.o
  CC      arm-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/tcg/tcg-common.o
  CC      alpha-softmmu/tcg/tcg-common.o
  CC      cris-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/fpu/softfloat.o
  CC      alpha-softmmu/fpu/softfloat.o
  CC      cris-softmmu/tcg/tcg-common.o
  CC      cris-softmmu/fpu/softfloat.o
  CC      arm-softmmu/tcg/optimize.o
  CC      arm-softmmu/tcg/tcg-common.o
  CC      aarch64-softmmu/disas.o
  CC      alpha-softmmu/disas.o
  CC      arm-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/tcg-runtime.o
  CC      alpha-softmmu/tcg-runtime.o
  CC      alpha-softmmu/hax-stub.o
  GEN     aarch64-softmmu/gdbstub-xml.c
  CC      cris-softmmu/disas.o
  CC      alpha-softmmu/kvm-stub.o
  CC      cris-softmmu/tcg-runtime.o
  CC      alpha-softmmu/arch_init.o
  CC      aarch64-softmmu/hax-stub.o
  CC      cris-softmmu/hax-stub.o
  CC      alpha-softmmu/cpus.o
  CC      aarch64-softmmu/kvm-stub.o
  CC      cris-softmmu/kvm-stub.o
  CC      cris-softmmu/arch_init.o
  CC      aarch64-softmmu/arch_init.o
  CC      alpha-softmmu/monitor.o
  CC      cris-softmmu/cpus.o
  CC      aarch64-softmmu/cpus.o
  CC      arm-softmmu/disas.o
  CC      cris-softmmu/monitor.o
  CC      arm-softmmu/tcg-runtime.o
  CC      aarch64-softmmu/monitor.o
  GEN     arm-softmmu/gdbstub-xml.c
  CC      alpha-softmmu/gdbstub.o
  CC      arm-softmmu/hax-stub.o
  CC      cris-softmmu/gdbstub.o
  CC      alpha-softmmu/balloon.o
  CC      arm-softmmu/kvm-stub.o
  CC      alpha-softmmu/ioport.o
  CC      aarch64-softmmu/gdbstub.o
  CC      arm-softmmu/arch_init.o
  CC      cris-softmmu/balloon.o
  CC      alpha-softmmu/numa.o
  CC      arm-softmmu/cpus.o
  CC      cris-softmmu/ioport.o
  CC      aarch64-softmmu/balloon.o
  CC      alpha-softmmu/qtest.o
  CC      aarch64-softmmu/ioport.o
  CC      cris-softmmu/numa.o
  CC      arm-softmmu/monitor.o
  CC      cris-softmmu/qtest.o
  CC      alpha-softmmu/bootdevice.o
  CC      aarch64-softmmu/numa.o
  CC      aarch64-softmmu/qtest.o
  CC      alpha-softmmu/memory.o
  CC      cris-softmmu/bootdevice.o
  CC      aarch64-softmmu/bootdevice.o
  CC      cris-softmmu/memory.o
  CC      aarch64-softmmu/memory.o
  CC      arm-softmmu/gdbstub.o
  CC      alpha-softmmu/cputlb.o
  CC      arm-softmmu/balloon.o
  CC      cris-softmmu/cputlb.o
  CC      arm-softmmu/ioport.o
  CC      aarch64-softmmu/cputlb.o
  CC      alpha-softmmu/memory_mapping.o
  CC      arm-softmmu/numa.o
  CC      alpha-softmmu/dump.o
  CC      arm-softmmu/qtest.o
  CC      cris-softmmu/memory_mapping.o
  CC      alpha-softmmu/migration/ram.o
  CC      arm-softmmu/bootdevice.o
  CC      cris-softmmu/dump.o
  CC      arm-softmmu/memory.o
  CC      aarch64-softmmu/memory_mapping.o
  CC      alpha-softmmu/migration/savevm.o
  CC      cris-softmmu/migration/ram.o
  CC      aarch64-softmmu/dump.o
  CC      alpha-softmmu/xen-common-stub.o
  CC      arm-softmmu/cputlb.o
  CC      aarch64-softmmu/migration/ram.o
  CC      alpha-softmmu/xen-hvm-stub.o
  CC      cris-softmmu/migration/savevm.o
  CC      alpha-softmmu/hw/9pfs/virtio-9p-device.o
  CC      alpha-softmmu/hw/block/virtio-blk.o
  CC      aarch64-softmmu/migration/savevm.o
  CC      arm-softmmu/memory_mapping.o
  CC      alpha-softmmu/hw/block/dataplane/virtio-blk.o
  CC      cris-softmmu/xen-common-stub.o
  CC      cris-softmmu/xen-hvm-stub.o
  CC      arm-softmmu/dump.o
  CC      alpha-softmmu/hw/char/virtio-serial-bus.o
  CC      cris-softmmu/hw/core/nmi.o
  CC      aarch64-softmmu/xen-common-stub.o
  CC      alpha-softmmu/hw/core/nmi.o
  CC      cris-softmmu/hw/core/generic-loader.o
  CC      arm-softmmu/migration/ram.o
  CC      alpha-softmmu/hw/core/generic-loader.o
  CC      aarch64-softmmu/xen-hvm-stub.o
  CC      cris-softmmu/hw/core/null-machine.o
  CC      alpha-softmmu/hw/core/null-machine.o
  CC      aarch64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      alpha-softmmu/hw/cpu/core.o
  CC      aarch64-softmmu/hw/adc/stm32f2xx_adc.o
  CC      cris-softmmu/hw/cpu/core.o
  CC      alpha-softmmu/hw/display/vga.o
  CC      aarch64-softmmu/hw/block/virtio-blk.o
  CC      arm-softmmu/migration/savevm.o
  CC      cris-softmmu/hw/net/etraxfs_eth.o
  CC      cris-softmmu/hw/net/vhost_net.o
  CC      aarch64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      cris-softmmu/hw/net/rocker/qmp-norocker.o
  CC      cris-softmmu/hw/vfio/common.o
  CC      arm-softmmu/xen-common-stub.o
  CC      alpha-softmmu/hw/display/virtio-gpu.o
  CC      aarch64-softmmu/hw/char/exynos4210_uart.o
  CC      arm-softmmu/xen-hvm-stub.o
  CC      aarch64-softmmu/hw/char/omap_uart.o
  CC      arm-softmmu/hw/9pfs/virtio-9p-device.o
  CC      cris-softmmu/hw/vfio/platform.o
  CC      alpha-softmmu/hw/display/virtio-gpu-3d.o
  CC      aarch64-softmmu/hw/char/digic-uart.o
  CC      arm-softmmu/hw/adc/stm32f2xx_adc.o
  CC      cris-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/char/stm32f2xx_usart.o
  CC      cris-softmmu/hw/cris/boot.o
  CC      arm-softmmu/hw/block/virtio-blk.o
  CC      cris-softmmu/hw/cris/axis_dev88.o
  CC      alpha-softmmu/hw/display/virtio-gpu-pci.o
  CC      aarch64-softmmu/hw/char/bcm2835_aux.o
  CC      aarch64-softmmu/hw/char/virtio-serial-bus.o
  CC      cris-softmmu/target/cris/translate.o
  CC      arm-softmmu/hw/block/dataplane/virtio-blk.o
  CC      alpha-softmmu/hw/misc/ivshmem.o
  CC      arm-softmmu/hw/char/exynos4210_uart.o
  CC      aarch64-softmmu/hw/core/nmi.o
  CC      alpha-softmmu/hw/misc/edu.o
  CC      arm-softmmu/hw/char/omap_uart.o
  CC      aarch64-softmmu/hw/core/generic-loader.o
  CC      alpha-softmmu/hw/net/virtio-net.o
  CC      arm-softmmu/hw/char/digic-uart.o
  CC      aarch64-softmmu/hw/core/null-machine.o
  CC      arm-softmmu/hw/char/stm32f2xx_usart.o
  CC      alpha-softmmu/hw/net/vhost_net.o
  CC      arm-softmmu/hw/char/bcm2835_aux.o
  CC      aarch64-softmmu/hw/cpu/arm11mpcore.o
  CC      cris-softmmu/target/cris/op_helper.o
  CC      arm-softmmu/hw/char/virtio-serial-bus.o
  CC      alpha-softmmu/hw/scsi/virtio-scsi.o
  CC      aarch64-softmmu/hw/cpu/realview_mpcore.o
  CC      cris-softmmu/target/cris/helper.o
  CC      aarch64-softmmu/hw/cpu/a9mpcore.o
  CC      alpha-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/cpu/a15mpcore.o
  CC      arm-softmmu/hw/core/nmi.o
  CC      cris-softmmu/target/cris/cpu.o
  CC      alpha-softmmu/hw/scsi/vhost-scsi.o
  CC      cris-softmmu/target/cris/gdbstub.o
  CC      aarch64-softmmu/hw/cpu/core.o
  CC      arm-softmmu/hw/core/generic-loader.o
  CC      alpha-softmmu/hw/timer/mc146818rtc.o
  CC      cris-softmmu/target/cris/mmu.o
  CC      arm-softmmu/hw/core/null-machine.o
  CC      aarch64-softmmu/hw/display/omap_dss.o
  CC      cris-softmmu/target/cris/machine.o
  CC      alpha-softmmu/hw/vfio/common.o
  CC      arm-softmmu/hw/cpu/arm11mpcore.o
  GEN     trace/generated-helpers.c
  CC      cris-softmmu/trace/control-target.o
  CC      arm-softmmu/hw/cpu/realview_mpcore.o
  CC      aarch64-softmmu/hw/display/omap_lcdc.o
  CC      alpha-softmmu/hw/vfio/pci.o
  CC      cris-softmmu/trace/generated-helpers.o
  CC      arm-softmmu/hw/cpu/a9mpcore.o
  CC      arm-softmmu/hw/cpu/a15mpcore.o
  LINK    cris-softmmu/qemu-system-cris
  CC      aarch64-softmmu/hw/display/pxa2xx_lcd.o
  CC      arm-softmmu/hw/cpu/core.o
  CC      arm-softmmu/hw/display/omap_dss.o
  CC      alpha-softmmu/hw/vfio/pci-quirks.o
  CC      alpha-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/display/omap_lcdc.o
  CC      alpha-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/display/bcm2835_fb.o
  CC      alpha-softmmu/hw/virtio/virtio.o
  CC      arm-softmmu/hw/display/pxa2xx_lcd.o
  CC      aarch64-softmmu/hw/display/vga.o
  GEN     i386-softmmu/hmp-commands.h
  GEN     i386-softmmu/hmp-commands-info.h
  GEN     i386-softmmu/config-target.h
  CC      i386-softmmu/exec.o
  CC      alpha-softmmu/hw/virtio/virtio-balloon.o
  CC      arm-softmmu/hw/display/bcm2835_fb.o
  CC      alpha-softmmu/hw/virtio/vhost.o
  CC      aarch64-softmmu/hw/display/virtio-gpu.o
  CC      arm-softmmu/hw/display/vga.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-3d.o
  CC      alpha-softmmu/hw/virtio/vhost-backend.o
  CC      arm-softmmu/hw/display/virtio-gpu.o
  CC      alpha-softmmu/hw/virtio/vhost-user.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-pci.o
  CC      alpha-softmmu/hw/virtio/vhost-vsock.o
  CC      i386-softmmu/translate-all.o
  CC      arm-softmmu/hw/display/virtio-gpu-3d.o
  CC      alpha-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/display/dpcd.o
  CC      i386-softmmu/cpu-exec.o
  CC      aarch64-softmmu/hw/display/xlnx_dp.o
  CC      alpha-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      arm-softmmu/hw/display/virtio-gpu-pci.o
  CC      i386-softmmu/translate-common.o
  CC      arm-softmmu/hw/dma/omap_dma.o
  CC      alpha-softmmu/hw/alpha/dp264.o
  CC      aarch64-softmmu/hw/dma/xlnx_dpdma.o
  CC      i386-softmmu/cpu-exec-common.o
  CC      alpha-softmmu/hw/alpha/pci.o
  CC      i386-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/hw/dma/omap_dma.o
  CC      arm-softmmu/hw/dma/soc_dma.o
  CC      alpha-softmmu/hw/alpha/typhoon.o
  CC      alpha-softmmu/target/alpha/machine.o
  CC      arm-softmmu/hw/dma/pxa2xx_dma.o
  CC      aarch64-softmmu/hw/dma/soc_dma.o
  CC      alpha-softmmu/target/alpha/translate.o
  CC      arm-softmmu/hw/dma/bcm2835_dma.o
  CC      arm-softmmu/hw/gpio/omap_gpio.o
  CC      aarch64-softmmu/hw/dma/pxa2xx_dma.o
  CC      arm-softmmu/hw/gpio/imx_gpio.o
  CC      aarch64-softmmu/hw/dma/bcm2835_dma.o
  CC      arm-softmmu/hw/i2c/omap_i2c.o
  CC      i386-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/hw/gpio/omap_gpio.o
  CC      alpha-softmmu/target/alpha/helper.o
  CC      arm-softmmu/hw/input/pxa2xx_keypad.o
  CC      alpha-softmmu/target/alpha/cpu.o
  CC      aarch64-softmmu/hw/gpio/imx_gpio.o
  CC      arm-softmmu/hw/input/tsc210x.o
  CC      alpha-softmmu/target/alpha/int_helper.o
  CC      aarch64-softmmu/hw/i2c/omap_i2c.o
  CC      alpha-softmmu/target/alpha/fpu_helper.o
  CC      aarch64-softmmu/hw/input/pxa2xx_keypad.o
  CC      arm-softmmu/hw/intc/armv7m_nvic.o
  CC      aarch64-softmmu/hw/input/tsc210x.o
  CC      alpha-softmmu/target/alpha/vax_helper.o
  CC      arm-softmmu/hw/intc/exynos4210_gic.o
  CC      alpha-softmmu/target/alpha/sys_helper.o
  CC      arm-softmmu/hw/intc/exynos4210_combiner.o
  CC      aarch64-softmmu/hw/intc/armv7m_nvic.o
  CC      alpha-softmmu/target/alpha/mem_helper.o
  CC      arm-softmmu/hw/intc/omap_intc.o
  CC      aarch64-softmmu/hw/intc/exynos4210_gic.o
  CC      i386-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/hw/intc/exynos4210_combiner.o
  CC      alpha-softmmu/target/alpha/gdbstub.o
  CC      aarch64-softmmu/hw/intc/omap_intc.o
  GEN     trace/generated-helpers.c
  CC      arm-softmmu/hw/intc/bcm2835_ic.o
  CC      alpha-softmmu/trace/control-target.o
  CC      arm-softmmu/hw/intc/bcm2836_control.o
  CC      alpha-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/intc/bcm2835_ic.o
  CC      i386-softmmu/tcg/tcg-common.o
  CC      aarch64-softmmu/hw/intc/bcm2836_control.o
  CC      arm-softmmu/hw/intc/allwinner-a10-pic.o
  LINK    alpha-softmmu/qemu-system-alpha
  CC      i386-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/hw/intc/allwinner-a10-pic.o
  CC      arm-softmmu/hw/intc/aspeed_vic.o
  CC      aarch64-softmmu/hw/intc/aspeed_vic.o
  CC      arm-softmmu/hw/intc/arm_gicv3_cpuif.o
  CC      aarch64-softmmu/hw/intc/arm_gicv3_cpuif.o
  CC      arm-softmmu/hw/misc/ivshmem.o
  GEN     lm32-softmmu/hmp-commands.h
  CC      aarch64-softmmu/hw/misc/ivshmem.o
  GEN     lm32-softmmu/hmp-commands-info.h
  GEN     lm32-softmmu/config-target.h
  CC      lm32-softmmu/exec.o
  CC      arm-softmmu/hw/misc/arm_sysctl.o
  CC      aarch64-softmmu/hw/misc/arm_sysctl.o
  CC      i386-softmmu/disas.o
  CC      arm-softmmu/hw/misc/cbus.o
  CC      aarch64-softmmu/hw/misc/cbus.o
  CC      arm-softmmu/hw/misc/exynos4210_pmu.o
  CC      i386-softmmu/tcg-runtime.o
  CC      aarch64-softmmu/hw/misc/exynos4210_pmu.o
  CC      arm-softmmu/hw/misc/imx_ccm.o
  CC      aarch64-softmmu/hw/misc/imx_ccm.o
  CC      i386-softmmu/hax-stub.o
  CC      arm-softmmu/hw/misc/imx31_ccm.o
  CC      aarch64-softmmu/hw/misc/imx31_ccm.o
  CC      i386-softmmu/kvm-stub.o
  CC      lm32-softmmu/translate-all.o
  CC      aarch64-softmmu/hw/misc/imx25_ccm.o
  CC      arm-softmmu/hw/misc/imx25_ccm.o
  CC      i386-softmmu/arch_init.o
  CC      arm-softmmu/hw/misc/imx6_ccm.o
  CC      aarch64-softmmu/hw/misc/imx6_ccm.o
  CC      lm32-softmmu/cpu-exec.o
  CC      i386-softmmu/cpus.o
  CC      aarch64-softmmu/hw/misc/imx6_src.o
  CC      arm-softmmu/hw/misc/imx6_src.o
  CC      lm32-softmmu/translate-common.o
  CC      aarch64-softmmu/hw/misc/mst_fpga.o
  CC      arm-softmmu/hw/misc/mst_fpga.o
  CC      aarch64-softmmu/hw/misc/omap_clk.o
  CC      arm-softmmu/hw/misc/omap_clk.o
  CC      lm32-softmmu/cpu-exec-common.o
  CC      i386-softmmu/monitor.o
  CC      aarch64-softmmu/hw/misc/omap_gpmc.o
  CC      arm-softmmu/hw/misc/omap_gpmc.o
  CC      lm32-softmmu/tcg/tcg.o
  CC      arm-softmmu/hw/misc/omap_l4.o
  CC      aarch64-softmmu/hw/misc/omap_l4.o
  CC      arm-softmmu/hw/misc/omap_sdrc.o
  CC      arm-softmmu/hw/misc/omap_tap.o
  CC      aarch64-softmmu/hw/misc/omap_sdrc.o
  CC      i386-softmmu/gdbstub.o
  CC      aarch64-softmmu/hw/misc/omap_tap.o
  CC      arm-softmmu/hw/misc/bcm2835_mbox.o
  CC      arm-softmmu/hw/misc/bcm2835_property.o
  CC      aarch64-softmmu/hw/misc/bcm2835_mbox.o
  CC      i386-softmmu/balloon.o
  CC      aarch64-softmmu/hw/misc/bcm2835_property.o
  CC      lm32-softmmu/tcg/tcg-op.o
  CC      arm-softmmu/hw/misc/zynq_slcr.o
  CC      i386-softmmu/ioport.o
  CC      arm-softmmu/hw/misc/zynq-xadc.o
  CC      aarch64-softmmu/hw/misc/zynq_slcr.o
  CC      i386-softmmu/numa.o
  CC      arm-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      aarch64-softmmu/hw/misc/zynq-xadc.o
  CC      arm-softmmu/hw/misc/edu.o
  CC      i386-softmmu/qtest.o
  CC      aarch64-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      arm-softmmu/hw/misc/aspeed_scu.o
  CC      i386-softmmu/bootdevice.o
  CC      aarch64-softmmu/hw/misc/edu.o
  CC      i386-softmmu/memory.o
  CC      arm-softmmu/hw/misc/aspeed_sdmc.o
  CC      aarch64-softmmu/hw/misc/auxbus.o
  CC      arm-softmmu/hw/net/virtio-net.o
  CC      aarch64-softmmu/hw/misc/aspeed_scu.o
  CC      lm32-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/hw/misc/aspeed_sdmc.o
  CC      arm-softmmu/hw/net/vhost_net.o
  CC      aarch64-softmmu/hw/net/virtio-net.o
  CC      i386-softmmu/cputlb.o
  CC      arm-softmmu/hw/pcmcia/pxa2xx.o
  CC      lm32-softmmu/tcg/tcg-common.o
  CC      arm-softmmu/hw/scsi/virtio-scsi.o
  CC      aarch64-softmmu/hw/net/vhost_net.o
  CC      lm32-softmmu/fpu/softfloat.o
  CC      arm-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/pcmcia/pxa2xx.o
  CC      arm-softmmu/hw/scsi/vhost-scsi.o
  CC      i386-softmmu/memory_mapping.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi.o
  CC      arm-softmmu/hw/sd/omap_mmc.o
  CC      i386-softmmu/dump.o
  CC      arm-softmmu/hw/sd/pxa2xx_mmci.o
  CC      arm-softmmu/hw/ssi/omap_spi.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      arm-softmmu/hw/ssi/imx_spi.o
  CC      i386-softmmu/migration/ram.o
  CC      aarch64-softmmu/hw/scsi/vhost-scsi.o
  CC      arm-softmmu/hw/timer/exynos4210_mct.o
  CC      arm-softmmu/hw/timer/exynos4210_pwm.o
  CC      aarch64-softmmu/hw/sd/omap_mmc.o
  CC      lm32-softmmu/disas.o
  CC      i386-softmmu/migration/savevm.o
  CC      arm-softmmu/hw/timer/exynos4210_rtc.o
  CC      aarch64-softmmu/hw/sd/pxa2xx_mmci.o
  CC      lm32-softmmu/tcg-runtime.o
  CC      arm-softmmu/hw/timer/omap_gptimer.o
  CC      aarch64-softmmu/hw/ssi/omap_spi.o
  CC      lm32-softmmu/hax-stub.o
  CC      arm-softmmu/hw/timer/omap_synctimer.o
  CC      aarch64-softmmu/hw/ssi/imx_spi.o
  CC      i386-softmmu/xen-common-stub.o
  CC      lm32-softmmu/kvm-stub.o
  CC      arm-softmmu/hw/timer/pxa2xx_timer.o
  CC      aarch64-softmmu/hw/timer/exynos4210_mct.o
  CC      i386-softmmu/xen-hvm-stub.o
  CC      lm32-softmmu/arch_init.o
  CC      arm-softmmu/hw/timer/digic-timer.o
  CC      i386-softmmu/hw/9pfs/virtio-9p-device.o
  CC      arm-softmmu/hw/timer/allwinner-a10-pit.o
  CC      aarch64-softmmu/hw/timer/exynos4210_pwm.o
  CC      lm32-softmmu/cpus.o
  CC      i386-softmmu/hw/block/virtio-blk.o
  CC      arm-softmmu/hw/usb/tusb6010.o
  CC      aarch64-softmmu/hw/timer/exynos4210_rtc.o
  CC      i386-softmmu/hw/block/dataplane/virtio-blk.o
  CC      lm32-softmmu/monitor.o
  CC      arm-softmmu/hw/vfio/common.o
  CC      i386-softmmu/hw/char/virtio-serial-bus.o
  CC      aarch64-softmmu/hw/timer/omap_gptimer.o
  CC      aarch64-softmmu/hw/timer/omap_synctimer.o
  CC      arm-softmmu/hw/vfio/pci.o
  CC      aarch64-softmmu/hw/timer/pxa2xx_timer.o
  CC      i386-softmmu/hw/core/nmi.o
  CC      i386-softmmu/hw/core/generic-loader.o
  CC      i386-softmmu/hw/core/null-machine.o
  CC      aarch64-softmmu/hw/timer/digic-timer.o
  CC      lm32-softmmu/gdbstub.o
  CC      i386-softmmu/hw/cpu/core.o
  CC      aarch64-softmmu/hw/timer/allwinner-a10-pit.o
  CC      i386-softmmu/hw/display/vga.o
  CC      arm-softmmu/hw/vfio/pci-quirks.o
  CC      aarch64-softmmu/hw/usb/tusb6010.o
  CC      lm32-softmmu/balloon.o
  CC      aarch64-softmmu/hw/vfio/common.o
  CC      lm32-softmmu/ioport.o
  CC      i386-softmmu/hw/display/virtio-gpu.o
  CC      arm-softmmu/hw/vfio/platform.o
  CC      lm32-softmmu/numa.o
  CC      aarch64-softmmu/hw/vfio/pci.o
  CC      arm-softmmu/hw/vfio/calxeda-xgmac.o
  CC      i386-softmmu/hw/display/virtio-gpu-3d.o
  CC      arm-softmmu/hw/vfio/amd-xgbe.o
  CC      arm-softmmu/hw/vfio/spapr.o
  CC      lm32-softmmu/qtest.o
  CC      i386-softmmu/hw/display/virtio-gpu-pci.o
  CC      arm-softmmu/hw/virtio/virtio.o
  CC      aarch64-softmmu/hw/vfio/pci-quirks.o
  CC      lm32-softmmu/bootdevice.o
  CC      i386-softmmu/hw/display/virtio-vga.o
  CC      lm32-softmmu/memory.o
  CC      aarch64-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/virtio/virtio-balloon.o
  CC      i386-softmmu/hw/intc/apic.o
  CC      aarch64-softmmu/hw/vfio/calxeda-xgmac.o
  CC      arm-softmmu/hw/virtio/vhost.o
  CC      aarch64-softmmu/hw/vfio/amd-xgbe.o
  CC      i386-softmmu/hw/intc/apic_common.o
  CC      aarch64-softmmu/hw/vfio/spapr.o
  CC      arm-softmmu/hw/virtio/vhost-backend.o
  CC      lm32-softmmu/cputlb.o
  CC      i386-softmmu/hw/intc/ioapic.o
  CC      aarch64-softmmu/hw/virtio/virtio.o
  CC      arm-softmmu/hw/virtio/vhost-user.o
  CC      i386-softmmu/hw/isa/lpc_ich9.o
  CC      i386-softmmu/hw/misc/vmport.o
  CC      arm-softmmu/hw/virtio/vhost-vsock.o
  CC      aarch64-softmmu/hw/virtio/virtio-balloon.o
  CC      arm-softmmu/hw/virtio/virtio-crypto.o
  CC      i386-softmmu/hw/misc/ivshmem.o
  CC      lm32-softmmu/memory_mapping.o
  CC      arm-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      aarch64-softmmu/hw/virtio/vhost.o
  CC      lm32-softmmu/dump.o
  CC      i386-softmmu/hw/misc/pvpanic.o
  CC      aarch64-softmmu/hw/virtio/vhost-backend.o
  CC      arm-softmmu/hw/arm/boot.o
  CC      i386-softmmu/hw/misc/edu.o
  CC      aarch64-softmmu/hw/virtio/vhost-user.o
  CC      lm32-softmmu/migration/ram.o
  CC      arm-softmmu/hw/arm/collie.o
  CC      i386-softmmu/hw/net/virtio-net.o
  CC      arm-softmmu/hw/arm/exynos4_boards.o
  CC      aarch64-softmmu/hw/virtio/vhost-vsock.o
  CC      arm-softmmu/hw/arm/gumstix.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto.o
  CC      arm-softmmu/hw/arm/highbank.o
  CC      i386-softmmu/hw/net/vhost_net.o
  CC      lm32-softmmu/migration/savevm.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      i386-softmmu/hw/scsi/virtio-scsi.o
  CC      arm-softmmu/hw/arm/digic_boards.o
  CC      aarch64-softmmu/hw/arm/boot.o
  CC      arm-softmmu/hw/arm/integratorcp.o
  CC      i386-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      lm32-softmmu/xen-common-stub.o
  CC      arm-softmmu/hw/arm/mainstone.o
  CC      aarch64-softmmu/hw/arm/collie.o
  CC      lm32-softmmu/xen-hvm-stub.o
  CC      i386-softmmu/hw/scsi/vhost-scsi.o
  CC      arm-softmmu/hw/arm/musicpal.o
  CC      aarch64-softmmu/hw/arm/exynos4_boards.o
  CC      lm32-softmmu/hw/core/nmi.o
  CC      aarch64-softmmu/hw/arm/gumstix.o
  CC      i386-softmmu/hw/timer/mc146818rtc.o
  CC      lm32-softmmu/hw/core/generic-loader.o
  CC      aarch64-softmmu/hw/arm/highbank.o
  CC      i386-softmmu/hw/vfio/common.o
  CC      arm-softmmu/hw/arm/nseries.o
  CC      lm32-softmmu/hw/core/null-machine.o
  CC      aarch64-softmmu/hw/arm/digic_boards.o
  CC      lm32-softmmu/hw/cpu/core.o
  CC      aarch64-softmmu/hw/arm/integratorcp.o
  CC      arm-softmmu/hw/arm/omap_sx1.o
  CC      lm32-softmmu/hw/input/milkymist-softusb.o
  CC      i386-softmmu/hw/vfio/pci.o
  CC      arm-softmmu/hw/arm/palm.o
  CC      aarch64-softmmu/hw/arm/mainstone.o
  CC      lm32-softmmu/hw/misc/milkymist-hpdmc.o
  CC      arm-softmmu/hw/arm/realview.o
  CC      aarch64-softmmu/hw/arm/musicpal.o
  CC      lm32-softmmu/hw/misc/milkymist-pfpu.o
  CC      i386-softmmu/hw/vfio/pci-quirks.o
  CC      arm-softmmu/hw/arm/spitz.o
  CC      aarch64-softmmu/hw/arm/nseries.o
  CC      lm32-softmmu/hw/net/milkymist-minimac2.o
  CC      i386-softmmu/hw/vfio/platform.o
  CC      lm32-softmmu/hw/net/vhost_net.o
  CC      arm-softmmu/hw/arm/stellaris.o
  CC      i386-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/arm/omap_sx1.o
  CC      lm32-softmmu/hw/net/rocker/qmp-norocker.o
  CC      i386-softmmu/hw/virtio/virtio.o
  CC      lm32-softmmu/hw/sd/milkymist-memcard.o
  CC      aarch64-softmmu/hw/arm/palm.o
  CC      arm-softmmu/hw/arm/tosa.o
  CC      arm-softmmu/hw/arm/versatilepb.o
  CC      lm32-softmmu/hw/vfio/common.o
  CC      aarch64-softmmu/hw/arm/realview.o
  CC      arm-softmmu/hw/arm/vexpress.o
  CC      i386-softmmu/hw/virtio/virtio-balloon.o
  CC      aarch64-softmmu/hw/arm/spitz.o
  CC      arm-softmmu/hw/arm/virt.o
  CC      lm32-softmmu/hw/vfio/platform.o
  CC      i386-softmmu/hw/virtio/vhost.o
  CC      lm32-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/arm/stellaris.o
  CC      arm-softmmu/hw/arm/xilinx_zynq.o
  CC      i386-softmmu/hw/virtio/vhost-backend.o
  CC      lm32-softmmu/hw/lm32/lm32_boards.o
  CC      aarch64-softmmu/hw/arm/tosa.o
  CC      arm-softmmu/hw/arm/z2.o
  CC      i386-softmmu/hw/virtio/vhost-user.o
  CC      lm32-softmmu/hw/lm32/milkymist.o
  CC      aarch64-softmmu/hw/arm/versatilepb.o
  CC      i386-softmmu/hw/virtio/vhost-vsock.o
  CC      arm-softmmu/hw/arm/virt-acpi-build.o
  CC      i386-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/arm/vexpress.o
  CC      lm32-softmmu/target/lm32/translate.o
  CC      aarch64-softmmu/hw/arm/virt.o
  CC      i386-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      arm-softmmu/hw/arm/netduino2.o
  CC      i386-softmmu/hw/i386/multiboot.o
  CC      aarch64-softmmu/hw/arm/xilinx_zynq.o
  CC      lm32-softmmu/target/lm32/op_helper.o
  CC      arm-softmmu/hw/arm/sysbus-fdt.o
  CC      i386-softmmu/hw/i386/pc.o
  CC      aarch64-softmmu/hw/arm/z2.o
  CC      arm-softmmu/hw/arm/armv7m.o
  CC      lm32-softmmu/target/lm32/helper.o
  CC      aarch64-softmmu/hw/arm/virt-acpi-build.o
  CC      lm32-softmmu/target/lm32/cpu.o
  CC      arm-softmmu/hw/arm/exynos4210.o
  CC      arm-softmmu/hw/arm/pxa2xx.o
  CC      aarch64-softmmu/hw/arm/netduino2.o
  CC      i386-softmmu/hw/i386/pc_piix.o
  CC      lm32-softmmu/target/lm32/gdbstub.o
  CC      aarch64-softmmu/hw/arm/sysbus-fdt.o
  CC      lm32-softmmu/target/lm32/lm32-semi.o
  CC      i386-softmmu/hw/i386/pc_q35.o
  CC      aarch64-softmmu/hw/arm/armv7m.o
  CC      lm32-softmmu/target/lm32/machine.o
  GEN     trace/generated-helpers.c
  CC      arm-softmmu/hw/arm/pxa2xx_gpio.o
  CC      lm32-softmmu/trace/control-target.o
  CC      i386-softmmu/hw/i386/pc_sysfw.o
  CC      aarch64-softmmu/hw/arm/exynos4210.o
  CC      arm-softmmu/hw/arm/pxa2xx_pic.o
  CC      i386-softmmu/hw/i386/x86-iommu.o
  CC      lm32-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/arm/pxa2xx.o
  CC      arm-softmmu/hw/arm/digic.o
  CC      i386-softmmu/hw/i386/intel_iommu.o
  LINK    lm32-softmmu/qemu-system-lm32
  CC      arm-softmmu/hw/arm/omap1.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_gpio.o
  CC      i386-softmmu/hw/i386/amd_iommu.o
  CC      arm-softmmu/hw/arm/omap2.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_pic.o
  CC      i386-softmmu/hw/i386/kvmvapic.o
  CC      arm-softmmu/hw/arm/strongarm.o
  CC      aarch64-softmmu/hw/arm/digic.o
  CC      i386-softmmu/hw/i386/acpi-build.o
  CC      aarch64-softmmu/hw/arm/omap1.o
  CC      arm-softmmu/hw/arm/allwinner-a10.o
  CC      i386-softmmu/hw/i386/pci-assign-load-rom.o
  CC      arm-softmmu/hw/arm/cubieboard.o
  CC      i386-softmmu/target/i386/translate.o
  CC      arm-softmmu/hw/arm/bcm2835_peripherals.o
  GEN     m68k-softmmu/hmp-commands.h
  GEN     m68k-softmmu/hmp-commands-info.h
  GEN     m68k-softmmu/config-target.h
  CC      m68k-softmmu/exec.o
  CC      aarch64-softmmu/hw/arm/omap2.o
  CC      arm-softmmu/hw/arm/bcm2836.o
  CC      aarch64-softmmu/hw/arm/strongarm.o
  CC      arm-softmmu/hw/arm/raspi.o
  CC      aarch64-softmmu/hw/arm/allwinner-a10.o
  CC      m68k-softmmu/translate-all.o
  CC      arm-softmmu/hw/arm/stm32f205_soc.o
  CC      aarch64-softmmu/hw/arm/cubieboard.o
  CC      aarch64-softmmu/hw/arm/bcm2835_peripherals.o
  CC      arm-softmmu/hw/arm/fsl-imx25.o
  CC      m68k-softmmu/cpu-exec.o
  CC      aarch64-softmmu/hw/arm/bcm2836.o
  CC      arm-softmmu/hw/arm/imx25_pdk.o
  CC      m68k-softmmu/translate-common.o
  CC      arm-softmmu/hw/arm/fsl-imx31.o
  CC      aarch64-softmmu/hw/arm/raspi.o
  CC      m68k-softmmu/cpu-exec-common.o
  CC      arm-softmmu/hw/arm/kzm.o
  CC      m68k-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/hw/arm/stm32f205_soc.o
  CC      arm-softmmu/hw/arm/fsl-imx6.o
  CC      aarch64-softmmu/hw/arm/xlnx-zynqmp.o
  CC      arm-softmmu/hw/arm/sabrelite.o
  CC      arm-softmmu/hw/arm/aspeed_soc.o
  CC      aarch64-softmmu/hw/arm/xlnx-ep108.o
  CC      i386-softmmu/target/i386/helper.o
  CC      arm-softmmu/hw/arm/aspeed.o
  CC      aarch64-softmmu/hw/arm/fsl-imx25.o
  CC      m68k-softmmu/tcg/tcg-op.o
  CC      arm-softmmu/target/arm/arm-semi.o
  CC      i386-softmmu/target/i386/cpu.o
  CC      aarch64-softmmu/hw/arm/imx25_pdk.o
  CC      arm-softmmu/target/arm/machine.o
  CC      aarch64-softmmu/hw/arm/fsl-imx31.o
  CC      arm-softmmu/target/arm/psci.o
  CC      i386-softmmu/target/i386/bpt_helper.o
  CC      aarch64-softmmu/hw/arm/kzm.o
  CC      arm-softmmu/target/arm/arch_dump.o
  CC      i386-softmmu/target/i386/excp_helper.o
  CC      arm-softmmu/target/arm/monitor.o
  CC      aarch64-softmmu/hw/arm/fsl-imx6.o
  CC      arm-softmmu/target/arm/kvm-stub.o
  CC      i386-softmmu/target/i386/fpu_helper.o
  CC      arm-softmmu/target/arm/translate.o
  CC      aarch64-softmmu/hw/arm/sabrelite.o
  CC      m68k-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/hw/arm/aspeed_soc.o
  CC      aarch64-softmmu/hw/arm/aspeed.o
  CC      aarch64-softmmu/target/arm/arm-semi.o
  CC      m68k-softmmu/tcg/tcg-common.o
  CC      m68k-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/target/arm/machine.o
  CC      aarch64-softmmu/target/arm/psci.o
  CC      i386-softmmu/target/i386/cc_helper.o
  CC      aarch64-softmmu/target/arm/arch_dump.o
  CC      aarch64-softmmu/target/arm/monitor.o
  CC      aarch64-softmmu/target/arm/kvm-stub.o
  CC      i386-softmmu/target/i386/int_helper.o
  CC      aarch64-softmmu/target/arm/translate.o
  CC      i386-softmmu/target/i386/svm_helper.o
  CC      m68k-softmmu/disas.o
  CC      i386-softmmu/target/i386/smm_helper.o
  CC      m68k-softmmu/tcg-runtime.o
  CC      i386-softmmu/target/i386/misc_helper.o
  CC      arm-softmmu/target/arm/op_helper.o
  GEN     m68k-softmmu/gdbstub-xml.c
  CC      i386-softmmu/target/i386/mem_helper.o
  CC      m68k-softmmu/hax-stub.o
  CC      m68k-softmmu/kvm-stub.o
  CC      i386-softmmu/target/i386/seg_helper.o
  CC      m68k-softmmu/arch_init.o
  CC      arm-softmmu/target/arm/helper.o
  CC      m68k-softmmu/cpus.o
  CC      m68k-softmmu/monitor.o
  CC      i386-softmmu/target/i386/mpx_helper.o
  CC      aarch64-softmmu/target/arm/op_helper.o
  CC      i386-softmmu/target/i386/gdbstub.o
  CC      i386-softmmu/target/i386/machine.o
  CC      m68k-softmmu/gdbstub.o
  CC      arm-softmmu/target/arm/cpu.o
  CC      aarch64-softmmu/target/arm/helper.o
  CC      i386-softmmu/target/i386/arch_memory_mapping.o
  CC      m68k-softmmu/balloon.o
  CC      i386-softmmu/target/i386/arch_dump.o
  CC      arm-softmmu/target/arm/neon_helper.o
  CC      m68k-softmmu/ioport.o
  CC      i386-softmmu/target/i386/monitor.o
  CC      i386-softmmu/target/i386/kvm-stub.o
  CC      m68k-softmmu/numa.o
  GEN     trace/generated-helpers.c
  CC      i386-softmmu/trace/control-target.o
  CC      i386-softmmu/trace/generated-helpers.o
  CC      m68k-softmmu/qtest.o
  CC      arm-softmmu/target/arm/iwmmxt_helper.o
  LINK    i386-softmmu/qemu-system-i386
  CC      m68k-softmmu/bootdevice.o
  CC      aarch64-softmmu/target/arm/cpu.o
  CC      m68k-softmmu/memory.o
  CC      arm-softmmu/target/arm/gdbstub.o
  CC      arm-softmmu/target/arm/crypto_helper.o
  CC      aarch64-softmmu/target/arm/neon_helper.o
  CC      arm-softmmu/target/arm/arm-powerctl.o
  CC      m68k-softmmu/cputlb.o
  GEN     trace/generated-helpers.c
  CC      arm-softmmu/trace/control-target.o
  CC      arm-softmmu/gdbstub-xml.o
  CC      aarch64-softmmu/target/arm/iwmmxt_helper.o
  CC      arm-softmmu/trace/generated-helpers.o
  GEN     microblazeel-softmmu/hmp-commands.h
  GEN     microblazeel-softmmu/hmp-commands-info.h
  LINK    arm-softmmu/qemu-system-arm
  GEN     microblazeel-softmmu/config-target.h
  CC      m68k-softmmu/memory_mapping.o
  CC      microblazeel-softmmu/exec.o
  CC      m68k-softmmu/dump.o
  CC      aarch64-softmmu/target/arm/gdbstub.o
  CC      m68k-softmmu/migration/ram.o
  CC      aarch64-softmmu/target/arm/cpu64.o
  CC      aarch64-softmmu/target/arm/translate-a64.o
  CC      m68k-softmmu/migration/savevm.o
  CC      microblazeel-softmmu/translate-all.o
  CC      m68k-softmmu/xen-common-stub.o
  CC      m68k-softmmu/xen-hvm-stub.o
  GEN     microblaze-softmmu/hmp-commands.h
  CC      microblazeel-softmmu/cpu-exec.o
  GEN     microblaze-softmmu/hmp-commands-info.h
  CC      m68k-softmmu/hw/char/mcf_uart.o
  GEN     microblaze-softmmu/config-target.h
  CC      microblaze-softmmu/exec.o
  CC      microblazeel-softmmu/translate-common.o
  CC      m68k-softmmu/hw/core/nmi.o
  CC      microblazeel-softmmu/cpu-exec-common.o
  CC      m68k-softmmu/hw/core/generic-loader.o
  CC      microblazeel-softmmu/tcg/tcg.o
  CC      m68k-softmmu/hw/core/null-machine.o
  CC      m68k-softmmu/hw/cpu/core.o
  CC      microblaze-softmmu/translate-all.o
  CC      m68k-softmmu/hw/net/mcf_fec.o
  CC      microblazeel-softmmu/tcg/tcg-op.o
  CC      m68k-softmmu/hw/net/vhost_net.o
  CC      microblaze-softmmu/cpu-exec.o
  CC      aarch64-softmmu/target/arm/helper-a64.o
  CC      m68k-softmmu/hw/net/rocker/qmp-norocker.o
  CC      microblaze-softmmu/translate-common.o
  CC      aarch64-softmmu/target/arm/gdbstub64.o
  CC      m68k-softmmu/hw/vfio/common.o
  CC      microblaze-softmmu/cpu-exec-common.o
  CC      aarch64-softmmu/target/arm/crypto_helper.o
  CC      microblaze-softmmu/tcg/tcg.o
  CC      m68k-softmmu/hw/vfio/platform.o
  CC      aarch64-softmmu/target/arm/arm-powerctl.o
  CC      m68k-softmmu/hw/vfio/spapr.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/trace/control-target.o
  CC      microblazeel-softmmu/tcg/optimize.o
  CC      m68k-softmmu/hw/m68k/an5206.o
  CC      aarch64-softmmu/gdbstub-xml.o
  CC      m68k-softmmu/hw/m68k/mcf5208.o
  CC      microblaze-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/trace/generated-helpers.o
  CC      m68k-softmmu/hw/m68k/mcf5206.o
  CC      microblazeel-softmmu/tcg/tcg-common.o
  CC      microblazeel-softmmu/fpu/softfloat.o
  LINK    aarch64-softmmu/qemu-system-aarch64
  CC      m68k-softmmu/hw/m68k/mcf_intc.o
  CC      m68k-softmmu/target/m68k/m68k-semi.o
  CC      m68k-softmmu/target/m68k/translate.o
  CC      microblaze-softmmu/tcg/optimize.o
  CC      microblaze-softmmu/tcg/tcg-common.o
  CC      microblaze-softmmu/fpu/softfloat.o
  CC      microblaze-softmmu/disas.o
  CC      microblazeel-softmmu/disas.o
  CC      microblaze-softmmu/tcg-runtime.o
  CC      microblazeel-softmmu/tcg-runtime.o
  CC      microblazeel-softmmu/hax-stub.o
  CC      m68k-softmmu/target/m68k/op_helper.o
  CC      microblazeel-softmmu/kvm-stub.o
  GEN     mips64el-softmmu/hmp-commands.h
  CC      m68k-softmmu/target/m68k/helper.o
  GEN     mips64el-softmmu/hmp-commands-info.h
  GEN     mips64el-softmmu/config-target.h
  CC      mips64el-softmmu/exec.o
  CC      microblazeel-softmmu/arch_init.o
  CC      m68k-softmmu/target/m68k/cpu.o
  CC      microblazeel-softmmu/cpus.o
  CC      m68k-softmmu/target/m68k/gdbstub.o
  CC      microblaze-softmmu/hax-stub.o
  GEN     trace/generated-helpers.c
  CC      m68k-softmmu/trace/control-target.o
  CC      microblazeel-softmmu/monitor.o
  CC      m68k-softmmu/gdbstub-xml.o
  CC      microblaze-softmmu/kvm-stub.o
  CC      microblaze-softmmu/arch_init.o
  CC      m68k-softmmu/trace/generated-helpers.o
  CC      microblaze-softmmu/cpus.o
  CC      mips64el-softmmu/translate-all.o
  LINK    m68k-softmmu/qemu-system-m68k
  CC      microblazeel-softmmu/gdbstub.o
  CC      microblaze-softmmu/monitor.o
  CC      mips64el-softmmu/cpu-exec.o
  CC      microblazeel-softmmu/balloon.o
  CC      microblaze-softmmu/gdbstub.o
  CC      mips64el-softmmu/translate-common.o
  CC      microblazeel-softmmu/ioport.o
  CC      mips64el-softmmu/cpu-exec-common.o
  CC      microblazeel-softmmu/numa.o
  CC      mips64el-softmmu/tcg/tcg.o
  CC      microblazeel-softmmu/qtest.o
  CC      microblaze-softmmu/balloon.o
  GEN     mips64-softmmu/hmp-commands.h
  CC      microblaze-softmmu/ioport.o
  GEN     mips64-softmmu/hmp-commands-info.h
  CC      microblazeel-softmmu/bootdevice.o
  GEN     mips64-softmmu/config-target.h
  CC      microblazeel-softmmu/memory.o
  CC      mips64-softmmu/exec.o
  CC      microblaze-softmmu/numa.o
  CC      microblaze-softmmu/qtest.o
  CC      microblazeel-softmmu/cputlb.o
  CC      mips64el-softmmu/tcg/tcg-op.o
  CC      microblaze-softmmu/bootdevice.o
  CC      microblaze-softmmu/memory.o
  CC      mips64-softmmu/translate-all.o
  CC      microblazeel-softmmu/memory_mapping.o
  CC      mips64-softmmu/cpu-exec.o
  CC      microblazeel-softmmu/dump.o
  CC      microblaze-softmmu/cputlb.o
  CC      mips64-softmmu/translate-common.o
  CC      microblazeel-softmmu/migration/ram.o
  CC      mips64-softmmu/cpu-exec-common.o
  CC      mips64el-softmmu/tcg/optimize.o
  CC      mips64-softmmu/tcg/tcg.o
  CC      microblaze-softmmu/memory_mapping.o
  CC      microblazeel-softmmu/migration/savevm.o
  CC      microblaze-softmmu/dump.o
  CC      microblazeel-softmmu/xen-common-stub.o
  CC      mips64el-softmmu/tcg/tcg-common.o
  CC      microblaze-softmmu/migration/ram.o
  CC      microblazeel-softmmu/xen-hvm-stub.o
  CC      mips64el-softmmu/fpu/softfloat.o
  CC      microblazeel-softmmu/hw/core/nmi.o
  CC      mips64-softmmu/tcg/tcg-op.o
  CC      microblazeel-softmmu/hw/core/generic-loader.o
  CC      microblaze-softmmu/migration/savevm.o
  CC      microblazeel-softmmu/hw/core/null-machine.o
  CC      microblazeel-softmmu/hw/cpu/core.o
  CC      microblaze-softmmu/xen-common-stub.o
  CC      microblazeel-softmmu/hw/net/xilinx_ethlite.o
  CC      microblaze-softmmu/xen-hvm-stub.o
  CC      microblazeel-softmmu/hw/net/vhost_net.o
  CC      microblaze-softmmu/hw/core/nmi.o
  CC      microblazeel-softmmu/hw/net/rocker/qmp-norocker.o
  CC      mips64el-softmmu/disas.o
  CC      microblazeel-softmmu/hw/vfio/common.o
  CC      microblaze-softmmu/hw/core/generic-loader.o
  CC      mips64el-softmmu/tcg-runtime.o
  CC      mips64-softmmu/tcg/optimize.o
  CC      microblaze-softmmu/hw/core/null-machine.o
  CC      mips64el-softmmu/hax-stub.o
  CC      microblazeel-softmmu/hw/vfio/platform.o
  CC      mips64el-softmmu/kvm-stub.o
  CC      microblaze-softmmu/hw/cpu/core.o
  CC      mips64el-softmmu/arch_init.o
  CC      microblazeel-softmmu/hw/vfio/spapr.o
  CC      microblaze-softmmu/hw/net/xilinx_ethlite.o
  CC      microblazeel-softmmu/hw/microblaze/petalogix_s3adsp1800_mmu.o
  CC      microblaze-softmmu/hw/net/vhost_net.o
  CC      mips64el-softmmu/cpus.o
  CC      mips64-softmmu/tcg/tcg-common.o
  CC      microblaze-softmmu/hw/net/rocker/qmp-norocker.o
  CC      microblazeel-softmmu/hw/microblaze/petalogix_ml605_mmu.o
  CC      microblaze-softmmu/hw/vfio/common.o
  CC      mips64-softmmu/fpu/softfloat.o
  CC      microblazeel-softmmu/hw/microblaze/boot.o
  CC      mips64el-softmmu/monitor.o
  CC      microblaze-softmmu/hw/vfio/platform.o
  CC      microblazeel-softmmu/target/microblaze/translate.o
  CC      microblaze-softmmu/hw/vfio/spapr.o
  CC      mips64el-softmmu/gdbstub.o
  CC      microblaze-softmmu/hw/microblaze/petalogix_s3adsp1800_mmu.o
  CC      microblazeel-softmmu/target/microblaze/op_helper.o
  CC      microblaze-softmmu/hw/microblaze/petalogix_ml605_mmu.o
  CC      microblazeel-softmmu/target/microblaze/helper.o
  CC      mips64el-softmmu/balloon.o
  CC      microblaze-softmmu/hw/microblaze/boot.o
  CC      microblazeel-softmmu/target/microblaze/cpu.o
  CC      mips64-softmmu/disas.o
  CC      mips64el-softmmu/ioport.o
  CC      microblaze-softmmu/target/microblaze/translate.o
  CC      microblazeel-softmmu/target/microblaze/gdbstub.o
  CC      mips64-softmmu/tcg-runtime.o
  CC      mips64el-softmmu/numa.o
  CC      microblazeel-softmmu/target/microblaze/mmu.o
  CC      mips64-softmmu/hax-stub.o
  GEN     trace/generated-helpers.c
  CC      microblazeel-softmmu/trace/control-target.o
  CC      mips64el-softmmu/qtest.o
  CC      mips64-softmmu/kvm-stub.o
  CC      microblazeel-softmmu/trace/generated-helpers.o
  CC      mips64el-softmmu/bootdevice.o
  CC      microblaze-softmmu/target/microblaze/op_helper.o
  CC      mips64-softmmu/arch_init.o
  LINK    microblazeel-softmmu/qemu-system-microblazeel
  CC      mips64el-softmmu/memory.o
  CC      mips64-softmmu/cpus.o
  CC      microblaze-softmmu/target/microblaze/helper.o
  CC      mips64-softmmu/monitor.o
  CC      microblaze-softmmu/target/microblaze/cpu.o
  CC      mips64el-softmmu/cputlb.o
  CC      microblaze-softmmu/target/microblaze/gdbstub.o
  CC      microblaze-softmmu/target/microblaze/mmu.o
  GEN     mipsel-softmmu/hmp-commands.h
  GEN     mipsel-softmmu/hmp-commands-info.h
  GEN     mipsel-softmmu/config-target.h
  GEN     trace/generated-helpers.c
  CC      microblaze-softmmu/trace/control-target.o
  CC      mipsel-softmmu/exec.o
  CC      microblaze-softmmu/trace/generated-helpers.o
  CC      mips64-softmmu/gdbstub.o
  LINK    microblaze-softmmu/qemu-system-microblaze
  CC      mips64el-softmmu/memory_mapping.o
  CC      mips64-softmmu/balloon.o
  CC      mips64el-softmmu/dump.o
  CC      mips64-softmmu/ioport.o
  CC      mips64-softmmu/numa.o
  CC      mipsel-softmmu/translate-all.o
  CC      mips64-softmmu/qtest.o
  CC      mips64el-softmmu/migration/ram.o
  GEN     mips-softmmu/hmp-commands.h
  CC      mips64-softmmu/bootdevice.o
  GEN     mips-softmmu/hmp-commands-info.h
  CC      mipsel-softmmu/cpu-exec.o
  GEN     mips-softmmu/config-target.h
  CC      mips-softmmu/exec.o
  CC      mips64-softmmu/memory.o
  CC      mipsel-softmmu/translate-common.o
  CC      mips64el-softmmu/migration/savevm.o
  CC      mipsel-softmmu/cpu-exec-common.o
  CC      mipsel-softmmu/tcg/tcg.o
  CC      mips64el-softmmu/xen-common-stub.o
  CC      mips64-softmmu/cputlb.o
  CC      mips-softmmu/translate-all.o
  CC      mips64el-softmmu/xen-hvm-stub.o
  CC      mips64el-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips-softmmu/cpu-exec.o
  CC      mips64el-softmmu/hw/block/virtio-blk.o
  CC      mips-softmmu/translate-common.o
  CC      mips64-softmmu/memory_mapping.o
  CC      mips-softmmu/cpu-exec-common.o
  CC      mips-softmmu/tcg/tcg.o
  CC      mipsel-softmmu/tcg/tcg-op.o
  CC      mips64el-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mips64-softmmu/dump.o
  CC      mips64el-softmmu/hw/char/virtio-serial-bus.o
  CC      mips64el-softmmu/hw/core/nmi.o
  CC      mips64el-softmmu/hw/core/generic-loader.o
  CC      mips64-softmmu/migration/ram.o
  CC      mips64el-softmmu/hw/core/null-machine.o
  CC      mips64el-softmmu/hw/cpu/core.o
  CC      mips64-softmmu/migration/savevm.o
  CC      mipsel-softmmu/tcg/optimize.o
  CC      mips64el-softmmu/hw/display/vga.o
  CC      mips-softmmu/tcg/tcg-op.o
  CC      mips64el-softmmu/hw/display/virtio-gpu.o
  CC      mips64-softmmu/xen-common-stub.o
  CC      mips64-softmmu/xen-hvm-stub.o
  CC      mipsel-softmmu/tcg/tcg-common.o
  CC      mips64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips64el-softmmu/hw/display/virtio-gpu-3d.o
  CC      mipsel-softmmu/fpu/softfloat.o
  CC      mips64-softmmu/hw/block/virtio-blk.o
  CC      mips64el-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mips-softmmu/tcg/optimize.o
  CC      mips64el-softmmu/hw/intc/mips_gic.o
  CC      mips64-softmmu/hw/char/virtio-serial-bus.o
  CC      mips64el-softmmu/hw/misc/ivshmem.o
  CC      mips64-softmmu/hw/core/nmi.o
  CC      mips64el-softmmu/hw/misc/mips_cmgcr.o
  CC      mips64-softmmu/hw/core/generic-loader.o
  CC      mips-softmmu/tcg/tcg-common.o
  CC      mips64el-softmmu/hw/misc/mips_cpc.o
  CC      mips64-softmmu/hw/core/null-machine.o
  CC      mips-softmmu/fpu/softfloat.o
  CC      mips64-softmmu/hw/cpu/core.o
  CC      mips64el-softmmu/hw/misc/mips_itu.o
  CC      mips64-softmmu/hw/display/vga.o
  CC      mipsel-softmmu/disas.o
  CC      mips64el-softmmu/hw/misc/edu.o
  CC      mipsel-softmmu/tcg-runtime.o
  CC      mipsel-softmmu/hax-stub.o
  CC      mips64-softmmu/hw/display/virtio-gpu.o
  CC      mips64el-softmmu/hw/net/virtio-net.o
  CC      mipsel-softmmu/kvm-stub.o
  CC      mipsel-softmmu/arch_init.o
  CC      mipsel-softmmu/cpus.o
  CC      mips64el-softmmu/hw/net/vhost_net.o
  CC      mips64-softmmu/hw/display/virtio-gpu-3d.o
  CC      mipsel-softmmu/monitor.o
  CC      mips64el-softmmu/hw/scsi/virtio-scsi.o
  CC      mips-softmmu/disas.o
  CC      mips64-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips64el-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips-softmmu/tcg-runtime.o
  CC      mips-softmmu/hax-stub.o
  CC      mips64-softmmu/hw/intc/mips_gic.o
  CC      mips64el-softmmu/hw/scsi/vhost-scsi.o
  CC      mips-softmmu/kvm-stub.o
  CC      mips64el-softmmu/hw/timer/mips_gictimer.o
  CC      mipsel-softmmu/gdbstub.o
  CC      mips64-softmmu/hw/misc/ivshmem.o
  CC      mips-softmmu/arch_init.o
  CC      mips64el-softmmu/hw/timer/mc146818rtc.o
  CC      mips64-softmmu/hw/misc/mips_cmgcr.o
  CC      mips-softmmu/cpus.o
  CC      mips64-softmmu/hw/misc/mips_cpc.o
  CC      mips64el-softmmu/hw/vfio/common.o
  CC      mipsel-softmmu/balloon.o
  CC      mips64-softmmu/hw/misc/mips_itu.o
  CC      mipsel-softmmu/ioport.o
  CC      mips64el-softmmu/hw/vfio/pci.o
  CC      mips64-softmmu/hw/misc/edu.o
  CC      mips-softmmu/monitor.o
  CC      mipsel-softmmu/numa.o
  CC      mips64-softmmu/hw/net/virtio-net.o
  CC      mipsel-softmmu/qtest.o
  CC      mips64el-softmmu/hw/vfio/pci-quirks.o
  CC      mips64-softmmu/hw/net/vhost_net.o
  CC      mips64-softmmu/hw/scsi/virtio-scsi.o
  CC      mipsel-softmmu/bootdevice.o
  CC      mips64el-softmmu/hw/vfio/platform.o
  CC      mips-softmmu/gdbstub.o
  CC      mipsel-softmmu/memory.o
  CC      mips64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips64el-softmmu/hw/vfio/spapr.o
  CC      mips64-softmmu/hw/scsi/vhost-scsi.o
  CC      mips64el-softmmu/hw/virtio/virtio.o
  CC      mips64-softmmu/hw/timer/mips_gictimer.o
  CC      mips-softmmu/balloon.o
  CC      mips64-softmmu/hw/timer/mc146818rtc.o
  CC      mips-softmmu/ioport.o
  CC      mipsel-softmmu/cputlb.o
  CC      mips64-softmmu/hw/vfio/common.o
  CC      mips-softmmu/numa.o
  CC      mips64el-softmmu/hw/virtio/virtio-balloon.o
  CC      mips64-softmmu/hw/vfio/pci.o
  CC      mips64el-softmmu/hw/virtio/vhost.o
  CC      mips-softmmu/qtest.o
  CC      mipsel-softmmu/memory_mapping.o
  CC      mips64-softmmu/hw/vfio/pci-quirks.o
  CC      mips64el-softmmu/hw/virtio/vhost-backend.o
  CC      mipsel-softmmu/dump.o
  CC      mips-softmmu/bootdevice.o
  CC      mips64el-softmmu/hw/virtio/vhost-user.o
  CC      mips64-softmmu/hw/vfio/platform.o
  CC      mips64el-softmmu/hw/virtio/vhost-vsock.o
  CC      mips-softmmu/memory.o
  CC      mips64-softmmu/hw/vfio/spapr.o
  CC      mipsel-softmmu/migration/ram.o
  CC      mips64el-softmmu/hw/virtio/virtio-crypto.o
  CC      mips64-softmmu/hw/virtio/virtio.o
  CC      mips64el-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips64el-softmmu/hw/mips/mips_r4k.o
  CC      mipsel-softmmu/migration/savevm.o
  CC      mips-softmmu/cputlb.o
  CC      mips64el-softmmu/hw/mips/mips_malta.o
  CC      mips64-softmmu/hw/virtio/virtio-balloon.o
  CC      mipsel-softmmu/xen-common-stub.o
  CC      mips64-softmmu/hw/virtio/vhost.o
  CC      mips64el-softmmu/hw/mips/mips_mipssim.o
  CC      mipsel-softmmu/xen-hvm-stub.o
  CC      mips64el-softmmu/hw/mips/addr.o
  CC      mips64-softmmu/hw/virtio/vhost-backend.o
  CC      mips64el-softmmu/hw/mips/cputimer.o
  CC      mipsel-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips64-softmmu/hw/virtio/vhost-user.o
  CC      mips-softmmu/memory_mapping.o
  CC      mips64el-softmmu/hw/mips/mips_int.o
  CC      mips-softmmu/dump.o
  CC      mips64el-softmmu/hw/mips/mips_jazz.o
  CC      mipsel-softmmu/hw/block/virtio-blk.o
  CC      mips64-softmmu/hw/virtio/vhost-vsock.o
  CC      mips64el-softmmu/hw/mips/mips_fulong2e.o
  CC      mips64-softmmu/hw/virtio/virtio-crypto.o
  CC      mipsel-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mips-softmmu/migration/ram.o
  CC      mips64el-softmmu/hw/mips/gt64xxx_pci.o
  CC      mipsel-softmmu/hw/char/virtio-serial-bus.o
  CC      mips64el-softmmu/hw/mips/cps.o
  CC      mips64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips64el-softmmu/target/mips/translate.o
  CC      mipsel-softmmu/hw/core/nmi.o
  CC      mips64-softmmu/hw/mips/mips_r4k.o
  CC      mips-softmmu/migration/savevm.o
  CC      mipsel-softmmu/hw/core/generic-loader.o
  CC      mips64-softmmu/hw/mips/mips_malta.o
  CC      mipsel-softmmu/hw/core/null-machine.o
  CC      mipsel-softmmu/hw/cpu/core.o
  CC      mips64-softmmu/hw/mips/mips_mipssim.o
  CC      mips-softmmu/xen-common-stub.o
  CC      mips-softmmu/xen-hvm-stub.o
  CC      mipsel-softmmu/hw/display/vga.o
  CC      mips64-softmmu/hw/mips/addr.o
  CC      mips64-softmmu/hw/mips/cputimer.o
  CC      mips-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips64-softmmu/hw/mips/mips_int.o
  CC      mips64-softmmu/hw/mips/mips_jazz.o
  CC      mips-softmmu/hw/block/virtio-blk.o
  CC      mipsel-softmmu/hw/display/virtio-gpu.o
  CC      mips64-softmmu/hw/mips/gt64xxx_pci.o
  CC      mips-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mips64-softmmu/hw/mips/cps.o
  CC      mipsel-softmmu/hw/display/virtio-gpu-3d.o
  CC      mips-softmmu/hw/char/virtio-serial-bus.o
  CC      mips64-softmmu/target/mips/translate.o
  CC      mips-softmmu/hw/core/nmi.o
  CC      mipsel-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips-softmmu/hw/core/generic-loader.o
  CC      mips-softmmu/hw/core/null-machine.o
  CC      mipsel-softmmu/hw/intc/mips_gic.o
  CC      mips-softmmu/hw/cpu/core.o
  CC      mips-softmmu/hw/display/vga.o
  CC      mipsel-softmmu/hw/misc/ivshmem.o
  CC      mipsel-softmmu/hw/misc/mips_cmgcr.o
  CC      mips64el-softmmu/target/mips/dsp_helper.o
  CC      mipsel-softmmu/hw/misc/mips_cpc.o
  CC      mips-softmmu/hw/display/virtio-gpu.o
  CC      mipsel-softmmu/hw/misc/mips_itu.o
  CC      mips-softmmu/hw/display/virtio-gpu-3d.o
  CC      mipsel-softmmu/hw/misc/edu.o
  CC      mipsel-softmmu/hw/net/virtio-net.o
  CC      mips64el-softmmu/target/mips/op_helper.o
  CC      mips-softmmu/hw/display/virtio-gpu-pci.o
  CC      mipsel-softmmu/hw/net/vhost_net.o
  CC      mips-softmmu/hw/intc/mips_gic.o
  CC      mipsel-softmmu/hw/scsi/virtio-scsi.o
  CC      mipsel-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips-softmmu/hw/misc/ivshmem.o
  CC      mipsel-softmmu/hw/scsi/vhost-scsi.o
  CC      mipsel-softmmu/hw/timer/mips_gictimer.o
  CC      mips-softmmu/hw/misc/mips_cmgcr.o
  CC      mipsel-softmmu/hw/timer/mc146818rtc.o
  CC      mips-softmmu/hw/misc/mips_cpc.o
  CC      mips64-softmmu/target/mips/dsp_helper.o
  CC      mipsel-softmmu/hw/vfio/common.o
  CC      mips-softmmu/hw/misc/mips_itu.o
  CC      mips64el-softmmu/target/mips/lmi_helper.o
  CC      mips-softmmu/hw/misc/edu.o
  CC      mips64el-softmmu/target/mips/helper.o
  CC      mips-softmmu/hw/net/virtio-net.o
  CC      mipsel-softmmu/hw/vfio/pci.o
  CC      mips64-softmmu/target/mips/op_helper.o
  CC      mips64el-softmmu/target/mips/cpu.o
  CC      mips64el-softmmu/target/mips/gdbstub.o
  CC      mips-softmmu/hw/net/vhost_net.o
  CC      mips64el-softmmu/target/mips/msa_helper.o
  CC      mips-softmmu/hw/scsi/virtio-scsi.o
  CC      mipsel-softmmu/hw/vfio/pci-quirks.o
  CC      mips-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mipsel-softmmu/hw/vfio/platform.o
  CC      mips-softmmu/hw/scsi/vhost-scsi.o
  CC      mips64-softmmu/target/mips/lmi_helper.o
  CC      mipsel-softmmu/hw/vfio/spapr.o
  CC      mips-softmmu/hw/timer/mips_gictimer.o
  CC      mips64-softmmu/target/mips/helper.o
  CC      mipsel-softmmu/hw/virtio/virtio.o
  CC      mips-softmmu/hw/timer/mc146818rtc.o
  CC      mips64-softmmu/target/mips/cpu.o
  CC      mips-softmmu/hw/vfio/common.o
  CC      mips64-softmmu/target/mips/gdbstub.o
  CC      mipsel-softmmu/hw/virtio/virtio-balloon.o
  CC      mips64-softmmu/target/mips/msa_helper.o
  CC      mips64el-softmmu/target/mips/mips-semi.o
  CC      mipsel-softmmu/hw/virtio/vhost.o
  CC      mips-softmmu/hw/vfio/pci.o
  CC      mips64el-softmmu/target/mips/machine.o
  GEN     trace/generated-helpers.c
  CC      mips64el-softmmu/trace/control-target.o
  CC      mips64el-softmmu/trace/generated-helpers.o
  CC      mipsel-softmmu/hw/virtio/vhost-backend.o
  LINK    mips64el-softmmu/qemu-system-mips64el
  CC      mipsel-softmmu/hw/virtio/vhost-user.o
  CC      mips-softmmu/hw/vfio/pci-quirks.o
  CC      mipsel-softmmu/hw/virtio/vhost-vsock.o
  CC      mipsel-softmmu/hw/virtio/virtio-crypto.o
  CC      mipsel-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips-softmmu/hw/vfio/platform.o
  CC      mipsel-softmmu/hw/mips/mips_r4k.o
  CC      mips-softmmu/hw/vfio/spapr.o
  CC      mipsel-softmmu/hw/mips/mips_malta.o
  CC      mips64-softmmu/target/mips/mips-semi.o
  CC      mips-softmmu/hw/virtio/virtio.o
  CC      mipsel-softmmu/hw/mips/mips_mipssim.o
  GEN     moxie-softmmu/hmp-commands.h
  GEN     moxie-softmmu/hmp-commands-info.h
  CC      mips64-softmmu/target/mips/machine.o
  GEN     moxie-softmmu/config-target.h
  CC      mipsel-softmmu/hw/mips/addr.o
  CC      moxie-softmmu/exec.o
  CC      mipsel-softmmu/hw/mips/cputimer.o
  GEN     trace/generated-helpers.c
  CC      mips64-softmmu/trace/control-target.o
  CC      mipsel-softmmu/hw/mips/mips_int.o
  CC      mips-softmmu/hw/virtio/virtio-balloon.o
  CC      mipsel-softmmu/hw/mips/gt64xxx_pci.o
  CC      mips64-softmmu/trace/generated-helpers.o
  CC      mips-softmmu/hw/virtio/vhost.o
  LINK    mips64-softmmu/qemu-system-mips64
  CC      mipsel-softmmu/hw/mips/cps.o
  CC      mips-softmmu/hw/virtio/vhost-backend.o
  CC      mipsel-softmmu/target/mips/translate.o
  CC      mips-softmmu/hw/virtio/vhost-user.o
  CC      moxie-softmmu/translate-all.o
  CC      mips-softmmu/hw/virtio/vhost-vsock.o
  CC      moxie-softmmu/cpu-exec.o
  CC      moxie-softmmu/translate-common.o
  CC      mips-softmmu/hw/virtio/virtio-crypto.o
  CC      moxie-softmmu/cpu-exec-common.o
  CC      mips-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      moxie-softmmu/tcg/tcg.o
  GEN     nios2-softmmu/hmp-commands.h
  GEN     nios2-softmmu/hmp-commands-info.h
  CC      mips-softmmu/hw/mips/mips_r4k.o
  GEN     nios2-softmmu/config-target.h
  CC      nios2-softmmu/exec.o
  CC      mips-softmmu/hw/mips/mips_malta.o
  CC      mips-softmmu/hw/mips/mips_mipssim.o
  CC      moxie-softmmu/tcg/tcg-op.o
  CC      mips-softmmu/hw/mips/addr.o
  CC      mips-softmmu/hw/mips/cputimer.o
  CC      nios2-softmmu/translate-all.o
  CC      mips-softmmu/hw/mips/mips_int.o
  CC      mips-softmmu/hw/mips/gt64xxx_pci.o
  CC      nios2-softmmu/cpu-exec.o
  CC      mips-softmmu/hw/mips/cps.o
  CC      nios2-softmmu/translate-common.o
  CC      mips-softmmu/target/mips/translate.o
  CC      moxie-softmmu/tcg/optimize.o
  CC      nios2-softmmu/cpu-exec-common.o
  CC      mipsel-softmmu/target/mips/dsp_helper.o
  CC      nios2-softmmu/tcg/tcg.o
  CC      moxie-softmmu/tcg/tcg-common.o
  CC      mipsel-softmmu/target/mips/op_helper.o
  CC      moxie-softmmu/fpu/softfloat.o
  CC      nios2-softmmu/tcg/tcg-op.o
  CC      mipsel-softmmu/target/mips/lmi_helper.o
  CC      mipsel-softmmu/target/mips/helper.o
  CC      moxie-softmmu/disas.o
  CC      mipsel-softmmu/target/mips/cpu.o
  CC      mipsel-softmmu/target/mips/gdbstub.o
  CC      moxie-softmmu/tcg-runtime.o
  CC      mipsel-softmmu/target/mips/msa_helper.o
  CC      moxie-softmmu/hax-stub.o
  CC      nios2-softmmu/tcg/optimize.o
  CC      moxie-softmmu/kvm-stub.o
  CC      mips-softmmu/target/mips/dsp_helper.o
  CC      moxie-softmmu/arch_init.o
  CC      moxie-softmmu/cpus.o
  CC      nios2-softmmu/tcg/tcg-common.o
  CC      mips-softmmu/target/mips/op_helper.o
  CC      nios2-softmmu/fpu/softfloat.o
  CC      moxie-softmmu/monitor.o
  CC      moxie-softmmu/gdbstub.o
  CC      mips-softmmu/target/mips/lmi_helper.o
  CC      mipsel-softmmu/target/mips/mips-semi.o
  CC      mipsel-softmmu/target/mips/machine.o
  CC      mips-softmmu/target/mips/helper.o
  CC      nios2-softmmu/disas.o
  GEN     trace/generated-helpers.c
  CC      moxie-softmmu/balloon.o
  CC      mipsel-softmmu/trace/control-target.o
  CC      nios2-softmmu/tcg-runtime.o
  CC      moxie-softmmu/ioport.o
  CC      mips-softmmu/target/mips/cpu.o
  CC      mipsel-softmmu/trace/generated-helpers.o
  CC      nios2-softmmu/hax-stub.o
  LINK    mipsel-softmmu/qemu-system-mipsel
  CC      mips-softmmu/target/mips/gdbstub.o
  CC      moxie-softmmu/numa.o
  CC      nios2-softmmu/kvm-stub.o
  CC      mips-softmmu/target/mips/msa_helper.o
  CC      nios2-softmmu/arch_init.o
  CC      moxie-softmmu/qtest.o
  CC      nios2-softmmu/cpus.o
  CC      moxie-softmmu/bootdevice.o
  CC      moxie-softmmu/memory.o
  CC      nios2-softmmu/monitor.o
  CC      mips-softmmu/target/mips/mips-semi.o
  CC      mips-softmmu/target/mips/machine.o
  CC      nios2-softmmu/gdbstub.o
  CC      moxie-softmmu/cputlb.o
  CC      nios2-softmmu/balloon.o
  GEN     trace/generated-helpers.c
  CC      mips-softmmu/trace/control-target.o
  CC      nios2-softmmu/ioport.o
  CC      moxie-softmmu/memory_mapping.o
  CC      nios2-softmmu/numa.o
  CC      moxie-softmmu/dump.o
  CC      mips-softmmu/trace/generated-helpers.o
  CC      nios2-softmmu/qtest.o
  LINK    mips-softmmu/qemu-system-mips
  CC      moxie-softmmu/migration/ram.o
  CC      moxie-softmmu/migration/savevm.o
  CC      nios2-softmmu/bootdevice.o
  CC      nios2-softmmu/memory.o
  CC      moxie-softmmu/xen-common-stub.o
  GEN     or1k-softmmu/hmp-commands.h
  GEN     or1k-softmmu/hmp-commands-info.h
  GEN     or1k-softmmu/config-target.h
  CC      moxie-softmmu/xen-hvm-stub.o
  CC      nios2-softmmu/cputlb.o
  CC      or1k-softmmu/exec.o
  CC      moxie-softmmu/hw/core/nmi.o
  CC      moxie-softmmu/hw/core/generic-loader.o
  CC      moxie-softmmu/hw/core/null-machine.o
  CC      moxie-softmmu/hw/cpu/core.o
  CC      or1k-softmmu/translate-all.o
  CC      moxie-softmmu/hw/display/vga.o
  CC      nios2-softmmu/memory_mapping.o
  CC      moxie-softmmu/hw/net/vhost_net.o
  CC      nios2-softmmu/dump.o
  CC      or1k-softmmu/cpu-exec.o
  CC      or1k-softmmu/translate-common.o
  CC      nios2-softmmu/migration/ram.o
  CC      moxie-softmmu/hw/net/rocker/qmp-norocker.o
  CC      moxie-softmmu/hw/timer/mc146818rtc.o
  CC      or1k-softmmu/cpu-exec-common.o
  CC      or1k-softmmu/tcg/tcg.o
  CC      moxie-softmmu/hw/vfio/common.o
  CC      or1k-softmmu/tcg/tcg-op.o
  CC      nios2-softmmu/migration/savevm.o
  CC      moxie-softmmu/hw/vfio/platform.o
  CC      nios2-softmmu/xen-common-stub.o
  CC      nios2-softmmu/xen-hvm-stub.o
  CC      or1k-softmmu/tcg/optimize.o
  CC      moxie-softmmu/hw/vfio/spapr.o
  CC      nios2-softmmu/hw/core/nmi.o
  CC      moxie-softmmu/hw/moxie/moxiesim.o
  CC      nios2-softmmu/hw/core/generic-loader.o
  CC      moxie-softmmu/target/moxie/translate.o
  CC      or1k-softmmu/tcg/tcg-common.o
  CC      nios2-softmmu/hw/core/null-machine.o
  CC      nios2-softmmu/hw/cpu/core.o
  CC      or1k-softmmu/fpu/softfloat.o
  CC      nios2-softmmu/hw/intc/nios2_iic.o
  CC      nios2-softmmu/hw/net/vhost_net.o
  CC      moxie-softmmu/target/moxie/helper.o
  CC      nios2-softmmu/hw/net/rocker/qmp-norocker.o
  CC      moxie-softmmu/target/moxie/machine.o
  GEN     ppc64-softmmu/hmp-commands.h
  CC      nios2-softmmu/hw/timer/altera_timer.o
  GEN     ppc64-softmmu/hmp-commands-info.h
  GEN     ppc64-softmmu/config-target.h
  CC      moxie-softmmu/target/moxie/cpu.o
  CC      nios2-softmmu/hw/vfio/common.o
  CC      ppc64-softmmu/exec.o
  CC      moxie-softmmu/target/moxie/mmu.o
  GEN     trace/generated-helpers.c
  CC      moxie-softmmu/trace/control-target.o
  CC      nios2-softmmu/hw/vfio/platform.o
  CC      moxie-softmmu/trace/generated-helpers.o
  CC      nios2-softmmu/hw/vfio/spapr.o
  CC      or1k-softmmu/disas.o
  CC      nios2-softmmu/hw/nios2/boot.o
  LINK    moxie-softmmu/qemu-system-moxie
  CC      or1k-softmmu/tcg-runtime.o
  CC      ppc64-softmmu/translate-all.o
  CC      nios2-softmmu/hw/nios2/cpu_pic.o
  CC      or1k-softmmu/hax-stub.o
  CC      or1k-softmmu/kvm-stub.o
  CC      nios2-softmmu/hw/nios2/10m50_devboard.o
  CC      ppc64-softmmu/cpu-exec.o
  CC      or1k-softmmu/arch_init.o
  CC      nios2-softmmu/target/nios2/translate.o
  CC      or1k-softmmu/cpus.o
  CC      ppc64-softmmu/translate-common.o
  CC      ppc64-softmmu/cpu-exec-common.o
  CC      ppc64-softmmu/tcg/tcg.o
  CC      or1k-softmmu/monitor.o
  CC      nios2-softmmu/target/nios2/op_helper.o
  GEN     ppcemb-softmmu/hmp-commands.h
  GEN     ppcemb-softmmu/hmp-commands-info.h
  GEN     ppcemb-softmmu/config-target.h
  CC      ppcemb-softmmu/exec.o
  CC      nios2-softmmu/target/nios2/helper.o
  CC      nios2-softmmu/target/nios2/cpu.o
  CC      or1k-softmmu/gdbstub.o
  CC      nios2-softmmu/target/nios2/mmu.o
  CC      ppc64-softmmu/tcg/tcg-op.o
  CC      ppcemb-softmmu/translate-all.o
  CC      nios2-softmmu/target/nios2/monitor.o
  CC      or1k-softmmu/balloon.o
  GEN     trace/generated-helpers.c
  CC      nios2-softmmu/trace/control-target.o
  CC      ppcemb-softmmu/cpu-exec.o
  CC      or1k-softmmu/ioport.o
  CC      nios2-softmmu/trace/generated-helpers.o
  CC      ppcemb-softmmu/translate-common.o
  CC      or1k-softmmu/numa.o
  LINK    nios2-softmmu/qemu-system-nios2
  CC      ppcemb-softmmu/cpu-exec-common.o
  CC      ppcemb-softmmu/tcg/tcg.o
  CC      or1k-softmmu/qtest.o
  CC      or1k-softmmu/bootdevice.o
  CC      or1k-softmmu/memory.o
  CC      ppc64-softmmu/tcg/optimize.o
  GEN     ppc-softmmu/hmp-commands.h
  GEN     ppc-softmmu/hmp-commands-info.h
  GEN     ppc-softmmu/config-target.h
  CC      ppc-softmmu/exec.o
  CC      ppcemb-softmmu/tcg/tcg-op.o
  CC      or1k-softmmu/cputlb.o
  CC      ppc64-softmmu/tcg/tcg-common.o
  CC      ppc64-softmmu/fpu/softfloat.o
  CC      ppc-softmmu/translate-all.o
  CC      ppc-softmmu/cpu-exec.o
  CC      ppc-softmmu/translate-common.o
  CC      or1k-softmmu/memory_mapping.o
  CC      ppc-softmmu/cpu-exec-common.o
  CC      or1k-softmmu/dump.o
  CC      ppcemb-softmmu/tcg/optimize.o
  CC      ppc-softmmu/tcg/tcg.o
  CC      or1k-softmmu/migration/ram.o
  CC      ppc64-softmmu/disas.o
  CC      ppc64-softmmu/tcg-runtime.o
  CC      ppcemb-softmmu/tcg/tcg-common.o
  CC      or1k-softmmu/migration/savevm.o
  GEN     ppc64-softmmu/gdbstub-xml.c
  CC      ppcemb-softmmu/fpu/softfloat.o
  CC      ppc-softmmu/tcg/tcg-op.o
  CC      ppc64-softmmu/hax-stub.o
  CC      or1k-softmmu/xen-common-stub.o
  CC      ppc64-softmmu/kvm-stub.o
  CC      or1k-softmmu/xen-hvm-stub.o
  CC      or1k-softmmu/hw/core/nmi.o
  CC      ppc64-softmmu/libdecnumber/decContext.o
  CC      or1k-softmmu/hw/core/generic-loader.o
  CC      ppc64-softmmu/libdecnumber/decNumber.o
  CC      or1k-softmmu/hw/core/null-machine.o
  CC      or1k-softmmu/hw/cpu/core.o
  CC      ppcemb-softmmu/disas.o
  CC      ppcemb-softmmu/tcg-runtime.o
  CC      ppc-softmmu/tcg/optimize.o
  CC      or1k-softmmu/hw/net/vhost_net.o
  GEN     ppcemb-softmmu/gdbstub-xml.c
  CC      or1k-softmmu/hw/net/rocker/qmp-norocker.o
  CC      or1k-softmmu/hw/vfio/common.o
  CC      ppc-softmmu/tcg/tcg-common.o
  CC      ppc64-softmmu/libdecnumber/dpd/decimal32.o
  CC      ppcemb-softmmu/hax-stub.o
  CC      or1k-softmmu/hw/vfio/platform.o
  CC      ppc-softmmu/fpu/softfloat.o
  CC      ppcemb-softmmu/kvm-stub.o
  CC      ppc64-softmmu/libdecnumber/dpd/decimal64.o
  CC      or1k-softmmu/hw/vfio/spapr.o
  CC      ppcemb-softmmu/libdecnumber/decContext.o
  CC      ppc64-softmmu/libdecnumber/dpd/decimal128.o
  CC      or1k-softmmu/hw/openrisc/pic_cpu.o
  CC      ppcemb-softmmu/libdecnumber/decNumber.o
  CC      ppc64-softmmu/arch_init.o
  CC      or1k-softmmu/hw/openrisc/cputimer.o
  CC      or1k-softmmu/hw/openrisc/openrisc_sim.o
  CC      ppc64-softmmu/cpus.o
  CC      or1k-softmmu/target/openrisc/machine.o
  CC      or1k-softmmu/target/openrisc/cpu.o
  CC      or1k-softmmu/target/openrisc/exception.o
  CC      ppc64-softmmu/monitor.o
  CC      or1k-softmmu/target/openrisc/interrupt.o
  CC      ppc-softmmu/disas.o
  CC      ppcemb-softmmu/libdecnumber/dpd/decimal32.o
  CC      or1k-softmmu/target/openrisc/mmu.o
  CC      ppc-softmmu/tcg-runtime.o
  CC      ppcemb-softmmu/libdecnumber/dpd/decimal64.o
  CC      or1k-softmmu/target/openrisc/translate.o
  CC      ppcemb-softmmu/libdecnumber/dpd/decimal128.o
  GEN     ppc-softmmu/gdbstub-xml.c
  CC      ppc-softmmu/hax-stub.o
  CC      or1k-softmmu/target/openrisc/exception_helper.o
  CC      ppcemb-softmmu/arch_init.o
  CC      ppc64-softmmu/gdbstub.o
  CC      ppc-softmmu/kvm-stub.o
  CC      or1k-softmmu/target/openrisc/fpu_helper.o
  CC      ppcemb-softmmu/cpus.o
  CC      ppc-softmmu/libdecnumber/decContext.o
  CC      ppc64-softmmu/balloon.o
  CC      or1k-softmmu/target/openrisc/interrupt_helper.o
  CC      ppc-softmmu/libdecnumber/decNumber.o
  CC      ppcemb-softmmu/monitor.o
  CC      ppc64-softmmu/ioport.o
  CC      or1k-softmmu/target/openrisc/mmu_helper.o
  CC      or1k-softmmu/target/openrisc/sys_helper.o
  CC      ppc64-softmmu/numa.o
  CC      ppc64-softmmu/qtest.o
  CC      or1k-softmmu/target/openrisc/gdbstub.o
  CC      ppcemb-softmmu/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      or1k-softmmu/trace/control-target.o
  CC      or1k-softmmu/trace/generated-helpers.o
  CC      ppc64-softmmu/bootdevice.o
  CC      ppc-softmmu/libdecnumber/dpd/decimal32.o
  LINK    or1k-softmmu/qemu-system-or1k
  CC      ppcemb-softmmu/balloon.o
  CC      ppc-softmmu/libdecnumber/dpd/decimal64.o
  CC      ppc64-softmmu/memory.o
  CC      ppcemb-softmmu/ioport.o
  CC      ppc-softmmu/libdecnumber/dpd/decimal128.o
  CC      ppcemb-softmmu/numa.o
  CC      ppc-softmmu/arch_init.o
  CC      ppc64-softmmu/cputlb.o
  CC      ppcemb-softmmu/qtest.o
  CC      ppc-softmmu/cpus.o
  CC      ppcemb-softmmu/bootdevice.o
  GEN     s390x-softmmu/hmp-commands.h
  CC      ppc-softmmu/monitor.o
  GEN     s390x-softmmu/hmp-commands-info.h
  CC      s390x-softmmu/gen-features
  GEN     s390x-softmmu/config-target.h
  GEN     s390x-softmmu/gen-features.h
  CC      s390x-softmmu/exec.o
  CC      ppcemb-softmmu/memory.o
  CC      ppc64-softmmu/memory_mapping.o
  CC      ppc64-softmmu/dump.o
  CC      ppc-softmmu/gdbstub.o
  CC      ppcemb-softmmu/cputlb.o
  CC      ppc64-softmmu/migration/ram.o
  CC      s390x-softmmu/translate-all.o
  CC      ppc-softmmu/balloon.o
  CC      ppc-softmmu/ioport.o
  CC      ppc-softmmu/numa.o
  CC      s390x-softmmu/cpu-exec.o
  CC      ppc64-softmmu/migration/savevm.o
  CC      ppc-softmmu/qtest.o
  CC      s390x-softmmu/translate-common.o
  CC      ppcemb-softmmu/memory_mapping.o
  CC      s390x-softmmu/cpu-exec-common.o
  CC      ppcemb-softmmu/dump.o
  CC      s390x-softmmu/tcg/tcg.o
  CC      ppc-softmmu/bootdevice.o
  CC      ppc64-softmmu/xen-common-stub.o
  CC      ppc-softmmu/memory.o
  CC      ppcemb-softmmu/migration/ram.o
  CC      ppc64-softmmu/xen-hvm-stub.o
  CC      ppc64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      s390x-softmmu/tcg/tcg-op.o
  CC      ppc64-softmmu/hw/block/virtio-blk.o
  CC      ppcemb-softmmu/migration/savevm.o
  CC      ppc-softmmu/cputlb.o
  CC      ppc64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppcemb-softmmu/xen-common-stub.o
  CC      ppc64-softmmu/hw/char/spapr_vty.o
  CC      ppcemb-softmmu/xen-hvm-stub.o
  CC      ppcemb-softmmu/hw/9pfs/virtio-9p-device.o
  CC      ppc64-softmmu/hw/char/virtio-serial-bus.o
  CC      ppc-softmmu/memory_mapping.o
  CC      ppcemb-softmmu/hw/block/virtio-blk.o
  CC      ppc-softmmu/dump.o
  CC      ppc64-softmmu/hw/core/nmi.o
  CC      s390x-softmmu/tcg/optimize.o
  CC      ppcemb-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppc64-softmmu/hw/core/generic-loader.o
  CC      ppcemb-softmmu/hw/char/virtio-serial-bus.o
  CC      ppc-softmmu/migration/ram.o
  CC      ppc64-softmmu/hw/core/null-machine.o
  CC      ppcemb-softmmu/hw/core/nmi.o
  CC      s390x-softmmu/tcg/tcg-common.o
  CC      ppc64-softmmu/hw/cpu/core.o
  CC      ppc64-softmmu/hw/display/vga.o
  CC      s390x-softmmu/fpu/softfloat.o
  CC      ppcemb-softmmu/hw/core/generic-loader.o
  CC      ppc-softmmu/migration/savevm.o
  CC      ppcemb-softmmu/hw/core/null-machine.o
  CC      ppc-softmmu/xen-common-stub.o
  CC      ppcemb-softmmu/hw/cpu/core.o
  CC      ppc-softmmu/xen-hvm-stub.o
  CC      ppc64-softmmu/hw/display/virtio-gpu.o
  CC      ppcemb-softmmu/hw/display/vga.o
  CC      ppc-softmmu/hw/9pfs/virtio-9p-device.o
  CC      ppc-softmmu/hw/block/virtio-blk.o
  CC      ppc64-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu.o
  CC      ppc-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppc-softmmu/hw/char/virtio-serial-bus.o
  CC      s390x-softmmu/disas.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppc64-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppc-softmmu/hw/core/nmi.o
  CC      ppc64-softmmu/hw/display/virtio-vga.o
  CC      s390x-softmmu/tcg-runtime.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppc-softmmu/hw/core/generic-loader.o
  CC      ppcemb-softmmu/hw/misc/ivshmem.o
  GEN     s390x-softmmu/gdbstub-xml.c
  CC      ppc-softmmu/hw/core/null-machine.o
  CC      ppc64-softmmu/hw/intc/xics.o
  CC      ppc-softmmu/hw/cpu/core.o
  CC      ppcemb-softmmu/hw/misc/edu.o
  CC      s390x-softmmu/hax-stub.o
  CC      ppc-softmmu/hw/display/vga.o
  CC      ppc64-softmmu/hw/intc/xics_spapr.o
  CC      s390x-softmmu/arch_init.o
  CC      ppcemb-softmmu/hw/net/xilinx_ethlite.o
  CC      s390x-softmmu/cpus.o
  CC      ppc64-softmmu/hw/misc/ivshmem.o
  CC      ppcemb-softmmu/hw/net/virtio-net.o
  CC      ppc64-softmmu/hw/misc/edu.o
  CC      ppc-softmmu/hw/display/virtio-gpu.o
  CC      s390x-softmmu/monitor.o
  CC      ppc64-softmmu/hw/net/spapr_llan.o
  CC      ppcemb-softmmu/hw/net/vhost_net.o
  CC      ppc-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppcemb-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc64-softmmu/hw/net/xilinx_ethlite.o
  CC      ppc64-softmmu/hw/net/virtio-net.o
  CC      s390x-softmmu/gdbstub.o
  CC      ppc-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppcemb-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppc-softmmu/hw/misc/ivshmem.o
  CC      s390x-softmmu/balloon.o
  CC      ppcemb-softmmu/hw/scsi/vhost-scsi.o
  CC      ppc-softmmu/hw/misc/edu.o
  CC      ppc64-softmmu/hw/net/vhost_net.o
  CC      s390x-softmmu/ioport.o
  CC      ppcemb-softmmu/hw/vfio/common.o
  CC      ppc-softmmu/hw/net/xilinx_ethlite.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/etsec.o
  CC      s390x-softmmu/numa.o
  CC      ppc-softmmu/hw/net/virtio-net.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/registers.o
  CC      ppcemb-softmmu/hw/vfio/pci.o
  CC      s390x-softmmu/qtest.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/rings.o
  CC      ppc-softmmu/hw/net/vhost_net.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/miim.o
  CC      s390x-softmmu/bootdevice.o
  CC      ppc-softmmu/hw/net/fsl_etsec/etsec.o
  CC      ppc64-softmmu/hw/nvram/spapr_nvram.o
  CC      s390x-softmmu/kvm-all.o
  CC      ppc-softmmu/hw/net/fsl_etsec/registers.o
  CC      ppcemb-softmmu/hw/vfio/pci-quirks.o
  CC      ppc-softmmu/hw/net/fsl_etsec/rings.o
  CC      ppc64-softmmu/hw/scsi/spapr_vscsi.o
  CC      ppc-softmmu/hw/net/fsl_etsec/miim.o
  CC      ppc64-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc-softmmu/hw/scsi/virtio-scsi.o
  CC      ppcemb-softmmu/hw/vfio/platform.o
  CC      s390x-softmmu/memory.o
  CC      ppc64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppc64-softmmu/hw/scsi/vhost-scsi.o
  CC      ppc-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppcemb-softmmu/hw/vfio/spapr.o
  CC      ppc64-softmmu/hw/timer/mc146818rtc.o
  CC      ppc-softmmu/hw/scsi/vhost-scsi.o
  CC      ppcemb-softmmu/hw/virtio/virtio.o
  CC      ppc64-softmmu/hw/vfio/common.o
  CC      ppc-softmmu/hw/timer/mc146818rtc.o
  CC      s390x-softmmu/cputlb.o
  CC      ppc64-softmmu/hw/vfio/pci.o
  CC      ppc-softmmu/hw/vfio/common.o
  CC      ppcemb-softmmu/hw/virtio/virtio-balloon.o
  CC      ppc-softmmu/hw/vfio/pci.o
  CC      ppcemb-softmmu/hw/virtio/vhost.o
  CC      s390x-softmmu/memory_mapping.o
  CC      ppc64-softmmu/hw/vfio/pci-quirks.o
  CC      s390x-softmmu/dump.o
  CC      ppcemb-softmmu/hw/virtio/vhost-backend.o
  CC      ppc-softmmu/hw/vfio/pci-quirks.o
  CC      ppcemb-softmmu/hw/virtio/vhost-user.o
  CC      ppc64-softmmu/hw/vfio/platform.o
  CC      s390x-softmmu/migration/ram.o
  CC      ppc64-softmmu/hw/vfio/spapr.o
  CC      ppcemb-softmmu/hw/virtio/vhost-vsock.o
  CC      ppc-softmmu/hw/vfio/platform.o
  CC      ppc-softmmu/hw/vfio/spapr.o
  CC      ppcemb-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc64-softmmu/hw/virtio/virtio.o
  CC      ppc-softmmu/hw/virtio/virtio.o
  CC      ppcemb-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      s390x-softmmu/migration/savevm.o
  CC      ppc64-softmmu/hw/virtio/virtio-balloon.o
  CC      ppcemb-softmmu/hw/ppc/ppc.o
  CC      ppc-softmmu/hw/virtio/virtio-balloon.o
  CC      s390x-softmmu/xen-common-stub.o
  CC      ppc64-softmmu/hw/virtio/vhost.o
  CC      ppcemb-softmmu/hw/ppc/ppc_booke.o
  CC      ppc-softmmu/hw/virtio/vhost.o
  CC      s390x-softmmu/xen-hvm-stub.o
  CC      s390x-softmmu/hw/9pfs/virtio-9p-device.o
  CC      ppcemb-softmmu/hw/ppc/fdt.o
  CC      ppc64-softmmu/hw/virtio/vhost-backend.o
  CC      s390x-softmmu/hw/block/virtio-blk.o
  CC      ppcemb-softmmu/hw/ppc/ppc405_boards.o
  CC      ppc-softmmu/hw/virtio/vhost-backend.o
  CC      ppc64-softmmu/hw/virtio/vhost-user.o
  CC      s390x-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppcemb-softmmu/hw/ppc/ppc4xx_devs.o
  CC      ppc-softmmu/hw/virtio/vhost-user.o
  CC      ppc64-softmmu/hw/virtio/vhost-vsock.o
  CC      s390x-softmmu/hw/char/virtio-serial-bus.o
  CC      ppc-softmmu/hw/virtio/vhost-vsock.o
  CC      ppcemb-softmmu/hw/ppc/ppc405_uc.o
  CC      ppc64-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc-softmmu/hw/virtio/virtio-crypto.o
  CC      ppcemb-softmmu/hw/ppc/ppc440_bamboo.o
  CC      s390x-softmmu/hw/core/nmi.o
  CC      ppc64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppcemb-softmmu/hw/ppc/ppc4xx_pci.o
  CC      s390x-softmmu/hw/core/generic-loader.o
  CC      ppc-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppcemb-softmmu/hw/ppc/virtex_ml507.o
  CC      s390x-softmmu/hw/core/null-machine.o
  CC      ppc64-softmmu/hw/ppc/ppc.o
  CC      ppc-softmmu/hw/ppc/ppc.o
  CC      ppcemb-softmmu/target/ppc/cpu-models.o
  CC      s390x-softmmu/hw/cpu/core.o
  CC      ppc64-softmmu/hw/ppc/ppc_booke.o
  CC      s390x-softmmu/hw/display/virtio-gpu.o
  CC      ppc64-softmmu/hw/ppc/fdt.o
  CC      ppc-softmmu/hw/ppc/ppc_booke.o
  CC      ppc64-softmmu/hw/ppc/spapr.o
  CC      ppc-softmmu/hw/ppc/fdt.o
  CC      s390x-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppc-softmmu/hw/ppc/ppc405_boards.o
  CC      ppcemb-softmmu/target/ppc/translate.o
  CC      ppc64-softmmu/hw/ppc/spapr_vio.o
  CC      ppc-softmmu/hw/ppc/ppc4xx_devs.o
  CC      s390x-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppc-softmmu/hw/ppc/ppc405_uc.o
  CC      ppc64-softmmu/hw/ppc/spapr_events.o
  CC      s390x-softmmu/hw/intc/s390_flic.o
  CC      ppc-softmmu/hw/ppc/ppc440_bamboo.o
  CC      ppc64-softmmu/hw/ppc/spapr_hcall.o
  CC      s390x-softmmu/hw/intc/s390_flic_kvm.o
  CC      ppc-softmmu/hw/ppc/ppc4xx_pci.o
  CC      ppc-softmmu/hw/ppc/prep.o
  CC      ppc64-softmmu/hw/ppc/spapr_iommu.o
  CC      s390x-softmmu/hw/net/virtio-net.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtas.o
  CC      ppc-softmmu/hw/ppc/prep_systemio.o
  CC      s390x-softmmu/hw/net/vhost_net.o
  CC      ppc64-softmmu/hw/ppc/spapr_pci.o
  CC      ppc-softmmu/hw/ppc/rs6000_mc.o
  CC      s390x-softmmu/hw/net/rocker/qmp-norocker.o
  CC      ppc-softmmu/hw/ppc/mac_oldworld.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtc.o
  CC      s390x-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc-softmmu/hw/ppc/mac_newworld.o
  CC      ppc64-softmmu/hw/ppc/spapr_drc.o
  CC      ppc-softmmu/hw/ppc/e500.o
  CC      s390x-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppc64-softmmu/hw/ppc/spapr_rng.o
  CC      ppc-softmmu/hw/ppc/mpc8544ds.o
  CC      s390x-softmmu/hw/scsi/vhost-scsi.o
  CC      ppc64-softmmu/hw/ppc/spapr_cpu_core.o
  CC      s390x-softmmu/hw/vfio/common.o
  CC      ppc-softmmu/hw/ppc/e500plat.o
  CC      ppc64-softmmu/hw/ppc/spapr_ovec.o
  CC      ppc-softmmu/hw/ppc/mpc8544_guts.o
  CC      ppc64-softmmu/hw/ppc/pnv.o
  CC      ppc-softmmu/hw/ppc/ppce500_spin.o
  CC      s390x-softmmu/hw/vfio/pci.o
  CC      ppc-softmmu/hw/ppc/virtex_ml507.o
  CC      ppc64-softmmu/hw/ppc/pnv_xscom.o
  CC      ppc-softmmu/target/ppc/cpu-models.o
  CC      ppc64-softmmu/hw/ppc/pnv_core.o
  CC      s390x-softmmu/hw/vfio/pci-quirks.o
  CC      ppc64-softmmu/hw/ppc/pnv_lpc.o
  CC      s390x-softmmu/hw/vfio/platform.o
  CC      ppc64-softmmu/hw/ppc/spapr_pci_vfio.o
  CC      ppc-softmmu/target/ppc/translate.o
  CC      s390x-softmmu/hw/vfio/spapr.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtas_ddw.o
  CC      ppc64-softmmu/hw/ppc/ppc405_boards.o
  CC      s390x-softmmu/hw/virtio/virtio.o
  CC      ppc64-softmmu/hw/ppc/ppc4xx_devs.o
  CC      ppc64-softmmu/hw/ppc/ppc405_uc.o
  CC      ppc64-softmmu/hw/ppc/ppc440_bamboo.o
  CC      ppc64-softmmu/hw/ppc/ppc4xx_pci.o
  CC      s390x-softmmu/hw/virtio/virtio-balloon.o
  CC      s390x-softmmu/hw/virtio/vhost.o
  CC      ppc64-softmmu/hw/ppc/prep.o
  CC      ppc64-softmmu/hw/ppc/prep_systemio.o
  CC      s390x-softmmu/hw/virtio/vhost-backend.o
  CC      ppc64-softmmu/hw/ppc/rs6000_mc.o
  CC      ppcemb-softmmu/target/ppc/machine.o
  CC      s390x-softmmu/hw/virtio/vhost-user.o
  CC      ppc64-softmmu/hw/ppc/mac_oldworld.o
  CC      ppcemb-softmmu/target/ppc/mmu_helper.o
  CC      s390x-softmmu/hw/virtio/vhost-vsock.o
  CC      ppc64-softmmu/hw/ppc/mac_newworld.o
  CC      s390x-softmmu/hw/virtio/virtio-crypto.o
  CC      ppcemb-softmmu/target/ppc/mmu-hash32.o
  CC      s390x-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppc64-softmmu/hw/ppc/e500.o
  CC      ppcemb-softmmu/target/ppc/monitor.o
  CC      s390x-softmmu/hw/s390x/s390-virtio.o
  CC      ppc64-softmmu/hw/ppc/mpc8544ds.o
  CC      ppcemb-softmmu/target/ppc/kvm-stub.o
  CC      ppcemb-softmmu/target/ppc/dfp_helper.o
  CC      s390x-softmmu/hw/s390x/s390-virtio-hcall.o
  CC      ppc64-softmmu/hw/ppc/e500plat.o
  CC      s390x-softmmu/hw/s390x/sclp.o
  CC      ppc64-softmmu/hw/ppc/mpc8544_guts.o
  CC      ppcemb-softmmu/target/ppc/excp_helper.o
  CC      s390x-softmmu/hw/s390x/event-facility.o
  CC      ppc64-softmmu/hw/ppc/ppce500_spin.o
  CC      s390x-softmmu/hw/s390x/sclpquiesce.o
  CC      ppcemb-softmmu/target/ppc/fpu_helper.o
  CC      ppc64-softmmu/hw/ppc/virtex_ml507.o
  CC      s390x-softmmu/hw/s390x/sclpcpu.o
  CC      ppc64-softmmu/target/ppc/cpu-models.o
  CC      s390x-softmmu/hw/s390x/ipl.o
  CC      s390x-softmmu/hw/s390x/css.o
  CC      ppc64-softmmu/target/ppc/translate.o
  CC      s390x-softmmu/hw/s390x/s390-virtio-ccw.o
  CC      s390x-softmmu/hw/s390x/virtio-ccw.o
  CC      s390x-softmmu/hw/s390x/css-bridge.o
  CC      s390x-softmmu/hw/s390x/ccw-device.o
  CC      ppcemb-softmmu/target/ppc/int_helper.o
  CC      s390x-softmmu/hw/s390x/s390-pci-bus.o
  CC      ppc-softmmu/target/ppc/machine.o
  CC      ppc-softmmu/target/ppc/mmu_helper.o
  CC      s390x-softmmu/hw/s390x/s390-pci-inst.o
  CC      ppcemb-softmmu/target/ppc/timebase_helper.o
  CC      s390x-softmmu/hw/s390x/s390-skeys.o
  CC      ppc-softmmu/target/ppc/mmu-hash32.o
  CC      ppcemb-softmmu/target/ppc/misc_helper.o
  CC      ppcemb-softmmu/target/ppc/mem_helper.o
  CC      s390x-softmmu/hw/s390x/s390-skeys-kvm.o
  CC      ppc-softmmu/target/ppc/monitor.o
  CC      ppc-softmmu/target/ppc/kvm-stub.o
  CC      ppcemb-softmmu/target/ppc/gdbstub.o
  CC      s390x-softmmu/target/s390x/translate.o
  CC      ppc-softmmu/target/ppc/dfp_helper.o
  GEN     trace/generated-helpers.c
  CC      ppcemb-softmmu/trace/control-target.o
  CC      ppcemb-softmmu/gdbstub-xml.o
  CC      ppcemb-softmmu/trace/generated-helpers.o
  CC      ppc-softmmu/target/ppc/excp_helper.o
  LINK    ppcemb-softmmu/qemu-system-ppcemb
  CC      ppc-softmmu/target/ppc/fpu_helper.o
  CC      s390x-softmmu/target/s390x/helper.o
  CC      s390x-softmmu/target/s390x/cpu.o
  CC      s390x-softmmu/target/s390x/interrupt.o
  CC      s390x-softmmu/target/s390x/int_helper.o
  CC      s390x-softmmu/target/s390x/fpu_helper.o
  GEN     sh4eb-softmmu/hmp-commands.h
  GEN     sh4eb-softmmu/hmp-commands-info.h
  GEN     sh4eb-softmmu/config-target.h
  CC      sh4eb-softmmu/exec.o
  CC      s390x-softmmu/target/s390x/cc_helper.o
  CC      s390x-softmmu/target/s390x/mem_helper.o
  CC      ppc-softmmu/target/ppc/int_helper.o
  CC      sh4eb-softmmu/translate-all.o
  CC      s390x-softmmu/target/s390x/misc_helper.o
  CC      sh4eb-softmmu/cpu-exec.o
  CC      s390x-softmmu/target/s390x/gdbstub.o
  CC      s390x-softmmu/target/s390x/cpu_models.o
  CC      sh4eb-softmmu/translate-common.o
  CC      ppc64-softmmu/target/ppc/machine.o
  CC      ppc-softmmu/target/ppc/timebase_helper.o
  CC      sh4eb-softmmu/cpu-exec-common.o
  CC      s390x-softmmu/target/s390x/cpu_features.o
  CC      ppc64-softmmu/target/ppc/mmu_helper.o
  CC      sh4eb-softmmu/tcg/tcg.o
  CC      ppc-softmmu/target/ppc/misc_helper.o
  CC      s390x-softmmu/target/s390x/machine.o
  CC      ppc-softmmu/target/ppc/mem_helper.o
  CC      s390x-softmmu/target/s390x/ioinst.o
  CC      ppc64-softmmu/target/ppc/mmu-hash32.o
  CC      ppc-softmmu/target/ppc/gdbstub.o
  CC      s390x-softmmu/target/s390x/arch_dump.o
  CC      ppc64-softmmu/target/ppc/monitor.o
  GEN     trace/generated-helpers.c
  CC      ppc-softmmu/trace/control-target.o
  CC      ppc64-softmmu/target/ppc/mmu-hash64.o
  CC      sh4eb-softmmu/tcg/tcg-op.o
  CC      s390x-softmmu/target/s390x/mmu_helper.o
  CC      ppc-softmmu/gdbstub-xml.o
  CC      ppc64-softmmu/target/ppc/arch_dump.o
  CC      s390x-softmmu/target/s390x/kvm.o
  CC      ppc64-softmmu/target/ppc/compat.o
  CC      ppc-softmmu/trace/generated-helpers.o
  LINK    ppc-softmmu/qemu-system-ppc
  CC      ppc64-softmmu/target/ppc/kvm-stub.o
  GEN     trace/generated-helpers.c
  CC      s390x-softmmu/trace/control-target.o
  CC      ppc64-softmmu/target/ppc/dfp_helper.o
  CC      s390x-softmmu/gdbstub-xml.o
  CC      ppc64-softmmu/target/ppc/excp_helper.o
  CC      s390x-softmmu/trace/generated-helpers.o
  CC      sh4eb-softmmu/tcg/optimize.o
  LINK    s390x-softmmu/qemu-system-s390x
  CC      ppc64-softmmu/target/ppc/fpu_helper.o
  CC      sh4eb-softmmu/tcg/tcg-common.o
  CC      sh4eb-softmmu/fpu/softfloat.o
  GEN     sh4-softmmu/hmp-commands.h
  CC      sh4eb-softmmu/disas.o
  GEN     sh4-softmmu/hmp-commands-info.h
  GEN     sh4-softmmu/config-target.h
  CC      sh4-softmmu/exec.o
  CC      sh4eb-softmmu/tcg-runtime.o
  GEN     sparc64-softmmu/hmp-commands.h
  CC      sh4eb-softmmu/hax-stub.o
  GEN     sparc64-softmmu/hmp-commands-info.h
  GEN     sparc64-softmmu/config-target.h
  CC      sparc64-softmmu/exec.o
  CC      sh4-softmmu/translate-all.o
  CC      sh4eb-softmmu/kvm-stub.o
  CC      ppc64-softmmu/target/ppc/int_helper.o
  CC      sh4eb-softmmu/arch_init.o
  CC      sh4-softmmu/cpu-exec.o
  CC      sh4eb-softmmu/cpus.o
  CC      sh4-softmmu/translate-common.o
  CC      sh4eb-softmmu/monitor.o
  CC      sh4-softmmu/cpu-exec-common.o
  CC      sh4-softmmu/tcg/tcg.o
  CC      sparc64-softmmu/translate-all.o
  CC      ppc64-softmmu/target/ppc/timebase_helper.o
  CC      sparc64-softmmu/cpu-exec.o
  CC      ppc64-softmmu/target/ppc/misc_helper.o
  CC      sh4eb-softmmu/gdbstub.o
  CC      ppc64-softmmu/target/ppc/mem_helper.o
  CC      sparc64-softmmu/translate-common.o
  CC      sh4eb-softmmu/balloon.o
  CC      sh4-softmmu/tcg/tcg-op.o
  CC      ppc64-softmmu/target/ppc/gdbstub.o
  CC      sparc64-softmmu/cpu-exec-common.o
  CC      sh4eb-softmmu/ioport.o
  GEN     trace/generated-helpers.c
  CC      ppc64-softmmu/trace/control-target.o
  CC      sparc64-softmmu/tcg/tcg.o
  CC      sh4eb-softmmu/numa.o
  CC      ppc64-softmmu/gdbstub-xml.o
  CC      ppc64-softmmu/trace/generated-helpers.o
  CC      sh4eb-softmmu/qtest.o
  LINK    ppc64-softmmu/qemu-system-ppc64
  CC      sh4eb-softmmu/bootdevice.o
  CC      sh4eb-softmmu/memory.o
  CC      sparc64-softmmu/tcg/tcg-op.o
  CC      sh4-softmmu/tcg/optimize.o
  CC      sh4eb-softmmu/cputlb.o
  CC      sh4eb-softmmu/memory_mapping.o
  CC      sh4eb-softmmu/dump.o
  CC      sh4-softmmu/tcg/tcg-common.o
  CC      sh4-softmmu/fpu/softfloat.o
  CC      sh4eb-softmmu/migration/ram.o
  CC      sh4eb-softmmu/migration/savevm.o
  CC      sparc64-softmmu/tcg/optimize.o
  CC      sh4eb-softmmu/xen-common-stub.o
  CC      sh4eb-softmmu/xen-hvm-stub.o
  CC      sh4eb-softmmu/hw/9pfs/virtio-9p-device.o
  CC      sparc64-softmmu/tcg/tcg-common.o
  CC      sh4eb-softmmu/hw/block/tc58128.o
  CC      sh4eb-softmmu/hw/block/virtio-blk.o
  CC      sparc64-softmmu/fpu/softfloat.o
  CC      sh4eb-softmmu/hw/block/dataplane/virtio-blk.o
  CC      sh4eb-softmmu/hw/char/sh_serial.o
  CC      sh4eb-softmmu/hw/char/virtio-serial-bus.o
  CC      sh4-softmmu/disas.o
  CC      sh4eb-softmmu/hw/core/nmi.o
  CC      sh4-softmmu/tcg-runtime.o
  CC      sh4eb-softmmu/hw/core/generic-loader.o
  CC      sh4eb-softmmu/hw/core/null-machine.o
  CC      sh4eb-softmmu/hw/cpu/core.o
  CC      sh4-softmmu/hax-stub.o
  CC      sh4eb-softmmu/hw/display/sm501.o
  CC      sh4-softmmu/kvm-stub.o
  CC      sh4eb-softmmu/hw/display/vga.o
  CC      sh4-softmmu/arch_init.o
  CC      sh4-softmmu/cpus.o
  CC      sh4-softmmu/monitor.o
  CC      sh4-softmmu/gdbstub.o
  CC      sparc64-softmmu/disas.o
  CC      sh4eb-softmmu/hw/display/virtio-gpu.o
  CC      sparc64-softmmu/tcg-runtime.o
  CC      sh4-softmmu/balloon.o
  CC      sh4eb-softmmu/hw/display/virtio-gpu-3d.o
  CC      sh4-softmmu/ioport.o
  CC      sparc64-softmmu/hax-stub.o
  CC      sh4-softmmu/numa.o
  CC      sparc64-softmmu/kvm-stub.o
  CC      sh4eb-softmmu/hw/display/virtio-gpu-pci.o
  CC      sh4-softmmu/qtest.o
  CC      sparc64-softmmu/arch_init.o
  CC      sh4-softmmu/bootdevice.o
  CC      sparc64-softmmu/cpus.o
  CC      sh4-softmmu/memory.o
  CC      sh4-softmmu/cputlb.o
  CC      sh4eb-softmmu/hw/intc/sh_intc.o
  CC      sh4eb-softmmu/hw/misc/ivshmem.o
  CC      sparc64-softmmu/monitor.o
  CC      sh4eb-softmmu/hw/misc/edu.o
  CC      sh4-softmmu/memory_mapping.o
  CC      sh4eb-softmmu/hw/net/virtio-net.o
  CC      sh4-softmmu/dump.o
  CC      sh4-softmmu/migration/ram.o
  CC      sparc64-softmmu/gdbstub.o
  CC      sh4eb-softmmu/hw/net/vhost_net.o
  CC      sh4-softmmu/migration/savevm.o
  CC      sh4eb-softmmu/hw/scsi/virtio-scsi.o
  CC      sh4-softmmu/xen-common-stub.o
  CC      sparc64-softmmu/balloon.o
  CC      sh4eb-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      sh4-softmmu/xen-hvm-stub.o
  CC      sh4-softmmu/hw/9pfs/virtio-9p-device.o
  CC      sparc64-softmmu/ioport.o
  CC      sh4eb-softmmu/hw/scsi/vhost-scsi.o
  CC      sh4-softmmu/hw/block/tc58128.o
  CC      sh4-softmmu/hw/block/virtio-blk.o
  CC      sparc64-softmmu/numa.o
  CC      sh4-softmmu/hw/block/dataplane/virtio-blk.o
  CC      sh4eb-softmmu/hw/timer/sh_timer.o
  CC      sh4-softmmu/hw/char/sh_serial.o
  CC      sparc64-softmmu/qtest.o
  CC      sh4eb-softmmu/hw/timer/mc146818rtc.o
  CC      sparc64-softmmu/bootdevice.o
  CC      sh4-softmmu/hw/char/virtio-serial-bus.o
  CC      sparc64-softmmu/memory.o
  CC      sh4eb-softmmu/hw/vfio/common.o
  CC      sh4-softmmu/hw/core/nmi.o
  CC      sh4-softmmu/hw/core/generic-loader.o
  GEN     sparc-softmmu/hmp-commands.h
  CC      sh4-softmmu/hw/core/null-machine.o
  GEN     sparc-softmmu/hmp-commands-info.h
  CC      sh4eb-softmmu/hw/vfio/pci.o
  GEN     sparc-softmmu/config-target.h
  CC      sparc64-softmmu/cputlb.o
  CC      sparc-softmmu/exec.o
  CC      sh4-softmmu/hw/cpu/core.o
  CC      sh4-softmmu/hw/display/sm501.o
  CC      sh4eb-softmmu/hw/vfio/pci-quirks.o
  CC      sh4-softmmu/hw/display/vga.o
  CC      sh4eb-softmmu/hw/vfio/platform.o
  CC      sparc-softmmu/translate-all.o
  CC      sparc64-softmmu/memory_mapping.o
  CC      sh4eb-softmmu/hw/vfio/spapr.o
  CC      sparc64-softmmu/dump.o
  CC      sh4eb-softmmu/hw/virtio/virtio.o
  CC      sh4-softmmu/hw/display/virtio-gpu.o
  CC      sparc-softmmu/cpu-exec.o
  CC      sparc-softmmu/translate-common.o
  CC      sparc64-softmmu/migration/ram.o
  CC      sparc-softmmu/cpu-exec-common.o
  CC      sh4eb-softmmu/hw/virtio/virtio-balloon.o
  CC      sparc-softmmu/tcg/tcg.o
  CC      sh4-softmmu/hw/display/virtio-gpu-3d.o
  CC      sh4eb-softmmu/hw/virtio/vhost.o
  CC      sparc64-softmmu/migration/savevm.o
  CC      sh4-softmmu/hw/display/virtio-gpu-pci.o
  CC      sh4-softmmu/hw/intc/sh_intc.o
  CC      sh4-softmmu/hw/misc/ivshmem.o
  CC      sh4eb-softmmu/hw/virtio/vhost-backend.o
  CC      sparc64-softmmu/xen-common-stub.o
  CC      sh4eb-softmmu/hw/virtio/vhost-user.o
  CC      sh4-softmmu/hw/misc/edu.o
  CC      sparc64-softmmu/xen-hvm-stub.o
  CC      sparc-softmmu/tcg/tcg-op.o
  CC      sparc64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      sh4eb-softmmu/hw/virtio/vhost-vsock.o
  CC      sh4-softmmu/hw/net/virtio-net.o
  CC      sparc64-softmmu/hw/block/virtio-blk.o
  CC      sh4eb-softmmu/hw/virtio/virtio-crypto.o
  CC      sh4eb-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      sh4-softmmu/hw/net/vhost_net.o
  CC      sparc64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      sh4-softmmu/hw/scsi/virtio-scsi.o
  CC      sh4eb-softmmu/hw/sh4/shix.o
  CC      sh4eb-softmmu/hw/sh4/r2d.o
  CC      sh4-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      sparc64-softmmu/hw/char/virtio-serial-bus.o
  CC      sh4-softmmu/hw/scsi/vhost-scsi.o
  CC      sh4eb-softmmu/hw/sh4/sh7750.o
  CC      sparc64-softmmu/hw/core/nmi.o
  CC      sh4-softmmu/hw/timer/sh_timer.o
  CC      sh4eb-softmmu/hw/sh4/sh7750_regnames.o
  CC      sparc-softmmu/tcg/optimize.o
  CC      sparc64-softmmu/hw/core/generic-loader.o
  CC      sh4eb-softmmu/hw/sh4/sh_pci.o
  CC      sh4-softmmu/hw/timer/mc146818rtc.o
  CC      sh4eb-softmmu/target/sh4/translate.o
  CC      sparc64-softmmu/hw/core/null-machine.o
  CC      sh4-softmmu/hw/vfio/common.o
  CC      sparc64-softmmu/hw/cpu/core.o
  CC      sparc-softmmu/tcg/tcg-common.o
  CC      sparc64-softmmu/hw/display/vga.o
  CC      sparc-softmmu/fpu/softfloat.o
  CC      sh4-softmmu/hw/vfio/pci.o
  CC      sparc64-softmmu/hw/display/virtio-gpu.o
  CC      sh4-softmmu/hw/vfio/pci-quirks.o
  CC      sh4eb-softmmu/target/sh4/op_helper.o
  CC      sparc64-softmmu/hw/display/virtio-gpu-3d.o
  CC      sparc-softmmu/disas.o
  CC      sh4eb-softmmu/target/sh4/helper.o
  CC      sparc-softmmu/tcg-runtime.o
  CC      sh4-softmmu/hw/vfio/platform.o
  CC      sparc64-softmmu/hw/display/virtio-gpu-pci.o
  CC      sparc-softmmu/hax-stub.o
  CC      sparc-softmmu/kvm-stub.o
  CC      sh4eb-softmmu/target/sh4/cpu.o
  CC      sh4-softmmu/hw/vfio/spapr.o
  CC      sparc-softmmu/arch_init.o
  CC      sparc64-softmmu/hw/misc/ivshmem.o
  CC      sh4eb-softmmu/target/sh4/monitor.o
  CC      sh4-softmmu/hw/virtio/virtio.o
  CC      sparc-softmmu/cpus.o
  CC      sh4eb-softmmu/target/sh4/gdbstub.o
  CC      sparc64-softmmu/hw/misc/edu.o
  GEN     trace/generated-helpers.c
  CC      sh4eb-softmmu/trace/control-target.o
  CC      sparc-softmmu/monitor.o
  CC      sparc64-softmmu/hw/net/virtio-net.o
  CC      sh4-softmmu/hw/virtio/virtio-balloon.o
  CC      sh4eb-softmmu/trace/generated-helpers.o
  LINK    sh4eb-softmmu/qemu-system-sh4eb
  CC      sh4-softmmu/hw/virtio/vhost.o
  CC      sparc64-softmmu/hw/net/vhost_net.o
  CC      sparc64-softmmu/hw/scsi/virtio-scsi.o
  CC      sparc-softmmu/gdbstub.o
  CC      sh4-softmmu/hw/virtio/vhost-backend.o
  CC      sparc64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      sh4-softmmu/hw/virtio/vhost-user.o
  CC      sparc64-softmmu/hw/scsi/vhost-scsi.o
  CC      sparc-softmmu/balloon.o
  CC      sh4-softmmu/hw/virtio/vhost-vsock.o
  CC      sparc64-softmmu/hw/timer/mc146818rtc.o
  CC      sparc-softmmu/ioport.o
  CC      sh4-softmmu/hw/virtio/virtio-crypto.o
  GEN     tricore-softmmu/hmp-commands.h
  CC      sparc-softmmu/numa.o
  GEN     tricore-softmmu/hmp-commands-info.h
  CC      sparc64-softmmu/hw/vfio/common.o
  GEN     tricore-softmmu/config-target.h
  CC      sh4-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      tricore-softmmu/exec.o
  CC      sparc-softmmu/qtest.o
  CC      sh4-softmmu/hw/sh4/shix.o
  CC      sparc64-softmmu/hw/vfio/pci.o
  CC      sh4-softmmu/hw/sh4/r2d.o
  CC      sparc-softmmu/bootdevice.o
  CC      sh4-softmmu/hw/sh4/sh7750.o
  CC      sparc-softmmu/memory.o
  CC      sh4-softmmu/hw/sh4/sh7750_regnames.o
  CC      sparc64-softmmu/hw/vfio/pci-quirks.o
  CC      sh4-softmmu/hw/sh4/sh_pci.o
  CC      tricore-softmmu/translate-all.o
  CC      sh4-softmmu/target/sh4/translate.o
  CC      sparc64-softmmu/hw/vfio/platform.o
  CC      tricore-softmmu/cpu-exec.o
  CC      sparc-softmmu/cputlb.o
  CC      sparc64-softmmu/hw/vfio/spapr.o
  CC      tricore-softmmu/translate-common.o
  CC      sparc64-softmmu/hw/virtio/virtio.o
  CC      tricore-softmmu/cpu-exec-common.o
  CC      tricore-softmmu/tcg/tcg.o
  CC      sparc64-softmmu/hw/virtio/virtio-balloon.o
  CC      sparc-softmmu/memory_mapping.o
  CC      sh4-softmmu/target/sh4/op_helper.o
  CC      sparc-softmmu/dump.o
  CC      sparc64-softmmu/hw/virtio/vhost.o
  CC      sh4-softmmu/target/sh4/helper.o
  CC      sparc-softmmu/migration/ram.o
  CC      sparc64-softmmu/hw/virtio/vhost-backend.o
  CC      sh4-softmmu/target/sh4/cpu.o
  CC      tricore-softmmu/tcg/tcg-op.o
  CC      sparc64-softmmu/hw/virtio/vhost-user.o
  CC      sh4-softmmu/target/sh4/monitor.o
  CC      sparc64-softmmu/hw/virtio/vhost-vsock.o
  CC      sparc-softmmu/migration/savevm.o
  CC      sparc64-softmmu/hw/virtio/virtio-crypto.o
  CC      sh4-softmmu/target/sh4/gdbstub.o
  CC      sparc64-softmmu/hw/virtio/virtio-crypto-pci.o
  GEN     trace/generated-helpers.c
  CC      sh4-softmmu/trace/control-target.o
  CC      sparc-softmmu/xen-common-stub.o
  CC      sh4-softmmu/trace/generated-helpers.o
  CC      sparc64-softmmu/hw/sparc64/sparc64.o
  CC      sparc-softmmu/xen-hvm-stub.o
  LINK    sh4-softmmu/qemu-system-sh4
  CC      sparc64-softmmu/hw/sparc64/sun4u.o
  CC      sparc-softmmu/hw/core/nmi.o
  CC      sparc64-softmmu/hw/sparc64/niagara.o
  CC      tricore-softmmu/tcg/optimize.o
  CC      sparc-softmmu/hw/core/generic-loader.o
  CC      sparc64-softmmu/target/sparc/machine.o
  CC      sparc64-softmmu/target/sparc/monitor.o
  CC      sparc-softmmu/hw/core/null-machine.o
  CC      sparc64-softmmu/target/sparc/translate.o
  CC      sparc-softmmu/hw/cpu/core.o
  CC      tricore-softmmu/tcg/tcg-common.o
  CC      tricore-softmmu/fpu/softfloat.o
  CC      sparc-softmmu/hw/display/tcx.o
  GEN     unicore32-softmmu/hmp-commands.h
  GEN     unicore32-softmmu/hmp-commands-info.h
  GEN     unicore32-softmmu/config-target.h
  CC      unicore32-softmmu/exec.o
  CC      sparc-softmmu/hw/display/cg3.o
  CC      sparc-softmmu/hw/intc/grlib_irqmp.o
  CC      sparc64-softmmu/target/sparc/helper.o
  CC      sparc-softmmu/hw/misc/eccmemctl.o
  CC      sparc64-softmmu/target/sparc/cpu.o
  CC      unicore32-softmmu/translate-all.o
  CC      sparc-softmmu/hw/misc/slavio_misc.o
  CC      sparc64-softmmu/target/sparc/fop_helper.o
  CC      sparc-softmmu/hw/net/vhost_net.o
  CC      unicore32-softmmu/cpu-exec.o
  CC      tricore-softmmu/disas.o
  CC      sparc64-softmmu/target/sparc/cc_helper.o
  CC      sparc-softmmu/hw/net/rocker/qmp-norocker.o
  CC      tricore-softmmu/tcg-runtime.o
  CC      unicore32-softmmu/translate-common.o
  CC      sparc-softmmu/hw/vfio/common.o
  CC      sparc64-softmmu/target/sparc/win_helper.o
  CC      tricore-softmmu/hax-stub.o
  CC      unicore32-softmmu/cpu-exec-common.o
  CC      sparc64-softmmu/target/sparc/mmu_helper.o
  CC      unicore32-softmmu/tcg/tcg.o
  CC      tricore-softmmu/kvm-stub.o
  CC      sparc-softmmu/hw/vfio/platform.o
  CC      tricore-softmmu/arch_init.o
  CC      sparc64-softmmu/target/sparc/ldst_helper.o
  CC      sparc-softmmu/hw/vfio/spapr.o
  CC      tricore-softmmu/cpus.o
  CC      sparc64-softmmu/target/sparc/int64_helper.o
  CC      sparc-softmmu/hw/sparc/sun4m.o
  CC      sparc64-softmmu/target/sparc/vis_helper.o
  CC      tricore-softmmu/monitor.o
  CC      sparc64-softmmu/target/sparc/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      sparc64-softmmu/trace/control-target.o
  CC      sparc-softmmu/hw/sparc/leon3.o
  CC      sparc64-softmmu/trace/generated-helpers.o
  CC      unicore32-softmmu/tcg/tcg-op.o
  CC      sparc-softmmu/target/sparc/machine.o
  LINK    sparc64-softmmu/qemu-system-sparc64
  CC      sparc-softmmu/target/sparc/monitor.o
  CC      tricore-softmmu/gdbstub.o
  CC      sparc-softmmu/target/sparc/translate.o
  CC      tricore-softmmu/balloon.o
  CC      tricore-softmmu/ioport.o
  CC      tricore-softmmu/numa.o
  CC      unicore32-softmmu/tcg/optimize.o
  CC      sparc-softmmu/target/sparc/helper.o
  GEN     x86_64-softmmu/hmp-commands.h
  GEN     x86_64-softmmu/hmp-commands-info.h
  GEN     x86_64-softmmu/config-target.h
  CC      x86_64-softmmu/exec.o
  CC      sparc-softmmu/target/sparc/cpu.o
  CC      tricore-softmmu/qtest.o
  CC      unicore32-softmmu/tcg/tcg-common.o
  CC      tricore-softmmu/bootdevice.o
  CC      unicore32-softmmu/fpu/softfloat.o
  CC      sparc-softmmu/target/sparc/fop_helper.o
  CC      tricore-softmmu/memory.o
  CC      sparc-softmmu/target/sparc/cc_helper.o
  CC      sparc-softmmu/target/sparc/win_helper.o
  CC      x86_64-softmmu/translate-all.o
  CC      sparc-softmmu/target/sparc/mmu_helper.o
  CC      tricore-softmmu/cputlb.o
  CC      sparc-softmmu/target/sparc/ldst_helper.o
  CC      x86_64-softmmu/cpu-exec.o
  CC      sparc-softmmu/target/sparc/int32_helper.o
  CC      x86_64-softmmu/translate-common.o
  CC      sparc-softmmu/target/sparc/gdbstub.o
  CC      x86_64-softmmu/cpu-exec-common.o
  GEN     trace/generated-helpers.c
  CC      sparc-softmmu/trace/control-target.o
  CC      unicore32-softmmu/disas.o
  CC      x86_64-softmmu/tcg/tcg.o
  CC      sparc-softmmu/trace/generated-helpers.o
  CC      tricore-softmmu/memory_mapping.o
  CC      unicore32-softmmu/tcg-runtime.o
  LINK    sparc-softmmu/qemu-system-sparc
  CC      tricore-softmmu/dump.o
  CC      unicore32-softmmu/hax-stub.o
  CC      unicore32-softmmu/kvm-stub.o
  CC      tricore-softmmu/migration/ram.o
  CC      x86_64-softmmu/tcg/tcg-op.o
  CC      unicore32-softmmu/arch_init.o
  CC      tricore-softmmu/migration/savevm.o
  CC      unicore32-softmmu/cpus.o
  CC      tricore-softmmu/xen-common-stub.o
  CC      unicore32-softmmu/monitor.o
  CC      tricore-softmmu/xen-hvm-stub.o
  CC      unicore32-softmmu/gdbstub.o
  CC      tricore-softmmu/hw/core/nmi.o
  CC      tricore-softmmu/hw/core/generic-loader.o
  CC      unicore32-softmmu/balloon.o
  CC      tricore-softmmu/hw/core/null-machine.o
  CC      tricore-softmmu/hw/cpu/core.o
  CC      tricore-softmmu/hw/net/vhost_net.o
  CC      x86_64-softmmu/tcg/optimize.o
  CC      unicore32-softmmu/ioport.o
  CC      unicore32-softmmu/numa.o
  CC      tricore-softmmu/hw/net/rocker/qmp-norocker.o
  CC      unicore32-softmmu/qtest.o
  CC      tricore-softmmu/hw/vfio/common.o
  CC      unicore32-softmmu/bootdevice.o
  CC      unicore32-softmmu/memory.o
  GEN     xtensaeb-softmmu/hmp-commands.h
  CC      x86_64-softmmu/tcg/tcg-common.o
  GEN     xtensaeb-softmmu/hmp-commands-info.h
  GEN     xtensaeb-softmmu/config-target.h
  CC      tricore-softmmu/hw/vfio/platform.o
  CC      xtensaeb-softmmu/exec.o
  CC      x86_64-softmmu/fpu/softfloat.o
  CC      tricore-softmmu/hw/vfio/spapr.o
  CC      unicore32-softmmu/cputlb.o
  CC      tricore-softmmu/hw/tricore/tricore_testboard.o
  CC      tricore-softmmu/target/tricore/translate.o
  CC      xtensaeb-softmmu/translate-all.o
  CC      unicore32-softmmu/memory_mapping.o
  CC      unicore32-softmmu/dump.o
  CC      xtensaeb-softmmu/cpu-exec.o
  CC      x86_64-softmmu/disas.o
  CC      unicore32-softmmu/migration/ram.o
  CC      xtensaeb-softmmu/translate-common.o
  CC      x86_64-softmmu/tcg-runtime.o
  CC      xtensaeb-softmmu/cpu-exec-common.o
  CC      xtensaeb-softmmu/tcg/tcg.o
  CC      x86_64-softmmu/hax-stub.o
  CC      unicore32-softmmu/migration/savevm.o
  CC      x86_64-softmmu/kvm-stub.o
  CC      unicore32-softmmu/xen-common-stub.o
  CC      x86_64-softmmu/arch_init.o
  CC      x86_64-softmmu/cpus.o
  CC      unicore32-softmmu/xen-hvm-stub.o
  CC      tricore-softmmu/target/tricore/helper.o
  CC      xtensaeb-softmmu/tcg/tcg-op.o
  CC      unicore32-softmmu/hw/core/nmi.o
  CC      tricore-softmmu/target/tricore/cpu.o
  CC      tricore-softmmu/target/tricore/op_helper.o
  CC      unicore32-softmmu/hw/core/generic-loader.o
  CC      x86_64-softmmu/monitor.o
  CC      unicore32-softmmu/hw/core/null-machine.o
  CC      unicore32-softmmu/hw/cpu/core.o
  CC      tricore-softmmu/target/tricore/fpu_helper.o
  CC      unicore32-softmmu/hw/net/vhost_net.o
  GEN     trace/generated-helpers.c
  CC      tricore-softmmu/trace/control-target.o
  CC      unicore32-softmmu/hw/net/rocker/qmp-norocker.o
  CC      x86_64-softmmu/gdbstub.o
  CC      tricore-softmmu/trace/generated-helpers.o
  CC      xtensaeb-softmmu/tcg/optimize.o
  CC      unicore32-softmmu/hw/vfio/common.o
  LINK    tricore-softmmu/qemu-system-tricore
  CC      x86_64-softmmu/balloon.o
  CC      unicore32-softmmu/hw/vfio/platform.o
  CC      xtensaeb-softmmu/tcg/tcg-common.o
  CC      x86_64-softmmu/ioport.o
  CC      xtensaeb-softmmu/fpu/softfloat.o
  CC      unicore32-softmmu/hw/vfio/spapr.o
  CC      x86_64-softmmu/numa.o
  CC      unicore32-softmmu/hw/unicore32/puv3.o
  CC      unicore32-softmmu/target/unicore32/translate.o
  CC      x86_64-softmmu/qtest.o
  CC      x86_64-softmmu/bootdevice.o
  CC      x86_64-softmmu/memory.o
  GEN     xtensa-softmmu/hmp-commands.h
  CC      unicore32-softmmu/target/unicore32/op_helper.o
  GEN     xtensa-softmmu/hmp-commands-info.h
  GEN     xtensa-softmmu/config-target.h
  CC      xtensa-softmmu/exec.o
  CC      xtensaeb-softmmu/disas.o
  CC      unicore32-softmmu/target/unicore32/helper.o
  CC      xtensaeb-softmmu/tcg-runtime.o
  CC      x86_64-softmmu/cputlb.o
  CC      xtensaeb-softmmu/hax-stub.o
  CC      unicore32-softmmu/target/unicore32/cpu.o
  CC      xtensaeb-softmmu/kvm-stub.o
  CC      unicore32-softmmu/target/unicore32/ucf64_helper.o
  CC      xtensaeb-softmmu/arch_init.o
  CC      xtensaeb-softmmu/cpus.o
  CC      unicore32-softmmu/target/unicore32/softmmu.o
  CC      xtensa-softmmu/translate-all.o
  GEN     trace/generated-helpers.c
  CC      x86_64-softmmu/memory_mapping.o
  CC      xtensaeb-softmmu/monitor.o
  CC      unicore32-softmmu/trace/control-target.o
  CC      xtensa-softmmu/cpu-exec.o
  CC      x86_64-softmmu/dump.o
  CC      unicore32-softmmu/trace/generated-helpers.o
  CC      xtensa-softmmu/translate-common.o
  CC      xtensa-softmmu/cpu-exec-common.o
  LINK    unicore32-softmmu/qemu-system-unicore32
  CC      x86_64-softmmu/migration/ram.o
  CC      xtensaeb-softmmu/gdbstub.o
  CC      xtensa-softmmu/tcg/tcg.o
  CC      xtensaeb-softmmu/balloon.o
  CC      x86_64-softmmu/migration/savevm.o
  CC      xtensaeb-softmmu/ioport.o
  CC      xtensaeb-softmmu/numa.o
  CC      x86_64-softmmu/xen-common-stub.o
  GEN     aarch64-linux-user/config-target.h
  CC      aarch64-linux-user/exec.o
  CC      xtensaeb-softmmu/qtest.o
  CC      x86_64-softmmu/xen-hvm-stub.o
  CC      aarch64-linux-user/translate-all.o
  CC      xtensa-softmmu/tcg/tcg-op.o
  CC      x86_64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      xtensaeb-softmmu/bootdevice.o
  CC      x86_64-softmmu/hw/block/virtio-blk.o
  CC      xtensaeb-softmmu/memory.o
  CC      aarch64-linux-user/cpu-exec.o
  CC      x86_64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      aarch64-linux-user/translate-common.o
  CC      aarch64-linux-user/cpu-exec-common.o
  CC      aarch64-linux-user/tcg/tcg.o
  CC      x86_64-softmmu/hw/char/virtio-serial-bus.o
  CC      xtensa-softmmu/tcg/optimize.o
  CC      xtensaeb-softmmu/cputlb.o
  CC      x86_64-softmmu/hw/core/nmi.o
  CC      x86_64-softmmu/hw/core/generic-loader.o
  CC      xtensa-softmmu/tcg/tcg-common.o
  CC      x86_64-softmmu/hw/core/null-machine.o
  CC      xtensa-softmmu/fpu/softfloat.o
  CC      aarch64-linux-user/tcg/tcg-op.o
  CC      xtensaeb-softmmu/memory_mapping.o
  CC      x86_64-softmmu/hw/cpu/core.o
  CC      xtensaeb-softmmu/dump.o
  CC      x86_64-softmmu/hw/display/vga.o
  CC      xtensaeb-softmmu/migration/ram.o
  CC      xtensaeb-softmmu/migration/savevm.o
  CC      xtensa-softmmu/disas.o
  CC      x86_64-softmmu/hw/display/virtio-gpu.o
  CC      xtensa-softmmu/tcg-runtime.o
  CC      xtensa-softmmu/hax-stub.o
  CC      aarch64-linux-user/tcg/optimize.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-3d.o
  CC      xtensa-softmmu/kvm-stub.o
  CC      xtensaeb-softmmu/xen-common-stub.o
  CC      xtensa-softmmu/arch_init.o
  CC      xtensaeb-softmmu/xen-hvm-stub.o
  CC      xtensa-softmmu/cpus.o
  CC      xtensaeb-softmmu/hw/core/nmi.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-pci.o
  CC      xtensaeb-softmmu/hw/core/generic-loader.o
  CC      aarch64-linux-user/tcg/tcg-common.o
  CC      xtensa-softmmu/monitor.o
  CC      xtensaeb-softmmu/hw/core/null-machine.o
  CC      x86_64-softmmu/hw/display/virtio-vga.o
  CC      aarch64-linux-user/fpu/softfloat.o
  CC      xtensaeb-softmmu/hw/cpu/core.o
  CC      x86_64-softmmu/hw/intc/apic.o
  CC      xtensaeb-softmmu/hw/net/vhost_net.o
  CC      x86_64-softmmu/hw/intc/apic_common.o
  CC      xtensa-softmmu/gdbstub.o
  CC      xtensaeb-softmmu/hw/net/rocker/qmp-norocker.o
  CC      xtensaeb-softmmu/hw/vfio/common.o
  CC      x86_64-softmmu/hw/intc/ioapic.o
  CC      xtensa-softmmu/balloon.o
  CC      x86_64-softmmu/hw/isa/lpc_ich9.o
  CC      xtensa-softmmu/ioport.o
  CC      xtensaeb-softmmu/hw/vfio/platform.o
  CC      x86_64-softmmu/hw/misc/vmport.o
  CC      aarch64-linux-user/disas.o
  CC      xtensaeb-softmmu/hw/vfio/spapr.o
  CC      xtensa-softmmu/numa.o
  CC      x86_64-softmmu/hw/misc/ivshmem.o
  CC      aarch64-linux-user/tcg-runtime.o
  CC      xtensaeb-softmmu/hw/xtensa/pic_cpu.o
  CC      xtensa-softmmu/qtest.o
  CC      xtensaeb-softmmu/hw/xtensa/sim.o
  CC      x86_64-softmmu/hw/misc/pvpanic.o
  CC      x86_64-softmmu/hw/misc/edu.o
  CC      xtensa-softmmu/bootdevice.o
  GEN     aarch64-linux-user/gdbstub-xml.c
  CC      xtensaeb-softmmu/hw/xtensa/xtfpga.o
  CC      x86_64-softmmu/hw/net/virtio-net.o
  CC      aarch64-linux-user/hax-stub.o
  CC      xtensa-softmmu/memory.o
  CC      aarch64-linux-user/kvm-stub.o
  CC      xtensaeb-softmmu/target/xtensa/xtensa-semi.o
  CC      aarch64-linux-user/gdbstub.o
  CC      xtensaeb-softmmu/target/xtensa/core-dc232b.o
  CC      x86_64-softmmu/hw/net/vhost_net.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi.o
  CC      xtensaeb-softmmu/target/xtensa/core-dc233c.o
  CC      aarch64-linux-user/thunk.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      xtensa-softmmu/cputlb.o
  CC      xtensaeb-softmmu/target/xtensa/core-fsf.o
  CC      x86_64-softmmu/hw/scsi/vhost-scsi.o
  CC      aarch64-linux-user/user-exec.o
  CC      xtensaeb-softmmu/target/xtensa/monitor.o
  CC      aarch64-linux-user/user-exec-stub.o
  CC      x86_64-softmmu/hw/timer/mc146818rtc.o
  CC      aarch64-linux-user/linux-user/main.o
  CC      xtensaeb-softmmu/target/xtensa/translate.o
  CC      x86_64-softmmu/hw/vfio/common.o
  CC      aarch64-linux-user/linux-user/syscall.o
  CC      x86_64-softmmu/hw/vfio/pci.o
  CC      xtensa-softmmu/memory_mapping.o
  CC      xtensa-softmmu/dump.o
  CC      xtensaeb-softmmu/target/xtensa/op_helper.o
  CC      x86_64-softmmu/hw/vfio/pci-quirks.o
  CC      xtensa-softmmu/migration/ram.o
  CC      xtensaeb-softmmu/target/xtensa/helper.o
  CC      x86_64-softmmu/hw/vfio/platform.o
  CC      x86_64-softmmu/hw/vfio/spapr.o
  CC      xtensaeb-softmmu/target/xtensa/cpu.o
  CC      x86_64-softmmu/hw/virtio/virtio.o
  CC      xtensa-softmmu/migration/savevm.o
  CC      xtensaeb-softmmu/target/xtensa/gdbstub.o
  CC      aarch64-linux-user/linux-user/strace.o
  GEN     trace/generated-helpers.c
  CC      xtensaeb-softmmu/trace/control-target.o
  CC      xtensa-softmmu/xen-common-stub.o
  CC      xtensaeb-softmmu/trace/generated-helpers.o
  CC      x86_64-softmmu/hw/virtio/virtio-balloon.o
  CC      xtensa-softmmu/xen-hvm-stub.o
  CC      aarch64-linux-user/linux-user/mmap.o
  LINK    xtensaeb-softmmu/qemu-system-xtensaeb
  CC      xtensa-softmmu/hw/core/nmi.o
  CC      x86_64-softmmu/hw/virtio/vhost.o
  CC      xtensa-softmmu/hw/core/generic-loader.o
  CC      aarch64-linux-user/linux-user/signal.o
  CC      x86_64-softmmu/hw/virtio/vhost-backend.o
  CC      xtensa-softmmu/hw/core/null-machine.o
  CC      aarch64-linux-user/linux-user/elfload.o
  CC      x86_64-softmmu/hw/virtio/vhost-user.o
  CC      xtensa-softmmu/hw/cpu/core.o
  CC      xtensa-softmmu/hw/net/vhost_net.o
  CC      x86_64-softmmu/hw/virtio/vhost-vsock.o
  GEN     alpha-linux-user/config-target.h
  CC      alpha-linux-user/exec.o
  CC      xtensa-softmmu/hw/net/rocker/qmp-norocker.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-linux-user/linux-user/linuxload.o
  CC      xtensa-softmmu/hw/vfio/common.o
  CC      alpha-linux-user/translate-all.o
  CC      aarch64-linux-user/linux-user/uaccess.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      xtensa-softmmu/hw/vfio/platform.o
  CC      aarch64-linux-user/linux-user/uname.o
  CC      alpha-linux-user/cpu-exec.o
  CC      x86_64-softmmu/hw/i386/multiboot.o
  CC      xtensa-softmmu/hw/vfio/spapr.o
  CCAS    aarch64-linux-user/linux-user/safe-syscall.o
  CC      x86_64-softmmu/hw/i386/pc.o
  CC      alpha-linux-user/translate-common.o
  CC      aarch64-linux-user/linux-user/flatload.o
  CC      xtensa-softmmu/hw/xtensa/pic_cpu.o
  CC      alpha-linux-user/cpu-exec-common.o
  CC      xtensa-softmmu/hw/xtensa/sim.o
  CC      aarch64-linux-user/target/arm/arm-semi.o
  CC      xtensa-softmmu/hw/xtensa/xtfpga.o
  CC      alpha-linux-user/tcg/tcg.o
  CC      xtensa-softmmu/target/xtensa/xtensa-semi.o
  CC      x86_64-softmmu/hw/i386/pc_piix.o
  CC      aarch64-linux-user/target/arm/kvm-stub.o
  CC      xtensa-softmmu/target/xtensa/core-dc232b.o
  CC      xtensa-softmmu/target/xtensa/core-dc233c.o
  CC      x86_64-softmmu/hw/i386/pc_q35.o
  CC      aarch64-linux-user/target/arm/translate.o
  CC      xtensa-softmmu/target/xtensa/core-fsf.o
  CC      x86_64-softmmu/hw/i386/pc_sysfw.o
  CC      x86_64-softmmu/hw/i386/x86-iommu.o
  CC      xtensa-softmmu/target/xtensa/monitor.o
  CC      x86_64-softmmu/hw/i386/intel_iommu.o
  CC      alpha-linux-user/tcg/tcg-op.o
  CC      xtensa-softmmu/target/xtensa/translate.o
  CC      x86_64-softmmu/hw/i386/amd_iommu.o
  CC      xtensa-softmmu/target/xtensa/op_helper.o
  CC      x86_64-softmmu/hw/i386/kvmvapic.o
  CC      alpha-linux-user/tcg/optimize.o
  CC      xtensa-softmmu/target/xtensa/helper.o
  CC      x86_64-softmmu/hw/i386/acpi-build.o
  CC      xtensa-softmmu/target/xtensa/cpu.o
  CC      alpha-linux-user/tcg/tcg-common.o
  CC      xtensa-softmmu/target/xtensa/gdbstub.o
  CC      x86_64-softmmu/hw/i386/pci-assign-load-rom.o
  CC      alpha-linux-user/fpu/softfloat.o
  GEN     trace/generated-helpers.c
  CC      xtensa-softmmu/trace/control-target.o
  CC      x86_64-softmmu/target/i386/translate.o
  CC      xtensa-softmmu/trace/generated-helpers.o
  LINK    xtensa-softmmu/qemu-system-xtensa
  CC      aarch64-linux-user/target/arm/op_helper.o
  CC      aarch64-linux-user/target/arm/helper.o
  CC      alpha-linux-user/disas.o
  CC      aarch64-linux-user/target/arm/cpu.o
  CC      alpha-linux-user/tcg-runtime.o
  CC      aarch64-linux-user/target/arm/neon_helper.o
  CC      alpha-linux-user/hax-stub.o
  GEN     armeb-linux-user/config-target.h
  CC      armeb-linux-user/exec.o
  CC      alpha-linux-user/kvm-stub.o
  CC      armeb-linux-user/translate-all.o
  CC      aarch64-linux-user/target/arm/iwmmxt_helper.o
  CC      alpha-linux-user/gdbstub.o
  CC      armeb-linux-user/cpu-exec.o
  CC      aarch64-linux-user/target/arm/gdbstub.o
  CC      alpha-linux-user/thunk.o
  CC      aarch64-linux-user/target/arm/cpu64.o
  CC      armeb-linux-user/translate-common.o
  CC      alpha-linux-user/user-exec.o
  CC      armeb-linux-user/cpu-exec-common.o
  CC      x86_64-softmmu/target/i386/helper.o
  CC      aarch64-linux-user/target/arm/translate-a64.o
  CC      armeb-linux-user/tcg/tcg.o
  CC      alpha-linux-user/user-exec-stub.o
  CC      alpha-linux-user/linux-user/main.o
  CC      x86_64-softmmu/target/i386/cpu.o
  CC      alpha-linux-user/linux-user/syscall.o
  CC      x86_64-softmmu/target/i386/bpt_helper.o
  CC      armeb-linux-user/tcg/tcg-op.o
  CC      x86_64-softmmu/target/i386/excp_helper.o
  CC      x86_64-softmmu/target/i386/fpu_helper.o
  CC      aarch64-linux-user/target/arm/helper-a64.o
  CC      alpha-linux-user/linux-user/strace.o
  CC      aarch64-linux-user/target/arm/gdbstub64.o
  CC      alpha-linux-user/linux-user/mmap.o
  CC      aarch64-linux-user/target/arm/crypto_helper.o
  CC      armeb-linux-user/tcg/optimize.o
  CC      alpha-linux-user/linux-user/signal.o
  GEN     trace/generated-helpers.c
  CC      aarch64-linux-user/trace/control-target.o
  CC      x86_64-softmmu/target/i386/cc_helper.o
  CC      aarch64-linux-user/gdbstub-xml.o
  CC      alpha-linux-user/linux-user/elfload.o
  CC      armeb-linux-user/tcg/tcg-common.o
  CC      aarch64-linux-user/trace/generated-helpers.o
  CC      x86_64-softmmu/target/i386/int_helper.o
  CC      armeb-linux-user/fpu/softfloat.o
  CC      alpha-linux-user/linux-user/linuxload.o
  LINK    aarch64-linux-user/qemu-aarch64
  CC      x86_64-softmmu/target/i386/svm_helper.o
  CC      alpha-linux-user/linux-user/uaccess.o
  CC      armeb-linux-user/disas.o
  CC      alpha-linux-user/linux-user/uname.o
  CC      x86_64-softmmu/target/i386/smm_helper.o
  CCAS    alpha-linux-user/linux-user/safe-syscall.o
  CC      alpha-linux-user/target/alpha/translate.o
  CC      armeb-linux-user/tcg-runtime.o
  CC      x86_64-softmmu/target/i386/misc_helper.o
  CC      x86_64-softmmu/target/i386/mem_helper.o
  CC      alpha-linux-user/target/alpha/helper.o
  CC      alpha-linux-user/target/alpha/cpu.o
  CC      x86_64-softmmu/target/i386/seg_helper.o
  GEN     armeb-linux-user/gdbstub-xml.c
  CC      armeb-linux-user/hax-stub.o
  GEN     arm-linux-user/config-target.h
  CC      alpha-linux-user/target/alpha/int_helper.o
  CC      arm-linux-user/exec.o
  CC      arm-linux-user/translate-all.o
  CC      armeb-linux-user/kvm-stub.o
  CC      alpha-linux-user/target/alpha/fpu_helper.o
  CC      armeb-linux-user/gdbstub.o
  CC      arm-linux-user/cpu-exec.o
  CC      alpha-linux-user/target/alpha/vax_helper.o
  CC      alpha-linux-user/target/alpha/sys_helper.o
  CC      arm-linux-user/translate-common.o
  CC      armeb-linux-user/thunk.o
  CC      alpha-linux-user/target/alpha/mem_helper.o
  CC      arm-linux-user/cpu-exec-common.o
  CC      alpha-linux-user/target/alpha/gdbstub.o
  CC      armeb-linux-user/user-exec.o
  CC      arm-linux-user/tcg/tcg.o
  GEN     trace/generated-helpers.c
  CC      x86_64-softmmu/target/i386/mpx_helper.o
  CC      alpha-linux-user/trace/control-target.o
  CC      armeb-linux-user/user-exec-stub.o
  CC      alpha-linux-user/trace/generated-helpers.o
  CC      armeb-linux-user/linux-user/main.o
  CC      x86_64-softmmu/target/i386/gdbstub.o
  LINK    alpha-linux-user/qemu-alpha
  CC      x86_64-softmmu/target/i386/machine.o
  CC      armeb-linux-user/linux-user/syscall.o
  CC      armeb-linux-user/linux-user/strace.o
  CC      x86_64-softmmu/target/i386/arch_memory_mapping.o
  CC      x86_64-softmmu/target/i386/arch_dump.o
  CC      arm-linux-user/tcg/tcg-op.o
  CC      x86_64-softmmu/target/i386/monitor.o
  GEN     cris-linux-user/config-target.h
  CC      cris-linux-user/exec.o
  CC      x86_64-softmmu/target/i386/kvm-stub.o
  CC      cris-linux-user/translate-all.o
  GEN     trace/generated-helpers.c
  CC      x86_64-softmmu/trace/control-target.o
  CC      cris-linux-user/cpu-exec.o
  CC      x86_64-softmmu/trace/generated-helpers.o
  CC      cris-linux-user/translate-common.o
  LINK    x86_64-softmmu/qemu-system-x86_64
  CC      cris-linux-user/cpu-exec-common.o
  CC      arm-linux-user/tcg/optimize.o
  CC      cris-linux-user/tcg/tcg.o
  CC      armeb-linux-user/linux-user/mmap.o
  CC      armeb-linux-user/linux-user/signal.o
  CC      arm-linux-user/tcg/tcg-common.o
  CC      arm-linux-user/fpu/softfloat.o
  GEN     hppa-linux-user/config-target.h
  CC      hppa-linux-user/exec.o
  CC      cris-linux-user/tcg/tcg-op.o
  CC      armeb-linux-user/linux-user/elfload.o
  CC      hppa-linux-user/translate-all.o
  CC      armeb-linux-user/linux-user/linuxload.o
  CC      hppa-linux-user/cpu-exec.o
  CC      hppa-linux-user/translate-common.o
  CC      armeb-linux-user/linux-user/uaccess.o
  CC      hppa-linux-user/cpu-exec-common.o
  CC      hppa-linux-user/tcg/tcg.o
  CC      armeb-linux-user/linux-user/uname.o
  CCAS    armeb-linux-user/linux-user/safe-syscall.o
  CC      armeb-linux-user/linux-user/flatload.o
  CC      arm-linux-user/disas.o
  CC      arm-linux-user/tcg-runtime.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11.o
  CC      cris-linux-user/tcg/optimize.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11_cpdo.o
  GEN     arm-linux-user/gdbstub-xml.c
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11_cpdt.o
  CC      cris-linux-user/tcg/tcg-common.o
  CC      hppa-linux-user/tcg/tcg-op.o
  CC      arm-linux-user/hax-stub.o
  CC      cris-linux-user/fpu/softfloat.o
  CC      arm-linux-user/kvm-stub.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11_cprt.o
  CC      arm-linux-user/gdbstub.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpopcode.o
  CC      arm-linux-user/thunk.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/single_cpdo.o
  CC      arm-linux-user/user-exec.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/double_cpdo.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/extended_cpdo.o
  CC      arm-linux-user/user-exec-stub.o
  CC      armeb-linux-user/target/arm/arm-semi.o
  CC      hppa-linux-user/tcg/optimize.o
  CC      arm-linux-user/linux-user/main.o
  CC      cris-linux-user/disas.o
  CC      cris-linux-user/tcg-runtime.o
  CC      armeb-linux-user/target/arm/kvm-stub.o
  CC      armeb-linux-user/target/arm/translate.o
  CC      arm-linux-user/linux-user/syscall.o
  CC      hppa-linux-user/tcg/tcg-common.o
  CC      cris-linux-user/hax-stub.o
  CC      hppa-linux-user/fpu/softfloat.o
  CC      cris-linux-user/kvm-stub.o
  CC      cris-linux-user/gdbstub.o
  CC      cris-linux-user/thunk.o
  CC      cris-linux-user/user-exec.o
  CC      hppa-linux-user/disas.o
  CC      cris-linux-user/user-exec-stub.o
  CC      cris-linux-user/linux-user/main.o
  CC      hppa-linux-user/tcg-runtime.o
  CC      cris-linux-user/linux-user/syscall.o
  CC      arm-linux-user/linux-user/strace.o
  CC      hppa-linux-user/hax-stub.o
  CC      hppa-linux-user/kvm-stub.o
  CC      hppa-linux-user/gdbstub.o
  CC      armeb-linux-user/target/arm/op_helper.o
  CC      arm-linux-user/linux-user/mmap.o
  CC      hppa-linux-user/thunk.o
  CC      armeb-linux-user/target/arm/helper.o
  CC      arm-linux-user/linux-user/signal.o
  CC      hppa-linux-user/user-exec.o
  CC      arm-linux-user/linux-user/elfload.o
  CC      hppa-linux-user/user-exec-stub.o
  CC      hppa-linux-user/linux-user/main.o
  CC      hppa-linux-user/linux-user/syscall.o
  CC      armeb-linux-user/target/arm/cpu.o
  CC      arm-linux-user/linux-user/linuxload.o
  CC      arm-linux-user/linux-user/uaccess.o
  CC      armeb-linux-user/target/arm/neon_helper.o
  CC      cris-linux-user/linux-user/strace.o
  CC      arm-linux-user/linux-user/uname.o
  CCAS    arm-linux-user/linux-user/safe-syscall.o
  CC      arm-linux-user/linux-user/flatload.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11_cpdo.o
  CC      cris-linux-user/linux-user/mmap.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11_cpdt.o
  CC      armeb-linux-user/target/arm/iwmmxt_helper.o
  CC      cris-linux-user/linux-user/signal.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11_cprt.o
  CC      cris-linux-user/linux-user/elfload.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpopcode.o
  CC      armeb-linux-user/target/arm/gdbstub.o
  CC      arm-linux-user/linux-user/arm/nwfpe/single_cpdo.o
  CC      arm-linux-user/linux-user/arm/nwfpe/double_cpdo.o
  CC      cris-linux-user/linux-user/linuxload.o
  CC      armeb-linux-user/target/arm/crypto_helper.o
  CC      hppa-linux-user/linux-user/strace.o
  CC      arm-linux-user/linux-user/arm/nwfpe/extended_cpdo.o
  CC      cris-linux-user/linux-user/uaccess.o
  GEN     trace/generated-helpers.c
  CC      armeb-linux-user/trace/control-target.o
  CC      cris-linux-user/linux-user/uname.o
  CC      arm-linux-user/target/arm/arm-semi.o
  CC      armeb-linux-user/gdbstub-xml.o
  CC      hppa-linux-user/linux-user/mmap.o
  CCAS    cris-linux-user/linux-user/safe-syscall.o
  CC      cris-linux-user/target/cris/translate.o
  CC      armeb-linux-user/trace/generated-helpers.o
  CC      arm-linux-user/target/arm/kvm-stub.o
  CC      hppa-linux-user/linux-user/signal.o
  LINK    armeb-linux-user/qemu-armeb
  CC      arm-linux-user/target/arm/translate.o
  CC      arm-linux-user/target/arm/op_helper.o
  CC      hppa-linux-user/linux-user/elfload.o
  CC      hppa-linux-user/linux-user/linuxload.o
  CC      hppa-linux-user/linux-user/uaccess.o
  CC      hppa-linux-user/linux-user/uname.o
  CCAS    hppa-linux-user/linux-user/safe-syscall.o
  CC      arm-linux-user/target/arm/helper.o
  CC      hppa-linux-user/target/hppa/translate.o
  CC      cris-linux-user/target/cris/op_helper.o
  CC      cris-linux-user/target/cris/helper.o
  CC      cris-linux-user/target/cris/cpu.o
  CC      hppa-linux-user/target/hppa/helper.o
  CC      cris-linux-user/target/cris/gdbstub.o
  CC      hppa-linux-user/target/hppa/cpu.o
  CC      hppa-linux-user/target/hppa/op_helper.o
  GEN     trace/generated-helpers.c
  CC      cris-linux-user/trace/control-target.o
  CC      hppa-linux-user/target/hppa/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      cris-linux-user/trace/generated-helpers.o
  CC      hppa-linux-user/trace/control-target.o
  CC      hppa-linux-user/trace/generated-helpers.o
  LINK    cris-linux-user/qemu-cris
  CC      arm-linux-user/target/arm/cpu.o
  LINK    hppa-linux-user/qemu-hppa
  GEN     i386-linux-user/config-target.h
  CC      i386-linux-user/exec.o
  CC      arm-linux-user/target/arm/neon_helper.o
  GEN     m68k-linux-user/config-target.h
  CC      m68k-linux-user/exec.o
  CC      i386-linux-user/translate-all.o
  GEN     microblazeel-linux-user/config-target.h
  CC      m68k-linux-user/translate-all.o
  CC      microblazeel-linux-user/exec.o
  CC      i386-linux-user/cpu-exec.o
  CC      m68k-linux-user/cpu-exec.o
  CC      microblazeel-linux-user/translate-all.o
  CC      arm-linux-user/target/arm/iwmmxt_helper.o
  CC      m68k-linux-user/translate-common.o
  CC      i386-linux-user/translate-common.o
  CC      m68k-linux-user/cpu-exec-common.o
  CC      i386-linux-user/cpu-exec-common.o
  CC      m68k-linux-user/tcg/tcg.o
  CC      microblazeel-linux-user/cpu-exec.o
  CC      i386-linux-user/tcg/tcg.o
  CC      arm-linux-user/target/arm/gdbstub.o
  CC      arm-linux-user/target/arm/crypto_helper.o
  CC      microblazeel-linux-user/translate-common.o
  GEN     trace/generated-helpers.c
  CC      arm-linux-user/trace/control-target.o
  CC      microblazeel-linux-user/cpu-exec-common.o
  CC      arm-linux-user/gdbstub-xml.o
  CC      microblazeel-linux-user/tcg/tcg.o
  CC      arm-linux-user/trace/generated-helpers.o
  CC      m68k-linux-user/tcg/tcg-op.o
  CC      i386-linux-user/tcg/tcg-op.o
  LINK    arm-linux-user/qemu-arm
  CC      m68k-linux-user/tcg/optimize.o
  CC      microblazeel-linux-user/tcg/tcg-op.o
  CC      m68k-linux-user/tcg/tcg-common.o
  CC      m68k-linux-user/fpu/softfloat.o
  GEN     microblaze-linux-user/config-target.h
  CC      i386-linux-user/tcg/optimize.o
  CC      microblaze-linux-user/exec.o
  CC      microblaze-linux-user/translate-all.o
  CC      i386-linux-user/tcg/tcg-common.o
  CC      i386-linux-user/fpu/softfloat.o
  CC      microblaze-linux-user/cpu-exec.o
  CC      microblazeel-linux-user/tcg/optimize.o
  CC      microblaze-linux-user/translate-common.o
  CC      microblaze-linux-user/cpu-exec-common.o
  CC      microblaze-linux-user/tcg/tcg.o
  CC      m68k-linux-user/disas.o
  CC      microblazeel-linux-user/tcg/tcg-common.o
  CC      microblazeel-linux-user/fpu/softfloat.o
  CC      m68k-linux-user/tcg-runtime.o
  GEN     m68k-linux-user/gdbstub-xml.c
  CC      microblaze-linux-user/tcg/tcg-op.o
  CC      i386-linux-user/disas.o
  CC      m68k-linux-user/hax-stub.o
  CC      i386-linux-user/tcg-runtime.o
  CC      m68k-linux-user/kvm-stub.o
  CC      i386-linux-user/hax-stub.o
  CC      m68k-linux-user/gdbstub.o
  CC      i386-linux-user/kvm-stub.o
  CC      microblazeel-linux-user/disas.o
  CC      i386-linux-user/gdbstub.o
  CC      m68k-linux-user/thunk.o
  CC      microblazeel-linux-user/tcg-runtime.o
  CC      m68k-linux-user/user-exec.o
  CC      i386-linux-user/thunk.o
  CC      microblaze-linux-user/tcg/optimize.o
  CC      m68k-linux-user/user-exec-stub.o
  CC      i386-linux-user/user-exec.o
  CC      microblazeel-linux-user/hax-stub.o
  CC      m68k-linux-user/linux-user/main.o
  CC      microblazeel-linux-user/kvm-stub.o
  CC      i386-linux-user/user-exec-stub.o
  CC      m68k-linux-user/linux-user/syscall.o
  CC      microblazeel-linux-user/gdbstub.o
  CC      i386-linux-user/linux-user/main.o
  CC      microblaze-linux-user/tcg/tcg-common.o
  CC      microblaze-linux-user/fpu/softfloat.o
  CC      microblazeel-linux-user/thunk.o
  CC      i386-linux-user/linux-user/syscall.o
  CC      microblazeel-linux-user/user-exec.o
  CC      microblazeel-linux-user/user-exec-stub.o
  CC      microblazeel-linux-user/linux-user/main.o
  CC      microblazeel-linux-user/linux-user/syscall.o
  CC      microblaze-linux-user/disas.o
  CC      microblaze-linux-user/tcg-runtime.o
  CC      m68k-linux-user/linux-user/strace.o
  CC      microblaze-linux-user/hax-stub.o
  CC      microblaze-linux-user/kvm-stub.o
  CC      i386-linux-user/linux-user/strace.o
  CC      m68k-linux-user/linux-user/mmap.o
  CC      microblaze-linux-user/gdbstub.o
  CC      m68k-linux-user/linux-user/signal.o
  CC      i386-linux-user/linux-user/mmap.o
  CC      i386-linux-user/linux-user/signal.o
  CC      m68k-linux-user/linux-user/elfload.o
  CC      microblaze-linux-user/thunk.o
  CC      i386-linux-user/linux-user/elfload.o
  CC      m68k-linux-user/linux-user/linuxload.o
  CC      microblaze-linux-user/user-exec.o
  CC      m68k-linux-user/linux-user/uaccess.o
  CC      microblazeel-linux-user/linux-user/strace.o
  CC      microblaze-linux-user/user-exec-stub.o
  CC      microblaze-linux-user/linux-user/main.o
  CC      i386-linux-user/linux-user/linuxload.o
  CC      m68k-linux-user/linux-user/uname.o
  CC      i386-linux-user/linux-user/uaccess.o
  CC      microblazeel-linux-user/linux-user/mmap.o
  CC      microblaze-linux-user/linux-user/syscall.o
  CCAS    m68k-linux-user/linux-user/safe-syscall.o
  CC      i386-linux-user/linux-user/uname.o
  CC      m68k-linux-user/linux-user/flatload.o
  CCAS    i386-linux-user/linux-user/safe-syscall.o
  CC      microblazeel-linux-user/linux-user/signal.o
  CC      i386-linux-user/linux-user/vm86.o
  CC      m68k-linux-user/linux-user/m68k-sim.o
  CC      microblazeel-linux-user/linux-user/elfload.o
  CC      m68k-linux-user/target/m68k/m68k-semi.o
  CC      i386-linux-user/target/i386/translate.o
  CC      m68k-linux-user/target/m68k/translate.o
  CC      microblazeel-linux-user/linux-user/linuxload.o
  CC      microblazeel-linux-user/linux-user/uaccess.o
  CC      microblazeel-linux-user/linux-user/uname.o
  CCAS    microblazeel-linux-user/linux-user/safe-syscall.o
  CC      microblazeel-linux-user/linux-user/flatload.o
  CC      m68k-linux-user/target/m68k/op_helper.o
  CC      microblaze-linux-user/linux-user/strace.o
  CC      microblazeel-linux-user/target/microblaze/translate.o
  CC      m68k-linux-user/target/m68k/helper.o
  CC      m68k-linux-user/target/m68k/cpu.o
  CC      microblaze-linux-user/linux-user/mmap.o
  CC      m68k-linux-user/target/m68k/gdbstub.o
  CC      microblaze-linux-user/linux-user/signal.o
  GEN     trace/generated-helpers.c
  CC      microblazeel-linux-user/target/microblaze/op_helper.o
  CC      m68k-linux-user/trace/control-target.o
  CC      m68k-linux-user/gdbstub-xml.o
  CC      microblazeel-linux-user/target/microblaze/helper.o
  CC      microblaze-linux-user/linux-user/elfload.o
  CC      m68k-linux-user/trace/generated-helpers.o
  CC      microblazeel-linux-user/target/microblaze/cpu.o
  LINK    m68k-linux-user/qemu-m68k
  CC      i386-linux-user/target/i386/helper.o
  CC      i386-linux-user/target/i386/cpu.o
  CC      microblazeel-linux-user/target/microblaze/gdbstub.o
  CC      microblaze-linux-user/linux-user/linuxload.o
  GEN     trace/generated-helpers.c
  CC      microblazeel-linux-user/trace/control-target.o
  CC      microblaze-linux-user/linux-user/uaccess.o
  CC      microblazeel-linux-user/trace/generated-helpers.o
  CC      microblaze-linux-user/linux-user/uname.o
  CC      i386-linux-user/target/i386/bpt_helper.o
  LINK    microblazeel-linux-user/qemu-microblazeel
  GEN     mips64el-linux-user/config-target.h
  CC      mips64el-linux-user/exec.o
  CCAS    microblaze-linux-user/linux-user/safe-syscall.o
  CC      i386-linux-user/target/i386/excp_helper.o
  CC      microblaze-linux-user/linux-user/flatload.o
  CC      i386-linux-user/target/i386/fpu_helper.o
  CC      i386-linux-user/target/i386/cc_helper.o
  CC      mips64el-linux-user/translate-all.o
  CC      microblaze-linux-user/target/microblaze/translate.o
  CC      i386-linux-user/target/i386/int_helper.o
  CC      i386-linux-user/target/i386/svm_helper.o
  CC      mips64el-linux-user/cpu-exec.o
  CC      i386-linux-user/target/i386/smm_helper.o
  CC      microblaze-linux-user/target/microblaze/op_helper.o
  CC      mips64el-linux-user/translate-common.o
  CC      i386-linux-user/target/i386/misc_helper.o
  CC      mips64el-linux-user/cpu-exec-common.o
  CC      microblaze-linux-user/target/microblaze/helper.o
  CC      microblaze-linux-user/target/microblaze/cpu.o
  CC      mips64el-linux-user/tcg/tcg.o
  CC      i386-linux-user/target/i386/mem_helper.o
  CC      i386-linux-user/target/i386/seg_helper.o
  CC      microblaze-linux-user/target/microblaze/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      i386-linux-user/target/i386/mpx_helper.o
  CC      microblaze-linux-user/trace/control-target.o
  CC      microblaze-linux-user/trace/generated-helpers.o
  LINK    microblaze-linux-user/qemu-microblaze
  GEN     mips64-linux-user/config-target.h
  CC      i386-linux-user/target/i386/gdbstub.o
  CC      mips64-linux-user/exec.o
  CC      mips64el-linux-user/tcg/tcg-op.o
  CC      mips64-linux-user/translate-all.o
  GEN     mipsel-linux-user/config-target.h
  CC      mipsel-linux-user/exec.o
  CC      i386-linux-user/target/i386/kvm-stub.o
  GEN     trace/generated-helpers.c
  CC      i386-linux-user/trace/control-target.o
  CC      mipsel-linux-user/translate-all.o
  CC      mips64-linux-user/cpu-exec.o
  CC      i386-linux-user/trace/generated-helpers.o
  CC      mips64-linux-user/translate-common.o
  CC      mipsel-linux-user/cpu-exec.o
  LINK    i386-linux-user/qemu-i386
  CC      mips64-linux-user/cpu-exec-common.o
  CC      mipsel-linux-user/translate-common.o
  CC      mips64-linux-user/tcg/tcg.o
  GEN     mips-linux-user/config-target.h
  CC      mipsel-linux-user/cpu-exec-common.o
  CC      mips-linux-user/exec.o
  CC      mipsel-linux-user/tcg/tcg.o
  CC      mips-linux-user/translate-all.o
  CC      mips-linux-user/cpu-exec.o
  CC      mips64el-linux-user/tcg/optimize.o
  CC      mips-linux-user/translate-common.o
  CC      mips-linux-user/cpu-exec-common.o
  CC      mips64-linux-user/tcg/tcg-op.o
  CC      mips64el-linux-user/tcg/tcg-common.o
  CC      mips-linux-user/tcg/tcg.o
  CC      mipsel-linux-user/tcg/tcg-op.o
  CC      mips64el-linux-user/fpu/softfloat.o
  CC      mips64-linux-user/tcg/optimize.o
  CC      mips-linux-user/tcg/tcg-op.o
  CC      mips64el-linux-user/disas.o
  CC      mipsel-linux-user/tcg/optimize.o
  CC      mips64el-linux-user/tcg-runtime.o
  CC      mips64-linux-user/tcg/tcg-common.o
  CC      mips64el-linux-user/hax-stub.o
  CC      mipsel-linux-user/tcg/tcg-common.o
  CC      mips64-linux-user/fpu/softfloat.o
  CC      mips64el-linux-user/kvm-stub.o
  CC      mipsel-linux-user/fpu/softfloat.o
  CC      mips64el-linux-user/gdbstub.o
  CC      mips-linux-user/tcg/optimize.o
  CC      mips64el-linux-user/thunk.o
  CC      mips64el-linux-user/user-exec.o
  CC      mips64el-linux-user/user-exec-stub.o
  CC      mips-linux-user/tcg/tcg-common.o
  CC      mips64el-linux-user/linux-user/main.o
  CC      mips-linux-user/fpu/softfloat.o
  CC      mips64el-linux-user/linux-user/syscall.o
  CC      mips64-linux-user/disas.o
  CC      mips64-linux-user/tcg-runtime.o
  CC      mipsel-linux-user/disas.o
  CC      mipsel-linux-user/tcg-runtime.o
  CC      mips64-linux-user/hax-stub.o
  CC      mips64-linux-user/kvm-stub.o
  CC      mipsel-linux-user/hax-stub.o
  CC      mips64-linux-user/gdbstub.o
  CC      mipsel-linux-user/kvm-stub.o
  CC      mips64-linux-user/thunk.o
  CC      mips-linux-user/disas.o
  CC      mipsel-linux-user/gdbstub.o
  CC      mips64-linux-user/user-exec.o
  CC      mips-linux-user/tcg-runtime.o
  CC      mips64el-linux-user/linux-user/strace.o
  CC      mips64-linux-user/user-exec-stub.o
  CC      mips64-linux-user/linux-user/main.o
  CC      mipsel-linux-user/thunk.o
  CC      mips-linux-user/hax-stub.o
  CC      mipsel-linux-user/user-exec.o
  CC      mips-linux-user/kvm-stub.o
  CC      mips64el-linux-user/linux-user/mmap.o
  CC      mips64-linux-user/linux-user/syscall.o
  CC      mips-linux-user/gdbstub.o
  CC      mipsel-linux-user/user-exec-stub.o
  CC      mips64el-linux-user/linux-user/signal.o
  CC      mipsel-linux-user/linux-user/main.o
  CC      mips64el-linux-user/linux-user/elfload.o
  CC      mips-linux-user/thunk.o
  CC      mipsel-linux-user/linux-user/syscall.o
  CC      mips-linux-user/user-exec.o
  CC      mips64el-linux-user/linux-user/linuxload.o
  CC      mips64el-linux-user/linux-user/uaccess.o
  CC      mips-linux-user/user-exec-stub.o
  CC      mips64el-linux-user/linux-user/uname.o
  CC      mips-linux-user/linux-user/main.o
  CCAS    mips64el-linux-user/linux-user/safe-syscall.o
  CC      mips-linux-user/linux-user/syscall.o
  CC      mips64el-linux-user/target/mips/translate.o
  CC      mips64-linux-user/linux-user/strace.o
  CC      mips64-linux-user/linux-user/mmap.o
  CC      mipsel-linux-user/linux-user/strace.o
  CC      mips64-linux-user/linux-user/signal.o
  CC      mips64-linux-user/linux-user/elfload.o
  CC      mipsel-linux-user/linux-user/mmap.o
  CC      mips-linux-user/linux-user/strace.o
  CC      mips64-linux-user/linux-user/linuxload.o
  CC      mipsel-linux-user/linux-user/signal.o
  CC      mips64-linux-user/linux-user/uaccess.o
  CC      mips-linux-user/linux-user/mmap.o
  CC      mipsel-linux-user/linux-user/elfload.o
  CC      mips64-linux-user/linux-user/uname.o
  CC      mips-linux-user/linux-user/signal.o
  CCAS    mips64-linux-user/linux-user/safe-syscall.o
  CC      mips64-linux-user/target/mips/translate.o
  CC      mipsel-linux-user/linux-user/linuxload.o
  CC      mipsel-linux-user/linux-user/uaccess.o
  CC      mips-linux-user/linux-user/elfload.o
  CC      mipsel-linux-user/linux-user/uname.o
  CCAS    mipsel-linux-user/linux-user/safe-syscall.o
  CC      mips-linux-user/linux-user/linuxload.o
  CC      mipsel-linux-user/target/mips/translate.o
  CC      mips-linux-user/linux-user/uaccess.o
  CC      mips64el-linux-user/target/mips/dsp_helper.o
  CC      mips-linux-user/linux-user/uname.o
  CCAS    mips-linux-user/linux-user/safe-syscall.o
  CC      mips-linux-user/target/mips/translate.o
  CC      mips64el-linux-user/target/mips/op_helper.o
  CC      mips64-linux-user/target/mips/dsp_helper.o
  CC      mips64el-linux-user/target/mips/lmi_helper.o
  CC      mips64-linux-user/target/mips/op_helper.o
  CC      mips64el-linux-user/target/mips/helper.o
  CC      mips-linux-user/target/mips/dsp_helper.o
  CC      mips64el-linux-user/target/mips/cpu.o
  CC      mipsel-linux-user/target/mips/dsp_helper.o
  CC      mips64el-linux-user/target/mips/gdbstub.o
  CC      mips64el-linux-user/target/mips/msa_helper.o
  CC      mips-linux-user/target/mips/op_helper.o
  CC      mipsel-linux-user/target/mips/op_helper.o
  CC      mips64-linux-user/target/mips/lmi_helper.o
  CC      mips64-linux-user/target/mips/helper.o
  CC      mips64-linux-user/target/mips/cpu.o
  CC      mips64-linux-user/target/mips/gdbstub.o
  CC      mipsel-linux-user/target/mips/lmi_helper.o
  CC      mips64-linux-user/target/mips/msa_helper.o
  CC      mipsel-linux-user/target/mips/helper.o
  CC      mips-linux-user/target/mips/lmi_helper.o
  CC      mipsel-linux-user/target/mips/cpu.o
  CC      mips-linux-user/target/mips/helper.o
  CC      mipsel-linux-user/target/mips/gdbstub.o
  CC      mips-linux-user/target/mips/cpu.o
  CC      mips64el-linux-user/target/mips/mips-semi.o
  CC      mipsel-linux-user/target/mips/msa_helper.o
  CC      mips-linux-user/target/mips/gdbstub.o
  CC      mips-linux-user/target/mips/msa_helper.o
  GEN     trace/generated-helpers.c
  CC      mips64el-linux-user/trace/control-target.o
  CC      mips64el-linux-user/trace/generated-helpers.o
  CC      mips64-linux-user/target/mips/mips-semi.o
  LINK    mips64el-linux-user/qemu-mips64el
  GEN     trace/generated-helpers.c
  CC      mips64-linux-user/trace/control-target.o
  CC      mips64-linux-user/trace/generated-helpers.o
  LINK    mips64-linux-user/qemu-mips64
  GEN     mipsn32el-linux-user/config-target.h
  CC      mipsn32el-linux-user/exec.o
  CC      mipsn32el-linux-user/translate-all.o
  CC      mipsel-linux-user/target/mips/mips-semi.o
  GEN     mipsn32-linux-user/config-target.h
  CC      mipsn32-linux-user/exec.o
  CC      mips-linux-user/target/mips/mips-semi.o
  GEN     trace/generated-helpers.c
  CC      mipsel-linux-user/trace/control-target.o
  CC      mipsn32el-linux-user/cpu-exec.o
  CC      mipsn32-linux-user/translate-all.o
  GEN     trace/generated-helpers.c
  CC      mips-linux-user/trace/control-target.o
  CC      mipsel-linux-user/trace/generated-helpers.o
  CC      mipsn32el-linux-user/translate-common.o
  CC      mipsn32-linux-user/cpu-exec.o
  CC      mips-linux-user/trace/generated-helpers.o
  CC      mipsn32el-linux-user/cpu-exec-common.o
  LINK    mipsel-linux-user/qemu-mipsel
  CC      mipsn32-linux-user/translate-common.o
  CC      mipsn32el-linux-user/tcg/tcg.o
  LINK    mips-linux-user/qemu-mips
  CC      mipsn32-linux-user/cpu-exec-common.o
  CC      mipsn32-linux-user/tcg/tcg.o
  GEN     nios2-linux-user/config-target.h
  CC      mipsn32-linux-user/tcg/tcg-op.o
  CC      nios2-linux-user/exec.o
  CC      nios2-linux-user/translate-all.o
  CC      mipsn32el-linux-user/tcg/tcg-op.o
  CC      nios2-linux-user/cpu-exec.o
  CC      nios2-linux-user/translate-common.o
  CC      mipsn32-linux-user/tcg/optimize.o
  CC      mipsn32-linux-user/tcg/tcg-common.o
  CC      nios2-linux-user/cpu-exec-common.o
  CC      mipsn32-linux-user/fpu/softfloat.o
  CC      nios2-linux-user/tcg/tcg.o
  CC      mipsn32-linux-user/disas.o
  CC      mipsn32-linux-user/tcg-runtime.o
  CC      mipsn32el-linux-user/tcg/optimize.o
  CC      mipsn32-linux-user/hax-stub.o
  CC      mipsn32-linux-user/kvm-stub.o
  CC      nios2-linux-user/tcg/tcg-op.o
  CC      nios2-linux-user/tcg/optimize.o
  CC      nios2-linux-user/tcg/tcg-common.o
  CC      mipsn32el-linux-user/tcg/tcg-common.o
  CC      nios2-linux-user/fpu/softfloat.o
  CC      mipsn32el-linux-user/fpu/softfloat.o
  CC      mipsn32-linux-user/gdbstub.o
  CC      mipsn32-linux-user/thunk.o
  CC      mipsn32-linux-user/user-exec.o
  GEN     or1k-linux-user/config-target.h
  CC      or1k-linux-user/exec.o
  CC      or1k-linux-user/translate-all.o
  CC      mipsn32-linux-user/user-exec-stub.o
  CC      mipsn32-linux-user/linux-user/main.o
  CC      mipsn32-linux-user/linux-user/syscall.o
  CC      or1k-linux-user/cpu-exec.o
  CC      mipsn32el-linux-user/disas.o
  CC      or1k-linux-user/translate-common.o
  CC      nios2-linux-user/disas.o
  CC      mipsn32el-linux-user/tcg-runtime.o
  CC      or1k-linux-user/cpu-exec-common.o
  CC      nios2-linux-user/tcg-runtime.o
  CC      mipsn32el-linux-user/hax-stub.o
  CC      or1k-linux-user/tcg/tcg.o
  CC      mipsn32el-linux-user/kvm-stub.o
  CC      nios2-linux-user/hax-stub.o
  CC      nios2-linux-user/kvm-stub.o
  CC      mipsn32el-linux-user/gdbstub.o
  CC      nios2-linux-user/gdbstub.o
  CC      mipsn32el-linux-user/thunk.o
  CC      or1k-linux-user/tcg/tcg-op.o
  CC      mipsn32el-linux-user/user-exec.o
  CC      nios2-linux-user/thunk.o
  CC      mipsn32-linux-user/linux-user/strace.o
  CC      nios2-linux-user/user-exec.o
  CC      mipsn32el-linux-user/user-exec-stub.o
  CC      nios2-linux-user/user-exec-stub.o
  CC      mipsn32el-linux-user/linux-user/main.o
  CC      nios2-linux-user/linux-user/main.o
  CC      mipsn32-linux-user/linux-user/mmap.o
  CC      nios2-linux-user/linux-user/syscall.o
  CC      mipsn32el-linux-user/linux-user/syscall.o
  CC      mipsn32-linux-user/linux-user/signal.o
  CC      mipsn32-linux-user/linux-user/elfload.o
  CC      or1k-linux-user/tcg/optimize.o
  CC      mipsn32-linux-user/linux-user/linuxload.o
  CC      or1k-linux-user/tcg/tcg-common.o
  CC      mipsn32-linux-user/linux-user/uaccess.o
  CC      or1k-linux-user/fpu/softfloat.o
  CC      mipsn32-linux-user/linux-user/uname.o
  CCAS    mipsn32-linux-user/linux-user/safe-syscall.o
  CC      nios2-linux-user/linux-user/strace.o
  CC      mipsn32-linux-user/target/mips/translate.o
  CC      nios2-linux-user/linux-user/mmap.o
  CC      mipsn32el-linux-user/linux-user/strace.o
  CC      nios2-linux-user/linux-user/signal.o
  CC      mipsn32el-linux-user/linux-user/mmap.o
  CC      or1k-linux-user/disas.o
  CC      nios2-linux-user/linux-user/elfload.o
  CC      or1k-linux-user/tcg-runtime.o
  CC      mipsn32el-linux-user/linux-user/signal.o
  CC      nios2-linux-user/linux-user/linuxload.o
  CC      mipsn32el-linux-user/linux-user/elfload.o
  CC      or1k-linux-user/hax-stub.o
  CC      nios2-linux-user/linux-user/uaccess.o
  CC      or1k-linux-user/kvm-stub.o
  CC      nios2-linux-user/linux-user/uname.o
  CC      or1k-linux-user/gdbstub.o
  CC      mipsn32el-linux-user/linux-user/linuxload.o
  CCAS    nios2-linux-user/linux-user/safe-syscall.o
  CC      nios2-linux-user/target/nios2/translate.o
  CC      or1k-linux-user/thunk.o
  CC      mipsn32el-linux-user/linux-user/uaccess.o
  CC      or1k-linux-user/user-exec.o
  CC      mipsn32el-linux-user/linux-user/uname.o
  CC      nios2-linux-user/target/nios2/op_helper.o
  CCAS    mipsn32el-linux-user/linux-user/safe-syscall.o
  CC      or1k-linux-user/user-exec-stub.o
  CC      nios2-linux-user/target/nios2/helper.o
  CC      mipsn32el-linux-user/target/mips/translate.o
  CC      nios2-linux-user/target/nios2/cpu.o
  CC      or1k-linux-user/linux-user/main.o
  CC      nios2-linux-user/target/nios2/mmu.o
  GEN     trace/generated-helpers.c
  CC      nios2-linux-user/trace/control-target.o
  CC      or1k-linux-user/linux-user/syscall.o
  CC      nios2-linux-user/trace/generated-helpers.o
  CC      mipsn32-linux-user/target/mips/dsp_helper.o
  LINK    nios2-linux-user/qemu-nios2
  CC      mipsn32el-linux-user/target/mips/dsp_helper.o
  CC      mipsn32-linux-user/target/mips/op_helper.o
  GEN     ppc64abi32-linux-user/config-target.h
  CC      ppc64abi32-linux-user/exec.o
  CC      ppc64abi32-linux-user/translate-all.o
  CC      or1k-linux-user/linux-user/strace.o
  CC      mipsn32-linux-user/target/mips/lmi_helper.o
  CC      or1k-linux-user/linux-user/mmap.o
  CC      ppc64abi32-linux-user/cpu-exec.o
  CC      mipsn32-linux-user/target/mips/helper.o
  CC      ppc64abi32-linux-user/translate-common.o
  CC      mipsn32-linux-user/target/mips/cpu.o
  CC      or1k-linux-user/linux-user/signal.o
  CC      ppc64abi32-linux-user/cpu-exec-common.o
  CC      mipsn32el-linux-user/target/mips/op_helper.o
  CC      mipsn32-linux-user/target/mips/gdbstub.o
  CC      ppc64abi32-linux-user/tcg/tcg.o
  CC      mipsn32-linux-user/target/mips/msa_helper.o
  CC      or1k-linux-user/linux-user/elfload.o
  CC      or1k-linux-user/linux-user/linuxload.o
  CC      or1k-linux-user/linux-user/uaccess.o
  CC      or1k-linux-user/linux-user/uname.o
  CCAS    or1k-linux-user/linux-user/safe-syscall.o
  CC      ppc64abi32-linux-user/tcg/tcg-op.o
  CC      or1k-linux-user/target/openrisc/cpu.o
  CC      mipsn32el-linux-user/target/mips/lmi_helper.o
  CC      or1k-linux-user/target/openrisc/exception.o
  CC      mipsn32-linux-user/target/mips/mips-semi.o
  CC      mipsn32el-linux-user/target/mips/helper.o
  CC      or1k-linux-user/target/openrisc/interrupt.o
  GEN     trace/generated-helpers.c
  CC      mipsn32el-linux-user/target/mips/cpu.o
  CC      mipsn32-linux-user/trace/control-target.o
  CC      or1k-linux-user/target/openrisc/mmu.o
  CC      mipsn32-linux-user/trace/generated-helpers.o
  CC      mipsn32el-linux-user/target/mips/gdbstub.o
  CC      or1k-linux-user/target/openrisc/translate.o
  CC      mipsn32el-linux-user/target/mips/msa_helper.o
  LINK    mipsn32-linux-user/qemu-mipsn32
  CC      or1k-linux-user/target/openrisc/exception_helper.o
  CC      ppc64abi32-linux-user/tcg/optimize.o
  CC      or1k-linux-user/target/openrisc/fpu_helper.o
  CC      or1k-linux-user/target/openrisc/interrupt_helper.o
  CC      or1k-linux-user/target/openrisc/mmu_helper.o
  GEN     ppc64le-linux-user/config-target.h
  CC      ppc64le-linux-user/exec.o
  CC      ppc64le-linux-user/translate-all.o
  CC      or1k-linux-user/target/openrisc/sys_helper.o
  CC      or1k-linux-user/target/openrisc/gdbstub.o
  CC      ppc64le-linux-user/cpu-exec.o
  CC      ppc64abi32-linux-user/tcg/tcg-common.o
  GEN     trace/generated-helpers.c
  CC      ppc64abi32-linux-user/fpu/softfloat.o
  CC      ppc64le-linux-user/translate-common.o
  CC      or1k-linux-user/trace/control-target.o
  CC      ppc64le-linux-user/cpu-exec-common.o
  CC      or1k-linux-user/trace/generated-helpers.o
  CC      ppc64le-linux-user/tcg/tcg.o
  LINK    or1k-linux-user/qemu-or1k
  CC      ppc64abi32-linux-user/disas.o
  CC      mipsn32el-linux-user/target/mips/mips-semi.o
  GEN     trace/generated-helpers.c
  CC      mipsn32el-linux-user/trace/control-target.o
  GEN     ppc64-linux-user/config-target.h
  CC      ppc64-linux-user/exec.o
  CC      mipsn32el-linux-user/trace/generated-helpers.o
  CC      ppc64-linux-user/translate-all.o
  LINK    mipsn32el-linux-user/qemu-mipsn32el
  CC      ppc64abi32-linux-user/tcg-runtime.o
  CC      ppc64le-linux-user/tcg/tcg-op.o
  CC      ppc64-linux-user/cpu-exec.o
  GEN     ppc64abi32-linux-user/gdbstub-xml.c
  CC      ppc64abi32-linux-user/hax-stub.o
  CC      ppc64-linux-user/translate-common.o
  CC      ppc64abi32-linux-user/kvm-stub.o
  CC      ppc64abi32-linux-user/libdecnumber/decContext.o
  CC      ppc64-linux-user/cpu-exec-common.o
  CC      ppc64-linux-user/tcg/tcg.o
  CC      ppc64abi32-linux-user/libdecnumber/decNumber.o
  CC      ppc64-linux-user/tcg/tcg-op.o
  CC      ppc64le-linux-user/tcg/optimize.o
  CC      ppc64abi32-linux-user/libdecnumber/dpd/decimal32.o
  CC      ppc64abi32-linux-user/libdecnumber/dpd/decimal64.o
  CC      ppc64le-linux-user/tcg/tcg-common.o
  CC      ppc64-linux-user/tcg/optimize.o
  CC      ppc64abi32-linux-user/libdecnumber/dpd/decimal128.o
  CC      ppc64le-linux-user/fpu/softfloat.o
  CC      ppc64abi32-linux-user/gdbstub.o
  CC      ppc64-linux-user/tcg/tcg-common.o
  CC      ppc64abi32-linux-user/thunk.o
  CC      ppc64-linux-user/fpu/softfloat.o
  CC      ppc64-linux-user/disas.o
  CC      ppc64abi32-linux-user/user-exec.o
  CC      ppc64le-linux-user/disas.o
  CC      ppc64abi32-linux-user/user-exec-stub.o
  CC      ppc64le-linux-user/tcg-runtime.o
  CC      ppc64abi32-linux-user/linux-user/main.o
  CC      ppc64abi32-linux-user/linux-user/syscall.o
  GEN     ppc64le-linux-user/gdbstub-xml.c
  GEN     ppc-linux-user/config-target.h
  CC      ppc-linux-user/exec.o
  CC      ppc64-linux-user/tcg-runtime.o
  CC      ppc-linux-user/translate-all.o
  CC      ppc64le-linux-user/hax-stub.o
  CC      ppc64le-linux-user/kvm-stub.o
  CC      ppc-linux-user/cpu-exec.o
  GEN     ppc64-linux-user/gdbstub-xml.c
  CC      ppc64-linux-user/hax-stub.o
  CC      ppc64le-linux-user/libdecnumber/decContext.o
  CC      ppc64le-linux-user/libdecnumber/decNumber.o
  CC      ppc64-linux-user/kvm-stub.o
  CC      ppc-linux-user/translate-common.o
  CC      ppc64-linux-user/libdecnumber/decContext.o
  CC      ppc-linux-user/cpu-exec-common.o
  CC      ppc64-linux-user/libdecnumber/decNumber.o
  CC      ppc-linux-user/tcg/tcg.o
  CC      ppc64le-linux-user/libdecnumber/dpd/decimal32.o
  CC      ppc64le-linux-user/libdecnumber/dpd/decimal64.o
  CC      ppc64le-linux-user/libdecnumber/dpd/decimal128.o
  CC      ppc64abi32-linux-user/linux-user/strace.o
  CC      ppc64-linux-user/libdecnumber/dpd/decimal32.o
  CC      ppc64le-linux-user/gdbstub.o
  CC      ppc-linux-user/tcg/tcg-op.o
  CC      ppc64-linux-user/libdecnumber/dpd/decimal64.o
  CC      ppc64abi32-linux-user/linux-user/mmap.o
  CC      ppc64le-linux-user/thunk.o
  CC      ppc64-linux-user/libdecnumber/dpd/decimal128.o
  CC      ppc64abi32-linux-user/linux-user/signal.o
  CC      ppc64-linux-user/gdbstub.o
  CC      ppc64le-linux-user/user-exec.o
  CC      ppc64le-linux-user/user-exec-stub.o
  CC      ppc64abi32-linux-user/linux-user/elfload.o
  CC      ppc64-linux-user/thunk.o
  CC      ppc64le-linux-user/linux-user/main.o
  CC      ppc64-linux-user/user-exec.o
  CC      ppc64abi32-linux-user/linux-user/linuxload.o
  CC      ppc64le-linux-user/linux-user/syscall.o
  CC      ppc64-linux-user/user-exec-stub.o
  CC      ppc-linux-user/tcg/optimize.o
  CC      ppc64abi32-linux-user/linux-user/uaccess.o
  CC      ppc64-linux-user/linux-user/main.o
  CC      ppc64abi32-linux-user/linux-user/uname.o
  CCAS    ppc64abi32-linux-user/linux-user/safe-syscall.o
  CC      ppc64abi32-linux-user/target/ppc/cpu-models.o
  CC      ppc-linux-user/tcg/tcg-common.o
  CC      ppc64-linux-user/linux-user/syscall.o
  CC      ppc-linux-user/fpu/softfloat.o
  CC      ppc64abi32-linux-user/target/ppc/translate.o
  CC      ppc64le-linux-user/linux-user/strace.o
  CC      ppc-linux-user/disas.o
  CC      ppc64le-linux-user/linux-user/mmap.o
  CC      ppc-linux-user/tcg-runtime.o
  CC      ppc64le-linux-user/linux-user/signal.o
  GEN     ppc-linux-user/gdbstub-xml.c
  CC      ppc64-linux-user/linux-user/strace.o
  CC      ppc64le-linux-user/linux-user/elfload.o
  CC      ppc-linux-user/hax-stub.o
  CC      ppc64-linux-user/linux-user/mmap.o
  CC      ppc64le-linux-user/linux-user/linuxload.o
  CC      ppc-linux-user/kvm-stub.o
  CC      ppc64-linux-user/linux-user/signal.o
  CC      ppc64le-linux-user/linux-user/uaccess.o
  CC      ppc-linux-user/libdecnumber/decContext.o
  CC      ppc64le-linux-user/linux-user/uname.o
  CC      ppc-linux-user/libdecnumber/decNumber.o
  CC      ppc64-linux-user/linux-user/elfload.o
  CCAS    ppc64le-linux-user/linux-user/safe-syscall.o
  CC      ppc64le-linux-user/target/ppc/cpu-models.o
  CC      ppc64-linux-user/linux-user/linuxload.o
  CC      ppc64-linux-user/linux-user/uaccess.o
  CC      ppc64-linux-user/linux-user/uname.o
  CC      ppc-linux-user/libdecnumber/dpd/decimal32.o
  CC      ppc64le-linux-user/target/ppc/translate.o
  CC      ppc-linux-user/libdecnumber/dpd/decimal64.o
  CCAS    ppc64-linux-user/linux-user/safe-syscall.o
  CC      ppc-linux-user/libdecnumber/dpd/decimal128.o
  CC      ppc64-linux-user/target/ppc/cpu-models.o
  CC      ppc-linux-user/gdbstub.o
  CC      ppc-linux-user/thunk.o
  CC      ppc64-linux-user/target/ppc/translate.o
  CC      ppc-linux-user/user-exec.o
  CC      ppc-linux-user/user-exec-stub.o
  CC      ppc-linux-user/linux-user/main.o
  CC      ppc-linux-user/linux-user/syscall.o
  CC      ppc64abi32-linux-user/target/ppc/kvm-stub.o
  CC      ppc64abi32-linux-user/target/ppc/dfp_helper.o
  CC      ppc64abi32-linux-user/target/ppc/excp_helper.o
  CC      ppc64abi32-linux-user/target/ppc/fpu_helper.o
  CC      ppc-linux-user/linux-user/strace.o
  CC      ppc-linux-user/linux-user/mmap.o
  CC      ppc-linux-user/linux-user/signal.o
  CC      ppc-linux-user/linux-user/elfload.o
  CC      ppc64abi32-linux-user/target/ppc/int_helper.o
  CC      ppc-linux-user/linux-user/linuxload.o
  CC      ppc-linux-user/linux-user/uaccess.o
  CC      ppc-linux-user/linux-user/uname.o
  CC      ppc64le-linux-user/target/ppc/kvm-stub.o
  CCAS    ppc-linux-user/linux-user/safe-syscall.o
  CC      ppc64le-linux-user/target/ppc/dfp_helper.o
  CC      ppc-linux-user/target/ppc/cpu-models.o
  CC      ppc64abi32-linux-user/target/ppc/timebase_helper.o
  CC      ppc64abi32-linux-user/target/ppc/misc_helper.o
  CC      ppc64abi32-linux-user/target/ppc/mem_helper.o
  CC      ppc64-linux-user/target/ppc/kvm-stub.o
  CC      ppc64le-linux-user/target/ppc/excp_helper.o
  CC      ppc64-linux-user/target/ppc/dfp_helper.o
  CC      ppc64abi32-linux-user/target/ppc/user_only_helper.o
  CC      ppc64le-linux-user/target/ppc/fpu_helper.o
  CC      ppc-linux-user/target/ppc/translate.o
  CC      ppc64-linux-user/target/ppc/excp_helper.o
  CC      ppc64abi32-linux-user/target/ppc/gdbstub.o
  CC      ppc64-linux-user/target/ppc/fpu_helper.o
  GEN     trace/generated-helpers.c
  CC      ppc64abi32-linux-user/trace/control-target.o
  CC      ppc64abi32-linux-user/gdbstub-xml.o
  CC      ppc64abi32-linux-user/trace/generated-helpers.o
  LINK    ppc64abi32-linux-user/qemu-ppc64abi32
  CC      ppc64-linux-user/target/ppc/int_helper.o
  CC      ppc64le-linux-user/target/ppc/int_helper.o
  CC      ppc64-linux-user/target/ppc/timebase_helper.o
  CC      s390x-linux-user/gen-features
  GEN     s390x-linux-user/config-target.h
  GEN     s390x-linux-user/gen-features.h
  CC      ppc64-linux-user/target/ppc/misc_helper.o
  CC      s390x-linux-user/exec.o
  CC      s390x-linux-user/translate-all.o
  CC      ppc64-linux-user/target/ppc/mem_helper.o
  CC      ppc64le-linux-user/target/ppc/timebase_helper.o
  CC      s390x-linux-user/cpu-exec.o
  CC      ppc64le-linux-user/target/ppc/misc_helper.o
  CC      ppc64-linux-user/target/ppc/user_only_helper.o
  CC      s390x-linux-user/translate-common.o
  CC      ppc64-linux-user/target/ppc/gdbstub.o
  CC      ppc64le-linux-user/target/ppc/mem_helper.o
  CC      s390x-linux-user/cpu-exec-common.o
  GEN     trace/generated-helpers.c
  CC      ppc64-linux-user/trace/control-target.o
  CC      ppc64le-linux-user/target/ppc/user_only_helper.o
  CC      s390x-linux-user/tcg/tcg.o
  CC      ppc64-linux-user/gdbstub-xml.o
  CC      ppc64le-linux-user/target/ppc/gdbstub.o
  CC      ppc64-linux-user/trace/generated-helpers.o
  GEN     trace/generated-helpers.c
  CC      ppc64le-linux-user/trace/control-target.o
  LINK    ppc64-linux-user/qemu-ppc64
  CC      ppc64le-linux-user/gdbstub-xml.o
  CC      ppc64le-linux-user/trace/generated-helpers.o
  CC      s390x-linux-user/tcg/tcg-op.o
  GEN     sh4eb-linux-user/config-target.h
  CC      sh4eb-linux-user/exec.o
  LINK    ppc64le-linux-user/qemu-ppc64le
  CC      sh4eb-linux-user/translate-all.o
  CC      s390x-linux-user/tcg/optimize.o
  CC      sh4eb-linux-user/cpu-exec.o
  CC      sh4eb-linux-user/translate-common.o
  CC      ppc-linux-user/target/ppc/kvm-stub.o
  CC      sh4eb-linux-user/cpu-exec-common.o
  CC      s390x-linux-user/tcg/tcg-common.o
  CC      sh4eb-linux-user/tcg/tcg.o
  CC      ppc-linux-user/target/ppc/dfp_helper.o
  CC      sh4eb-linux-user/tcg/tcg-op.o
  CC      s390x-linux-user/fpu/softfloat.o
  CC      ppc-linux-user/target/ppc/excp_helper.o
  CC      sh4eb-linux-user/tcg/optimize.o
  CC      ppc-linux-user/target/ppc/fpu_helper.o
  CC      sh4eb-linux-user/tcg/tcg-common.o
  CC      sh4eb-linux-user/fpu/softfloat.o
  CC      sh4eb-linux-user/disas.o
  CC      s390x-linux-user/disas.o
  CC      sh4eb-linux-user/tcg-runtime.o
  CC      s390x-linux-user/tcg-runtime.o
  GEN     s390x-linux-user/gdbstub-xml.c
  CC      sh4eb-linux-user/hax-stub.o
  CC      sh4eb-linux-user/kvm-stub.o
  CC      sh4eb-linux-user/gdbstub.o
  CC      s390x-linux-user/hax-stub.o
  CC      sh4eb-linux-user/thunk.o
  CC      s390x-linux-user/kvm-stub.o
  CC      sh4eb-linux-user/user-exec.o
  CC      ppc-linux-user/target/ppc/int_helper.o
  CC      s390x-linux-user/gdbstub.o
  CC      sh4eb-linux-user/user-exec-stub.o
  CC      sh4eb-linux-user/linux-user/main.o
  CC      sh4eb-linux-user/linux-user/syscall.o
  CC      s390x-linux-user/thunk.o
  CC      sh4eb-linux-user/linux-user/strace.o
  CC      s390x-linux-user/user-exec.o
  CC      sh4eb-linux-user/linux-user/mmap.o
  CC      s390x-linux-user/user-exec-stub.o
  CC      s390x-linux-user/linux-user/main.o
  CC      sh4eb-linux-user/linux-user/signal.o
  CC      ppc-linux-user/target/ppc/timebase_helper.o
  CC      ppc-linux-user/target/ppc/misc_helper.o
  CC      ppc-linux-user/target/ppc/mem_helper.o
  CC      s390x-linux-user/linux-user/syscall.o
  CC      ppc-linux-user/target/ppc/user_only_helper.o
  GEN     sh4-linux-user/config-target.h
  CC      ppc-linux-user/target/ppc/gdbstub.o
  CC      sh4-linux-user/exec.o
  CC      sh4-linux-user/translate-all.o
  GEN     trace/generated-helpers.c
  CC      ppc-linux-user/trace/control-target.o
  CC      sh4-linux-user/cpu-exec.o
  CC      ppc-linux-user/gdbstub-xml.o
  CC      sh4-linux-user/translate-common.o
  CC      ppc-linux-user/trace/generated-helpers.o
  CC      sh4-linux-user/cpu-exec-common.o
  CC      sh4-linux-user/tcg/tcg.o
  LINK    ppc-linux-user/qemu-ppc
  CC      sh4-linux-user/tcg/tcg-op.o
  CC      sh4eb-linux-user/linux-user/elfload.o
  CC      sh4eb-linux-user/linux-user/linuxload.o
  CC      sh4-linux-user/tcg/optimize.o
  CC      s390x-linux-user/linux-user/strace.o
  CC      sh4eb-linux-user/linux-user/uaccess.o
  CC      sh4eb-linux-user/linux-user/uname.o
  CC      s390x-linux-user/linux-user/mmap.o
  CCAS    sh4eb-linux-user/linux-user/safe-syscall.o
  CC      sh4eb-linux-user/linux-user/flatload.o
  CC      s390x-linux-user/linux-user/signal.o
  CC      sh4-linux-user/tcg/tcg-common.o
  GEN     sparc32plus-linux-user/config-target.h
  CC      sparc32plus-linux-user/exec.o
  CC      sh4-linux-user/fpu/softfloat.o
  CC      sh4eb-linux-user/target/sh4/translate.o
  CC      sparc32plus-linux-user/translate-all.o
  CC      s390x-linux-user/linux-user/elfload.o
  CC      sparc32plus-linux-user/cpu-exec.o
  CC      s390x-linux-user/linux-user/linuxload.o
  CC      sparc32plus-linux-user/translate-common.o
  CC      s390x-linux-user/linux-user/uaccess.o
  CC      sparc32plus-linux-user/cpu-exec-common.o
  CC      s390x-linux-user/linux-user/uname.o
  CC      sparc32plus-linux-user/tcg/tcg.o
  CCAS    s390x-linux-user/linux-user/safe-syscall.o
  CC      s390x-linux-user/target/s390x/translate.o
  CC      sh4eb-linux-user/target/sh4/op_helper.o
  CC      sh4eb-linux-user/target/sh4/helper.o
  CC      sh4-linux-user/disas.o
  CC      sh4eb-linux-user/target/sh4/cpu.o
  CC      sh4-linux-user/tcg-runtime.o
  CC      sh4eb-linux-user/target/sh4/gdbstub.o
  CC      sparc32plus-linux-user/tcg/tcg-op.o
  GEN     trace/generated-helpers.c
  CC      sh4eb-linux-user/trace/control-target.o
  CC      sh4-linux-user/hax-stub.o
  CC      sh4eb-linux-user/trace/generated-helpers.o
  CC      sh4-linux-user/kvm-stub.o
  CC      s390x-linux-user/target/s390x/helper.o
  CC      sh4-linux-user/gdbstub.o
  LINK    sh4eb-linux-user/qemu-sh4eb
  CC      s390x-linux-user/target/s390x/cpu.o
  CC      sh4-linux-user/thunk.o
  CC      sh4-linux-user/user-exec.o
  CC      s390x-linux-user/target/s390x/interrupt.o
  CC      sh4-linux-user/user-exec-stub.o
  CC      sh4-linux-user/linux-user/main.o
  CC      sh4-linux-user/linux-user/syscall.o
  CC      s390x-linux-user/target/s390x/int_helper.o
  CC      sparc32plus-linux-user/tcg/optimize.o
  CC      s390x-linux-user/target/s390x/fpu_helper.o
  CC      sh4-linux-user/linux-user/strace.o
  CC      s390x-linux-user/target/s390x/cc_helper.o
  CC      sparc32plus-linux-user/tcg/tcg-common.o
  CC      sh4-linux-user/linux-user/mmap.o
  CC      s390x-linux-user/target/s390x/mem_helper.o
  CC      sparc32plus-linux-user/fpu/softfloat.o
  CC      sh4-linux-user/linux-user/signal.o
  CC      s390x-linux-user/target/s390x/misc_helper.o
  CC      s390x-linux-user/target/s390x/gdbstub.o
  CC      s390x-linux-user/target/s390x/cpu_models.o
  CC      s390x-linux-user/target/s390x/cpu_features.o
  GEN     trace/generated-helpers.c
  CC      s390x-linux-user/trace/control-target.o
  CC      s390x-linux-user/gdbstub-xml.o
  CC      sparc32plus-linux-user/disas.o
  CC      s390x-linux-user/trace/generated-helpers.o
  CC      sh4-linux-user/linux-user/elfload.o
  LINK    s390x-linux-user/qemu-s390x
  CC      sparc32plus-linux-user/tcg-runtime.o
  CC      sparc32plus-linux-user/hax-stub.o
  CC      sh4-linux-user/linux-user/linuxload.o
  CC      sh4-linux-user/linux-user/uaccess.o
  CC      sparc32plus-linux-user/kvm-stub.o
  GEN     sparc64-linux-user/config-target.h
  CC      sh4-linux-user/linux-user/uname.o
  CC      sparc64-linux-user/exec.o
  CC      sparc32plus-linux-user/gdbstub.o
  GEN     sparc-linux-user/config-target.h
  CC      sparc64-linux-user/translate-all.o
  CC      sparc-linux-user/exec.o
  CCAS    sh4-linux-user/linux-user/safe-syscall.o
  CC      sparc32plus-linux-user/thunk.o
  CC      sh4-linux-user/linux-user/flatload.o
  CC      sparc64-linux-user/cpu-exec.o
  CC      sparc-linux-user/translate-all.o
  CC      sparc32plus-linux-user/user-exec.o
  CC      sh4-linux-user/target/sh4/translate.o
  CC      sparc64-linux-user/translate-common.o
  CC      sparc32plus-linux-user/user-exec-stub.o
  CC      sparc-linux-user/cpu-exec.o
  CC      sparc32plus-linux-user/linux-user/main.o
  CC      sparc64-linux-user/cpu-exec-common.o
  CC      sparc64-linux-user/tcg/tcg.o
  CC      sparc-linux-user/translate-common.o
  CC      sparc32plus-linux-user/linux-user/syscall.o
  CC      sparc-linux-user/cpu-exec-common.o
  CC      sparc-linux-user/tcg/tcg.o
  CC      sh4-linux-user/target/sh4/op_helper.o
  CC      sparc64-linux-user/tcg/tcg-op.o
  CC      sh4-linux-user/target/sh4/helper.o
  CC      sh4-linux-user/target/sh4/cpu.o
  CC      sparc-linux-user/tcg/tcg-op.o
  CC      sh4-linux-user/target/sh4/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      sh4-linux-user/trace/control-target.o
  CC      sh4-linux-user/trace/generated-helpers.o
  CC      sparc32plus-linux-user/linux-user/strace.o
  LINK    sh4-linux-user/qemu-sh4
  CC      sparc64-linux-user/tcg/optimize.o
  CC      sparc-linux-user/tcg/optimize.o
  CC      sparc32plus-linux-user/linux-user/mmap.o
  CC      sparc64-linux-user/tcg/tcg-common.o
  CC      sparc-linux-user/tcg/tcg-common.o
  CC      sparc32plus-linux-user/linux-user/signal.o
  CC      sparc64-linux-user/fpu/softfloat.o
  CC      sparc-linux-user/fpu/softfloat.o
  CC      sparc-linux-user/disas.o
  CC      sparc32plus-linux-user/linux-user/elfload.o
  CC      sparc-linux-user/tcg-runtime.o
  CC      sparc32plus-linux-user/linux-user/linuxload.o
  CC      sparc64-linux-user/disas.o
  CC      sparc32plus-linux-user/linux-user/uaccess.o
  CC      sparc64-linux-user/tcg-runtime.o
  CC      sparc32plus-linux-user/linux-user/uname.o
  CCAS    sparc32plus-linux-user/linux-user/safe-syscall.o
  CC      sparc64-linux-user/hax-stub.o
  CC      sparc-linux-user/hax-stub.o
  CC      sparc64-linux-user/kvm-stub.o
  CC      sparc32plus-linux-user/target/sparc/translate.o
  CC      sparc-linux-user/kvm-stub.o
  CC      sparc64-linux-user/gdbstub.o
  CC      sparc64-linux-user/thunk.o
  CC      sparc-linux-user/gdbstub.o
  CC      sparc-linux-user/thunk.o
  CC      sparc64-linux-user/user-exec.o
  GEN     tilegx-linux-user/config-target.h
  CC      tilegx-linux-user/exec.o
  CC      sparc-linux-user/user-exec.o
  CC      tilegx-linux-user/translate-all.o
  CC      sparc64-linux-user/user-exec-stub.o
  CC      sparc-linux-user/user-exec-stub.o
  CC      sparc64-linux-user/linux-user/main.o
  CC      sparc-linux-user/linux-user/main.o
  CC      tilegx-linux-user/cpu-exec.o
  CC      sparc-linux-user/linux-user/syscall.o
  CC      sparc64-linux-user/linux-user/syscall.o
  CC      tilegx-linux-user/translate-common.o
  CC      sparc32plus-linux-user/target/sparc/helper.o
  CC      tilegx-linux-user/cpu-exec-common.o
  CC      sparc32plus-linux-user/target/sparc/cpu.o
  CC      tilegx-linux-user/tcg/tcg.o
  CC      sparc32plus-linux-user/target/sparc/fop_helper.o
  CC      sparc32plus-linux-user/target/sparc/cc_helper.o
  CC      tilegx-linux-user/tcg/tcg-op.o
  CC      sparc32plus-linux-user/target/sparc/win_helper.o
  CC      sparc32plus-linux-user/target/sparc/mmu_helper.o
  CC      sparc-linux-user/linux-user/strace.o
  CC      sparc32plus-linux-user/target/sparc/ldst_helper.o
  CC      sparc-linux-user/linux-user/mmap.o
  CC      sparc32plus-linux-user/target/sparc/int64_helper.o
  CC      sparc-linux-user/linux-user/signal.o
  CC      sparc64-linux-user/linux-user/strace.o
  CC      sparc32plus-linux-user/target/sparc/vis_helper.o
  CC      sparc-linux-user/linux-user/elfload.o
  CC      sparc32plus-linux-user/target/sparc/gdbstub.o
  CC      sparc64-linux-user/linux-user/mmap.o
  GEN     trace/generated-helpers.c
  CC      tilegx-linux-user/tcg/optimize.o
  CC      sparc32plus-linux-user/trace/control-target.o
  CC      sparc-linux-user/linux-user/linuxload.o
  CC      sparc64-linux-user/linux-user/signal.o
  CC      sparc32plus-linux-user/trace/generated-helpers.o
  LINK    sparc32plus-linux-user/qemu-sparc32plus
  CC      sparc-linux-user/linux-user/uaccess.o
  CC      sparc64-linux-user/linux-user/elfload.o
  CC      tilegx-linux-user/tcg/tcg-common.o
  CC      sparc-linux-user/linux-user/uname.o
  GEN     x86_64-linux-user/config-target.h
  CCAS    sparc-linux-user/linux-user/safe-syscall.o
  CC      x86_64-linux-user/exec.o
  CC      sparc-linux-user/target/sparc/translate.o
  CC      tilegx-linux-user/fpu/softfloat.o
  CC      sparc64-linux-user/linux-user/linuxload.o
  CC      x86_64-linux-user/translate-all.o
  CC      sparc64-linux-user/linux-user/uaccess.o
  CC      x86_64-linux-user/cpu-exec.o
  CC      sparc64-linux-user/linux-user/uname.o
  CC      sparc-linux-user/target/sparc/helper.o
  CC      x86_64-linux-user/translate-common.o
  CCAS    sparc64-linux-user/linux-user/safe-syscall.o
  CC      x86_64-linux-user/cpu-exec-common.o
  CC      sparc64-linux-user/target/sparc/translate.o
  CC      sparc-linux-user/target/sparc/cpu.o
  CC      x86_64-linux-user/tcg/tcg.o
  CC      sparc-linux-user/target/sparc/fop_helper.o
  CC      tilegx-linux-user/disas.o
  CC      sparc-linux-user/target/sparc/cc_helper.o
  CC      tilegx-linux-user/tcg-runtime.o
  CC      sparc-linux-user/target/sparc/win_helper.o
  CC      sparc-linux-user/target/sparc/mmu_helper.o
  CC      x86_64-linux-user/tcg/tcg-op.o
  CC      sparc-linux-user/target/sparc/ldst_helper.o
  CC      tilegx-linux-user/hax-stub.o
  CC      sparc-linux-user/target/sparc/int32_helper.o
  CC      sparc64-linux-user/target/sparc/helper.o
  CC      sparc-linux-user/target/sparc/gdbstub.o
  CC      tilegx-linux-user/kvm-stub.o
  CC      sparc64-linux-user/target/sparc/cpu.o
  GEN     trace/generated-helpers.c
  CC      sparc-linux-user/trace/control-target.o
  CC      tilegx-linux-user/gdbstub.o
  CC      sparc-linux-user/trace/generated-helpers.o
  CC      sparc64-linux-user/target/sparc/fop_helper.o
  LINK    sparc-linux-user/qemu-sparc
  CC      sparc64-linux-user/target/sparc/cc_helper.o
  CC      x86_64-linux-user/tcg/optimize.o
  CC      tilegx-linux-user/thunk.o
  CC      sparc64-linux-user/target/sparc/win_helper.o
  CC      tilegx-linux-user/user-exec.o
  CC      sparc64-linux-user/target/sparc/mmu_helper.o
  CC      tilegx-linux-user/user-exec-stub.o
  CC      sparc64-linux-user/target/sparc/ldst_helper.o
  CC      x86_64-linux-user/tcg/tcg-common.o
  CC      tilegx-linux-user/linux-user/main.o
  CC      x86_64-linux-user/fpu/softfloat.o
  CC      sparc64-linux-user/target/sparc/int64_helper.o
  CC      tilegx-linux-user/linux-user/syscall.o
  CC      sparc64-linux-user/target/sparc/vis_helper.o
  CC      sparc64-linux-user/target/sparc/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      x86_64-linux-user/disas.o
  CC      sparc64-linux-user/trace/control-target.o
  CC      x86_64-linux-user/tcg-runtime.o
  CC      sparc64-linux-user/trace/generated-helpers.o
  LINK    sparc64-linux-user/qemu-sparc64
  CC      x86_64-linux-user/hax-stub.o
  CC      tilegx-linux-user/linux-user/strace.o
  CC      x86_64-linux-user/kvm-stub.o
  CC      x86_64-linux-user/gdbstub.o
  CC      x86_64-linux-user/thunk.o
  CC      tilegx-linux-user/linux-user/mmap.o
  CC      tilegx-linux-user/linux-user/signal.o
  CC      x86_64-linux-user/user-exec.o
  CC      x86_64-linux-user/user-exec-stub.o
  CC      x86_64-linux-user/linux-user/main.o
  CC      tilegx-linux-user/linux-user/elfload.o
  CC      tilegx-linux-user/linux-user/linuxload.o
  CC      x86_64-linux-user/linux-user/syscall.o
  CC      tilegx-linux-user/linux-user/uaccess.o
  CC      tilegx-linux-user/linux-user/uname.o
  CC      x86_64-linux-user/linux-user/strace.o
  CCAS    tilegx-linux-user/linux-user/safe-syscall.o
  CC      tilegx-linux-user/target/tilegx/cpu.o
  CC      tilegx-linux-user/target/tilegx/translate.o
  CC      x86_64-linux-user/linux-user/mmap.o
  CC      tilegx-linux-user/target/tilegx/helper.o
  CC      tilegx-linux-user/target/tilegx/simd_helper.o
  CC      x86_64-linux-user/linux-user/signal.o
  GEN     trace/generated-helpers.c
  CC      tilegx-linux-user/trace/control-target.o
  CC      tilegx-linux-user/trace/generated-helpers.o
  CC      x86_64-linux-user/linux-user/elfload.o
  CC      x86_64-linux-user/linux-user/linuxload.o
  LINK    tilegx-linux-user/qemu-tilegx
  CC      x86_64-linux-user/linux-user/uaccess.o
  CC      x86_64-linux-user/linux-user/uname.o
  CCAS    x86_64-linux-user/linux-user/safe-syscall.o
  CC      x86_64-linux-user/target/i386/translate.o
  CC      x86_64-linux-user/target/i386/helper.o
  CC      x86_64-linux-user/target/i386/cpu.o
  CC      x86_64-linux-user/target/i386/bpt_helper.o
  CC      x86_64-linux-user/target/i386/excp_helper.o
  CC      x86_64-linux-user/target/i386/fpu_helper.o
  CC      x86_64-linux-user/target/i386/cc_helper.o
  CC      x86_64-linux-user/target/i386/int_helper.o
  CC      x86_64-linux-user/target/i386/svm_helper.o
  CC      x86_64-linux-user/target/i386/smm_helper.o
  CC      x86_64-linux-user/target/i386/misc_helper.o
  CC      x86_64-linux-user/target/i386/mem_helper.o
  CC      x86_64-linux-user/target/i386/seg_helper.o
  CC      x86_64-linux-user/target/i386/mpx_helper.o
  CC      x86_64-linux-user/target/i386/gdbstub.o
  CC      x86_64-linux-user/target/i386/kvm-stub.o
  GEN     trace/generated-helpers.c
  CC      x86_64-linux-user/trace/control-target.o
  CC      x86_64-linux-user/trace/generated-helpers.o
  LINK    x86_64-linux-user/qemu-x86_64
  TEST    tests/qapi-schema/alternate-any.out
  TEST    tests/qapi-schema/alternate-array.out
  TEST    tests/qapi-schema/alternate-base.out
  TEST    tests/qapi-schema/alternate-clash.out
  TEST    tests/qapi-schema/alternate-conflict-dict.out
  TEST    tests/qapi-schema/alternate-nested.out
  TEST    tests/qapi-schema/alternate-conflict-string.out
  TEST    tests/qapi-schema/alternate-empty.out
  TEST    tests/qapi-schema/alternate-unknown.out
  TEST    tests/qapi-schema/args-alternate.out
  TEST    tests/qapi-schema/args-any.out
  TEST    tests/qapi-schema/args-array-empty.out
  TEST    tests/qapi-schema/args-array-unknown.out
  TEST    tests/qapi-schema/args-bad-boxed.out
  TEST    tests/qapi-schema/args-boxed-anon.out
  TEST    tests/qapi-schema/args-boxed-empty.out
  TEST    tests/qapi-schema/args-boxed-string.out
  TEST    tests/qapi-schema/args-int.out
  TEST    tests/qapi-schema/args-invalid.out
  TEST    tests/qapi-schema/args-member-array-bad.out
  TEST    tests/qapi-schema/args-member-case.out
  TEST    tests/qapi-schema/args-member-unknown.out
  TEST    tests/qapi-schema/args-name-clash.out
  TEST    tests/qapi-schema/args-union.out
  TEST    tests/qapi-schema/bad-base.out
  TEST    tests/qapi-schema/args-unknown.out
  TEST    tests/qapi-schema/bad-data.out
  TEST    tests/qapi-schema/bad-ident.out
  TEST    tests/qapi-schema/bad-type-bool.out
  TEST    tests/qapi-schema/bad-type-dict.out
  TEST    tests/qapi-schema/bad-type-int.out
  TEST    tests/qapi-schema/base-cycle-direct.out
  TEST    tests/qapi-schema/base-cycle-indirect.out
  TEST    tests/qapi-schema/command-int.out
  TEST    tests/qapi-schema/comments.out
  TEST    tests/qapi-schema/doc-bad-args.out
  TEST    tests/qapi-schema/doc-bad-symbol.out
  TEST    tests/qapi-schema/doc-duplicated-arg.out
  TEST    tests/qapi-schema/doc-duplicated-return.out
  TEST    tests/qapi-schema/doc-duplicated-since.out
  TEST    tests/qapi-schema/doc-empty-arg.out
  TEST    tests/qapi-schema/doc-empty-section.out
  TEST    tests/qapi-schema/doc-empty-symbol.out
  TEST    tests/qapi-schema/doc-invalid-end.out
  TEST    tests/qapi-schema/doc-interleaved-section.out
  TEST    tests/qapi-schema/doc-invalid-end2.out
  TEST    tests/qapi-schema/doc-invalid-return.out
  TEST    tests/qapi-schema/doc-invalid-section.out
  TEST    tests/qapi-schema/doc-invalid-start.out
  TEST    tests/qapi-schema/doc-missing-colon.out
  TEST    tests/qapi-schema/doc-missing-expr.out
  TEST    tests/qapi-schema/doc-missing-space.out
  TEST    tests/qapi-schema/double-data.out
  TEST    tests/qapi-schema/double-type.out
  TEST    tests/qapi-schema/doc-optional.out
  TEST    tests/qapi-schema/duplicate-key.out
  TEST    tests/qapi-schema/enum-bad-name.out
  TEST    tests/qapi-schema/enum-bad-prefix.out
  TEST    tests/qapi-schema/empty.out
  TEST    tests/qapi-schema/enum-clash-member.out
  TEST    tests/qapi-schema/enum-int-member.out
  TEST    tests/qapi-schema/enum-dict-member.out
  TEST    tests/qapi-schema/enum-member-case.out
  TEST    tests/qapi-schema/enum-missing-data.out
  TEST    tests/qapi-schema/enum-wrong-data.out
  TEST    tests/qapi-schema/escape-outside-string.out
  TEST    tests/qapi-schema/escape-too-big.out
  TEST    tests/qapi-schema/escape-too-short.out
  TEST    tests/qapi-schema/event-boxed-empty.out
  TEST    tests/qapi-schema/event-case.out
  TEST    tests/qapi-schema/event-nest-struct.out
  TEST    tests/qapi-schema/flat-union-array-branch.out
  TEST    tests/qapi-schema/flat-union-bad-base.out
  TEST    tests/qapi-schema/flat-union-base-any.out
  TEST    tests/qapi-schema/flat-union-bad-discriminator.out
  TEST    tests/qapi-schema/flat-union-base-union.out
  TEST    tests/qapi-schema/flat-union-clash-member.out
  TEST    tests/qapi-schema/flat-union-empty.out
  TEST    tests/qapi-schema/flat-union-incomplete-branch.out
  TEST    tests/qapi-schema/flat-union-inline.out
  TEST    tests/qapi-schema/flat-union-int-branch.out
  TEST    tests/qapi-schema/flat-union-invalid-branch-key.out
  TEST    tests/qapi-schema/flat-union-invalid-discriminator.out
  TEST    tests/qapi-schema/flat-union-no-base.out
  TEST    tests/qapi-schema/flat-union-optional-discriminator.out
  TEST    tests/qapi-schema/flat-union-string-discriminator.out
  TEST    tests/qapi-schema/funny-char.out
  TEST    tests/qapi-schema/ident-with-escape.out
  TEST    tests/qapi-schema/include-before-err.out
  TEST    tests/qapi-schema/include-cycle.out
  TEST    tests/qapi-schema/include-format-err.out
  TEST    tests/qapi-schema/include-nested-err.out
  TEST    tests/qapi-schema/include-no-file.out
  TEST    tests/qapi-schema/include-non-file.out
  TEST    tests/qapi-schema/include-relpath.out
  TEST    tests/qapi-schema/include-repetition.out
  TEST    tests/qapi-schema/include-self-cycle.out
  TEST    tests/qapi-schema/include-simple.out
  TEST    tests/qapi-schema/indented-expr.out
  TEST    tests/qapi-schema/leading-comma-list.out
  TEST    tests/qapi-schema/leading-comma-object.out
  TEST    tests/qapi-schema/missing-colon.out
  TEST    tests/qapi-schema/missing-comma-list.out
  TEST    tests/qapi-schema/missing-comma-object.out
  TEST    tests/qapi-schema/missing-type.out
  TEST    tests/qapi-schema/nested-struct-data.out
  TEST    tests/qapi-schema/non-objects.out
  TEST    tests/qapi-schema/qapi-schema-test.out
  TEST    tests/qapi-schema/redefined-builtin.out
  TEST    tests/qapi-schema/quoted-structural-chars.out
  TEST    tests/qapi-schema/redefined-command.out
  TEST    tests/qapi-schema/redefined-event.out
  TEST    tests/qapi-schema/redefined-type.out
  TEST    tests/qapi-schema/reserved-command-q.out
  TEST    tests/qapi-schema/reserved-enum-q.out
  TEST    tests/qapi-schema/reserved-member-has.out
  TEST    tests/qapi-schema/reserved-member-q.out
  TEST    tests/qapi-schema/reserved-member-u.out
  TEST    tests/qapi-schema/reserved-member-underscore.out
  TEST    tests/qapi-schema/reserved-type-kind.out
  TEST    tests/qapi-schema/returns-alternate.out
  TEST    tests/qapi-schema/reserved-type-list.out
  TEST    tests/qapi-schema/returns-array-bad.out
  TEST    tests/qapi-schema/returns-dict.out
  TEST    tests/qapi-schema/returns-unknown.out
  TEST    tests/qapi-schema/returns-whitelist.out
  TEST    tests/qapi-schema/struct-base-clash-deep.out
  TEST    tests/qapi-schema/struct-base-clash.out
  TEST    tests/qapi-schema/struct-data-invalid.out
  TEST    tests/qapi-schema/struct-member-invalid.out
  TEST    tests/qapi-schema/trailing-comma-list.out
  TEST    tests/qapi-schema/trailing-comma-object.out
  TEST    tests/qapi-schema/type-bypass-bad-gen.out
  TEST    tests/qapi-schema/unclosed-list.out
  TEST    tests/qapi-schema/unclosed-object.out
  TEST    tests/qapi-schema/unclosed-string.out
  TEST    tests/qapi-schema/unicode-str.out
  TEST    tests/qapi-schema/union-base-no-discriminator.out
  TEST    tests/qapi-schema/union-clash-branches.out
  TEST    tests/qapi-schema/union-branch-case.out
  TEST    tests/qapi-schema/union-empty.out
  TEST    tests/qapi-schema/union-invalid-base.out
  TEST    tests/qapi-schema/union-unknown.out
  TEST    tests/qapi-schema/union-optional-branch.out
  TEST    tests/qapi-schema/unknown-escape.out
  TEST    tests/qapi-schema/unknown-expr-key.out
  CC      tests/check-qdict.o
  CC      tests/test-char.o
  CC      tests/check-qfloat.o
  CC      tests/check-qint.o
  CC      tests/check-qstring.o
  CC      tests/check-qlist.o
  CC      tests/check-qnull.o
  CC      tests/check-qjson.o
  CC      tests/test-qobject-output-visitor.o
  GEN     tests/test-qapi-visit.c
  GEN     tests/test-qapi-types.c
  GEN     tests/test-qapi-event.c
  GEN     tests/test-qmp-introspect.c
  CC      tests/test-clone-visitor.o
  CC      tests/test-qobject-input-visitor.o
  CC      tests/test-qobject-input-strict.o
  CC      tests/test-qmp-commands.o
  GEN     tests/test-qmp-marshal.c
  CC      tests/test-string-input-visitor.o
  CC      tests/test-string-output-visitor.o
  CC      tests/test-opts-visitor.o
  CC      tests/test-coroutine.o
  CC      tests/test-qmp-event.o
  CC      tests/iothread.o
  CC      tests/test-visitor-serialization.o
  CC      tests/test-iov.o
  CC      tests/test-aio.o
  CC      tests/test-aio-multithread.o
  CC      tests/test-throttle.o
  CC      tests/test-thread-pool.o
  CC      tests/test-hbitmap.o
  CC      tests/test-blockjob.o
  CC      tests/test-blockjob-txn.o
  CC      tests/test-x86-cpuid.o
  CC      tests/test-xbzrle.o
  CC      tests/test-vmstate.o
  CC      tests/test-cutils.o
  CC      tests/test-shift128.o
  CC      tests/test-mul64.o
  CC      tests/test-int128.o
  CC      tests/rcutorture.o
  CC      tests/test-rcu-list.o
  CC      tests/test-qdist.o
  CC      tests/test-qht.o
  CC      tests/test-qht-par.o
  CC      tests/qht-bench.o
  CC      tests/test-bitops.o
  CC      tests/test-bitcnt.o
  CC      tests/test-qdev-global-props.o
  CC      tests/check-qom-interface.o
  CC      tests/check-qom-proplist.o
  CC      tests/test-qemu-opts.o
  CC      tests/test-write-threshold.o
  CC      tests/test-crypto-hmac.o
  CC      tests/test-crypto-hash.o
  CC      tests/test-crypto-cipher.o
  CC      tests/test-crypto-secret.o
  CC      tests/test-crypto-tlscredsx509.o
  CC      tests/crypto-tls-x509-helpers.o
  CC      tests/pkix_asn1_tab.o
  CC      tests/test-crypto-tlssession.o
  CC      tests/test-qga.o
  CC      tests/libqtest.o
  CC      tests/test-timed-average.o
  CC      tests/test-io-task.o
  CC      tests/test-io-channel-socket.o
  CC      tests/io-channel-helpers.o
  CC      tests/test-io-channel-file.o
  CC      tests/test-io-channel-tls.o
  CC      tests/test-io-channel-command.o
  CC      tests/test-io-channel-buffer.o
  CC      tests/test-base64.o
  CC      tests/test-crypto-pbkdf.o
  CC      tests/test-crypto-ivgen.o
  CC      tests/test-crypto-afsplit.o
  CC      tests/test-crypto-xts.o
  CC      tests/test-crypto-block.o
  CC      tests/test-logging.o
  CC      tests/test-replication.o
  CC      tests/test-uuid.o
  CC      tests/test-bufferiszero.o
  CC      tests/ptimer-test.o
  CC      tests/ptimer-test-stubs.o
  CC      tests/boot-serial-test.o
  CC      tests/libqos/pci.o
  CC      tests/libqos/fw_cfg.o
  CC      tests/libqos/malloc.o
  CC      tests/libqos/i2c.o
  CC      tests/libqos/libqos.o
  CC      tests/tmp105-test.o
  CC      tests/libqos/i2c-omap.o
  CC      tests/ds1338-test.o
  CC      tests/libqos/i2c-imx.o
  CC      tests/m25p80-test.o
  CC      tests/virtio-blk-test.o
  CC      tests/libqos/malloc-spapr.o
  CC      tests/libqos/libqos-spapr.o
  CC      tests/libqos/rtas.o
  CC      tests/libqos/pci-spapr.o
  CC      tests/libqos/pci-pc.o
  CC      tests/libqos/malloc-pc.o
  CC      tests/libqos/libqos-pc.o
  CC      tests/libqos/ahci.o
  CC      tests/libqos/virtio.o
  CC      tests/libqos/virtio-pci.o
  CC      tests/libqos/virtio-mmio.o
  CC      tests/libqos/malloc-generic.o
  CC      tests/test-arm-mptimer.o
  CC      tests/endianness-test.o
  CC      tests/fdc-test.o
  CC      tests/ide-test.o
  CC      tests/ahci-test.o
  CC      tests/hd-geo-test.o
  CC      tests/boot-order-test.o
  CC      tests/bios-tables-test.o
  CC      tests/boot-sector.o
  CC      tests/pxe-test.o
  CC      tests/rtc-test.o
  CC      tests/ipmi-kcs-test.o
  CC      tests/ipmi-bt-test.o
  CC      tests/i440fx-test.o
  CC      tests/fw_cfg-test.o
  CC      tests/drive_del-test.o
  CC      tests/wdt_ib700-test.o
  CC      tests/tco-test.o
  CC      tests/e1000-test.o
  CC      tests/e1000e-test.o
  CC      tests/rtl8139-test.o
  CC      tests/pcnet-test.o
  CC      tests/eepro100-test.o
  CC      tests/ne2000-test.o
  CC      tests/nvme-test.o
  CC      tests/ac97-test.o
  CC      tests/es1370-test.o
  CC      tests/virtio-net-test.o
  CC      tests/virtio-balloon-test.o
  CC      tests/virtio-rng-test.o
  CC      tests/virtio-scsi-test.o
  CC      tests/virtio-9p-test.o
  CC      tests/virtio-console-test.o
  CC      tests/virtio-serial-test.o
  CC      tests/tpci200-test.o
  CC      tests/ipoctal232-test.o
  CC      tests/display-vga-test.o
  CC      tests/intel-hda-test.o
  CC      tests/ivshmem-test.o
  CC      tests/vmxnet3-test.o
  CC      tests/pvpanic-test.o
  CC      tests/i82801b11-test.o
  CC      tests/ioh3420-test.o
  CC      tests/usb-hcd-ohci-test.o
  CC      tests/libqos/usb.o
  CC      tests/usb-hcd-uhci-test.o
  CC      tests/usb-hcd-ehci-test.o
  CC      tests/usb-hcd-xhci-test.o
  CC      tests/pc-cpu-test.o
  CC      tests/q35-test.o
  CC      tests/test-netfilter.o
  CC      tests/test-filter-mirror.o
  CC      tests/test-filter-redirector.o
  CC      tests/postcopy-test.o
  CC      tests/test-x86-cpuid-compat.o
  CC      tests/spapr-phb-test.o
  CC      tests/pnv-xscom-test.o
  CC      tests/prom-env-test.o
  CC      tests/rtas-test.o
  CC      tests/device-introspect-test.o
  CC      tests/qom-test.o
  LINK    tests/check-qdict
  LINK    tests/test-char
  LINK    tests/check-qfloat
  LINK    tests/check-qint
  LINK    tests/check-qstring
  LINK    tests/check-qlist
  LINK    tests/check-qnull
  LINK    tests/check-qjson
  CC      tests/test-qapi-visit.o
  CC      tests/test-qapi-types.o
  CC      tests/test-qapi-event.o
  CC      tests/test-qmp-introspect.o
  CC      tests/test-qmp-marshal.o
  LINK    tests/test-coroutine
  LINK    tests/test-iov
  LINK    tests/test-aio
  LINK    tests/test-aio-multithread
  LINK    tests/test-throttle
  LINK    tests/test-hbitmap
  LINK    tests/test-thread-pool
  LINK    tests/test-blockjob
  LINK    tests/test-blockjob-txn
  LINK    tests/test-x86-cpuid
  LINK    tests/test-xbzrle
  LINK    tests/test-vmstate
  LINK    tests/test-cutils
  LINK    tests/test-shift128
  LINK    tests/test-mul64
  LINK    tests/test-int128
  LINK    tests/rcutorture
  LINK    tests/test-rcu-list
  LINK    tests/test-qdist
  LINK    tests/test-qht
  LINK    tests/qht-bench
  LINK    tests/test-bitops
  LINK    tests/test-bitcnt
  LINK    tests/test-qdev-global-props
  LINK    tests/check-qom-interface
  LINK    tests/check-qom-proplist
  LINK    tests/test-qemu-opts
  LINK    tests/test-write-threshold
  LINK    tests/test-crypto-hash
  LINK    tests/test-crypto-cipher
  LINK    tests/test-crypto-hmac
  LINK    tests/test-crypto-secret
  LINK    tests/test-crypto-tlscredsx509
  LINK    tests/test-crypto-tlssession
  LINK    tests/test-qga
  LINK    tests/test-timed-average
  LINK    tests/test-io-task
  LINK    tests/test-io-channel-socket
  LINK    tests/test-io-channel-file
  LINK    tests/test-io-channel-tls
  LINK    tests/test-io-channel-command
  LINK    tests/test-io-channel-buffer
  LINK    tests/test-base64
  LINK    tests/test-crypto-pbkdf
  LINK    tests/test-crypto-ivgen
  LINK    tests/test-crypto-afsplit
  LINK    tests/test-crypto-xts
  LINK    tests/test-crypto-block
  LINK    tests/test-logging
  LINK    tests/test-replication
  LINK    tests/test-bufferiszero
  LINK    tests/test-uuid
  LINK    tests/ptimer-test
  LINK    tests/boot-serial-test
  LINK    tests/tmp105-test
  LINK    tests/ds1338-test
  LINK    tests/m25p80-test
  LINK    tests/virtio-blk-test
  LINK    tests/test-arm-mptimer
  LINK    tests/endianness-test
  LINK    tests/fdc-test
  LINK    tests/ide-test
  LINK    tests/ahci-test
  LINK    tests/boot-order-test
  LINK    tests/hd-geo-test
  LINK    tests/bios-tables-test
  LINK    tests/pxe-test
  LINK    tests/rtc-test
  LINK    tests/ipmi-kcs-test
  LINK    tests/ipmi-bt-test
  LINK    tests/i440fx-test
  LINK    tests/fw_cfg-test
  LINK    tests/wdt_ib700-test
  LINK    tests/drive_del-test
  LINK    tests/tco-test
  LINK    tests/e1000-test
  LINK    tests/e1000e-test
  LINK    tests/rtl8139-test
  LINK    tests/pcnet-test
  LINK    tests/eepro100-test
  LINK    tests/ne2000-test
  LINK    tests/nvme-test
  LINK    tests/ac97-test
  LINK    tests/es1370-test
  LINK    tests/virtio-net-test
  LINK    tests/virtio-balloon-test
  LINK    tests/virtio-rng-test
  LINK    tests/virtio-scsi-test
  LINK    tests/virtio-9p-test
  LINK    tests/virtio-serial-test
  LINK    tests/virtio-console-test
  LINK    tests/tpci200-test
  LINK    tests/ipoctal232-test
  LINK    tests/display-vga-test
  LINK    tests/intel-hda-test
  LINK    tests/ivshmem-test
  LINK    tests/vmxnet3-test
  LINK    tests/pvpanic-test
  LINK    tests/i82801b11-test
  LINK    tests/ioh3420-test
  LINK    tests/usb-hcd-ohci-test
  LINK    tests/usb-hcd-uhci-test
  LINK    tests/usb-hcd-ehci-test
  LINK    tests/usb-hcd-xhci-test
  LINK    tests/pc-cpu-test
  LINK    tests/q35-test
  LINK    tests/test-filter-mirror
  LINK    tests/test-netfilter
  LINK    tests/test-filter-redirector
  LINK    tests/postcopy-test
  LINK    tests/test-x86-cpuid-compat
  LINK    tests/spapr-phb-test
  LINK    tests/prom-env-test
  LINK    tests/pnv-xscom-test
  LINK    tests/rtas-test
  LINK    tests/qom-test
  LINK    tests/device-introspect-test
  GTESTER tests/check-qdict
  GTESTER tests/test-char
  GTESTER tests/check-qfloat
  GTESTER tests/check-qint
  GTESTER tests/check-qlist
  GTESTER tests/check-qnull
  GTESTER tests/check-qstring
  GTESTER tests/check-qjson
  LINK    tests/test-qobject-output-visitor
  LINK    tests/test-clone-visitor
  LINK    tests/test-qobject-input-visitor
  LINK    tests/test-qobject-input-strict
  LINK    tests/test-qmp-commands
  LINK    tests/test-string-input-visitor
  LINK    tests/test-string-output-visitor
  LINK    tests/test-qmp-event
  GTESTER tests/test-coroutine
  LINK    tests/test-opts-visitor
  LINK    tests/test-visitor-serialization
  GTESTER tests/test-iov
  GTESTER tests/test-aio
  GTESTER tests/test-aio-multithread
  GTESTER tests/test-throttle
  GTESTER tests/test-thread-pool
  GTESTER tests/test-hbitmap
  GTESTER tests/test-blockjob
  GTESTER tests/test-blockjob-txn
  GTESTER tests/test-x86-cpuid
  GTESTER tests/test-xbzrle
  GTESTER tests/test-vmstate
  GTESTER tests/test-cutils
  GTESTER tests/test-shift128
  GTESTER tests/test-mul64
  GTESTER tests/test-int128
  GTESTER tests/rcutorture
  GTESTER tests/test-rcu-list
  GTESTER tests/test-qdist
  GTESTER tests/test-qht
  LINK    tests/test-qht-par
  GTESTER tests/test-bitops
  GTESTER tests/test-bitcnt
  GTESTER tests/test-qdev-global-props
  GTESTER tests/check-qom-interface
  GTESTER tests/check-qom-proplist
  GTESTER tests/test-qemu-opts
  GTESTER tests/test-write-threshold
  GTESTER tests/test-crypto-hash
  GTESTER tests/test-crypto-hmac
  GTESTER tests/test-crypto-cipher
  GTESTER tests/test-crypto-secret
  GTESTER tests/test-crypto-tlscredsx509
  GTESTER tests/test-crypto-tlssession
  GTESTER tests/test-qga
  GTESTER tests/test-timed-average
  GTESTER tests/test-io-task
  GTESTER tests/test-io-channel-socket
  GTESTER tests/test-io-channel-file
  GTESTER tests/test-io-channel-tls
  GTESTER tests/test-io-channel-command
  GTESTER tests/test-io-channel-buffer
  GTESTER tests/test-base64
  GTESTER tests/test-crypto-pbkdf
  GTESTER tests/test-crypto-ivgen
  GTESTER tests/test-crypto-afsplit
  GTESTER tests/test-crypto-xts
  GTESTER tests/test-crypto-block
  GTESTER tests/test-logging
  GTESTER tests/test-replication
  GTESTER tests/test-bufferiszero
  GTESTER tests/test-uuid
  GTESTER tests/ptimer-test
  GTESTER check-qtest-aarch64
  GTESTER check-qtest-alpha
  GTESTER check-qtest-arm
  GTESTER check-qtest-cris
  GTESTER check-qtest-i386
  GTESTER check-qtest-lm32
  GTESTER check-qtest-m68k
  GTESTER check-qtest-microblazeel
  GTESTER check-qtest-microblaze
  GTESTER check-qtest-mips64el
  GTESTER check-qtest-mips64
  GTESTER check-qtest-mipsel
  GTESTER check-qtest-mips
  GTESTER check-qtest-moxie
  GTESTER check-qtest-nios2
  GTESTER check-qtest-or1k
  GTESTER check-qtest-ppc64
  GTESTER check-qtest-ppcemb
  GTESTER check-qtest-ppc
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
  GTESTER check-qtest-s390x
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
**
ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
GTester: last random seed: R02Sf1ce767b432f1559eaf8cc0c5a31eb02
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
  GTESTER check-qtest-sh4eb
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
**
ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
GTester: last random seed: R02Sf715de4b174a658e8948e81f3e393168
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
  GTESTER check-qtest-sh4
  GTESTER check-qtest-sparc64
  GTESTER check-qtest-sparc
Could not open option rom 'nvram1': No such file or directory
Could not open option rom '1up-md.bin': No such file or directory
Could not open option rom '1up-hv.bin': No such file or directory
Could not open option rom 'reset.bin': No such file or directory
Could not open option rom 'q.bin': No such file or directory
Could not open option rom 'openboot.bin': No such file or directory
  GTESTER check-qtest-tricore
  GTESTER check-qtest-unicore32
  GTESTER check-qtest-x86_64
  GTESTER check-qtest-xtensaeb
  GTESTER check-qtest-xtensa
  GTESTER tests/test-qobject-output-visitor
  GTESTER tests/test-clone-visitor
  GTESTER tests/test-qobject-input-visitor
  GTESTER tests/test-qobject-input-strict
  GTESTER tests/test-qmp-commands
  GTESTER tests/test-string-input-visitor
  GTESTER tests/test-string-output-visitor
  GTESTER tests/test-qmp-event
  GTESTER tests/test-opts-visitor
  GTESTER tests/test-visitor-serialization
  GTESTER tests/test-qht-par
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
"kvm" accelerator not found.
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
**
ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
GTester: last random seed: R02Sa8532fcbb9e49ae4113248e56a8274f1
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
"kvm" accelerator not found.
**
ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
GTester: last random seed: R02S63f8b7c7e8b2e9f7801942da82d33919
"kvm" accelerator not found.
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
Warning! iasl couldn't parse the expected aml
/var/tmp/patchew-tester-tmp-_186415r/src/tests/Makefile.include:793: recipe for target 'check-qtest-i386' failed
make: *** [check-qtest-i386] Error 1
make: *** Waiting for unfinished jobs....
"kvm" accelerator not found.
"kvm" accelerator not found.
/var/tmp/patchew-tester-tmp-_186415r/src/tests/Makefile.include:793: recipe for target 'check-qtest-x86_64' failed
make: *** [check-qtest-x86_64] Error 1
=== OUTPUT END ===

Test command exited with code: 2


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement
  2017-02-22 18:17 ` [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement no-reply
@ 2017-02-22 19:55   ` Alex Bennée
  2017-02-22 21:02     ` Alex Bennée
  0 siblings, 1 reply; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 19:55 UTC (permalink / raw)
  To: qemu-devel
  Cc: famz, rth, peter.maydell, mttcg, nikunj, jan.kiszka, mark.burton,
	a.rigo, cota, serge.fdrv, pbonzini, bobby.prani,
	bamvor.zhangjian, fred.konrad


no-reply@patchew.org writes:

> Hi,
>
> This series failed build test on s390x host. Please find the details below.
>
> Type: series
> Subject: [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement
> Message-id: 20170222171327.26624-1-alex.bennee@linaro.org
>
> === TEST SCRIPT BEGIN ===
> #!/bin/bash
> # Testing script will be invoked under the git checkout with
> # HEAD pointing to a commit that has the patches applied on top of "base"
> # branch
> set -e
> echo "=== ENV ==="
> env
> echo "=== PACKAGES ==="
> rpm -qa
> echo "=== TEST BEGIN ==="
> CC=$HOME/bin/cc
> INSTALL=$PWD/install
> BUILD=/var/tmp/patchew-qemu-build
> echo -n "Using CC: "
> realpath $CC
> test -e $BUILD && rm -rf $BUILD
> mkdir -p $BUILD $INSTALL
> SRC=$PWD
> cd $BUILD
> $SRC/configure --cc=$CC --prefix=$INSTALL
> make -j4
> make check -j4
> make install
> === TEST SCRIPT END ===
>
> Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
> From https://github.com/patchew-project/qemu
>  - [tag update]      patchew/1487763883-4877-1-git-send-email-nikunj@linux.vnet.ibm.com -> patchew/1487763883-4877-1-git-send-email-nikunj@linux.vnet.ibm.com
>  - [tag update]      patchew/20170222121527.7009-1-cornelia.huck@de.ibm.com -> patchew/20170222121527.7009-1-cornelia.huck@de.ibm.com
>  * [new tag]         patchew/20170222171327.26624-1-alex.bennee@linaro.org -> patchew/20170222171327.26624-1-alex.bennee@linaro.org
> Switched to a new branch 'test'
> 1045fbc tcg: enable MTTCG by default for ARM on x86 hosts
> 8a28277 hw/misc/imx6_src: defer clearing of SRC_SCR reset bits
> b03a900 target-arm: ensure all cross vCPUs TLB flushes complete
> d06c981 target-arm: don't generate WFE/YIELD calls for MTTCG
> ee4ea53 target-arm/powerctl: defer cpu reset work to CPU context
> 1dfc884 cputlb: introduce tlb_flush_*_all_cpus[_synced]
> 6e41ba9 cputlb: atomically update tlb fields used by tlb_reset_dirty
> a7636a0 cputlb: add tlb_flush_by_mmuidx async routines
> 7956595 cputlb and arm/sparc targets: convert mmuidx flushes from varg to bitmap
> 3bb2a0e cputlb: introduce tlb_flush_* async work.
> d9e636a cputlb: tweak qemu_ram_addr_from_host_nofail reporting
> a87ddd2 cputlb: add assert_cpu_is_self checks
> c7f549b tcg: handle EXCP_ATOMIC exception for system emulation
> 5b31921 tcg: enable thread-per-vCPU
> d6edfc4 tcg: enable tb_lock() for SoftMMU
> d650c59 tcg: remove global exit_request
> 20a3c7d tcg: drop global lock during TCG code execution
> c6f8201 tcg: rename tcg_current_cpu to tcg_current_rr_cpu
> 1473067 tcg: add kick timer for single-threaded vCPU emulation
> 497072f tcg: add options for enabling MTTCG
> f093899 tcg: move TCG_MO/BAR types into own file
> cc02aae mttcg: Add missing tb_lock/unlock() in cpu_exec_step()
> 414fdc5 mttcg: translate-all: Enable locking debug in a debug build
> d8651bb docs: new design document multi-thread-tcg.txt
>
> === OUTPUT BEGIN ===
<snip>
>   GTESTER check-qtest-or1k
>   GTESTER check-qtest-ppc64
>   GTESTER check-qtest-ppcemb
>   GTESTER check-qtest-ppc
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
>   GTESTER check-qtest-s390x
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> **
> ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
> GTester: last random seed: R02Sf1ce767b432f1559eaf8cc0c5a31eb02

Well I've seen this before if the IRQ chain doesn't do locking properly
but I'm at a loss why this breaks on an s390 host as the code is common.

Does anyone have a spare s390 that I can test on?

> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
>   GTESTER check-qtest-sh4eb
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> **
> ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
> GTester: last random seed: R02Sf715de4b174a658e8948e81f3e393168
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
>   GTESTER check-qtest-sh4
>   GTESTER check-qtest-sparc64
>   GTESTER check-qtest-sparc
> Could not open option rom 'nvram1': No such file or directory
> Could not open option rom '1up-md.bin': No such file or directory
> Could not open option rom '1up-hv.bin': No such file or directory
> Could not open option rom 'reset.bin': No such file or directory
> Could not open option rom 'q.bin': No such file or directory
> Could not open option rom 'openboot.bin': No such file or directory
>   GTESTER check-qtest-tricore
>   GTESTER check-qtest-unicore32
>   GTESTER check-qtest-x86_64
>   GTESTER check-qtest-xtensaeb
>   GTESTER check-qtest-xtensa
>   GTESTER tests/test-qobject-output-visitor
>   GTESTER tests/test-clone-visitor
>   GTESTER tests/test-qobject-input-visitor
>   GTESTER tests/test-qobject-input-strict
>   GTESTER tests/test-qmp-commands
>   GTESTER tests/test-string-input-visitor
>   GTESTER tests/test-string-output-visitor
>   GTESTER tests/test-qmp-event
>   GTESTER tests/test-opts-visitor
>   GTESTER tests/test-visitor-serialization
>   GTESTER tests/test-qht-par
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> "kvm" accelerator not found.
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> **
> ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
> GTester: last random seed: R02Sa8532fcbb9e49ae4113248e56a8274f1
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> "kvm" accelerator not found.
> **
> ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
> GTester: last random seed: R02S63f8b7c7e8b2e9f7801942da82d33919
> "kvm" accelerator not found.
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> Warning! iasl couldn't parse the expected aml
> /var/tmp/patchew-tester-tmp-_186415r/src/tests/Makefile.include:793: recipe for target 'check-qtest-i386' failed
> make: *** [check-qtest-i386] Error 1
> make: *** Waiting for unfinished jobs....
> "kvm" accelerator not found.
> "kvm" accelerator not found.
> /var/tmp/patchew-tester-tmp-_186415r/src/tests/Makefile.include:793: recipe for target 'check-qtest-x86_64' failed
> make: *** [check-qtest-x86_64] Error 1
> === OUTPUT END ===
>
> Test command exited with code: 2
>
>
> ---
> Email generated automatically by Patchew [http://patchew.org/].
> Please send your feedback to patchew-devel@freelists.org


--
Alex Bennée

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement
  2017-02-22 19:55   ` Alex Bennée
@ 2017-02-22 21:02     ` Alex Bennée
  2017-02-23  1:14       ` Pranith Kumar
  0 siblings, 1 reply; 32+ messages in thread
From: Alex Bennée @ 2017-02-22 21:02 UTC (permalink / raw)
  To: qemu-devel
  Cc: famz, rth, peter.maydell, mttcg, nikunj, jan.kiszka, mark.burton,
	a.rigo, cota, serge.fdrv, pbonzini, bobby.prani,
	bamvor.zhangjian, fred.konrad


Alex Bennée <alex.bennee@linaro.org> writes:

> no-reply@patchew.org writes:
>
>> Hi,
>>
>> This series failed build test on s390x host. Please find the details
>> below.

It also failed on x86-on-x86 MTTCG as well as other tests:

>> ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
>> GTester: last random seed: R02Sf1ce767b432f1559eaf8cc0c5a31eb02
>
> Well I've seen this before if the IRQ chain doesn't do locking properly
> but I'm at a loss why this breaks on an s390 host as the code is common.
>
> Does anyone have a spare s390 that I can test on?

Look like I'll have to roll this in:

  https://github.com/stsquad/qemu/commit/c6f4245ffd9df8ffcd2d4d655c322189c19a6c1a

Which conflicted with Paolo's re-factoring
(209b71b60ef3341246038e1c926c3b704969cdd3). I'll leave it running
overnight and see if I can do a cleaner fix.

14th's time is the charm ;-)

--
Alex Bennée

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH v13 05/24] tcg: add options for enabling MTTCG
  2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 05/24] tcg: add options for enabling MTTCG Alex Bennée
@ 2017-02-22 21:13   ` Pranith Kumar
  2017-02-23  8:21     ` Alex Bennée
  0 siblings, 1 reply; 32+ messages in thread
From: Pranith Kumar @ 2017-02-22 21:13 UTC (permalink / raw)
  To: Alex Bennée
  Cc: Richard Henderson, Peter Maydell, qemu-devel, MTTCG Devel,
	KONRAD Frédéric, alvise rigo, Emilio G. Cota, nikunj,
	Mark Burton, Paolo Bonzini, Jan Kiszka, Sergey Fedorov,
	Bamvor Zhang Jian, Peter Crosthwaite

Hi Alex,

On Wed, Feb 22, 2017 at 12:13 PM, Alex Bennée <alex.bennee@linaro.org> wrote:
> From: KONRAD Frederic <fred.konrad@greensocs.com>
>
> We know there will be cases where MTTCG won't work until additional work
> is done in the front/back ends to support. It will however be useful to
> be able to turn it on.
>
> As a result MTTCG will default to off unless the combination is
> supported. However the user can turn it on for the sake of testing.
>
> Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
> [AJB: move to -accel tcg,thread=multi|single, defaults]
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> Reviewed-by: Richard Henderson <rth@twiddle.net>
> ---
> v1:
>   - merge with add mttcg option.
>   - update commit message
> v2:
>   - machine_init->opts_init
> v3:
>   - moved from -tcg to -accel tcg,thread=single|multi
>   - fix checkpatch warnings
> v4:
>   - make mttcg_enabled extern, qemu_tcg_mttcg_enabled() now just macro
>   - qemu_tcg_configure now propagates Error instead of exiting
>   - better error checking of thread=foo
>   - use CONFIG flags for default_mttcg_enabled()
>   - disable mttcg with icount, error if both forced on
> v7
>   - explicitly disable MTTCG for TCG_OVERSIZED_GUEST
>   - use check_tcg_memory_orders_compatible() instead of CONFIG_MTTCG_HOST
>   - change CONFIG_MTTCG_TARGET to TARGET_SUPPORTS_MTTCG
> v8
>   - fix missing include tcg.h
>   - change mismatched MOs to a warning instead of error
> v10
>   - TCG_DEFAULT_MO -> TCG_GUEST_DEFAULT_MO
> v11
>   - tweak warning message
> ---
>  cpus.c                | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  include/qom/cpu.h     |  9 +++++++
>  include/sysemu/cpus.h |  2 ++
>  qemu-options.hx       | 20 ++++++++++++++
>  tcg/tcg.h             |  9 +++++++
>  vl.c                  | 49 +++++++++++++++++++++++++++++++++-
>  6 files changed, 161 insertions(+), 1 deletion(-)
>
> diff --git a/cpus.c b/cpus.c
> index 0bcb5b50b6..c296ec715f 100644
> --- a/cpus.c
> +++ b/cpus.c
<...>
> +void qemu_tcg_configure(QemuOpts *opts, Error **errp)
> +{
> +    const char *t = qemu_opt_get(opts, "thread");
> +    if (t) {
> +        if (strcmp(t, "multi") == 0) {
> +            if (TCG_OVERSIZED_GUEST) {
> +                error_setg(errp, "No MTTCG when guest word size > hosts");
> +            } else {
> +                if (!check_tcg_memory_orders_compatible()) {
> +                    error_report("Guest expects a stronger memory ordering than"
> +                                 "the host provides");
> +                    error_printf("This may cause strange/hard to debug errors");
> +                }

This prints it as:

Guest expects a stronger memory ordering thanthe host provides

Please add a space between 'than' and 'the'. Also why are you using
error_report() for the first line and error_printf() for the second?

Thanks,
-- 
Pranith

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement
  2017-02-22 21:02     ` Alex Bennée
@ 2017-02-23  1:14       ` Pranith Kumar
  2017-02-23  8:19         ` Alex Bennée
  0 siblings, 1 reply; 32+ messages in thread
From: Pranith Kumar @ 2017-02-23  1:14 UTC (permalink / raw)
  To: Alex Bennée
  Cc: qemu-devel, Fam Zheng, Richard Henderson, Peter Maydell,
	MTTCG Devel, nikunj, Jan Kiszka, Mark Burton, alvise rigo,
	Emilio G. Cota, Sergey Fedorov, Paolo Bonzini, Bamvor Zhang Jian,
	KONRAD Frédéric

On Wed, Feb 22, 2017 at 4:02 PM, Alex Bennée <alex.bennee@linaro.org> wrote:
>
> Alex Bennée <alex.bennee@linaro.org> writes:
>
>> no-reply@patchew.org writes:
>>
>>> Hi,
>>>
>>> This series failed build test on s390x host. Please find the details
>>> below.
>
> It also failed on x86-on-x86 MTTCG as well as other tests:
>
>>> ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
>>> GTester: last random seed: R02Sf1ce767b432f1559eaf8cc0c5a31eb02
>>
>> Well I've seen this before if the IRQ chain doesn't do locking properly
>> but I'm at a loss why this breaks on an s390 host as the code is common.
>>
>> Does anyone have a spare s390 that I can test on?
>
> Look like I'll have to roll this in:
>
>   https://github.com/stsquad/qemu/commit/c6f4245ffd9df8ffcd2d4d655c322189c19a6c1a
>

I am able to successfully boot my test images using this patch (they
fail without it). Another approach might be to reset the lock in the
outer loop:

diff --git a/cpu-exec.c b/cpu-exec.c
index f3c78a9..8327050 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -684,6 +684,9 @@ int cpu_exec(CPUState *cpu)
                if the guest is in advance */
             align_clocks(&sc, cpu);
         }
+        if (qemu_mutex_iothread_locked()) {
+          qemu_mutex_unlock_iothread();
+        }
     }

     cc->cpu_exec_exit(cpu);


I think either patch is fine.

Thanks,
-- 
Pranith

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement
  2017-02-23  1:14       ` Pranith Kumar
@ 2017-02-23  8:19         ` Alex Bennée
  0 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-23  8:19 UTC (permalink / raw)
  To: Pranith Kumar
  Cc: qemu-devel, Fam Zheng, Richard Henderson, Peter Maydell,
	MTTCG Devel, nikunj, Jan Kiszka, Mark Burton, alvise rigo,
	Emilio G. Cota, Sergey Fedorov, Paolo Bonzini, Bamvor Zhang Jian,
	KONRAD Frédéric


Pranith Kumar <bobby.prani@gmail.com> writes:

> On Wed, Feb 22, 2017 at 4:02 PM, Alex Bennée <alex.bennee@linaro.org> wrote:
>>
>> Alex Bennée <alex.bennee@linaro.org> writes:
>>
>>> no-reply@patchew.org writes:
>>>
>>>> Hi,
>>>>
>>>> This series failed build test on s390x host. Please find the details
>>>> below.
>>
>> It also failed on x86-on-x86 MTTCG as well as other tests:
>>
>>>> ERROR:/var/tmp/patchew-tester-tmp-_186415r/src/cpus.c:1554:qemu_mutex_lock_iothread: assertion failed: (!qemu_mutex_iothread_locked())
>>>> GTester: last random seed: R02Sf1ce767b432f1559eaf8cc0c5a31eb02
>>>
>>> Well I've seen this before if the IRQ chain doesn't do locking properly
>>> but I'm at a loss why this breaks on an s390 host as the code is common.
>>>
>>> Does anyone have a spare s390 that I can test on?
>>
>> Look like I'll have to roll this in:
>>
>>   https://github.com/stsquad/qemu/commit/c6f4245ffd9df8ffcd2d4d655c322189c19a6c1a
>>
>
> I am able to successfully boot my test images using this patch (they
> fail without it). Another approach might be to reset the lock in the
> outer loop:
>
> diff --git a/cpu-exec.c b/cpu-exec.c
> index f3c78a9..8327050 100644
> --- a/cpu-exec.c
> +++ b/cpu-exec.c
> @@ -684,6 +684,9 @@ int cpu_exec(CPUState *cpu)
>                 if the guest is in advance */
>              align_clocks(&sc, cpu);
>          }
> +        if (qemu_mutex_iothread_locked()) {
> +          qemu_mutex_unlock_iothread();
> +        }

The only aesthetic objection I have is not aligning the unlocks with
where the lock are taken. That said my patch is fairly ugly in that
regard ;-)

>      }
>
>      cc->cpu_exec_exit(cpu);
>
>
> I think either patch is fine.




--
Alex Bennée

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH v13 05/24] tcg: add options for enabling MTTCG
  2017-02-22 21:13   ` Pranith Kumar
@ 2017-02-23  8:21     ` Alex Bennée
  0 siblings, 0 replies; 32+ messages in thread
From: Alex Bennée @ 2017-02-23  8:21 UTC (permalink / raw)
  To: Pranith Kumar
  Cc: Richard Henderson, Peter Maydell, qemu-devel, MTTCG Devel,
	KONRAD Frédéric, alvise rigo, Emilio G. Cota, nikunj,
	Mark Burton, Paolo Bonzini, Jan Kiszka, Sergey Fedorov,
	Bamvor Zhang Jian, Peter Crosthwaite


Pranith Kumar <bobby.prani@gmail.com> writes:

> Hi Alex,
>
> On Wed, Feb 22, 2017 at 12:13 PM, Alex Bennée <alex.bennee@linaro.org> wrote:
>> From: KONRAD Frederic <fred.konrad@greensocs.com>
>>
>> We know there will be cases where MTTCG won't work until additional work
>> is done in the front/back ends to support. It will however be useful to
>> be able to turn it on.
>>
>> As a result MTTCG will default to off unless the combination is
>> supported. However the user can turn it on for the sake of testing.
>>
>> Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
>> [AJB: move to -accel tcg,thread=multi|single, defaults]
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> Reviewed-by: Richard Henderson <rth@twiddle.net>
>> ---
>> v1:
>>   - merge with add mttcg option.
>>   - update commit message
>> v2:
>>   - machine_init->opts_init
>> v3:
>>   - moved from -tcg to -accel tcg,thread=single|multi
>>   - fix checkpatch warnings
>> v4:
>>   - make mttcg_enabled extern, qemu_tcg_mttcg_enabled() now just macro
>>   - qemu_tcg_configure now propagates Error instead of exiting
>>   - better error checking of thread=foo
>>   - use CONFIG flags for default_mttcg_enabled()
>>   - disable mttcg with icount, error if both forced on
>> v7
>>   - explicitly disable MTTCG for TCG_OVERSIZED_GUEST
>>   - use check_tcg_memory_orders_compatible() instead of CONFIG_MTTCG_HOST
>>   - change CONFIG_MTTCG_TARGET to TARGET_SUPPORTS_MTTCG
>> v8
>>   - fix missing include tcg.h
>>   - change mismatched MOs to a warning instead of error
>> v10
>>   - TCG_DEFAULT_MO -> TCG_GUEST_DEFAULT_MO
>> v11
>>   - tweak warning message
>> ---
>>  cpus.c                | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++
>>  include/qom/cpu.h     |  9 +++++++
>>  include/sysemu/cpus.h |  2 ++
>>  qemu-options.hx       | 20 ++++++++++++++
>>  tcg/tcg.h             |  9 +++++++
>>  vl.c                  | 49 +++++++++++++++++++++++++++++++++-
>>  6 files changed, 161 insertions(+), 1 deletion(-)
>>
>> diff --git a/cpus.c b/cpus.c
>> index 0bcb5b50b6..c296ec715f 100644
>> --- a/cpus.c
>> +++ b/cpus.c
> <...>
>> +void qemu_tcg_configure(QemuOpts *opts, Error **errp)
>> +{
>> +    const char *t = qemu_opt_get(opts, "thread");
>> +    if (t) {
>> +        if (strcmp(t, "multi") == 0) {
>> +            if (TCG_OVERSIZED_GUEST) {
>> +                error_setg(errp, "No MTTCG when guest word size > hosts");
>> +            } else {
>> +                if (!check_tcg_memory_orders_compatible()) {
>> +                    error_report("Guest expects a stronger memory ordering than"
>> +                                 "the host provides");
>> +                    error_printf("This may cause strange/hard to debug errors");
>> +                }
>
> This prints it as:
>
> Guest expects a stronger memory ordering thanthe host provides
>
> Please add a space between 'than' and 'the'.

Will do.

> Also why are you using
> error_report() for the first line and error_printf() for the second?

There is only one error to report, quoth HACKING:

"Use error_printf() & friends to print additional information."

--
Alex Bennée

^ permalink raw reply	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2017-02-23  8:21 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-22 17:13 [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 01/24] docs: new design document multi-thread-tcg.txt Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 02/24] mttcg: translate-all: Enable locking debug in a debug build Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 03/24] mttcg: Add missing tb_lock/unlock() in cpu_exec_step() Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 04/24] tcg: move TCG_MO/BAR types into own file Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 05/24] tcg: add options for enabling MTTCG Alex Bennée
2017-02-22 21:13   ` Pranith Kumar
2017-02-23  8:21     ` Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 06/24] tcg: add kick timer for single-threaded vCPU emulation Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 07/24] tcg: rename tcg_current_cpu to tcg_current_rr_cpu Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 08/24] tcg: drop global lock during TCG code execution Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 09/24] tcg: remove global exit_request Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 10/24] tcg: enable tb_lock() for SoftMMU Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 11/24] tcg: enable thread-per-vCPU Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 12/24] tcg: handle EXCP_ATOMIC exception for system emulation Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 13/24] cputlb: add assert_cpu_is_self checks Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 14/24] cputlb: tweak qemu_ram_addr_from_host_nofail reporting Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 15/24] cputlb: introduce tlb_flush_* async work Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 16/24] cputlb and arm/sparc targets: convert mmuidx flushes from varg to bitmap Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 17/24] cputlb: add tlb_flush_by_mmuidx async routines Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 18/24] cputlb: atomically update tlb fields used by tlb_reset_dirty Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 19/24] cputlb: introduce tlb_flush_*_all_cpus[_synced] Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 20/24] target-arm/powerctl: defer cpu reset work to CPU context Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 21/24] target-arm: don't generate WFE/YIELD calls for MTTCG Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 22/24] target-arm: ensure all cross vCPUs TLB flushes complete Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 23/24] hw/misc/imx6_src: defer clearing of SRC_SCR reset bits Alex Bennée
2017-02-22 17:13 ` [Qemu-devel] [PATCH v13 24/24] tcg: enable MTTCG by default for ARM on x86 hosts Alex Bennée
2017-02-22 18:17 ` [Qemu-devel] [PATCH v13 00/24] MTTCG Base enabling patches with ARM enablement no-reply
2017-02-22 19:55   ` Alex Bennée
2017-02-22 21:02     ` Alex Bennée
2017-02-23  1:14       ` Pranith Kumar
2017-02-23  8:19         ` Alex Bennée

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.