On Fri, 14 Jan 2022 10:02:41 +0000 Janosch Frank <frankja@xxxxxxxxxxxxx> wrote: > This patch will likely (in parts) be replaced by Pierre's patch from > his topology test series. > > Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> although I think there is some room for improvement, but nothing too serious, I'll probably fix it myself later > --- > lib/s390x/vm.c | 39 +++++++++++++++++++++++++++++++++++++++ > lib/s390x/vm.h | 23 +++++++++++++++++++++++ > s390x/stsi.c | 21 +-------------------- > 3 files changed, 63 insertions(+), 20 deletions(-) > > diff --git a/lib/s390x/vm.c b/lib/s390x/vm.c > index a5b92863..266a81c1 100644 > --- a/lib/s390x/vm.c > +++ b/lib/s390x/vm.c > @@ -26,6 +26,11 @@ bool vm_is_tcg(void) > if (initialized) > return is_tcg; > > + if (stsi_get_fc() < 3) { > + initialized = true; > + return false; > + } > + > buf = alloc_page(); > if (!buf) > return false; > @@ -43,3 +48,37 @@ out: > free_page(buf); > return is_tcg; > } > + > +bool vm_is_kvm(void) > +{ > + const uint8_t cpi_kvm[] = { 0xd2, 0xe5, 0xd4, 0x61 }; > + struct stsi_322 *buf; > + static bool initialized = false; > + static bool is_kvm = false; > + > + if (initialized) > + return is_kvm; > + > + if (stsi_get_fc() < 3) { > + initialized = true; > + return false; > + } > + > + buf = alloc_page(); > + if (!buf) > + return false; > + > + if (stsi(buf, 3, 2, 2)) > + goto out; > + > + is_kvm = !(memcmp(&buf->vm[0].cpi, cpi_kvm, sizeof(cpi_kvm))) && !vm_is_tcg(); > + initialized = true; > +out: > + free_page(buf); > + return is_kvm; > +} > + > +bool vm_is_lpar(void) > +{ > + return stsi_get_fc() == 1; > +} > diff --git a/lib/s390x/vm.h b/lib/s390x/vm.h > index 7abba0cc..d4a82fc0 100644 > --- a/lib/s390x/vm.h > +++ b/lib/s390x/vm.h > @@ -8,6 +8,29 @@ > #ifndef _S390X_VM_H_ > #define _S390X_VM_H_ > > +struct stsi_322 { > + uint8_t reserved[31]; > + uint8_t count; > + struct { > + uint8_t reserved2[4]; > + uint16_t total_cpus; > + uint16_t conf_cpus; > + uint16_t standby_cpus; > + uint16_t reserved_cpus; > + uint8_t name[8]; > + uint32_t caf; > + uint8_t cpi[16]; > + uint8_t reserved5[3]; > + uint8_t ext_name_encoding; > + uint32_t reserved3; > + uint8_t uuid[16]; > + } vm[8]; > + uint8_t reserved4[1504]; > + uint8_t ext_names[8][256]; > +}; > + > bool vm_is_tcg(void); > +bool vm_is_kvm(void); > +bool vm_is_lpar(void); > > #endif /* _S390X_VM_H_ */ > diff --git a/s390x/stsi.c b/s390x/stsi.c > index 391f8849..e66d07a1 100644 > --- a/s390x/stsi.c > +++ b/s390x/stsi.c > @@ -13,27 +13,8 @@ > #include <asm/asm-offsets.h> > #include <asm/interrupt.h> > #include <smp.h> > +#include <vm.h> > > -struct stsi_322 { > - uint8_t reserved[31]; > - uint8_t count; > - struct { > - uint8_t reserved2[4]; > - uint16_t total_cpus; > - uint16_t conf_cpus; > - uint16_t standby_cpus; > - uint16_t reserved_cpus; > - uint8_t name[8]; > - uint32_t caf; > - uint8_t cpi[16]; > - uint8_t reserved5[3]; > - uint8_t ext_name_encoding; > - uint32_t reserved3; > - uint8_t uuid[16]; > - } vm[8]; > - uint8_t reserved4[1504]; > - uint8_t ext_names[8][256]; > -}; > static uint8_t pagebuf[PAGE_SIZE * 2] __attribute__((aligned(PAGE_SIZE * 2))); > > static void test_specs(void)