xref: /kvm-unit-tests/lib/s390x/smp.h (revision 1dac4f3ccae66b787fe32f3f3d0a5c10892ee54f)
16c9f99dfSJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */
2f77c0515SJanosch Frank /*
3f77c0515SJanosch Frank  * s390x smp
4f77c0515SJanosch Frank  *
5f77c0515SJanosch Frank  * Copyright (c) 2019 IBM Corp
6f77c0515SJanosch Frank  *
7f77c0515SJanosch Frank  * Authors:
8f77c0515SJanosch Frank  *  Janosch Frank <frankja@linux.ibm.com>
9f77c0515SJanosch Frank  */
10eb5a1bbaSCornelia Huck #ifndef _S390X_SMP_H_
11eb5a1bbaSCornelia Huck #define _S390X_SMP_H_
12f77c0515SJanosch Frank 
13f77c0515SJanosch Frank #include <asm/arch_def.h>
14f77c0515SJanosch Frank 
15f77c0515SJanosch Frank struct cpu {
16f77c0515SJanosch Frank 	struct lowcore *lowcore;
17f77c0515SJanosch Frank 	uint64_t *stack;
18f77c0515SJanosch Frank 	uint16_t addr;
19f77c0515SJanosch Frank 	bool active;
20f77c0515SJanosch Frank };
21f77c0515SJanosch Frank 
22f77c0515SJanosch Frank struct cpu_status {
23f77c0515SJanosch Frank     uint64_t    fprs[16];                       /* 0x0000 */
24f77c0515SJanosch Frank     uint64_t    grs[16];                        /* 0x0080 */
25f77c0515SJanosch Frank     struct psw  psw;                            /* 0x0100 */
26f77c0515SJanosch Frank     uint8_t     pad_0x0110[0x0118 - 0x0110];    /* 0x0110 */
27f77c0515SJanosch Frank     uint32_t    prefix;                         /* 0x0118 */
28f77c0515SJanosch Frank     uint32_t    fpc;                            /* 0x011c */
29f77c0515SJanosch Frank     uint8_t     pad_0x0120[0x0124 - 0x0120];    /* 0x0120 */
30f77c0515SJanosch Frank     uint32_t    todpr;                          /* 0x0124 */
31f77c0515SJanosch Frank     uint64_t    cputm;                          /* 0x0128 */
32f77c0515SJanosch Frank     uint64_t    ckc;                            /* 0x0130 */
33f77c0515SJanosch Frank     uint8_t     pad_0x0138[0x0140 - 0x0138];    /* 0x0138 */
34f77c0515SJanosch Frank     uint32_t    ars[16];                        /* 0x0140 */
35f77c0515SJanosch Frank     uint64_t    crs[16];                        /* 0x0384 */
36f77c0515SJanosch Frank };
37f77c0515SJanosch Frank 
38f77c0515SJanosch Frank int smp_query_num_cpus(void);
39f77c0515SJanosch Frank struct cpu *smp_cpu_from_addr(uint16_t addr);
409e1e188cSClaudio Imbrenda struct cpu *smp_cpu_from_idx(uint16_t idx);
419e1e188cSClaudio Imbrenda uint16_t smp_cpu_addr(uint16_t idx);
429e1e188cSClaudio Imbrenda bool smp_cpu_stopped(uint16_t idx);
439e1e188cSClaudio Imbrenda bool smp_sense_running_status(uint16_t idx);
449e1e188cSClaudio Imbrenda int smp_cpu_restart(uint16_t idx);
459e1e188cSClaudio Imbrenda int smp_cpu_start(uint16_t idx, struct psw psw);
469e1e188cSClaudio Imbrenda int smp_cpu_stop(uint16_t idx);
47*1dac4f3cSEric Farman int smp_cpu_stop_nowait(uint16_t idx);
489e1e188cSClaudio Imbrenda int smp_cpu_stop_store_status(uint16_t idx);
499e1e188cSClaudio Imbrenda int smp_cpu_destroy(uint16_t idx);
509e1e188cSClaudio Imbrenda int smp_cpu_setup(uint16_t idx, struct psw psw);
51f77c0515SJanosch Frank void smp_teardown(void);
52f77c0515SJanosch Frank void smp_setup(void);
539e1e188cSClaudio Imbrenda int smp_sigp(uint16_t idx, uint8_t order, unsigned long parm, uint32_t *status);
549e1e188cSClaudio Imbrenda int smp_sigp_retry(uint16_t idx, uint8_t order, unsigned long parm, uint32_t *status);
55f77c0515SJanosch Frank 
56f77c0515SJanosch Frank #endif
57