Skip to content

Commit

Permalink
target-s390x: Pass S390CPU to s390_{add, del}_running_cpu()
Browse files Browse the repository at this point in the history
This prepares for moving the halted field to CPUState.
Most call sites can already supply S390CPU, for some env becomes unused.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
  • Loading branch information
afaerber authored and agraf committed Feb 1, 2013
1 parent f946673 commit 49e1587
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 19 deletions.
6 changes: 4 additions & 2 deletions hw/s390x/ipl.c
Expand Up @@ -58,10 +58,12 @@ typedef struct S390IPLState {

static void s390_ipl_cpu(uint64_t pswaddr)
{
CPUS390XState *env = &S390_CPU(qemu_get_cpu(0))->env;
S390CPU *cpu = S390_CPU(qemu_get_cpu(0));
CPUS390XState *env = &cpu->env;

env->psw.addr = pswaddr;
env->psw.mask = IPL_PSW_MASK;
s390_add_running_cpu(env);
s390_add_running_cpu(cpu);
}

static int s390_ipl_init(SysBusDevice *dev)
Expand Down
8 changes: 6 additions & 2 deletions hw/s390x/s390-virtio.c
Expand Up @@ -130,17 +130,21 @@ static void s390_virtio_register_hcalls(void)
*/
static unsigned s390_running_cpus;

void s390_add_running_cpu(CPUS390XState *env)
void s390_add_running_cpu(S390CPU *cpu)
{
CPUS390XState *env = &cpu->env;

if (env->halted) {
s390_running_cpus++;
env->halted = 0;
env->exception_index = -1;
}
}

unsigned s390_del_running_cpu(CPUS390XState *env)
unsigned s390_del_running_cpu(S390CPU *cpu)
{
CPUS390XState *env = &cpu->env;

if (env->halted == 0) {
assert(s390_running_cpus >= 1);
s390_running_cpus--;
Expand Down
2 changes: 1 addition & 1 deletion target-s390x/cpu.c
Expand Up @@ -70,7 +70,7 @@ static void s390_cpu_reset(CPUState *s)
log_cpu_state(env, 0);
}

s390_del_running_cpu(env);
s390_del_running_cpu(cpu);

scc->parent_reset(s);

Expand Down
8 changes: 4 additions & 4 deletions target-s390x/cpu.h
Expand Up @@ -375,8 +375,8 @@ static inline void kvm_s390_interrupt_internal(S390CPU *cpu, int type,
}
#endif
S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
void s390_add_running_cpu(CPUS390XState *env);
unsigned s390_del_running_cpu(CPUS390XState *env);
void s390_add_running_cpu(S390CPU *cpu);
unsigned s390_del_running_cpu(S390CPU *cpu);

/* service interrupts are floating therefore we must not pass an cpustate */
void s390_sclp_extint(uint32_t parm);
Expand All @@ -385,11 +385,11 @@ void s390_sclp_extint(uint32_t parm);
extern const hwaddr virtio_size;

#else
static inline void s390_add_running_cpu(CPUS390XState *env)
static inline void s390_add_running_cpu(S390CPU *cpu)
{
}

static inline unsigned s390_del_running_cpu(CPUS390XState *env)
static inline unsigned s390_del_running_cpu(S390CPU *cpu)
{
return 0;
}
Expand Down
5 changes: 3 additions & 2 deletions target-s390x/helper.c
Expand Up @@ -441,8 +441,9 @@ hwaddr cpu_get_phys_page_debug(CPUS390XState *env,
void load_psw(CPUS390XState *env, uint64_t mask, uint64_t addr)
{
if (mask & PSW_MASK_WAIT) {
S390CPU *cpu = s390_env_get_cpu(env);
if (!(mask & (PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK))) {
if (s390_del_running_cpu(env) == 0) {
if (s390_del_running_cpu(cpu) == 0) {
#ifndef CONFIG_USER_ONLY
qemu_system_shutdown_request();
#endif
Expand Down Expand Up @@ -742,7 +743,7 @@ void do_interrupt(CPUS390XState *env)
qemu_log_mask(CPU_LOG_INT, "%s: %d at pc=%" PRIx64 "\n",
__func__, env->exception_index, env->psw.addr);

s390_add_running_cpu(env);
s390_add_running_cpu(cpu);
/* handle machine checks */
if ((env->psw.mask & PSW_MASK_MCHECK) &&
(env->exception_index == -1)) {
Expand Down
13 changes: 5 additions & 8 deletions target-s390x/kvm.c
Expand Up @@ -570,12 +570,10 @@ static int handle_diag(CPUS390XState *env, struct kvm_run *run, int ipb_code)

static int s390_cpu_restart(S390CPU *cpu)
{
CPUS390XState *env = &cpu->env;

kvm_s390_interrupt(cpu, KVM_S390_RESTART, 0);
s390_add_running_cpu(env);
s390_add_running_cpu(cpu);
qemu_cpu_kick(CPU(cpu));
dprintf("DONE: SIGP cpu restart: %p\n", env);
dprintf("DONE: SIGP cpu restart: %p\n", &cpu->env);
return 0;
}

Expand All @@ -591,7 +589,7 @@ static int s390_cpu_initial_reset(S390CPU *cpu)
CPUS390XState *env = &cpu->env;
int i;

s390_del_running_cpu(env);
s390_del_running_cpu(cpu);
if (kvm_vcpu_ioctl(CPU(cpu), KVM_S390_INITIAL_RESET, NULL) < 0) {
perror("cannot init reset vcpu");
}
Expand Down Expand Up @@ -701,7 +699,6 @@ static bool is_special_wait_psw(CPUState *cs)

static int handle_intercept(S390CPU *cpu)
{
CPUS390XState *env = &cpu->env;
CPUState *cs = CPU(cpu);
struct kvm_run *run = cs->kvm_run;
int icpt_code = run->s390_sieic.icptcode;
Expand All @@ -714,14 +711,14 @@ static int handle_intercept(S390CPU *cpu)
r = handle_instruction(cpu, run);
break;
case ICPT_WAITPSW:
if (s390_del_running_cpu(env) == 0 &&
if (s390_del_running_cpu(cpu) == 0 &&
is_special_wait_psw(cs)) {
qemu_system_shutdown_request();
}
r = EXCP_HALTED;
break;
case ICPT_CPU_STOP:
if (s390_del_running_cpu(env) == 0) {
if (s390_del_running_cpu(cpu) == 0) {
qemu_system_shutdown_request();
}
r = EXCP_HALTED;
Expand Down

0 comments on commit 49e1587

Please sign in to comment.