On 4/20/21 4:15 PM, Claudio Imbrenda wrote: > On Tue, 16 Mar 2021 09:16:51 +0000 > Janosch Frank <frankja@xxxxxxxxxxxxx> wrote: > >> 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> > > Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> Thanks > > but see some comments below > >> --- >> 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; > > why not an assert? I'd guess I had some weird reservation. I'll add one though > >> + >> + 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; > > sooo... return 1? Yes > >> +} >> 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 >> >