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" 2463c91552SPaolo Bonzini #include "exec/exec-all.h" 255b50e790SAndreas Färber #include "exec/gdbstub.h" 264ea5fe99SAlex Bennée #include "gdbstub/helpers.h" 275b50e790SAndreas Färber #include "qemu/bitops.h" 28b3946626SVincent Palatin #include "sysemu/hw_accel.h" 2914a48c1dSMarkus Armbruster #include "sysemu/tcg.h" 30cfae5c90SAndreas Färber 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 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); 49*1d94eafdSPhilippe 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 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 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: 91*1d94eafdSPhilippe 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 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 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: 126*1d94eafdSPhilippe Mathieu-Daudé env->fpc = ldl_be_p(mem_buf); 12773d510c9SDavid Hildenbrand return 4; 12873d510c9SDavid Hildenbrand case S390_F0_REGNUM ... S390_F15_REGNUM: 129*1d94eafdSPhilippe 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 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 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: 170*1d94eafdSPhilippe 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: 173*1d94eafdSPhilippe Mathieu-Daudé env->vregs[n][0] = ldq_be_p(mem_buf); 174*1d94eafdSPhilippe 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 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 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: 206*1d94eafdSPhilippe 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 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 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: 249*1d94eafdSPhilippe 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: 253*1d94eafdSPhilippe 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: 257*1d94eafdSPhilippe 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: 261*1d94eafdSPhilippe 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 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 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: 301*1d94eafdSPhilippe 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: 305*1d94eafdSPhilippe 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: 309*1d94eafdSPhilippe 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: 313*1d94eafdSPhilippe 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 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 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 341*1d94eafdSPhilippe 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 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