gdbstub_arch.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "common/hex_util.h"
  4. #include "core/debugger/gdbstub_arch.h"
  5. #include "core/hle/kernel/k_thread.h"
  6. namespace Core {
  7. template <typename T>
  8. static T HexToValue(std::string_view hex) {
  9. static_assert(std::is_trivially_copyable_v<T>);
  10. T value{};
  11. const auto mem{Common::HexStringToVector(hex, false)};
  12. std::memcpy(&value, mem.data(), std::min(mem.size(), sizeof(T)));
  13. return value;
  14. }
  15. template <typename T>
  16. static std::string ValueToHex(const T value) {
  17. static_assert(std::is_trivially_copyable_v<T>);
  18. std::array<u8, sizeof(T)> mem{};
  19. std::memcpy(mem.data(), &value, sizeof(T));
  20. return Common::HexToString(mem);
  21. }
  22. template <typename T>
  23. static T GetSIMDRegister(const std::array<u32, 64>& simd_regs, size_t offset) {
  24. static_assert(std::is_trivially_copyable_v<T>);
  25. T value{};
  26. std::memcpy(&value, reinterpret_cast<const u8*>(simd_regs.data()) + sizeof(T) * offset,
  27. sizeof(T));
  28. return value;
  29. }
  30. template <typename T>
  31. static void PutSIMDRegister(std::array<u32, 64>& simd_regs, size_t offset, const T value) {
  32. static_assert(std::is_trivially_copyable_v<T>);
  33. std::memcpy(reinterpret_cast<u8*>(simd_regs.data()) + sizeof(T) * offset, &value, sizeof(T));
  34. }
  35. // For sample XML files see the GDB source /gdb/features
  36. // This XML defines what the registers are for this specific ARM device
  37. std::string GDBStubA64::GetTargetXML() const {
  38. constexpr const char* target_xml =
  39. R"(<?xml version="1.0"?>
  40. <!DOCTYPE target SYSTEM "gdb-target.dtd">
  41. <target version="1.0">
  42. <architecture>aarch64</architecture>
  43. <feature name="org.gnu.gdb.aarch64.core">
  44. <reg name="x0" bitsize="64"/>
  45. <reg name="x1" bitsize="64"/>
  46. <reg name="x2" bitsize="64"/>
  47. <reg name="x3" bitsize="64"/>
  48. <reg name="x4" bitsize="64"/>
  49. <reg name="x5" bitsize="64"/>
  50. <reg name="x6" bitsize="64"/>
  51. <reg name="x7" bitsize="64"/>
  52. <reg name="x8" bitsize="64"/>
  53. <reg name="x9" bitsize="64"/>
  54. <reg name="x10" bitsize="64"/>
  55. <reg name="x11" bitsize="64"/>
  56. <reg name="x12" bitsize="64"/>
  57. <reg name="x13" bitsize="64"/>
  58. <reg name="x14" bitsize="64"/>
  59. <reg name="x15" bitsize="64"/>
  60. <reg name="x16" bitsize="64"/>
  61. <reg name="x17" bitsize="64"/>
  62. <reg name="x18" bitsize="64"/>
  63. <reg name="x19" bitsize="64"/>
  64. <reg name="x20" bitsize="64"/>
  65. <reg name="x21" bitsize="64"/>
  66. <reg name="x22" bitsize="64"/>
  67. <reg name="x23" bitsize="64"/>
  68. <reg name="x24" bitsize="64"/>
  69. <reg name="x25" bitsize="64"/>
  70. <reg name="x26" bitsize="64"/>
  71. <reg name="x27" bitsize="64"/>
  72. <reg name="x28" bitsize="64"/>
  73. <reg name="x29" bitsize="64"/>
  74. <reg name="x30" bitsize="64"/>
  75. <reg name="sp" bitsize="64" type="data_ptr"/>
  76. <reg name="pc" bitsize="64" type="code_ptr"/>
  77. <flags id="cpsr_flags" size="4">
  78. <field name="SP" start="0" end="0"/>
  79. <field name="" start="1" end="1"/>
  80. <field name="EL" start="2" end="3"/>
  81. <field name="nRW" start="4" end="4"/>
  82. <field name="" start="5" end="5"/>
  83. <field name="F" start="6" end="6"/>
  84. <field name="I" start="7" end="7"/>
  85. <field name="A" start="8" end="8"/>
  86. <field name="D" start="9" end="9"/>
  87. <field name="IL" start="20" end="20"/>
  88. <field name="SS" start="21" end="21"/>
  89. <field name="V" start="28" end="28"/>
  90. <field name="C" start="29" end="29"/>
  91. <field name="Z" start="30" end="30"/>
  92. <field name="N" start="31" end="31"/>
  93. </flags>
  94. <reg name="cpsr" bitsize="32" type="cpsr_flags"/>
  95. </feature>
  96. <feature name="org.gnu.gdb.aarch64.fpu">
  97. <vector id="v2d" type="ieee_double" count="2"/>
  98. <vector id="v2u" type="uint64" count="2"/>
  99. <vector id="v2i" type="int64" count="2"/>
  100. <vector id="v4f" type="ieee_single" count="4"/>
  101. <vector id="v4u" type="uint32" count="4"/>
  102. <vector id="v4i" type="int32" count="4"/>
  103. <vector id="v8u" type="uint16" count="8"/>
  104. <vector id="v8i" type="int16" count="8"/>
  105. <vector id="v16u" type="uint8" count="16"/>
  106. <vector id="v16i" type="int8" count="16"/>
  107. <vector id="v1u" type="uint128" count="1"/>
  108. <vector id="v1i" type="int128" count="1"/>
  109. <union id="vnd">
  110. <field name="f" type="v2d"/>
  111. <field name="u" type="v2u"/>
  112. <field name="s" type="v2i"/>
  113. </union>
  114. <union id="vns">
  115. <field name="f" type="v4f"/>
  116. <field name="u" type="v4u"/>
  117. <field name="s" type="v4i"/>
  118. </union>
  119. <union id="vnh">
  120. <field name="u" type="v8u"/>
  121. <field name="s" type="v8i"/>
  122. </union>
  123. <union id="vnb">
  124. <field name="u" type="v16u"/>
  125. <field name="s" type="v16i"/>
  126. </union>
  127. <union id="vnq">
  128. <field name="u" type="v1u"/>
  129. <field name="s" type="v1i"/>
  130. </union>
  131. <union id="aarch64v">
  132. <field name="d" type="vnd"/>
  133. <field name="s" type="vns"/>
  134. <field name="h" type="vnh"/>
  135. <field name="b" type="vnb"/>
  136. <field name="q" type="vnq"/>
  137. </union>
  138. <reg name="v0" bitsize="128" type="aarch64v" regnum="34"/>
  139. <reg name="v1" bitsize="128" type="aarch64v" />
  140. <reg name="v2" bitsize="128" type="aarch64v" />
  141. <reg name="v3" bitsize="128" type="aarch64v" />
  142. <reg name="v4" bitsize="128" type="aarch64v" />
  143. <reg name="v5" bitsize="128" type="aarch64v" />
  144. <reg name="v6" bitsize="128" type="aarch64v" />
  145. <reg name="v7" bitsize="128" type="aarch64v" />
  146. <reg name="v8" bitsize="128" type="aarch64v" />
  147. <reg name="v9" bitsize="128" type="aarch64v" />
  148. <reg name="v10" bitsize="128" type="aarch64v"/>
  149. <reg name="v11" bitsize="128" type="aarch64v"/>
  150. <reg name="v12" bitsize="128" type="aarch64v"/>
  151. <reg name="v13" bitsize="128" type="aarch64v"/>
  152. <reg name="v14" bitsize="128" type="aarch64v"/>
  153. <reg name="v15" bitsize="128" type="aarch64v"/>
  154. <reg name="v16" bitsize="128" type="aarch64v"/>
  155. <reg name="v17" bitsize="128" type="aarch64v"/>
  156. <reg name="v18" bitsize="128" type="aarch64v"/>
  157. <reg name="v19" bitsize="128" type="aarch64v"/>
  158. <reg name="v20" bitsize="128" type="aarch64v"/>
  159. <reg name="v21" bitsize="128" type="aarch64v"/>
  160. <reg name="v22" bitsize="128" type="aarch64v"/>
  161. <reg name="v23" bitsize="128" type="aarch64v"/>
  162. <reg name="v24" bitsize="128" type="aarch64v"/>
  163. <reg name="v25" bitsize="128" type="aarch64v"/>
  164. <reg name="v26" bitsize="128" type="aarch64v"/>
  165. <reg name="v27" bitsize="128" type="aarch64v"/>
  166. <reg name="v28" bitsize="128" type="aarch64v"/>
  167. <reg name="v29" bitsize="128" type="aarch64v"/>
  168. <reg name="v30" bitsize="128" type="aarch64v"/>
  169. <reg name="v31" bitsize="128" type="aarch64v"/>
  170. <reg name="fpsr" bitsize="32"/>
  171. <reg name="fpcr" bitsize="32"/>
  172. </feature>
  173. </target>)";
  174. return target_xml;
  175. }
  176. std::string GDBStubA64::RegRead(const Kernel::KThread* thread, size_t id) const {
  177. if (!thread) {
  178. return "";
  179. }
  180. const auto& context{thread->GetContext64()};
  181. const auto& gprs{context.cpu_registers};
  182. const auto& fprs{context.vector_registers};
  183. if (id <= SP_REGISTER) {
  184. return ValueToHex(gprs[id]);
  185. } else if (id == PC_REGISTER) {
  186. return ValueToHex(context.pc);
  187. } else if (id == PSTATE_REGISTER) {
  188. return ValueToHex(context.pstate);
  189. } else if (id >= Q0_REGISTER && id < FPSR_REGISTER) {
  190. return ValueToHex(fprs[id - Q0_REGISTER]);
  191. } else if (id == FPSR_REGISTER) {
  192. return ValueToHex(context.fpsr);
  193. } else if (id == FPCR_REGISTER) {
  194. return ValueToHex(context.fpcr);
  195. } else {
  196. return "";
  197. }
  198. }
  199. void GDBStubA64::RegWrite(Kernel::KThread* thread, size_t id, std::string_view value) const {
  200. if (!thread) {
  201. return;
  202. }
  203. auto& context{thread->GetContext64()};
  204. if (id <= SP_REGISTER) {
  205. context.cpu_registers[id] = HexToValue<u64>(value);
  206. } else if (id == PC_REGISTER) {
  207. context.pc = HexToValue<u64>(value);
  208. } else if (id == PSTATE_REGISTER) {
  209. context.pstate = HexToValue<u32>(value);
  210. } else if (id >= Q0_REGISTER && id < FPSR_REGISTER) {
  211. context.vector_registers[id - Q0_REGISTER] = HexToValue<u128>(value);
  212. } else if (id == FPSR_REGISTER) {
  213. context.fpsr = HexToValue<u32>(value);
  214. } else if (id == FPCR_REGISTER) {
  215. context.fpcr = HexToValue<u32>(value);
  216. }
  217. }
  218. std::string GDBStubA64::ReadRegisters(const Kernel::KThread* thread) const {
  219. std::string output;
  220. for (size_t reg = 0; reg <= FPCR_REGISTER; reg++) {
  221. output += RegRead(thread, reg);
  222. }
  223. return output;
  224. }
  225. void GDBStubA64::WriteRegisters(Kernel::KThread* thread, std::string_view register_data) const {
  226. for (size_t i = 0, reg = 0; reg <= FPCR_REGISTER; reg++) {
  227. if (reg <= SP_REGISTER || reg == PC_REGISTER) {
  228. RegWrite(thread, reg, register_data.substr(i, 16));
  229. i += 16;
  230. } else if (reg == PSTATE_REGISTER || reg == FPCR_REGISTER || reg == FPSR_REGISTER) {
  231. RegWrite(thread, reg, register_data.substr(i, 8));
  232. i += 8;
  233. } else if (reg >= Q0_REGISTER && reg < FPCR_REGISTER) {
  234. RegWrite(thread, reg, register_data.substr(i, 32));
  235. i += 32;
  236. }
  237. }
  238. }
  239. std::string GDBStubA64::ThreadStatus(const Kernel::KThread* thread, u8 signal) const {
  240. return fmt::format("T{:02x}{:02x}:{};{:02x}:{};{:02x}:{};thread:{:x};", signal, PC_REGISTER,
  241. RegRead(thread, PC_REGISTER), SP_REGISTER, RegRead(thread, SP_REGISTER),
  242. LR_REGISTER, RegRead(thread, LR_REGISTER), thread->GetThreadID());
  243. }
  244. u32 GDBStubA64::BreakpointInstruction() const {
  245. // A64: brk #0
  246. return 0xd4200000;
  247. }
  248. std::string GDBStubA32::GetTargetXML() const {
  249. constexpr const char* target_xml =
  250. R"(<?xml version="1.0"?>
  251. <!DOCTYPE target SYSTEM "gdb-target.dtd">
  252. <target version="1.0">
  253. <architecture>arm</architecture>
  254. <feature name="org.gnu.gdb.arm.core">
  255. <reg name="r0" bitsize="32" type="uint32"/>
  256. <reg name="r1" bitsize="32" type="uint32"/>
  257. <reg name="r2" bitsize="32" type="uint32"/>
  258. <reg name="r3" bitsize="32" type="uint32"/>
  259. <reg name="r4" bitsize="32" type="uint32"/>
  260. <reg name="r5" bitsize="32" type="uint32"/>
  261. <reg name="r6" bitsize="32" type="uint32"/>
  262. <reg name="r7" bitsize="32" type="uint32"/>
  263. <reg name="r8" bitsize="32" type="uint32"/>
  264. <reg name="r9" bitsize="32" type="uint32"/>
  265. <reg name="r10" bitsize="32" type="uint32"/>
  266. <reg name="r11" bitsize="32" type="uint32"/>
  267. <reg name="r12" bitsize="32" type="uint32"/>
  268. <reg name="sp" bitsize="32" type="data_ptr"/>
  269. <reg name="lr" bitsize="32" type="code_ptr"/>
  270. <reg name="pc" bitsize="32" type="code_ptr"/>
  271. <!-- The CPSR is register 25, rather than register 16, because
  272. the FPA registers historically were placed between the PC
  273. and the CPSR in the "g" packet. -->
  274. <reg name="cpsr" bitsize="32" regnum="25"/>
  275. </feature>
  276. <feature name="org.gnu.gdb.arm.vfp">
  277. <vector id="neon_uint8x8" type="uint8" count="8"/>
  278. <vector id="neon_uint16x4" type="uint16" count="4"/>
  279. <vector id="neon_uint32x2" type="uint32" count="2"/>
  280. <vector id="neon_float32x2" type="ieee_single" count="2"/>
  281. <union id="neon_d">
  282. <field name="u8" type="neon_uint8x8"/>
  283. <field name="u16" type="neon_uint16x4"/>
  284. <field name="u32" type="neon_uint32x2"/>
  285. <field name="u64" type="uint64"/>
  286. <field name="f32" type="neon_float32x2"/>
  287. <field name="f64" type="ieee_double"/>
  288. </union>
  289. <vector id="neon_uint8x16" type="uint8" count="16"/>
  290. <vector id="neon_uint16x8" type="uint16" count="8"/>
  291. <vector id="neon_uint32x4" type="uint32" count="4"/>
  292. <vector id="neon_uint64x2" type="uint64" count="2"/>
  293. <vector id="neon_float32x4" type="ieee_single" count="4"/>
  294. <vector id="neon_float64x2" type="ieee_double" count="2"/>
  295. <union id="neon_q">
  296. <field name="u8" type="neon_uint8x16"/>
  297. <field name="u16" type="neon_uint16x8"/>
  298. <field name="u32" type="neon_uint32x4"/>
  299. <field name="u64" type="neon_uint64x2"/>
  300. <field name="f32" type="neon_float32x4"/>
  301. <field name="f64" type="neon_float64x2"/>
  302. </union>
  303. <reg name="d0" bitsize="64" type="neon_d" regnum="32"/>
  304. <reg name="d1" bitsize="64" type="neon_d"/>
  305. <reg name="d2" bitsize="64" type="neon_d"/>
  306. <reg name="d3" bitsize="64" type="neon_d"/>
  307. <reg name="d4" bitsize="64" type="neon_d"/>
  308. <reg name="d5" bitsize="64" type="neon_d"/>
  309. <reg name="d6" bitsize="64" type="neon_d"/>
  310. <reg name="d7" bitsize="64" type="neon_d"/>
  311. <reg name="d8" bitsize="64" type="neon_d"/>
  312. <reg name="d9" bitsize="64" type="neon_d"/>
  313. <reg name="d10" bitsize="64" type="neon_d"/>
  314. <reg name="d11" bitsize="64" type="neon_d"/>
  315. <reg name="d12" bitsize="64" type="neon_d"/>
  316. <reg name="d13" bitsize="64" type="neon_d"/>
  317. <reg name="d14" bitsize="64" type="neon_d"/>
  318. <reg name="d15" bitsize="64" type="neon_d"/>
  319. <reg name="d16" bitsize="64" type="neon_d"/>
  320. <reg name="d17" bitsize="64" type="neon_d"/>
  321. <reg name="d18" bitsize="64" type="neon_d"/>
  322. <reg name="d19" bitsize="64" type="neon_d"/>
  323. <reg name="d20" bitsize="64" type="neon_d"/>
  324. <reg name="d21" bitsize="64" type="neon_d"/>
  325. <reg name="d22" bitsize="64" type="neon_d"/>
  326. <reg name="d23" bitsize="64" type="neon_d"/>
  327. <reg name="d24" bitsize="64" type="neon_d"/>
  328. <reg name="d25" bitsize="64" type="neon_d"/>
  329. <reg name="d26" bitsize="64" type="neon_d"/>
  330. <reg name="d27" bitsize="64" type="neon_d"/>
  331. <reg name="d28" bitsize="64" type="neon_d"/>
  332. <reg name="d29" bitsize="64" type="neon_d"/>
  333. <reg name="d30" bitsize="64" type="neon_d"/>
  334. <reg name="d31" bitsize="64" type="neon_d"/>
  335. <reg name="q0" bitsize="128" type="neon_q" regnum="64"/>
  336. <reg name="q1" bitsize="128" type="neon_q"/>
  337. <reg name="q2" bitsize="128" type="neon_q"/>
  338. <reg name="q3" bitsize="128" type="neon_q"/>
  339. <reg name="q4" bitsize="128" type="neon_q"/>
  340. <reg name="q5" bitsize="128" type="neon_q"/>
  341. <reg name="q6" bitsize="128" type="neon_q"/>
  342. <reg name="q7" bitsize="128" type="neon_q"/>
  343. <reg name="q8" bitsize="128" type="neon_q"/>
  344. <reg name="q9" bitsize="128" type="neon_q"/>
  345. <reg name="q10" bitsize="128" type="neon_q"/>
  346. <reg name="q10" bitsize="128" type="neon_q"/>
  347. <reg name="q12" bitsize="128" type="neon_q"/>
  348. <reg name="q13" bitsize="128" type="neon_q"/>
  349. <reg name="q14" bitsize="128" type="neon_q"/>
  350. <reg name="q15" bitsize="128" type="neon_q"/>
  351. <reg name="fpscr" bitsize="32" type="int" group="float" regnum="80"/>
  352. </feature>
  353. </target>)";
  354. return target_xml;
  355. }
  356. std::string GDBStubA32::RegRead(const Kernel::KThread* thread, size_t id) const {
  357. if (!thread) {
  358. return "";
  359. }
  360. const auto& context{thread->GetContext32()};
  361. const auto& gprs{context.cpu_registers};
  362. const auto& fprs{context.extension_registers};
  363. if (id <= PC_REGISTER) {
  364. return ValueToHex(gprs[id]);
  365. } else if (id == CPSR_REGISTER) {
  366. return ValueToHex(context.cpsr);
  367. } else if (id >= D0_REGISTER && id < Q0_REGISTER) {
  368. const u64 dN{GetSIMDRegister<u64>(fprs, id - D0_REGISTER)};
  369. return ValueToHex(dN);
  370. } else if (id >= Q0_REGISTER && id < FPSCR_REGISTER) {
  371. const u128 qN{GetSIMDRegister<u128>(fprs, id - Q0_REGISTER)};
  372. return ValueToHex(qN);
  373. } else if (id == FPSCR_REGISTER) {
  374. return ValueToHex(context.fpscr);
  375. } else {
  376. return "";
  377. }
  378. }
  379. void GDBStubA32::RegWrite(Kernel::KThread* thread, size_t id, std::string_view value) const {
  380. if (!thread) {
  381. return;
  382. }
  383. auto& context{thread->GetContext32()};
  384. auto& fprs{context.extension_registers};
  385. if (id <= PC_REGISTER) {
  386. context.cpu_registers[id] = HexToValue<u32>(value);
  387. } else if (id == CPSR_REGISTER) {
  388. context.cpsr = HexToValue<u32>(value);
  389. } else if (id >= D0_REGISTER && id < Q0_REGISTER) {
  390. PutSIMDRegister(fprs, id - D0_REGISTER, HexToValue<u64>(value));
  391. } else if (id >= Q0_REGISTER && id < FPSCR_REGISTER) {
  392. PutSIMDRegister(fprs, id - Q0_REGISTER, HexToValue<u128>(value));
  393. } else if (id == FPSCR_REGISTER) {
  394. context.fpscr = HexToValue<u32>(value);
  395. }
  396. }
  397. std::string GDBStubA32::ReadRegisters(const Kernel::KThread* thread) const {
  398. std::string output;
  399. for (size_t reg = 0; reg <= FPSCR_REGISTER; reg++) {
  400. const bool gpr{reg <= PC_REGISTER};
  401. const bool dfpr{reg >= D0_REGISTER && reg < Q0_REGISTER};
  402. const bool qfpr{reg >= Q0_REGISTER && reg < FPSCR_REGISTER};
  403. if (!(gpr || dfpr || qfpr || reg == CPSR_REGISTER || reg == FPSCR_REGISTER)) {
  404. continue;
  405. }
  406. output += RegRead(thread, reg);
  407. }
  408. return output;
  409. }
  410. void GDBStubA32::WriteRegisters(Kernel::KThread* thread, std::string_view register_data) const {
  411. for (size_t i = 0, reg = 0; reg <= FPSCR_REGISTER; reg++) {
  412. const bool gpr{reg <= PC_REGISTER};
  413. const bool dfpr{reg >= D0_REGISTER && reg < Q0_REGISTER};
  414. const bool qfpr{reg >= Q0_REGISTER && reg < FPSCR_REGISTER};
  415. if (gpr || reg == CPSR_REGISTER || reg == FPSCR_REGISTER) {
  416. RegWrite(thread, reg, register_data.substr(i, 8));
  417. i += 8;
  418. } else if (dfpr) {
  419. RegWrite(thread, reg, register_data.substr(i, 16));
  420. i += 16;
  421. } else if (qfpr) {
  422. RegWrite(thread, reg, register_data.substr(i, 32));
  423. i += 32;
  424. }
  425. if (reg == PC_REGISTER) {
  426. reg = CPSR_REGISTER - 1;
  427. } else if (reg == CPSR_REGISTER) {
  428. reg = D0_REGISTER - 1;
  429. }
  430. }
  431. }
  432. std::string GDBStubA32::ThreadStatus(const Kernel::KThread* thread, u8 signal) const {
  433. return fmt::format("T{:02x}{:02x}:{};{:02x}:{};{:02x}:{};thread:{:x};", signal, PC_REGISTER,
  434. RegRead(thread, PC_REGISTER), SP_REGISTER, RegRead(thread, SP_REGISTER),
  435. LR_REGISTER, RegRead(thread, LR_REGISTER), thread->GetThreadID());
  436. }
  437. u32 GDBStubA32::BreakpointInstruction() const {
  438. // A32: trap
  439. // T32: trap + b #4
  440. return 0xe7ffdefe;
  441. }
  442. } // namespace Core