| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | #ifndef _LINUX_KCOV_H | 
 | #define _LINUX_KCOV_H | 
 |  | 
 | #include <uapi/linux/kcov.h> | 
 |  | 
 | struct task_struct; | 
 |  | 
 | #ifdef CONFIG_KCOV | 
 |  | 
 | enum kcov_mode { | 
 | 	/* Coverage collection is not enabled yet. */ | 
 | 	KCOV_MODE_DISABLED = 0, | 
 | 	/* KCOV was initialized, but tracing mode hasn't been chosen yet. */ | 
 | 	KCOV_MODE_INIT = 1, | 
 | 	/* | 
 | 	 * Tracing coverage collection mode. | 
 | 	 * Covered PCs are collected in a per-task buffer. | 
 | 	 */ | 
 | 	KCOV_MODE_TRACE_PC = 2, | 
 | 	/* Collecting comparison operands mode. */ | 
 | 	KCOV_MODE_TRACE_CMP = 3, | 
 | }; | 
 |  | 
 | #define KCOV_IN_CTXSW	(1 << 30) | 
 |  | 
 | void kcov_task_init(struct task_struct *t); | 
 | void kcov_task_exit(struct task_struct *t); | 
 |  | 
 | #define kcov_prepare_switch(t)			\ | 
 | do {						\ | 
 | 	(t)->kcov_mode |= KCOV_IN_CTXSW;	\ | 
 | } while (0) | 
 |  | 
 | #define kcov_finish_switch(t)			\ | 
 | do {						\ | 
 | 	(t)->kcov_mode &= ~KCOV_IN_CTXSW;	\ | 
 | } while (0) | 
 |  | 
 | #else | 
 |  | 
 | static inline void kcov_task_init(struct task_struct *t) {} | 
 | static inline void kcov_task_exit(struct task_struct *t) {} | 
 | static inline void kcov_prepare_switch(struct task_struct *t) {} | 
 | static inline void kcov_finish_switch(struct task_struct *t) {} | 
 |  | 
 | #endif /* CONFIG_KCOV */ | 
 | #endif /* _LINUX_KCOV_H */ |