1 /* GNU/Linux/Xtensa specific low level interface, for the remote server for GDB.
2 Copyright 2007, 2008 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "linux-low.h"
23 #include <sys/ptrace.h>
24 #include <xtensa-config.h>
26 #include "xtensa-xtregs.c"
30 R_LBEG
, R_LEND
, R_LCOUNT
,
37 xtensa_fill_gregset (void *buf
)
39 elf_greg_t
* rset
= (elf_greg_t
*)buf
;
44 /* Take care of AR registers. */
46 ar0_regnum
= find_regno ("ar0");
47 ptr
= (char*)&rset
[R_A0
];
49 for (i
= ar0_regnum
; i
< ar0_regnum
+ XCHAL_NUM_AREGS
; i
++)
51 collect_register (i
, ptr
);
52 ptr
+= register_size(i
);
55 /* Loop registers, if hardware has it. */
58 collect_register_by_name ("lbeg", (char*)&rset
[R_LBEG
]);
59 collect_register_by_name ("lend", (char*)&rset
[R_LEND
]);
60 collect_register_by_name ("lcount", (char*)&rset
[R_LCOUNT
]);
63 collect_register_by_name ("sar", (char*)&rset
[R_SAR
]);
64 collect_register_by_name ("pc", (char*)&rset
[R_PC
]);
65 collect_register_by_name ("ps", (char*)&rset
[R_PS
]);
66 collect_register_by_name ("windowbase", (char*)&rset
[R_WB
]);
67 collect_register_by_name ("windowstart", (char*)&rset
[R_WS
]);
71 xtensa_store_gregset (const void *buf
)
73 const elf_greg_t
* rset
= (const elf_greg_t
*)buf
;
78 /* Take care of AR registers. */
80 ar0_regnum
= find_regno ("ar0");
81 ptr
= (char *)&rset
[R_A0
];
83 for (i
= ar0_regnum
; i
< ar0_regnum
+ XCHAL_NUM_AREGS
; i
++)
85 supply_register (i
, ptr
);
86 ptr
+= register_size(i
);
89 /* Loop registers, if hardware has it. */
92 supply_register_by_name ("lbeg", (char*)&rset
[R_LBEG
]);
93 supply_register_by_name ("lend", (char*)&rset
[R_LEND
]);
94 supply_register_by_name ("lcount", (char*)&rset
[R_LCOUNT
]);
97 supply_register_by_name ("sar", (char*)&rset
[R_SAR
]);
98 supply_register_by_name ("pc", (char*)&rset
[R_PC
]);
99 supply_register_by_name ("ps", (char*)&rset
[R_PS
]);
100 supply_register_by_name ("windowbase", (char*)&rset
[R_WB
]);
101 supply_register_by_name ("windowstart", (char*)&rset
[R_WS
]);
104 /* Xtensa GNU/Linux PTRACE interface includes extended register set. */
107 xtensa_fill_xtregset (void *buf
)
109 const xtensa_regtable_t
*ptr
;
111 for (ptr
= xtensa_regmap_table
; ptr
->name
; ptr
++)
113 collect_register_by_name (ptr
->name
,
114 (char*)buf
+ ptr
->ptrace_offset
);
119 xtensa_store_xtregset (const void *buf
)
121 const xtensa_regtable_t
*ptr
;
123 for (ptr
= xtensa_regmap_table
; ptr
->name
; ptr
++)
125 supply_register_by_name (ptr
->name
,
126 (char*)buf
+ ptr
->ptrace_offset
);
130 struct regset_info target_regsets
[] = {
131 { PTRACE_GETREGS
, PTRACE_SETREGS
, sizeof (elf_gregset_t
),
133 xtensa_fill_gregset
, xtensa_store_gregset
},
134 { PTRACE_GETXTREGS
, PTRACE_SETXTREGS
, XTENSA_ELF_XTREG_SIZE
,
136 xtensa_fill_xtregset
, xtensa_store_xtregset
},
137 { 0, 0, -1, -1, NULL
, NULL
}
141 #define XTENSA_BREAKPOINT {0xd2,0x0f}
143 #define XTENSA_BREAKPOINT {0x2d,0xf0}
146 static const unsigned char xtensa_breakpoint
[] = XTENSA_BREAKPOINT
;
147 #define xtensa_breakpoint_len 2
154 collect_register_by_name ("pc", &pc
);
159 xtensa_set_pc (CORE_ADDR pc
)
161 unsigned long newpc
= pc
;
162 supply_register_by_name ("pc", &newpc
);
166 xtensa_breakpoint_at (CORE_ADDR where
)
170 (*the_target
->read_memory
) (where
, (unsigned char *) &insn
,
171 xtensa_breakpoint_len
);
172 return memcmp((char *)&insn
, xtensa_breakpoint
, xtensa_breakpoint_len
) == 0;
175 struct linux_target_ops the_low_target
= {
183 xtensa_breakpoint_len
,
186 xtensa_breakpoint_at
,