xref: /openbmc/qemu/linux-user/s390x/target_proc.h (revision bde438c3ecdb9813038b226c429dd982925d8205)
1*121c8dd6SRichard Henderson /*
2*121c8dd6SRichard Henderson  * S390X specific proc functions for linux-user
3*121c8dd6SRichard Henderson  *
4*121c8dd6SRichard Henderson  * SPDX-License-Identifier: GPL-2.0-or-later
5*121c8dd6SRichard Henderson  */
6*121c8dd6SRichard Henderson #ifndef S390X_TARGET_PROC_H
7*121c8dd6SRichard Henderson #define S390X_TARGET_PROC_H
8*121c8dd6SRichard Henderson 
9*121c8dd6SRichard Henderson /*
10*121c8dd6SRichard Henderson  * Emulate what a Linux kernel running in qemu-system-s390x -M accel=tcg would
11*121c8dd6SRichard Henderson  * show in /proc/cpuinfo.
12*121c8dd6SRichard Henderson  *
13*121c8dd6SRichard Henderson  * Skip the following in order to match the missing support in op_ecag():
14*121c8dd6SRichard Henderson  * - show_cacheinfo().
15*121c8dd6SRichard Henderson  * - show_cpu_topology().
16*121c8dd6SRichard Henderson  * - show_cpu_mhz().
17*121c8dd6SRichard Henderson  *
18*121c8dd6SRichard Henderson  * Use fixed values for certain fields:
19*121c8dd6SRichard Henderson  * - bogomips per cpu - from a qemu-system-s390x run.
20*121c8dd6SRichard Henderson  * - max thread id = 0, since SMT / SIGP_SET_MULTI_THREADING is not supported.
21*121c8dd6SRichard Henderson  *
22*121c8dd6SRichard Henderson  * Keep the code structure close to arch/s390/kernel/processor.c.
23*121c8dd6SRichard Henderson  */
24*121c8dd6SRichard Henderson 
show_facilities(int fd)25*121c8dd6SRichard Henderson static void show_facilities(int fd)
26*121c8dd6SRichard Henderson {
27*121c8dd6SRichard Henderson     size_t sizeof_stfl_bytes = 2048;
28*121c8dd6SRichard Henderson     g_autofree uint8_t *stfl_bytes = g_new0(uint8_t, sizeof_stfl_bytes);
29*121c8dd6SRichard Henderson     unsigned int bit;
30*121c8dd6SRichard Henderson 
31*121c8dd6SRichard Henderson     dprintf(fd, "facilities      :");
32*121c8dd6SRichard Henderson     s390_get_feat_block(S390_FEAT_TYPE_STFL, stfl_bytes);
33*121c8dd6SRichard Henderson     for (bit = 0; bit < sizeof_stfl_bytes * 8; bit++) {
34*121c8dd6SRichard Henderson         if (test_be_bit(bit, stfl_bytes)) {
35*121c8dd6SRichard Henderson             dprintf(fd, " %d", bit);
36*121c8dd6SRichard Henderson         }
37*121c8dd6SRichard Henderson     }
38*121c8dd6SRichard Henderson     dprintf(fd, "\n");
39*121c8dd6SRichard Henderson }
40*121c8dd6SRichard Henderson 
cpu_ident(unsigned long n)41*121c8dd6SRichard Henderson static int cpu_ident(unsigned long n)
42*121c8dd6SRichard Henderson {
43*121c8dd6SRichard Henderson     return deposit32(0, CPU_ID_BITS - CPU_PHYS_ADDR_BITS, CPU_PHYS_ADDR_BITS,
44*121c8dd6SRichard Henderson                      n);
45*121c8dd6SRichard Henderson }
46*121c8dd6SRichard Henderson 
show_cpu_summary(CPUArchState * cpu_env,int fd)47*121c8dd6SRichard Henderson static void show_cpu_summary(CPUArchState *cpu_env, int fd)
48*121c8dd6SRichard Henderson {
49*121c8dd6SRichard Henderson     S390CPUModel *model = env_archcpu(cpu_env)->model;
50*121c8dd6SRichard Henderson     int num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
51*121c8dd6SRichard Henderson     uint32_t elf_hwcap = get_elf_hwcap();
52*121c8dd6SRichard Henderson     const char *hwcap_str;
53*121c8dd6SRichard Henderson     int i;
54*121c8dd6SRichard Henderson 
55*121c8dd6SRichard Henderson     dprintf(fd, "vendor_id       : IBM/S390\n"
56*121c8dd6SRichard Henderson                 "# processors    : %i\n"
57*121c8dd6SRichard Henderson                 "bogomips per cpu: 13370.00\n",
58*121c8dd6SRichard Henderson             num_cpus);
59*121c8dd6SRichard Henderson     dprintf(fd, "max thread id   : 0\n");
60*121c8dd6SRichard Henderson     dprintf(fd, "features\t: ");
61*121c8dd6SRichard Henderson     for (i = 0; i < sizeof(elf_hwcap) * 8; i++) {
62*121c8dd6SRichard Henderson         if (!(elf_hwcap & (1 << i))) {
63*121c8dd6SRichard Henderson             continue;
64*121c8dd6SRichard Henderson         }
65*121c8dd6SRichard Henderson         hwcap_str = elf_hwcap_str(i);
66*121c8dd6SRichard Henderson         if (hwcap_str) {
67*121c8dd6SRichard Henderson             dprintf(fd, "%s ", hwcap_str);
68*121c8dd6SRichard Henderson         }
69*121c8dd6SRichard Henderson     }
70*121c8dd6SRichard Henderson     dprintf(fd, "\n");
71*121c8dd6SRichard Henderson     show_facilities(fd);
72*121c8dd6SRichard Henderson     for (i = 0; i < num_cpus; i++) {
73*121c8dd6SRichard Henderson         dprintf(fd, "processor %d: "
74*121c8dd6SRichard Henderson                "version = %02X,  "
75*121c8dd6SRichard Henderson                "identification = %06X,  "
76*121c8dd6SRichard Henderson                "machine = %04X\n",
77*121c8dd6SRichard Henderson                i, model->cpu_ver, cpu_ident(i), model->def->type);
78*121c8dd6SRichard Henderson     }
79*121c8dd6SRichard Henderson }
80*121c8dd6SRichard Henderson 
show_cpu_ids(CPUArchState * cpu_env,int fd,unsigned long n)81*121c8dd6SRichard Henderson static void show_cpu_ids(CPUArchState *cpu_env, int fd, unsigned long n)
82*121c8dd6SRichard Henderson {
83*121c8dd6SRichard Henderson     S390CPUModel *model = env_archcpu(cpu_env)->model;
84*121c8dd6SRichard Henderson 
85*121c8dd6SRichard Henderson     dprintf(fd, "version         : %02X\n", model->cpu_ver);
86*121c8dd6SRichard Henderson     dprintf(fd, "identification  : %06X\n", cpu_ident(n));
87*121c8dd6SRichard Henderson     dprintf(fd, "machine         : %04X\n", model->def->type);
88*121c8dd6SRichard Henderson }
89*121c8dd6SRichard Henderson 
show_cpuinfo(CPUArchState * cpu_env,int fd,unsigned long n)90*121c8dd6SRichard Henderson static void show_cpuinfo(CPUArchState *cpu_env, int fd, unsigned long n)
91*121c8dd6SRichard Henderson {
92*121c8dd6SRichard Henderson     dprintf(fd, "\ncpu number      : %ld\n", n);
93*121c8dd6SRichard Henderson     show_cpu_ids(cpu_env, fd, n);
94*121c8dd6SRichard Henderson }
95*121c8dd6SRichard Henderson 
open_cpuinfo(CPUArchState * cpu_env,int fd)96*121c8dd6SRichard Henderson static int open_cpuinfo(CPUArchState *cpu_env, int fd)
97*121c8dd6SRichard Henderson {
98*121c8dd6SRichard Henderson     int num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
99*121c8dd6SRichard Henderson     int i;
100*121c8dd6SRichard Henderson 
101*121c8dd6SRichard Henderson     show_cpu_summary(cpu_env, fd);
102*121c8dd6SRichard Henderson     for (i = 0; i < num_cpus; i++) {
103*121c8dd6SRichard Henderson         show_cpuinfo(cpu_env, fd, i);
104*121c8dd6SRichard Henderson     }
105*121c8dd6SRichard Henderson     return 0;
106*121c8dd6SRichard Henderson }
107*121c8dd6SRichard Henderson #define HAVE_ARCH_PROC_CPUINFO
108*121c8dd6SRichard Henderson 
109*121c8dd6SRichard Henderson #endif /* S390X_TARGET_PROC_H */
110