From: Paolo Bonzini <pbonzini@redhat.com>
To: "Andreas Färber" <afaerber@suse.de>
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
"Anthony Liguori" <aliguori@us.ibm.com>,
qemu-devel@nongnu.org, "Alexander Graf" <agraf@suse.de>,
"Blue Swirl" <blauwirbel@gmail.com>,
"Andreas Färber" <andreas.faerber@web.de>,
"Hervé Poussineau" <hpoussin@reactos.org>,
"Paul Brook" <paul@codesourcery.com>,
"Scott Wood" <scottwood@freescale.com>,
mpc8544ds <qemu-ppc@nongnu.org>,
"Aurelien Jarno" <aurelien@aurel32.net>,
"Richard Henderson" <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH qom-cpu v2 19/29] cpu: Replace cpu_single_env with CPUState cpu_single_cpu
Date: Mon, 15 Jul 2013 16:56:19 +0200 [thread overview]
Message-ID: <51E40D93.40806@redhat.com> (raw)
In-Reply-To: <1371398269-6213-20-git-send-email-afaerber@suse.de>
Il 16/06/2013 17:57, Andreas Färber ha scritto:
> Move it to qom/cpu.h.
Hmm, why move it to qom/cpu.h? Isn't it an implementation detail that
there is a current CPU?
Paolo
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> ---
> cpu-exec.c | 13 +++++++------
> cpus.c | 29 ++++++++++++++---------------
> exec.c | 12 +++++++-----
> hw/alpha/typhoon.c | 16 ++++------------
> hw/arm/pxa2xx.c | 3 +--
> hw/i386/kvmvapic.c | 6 ++++--
> hw/i386/pc.c | 11 ++++++-----
> hw/intc/arm_gic.c | 3 +--
> hw/intc/armv7m_nvic.c | 11 ++++++++---
> hw/intc/openpic.c | 5 +----
> hw/mips/mips_fulong2e.c | 6 +++---
> hw/mips/mips_jazz.c | 6 +++---
> hw/mips/mips_malta.c | 6 +++---
> hw/misc/vmport.c | 26 ++++++++++++++++----------
> hw/ppc/mpc8544_guts.c | 3 ++-
> hw/ppc/prep.c | 6 +++---
> hw/sparc/sun4m.c | 5 ++---
> hw/timer/arm_mptimer.c | 2 --
> include/exec/cpu-all.h | 3 ---
> include/qom/cpu.h | 4 ++++
> memory.c | 10 ++++------
> translate-all.c | 20 ++++++++++++--------
> user-exec.c | 9 +++++----
> 23 files changed, 110 insertions(+), 105 deletions(-)
>
> diff --git a/cpu-exec.c b/cpu-exec.c
> index ec46380..1858c2e 100644
> --- a/cpu-exec.c
> +++ b/cpu-exec.c
> @@ -213,12 +213,12 @@ int cpu_exec(CPUArchState *env)
> cpu->halted = 0;
> }
>
> - cpu_single_env = env;
> + cpu_single_cpu = cpu;
>
> - /* As long as cpu_single_env is null, up to the assignment just above,
> + /* As long as cpu_single_cpu is null, up to the assignment just above,
> * requests by other threads to exit the execution loop are expected to
> * be issued using the exit_request global. We must make sure that our
> - * evaluation of the global value is performed past the cpu_single_env
> + * evaluation of the global value is performed past the cpu_single_cpu
> * value transition point, which requires a memory barrier as well as
> * an instruction scheduling constraint on modern architectures. */
> smp_mb();
> @@ -673,7 +673,8 @@ int cpu_exec(CPUArchState *env)
> } else {
> /* Reload env after longjmp - the compiler may have smashed all
> * local variables as longjmp is marked 'noreturn'. */
> - env = cpu_single_env;
> + cpu = cpu_single_cpu;
> + env = cpu->env_ptr;
> }
> } /* for(;;) */
>
> @@ -707,7 +708,7 @@ int cpu_exec(CPUArchState *env)
> #error unsupported target CPU
> #endif
>
> - /* fail safe : never use cpu_single_env outside cpu_exec() */
> - cpu_single_env = NULL;
> + /* fail safe : never use cpu_single_cpu outside cpu_exec() */
> + cpu_single_cpu = NULL;
> return ret;
> }
> diff --git a/cpus.c b/cpus.c
> index 775d998..808503b 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -118,10 +118,11 @@ TimersState timers_state;
> int64_t cpu_get_icount(void)
> {
> int64_t icount;
> - CPUArchState *env = cpu_single_env;
> + CPUState *cpu = cpu_single_cpu;
>
> icount = qemu_icount;
> - if (env) {
> + if (cpu) {
> + CPUArchState *env = cpu->env_ptr;
> if (!can_do_io(env)) {
> fprintf(stderr, "Bad clock read\n");
> }
> @@ -468,8 +469,8 @@ static void cpu_handle_guest_debug(CPUState *cpu)
>
> static void cpu_signal(int sig)
> {
> - if (cpu_single_env) {
> - cpu_exit(ENV_GET_CPU(cpu_single_env));
> + if (cpu_single_cpu) {
> + cpu_exit(cpu_single_cpu);
> }
> exit_request = 1;
> }
> @@ -660,10 +661,10 @@ void run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data)
>
> qemu_cpu_kick(cpu);
> while (!wi.done) {
> - CPUArchState *self_env = cpu_single_env;
> + CPUState *self_cpu = cpu_single_cpu;
>
> qemu_cond_wait(&qemu_work_cond, &qemu_global_mutex);
> - cpu_single_env = self_env;
> + cpu_single_cpu = self_cpu;
> }
> }
>
> @@ -733,7 +734,7 @@ static void *qemu_kvm_cpu_thread_fn(void *arg)
> qemu_mutex_lock(&qemu_global_mutex);
> qemu_thread_get_self(cpu->thread);
> cpu->thread_id = qemu_get_thread_id();
> - cpu_single_env = cpu->env_ptr;
> + cpu_single_cpu = cpu;
>
> r = kvm_init_vcpu(cpu);
> if (r < 0) {
> @@ -781,9 +782,9 @@ static void *qemu_dummy_cpu_thread_fn(void *arg)
> cpu->created = true;
> qemu_cond_signal(&qemu_cpu_cond);
>
> - cpu_single_env = cpu->env_ptr;
> + cpu_single_cpu = cpu;
> while (1) {
> - cpu_single_env = NULL;
> + cpu_single_cpu = NULL;
> qemu_mutex_unlock_iothread();
> do {
> int sig;
> @@ -794,7 +795,7 @@ static void *qemu_dummy_cpu_thread_fn(void *arg)
> exit(1);
> }
> qemu_mutex_lock_iothread();
> - cpu_single_env = cpu->env_ptr;
> + cpu_single_cpu = cpu;
> qemu_wait_io_event_common(cpu);
> }
>
> @@ -894,8 +895,7 @@ void qemu_cpu_kick(CPUState *cpu)
> void qemu_cpu_kick_self(void)
> {
> #ifndef _WIN32
> - assert(cpu_single_env);
> - CPUState *cpu_single_cpu = ENV_GET_CPU(cpu_single_env);
> + assert(cpu_single_cpu);
>
> if (!cpu_single_cpu->thread_kicked) {
> qemu_cpu_kick_thread(cpu_single_cpu);
> @@ -913,7 +913,7 @@ bool qemu_cpu_is_self(CPUState *cpu)
>
> static bool qemu_in_vcpu_thread(void)
> {
> - return cpu_single_env && qemu_cpu_is_self(ENV_GET_CPU(cpu_single_env));
> + return cpu_single_cpu && qemu_cpu_is_self(cpu_single_cpu);
> }
>
> void qemu_mutex_lock_iothread(void)
> @@ -1069,8 +1069,7 @@ void qemu_init_vcpu(CPUState *cpu)
>
> void cpu_stop_current(void)
> {
> - if (cpu_single_env) {
> - CPUState *cpu_single_cpu = ENV_GET_CPU(cpu_single_env);
> + if (cpu_single_cpu) {
> cpu_single_cpu->stop = false;
> cpu_single_cpu->stopped = true;
> cpu_exit(cpu_single_cpu);
> diff --git a/exec.c b/exec.c
> index 2b99bb9..e14a815 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -73,7 +73,7 @@ static MemoryRegion io_mem_unassigned, io_mem_subpage_ram;
> CPUArchState *first_cpu;
> /* current CPU in the current thread. It is only valid inside
> cpu_exec() */
> -DEFINE_TLS(CPUArchState *,cpu_single_env);
> +DEFINE_TLS(CPUState *,cpu_single_cpu);
> /* 0 = Do not count executed instructions.
> 1 = Precise instruction counting.
> 2 = Adaptive rate instruction counting. */
> @@ -1420,8 +1420,10 @@ static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
> cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
> /* we remove the notdirty callback only if the code has been
> flushed */
> - if (dirty_flags == 0xff)
> - tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
> + if (dirty_flags == 0xff) {
> + CPUArchState *env = cpu_single_cpu->env_ptr;
> + tlb_set_dirty(env, env->mem_io_vaddr);
> + }
> }
>
> static bool notdirty_mem_accepts(void *opaque, hwaddr addr,
> @@ -1439,7 +1441,7 @@ static const MemoryRegionOps notdirty_mem_ops = {
> /* Generate a debug exception if a watchpoint has been hit. */
> static void check_watchpoint(int offset, int len_mask, int flags)
> {
> - CPUArchState *env = cpu_single_env;
> + CPUArchState *env = cpu_single_cpu->env_ptr;
> target_ulong pc, cs_base;
> target_ulong vaddr;
> CPUWatchpoint *wp;
> @@ -1912,7 +1914,7 @@ bool address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
> if (is_write) {
> if (!memory_access_is_direct(section->mr, is_write)) {
> l = memory_access_size(l, addr1);
> - /* XXX: could force cpu_single_env to NULL to avoid
> + /* XXX: could force cpu_single_cpu to NULL to avoid
> potential bugs */
> if (l == 4) {
> /* 32 bit write access */
> diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
> index 207dcad..f0b1f6f 100644
> --- a/hw/alpha/typhoon.c
> +++ b/hw/alpha/typhoon.c
> @@ -72,9 +72,8 @@ static void cpu_irq_change(AlphaCPU *cpu, uint64_t req)
>
> static uint64_t cchip_read(void *opaque, hwaddr addr, unsigned size)
> {
> - CPUAlphaState *env = cpu_single_env;
> + CPUState *cpu = cpu_single_cpu;
> TyphoonState *s = opaque;
> - CPUState *cpu;
> uint64_t ret = 0;
>
> if (addr & 4) {
> @@ -95,7 +94,6 @@ static uint64_t cchip_read(void *opaque, hwaddr addr, unsigned size)
>
> case 0x0080:
> /* MISC: Miscellaneous Register. */
> - cpu = ENV_GET_CPU(env);
> ret = s->cchip.misc | (cpu->cpu_index & 3);
> break;
>
> @@ -197,8 +195,7 @@ static uint64_t cchip_read(void *opaque, hwaddr addr, unsigned size)
> break;
>
> default:
> - cpu = CPU(alpha_env_get_cpu(cpu_single_env));
> - cpu_unassigned_access(cpu, addr, false, false, 0, size);
> + cpu_unassigned_access(cpu_single_cpu, addr, false, false, 0, size);
> return -1;
> }
>
> @@ -215,7 +212,6 @@ static uint64_t dchip_read(void *opaque, hwaddr addr, unsigned size)
> static uint64_t pchip_read(void *opaque, hwaddr addr, unsigned size)
> {
> TyphoonState *s = opaque;
> - CPUState *cs;
> uint64_t ret = 0;
>
> if (addr & 4) {
> @@ -302,8 +298,7 @@ static uint64_t pchip_read(void *opaque, hwaddr addr, unsigned size)
> break;
>
> default:
> - cs = CPU(alpha_env_get_cpu(cpu_single_env));
> - cpu_unassigned_access(cs, addr, false, false, 0, size);
> + cpu_unassigned_access(cpu_single_cpu, addr, false, false, 0, size);
> return -1;
> }
>
> @@ -315,7 +310,6 @@ static void cchip_write(void *opaque, hwaddr addr,
> uint64_t v32, unsigned size)
> {
> TyphoonState *s = opaque;
> - CPUState *cpu_single_cpu = CPU(alpha_env_get_cpu(cpu_single_env));
> uint64_t val, oldval, newval;
>
> if (addr & 4) {
> @@ -480,7 +474,6 @@ static void pchip_write(void *opaque, hwaddr addr,
> uint64_t v32, unsigned size)
> {
> TyphoonState *s = opaque;
> - CPUState *cs;
> uint64_t val, oldval;
>
> if (addr & 4) {
> @@ -582,8 +575,7 @@ static void pchip_write(void *opaque, hwaddr addr,
> break;
>
> default:
> - cs = CPU(alpha_env_get_cpu(cpu_single_env));
> - cpu_unassigned_access(cs, addr, true, false, 0, size);
> + cpu_unassigned_access(cpu_single_cpu, addr, true, false, 0, size);
> return;
> }
> }
> diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c
> index 24b03a0..d023167 100644
> --- a/hw/arm/pxa2xx.c
> +++ b/hw/arm/pxa2xx.c
> @@ -301,8 +301,7 @@ static int pxa2xx_pwrmode_write(CPUARMState *env, const ARMCPRegInfo *ri,
> #endif
>
> /* Suspend */
> - cpu_interrupt(CPU(arm_env_get_cpu(cpu_single_env)),
> - CPU_INTERRUPT_HALT);
> + cpu_interrupt(cpu_single_cpu, CPU_INTERRUPT_HALT);
>
> goto message;
>
> diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c
> index f93629f..9aac9de 100644
> --- a/hw/i386/kvmvapic.c
> +++ b/hw/i386/kvmvapic.c
> @@ -623,11 +623,13 @@ static int vapic_prepare(VAPICROMState *s)
> static void vapic_write(void *opaque, hwaddr addr, uint64_t data,
> unsigned int size)
> {
> - CPUX86State *env = cpu_single_env;
> + CPUState *cs = cpu_single_cpu;
> + X86CPU *cpu = X86_CPU(cs);
> + CPUX86State *env = &cpu->env;
> hwaddr rom_paddr;
> VAPICROMState *s = opaque;
>
> - cpu_synchronize_state(CPU(x86_env_get_cpu(env)));
> + cpu_synchronize_state(cs);
>
> /*
> * The VAPIC supports two PIO-based hypercalls, both via port 0x7E.
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index d7e8507..c43be54 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -887,8 +887,9 @@ void pc_init_ne2k_isa(ISABus *bus, NICInfo *nd)
>
> DeviceState *cpu_get_current_apic(void)
> {
> - if (cpu_single_env) {
> - return cpu_single_env->apic_state;
> + if (cpu_single_cpu) {
> + X86CPU *cpu = X86_CPU(cpu_single_cpu);
> + return cpu->env.apic_state;
> } else {
> return NULL;
> }
> @@ -1107,10 +1108,10 @@ DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus)
>
> static void cpu_request_exit(void *opaque, int irq, int level)
> {
> - CPUX86State *env = cpu_single_env;
> + CPUState *cpu = cpu_single_cpu;
>
> - if (env && level) {
> - cpu_exit(CPU(x86_env_get_cpu(env)));
> + if (cpu && level) {
> + cpu_exit(cpu);
> }
> }
>
> diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
> index bae6572..79fd4a9 100644
> --- a/hw/intc/arm_gic.c
> +++ b/hw/intc/arm_gic.c
> @@ -39,8 +39,7 @@ static const uint8_t gic_id[] = {
> static inline int gic_get_current_cpu(GICState *s)
> {
> if (s->num_cpu > 1) {
> - CPUState *cpu = ENV_GET_CPU(cpu_single_env);
> - return cpu->cpu_index;
> + return cpu_single_cpu->cpu_index;
> }
> return 0;
> }
> diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
> index 25fa43c..53576c8 100644
> --- a/hw/intc/armv7m_nvic.c
> +++ b/hw/intc/armv7m_nvic.c
> @@ -140,6 +140,7 @@ void armv7m_nvic_complete_irq(void *opaque, int irq)
>
> static uint32_t nvic_readl(nvic_state *s, uint32_t offset)
> {
> + ARMCPU *cpu;
> uint32_t val;
> int irq;
>
> @@ -171,7 +172,8 @@ static uint32_t nvic_readl(nvic_state *s, uint32_t offset)
> case 0x1c: /* SysTick Calibration Value. */
> return 10000;
> case 0xd00: /* CPUID Base. */
> - return cpu_single_env->cp15.c0_cpuid;
> + cpu = ARM_CPU(cpu_single_cpu);
> + return cpu->env.cp15.c0_cpuid;
> case 0xd04: /* Interrupt Control State. */
> /* VECTACTIVE */
> val = s->gic.running_irq[0];
> @@ -206,7 +208,8 @@ static uint32_t nvic_readl(nvic_state *s, uint32_t offset)
> val |= (1 << 31);
> return val;
> case 0xd08: /* Vector Table Offset. */
> - return cpu_single_env->v7m.vecbase;
> + cpu = ARM_CPU(cpu_single_cpu);
> + return cpu->env.v7m.vecbase;
> case 0xd0c: /* Application Interrupt/Reset Control. */
> return 0xfa05000;
> case 0xd10: /* System Control. */
> @@ -279,6 +282,7 @@ static uint32_t nvic_readl(nvic_state *s, uint32_t offset)
>
> static void nvic_writel(nvic_state *s, uint32_t offset, uint32_t value)
> {
> + ARMCPU *cpu;
> uint32_t oldval;
> switch (offset) {
> case 0x10: /* SysTick Control and Status. */
> @@ -331,7 +335,8 @@ static void nvic_writel(nvic_state *s, uint32_t offset, uint32_t value)
> }
> break;
> case 0xd08: /* Vector Table Offset. */
> - cpu_single_env->v7m.vecbase = value & 0xffffff80;
> + cpu = ARM_CPU(cpu_single_cpu);
> + cpu->env.v7m.vecbase = value & 0xffffff80;
> break;
> case 0xd0c: /* Application Interrupt/Reset Control. */
> if ((value >> 16) == 0x05fa) {
> diff --git a/hw/intc/openpic.c b/hw/intc/openpic.c
> index c788714..6f152e0 100644
> --- a/hw/intc/openpic.c
> +++ b/hw/intc/openpic.c
> @@ -184,13 +184,10 @@ static int output_to_inttgt(int output)
>
> static int get_current_cpu(void)
> {
> - CPUState *cpu_single_cpu;
> -
> - if (!cpu_single_env) {
> + if (!cpu_single_cpu) {
> return -1;
> }
>
> - cpu_single_cpu = ENV_GET_CPU(cpu_single_env);
> return cpu_single_cpu->cpu_index;
> }
>
> diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
> index 00c9071..59ee1b4 100644
> --- a/hw/mips/mips_fulong2e.c
> +++ b/hw/mips/mips_fulong2e.c
> @@ -250,10 +250,10 @@ static void network_init (void)
>
> static void cpu_request_exit(void *opaque, int irq, int level)
> {
> - CPUMIPSState *env = cpu_single_env;
> + CPUState *cpu = cpu_single_cpu;
>
> - if (env && level) {
> - cpu_exit(CPU(mips_env_get_cpu(env)));
> + if (cpu && level) {
> + cpu_exit(cpu);
> }
> }
>
> diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
> index 2ad0c0b..2ffae59 100644
> --- a/hw/mips/mips_jazz.c
> +++ b/hw/mips/mips_jazz.c
> @@ -99,10 +99,10 @@ static const MemoryRegionOps dma_dummy_ops = {
>
> static void cpu_request_exit(void *opaque, int irq, int level)
> {
> - CPUMIPSState *env = cpu_single_env;
> + CPUState *cpu = cpu_single_cpu;
>
> - if (env && level) {
> - cpu_exit(CPU(mips_env_get_cpu(env)));
> + if (cpu && level) {
> + cpu_exit(cpu);
> }
> }
>
> diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
> index 8a4459d..4fc611c 100644
> --- a/hw/mips/mips_malta.c
> +++ b/hw/mips/mips_malta.c
> @@ -770,10 +770,10 @@ static void main_cpu_reset(void *opaque)
>
> static void cpu_request_exit(void *opaque, int irq, int level)
> {
> - CPUMIPSState *env = cpu_single_env;
> + CPUState *cpu = cpu_single_cpu;
>
> - if (env && level) {
> - cpu_exit(CPU(mips_env_get_cpu(env)));
> + if (cpu && level) {
> + cpu_exit(cpu);
> }
> }
>
> diff --git a/hw/misc/vmport.c b/hw/misc/vmport.c
> index 8363dfd..deb2232 100644
> --- a/hw/misc/vmport.c
> +++ b/hw/misc/vmport.c
> @@ -62,11 +62,13 @@ static uint64_t vmport_ioport_read(void *opaque, hwaddr addr,
> unsigned size)
> {
> VMPortState *s = opaque;
> - CPUX86State *env = cpu_single_env;
> + CPUState *cs = cpu_single_cpu;
> + X86CPU *cpu = X86_CPU(cs);
> + CPUX86State *env = &cpu->env;
> unsigned char command;
> uint32_t eax;
>
> - cpu_synchronize_state(CPU(x86_env_get_cpu(env)));
> + cpu_synchronize_state(cs);
>
> eax = env->regs[R_EAX];
> if (eax != VMPORT_MAGIC)
> @@ -89,29 +91,32 @@ static uint64_t vmport_ioport_read(void *opaque, hwaddr addr,
> static void vmport_ioport_write(void *opaque, hwaddr addr,
> uint64_t val, unsigned size)
> {
> - CPUX86State *env = cpu_single_env;
> + X86CPU *cpu = X86_CPU(cpu_single_cpu);
>
> - env->regs[R_EAX] = vmport_ioport_read(opaque, addr, 4);
> + cpu->env.regs[R_EAX] = vmport_ioport_read(opaque, addr, 4);
> }
>
> static uint32_t vmport_cmd_get_version(void *opaque, uint32_t addr)
> {
> - CPUX86State *env = cpu_single_env;
> - env->regs[R_EBX] = VMPORT_MAGIC;
> + X86CPU *cpu = X86_CPU(cpu_single_cpu);
> +
> + cpu->env.regs[R_EBX] = VMPORT_MAGIC;
> return 6;
> }
>
> static uint32_t vmport_cmd_ram_size(void *opaque, uint32_t addr)
> {
> - CPUX86State *env = cpu_single_env;
> - env->regs[R_EBX] = 0x1177;
> + X86CPU *cpu = X86_CPU(cpu_single_cpu);
> +
> + cpu->env.regs[R_EBX] = 0x1177;
> return ram_size;
> }
>
> /* vmmouse helpers */
> void vmmouse_get_data(uint32_t *data)
> {
> - CPUX86State *env = cpu_single_env;
> + X86CPU *cpu = X86_CPU(cpu_single_cpu);
> + CPUX86State *env = &cpu->env;
>
> data[0] = env->regs[R_EAX]; data[1] = env->regs[R_EBX];
> data[2] = env->regs[R_ECX]; data[3] = env->regs[R_EDX];
> @@ -120,7 +125,8 @@ void vmmouse_get_data(uint32_t *data)
>
> void vmmouse_set_data(const uint32_t *data)
> {
> - CPUX86State *env = cpu_single_env;
> + X86CPU *cpu = X86_CPU(cpu_single_cpu);
> + CPUX86State *env = &cpu->env;
>
> env->regs[R_EAX] = data[0]; env->regs[R_EBX] = data[1];
> env->regs[R_ECX] = data[2]; env->regs[R_EDX] = data[3];
> diff --git a/hw/ppc/mpc8544_guts.c b/hw/ppc/mpc8544_guts.c
> index 193beab..89f950f 100644
> --- a/hw/ppc/mpc8544_guts.c
> +++ b/hw/ppc/mpc8544_guts.c
> @@ -62,7 +62,8 @@ static uint64_t mpc8544_guts_read(void *opaque, hwaddr addr,
> unsigned size)
> {
> uint32_t value = 0;
> - CPUPPCState *env = cpu_single_env;
> + PowerPCCPU *cpu = POWERPC_CPU(cpu_single_cpu);
> + CPUPPCState *env = &cpu->env;
>
> addr &= MPC8544_GUTS_MMIO_SIZE - 1;
> switch (addr) {
> diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
> index 90828f2..16e3132 100644
> --- a/hw/ppc/prep.c
> +++ b/hw/ppc/prep.c
> @@ -417,10 +417,10 @@ static const MemoryRegionOps PPC_prep_io_ops = {
>
> static void cpu_request_exit(void *opaque, int irq, int level)
> {
> - CPUPPCState *env = cpu_single_env;
> + CPUState *cpu = cpu_single_cpu;
>
> - if (env && level) {
> - cpu_exit(CPU(ppc_env_get_cpu(env)));
> + if (cpu && level) {
> + cpu_exit(cpu);
> }
> }
>
> diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
> index 0e86ca7..1273533 100644
> --- a/hw/sparc/sun4m.c
> +++ b/hw/sparc/sun4m.c
> @@ -264,9 +264,8 @@ static void secondary_cpu_reset(void *opaque)
>
> static void cpu_halt_signal(void *opaque, int irq, int level)
> {
> - if (level && cpu_single_env) {
> - cpu_interrupt(CPU(sparc_env_get_cpu(cpu_single_env)),
> - CPU_INTERRUPT_HALT);
> + if (level && cpu_single_cpu) {
> + cpu_interrupt(cpu_single_cpu, CPU_INTERRUPT_HALT);
> }
> }
>
> diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
> index 317f5e4..1aa300b 100644
> --- a/hw/timer/arm_mptimer.c
> +++ b/hw/timer/arm_mptimer.c
> @@ -49,8 +49,6 @@ typedef struct {
>
> static inline int get_current_cpu(ARMMPTimerState *s)
> {
> - CPUState *cpu_single_cpu = ENV_GET_CPU(cpu_single_env);
> -
> if (cpu_single_cpu->cpu_index >= s->num_cpu) {
> hw_error("arm_mptimer: num-cpu %d but this cpu is %d!\n",
> s->num_cpu, cpu_single_cpu->cpu_index);
> diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h
> index 35bdf85..6760851 100644
> --- a/include/exec/cpu-all.h
> +++ b/include/exec/cpu-all.h
> @@ -20,7 +20,6 @@
> #define CPU_ALL_H
>
> #include "qemu-common.h"
> -#include "qemu/tls.h"
> #include "exec/cpu-common.h"
> #include "qemu/thread.h"
>
> @@ -358,8 +357,6 @@ CPUArchState *cpu_copy(CPUArchState *env);
> void QEMU_NORETURN cpu_abort(CPUArchState *env, const char *fmt, ...)
> GCC_FMT_ATTR(2, 3);
> extern CPUArchState *first_cpu;
> -DECLARE_TLS(CPUArchState *,cpu_single_env);
> -#define cpu_single_env tls_var(cpu_single_env)
>
> /* Flags for use in ENV->INTERRUPT_PENDING.
>
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index 7afc442..0e2e76c 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -24,6 +24,7 @@
> #include "hw/qdev-core.h"
> #include "exec/hwaddr.h"
> #include "qemu/thread.h"
> +#include "qemu/tls.h"
> #include "qemu/typedefs.h"
>
> typedef int (*WriteCoreDumpFunction)(void *buf, size_t size, void *opaque);
> @@ -156,6 +157,9 @@ struct CPUState {
> uint32_t halted; /* used by alpha, cris, ppc TCG */
> };
>
> +DECLARE_TLS(CPUState *, cpu_single_cpu);
> +#define cpu_single_cpu tls_var(cpu_single_cpu)
> +
> /**
> * cpu_paging_enabled:
> * @cpu: The CPU whose state is to be inspected.
> diff --git a/memory.c b/memory.c
> index 3bc98ad..f960bd0 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -857,9 +857,8 @@ static uint64_t unassigned_mem_read(void *opaque, hwaddr addr,
> #ifdef DEBUG_UNASSIGNED
> printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
> #endif
> - if (cpu_single_env != NULL) {
> - cpu_unassigned_access(ENV_GET_CPU(cpu_single_env),
> - addr, false, false, 0, size);
> + if (cpu_single_cpu != NULL) {
> + cpu_unassigned_access(cpu_single_cpu, addr, false, false, 0, size);
> }
> return 0;
> }
> @@ -870,9 +869,8 @@ static void unassigned_mem_write(void *opaque, hwaddr addr,
> #ifdef DEBUG_UNASSIGNED
> printf("Unassigned mem write " TARGET_FMT_plx " = 0x%"PRIx64"\n", addr, val);
> #endif
> - if (cpu_single_env != NULL) {
> - cpu_unassigned_access(ENV_GET_CPU(cpu_single_env),
> - addr, true, false, 0, size);
> + if (cpu_single_cpu != NULL) {
> + cpu_unassigned_access(cpu_single_cpu, addr, true, false, 0, size);
> }
> }
>
> diff --git a/translate-all.c b/translate-all.c
> index df7c697..4177293 100644
> --- a/translate-all.c
> +++ b/translate-all.c
> @@ -999,8 +999,10 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
> int is_cpu_write_access)
> {
> TranslationBlock *tb, *tb_next, *saved_tb;
> - CPUArchState *env = cpu_single_env;
> - CPUState *cpu = NULL;
> + CPUState *cpu = cpu_single_cpu;
> +#if defined(TARGET_HAS_PRECISE_SMC) || !defined(CONFIG_USER_ONLY)
> + CPUArchState *env = NULL;
> +#endif
> tb_page_addr_t tb_start, tb_end;
> PageDesc *p;
> int n;
> @@ -1023,9 +1025,11 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
> /* build code bitmap */
> build_page_bitmap(p);
> }
> - if (env != NULL) {
> - cpu = ENV_GET_CPU(env);
> +#if defined(TARGET_HAS_PRECISE_SMC) || !defined(CONFIG_USER_ONLY)
> + if (cpu != NULL) {
> + env = cpu->env_ptr;
> }
> +#endif
>
> /* we remove all the TBs in the range [start, end[ */
> /* XXX: see if in some cases it could be faster to invalidate all
> @@ -1147,8 +1151,8 @@ static void tb_invalidate_phys_page(tb_page_addr_t addr,
> int n;
> #ifdef TARGET_HAS_PRECISE_SMC
> TranslationBlock *current_tb = NULL;
> - CPUArchState *env = cpu_single_env;
> - CPUState *cpu = NULL;
> + CPUState *cpu = cpu_single_cpu;
> + CPUArchState *env = NULL;
> int current_tb_modified = 0;
> target_ulong current_pc = 0;
> target_ulong current_cs_base = 0;
> @@ -1165,8 +1169,8 @@ static void tb_invalidate_phys_page(tb_page_addr_t addr,
> if (tb && pc != 0) {
> current_tb = tb_find_pc(pc);
> }
> - if (env != NULL) {
> - cpu = ENV_GET_CPU(env);
> + if (cpu != NULL) {
> + env = cpu->env_ptr;
> }
> #endif
> while (tb != NULL) {
> diff --git a/user-exec.c b/user-exec.c
> index fa7f1f1..aebdf1e 100644
> --- a/user-exec.c
> +++ b/user-exec.c
> @@ -81,6 +81,7 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address,
> int is_write, sigset_t *old_set,
> void *puc)
> {
> + CPUArchState *env;
> int ret;
>
> #if defined(DEBUG_SIGNAL)
> @@ -93,9 +94,9 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address,
> return 1;
> }
>
> + env = cpu_single_cpu->env_ptr;
> /* see if it is an MMU fault */
> - ret = cpu_handle_mmu_fault(cpu_single_env, address, is_write,
> - MMU_USER_IDX);
> + ret = cpu_handle_mmu_fault(env, address, is_write, MMU_USER_IDX);
> if (ret < 0) {
> return 0; /* not an MMU fault */
> }
> @@ -103,12 +104,12 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address,
> return 1; /* the MMU fault was handled without causing real CPU fault */
> }
> /* now we have a real cpu fault */
> - cpu_restore_state(cpu_single_env, pc);
> + cpu_restore_state(env, pc);
>
> /* we restore the process signal mask as the sigreturn should
> do it (XXX: use sigsetjmp) */
> sigprocmask(SIG_SETMASK, old_set, NULL);
> - exception_action(cpu_single_env);
> + exception_action(env);
>
> /* never comes here */
> return 1;
>
next prev parent reply other threads:[~2013-07-15 15:10 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-16 15:57 [Qemu-devel] [PATCH qom-cpu v2 00/29] QOM CPUState, part 10: CPU loops Andreas Färber
2013-06-16 15:57 ` [PATCH qom-cpu v2 01/29] kvm: Change kvm_cpu_synchronize_state() argument to CPUState Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] " Andreas Färber
2013-06-17 19:48 ` Richard Henderson
[not found] ` <51BF360E.8090402@redhat.com>
2013-06-18 16:36 ` Andreas Färber
2013-06-18 16:36 ` [Qemu-devel] " Andreas Färber
2013-06-16 15:57 ` [PATCH qom-cpu v2 02/29] kvm: Change cpu_synchronize_state() " Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] " Andreas Färber
2013-06-17 19:46 ` Richard Henderson
2013-06-17 20:58 ` Andreas Färber
2013-06-17 21:02 ` Richard Henderson
2013-06-17 21:09 ` Andreas Färber
2013-06-18 9:39 ` Igor Mammedov
2013-06-18 9:39 ` [Qemu-devel] " Igor Mammedov
2013-06-21 10:25 ` Andreas Färber
2013-06-21 10:25 ` [Qemu-devel] " Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 03/29] gdbstub: Simplify find_cpu() Andreas Färber
2013-06-17 19:54 ` Richard Henderson
2013-06-19 17:30 ` Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 04/29] cpu: Change cpu_exit() argument to CPUState Andreas Färber
2013-06-17 19:59 ` Richard Henderson
2013-06-17 21:00 ` Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 05/29] cpus: Change cpu_thread_is_idle() " Andreas Färber
2013-06-17 20:00 ` Richard Henderson
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 06/29] cpus: Change qemu_kvm_wait_io_event() " Andreas Färber
2013-06-17 20:02 ` Richard Henderson
2013-06-16 15:57 ` [PATCH qom-cpu v2 07/29] kvm: Change kvm_set_signal_mask() " Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] " Andreas Färber
2013-06-17 16:15 ` Paolo Bonzini
2013-06-17 16:15 ` [Qemu-devel] " Paolo Bonzini
2013-06-17 20:03 ` Richard Henderson
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 08/29] cpus: Change qemu_kvm_init_cpu_signals() " Andreas Färber
2013-06-17 20:04 ` Richard Henderson
2013-06-16 15:57 ` [PATCH qom-cpu v2 09/29] cpu: Turn cpu_dump_{state,statistics}() into CPUState hooks Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 09/29] cpu: Turn cpu_dump_{state, statistics}() " Andreas Färber
2013-06-17 20:12 ` Richard Henderson
2013-06-16 15:57 ` [PATCH qom-cpu v2 10/29] kvm: Change kvm_handle_internal_error() argument to CPUState Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] " Andreas Färber
2013-06-17 16:16 ` Paolo Bonzini
2013-06-17 16:16 ` [Qemu-devel] " Paolo Bonzini
2013-06-17 20:13 ` Richard Henderson
2013-06-17 20:13 ` [Qemu-devel] " Richard Henderson
2013-06-16 15:57 ` [PATCH qom-cpu v2 11/29] kvm: Change kvm_cpu_exec() " Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] " Andreas Färber
2013-06-17 16:17 ` Paolo Bonzini
2013-06-17 16:17 ` [Qemu-devel] " Paolo Bonzini
2013-06-17 20:14 ` Richard Henderson
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 12/29] gdbstub: Set gdb_set_stop_cpu() " Andreas Färber
2013-06-17 20:15 ` Richard Henderson
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 13/29] cpus: Change cpu_handle_guest_debug() " Andreas Färber
2013-06-17 20:17 ` Richard Henderson
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 14/29] cpus: Change qemu_kvm_start_vcpu() " Andreas Färber
2013-06-17 20:18 ` Richard Henderson
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 15/29] cpus: Change qemu_dummy_start_vcpu() " Andreas Färber
2013-06-17 20:19 ` Richard Henderson
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 16/29] cpu: Change qemu_init_vcpu() " Andreas Färber
2013-06-17 20:23 ` Richard Henderson
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 17/29] hwaddr: Make hwaddr type usable beyond softmmu Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 18/29] cpu: Turn cpu_unassigned_access() into a CPUState hook Andreas Färber
2013-06-17 20:34 ` Richard Henderson
2013-06-21 10:31 ` Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 19/29] cpu: Replace cpu_single_env with CPUState cpu_single_cpu Andreas Färber
2013-06-16 20:49 ` Blue Swirl
2013-06-18 16:52 ` Andreas Färber
2013-06-19 12:59 ` Paolo Bonzini
2013-06-17 20:40 ` Richard Henderson
2013-06-21 10:32 ` Andreas Färber
2013-07-15 14:56 ` Paolo Bonzini [this message]
2013-07-15 15:20 ` Andreas Färber
2013-07-15 15:29 ` Paolo Bonzini
2013-07-18 10:25 ` Andreas Färber
2013-06-16 15:57 ` [PATCH qom-cpu v2 20/29] kvm: Change kvm_remove_all_breakpoints() argument to CPUState Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] " Andreas Färber
2013-06-17 16:17 ` Paolo Bonzini
2013-06-17 16:17 ` [Qemu-devel] " Paolo Bonzini
2013-06-27 15:58 ` Andreas Färber
2013-06-17 20:41 ` Richard Henderson
2013-06-16 15:57 ` [PATCH qom-cpu v2 21/29] cpu: Make first_cpu and next_cpu CPUState Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] " Andreas Färber
2013-06-17 16:20 ` Paolo Bonzini
2013-06-17 16:20 ` [Qemu-devel] " Paolo Bonzini
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 22/29] linux-user: Change thread_env to CPUState Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 23/29] bsd-user: " Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 24/29] cpu: Drop qemu_for_each_cpu() Andreas Färber
2013-06-16 20:26 ` Michael S. Tsirkin
2013-06-16 20:30 ` Peter Maydell
2013-06-16 20:36 ` Michael S. Tsirkin
2013-06-16 20:41 ` Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 25/29] cpu: Move CPU_INTERRUPT_* to qom/cpu.h Andreas Färber
2013-06-17 20:59 ` Richard Henderson
2013-06-17 21:13 ` Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 26/29] intc/sh_intc: Build sh_intc only once Andreas Färber
2013-06-17 21:08 ` Richard Henderson
2013-06-17 21:17 ` Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 27/29] intc/arm_gic: Build arm_gic " Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 28/29] intc/openpic: Build openpic " Andreas Färber
2013-06-16 15:57 ` [Qemu-devel] [PATCH qom-cpu v2 29/29] timer/arm_mptimer: Build arm_mptimer " Andreas Färber
2013-06-26 14:20 ` [Qemu-devel] [PATCH qom-cpu v2 00/29] QOM CPUState, part 10: CPU loops Andreas Färber
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51E40D93.40806@redhat.com \
--to=pbonzini@redhat.com \
--cc=afaerber@suse.de \
--cc=agraf@suse.de \
--cc=aliguori@us.ibm.com \
--cc=andreas.faerber@web.de \
--cc=aurelien@aurel32.net \
--cc=blauwirbel@gmail.com \
--cc=hpoussin@reactos.org \
--cc=paul@codesourcery.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=rth@twiddle.net \
--cc=scottwood@freescale.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.