Message ID | 20230606055621.523175-16-thuth@redhat.com |
---|---|
State | New |
Headers | show |
Series | [PULL,01/18] target/s390x: Fix LCBB overwriting the top 32 bits | expand |
06.06.2023 08:56, Thomas Huth wrote: > From: Ilya Leoshkevich <iii@linux.ibm.com> > > In qemu-user-s390x, /proc/cpuinfo contains: > > processor 0: version = 00, identification = 000000, machine = 8561 > processor 1: version = 00, identification = 400000, machine = 8561 > > The highest nibble is supposed to contain the CPU address, but it's off > by 2 bits. Fix the shift value and provide a symbolic constant for it. > > With the fix we get: > > processor 0: version = 00, identification = 000000, machine = 8561 > processor 1: version = 00, identification = 100000, machine = 8561 > > Fixes: 076d4d39b65f ("s390x/cpumodel: wire up cpu type + id for TCG") > Reviewed-by: David Hildenbrand <david@redhat.com> > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > Message-Id: <20230605113950.1169228-2-iii@linux.ibm.com> > Signed-off-by: Thomas Huth <thuth@redhat.com> > --- > target/s390x/cpu_models.h | 10 +++++++++- > target/s390x/cpu_models.c | 4 ++-- > 2 files changed, 11 insertions(+), 3 deletions(-) Is it a -stable material too? (applies cleanly to 7.2 and 8.0) Thanks, /mjt
On Wed, 2023-06-07 at 12:05 +0300, Michael Tokarev wrote: > 06.06.2023 08:56, Thomas Huth wrote: > > From: Ilya Leoshkevich <iii@linux.ibm.com> > > > > In qemu-user-s390x, /proc/cpuinfo contains: > > > > processor 0: version = 00, identification = 000000, > > machine = 8561 > > processor 1: version = 00, identification = 400000, > > machine = 8561 > > > > The highest nibble is supposed to contain the CPU address, but it's > > off > > by 2 bits. Fix the shift value and provide a symbolic constant for > > it. > > > > With the fix we get: > > > > processor 0: version = 00, identification = 000000, > > machine = 8561 > > processor 1: version = 00, identification = 100000, > > machine = 8561 > > > > Fixes: 076d4d39b65f ("s390x/cpumodel: wire up cpu type + id for > > TCG") > > Reviewed-by: David Hildenbrand <david@redhat.com> > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > > Message-Id: <20230605113950.1169228-2-iii@linux.ibm.com> > > Signed-off-by: Thomas Huth <thuth@redhat.com> > > --- > > target/s390x/cpu_models.h | 10 +++++++++- > > target/s390x/cpu_models.c | 4 ++-- > > 2 files changed, 11 insertions(+), 3 deletions(-) > > Is it a -stable material too? > (applies cleanly to 7.2 and 8.0) > > Thanks, > > /mjt Yes, from my perspective, it would be good to put this into stable. I forgot to tag it, because the rest of the series was a new feature. Thanks for noticing!
diff --git a/target/s390x/cpu_models.h b/target/s390x/cpu_models.h index fb1adc8b21..cc7305ec21 100644 --- a/target/s390x/cpu_models.h +++ b/target/s390x/cpu_models.h @@ -96,10 +96,18 @@ static inline bool s390_known_cpu_type(uint16_t type) { return s390_get_gen_for_cpu_type(type) != 0; } +#define CPU_ID_SHIFT 32 +#define CPU_ID_BITS 24 +/* + * When cpu_id_format is 0 (basic mode), the leftmost 4 bits of cpu_id contain + * the rightmost 4 bits of the physical CPU address. + */ +#define CPU_PHYS_ADDR_BITS 4 +#define CPU_PHYS_ADDR_SHIFT (CPU_ID_SHIFT + CPU_ID_BITS - CPU_PHYS_ADDR_BITS) static inline uint64_t s390_cpuid_from_cpu_model(const S390CPUModel *model) { return ((uint64_t)model->cpu_ver << 56) | - ((uint64_t)model->cpu_id << 32) | + ((uint64_t)model->cpu_id << CPU_ID_SHIFT) | ((uint64_t)model->def->type << 16) | (model->def->gen == 7 ? 0 : (uint64_t)model->cpu_id_format << 15); } diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c index 457b5cb10c..ae8880e81d 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -607,8 +607,8 @@ void s390_realize_cpu_model(CPUState *cs, Error **errp) #if !defined(CONFIG_USER_ONLY) cpu->env.cpuid = s390_cpuid_from_cpu_model(cpu->model); if (tcg_enabled()) { - /* basic mode, write the cpu address into the first 4 bit of the ID */ - cpu->env.cpuid = deposit64(cpu->env.cpuid, 54, 4, cpu->env.core_id); + cpu->env.cpuid = deposit64(cpu->env.cpuid, CPU_PHYS_ADDR_SHIFT, + CPU_PHYS_ADDR_BITS, cpu->env.core_id); } #endif }