gdbstub.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. /*
  2. * ARM gdb server stub
  3. *
  4. * Copyright (c) 2003-2005 Fabrice Bellard
  5. * Copyright (c) 2013 SUSE LINUX Products GmbH
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  19. */
  20. #include "qemu/osdep.h"
  21. #include "cpu.h"
  22. #include "internals.h"
  23. #include "exec/gdbstub.h"
  24. typedef struct RegisterSysregXmlParam {
  25. CPUState *cs;
  26. GString *s;
  27. int n;
  28. } RegisterSysregXmlParam;
  29. /* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
  30. whatever the target description contains. Due to a historical mishap
  31. the FPA registers appear in between core integer regs and the CPSR.
  32. We hack round this by giving the FPA regs zero size when talking to a
  33. newer gdb. */
  34. int arm_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
  35. {
  36. ARMCPU *cpu = ARM_CPU(cs);
  37. CPUARMState *env = &cpu->env;
  38. if (n < 16) {
  39. /* Core integer register. */
  40. return gdb_get_reg32(mem_buf, env->regs[n]);
  41. }
  42. if (n < 24) {
  43. /* FPA registers. */
  44. if (gdb_has_xml) {
  45. return 0;
  46. }
  47. return gdb_get_zeroes(mem_buf, 12);
  48. }
  49. switch (n) {
  50. case 24:
  51. /* FPA status register. */
  52. if (gdb_has_xml) {
  53. return 0;
  54. }
  55. return gdb_get_reg32(mem_buf, 0);
  56. case 25:
  57. /* CPSR, or XPSR for M-profile */
  58. if (arm_feature(env, ARM_FEATURE_M)) {
  59. return gdb_get_reg32(mem_buf, xpsr_read(env));
  60. } else {
  61. return gdb_get_reg32(mem_buf, cpsr_read(env));
  62. }
  63. }
  64. /* Unknown register. */
  65. return 0;
  66. }
  67. int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
  68. {
  69. ARMCPU *cpu = ARM_CPU(cs);
  70. CPUARMState *env = &cpu->env;
  71. uint32_t tmp;
  72. tmp = ldl_p(mem_buf);
  73. /* Mask out low bit of PC to workaround gdb bugs. This will probably
  74. cause problems if we ever implement the Jazelle DBX extensions. */
  75. if (n == 15) {
  76. tmp &= ~1;
  77. }
  78. if (n < 16) {
  79. /* Core integer register. */
  80. if (n == 13 && arm_feature(env, ARM_FEATURE_M)) {
  81. /* M profile SP low bits are always 0 */
  82. tmp &= ~3;
  83. }
  84. env->regs[n] = tmp;
  85. return 4;
  86. }
  87. if (n < 24) { /* 16-23 */
  88. /* FPA registers (ignored). */
  89. if (gdb_has_xml) {
  90. return 0;
  91. }
  92. return 12;
  93. }
  94. switch (n) {
  95. case 24:
  96. /* FPA status register (ignored). */
  97. if (gdb_has_xml) {
  98. return 0;
  99. }
  100. return 4;
  101. case 25:
  102. /* CPSR, or XPSR for M-profile */
  103. if (arm_feature(env, ARM_FEATURE_M)) {
  104. /*
  105. * Don't allow writing to XPSR.Exception as it can cause
  106. * a transition into or out of handler mode (it's not
  107. * writeable via the MSR insn so this is a reasonable
  108. * restriction). Other fields are safe to update.
  109. */
  110. xpsr_write(env, tmp, ~XPSR_EXCP);
  111. } else {
  112. cpsr_write(env, tmp, 0xffffffff, CPSRWriteByGDBStub);
  113. }
  114. return 4;
  115. }
  116. /* Unknown register. */
  117. return 0;
  118. }
  119. static int vfp_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg)
  120. {
  121. ARMCPU *cpu = env_archcpu(env);
  122. int nregs = cpu_isar_feature(aa32_simd_r32, cpu) ? 32 : 16;
  123. /* VFP data registers are always little-endian. */
  124. if (reg < nregs) {
  125. return gdb_get_reg64(buf, *aa32_vfp_dreg(env, reg));
  126. }
  127. if (arm_feature(env, ARM_FEATURE_NEON)) {
  128. /* Aliases for Q regs. */
  129. nregs += 16;
  130. if (reg < nregs) {
  131. uint64_t *q = aa32_vfp_qreg(env, reg - 32);
  132. return gdb_get_reg128(buf, q[0], q[1]);
  133. }
  134. }
  135. switch (reg - nregs) {
  136. case 0:
  137. return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPSID]);
  138. case 1:
  139. return gdb_get_reg32(buf, vfp_get_fpscr(env));
  140. case 2:
  141. return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPEXC]);
  142. }
  143. return 0;
  144. }
  145. static int vfp_gdb_set_reg(CPUARMState *env, uint8_t *buf, int reg)
  146. {
  147. ARMCPU *cpu = env_archcpu(env);
  148. int nregs = cpu_isar_feature(aa32_simd_r32, cpu) ? 32 : 16;
  149. if (reg < nregs) {
  150. *aa32_vfp_dreg(env, reg) = ldq_le_p(buf);
  151. return 8;
  152. }
  153. if (arm_feature(env, ARM_FEATURE_NEON)) {
  154. nregs += 16;
  155. if (reg < nregs) {
  156. uint64_t *q = aa32_vfp_qreg(env, reg - 32);
  157. q[0] = ldq_le_p(buf);
  158. q[1] = ldq_le_p(buf + 8);
  159. return 16;
  160. }
  161. }
  162. switch (reg - nregs) {
  163. case 0:
  164. env->vfp.xregs[ARM_VFP_FPSID] = ldl_p(buf);
  165. return 4;
  166. case 1:
  167. vfp_set_fpscr(env, ldl_p(buf));
  168. return 4;
  169. case 2:
  170. env->vfp.xregs[ARM_VFP_FPEXC] = ldl_p(buf) & (1 << 30);
  171. return 4;
  172. }
  173. return 0;
  174. }
  175. /**
  176. * arm_get/set_gdb_*: get/set a gdb register
  177. * @env: the CPU state
  178. * @buf: a buffer to copy to/from
  179. * @reg: register number (offset from start of group)
  180. *
  181. * We return the number of bytes copied
  182. */
  183. static int arm_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg)
  184. {
  185. ARMCPU *cpu = env_archcpu(env);
  186. const ARMCPRegInfo *ri;
  187. uint32_t key;
  188. key = cpu->dyn_sysreg_xml.data.cpregs.keys[reg];
  189. ri = get_arm_cp_reginfo(cpu->cp_regs, key);
  190. if (ri) {
  191. if (cpreg_field_is_64bit(ri)) {
  192. return gdb_get_reg64(buf, (uint64_t)read_raw_cp_reg(env, ri));
  193. } else {
  194. return gdb_get_reg32(buf, (uint32_t)read_raw_cp_reg(env, ri));
  195. }
  196. }
  197. return 0;
  198. }
  199. static int arm_gdb_set_sysreg(CPUARMState *env, uint8_t *buf, int reg)
  200. {
  201. return 0;
  202. }
  203. static void arm_gen_one_xml_sysreg_tag(GString *s, DynamicGDBXMLInfo *dyn_xml,
  204. ARMCPRegInfo *ri, uint32_t ri_key,
  205. int bitsize, int regnum)
  206. {
  207. g_string_append_printf(s, "<reg name=\"%s\"", ri->name);
  208. g_string_append_printf(s, " bitsize=\"%d\"", bitsize);
  209. g_string_append_printf(s, " regnum=\"%d\"", regnum);
  210. g_string_append_printf(s, " group=\"cp_regs\"/>");
  211. dyn_xml->data.cpregs.keys[dyn_xml->num] = ri_key;
  212. dyn_xml->num++;
  213. }
  214. static void arm_register_sysreg_for_xml(gpointer key, gpointer value,
  215. gpointer p)
  216. {
  217. uint32_t ri_key = *(uint32_t *)key;
  218. ARMCPRegInfo *ri = value;
  219. RegisterSysregXmlParam *param = (RegisterSysregXmlParam *)p;
  220. GString *s = param->s;
  221. ARMCPU *cpu = ARM_CPU(param->cs);
  222. CPUARMState *env = &cpu->env;
  223. DynamicGDBXMLInfo *dyn_xml = &cpu->dyn_sysreg_xml;
  224. if (!(ri->type & (ARM_CP_NO_RAW | ARM_CP_NO_GDB))) {
  225. if (arm_feature(env, ARM_FEATURE_AARCH64)) {
  226. if (ri->state == ARM_CP_STATE_AA64) {
  227. arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64,
  228. param->n++);
  229. }
  230. } else {
  231. if (ri->state == ARM_CP_STATE_AA32) {
  232. if (!arm_feature(env, ARM_FEATURE_EL3) &&
  233. (ri->secure & ARM_CP_SECSTATE_S)) {
  234. return;
  235. }
  236. if (ri->type & ARM_CP_64BIT) {
  237. arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64,
  238. param->n++);
  239. } else {
  240. arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 32,
  241. param->n++);
  242. }
  243. }
  244. }
  245. }
  246. }
  247. int arm_gen_dynamic_sysreg_xml(CPUState *cs, int base_reg)
  248. {
  249. ARMCPU *cpu = ARM_CPU(cs);
  250. GString *s = g_string_new(NULL);
  251. RegisterSysregXmlParam param = {cs, s, base_reg};
  252. cpu->dyn_sysreg_xml.num = 0;
  253. cpu->dyn_sysreg_xml.data.cpregs.keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
  254. g_string_printf(s, "<?xml version=\"1.0\"?>");
  255. g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
  256. g_string_append_printf(s, "<feature name=\"org.qemu.gdb.arm.sys.regs\">");
  257. g_hash_table_foreach(cpu->cp_regs, arm_register_sysreg_for_xml, &param);
  258. g_string_append_printf(s, "</feature>");
  259. cpu->dyn_sysreg_xml.desc = g_string_free(s, false);
  260. return cpu->dyn_sysreg_xml.num;
  261. }
  262. struct TypeSize {
  263. const char *gdb_type;
  264. int size;
  265. const char sz, suffix;
  266. };
  267. static const struct TypeSize vec_lanes[] = {
  268. /* quads */
  269. { "uint128", 128, 'q', 'u' },
  270. { "int128", 128, 'q', 's' },
  271. /* 64 bit */
  272. { "ieee_double", 64, 'd', 'f' },
  273. { "uint64", 64, 'd', 'u' },
  274. { "int64", 64, 'd', 's' },
  275. /* 32 bit */
  276. { "ieee_single", 32, 's', 'f' },
  277. { "uint32", 32, 's', 'u' },
  278. { "int32", 32, 's', 's' },
  279. /* 16 bit */
  280. { "ieee_half", 16, 'h', 'f' },
  281. { "uint16", 16, 'h', 'u' },
  282. { "int16", 16, 'h', 's' },
  283. /* bytes */
  284. { "uint8", 8, 'b', 'u' },
  285. { "int8", 8, 'b', 's' },
  286. };
  287. int arm_gen_dynamic_svereg_xml(CPUState *cs, int base_reg)
  288. {
  289. ARMCPU *cpu = ARM_CPU(cs);
  290. GString *s = g_string_new(NULL);
  291. DynamicGDBXMLInfo *info = &cpu->dyn_svereg_xml;
  292. g_autoptr(GString) ts = g_string_new("");
  293. int i, j, bits, reg_width = (cpu->sve_max_vq * 128);
  294. info->num = 0;
  295. g_string_printf(s, "<?xml version=\"1.0\"?>");
  296. g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
  297. g_string_append_printf(s, "<feature name=\"org.gnu.gdb.aarch64.sve\">");
  298. /* First define types and totals in a whole VL */
  299. for (i = 0; i < ARRAY_SIZE(vec_lanes); i++) {
  300. int count = reg_width / vec_lanes[i].size;
  301. g_string_printf(ts, "svev%c%c", vec_lanes[i].sz, vec_lanes[i].suffix);
  302. g_string_append_printf(s,
  303. "<vector id=\"%s\" type=\"%s\" count=\"%d\"/>",
  304. ts->str, vec_lanes[i].gdb_type, count);
  305. }
  306. /*
  307. * Now define a union for each size group containing unsigned and
  308. * signed and potentially float versions of each size from 128 to
  309. * 8 bits.
  310. */
  311. for (bits = 128, i = 0; bits >= 8; bits /= 2, i++) {
  312. const char suf[] = { 'q', 'd', 's', 'h', 'b' };
  313. g_string_append_printf(s, "<union id=\"svevn%c\">", suf[i]);
  314. for (j = 0; j < ARRAY_SIZE(vec_lanes); j++) {
  315. if (vec_lanes[j].size == bits) {
  316. g_string_append_printf(s, "<field name=\"%c\" type=\"svev%c%c\"/>",
  317. vec_lanes[j].suffix,
  318. vec_lanes[j].sz, vec_lanes[j].suffix);
  319. }
  320. }
  321. g_string_append(s, "</union>");
  322. }
  323. /* And now the final union of unions */
  324. g_string_append(s, "<union id=\"svev\">");
  325. for (bits = 128, i = 0; bits >= 8; bits /= 2, i++) {
  326. const char suf[] = { 'q', 'd', 's', 'h', 'b' };
  327. g_string_append_printf(s, "<field name=\"%c\" type=\"svevn%c\"/>",
  328. suf[i], suf[i]);
  329. }
  330. g_string_append(s, "</union>");
  331. /* Finally the sve prefix type */
  332. g_string_append_printf(s,
  333. "<vector id=\"svep\" type=\"uint8\" count=\"%d\"/>",
  334. reg_width / 8);
  335. /* Then define each register in parts for each vq */
  336. for (i = 0; i < 32; i++) {
  337. g_string_append_printf(s,
  338. "<reg name=\"z%d\" bitsize=\"%d\""
  339. " regnum=\"%d\" type=\"svev\"/>",
  340. i, reg_width, base_reg++);
  341. info->num++;
  342. }
  343. /* fpscr & status registers */
  344. g_string_append_printf(s, "<reg name=\"fpsr\" bitsize=\"32\""
  345. " regnum=\"%d\" group=\"float\""
  346. " type=\"int\"/>", base_reg++);
  347. g_string_append_printf(s, "<reg name=\"fpcr\" bitsize=\"32\""
  348. " regnum=\"%d\" group=\"float\""
  349. " type=\"int\"/>", base_reg++);
  350. info->num += 2;
  351. for (i = 0; i < 16; i++) {
  352. g_string_append_printf(s,
  353. "<reg name=\"p%d\" bitsize=\"%d\""
  354. " regnum=\"%d\" type=\"svep\"/>",
  355. i, cpu->sve_max_vq * 16, base_reg++);
  356. info->num++;
  357. }
  358. g_string_append_printf(s,
  359. "<reg name=\"ffr\" bitsize=\"%d\""
  360. " regnum=\"%d\" group=\"vector\""
  361. " type=\"svep\"/>",
  362. cpu->sve_max_vq * 16, base_reg++);
  363. g_string_append_printf(s,
  364. "<reg name=\"vg\" bitsize=\"64\""
  365. " regnum=\"%d\" type=\"int\"/>",
  366. base_reg++);
  367. info->num += 2;
  368. g_string_append_printf(s, "</feature>");
  369. cpu->dyn_svereg_xml.desc = g_string_free(s, false);
  370. return cpu->dyn_svereg_xml.num;
  371. }
  372. const char *arm_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname)
  373. {
  374. ARMCPU *cpu = ARM_CPU(cs);
  375. if (strcmp(xmlname, "system-registers.xml") == 0) {
  376. return cpu->dyn_sysreg_xml.desc;
  377. } else if (strcmp(xmlname, "sve-registers.xml") == 0) {
  378. return cpu->dyn_svereg_xml.desc;
  379. }
  380. return NULL;
  381. }
  382. void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
  383. {
  384. CPUState *cs = CPU(cpu);
  385. CPUARMState *env = &cpu->env;
  386. if (arm_feature(env, ARM_FEATURE_AARCH64)) {
  387. /*
  388. * The lower part of each SVE register aliases to the FPU
  389. * registers so we don't need to include both.
  390. */
  391. #ifdef TARGET_AARCH64
  392. if (isar_feature_aa64_sve(&cpu->isar)) {
  393. gdb_register_coprocessor(cs, arm_gdb_get_svereg, arm_gdb_set_svereg,
  394. arm_gen_dynamic_svereg_xml(cs, cs->gdb_num_regs),
  395. "sve-registers.xml", 0);
  396. } else {
  397. gdb_register_coprocessor(cs, aarch64_fpu_gdb_get_reg,
  398. aarch64_fpu_gdb_set_reg,
  399. 34, "aarch64-fpu.xml", 0);
  400. }
  401. #endif
  402. } else if (arm_feature(env, ARM_FEATURE_NEON)) {
  403. gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
  404. 51, "arm-neon.xml", 0);
  405. } else if (cpu_isar_feature(aa32_simd_r32, cpu)) {
  406. gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
  407. 35, "arm-vfp3.xml", 0);
  408. } else if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
  409. gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
  410. 19, "arm-vfp.xml", 0);
  411. }
  412. gdb_register_coprocessor(cs, arm_gdb_get_sysreg, arm_gdb_set_sysreg,
  413. arm_gen_dynamic_sysreg_xml(cs, cs->gdb_num_regs),
  414. "system-registers.xml", 0);
  415. }