Let's add a UV library to make checking the UV feature bit easier. In the future this library file can take care of handling UV initialization and UV guest creation. Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> --- lib/s390x/asm/uv.h | 4 ++-- lib/s390x/io.c | 2 ++ lib/s390x/uv.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ lib/s390x/uv.h | 10 ++++++++++ s390x/Makefile | 1 + 5 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 lib/s390x/uv.c create mode 100644 lib/s390x/uv.h diff --git a/lib/s390x/asm/uv.h b/lib/s390x/asm/uv.h index 11f70a9f..b22cbaa8 100644 --- a/lib/s390x/asm/uv.h +++ b/lib/s390x/asm/uv.h @@ -9,8 +9,8 @@ * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2. */ -#ifndef UV_H -#define UV_H +#ifndef ASM_S390X_UV_H +#define ASM_S390X_UV_H #define UVC_RC_EXECUTED 0x0001 #define UVC_RC_INV_CMD 0x0002 diff --git a/lib/s390x/io.c b/lib/s390x/io.c index ef9f59e3..a4f1b113 100644 --- a/lib/s390x/io.c +++ b/lib/s390x/io.c @@ -14,6 +14,7 @@ #include <asm/facility.h> #include <asm/sigp.h> #include "sclp.h" +#include "uv.h" #include "smp.h" extern char ipl_args[]; @@ -38,6 +39,7 @@ void setup(void) sclp_facilities_setup(); sclp_console_setup(); sclp_memory_setup(); + uv_setup(); smp_setup(); } diff --git a/lib/s390x/uv.c b/lib/s390x/uv.c new file mode 100644 index 00000000..a84a85fc --- /dev/null +++ b/lib/s390x/uv.c @@ -0,0 +1,48 @@ +#include <libcflat.h> +#include <bitops.h> +#include <alloc.h> +#include <alloc_page.h> +#include <asm/page.h> +#include <asm/arch_def.h> + +#include <asm/facility.h> +#include <asm/uv.h> +#include <uv.h> + +static struct uv_cb_qui uvcb_qui = { + .header.cmd = UVC_CMD_QUI, + .header.len = sizeof(uvcb_qui), +}; + +bool uv_os_is_guest(void) +{ + return uv_query_test_feature(BIT_UVC_CMD_SET_SHARED_ACCESS) + && uv_query_test_feature(BIT_UVC_CMD_REMOVE_SHARED_ACCESS); +} + +bool uv_os_is_host(void) +{ + return uv_query_test_feature(BIT_UVC_CMD_INIT_UV); +} + +bool uv_query_test_feature(int nr) +{ + /* Query needs to be called first */ + if (!uvcb_qui.header.rc) + return false; + + return test_bit_inv(nr, uvcb_qui.inst_calls_list); +} + +int uv_setup(void) +{ + int cc; + + if (!test_facility(158)) + return 0; + + cc = uv_call(0, (u64)&uvcb_qui); + assert(cc == 0); + + return cc == 0; +} diff --git a/lib/s390x/uv.h b/lib/s390x/uv.h new file mode 100644 index 00000000..159bf8e5 --- /dev/null +++ b/lib/s390x/uv.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef UV_H +#define UV_H + +bool uv_os_is_guest(void); +bool uv_os_is_host(void); +bool uv_query_test_feature(int nr); +int uv_setup(void); + +#endif /* UV_H */ diff --git a/s390x/Makefile b/s390x/Makefile index b92de9c5..bbf177fa 100644 --- a/s390x/Makefile +++ b/s390x/Makefile @@ -67,6 +67,7 @@ cflatobjs += lib/s390x/vm.o cflatobjs += lib/s390x/css_dump.o cflatobjs += lib/s390x/css_lib.o cflatobjs += lib/s390x/malloc_io.o +cflatobjs += lib/s390x/uv.o OBJDIRS += lib/s390x -- 2.27.0