diff mbox series

[PULL,15/18] s390x/tcg: Fix CPU address returned by STIDP

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

Commit Message

Thomas Huth June 6, 2023, 5:56 a.m. UTC
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(-)

Comments

Michael Tokarev June 7, 2023, 9:05 a.m. UTC | #1
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
Ilya Leoshkevich June 7, 2023, 9:11 a.m. UTC | #2
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 mbox series

Patch

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
 }