1/* Low level interface to valgrind, for the remote server for GDB integrated
2   in valgrind.
3   Copyright (C) 2012
4   Free Software Foundation, Inc.
5
6   This file is part of VALGRIND.
7   It has been inspired from a file from gdbserver in gdb 6.6.
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19   You should have received a copy of the GNU General Public License
20   along with this program; if not, write to the Free Software
21   Foundation, Inc., 51 Franklin Street, Fifth Floor,
22   Boston, MA 02110-1301, USA.  */
23
24#include "server.h"
25#include "target.h"
26#include "regdef.h"
27#include "regcache.h"
28
29#include "pub_core_aspacemgr.h"
30#include "pub_core_machine.h"
31#include "pub_core_debuginfo.h"
32#include "pub_core_threadstate.h"
33#include "pub_core_transtab.h"
34#include "pub_core_gdbserver.h"
35
36#include "valgrind_low.h"
37
38#include "libvex_guest_mips32.h"
39
40static struct reg regs[] = {
41  { "r0", 0, 32 },
42  { "r1", 32, 32 },
43  { "r2", 64, 32 },
44  { "r3", 96, 32 },
45  { "r4", 128, 32 },
46  { "r5", 160, 32 },
47  { "r6", 192, 32 },
48  { "r7", 224, 32 },
49  { "r8", 256, 32 },
50  { "r9", 288, 32 },
51  { "r10", 320, 32 },
52  { "r11", 352, 32 },
53  { "r12", 384, 32 },
54  { "r13", 416, 32 },
55  { "r14", 448, 32 },
56  { "r15", 480, 32 },
57  { "r16", 512, 32 },
58  { "r17", 544, 32 },
59  { "r18", 576, 32 },
60  { "r19", 608, 32 },
61  { "r20", 640, 32 },
62  { "r21", 672, 32 },
63  { "r22", 704, 32 },
64  { "r23", 736, 32 },
65  { "r24", 768, 32 },
66  { "r25", 800, 32 },
67  { "r26", 832, 32 },
68  { "r27", 864, 32 },
69  { "r28", 896, 32 },
70  { "r29", 928, 32 },
71  { "r30", 960, 32 },
72  { "r31", 992, 32 },
73  { "status", 1024, 32 },
74  { "lo", 1056, 32 },
75  { "hi", 1088, 32 },
76  { "badvaddr", 1120, 32 },
77  { "cause", 1152, 32 },
78  { "pc", 1184, 32 },
79  { "f0", 1216, 32 },
80  { "f1", 1248, 32 },
81  { "f2", 1280, 32 },
82  { "f3", 1312, 32 },
83  { "f4", 1344, 32 },
84  { "f5", 1376, 32 },
85  { "f6", 1408, 32 },
86  { "f7", 1440, 32 },
87  { "f8", 1472, 32 },
88  { "f9", 1504, 32 },
89  { "f10", 1536, 32 },
90  { "f11", 1568, 32 },
91  { "f12", 1600, 32 },
92  { "f13", 1632, 32 },
93  { "f14", 1664, 32 },
94  { "f15", 1696, 32 },
95  { "f16", 1728, 32 },
96  { "f17", 1760, 32 },
97  { "f18", 1792, 32 },
98  { "f19", 1824, 32 },
99  { "f20", 1856, 32 },
100  { "f21", 1888, 32 },
101  { "f22", 1920, 32 },
102  { "f23", 1952, 32 },
103  { "f24", 1984, 32 },
104  { "f25", 2016, 32 },
105  { "f26", 2048, 32 },
106  { "f27", 2080, 32 },
107  { "f28", 2112, 32 },
108  { "f29", 2144, 32 },
109  { "f30", 2176, 32 },
110  { "f31", 2208, 32 },
111  { "fcsr", 2240, 32 },
112  { "fir", 2272, 32 },
113  { "restart", 2304, 32 },
114};
115
116#define num_regs (sizeof (regs) / sizeof (regs[0]))
117
118static const char *expedite_regs[] = { "r29", "pc", 0 };
119
120static
121CORE_ADDR get_pc (void)
122{
123   unsigned long pc;
124
125   collect_register_by_name ("pc", &pc);
126
127   dlog(1, "stop pc is %p\n", (void *) pc);
128   return pc;
129}
130
131static
132void set_pc (CORE_ADDR newpc)
133{
134   Bool mod;
135   supply_register_by_name ("pc", &newpc, &mod);
136   if (mod)
137      dlog(1, "set pc to %p\n", C2v (newpc));
138   else
139      dlog(1, "set pc not changed %p\n", C2v (newpc));
140}
141
142/* These are the fields of 32 bit mips instructions. */
143#define itype_op(x) (x >> 26)
144#define itype_rs(x) ((x >> 21) & 0x1f)
145#define itype_rt(x) ((x >> 16) & 0x1f)
146#define rtype_funct(x) (x & 0x3f)
147
148/* Do a endian load of a 32-bit word, regardless of the
149   endianness of the underlying host. */
150static inline UInt getUInt(UChar * p)
151{
152   UInt w = 0;
153#if defined (_MIPSEL)
154   w = (w << 8) | p[3];
155   w = (w << 8) | p[2];
156   w = (w << 8) | p[1];
157   w = (w << 8) | p[0];
158#elif defined (_MIPSEB)
159   w = (w << 8) | p[0];
160   w = (w << 8) | p[1];
161   w = (w << 8) | p[2];
162   w = (w << 8) | p[3];
163#endif
164   return w;
165}
166
167/* Return non-zero if the ADDR instruction has a branch delay slot
168   (i.e. it is a jump or branch instruction). */
169static UInt
170mips_instruction_has_delay_slot (Addr addr)
171{
172   UInt op, rs, rt;
173   UInt inst = getUInt((UChar *)addr);
174
175   op = itype_op (inst);
176   if ((inst & 0xe0000000) != 0) {
177      rs = itype_rs (inst);
178      rt = itype_rt (inst);
179      return (op >> 2 == 5        /* BEQL, BNEL, BLEZL, BGTZL: bits 0101xx  */
180              || op == 29         /* JALX: bits 011101  */
181              || (op == 17
182                  && (rs == 8     /* BC1F, BC1FL, BC1T, BC1TL: 010001 01000  */
183                      || (rs == 9 && (rt & 0x2) == 0)
184                                  /* BC1ANY2F, BC1ANY2T: bits 010001 01001  */
185                      || (rs == 10 && (rt & 0x2) == 0))));
186                                  /* BC1ANY4F, BC1ANY4T: bits 010001 01010  */
187   } else
188      switch (op & 0x07) {        /* extract bits 28,27,26  */
189         case 0:                  /* SPECIAL  */
190            op = rtype_funct (inst);
191         return (op == 8          /* JR  */
192                 || op == 9);     /* JALR  */
193         break;                   /* end SPECIAL  */
194         case 1:                  /* REGIMM  */
195            rs = itype_rs (inst);
196            rt = itype_rt (inst); /* branch condition  */
197            return ((rt & 0xc) == 0
198                                  /* BLTZ, BLTZL, BGEZ, BGEZL: bits 000xx  */
199                                  /* BLTZAL, BLTZALL, BGEZAL, BGEZALL: 100xx  */
200                    || ((rt & 0x1e) == 0x1c && rs == 0));
201                                  /* BPOSGE32, BPOSGE64: bits 1110x  */
202            break;                /* end REGIMM  */
203         default:                 /* J, JAL, BEQ, BNE, BLEZ, BGTZ  */
204            return 1;
205            break;
206   }
207}
208
209/* Move the breakpoint at BPADDR out of any branch delay slot by shifting
210   it backwards if necessary.  Return the address of the new location.  */
211static Addr mips_adjust_breakpoint_address (Addr pc)
212{
213   Addr prev_addr;
214   Addr boundary;
215   Addr func_addr;
216   Addr bpaddr = pc;
217   Addr mask = 0xffffffff;
218   int segsize;
219   PtrdiffT offset;
220
221   /* Calculate the starting address of the MIPS memory segment pc is in. */
222   if (bpaddr & 0x80000000)  /* kernel segment */
223      segsize = 29;
224   else
225      segsize = 31;          /* user segment */
226   mask <<= segsize;
227   boundary = pc & mask;
228
229   /* Make sure we don't scan back before the beginning of the current
230      function, since we may fetch constant data or insns that look like
231      a jump. */
232   if (VG_(get_inst_offset_in_function) (bpaddr, &offset)) {
233      func_addr = bpaddr - offset;
234      if (func_addr > boundary && func_addr <= bpaddr)
235         boundary = func_addr;
236   }
237
238   if (bpaddr == boundary)
239      return bpaddr;
240   /* If the previous instruction has a branch delay slot, we have
241      to move the breakpoint to the branch instruction. */
242   prev_addr = bpaddr - 4;
243   if (mips_instruction_has_delay_slot (prev_addr))
244      bpaddr = prev_addr;
245
246   return bpaddr;
247}
248
249/* store registers in the guest state (gdbserver_to_valgrind)
250   or fetch register from the guest state (valgrind_to_gdbserver). */
251static
252void transfer_register (ThreadId tid, int abs_regno, void * buf,
253                        transfer_direction dir, int size, Bool *mod)
254{
255   ThreadState* tst = VG_(get_ThreadState)(tid);
256   int set = abs_regno / num_regs;
257   int regno = abs_regno % num_regs;
258   *mod = False;
259
260   VexGuestMIPS32State* mips1 = (VexGuestMIPS32State*) get_arch (set, tst);
261
262   switch (regno) {
263   case 0:  VG_(transfer) (&mips1->guest_r0,  buf, dir, size, mod); break;
264   case 1:  VG_(transfer) (&mips1->guest_r1,  buf, dir, size, mod); break;
265   case 2:  VG_(transfer) (&mips1->guest_r2,  buf, dir, size, mod); break;
266   case 3:  VG_(transfer) (&mips1->guest_r3,  buf, dir, size, mod); break;
267   case 4:  VG_(transfer) (&mips1->guest_r4,  buf, dir, size, mod); break;
268   case 5:  VG_(transfer) (&mips1->guest_r5,  buf, dir, size, mod); break;
269   case 6:  VG_(transfer) (&mips1->guest_r6,  buf, dir, size, mod); break;
270   case 7:  VG_(transfer) (&mips1->guest_r7,  buf, dir, size, mod); break;
271   case 8:  VG_(transfer) (&mips1->guest_r8,  buf, dir, size, mod); break;
272   case 9:  VG_(transfer) (&mips1->guest_r9,  buf, dir, size, mod); break;
273   case 10: VG_(transfer) (&mips1->guest_r10,  buf, dir, size, mod); break;
274   case 11: VG_(transfer) (&mips1->guest_r11,  buf, dir, size, mod); break;
275   case 12: VG_(transfer) (&mips1->guest_r12, buf, dir, size, mod); break;
276   case 13: VG_(transfer) (&mips1->guest_r13, buf, dir, size, mod); break;
277   case 14: VG_(transfer) (&mips1->guest_r14, buf, dir, size, mod); break;
278   case 15: VG_(transfer) (&mips1->guest_r15, buf, dir, size, mod); break;
279   case 16: VG_(transfer) (&mips1->guest_r16, buf, dir, size, mod); break;
280   case 17: VG_(transfer) (&mips1->guest_r17, buf, dir, size, mod); break;
281   case 18: VG_(transfer) (&mips1->guest_r18,  buf, dir, size, mod); break;
282   case 19: VG_(transfer) (&mips1->guest_r19,  buf, dir, size, mod); break;
283   case 20: VG_(transfer) (&mips1->guest_r20,  buf, dir, size, mod); break;
284   case 21: VG_(transfer) (&mips1->guest_r21,  buf, dir, size, mod); break;
285   case 22: VG_(transfer) (&mips1->guest_r22,  buf, dir, size, mod); break;
286   case 23: VG_(transfer) (&mips1->guest_r23,  buf, dir, size, mod); break;
287   case 24: VG_(transfer) (&mips1->guest_r24,  buf, dir, size, mod); break;
288   case 25: VG_(transfer) (&mips1->guest_r25,  buf, dir, size, mod); break;
289   case 26: VG_(transfer) (&mips1->guest_r26,  buf, dir, size, mod); break;
290   case 27: VG_(transfer) (&mips1->guest_r27,  buf, dir, size, mod); break;
291   case 28: VG_(transfer) (&mips1->guest_r28, buf, dir, size, mod); break;
292   case 29: VG_(transfer) (&mips1->guest_r29, buf, dir, size, mod); break;
293   case 30: VG_(transfer) (&mips1->guest_r30, buf, dir, size, mod); break;
294   case 31: VG_(transfer) (&mips1->guest_r31, buf, dir, size, mod); break;
295   case 32: *mod = False; break; // GDBTD???? VEX { "status", 1024, 32 },
296   case 33: VG_(transfer) (&mips1->guest_LO, buf, dir, size, mod); break;
297   case 34: VG_(transfer) (&mips1->guest_HI, buf, dir, size, mod); break;
298   case 35: *mod = False; break; // GDBTD???? VEX { "badvaddr", 1120, 32 },
299   case 36: *mod = False; break; // GDBTD???? VEX { "cause", 1152, 32 },
300   case 37:
301      /* If a breakpoint is set on the instruction in a branch delay slot,
302         GDB gets confused.  When the breakpoint is hit, the PC isn't on
303         the instruction in the branch delay slot, the PC will point to
304         the branch instruction. */
305      mips1->guest_PC = mips_adjust_breakpoint_address(mips1->guest_PC);
306      VG_(transfer) (&mips1->guest_PC,  buf, dir, size, mod);
307      break;
308   case 38: VG_(transfer) (&mips1->guest_f0,  buf, dir, size, mod); break;
309   case 39: VG_(transfer) (&mips1->guest_f1,  buf, dir, size, mod); break;
310   case 40: VG_(transfer) (&mips1->guest_f2,  buf, dir, size, mod); break;
311   case 41: VG_(transfer) (&mips1->guest_f3,  buf, dir, size, mod); break;
312   case 42: VG_(transfer) (&mips1->guest_f4,  buf, dir, size, mod); break;
313   case 43: VG_(transfer) (&mips1->guest_f5,  buf, dir, size, mod); break;
314   case 44: VG_(transfer) (&mips1->guest_f6,  buf, dir, size, mod); break;
315   case 45: VG_(transfer) (&mips1->guest_f7, buf, dir, size, mod); break;
316   case 46: VG_(transfer) (&mips1->guest_f8, buf, dir, size, mod); break;
317   case 47: VG_(transfer) (&mips1->guest_f9, buf, dir, size, mod); break;
318   case 48: VG_(transfer) (&mips1->guest_f10, buf, dir, size, mod); break;
319   case 49: VG_(transfer) (&mips1->guest_f11, buf, dir, size, mod); break;
320   case 50: VG_(transfer) (&mips1->guest_f12, buf, dir, size, mod); break;
321   case 51: VG_(transfer) (&mips1->guest_f13,  buf, dir, size, mod); break;
322   case 52: VG_(transfer) (&mips1->guest_f14,  buf, dir, size, mod); break;
323   case 53: VG_(transfer) (&mips1->guest_f15,  buf, dir, size, mod); break;
324   case 54: VG_(transfer) (&mips1->guest_f16,  buf, dir, size, mod); break;
325   case 55: VG_(transfer) (&mips1->guest_f17,  buf, dir, size, mod); break;
326   case 56: VG_(transfer) (&mips1->guest_f18,  buf, dir, size, mod); break;
327   case 57: VG_(transfer) (&mips1->guest_f19, buf, dir, size, mod); break;
328   case 58: VG_(transfer) (&mips1->guest_f20, buf, dir, size, mod); break;
329   case 59: VG_(transfer) (&mips1->guest_f21, buf, dir, size, mod); break;
330   case 60: VG_(transfer) (&mips1->guest_f22, buf, dir, size, mod); break;
331   case 61: VG_(transfer) (&mips1->guest_f23, buf, dir, size, mod); break;
332   case 62: VG_(transfer) (&mips1->guest_f24,  buf, dir, size, mod); break;
333   case 63: VG_(transfer) (&mips1->guest_f25,  buf, dir, size, mod); break;
334   case 64: VG_(transfer) (&mips1->guest_f26,  buf, dir, size, mod); break;
335   case 65: VG_(transfer) (&mips1->guest_f27,  buf, dir, size, mod); break;
336   case 66: VG_(transfer) (&mips1->guest_f28,  buf, dir, size, mod); break;
337   case 67: VG_(transfer) (&mips1->guest_f29,  buf, dir, size, mod); break;
338   case 68: VG_(transfer) (&mips1->guest_f30, buf, dir, size, mod); break;
339   case 69: VG_(transfer) (&mips1->guest_f31, buf, dir, size, mod); break;
340   case 70: VG_(transfer) (&mips1->guest_FCSR, buf, dir, size, mod); break;
341   case 71: VG_(transfer) (&mips1->guest_FIR, buf, dir, size, mod); break;
342   case 72: *mod = False; break; // GDBTD???? VEX{ "restart", 2304, 32 },
343   default: VG_(printf)("regno: %d\n", regno); vg_assert(0);
344   }
345}
346
347static
348const char* target_xml (Bool shadow_mode)
349{
350   if (shadow_mode) {
351      return "mips-linux-valgrind.xml";
352   } else {
353      return "mips-linux.xml";
354   }
355}
356
357static struct valgrind_target_ops low_target = {
358   num_regs,
359   regs,
360   29, //sp = r29, which is register offset 29 in regs
361   transfer_register,
362   get_pc,
363   set_pc,
364   "mips",
365   target_xml
366};
367
368void mips32_init_architecture (struct valgrind_target_ops *target)
369{
370   *target = low_target;
371   set_register_cache (regs, num_regs);
372   gdbserver_expedite_regs = expedite_regs;
373}
374