Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
x86
um
os-Linux
registers.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2004 PathScale, Inc
3
* Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
4
* Licensed under the GPL
5
*/
6
7
#include <errno.h>
8
#include <sys/ptrace.h>
9
#ifdef __i386__
10
#include <sys/user.h>
11
#endif
12
#include <
longjmp.h
>
13
#include <
sysdep/ptrace_user.h
>
14
15
int
save_fp_registers
(
int
pid
,
unsigned
long
*fp_regs)
16
{
17
if
(ptrace(
PTRACE_GETFPREGS
, pid, 0, fp_regs) < 0)
18
return
-
errno
;
19
return
0;
20
}
21
22
int
restore_fp_registers
(
int
pid
,
unsigned
long
*fp_regs)
23
{
24
if
(ptrace(
PTRACE_SETFPREGS
, pid, 0, fp_regs) < 0)
25
return
-
errno
;
26
return
0;
27
}
28
29
#ifdef __i386__
30
int
have_fpx_regs = 1;
31
int
save_fpx_registers
(
int
pid
,
unsigned
long
*fp_regs)
32
{
33
if
(ptrace(
PTRACE_GETFPXREGS
, pid, 0, fp_regs) < 0)
34
return
-
errno
;
35
return
0;
36
}
37
38
int
restore_fpx_registers
(
int
pid,
unsigned
long
*fp_regs)
39
{
40
if
(ptrace(
PTRACE_SETFPXREGS
, pid, 0, fp_regs) < 0)
41
return
-
errno
;
42
return
0;
43
}
44
45
int
get_fp_registers
(
int
pid,
unsigned
long
*
regs
)
46
{
47
if
(have_fpx_regs)
48
return
save_fpx_registers
(pid, regs);
49
else
50
return
save_fp_registers
(pid, regs);
51
}
52
53
int
put_fp_registers
(
int
pid,
unsigned
long
*regs)
54
{
55
if
(have_fpx_regs)
56
return
restore_fpx_registers
(pid, regs);
57
else
58
return
restore_fp_registers
(pid, regs);
59
}
60
61
void
arch_init_registers
(
int
pid)
62
{
63
struct
user_fpxregs_struct fpx_regs;
64
int
err
;
65
66
err = ptrace(
PTRACE_GETFPXREGS
, pid, 0, &fpx_regs);
67
if
(!err)
68
return
;
69
70
if
(errno !=
EIO
)
71
panic
(
"check_ptrace : PTRACE_GETFPXREGS failed, errno = %d"
,
72
errno);
73
74
have_fpx_regs = 0;
75
}
76
#else
77
78
int
get_fp_registers
(
int
pid,
unsigned
long
*regs)
79
{
80
return
save_fp_registers
(pid, regs);
81
}
82
83
int
put_fp_registers
(
int
pid,
unsigned
long
*regs)
84
{
85
return
restore_fp_registers
(pid, regs);
86
}
87
88
#endif
89
90
unsigned
long
get_thread_reg
(
int
reg
,
jmp_buf
*
buf
)
91
{
92
switch
(reg) {
93
#ifdef __i386__
94
case
HOST_IP:
95
return
buf[0]->__eip;
96
case
HOST_SP:
97
return
buf[0]->__esp;
98
case
HOST_BP:
99
return
buf[0]->__ebp;
100
#else
101
case
HOST_IP:
102
return
buf[0]->__rip;
103
case
HOST_SP:
104
return
buf[0]->__rsp;
105
case
HOST_BP:
106
return
buf[0]->__rbp;
107
#endif
108
default
:
109
printk
(
UM_KERN_ERR
"get_thread_regs - unknown register %d\n"
,
110
reg);
111
return
0;
112
}
113
}
Generated on Thu Jan 10 2013 13:19:35 for Linux Kernel by
1.8.2