xref: /kvm-unit-tests/lib/s390x/asm/uv.h (revision 2ea7afb64d34b5dd841334f72b99251ab56433cd)
1*2ea7afb6SJanosch Frank /*
2*2ea7afb6SJanosch Frank  * s390x Ultravisor related definitions
3*2ea7afb6SJanosch Frank  *
4*2ea7afb6SJanosch Frank  * Copyright (c) 2020 IBM Corp
5*2ea7afb6SJanosch Frank  *
6*2ea7afb6SJanosch Frank  * Authors:
7*2ea7afb6SJanosch Frank  *  Janosch Frank <frankja@linux.ibm.com>
8*2ea7afb6SJanosch Frank  *
9*2ea7afb6SJanosch Frank  * This code is free software; you can redistribute it and/or modify it
10*2ea7afb6SJanosch Frank  * under the terms of the GNU General Public License version 2.
11*2ea7afb6SJanosch Frank  */
12*2ea7afb6SJanosch Frank #ifndef UV_H
13*2ea7afb6SJanosch Frank #define UV_H
14*2ea7afb6SJanosch Frank 
15*2ea7afb6SJanosch Frank #define UVC_RC_EXECUTED		0x0001
16*2ea7afb6SJanosch Frank #define UVC_RC_INV_CMD		0x0002
17*2ea7afb6SJanosch Frank #define UVC_RC_INV_STATE	0x0003
18*2ea7afb6SJanosch Frank #define UVC_RC_INV_LEN		0x0005
19*2ea7afb6SJanosch Frank #define UVC_RC_NO_RESUME	0x0007
20*2ea7afb6SJanosch Frank 
21*2ea7afb6SJanosch Frank #define UVC_CMD_QUI			0x0001
22*2ea7afb6SJanosch Frank #define UVC_CMD_SET_SHARED_ACCESS	0x1000
23*2ea7afb6SJanosch Frank #define UVC_CMD_REMOVE_SHARED_ACCESS	0x1001
24*2ea7afb6SJanosch Frank 
25*2ea7afb6SJanosch Frank /* Bits in installed uv calls */
26*2ea7afb6SJanosch Frank enum uv_cmds_inst {
27*2ea7afb6SJanosch Frank 	BIT_UVC_CMD_QUI = 0,
28*2ea7afb6SJanosch Frank 	BIT_UVC_CMD_SET_SHARED_ACCESS = 8,
29*2ea7afb6SJanosch Frank 	BIT_UVC_CMD_REMOVE_SHARED_ACCESS = 9,
30*2ea7afb6SJanosch Frank };
31*2ea7afb6SJanosch Frank 
32*2ea7afb6SJanosch Frank struct uv_cb_header {
33*2ea7afb6SJanosch Frank 	u16 len;
34*2ea7afb6SJanosch Frank 	u16 cmd;	/* Command Code */
35*2ea7afb6SJanosch Frank 	u16 rc;		/* Response Code */
36*2ea7afb6SJanosch Frank 	u16 rrc;	/* Return Reason Code */
37*2ea7afb6SJanosch Frank } __attribute__((packed))  __attribute__((aligned(8)));
38*2ea7afb6SJanosch Frank 
39*2ea7afb6SJanosch Frank struct uv_cb_qui {
40*2ea7afb6SJanosch Frank 	struct uv_cb_header header;
41*2ea7afb6SJanosch Frank 	u64 reserved08;
42*2ea7afb6SJanosch Frank 	u64 inst_calls_list[4];
43*2ea7afb6SJanosch Frank 	u64 reserved30[15];
44*2ea7afb6SJanosch Frank } __attribute__((packed))  __attribute__((aligned(8)));
45*2ea7afb6SJanosch Frank 
46*2ea7afb6SJanosch Frank struct uv_cb_share {
47*2ea7afb6SJanosch Frank 	struct uv_cb_header header;
48*2ea7afb6SJanosch Frank 	u64 reserved08[3];
49*2ea7afb6SJanosch Frank 	u64 paddr;
50*2ea7afb6SJanosch Frank 	u64 reserved28;
51*2ea7afb6SJanosch Frank } __attribute__((packed))  __attribute__((aligned(8)));
52*2ea7afb6SJanosch Frank 
53*2ea7afb6SJanosch Frank static inline int uv_call(unsigned long r1, unsigned long r2)
54*2ea7afb6SJanosch Frank {
55*2ea7afb6SJanosch Frank 	int cc;
56*2ea7afb6SJanosch Frank 
57*2ea7afb6SJanosch Frank 	/*
58*2ea7afb6SJanosch Frank 	 * The brc instruction will take care of the cc 2/3 case where
59*2ea7afb6SJanosch Frank 	 * we need to continue the execution because we were
60*2ea7afb6SJanosch Frank 	 * interrupted. The inline assembly will only return on
61*2ea7afb6SJanosch Frank 	 * success/error i.e. cc 0/1.
62*2ea7afb6SJanosch Frank 	*/
63*2ea7afb6SJanosch Frank 	asm volatile(
64*2ea7afb6SJanosch Frank 		"0:	.insn rrf,0xB9A40000,%[r1],%[r2],0,0\n"
65*2ea7afb6SJanosch Frank 		"		brc	3,0b\n"
66*2ea7afb6SJanosch Frank 		"		ipm	%[cc]\n"
67*2ea7afb6SJanosch Frank 		"		srl	%[cc],28\n"
68*2ea7afb6SJanosch Frank 		: [cc] "=d" (cc)
69*2ea7afb6SJanosch Frank 		: [r1] "a" (r1), [r2] "a" (r2)
70*2ea7afb6SJanosch Frank 		: "memory", "cc");
71*2ea7afb6SJanosch Frank 	return cc;
72*2ea7afb6SJanosch Frank }
73*2ea7afb6SJanosch Frank 
74*2ea7afb6SJanosch Frank #endif
75