| 1 |
|
| 2 | #ifndef _ASM_GENERIC_ERROR_INJECTION_H
|
| 3 | #define _ASM_GENERIC_ERROR_INJECTION_H
|
| 4 |
|
| 5 | #if defined(__KERNEL__) && !defined(__ASSEMBLY__)
|
| 6 | enum {
|
| 7 | EI_ETYPE_NULL,
|
| 8 | EI_ETYPE_ERRNO,
|
| 9 | EI_ETYPE_ERRNO_NULL,
|
| 10 | EI_ETYPE_TRUE,
|
| 11 | };
|
| 12 |
|
| 13 | struct error_injection_entry {
|
| 14 | unsigned long addr;
|
| 15 | int etype;
|
| 16 | };
|
| 17 |
|
| 18 | struct pt_regs;
|
| 19 |
|
| 20 | #ifdef CONFIG_FUNCTION_ERROR_INJECTION
|
| 21 | |
| 22 | * Whitelist generating macro. Specify functions which can be error-injectable
|
| 23 | * using this macro. If you unsure what is required for the error-injectable
|
| 24 | * functions, please read Documentation/fault-injection/fault-injection.rst
|
| 25 | * 'Error Injectable Functions' section.
|
| 26 |
|
| 27 | #define ALLOW_ERROR_INJECTION(fname, _etype) \
|
| 28 | static struct error_injection_entry __used \
|
| 29 | __section("_error_injection_whitelist") \
|
| 30 | _eil_addr_##fname = { \
|
| 31 | .addr = (unsigned long)fname, \
|
| 32 | .etype = EI_ETYPE_##_etype, \
|
| 33 | }
|
| 34 |
|
| 35 | void override_function_with_return(struct pt_regs *regs);
|
| 36 | #else
|
| 37 | #define ALLOW_ERROR_INJECTION(fname, _etype)
|
| 38 |
|
| 39 | static inline void override_function_with_return(struct pt_regs *regs) { }
|
| 40 | #endif
|
| 41 | #endif
|
| 42 |
|
| 43 | #endif
|