| /* |
| * Copyright (c) 2018 Michael Moese <mmoese@suse.de> |
| * |
| * This program is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation, either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| /* Usage example |
| * |
| * ... |
| * #include "tst_test.h" |
| * #include "tst_taint.h" |
| * .. |
| * void setup(void) |
| * { |
| * ... |
| * tst_taint_init(TST_TAINT_W | TST_TAINT_D)); |
| * ... |
| * } |
| * |
| * void run(void) |
| * { |
| * ... |
| * . test code here |
| * ... |
| * if (tst_taint_check() != 0) |
| * tst_res(TFAIL, "kernel has issues"); |
| * else |
| * tst_res(TPASS, "kernel seems to be fine"); |
| * } |
| * |
| * |
| * |
| * The above code checks, if the kernel issued a warning (TST_TAINT_W) |
| * or even died (TST_TAINT_D) during test execution. |
| * If these are set after running a test case, we most likely |
| * triggered a kernel bug. |
| */ |
| |
| #ifndef TST_TAINTED_H__ |
| #define TST_TAINTED_H__ |
| |
| /* |
| * This are all 17 flags that are present in kernel 4.15 |
| * see kernel/panic.c in kernel sources |
| * |
| * Not all of them are valid in all kernel versions. |
| */ |
| #define TST_TAINT_G (1 << 0) /* a module with non-GPL license loaded */ |
| #define TST_TAINT_F (1 << 1) /* a module was force-loaded */ |
| #define TST_TAINT_S (1 << 2) /* SMP with Non-SMP kernel */ |
| #define TST_TAINT_R (1 << 3) /* module force unloaded */ |
| #define TST_TAINT_M (1 << 4) /* machine check error occurred */ |
| #define TST_TAINT_B (1 << 5) /* page-release function found bad page */ |
| #define TST_TAINT_U (1 << 6) /* user requested taint flag */ |
| #define TST_TAINT_D (1 << 7) /* kernel died recently - OOPS or BUG */ |
| #define TST_TAINT_A (1 << 8) /* ACPI table has been overwritten */ |
| #define TST_TAINT_W (1 << 9) /* a warning has been issued by kernel */ |
| #define TST_TAINT_C (1 << 10) /* driver from drivers/staging was loaded */ |
| #define TST_TAINT_I (1 << 11) /* working around BIOS/Firmware bug */ |
| #define TST_TAINT_O (1 << 12) /* out of tree module loaded */ |
| #define TST_TAINT_E (1 << 13) /* unsigned module was loaded */ |
| #define TST_TAINT_L (1 << 14) /* A soft lock-up has previously occurred */ |
| #define TST_TAINT_K (1 << 15) /* kernel has been live-patched */ |
| #define TST_TAINT_X (1 << 16) /* auxiliary taint, for distro's use */ |
| |
| /* |
| * Initialize and prepare support for checking tainted kernel. |
| * |
| * supply the mask of TAINT-flags you want to check, for example |
| * (TST_TAINT_W | TST_TAINT_D) when you want to check if the kernel issued |
| * a warning or even reported it died. |
| * |
| * This function tests if the requested flags are supported on the |
| * locally running kernel. In case the tainted-flags are already set by |
| * the kernel, there is no reason to continue and TCONF is generated. |
| * |
| * The mask must not be zero. |
| */ |
| void tst_taint_init(unsigned int mask); |
| |
| |
| /* |
| * check if the tainted flags handed to tst_taint_init() are still not set |
| * during or after running the test. |
| * Calling this function is only allowed after tst_taint_init() was called, |
| * otherwise TBROK will be generated. |
| * |
| * returns 0 or a bitmask of the flags that currently tainted the kernel. |
| */ |
| unsigned int tst_taint_check(void); |
| |
| |
| #endif /* TST_TAINTED_H__ */ |