cpu_abort() now takes a CPUState* argument.
Change-Id: I57091f47afc9b61be9279440dc21f1c905c23682
diff --git a/cputlb.c b/cputlb.c
index a999d49..220e7f9 100644
--- a/cputlb.c
+++ b/cputlb.c
@@ -324,6 +324,9 @@
{
int mmu_idx, page_index, pd;
void *p;
+#if !defined(TARGET_SPARC) && !defined(TARGET_MIPS)
+ CPUState *cpu = ENV_GET_CPU(env1);
+#endif
page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
mmu_idx = cpu_mmu_index(env1);
@@ -336,7 +339,8 @@
#if defined(TARGET_SPARC) || defined(TARGET_MIPS)
cpu_unassigned_access(env1, addr, 0, 1, 0, 4);
#else
- cpu_abort(env1, "Trying to execute code outside RAM or ROM at 0x" TARGET_FMT_lx "\n", addr);
+ cpu_abort(cpu, "Trying to execute code outside RAM or ROM at 0x"
+ TARGET_FMT_lx "\n", addr);
#endif
}
p = (void *)((uintptr_t)addr + env1->tlb_table[mmu_idx][page_index].addend);
diff --git a/exec.c b/exec.c
index ef45e00..83c28d1 100644
--- a/exec.c
+++ b/exec.c
@@ -468,10 +468,8 @@
cpu_unlink_tb(cpu->env_ptr);
}
-void cpu_abort(CPUArchState *env, const char *fmt, ...)
+void cpu_abort(CPUState *cpu, const char *fmt, ...)
{
- CPUState *cpu = ENV_GET_CPU(env);
-
va_list ap;
va_list ap2;
diff --git a/hw/android/goldfish/audio.c b/hw/android/goldfish/audio.c
index 9d15b8c..152a62c 100644
--- a/hw/android/goldfish/audio.c
+++ b/hw/android/goldfish/audio.c
@@ -419,7 +419,7 @@
return s->read_buffer_available;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_audio_read: Bad offset %" HWADDR_PRIx "\n",
offset);
return 0;
@@ -496,7 +496,7 @@
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_audio_write: Bad offset %" HWADDR_PRIx "\n",
offset);
}
diff --git a/hw/android/goldfish/battery.c b/hw/android/goldfish/battery.c
index 796d5dc..f9c83af 100644
--- a/hw/android/goldfish/battery.c
+++ b/hw/android/goldfish/battery.c
@@ -118,7 +118,7 @@
return s->capacity;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_battery_read: Bad offset %" HWADDR_PRIx "\n",
offset);
return 0;
@@ -138,7 +138,7 @@
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_audio_write: Bad offset %" HWADDR_PRIx "\n",
offset);
}
diff --git a/hw/android/goldfish/device.c b/hw/android/goldfish/device.c
index 3b11a14..23925ee 100644
--- a/hw/android/goldfish/device.c
+++ b/hw/android/goldfish/device.c
@@ -54,10 +54,13 @@
void goldfish_device_set_irq(struct goldfish_device *dev, int irq, int level)
{
- if(irq >= dev->irq_count)
- cpu_abort (cpu_single_env, "goldfish_device_set_irq: Bad irq %d >= %d\n", irq, dev->irq_count);
- else
+ if(irq >= dev->irq_count) {
+ cpu_abort(current_cpu,
+ "goldfish_device_set_irq: Bad irq %d >= %d\n",
+ irq, dev->irq_count);
+ } else {
qemu_set_irq(goldfish_pic[dev->irq + irq], level);
+ }
}
int goldfish_add_device_no_io(struct goldfish_device *dev)
@@ -143,7 +146,7 @@
case PDEV_BUS_IRQ_COUNT:
return s->current ? s->current->irq_count : 0;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_bus_read: Bad offset %" HWADDR_PRIx "\n",
offset);
return 0;
@@ -172,7 +175,7 @@
goldfish_bus_op_init(s);
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_bus_write: Bad PDEV_BUS_OP value %x\n",
value);
};
@@ -188,7 +191,7 @@
goldfish_64bit_guest = 1;
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_bus_write: Bad offset %" HWADDR_PRIx "\n",
offset);
}
diff --git a/hw/android/goldfish/fb.c b/hw/android/goldfish/fb.c
index bbb392a..6d19ea2 100644
--- a/hw/android/goldfish/fb.c
+++ b/hw/android/goldfish/fb.c
@@ -578,7 +578,7 @@
return goldfish_fb_get_pixel_format(s);
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_fb_read: Bad offset %" HWADDR_PRIx "\n",
offset);
return 0;
@@ -622,7 +622,7 @@
s->need_update = 1;
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_fb_write: Bad offset %" HWADDR_PRIx "\n",
offset);
}
diff --git a/hw/android/goldfish/interrupt.c b/hw/android/goldfish/interrupt.c
index 5b60151..db5a0ac 100644
--- a/hw/android/goldfish/interrupt.c
+++ b/hw/android/goldfish/interrupt.c
@@ -114,7 +114,7 @@
return 0;
}
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_int_read: Bad offset %" HWADDR_PRIx "\n",
offset);
return 0;
@@ -148,7 +148,7 @@
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_int_write: Bad offset %" HWADDR_PRIx "\n",
offset);
return;
diff --git a/hw/android/goldfish/mmc.c b/hw/android/goldfish/mmc.c
index aece344..547e42c 100644
--- a/hw/android/goldfish/mmc.c
+++ b/hw/android/goldfish/mmc.c
@@ -339,11 +339,11 @@
}
capacity -= 1;
if (exponent < 2) {
- cpu_abort(cpu_single_env, "SDCard too small, must be at least 9MB\n");
+ cpu_abort(current_cpu, "SDCard too small, must be at least 9MB\n");
}
exponent -= 2;
if (exponent > 7) {
- cpu_abort(cpu_single_env, "SDCard too large.\n");
+ cpu_abort(current_cpu, "SDCard too large.\n");
}
s->resp[2] |= (((uint32_t)capacity >> 2) & 0x3FF); // high 10 bits to bottom of resp[2]
@@ -488,7 +488,7 @@
return ret;
}
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_mmc_read: Bad offset %" HWADDR_PRIx "\n",
offset);
return 0;
@@ -540,7 +540,7 @@
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_mmc_write: Bad offset %" HWADDR_PRIx "\n",
offset);
}
diff --git a/hw/android/goldfish/nand.c b/hw/android/goldfish/nand.c
index 47c5ffb..e964d23 100644
--- a/hw/android/goldfish/nand.c
+++ b/hw/android/goldfish/nand.c
@@ -549,7 +549,7 @@
return 0;
return 0;
default:
- cpu_abort(cpu_single_env, "nand_dev_do_cmd: Bad command %x\n", cmd);
+ cpu_abort(current_cpu, "nand_dev_do_cmd: Bad command %x\n", cmd);
return 0;
}
}
@@ -563,7 +563,7 @@
case NAND_DEV:
s->dev = value;
if(s->dev >= nand_dev_count) {
- cpu_abort(cpu_single_env, "nand_dev_write: Bad dev %x\n", value);
+ cpu_abort(current_cpu, "nand_dev_write: Bad dev %x\n", value);
}
break;
case NAND_ADDR_HIGH:
@@ -604,7 +604,7 @@
}
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"nand_dev_write: Bad offset %" HWADDR_PRIx "\n",
offset);
break;
@@ -654,7 +654,7 @@
return (uint32_t)(dev->max_size >> 32);
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"nand_dev_read: Bad offset %" HWADDR_PRIx "\n",
offset);
return 0;
diff --git a/hw/android/goldfish/timer.c b/hw/android/goldfish/timer.c
index d4dd5f8..9daf65d 100644
--- a/hw/android/goldfish/timer.c
+++ b/hw/android/goldfish/timer.c
@@ -84,7 +84,7 @@
case TIMER_TIME_HIGH:
return s->now_ns >> 32;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_timer_read: Bad offset %" HWADDR_PRIx "\n",
offset);
return 0;
@@ -118,7 +118,7 @@
goldfish_device_set_irq(&s->dev, 0, 0);
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_timer_write: Bad offset %" HWADDR_PRIx "\n",
offset);
}
@@ -172,7 +172,7 @@
case 0x4:
return s->now >> 32;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_rtc_read: Bad offset %" HWADDR_PRIx "\n",
offset);
return 0;
@@ -193,7 +193,7 @@
goldfish_device_set_irq(&s->dev, 0, 0);
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_rtc_write: Bad offset %" HWADDR_PRIx "\n",
offset);
}
diff --git a/hw/android/goldfish/trace.c b/hw/android/goldfish/trace.c
index c6f31c9..e4bd9fa 100644
--- a/hw/android/goldfish/trace.c
+++ b/hw/android/goldfish/trace.c
@@ -229,7 +229,7 @@
default:
if (offset < 4096) {
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"trace_dev_write: Bad offset %" HWADDR_PRIx "\n",
offset);
} else {
@@ -253,7 +253,7 @@
default:
if (offset < 4096) {
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"trace_dev_read: Bad offset %" HWADDR_PRIx "\n",
offset);
} else {
diff --git a/hw/android/goldfish/tty.c b/hw/android/goldfish/tty.c
index 27c9c70..561b425 100644
--- a/hw/android/goldfish/tty.c
+++ b/hw/android/goldfish/tty.c
@@ -87,7 +87,7 @@
case TTY_BYTES_READY:
return s->data_count;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_tty_read: Bad offset %" HWADDR_PRIx "\n",
offset);
return 0;
@@ -150,7 +150,7 @@
case TTY_CMD_READ_BUFFER:
if(s->ptr_len > s->data_count)
- cpu_abort (cpu_single_env, "goldfish_tty_write: reading more data than available %d %d\n", s->ptr_len, s->data_count);
+ cpu_abort(current_cpu, "goldfish_tty_write: reading more data than available %d %d\n", s->ptr_len, s->data_count);
safe_memory_rw_debug(current_cpu, s->ptr, s->data, s->ptr_len,1);
//printf("goldfish_tty_write: read %d bytes to %llx\n", s->ptr_len, (unsigned long long)s->ptr);
if(s->data_count > s->ptr_len)
@@ -161,7 +161,7 @@
break;
default:
- cpu_abort (cpu_single_env, "goldfish_tty_write: Bad command %x\n", value);
+ cpu_abort(current_cpu, "goldfish_tty_write: Bad command %x\n", value);
};
break;
@@ -178,7 +178,7 @@
break;
default:
- cpu_abort(cpu_single_env,
+ cpu_abort(current_cpu,
"goldfish_tty_write: Bad offset %" HWADDR_PRIx "\n",
offset);
}
diff --git a/hw/mips/mips_pic.c b/hw/mips/mips_pic.c
index bb54037..c1480c5 100644
--- a/hw/mips/mips_pic.c
+++ b/hw/mips/mips_pic.c
@@ -16,24 +16,25 @@
static void mips_cpu_irq_handler(void *opaque, int irq, int level)
{
- CPUOldState *env = (CPUOldState *)opaque;
+ CPUState *cs = opaque;
+ CPUArchState *env = cs->env_ptr;
int causebit;
if (irq < 0 || 7 < irq)
- cpu_abort(env, "mips_pic_cpu_handler: Bad interrupt line %d\n",
+ cpu_abort(cs, "mips_pic_cpu_handler: Bad interrupt line %d\n",
irq);
causebit = 0x00000100 << irq;
if (level) {
env->CP0_Cause |= causebit;
- cpu_interrupt(ENV_GET_CPU(env), CPU_INTERRUPT_HARD);
+ cpu_interrupt(cs, CPU_INTERRUPT_HARD);
} else {
env->CP0_Cause &= ~causebit;
- cpu_reset_interrupt(ENV_GET_CPU(env), CPU_INTERRUPT_HARD);
+ cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
}
}
-qemu_irq *mips_cpu_irq_init(CPUOldState *env)
+qemu_irq *mips_cpu_irq_init(CPUArchState *env)
{
- return qemu_allocate_irqs(mips_cpu_irq_handler, env, 8);
+ return qemu_allocate_irqs(mips_cpu_irq_handler, ENV_GET_CPU(env), 8);
}
diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h
index 1a7b2ab..63492fa 100644
--- a/include/exec/cpu-all.h
+++ b/include/exec/cpu-all.h
@@ -361,9 +361,6 @@
int page_check_range(target_ulong start, target_ulong len, int flags);
#endif
-void QEMU_NORETURN cpu_abort(CPUArchState *env, const char *fmt, ...)
- GCC_FMT_ATTR(2, 3);
-
/* Flags for use in ENV->INTERRUPT_PENDING.
The numbers assigned here are non-sequential in order to preserve
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index dcab7d4..ea5a370 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -21,6 +21,7 @@
#define QEMU_CPU_H
#include <signal.h>
+#include <setjmp.h>
#include "hw/qdev-core.h"
#include "exec/hwaddr.h"
#include "qemu/queue.h"
@@ -28,7 +29,8 @@
#include "qemu/tls.h"
#include "qemu/typedefs.h"
-typedef int (*WriteCoreDumpFunction)(void *buf, size_t size, void *opaque);
+typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size,
+ void *opaque);
/**
* vaddr:
@@ -42,6 +44,12 @@
#define VADDR_PRIX PRIX64
#define VADDR_MAX UINT64_MAX
+/* Since this macro is used a lot in hot code paths and in conjunction with
+ * FooCPU *foo_env_get_cpu(), we deviate from usual QOM practice by using
+ * an unchecked cast.
+ */
+#define CPU(obj) ((CPUState *)(obj))
+
typedef struct CPUState CPUState;
typedef void (*CPUUnassignedAccess)(CPUState *cpu, hwaddr addr,
@@ -50,6 +58,9 @@
struct TranslationBlock;
+struct KVMState;
+struct kvm_run;
+
// TODO(digit): Make this a proper QOM object that inherits from
// DeviceState/DeviceClass.
struct CPUState {
@@ -60,7 +71,7 @@
struct QemuThread *thread;
uint32_t host_tid; /* host thread ID */
- int running; /* Nonzero if cpu is currently running(usermode). */
+ bool running;
struct QemuCond *halt_cond;
struct qemu_work_item *queued_work_first, *queued_work_last;
@@ -80,7 +91,7 @@
const char *cpu_model_str;
int kvm_fd;
- int kvm_vcpu_dirty;
+ bool kvm_vcpu_dirty;
struct KVMState *kvm_state;
struct kvm_run *kvm_run;
@@ -91,8 +102,6 @@
uint32_t halted; /* used by alpha, cris, ppc TCG */
};
-#define CPU(obj) ((CPUState*)(obj))
-
QTAILQ_HEAD(CPUTailQ, CPUState);
extern struct CPUTailQ cpus;
#define CPU_NEXT(cpu) QTAILQ_NEXT(cpu, node)
@@ -263,4 +272,7 @@
*/
void cpu_single_step(CPUState *cpu, int enabled);
+void QEMU_NORETURN cpu_abort(CPUState *cpu, const char *fmt, ...)
+ GCC_FMT_ATTR(2, 3);
+
#endif // QEMU_CPU_H
diff --git a/target-arm/helper.c b/target-arm/helper.c
index 9357ca4..6cbea7c 100644
--- a/target-arm/helper.c
+++ b/target-arm/helper.c
@@ -283,7 +283,7 @@
env->cp15.c1_sys = 0x00000070;
break;
default:
- cpu_abort(env, "Bad CPU ID: %x\n", id);
+ cpu_abort(ENV_GET_CPU(env), "Bad CPU ID: %x\n", id);
break;
}
@@ -640,41 +640,56 @@
/* These should probably raise undefined insn exceptions. */
void HELPER(set_cp15)(CPUARMState *env, uint32_t insn, uint32_t val)
{
- cpu_abort(env, "cp15 insn %08x\n", insn);
+ ARMCPU *cpu = arm_env_get_cpu(env);
+
+ cpu_abort(CPU(cpu), "cp15 insn %08x\n", insn);
}
uint32_t HELPER(get_cp15)(CPUARMState *env, uint32_t insn)
{
- cpu_abort(env, "cp15 insn %08x\n", insn);
+ ARMCPU *cpu = arm_env_get_cpu(env);
+
+ cpu_abort(CPU(cpu), "cp15 insn %08x\n", insn);
return 0;
}
/* These should probably raise undefined insn exceptions. */
void HELPER(v7m_msr)(CPUARMState *env, uint32_t reg, uint32_t val)
{
- cpu_abort(env, "v7m_mrs %d\n", reg);
+ ARMCPU *cpu = arm_env_get_cpu(env);
+
+ cpu_abort(CPU(cpu), "v7m_msr %d\n", reg);
}
uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
{
- cpu_abort(env, "v7m_mrs %d\n", reg);
+ ARMCPU *cpu = arm_env_get_cpu(env);
+
+ cpu_abort(CPU(cpu), "v7m_mrs %d\n", reg);
return 0;
}
void switch_mode(CPUARMState *env, int mode)
{
- if (mode != ARM_CPU_MODE_USR)
- cpu_abort(env, "Tried to switch out of user mode\n");
+ ARMCPU *cpu = arm_env_get_cpu(env);
+
+ if (mode != ARM_CPU_MODE_USR) {
+ cpu_abort(CPU(cpu), "Tried to switch out of user mode\n");
+ }
}
void HELPER(set_r13_banked)(CPUARMState *env, uint32_t mode, uint32_t val)
{
- cpu_abort(env, "banked r13 write\n");
+ ARMCPU *cpu = arm_env_get_cpu(env);
+
+ cpu_abort(CPU(cpu), "banked r13 write\n");
}
uint32_t HELPER(get_r13_banked)(CPUARMState *env, uint32_t mode)
{
- cpu_abort(env, "banked r13 read\n");
+ ARMCPU *cpu = arm_env_get_cpu(env);
+
+ cpu_abort(CPU(cpu), "banked r13 read\n");
return 0;
}
@@ -683,7 +698,7 @@
extern int semihosting_enabled;
/* Map CPU modes onto saved register banks. */
-static inline int bank_number (CPUARMState *env, int mode)
+int bank_number(int mode)
{
switch (mode) {
case ARM_CPU_MODE_USR:
@@ -700,8 +715,7 @@
case ARM_CPU_MODE_FIQ:
return 5;
}
- cpu_abort(env, "Bad mode %x\n", mode);
- return -1;
+ hw_error("bank number requested for bad CPSR mode value 0x%x\n", mode);
}
void switch_mode(CPUARMState *env, int mode)
@@ -721,12 +735,12 @@
memcpy (env->regs + 8, env->fiq_regs, 5 * sizeof(uint32_t));
}
- i = bank_number(env, old_mode);
+ i = bank_number(old_mode);
env->banked_r13[i] = env->regs[13];
env->banked_r14[i] = env->regs[14];
env->banked_spsr[i] = env->spsr;
- i = bank_number(env, mode);
+ i = bank_number(mode);
env->regs[13] = env->banked_r13[i];
env->regs[14] = env->banked_r14[i];
env->spsr = env->banked_spsr[i];
@@ -791,6 +805,7 @@
static void do_interrupt_v7m(CPUARMState *env)
{
+ CPUState *cs = CPU(arm_env_get_cpu(env));
uint32_t xpsr = xpsr_read(env);
uint32_t lr;
uint32_t addr;
@@ -836,7 +851,7 @@
do_v7m_exception_exit(env);
return;
default:
- cpu_abort(env, "Unhandled exception 0x%x\n", env->exception_index);
+ cpu_abort(cs, "Unhandled exception 0x%x\n", env->exception_index);
return; /* Never happens. Keep compiler happy. */
}
@@ -867,6 +882,7 @@
/* Handle a CPU exception. */
void do_interrupt(CPUARMState *env)
{
+ CPUState *cs = CPU(arm_env_get_cpu(env));
uint32_t addr;
uint32_t mask;
int new_mode;
@@ -949,7 +965,7 @@
offset = 4;
break;
default:
- cpu_abort(env, "Unhandled exception 0x%x\n", env->exception_index);
+ cpu_abort(cs, "Unhandled exception 0x%x\n", env->exception_index);
return; /* Never happens. Keep compiler happy. */
}
if (arm_feature(env, ARM_FEATURE_TRUSTZONE)) {
@@ -1860,7 +1876,7 @@
return;
bad_reg:
/* ??? For debugging only. Should raise illegal instruction exception. */
- cpu_abort(env, "Unimplemented cp15 register write (c%d, c%d, {%d, %d})\n",
+ cpu_abort(ENV_GET_CPU(env), "Unimplemented cp15 register write (c%d, c%d, {%d, %d})\n",
(insn >> 16) & 0xf, crm, op1, op2);
}
@@ -2245,7 +2261,7 @@
}
bad_reg:
/* ??? For debugging only. Should raise illegal instruction exception. */
- cpu_abort(env, "Unimplemented cp15 register read (c%d, c%d, {%d, %d})\n",
+ cpu_abort(ENV_GET_CPU(env), "Unimplemented cp15 register read (c%d, c%d, {%d, %d})\n",
(insn >> 16) & 0xf, crm, op1, op2);
return 0;
}
@@ -2255,7 +2271,7 @@
if ((env->uncached_cpsr & CPSR_M) == mode) {
env->regs[13] = val;
} else {
- env->banked_r13[bank_number(env, mode)] = val;
+ env->banked_r13[bank_number(mode)] = val;
}
}
@@ -2264,12 +2280,13 @@
if ((env->uncached_cpsr & CPSR_M) == mode) {
return env->regs[13];
} else {
- return env->banked_r13[bank_number(env, mode)];
+ return env->banked_r13[bank_number(mode)];
}
}
uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
{
+ ARMCPU *cpu = arm_env_get_cpu(env);
switch (reg) {
case 0: /* APSR */
return xpsr_read(env) & 0xf8000000;
@@ -2300,13 +2317,14 @@
return env->v7m.control;
default:
/* ??? For debugging only. */
- cpu_abort(env, "Unimplemented system register read (%d)\n", reg);
+ cpu_abort(CPU(cpu), "Unimplemented system register read (%d)\n", reg);
return 0;
}
}
void HELPER(v7m_msr)(CPUARMState *env, uint32_t reg, uint32_t val)
{
+ ARMCPU *cpu = arm_env_get_cpu(env);
switch (reg) {
case 0: /* APSR */
xpsr_write(env, val, 0xf8000000);
@@ -2367,7 +2385,7 @@
break;
default:
/* ??? For debugging only. */
- cpu_abort(env, "Unimplemented system register write (%d)\n", reg);
+ cpu_abort(CPU(cpu), "Unimplemented system register write (%d)\n", reg);
return;
}
}
@@ -2376,8 +2394,10 @@
ARMReadCPFunc *cp_read, ARMWriteCPFunc *cp_write,
void *opaque)
{
+ ARMCPU *cpu = arm_env_get_cpu(env);
+
if (cpnum < 0 || cpnum > 14) {
- cpu_abort(env, "Bad coprocessor number: %i\n", cpnum);
+ cpu_abort(CPU(cpu), "Bad coprocessor number: %i\n", cpnum);
return;
}
diff --git a/target-arm/translate.c b/target-arm/translate.c
index 8e2976f..a878df5 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -9797,6 +9797,7 @@
TranslationBlock *tb,
int search_pc)
{
+ CPUState *cs = ENV_GET_CPU(env);
DisasContext dc1, *dc = &dc1;
CPUBreakpoint *bp;
uint16_t *gen_opc_end;
@@ -9815,7 +9816,7 @@
dc->is_jmp = DISAS_NEXT;
dc->pc = pc_start;
- dc->singlestep_enabled = ENV_GET_CPU(env)->singlestep_enabled;
+ dc->singlestep_enabled = cs->singlestep_enabled;
dc->condjmp = 0;
dc->thumb = ARM_TBFLAG_THUMB(tb->flags);
dc->condexec_mask = (ARM_TBFLAG_CONDEXEC(tb->flags) & 0xf) << 1;
@@ -9976,7 +9977,7 @@
if (dc->condjmp) {
/* FIXME: This can theoretically happen with self-modifying
code. */
- cpu_abort(env, "IO on conditional branch instruction");
+ cpu_abort(cs, "IO on conditional branch instruction");
}
gen_io_end();
}
diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c
index 1795e69..e8a4345 100644
--- a/target-i386/seg_helper.c
+++ b/target-i386/seg_helper.c
@@ -95,6 +95,7 @@
static inline void get_ss_esp_from_tss(CPUX86State *env, uint32_t *ss_ptr,
uint32_t *esp_ptr, int dpl)
{
+ X86CPU *cpu = x86_env_get_cpu(env);
int type, index, shift;
#if 0
@@ -112,11 +113,11 @@
#endif
if (!(env->tr.flags & DESC_P_MASK)) {
- cpu_abort(env, "invalid tss");
+ cpu_abort(CPU(cpu), "invalid tss");
}
type = (env->tr.flags >> DESC_TYPE_SHIFT) & 0xf;
if ((type & 7) != 1) {
- cpu_abort(env, "invalid tss type");
+ cpu_abort(CPU(cpu), "invalid tss type");
}
shift = type >> 3;
index = (dpl * 4 + 2) << shift;
@@ -774,6 +775,7 @@
static inline target_ulong get_rsp_from_tss(CPUX86State *env, int level)
{
+ X86CPU *cpu = x86_env_get_cpu(env);
int index;
#if 0
@@ -782,7 +784,7 @@
#endif
if (!(env->tr.flags & DESC_P_MASK)) {
- cpu_abort(env, "invalid tss");
+ cpu_abort(CPU(cpu), "invalid tss");
}
index = 8 * level + 4;
if ((index + 7) > env->tr.limit) {
diff --git a/target-mips/helper.c b/target-mips/helper.c
index b078991..dc353b2 100644
--- a/target-mips/helper.c
+++ b/target-mips/helper.c
@@ -292,6 +292,8 @@
static inline target_ulong cpu_mips_get_pgd(CPUMIPSState *env)
{
+ MIPSCPU *cpu = mips_env_get_cpu(env);
+
if (unlikely(linux_pte_info.pgd_current_p == 0)) {
int i;
uint32_t lui_ins, lw_ins, srl_ins;
@@ -341,7 +343,7 @@
printf("TLBMiss handler dump:\n");
for (i = 0; i < 0x80; i+= 4)
printf("0x%08x: 0x%08x\n", ebase + i, ldl_phys(ebase + i));
- cpu_abort(env, "TLBMiss handler signature not recognised\n");
+ cpu_abort(CPU(cpu), "TLBMiss handler signature not recognised\n");
}
address = (lui_ins & 0xffff) << 16;
@@ -351,7 +353,7 @@
else if (address >= 0xa0000000 && address <= 0xc0000000)
address -= 0xa0000000;
else
- cpu_abort(env, "pgd_current_p not in KSEG0/KSEG1\n");
+ cpu_abort(CPU(cpu), "pgd_current_p not in KSEG0/KSEG1\n");
linux_pte_info.pgd_current_p = address;
linux_pte_info.softshift = (srl_ins >> 6) & 0x1f;
diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c
index 66c2cab..8a252f8 100644
--- a/target-mips/op_helper.c
+++ b/target-mips/op_helper.c
@@ -1205,6 +1205,7 @@
void helper_mtc0_status(CPUMIPSState *env, target_ulong arg1)
{
+ MIPSCPU *cpu = mips_env_get_cpu(env);
uint32_t val, old;
uint32_t mask = env->CP0_Status_rw_bitmask;
@@ -1226,7 +1227,9 @@
case MIPS_HFLAG_UM: qemu_log(", UM\n"); break;
case MIPS_HFLAG_SM: qemu_log(", SM\n"); break;
case MIPS_HFLAG_KM: qemu_log("\n"); break;
- default: cpu_abort(env, "Invalid MMU mode!\n"); break;
+ default:
+ cpu_abort(CPU(cpu), "Invalid MMU mode!\n");
+ break;
}
}
cpu_mips_update_irq(env);
@@ -1802,6 +1805,7 @@
static void debug_post_eret(CPUMIPSState *env)
{
+ MIPSCPU *cpu = mips_env_get_cpu(env);
if (qemu_loglevel_mask(CPU_LOG_EXEC)) {
qemu_log(" => PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx,
env->active_tc.PC, env->CP0_EPC);
@@ -1813,7 +1817,9 @@
case MIPS_HFLAG_UM: qemu_log(", UM\n"); break;
case MIPS_HFLAG_SM: qemu_log(", SM\n"); break;
case MIPS_HFLAG_KM: qemu_log("\n"); break;
- default: cpu_abort(env, "Invalid MMU mode!\n"); break;
+ default:
+ cpu_abort(CPU(cpu), "Invalid MMU mode!\n");
+ break;
}
}
}
diff --git a/target-mips/translate_init.c b/target-mips/translate_init.c
index fd4ecc4..f3a10c0 100644
--- a/target-mips/translate_init.c
+++ b/target-mips/translate_init.c
@@ -495,6 +495,7 @@
static void mmu_init (CPUMIPSState *env, const mips_def_t *def)
{
+ MIPSCPU *cpu = mips_env_get_cpu(env);
env->tlb = g_malloc0(sizeof(CPUMIPSTLBContext));
switch (def->mmu_type) {
@@ -511,7 +512,7 @@
case MMU_TYPE_R6000:
case MMU_TYPE_R8000:
default:
- cpu_abort(env, "MMU type not supported\n");
+ cpu_abort(CPU(cpu), "MMU type not supported\n");
}
}
#endif /* CONFIG_USER_ONLY */
diff --git a/translate-all.c b/translate-all.c
index 351d949..d6c5d37 100644
--- a/translate-all.c
+++ b/translate-all.c
@@ -726,7 +726,7 @@
/* XXX: tb_flush is currently not thread safe */
void tb_flush(CPUArchState *env1)
{
- CPUState *cpu;
+ CPUState *cpu = ENV_GET_CPU(env1);
#if defined(DEBUG_FLUSH)
printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n",
(unsigned long)(tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer),
@@ -736,7 +736,7 @@
#endif
if ((unsigned long)(tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer)
> tcg_ctx.code_gen_buffer_size) {
- cpu_abort(env1, "Internal error: code buffer overflow\n");
+ cpu_abort(cpu, "Internal error: code buffer overflow\n");
}
tcg_ctx.tb_ctx.nb_tbs = 0;
@@ -1408,11 +1408,12 @@
void tb_check_watchpoint(CPUArchState *env)
{
+ CPUState *cpu = ENV_GET_CPU(env);
TranslationBlock *tb;
tb = tb_find_pc(env->mem_io_pc);
if (!tb) {
- cpu_abort(env, "check_watchpoint: could not find TB for pc=%p",
+ cpu_abort(cpu, "check_watchpoint: could not find TB for pc=%p",
(void *)env->mem_io_pc);
}
cpu_restore_state_from_tb(tb, env, env->mem_io_pc);
@@ -1442,7 +1443,7 @@
env->icount_decr.u16.high = 0xffff;
if (!can_do_io(env)
&& (mask & ~old_mask) != 0) {
- cpu_abort(env, "Raised interrupt while not in I/O function");
+ cpu_abort(cpu, "Raised interrupt while not in I/O function");
}
} else {
// cpu->tcg_exit_req = 1;
@@ -1499,6 +1500,7 @@
must be at the end of the TB */
void cpu_io_recompile(CPUArchState *env, uintptr_t retaddr)
{
+ CPUState *cpu = ENV_GET_CPU(env);
TranslationBlock *tb;
uint32_t n, cflags;
target_ulong pc, cs_base;
@@ -1506,7 +1508,7 @@
tb = tb_find_pc(retaddr);
if (!tb) {
- cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p",
+ cpu_abort(cpu, "cpu_io_recompile: could not find TB for pc=%p",
(void *)retaddr);
}
n = env->icount_decr.u16.low + tb->icount;
@@ -1536,7 +1538,7 @@
#endif
/* This should never happen. */
if (n > CF_COUNT_MASK) {
- cpu_abort(env, "TB too big during recompile");
+ cpu_abort(cpu, "TB too big during recompile");
}
cflags = n | CF_LAST_IO;