x86 mmiotrace: implement mmiotrace_printk()

Offer mmiotrace users a function to inject markers from inside the kernel.
This depends on the trace_vprintk() patch.

Signed-off-by: Pekka Paalanen <pq@iki.fi>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Pekka Paalanen 2008-09-16 22:00:34 +03:00 committed by Ingo Molnar
parent 801fe40001
commit 9e57fb35d7
4 changed files with 42 additions and 3 deletions

View File

@ -75,7 +75,7 @@ static LIST_HEAD(trace_list); /* struct remap_trace */
* and trace_lock. * and trace_lock.
* - Routines depending on is_enabled() must take trace_lock. * - Routines depending on is_enabled() must take trace_lock.
* - trace_list users must hold trace_lock. * - trace_list users must hold trace_lock.
* - is_enabled() guarantees that mmio_trace_record is allowed. * - is_enabled() guarantees that mmio_trace_{rw,mapping} are allowed.
* - pre/post callbacks assume the effect of is_enabled() being true. * - pre/post callbacks assume the effect of is_enabled() being true.
*/ */
@ -379,6 +379,23 @@ void mmiotrace_iounmap(volatile void __iomem *addr)
iounmap_trace_core(addr); iounmap_trace_core(addr);
} }
int mmiotrace_printk(const char *fmt, ...)
{
int ret = 0;
va_list args;
unsigned long flags;
va_start(args, fmt);
spin_lock_irqsave(&trace_lock, flags);
if (is_enabled())
ret = mmio_trace_printk(fmt, args);
spin_unlock_irqrestore(&trace_lock, flags);
va_end(args);
return ret;
}
EXPORT_SYMBOL(mmiotrace_printk);
static void clear_trace_list(void) static void clear_trace_list(void)
{ {
struct remap_trace *trace; struct remap_trace *trace;

View File

@ -3,6 +3,7 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/mmiotrace.h>
#define MODULE_NAME "testmmiotrace" #define MODULE_NAME "testmmiotrace"
@ -13,6 +14,7 @@ MODULE_PARM_DESC(mmio_address, "Start address of the mapping of 16 kB.");
static void do_write_test(void __iomem *p) static void do_write_test(void __iomem *p)
{ {
unsigned int i; unsigned int i;
mmiotrace_printk("Write test.\n");
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
iowrite8(i, p + i); iowrite8(i, p + i);
for (i = 1024; i < (5 * 1024); i += 2) for (i = 1024; i < (5 * 1024); i += 2)
@ -24,6 +26,7 @@ static void do_write_test(void __iomem *p)
static void do_read_test(void __iomem *p) static void do_read_test(void __iomem *p)
{ {
unsigned int i; unsigned int i;
mmiotrace_printk("Read test.\n");
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
ioread8(p + i); ioread8(p + i);
for (i = 1024; i < (5 * 1024); i += 2) for (i = 1024; i < (5 * 1024); i += 2)
@ -39,6 +42,7 @@ static void do_test(void)
pr_err(MODULE_NAME ": could not ioremap, aborting.\n"); pr_err(MODULE_NAME ": could not ioremap, aborting.\n");
return; return;
} }
mmiotrace_printk("ioremap returned %p.\n", p);
do_write_test(p); do_write_test(p);
do_read_test(p); do_read_test(p);
iounmap(p); iounmap(p);

View File

@ -34,11 +34,15 @@ extern void unregister_kmmio_probe(struct kmmio_probe *p);
/* Called from page fault handler. */ /* Called from page fault handler. */
extern int kmmio_handler(struct pt_regs *regs, unsigned long addr); extern int kmmio_handler(struct pt_regs *regs, unsigned long addr);
/* Called from ioremap.c */
#ifdef CONFIG_MMIOTRACE #ifdef CONFIG_MMIOTRACE
/* Called from ioremap.c */
extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size, extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size,
void __iomem *addr); void __iomem *addr);
extern void mmiotrace_iounmap(volatile void __iomem *addr); extern void mmiotrace_iounmap(volatile void __iomem *addr);
/* For anyone to insert markers. Remember trailing newline. */
extern int mmiotrace_printk(const char *fmt, ...)
__attribute__ ((format (printf, 1, 2)));
#else #else
static inline void mmiotrace_ioremap(resource_size_t offset, static inline void mmiotrace_ioremap(resource_size_t offset,
unsigned long size, void __iomem *addr) unsigned long size, void __iomem *addr)
@ -48,7 +52,15 @@ static inline void mmiotrace_ioremap(resource_size_t offset,
static inline void mmiotrace_iounmap(volatile void __iomem *addr) static inline void mmiotrace_iounmap(volatile void __iomem *addr)
{ {
} }
#endif /* CONFIG_MMIOTRACE_HOOKS */
static inline int mmiotrace_printk(const char *fmt, ...)
__attribute__ ((format (printf, 1, 0)));
static inline int mmiotrace_printk(const char *fmt, ...)
{
return 0;
}
#endif /* CONFIG_MMIOTRACE */
enum mm_io_opcode { enum mm_io_opcode {
MMIO_READ = 0x1, /* struct mmiotrace_rw */ MMIO_READ = 0x1, /* struct mmiotrace_rw */
@ -81,5 +93,6 @@ extern void enable_mmiotrace(void);
extern void disable_mmiotrace(void); extern void disable_mmiotrace(void);
extern void mmio_trace_rw(struct mmiotrace_rw *rw); extern void mmio_trace_rw(struct mmiotrace_rw *rw);
extern void mmio_trace_mapping(struct mmiotrace_map *map); extern void mmio_trace_mapping(struct mmiotrace_map *map);
extern int mmio_trace_printk(const char *fmt, va_list args);
#endif /* MMIOTRACE_H */ #endif /* MMIOTRACE_H */

View File

@ -335,3 +335,8 @@ void mmio_trace_mapping(struct mmiotrace_map *map)
__trace_mmiotrace_map(tr, data, map); __trace_mmiotrace_map(tr, data, map);
preempt_enable(); preempt_enable();
} }
int mmio_trace_printk(const char *fmt, va_list args)
{
return trace_vprintk(0, fmt, args);
}