s390x/tcg: Fix CPU address returned by STIDP
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: 076d4d39b6
("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>
This commit is contained in:
parent
7d5b0d6864
commit
71b11cbe1c
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user