1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
// SPDX-License-Identifier: GPL-2.0-only
/*
* Kernel module for testing dynamic_debug
*
* Authors:
* Jim Cromie <[email protected]>
*/
#define pr_fmt(fmt) "test_dd: " fmt
#include <linux/module.h>
/* run tests by reading or writing sysfs node: do_prints */
static void do_prints(void); /* device under test */
static int param_set_do_prints(const char *instr, const struct kernel_param *kp)
{
do_prints();
return 0;
}
static int param_get_do_prints(char *buffer, const struct kernel_param *kp)
{
do_prints();
return scnprintf(buffer, PAGE_SIZE, "did do_prints\n");
}
static const struct kernel_param_ops param_ops_do_prints = {
.set = param_set_do_prints,
.get = param_get_do_prints,
};
module_param_cb(do_prints, ¶m_ops_do_prints, NULL, 0600);
/*
* Using the CLASSMAP api:
* - classmaps must have corresponding enum
* - enum symbols must match/correlate with class-name strings in the map.
* - base must equal enum's 1st value
* - multiple maps must set their base to share the 0-30 class_id space !!
* (build-bug-on tips welcome)
* Additionally, here:
* - tie together sysname, mapname, bitsname, flagsname
*/
#define DD_SYS_WRAP(_model, _flags) \
static unsigned long bits_##_model; \
static struct ddebug_class_param _flags##_model = { \
.bits = &bits_##_model, \
.flags = #_flags, \
.map = &map_##_model, \
}; \
module_param_cb(_flags##_##_model, ¶m_ops_dyndbg_classes, &_flags##_model, 0600)
/* numeric input, independent bits */
enum cat_disjoint_bits {
D2_CORE = 0,
D2_DRIVER,
D2_KMS,
D2_PRIME,
D2_ATOMIC,
D2_VBL,
D2_STATE,
D2_LEASE,
D2_DP,
D2_DRMRES };
DECLARE_DYNDBG_CLASSMAP(map_disjoint_bits, DD_CLASS_TYPE_DISJOINT_BITS, 0,
"D2_CORE",
"D2_DRIVER",
"D2_KMS",
"D2_PRIME",
"D2_ATOMIC",
"D2_VBL",
"D2_STATE",
"D2_LEASE",
"D2_DP",
"D2_DRMRES");
DD_SYS_WRAP(disjoint_bits, p);
DD_SYS_WRAP(disjoint_bits, T);
/* symbolic input, independent bits */
enum cat_disjoint_names { LOW = 11, MID, HI };
DECLARE_DYNDBG_CLASSMAP(map_disjoint_names, DD_CLASS_TYPE_DISJOINT_NAMES, 10,
"LOW", "MID", "HI");
DD_SYS_WRAP(disjoint_names, p);
DD_SYS_WRAP(disjoint_names, T);
/* numeric verbosity, V2 > V1 related */
enum cat_level_num { V0 = 14, V1, V2, V3, V4, V5, V6, V7 };
DECLARE_DYNDBG_CLASSMAP(map_level_num, DD_CLASS_TYPE_LEVEL_NUM, 14,
"V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7");
DD_SYS_WRAP(level_num, p);
DD_SYS_WRAP(level_num, T);
/* symbolic verbosity */
enum cat_level_names { L0 = 22, L1, L2, L3, L4, L5, L6, L7 };
DECLARE_DYNDBG_CLASSMAP(map_level_names, DD_CLASS_TYPE_LEVEL_NAMES, 22,
"L0", "L1", "L2", "L3", "L4", "L5", "L6", "L7");
DD_SYS_WRAP(level_names, p);
DD_SYS_WRAP(level_names, T);
/* stand-in for all pr_debug etc */
#define prdbg(SYM) __pr_debug_cls(SYM, #SYM " msg\n")
static void do_cats(void)
{
pr_debug("doing categories\n");
prdbg(LOW);
prdbg(MID);
prdbg(HI);
prdbg(D2_CORE);
prdbg(D2_DRIVER);
prdbg(D2_KMS);
prdbg(D2_PRIME);
prdbg(D2_ATOMIC);
prdbg(D2_VBL);
prdbg(D2_STATE);
prdbg(D2_LEASE);
prdbg(D2_DP);
prdbg(D2_DRMRES);
}
static void do_levels(void)
{
pr_debug("doing levels\n");
prdbg(V1);
prdbg(V2);
prdbg(V3);
prdbg(V4);
prdbg(V5);
prdbg(V6);
prdbg(V7);
prdbg(L1);
prdbg(L2);
prdbg(L3);
prdbg(L4);
prdbg(L5);
prdbg(L6);
prdbg(L7);
}
static void do_prints(void)
{
do_cats();
do_levels();
}
static int __init test_dynamic_debug_init(void)
{
pr_debug("init start\n");
do_prints();
pr_debug("init done\n");
return 0;
}
static void __exit test_dynamic_debug_exit(void)
{
pr_debug("exited\n");
}
module_init(test_dynamic_debug_init);
module_exit(test_dynamic_debug_exit);
MODULE_AUTHOR("Jim Cromie <[email protected]>");
MODULE_LICENSE("GPL");
|