On 1/27/20 6:36 AM, Thomas Huth wrote: > On 24/01/2020 23.14, Collin Walling wrote: >> DIAGNOSE 0x318 (diag318) is a privileged s390x instruction that must >> be intercepted by SIE and handled via KVM. Let's introduce some >> functions to communicate between QEMU and KVM via ioctls. These >> will be used to get/set the diag318 information. >> >> The availability of this instruction is determined by byte 134, bit 0 >> of the Read Info block. This coincidentally expands into the space used >> for CPU entries by taking away one byte, which means VMs running with >> the diag318 capability will not be able to retrieve information regarding >> the 248th CPU. This will not effect performance, and VMs can still be > > s/effect/affect/ ? > >> ran with 248 CPUs. > > s/ran/run/ ? > >> In order to simplify the migration and system reset requirements of >> the diag318 data, let's introduce it as a device class and include >> a VMStateDescription. >> >> Diag318 is set to 0 during modified clear and load normal resets. >> >> Signed-off-by: Collin Walling <wall...@linux.ibm.com> >> --- >> hw/s390x/Makefile.objs | 1 + >> hw/s390x/diag318.c | 85 >> +++++++++++++++++++++++++++++++++++++ >> hw/s390x/diag318.h | 40 +++++++++++++++++ >> hw/s390x/s390-virtio-ccw.c | 17 ++++++++ >> hw/s390x/sclp.c | 13 ++++++ >> include/hw/s390x/sclp.h | 2 + >> target/s390x/cpu_features.h | 1 + >> target/s390x/cpu_features_def.inc.h | 3 ++ >> target/s390x/gen-features.c | 1 + >> target/s390x/kvm-stub.c | 10 +++++ >> target/s390x/kvm.c | 29 +++++++++++++ >> target/s390x/kvm_s390x.h | 2 + >> 12 files changed, 204 insertions(+) >> create mode 100644 hw/s390x/diag318.c >> create mode 100644 hw/s390x/diag318.h >> >> diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs >> index e02ed80..93621dc 100644 >> --- a/hw/s390x/Makefile.objs >> +++ b/hw/s390x/Makefile.objs >> @@ -34,3 +34,4 @@ obj-$(CONFIG_KVM) += s390-stattrib-kvm.o >> obj-y += s390-ccw.o >> obj-y += ap-device.o >> obj-y += ap-bridge.o >> +obj-y += diag318.o >> diff --git a/hw/s390x/diag318.c b/hw/s390x/diag318.c >> new file mode 100644 >> index 0000000..2d30bb2 >> --- /dev/null >> +++ b/hw/s390x/diag318.c >> @@ -0,0 +1,85 @@ >> +/* >> + * DIAGNOSE 0x318 functions for reset and migration >> + * >> + * Copyright IBM, Corp. 2019 > > Bump to 2020 ? > >> + * Authors: >> + * Collin Walling <wall...@linux.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. >> + */ >> + >> +#include "hw/s390x/diag318.h" >> +#include "qapi/error.h" >> +#include "kvm_s390x.h" >> +#include "sysemu/kvm.h" >> + >> +static int diag318_post_load(void *opaque, int version_id) >> +{ >> + DIAG318State *d = opaque; >> + >> + if (kvm_enabled()) >> + kvm_s390_set_diag318_info(d->info); > > QEMU coding style requires curly braces also for single lines. > >> + return 0; >> +} >> + >> +static int diag318_pre_save(void *opaque) >> +{ >> + DIAG318State *d = opaque; >> + >> + if (kvm_enabled()) >> + kvm_s390_get_diag318_info(&d->info); > > dito > >> + return 0; >> +} >> + >> +static bool diag318_needed(void *opaque) >> +{ >> + return kvm_enabled() ? s390_has_feat(S390_FEAT_DIAG318) : 0; >> +} >> + >> +const VMStateDescription vmstate_diag318 = { >> + .name = "vmstate_diag318", >> + .post_load = diag318_post_load, >> + .pre_save = diag318_pre_save, >> + .version_id = 1, >> + .minimum_version_id = 1, >> + .needed = diag318_needed, >> + .fields = (VMStateField[]) { >> + VMSTATE_UINT64(info, DIAG318State), >> + VMSTATE_END_OF_LIST() >> + } >> +}; >> + >> +static void s390_diag318_reset(DeviceState *dev) >> +{ >> + if (kvm_enabled()) >> + kvm_s390_set_diag318_info(0); > > dito > >> +} >> + >> +static void s390_diag318_class_init(ObjectClass *klass, void *data) >> +{ >> + DeviceClass *dc = DEVICE_CLASS(klass); >> + >> + dc->reset = s390_diag318_reset; >> + dc->vmsd = &vmstate_diag318; >> + dc->hotpluggable = false; >> + /* Reason: Created automatically during machine instantiation */ >> + dc->user_creatable = false; >> +} >> + >> +static const TypeInfo s390_diag318_info = { >> + .class_init = s390_diag318_class_init, >> + .parent = TYPE_DEVICE, >> + .name = TYPE_S390_DIAG318, >> + .instance_size = sizeof(DIAG318State), >> +}; >> + >> +static void s390_diag318_register_types(void) >> +{ >> + type_register_static(&s390_diag318_info); >> +} >> + >> +type_init(s390_diag318_register_types) >> diff --git a/hw/s390x/diag318.h b/hw/s390x/diag318.h >> new file mode 100644 >> index 0000000..06d9f67 >> --- /dev/null >> +++ b/hw/s390x/diag318.h >> @@ -0,0 +1,40 @@ >> +/* >> + * DIAGNOSE 0x318 functions for reset and migration >> + * >> + * Copyright IBM, Corp. 2019 > > 2020 ? > >> + * Authors: >> + * Collin Walling <wall...@linux.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_DIAG318_H >> +#define HW_DIAG318_H >> + >> +#include "qemu/osdep.h" >> +#include "migration/vmstate.h" >> +#include "qom/object.h" >> +#include "hw/qdev-core.h" >> + >> +#define TYPE_S390_DIAG318 "diag318" >> +#define DIAG318(obj) \ >> + OBJECT_CHECK(DIAG318State, (obj), TYPE_S390_DIAG318) >> + >> +typedef struct DIAG318State { >> + /*< private >*/ >> + DeviceState parent_obj; >> + >> + /*< public >*/ >> + uint64_t info; >> +} DIAG318State; >> + >> +typedef struct DIAG318Class { >> + /*< private >*/ >> + DeviceClass parent_class; >> + >> + /*< public >*/ >> +} DIAG318Class; > > You don't use DIAG318Class anywhere. Please drop it. > >> +#endif /* HW_DIAG318_H */ >> \ No newline at end of file >> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c >> index e0e2813..d5b7a33 100644 >> --- a/hw/s390x/s390-virtio-ccw.c >> +++ b/hw/s390x/s390-virtio-ccw.c >> @@ -41,6 +41,7 @@ >> #include "hw/qdev-properties.h" >> #include "hw/s390x/tod.h" >> #include "sysemu/sysemu.h" >> +#include "hw/s390x/diag318.h" >> >> S390CPU *s390_cpu_addr2state(uint16_t cpu_addr) >> { >> @@ -97,6 +98,7 @@ static const char *const reset_dev_types[] = { >> "s390-sclp-event-facility", >> "s390-flic", >> "diag288", >> + TYPE_S390_DIAG318, >> }; >> >> static void subsystem_reset(void) >> @@ -237,6 +239,17 @@ static void s390_create_sclpconsole(const char *type, >> Chardev *chardev) >> qdev_init_nofail(dev); >> } >> >> +static void s390_init_diag318(void) >> +{ >> + Object *new = object_new(TYPE_S390_DIAG318); > > For the very unlikely case that we ever switch QEMU to C++ ... could you > maybe use a different variable name than "new" ? Simply "obj" maybe? > >> + DeviceState *dev = DEVICE(new); >> + >> + object_property_add_child(qdev_get_machine(), TYPE_S390_DIAG318, >> + new, NULL); >> + object_unref(new); >> + qdev_init_nofail(dev); >> +} >> + > > Thomas >
Noted your comments. Thanks for the review! I'll remember to run checkpatch next time ;) -- Respectfully, - Collin Walling