[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 10/11] s390x/sic: realize SIC handling
From: |
Thomas Huth |
Subject: |
Re: [Qemu-devel] [PATCH 10/11] s390x/sic: realize SIC handling |
Date: |
Wed, 12 Jul 2017 15:40:02 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.0 |
On 12.07.2017 14:57, Christian Borntraeger wrote:
> From: Fei Li <address@hidden>
>
> Currently, we do nothing for the SIC instruction, but we need to
> implement it properly. Let's add proper handling in the backend code.
>
> Co-authored-by: Yi Min Zhao <address@hidden>
> Signed-off-by: Yi Min Zhao <address@hidden>
> Signed-off-by: Fei Li <address@hidden>
> Signed-off-by: Christian Borntraeger <address@hidden>
> ---
> hw/s390x/css.c | 26 ++++++++++++++++++++++++++
> hw/s390x/trace-events | 1 +
> include/hw/s390x/css.h | 2 ++
> target/s390x/kvm.c | 16 +++++++++++++++-
> 4 files changed, 44 insertions(+), 1 deletion(-)
>
> diff --git a/hw/s390x/css.c b/hw/s390x/css.c
> index 1fcbc84..7b82176 100644
> --- a/hw/s390x/css.c
> +++ b/hw/s390x/css.c
> @@ -521,6 +521,32 @@ void css_conditional_io_interrupt(SubchDev *sch)
> }
> }
>
> +int css_do_sic(CPUS390XState *env, uint8_t isc, uint16_t mode)
> +{
> + S390FLICState *fs = s390_get_flic();
> + S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
> + int r;
> +
> + if (env->psw.mask & PSW_MASK_PSTATE) {
> + r = -PGM_PRIVILEGED;
> + goto out;
Why not simply:
return -PGM_PRIVILEGED;
?
Same for the other goto below ... and then you also do not need the "r"
variable anymore.
> + }
> +
> + trace_css_do_sic(mode, isc);
> + switch (mode) {
> + case SIC_IRQ_MODE_ALL:
> + case SIC_IRQ_MODE_SINGLE:
> + break;
> + default:
> + r = -PGM_OPERAND;
> + goto out;
> + }
> +
> + r = fsc->modify_ais_mode(fs, isc, mode) ? -PGM_OPERATION : 0;
> +out:
> + return r;
> +}
> +
> void css_adapter_interrupt(uint8_t isc)
> {
> uint32_t io_int_word = (isc << 27) | IO_INT_WORD_AI;
> diff --git a/hw/s390x/trace-events b/hw/s390x/trace-events
> index 84ea964..f07e974 100644
> --- a/hw/s390x/trace-events
> +++ b/hw/s390x/trace-events
> @@ -8,6 +8,7 @@ css_new_image(uint8_t cssid, const char *default_cssid) "CSS:
> add css image %02x
> css_assign_subch(const char *do_assign, uint8_t cssid, uint8_t ssid,
> uint16_t schid, uint16_t devno) "CSS: %s %x.%x.%04x (devno %04x)"
> css_io_interrupt(int cssid, int ssid, int schid, uint32_t intparm, uint8_t
> isc, const char *conditional) "CSS: I/O interrupt on sch %x.%x.%04x (intparm
> %08x, isc %x) %s"
> css_adapter_interrupt(uint8_t isc) "CSS: adapter I/O interrupt (isc %x)"
> +css_do_sic(uint16_t mode, uint8_t isc) "CSS: set interruption mode %x on isc
> %x"
>
> # hw/s390x/virtio-ccw.c
> virtio_ccw_interpret_ccw(int cssid, int ssid, int schid, int cmd_code)
> "VIRTIO-CCW: %x.%x.%04x: interpret command %x"
> diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
> index e028960..5ee6d52 100644
> --- a/include/hw/s390x/css.h
> +++ b/include/hw/s390x/css.h
> @@ -12,6 +12,7 @@
> #ifndef CSS_H
> #define CSS_H
>
> +#include "cpu.h"
Not sure, but it's a little bit strange that the channel sub-system now
depends on the CPU ... maybe the check for problem state should rather
be done in kvm.c instead?
Or should css_do_sic() rather reside in s390-pci-inst.c or in ioinst.c
instead?
> #include "hw/s390x/adapter.h"
> #include "hw/s390x/s390_flic.h"
> #include "hw/s390x/ioinst.h"
> @@ -165,6 +166,7 @@ typedef enum {
> CSS_IO_ADAPTER_TYPE_NUMS,
> } CssIoAdapterType;
>
> +int css_do_sic(CPUS390XState *env, uint8_t isc, uint16_t mode);
> uint32_t css_get_adapter_id(CssIoAdapterType type, uint8_t isc);
> void css_register_io_adapters(CssIoAdapterType type, bool swap, bool
> maskable,
> uint8_t flags, Error **errp);
> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
> index 7a2a7c0..78ebe83 100644
> --- a/target/s390x/kvm.c
> +++ b/target/s390x/kvm.c
> @@ -1206,7 +1206,21 @@ static int kvm_stpcifc_service_call(S390CPU *cpu,
> struct kvm_run *run)
>
> static int kvm_sic_service_call(S390CPU *cpu, struct kvm_run *run)
> {
> - /* NOOP */
> + CPUS390XState *env = &cpu->env;
> + uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
> + uint8_t r3 = run->s390_sieic.ipa & 0x000f;
> + uint8_t isc;
> + uint16_t mode;
> + int r;
> +
> + cpu_synchronize_state(CPU(cpu));
> + mode = env->regs[r1] & 0xffff;
> + isc = (env->regs[r3] >> 27) & 0x7;
> + r = css_do_sic(env, isc, mode);
> + if (r) {
> + enter_pgmcheck(cpu, -r);
> + }
> +
> return 0;
> }
Thomas
- [Qemu-devel] [PATCH 00/11] pending s390 patches part 1, Christian Borntraeger, 2017/07/12
- [Qemu-devel] [PATCH 01/11] s390x/kvm: Rework cmma management, Christian Borntraeger, 2017/07/12
- [Qemu-devel] [PATCH 10/11] s390x/sic: realize SIC handling, Christian Borntraeger, 2017/07/12
- Re: [Qemu-devel] [PATCH 10/11] s390x/sic: realize SIC handling,
Thomas Huth <=
- [Qemu-devel] [PATCH 07/11] s390x: add flags field for registering I/O adapter, Christian Borntraeger, 2017/07/12
- [Qemu-devel] [PATCH 02/11] linux-headers: update to 4.13-rc0, Christian Borntraeger, 2017/07/12
- [Qemu-devel] [PATCH 09/11] s390x/flic: introduce inject_airq callback, Christian Borntraeger, 2017/07/12
- [Qemu-devel] [PATCH 06/11] s390x/cpumodel: provide compat handling for new cpu features, Christian Borntraeger, 2017/07/12
- [Qemu-devel] [PATCH 08/11] s390x/flic: introduce modify_ais_mode callback, Christian Borntraeger, 2017/07/12