Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
e7ab3cd2
Commit
e7ab3cd2
authored
Sep 21, 2008
by
Paul Mundt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sh: Add FPU registers to regset interface.
Signed-off-by:
Paul Mundt
<
lethal@linux-sh.org
>
parent
4b4cf759
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
108 additions
and
9 deletions
+108
-9
arch/sh/Kconfig
arch/sh/Kconfig
+1
-1
arch/sh/include/asm/elf.h
arch/sh/include/asm/elf.h
+3
-3
arch/sh/include/asm/fpu.h
arch/sh/include/asm/fpu.h
+19
-0
arch/sh/kernel/process_32.c
arch/sh/kernel/process_32.c
+9
-5
arch/sh/kernel/ptrace_32.c
arch/sh/kernel/ptrace_32.c
+76
-0
No files found.
arch/sh/Kconfig
View file @
e7ab3cd2
...
@@ -23,7 +23,7 @@ config SUPERH32
...
@@ -23,7 +23,7 @@ config SUPERH32
def_bool !SUPERH64
def_bool !SUPERH64
select HAVE_KPROBES
select HAVE_KPROBES
select HAVE_KRETPROBES
select HAVE_KRETPROBES
select HAVE_ARCH_TRACEHOOK
if !SH_FPU
select HAVE_ARCH_TRACEHOOK
select HAVE_FTRACE
select HAVE_FTRACE
config SUPERH64
config SUPERH64
...
...
arch/sh/include/asm/elf.h
View file @
e7ab3cd2
...
@@ -108,10 +108,10 @@ typedef struct user_fpu_struct elf_fpregset_t;
...
@@ -108,10 +108,10 @@ typedef struct user_fpu_struct elf_fpregset_t;
#define elf_check_fdpic(x) ((x)->e_flags & EF_SH_FDPIC)
#define elf_check_fdpic(x) ((x)->e_flags & EF_SH_FDPIC)
#define elf_check_const_displacement(x) ((x)->e_flags & EF_SH_PIC)
#define elf_check_const_displacement(x) ((x)->e_flags & EF_SH_PIC)
#if
defined(CONFIG_SUPERH32) && !defined(CONFIG_SH_FPU)
#if
def CONFIG_SUPERH32
/*
/*
* Enable dump using regset
for general purpose registers, use this as
* Enable dump using regset
.
*
the default once the FPU registers are moved over also
.
*
This covers all of general/DSP/FPU regs
.
*/
*/
#define CORE_DUMP_USE_REGSET
#define CORE_DUMP_USE_REGSET
#endif
#endif
...
...
arch/sh/include/asm/fpu.h
View file @
e7ab3cd2
...
@@ -30,8 +30,15 @@ static inline void save_fpu(struct task_struct *tsk, struct pt_regs *regs)
...
@@ -30,8 +30,15 @@ static inline void save_fpu(struct task_struct *tsk, struct pt_regs *regs)
}
}
#endif
#endif
struct
user_regset
;
extern
int
do_fpu_inst
(
unsigned
short
,
struct
pt_regs
*
);
extern
int
do_fpu_inst
(
unsigned
short
,
struct
pt_regs
*
);
extern
int
fpregs_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
void
*
kbuf
,
void
__user
*
ubuf
);
static
inline
void
unlazy_fpu
(
struct
task_struct
*
tsk
,
struct
pt_regs
*
regs
)
static
inline
void
unlazy_fpu
(
struct
task_struct
*
tsk
,
struct
pt_regs
*
regs
)
{
{
preempt_disable
();
preempt_disable
();
...
@@ -50,6 +57,18 @@ static inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs)
...
@@ -50,6 +57,18 @@ static inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs)
preempt_enable
();
preempt_enable
();
}
}
static
inline
int
init_fpu
(
struct
task_struct
*
tsk
)
{
if
(
tsk_used_math
(
tsk
))
{
if
((
boot_cpu_data
.
flags
&
CPU_HAS_FPU
)
&&
tsk
==
current
)
unlazy_fpu
(
tsk
,
task_pt_regs
(
tsk
));
return
0
;
}
set_stopped_child_used_math
(
tsk
);
return
0
;
}
#endif
/* __ASSEMBLY__ */
#endif
/* __ASSEMBLY__ */
#endif
/* __ASM_SH_FPU_H */
#endif
/* __ASM_SH_FPU_H */
arch/sh/kernel/process_32.c
View file @
e7ab3cd2
...
@@ -7,7 +7,11 @@
...
@@ -7,7 +7,11 @@
*
*
* SuperH version: Copyright (C) 1999, 2000 Niibe Yutaka & Kaz Kojima
* SuperH version: Copyright (C) 1999, 2000 Niibe Yutaka & Kaz Kojima
* Copyright (C) 2006 Lineo Solutions Inc. support SH4A UBC
* Copyright (C) 2006 Lineo Solutions Inc. support SH4A UBC
* Copyright (C) 2002 - 2007 Paul Mundt
* Copyright (C) 2002 - 2008 Paul Mundt
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*/
*/
#include <linux/module.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/mm.h>
...
@@ -222,10 +226,10 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)
...
@@ -222,10 +226,10 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)
struct
task_struct
*
tsk
=
current
;
struct
task_struct
*
tsk
=
current
;
fpvalid
=
!!
tsk_used_math
(
tsk
);
fpvalid
=
!!
tsk_used_math
(
tsk
);
if
(
fpvalid
)
{
if
(
fpvalid
)
unlazy_fpu
(
tsk
,
regs
);
fpvalid
=
!
fpregs_get
(
tsk
,
NULL
,
0
,
memcpy
(
fpu
,
&
tsk
->
thread
.
fpu
.
hard
,
sizeof
(
*
fpu
));
sizeof
(
struct
user_fpu_struct
),
}
fpu
,
NULL
);
#endif
#endif
return
fpvalid
;
return
fpvalid
;
...
...
arch/sh/kernel/ptrace_32.c
View file @
e7ab3cd2
...
@@ -32,6 +32,7 @@
...
@@ -32,6 +32,7 @@
#include <asm/processor.h>
#include <asm/processor.h>
#include <asm/mmu_context.h>
#include <asm/mmu_context.h>
#include <asm/syscalls.h>
#include <asm/syscalls.h>
#include <asm/fpu.h>
/*
/*
* This routine will get a word off of the process kernel stack.
* This routine will get a word off of the process kernel stack.
...
@@ -145,6 +146,54 @@ static int genregs_set(struct task_struct *target,
...
@@ -145,6 +146,54 @@ static int genregs_set(struct task_struct *target,
return
ret
;
return
ret
;
}
}
#ifdef CONFIG_SH_FPU
int
fpregs_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
void
*
kbuf
,
void
__user
*
ubuf
)
{
int
ret
;
ret
=
init_fpu
(
target
);
if
(
ret
)
return
ret
;
if
((
boot_cpu_data
.
flags
&
CPU_HAS_FPU
))
return
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
target
->
thread
.
fpu
.
hard
,
0
,
-
1
);
return
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
target
->
thread
.
fpu
.
soft
,
0
,
-
1
);
}
static
int
fpregs_set
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
const
void
*
kbuf
,
const
void
__user
*
ubuf
)
{
int
ret
;
ret
=
init_fpu
(
target
);
if
(
ret
)
return
ret
;
set_stopped_child_used_math
(
target
);
if
((
boot_cpu_data
.
flags
&
CPU_HAS_FPU
))
return
user_regset_copyin
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
target
->
thread
.
fpu
.
hard
,
0
,
-
1
);
return
user_regset_copyin
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
target
->
thread
.
fpu
.
soft
,
0
,
-
1
);
}
static
int
fpregs_active
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
)
{
return
tsk_used_math
(
target
)
?
regset
->
n
:
0
;
}
#endif
#ifdef CONFIG_SH_DSP
#ifdef CONFIG_SH_DSP
static
int
dspregs_get
(
struct
task_struct
*
target
,
static
int
dspregs_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
...
@@ -194,6 +243,9 @@ static int dspregs_active(struct task_struct *target,
...
@@ -194,6 +243,9 @@ static int dspregs_active(struct task_struct *target,
*/
*/
enum
sh_regset
{
enum
sh_regset
{
REGSET_GENERAL
,
REGSET_GENERAL
,
#ifdef CONFIG_SH_FPU
REGSET_FPU
,
#endif
#ifdef CONFIG_SH_DSP
#ifdef CONFIG_SH_DSP
REGSET_DSP
,
REGSET_DSP
,
#endif
#endif
...
@@ -214,6 +266,18 @@ static const struct user_regset sh_regsets[] = {
...
@@ -214,6 +266,18 @@ static const struct user_regset sh_regsets[] = {
.
set
=
genregs_set
,
.
set
=
genregs_set
,
},
},
#ifdef CONFIG_SH_FPU
[
REGSET_FPU
]
=
{
.
core_note_type
=
NT_PRFPREG
,
.
n
=
sizeof
(
struct
user_fpu_struct
)
/
sizeof
(
long
),
.
size
=
sizeof
(
long
),
.
align
=
sizeof
(
long
),
.
get
=
fpregs_get
,
.
set
=
fpregs_set
,
.
active
=
fpregs_active
,
},
#endif
#ifdef CONFIG_SH_DSP
#ifdef CONFIG_SH_DSP
[
REGSET_DSP
]
=
{
[
REGSET_DSP
]
=
{
.
n
=
sizeof
(
struct
pt_dspregs
)
/
sizeof
(
long
),
.
n
=
sizeof
(
struct
pt_dspregs
)
/
sizeof
(
long
),
...
@@ -304,6 +368,18 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
...
@@ -304,6 +368,18 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
REGSET_GENERAL
,
REGSET_GENERAL
,
0
,
sizeof
(
struct
pt_regs
),
0
,
sizeof
(
struct
pt_regs
),
(
const
void
__user
*
)
data
);
(
const
void
__user
*
)
data
);
#ifdef CONFIG_SH_FPU
case
PTRACE_GETFPREGS
:
return
copy_regset_to_user
(
child
,
&
user_sh_native_view
,
REGSET_FPU
,
0
,
sizeof
(
struct
user_fpu_struct
),
(
void
__user
*
)
data
);
case
PTRACE_SETFPREGS
:
return
copy_regset_from_user
(
child
,
&
user_sh_native_view
,
REGSET_FPU
,
0
,
sizeof
(
struct
user_fpu_struct
),
(
const
void
__user
*
)
data
);
#endif
#ifdef CONFIG_SH_DSP
#ifdef CONFIG_SH_DSP
case
PTRACE_GETDSPREGS
:
case
PTRACE_GETDSPREGS
:
return
copy_regset_to_user
(
child
,
&
user_sh_native_view
,
return
copy_regset_to_user
(
child
,
&
user_sh_native_view
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment