qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

s390x/gdb: expose virtualization specific registers

Let's expose some virtual/fake registers as virtualization specific
registers.

Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
Message-Id: <1443689387-34473-3-git-send-email-jfrei@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>

authored by

David Hildenbrand and committed by
Christian Borntraeger
8a641ff6 af3c15fe

+101 -1
+1 -1
configure
··· 5457 5457 echo "TARGET_ABI32=y" >> $config_target_mak 5458 5458 ;; 5459 5459 s390x) 5460 - gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml" 5460 + gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml" 5461 5461 ;; 5462 5462 tilegx) 5463 5463 ;;
+18
gdb-xml/s390-virt.xml
··· 1 + <?xml version="1.0"?> 2 + <!-- Copyright 2015 IBM Corp. 3 + 4 + This work is licensed under the terms of the GNU GPL, version 2 or 5 + (at your option) any later version. See the COPYING file in the 6 + top-level directory. --> 7 + 8 + <!DOCTYPE feature SYSTEM "gdb-target.dtd"> 9 + <feature name="org.gnu.gdb.s390.virt"> 10 + <reg name="ckc" bitsize="64" type="uint64" group="system"/> 11 + <reg name="cputm" bitsize="64" type="uint64" group="system"/> 12 + <reg name="last_break" bitsize="64" type="code_ptr" group="system"/> 13 + <reg name="prefix" bitsize="64" type="data_ptr" group="system"/> 14 + <reg name="pp" bitsize="64" type="uint64" group="system"/> 15 + <reg name="pfault_token" bitsize="64" type="uint64" group="system"/> 16 + <reg name="pfault_select" bitsize="64" type="uint64" group="system"/> 17 + <reg name="pfault_compare" bitsize="64" type="uint64" group="system"/> 18 + </feature>
+82
target-s390x/gdbstub.c
··· 205 205 return 0; 206 206 } 207 207 } 208 + 209 + /* the values represent the positions in s390-virt.xml */ 210 + #define S390_VIRT_CKC_REGNUM 0 211 + #define S390_VIRT_CPUTM_REGNUM 1 212 + #define S390_VIRT_BEA_REGNUM 2 213 + #define S390_VIRT_PREFIX_REGNUM 3 214 + #define S390_VIRT_PP_REGNUM 4 215 + #define S390_VIRT_PFT_REGNUM 5 216 + #define S390_VIRT_PFS_REGNUM 6 217 + #define S390_VIRT_PFC_REGNUM 7 218 + /* total number of registers in s390-virt.xml */ 219 + #define S390_NUM_VIRT_REGS 8 220 + 221 + static int cpu_read_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 222 + { 223 + switch (n) { 224 + case S390_VIRT_CKC_REGNUM: 225 + return gdb_get_regl(mem_buf, env->ckc); 226 + case S390_VIRT_CPUTM_REGNUM: 227 + return gdb_get_regl(mem_buf, env->cputm); 228 + case S390_VIRT_BEA_REGNUM: 229 + return gdb_get_regl(mem_buf, env->gbea); 230 + case S390_VIRT_PREFIX_REGNUM: 231 + return gdb_get_regl(mem_buf, env->psa); 232 + case S390_VIRT_PP_REGNUM: 233 + return gdb_get_regl(mem_buf, env->pp); 234 + case S390_VIRT_PFT_REGNUM: 235 + return gdb_get_regl(mem_buf, env->pfault_token); 236 + case S390_VIRT_PFS_REGNUM: 237 + return gdb_get_regl(mem_buf, env->pfault_select); 238 + case S390_VIRT_PFC_REGNUM: 239 + return gdb_get_regl(mem_buf, env->pfault_compare); 240 + default: 241 + return 0; 242 + } 243 + } 244 + 245 + static int cpu_write_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n) 246 + { 247 + switch (n) { 248 + case S390_VIRT_CKC_REGNUM: 249 + env->ckc = ldtul_p(mem_buf); 250 + cpu_synchronize_post_init(ENV_GET_CPU(env)); 251 + return 8; 252 + case S390_VIRT_CPUTM_REGNUM: 253 + env->cputm = ldtul_p(mem_buf); 254 + cpu_synchronize_post_init(ENV_GET_CPU(env)); 255 + return 8; 256 + case S390_VIRT_BEA_REGNUM: 257 + env->gbea = ldtul_p(mem_buf); 258 + cpu_synchronize_post_init(ENV_GET_CPU(env)); 259 + return 8; 260 + case S390_VIRT_PREFIX_REGNUM: 261 + env->psa = ldtul_p(mem_buf); 262 + cpu_synchronize_post_init(ENV_GET_CPU(env)); 263 + return 8; 264 + case S390_VIRT_PP_REGNUM: 265 + env->pp = ldtul_p(mem_buf); 266 + cpu_synchronize_post_init(ENV_GET_CPU(env)); 267 + return 8; 268 + case S390_VIRT_PFT_REGNUM: 269 + env->pfault_token = ldtul_p(mem_buf); 270 + cpu_synchronize_post_init(ENV_GET_CPU(env)); 271 + return 8; 272 + case S390_VIRT_PFS_REGNUM: 273 + env->pfault_select = ldtul_p(mem_buf); 274 + cpu_synchronize_post_init(ENV_GET_CPU(env)); 275 + return 8; 276 + case S390_VIRT_PFC_REGNUM: 277 + env->pfault_compare = ldtul_p(mem_buf); 278 + cpu_synchronize_post_init(ENV_GET_CPU(env)); 279 + return 8; 280 + default: 281 + return 0; 282 + } 283 + } 208 284 #endif 209 285 210 286 void s390_cpu_gdb_init(CPUState *cs) ··· 225 301 gdb_register_coprocessor(cs, cpu_read_c_reg, 226 302 cpu_write_c_reg, 227 303 S390_NUM_C_REGS, "s390-cr.xml", 0); 304 + 305 + if (kvm_enabled()) { 306 + gdb_register_coprocessor(cs, cpu_read_virt_reg, 307 + cpu_write_virt_reg, 308 + S390_NUM_VIRT_REGS, "s390-virt.xml", 0); 309 + } 228 310 #endif 229 311 }