index
:
litmus-rt.git
archive/unc-master-3.0
archived-2013.1
archived-private-master
archived-semi-part
demo
ecrts-pgm-final
ecrts14-pgm-final
gpusync-rtss12
gpusync/staging
linux-tip
litmus2008-patch-series
master
pgm
prop/litmus-signals
prop/robust-tie-break
staging
test
tracing-devel
v2.6.34-with-arm-patches
v2015.1
wip-2011.2-bbb
wip-2011.2-bbb-trace
wip-2012.3-gpu
wip-2012.3-gpu-preport
wip-2012.3-gpu-rtss13
wip-2012.3-gpu-sobliv-budget-w-kshark
wip-aedzl-final
wip-aedzl-revised
wip-arbit-deadline
wip-aux-tasks
wip-bbb
wip-bbb-prio-don
wip-better-break
wip-binary-heap
wip-budget
wip-color
wip-color-jlh
wip-d10-hz1000
wip-default-clustering
wip-dissipation-jerickso
wip-dissipation2-jerickso
wip-ecrts14-pgm
wip-edf-hsb
wip-edf-os
wip-edf-tie-break
wip-edzl-critique
wip-edzl-final
wip-edzl-revised
wip-events
wip-extra-debug
wip-fix-switch-jerickso
wip-fix3
wip-fmlp-dequeue
wip-ft-irq-flag
wip-gpu-cleanup
wip-gpu-interrupts
wip-gpu-rtas12
wip-gpu-rtss12
wip-gpu-rtss12-srp
wip-gpusync-merge
wip-ikglp
wip-k-fmlp
wip-kernel-coloring
wip-kernthreads
wip-klmirqd-to-aux
wip-kshark
wip-litmus-3.2
wip-litmus2011.2
wip-litmus3.0-2011.2
wip-master-2.6.33-rt
wip-mc
wip-mc-bipasa
wip-mc-jerickso
wip-mc2-cache-slack
wip-mcrit-mac
wip-merge-3.0
wip-merge-v3.0
wip-migration-affinity
wip-mmap-uncache
wip-modechange
wip-nested-locking
wip-omlp-gedf
wip-pai
wip-percore-lib
wip-performance
wip-pgm
wip-pgm-split
wip-pm-ovd
wip-prio-inh
wip-prioq-dgl
wip-refactored-gedf
wip-release-master-fix
wip-robust-tie-break
wip-rt-kshark
wip-rtas12-pgm
wip-semi-part
wip-semi-part-edfos-jerickso
wip-shared-lib
wip-shared-lib2
wip-shared-mem
wip-splitting-jerickso
wip-splitting-omlp-jerickso
wip-stage-binheap
wip-sun-port
wip-timer-trace
wip-tracepoints
The LITMUS^RT kernel.
Bjoern Brandenburg
about
summary
refs
log
tree
commit
diff
stats
log msg
author
committer
range
path:
root
/
dri
#ifndef _DYNAMIC_DEBUG_H
#define _DYNAMIC_DEBUG_H
/*
* An instance of this structure is created in a special
* ELF section at every dynamic debug callsite. At runtime,
* the special section is treated as an array of these.
*/
struct
_ddebug
{
/*
* These fields are used to drive the user interface
* for selecting and displaying debug callsites.
*/
const char
*
modname
;
const char
*
function
;
const char
*
filename
;
const char
*
format
;
unsigned int
lineno
:
18
;
/*
* The flags field controls the behaviour at the callsite.
* The bits here are changed dynamically when the user
* writes commands to <debugfs>/dynamic_debug/control
*/
#define _DPRINTK_FLAGS_NONE 0
#define _DPRINTK_FLAGS_PRINT (1<<0)
/* printk() a message using the format */
#define _DPRINTK_FLAGS_INCL_MODNAME (1<<1)
#define _DPRINTK_FLAGS_INCL_FUNCNAME (1<<2)
#define _DPRINTK_FLAGS_INCL_LINENO (1<<3)
#define _DPRINTK_FLAGS_INCL_TID (1<<4)
#if defined DEBUG
#define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT
#else
#define _DPRINTK_FLAGS_DEFAULT 0
#endif
unsigned int
flags
:
8
;
}
__attribute__
((
aligned
(
8
)));
int
ddebug_add_module
(
struct
_ddebug
*
tab
,
unsigned int
n
,
const char
*
modname
);
#if defined(CONFIG_DYNAMIC_DEBUG)
extern
int
ddebug_remove_module
(
const char
*
mod_name
);
extern
__printf
(
2
,
3
)
int
__dynamic_pr_debug
(
struct
_ddebug
*
descriptor
,
const char
*
fmt
, ...);
extern
int
ddebug_dyndbg_module_param_cb
(
char
*
param
,
char
*
val
,
const char
*
modname
);
struct
device
;
extern
__printf
(
3
,
4
)
int
__dynamic_dev_dbg
(
struct
_ddebug
*
descriptor
,
const struct
device
*
dev
,
const char
*
fmt
, ...);
struct
net_device
;
extern
__printf
(
3
,
4
)
int
__dynamic_netdev_dbg
(
struct
_ddebug
*
descriptor
,
const struct
net_device
*
dev
,
const char
*
fmt
, ...);
#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \
static struct _ddebug __aligned(8) \
__attribute__((section(
"__verbose"
))) name = { \
.modname = KBUILD_MODNAME, \
.function = __func__, \
.filename = __FILE__, \
.format = (fmt), \
.lineno = __LINE__, \
.flags = _DPRINTK_FLAGS_DEFAULT, \
}
#define dynamic_pr_debug(fmt, ...) \
do { \
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
__dynamic_pr_debug(&descriptor, pr_fmt(fmt), \
##__VA_ARGS__); \
} while (0)
#define dynamic_dev_dbg(dev, fmt, ...) \
do { \
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
__dynamic_dev_dbg(&descriptor, dev, fmt, \
##__VA_ARGS__); \
} while (0)
#define dynamic_netdev_dbg(dev, fmt, ...) \
do { \
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
__dynamic_netdev_dbg(&descriptor, dev, fmt, \
##__VA_ARGS__); \
} while (0)
#define dynamic_hex_dump(prefix_str, prefix_type, rowsize, \
groupsize, buf, len, ascii) \
do { \
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, \
__builtin_constant_p(prefix_str) ? prefix_str :
"hexdump"
);\
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
print_hex_dump(KERN_DEBUG, prefix_str, \
prefix_type, rowsize, groupsize, \
buf, len, ascii); \
} while (0)
#else
#include <linux/string.h>
#include <linux/errno.h>
static
inline
int
ddebug_remove_module
(
const char
*
mod
)
{
return
0
;
}
static
inline
int
ddebug_dyndbg_module_param_cb
(
char
*
param
,
char
*
val
,
const char
*
modname
)
{
if
(
strstr
(
param
,
"dyndbg"
)) {
/* avoid pr_warn(), which wants pr_fmt() fully defined */
printk
(
KERN_WARNING
"dyndbg param is supported only in "
"CONFIG_DYNAMIC_DEBUG builds
\n
"
);
return
0
;
/* allow and ignore */
}
return
-
EINVAL
;
}
#define dynamic_pr_debug(fmt, ...) \
do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0)
#define dynamic_dev_dbg(dev, fmt, ...) \
do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0)
#endif
#endif