Revision 49e15878
b/hw/s390x/ipl.c | ||
---|---|---|
58 | 58 |
|
59 | 59 |
static void s390_ipl_cpu(uint64_t pswaddr) |
60 | 60 |
{ |
61 |
CPUS390XState *env = &S390_CPU(qemu_get_cpu(0))->env; |
|
61 |
S390CPU *cpu = S390_CPU(qemu_get_cpu(0)); |
|
62 |
CPUS390XState *env = &cpu->env; |
|
63 |
|
|
62 | 64 |
env->psw.addr = pswaddr; |
63 | 65 |
env->psw.mask = IPL_PSW_MASK; |
64 |
s390_add_running_cpu(env);
|
|
66 |
s390_add_running_cpu(cpu);
|
|
65 | 67 |
} |
66 | 68 |
|
67 | 69 |
static int s390_ipl_init(SysBusDevice *dev) |
b/hw/s390x/s390-virtio.c | ||
---|---|---|
130 | 130 |
*/ |
131 | 131 |
static unsigned s390_running_cpus; |
132 | 132 |
|
133 |
void s390_add_running_cpu(CPUS390XState *env)
|
|
133 |
void s390_add_running_cpu(S390CPU *cpu)
|
|
134 | 134 |
{ |
135 |
CPUS390XState *env = &cpu->env; |
|
136 |
|
|
135 | 137 |
if (env->halted) { |
136 | 138 |
s390_running_cpus++; |
137 | 139 |
env->halted = 0; |
... | ... | |
139 | 141 |
} |
140 | 142 |
} |
141 | 143 |
|
142 |
unsigned s390_del_running_cpu(CPUS390XState *env)
|
|
144 |
unsigned s390_del_running_cpu(S390CPU *cpu)
|
|
143 | 145 |
{ |
146 |
CPUS390XState *env = &cpu->env; |
|
147 |
|
|
144 | 148 |
if (env->halted == 0) { |
145 | 149 |
assert(s390_running_cpus >= 1); |
146 | 150 |
s390_running_cpus--; |
b/target-s390x/cpu.c | ||
---|---|---|
70 | 70 |
log_cpu_state(env, 0); |
71 | 71 |
} |
72 | 72 |
|
73 |
s390_del_running_cpu(env);
|
|
73 |
s390_del_running_cpu(cpu);
|
|
74 | 74 |
|
75 | 75 |
scc->parent_reset(s); |
76 | 76 |
|
b/target-s390x/cpu.h | ||
---|---|---|
375 | 375 |
} |
376 | 376 |
#endif |
377 | 377 |
S390CPU *s390_cpu_addr2state(uint16_t cpu_addr); |
378 |
void s390_add_running_cpu(CPUS390XState *env);
|
|
379 |
unsigned s390_del_running_cpu(CPUS390XState *env);
|
|
378 |
void s390_add_running_cpu(S390CPU *cpu);
|
|
379 |
unsigned s390_del_running_cpu(S390CPU *cpu);
|
|
380 | 380 |
|
381 | 381 |
/* service interrupts are floating therefore we must not pass an cpustate */ |
382 | 382 |
void s390_sclp_extint(uint32_t parm); |
... | ... | |
385 | 385 |
extern const hwaddr virtio_size; |
386 | 386 |
|
387 | 387 |
#else |
388 |
static inline void s390_add_running_cpu(CPUS390XState *env)
|
|
388 |
static inline void s390_add_running_cpu(S390CPU *cpu)
|
|
389 | 389 |
{ |
390 | 390 |
} |
391 | 391 |
|
392 |
static inline unsigned s390_del_running_cpu(CPUS390XState *env)
|
|
392 |
static inline unsigned s390_del_running_cpu(S390CPU *cpu)
|
|
393 | 393 |
{ |
394 | 394 |
return 0; |
395 | 395 |
} |
b/target-s390x/helper.c | ||
---|---|---|
441 | 441 |
void load_psw(CPUS390XState *env, uint64_t mask, uint64_t addr) |
442 | 442 |
{ |
443 | 443 |
if (mask & PSW_MASK_WAIT) { |
444 |
S390CPU *cpu = s390_env_get_cpu(env); |
|
444 | 445 |
if (!(mask & (PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK))) { |
445 |
if (s390_del_running_cpu(env) == 0) {
|
|
446 |
if (s390_del_running_cpu(cpu) == 0) {
|
|
446 | 447 |
#ifndef CONFIG_USER_ONLY |
447 | 448 |
qemu_system_shutdown_request(); |
448 | 449 |
#endif |
... | ... | |
742 | 743 |
qemu_log_mask(CPU_LOG_INT, "%s: %d at pc=%" PRIx64 "\n", |
743 | 744 |
__func__, env->exception_index, env->psw.addr); |
744 | 745 |
|
745 |
s390_add_running_cpu(env);
|
|
746 |
s390_add_running_cpu(cpu);
|
|
746 | 747 |
/* handle machine checks */ |
747 | 748 |
if ((env->psw.mask & PSW_MASK_MCHECK) && |
748 | 749 |
(env->exception_index == -1)) { |
b/target-s390x/kvm.c | ||
---|---|---|
570 | 570 |
|
571 | 571 |
static int s390_cpu_restart(S390CPU *cpu) |
572 | 572 |
{ |
573 |
CPUS390XState *env = &cpu->env; |
|
574 |
|
|
575 | 573 |
kvm_s390_interrupt(cpu, KVM_S390_RESTART, 0); |
576 |
s390_add_running_cpu(env);
|
|
574 |
s390_add_running_cpu(cpu);
|
|
577 | 575 |
qemu_cpu_kick(CPU(cpu)); |
578 |
dprintf("DONE: SIGP cpu restart: %p\n", env); |
|
576 |
dprintf("DONE: SIGP cpu restart: %p\n", &cpu->env);
|
|
579 | 577 |
return 0; |
580 | 578 |
} |
581 | 579 |
|
... | ... | |
591 | 589 |
CPUS390XState *env = &cpu->env; |
592 | 590 |
int i; |
593 | 591 |
|
594 |
s390_del_running_cpu(env);
|
|
592 |
s390_del_running_cpu(cpu);
|
|
595 | 593 |
if (kvm_vcpu_ioctl(CPU(cpu), KVM_S390_INITIAL_RESET, NULL) < 0) { |
596 | 594 |
perror("cannot init reset vcpu"); |
597 | 595 |
} |
... | ... | |
701 | 699 |
|
702 | 700 |
static int handle_intercept(S390CPU *cpu) |
703 | 701 |
{ |
704 |
CPUS390XState *env = &cpu->env; |
|
705 | 702 |
CPUState *cs = CPU(cpu); |
706 | 703 |
struct kvm_run *run = cs->kvm_run; |
707 | 704 |
int icpt_code = run->s390_sieic.icptcode; |
... | ... | |
714 | 711 |
r = handle_instruction(cpu, run); |
715 | 712 |
break; |
716 | 713 |
case ICPT_WAITPSW: |
717 |
if (s390_del_running_cpu(env) == 0 &&
|
|
714 |
if (s390_del_running_cpu(cpu) == 0 &&
|
|
718 | 715 |
is_special_wait_psw(cs)) { |
719 | 716 |
qemu_system_shutdown_request(); |
720 | 717 |
} |
721 | 718 |
r = EXCP_HALTED; |
722 | 719 |
break; |
723 | 720 |
case ICPT_CPU_STOP: |
724 |
if (s390_del_running_cpu(env) == 0) {
|
|
721 |
if (s390_del_running_cpu(cpu) == 0) {
|
|
725 | 722 |
qemu_system_shutdown_request(); |
726 | 723 |
} |
727 | 724 |
r = EXCP_HALTED; |
Also available in: Unified diff