xref: /kvm-unit-tests/lib/s390x/uv.c (revision aa8794b1414330760defc06633da32b462cb34be)
1*aa8794b1SJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */
2*aa8794b1SJanosch Frank /*
3*aa8794b1SJanosch Frank  * Ultravisor related functionality
4*aa8794b1SJanosch Frank  *
5*aa8794b1SJanosch Frank  * Copyright 2020 IBM Corp.
6*aa8794b1SJanosch Frank  *
7*aa8794b1SJanosch Frank  * Authors:
8*aa8794b1SJanosch Frank  *    Janosch Frank <frankja@linux.ibm.com>
9*aa8794b1SJanosch Frank  */
1007ac63dcSJanosch Frank #include <libcflat.h>
1107ac63dcSJanosch Frank #include <bitops.h>
1207ac63dcSJanosch Frank #include <alloc.h>
1307ac63dcSJanosch Frank #include <alloc_page.h>
1407ac63dcSJanosch Frank #include <asm/page.h>
1507ac63dcSJanosch Frank #include <asm/arch_def.h>
1607ac63dcSJanosch Frank 
1707ac63dcSJanosch Frank #include <asm/facility.h>
1807ac63dcSJanosch Frank #include <asm/uv.h>
1907ac63dcSJanosch Frank #include <uv.h>
2007ac63dcSJanosch Frank 
2107ac63dcSJanosch Frank static struct uv_cb_qui uvcb_qui = {
2207ac63dcSJanosch Frank 	.header.cmd = UVC_CMD_QUI,
2307ac63dcSJanosch Frank 	.header.len = sizeof(uvcb_qui),
2407ac63dcSJanosch Frank };
2507ac63dcSJanosch Frank 
2607ac63dcSJanosch Frank bool uv_os_is_guest(void)
2707ac63dcSJanosch Frank {
2807ac63dcSJanosch Frank 	return test_facility(158) &&
2907ac63dcSJanosch Frank 		uv_query_test_call(BIT_UVC_CMD_SET_SHARED_ACCESS) &&
3007ac63dcSJanosch Frank 		uv_query_test_call(BIT_UVC_CMD_REMOVE_SHARED_ACCESS);
3107ac63dcSJanosch Frank }
3207ac63dcSJanosch Frank 
3307ac63dcSJanosch Frank bool uv_os_is_host(void)
3407ac63dcSJanosch Frank {
3507ac63dcSJanosch Frank 	return test_facility(158) && uv_query_test_call(BIT_UVC_CMD_INIT_UV);
3607ac63dcSJanosch Frank }
3707ac63dcSJanosch Frank 
3807ac63dcSJanosch Frank bool uv_query_test_call(unsigned int nr)
3907ac63dcSJanosch Frank {
4007ac63dcSJanosch Frank 	/* Query needs to be called first */
4107ac63dcSJanosch Frank 	assert(uvcb_qui.header.rc);
4207ac63dcSJanosch Frank 	assert(nr < BITS_PER_LONG * ARRAY_SIZE(uvcb_qui.inst_calls_list));
4307ac63dcSJanosch Frank 
4407ac63dcSJanosch Frank 	return test_bit_inv(nr, uvcb_qui.inst_calls_list);
4507ac63dcSJanosch Frank }
4607ac63dcSJanosch Frank 
4707ac63dcSJanosch Frank int uv_setup(void)
4807ac63dcSJanosch Frank {
4907ac63dcSJanosch Frank 	if (!test_facility(158))
5007ac63dcSJanosch Frank 		return 0;
5107ac63dcSJanosch Frank 
5207ac63dcSJanosch Frank 	assert(!uv_call(0, (u64)&uvcb_qui));
5307ac63dcSJanosch Frank 	return 1;
5407ac63dcSJanosch Frank }
55