128e942f8SCornelia Huck /* 228e942f8SCornelia Huck * Support for virtio hypercalls on s390 328e942f8SCornelia Huck * 428e942f8SCornelia Huck * Copyright 2012 IBM Corp. 528e942f8SCornelia Huck * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com> 628e942f8SCornelia Huck * 728e942f8SCornelia Huck * This work is licensed under the terms of the GNU GPL, version 2 or (at 828e942f8SCornelia Huck * your option) any later version. See the COPYING file in the top-level 928e942f8SCornelia Huck * directory. 1028e942f8SCornelia Huck */ 1128e942f8SCornelia Huck 129615495aSPeter Maydell #include "qemu/osdep.h" 1328e942f8SCornelia Huck #include "cpu.h" 14*7d577546SDavid Hildenbrand #include "hw/s390x/s390-virtio-hcall.h" 1528e942f8SCornelia Huck 1628e942f8SCornelia Huck #define MAX_DIAG_SUBCODES 255 1728e942f8SCornelia Huck 1828e942f8SCornelia Huck static s390_virtio_fn s390_diag500_table[MAX_DIAG_SUBCODES]; 1928e942f8SCornelia Huck 2028e942f8SCornelia Huck void s390_register_virtio_hypercall(uint64_t code, s390_virtio_fn fn) 2128e942f8SCornelia Huck { 2228e942f8SCornelia Huck assert(code < MAX_DIAG_SUBCODES); 2328e942f8SCornelia Huck assert(!s390_diag500_table[code]); 2428e942f8SCornelia Huck 2528e942f8SCornelia Huck s390_diag500_table[code] = fn; 2628e942f8SCornelia Huck } 2728e942f8SCornelia Huck 2828e942f8SCornelia Huck int s390_virtio_hypercall(CPUS390XState *env) 2928e942f8SCornelia Huck { 30f2c55d17SThomas Huth s390_virtio_fn fn; 3128e942f8SCornelia Huck 32f2c55d17SThomas Huth if (env->regs[1] < MAX_DIAG_SUBCODES) { 33f2c55d17SThomas Huth fn = s390_diag500_table[env->regs[1]]; 34f2c55d17SThomas Huth if (fn) { 3577319f22SThomas Huth env->regs[2] = fn(&env->regs[2]); 3677319f22SThomas Huth return 0; 37f2c55d17SThomas Huth } 3828e942f8SCornelia Huck } 3928e942f8SCornelia Huck 40f2c55d17SThomas Huth return -EINVAL; 4128e942f8SCornelia Huck } 42