From: Christian Borntraeger <borntraeger@de.ibm.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>,
qemu-devel <qemu-devel@nongnu.org>,
Alexander Graf <agraf@suse.de>,
David Hildenbrand <dahi@linux.vnet.ibm.com>,
Jens Freimann <jfrei@linux.vnet.ibm.com>,
Cornelia Huck <cornelia.huck@de.ibm.com>,
Richard Henderson <rth@twiddle.net>
Subject: [Qemu-devel] [PULL 03/20] s390x/kvm: more details for SIGP handler with one destination vcpu
Date: Tue, 10 Mar 2015 09:37:56 +0100 [thread overview]
Message-ID: <1425976693-18087-4-git-send-email-borntraeger@de.ibm.com> (raw)
In-Reply-To: <1425976693-18087-1-git-send-email-borntraeger@de.ibm.com>
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
Whenever a sigp order is to be executed by a target vcpu, we use run_on_cpu().
As we have only one pointer to pass all data to these sigp handlers, let's
introduce the struct sigp_info and use it as a transport container.
All orders targeting a single vcpu are now dispatched from a separate
handler. The destination vcpu is only valid for these orders and must not be
checked for SIGP SET ARCHITECTURE.
The sigp_info is filled with life in this new handler and used to pass the
information about the sigp order to the existing handlers. The cc is set
within these handlers.
Rename sigp_cpu_start() and sigp_cpu_restart() on the way to match the SIGP
order names (in order to avoid touching affected lines several times).
Reviewed-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Message-Id: <1424783731-43426-3-git-send-email-jfrei@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
target-s390x/kvm.c | 153 +++++++++++++++++++++++++++++++----------------------
1 file changed, 91 insertions(+), 62 deletions(-)
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index 3f7e9ad..8918986 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -1111,110 +1111,139 @@ static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb)
return r;
}
-static void sigp_cpu_start(void *arg)
+typedef struct SigpInfo {
+ S390CPU *cpu;
+ int cc;
+ uint64_t *status_reg;
+} SigpInfo;
+
+static void sigp_start(void *arg)
{
- CPUState *cs = arg;
- S390CPU *cpu = S390_CPU(cs);
+ SigpInfo *si = arg;
- s390_cpu_set_state(CPU_STATE_OPERATING, cpu);
- DPRINTF("DONE: KVM cpu start: %p\n", &cpu->env);
+ s390_cpu_set_state(CPU_STATE_OPERATING, si->cpu);
+ si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
+ DPRINTF("DONE: KVM cpu start: %p\n", &si->cpu->env);
}
-static void sigp_cpu_restart(void *arg)
+static void sigp_restart(void *arg)
{
- CPUState *cs = arg;
- S390CPU *cpu = S390_CPU(cs);
+ SigpInfo *si = arg;
struct kvm_s390_irq irq = {
.type = KVM_S390_RESTART,
};
- kvm_s390_vcpu_interrupt(cpu, &irq);
- s390_cpu_set_state(CPU_STATE_OPERATING, cpu);
+ kvm_s390_vcpu_interrupt(si->cpu, &irq);
+ s390_cpu_set_state(CPU_STATE_OPERATING, si->cpu);
+ si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
}
int kvm_s390_cpu_restart(S390CPU *cpu)
{
- run_on_cpu(CPU(cpu), sigp_cpu_restart, CPU(cpu));
+ SigpInfo si = {
+ .cpu = cpu,
+ };
+
+ run_on_cpu(CPU(cpu), sigp_restart, &si);
DPRINTF("DONE: KVM cpu restart: %p\n", &cpu->env);
return 0;
}
static void sigp_initial_cpu_reset(void *arg)
{
- CPUState *cpu = arg;
- S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
+ SigpInfo *si = arg;
+ CPUState *cs = CPU(si->cpu);
+ S390CPUClass *scc = S390_CPU_GET_CLASS(si->cpu);
- cpu_synchronize_state(cpu);
- scc->initial_cpu_reset(cpu);
- cpu_synchronize_post_reset(cpu);
+ cpu_synchronize_state(cs);
+ scc->initial_cpu_reset(cs);
+ cpu_synchronize_post_reset(cs);
+ si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
}
static void sigp_cpu_reset(void *arg)
{
- CPUState *cpu = arg;
- S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
+ SigpInfo *si = arg;
+ CPUState *cs = CPU(si->cpu);
+ S390CPUClass *scc = S390_CPU_GET_CLASS(si->cpu);
- cpu_synchronize_state(cpu);
- scc->cpu_reset(cpu);
- cpu_synchronize_post_reset(cpu);
+ cpu_synchronize_state(cs);
+ scc->cpu_reset(cs);
+ cpu_synchronize_post_reset(cs);
+ si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
}
-#define SIGP_ORDER_MASK 0x000000ff
-
-static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
+static int handle_sigp_single_dst(S390CPU *dst_cpu, uint8_t order,
+ uint64_t *status_reg)
{
- CPUS390XState *env = &cpu->env;
- uint8_t order_code;
- uint16_t cpu_addr;
- S390CPU *target_cpu;
- uint64_t *statusreg = &env->regs[ipa1 >> 4];
- int cc;
-
- cpu_synchronize_state(CPU(cpu));
-
- /* get order code */
- order_code = decode_basedisp_rs(env, run->s390_sieic.ipb) & SIGP_ORDER_MASK;
+ SigpInfo si = {
+ .cpu = dst_cpu,
+ .status_reg = status_reg,
+ };
- cpu_addr = env->regs[ipa1 & 0x0f];
- target_cpu = s390_cpu_addr2state(cpu_addr);
- if (target_cpu == NULL) {
- cc = SIGP_CC_NOT_OPERATIONAL;
- goto out;
+ /* cpu available? */
+ if (dst_cpu == NULL) {
+ return SIGP_CC_NOT_OPERATIONAL;
}
- switch (order_code) {
+ switch (order) {
case SIGP_START:
- run_on_cpu(CPU(target_cpu), sigp_cpu_start, CPU(target_cpu));
- cc = SIGP_CC_ORDER_CODE_ACCEPTED;
+ run_on_cpu(CPU(dst_cpu), sigp_start, &si);
break;
case SIGP_RESTART:
- run_on_cpu(CPU(target_cpu), sigp_cpu_restart, CPU(target_cpu));
- cc = SIGP_CC_ORDER_CODE_ACCEPTED;
- break;
- case SIGP_SET_ARCH:
- *statusreg &= 0xffffffff00000000UL;
- *statusreg |= SIGP_STAT_INVALID_PARAMETER;
- cc = SIGP_CC_STATUS_STORED;
- break;
+ run_on_cpu(CPU(dst_cpu), sigp_restart, &si);
case SIGP_INITIAL_CPU_RESET:
- run_on_cpu(CPU(target_cpu), sigp_initial_cpu_reset, CPU(target_cpu));
- cc = SIGP_CC_ORDER_CODE_ACCEPTED;
+ run_on_cpu(CPU(dst_cpu), sigp_initial_cpu_reset, &si);
break;
case SIGP_CPU_RESET:
- run_on_cpu(CPU(target_cpu), sigp_cpu_reset, CPU(target_cpu));
- cc = SIGP_CC_ORDER_CODE_ACCEPTED;
+ run_on_cpu(CPU(dst_cpu), sigp_cpu_reset, &si);
break;
default:
- DPRINTF("KVM: unknown SIGP: 0x%x\n", order_code);
- *statusreg &= 0xffffffff00000000UL;
- *statusreg |= SIGP_STAT_INVALID_ORDER;
- cc = SIGP_CC_STATUS_STORED;
+ DPRINTF("KVM: unknown SIGP: 0x%x\n", order);
+ *status_reg &= 0xffffffff00000000ULL;
+ *status_reg |= SIGP_STAT_INVALID_ORDER;
+ si.cc = SIGP_CC_STATUS_STORED;
+ }
+
+ return si.cc;
+}
+
+#define SIGP_ORDER_MASK 0x000000ff
+
+static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
+{
+ CPUS390XState *env = &cpu->env;
+ const uint8_t r1 = ipa1 >> 4;
+ const uint8_t r3 = ipa1 & 0x0f;
+ int ret;
+ uint8_t order;
+ uint64_t *status_reg;
+ S390CPU *dst_cpu = NULL;
+
+ cpu_synchronize_state(CPU(cpu));
+
+ /* get order code */
+ order = decode_basedisp_rs(env, run->s390_sieic.ipb) & SIGP_ORDER_MASK;
+ status_reg = &env->regs[r1];
+
+ switch (order) {
+ case SIGP_SET_ARCH:
+ *status_reg &= 0xffffffff00000000ULL;
+ *status_reg |= SIGP_STAT_INVALID_PARAMETER;
+ ret = SIGP_CC_STATUS_STORED;
break;
+ default:
+ /* all other sigp orders target a single vcpu */
+ dst_cpu = s390_cpu_addr2state(env->regs[r3]);
+ ret = handle_sigp_single_dst(dst_cpu, order, status_reg);
}
-out:
- setcc(cpu, cc);
- return 0;
+ if (ret >= 0) {
+ setcc(cpu, ret);
+ return 0;
+ }
+
+ return ret;
}
static int handle_instruction(S390CPU *cpu, struct kvm_run *run)
--
2.3.0
next prev parent reply other threads:[~2015-03-10 8:38 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-10 8:37 [Qemu-devel] [PULL 00/20] s390x/kvm: Features and fixes for 2.3 Christian Borntraeger
2015-03-10 8:37 ` [Qemu-devel] [PULL 01/20] synchronize Linux headers to 4.0-rc3 Christian Borntraeger
2015-03-10 8:37 ` [Qemu-devel] [PULL 02/20] s390x: introduce defines for SIGP condition codes Christian Borntraeger
2015-03-10 8:37 ` Christian Borntraeger [this message]
2015-03-10 8:37 ` [Qemu-devel] [PULL 04/20] s390x/kvm: pass the SIGP instruction parameter to the SIGP handler Christian Borntraeger
2015-03-10 8:37 ` [Qemu-devel] [PULL 05/20] s390x/kvm: helper to set the SIGP status in SigpInfo Christian Borntraeger
2015-03-10 8:37 ` [Qemu-devel] [PULL 06/20] s390x/kvm: trace all SIGP orders Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 07/20] s390x/kvm: implement handling of new " Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 08/20] s390x/kvm: SIGP START is only applicable when STOPPED Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 09/20] s390x: add function to deliver restart irqs Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 10/20] s390x/kvm: deliver SIGP RESTART directly if stopped Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 11/20] s390x/kvm: enable the new SIGP handling in user space Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 12/20] virtio-s390: s390_virtio_device_init() can't fail, simplify Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 13/20] virtio-s390: Convert to realize() Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 14/20] virtio-ccw: " Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 15/20] s390x/kvm: passing max memory size to accelerator Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 16/20] s390-ccw.img: Allow bigger ramdisk sizes or offsets Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 17/20] s390-ccw.img: Reinitialize guessing on reboot Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 18/20] elf-loader: Provide the possibility to relocate s390 ELF files Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 19/20] s390/bios: Make the s390-ccw.img relocatable Christian Borntraeger
2015-03-10 8:38 ` [Qemu-devel] [PULL 20/20] s390-ccw: rebuild BIOS Christian Borntraeger
2015-03-10 18:01 ` [Qemu-devel] [PULL 00/20] s390x/kvm: Features and fixes for 2.3 Peter Maydell
2015-03-10 22:26 ` Christian Borntraeger
2015-03-11 7:57 ` Markus Armbruster
2015-03-11 8:08 ` Thomas Huth
2015-03-11 8:09 ` Christian Borntraeger
2015-03-11 9:00 ` Thomas Huth
2015-03-11 10:06 ` Christian Borntraeger
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=1425976693-18087-4-git-send-email-borntraeger@de.ibm.com \
--to=borntraeger@de.ibm.com \
--cc=agraf@suse.de \
--cc=cornelia.huck@de.ibm.com \
--cc=dahi@linux.vnet.ibm.com \
--cc=jfrei@linux.vnet.ibm.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).