linux-x86-64-low.c [plain text]
#include "server.h"
#include "linux-low.h"
#include "i387-fp.h"
#include <sys/reg.h>
#include <sys/procfs.h>
#include <sys/ptrace.h>
#define X86_64_NUM_GREGS 22
static int regmap[X86_64_NUM_GREGS] = {
RAX, RBX, RCX, RDX,
RSI, RDI, RBP, RSP,
R8, R9, R10, R11,
R12, R13, R14, R15,
RIP, EFLAGS,
DS, ES, FS, GS
};
static void
x86_64_fill_gregset (void *buf)
{
int i;
for (i = 0; i < X86_64_NUM_GREGS; i++)
collect_register (i, ((char *) buf) + regmap[i]);
}
static void
x86_64_store_gregset (void *buf)
{
int i;
for (i = 0; i < X86_64_NUM_GREGS; i++)
supply_register (i, ((char *) buf) + regmap[i]);
}
static void
x86_64_fill_fpregset (void *buf)
{
i387_cache_to_fxsave (buf);
}
static void
x86_64_store_fpregset (void *buf)
{
i387_fxsave_to_cache (buf);
}
struct regset_info target_regsets[] = {
{ PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
x86_64_fill_gregset, x86_64_store_gregset },
{ PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
x86_64_fill_fpregset, x86_64_store_fpregset },
{ 0, 0, -1, NULL, NULL }
};