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 */ 20*14a48c1dSMarkus Armbruster 219615495aSPeter Maydell #include "qemu/osdep.h" 2233c11879SPaolo Bonzini #include "cpu.h" 234e58b838SDavid Hildenbrand #include "internal.h" 2463c91552SPaolo Bonzini #include "exec/exec-all.h" 255b50e790SAndreas Färber #include "exec/gdbstub.h" 265b50e790SAndreas Färber #include "qemu/bitops.h" 27b3946626SVincent Palatin #include "sysemu/hw_accel.h" 28*14a48c1dSMarkus Armbruster #include "sysemu/tcg.h" 29cfae5c90SAndreas Färber 305b50e790SAndreas Färber int s390_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) 31cfae5c90SAndreas Färber { 325b50e790SAndreas Färber S390CPU *cpu = S390_CPU(cs); 335b50e790SAndreas Färber CPUS390XState *env = &cpu->env; 34cfae5c90SAndreas Färber uint64_t val; 35cfae5c90SAndreas Färber int cc_op; 36cfae5c90SAndreas Färber 37cfae5c90SAndreas Färber switch (n) { 38cfae5c90SAndreas Färber case S390_PSWM_REGNUM: 3997fa52f0SDavid Hildenbrand if (tcg_enabled()) { 4097fa52f0SDavid Hildenbrand cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, 4197fa52f0SDavid Hildenbrand env->cc_vr); 42cfae5c90SAndreas Färber val = deposit64(env->psw.mask, 44, 2, cc_op); 43986a2998SAndreas Färber return gdb_get_regl(mem_buf, val); 4497fa52f0SDavid Hildenbrand } 4597fa52f0SDavid Hildenbrand return gdb_get_regl(mem_buf, env->psw.mask); 46cfae5c90SAndreas Färber case S390_PSWA_REGNUM: 47986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->psw.addr); 48cfae5c90SAndreas Färber case S390_R0_REGNUM ... S390_R15_REGNUM: 49986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->regs[n - S390_R0_REGNUM]); 50cfae5c90SAndreas Färber } 51cfae5c90SAndreas Färber return 0; 52cfae5c90SAndreas Färber } 53cfae5c90SAndreas Färber 545b50e790SAndreas Färber int s390_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 55cfae5c90SAndreas Färber { 565b50e790SAndreas Färber S390CPU *cpu = S390_CPU(cs); 575b50e790SAndreas Färber CPUS390XState *env = &cpu->env; 5873d510c9SDavid Hildenbrand target_ulong tmpl = ldtul_p(mem_buf); 59cfae5c90SAndreas Färber 60cfae5c90SAndreas Färber switch (n) { 61cfae5c90SAndreas Färber case S390_PSWM_REGNUM: 62cfae5c90SAndreas Färber env->psw.mask = tmpl; 6397fa52f0SDavid Hildenbrand if (tcg_enabled()) { 64cfae5c90SAndreas Färber env->cc_op = extract64(tmpl, 44, 2); 6597fa52f0SDavid Hildenbrand } 66cfae5c90SAndreas Färber break; 67cfae5c90SAndreas Färber case S390_PSWA_REGNUM: 68cfae5c90SAndreas Färber env->psw.addr = tmpl; 69cfae5c90SAndreas Färber break; 70cfae5c90SAndreas Färber case S390_R0_REGNUM ... S390_R15_REGNUM: 71cfae5c90SAndreas Färber env->regs[n - S390_R0_REGNUM] = tmpl; 72cfae5c90SAndreas Färber break; 73cfae5c90SAndreas Färber default: 74cfae5c90SAndreas Färber return 0; 75cfae5c90SAndreas Färber } 7673d510c9SDavid Hildenbrand return 8; 7773d510c9SDavid Hildenbrand } 7873d510c9SDavid Hildenbrand 7973d510c9SDavid Hildenbrand /* the values represent the positions in s390-acr.xml */ 8073d510c9SDavid Hildenbrand #define S390_A0_REGNUM 0 8173d510c9SDavid Hildenbrand #define S390_A15_REGNUM 15 8273d510c9SDavid Hildenbrand /* total number of registers in s390-acr.xml */ 8373d510c9SDavid Hildenbrand #define S390_NUM_AC_REGS 16 8473d510c9SDavid Hildenbrand 8573d510c9SDavid Hildenbrand static int cpu_read_ac_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 8673d510c9SDavid Hildenbrand { 8773d510c9SDavid Hildenbrand switch (n) { 8873d510c9SDavid Hildenbrand case S390_A0_REGNUM ... S390_A15_REGNUM: 8973d510c9SDavid Hildenbrand return gdb_get_reg32(mem_buf, env->aregs[n]); 9073d510c9SDavid Hildenbrand default: 9173d510c9SDavid Hildenbrand return 0; 9273d510c9SDavid Hildenbrand } 9373d510c9SDavid Hildenbrand } 9473d510c9SDavid Hildenbrand 9573d510c9SDavid Hildenbrand static int cpu_write_ac_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 9673d510c9SDavid Hildenbrand { 9773d510c9SDavid Hildenbrand switch (n) { 9873d510c9SDavid Hildenbrand case S390_A0_REGNUM ... S390_A15_REGNUM: 9973d510c9SDavid Hildenbrand env->aregs[n] = ldl_p(mem_buf); 10029a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 10173d510c9SDavid Hildenbrand return 4; 10273d510c9SDavid Hildenbrand default: 10373d510c9SDavid Hildenbrand return 0; 10473d510c9SDavid Hildenbrand } 10573d510c9SDavid Hildenbrand } 10673d510c9SDavid Hildenbrand 10773d510c9SDavid Hildenbrand /* the values represent the positions in s390-fpr.xml */ 10873d510c9SDavid Hildenbrand #define S390_FPC_REGNUM 0 10973d510c9SDavid Hildenbrand #define S390_F0_REGNUM 1 11073d510c9SDavid Hildenbrand #define S390_F15_REGNUM 16 11173d510c9SDavid Hildenbrand /* total number of registers in s390-fpr.xml */ 11273d510c9SDavid Hildenbrand #define S390_NUM_FP_REGS 17 11373d510c9SDavid Hildenbrand 11473d510c9SDavid Hildenbrand static int cpu_read_fp_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 11573d510c9SDavid Hildenbrand { 11673d510c9SDavid Hildenbrand switch (n) { 11773d510c9SDavid Hildenbrand case S390_FPC_REGNUM: 11873d510c9SDavid Hildenbrand return gdb_get_reg32(mem_buf, env->fpc); 11973d510c9SDavid Hildenbrand case S390_F0_REGNUM ... S390_F15_REGNUM: 1204f83d7d2SDavid Hildenbrand return gdb_get_reg64(mem_buf, *get_freg(env, n - S390_F0_REGNUM)); 12173d510c9SDavid Hildenbrand default: 12273d510c9SDavid Hildenbrand return 0; 12373d510c9SDavid Hildenbrand } 12473d510c9SDavid Hildenbrand } 12573d510c9SDavid Hildenbrand 12673d510c9SDavid Hildenbrand static int cpu_write_fp_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 12773d510c9SDavid Hildenbrand { 12873d510c9SDavid Hildenbrand switch (n) { 12973d510c9SDavid Hildenbrand case S390_FPC_REGNUM: 13073d510c9SDavid Hildenbrand env->fpc = ldl_p(mem_buf); 13173d510c9SDavid Hildenbrand return 4; 13273d510c9SDavid Hildenbrand case S390_F0_REGNUM ... S390_F15_REGNUM: 1334f83d7d2SDavid Hildenbrand *get_freg(env, n - S390_F0_REGNUM) = ldtul_p(mem_buf); 13473d510c9SDavid Hildenbrand return 8; 13573d510c9SDavid Hildenbrand default: 13673d510c9SDavid Hildenbrand return 0; 13773d510c9SDavid Hildenbrand } 13873d510c9SDavid Hildenbrand } 13973d510c9SDavid Hildenbrand 140ca343c7aSEric Farman /* the values represent the positions in s390-vx.xml */ 141ca343c7aSEric Farman #define S390_V0L_REGNUM 0 142ca343c7aSEric Farman #define S390_V15L_REGNUM 15 143ca343c7aSEric Farman #define S390_V16_REGNUM 16 144ca343c7aSEric Farman #define S390_V31_REGNUM 31 145ca343c7aSEric Farman /* total number of registers in s390-vx.xml */ 146ca343c7aSEric Farman #define S390_NUM_VREGS 32 147ca343c7aSEric Farman 148ca343c7aSEric Farman static int cpu_read_vreg(CPUS390XState *env, uint8_t *mem_buf, int n) 149ca343c7aSEric Farman { 150ca343c7aSEric Farman int ret; 151ca343c7aSEric Farman 152ca343c7aSEric Farman switch (n) { 153ca343c7aSEric Farman case S390_V0L_REGNUM ... S390_V15L_REGNUM: 1544f83d7d2SDavid Hildenbrand ret = gdb_get_reg64(mem_buf, env->vregs[n][1]); 155ca343c7aSEric Farman break; 156ca343c7aSEric Farman case S390_V16_REGNUM ... S390_V31_REGNUM: 1574f83d7d2SDavid Hildenbrand ret = gdb_get_reg64(mem_buf, env->vregs[n][0]); 1584f83d7d2SDavid Hildenbrand ret += gdb_get_reg64(mem_buf + 8, env->vregs[n][1]); 159ca343c7aSEric Farman break; 160ca343c7aSEric Farman default: 161ca343c7aSEric Farman ret = 0; 162ca343c7aSEric Farman } 163ca343c7aSEric Farman 164ca343c7aSEric Farman return ret; 165ca343c7aSEric Farman } 166ca343c7aSEric Farman 167ca343c7aSEric Farman static int cpu_write_vreg(CPUS390XState *env, uint8_t *mem_buf, int n) 168ca343c7aSEric Farman { 169ca343c7aSEric Farman switch (n) { 170ca343c7aSEric Farman case S390_V0L_REGNUM ... S390_V15L_REGNUM: 1714f83d7d2SDavid Hildenbrand env->vregs[n][1] = ldtul_p(mem_buf + 8); 172ca343c7aSEric Farman return 8; 173ca343c7aSEric Farman case S390_V16_REGNUM ... S390_V31_REGNUM: 1744f83d7d2SDavid Hildenbrand env->vregs[n][0] = ldtul_p(mem_buf); 1754f83d7d2SDavid Hildenbrand env->vregs[n][1] = ldtul_p(mem_buf + 8); 176ca343c7aSEric Farman return 16; 177ca343c7aSEric Farman default: 178ca343c7aSEric Farman return 0; 179ca343c7aSEric Farman } 180ca343c7aSEric Farman } 181ca343c7aSEric Farman 1825b9f6345SDavid Hildenbrand /* the values represent the positions in s390-cr.xml */ 1835b9f6345SDavid Hildenbrand #define S390_C0_REGNUM 0 1845b9f6345SDavid Hildenbrand #define S390_C15_REGNUM 15 1855b9f6345SDavid Hildenbrand /* total number of registers in s390-cr.xml */ 1865b9f6345SDavid Hildenbrand #define S390_NUM_C_REGS 16 1875b9f6345SDavid Hildenbrand 1885b9f6345SDavid Hildenbrand #ifndef CONFIG_USER_ONLY 1895b9f6345SDavid Hildenbrand static int cpu_read_c_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 1905b9f6345SDavid Hildenbrand { 1915b9f6345SDavid Hildenbrand switch (n) { 1925b9f6345SDavid Hildenbrand case S390_C0_REGNUM ... S390_C15_REGNUM: 1935b9f6345SDavid Hildenbrand return gdb_get_regl(mem_buf, env->cregs[n]); 1945b9f6345SDavid Hildenbrand default: 1955b9f6345SDavid Hildenbrand return 0; 1965b9f6345SDavid Hildenbrand } 1975b9f6345SDavid Hildenbrand } 1985b9f6345SDavid Hildenbrand 1995b9f6345SDavid Hildenbrand static int cpu_write_c_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 2005b9f6345SDavid Hildenbrand { 2015b9f6345SDavid Hildenbrand switch (n) { 2025b9f6345SDavid Hildenbrand case S390_C0_REGNUM ... S390_C15_REGNUM: 2035b9f6345SDavid Hildenbrand env->cregs[n] = ldtul_p(mem_buf); 2045b9f6345SDavid Hildenbrand if (tcg_enabled()) { 20529a0af61SRichard Henderson tlb_flush(env_cpu(env)); 2065b9f6345SDavid Hildenbrand } 20729a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 2085b9f6345SDavid Hildenbrand return 8; 2095b9f6345SDavid Hildenbrand default: 2105b9f6345SDavid Hildenbrand return 0; 2115b9f6345SDavid Hildenbrand } 2125b9f6345SDavid Hildenbrand } 2138a641ff6SDavid Hildenbrand 2148a641ff6SDavid Hildenbrand /* the values represent the positions in s390-virt.xml */ 2158a641ff6SDavid Hildenbrand #define S390_VIRT_CKC_REGNUM 0 2168a641ff6SDavid Hildenbrand #define S390_VIRT_CPUTM_REGNUM 1 2178a641ff6SDavid Hildenbrand #define S390_VIRT_BEA_REGNUM 2 2188a641ff6SDavid Hildenbrand #define S390_VIRT_PREFIX_REGNUM 3 2198a641ff6SDavid Hildenbrand #define S390_VIRT_PP_REGNUM 4 2208a641ff6SDavid Hildenbrand #define S390_VIRT_PFT_REGNUM 5 2218a641ff6SDavid Hildenbrand #define S390_VIRT_PFS_REGNUM 6 2228a641ff6SDavid Hildenbrand #define S390_VIRT_PFC_REGNUM 7 2238a641ff6SDavid Hildenbrand /* total number of registers in s390-virt.xml */ 2248a641ff6SDavid Hildenbrand #define S390_NUM_VIRT_REGS 8 2258a641ff6SDavid Hildenbrand 2268a641ff6SDavid Hildenbrand static int cpu_read_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 2278a641ff6SDavid Hildenbrand { 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 case S390_VIRT_PP_REGNUM: 2388a641ff6SDavid Hildenbrand return gdb_get_regl(mem_buf, env->pp); 2398a641ff6SDavid Hildenbrand case S390_VIRT_PFT_REGNUM: 2408a641ff6SDavid Hildenbrand return gdb_get_regl(mem_buf, env->pfault_token); 2418a641ff6SDavid Hildenbrand case S390_VIRT_PFS_REGNUM: 2428a641ff6SDavid Hildenbrand return gdb_get_regl(mem_buf, env->pfault_select); 2438a641ff6SDavid Hildenbrand case S390_VIRT_PFC_REGNUM: 2448a641ff6SDavid Hildenbrand return gdb_get_regl(mem_buf, env->pfault_compare); 2458a641ff6SDavid Hildenbrand default: 2468a641ff6SDavid Hildenbrand return 0; 2478a641ff6SDavid Hildenbrand } 2488a641ff6SDavid Hildenbrand } 2498a641ff6SDavid Hildenbrand 2508a641ff6SDavid Hildenbrand static int cpu_write_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 2518a641ff6SDavid Hildenbrand { 2528a641ff6SDavid Hildenbrand switch (n) { 2538a641ff6SDavid Hildenbrand case S390_VIRT_CKC_REGNUM: 2548a641ff6SDavid Hildenbrand env->ckc = ldtul_p(mem_buf); 25529a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 2568a641ff6SDavid Hildenbrand return 8; 2578a641ff6SDavid Hildenbrand case S390_VIRT_CPUTM_REGNUM: 2588a641ff6SDavid Hildenbrand env->cputm = ldtul_p(mem_buf); 25929a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 2608a641ff6SDavid Hildenbrand return 8; 2618a641ff6SDavid Hildenbrand case S390_VIRT_BEA_REGNUM: 2628a641ff6SDavid Hildenbrand env->gbea = ldtul_p(mem_buf); 26329a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 2648a641ff6SDavid Hildenbrand return 8; 2658a641ff6SDavid Hildenbrand case S390_VIRT_PREFIX_REGNUM: 2668a641ff6SDavid Hildenbrand env->psa = ldtul_p(mem_buf); 26729a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 2688a641ff6SDavid Hildenbrand return 8; 2698a641ff6SDavid Hildenbrand case S390_VIRT_PP_REGNUM: 2708a641ff6SDavid Hildenbrand env->pp = ldtul_p(mem_buf); 27129a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 2728a641ff6SDavid Hildenbrand return 8; 2738a641ff6SDavid Hildenbrand case S390_VIRT_PFT_REGNUM: 2748a641ff6SDavid Hildenbrand env->pfault_token = ldtul_p(mem_buf); 27529a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 2768a641ff6SDavid Hildenbrand return 8; 2778a641ff6SDavid Hildenbrand case S390_VIRT_PFS_REGNUM: 2788a641ff6SDavid Hildenbrand env->pfault_select = ldtul_p(mem_buf); 27929a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 2808a641ff6SDavid Hildenbrand return 8; 2818a641ff6SDavid Hildenbrand case S390_VIRT_PFC_REGNUM: 2828a641ff6SDavid Hildenbrand env->pfault_compare = ldtul_p(mem_buf); 28329a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 2848a641ff6SDavid Hildenbrand return 8; 2858a641ff6SDavid Hildenbrand default: 2868a641ff6SDavid Hildenbrand return 0; 2878a641ff6SDavid Hildenbrand } 2888a641ff6SDavid Hildenbrand } 2895b9f6345SDavid Hildenbrand #endif 2905b9f6345SDavid Hildenbrand 29186158a2aSChristian Borntraeger /* the values represent the positions in s390-gs.xml */ 29286158a2aSChristian Borntraeger #define S390_GS_RESERVED_REGNUM 0 29386158a2aSChristian Borntraeger #define S390_GS_GSD_REGNUM 1 29486158a2aSChristian Borntraeger #define S390_GS_GSSM_REGNUM 2 29586158a2aSChristian Borntraeger #define S390_GS_GSEPLA_REGNUM 3 29686158a2aSChristian Borntraeger /* total number of registers in s390-gs.xml */ 29786158a2aSChristian Borntraeger #define S390_NUM_GS_REGS 4 29886158a2aSChristian Borntraeger 29986158a2aSChristian Borntraeger static int cpu_read_gs_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 30086158a2aSChristian Borntraeger { 30186158a2aSChristian Borntraeger return gdb_get_regl(mem_buf, env->gscb[n]); 30286158a2aSChristian Borntraeger } 30386158a2aSChristian Borntraeger 30486158a2aSChristian Borntraeger static int cpu_write_gs_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 30586158a2aSChristian Borntraeger { 30686158a2aSChristian Borntraeger env->gscb[n] = ldtul_p(mem_buf); 30729a0af61SRichard Henderson cpu_synchronize_post_init(env_cpu(env)); 30886158a2aSChristian Borntraeger return 8; 30986158a2aSChristian Borntraeger } 31086158a2aSChristian Borntraeger 31173d510c9SDavid Hildenbrand void s390_cpu_gdb_init(CPUState *cs) 31273d510c9SDavid Hildenbrand { 31373d510c9SDavid Hildenbrand gdb_register_coprocessor(cs, cpu_read_ac_reg, 31473d510c9SDavid Hildenbrand cpu_write_ac_reg, 31573d510c9SDavid Hildenbrand S390_NUM_AC_REGS, "s390-acr.xml", 0); 31673d510c9SDavid Hildenbrand 31773d510c9SDavid Hildenbrand gdb_register_coprocessor(cs, cpu_read_fp_reg, 31873d510c9SDavid Hildenbrand cpu_write_fp_reg, 31973d510c9SDavid Hildenbrand S390_NUM_FP_REGS, "s390-fpr.xml", 0); 320ca343c7aSEric Farman 321ca343c7aSEric Farman gdb_register_coprocessor(cs, cpu_read_vreg, 322ca343c7aSEric Farman cpu_write_vreg, 323ca343c7aSEric Farman S390_NUM_VREGS, "s390-vx.xml", 0); 3245b9f6345SDavid Hildenbrand 32586158a2aSChristian Borntraeger gdb_register_coprocessor(cs, cpu_read_gs_reg, 32686158a2aSChristian Borntraeger cpu_write_gs_reg, 32786158a2aSChristian Borntraeger S390_NUM_GS_REGS, "s390-gs.xml", 0); 32886158a2aSChristian Borntraeger 3295b9f6345SDavid Hildenbrand #ifndef CONFIG_USER_ONLY 3305b9f6345SDavid Hildenbrand gdb_register_coprocessor(cs, cpu_read_c_reg, 3315b9f6345SDavid Hildenbrand cpu_write_c_reg, 3325b9f6345SDavid Hildenbrand S390_NUM_C_REGS, "s390-cr.xml", 0); 3338a641ff6SDavid Hildenbrand 3348a641ff6SDavid Hildenbrand if (kvm_enabled()) { 3358a641ff6SDavid Hildenbrand gdb_register_coprocessor(cs, cpu_read_virt_reg, 3368a641ff6SDavid Hildenbrand cpu_write_virt_reg, 3378a641ff6SDavid Hildenbrand S390_NUM_VIRT_REGS, "s390-virt.xml", 0); 3388a641ff6SDavid Hildenbrand } 3395b9f6345SDavid Hildenbrand #endif 340cfae5c90SAndreas Färber } 341