OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.1/] [gdb/] [gdbserver/] [linux-x86-low.c] - Blame information for rev 231

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 227 jeremybenn
/* GNU/Linux/x86-64 specific low level interface, for the remote server
2
   for GDB.
3
   Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
 
21
#include <stddef.h>
22
#include <signal.h>
23
#include "server.h"
24
#include "linux-low.h"
25
#include "i387-fp.h"
26
#include "i386-low.h"
27
 
28
#include "gdb_proc_service.h"
29
 
30
/* Defined in auto-generated file reg-i386-linux.c.  */
31
void init_registers_i386_linux (void);
32
/* Defined in auto-generated file reg-x86-64-linux.c.  */
33
void init_registers_x86_64_linux (void);
34
 
35
#include <sys/reg.h>
36
#include <sys/procfs.h>
37
#include <sys/ptrace.h>
38
 
39
#ifndef PTRACE_GET_THREAD_AREA
40
#define PTRACE_GET_THREAD_AREA 25
41
#endif
42
 
43
/* This definition comes from prctl.h, but some kernels may not have it.  */
44
#ifndef PTRACE_ARCH_PRCTL
45
#define PTRACE_ARCH_PRCTL      30
46
#endif
47
 
48
/* The following definitions come from prctl.h, but may be absent
49
   for certain configurations.  */
50
#ifndef ARCH_GET_FS
51
#define ARCH_SET_GS 0x1001
52
#define ARCH_SET_FS 0x1002
53
#define ARCH_GET_FS 0x1003
54
#define ARCH_GET_GS 0x1004
55
#endif
56
 
57
/* Per-process arch-specific data we want to keep.  */
58
 
59
struct arch_process_info
60
{
61
  struct i386_debug_reg_state debug_reg_state;
62
};
63
 
64
/* Per-thread arch-specific data we want to keep.  */
65
 
66
struct arch_lwp_info
67
{
68
  /* Non-zero if our copy differs from what's recorded in the thread.  */
69
  int debug_registers_changed;
70
};
71
 
72
#ifdef __x86_64__
73
 
74
/* Mapping between the general-purpose registers in `struct user'
75
   format and GDB's register array layout.
76
   Note that the transfer layout uses 64-bit regs.  */
77
static /*const*/ int i386_regmap[] =
78
{
79
  RAX * 8, RCX * 8, RDX * 8, RBX * 8,
80
  RSP * 8, RBP * 8, RSI * 8, RDI * 8,
81
  RIP * 8, EFLAGS * 8, CS * 8, SS * 8,
82
  DS * 8, ES * 8, FS * 8, GS * 8
83
};
84
 
85
#define I386_NUM_REGS (sizeof (i386_regmap) / sizeof (i386_regmap[0]))
86
 
87
/* So code below doesn't have to care, i386 or amd64.  */
88
#define ORIG_EAX ORIG_RAX
89
 
90
static const int x86_64_regmap[] =
91
{
92
  RAX * 8, RBX * 8, RCX * 8, RDX * 8,
93
  RSI * 8, RDI * 8, RBP * 8, RSP * 8,
94
  R8 * 8, R9 * 8, R10 * 8, R11 * 8,
95
  R12 * 8, R13 * 8, R14 * 8, R15 * 8,
96
  RIP * 8, EFLAGS * 8, CS * 8, SS * 8,
97
  DS * 8, ES * 8, FS * 8, GS * 8,
98
  -1, -1, -1, -1, -1, -1, -1, -1,
99
  -1, -1, -1, -1, -1, -1, -1, -1,
100
  -1, -1, -1, -1, -1, -1, -1, -1,
101
  -1, -1, -1, -1, -1, -1, -1, -1, -1,
102
  ORIG_RAX * 8
103
};
104
 
105
#define X86_64_NUM_REGS (sizeof (x86_64_regmap) / sizeof (x86_64_regmap[0]))
106
 
107
#else /* ! __x86_64__ */
108
 
109
/* Mapping between the general-purpose registers in `struct user'
110
   format and GDB's register array layout.  */
111
static /*const*/ int i386_regmap[] =
112
{
113
  EAX * 4, ECX * 4, EDX * 4, EBX * 4,
114
  UESP * 4, EBP * 4, ESI * 4, EDI * 4,
115
  EIP * 4, EFL * 4, CS * 4, SS * 4,
116
  DS * 4, ES * 4, FS * 4, GS * 4
117
};
118
 
119
#define I386_NUM_REGS (sizeof (i386_regmap) / sizeof (i386_regmap[0]))
120
 
121
#endif
122
 
123
/* Called by libthread_db.  */
124
 
125
ps_err_e
126
ps_get_thread_area (const struct ps_prochandle *ph,
127
                    lwpid_t lwpid, int idx, void **base)
128
{
129
#ifdef __x86_64__
130
  int use_64bit = register_size (0) == 8;
131
 
132
  if (use_64bit)
133
    {
134
      switch (idx)
135
        {
136
        case FS:
137
          if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0)
138
            return PS_OK;
139
          break;
140
        case GS:
141
          if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0)
142
            return PS_OK;
143
          break;
144
        default:
145
          return PS_BADADDR;
146
        }
147
      return PS_ERR;
148
    }
149
#endif
150
 
151
  {
152
    unsigned int desc[4];
153
 
154
    if (ptrace (PTRACE_GET_THREAD_AREA, lwpid,
155
                (void *) (intptr_t) idx, (unsigned long) &desc) < 0)
156
      return PS_ERR;
157
 
158
    *(int *)base = desc[1];
159
    return PS_OK;
160
  }
161
}
162
 
163
static int
164
i386_cannot_store_register (int regno)
165
{
166
  return regno >= I386_NUM_REGS;
167
}
168
 
169
static int
170
i386_cannot_fetch_register (int regno)
171
{
172
  return regno >= I386_NUM_REGS;
173
}
174
 
175
static void
176
x86_fill_gregset (struct regcache *regcache, void *buf)
177
{
178
  int i;
179
 
180
#ifdef __x86_64__
181
  if (register_size (0) == 8)
182
    {
183
      for (i = 0; i < X86_64_NUM_REGS; i++)
184
        if (x86_64_regmap[i] != -1)
185
          collect_register (regcache, i, ((char *) buf) + x86_64_regmap[i]);
186
      return;
187
    }
188
#endif
189
 
190
  for (i = 0; i < I386_NUM_REGS; i++)
191
    collect_register (regcache, i, ((char *) buf) + i386_regmap[i]);
192
 
193
  collect_register_by_name (regcache, "orig_eax",
194
                            ((char *) buf) + ORIG_EAX * 4);
195
}
196
 
197
static void
198
x86_store_gregset (struct regcache *regcache, const void *buf)
199
{
200
  int i;
201
 
202
#ifdef __x86_64__
203
  if (register_size (0) == 8)
204
    {
205
      for (i = 0; i < X86_64_NUM_REGS; i++)
206
        if (x86_64_regmap[i] != -1)
207
          supply_register (regcache, i, ((char *) buf) + x86_64_regmap[i]);
208
      return;
209
    }
210
#endif
211
 
212
  for (i = 0; i < I386_NUM_REGS; i++)
213
    supply_register (regcache, i, ((char *) buf) + i386_regmap[i]);
214
 
215
  supply_register_by_name (regcache, "orig_eax",
216
                           ((char *) buf) + ORIG_EAX * 4);
217
}
218
 
219
static void
220
x86_fill_fpregset (struct regcache *regcache, void *buf)
221
{
222
#ifdef __x86_64__
223
  i387_cache_to_fxsave (regcache, buf);
224
#else
225
  i387_cache_to_fsave (regcache, buf);
226
#endif
227
}
228
 
229
static void
230
x86_store_fpregset (struct regcache *regcache, const void *buf)
231
{
232
#ifdef __x86_64__
233
  i387_fxsave_to_cache (regcache, buf);
234
#else
235
  i387_fsave_to_cache (regcache, buf);
236
#endif
237
}
238
 
239
#ifndef __x86_64__
240
 
241
static void
242
x86_fill_fpxregset (struct regcache *regcache, void *buf)
243
{
244
  i387_cache_to_fxsave (regcache, buf);
245
}
246
 
247
static void
248
x86_store_fpxregset (struct regcache *regcache, const void *buf)
249
{
250
  i387_fxsave_to_cache (regcache, buf);
251
}
252
 
253
#endif
254
 
255
/* ??? The non-biarch i386 case stores all the i387 regs twice.
256
   Once in i387_.*fsave.* and once in i387_.*fxsave.*.
257
   This is, presumably, to handle the case where PTRACE_[GS]ETFPXREGS
258
   doesn't work.  IWBN to avoid the duplication in the case where it
259
   does work.  Maybe the arch_setup routine could check whether it works
260
   and update target_regsets accordingly, maybe by moving target_regsets
261
   to linux_target_ops and set the right one there, rather than having to
262
   modify the target_regsets global.  */
263
 
264
struct regset_info target_regsets[] =
265
{
266
#ifdef HAVE_PTRACE_GETREGS
267
  { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
268
    GENERAL_REGS,
269
    x86_fill_gregset, x86_store_gregset },
270
# ifndef __x86_64__
271
#  ifdef HAVE_PTRACE_GETFPXREGS
272
  { PTRACE_GETFPXREGS, PTRACE_SETFPXREGS, sizeof (elf_fpxregset_t),
273
    EXTENDED_REGS,
274
    x86_fill_fpxregset, x86_store_fpxregset },
275
#  endif
276
# endif
277
  { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
278
    FP_REGS,
279
    x86_fill_fpregset, x86_store_fpregset },
280
#endif /* HAVE_PTRACE_GETREGS */
281
  { 0, 0, -1, -1, NULL, NULL }
282
};
283
 
284
static CORE_ADDR
285
x86_get_pc (struct regcache *regcache)
286
{
287
  int use_64bit = register_size (0) == 8;
288
 
289
  if (use_64bit)
290
    {
291
      unsigned long pc;
292
      collect_register_by_name (regcache, "rip", &pc);
293
      return (CORE_ADDR) pc;
294
    }
295
  else
296
    {
297
      unsigned int pc;
298
      collect_register_by_name (regcache, "eip", &pc);
299
      return (CORE_ADDR) pc;
300
    }
301
}
302
 
303
static void
304
x86_set_pc (struct regcache *regcache, CORE_ADDR pc)
305
{
306
  int use_64bit = register_size (0) == 8;
307
 
308
  if (use_64bit)
309
    {
310
      unsigned long newpc = pc;
311
      supply_register_by_name (regcache, "rip", &newpc);
312
    }
313
  else
314
    {
315
      unsigned int newpc = pc;
316
      supply_register_by_name (regcache, "eip", &newpc);
317
    }
318
}
319
 
320
static const unsigned char x86_breakpoint[] = { 0xCC };
321
#define x86_breakpoint_len 1
322
 
323
static int
324
x86_breakpoint_at (CORE_ADDR pc)
325
{
326
  unsigned char c;
327
 
328
  read_inferior_memory (pc, &c, 1);
329
  if (c == 0xCC)
330
    return 1;
331
 
332
  return 0;
333
}
334
 
335
/* Support for debug registers.  */
336
 
337
static unsigned long
338
x86_linux_dr_get (ptid_t ptid, int regnum)
339
{
340
  int tid;
341
  unsigned long value;
342
 
343
  tid = ptid_get_lwp (ptid);
344
 
345
  errno = 0;
346
  value = ptrace (PTRACE_PEEKUSER, tid,
347
                  offsetof (struct user, u_debugreg[regnum]), 0);
348
  if (errno != 0)
349
    error ("Couldn't read debug register");
350
 
351
  return value;
352
}
353
 
354
static void
355
x86_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
356
{
357
  int tid;
358
 
359
  tid = ptid_get_lwp (ptid);
360
 
361
  errno = 0;
362
  ptrace (PTRACE_POKEUSER, tid,
363
          offsetof (struct user, u_debugreg[regnum]), value);
364
  if (errno != 0)
365
    error ("Couldn't write debug register");
366
}
367
 
368
/* Update the inferior's debug register REGNUM from STATE.  */
369
 
370
void
371
i386_dr_low_set_addr (const struct i386_debug_reg_state *state, int regnum)
372
{
373
  struct inferior_list_entry *lp;
374
  CORE_ADDR addr;
375
  /* Only need to update the threads of this process.  */
376
  int pid = pid_of (get_thread_lwp (current_inferior));
377
 
378
  if (! (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR))
379
    fatal ("Invalid debug register %d", regnum);
380
 
381
  addr = state->dr_mirror[regnum];
382
 
383
  for (lp = all_lwps.head; lp; lp = lp->next)
384
    {
385
      struct lwp_info *lwp = (struct lwp_info *) lp;
386
 
387
      /* The actual update is done later, we just mark that the register
388
         needs updating.  */
389
      if (pid_of (lwp) == pid)
390
        lwp->arch_private->debug_registers_changed = 1;
391
    }
392
}
393
 
394
/* Update the inferior's DR7 debug control register from STATE.  */
395
 
396
void
397
i386_dr_low_set_control (const struct i386_debug_reg_state *state)
398
{
399
  struct inferior_list_entry *lp;
400
  /* Only need to update the threads of this process.  */
401
  int pid = pid_of (get_thread_lwp (current_inferior));
402
 
403
  for (lp = all_lwps.head; lp; lp = lp->next)
404
    {
405
      struct lwp_info *lwp = (struct lwp_info *) lp;
406
 
407
      /* The actual update is done later, we just mark that the register
408
         needs updating.  */
409
      if (pid_of (lwp) == pid)
410
        lwp->arch_private->debug_registers_changed = 1;
411
    }
412
}
413
 
414
/* Get the value of the DR6 debug status register from the inferior
415
   and record it in STATE.  */
416
 
417
void
418
i386_dr_low_get_status (struct i386_debug_reg_state *state)
419
{
420
  struct lwp_info *lwp = get_thread_lwp (current_inferior);
421
  ptid_t ptid = ptid_of (lwp);
422
 
423
  state->dr_status_mirror = x86_linux_dr_get (ptid, DR_STATUS);
424
}
425
 
426
/* Watchpoint support.  */
427
 
428
static int
429
x86_insert_point (char type, CORE_ADDR addr, int len)
430
{
431
  struct process_info *proc = current_process ();
432
  switch (type)
433
    {
434
    case '2':
435
    case '3':
436
    case '4':
437
      return i386_low_insert_watchpoint (&proc->private->arch_private->debug_reg_state,
438
                                         type, addr, len);
439
    default:
440
      /* Unsupported.  */
441
      return 1;
442
    }
443
}
444
 
445
static int
446
x86_remove_point (char type, CORE_ADDR addr, int len)
447
{
448
  struct process_info *proc = current_process ();
449
  switch (type)
450
    {
451
    case '2':
452
    case '3':
453
    case '4':
454
      return i386_low_remove_watchpoint (&proc->private->arch_private->debug_reg_state,
455
                                         type, addr, len);
456
    default:
457
      /* Unsupported.  */
458
      return 1;
459
    }
460
}
461
 
462
static int
463
x86_stopped_by_watchpoint (void)
464
{
465
  struct process_info *proc = current_process ();
466
  return i386_low_stopped_by_watchpoint (&proc->private->arch_private->debug_reg_state);
467
}
468
 
469
static CORE_ADDR
470
x86_stopped_data_address (void)
471
{
472
  struct process_info *proc = current_process ();
473
  CORE_ADDR addr;
474
  if (i386_low_stopped_data_address (&proc->private->arch_private->debug_reg_state,
475
                                     &addr))
476
    return addr;
477
  return 0;
478
}
479
 
480
/* Called when a new process is created.  */
481
 
482
static struct arch_process_info *
483
x86_linux_new_process (void)
484
{
485
  struct arch_process_info *info = xcalloc (1, sizeof (*info));
486
 
487
  i386_low_init_dregs (&info->debug_reg_state);
488
 
489
  return info;
490
}
491
 
492
/* Called when a new thread is detected.  */
493
 
494
static struct arch_lwp_info *
495
x86_linux_new_thread (void)
496
{
497
  struct arch_lwp_info *info = xcalloc (1, sizeof (*info));
498
 
499
  info->debug_registers_changed = 1;
500
 
501
  return info;
502
}
503
 
504
/* Called when resuming a thread.
505
   If the debug regs have changed, update the thread's copies.  */
506
 
507
static void
508
x86_linux_prepare_to_resume (struct lwp_info *lwp)
509
{
510
  if (lwp->arch_private->debug_registers_changed)
511
    {
512
      int i;
513
      ptid_t ptid = ptid_of (lwp);
514
      int pid = ptid_get_pid (ptid);
515
      struct process_info *proc = find_process_pid (pid);
516
      struct i386_debug_reg_state *state = &proc->private->arch_private->debug_reg_state;
517
 
518
      for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++)
519
        x86_linux_dr_set (ptid, i, state->dr_mirror[i]);
520
 
521
      x86_linux_dr_set (ptid, DR_CONTROL, state->dr_control_mirror);
522
 
523
      lwp->arch_private->debug_registers_changed = 0;
524
    }
525
}
526
 
527
/* When GDBSERVER is built as a 64-bit application on linux, the
528
   PTRACE_GETSIGINFO data is always presented in 64-bit layout.  Since
529
   debugging a 32-bit inferior with a 64-bit GDBSERVER should look the same
530
   as debugging it with a 32-bit GDBSERVER, we do the 32-bit <-> 64-bit
531
   conversion in-place ourselves.  */
532
 
533
/* These types below (compat_*) define a siginfo type that is layout
534
   compatible with the siginfo type exported by the 32-bit userspace
535
   support.  */
536
 
537
#ifdef __x86_64__
538
 
539
typedef int compat_int_t;
540
typedef unsigned int compat_uptr_t;
541
 
542
typedef int compat_time_t;
543
typedef int compat_timer_t;
544
typedef int compat_clock_t;
545
 
546
struct compat_timeval
547
{
548
  compat_time_t tv_sec;
549
  int tv_usec;
550
};
551
 
552
typedef union compat_sigval
553
{
554
  compat_int_t sival_int;
555
  compat_uptr_t sival_ptr;
556
} compat_sigval_t;
557
 
558
typedef struct compat_siginfo
559
{
560
  int si_signo;
561
  int si_errno;
562
  int si_code;
563
 
564
  union
565
  {
566
    int _pad[((128 / sizeof (int)) - 3)];
567
 
568
    /* kill() */
569
    struct
570
    {
571
      unsigned int _pid;
572
      unsigned int _uid;
573
    } _kill;
574
 
575
    /* POSIX.1b timers */
576
    struct
577
    {
578
      compat_timer_t _tid;
579
      int _overrun;
580
      compat_sigval_t _sigval;
581
    } _timer;
582
 
583
    /* POSIX.1b signals */
584
    struct
585
    {
586
      unsigned int _pid;
587
      unsigned int _uid;
588
      compat_sigval_t _sigval;
589
    } _rt;
590
 
591
    /* SIGCHLD */
592
    struct
593
    {
594
      unsigned int _pid;
595
      unsigned int _uid;
596
      int _status;
597
      compat_clock_t _utime;
598
      compat_clock_t _stime;
599
    } _sigchld;
600
 
601
    /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
602
    struct
603
    {
604
      unsigned int _addr;
605
    } _sigfault;
606
 
607
    /* SIGPOLL */
608
    struct
609
    {
610
      int _band;
611
      int _fd;
612
    } _sigpoll;
613
  } _sifields;
614
} compat_siginfo_t;
615
 
616
#define cpt_si_pid _sifields._kill._pid
617
#define cpt_si_uid _sifields._kill._uid
618
#define cpt_si_timerid _sifields._timer._tid
619
#define cpt_si_overrun _sifields._timer._overrun
620
#define cpt_si_status _sifields._sigchld._status
621
#define cpt_si_utime _sifields._sigchld._utime
622
#define cpt_si_stime _sifields._sigchld._stime
623
#define cpt_si_ptr _sifields._rt._sigval.sival_ptr
624
#define cpt_si_addr _sifields._sigfault._addr
625
#define cpt_si_band _sifields._sigpoll._band
626
#define cpt_si_fd _sifields._sigpoll._fd
627
 
628
/* glibc at least up to 2.3.2 doesn't have si_timerid, si_overrun.
629
   In their place is si_timer1,si_timer2.  */
630
#ifndef si_timerid
631
#define si_timerid si_timer1
632
#endif
633
#ifndef si_overrun
634
#define si_overrun si_timer2
635
#endif
636
 
637
static void
638
compat_siginfo_from_siginfo (compat_siginfo_t *to, siginfo_t *from)
639
{
640
  memset (to, 0, sizeof (*to));
641
 
642
  to->si_signo = from->si_signo;
643
  to->si_errno = from->si_errno;
644
  to->si_code = from->si_code;
645
 
646
  if (to->si_code < 0)
647
    {
648
      to->cpt_si_ptr = (intptr_t) from->si_ptr;
649
    }
650
  else if (to->si_code == SI_USER)
651
    {
652
      to->cpt_si_pid = from->si_pid;
653
      to->cpt_si_uid = from->si_uid;
654
    }
655
  else if (to->si_code == SI_TIMER)
656
    {
657
      to->cpt_si_timerid = from->si_timerid;
658
      to->cpt_si_overrun = from->si_overrun;
659
      to->cpt_si_ptr = (intptr_t) from->si_ptr;
660
    }
661
  else
662
    {
663
      switch (to->si_signo)
664
        {
665
        case SIGCHLD:
666
          to->cpt_si_pid = from->si_pid;
667
          to->cpt_si_uid = from->si_uid;
668
          to->cpt_si_status = from->si_status;
669
          to->cpt_si_utime = from->si_utime;
670
          to->cpt_si_stime = from->si_stime;
671
          break;
672
        case SIGILL:
673
        case SIGFPE:
674
        case SIGSEGV:
675
        case SIGBUS:
676
          to->cpt_si_addr = (intptr_t) from->si_addr;
677
          break;
678
        case SIGPOLL:
679
          to->cpt_si_band = from->si_band;
680
          to->cpt_si_fd = from->si_fd;
681
          break;
682
        default:
683
          to->cpt_si_pid = from->si_pid;
684
          to->cpt_si_uid = from->si_uid;
685
          to->cpt_si_ptr = (intptr_t) from->si_ptr;
686
          break;
687
        }
688
    }
689
}
690
 
691
static void
692
siginfo_from_compat_siginfo (siginfo_t *to, compat_siginfo_t *from)
693
{
694
  memset (to, 0, sizeof (*to));
695
 
696
  to->si_signo = from->si_signo;
697
  to->si_errno = from->si_errno;
698
  to->si_code = from->si_code;
699
 
700
  if (to->si_code < 0)
701
    {
702
      to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
703
    }
704
  else if (to->si_code == SI_USER)
705
    {
706
      to->si_pid = from->cpt_si_pid;
707
      to->si_uid = from->cpt_si_uid;
708
    }
709
  else if (to->si_code == SI_TIMER)
710
    {
711
      to->si_timerid = from->cpt_si_timerid;
712
      to->si_overrun = from->cpt_si_overrun;
713
      to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
714
    }
715
  else
716
    {
717
      switch (to->si_signo)
718
        {
719
        case SIGCHLD:
720
          to->si_pid = from->cpt_si_pid;
721
          to->si_uid = from->cpt_si_uid;
722
          to->si_status = from->cpt_si_status;
723
          to->si_utime = from->cpt_si_utime;
724
          to->si_stime = from->cpt_si_stime;
725
          break;
726
        case SIGILL:
727
        case SIGFPE:
728
        case SIGSEGV:
729
        case SIGBUS:
730
          to->si_addr = (void *) (intptr_t) from->cpt_si_addr;
731
          break;
732
        case SIGPOLL:
733
          to->si_band = from->cpt_si_band;
734
          to->si_fd = from->cpt_si_fd;
735
          break;
736
        default:
737
          to->si_pid = from->cpt_si_pid;
738
          to->si_uid = from->cpt_si_uid;
739
          to->si_ptr = (void* ) (intptr_t) from->cpt_si_ptr;
740
          break;
741
        }
742
    }
743
}
744
 
745
#endif /* __x86_64__ */
746
 
747
/* Convert a native/host siginfo object, into/from the siginfo in the
748
   layout of the inferiors' architecture.  Returns true if any
749
   conversion was done; false otherwise.  If DIRECTION is 1, then copy
750
   from INF to NATIVE.  If DIRECTION is 0, copy from NATIVE to
751
   INF.  */
752
 
753
static int
754
x86_siginfo_fixup (struct siginfo *native, void *inf, int direction)
755
{
756
#ifdef __x86_64__
757
  /* Is the inferior 32-bit?  If so, then fixup the siginfo object.  */
758
  if (register_size (0) == 4)
759
    {
760
      if (sizeof (struct siginfo) != sizeof (compat_siginfo_t))
761
        fatal ("unexpected difference in siginfo");
762
 
763
      if (direction == 0)
764
        compat_siginfo_from_siginfo ((struct compat_siginfo *) inf, native);
765
      else
766
        siginfo_from_compat_siginfo (native, (struct compat_siginfo *) inf);
767
 
768
      return 1;
769
    }
770
#endif
771
 
772
  return 0;
773
}
774
 
775
/* Initialize gdbserver for the architecture of the inferior.  */
776
 
777
static void
778
x86_arch_setup (void)
779
{
780
#ifdef __x86_64__
781
  int pid = pid_of (get_thread_lwp (current_inferior));
782
  char *file = linux_child_pid_to_exec_file (pid);
783
  int use_64bit = elf_64_file_p (file);
784
 
785
  free (file);
786
 
787
  if (use_64bit < 0)
788
    {
789
      /* This can only happen if /proc/<pid>/exe is unreadable,
790
         but "that can't happen" if we've gotten this far.
791
         Fall through and assume this is a 32-bit program.  */
792
    }
793
  else if (use_64bit)
794
    {
795
      init_registers_x86_64_linux ();
796
 
797
      /* Amd64 doesn't have HAVE_LINUX_USRREGS.  */
798
      the_low_target.num_regs = -1;
799
      the_low_target.regmap = NULL;
800
      the_low_target.cannot_fetch_register = NULL;
801
      the_low_target.cannot_store_register = NULL;
802
 
803
      /* Amd64 has 16 xmm regs.  */
804
      num_xmm_registers = 16;
805
 
806
      return;
807
    }
808
#endif
809
 
810
  /* Ok we have a 32-bit inferior.  */
811
 
812
  init_registers_i386_linux ();
813
 
814
  the_low_target.num_regs = I386_NUM_REGS;
815
  the_low_target.regmap = i386_regmap;
816
  the_low_target.cannot_fetch_register = i386_cannot_fetch_register;
817
  the_low_target.cannot_store_register = i386_cannot_store_register;
818
 
819
  /* I386 has 8 xmm regs.  */
820
  num_xmm_registers = 8;
821
}
822
 
823
/* This is initialized assuming an amd64 target.
824
   x86_arch_setup will correct it for i386 or amd64 targets.  */
825
 
826
struct linux_target_ops the_low_target =
827
{
828
  x86_arch_setup,
829
  -1,
830
  NULL,
831
  NULL,
832
  NULL,
833
  x86_get_pc,
834
  x86_set_pc,
835
  x86_breakpoint,
836
  x86_breakpoint_len,
837
  NULL,
838
  1,
839
  x86_breakpoint_at,
840
  x86_insert_point,
841
  x86_remove_point,
842
  x86_stopped_by_watchpoint,
843
  x86_stopped_data_address,
844
  /* collect_ptrace_register/supply_ptrace_register are not needed in the
845
     native i386 case (no registers smaller than an xfer unit), and are not
846
     used in the biarch case (HAVE_LINUX_USRREGS is not defined).  */
847
  NULL,
848
  NULL,
849
  /* need to fix up i386 siginfo if host is amd64 */
850
  x86_siginfo_fixup,
851
  x86_linux_new_process,
852
  x86_linux_new_thread,
853
  x86_linux_prepare_to_resume
854
};

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.