1*28e942f8SCornelia Huck /* 2*28e942f8SCornelia Huck * Support for virtio hypercalls on s390 3*28e942f8SCornelia Huck * 4*28e942f8SCornelia Huck * Copyright 2012 IBM Corp. 5*28e942f8SCornelia Huck * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com> 6*28e942f8SCornelia Huck * 7*28e942f8SCornelia Huck * This work is licensed under the terms of the GNU GPL, version 2 or (at 8*28e942f8SCornelia Huck * your option) any later version. See the COPYING file in the top-level 9*28e942f8SCornelia Huck * directory. 10*28e942f8SCornelia Huck */ 11*28e942f8SCornelia Huck 12*28e942f8SCornelia Huck #include "cpu.h" 13*28e942f8SCornelia Huck #include "hw/s390-virtio.h" 14*28e942f8SCornelia Huck 15*28e942f8SCornelia Huck #define MAX_DIAG_SUBCODES 255 16*28e942f8SCornelia Huck 17*28e942f8SCornelia Huck static s390_virtio_fn s390_diag500_table[MAX_DIAG_SUBCODES]; 18*28e942f8SCornelia Huck 19*28e942f8SCornelia Huck void s390_register_virtio_hypercall(uint64_t code, s390_virtio_fn fn) 20*28e942f8SCornelia Huck { 21*28e942f8SCornelia Huck assert(code < MAX_DIAG_SUBCODES); 22*28e942f8SCornelia Huck assert(!s390_diag500_table[code]); 23*28e942f8SCornelia Huck 24*28e942f8SCornelia Huck s390_diag500_table[code] = fn; 25*28e942f8SCornelia Huck } 26*28e942f8SCornelia Huck 27*28e942f8SCornelia Huck int s390_virtio_hypercall(CPUS390XState *env) 28*28e942f8SCornelia Huck { 29*28e942f8SCornelia Huck s390_virtio_fn fn = s390_diag500_table[env->regs[1]]; 30*28e942f8SCornelia Huck 31*28e942f8SCornelia Huck if (!fn) { 32*28e942f8SCornelia Huck return -EINVAL; 33*28e942f8SCornelia Huck } 34*28e942f8SCornelia Huck 35*28e942f8SCornelia Huck return fn(&env->regs[2]); 36*28e942f8SCornelia Huck } 37