From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34334) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bly2P-0001q3-T3 for qemu-devel@nongnu.org; Mon, 19 Sep 2016 08:51:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bly2L-00014D-Iu for qemu-devel@nongnu.org; Mon, 19 Sep 2016 08:51:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46020) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bly2L-000143-5M for qemu-devel@nongnu.org; Mon, 19 Sep 2016 08:51:05 -0400 From: Paolo Bonzini Date: Mon, 19 Sep 2016 14:50:44 +0200 Message-Id: <1474289459-15242-2-git-send-email-pbonzini@redhat.com> In-Reply-To: <1474289459-15242-1-git-send-email-pbonzini@redhat.com> References: <1474289459-15242-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 01/16] cpus: pass CPUState to run_on_cpu helpers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: sergey.fedorov@linaro.org, serge.fdrv@gmail.com, alex.bennee@linaro.org From: Alex Benn=C3=A9e CPUState is a fairly common pointer to pass to these helpers. This means if you need other arguments for the async_run_on_cpu case you end up having to do a g_malloc to stuff additional data into the routine. For the current users this isn't a massive deal but for MTTCG this gets cumbersome when the only other parameter is often an address. This adds the typedef run_on_cpu_func for helper functions which has an explicit CPUState * passed as the first parameter. All the users of run_on_cpu and async_run_on_cpu have had their helpers updated to use CPUState where available. Signed-off-by: Alex Benn=C3=A9e [Sergey Fedorov: - eliminate more CPUState in user data; - remove unnecessary user data passing; - fix target-s390x/kvm.c and target-s390x/misc_helper.c] Signed-off-by: Sergey Fedorov Acked-by: David Gibson (ppc parts) Reviewed-by: Christian Borntraeger (s390 parts) Signed-off-by: Alex Benn=C3=A9e Message-Id: <1470158864-17651-3-git-send-email-alex.bennee@linaro.org> Signed-off-by: Paolo Bonzini --- cpus.c | 15 ++++--- hw/i386/kvm/apic.c | 3 +- hw/i386/kvmvapic.c | 6 +-- hw/ppc/ppce500_spin.c | 31 +++++---------- hw/ppc/spapr.c | 6 +-- hw/ppc/spapr_hcall.c | 17 ++++---- include/qom/cpu.h | 8 ++-- kvm-all.c | 21 ++++------ target-i386/helper.c | 19 ++++----- target-i386/kvm.c | 6 +-- target-s390x/cpu.c | 4 +- target-s390x/cpu.h | 7 +--- target-s390x/kvm.c | 98 +++++++++++++++++++++++-----------------= ------ target-s390x/misc_helper.c | 4 +- 14 files changed, 108 insertions(+), 137 deletions(-) diff --git a/cpus.c b/cpus.c index e39ccb7..1a2a9b0 100644 --- a/cpus.c +++ b/cpus.c @@ -557,9 +557,8 @@ static const VMStateDescription vmstate_timers =3D { } }; =20 -static void cpu_throttle_thread(void *opaque) +static void cpu_throttle_thread(CPUState *cpu, void *opaque) { - CPUState *cpu =3D opaque; double pct; double throttle_ratio; long sleeptime_ns; @@ -589,7 +588,7 @@ static void cpu_throttle_timer_tick(void *opaque) } CPU_FOREACH(cpu) { if (!atomic_xchg(&cpu->throttle_thread_scheduled, 1)) { - async_run_on_cpu(cpu, cpu_throttle_thread, cpu); + async_run_on_cpu(cpu, cpu_throttle_thread, NULL); } } =20 @@ -917,12 +916,12 @@ void qemu_init_cpu_loop(void) qemu_thread_get_self(&io_thread); } =20 -void run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data) +void run_on_cpu(CPUState *cpu, run_on_cpu_func func, void *data) { struct qemu_work_item wi; =20 if (qemu_cpu_is_self(cpu)) { - func(data); + func(cpu, data); return; } =20 @@ -950,12 +949,12 @@ void run_on_cpu(CPUState *cpu, void (*func)(void *d= ata), void *data) } } =20 -void async_run_on_cpu(CPUState *cpu, void (*func)(void *data), void *dat= a) +void async_run_on_cpu(CPUState *cpu, run_on_cpu_func func, void *data) { struct qemu_work_item *wi; =20 if (qemu_cpu_is_self(cpu)) { - func(data); + func(cpu, data); return; } =20 @@ -1006,7 +1005,7 @@ static void flush_queued_work(CPUState *cpu) cpu->queued_work_last =3D NULL; } qemu_mutex_unlock(&cpu->work_mutex); - wi->func(wi->data); + wi->func(cpu, wi->data); qemu_mutex_lock(&cpu->work_mutex); if (wi->free) { g_free(wi); diff --git a/hw/i386/kvm/apic.c b/hw/i386/kvm/apic.c index 5d140b9..eb6f30f 100644 --- a/hw/i386/kvm/apic.c +++ b/hw/i386/kvm/apic.c @@ -145,10 +145,9 @@ static void kvm_apic_post_load(APICCommonState *s) run_on_cpu(CPU(s->cpu), kvm_apic_put, s); } =20 -static void do_inject_external_nmi(void *data) +static void do_inject_external_nmi(CPUState *cpu, void *data) { APICCommonState *s =3D data; - CPUState *cpu =3D CPU(s->cpu); uint32_t lvt; int ret; =20 diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c index a1cd9b5..74a549b 100644 --- a/hw/i386/kvmvapic.c +++ b/hw/i386/kvmvapic.c @@ -483,7 +483,7 @@ typedef struct VAPICEnableTPRReporting { bool enable; } VAPICEnableTPRReporting; =20 -static void vapic_do_enable_tpr_reporting(void *data) +static void vapic_do_enable_tpr_reporting(CPUState *cpu, void *data) { VAPICEnableTPRReporting *info =3D data; =20 @@ -734,10 +734,10 @@ static void vapic_realize(DeviceState *dev, Error *= *errp) nb_option_roms++; } =20 -static void do_vapic_enable(void *data) +static void do_vapic_enable(CPUState *cs, void *data) { VAPICROMState *s =3D data; - X86CPU *cpu =3D X86_CPU(first_cpu); + X86CPU *cpu =3D X86_CPU(cs); =20 static const uint8_t enabled =3D 1; cpu_physical_memory_write(s->vapic_paddr + offsetof(VAPICState, enab= led), diff --git a/hw/ppc/ppce500_spin.c b/hw/ppc/ppce500_spin.c index 22c584e..8e16f65 100644 --- a/hw/ppc/ppce500_spin.c +++ b/hw/ppc/ppce500_spin.c @@ -54,11 +54,6 @@ typedef struct SpinState { SpinInfo spin[MAX_CPUS]; } SpinState; =20 -typedef struct spin_kick { - PowerPCCPU *cpu; - SpinInfo *spin; -} SpinKick; - static void spin_reset(void *opaque) { SpinState *s =3D opaque; @@ -89,16 +84,15 @@ static void mmubooke_create_initial_mapping(CPUPPCSta= te *env, env->tlb_dirty =3D true; } =20 -static void spin_kick(void *data) +static void spin_kick(CPUState *cs, void *data) { - SpinKick *kick =3D data; - CPUState *cpu =3D CPU(kick->cpu); - CPUPPCState *env =3D &kick->cpu->env; - SpinInfo *curspin =3D kick->spin; + PowerPCCPU *cpu =3D POWERPC_CPU(cs); + CPUPPCState *env =3D &cpu->env; + SpinInfo *curspin =3D data; hwaddr map_size =3D 64 * 1024 * 1024; hwaddr map_start; =20 - cpu_synchronize_state(cpu); + cpu_synchronize_state(cs); stl_p(&curspin->pir, env->spr[SPR_BOOKE_PIR]); env->nip =3D ldq_p(&curspin->addr) & (map_size - 1); env->gpr[3] =3D ldq_p(&curspin->r3); @@ -112,10 +106,10 @@ static void spin_kick(void *data) map_start =3D ldq_p(&curspin->addr) & ~(map_size - 1); mmubooke_create_initial_mapping(env, 0, map_start, map_size); =20 - cpu->halted =3D 0; - cpu->exception_index =3D -1; - cpu->stopped =3D false; - qemu_cpu_kick(cpu); + cs->halted =3D 0; + cs->exception_index =3D -1; + cs->stopped =3D false; + qemu_cpu_kick(cs); } =20 static void spin_write(void *opaque, hwaddr addr, uint64_t value, @@ -153,12 +147,7 @@ static void spin_write(void *opaque, hwaddr addr, ui= nt64_t value, =20 if (!(ldq_p(&curspin->addr) & 1)) { /* run CPU */ - SpinKick kick =3D { - .cpu =3D POWERPC_CPU(cpu), - .spin =3D curspin, - }; - - run_on_cpu(cpu, spin_kick, &kick); + run_on_cpu(cpu, spin_kick, curspin); } } =20 diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index ca77bb0..c202427 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2136,10 +2136,8 @@ static void spapr_machine_finalizefn(Object *obj) g_free(spapr->kvm_type); } =20 -static void ppc_cpu_do_nmi_on_cpu(void *arg) +static void ppc_cpu_do_nmi_on_cpu(CPUState *cs, void *arg) { - CPUState *cs =3D arg; - cpu_synchronize_state(cs); ppc_cpu_do_system_reset(cs); } @@ -2149,7 +2147,7 @@ static void spapr_nmi(NMIState *n, int cpu_index, E= rror **errp) CPUState *cs; =20 CPU_FOREACH(cs) { - async_run_on_cpu(cs, ppc_cpu_do_nmi_on_cpu, cs); + async_run_on_cpu(cs, ppc_cpu_do_nmi_on_cpu, NULL); } } =20 diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index 73af112..e5eca67 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -13,19 +13,18 @@ #include "kvm_ppc.h" =20 struct SPRSyncState { - CPUState *cs; int spr; target_ulong value; target_ulong mask; }; =20 -static void do_spr_sync(void *arg) +static void do_spr_sync(CPUState *cs, void *arg) { struct SPRSyncState *s =3D arg; - PowerPCCPU *cpu =3D POWERPC_CPU(s->cs); + PowerPCCPU *cpu =3D POWERPC_CPU(cs); CPUPPCState *env =3D &cpu->env; =20 - cpu_synchronize_state(s->cs); + cpu_synchronize_state(cs); env->spr[s->spr] &=3D ~s->mask; env->spr[s->spr] |=3D s->value; } @@ -34,7 +33,6 @@ static void set_spr(CPUState *cs, int spr, target_ulong= value, target_ulong mask) { struct SPRSyncState s =3D { - .cs =3D cs, .spr =3D spr, .value =3D value, .mask =3D mask @@ -907,17 +905,17 @@ static target_ulong cas_get_option_vector(int vecto= r, target_ulong table) } =20 typedef struct { - PowerPCCPU *cpu; uint32_t cpu_version; Error *err; } SetCompatState; =20 -static void do_set_compat(void *arg) +static void do_set_compat(CPUState *cs, void *arg) { + PowerPCCPU *cpu =3D POWERPC_CPU(cs); SetCompatState *s =3D arg; =20 - cpu_synchronize_state(CPU(s->cpu)); - ppc_set_compat(s->cpu, s->cpu_version, &s->err); + cpu_synchronize_state(cs); + ppc_set_compat(cpu, s->cpu_version, &s->err); } =20 #define get_compat_level(cpuver) ( \ @@ -1013,7 +1011,6 @@ static target_ulong h_client_architecture_support(P= owerPCCPU *cpu_, if (old_cpu_version !=3D cpu_version) { CPU_FOREACH(cs) { SetCompatState s =3D { - .cpu =3D POWERPC_CPU(cs), .cpu_version =3D cpu_version, .err =3D NULL, }; diff --git a/include/qom/cpu.h b/include/qom/cpu.h index ce0c406..4aa9e61 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -232,9 +232,11 @@ struct kvm_run; #define TB_JMP_CACHE_SIZE (1 << TB_JMP_CACHE_BITS) =20 /* work queue */ +typedef void (*run_on_cpu_func)(CPUState *cpu, void *data); + struct qemu_work_item { struct qemu_work_item *next; - void (*func)(void *data); + run_on_cpu_func func; void *data; int done; bool free; @@ -623,7 +625,7 @@ bool cpu_is_stopped(CPUState *cpu); * * Schedules the function @func for execution on the vCPU @cpu. */ -void run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data); +void run_on_cpu(CPUState *cpu, run_on_cpu_func func, void *data); =20 /** * async_run_on_cpu: @@ -633,7 +635,7 @@ void run_on_cpu(CPUState *cpu, void (*func)(void *dat= a), void *data); * * Schedules the function @func for execution on the vCPU @cpu asynchron= ously. */ -void async_run_on_cpu(CPUState *cpu, void (*func)(void *data), void *dat= a); +void async_run_on_cpu(CPUState *cpu, run_on_cpu_func func, void *data); =20 /** * qemu_get_cpu: diff --git a/kvm-all.c b/kvm-all.c index 8a4382e..fc2898a 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1847,10 +1847,8 @@ void kvm_flush_coalesced_mmio_buffer(void) s->coalesced_flush_in_progress =3D false; } =20 -static void do_kvm_cpu_synchronize_state(void *arg) +static void do_kvm_cpu_synchronize_state(CPUState *cpu, void *arg) { - CPUState *cpu =3D arg; - if (!cpu->kvm_vcpu_dirty) { kvm_arch_get_registers(cpu); cpu->kvm_vcpu_dirty =3D true; @@ -1860,34 +1858,30 @@ static void do_kvm_cpu_synchronize_state(void *ar= g) void kvm_cpu_synchronize_state(CPUState *cpu) { if (!cpu->kvm_vcpu_dirty) { - run_on_cpu(cpu, do_kvm_cpu_synchronize_state, cpu); + run_on_cpu(cpu, do_kvm_cpu_synchronize_state, NULL); } } =20 -static void do_kvm_cpu_synchronize_post_reset(void *arg) +static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, void *arg) { - CPUState *cpu =3D arg; - kvm_arch_put_registers(cpu, KVM_PUT_RESET_STATE); cpu->kvm_vcpu_dirty =3D false; } =20 void kvm_cpu_synchronize_post_reset(CPUState *cpu) { - run_on_cpu(cpu, do_kvm_cpu_synchronize_post_reset, cpu); + run_on_cpu(cpu, do_kvm_cpu_synchronize_post_reset, NULL); } =20 -static void do_kvm_cpu_synchronize_post_init(void *arg) +static void do_kvm_cpu_synchronize_post_init(CPUState *cpu, void *arg) { - CPUState *cpu =3D arg; - kvm_arch_put_registers(cpu, KVM_PUT_FULL_STATE); cpu->kvm_vcpu_dirty =3D false; } =20 void kvm_cpu_synchronize_post_init(CPUState *cpu) { - run_on_cpu(cpu, do_kvm_cpu_synchronize_post_init, cpu); + run_on_cpu(cpu, do_kvm_cpu_synchronize_post_init, NULL); } =20 int kvm_cpu_exec(CPUState *cpu) @@ -2216,7 +2210,7 @@ struct kvm_set_guest_debug_data { int err; }; =20 -static void kvm_invoke_set_guest_debug(void *data) +static void kvm_invoke_set_guest_debug(CPUState *unused_cpu, void *data) { struct kvm_set_guest_debug_data *dbg_data =3D data; =20 @@ -2234,7 +2228,6 @@ int kvm_update_guest_debug(CPUState *cpu, unsigned = long reinject_trap) data.dbg.control |=3D KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLES= TEP; } kvm_arch_update_guest_debug(cpu, &data.dbg); - data.cpu =3D cpu; =20 run_on_cpu(cpu, kvm_invoke_set_guest_debug, &data); return data.err; diff --git a/target-i386/helper.c b/target-i386/helper.c index 1c250b8..9bc961b 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -1113,7 +1113,6 @@ out: =20 typedef struct MCEInjectionParams { Monitor *mon; - X86CPU *cpu; int bank; uint64_t status; uint64_t mcg_status; @@ -1122,14 +1121,14 @@ typedef struct MCEInjectionParams { int flags; } MCEInjectionParams; =20 -static void do_inject_x86_mce(void *data) +static void do_inject_x86_mce(CPUState *cs, void *data) { MCEInjectionParams *params =3D data; - CPUX86State *cenv =3D ¶ms->cpu->env; - CPUState *cpu =3D CPU(params->cpu); + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *cenv =3D &cpu->env; uint64_t *banks =3D cenv->mce_banks + 4 * params->bank; =20 - cpu_synchronize_state(cpu); + cpu_synchronize_state(cs); =20 /* * If there is an MCE exception being processed, ignore this SRAO MC= E @@ -1149,7 +1148,7 @@ static void do_inject_x86_mce(void *data) if ((cenv->mcg_cap & MCG_CTL_P) && cenv->mcg_ctl !=3D ~(uint64_t= )0) { monitor_printf(params->mon, "CPU %d: Uncorrected error reporting disabled= \n", - cpu->cpu_index); + cs->cpu_index); return; } =20 @@ -1161,7 +1160,7 @@ static void do_inject_x86_mce(void *data) monitor_printf(params->mon, "CPU %d: Uncorrected error reporting disabled= for" " bank %d\n", - cpu->cpu_index, params->bank); + cs->cpu_index, params->bank); return; } =20 @@ -1170,7 +1169,7 @@ static void do_inject_x86_mce(void *data) monitor_printf(params->mon, "CPU %d: Previous MCE still in progress, rais= ing" " triple fault\n", - cpu->cpu_index); + cs->cpu_index); qemu_log_mask(CPU_LOG_RESET, "Triple fault\n"); qemu_system_reset_request(); return; @@ -1182,7 +1181,7 @@ static void do_inject_x86_mce(void *data) banks[3] =3D params->misc; cenv->mcg_status =3D params->mcg_status; banks[1] =3D params->status; - cpu_interrupt(cpu, CPU_INTERRUPT_MCE); + cpu_interrupt(cs, CPU_INTERRUPT_MCE); } else if (!(banks[1] & MCI_STATUS_VAL) || !(banks[1] & MCI_STATUS_UC)) { if (banks[1] & MCI_STATUS_VAL) { @@ -1204,7 +1203,6 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, = int bank, CPUX86State *cenv =3D &cpu->env; MCEInjectionParams params =3D { .mon =3D mon, - .cpu =3D cpu, .bank =3D bank, .status =3D status, .mcg_status =3D mcg_status, @@ -1245,7 +1243,6 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, = int bank, if (other_cs =3D=3D cs) { continue; } - params.cpu =3D X86_CPU(other_cs); run_on_cpu(other_cs, do_inject_x86_mce, ¶ms); } } diff --git a/target-i386/kvm.c b/target-i386/kvm.c index f1ad805..91bc935 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -156,10 +156,8 @@ static int kvm_get_tsc(CPUState *cs) return 0; } =20 -static inline void do_kvm_synchronize_tsc(void *arg) +static inline void do_kvm_synchronize_tsc(CPUState *cpu, void *arg) { - CPUState *cpu =3D arg; - kvm_get_tsc(cpu); } =20 @@ -169,7 +167,7 @@ void kvm_synchronize_all_tsc(void) =20 if (kvm_enabled()) { CPU_FOREACH(cpu) { - run_on_cpu(cpu, do_kvm_synchronize_tsc, cpu); + run_on_cpu(cpu, do_kvm_synchronize_tsc, NULL); } } } diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c index 2f3c8e2..35ae2ce 100644 --- a/target-s390x/cpu.c +++ b/target-s390x/cpu.c @@ -164,7 +164,7 @@ static void s390_cpu_machine_reset_cb(void *opaque) { S390CPU *cpu =3D opaque; =20 - run_on_cpu(CPU(cpu), s390_do_cpu_full_reset, CPU(cpu)); + run_on_cpu(CPU(cpu), s390_do_cpu_full_reset, NULL); } #endif =20 @@ -220,7 +220,7 @@ static void s390_cpu_realizefn(DeviceState *dev, Erro= r **errp) s390_cpu_gdb_init(cs); qemu_init_vcpu(cs); #if !defined(CONFIG_USER_ONLY) - run_on_cpu(cs, s390_do_cpu_full_reset, cs); + run_on_cpu(cs, s390_do_cpu_full_reset, NULL); #else cpu_reset(cs); #endif diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h index 5645e06..4fb34b5 100644 --- a/target-s390x/cpu.h +++ b/target-s390x/cpu.h @@ -502,17 +502,14 @@ static inline hwaddr decode_basedisp_s(CPUS390XStat= e *env, uint32_t ipb, #define decode_basedisp_rs decode_basedisp_s =20 /* helper functions for run_on_cpu() */ -static inline void s390_do_cpu_reset(void *arg) +static inline void s390_do_cpu_reset(CPUState *cs, void *arg) { - CPUState *cs =3D arg; S390CPUClass *scc =3D S390_CPU_GET_CLASS(cs); =20 scc->cpu_reset(cs); } -static inline void s390_do_cpu_full_reset(void *arg) +static inline void s390_do_cpu_full_reset(CPUState *cs, void *arg) { - CPUState *cs =3D arg; - cpu_reset(cs); } =20 diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index dfaf1ca..d745bb0 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -1385,7 +1385,6 @@ static int handle_diag(S390CPU *cpu, struct kvm_run= *run, uint32_t ipb) } =20 typedef struct SigpInfo { - S390CPU *cpu; uint64_t param; int cc; uint64_t *status_reg; @@ -1398,38 +1397,40 @@ static void set_sigp_status(SigpInfo *si, uint64_= t status) si->cc =3D SIGP_CC_STATUS_STORED; } =20 -static void sigp_start(void *arg) +static void sigp_start(CPUState *cs, void *arg) { + S390CPU *cpu =3D S390_CPU(cs); SigpInfo *si =3D arg; =20 - if (s390_cpu_get_state(si->cpu) !=3D CPU_STATE_STOPPED) { + if (s390_cpu_get_state(cpu) !=3D CPU_STATE_STOPPED) { si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; return; } =20 - s390_cpu_set_state(CPU_STATE_OPERATING, si->cpu); + s390_cpu_set_state(CPU_STATE_OPERATING, cpu); si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; } =20 -static void sigp_stop(void *arg) +static void sigp_stop(CPUState *cs, void *arg) { + S390CPU *cpu =3D S390_CPU(cs); SigpInfo *si =3D arg; struct kvm_s390_irq irq =3D { .type =3D KVM_S390_SIGP_STOP, }; =20 - if (s390_cpu_get_state(si->cpu) !=3D CPU_STATE_OPERATING) { + if (s390_cpu_get_state(cpu) !=3D CPU_STATE_OPERATING) { si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; return; } =20 /* disabled wait - sleeping in user space */ - if (CPU(si->cpu)->halted) { - s390_cpu_set_state(CPU_STATE_STOPPED, si->cpu); + if (cs->halted) { + s390_cpu_set_state(CPU_STATE_STOPPED, cpu); } else { /* execute the stop function */ - si->cpu->env.sigp_order =3D SIGP_STOP; - kvm_s390_vcpu_interrupt(si->cpu, &irq); + cpu->env.sigp_order =3D SIGP_STOP; + kvm_s390_vcpu_interrupt(cpu, &irq); } si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; } @@ -1496,56 +1497,58 @@ static int kvm_s390_store_status(S390CPU *cpu, hw= addr addr, bool store_arch) return 0; } =20 -static void sigp_stop_and_store_status(void *arg) +static void sigp_stop_and_store_status(CPUState *cs, void *arg) { + S390CPU *cpu =3D S390_CPU(cs); SigpInfo *si =3D arg; struct kvm_s390_irq irq =3D { .type =3D KVM_S390_SIGP_STOP, }; =20 /* disabled wait - sleeping in user space */ - if (s390_cpu_get_state(si->cpu) =3D=3D CPU_STATE_OPERATING && - CPU(si->cpu)->halted) { - s390_cpu_set_state(CPU_STATE_STOPPED, si->cpu); + if (s390_cpu_get_state(cpu) =3D=3D CPU_STATE_OPERATING && cs->halted= ) { + s390_cpu_set_state(CPU_STATE_STOPPED, cpu); } =20 - switch (s390_cpu_get_state(si->cpu)) { + switch (s390_cpu_get_state(cpu)) { case CPU_STATE_OPERATING: - si->cpu->env.sigp_order =3D SIGP_STOP_STORE_STATUS; - kvm_s390_vcpu_interrupt(si->cpu, &irq); + cpu->env.sigp_order =3D SIGP_STOP_STORE_STATUS; + kvm_s390_vcpu_interrupt(cpu, &irq); /* store will be performed when handling the stop intercept */ break; case CPU_STATE_STOPPED: /* already stopped, just store the status */ - cpu_synchronize_state(CPU(si->cpu)); - kvm_s390_store_status(si->cpu, KVM_S390_STORE_STATUS_DEF_ADDR, t= rue); + cpu_synchronize_state(cs); + kvm_s390_store_status(cpu, KVM_S390_STORE_STATUS_DEF_ADDR, true)= ; break; } si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; } =20 -static void sigp_store_status_at_address(void *arg) +static void sigp_store_status_at_address(CPUState *cs, void *arg) { + S390CPU *cpu =3D S390_CPU(cs); SigpInfo *si =3D arg; uint32_t address =3D si->param & 0x7ffffe00u; =20 /* cpu has to be stopped */ - if (s390_cpu_get_state(si->cpu) !=3D CPU_STATE_STOPPED) { + if (s390_cpu_get_state(cpu) !=3D CPU_STATE_STOPPED) { set_sigp_status(si, SIGP_STAT_INCORRECT_STATE); return; } =20 - cpu_synchronize_state(CPU(si->cpu)); + cpu_synchronize_state(cs); =20 - if (kvm_s390_store_status(si->cpu, address, false)) { + if (kvm_s390_store_status(cpu, address, false)) { set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER); return; } si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; } =20 -static void sigp_store_adtl_status(void *arg) +static void sigp_store_adtl_status(CPUState *cs, void *arg) { + S390CPU *cpu =3D S390_CPU(cs); SigpInfo *si =3D arg; =20 if (!s390_has_feat(S390_FEAT_VECTOR)) { @@ -1554,7 +1557,7 @@ static void sigp_store_adtl_status(void *arg) } =20 /* cpu has to be stopped */ - if (s390_cpu_get_state(si->cpu) !=3D CPU_STATE_STOPPED) { + if (s390_cpu_get_state(cpu) !=3D CPU_STATE_STOPPED) { set_sigp_status(si, SIGP_STAT_INCORRECT_STATE); return; } @@ -1565,31 +1568,32 @@ static void sigp_store_adtl_status(void *arg) return; } =20 - cpu_synchronize_state(CPU(si->cpu)); + cpu_synchronize_state(cs); =20 - if (kvm_s390_store_adtl_status(si->cpu, si->param)) { + if (kvm_s390_store_adtl_status(cpu, si->param)) { set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER); return; } si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; } =20 -static void sigp_restart(void *arg) +static void sigp_restart(CPUState *cs, void *arg) { + S390CPU *cpu =3D S390_CPU(cs); SigpInfo *si =3D arg; struct kvm_s390_irq irq =3D { .type =3D KVM_S390_RESTART, }; =20 - switch (s390_cpu_get_state(si->cpu)) { + switch (s390_cpu_get_state(cpu)) { case CPU_STATE_STOPPED: /* the restart irq has to be delivered prior to any other pendin= g irq */ - cpu_synchronize_state(CPU(si->cpu)); - do_restart_interrupt(&si->cpu->env); - s390_cpu_set_state(CPU_STATE_OPERATING, si->cpu); + cpu_synchronize_state(cs); + do_restart_interrupt(&cpu->env); + s390_cpu_set_state(CPU_STATE_OPERATING, cpu); break; case CPU_STATE_OPERATING: - kvm_s390_vcpu_interrupt(si->cpu, &irq); + kvm_s390_vcpu_interrupt(cpu, &irq); break; } si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; @@ -1597,20 +1601,18 @@ static void sigp_restart(void *arg) =20 int kvm_s390_cpu_restart(S390CPU *cpu) { - SigpInfo si =3D { - .cpu =3D cpu, - }; + SigpInfo si =3D {}; =20 run_on_cpu(CPU(cpu), sigp_restart, &si); DPRINTF("DONE: KVM cpu restart: %p\n", &cpu->env); return 0; } =20 -static void sigp_initial_cpu_reset(void *arg) +static void sigp_initial_cpu_reset(CPUState *cs, void *arg) { + S390CPU *cpu =3D S390_CPU(cs); + S390CPUClass *scc =3D S390_CPU_GET_CLASS(cpu); SigpInfo *si =3D arg; - CPUState *cs =3D CPU(si->cpu); - S390CPUClass *scc =3D S390_CPU_GET_CLASS(si->cpu); =20 cpu_synchronize_state(cs); scc->initial_cpu_reset(cs); @@ -1618,11 +1620,11 @@ static void sigp_initial_cpu_reset(void *arg) si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; } =20 -static void sigp_cpu_reset(void *arg) +static void sigp_cpu_reset(CPUState *cs, void *arg) { + S390CPU *cpu =3D S390_CPU(cs); + S390CPUClass *scc =3D S390_CPU_GET_CLASS(cpu); SigpInfo *si =3D arg; - CPUState *cs =3D CPU(si->cpu); - S390CPUClass *scc =3D S390_CPU_GET_CLASS(si->cpu); =20 cpu_synchronize_state(cs); scc->cpu_reset(cs); @@ -1630,12 +1632,13 @@ static void sigp_cpu_reset(void *arg) si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; } =20 -static void sigp_set_prefix(void *arg) +static void sigp_set_prefix(CPUState *cs, void *arg) { + S390CPU *cpu =3D S390_CPU(cs); SigpInfo *si =3D arg; uint32_t addr =3D si->param & 0x7fffe000u; =20 - cpu_synchronize_state(CPU(si->cpu)); + cpu_synchronize_state(cs); =20 if (!address_space_access_valid(&address_space_memory, addr, sizeof(struct LowCore), false)) { @@ -1644,13 +1647,13 @@ static void sigp_set_prefix(void *arg) } =20 /* cpu has to be stopped */ - if (s390_cpu_get_state(si->cpu) !=3D CPU_STATE_STOPPED) { + if (s390_cpu_get_state(cpu) !=3D CPU_STATE_STOPPED) { set_sigp_status(si, SIGP_STAT_INCORRECT_STATE); return; } =20 - si->cpu->env.psa =3D addr; - cpu_synchronize_post_init(CPU(si->cpu)); + cpu->env.psa =3D addr; + cpu_synchronize_post_init(cs); si->cc =3D SIGP_CC_ORDER_CODE_ACCEPTED; } =20 @@ -1658,7 +1661,6 @@ static int handle_sigp_single_dst(S390CPU *dst_cpu,= uint8_t order, uint64_t param, uint64_t *status_reg) { SigpInfo si =3D { - .cpu =3D dst_cpu, .param =3D param, .status_reg =3D status_reg, }; diff --git a/target-s390x/misc_helper.c b/target-s390x/misc_helper.c index 86da194..4df2ec6 100644 --- a/target-s390x/misc_helper.c +++ b/target-s390x/misc_helper.c @@ -126,7 +126,7 @@ static int modified_clear_reset(S390CPU *cpu) pause_all_vcpus(); cpu_synchronize_all_states(); CPU_FOREACH(t) { - run_on_cpu(t, s390_do_cpu_full_reset, t); + run_on_cpu(t, s390_do_cpu_full_reset, NULL); } s390_cmma_reset(); subsystem_reset(); @@ -145,7 +145,7 @@ static int load_normal_reset(S390CPU *cpu) pause_all_vcpus(); cpu_synchronize_all_states(); CPU_FOREACH(t) { - run_on_cpu(t, s390_do_cpu_reset, t); + run_on_cpu(t, s390_do_cpu_reset, NULL); } s390_cmma_reset(); subsystem_reset(); --=20 2.7.4