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
Kirill Smelkov
linux
Commits
58988b07
Commit
58988b07
authored
Dec 03, 2009
by
Avi Kivity
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote branch 'tip/x86/entry' into kvm-updates/2.6.33
Signed-off-by:
Avi Kivity
<
avi@redhat.com
>
parents
22763c5c
8e7cac79
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
119 additions
and
2 deletions
+119
-2
arch/Kconfig
arch/Kconfig
+10
-0
arch/x86/Kconfig
arch/x86/Kconfig
+1
-0
arch/x86/include/asm/thread_info.h
arch/x86/include/asm/thread_info.h
+5
-2
arch/x86/kernel/process.c
arch/x86/kernel/process.c
+2
-0
arch/x86/kernel/signal.c
arch/x86/kernel/signal.c
+3
-0
include/linux/user-return-notifier.h
include/linux/user-return-notifier.h
+49
-0
kernel/Makefile
kernel/Makefile
+1
-0
kernel/fork.c
kernel/fork.c
+2
-0
kernel/user-return-notifier.c
kernel/user-return-notifier.c
+46
-0
No files found.
arch/Kconfig
View file @
58988b07
...
@@ -83,6 +83,13 @@ config KRETPROBES
...
@@ -83,6 +83,13 @@ config KRETPROBES
def_bool y
def_bool y
depends on KPROBES && HAVE_KRETPROBES
depends on KPROBES && HAVE_KRETPROBES
config USER_RETURN_NOTIFIER
bool
depends on HAVE_USER_RETURN_NOTIFIER
help
Provide a kernel-internal notification when a cpu is about to
switch to user mode.
config HAVE_IOREMAP_PROT
config HAVE_IOREMAP_PROT
bool
bool
...
@@ -126,4 +133,7 @@ config HAVE_DMA_API_DEBUG
...
@@ -126,4 +133,7 @@ config HAVE_DMA_API_DEBUG
config HAVE_DEFAULT_NO_SPIN_MUTEXES
config HAVE_DEFAULT_NO_SPIN_MUTEXES
bool
bool
config HAVE_USER_RETURN_NOTIFIER
bool
source "kernel/gcov/Kconfig"
source "kernel/gcov/Kconfig"
arch/x86/Kconfig
View file @
58988b07
...
@@ -50,6 +50,7 @@ config X86
...
@@ -50,6 +50,7 @@ config X86
select HAVE_KERNEL_BZIP2
select HAVE_KERNEL_BZIP2
select HAVE_KERNEL_LZMA
select HAVE_KERNEL_LZMA
select HAVE_ARCH_KMEMCHECK
select HAVE_ARCH_KMEMCHECK
select HAVE_USER_RETURN_NOTIFIER
config OUTPUT_FORMAT
config OUTPUT_FORMAT
string
string
...
...
arch/x86/include/asm/thread_info.h
View file @
58988b07
...
@@ -83,6 +83,7 @@ struct thread_info {
...
@@ -83,6 +83,7 @@ struct thread_info {
#define TIF_SYSCALL_AUDIT 7
/* syscall auditing active */
#define TIF_SYSCALL_AUDIT 7
/* syscall auditing active */
#define TIF_SECCOMP 8
/* secure computing */
#define TIF_SECCOMP 8
/* secure computing */
#define TIF_MCE_NOTIFY 10
/* notify userspace of an MCE */
#define TIF_MCE_NOTIFY 10
/* notify userspace of an MCE */
#define TIF_USER_RETURN_NOTIFY 11
/* notify kernel of userspace return */
#define TIF_NOTSC 16
/* TSC is not accessible in userland */
#define TIF_NOTSC 16
/* TSC is not accessible in userland */
#define TIF_IA32 17
/* 32bit process */
#define TIF_IA32 17
/* 32bit process */
#define TIF_FORK 18
/* ret_from_fork */
#define TIF_FORK 18
/* ret_from_fork */
...
@@ -107,6 +108,7 @@ struct thread_info {
...
@@ -107,6 +108,7 @@ struct thread_info {
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
#define _TIF_MCE_NOTIFY (1 << TIF_MCE_NOTIFY)
#define _TIF_MCE_NOTIFY (1 << TIF_MCE_NOTIFY)
#define _TIF_USER_RETURN_NOTIFY (1 << TIF_USER_RETURN_NOTIFY)
#define _TIF_NOTSC (1 << TIF_NOTSC)
#define _TIF_NOTSC (1 << TIF_NOTSC)
#define _TIF_IA32 (1 << TIF_IA32)
#define _TIF_IA32 (1 << TIF_IA32)
#define _TIF_FORK (1 << TIF_FORK)
#define _TIF_FORK (1 << TIF_FORK)
...
@@ -142,13 +144,14 @@ struct thread_info {
...
@@ -142,13 +144,14 @@ struct thread_info {
/* Only used for 64 bit */
/* Only used for 64 bit */
#define _TIF_DO_NOTIFY_MASK \
#define _TIF_DO_NOTIFY_MASK \
(_TIF_SIGPENDING|_TIF_MCE_NOTIFY|_TIF_NOTIFY_RESUME)
(_TIF_SIGPENDING | _TIF_MCE_NOTIFY | _TIF_NOTIFY_RESUME | \
_TIF_USER_RETURN_NOTIFY)
/* flags to check in __switch_to() */
/* flags to check in __switch_to() */
#define _TIF_WORK_CTXSW \
#define _TIF_WORK_CTXSW \
(_TIF_IO_BITMAP|_TIF_DEBUGCTLMSR|_TIF_DS_AREA_MSR|_TIF_NOTSC)
(_TIF_IO_BITMAP|_TIF_DEBUGCTLMSR|_TIF_DS_AREA_MSR|_TIF_NOTSC)
#define _TIF_WORK_CTXSW_PREV
_TIF_WORK_CTXSW
#define _TIF_WORK_CTXSW_PREV
(_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY)
#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW|_TIF_DEBUG)
#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW|_TIF_DEBUG)
#define PREEMPT_ACTIVE 0x10000000
#define PREEMPT_ACTIVE 0x10000000
...
...
arch/x86/kernel/process.c
View file @
58988b07
...
@@ -9,6 +9,7 @@
...
@@ -9,6 +9,7 @@
#include <linux/pm.h>
#include <linux/pm.h>
#include <linux/clockchips.h>
#include <linux/clockchips.h>
#include <linux/random.h>
#include <linux/random.h>
#include <linux/user-return-notifier.h>
#include <trace/events/power.h>
#include <trace/events/power.h>
#include <asm/system.h>
#include <asm/system.h>
#include <asm/apic.h>
#include <asm/apic.h>
...
@@ -224,6 +225,7 @@ void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
...
@@ -224,6 +225,7 @@ void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
*/
*/
memset
(
tss
->
io_bitmap
,
0xff
,
prev
->
io_bitmap_max
);
memset
(
tss
->
io_bitmap
,
0xff
,
prev
->
io_bitmap_max
);
}
}
propagate_user_return_notify
(
prev_p
,
next_p
);
}
}
int
sys_fork
(
struct
pt_regs
*
regs
)
int
sys_fork
(
struct
pt_regs
*
regs
)
...
...
arch/x86/kernel/signal.c
View file @
58988b07
...
@@ -19,6 +19,7 @@
...
@@ -19,6 +19,7 @@
#include <linux/stddef.h>
#include <linux/stddef.h>
#include <linux/personality.h>
#include <linux/personality.h>
#include <linux/uaccess.h>
#include <linux/uaccess.h>
#include <linux/user-return-notifier.h>
#include <asm/processor.h>
#include <asm/processor.h>
#include <asm/ucontext.h>
#include <asm/ucontext.h>
...
@@ -872,6 +873,8 @@ do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)
...
@@ -872,6 +873,8 @@ do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)
if
(
current
->
replacement_session_keyring
)
if
(
current
->
replacement_session_keyring
)
key_replace_session_keyring
();
key_replace_session_keyring
();
}
}
if
(
thread_info_flags
&
_TIF_USER_RETURN_NOTIFY
)
fire_user_return_notifiers
();
#ifdef CONFIG_X86_32
#ifdef CONFIG_X86_32
clear_thread_flag
(
TIF_IRET
);
clear_thread_flag
(
TIF_IRET
);
...
...
include/linux/user-return-notifier.h
0 → 100644
View file @
58988b07
#ifndef _LINUX_USER_RETURN_NOTIFIER_H
#define _LINUX_USER_RETURN_NOTIFIER_H
#ifdef CONFIG_USER_RETURN_NOTIFIER
#include <linux/list.h>
#include <linux/sched.h>
struct
user_return_notifier
{
void
(
*
on_user_return
)(
struct
user_return_notifier
*
urn
);
struct
hlist_node
link
;
};
void
user_return_notifier_register
(
struct
user_return_notifier
*
urn
);
void
user_return_notifier_unregister
(
struct
user_return_notifier
*
urn
);
static
inline
void
propagate_user_return_notify
(
struct
task_struct
*
prev
,
struct
task_struct
*
next
)
{
if
(
test_tsk_thread_flag
(
prev
,
TIF_USER_RETURN_NOTIFY
))
{
clear_tsk_thread_flag
(
prev
,
TIF_USER_RETURN_NOTIFY
);
set_tsk_thread_flag
(
next
,
TIF_USER_RETURN_NOTIFY
);
}
}
void
fire_user_return_notifiers
(
void
);
static
inline
void
clear_user_return_notifier
(
struct
task_struct
*
p
)
{
clear_tsk_thread_flag
(
p
,
TIF_USER_RETURN_NOTIFY
);
}
#else
struct
user_return_notifier
{};
static
inline
void
propagate_user_return_notify
(
struct
task_struct
*
prev
,
struct
task_struct
*
next
)
{
}
static
inline
void
fire_user_return_notifiers
(
void
)
{}
static
inline
void
clear_user_return_notifier
(
struct
task_struct
*
p
)
{}
#endif
#endif
kernel/Makefile
View file @
58988b07
...
@@ -96,6 +96,7 @@ obj-$(CONFIG_SMP) += sched_cpupri.o
...
@@ -96,6 +96,7 @@ obj-$(CONFIG_SMP) += sched_cpupri.o
obj-$(CONFIG_SLOW_WORK)
+=
slow-work.o
obj-$(CONFIG_SLOW_WORK)
+=
slow-work.o
obj-$(CONFIG_SLOW_WORK_DEBUG)
+=
slow-work-debugfs.o
obj-$(CONFIG_SLOW_WORK_DEBUG)
+=
slow-work-debugfs.o
obj-$(CONFIG_PERF_EVENTS)
+=
perf_event.o
obj-$(CONFIG_PERF_EVENTS)
+=
perf_event.o
obj-$(CONFIG_USER_RETURN_NOTIFIER)
+=
user-return-notifier.o
ifneq
($(CONFIG_SCHED_OMIT_FRAME_POINTER),y)
ifneq
($(CONFIG_SCHED_OMIT_FRAME_POINTER),y)
# According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is
# According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is
...
...
kernel/fork.c
View file @
58988b07
...
@@ -64,6 +64,7 @@
...
@@ -64,6 +64,7 @@
#include <linux/magic.h>
#include <linux/magic.h>
#include <linux/perf_event.h>
#include <linux/perf_event.h>
#include <linux/posix-timers.h>
#include <linux/posix-timers.h>
#include <linux/user-return-notifier.h>
#include <asm/pgtable.h>
#include <asm/pgtable.h>
#include <asm/pgalloc.h>
#include <asm/pgalloc.h>
...
@@ -249,6 +250,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
...
@@ -249,6 +250,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
goto
out
;
goto
out
;
setup_thread_stack
(
tsk
,
orig
);
setup_thread_stack
(
tsk
,
orig
);
clear_user_return_notifier
(
tsk
);
stackend
=
end_of_stack
(
tsk
);
stackend
=
end_of_stack
(
tsk
);
*
stackend
=
STACK_END_MAGIC
;
/* for overflow detection */
*
stackend
=
STACK_END_MAGIC
;
/* for overflow detection */
...
...
kernel/user-return-notifier.c
0 → 100644
View file @
58988b07
#include <linux/user-return-notifier.h>
#include <linux/percpu.h>
#include <linux/sched.h>
#include <linux/module.h>
static
DEFINE_PER_CPU
(
struct
hlist_head
,
return_notifier_list
);
#define URN_LIST_HEAD per_cpu(return_notifier_list, raw_smp_processor_id())
/*
* Request a notification when the current cpu returns to userspace. Must be
* called in atomic context. The notifier will also be called in atomic
* context.
*/
void
user_return_notifier_register
(
struct
user_return_notifier
*
urn
)
{
set_tsk_thread_flag
(
current
,
TIF_USER_RETURN_NOTIFY
);
hlist_add_head
(
&
urn
->
link
,
&
URN_LIST_HEAD
);
}
EXPORT_SYMBOL_GPL
(
user_return_notifier_register
);
/*
* Removes a registered user return notifier. Must be called from atomic
* context, and from the same cpu registration occured in.
*/
void
user_return_notifier_unregister
(
struct
user_return_notifier
*
urn
)
{
hlist_del
(
&
urn
->
link
);
if
(
hlist_empty
(
&
URN_LIST_HEAD
))
clear_tsk_thread_flag
(
current
,
TIF_USER_RETURN_NOTIFY
);
}
EXPORT_SYMBOL_GPL
(
user_return_notifier_unregister
);
/* Calls registered user return notifiers */
void
fire_user_return_notifiers
(
void
)
{
struct
user_return_notifier
*
urn
;
struct
hlist_node
*
tmp1
,
*
tmp2
;
struct
hlist_head
*
head
;
head
=
&
get_cpu_var
(
return_notifier_list
);
hlist_for_each_entry_safe
(
urn
,
tmp1
,
tmp2
,
head
,
link
)
urn
->
on_user_return
(
urn
);
put_cpu_var
(
return_notifier_list
);
}
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