18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * definition for paravirtual devices on s390 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright IBM Corp. 2008 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Author(s): Christian Borntraeger <borntraeger@de.ibm.com> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci/* 108c2ecf20Sopenharmony_ci * Hypercalls for KVM on s390. The calling convention is similar to the 118c2ecf20Sopenharmony_ci * s390 ABI, so we use R2-R6 for parameters 1-5. In addition we use R1 128c2ecf20Sopenharmony_ci * as hypercall number and R7 as parameter 6. The return value is 138c2ecf20Sopenharmony_ci * written to R2. We use the diagnose instruction as hypercall. To avoid 148c2ecf20Sopenharmony_ci * conflicts with existing diagnoses for LPAR and z/VM, we do not use 158c2ecf20Sopenharmony_ci * the instruction encoded number, but specify the number in R1 and 168c2ecf20Sopenharmony_ci * use 0x500 as KVM hypercall 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * Copyright IBM Corp. 2007,2008 198c2ecf20Sopenharmony_ci * Author(s): Christian Borntraeger <borntraeger@de.ibm.com> 208c2ecf20Sopenharmony_ci */ 218c2ecf20Sopenharmony_ci#ifndef __S390_KVM_PARA_H 228c2ecf20Sopenharmony_ci#define __S390_KVM_PARA_H 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#include <uapi/asm/kvm_para.h> 258c2ecf20Sopenharmony_ci#include <asm/diag.h> 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistatic inline long __kvm_hypercall0(unsigned long nr) 288c2ecf20Sopenharmony_ci{ 298c2ecf20Sopenharmony_ci register unsigned long __nr asm("1") = nr; 308c2ecf20Sopenharmony_ci register long __rc asm("2"); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci asm volatile ("diag 2,4,0x500\n" 338c2ecf20Sopenharmony_ci : "=d" (__rc) : "d" (__nr): "memory", "cc"); 348c2ecf20Sopenharmony_ci return __rc; 358c2ecf20Sopenharmony_ci} 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic inline long kvm_hypercall0(unsigned long nr) 388c2ecf20Sopenharmony_ci{ 398c2ecf20Sopenharmony_ci diag_stat_inc(DIAG_STAT_X500); 408c2ecf20Sopenharmony_ci return __kvm_hypercall0(nr); 418c2ecf20Sopenharmony_ci} 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_cistatic inline long __kvm_hypercall1(unsigned long nr, unsigned long p1) 448c2ecf20Sopenharmony_ci{ 458c2ecf20Sopenharmony_ci register unsigned long __nr asm("1") = nr; 468c2ecf20Sopenharmony_ci register unsigned long __p1 asm("2") = p1; 478c2ecf20Sopenharmony_ci register long __rc asm("2"); 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci asm volatile ("diag 2,4,0x500\n" 508c2ecf20Sopenharmony_ci : "=d" (__rc) : "d" (__nr), "0" (__p1) : "memory", "cc"); 518c2ecf20Sopenharmony_ci return __rc; 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic inline long kvm_hypercall1(unsigned long nr, unsigned long p1) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci diag_stat_inc(DIAG_STAT_X500); 578c2ecf20Sopenharmony_ci return __kvm_hypercall1(nr, p1); 588c2ecf20Sopenharmony_ci} 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cistatic inline long __kvm_hypercall2(unsigned long nr, unsigned long p1, 618c2ecf20Sopenharmony_ci unsigned long p2) 628c2ecf20Sopenharmony_ci{ 638c2ecf20Sopenharmony_ci register unsigned long __nr asm("1") = nr; 648c2ecf20Sopenharmony_ci register unsigned long __p1 asm("2") = p1; 658c2ecf20Sopenharmony_ci register unsigned long __p2 asm("3") = p2; 668c2ecf20Sopenharmony_ci register long __rc asm("2"); 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci asm volatile ("diag 2,4,0x500\n" 698c2ecf20Sopenharmony_ci : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2) 708c2ecf20Sopenharmony_ci : "memory", "cc"); 718c2ecf20Sopenharmony_ci return __rc; 728c2ecf20Sopenharmony_ci} 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_cistatic inline long kvm_hypercall2(unsigned long nr, unsigned long p1, 758c2ecf20Sopenharmony_ci unsigned long p2) 768c2ecf20Sopenharmony_ci{ 778c2ecf20Sopenharmony_ci diag_stat_inc(DIAG_STAT_X500); 788c2ecf20Sopenharmony_ci return __kvm_hypercall2(nr, p1, p2); 798c2ecf20Sopenharmony_ci} 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_cistatic inline long __kvm_hypercall3(unsigned long nr, unsigned long p1, 828c2ecf20Sopenharmony_ci unsigned long p2, unsigned long p3) 838c2ecf20Sopenharmony_ci{ 848c2ecf20Sopenharmony_ci register unsigned long __nr asm("1") = nr; 858c2ecf20Sopenharmony_ci register unsigned long __p1 asm("2") = p1; 868c2ecf20Sopenharmony_ci register unsigned long __p2 asm("3") = p2; 878c2ecf20Sopenharmony_ci register unsigned long __p3 asm("4") = p3; 888c2ecf20Sopenharmony_ci register long __rc asm("2"); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci asm volatile ("diag 2,4,0x500\n" 918c2ecf20Sopenharmony_ci : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2), 928c2ecf20Sopenharmony_ci "d" (__p3) : "memory", "cc"); 938c2ecf20Sopenharmony_ci return __rc; 948c2ecf20Sopenharmony_ci} 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_cistatic inline long kvm_hypercall3(unsigned long nr, unsigned long p1, 978c2ecf20Sopenharmony_ci unsigned long p2, unsigned long p3) 988c2ecf20Sopenharmony_ci{ 998c2ecf20Sopenharmony_ci diag_stat_inc(DIAG_STAT_X500); 1008c2ecf20Sopenharmony_ci return __kvm_hypercall3(nr, p1, p2, p3); 1018c2ecf20Sopenharmony_ci} 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_cistatic inline long __kvm_hypercall4(unsigned long nr, unsigned long p1, 1048c2ecf20Sopenharmony_ci unsigned long p2, unsigned long p3, 1058c2ecf20Sopenharmony_ci unsigned long p4) 1068c2ecf20Sopenharmony_ci{ 1078c2ecf20Sopenharmony_ci register unsigned long __nr asm("1") = nr; 1088c2ecf20Sopenharmony_ci register unsigned long __p1 asm("2") = p1; 1098c2ecf20Sopenharmony_ci register unsigned long __p2 asm("3") = p2; 1108c2ecf20Sopenharmony_ci register unsigned long __p3 asm("4") = p3; 1118c2ecf20Sopenharmony_ci register unsigned long __p4 asm("5") = p4; 1128c2ecf20Sopenharmony_ci register long __rc asm("2"); 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci asm volatile ("diag 2,4,0x500\n" 1158c2ecf20Sopenharmony_ci : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2), 1168c2ecf20Sopenharmony_ci "d" (__p3), "d" (__p4) : "memory", "cc"); 1178c2ecf20Sopenharmony_ci return __rc; 1188c2ecf20Sopenharmony_ci} 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_cistatic inline long kvm_hypercall4(unsigned long nr, unsigned long p1, 1218c2ecf20Sopenharmony_ci unsigned long p2, unsigned long p3, 1228c2ecf20Sopenharmony_ci unsigned long p4) 1238c2ecf20Sopenharmony_ci{ 1248c2ecf20Sopenharmony_ci diag_stat_inc(DIAG_STAT_X500); 1258c2ecf20Sopenharmony_ci return __kvm_hypercall4(nr, p1, p2, p3, p4); 1268c2ecf20Sopenharmony_ci} 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_cistatic inline long __kvm_hypercall5(unsigned long nr, unsigned long p1, 1298c2ecf20Sopenharmony_ci unsigned long p2, unsigned long p3, 1308c2ecf20Sopenharmony_ci unsigned long p4, unsigned long p5) 1318c2ecf20Sopenharmony_ci{ 1328c2ecf20Sopenharmony_ci register unsigned long __nr asm("1") = nr; 1338c2ecf20Sopenharmony_ci register unsigned long __p1 asm("2") = p1; 1348c2ecf20Sopenharmony_ci register unsigned long __p2 asm("3") = p2; 1358c2ecf20Sopenharmony_ci register unsigned long __p3 asm("4") = p3; 1368c2ecf20Sopenharmony_ci register unsigned long __p4 asm("5") = p4; 1378c2ecf20Sopenharmony_ci register unsigned long __p5 asm("6") = p5; 1388c2ecf20Sopenharmony_ci register long __rc asm("2"); 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci asm volatile ("diag 2,4,0x500\n" 1418c2ecf20Sopenharmony_ci : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2), 1428c2ecf20Sopenharmony_ci "d" (__p3), "d" (__p4), "d" (__p5) : "memory", "cc"); 1438c2ecf20Sopenharmony_ci return __rc; 1448c2ecf20Sopenharmony_ci} 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_cistatic inline long kvm_hypercall5(unsigned long nr, unsigned long p1, 1478c2ecf20Sopenharmony_ci unsigned long p2, unsigned long p3, 1488c2ecf20Sopenharmony_ci unsigned long p4, unsigned long p5) 1498c2ecf20Sopenharmony_ci{ 1508c2ecf20Sopenharmony_ci diag_stat_inc(DIAG_STAT_X500); 1518c2ecf20Sopenharmony_ci return __kvm_hypercall5(nr, p1, p2, p3, p4, p5); 1528c2ecf20Sopenharmony_ci} 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_cistatic inline long __kvm_hypercall6(unsigned long nr, unsigned long p1, 1558c2ecf20Sopenharmony_ci unsigned long p2, unsigned long p3, 1568c2ecf20Sopenharmony_ci unsigned long p4, unsigned long p5, 1578c2ecf20Sopenharmony_ci unsigned long p6) 1588c2ecf20Sopenharmony_ci{ 1598c2ecf20Sopenharmony_ci register unsigned long __nr asm("1") = nr; 1608c2ecf20Sopenharmony_ci register unsigned long __p1 asm("2") = p1; 1618c2ecf20Sopenharmony_ci register unsigned long __p2 asm("3") = p2; 1628c2ecf20Sopenharmony_ci register unsigned long __p3 asm("4") = p3; 1638c2ecf20Sopenharmony_ci register unsigned long __p4 asm("5") = p4; 1648c2ecf20Sopenharmony_ci register unsigned long __p5 asm("6") = p5; 1658c2ecf20Sopenharmony_ci register unsigned long __p6 asm("7") = p6; 1668c2ecf20Sopenharmony_ci register long __rc asm("2"); 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci asm volatile ("diag 2,4,0x500\n" 1698c2ecf20Sopenharmony_ci : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2), 1708c2ecf20Sopenharmony_ci "d" (__p3), "d" (__p4), "d" (__p5), "d" (__p6) 1718c2ecf20Sopenharmony_ci : "memory", "cc"); 1728c2ecf20Sopenharmony_ci return __rc; 1738c2ecf20Sopenharmony_ci} 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_cistatic inline long kvm_hypercall6(unsigned long nr, unsigned long p1, 1768c2ecf20Sopenharmony_ci unsigned long p2, unsigned long p3, 1778c2ecf20Sopenharmony_ci unsigned long p4, unsigned long p5, 1788c2ecf20Sopenharmony_ci unsigned long p6) 1798c2ecf20Sopenharmony_ci{ 1808c2ecf20Sopenharmony_ci diag_stat_inc(DIAG_STAT_X500); 1818c2ecf20Sopenharmony_ci return __kvm_hypercall6(nr, p1, p2, p3, p4, p5, p6); 1828c2ecf20Sopenharmony_ci} 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci/* kvm on s390 is always paravirtualization enabled */ 1858c2ecf20Sopenharmony_cistatic inline int kvm_para_available(void) 1868c2ecf20Sopenharmony_ci{ 1878c2ecf20Sopenharmony_ci return 1; 1888c2ecf20Sopenharmony_ci} 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci/* No feature bits are currently assigned for kvm on s390 */ 1918c2ecf20Sopenharmony_cistatic inline unsigned int kvm_arch_para_features(void) 1928c2ecf20Sopenharmony_ci{ 1938c2ecf20Sopenharmony_ci return 0; 1948c2ecf20Sopenharmony_ci} 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_cistatic inline unsigned int kvm_arch_para_hints(void) 1978c2ecf20Sopenharmony_ci{ 1988c2ecf20Sopenharmony_ci return 0; 1998c2ecf20Sopenharmony_ci} 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_cistatic inline bool kvm_check_and_clear_guest_paused(void) 2028c2ecf20Sopenharmony_ci{ 2038c2ecf20Sopenharmony_ci return false; 2048c2ecf20Sopenharmony_ci} 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci#endif /* __S390_KVM_PARA_H */ 207