xref: /qemu/target/s390x/gdbstub.c (revision d9a4282c4b690e45d25c2b933f318bb41eeb271d)
1cfae5c90SAndreas Färber /*
2cfae5c90SAndreas Färber  * s390x gdb server stub
3cfae5c90SAndreas Färber  *
4cfae5c90SAndreas Färber  * Copyright (c) 2003-2005 Fabrice Bellard
5cfae5c90SAndreas Färber  * Copyright (c) 2013 SUSE LINUX Products GmbH
6cfae5c90SAndreas Färber  *
7cfae5c90SAndreas Färber  * This library is free software; you can redistribute it and/or
8cfae5c90SAndreas Färber  * modify it under the terms of the GNU Lesser General Public
9cfae5c90SAndreas Färber  * License as published by the Free Software Foundation; either
1041c6a6ddSThomas Huth  * version 2.1 of the License, or (at your option) any later version.
11cfae5c90SAndreas Färber  *
12cfae5c90SAndreas Färber  * This library is distributed in the hope that it will be useful,
13cfae5c90SAndreas Färber  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cfae5c90SAndreas Färber  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cfae5c90SAndreas Färber  * Lesser General Public License for more details.
16cfae5c90SAndreas Färber  *
17cfae5c90SAndreas Färber  * You should have received a copy of the GNU Lesser General Public
18cfae5c90SAndreas Färber  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19cfae5c90SAndreas Färber  */
2014a48c1dSMarkus Armbruster 
219615495aSPeter Maydell #include "qemu/osdep.h"
2233c11879SPaolo Bonzini #include "cpu.h"
23b6b47223SCho, Yu-Chen #include "s390x-internal.h"
24*6ff5da16SPhilippe Mathieu-Daudé #include "exec/cputlb.h"
255b50e790SAndreas Färber #include "exec/gdbstub.h"
264ea5fe99SAlex Bennée #include "gdbstub/helpers.h"
275b50e790SAndreas Färber #include "qemu/bitops.h"
2832cad1ffSPhilippe Mathieu-Daudé #include "system/hw_accel.h"
2932cad1ffSPhilippe Mathieu-Daudé #include "system/tcg.h"
30cfae5c90SAndreas Färber 
s390_cpu_gdb_read_register(CPUState * cs,GByteArray * mem_buf,int n)31a010bdbeSAlex Bennée int s390_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
32cfae5c90SAndreas Färber {
33d0143fa9SPhilippe Mathieu-Daudé     CPUS390XState *env = cpu_env(cs);
34cfae5c90SAndreas Färber 
35cfae5c90SAndreas Färber     switch (n) {
36cfae5c90SAndreas Färber     case S390_PSWM_REGNUM:
37deb60cc7SRichard Henderson         return gdb_get_regl(mem_buf, s390_cpu_get_psw_mask(env));
38cfae5c90SAndreas Färber     case S390_PSWA_REGNUM:
39986a2998SAndreas Färber         return gdb_get_regl(mem_buf, env->psw.addr);
40cfae5c90SAndreas Färber     case S390_R0_REGNUM ... S390_R15_REGNUM:
41986a2998SAndreas Färber         return gdb_get_regl(mem_buf, env->regs[n - S390_R0_REGNUM]);
42cfae5c90SAndreas Färber     }
43cfae5c90SAndreas Färber     return 0;
44cfae5c90SAndreas Färber }
45cfae5c90SAndreas Färber 
s390_cpu_gdb_write_register(CPUState * cs,uint8_t * mem_buf,int n)465b50e790SAndreas Färber int s390_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
47cfae5c90SAndreas Färber {
48d0143fa9SPhilippe Mathieu-Daudé     CPUS390XState *env = cpu_env(cs);
491d94eafdSPhilippe Mathieu-Daudé     target_ulong tmpl = ldq_be_p(mem_buf);
50cfae5c90SAndreas Färber 
51cfae5c90SAndreas Färber     switch (n) {
52cfae5c90SAndreas Färber     case S390_PSWM_REGNUM:
53deb60cc7SRichard Henderson         s390_cpu_set_psw(env, tmpl, env->psw.addr);
54cfae5c90SAndreas Färber         break;
55cfae5c90SAndreas Färber     case S390_PSWA_REGNUM:
56cfae5c90SAndreas Färber         env->psw.addr = tmpl;
57cfae5c90SAndreas Färber         break;
58cfae5c90SAndreas Färber     case S390_R0_REGNUM ... S390_R15_REGNUM:
59cfae5c90SAndreas Färber         env->regs[n - S390_R0_REGNUM] = tmpl;
60cfae5c90SAndreas Färber         break;
61cfae5c90SAndreas Färber     default:
62cfae5c90SAndreas Färber         return 0;
63cfae5c90SAndreas Färber     }
6473d510c9SDavid Hildenbrand     return 8;
6573d510c9SDavid Hildenbrand }
6673d510c9SDavid Hildenbrand 
6773d510c9SDavid Hildenbrand /* the values represent the positions in s390-acr.xml */
6873d510c9SDavid Hildenbrand #define S390_A0_REGNUM 0
6973d510c9SDavid Hildenbrand #define S390_A15_REGNUM 15
7073d510c9SDavid Hildenbrand 
cpu_read_ac_reg(CPUState * cs,GByteArray * buf,int n)7166260159SAkihiko Odaki static int cpu_read_ac_reg(CPUState *cs, GByteArray *buf, int n)
7273d510c9SDavid Hildenbrand {
7366260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
7466260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
7566260159SAkihiko Odaki 
7673d510c9SDavid Hildenbrand     switch (n) {
7773d510c9SDavid Hildenbrand     case S390_A0_REGNUM ... S390_A15_REGNUM:
78a010bdbeSAlex Bennée         return gdb_get_reg32(buf, env->aregs[n]);
7973d510c9SDavid Hildenbrand     default:
8073d510c9SDavid Hildenbrand         return 0;
8173d510c9SDavid Hildenbrand     }
8273d510c9SDavid Hildenbrand }
8373d510c9SDavid Hildenbrand 
cpu_write_ac_reg(CPUState * cs,uint8_t * mem_buf,int n)8466260159SAkihiko Odaki static int cpu_write_ac_reg(CPUState *cs, uint8_t *mem_buf, int n)
8573d510c9SDavid Hildenbrand {
8666260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
8766260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
8866260159SAkihiko Odaki 
8973d510c9SDavid Hildenbrand     switch (n) {
9073d510c9SDavid Hildenbrand     case S390_A0_REGNUM ... S390_A15_REGNUM:
911d94eafdSPhilippe Mathieu-Daudé         env->aregs[n] = ldl_be_p(mem_buf);
9229a0af61SRichard Henderson         cpu_synchronize_post_init(env_cpu(env));
9373d510c9SDavid Hildenbrand         return 4;
9473d510c9SDavid Hildenbrand     default:
9573d510c9SDavid Hildenbrand         return 0;
9673d510c9SDavid Hildenbrand     }
9773d510c9SDavid Hildenbrand }
9873d510c9SDavid Hildenbrand 
9973d510c9SDavid Hildenbrand /* the values represent the positions in s390-fpr.xml */
10073d510c9SDavid Hildenbrand #define S390_FPC_REGNUM 0
10173d510c9SDavid Hildenbrand #define S390_F0_REGNUM 1
10273d510c9SDavid Hildenbrand #define S390_F15_REGNUM 16
10373d510c9SDavid Hildenbrand 
cpu_read_fp_reg(CPUState * cs,GByteArray * buf,int n)10466260159SAkihiko Odaki static int cpu_read_fp_reg(CPUState *cs, GByteArray *buf, int n)
10573d510c9SDavid Hildenbrand {
10666260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
10766260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
10866260159SAkihiko Odaki 
10973d510c9SDavid Hildenbrand     switch (n) {
11073d510c9SDavid Hildenbrand     case S390_FPC_REGNUM:
111a010bdbeSAlex Bennée         return gdb_get_reg32(buf, env->fpc);
11273d510c9SDavid Hildenbrand     case S390_F0_REGNUM ... S390_F15_REGNUM:
113a010bdbeSAlex Bennée         return gdb_get_reg64(buf, *get_freg(env, n - S390_F0_REGNUM));
11473d510c9SDavid Hildenbrand     default:
11573d510c9SDavid Hildenbrand         return 0;
11673d510c9SDavid Hildenbrand     }
11773d510c9SDavid Hildenbrand }
11873d510c9SDavid Hildenbrand 
cpu_write_fp_reg(CPUState * cs,uint8_t * mem_buf,int n)11966260159SAkihiko Odaki static int cpu_write_fp_reg(CPUState *cs, uint8_t *mem_buf, int n)
12073d510c9SDavid Hildenbrand {
12166260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
12266260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
12366260159SAkihiko Odaki 
12473d510c9SDavid Hildenbrand     switch (n) {
12573d510c9SDavid Hildenbrand     case S390_FPC_REGNUM:
1261d94eafdSPhilippe Mathieu-Daudé         env->fpc = ldl_be_p(mem_buf);
12773d510c9SDavid Hildenbrand         return 4;
12873d510c9SDavid Hildenbrand     case S390_F0_REGNUM ... S390_F15_REGNUM:
1291d94eafdSPhilippe Mathieu-Daudé         *get_freg(env, n - S390_F0_REGNUM) = ldq_be_p(mem_buf);
13073d510c9SDavid Hildenbrand         return 8;
13173d510c9SDavid Hildenbrand     default:
13273d510c9SDavid Hildenbrand         return 0;
13373d510c9SDavid Hildenbrand     }
13473d510c9SDavid Hildenbrand }
13573d510c9SDavid Hildenbrand 
136ca343c7aSEric Farman /* the values represent the positions in s390-vx.xml */
137ca343c7aSEric Farman #define S390_V0L_REGNUM 0
138ca343c7aSEric Farman #define S390_V15L_REGNUM 15
139ca343c7aSEric Farman #define S390_V16_REGNUM 16
140ca343c7aSEric Farman #define S390_V31_REGNUM 31
141ca343c7aSEric Farman 
cpu_read_vreg(CPUState * cs,GByteArray * buf,int n)14266260159SAkihiko Odaki static int cpu_read_vreg(CPUState *cs, GByteArray *buf, int n)
143ca343c7aSEric Farman {
14466260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
14566260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
146ca343c7aSEric Farman     int ret;
147ca343c7aSEric Farman 
148ca343c7aSEric Farman     switch (n) {
149ca343c7aSEric Farman     case S390_V0L_REGNUM ... S390_V15L_REGNUM:
150a010bdbeSAlex Bennée         ret = gdb_get_reg64(buf, env->vregs[n][1]);
151ca343c7aSEric Farman         break;
152ca343c7aSEric Farman     case S390_V16_REGNUM ... S390_V31_REGNUM:
153a010bdbeSAlex Bennée         ret = gdb_get_reg64(buf, env->vregs[n][0]);
154a010bdbeSAlex Bennée         ret += gdb_get_reg64(buf, env->vregs[n][1]);
155ca343c7aSEric Farman         break;
156ca343c7aSEric Farman     default:
157ca343c7aSEric Farman         ret = 0;
158ca343c7aSEric Farman     }
159ca343c7aSEric Farman 
160ca343c7aSEric Farman     return ret;
161ca343c7aSEric Farman }
162ca343c7aSEric Farman 
cpu_write_vreg(CPUState * cs,uint8_t * mem_buf,int n)16366260159SAkihiko Odaki static int cpu_write_vreg(CPUState *cs, uint8_t *mem_buf, int n)
164ca343c7aSEric Farman {
16566260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
16666260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
16766260159SAkihiko Odaki 
168ca343c7aSEric Farman     switch (n) {
169ca343c7aSEric Farman     case S390_V0L_REGNUM ... S390_V15L_REGNUM:
1701d94eafdSPhilippe Mathieu-Daudé         env->vregs[n][1] = ldq_be_p(mem_buf + 8);
171ca343c7aSEric Farman         return 8;
172ca343c7aSEric Farman     case S390_V16_REGNUM ... S390_V31_REGNUM:
1731d94eafdSPhilippe Mathieu-Daudé         env->vregs[n][0] = ldq_be_p(mem_buf);
1741d94eafdSPhilippe Mathieu-Daudé         env->vregs[n][1] = ldq_be_p(mem_buf + 8);
175ca343c7aSEric Farman         return 16;
176ca343c7aSEric Farman     default:
177ca343c7aSEric Farman         return 0;
178ca343c7aSEric Farman     }
179ca343c7aSEric Farman }
180ca343c7aSEric Farman 
1815b9f6345SDavid Hildenbrand /* the values represent the positions in s390-cr.xml */
1825b9f6345SDavid Hildenbrand #define S390_C0_REGNUM 0
1835b9f6345SDavid Hildenbrand #define S390_C15_REGNUM 15
1845b9f6345SDavid Hildenbrand 
1855b9f6345SDavid Hildenbrand #ifndef CONFIG_USER_ONLY
cpu_read_c_reg(CPUState * cs,GByteArray * buf,int n)18666260159SAkihiko Odaki static int cpu_read_c_reg(CPUState *cs, GByteArray *buf, int n)
1875b9f6345SDavid Hildenbrand {
18866260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
18966260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
19066260159SAkihiko Odaki 
1915b9f6345SDavid Hildenbrand     switch (n) {
1925b9f6345SDavid Hildenbrand     case S390_C0_REGNUM ... S390_C15_REGNUM:
193a010bdbeSAlex Bennée         return gdb_get_regl(buf, env->cregs[n]);
1945b9f6345SDavid Hildenbrand     default:
1955b9f6345SDavid Hildenbrand         return 0;
1965b9f6345SDavid Hildenbrand     }
1975b9f6345SDavid Hildenbrand }
1985b9f6345SDavid Hildenbrand 
cpu_write_c_reg(CPUState * cs,uint8_t * mem_buf,int n)19966260159SAkihiko Odaki static int cpu_write_c_reg(CPUState *cs, uint8_t *mem_buf, int n)
2005b9f6345SDavid Hildenbrand {
20166260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
20266260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
20366260159SAkihiko Odaki 
2045b9f6345SDavid Hildenbrand     switch (n) {
2055b9f6345SDavid Hildenbrand     case S390_C0_REGNUM ... S390_C15_REGNUM:
2061d94eafdSPhilippe Mathieu-Daudé         env->cregs[n] = ldq_be_p(mem_buf);
2075b9f6345SDavid Hildenbrand         if (tcg_enabled()) {
20829a0af61SRichard Henderson             tlb_flush(env_cpu(env));
2095b9f6345SDavid Hildenbrand         }
21029a0af61SRichard Henderson         cpu_synchronize_post_init(env_cpu(env));
2115b9f6345SDavid Hildenbrand         return 8;
2125b9f6345SDavid Hildenbrand     default:
2135b9f6345SDavid Hildenbrand         return 0;
2145b9f6345SDavid Hildenbrand     }
2155b9f6345SDavid Hildenbrand }
2168a641ff6SDavid Hildenbrand 
2178a641ff6SDavid Hildenbrand /* the values represent the positions in s390-virt.xml */
2188a641ff6SDavid Hildenbrand #define S390_VIRT_CKC_REGNUM    0
2198a641ff6SDavid Hildenbrand #define S390_VIRT_CPUTM_REGNUM  1
2208a641ff6SDavid Hildenbrand #define S390_VIRT_BEA_REGNUM    2
2218a641ff6SDavid Hildenbrand #define S390_VIRT_PREFIX_REGNUM 3
2228a641ff6SDavid Hildenbrand 
cpu_read_virt_reg(CPUState * cs,GByteArray * mem_buf,int n)22366260159SAkihiko Odaki static int cpu_read_virt_reg(CPUState *cs, GByteArray *mem_buf, int n)
2248a641ff6SDavid Hildenbrand {
22566260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
22666260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
22766260159SAkihiko Odaki 
2288a641ff6SDavid Hildenbrand     switch (n) {
2298a641ff6SDavid Hildenbrand     case S390_VIRT_CKC_REGNUM:
2308a641ff6SDavid Hildenbrand         return gdb_get_regl(mem_buf, env->ckc);
2318a641ff6SDavid Hildenbrand     case S390_VIRT_CPUTM_REGNUM:
2328a641ff6SDavid Hildenbrand         return gdb_get_regl(mem_buf, env->cputm);
2338a641ff6SDavid Hildenbrand     case S390_VIRT_BEA_REGNUM:
2348a641ff6SDavid Hildenbrand         return gdb_get_regl(mem_buf, env->gbea);
2358a641ff6SDavid Hildenbrand     case S390_VIRT_PREFIX_REGNUM:
2368a641ff6SDavid Hildenbrand         return gdb_get_regl(mem_buf, env->psa);
2378a641ff6SDavid Hildenbrand     default:
2388a641ff6SDavid Hildenbrand         return 0;
2398a641ff6SDavid Hildenbrand     }
2408a641ff6SDavid Hildenbrand }
2418a641ff6SDavid Hildenbrand 
cpu_write_virt_reg(CPUState * cs,uint8_t * mem_buf,int n)24266260159SAkihiko Odaki static int cpu_write_virt_reg(CPUState *cs, uint8_t *mem_buf, int n)
2438a641ff6SDavid Hildenbrand {
24466260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
24566260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
24666260159SAkihiko Odaki 
2478a641ff6SDavid Hildenbrand     switch (n) {
2488a641ff6SDavid Hildenbrand     case S390_VIRT_CKC_REGNUM:
2491d94eafdSPhilippe Mathieu-Daudé         env->ckc = ldq_be_p(mem_buf);
25066260159SAkihiko Odaki         cpu_synchronize_post_init(cs);
2518a641ff6SDavid Hildenbrand         return 8;
2528a641ff6SDavid Hildenbrand     case S390_VIRT_CPUTM_REGNUM:
2531d94eafdSPhilippe Mathieu-Daudé         env->cputm = ldq_be_p(mem_buf);
25466260159SAkihiko Odaki         cpu_synchronize_post_init(cs);
2558a641ff6SDavid Hildenbrand         return 8;
2568a641ff6SDavid Hildenbrand     case S390_VIRT_BEA_REGNUM:
2571d94eafdSPhilippe Mathieu-Daudé         env->gbea = ldq_be_p(mem_buf);
25866260159SAkihiko Odaki         cpu_synchronize_post_init(cs);
2598a641ff6SDavid Hildenbrand         return 8;
2608a641ff6SDavid Hildenbrand     case S390_VIRT_PREFIX_REGNUM:
2611d94eafdSPhilippe Mathieu-Daudé         env->psa = ldq_be_p(mem_buf);
26266260159SAkihiko Odaki         cpu_synchronize_post_init(cs);
2638a641ff6SDavid Hildenbrand         return 8;
2648afc43eaSIlya Leoshkevich     default:
2658afc43eaSIlya Leoshkevich         return 0;
2668afc43eaSIlya Leoshkevich     }
2678afc43eaSIlya Leoshkevich }
2688afc43eaSIlya Leoshkevich 
2698afc43eaSIlya Leoshkevich /* the values represent the positions in s390-virt-kvm.xml */
2708afc43eaSIlya Leoshkevich #define S390_VIRT_KVM_PP_REGNUM     0
2718afc43eaSIlya Leoshkevich #define S390_VIRT_KVM_PFT_REGNUM    1
2728afc43eaSIlya Leoshkevich #define S390_VIRT_KVM_PFS_REGNUM    2
2738afc43eaSIlya Leoshkevich #define S390_VIRT_KVM_PFC_REGNUM    3
2748afc43eaSIlya Leoshkevich 
cpu_read_virt_kvm_reg(CPUState * cs,GByteArray * mem_buf,int n)27566260159SAkihiko Odaki static int cpu_read_virt_kvm_reg(CPUState *cs, GByteArray *mem_buf, int n)
2768afc43eaSIlya Leoshkevich {
27766260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
27866260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
27966260159SAkihiko Odaki 
2808afc43eaSIlya Leoshkevich     switch (n) {
2818afc43eaSIlya Leoshkevich     case S390_VIRT_KVM_PP_REGNUM:
2828afc43eaSIlya Leoshkevich         return gdb_get_regl(mem_buf, env->pp);
2838afc43eaSIlya Leoshkevich     case S390_VIRT_KVM_PFT_REGNUM:
2848afc43eaSIlya Leoshkevich         return gdb_get_regl(mem_buf, env->pfault_token);
2858afc43eaSIlya Leoshkevich     case S390_VIRT_KVM_PFS_REGNUM:
2868afc43eaSIlya Leoshkevich         return gdb_get_regl(mem_buf, env->pfault_select);
2878afc43eaSIlya Leoshkevich     case S390_VIRT_KVM_PFC_REGNUM:
2888afc43eaSIlya Leoshkevich         return gdb_get_regl(mem_buf, env->pfault_compare);
2898afc43eaSIlya Leoshkevich     default:
2908afc43eaSIlya Leoshkevich         return 0;
2918afc43eaSIlya Leoshkevich     }
2928afc43eaSIlya Leoshkevich }
2938afc43eaSIlya Leoshkevich 
cpu_write_virt_kvm_reg(CPUState * cs,uint8_t * mem_buf,int n)29466260159SAkihiko Odaki static int cpu_write_virt_kvm_reg(CPUState *cs, uint8_t *mem_buf, int n)
2958afc43eaSIlya Leoshkevich {
29666260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
29766260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
29866260159SAkihiko Odaki 
2998afc43eaSIlya Leoshkevich     switch (n) {
3008afc43eaSIlya Leoshkevich     case S390_VIRT_KVM_PP_REGNUM:
3011d94eafdSPhilippe Mathieu-Daudé         env->pp = ldq_be_p(mem_buf);
30229a0af61SRichard Henderson         cpu_synchronize_post_init(env_cpu(env));
3038a641ff6SDavid Hildenbrand         return 8;
3048afc43eaSIlya Leoshkevich     case S390_VIRT_KVM_PFT_REGNUM:
3051d94eafdSPhilippe Mathieu-Daudé         env->pfault_token = ldq_be_p(mem_buf);
30629a0af61SRichard Henderson         cpu_synchronize_post_init(env_cpu(env));
3078a641ff6SDavid Hildenbrand         return 8;
3088afc43eaSIlya Leoshkevich     case S390_VIRT_KVM_PFS_REGNUM:
3091d94eafdSPhilippe Mathieu-Daudé         env->pfault_select = ldq_be_p(mem_buf);
31029a0af61SRichard Henderson         cpu_synchronize_post_init(env_cpu(env));
3118a641ff6SDavid Hildenbrand         return 8;
3128afc43eaSIlya Leoshkevich     case S390_VIRT_KVM_PFC_REGNUM:
3131d94eafdSPhilippe Mathieu-Daudé         env->pfault_compare = ldq_be_p(mem_buf);
31429a0af61SRichard Henderson         cpu_synchronize_post_init(env_cpu(env));
3158a641ff6SDavid Hildenbrand         return 8;
3168a641ff6SDavid Hildenbrand     default:
3178a641ff6SDavid Hildenbrand         return 0;
3188a641ff6SDavid Hildenbrand     }
3198a641ff6SDavid Hildenbrand }
3205b9f6345SDavid Hildenbrand #endif
3215b9f6345SDavid Hildenbrand 
32286158a2aSChristian Borntraeger /* the values represent the positions in s390-gs.xml */
32386158a2aSChristian Borntraeger #define S390_GS_RESERVED_REGNUM 0
32486158a2aSChristian Borntraeger #define S390_GS_GSD_REGNUM      1
32586158a2aSChristian Borntraeger #define S390_GS_GSSM_REGNUM     2
32686158a2aSChristian Borntraeger #define S390_GS_GSEPLA_REGNUM   3
32786158a2aSChristian Borntraeger 
cpu_read_gs_reg(CPUState * cs,GByteArray * buf,int n)32866260159SAkihiko Odaki static int cpu_read_gs_reg(CPUState *cs, GByteArray *buf, int n)
32986158a2aSChristian Borntraeger {
33066260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
33166260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
33266260159SAkihiko Odaki 
333a010bdbeSAlex Bennée     return gdb_get_regl(buf, env->gscb[n]);
33486158a2aSChristian Borntraeger }
33586158a2aSChristian Borntraeger 
cpu_write_gs_reg(CPUState * cs,uint8_t * mem_buf,int n)33666260159SAkihiko Odaki static int cpu_write_gs_reg(CPUState *cs, uint8_t *mem_buf, int n)
33786158a2aSChristian Borntraeger {
33866260159SAkihiko Odaki     S390CPU *cpu = S390_CPU(cs);
33966260159SAkihiko Odaki     CPUS390XState *env = &cpu->env;
34066260159SAkihiko Odaki 
3411d94eafdSPhilippe Mathieu-Daudé     env->gscb[n] = ldq_be_p(mem_buf);
34229a0af61SRichard Henderson     cpu_synchronize_post_init(env_cpu(env));
34386158a2aSChristian Borntraeger     return 8;
34486158a2aSChristian Borntraeger }
34586158a2aSChristian Borntraeger 
s390_cpu_gdb_init(CPUState * cs)34673d510c9SDavid Hildenbrand void s390_cpu_gdb_init(CPUState *cs)
34773d510c9SDavid Hildenbrand {
34873d510c9SDavid Hildenbrand     gdb_register_coprocessor(cs, cpu_read_ac_reg,
34973d510c9SDavid Hildenbrand                              cpu_write_ac_reg,
350ac1e8671SAkihiko Odaki                              gdb_find_static_feature("s390-acr.xml"), 0);
35173d510c9SDavid Hildenbrand 
35273d510c9SDavid Hildenbrand     gdb_register_coprocessor(cs, cpu_read_fp_reg,
35373d510c9SDavid Hildenbrand                              cpu_write_fp_reg,
354ac1e8671SAkihiko Odaki                              gdb_find_static_feature("s390-fpr.xml"), 0);
355ca343c7aSEric Farman 
356ca343c7aSEric Farman     gdb_register_coprocessor(cs, cpu_read_vreg,
357ca343c7aSEric Farman                              cpu_write_vreg,
358ac1e8671SAkihiko Odaki                              gdb_find_static_feature("s390-vx.xml"), 0);
3595b9f6345SDavid Hildenbrand 
36086158a2aSChristian Borntraeger     gdb_register_coprocessor(cs, cpu_read_gs_reg,
36186158a2aSChristian Borntraeger                              cpu_write_gs_reg,
362ac1e8671SAkihiko Odaki                              gdb_find_static_feature("s390-gs.xml"), 0);
36386158a2aSChristian Borntraeger 
3645b9f6345SDavid Hildenbrand #ifndef CONFIG_USER_ONLY
3655b9f6345SDavid Hildenbrand     gdb_register_coprocessor(cs, cpu_read_c_reg,
3665b9f6345SDavid Hildenbrand                              cpu_write_c_reg,
367ac1e8671SAkihiko Odaki                              gdb_find_static_feature("s390-cr.xml"), 0);
3688a641ff6SDavid Hildenbrand 
3698a641ff6SDavid Hildenbrand     gdb_register_coprocessor(cs, cpu_read_virt_reg,
3708a641ff6SDavid Hildenbrand                              cpu_write_virt_reg,
371ac1e8671SAkihiko Odaki                              gdb_find_static_feature("s390-virt.xml"), 0);
3728afc43eaSIlya Leoshkevich 
3738afc43eaSIlya Leoshkevich     if (kvm_enabled()) {
3748afc43eaSIlya Leoshkevich         gdb_register_coprocessor(cs, cpu_read_virt_kvm_reg,
3758afc43eaSIlya Leoshkevich                                  cpu_write_virt_kvm_reg,
376ac1e8671SAkihiko Odaki                                  gdb_find_static_feature("s390-virt-kvm.xml"),
3778afc43eaSIlya Leoshkevich                                  0);
3788a641ff6SDavid Hildenbrand     }
3795b9f6345SDavid Hildenbrand #endif
380cfae5c90SAndreas Färber }
381