regcache.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. /* Register support routines for the remote server for GDB.
  2. Copyright (C) 2001-2022 Free Software Foundation, Inc.
  3. This file is part of GDB.
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>. */
  14. #include "server.h"
  15. #include "regdef.h"
  16. #include "gdbthread.h"
  17. #include "tdesc.h"
  18. #include "gdbsupport/rsp-low.h"
  19. #ifndef IN_PROCESS_AGENT
  20. struct regcache *
  21. get_thread_regcache (struct thread_info *thread, int fetch)
  22. {
  23. struct regcache *regcache;
  24. regcache = thread_regcache_data (thread);
  25. /* Threads' regcaches are created lazily, because biarch targets add
  26. the main thread/lwp before seeing it stop for the first time, and
  27. it is only after the target sees the thread stop for the first
  28. time that the target has a chance of determining the process's
  29. architecture. IOW, when we first add the process's main thread
  30. we don't know which architecture/tdesc its regcache should
  31. have. */
  32. if (regcache == NULL)
  33. {
  34. struct process_info *proc = get_thread_process (thread);
  35. gdb_assert (proc->tdesc != NULL);
  36. regcache = new_register_cache (proc->tdesc);
  37. set_thread_regcache_data (thread, regcache);
  38. }
  39. if (fetch && regcache->registers_valid == 0)
  40. {
  41. scoped_restore_current_thread restore_thread;
  42. switch_to_thread (thread);
  43. /* Invalidate all registers, to prevent stale left-overs. */
  44. memset (regcache->register_status, REG_UNAVAILABLE,
  45. regcache->tdesc->reg_defs.size ());
  46. fetch_inferior_registers (regcache, -1);
  47. regcache->registers_valid = 1;
  48. }
  49. return regcache;
  50. }
  51. /* See gdbsupport/common-regcache.h. */
  52. struct regcache *
  53. get_thread_regcache_for_ptid (ptid_t ptid)
  54. {
  55. return get_thread_regcache (find_thread_ptid (ptid), 1);
  56. }
  57. void
  58. regcache_invalidate_thread (struct thread_info *thread)
  59. {
  60. struct regcache *regcache;
  61. regcache = thread_regcache_data (thread);
  62. if (regcache == NULL)
  63. return;
  64. if (regcache->registers_valid)
  65. {
  66. scoped_restore_current_thread restore_thread;
  67. switch_to_thread (thread);
  68. store_inferior_registers (regcache, -1);
  69. }
  70. regcache->registers_valid = 0;
  71. }
  72. /* See regcache.h. */
  73. void
  74. regcache_invalidate_pid (int pid)
  75. {
  76. /* Only invalidate the regcaches of threads of this process. */
  77. for_each_thread (pid, regcache_invalidate_thread);
  78. }
  79. /* See regcache.h. */
  80. void
  81. regcache_invalidate (void)
  82. {
  83. /* Only update the threads of the current process. */
  84. int pid = current_thread->id.pid ();
  85. regcache_invalidate_pid (pid);
  86. }
  87. #endif
  88. struct regcache *
  89. init_register_cache (struct regcache *regcache,
  90. const struct target_desc *tdesc,
  91. unsigned char *regbuf)
  92. {
  93. if (regbuf == NULL)
  94. {
  95. #ifndef IN_PROCESS_AGENT
  96. /* Make sure to zero-initialize the register cache when it is
  97. created, in case there are registers the target never
  98. fetches. This way they'll read as zero instead of
  99. garbage. */
  100. regcache->tdesc = tdesc;
  101. regcache->registers
  102. = (unsigned char *) xcalloc (1, tdesc->registers_size);
  103. regcache->registers_owned = 1;
  104. regcache->register_status
  105. = (unsigned char *) xmalloc (tdesc->reg_defs.size ());
  106. memset ((void *) regcache->register_status, REG_UNAVAILABLE,
  107. tdesc->reg_defs.size ());
  108. #else
  109. gdb_assert_not_reached ("can't allocate memory from the heap");
  110. #endif
  111. }
  112. else
  113. {
  114. regcache->tdesc = tdesc;
  115. regcache->registers = regbuf;
  116. regcache->registers_owned = 0;
  117. #ifndef IN_PROCESS_AGENT
  118. regcache->register_status = NULL;
  119. #endif
  120. }
  121. regcache->registers_valid = 0;
  122. return regcache;
  123. }
  124. #ifndef IN_PROCESS_AGENT
  125. struct regcache *
  126. new_register_cache (const struct target_desc *tdesc)
  127. {
  128. struct regcache *regcache = new struct regcache;
  129. gdb_assert (tdesc->registers_size != 0);
  130. return init_register_cache (regcache, tdesc, NULL);
  131. }
  132. void
  133. free_register_cache (struct regcache *regcache)
  134. {
  135. if (regcache)
  136. {
  137. if (regcache->registers_owned)
  138. free (regcache->registers);
  139. free (regcache->register_status);
  140. delete regcache;
  141. }
  142. }
  143. #endif
  144. void
  145. regcache_cpy (struct regcache *dst, struct regcache *src)
  146. {
  147. gdb_assert (src != NULL && dst != NULL);
  148. gdb_assert (src->tdesc == dst->tdesc);
  149. gdb_assert (src != dst);
  150. memcpy (dst->registers, src->registers, src->tdesc->registers_size);
  151. #ifndef IN_PROCESS_AGENT
  152. if (dst->register_status != NULL && src->register_status != NULL)
  153. memcpy (dst->register_status, src->register_status,
  154. src->tdesc->reg_defs.size ());
  155. #endif
  156. dst->registers_valid = src->registers_valid;
  157. }
  158. /* Return a reference to the description of register N. */
  159. static const struct gdb::reg &
  160. find_register_by_number (const struct target_desc *tdesc, int n)
  161. {
  162. return tdesc->reg_defs[n];
  163. }
  164. #ifndef IN_PROCESS_AGENT
  165. void
  166. registers_to_string (struct regcache *regcache, char *buf)
  167. {
  168. unsigned char *registers = regcache->registers;
  169. const struct target_desc *tdesc = regcache->tdesc;
  170. for (int i = 0; i < tdesc->reg_defs.size (); ++i)
  171. {
  172. if (regcache->register_status[i] == REG_VALID)
  173. {
  174. bin2hex (registers, buf, register_size (tdesc, i));
  175. buf += register_size (tdesc, i) * 2;
  176. }
  177. else
  178. {
  179. memset (buf, 'x', register_size (tdesc, i) * 2);
  180. buf += register_size (tdesc, i) * 2;
  181. }
  182. registers += register_size (tdesc, i);
  183. }
  184. *buf = '\0';
  185. }
  186. void
  187. registers_from_string (struct regcache *regcache, char *buf)
  188. {
  189. int len = strlen (buf);
  190. unsigned char *registers = regcache->registers;
  191. const struct target_desc *tdesc = regcache->tdesc;
  192. if (len != tdesc->registers_size * 2)
  193. {
  194. warning ("Wrong sized register packet (expected %d bytes, got %d)",
  195. 2 * tdesc->registers_size, len);
  196. if (len > tdesc->registers_size * 2)
  197. len = tdesc->registers_size * 2;
  198. }
  199. hex2bin (buf, registers, len / 2);
  200. }
  201. int
  202. find_regno (const struct target_desc *tdesc, const char *name)
  203. {
  204. for (int i = 0; i < tdesc->reg_defs.size (); ++i)
  205. {
  206. if (strcmp (name, find_register_by_number (tdesc, i).name) == 0)
  207. return i;
  208. }
  209. internal_error (__FILE__, __LINE__, "Unknown register %s requested",
  210. name);
  211. }
  212. static void
  213. free_register_cache_thread (struct thread_info *thread)
  214. {
  215. struct regcache *regcache = thread_regcache_data (thread);
  216. if (regcache != NULL)
  217. {
  218. regcache_invalidate_thread (thread);
  219. free_register_cache (regcache);
  220. set_thread_regcache_data (thread, NULL);
  221. }
  222. }
  223. void
  224. regcache_release (void)
  225. {
  226. /* Flush and release all pre-existing register caches. */
  227. for_each_thread (free_register_cache_thread);
  228. }
  229. #endif
  230. int
  231. register_cache_size (const struct target_desc *tdesc)
  232. {
  233. return tdesc->registers_size;
  234. }
  235. int
  236. register_size (const struct target_desc *tdesc, int n)
  237. {
  238. return find_register_by_number (tdesc, n).size / 8;
  239. }
  240. /* See gdbsupport/common-regcache.h. */
  241. int
  242. regcache_register_size (const struct regcache *regcache, int n)
  243. {
  244. return register_size (regcache->tdesc, n);
  245. }
  246. static unsigned char *
  247. register_data (const struct regcache *regcache, int n)
  248. {
  249. return (regcache->registers
  250. + find_register_by_number (regcache->tdesc, n).offset / 8);
  251. }
  252. void
  253. supply_register (struct regcache *regcache, int n, const void *buf)
  254. {
  255. return regcache->raw_supply (n, buf);
  256. }
  257. /* See gdbsupport/common-regcache.h. */
  258. void
  259. regcache::raw_supply (int n, const void *buf)
  260. {
  261. if (buf)
  262. {
  263. memcpy (register_data (this, n), buf, register_size (tdesc, n));
  264. #ifndef IN_PROCESS_AGENT
  265. if (register_status != NULL)
  266. register_status[n] = REG_VALID;
  267. #endif
  268. }
  269. else
  270. {
  271. memset (register_data (this, n), 0, register_size (tdesc, n));
  272. #ifndef IN_PROCESS_AGENT
  273. if (register_status != NULL)
  274. register_status[n] = REG_UNAVAILABLE;
  275. #endif
  276. }
  277. }
  278. /* Supply register N with value zero to REGCACHE. */
  279. void
  280. supply_register_zeroed (struct regcache *regcache, int n)
  281. {
  282. memset (register_data (regcache, n), 0,
  283. register_size (regcache->tdesc, n));
  284. #ifndef IN_PROCESS_AGENT
  285. if (regcache->register_status != NULL)
  286. regcache->register_status[n] = REG_VALID;
  287. #endif
  288. }
  289. #ifndef IN_PROCESS_AGENT
  290. /* Supply register called NAME with value zero to REGCACHE. */
  291. void
  292. supply_register_by_name_zeroed (struct regcache *regcache,
  293. const char *name)
  294. {
  295. supply_register_zeroed (regcache, find_regno (regcache->tdesc, name));
  296. }
  297. #endif
  298. /* Supply the whole register set whose contents are stored in BUF, to
  299. REGCACHE. If BUF is NULL, all the registers' values are recorded
  300. as unavailable. */
  301. void
  302. supply_regblock (struct regcache *regcache, const void *buf)
  303. {
  304. if (buf)
  305. {
  306. const struct target_desc *tdesc = regcache->tdesc;
  307. memcpy (regcache->registers, buf, tdesc->registers_size);
  308. #ifndef IN_PROCESS_AGENT
  309. {
  310. int i;
  311. for (i = 0; i < tdesc->reg_defs.size (); i++)
  312. regcache->register_status[i] = REG_VALID;
  313. }
  314. #endif
  315. }
  316. else
  317. {
  318. const struct target_desc *tdesc = regcache->tdesc;
  319. memset (regcache->registers, 0, tdesc->registers_size);
  320. #ifndef IN_PROCESS_AGENT
  321. {
  322. int i;
  323. for (i = 0; i < tdesc->reg_defs.size (); i++)
  324. regcache->register_status[i] = REG_UNAVAILABLE;
  325. }
  326. #endif
  327. }
  328. }
  329. #ifndef IN_PROCESS_AGENT
  330. void
  331. supply_register_by_name (struct regcache *regcache,
  332. const char *name, const void *buf)
  333. {
  334. supply_register (regcache, find_regno (regcache->tdesc, name), buf);
  335. }
  336. #endif
  337. void
  338. collect_register (struct regcache *regcache, int n, void *buf)
  339. {
  340. regcache->raw_collect (n, buf);
  341. }
  342. /* See gdbsupport/common-regcache.h. */
  343. void
  344. regcache::raw_collect (int n, void *buf) const
  345. {
  346. memcpy (buf, register_data (this, n), register_size (tdesc, n));
  347. }
  348. enum register_status
  349. regcache_raw_read_unsigned (struct regcache *regcache, int regnum,
  350. ULONGEST *val)
  351. {
  352. int size;
  353. gdb_assert (regcache != NULL);
  354. gdb_assert (regnum >= 0
  355. && regnum < regcache->tdesc->reg_defs.size ());
  356. size = register_size (regcache->tdesc, regnum);
  357. if (size > (int) sizeof (ULONGEST))
  358. error (_("That operation is not available on integers of more than"
  359. "%d bytes."),
  360. (int) sizeof (ULONGEST));
  361. *val = 0;
  362. collect_register (regcache, regnum, val);
  363. return REG_VALID;
  364. }
  365. #ifndef IN_PROCESS_AGENT
  366. /* See regcache.h. */
  367. ULONGEST
  368. regcache_raw_get_unsigned_by_name (struct regcache *regcache,
  369. const char *name)
  370. {
  371. return regcache_raw_get_unsigned (regcache,
  372. find_regno (regcache->tdesc, name));
  373. }
  374. void
  375. collect_register_as_string (struct regcache *regcache, int n, char *buf)
  376. {
  377. bin2hex (register_data (regcache, n), buf,
  378. register_size (regcache->tdesc, n));
  379. }
  380. void
  381. collect_register_by_name (struct regcache *regcache,
  382. const char *name, void *buf)
  383. {
  384. collect_register (regcache, find_regno (regcache->tdesc, name), buf);
  385. }
  386. /* Special handling for register PC. */
  387. CORE_ADDR
  388. regcache_read_pc (struct regcache *regcache)
  389. {
  390. return the_target->read_pc (regcache);
  391. }
  392. void
  393. regcache_write_pc (struct regcache *regcache, CORE_ADDR pc)
  394. {
  395. the_target->write_pc (regcache, pc);
  396. }
  397. #endif
  398. /* See gdbsupport/common-regcache.h. */
  399. enum register_status
  400. regcache::get_register_status (int regnum) const
  401. {
  402. #ifndef IN_PROCESS_AGENT
  403. gdb_assert (regnum >= 0 && regnum < tdesc->reg_defs.size ());
  404. return (enum register_status) (register_status[regnum]);
  405. #else
  406. return REG_VALID;
  407. #endif
  408. }
  409. /* See gdbsupport/common-regcache.h. */
  410. bool
  411. regcache::raw_compare (int regnum, const void *buf, int offset) const
  412. {
  413. gdb_assert (buf != NULL);
  414. const unsigned char *regbuf = register_data (this, regnum);
  415. int size = register_size (tdesc, regnum);
  416. gdb_assert (size >= offset);
  417. return (memcmp (buf, regbuf + offset, size - offset) == 0);
  418. }