2 * S390X specific proc functions for linux-user
4 * SPDX-License-Identifier: GPL-2.0-or-later
6 #ifndef S390X_TARGET_PROC_H
7 #define S390X_TARGET_PROC_H
10 * Emulate what a Linux kernel running in qemu-system-s390x -M accel=tcg would
11 * show in /proc/cpuinfo.
13 * Skip the following in order to match the missing support in op_ecag():
15 * - show_cpu_topology().
18 * Use fixed values for certain fields:
19 * - bogomips per cpu - from a qemu-system-s390x run.
20 * - max thread id = 0, since SMT / SIGP_SET_MULTI_THREADING is not supported.
22 * Keep the code structure close to arch/s390/kernel/processor.c.
25 static void show_facilities(int fd
)
27 size_t sizeof_stfl_bytes
= 2048;
28 g_autofree
uint8_t *stfl_bytes
= g_new0(uint8_t, sizeof_stfl_bytes
);
31 dprintf(fd
, "facilities :");
32 s390_get_feat_block(S390_FEAT_TYPE_STFL
, stfl_bytes
);
33 for (bit
= 0; bit
< sizeof_stfl_bytes
* 8; bit
++) {
34 if (test_be_bit(bit
, stfl_bytes
)) {
35 dprintf(fd
, " %d", bit
);
41 static int cpu_ident(unsigned long n
)
43 return deposit32(0, CPU_ID_BITS
- CPU_PHYS_ADDR_BITS
, CPU_PHYS_ADDR_BITS
,
47 static void show_cpu_summary(CPUArchState
*cpu_env
, int fd
)
49 S390CPUModel
*model
= env_archcpu(cpu_env
)->model
;
50 int num_cpus
= sysconf(_SC_NPROCESSORS_ONLN
);
51 uint32_t elf_hwcap
= get_elf_hwcap();
52 const char *hwcap_str
;
55 dprintf(fd
, "vendor_id : IBM/S390\n"
57 "bogomips per cpu: 13370.00\n",
59 dprintf(fd
, "max thread id : 0\n");
60 dprintf(fd
, "features\t: ");
61 for (i
= 0; i
< sizeof(elf_hwcap
) * 8; i
++) {
62 if (!(elf_hwcap
& (1 << i
))) {
65 hwcap_str
= elf_hwcap_str(i
);
67 dprintf(fd
, "%s ", hwcap_str
);
72 for (i
= 0; i
< num_cpus
; i
++) {
73 dprintf(fd
, "processor %d: "
75 "identification = %06X, "
77 i
, model
->cpu_ver
, cpu_ident(i
), model
->def
->type
);
81 static void show_cpu_ids(CPUArchState
*cpu_env
, int fd
, unsigned long n
)
83 S390CPUModel
*model
= env_archcpu(cpu_env
)->model
;
85 dprintf(fd
, "version : %02X\n", model
->cpu_ver
);
86 dprintf(fd
, "identification : %06X\n", cpu_ident(n
));
87 dprintf(fd
, "machine : %04X\n", model
->def
->type
);
90 static void show_cpuinfo(CPUArchState
*cpu_env
, int fd
, unsigned long n
)
92 dprintf(fd
, "\ncpu number : %ld\n", n
);
93 show_cpu_ids(cpu_env
, fd
, n
);
96 static int open_cpuinfo(CPUArchState
*cpu_env
, int fd
)
98 int num_cpus
= sysconf(_SC_NPROCESSORS_ONLN
);
101 show_cpu_summary(cpu_env
, fd
);
102 for (i
= 0; i
< num_cpus
; i
++) {
103 show_cpuinfo(cpu_env
, fd
, i
);
107 #define HAVE_ARCH_PROC_CPUINFO
109 #endif /* S390X_TARGET_PROC_H */