Skip to content

Commit

Permalink
s390: wire up nmi command to raise a RESTART interrupt on S390
Browse files Browse the repository at this point in the history
There is the 'nmi' command that is used to trigger a guest dump via kdump feature on x86.
s390 uses RESTART interrupt to trigger kdump.
So, this patch provides a mean to use 'nmi' command on s390 to raise RESTART interrupt.

The CPU to receive the RESTART interrupt is the "default" one.

There is an infrastructure to select the "default" CPU using 'cpu' command.
The 'info cpus' command can be used to see which one is the "default".

In order to wire up the RESTART to 'nmi' command we had to:
1. implement the kvm_s390_cpu_restart function by exporting the existing code
2. implement s390_cpu_restart function as kvm-aware wrapper
3. modify the qmp_inject_nmi function to enable (for s390) the scan for
   "default" CPU and call s390_cpu_restart for it;
3. fix some messages.

Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Acked-by: Alexander Graf <agraf@suse.de>
  • Loading branch information
Eugene (jno) Dvurechenski authored and borntraeger committed Aug 30, 2013
1 parent f077847 commit 7f7f975
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 6 deletions.
14 changes: 14 additions & 0 deletions cpus.c
Expand Up @@ -1401,6 +1401,20 @@ void qmp_inject_nmi(Error **errp)
apic_deliver_nmi(env->apic_state);
}
}
#elif defined(TARGET_S390X)
CPUState *cs;
S390CPU *cpu;

for (cs = first_cpu; cs != NULL; cs = cs->next_cpu) {
cpu = S390_CPU(cs);
if (cpu->env.cpu_num == monitor_get_cpu_index()) {
if (s390_cpu_restart(S390_CPU(cs)) == -1) {
error_set(errp, QERR_UNSUPPORTED);
return;
}
break;
}
}
#else
error_set(errp, QERR_UNSUPPORTED);
#endif
Expand Down
4 changes: 2 additions & 2 deletions hmp-commands.hx
Expand Up @@ -822,7 +822,7 @@ The values that can be specified here depend on the machine type, but are
the same that can be specified in the @code{-boot} command line option.
ETEXI

#if defined(TARGET_I386)
#if defined(TARGET_I386) || defined(TARGET_S390X)
{
.name = "nmi",
.args_type = "",
Expand All @@ -834,7 +834,7 @@ ETEXI
STEXI
@item nmi @var{cpu}
@findex nmi
Inject an NMI on the given CPU (x86 only).
Inject an NMI (x86) or RESTART (s390x) on the given CPU.
ETEXI
Expand Down
2 changes: 1 addition & 1 deletion qmp-commands.hx
Expand Up @@ -487,7 +487,7 @@ Example:
<- { "return": {} }

Note: inject-nmi fails when the guest doesn't support injecting.
Currently, only x86 guests do.
Currently, only x86 (NMI) and s390x (RESTART) guests do.

EQMP

Expand Down
13 changes: 13 additions & 0 deletions target-s390x/cpu.h
Expand Up @@ -1069,6 +1069,7 @@ void kvm_s390_enable_css_support(S390CPU *cpu);
int kvm_s390_get_registers_partial(CPUState *cpu);
int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
int vq, bool assign);
int kvm_s390_cpu_restart(S390CPU *cpu);
#else
static inline void kvm_s390_io_interrupt(S390CPU *cpu,
uint16_t subchannel_id,
Expand All @@ -1093,8 +1094,20 @@ static inline int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier,
{
return -ENOSYS;
}
static inline int kvm_s390_cpu_restart(S390CPU *cpu)
{
return -ENOSYS;
}
#endif

static inline int s390_cpu_restart(S390CPU *cpu)
{
if (kvm_enabled()) {
return kvm_s390_cpu_restart(cpu);
}
return -ENOSYS;
}

static inline void s390_io_interrupt(S390CPU *cpu,
uint16_t subchannel_id,
uint16_t subchannel_nr,
Expand Down
6 changes: 3 additions & 3 deletions target-s390x/kvm.c
Expand Up @@ -612,12 +612,12 @@ static int handle_diag(S390CPU *cpu, struct kvm_run *run, int ipb_code)
return r;
}

static int s390_cpu_restart(S390CPU *cpu)
int kvm_s390_cpu_restart(S390CPU *cpu)
{
kvm_s390_interrupt(cpu, KVM_S390_RESTART, 0);
s390_add_running_cpu(cpu);
qemu_cpu_kick(CPU(cpu));
DPRINTF("DONE: SIGP cpu restart: %p\n", &cpu->env);
DPRINTF("DONE: KVM cpu restart: %p\n", &cpu->env);
return 0;
}

Expand Down Expand Up @@ -686,7 +686,7 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)

switch (order_code) {
case SIGP_RESTART:
r = s390_cpu_restart(target_cpu);
r = kvm_s390_cpu_restart(target_cpu);
break;
case SIGP_STORE_STATUS_ADDR:
r = s390_store_status(target_env, parameter);
Expand Down

0 comments on commit 7f7f975

Please sign in to comment.