1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
27c68af6eSAvi Kivity #ifndef _LINUX_USER_RETURN_NOTIFIER_H
37c68af6eSAvi Kivity #define _LINUX_USER_RETURN_NOTIFIER_H
47c68af6eSAvi Kivity 
57c68af6eSAvi Kivity #ifdef CONFIG_USER_RETURN_NOTIFIER
67c68af6eSAvi Kivity 
77c68af6eSAvi Kivity #include <linux/list.h>
87c68af6eSAvi Kivity #include <linux/sched.h>
97c68af6eSAvi Kivity 
107c68af6eSAvi Kivity struct user_return_notifier {
117c68af6eSAvi Kivity 	void (*on_user_return)(struct user_return_notifier *urn);
127c68af6eSAvi Kivity 	struct hlist_node link;
137c68af6eSAvi Kivity };
147c68af6eSAvi Kivity 
157c68af6eSAvi Kivity 
167c68af6eSAvi Kivity void user_return_notifier_register(struct user_return_notifier *urn);
177c68af6eSAvi Kivity void user_return_notifier_unregister(struct user_return_notifier *urn);
187c68af6eSAvi Kivity 
propagate_user_return_notify(struct task_struct * prev,struct task_struct * next)197c68af6eSAvi Kivity static inline void propagate_user_return_notify(struct task_struct *prev,
207c68af6eSAvi Kivity 						struct task_struct *next)
217c68af6eSAvi Kivity {
227c68af6eSAvi Kivity 	if (test_tsk_thread_flag(prev, TIF_USER_RETURN_NOTIFY)) {
237c68af6eSAvi Kivity 		clear_tsk_thread_flag(prev, TIF_USER_RETURN_NOTIFY);
247c68af6eSAvi Kivity 		set_tsk_thread_flag(next, TIF_USER_RETURN_NOTIFY);
257c68af6eSAvi Kivity 	}
267c68af6eSAvi Kivity }
277c68af6eSAvi Kivity 
287c68af6eSAvi Kivity void fire_user_return_notifiers(void);
297c68af6eSAvi Kivity 
clear_user_return_notifier(struct task_struct * p)308e7cac79SAvi Kivity static inline void clear_user_return_notifier(struct task_struct *p)
318e7cac79SAvi Kivity {
328e7cac79SAvi Kivity 	clear_tsk_thread_flag(p, TIF_USER_RETURN_NOTIFY);
338e7cac79SAvi Kivity }
348e7cac79SAvi Kivity 
357c68af6eSAvi Kivity #else
367c68af6eSAvi Kivity 
377c68af6eSAvi Kivity struct user_return_notifier {};
387c68af6eSAvi Kivity 
propagate_user_return_notify(struct task_struct * prev,struct task_struct * next)397c68af6eSAvi Kivity static inline void propagate_user_return_notify(struct task_struct *prev,
407c68af6eSAvi Kivity 						struct task_struct *next)
417c68af6eSAvi Kivity {
427c68af6eSAvi Kivity }
437c68af6eSAvi Kivity 
fire_user_return_notifiers(void)447c68af6eSAvi Kivity static inline void fire_user_return_notifiers(void) {}
457c68af6eSAvi Kivity 
clear_user_return_notifier(struct task_struct * p)468e7cac79SAvi Kivity static inline void clear_user_return_notifier(struct task_struct *p) {}
478e7cac79SAvi Kivity 
487c68af6eSAvi Kivity #endif
497c68af6eSAvi Kivity 
507c68af6eSAvi Kivity #endif
51