10efe406cSJason J. Herne /* 20efe406cSJason J. Herne * s390 storage key device 30efe406cSJason J. Herne * 40efe406cSJason J. Herne * Copyright 2015 IBM Corp. 50efe406cSJason J. Herne * Author(s): Jason J. Herne <jjherne@linux.vnet.ibm.com> 60efe406cSJason J. Herne * 70efe406cSJason J. Herne * This work is licensed under the terms of the GNU GPL, version 2 or (at 80efe406cSJason J. Herne * your option) any later version. See the COPYING file in the top-level 90efe406cSJason J. Herne * directory. 100efe406cSJason J. Herne */ 110efe406cSJason J. Herne 129615495aSPeter Maydell #include "qemu/osdep.h" 130efe406cSJason J. Herne #include "hw/s390x/storage-keys.h" 140efe406cSJason J. Herne #include "sysemu/kvm.h" 150efe406cSJason J. Herne #include "qemu/error-report.h" 16*0b8fa32fSMarkus Armbruster #include "qemu/module.h" 170efe406cSJason J. Herne 180efe406cSJason J. Herne static int kvm_s390_skeys_enabled(S390SKeysState *ss) 190efe406cSJason J. Herne { 200efe406cSJason J. Herne S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss); 210efe406cSJason J. Herne uint8_t single_key; 220efe406cSJason J. Herne int r; 230efe406cSJason J. Herne 240efe406cSJason J. Herne r = skeyclass->get_skeys(ss, 0, 1, &single_key); 250efe406cSJason J. Herne if (r != 0 && r != KVM_S390_GET_SKEYS_NONE) { 269af9e0feSMarkus Armbruster error_report("S390_GET_KEYS error %d", r); 270efe406cSJason J. Herne } 280efe406cSJason J. Herne return (r == 0); 290efe406cSJason J. Herne } 300efe406cSJason J. Herne 310efe406cSJason J. Herne static int kvm_s390_skeys_get(S390SKeysState *ss, uint64_t start_gfn, 320efe406cSJason J. Herne uint64_t count, uint8_t *keys) 330efe406cSJason J. Herne { 340efe406cSJason J. Herne struct kvm_s390_skeys args = { 350efe406cSJason J. Herne .start_gfn = start_gfn, 360efe406cSJason J. Herne .count = count, 370efe406cSJason J. Herne .skeydata_addr = (__u64)keys 380efe406cSJason J. Herne }; 390efe406cSJason J. Herne 400efe406cSJason J. Herne return kvm_vm_ioctl(kvm_state, KVM_S390_GET_SKEYS, &args); 410efe406cSJason J. Herne } 420efe406cSJason J. Herne 430efe406cSJason J. Herne static int kvm_s390_skeys_set(S390SKeysState *ss, uint64_t start_gfn, 440efe406cSJason J. Herne uint64_t count, uint8_t *keys) 450efe406cSJason J. Herne { 460efe406cSJason J. Herne struct kvm_s390_skeys args = { 470efe406cSJason J. Herne .start_gfn = start_gfn, 480efe406cSJason J. Herne .count = count, 490efe406cSJason J. Herne .skeydata_addr = (__u64)keys 500efe406cSJason J. Herne }; 510efe406cSJason J. Herne 520efe406cSJason J. Herne return kvm_vm_ioctl(kvm_state, KVM_S390_SET_SKEYS, &args); 530efe406cSJason J. Herne } 540efe406cSJason J. Herne 550efe406cSJason J. Herne static void kvm_s390_skeys_class_init(ObjectClass *oc, void *data) 560efe406cSJason J. Herne { 570efe406cSJason J. Herne S390SKeysClass *skeyclass = S390_SKEYS_CLASS(oc); 58574ee06dSThomas Huth DeviceClass *dc = DEVICE_CLASS(oc); 590efe406cSJason J. Herne 600efe406cSJason J. Herne skeyclass->skeys_enabled = kvm_s390_skeys_enabled; 610efe406cSJason J. Herne skeyclass->get_skeys = kvm_s390_skeys_get; 620efe406cSJason J. Herne skeyclass->set_skeys = kvm_s390_skeys_set; 63574ee06dSThomas Huth 64574ee06dSThomas Huth /* Reason: Internal device (only one skeys device for the whole memory) */ 65574ee06dSThomas Huth dc->user_creatable = false; 660efe406cSJason J. Herne } 670efe406cSJason J. Herne 680efe406cSJason J. Herne static const TypeInfo kvm_s390_skeys_info = { 690efe406cSJason J. Herne .name = TYPE_KVM_S390_SKEYS, 700efe406cSJason J. Herne .parent = TYPE_S390_SKEYS, 710efe406cSJason J. Herne .instance_size = sizeof(S390SKeysState), 720efe406cSJason J. Herne .class_init = kvm_s390_skeys_class_init, 730efe406cSJason J. Herne .class_size = sizeof(S390SKeysClass), 740efe406cSJason J. Herne }; 750efe406cSJason J. Herne 760efe406cSJason J. Herne static void kvm_s390_skeys_register_types(void) 770efe406cSJason J. Herne { 780efe406cSJason J. Herne type_register_static(&kvm_s390_skeys_info); 790efe406cSJason J. Herne } 800efe406cSJason J. Herne 810efe406cSJason J. Herne type_init(kvm_s390_skeys_register_types) 82