1da0c48c4Sopenharmony_ci/* Fetch live process registers from TID.
2da0c48c4Sopenharmony_ci   This file is part of elfutils.
3da0c48c4Sopenharmony_ci
4da0c48c4Sopenharmony_ci   This file is free software; you can redistribute it and/or modify
5da0c48c4Sopenharmony_ci   it under the terms of either
6da0c48c4Sopenharmony_ci
7da0c48c4Sopenharmony_ci     * the GNU Lesser General Public License as published by the Free
8da0c48c4Sopenharmony_ci       Software Foundation; either version 3 of the License, or (at
9da0c48c4Sopenharmony_ci       your option) any later version
10da0c48c4Sopenharmony_ci
11da0c48c4Sopenharmony_ci   or
12da0c48c4Sopenharmony_ci
13da0c48c4Sopenharmony_ci     * the GNU General Public License as published by the Free
14da0c48c4Sopenharmony_ci       Software Foundation; either version 2 of the License, or (at
15da0c48c4Sopenharmony_ci       your option) any later version
16da0c48c4Sopenharmony_ci
17da0c48c4Sopenharmony_ci   or both in parallel, as here.
18da0c48c4Sopenharmony_ci
19da0c48c4Sopenharmony_ci   elfutils is distributed in the hope that it will be useful, but
20da0c48c4Sopenharmony_ci   WITHOUT ANY WARRANTY; without even the implied warranty of
21da0c48c4Sopenharmony_ci   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22da0c48c4Sopenharmony_ci   General Public License for more details.
23da0c48c4Sopenharmony_ci
24da0c48c4Sopenharmony_ci   You should have received copies of the GNU General Public License and
25da0c48c4Sopenharmony_ci   the GNU Lesser General Public License along with this program.  If
26da0c48c4Sopenharmony_ci   not, see <http://www.gnu.org/licenses/>.  */
27da0c48c4Sopenharmony_ci
28da0c48c4Sopenharmony_ci#ifdef HAVE_CONFIG_H
29da0c48c4Sopenharmony_ci# include <config.h>
30da0c48c4Sopenharmony_ci#endif
31da0c48c4Sopenharmony_ci
32da0c48c4Sopenharmony_ci#if defined __m68k__ && defined __linux__
33da0c48c4Sopenharmony_ci# include <sys/types.h>
34da0c48c4Sopenharmony_ci# include <sys/user.h>
35da0c48c4Sopenharmony_ci# include <sys/ptrace.h>
36da0c48c4Sopenharmony_ci#endif
37da0c48c4Sopenharmony_ci
38da0c48c4Sopenharmony_ci#define BACKEND m68k_
39da0c48c4Sopenharmony_ci#include "libebl_CPU.h"
40da0c48c4Sopenharmony_ci
41da0c48c4Sopenharmony_cibool
42da0c48c4Sopenharmony_cim68k_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
43da0c48c4Sopenharmony_ci				ebl_tid_registers_t *setfunc __attribute__ ((unused)),
44da0c48c4Sopenharmony_ci				void *arg __attribute__ ((unused)))
45da0c48c4Sopenharmony_ci{
46da0c48c4Sopenharmony_ci#if !defined __m68k__ || !defined __linux__
47da0c48c4Sopenharmony_ci  return false;
48da0c48c4Sopenharmony_ci#else /* __m68k__ */
49da0c48c4Sopenharmony_ci  struct user_regs_struct user_regs;
50da0c48c4Sopenharmony_ci  if (ptrace (PTRACE_GETREGS, tid, NULL, &user_regs) != 0)
51da0c48c4Sopenharmony_ci    return false;
52da0c48c4Sopenharmony_ci
53da0c48c4Sopenharmony_ci  Dwarf_Word dwarf_regs[16];
54da0c48c4Sopenharmony_ci  dwarf_regs[0] = user_regs.d0;
55da0c48c4Sopenharmony_ci  dwarf_regs[1] = user_regs.d1;
56da0c48c4Sopenharmony_ci  dwarf_regs[2] = user_regs.d2;
57da0c48c4Sopenharmony_ci  dwarf_regs[3] = user_regs.d3;
58da0c48c4Sopenharmony_ci  dwarf_regs[4] = user_regs.d4;
59da0c48c4Sopenharmony_ci  dwarf_regs[5] = user_regs.d5;
60da0c48c4Sopenharmony_ci  dwarf_regs[6] = user_regs.d6;
61da0c48c4Sopenharmony_ci  dwarf_regs[7] = user_regs.d7;
62da0c48c4Sopenharmony_ci  dwarf_regs[8] = user_regs.a0;
63da0c48c4Sopenharmony_ci  dwarf_regs[9] = user_regs.a1;
64da0c48c4Sopenharmony_ci  dwarf_regs[10] = user_regs.a2;
65da0c48c4Sopenharmony_ci  dwarf_regs[11] = user_regs.a3;
66da0c48c4Sopenharmony_ci  dwarf_regs[12] = user_regs.a4;
67da0c48c4Sopenharmony_ci  dwarf_regs[13] = user_regs.a5;
68da0c48c4Sopenharmony_ci  dwarf_regs[14] = user_regs.a6;
69da0c48c4Sopenharmony_ci  dwarf_regs[15] = user_regs.usp;
70da0c48c4Sopenharmony_ci
71da0c48c4Sopenharmony_ci  /* D0..D7, A0..A7.  */
72da0c48c4Sopenharmony_ci  if (! setfunc (0, 16, dwarf_regs, arg))
73da0c48c4Sopenharmony_ci    return false;
74da0c48c4Sopenharmony_ci
75da0c48c4Sopenharmony_ci  /* PC.  */
76da0c48c4Sopenharmony_ci  dwarf_regs[0] = user_regs.pc;
77da0c48c4Sopenharmony_ci  if (! setfunc (24, 1, dwarf_regs, arg))
78da0c48c4Sopenharmony_ci    return false;
79da0c48c4Sopenharmony_ci
80da0c48c4Sopenharmony_ci  return true;
81da0c48c4Sopenharmony_ci#endif /* __m68k__ */
82da0c48c4Sopenharmony_ci}
83