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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [gdb/] [gdbserver/] [linux-x86-64-low.c] - Blame information for rev 455

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

Line No. Rev Author Line
1 24 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
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 "server.h"
22
#include "linux-low.h"
23
#include "i387-fp.h"
24
 
25
#include "gdb_proc_service.h"
26
 
27
#include <sys/reg.h>
28
#include <sys/procfs.h>
29
#include <sys/ptrace.h>
30
 
31
/* This definition comes from prctl.h, but some kernels may not have it.  */
32
#ifndef PTRACE_ARCH_PRCTL
33
#define PTRACE_ARCH_PRCTL      30
34
#endif
35
 
36
/* The following definitions come from prctl.h, but may be absent
37
   for certain configurations.  */
38
#ifndef ARCH_GET_FS
39
#define ARCH_SET_GS 0x1001
40
#define ARCH_SET_FS 0x1002
41
#define ARCH_GET_FS 0x1003
42
#define ARCH_GET_GS 0x1004
43
#endif
44
 
45
static int x86_64_regmap[] = {
46
  RAX * 8, RBX * 8, RCX * 8, RDX * 8,
47
  RSI * 8, RDI * 8, RBP * 8, RSP * 8,
48
  R8 * 8, R9 * 8, R10 * 8, R11 * 8,
49
  R12 * 8, R13 * 8, R14 * 8, R15 * 8,
50
  RIP * 8, EFLAGS * 8, CS * 8, SS * 8,
51
  DS * 8, ES * 8, FS * 8, GS * 8,
52
  -1, -1, -1, -1, -1, -1, -1, -1,
53
  -1, -1, -1, -1, -1, -1, -1, -1,
54
  -1, -1, -1, -1, -1, -1, -1, -1,
55
  -1, -1, -1, -1, -1, -1, -1, -1, -1,
56
  ORIG_RAX * 8
57
};
58
 
59
#define X86_64_NUM_GREGS (sizeof(x86_64_regmap)/sizeof(int))
60
 
61
/* Called by libthread_db.  */
62
 
63
ps_err_e
64
ps_get_thread_area (const struct ps_prochandle *ph,
65
                    lwpid_t lwpid, int idx, void **base)
66
{
67
  switch (idx)
68
    {
69
    case FS:
70
      if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0)
71
        return PS_OK;
72
      break;
73
    case GS:
74
      if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0)
75
        return PS_OK;
76
      break;
77
    default:
78
      return PS_BADADDR;
79
    }
80
  return PS_ERR;
81
}
82
 
83
static void
84
x86_64_fill_gregset (void *buf)
85
{
86
  int i;
87
 
88
  for (i = 0; i < X86_64_NUM_GREGS; i++)
89
    if (x86_64_regmap[i] != -1)
90
      collect_register (i, ((char *) buf) + x86_64_regmap[i]);
91
}
92
 
93
static void
94
x86_64_store_gregset (const void *buf)
95
{
96
  int i;
97
 
98
  for (i = 0; i < X86_64_NUM_GREGS; i++)
99
    if (x86_64_regmap[i] != -1)
100
      supply_register (i, ((char *) buf) + x86_64_regmap[i]);
101
}
102
 
103
static void
104
x86_64_fill_fpregset (void *buf)
105
{
106
  i387_cache_to_fxsave (buf);
107
}
108
 
109
static void
110
x86_64_store_fpregset (const void *buf)
111
{
112
  i387_fxsave_to_cache (buf);
113
}
114
 
115
struct regset_info target_regsets[] = {
116
  { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
117
    GENERAL_REGS,
118
    x86_64_fill_gregset, x86_64_store_gregset },
119
  { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
120
    FP_REGS,
121
    x86_64_fill_fpregset, x86_64_store_fpregset },
122
  { 0, 0, -1, -1, NULL, NULL }
123
};
124
 
125
static const unsigned char x86_64_breakpoint[] = { 0xCC };
126
#define x86_64_breakpoint_len 1
127
 
128
extern int debug_threads;
129
 
130
static CORE_ADDR
131
x86_64_get_pc ()
132
{
133
  unsigned long pc;
134
 
135
  collect_register_by_name ("rip", &pc);
136
 
137
  if (debug_threads)
138
    fprintf (stderr, "stop pc (before any decrement) is %08lx\n", pc);
139
  return pc;
140
}
141
 
142
static void
143
x86_64_set_pc (CORE_ADDR newpc)
144
{
145
  if (debug_threads)
146
    fprintf (stderr, "set pc to %08lx\n", (long) newpc);
147
  supply_register_by_name ("rip", &newpc);
148
}
149
 
150
static int
151
x86_64_breakpoint_at (CORE_ADDR pc)
152
{
153
  unsigned char c;
154
 
155
  read_inferior_memory (pc, &c, 1);
156
  if (c == 0xCC)
157
    return 1;
158
 
159
  return 0;
160
}
161
 
162
struct linux_target_ops the_low_target = {
163
  -1,
164
  NULL,
165
  NULL,
166
  NULL,
167
  x86_64_get_pc,
168
  x86_64_set_pc,
169
  x86_64_breakpoint,
170
  x86_64_breakpoint_len,
171
  NULL,
172
  1,
173
  x86_64_breakpoint_at,
174
  NULL,
175
  NULL,
176
  NULL,
177
  NULL,
178
  0,
179
  "i386:x86-64",
180
};

powered by: WebSVN 2.1.0

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