mn10300-linux-tdep.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. /* Target-dependent code for the Matsushita MN10300 for GDB, the GNU debugger.
  2. Copyright (C) 2003-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 "defs.h"
  15. #include "gdbcore.h"
  16. #include "regcache.h"
  17. #include "mn10300-tdep.h"
  18. #include "bfd.h"
  19. #include "elf-bfd.h"
  20. #include "osabi.h"
  21. #include "regset.h"
  22. #include "solib-svr4.h"
  23. #include "frame.h"
  24. #include "trad-frame.h"
  25. #include "tramp-frame.h"
  26. #include "linux-tdep.h"
  27. #include "gdbarch.h"
  28. /* Transliterated from <asm-mn10300/elf.h>... */
  29. #define MN10300_ELF_NGREG 28
  30. #define MN10300_ELF_NFPREG 32
  31. typedef gdb_byte mn10300_elf_greg_t[4];
  32. typedef mn10300_elf_greg_t mn10300_elf_gregset_t[MN10300_ELF_NGREG];
  33. typedef gdb_byte mn10300_elf_fpreg_t[4];
  34. typedef struct
  35. {
  36. mn10300_elf_fpreg_t fpregs[MN10300_ELF_NFPREG];
  37. gdb_byte fpcr[4];
  38. } mn10300_elf_fpregset_t;
  39. /* elf_gregset_t register indices stolen from include/asm-mn10300/ptrace.h. */
  40. #define MN10300_ELF_GREGSET_T_REG_INDEX_A3 0
  41. #define MN10300_ELF_GREGSET_T_REG_INDEX_A2 1
  42. #define MN10300_ELF_GREGSET_T_REG_INDEX_D3 2
  43. #define MN10300_ELF_GREGSET_T_REG_INDEX_D2 3
  44. #define MN10300_ELF_GREGSET_T_REG_INDEX_MCVF 4
  45. #define MN10300_ELF_GREGSET_T_REG_INDEX_MCRL 5
  46. #define MN10300_ELF_GREGSET_T_REG_INDEX_MCRH 6
  47. #define MN10300_ELF_GREGSET_T_REG_INDEX_MDRQ 7
  48. #define MN10300_ELF_GREGSET_T_REG_INDEX_E1 8
  49. #define MN10300_ELF_GREGSET_T_REG_INDEX_E0 9
  50. #define MN10300_ELF_GREGSET_T_REG_INDEX_E7 10
  51. #define MN10300_ELF_GREGSET_T_REG_INDEX_E6 11
  52. #define MN10300_ELF_GREGSET_T_REG_INDEX_E5 12
  53. #define MN10300_ELF_GREGSET_T_REG_INDEX_E4 13
  54. #define MN10300_ELF_GREGSET_T_REG_INDEX_E3 14
  55. #define MN10300_ELF_GREGSET_T_REG_INDEX_E2 15
  56. #define MN10300_ELF_GREGSET_T_REG_INDEX_SP 16
  57. #define MN10300_ELF_GREGSET_T_REG_INDEX_LAR 17
  58. #define MN10300_ELF_GREGSET_T_REG_INDEX_LIR 18
  59. #define MN10300_ELF_GREGSET_T_REG_INDEX_MDR 19
  60. #define MN10300_ELF_GREGSET_T_REG_INDEX_A1 20
  61. #define MN10300_ELF_GREGSET_T_REG_INDEX_A0 21
  62. #define MN10300_ELF_GREGSET_T_REG_INDEX_D1 22
  63. #define MN10300_ELF_GREGSET_T_REG_INDEX_D0 23
  64. #define MN10300_ELF_GREGSET_T_REG_INDEX_ORIG_D0 24
  65. #define MN10300_ELF_GREGSET_T_REG_INDEX_EPSW 25
  66. #define MN10300_ELF_GREGSET_T_REG_INDEX_PC 26
  67. /* New gdbarch API for corefile registers.
  68. Given a section name and size, create a struct reg object
  69. with a supply_register and a collect_register method. */
  70. /* Copy register value of REGNUM from regset to regcache.
  71. If REGNUM is -1, do this for all gp registers in regset. */
  72. static void
  73. am33_supply_gregset_method (const struct regset *regset,
  74. struct regcache *regcache,
  75. int regnum, const void *gregs, size_t len)
  76. {
  77. const mn10300_elf_greg_t *regp = (const mn10300_elf_greg_t *) gregs;
  78. int i;
  79. gdb_assert (len >= sizeof (mn10300_elf_gregset_t));
  80. switch (regnum) {
  81. case E_D0_REGNUM:
  82. regcache->raw_supply (E_D0_REGNUM,
  83. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_D0));
  84. break;
  85. case E_D1_REGNUM:
  86. regcache->raw_supply (E_D1_REGNUM,
  87. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_D1));
  88. break;
  89. case E_D2_REGNUM:
  90. regcache->raw_supply (E_D2_REGNUM,
  91. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_D2));
  92. break;
  93. case E_D3_REGNUM:
  94. regcache->raw_supply (E_D3_REGNUM,
  95. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_D3));
  96. break;
  97. case E_A0_REGNUM:
  98. regcache->raw_supply (E_A0_REGNUM,
  99. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_A0));
  100. break;
  101. case E_A1_REGNUM:
  102. regcache->raw_supply (E_A1_REGNUM,
  103. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_A1));
  104. break;
  105. case E_A2_REGNUM:
  106. regcache->raw_supply (E_A2_REGNUM,
  107. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_A2));
  108. break;
  109. case E_A3_REGNUM:
  110. regcache->raw_supply (E_A3_REGNUM,
  111. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_A3));
  112. break;
  113. case E_SP_REGNUM:
  114. regcache->raw_supply (E_SP_REGNUM,
  115. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_SP));
  116. break;
  117. case E_PC_REGNUM:
  118. regcache->raw_supply (E_PC_REGNUM,
  119. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_PC));
  120. break;
  121. case E_MDR_REGNUM:
  122. regcache->raw_supply (E_MDR_REGNUM,
  123. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_MDR));
  124. break;
  125. case E_PSW_REGNUM:
  126. regcache->raw_supply (E_PSW_REGNUM,
  127. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_EPSW));
  128. break;
  129. case E_LIR_REGNUM:
  130. regcache->raw_supply (E_LIR_REGNUM,
  131. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_LIR));
  132. break;
  133. case E_LAR_REGNUM:
  134. regcache->raw_supply (E_LAR_REGNUM,
  135. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_LAR));
  136. break;
  137. case E_MDRQ_REGNUM:
  138. regcache->raw_supply (E_MDRQ_REGNUM,
  139. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_MDRQ));
  140. break;
  141. case E_E0_REGNUM:
  142. regcache->raw_supply (E_E0_REGNUM,
  143. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E0));
  144. break;
  145. case E_E1_REGNUM:
  146. regcache->raw_supply (E_E1_REGNUM,
  147. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E1));
  148. break;
  149. case E_E2_REGNUM:
  150. regcache->raw_supply (E_E2_REGNUM,
  151. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E2));
  152. break;
  153. case E_E3_REGNUM:
  154. regcache->raw_supply (E_E3_REGNUM,
  155. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E3));
  156. break;
  157. case E_E4_REGNUM:
  158. regcache->raw_supply (E_E4_REGNUM,
  159. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E4));
  160. break;
  161. case E_E5_REGNUM:
  162. regcache->raw_supply (E_E5_REGNUM,
  163. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E5));
  164. break;
  165. case E_E6_REGNUM:
  166. regcache->raw_supply (E_E6_REGNUM,
  167. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E6));
  168. break;
  169. case E_E7_REGNUM:
  170. regcache->raw_supply (E_E7_REGNUM,
  171. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E7));
  172. break;
  173. /* ssp, msp, and usp are inaccessible. */
  174. case E_E8_REGNUM:
  175. regcache->raw_supply_zeroed (E_E8_REGNUM);
  176. break;
  177. case E_E9_REGNUM:
  178. regcache->raw_supply_zeroed (E_E9_REGNUM);
  179. break;
  180. case E_E10_REGNUM:
  181. regcache->raw_supply_zeroed (E_E10_REGNUM);
  182. break;
  183. case E_MCRH_REGNUM:
  184. regcache->raw_supply (E_MCRH_REGNUM,
  185. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_MCRH));
  186. break;
  187. case E_MCRL_REGNUM:
  188. regcache->raw_supply (E_MCRL_REGNUM,
  189. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_MCRL));
  190. break;
  191. case E_MCVF_REGNUM:
  192. regcache->raw_supply (E_MCVF_REGNUM,
  193. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_MCVF));
  194. break;
  195. case E_FPCR_REGNUM:
  196. /* FPCR is numbered among the GP regs, but handled as an FP reg.
  197. Do nothing. */
  198. break;
  199. case E_FPCR_REGNUM + 1:
  200. /* The two unused registers beyond fpcr are inaccessible. */
  201. regcache->raw_supply_zeroed (E_FPCR_REGNUM + 1);
  202. break;
  203. case E_FPCR_REGNUM + 2:
  204. regcache->raw_supply_zeroed (E_FPCR_REGNUM + 2);
  205. break;
  206. default: /* An error, obviously, but should we error out? */
  207. break;
  208. case -1:
  209. for (i = 0; i < MN10300_ELF_NGREG; i++)
  210. am33_supply_gregset_method (regset, regcache, i, gregs, len);
  211. break;
  212. }
  213. return;
  214. }
  215. /* Copy fp register value of REGNUM from regset to regcache.
  216. If REGNUM is -1, do this for all fp registers in regset. */
  217. static void
  218. am33_supply_fpregset_method (const struct regset *regset,
  219. struct regcache *regcache,
  220. int regnum, const void *fpregs, size_t len)
  221. {
  222. const mn10300_elf_fpregset_t *fpregset
  223. = (const mn10300_elf_fpregset_t *) fpregs;
  224. gdb_assert (len >= sizeof (mn10300_elf_fpregset_t));
  225. if (regnum == -1)
  226. {
  227. int i;
  228. for (i = 0; i < MN10300_ELF_NFPREG; i++)
  229. am33_supply_fpregset_method (regset, regcache,
  230. E_FS0_REGNUM + i, fpregs, len);
  231. am33_supply_fpregset_method (regset, regcache,
  232. E_FPCR_REGNUM, fpregs, len);
  233. }
  234. else if (regnum == E_FPCR_REGNUM)
  235. regcache->raw_supply (E_FPCR_REGNUM, &fpregset->fpcr);
  236. else if (E_FS0_REGNUM <= regnum
  237. && regnum < E_FS0_REGNUM + MN10300_ELF_NFPREG)
  238. regcache->raw_supply (regnum, &fpregset->fpregs[regnum - E_FS0_REGNUM]);
  239. return;
  240. }
  241. /* Copy register values from regcache to regset. */
  242. static void
  243. am33_collect_gregset_method (const struct regset *regset,
  244. const struct regcache *regcache,
  245. int regnum, void *gregs, size_t len)
  246. {
  247. mn10300_elf_gregset_t *regp = (gdb_byte (*)[28][4]) gregs;
  248. int i;
  249. gdb_assert (len >= sizeof (mn10300_elf_gregset_t));
  250. switch (regnum) {
  251. case E_D0_REGNUM:
  252. regcache->raw_collect (E_D0_REGNUM,
  253. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_D0));
  254. break;
  255. case E_D1_REGNUM:
  256. regcache->raw_collect (E_D1_REGNUM,
  257. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_D1));
  258. break;
  259. case E_D2_REGNUM:
  260. regcache->raw_collect (E_D2_REGNUM,
  261. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_D2));
  262. break;
  263. case E_D3_REGNUM:
  264. regcache->raw_collect (E_D3_REGNUM,
  265. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_D3));
  266. break;
  267. case E_A0_REGNUM:
  268. regcache->raw_collect (E_A0_REGNUM,
  269. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_A0));
  270. break;
  271. case E_A1_REGNUM:
  272. regcache->raw_collect (E_A1_REGNUM,
  273. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_A1));
  274. break;
  275. case E_A2_REGNUM:
  276. regcache->raw_collect (E_A2_REGNUM,
  277. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_A2));
  278. break;
  279. case E_A3_REGNUM:
  280. regcache->raw_collect (E_A3_REGNUM,
  281. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_A3));
  282. break;
  283. case E_SP_REGNUM:
  284. regcache->raw_collect (E_SP_REGNUM,
  285. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_SP));
  286. break;
  287. case E_PC_REGNUM:
  288. regcache->raw_collect (E_PC_REGNUM,
  289. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_PC));
  290. break;
  291. case E_MDR_REGNUM:
  292. regcache->raw_collect (E_MDR_REGNUM,
  293. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_MDR));
  294. break;
  295. case E_PSW_REGNUM:
  296. regcache->raw_collect (E_PSW_REGNUM,
  297. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_EPSW));
  298. break;
  299. case E_LIR_REGNUM:
  300. regcache->raw_collect (E_LIR_REGNUM,
  301. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_LIR));
  302. break;
  303. case E_LAR_REGNUM:
  304. regcache->raw_collect (E_LAR_REGNUM,
  305. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_LAR));
  306. break;
  307. case E_MDRQ_REGNUM:
  308. regcache->raw_collect (E_MDRQ_REGNUM,
  309. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_MDRQ));
  310. break;
  311. case E_E0_REGNUM:
  312. regcache->raw_collect (E_E0_REGNUM,
  313. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E0));
  314. break;
  315. case E_E1_REGNUM:
  316. regcache->raw_collect (E_E1_REGNUM,
  317. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E1));
  318. break;
  319. case E_E2_REGNUM:
  320. regcache->raw_collect (E_E2_REGNUM,
  321. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E2));
  322. break;
  323. case E_E3_REGNUM:
  324. regcache->raw_collect (E_E3_REGNUM,
  325. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E3));
  326. break;
  327. case E_E4_REGNUM:
  328. regcache->raw_collect (E_E4_REGNUM,
  329. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E4));
  330. break;
  331. case E_E5_REGNUM:
  332. regcache->raw_collect (E_E5_REGNUM,
  333. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E5));
  334. break;
  335. case E_E6_REGNUM:
  336. regcache->raw_collect (E_E6_REGNUM,
  337. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E6));
  338. break;
  339. case E_E7_REGNUM:
  340. regcache->raw_collect (E_E7_REGNUM,
  341. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_E7));
  342. break;
  343. /* ssp, msp, and usp are inaccessible. */
  344. case E_E8_REGNUM:
  345. /* The gregset struct has noplace to put this: do nothing. */
  346. break;
  347. case E_E9_REGNUM:
  348. /* The gregset struct has noplace to put this: do nothing. */
  349. break;
  350. case E_E10_REGNUM:
  351. /* The gregset struct has noplace to put this: do nothing. */
  352. break;
  353. case E_MCRH_REGNUM:
  354. regcache->raw_collect (E_MCRH_REGNUM,
  355. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_MCRH));
  356. break;
  357. case E_MCRL_REGNUM:
  358. regcache->raw_collect (E_MCRL_REGNUM,
  359. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_MCRL));
  360. break;
  361. case E_MCVF_REGNUM:
  362. regcache->raw_collect (E_MCVF_REGNUM,
  363. (regp + MN10300_ELF_GREGSET_T_REG_INDEX_MCVF));
  364. break;
  365. case E_FPCR_REGNUM:
  366. /* FPCR is numbered among the GP regs, but handled as an FP reg.
  367. Do nothing. */
  368. break;
  369. case E_FPCR_REGNUM + 1:
  370. /* The gregset struct has noplace to put this: do nothing. */
  371. break;
  372. case E_FPCR_REGNUM + 2:
  373. /* The gregset struct has noplace to put this: do nothing. */
  374. break;
  375. default: /* An error, obviously, but should we error out? */
  376. break;
  377. case -1:
  378. for (i = 0; i < MN10300_ELF_NGREG; i++)
  379. am33_collect_gregset_method (regset, regcache, i, gregs, len);
  380. break;
  381. }
  382. return;
  383. }
  384. /* Copy fp register values from regcache to regset. */
  385. static void
  386. am33_collect_fpregset_method (const struct regset *regset,
  387. const struct regcache *regcache,
  388. int regnum, void *fpregs, size_t len)
  389. {
  390. mn10300_elf_fpregset_t *fpregset = (mn10300_elf_fpregset_t *) fpregs;
  391. gdb_assert (len >= sizeof (mn10300_elf_fpregset_t));
  392. if (regnum == -1)
  393. {
  394. int i;
  395. for (i = 0; i < MN10300_ELF_NFPREG; i++)
  396. am33_collect_fpregset_method (regset, regcache, E_FS0_REGNUM + i,
  397. fpregs, len);
  398. am33_collect_fpregset_method (regset, regcache,
  399. E_FPCR_REGNUM, fpregs, len);
  400. }
  401. else if (regnum == E_FPCR_REGNUM)
  402. regcache->raw_collect (E_FPCR_REGNUM, &fpregset->fpcr);
  403. else if (E_FS0_REGNUM <= regnum
  404. && regnum < E_FS0_REGNUM + MN10300_ELF_NFPREG)
  405. regcache->raw_collect (regnum, &fpregset->fpregs[regnum - E_FS0_REGNUM]);
  406. return;
  407. }
  408. static const struct regset am33_gregset =
  409. {
  410. NULL, am33_supply_gregset_method, am33_collect_gregset_method
  411. };
  412. static const struct regset am33_fpregset =
  413. {
  414. NULL, am33_supply_fpregset_method, am33_collect_fpregset_method
  415. };
  416. /* Iterate over core file register note sections. */
  417. static void
  418. am33_iterate_over_regset_sections (struct gdbarch *gdbarch,
  419. iterate_over_regset_sections_cb *cb,
  420. void *cb_data,
  421. const struct regcache *regcache)
  422. {
  423. cb (".reg", sizeof (mn10300_elf_gregset_t), sizeof (mn10300_elf_gregset_t),
  424. &am33_gregset, NULL, cb_data);
  425. cb (".reg2", sizeof (mn10300_elf_fpregset_t), sizeof (mn10300_elf_fpregset_t),
  426. &am33_fpregset, NULL, cb_data);
  427. }
  428. static void
  429. am33_linux_sigframe_cache_init (const struct tramp_frame *self,
  430. struct frame_info *this_frame,
  431. struct trad_frame_cache *this_cache,
  432. CORE_ADDR func);
  433. static const struct tramp_frame am33_linux_sigframe = {
  434. SIGTRAMP_FRAME,
  435. 1,
  436. {
  437. /* mov 119,d0 */
  438. { 0x2c, ULONGEST_MAX },
  439. { 0x77, ULONGEST_MAX },
  440. { 0x00, ULONGEST_MAX },
  441. /* syscall 0 */
  442. { 0xf0, ULONGEST_MAX },
  443. { 0xe0, ULONGEST_MAX },
  444. { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
  445. },
  446. am33_linux_sigframe_cache_init
  447. };
  448. static const struct tramp_frame am33_linux_rt_sigframe = {
  449. SIGTRAMP_FRAME,
  450. 1,
  451. {
  452. /* mov 173,d0 */
  453. { 0x2c, ULONGEST_MAX },
  454. { 0xad, ULONGEST_MAX },
  455. { 0x00, ULONGEST_MAX },
  456. /* syscall 0 */
  457. { 0xf0, ULONGEST_MAX },
  458. { 0xe0, ULONGEST_MAX },
  459. { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
  460. },
  461. am33_linux_sigframe_cache_init
  462. };
  463. /* Relevant struct definitions for signal handling...
  464. From arch/mn10300/kernel/sigframe.h:
  465. struct sigframe
  466. {
  467. void (*pretcode)(void);
  468. int sig;
  469. struct sigcontext *psc;
  470. struct sigcontext sc;
  471. struct fpucontext fpuctx;
  472. unsigned long extramask[_NSIG_WORDS-1];
  473. char retcode[8];
  474. };
  475. struct rt_sigframe
  476. {
  477. void (*pretcode)(void);
  478. int sig;
  479. struct siginfo *pinfo;
  480. void *puc;
  481. struct siginfo info;
  482. struct ucontext uc;
  483. struct fpucontext fpuctx;
  484. char retcode[8];
  485. };
  486. From include/asm-mn10300/ucontext.h:
  487. struct ucontext {
  488. unsigned long uc_flags;
  489. struct ucontext *uc_link;
  490. stack_t uc_stack;
  491. struct sigcontext uc_mcontext;
  492. sigset_t uc_sigmask;
  493. };
  494. From include/asm-mn10300/sigcontext.h:
  495. struct fpucontext {
  496. unsigned long fs[32];
  497. unsigned long fpcr;
  498. };
  499. struct sigcontext {
  500. unsigned long d0;
  501. unsigned long d1;
  502. unsigned long d2;
  503. unsigned long d3;
  504. unsigned long a0;
  505. unsigned long a1;
  506. unsigned long a2;
  507. unsigned long a3;
  508. unsigned long e0;
  509. unsigned long e1;
  510. unsigned long e2;
  511. unsigned long e3;
  512. unsigned long e4;
  513. unsigned long e5;
  514. unsigned long e6;
  515. unsigned long e7;
  516. unsigned long lar;
  517. unsigned long lir;
  518. unsigned long mdr;
  519. unsigned long mcvf;
  520. unsigned long mcrl;
  521. unsigned long mcrh;
  522. unsigned long mdrq;
  523. unsigned long sp;
  524. unsigned long epsw;
  525. unsigned long pc;
  526. struct fpucontext *fpucontext;
  527. unsigned long oldmask;
  528. }; */
  529. #define AM33_SIGCONTEXT_D0 0
  530. #define AM33_SIGCONTEXT_D1 4
  531. #define AM33_SIGCONTEXT_D2 8
  532. #define AM33_SIGCONTEXT_D3 12
  533. #define AM33_SIGCONTEXT_A0 16
  534. #define AM33_SIGCONTEXT_A1 20
  535. #define AM33_SIGCONTEXT_A2 24
  536. #define AM33_SIGCONTEXT_A3 28
  537. #define AM33_SIGCONTEXT_E0 32
  538. #define AM33_SIGCONTEXT_E1 36
  539. #define AM33_SIGCONTEXT_E2 40
  540. #define AM33_SIGCONTEXT_E3 44
  541. #define AM33_SIGCONTEXT_E4 48
  542. #define AM33_SIGCONTEXT_E5 52
  543. #define AM33_SIGCONTEXT_E6 56
  544. #define AM33_SIGCONTEXT_E7 60
  545. #define AM33_SIGCONTEXT_LAR 64
  546. #define AM33_SIGCONTEXT_LIR 68
  547. #define AM33_SIGCONTEXT_MDR 72
  548. #define AM33_SIGCONTEXT_MCVF 76
  549. #define AM33_SIGCONTEXT_MCRL 80
  550. #define AM33_SIGCONTEXT_MCRH 84
  551. #define AM33_SIGCONTEXT_MDRQ 88
  552. #define AM33_SIGCONTEXT_SP 92
  553. #define AM33_SIGCONTEXT_EPSW 96
  554. #define AM33_SIGCONTEXT_PC 100
  555. #define AM33_SIGCONTEXT_FPUCONTEXT 104
  556. static void
  557. am33_linux_sigframe_cache_init (const struct tramp_frame *self,
  558. struct frame_info *this_frame,
  559. struct trad_frame_cache *this_cache,
  560. CORE_ADDR func)
  561. {
  562. CORE_ADDR sc_base, fpubase;
  563. int i;
  564. sc_base = get_frame_register_unsigned (this_frame, E_SP_REGNUM);
  565. if (self == &am33_linux_sigframe)
  566. {
  567. sc_base += 8;
  568. sc_base = get_frame_memory_unsigned (this_frame, sc_base, 4);
  569. }
  570. else
  571. {
  572. sc_base += 12;
  573. sc_base = get_frame_memory_unsigned (this_frame, sc_base, 4);
  574. sc_base += 20;
  575. }
  576. trad_frame_set_reg_addr (this_cache, E_D0_REGNUM,
  577. sc_base + AM33_SIGCONTEXT_D0);
  578. trad_frame_set_reg_addr (this_cache, E_D1_REGNUM,
  579. sc_base + AM33_SIGCONTEXT_D1);
  580. trad_frame_set_reg_addr (this_cache, E_D2_REGNUM,
  581. sc_base + AM33_SIGCONTEXT_D2);
  582. trad_frame_set_reg_addr (this_cache, E_D3_REGNUM,
  583. sc_base + AM33_SIGCONTEXT_D3);
  584. trad_frame_set_reg_addr (this_cache, E_A0_REGNUM,
  585. sc_base + AM33_SIGCONTEXT_A0);
  586. trad_frame_set_reg_addr (this_cache, E_A1_REGNUM,
  587. sc_base + AM33_SIGCONTEXT_A1);
  588. trad_frame_set_reg_addr (this_cache, E_A2_REGNUM,
  589. sc_base + AM33_SIGCONTEXT_A2);
  590. trad_frame_set_reg_addr (this_cache, E_A3_REGNUM,
  591. sc_base + AM33_SIGCONTEXT_A3);
  592. trad_frame_set_reg_addr (this_cache, E_E0_REGNUM,
  593. sc_base + AM33_SIGCONTEXT_E0);
  594. trad_frame_set_reg_addr (this_cache, E_E1_REGNUM,
  595. sc_base + AM33_SIGCONTEXT_E1);
  596. trad_frame_set_reg_addr (this_cache, E_E2_REGNUM,
  597. sc_base + AM33_SIGCONTEXT_E2);
  598. trad_frame_set_reg_addr (this_cache, E_E3_REGNUM,
  599. sc_base + AM33_SIGCONTEXT_E3);
  600. trad_frame_set_reg_addr (this_cache, E_E4_REGNUM,
  601. sc_base + AM33_SIGCONTEXT_E4);
  602. trad_frame_set_reg_addr (this_cache, E_E5_REGNUM,
  603. sc_base + AM33_SIGCONTEXT_E5);
  604. trad_frame_set_reg_addr (this_cache, E_E6_REGNUM,
  605. sc_base + AM33_SIGCONTEXT_E6);
  606. trad_frame_set_reg_addr (this_cache, E_E7_REGNUM,
  607. sc_base + AM33_SIGCONTEXT_E7);
  608. trad_frame_set_reg_addr (this_cache, E_LAR_REGNUM,
  609. sc_base + AM33_SIGCONTEXT_LAR);
  610. trad_frame_set_reg_addr (this_cache, E_LIR_REGNUM,
  611. sc_base + AM33_SIGCONTEXT_LIR);
  612. trad_frame_set_reg_addr (this_cache, E_MDR_REGNUM,
  613. sc_base + AM33_SIGCONTEXT_MDR);
  614. trad_frame_set_reg_addr (this_cache, E_MCVF_REGNUM,
  615. sc_base + AM33_SIGCONTEXT_MCVF);
  616. trad_frame_set_reg_addr (this_cache, E_MCRL_REGNUM,
  617. sc_base + AM33_SIGCONTEXT_MCRL);
  618. trad_frame_set_reg_addr (this_cache, E_MDRQ_REGNUM,
  619. sc_base + AM33_SIGCONTEXT_MDRQ);
  620. trad_frame_set_reg_addr (this_cache, E_SP_REGNUM,
  621. sc_base + AM33_SIGCONTEXT_SP);
  622. trad_frame_set_reg_addr (this_cache, E_PSW_REGNUM,
  623. sc_base + AM33_SIGCONTEXT_EPSW);
  624. trad_frame_set_reg_addr (this_cache, E_PC_REGNUM,
  625. sc_base + AM33_SIGCONTEXT_PC);
  626. fpubase = get_frame_memory_unsigned (this_frame,
  627. sc_base + AM33_SIGCONTEXT_FPUCONTEXT,
  628. 4);
  629. if (fpubase)
  630. {
  631. for (i = 0; i < 32; i++)
  632. {
  633. trad_frame_set_reg_addr (this_cache, E_FS0_REGNUM + i,
  634. fpubase + 4 * i);
  635. }
  636. trad_frame_set_reg_addr (this_cache, E_FPCR_REGNUM, fpubase + 4 * 32);
  637. }
  638. trad_frame_set_id (this_cache, frame_id_build (sc_base, func));
  639. }
  640. /* AM33 GNU/Linux osabi has been recognized.
  641. Now's our chance to register our corefile handling. */
  642. static void
  643. am33_linux_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
  644. {
  645. linux_init_abi (info, gdbarch, 0);
  646. set_gdbarch_iterate_over_regset_sections
  647. (gdbarch, am33_iterate_over_regset_sections);
  648. set_solib_svr4_fetch_link_map_offsets
  649. (gdbarch, linux_ilp32_fetch_link_map_offsets);
  650. tramp_frame_prepend_unwinder (gdbarch, &am33_linux_sigframe);
  651. tramp_frame_prepend_unwinder (gdbarch, &am33_linux_rt_sigframe);
  652. }
  653. void _initialize_mn10300_linux_tdep ();
  654. void
  655. _initialize_mn10300_linux_tdep ()
  656. {
  657. gdbarch_register_osabi (bfd_arch_mn10300, 0,
  658. GDB_OSABI_LINUX, am33_linux_init_osabi);
  659. }