diff --git a/qemu/cpus.c b/qemu/cpus.c
index c39a7578..6df60cb7 100644
--- a/qemu/cpus.c
+++ b/qemu/cpus.c
@@ -26,6 +26,8 @@
/* Needed early for CONFIG_BSD etc. */
#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "cpu.h"
#include "sysemu/sysemu.h"
#include "sysemu/cpus.h"
#include "qemu/thread.h"
diff --git a/qemu/header_gen.py b/qemu/header_gen.py
index 9257d7c8..39a73e52 100644
--- a/qemu/header_gen.py
+++ b/qemu/header_gen.py
@@ -3213,6 +3213,7 @@ mips_symbols = (
'mips_cpu_register_types',
'cpu_mips_init',
'cpu_state_reset',
+ 'do_raise_exception_err',
'helper_msa_andi_b',
'helper_msa_ori_b',
'helper_msa_nori_b',
diff --git a/qemu/hw/arm/tosa.c b/qemu/hw/arm/tosa.c
index 212456a4..d121c46f 100644
--- a/qemu/hw/arm/tosa.c
+++ b/qemu/hw/arm/tosa.c
@@ -13,12 +13,12 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "cpu.h"
#include "hw/hw.h"
#include "hw/arm/arm.h"
#include "hw/boards.h"
#include "exec/address-spaces.h"
-
static int tosa_init(struct uc_struct *uc, MachineState *machine)
{
if (uc->mode & UC_MODE_MCLASS) {
diff --git a/qemu/hw/arm/virt.c b/qemu/hw/arm/virt.c
index 81c068d9..ab65080c 100644
--- a/qemu/hw/arm/virt.c
+++ b/qemu/hw/arm/virt.c
@@ -34,6 +34,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
#include "qemu-common.h"
+#include "cpu.h"
#include "hw/arm/arm.h"
#include "hw/boards.h"
#include "exec/address-spaces.h"
diff --git a/qemu/hw/i386/pc.c b/qemu/hw/i386/pc.c
index 8f3c9205..96da1fb6 100644
--- a/qemu/hw/i386/pc.c
+++ b/qemu/hw/i386/pc.c
@@ -24,6 +24,7 @@
/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */
#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/hw.h"
#include "hw/i386/pc.h"
#include "sysemu/cpus.h"
diff --git a/qemu/hw/i386/pc_piix.c b/qemu/hw/i386/pc_piix.c
index 9a3fde1a..ad7d54c9 100644
--- a/qemu/hw/i386/pc_piix.c
+++ b/qemu/hw/i386/pc_piix.c
@@ -24,6 +24,7 @@
/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */
#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/i386/pc.h"
#include "hw/boards.h"
#include "exec/address-spaces.h"
diff --git a/qemu/hw/intc/apic.c b/qemu/hw/intc/apic.c
index 2c73db02..cc1ceb0e 100644
--- a/qemu/hw/intc/apic.c
+++ b/qemu/hw/intc/apic.c
@@ -18,6 +18,7 @@
*/
#include "qemu/osdep.h"
#include "qemu-common.h"
+#include "cpu.h"
#include "qemu/thread.h"
#include "hw/i386/apic_internal.h"
#include "hw/i386/apic.h"
diff --git a/qemu/hw/intc/apic_common.c b/qemu/hw/intc/apic_common.c
index 9d75a67a..7d4247f9 100644
--- a/qemu/hw/intc/apic_common.c
+++ b/qemu/hw/intc/apic_common.c
@@ -18,6 +18,8 @@
* License along with this library; if not, see
*/
#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "cpu.h"
#include "qapi/error.h"
#include "hw/i386/apic.h"
#include "hw/i386/apic_internal.h"
diff --git a/qemu/hw/m68k/dummy_m68k.c b/qemu/hw/m68k/dummy_m68k.c
index d1558579..793bf2f3 100644
--- a/qemu/hw/m68k/dummy_m68k.c
+++ b/qemu/hw/m68k/dummy_m68k.c
@@ -9,12 +9,13 @@
/* Unicorn Emulator Engine */
/* By Nguyen Anh Quynh, 2015 */
+#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/hw.h"
#include "hw/m68k/m68k.h"
#include "hw/boards.h"
#include "exec/address-spaces.h"
-
/* Board init. */
static int dummy_m68k_init(struct uc_struct *uc, MachineState *machine)
{
diff --git a/qemu/hw/mips/addr.c b/qemu/hw/mips/addr.c
index ff3b9526..287a6de4 100644
--- a/qemu/hw/mips/addr.c
+++ b/qemu/hw/mips/addr.c
@@ -20,6 +20,8 @@
* THE SOFTWARE.
*/
+#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/hw.h"
#include "hw/mips/cpudevs.h"
diff --git a/qemu/hw/mips/cputimer.c b/qemu/hw/mips/cputimer.c
index 1ffa418d..db573ca9 100644
--- a/qemu/hw/mips/cputimer.c
+++ b/qemu/hw/mips/cputimer.c
@@ -20,6 +20,8 @@
* THE SOFTWARE.
*/
+#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/hw.h"
#include "hw/mips/cpudevs.h"
#include "qemu/timer.h"
diff --git a/qemu/include/exec/hwaddr.h b/qemu/include/exec/hwaddr.h
index 8ac83941..eab2604e 100644
--- a/qemu/include/exec/hwaddr.h
+++ b/qemu/include/exec/hwaddr.h
@@ -3,12 +3,13 @@
#ifndef HWADDR_H
#define HWADDR_H
+#include
+#include "unicorn/platform.h"
+
#define HWADDR_BITS 64
/* hwaddr is the type of a physical address (its size can
be different from 'target_ulong'). */
-#include "unicorn/platform.h"
-
typedef uint64_t hwaddr;
#define HWADDR_MAX UINT64_MAX
#define TARGET_FMT_plx "%016" PRIx64
diff --git a/qemu/include/hw/boards.h b/qemu/include/hw/boards.h
index e0afde01..786a4ba2 100644
--- a/qemu/include/hw/boards.h
+++ b/qemu/include/hw/boards.h
@@ -7,6 +7,7 @@
#include "sysemu/accel.h"
#include "hw/qdev.h"
#include "qom/object.h"
+#include "qom/cpu.h"
#include "uc_priv.h"
typedef int QEMUMachineInitFunc(struct uc_struct *uc, MachineState *ms);
diff --git a/qemu/include/hw/hw.h b/qemu/include/hw/hw.h
index 54b25b6b..e2e7f11b 100644
--- a/qemu/include/hw/hw.h
+++ b/qemu/include/hw/hw.h
@@ -2,12 +2,12 @@
#ifndef QEMU_HW_H
#define QEMU_HW_H
-#include "qemu-common.h"
-
-#if !defined(CONFIG_USER_ONLY) && !defined(NEED_CPU_H)
-#include "exec/cpu-common.h"
+#ifdef CONFIG_USER_ONLY
+#error Cannot include hw/hw.h from user emulation
#endif
+#include "qemu-common.h"
+#include "exec/cpu-common.h"
#include "exec/ioport.h"
#include "qemu/log.h"
diff --git a/qemu/include/qemu-common.h b/qemu/include/qemu-common.h
index 8a3fa009..6734bcbc 100644
--- a/qemu/include/qemu-common.h
+++ b/qemu/include/qemu-common.h
@@ -25,11 +25,6 @@
#include "unicorn/platform.h"
-/* FIXME: Remove NEED_CPU_H. */
-#ifdef NEED_CPU_H
-#include "cpu.h"
-#endif /* !defined(NEED_CPU_H) */
-
#define qemu_isalnum(c) isalnum((unsigned char)(c))
#define qemu_isalpha(c) isalpha((unsigned char)(c))
#define qemu_iscntrl(c) iscntrl((unsigned char)(c))
diff --git a/qemu/ioport.c b/qemu/ioport.c
index 6a38a511..87293f83 100644
--- a/qemu/ioport.c
+++ b/qemu/ioport.c
@@ -28,6 +28,8 @@
/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */
#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "cpu.h"
#include "exec/ioport.h"
#include "exec/memory.h"
#include "exec/address-spaces.h"
diff --git a/qemu/memory.c b/qemu/memory.c
index 754ffc59..959a4613 100644
--- a/qemu/memory.c
+++ b/qemu/memory.c
@@ -16,6 +16,8 @@
/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */
#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "cpu.h"
#include "qapi/error.h"
#include "qemu-common.h"
#include "exec/memory.h"
diff --git a/qemu/mips.h b/qemu/mips.h
index 31eef32d..8d30c696 100644
--- a/qemu/mips.h
+++ b/qemu/mips.h
@@ -3160,6 +3160,7 @@
#define mips_cpu_register_types mips_cpu_register_types_mips
#define cpu_mips_init cpu_mips_init_mips
#define cpu_state_reset cpu_state_reset_mips
+#define do_raise_exception_err do_raise_exception_err_mips
#define helper_msa_andi_b helper_msa_andi_b_mips
#define helper_msa_ori_b helper_msa_ori_b_mips
#define helper_msa_nori_b helper_msa_nori_b_mips
diff --git a/qemu/mips64.h b/qemu/mips64.h
index d44c78c8..41a1eb2b 100644
--- a/qemu/mips64.h
+++ b/qemu/mips64.h
@@ -3160,6 +3160,7 @@
#define mips_cpu_register_types mips_cpu_register_types_mips64
#define cpu_mips_init cpu_mips_init_mips64
#define cpu_state_reset cpu_state_reset_mips64
+#define do_raise_exception_err do_raise_exception_err_mips64
#define helper_msa_andi_b helper_msa_andi_b_mips64
#define helper_msa_ori_b helper_msa_ori_b_mips64
#define helper_msa_nori_b helper_msa_nori_b_mips64
diff --git a/qemu/mips64el.h b/qemu/mips64el.h
index faa6c7aa..c0c1857f 100644
--- a/qemu/mips64el.h
+++ b/qemu/mips64el.h
@@ -3160,6 +3160,7 @@
#define mips_cpu_register_types mips_cpu_register_types_mips64el
#define cpu_mips_init cpu_mips_init_mips64el
#define cpu_state_reset cpu_state_reset_mips64el
+#define do_raise_exception_err do_raise_exception_err_mips64el
#define helper_msa_andi_b helper_msa_andi_b_mips64el
#define helper_msa_ori_b helper_msa_ori_b_mips64el
#define helper_msa_nori_b helper_msa_nori_b_mips64el
diff --git a/qemu/mipsel.h b/qemu/mipsel.h
index ac108c7e..73474c88 100644
--- a/qemu/mipsel.h
+++ b/qemu/mipsel.h
@@ -3160,6 +3160,7 @@
#define mips_cpu_register_types mips_cpu_register_types_mipsel
#define cpu_mips_init cpu_mips_init_mipsel
#define cpu_state_reset cpu_state_reset_mipsel
+#define do_raise_exception_err do_raise_exception_err_mipsel
#define helper_msa_andi_b helper_msa_andi_b_mipsel
#define helper_msa_ori_b helper_msa_ori_b_mipsel
#define helper_msa_nori_b helper_msa_nori_b_mipsel
diff --git a/qemu/target-arm/unicorn_aarch64.c b/qemu/target-arm/unicorn_aarch64.c
index 55c21c66..3d62be53 100644
--- a/qemu/target-arm/unicorn_aarch64.c
+++ b/qemu/target-arm/unicorn_aarch64.c
@@ -1,15 +1,15 @@
/* Unicorn Emulator Engine */
/* By Nguyen Anh Quynh , 2015 */
+#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/boards.h"
#include "hw/arm/arm.h"
#include "sysemu/cpus.h"
#include "unicorn.h"
-#include "cpu.h"
#include "unicorn_common.h"
#include "uc_priv.h"
-
const int ARM64_REGS_STORAGE_SIZE = offsetof(CPUARMState, tlb_table);
static void arm64_set_pc(struct uc_struct *uc, uint64_t address)
diff --git a/qemu/target-arm/unicorn_arm.c b/qemu/target-arm/unicorn_arm.c
index dc2c6277..cf90f23a 100644
--- a/qemu/target-arm/unicorn_arm.c
+++ b/qemu/target-arm/unicorn_arm.c
@@ -1,11 +1,12 @@
/* Unicorn Emulator Engine */
/* By Nguyen Anh Quynh , 2015 */
+#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/boards.h"
#include "hw/arm/arm.h"
#include "sysemu/cpus.h"
#include "unicorn.h"
-#include "cpu.h"
#include "unicorn_common.h"
#include "uc_priv.h"
diff --git a/qemu/target-i386/unicorn.c b/qemu/target-i386/unicorn.c
index 9cc06e6f..29c6e13f 100644
--- a/qemu/target-i386/unicorn.c
+++ b/qemu/target-i386/unicorn.c
@@ -1,11 +1,12 @@
/* Unicorn Emulator Engine */
/* By Nguyen Anh Quynh , 2015 */
+#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/boards.h"
#include "hw/i386/pc.h"
#include "sysemu/cpus.h"
#include "unicorn.h"
-#include "cpu.h"
#include "tcg.h"
#include "unicorn_common.h"
#include /* needed for uc_x86_mmr */
diff --git a/qemu/target-m68k/unicorn.c b/qemu/target-m68k/unicorn.c
index 65b8cd98..ab066023 100644
--- a/qemu/target-m68k/unicorn.c
+++ b/qemu/target-m68k/unicorn.c
@@ -1,15 +1,15 @@
/* Unicorn Emulator Engine */
/* By Nguyen Anh Quynh , 2015 */
+#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/boards.h"
#include "hw/m68k/m68k.h"
#include "sysemu/cpus.h"
#include "unicorn.h"
-#include "cpu.h"
#include "unicorn_common.h"
#include "uc_priv.h"
-
const int M68K_REGS_STORAGE_SIZE = offsetof(CPUM68KState, tlb_table);
static void m68k_set_pc(struct uc_struct *uc, uint64_t address)
diff --git a/qemu/target-mips/cpu.h b/qemu/target-mips/cpu.h
index 47130b36..3819642e 100644
--- a/qemu/target-mips/cpu.h
+++ b/qemu/target-mips/cpu.h
@@ -1140,22 +1140,11 @@ static inline void cpu_mips_store_cause(CPUMIPSState *env, target_ulong val)
}
#endif
-static inline void QEMU_NORETURN do_raise_exception_err(CPUMIPSState *env,
- uint32_t exception,
- int error_code,
- uintptr_t pc)
-{
- CPUState *cs = CPU(mips_env_get_cpu(env));
+void QEMU_NORETURN do_raise_exception_err(CPUMIPSState *env, uint32_t exception,
+ int error_code, uintptr_t pc);
- if (exception < EXCP_SC) {
- qemu_log_mask(CPU_LOG_INT, "%s: %d %d\n",
- __func__, exception, error_code);
- }
- cs->exception_index = exception;
- env->error_code = error_code;
-
- cpu_loop_exit_restore(cs, pc);
-}
+void QEMU_NORETURN do_raise_exception_err(CPUMIPSState *env, uint32_t exception,
+ int error_code, uintptr_t pc);
static inline void QEMU_NORETURN do_raise_exception(CPUMIPSState *env,
uint32_t exception,
diff --git a/qemu/target-mips/helper.c b/qemu/target-mips/helper.c
index 35769870..a9043566 100644
--- a/qemu/target-mips/helper.c
+++ b/qemu/target-mips/helper.c
@@ -827,3 +827,21 @@ void r4k_invalidate_tlb (CPUMIPSState *env, int idx, int use_extra)
}
}
#endif
+
+
+void QEMU_NORETURN do_raise_exception_err(CPUMIPSState *env,
+ uint32_t exception,
+ int error_code,
+ uintptr_t pc)
+{
+ CPUState *cs = CPU(mips_env_get_cpu(env));
+
+ if (exception < EXCP_SC) {
+ qemu_log_mask(CPU_LOG_INT, "%s: %d %d\n",
+ __func__, exception, error_code);
+ }
+ cs->exception_index = exception;
+ env->error_code = error_code;
+
+ cpu_loop_exit_restore(cs, pc);
+}
diff --git a/qemu/target-mips/unicorn.c b/qemu/target-mips/unicorn.c
index 53f8c215..72c88df2 100644
--- a/qemu/target-mips/unicorn.c
+++ b/qemu/target-mips/unicorn.c
@@ -1,11 +1,12 @@
/* Unicorn Emulator Engine */
/* By Nguyen Anh Quynh , 2015 */
+#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/boards.h"
#include "hw/mips/mips.h"
#include "sysemu/cpus.h"
#include "unicorn.h"
-#include "cpu.h"
#include "unicorn_common.h"
#include "uc_priv.h"
diff --git a/qemu/target-sparc/unicorn.c b/qemu/target-sparc/unicorn.c
index e682b87a..af41c7ec 100644
--- a/qemu/target-sparc/unicorn.c
+++ b/qemu/target-sparc/unicorn.c
@@ -1,15 +1,15 @@
/* Unicorn Emulator Engine */
/* By Nguyen Anh Quynh , 2015 */
+#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/boards.h"
#include "hw/sparc/sparc.h"
#include "sysemu/cpus.h"
#include "unicorn.h"
-#include "cpu.h"
#include "unicorn_common.h"
#include "uc_priv.h"
-
const int SPARC_REGS_STORAGE_SIZE = offsetof(CPUSPARCState, tlb_table);
static bool sparc_stop_interrupt(int intno)
diff --git a/qemu/target-sparc/unicorn64.c b/qemu/target-sparc/unicorn64.c
index e6f07a33..ab837c67 100644
--- a/qemu/target-sparc/unicorn64.c
+++ b/qemu/target-sparc/unicorn64.c
@@ -1,6 +1,8 @@
/* Unicorn Emulator Engine */
/* By Nguyen Anh Quynh , 2015 */
+#include "qemu/osdep.h"
+#include "cpu.h"
#include "hw/boards.h"
#include "hw/sparc/sparc.h"
#include "sysemu/cpus.h"
@@ -9,7 +11,6 @@
#include "unicorn_common.h"
#include "uc_priv.h"
-
const int SPARC64_REGS_STORAGE_SIZE = offsetof(CPUSPARCState, tlb_table);
static bool sparc_stop_interrupt(int intno)
diff --git a/qemu/tcg/optimize.c b/qemu/tcg/optimize.c
index 6db51680..9b0ff925 100644
--- a/qemu/tcg/optimize.c
+++ b/qemu/tcg/optimize.c
@@ -26,6 +26,7 @@
#include "qemu/osdep.h"
#include "qemu-common.h"
+#include "cpu.h"
#include "tcg-op.h"
#define CASE_OP_32_64(x) \
diff --git a/qemu/tcg/tcg-op.c b/qemu/tcg/tcg-op.c
index 0aefb2c6..504b8f24 100644
--- a/qemu/tcg/tcg-op.c
+++ b/qemu/tcg/tcg-op.c
@@ -23,6 +23,8 @@
*/
#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "cpu.h"
#include "tcg.h"
#include "tcg-op.h"
diff --git a/qemu/tcg/tcg.h b/qemu/tcg/tcg.h
index f12eed91..b2bb14ec 100644
--- a/qemu/tcg/tcg.h
+++ b/qemu/tcg/tcg.h
@@ -26,6 +26,7 @@
#define TCG_H
#include "qemu-common.h"
+#include "cpu.h"
#include "qemu/bitops.h"
#include "tcg-target.h"
#include "exec/exec-all.h"