All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Christian Borntraeger <borntraeger@de.ibm.com>,
	Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-devel <qemu-devel@nongnu.org>,
	Fan Zhang <zhangfan@linux.vnet.ibm.com>,
	Alexander Graf <agraf@suse.de>,
	Jens Freimann <jfrei@linux.vnet.ibm.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PULL 02/29] s390x/ipl: support diagnose 308 subcodes 5 and 6
Date: Thu, 19 Mar 2015 10:31:34 +0100	[thread overview]
Message-ID: <550A9776.5050509@redhat.com> (raw)
In-Reply-To: <1424290943-22480-3-git-send-email-borntraeger@de.ibm.com>



On 18/02/2015 21:21, Christian Borntraeger wrote:
> From: Fan Zhang <zhangfan@linux.vnet.ibm.com>
> 
> To support dynamically updating the IPL device from inside the KVM
> guest on the s390 platform, DIAG 308 instruction is intercepted
> in QEMU to handle the request.
> 
> Subcode 5 allows to specify a new boot device, which is saved for
> later in the s390_ipl device. This also allows to switch from an
> external kernel to a boot device.
> 
> Subcode 6 retrieves boot device configuration that has been previously
> set.
> 
> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
> Signed-off-by: Fan Zhang <zhangfan@linux.vnet.ibm.com>
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> ---
>  hw/s390x/ipl.c             | 87 ++++++++++++++++++++++++++++++++++++++--------
>  hw/s390x/ipl.h             | 24 +++++++++++++
>  hw/s390x/s390-virtio.c     |  2 ++
>  target-s390x/misc_helper.c | 33 ++++++++++++++++--
>  4 files changed, 129 insertions(+), 17 deletions(-)
>  create mode 100644 hw/s390x/ipl.h
> 
> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
> index 4014a6a..231713d 100644
> --- a/hw/s390x/ipl.c
> +++ b/hw/s390x/ipl.c
> @@ -18,6 +18,7 @@
>  #include "hw/sysbus.h"
>  #include "hw/s390x/virtio-ccw.h"
>  #include "hw/s390x/css.h"
> +#include "ipl.h"
>  
>  #define KERN_IMAGE_START                0x010000UL
>  #define KERN_PARM_AREA                  0x010480UL
> @@ -52,12 +53,17 @@ typedef struct S390IPLState {
>      uint64_t start_addr;
>      uint64_t bios_start_addr;
>      bool enforce_bios;
> +    IplParameterBlock iplb;
> +    bool iplb_valid;
>  
>      /*< public >*/
>      char *kernel;
>      char *initrd;
>      char *cmdline;
>      char *firmware;
> +    uint8_t cssid;
> +    uint8_t ssid;
> +    uint16_t devno;
>  } S390IPLState;
>  
>  
> @@ -164,6 +170,69 @@ static Property s390_ipl_properties[] = {
>      DEFINE_PROP_END_OF_LIST(),
>  };
>  
> +/*
> + * In addition to updating the iplstate, this function returns:
> + * - 0 if system was ipled with external kernel
> + * - -1 if no valid boot device was found
> + * - ccw id of the boot device otherwise
> + */
> +static uint64_t s390_update_iplstate(CPUS390XState *env, S390IPLState *ipl)

This should probably return uint32_t, because otherwise...

> +    return ipl->cssid << 24 | ipl->ssid << 16 | ipl->devno;

... a cssid above 127 results in the bits of the high word all set to 1.

The reason is that, even though ipl->cssid is a uint8_t, before the
shift it is extended to int.  Then the return statement does a sign
extension from int to uint64_t.

Paolo

> +}
> +
> +int s390_ipl_update_diag308(IplParameterBlock *iplb)
> +{
> +    S390IPLState *ipl;
> +
> +    ipl = S390_IPL(object_resolve_path(TYPE_S390_IPL, NULL));
> +    if (ipl) {
> +        ipl->iplb = *iplb;
> +        ipl->iplb_valid = true;
> +        return 0;
> +    }
> +    return -1;
> +}
> +
> +IplParameterBlock *s390_ipl_get_iplb(void)
> +{
> +    S390IPLState *ipl;
> +
> +    ipl = S390_IPL(object_resolve_path(TYPE_S390_IPL, NULL));
> +    if (!ipl || !ipl->iplb_valid) {
> +        return NULL;
> +    }
> +    return &ipl->iplb;
> +}
> +
>  static void s390_ipl_reset(DeviceState *dev)
>  {
>      S390IPLState *ipl = S390_IPL(dev);
> @@ -173,21 +242,9 @@ static void s390_ipl_reset(DeviceState *dev)
>      env->psw.addr = ipl->start_addr;
>      env->psw.mask = IPL_PSW_MASK;
>  
> -    if (!ipl->kernel) {
> -        /* Tell firmware, if there is a preferred boot device */
> -        env->regs[7] = -1;
> -        DeviceState *dev_st = get_boot_device(0);
> -        if (dev_st) {
> -            VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast(
> -                OBJECT(qdev_get_parent_bus(dev_st)->parent),
> -                TYPE_VIRTIO_CCW_DEVICE);
> -
> -            if (ccw_dev) {
> -                env->regs[7] = ccw_dev->sch->cssid << 24 |
> -                               ccw_dev->sch->ssid << 16 |
> -                               ccw_dev->sch->devno;
> -            }
> -        }
> +    if (!ipl->kernel || ipl->iplb_valid) {
> +        env->psw.addr = ipl->bios_start_addr;
> +        env->regs[7] = s390_update_iplstate(env, ipl);
>      }
>  
>      s390_cpu_set_state(CPU_STATE_OPERATING, cpu);
> diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h
> new file mode 100644
> index 0000000..f1d082f
> --- /dev/null
> +++ b/hw/s390x/ipl.h
> @@ -0,0 +1,24 @@
> +/*
> + * s390 IPL device
> + *
> + * Copyright 2015 IBM Corp.
> + * Author(s): Zhang Fan <bjfanzh@cn.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or (at
> + * your option) any later version. See the COPYING file in the top-level
> + * directory.
> + */
> +
> +#ifndef HW_S390_IPL_H
> +#define HW_S390_IPL_H
> +
> +typedef struct IplParameterBlock {
> +      uint8_t  reserved1[110];
> +      uint16_t devno;
> +      uint8_t  reserved2[88];
> +} IplParameterBlock;
> +
> +int s390_ipl_update_diag308(IplParameterBlock *iplb);
> +IplParameterBlock *s390_ipl_get_iplb(void);
> +
> +#endif
> diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
> index 13f9e49..412e49b 100644
> --- a/hw/s390x/s390-virtio.c
> +++ b/hw/s390x/s390-virtio.c
> @@ -143,6 +143,8 @@ void s390_init_ipl_dev(const char *kernel_filename,
>      qdev_prop_set_string(dev, "cmdline", kernel_cmdline);
>      qdev_prop_set_string(dev, "firmware", firmware);
>      qdev_prop_set_bit(dev, "enforce_bios", enforce_bios);
> +    object_property_add_child(qdev_get_machine(), "s390-ipl",
> +                              OBJECT(dev), NULL);
>      qdev_init_nofail(dev);
>  }
>  
> diff --git a/target-s390x/misc_helper.c b/target-s390x/misc_helper.c
> index ef9758a..1c3df8e 100644
> --- a/target-s390x/misc_helper.c
> +++ b/target-s390x/misc_helper.c
> @@ -25,6 +25,7 @@
>  #include <string.h>
>  #include "sysemu/kvm.h"
>  #include "qemu/timer.h"
> +#include "exec/address-spaces.h"
>  #ifdef CONFIG_KVM
>  #include <linux/kvm.h>
>  #endif
> @@ -34,6 +35,7 @@
>  #include "sysemu/cpus.h"
>  #include "sysemu/sysemu.h"
>  #include "hw/s390x/ebcdic.h"
> +#include "hw/s390x/ipl.h"
>  #endif
>  
>  /* #define DEBUG_HELPER */
> @@ -151,12 +153,15 @@ static int load_normal_reset(S390CPU *cpu)
>      return 0;
>  }
>  
> +#define DIAG_308_RC_OK              0x0001
>  #define DIAG_308_RC_NO_CONF         0x0102
>  #define DIAG_308_RC_INVALID         0x0402
> +
>  void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3)
>  {
>      uint64_t addr =  env->regs[r1];
>      uint64_t subcode = env->regs[r3];
> +    IplParameterBlock *iplb;
>  
>      if (env->psw.mask & PSW_MASK_PSTATE) {
>          program_interrupt(env, PGM_PRIVILEGED, ILEN_LATER_INC);
> @@ -180,14 +185,38 @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3)
>              program_interrupt(env, PGM_SPECIFICATION, ILEN_LATER_INC);
>              return;
>          }
> -        env->regs[r1+1] = DIAG_308_RC_INVALID;
> +        if (!address_space_access_valid(&address_space_memory, addr,
> +                                        sizeof(IplParameterBlock), false)) {
> +            program_interrupt(env, PGM_ADDRESSING, ILEN_LATER_INC);
> +            return;
> +        }
> +        iplb = g_malloc0(sizeof(struct IplParameterBlock));
> +        cpu_physical_memory_read(addr, iplb, sizeof(struct IplParameterBlock));
> +        if (!s390_ipl_update_diag308(iplb)) {
> +            env->regs[r1 + 1] = DIAG_308_RC_OK;
> +        } else {
> +            env->regs[r1 + 1] = DIAG_308_RC_INVALID;
> +        }
> +        g_free(iplb);
>          return;
>      case 6:
>          if ((r1 & 1) || (addr & 0x0fffULL)) {
>              program_interrupt(env, PGM_SPECIFICATION, ILEN_LATER_INC);
>              return;
>          }
> -        env->regs[r1+1] = DIAG_308_RC_NO_CONF;
> +        if (!address_space_access_valid(&address_space_memory, addr,
> +                                        sizeof(IplParameterBlock), true)) {
> +            program_interrupt(env, PGM_ADDRESSING, ILEN_LATER_INC);
> +            return;
> +        }
> +        iplb = s390_ipl_get_iplb();
> +        if (iplb) {
> +            cpu_physical_memory_write(addr, iplb,
> +                                      sizeof(struct IplParameterBlock));
> +            env->regs[r1 + 1] = DIAG_308_RC_OK;
> +        } else {
> +            env->regs[r1 + 1] = DIAG_308_RC_NO_CONF;
> +        }
>          return;
>      default:
>          hw_error("Unhandled diag308 subcode %" PRIx64, subcode);
> 

  reply	other threads:[~2015-03-19  9:31 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-18 20:21 [Qemu-devel] [PULL 00/29] s390x guest reipl and page table handling Christian Borntraeger
2015-02-18 20:21 ` [Qemu-devel] [PULL 01/29] s390x/ipl: always load the bios for ccw machine Christian Borntraeger
2015-02-18 20:21 ` [Qemu-devel] [PULL 02/29] s390x/ipl: support diagnose 308 subcodes 5 and 6 Christian Borntraeger
2015-03-19  9:31   ` Paolo Bonzini [this message]
2015-03-20  8:25     ` Christian Borntraeger
2015-02-18 20:21 ` [Qemu-devel] [PULL 03/29] s390x/ipl: drop reipl parameters on resets Christian Borntraeger
2015-02-18 20:21 ` [Qemu-devel] [PULL 04/29] s390x/ipl: make s390x ipl device aware of migration Christian Borntraeger
2015-02-18 20:21 ` [Qemu-devel] [PULL 05/29] s390x/mmu: Move mmu_translate() and friends to separate file Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 06/29] s390x/mmu: Fix the check for the real-space designation bit Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 07/29] s390x/mmu: Fix the handling of the table levels Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 08/29] s390x/mmu: Check table length and offset fields Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 09/29] s390x/mmu: Skip exceptions properly when translating addresses for debug Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 10/29] s390x/mmu: Fix translation exception code in lowcore Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 11/29] s390x/mmu: Fix exception types when checking the ASCEs Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 12/29] s390x/mmu: Fix the exception codes for illegal table entries Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 13/29] s390x/mmu: Add support for read-only regions Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 14/29] s390x/mmu: Renaming related to the ASCE confusion Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 15/29] s390x/mmu: Check bit 52 in page table entry Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 16/29] s390x/mmu: Clean up mmu_translate_asc() Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 17/29] s390x/kvm: Add function for injecting pgm access exceptions Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 18/29] s390x/mmu: Add function for accessing guest memory Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 19/29] s390x/css: Make schib parameter of css_do_msch const Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 20/29] s390x/ioinst: Rework memory access in MSCH instruction Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 21/29] s390x/ioinst: Rework memory access in SSCH instruction Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 22/29] s390x/ioinst: Rework memory access in STSCH instruction Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 23/29] s390x/ioinst: Set condition code in ioinst_handle_tsch() handler Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 24/29] s390x/ioinst: Rework memory access in TSCH instruction Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 25/29] s390x/ioinst: Rework memory access in STCRW instruction Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 26/29] s390x/ioinst: Rework memory access in CHSC instruction Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 27/29] s390x/ioinst: Rework memory access in TPI instruction Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 28/29] s390x/pci: Rework memory access in zpci instruction Christian Borntraeger
2015-02-18 20:22 ` [Qemu-devel] [PULL 29/29] s390x/helper: Remove s390_cpu_physical_memory_map Christian Borntraeger
2015-02-26 10:28 ` [Qemu-devel] [PULL 00/29] s390x guest reipl and page table handling Peter Maydell

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=550A9776.5050509@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=agraf@suse.de \
    --cc=borntraeger@de.ibm.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=jfrei@linux.vnet.ibm.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=zhangfan@linux.vnet.ibm.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.