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 10cfae5c90SAndreas Färber * version 2 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 */ 20cfae5c90SAndreas Färber 21cfae5c90SAndreas Färber static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n) 22cfae5c90SAndreas Färber { 23cfae5c90SAndreas Färber uint64_t val; 24cfae5c90SAndreas Färber int cc_op; 25cfae5c90SAndreas Färber 26cfae5c90SAndreas Färber switch (n) { 27cfae5c90SAndreas Färber case S390_PSWM_REGNUM: 28cfae5c90SAndreas Färber cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr); 29cfae5c90SAndreas Färber val = deposit64(env->psw.mask, 44, 2, cc_op); 30986a2998SAndreas Färber return gdb_get_regl(mem_buf, val); 31cfae5c90SAndreas Färber case S390_PSWA_REGNUM: 32986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->psw.addr); 33cfae5c90SAndreas Färber case S390_R0_REGNUM ... S390_R15_REGNUM: 34986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->regs[n-S390_R0_REGNUM]); 35cfae5c90SAndreas Färber case S390_A0_REGNUM ... S390_A15_REGNUM: 36986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->aregs[n-S390_A0_REGNUM]); 37cfae5c90SAndreas Färber case S390_FPC_REGNUM: 38986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->fpc); 39cfae5c90SAndreas Färber case S390_F0_REGNUM ... S390_F15_REGNUM: 40986a2998SAndreas Färber return gdb_get_reg64(mem_buf, env->fregs[n-S390_F0_REGNUM].ll); 41cfae5c90SAndreas Färber } 42cfae5c90SAndreas Färber 43cfae5c90SAndreas Färber return 0; 44cfae5c90SAndreas Färber } 45cfae5c90SAndreas Färber 46cfae5c90SAndreas Färber static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n) 47cfae5c90SAndreas Färber { 48cfae5c90SAndreas Färber target_ulong tmpl; 49cfae5c90SAndreas Färber uint32_t tmp32; 50cfae5c90SAndreas Färber int r = 8; 51cfae5c90SAndreas Färber tmpl = ldtul_p(mem_buf); 52cfae5c90SAndreas Färber tmp32 = ldl_p(mem_buf); 53cfae5c90SAndreas Färber 54cfae5c90SAndreas Färber switch (n) { 55cfae5c90SAndreas Färber case S390_PSWM_REGNUM: 56cfae5c90SAndreas Färber env->psw.mask = tmpl; 57cfae5c90SAndreas Färber env->cc_op = extract64(tmpl, 44, 2); 58cfae5c90SAndreas Färber break; 59cfae5c90SAndreas Färber case S390_PSWA_REGNUM: 60cfae5c90SAndreas Färber env->psw.addr = tmpl; 61cfae5c90SAndreas Färber break; 62cfae5c90SAndreas Färber case S390_R0_REGNUM ... S390_R15_REGNUM: 63cfae5c90SAndreas Färber env->regs[n-S390_R0_REGNUM] = tmpl; 64cfae5c90SAndreas Färber break; 65cfae5c90SAndreas Färber case S390_A0_REGNUM ... S390_A15_REGNUM: 66cfae5c90SAndreas Färber env->aregs[n-S390_A0_REGNUM] = tmp32; 67cfae5c90SAndreas Färber r = 4; 68cfae5c90SAndreas Färber break; 69cfae5c90SAndreas Färber case S390_FPC_REGNUM: 70cfae5c90SAndreas Färber env->fpc = tmp32; 71cfae5c90SAndreas Färber r = 4; 72cfae5c90SAndreas Färber break; 73cfae5c90SAndreas Färber case S390_F0_REGNUM ... S390_F15_REGNUM: 74cfae5c90SAndreas Färber env->fregs[n-S390_F0_REGNUM].ll = tmpl; 75cfae5c90SAndreas Färber break; 76cfae5c90SAndreas Färber default: 77cfae5c90SAndreas Färber return 0; 78cfae5c90SAndreas Färber } 79cfae5c90SAndreas Färber return r; 80cfae5c90SAndreas Färber } 81