xref: /kvm-unit-tests/lib/s390x/uv.h (revision 95a9408860fc8dacb73e9b302fb96536f91d5ccf)
107ac63dcSJanosch Frank /* SPDX-License-Identifier: GPL-2.0-or-later */
2eb5a1bbaSCornelia Huck #ifndef _S390X_UV_H_
3eb5a1bbaSCornelia Huck #define _S390X_UV_H_
407ac63dcSJanosch Frank 
5f4f97af0SJanosch Frank #include <sie.h>
673950a25SJanosch Frank #include <asm/pgtable.h>
7*95a94088SNicholas Piggin #include <vmalloc.h>
8f4f97af0SJanosch Frank 
907ac63dcSJanosch Frank bool uv_os_is_guest(void);
1007ac63dcSJanosch Frank bool uv_os_is_host(void);
11ec6683adSJanosch Frank bool uv_host_requirement_checks(void);
1207ac63dcSJanosch Frank bool uv_query_test_call(unsigned int nr);
1326184212SSteffen Eiden const struct uv_cb_qui *uv_get_query_data(void);
14f4f97af0SJanosch Frank void uv_init(void);
1507ac63dcSJanosch Frank int uv_setup(void);
16f4f97af0SJanosch Frank void uv_create_guest(struct vm *vm);
17f4f97af0SJanosch Frank void uv_destroy_guest(struct vm *vm);
18f4f97af0SJanosch Frank int uv_unpack(struct vm *vm, uint64_t addr, uint64_t len, uint64_t tweak);
19f4f97af0SJanosch Frank void uv_verify_load(struct vm *vm);
2007ac63dcSJanosch Frank 
2173950a25SJanosch Frank /*
2273950a25SJanosch Frank  * To run PV guests we need to setup a few things:
2373950a25SJanosch Frank  * - A valid primary ASCE that contains the guest memory and has the P bit set.
2473950a25SJanosch Frank  * - A valid home space ASCE for the UV calls that use home space addresses.
2573950a25SJanosch Frank  */
uv_setup_asces(void)2673950a25SJanosch Frank static inline void uv_setup_asces(void)
2773950a25SJanosch Frank {
2873950a25SJanosch Frank 	uint64_t asce;
2973950a25SJanosch Frank 
3073950a25SJanosch Frank 	/* We need to have a valid primary ASCE to run guests. */
3173950a25SJanosch Frank 	setup_vm();
3273950a25SJanosch Frank 
339e3cff66SJanosch Frank 	/* Grab the ASCE which setup_vm() just set up */
349e3cff66SJanosch Frank 	asce = stctg(1);
3573950a25SJanosch Frank 
3673950a25SJanosch Frank 	/* Copy ASCE into home space CR */
3773950a25SJanosch Frank 	lctlg(13, asce);
3873950a25SJanosch Frank }
3973950a25SJanosch Frank 
uv_validity_check(struct vm * vm)40c3b0743fSJanosch Frank static inline bool uv_validity_check(struct vm *vm)
41c3b0743fSJanosch Frank {
42c3b0743fSJanosch Frank 	uint16_t vir = sie_get_validity(vm);
43c3b0743fSJanosch Frank 
44c3b0743fSJanosch Frank 	return vm->sblk->icptcode == ICPT_VALIDITY && (vir & 0xff00) == 0x2000;
45c3b0743fSJanosch Frank }
46c3b0743fSJanosch Frank 
4707ac63dcSJanosch Frank #endif /* UV_H */
48