linux/include/linux/mmiotrace.h
<<
>>
Prefs
   1#ifndef MMIOTRACE_H
   2#define MMIOTRACE_H
   3
   4#include <linux/types.h>
   5#include <linux/list.h>
   6
   7struct kmmio_probe;
   8struct pt_regs;
   9
  10typedef void (*kmmio_pre_handler_t)(struct kmmio_probe *,
  11                                struct pt_regs *, unsigned long addr);
  12typedef void (*kmmio_post_handler_t)(struct kmmio_probe *,
  13                                unsigned long condition, struct pt_regs *);
  14
  15struct kmmio_probe {
  16        struct list_head list; /* kmmio internal list */
  17        unsigned long addr; /* start location of the probe point */
  18        unsigned long len; /* length of the probe region */
  19        kmmio_pre_handler_t pre_handler; /* Called before addr is executed. */
  20        kmmio_post_handler_t post_handler; /* Called after addr is executed */
  21        void *private;
  22};
  23
  24/* kmmio is active by some kmmio_probes? */
  25static inline int is_kmmio_active(void)
  26{
  27        extern unsigned int kmmio_count;
  28        return kmmio_count;
  29}
  30
  31extern int register_kmmio_probe(struct kmmio_probe *p);
  32extern void unregister_kmmio_probe(struct kmmio_probe *p);
  33
  34/* Called from page fault handler. */
  35extern int kmmio_handler(struct pt_regs *regs, unsigned long addr);
  36
  37#ifdef CONFIG_MMIOTRACE
  38/* Called from ioremap.c */
  39extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size,
  40                                                        void __iomem *addr);
  41extern void mmiotrace_iounmap(volatile void __iomem *addr);
  42
  43/* For anyone to insert markers. Remember trailing newline. */
  44extern int mmiotrace_printk(const char *fmt, ...)
  45                                __attribute__ ((format (printf, 1, 2)));
  46#else
  47static inline void mmiotrace_ioremap(resource_size_t offset,
  48                                        unsigned long size, void __iomem *addr)
  49{
  50}
  51
  52static inline void mmiotrace_iounmap(volatile void __iomem *addr)
  53{
  54}
  55
  56static inline int mmiotrace_printk(const char *fmt, ...)
  57                                __attribute__ ((format (printf, 1, 0)));
  58
  59static inline int mmiotrace_printk(const char *fmt, ...)
  60{
  61        return 0;
  62}
  63#endif /* CONFIG_MMIOTRACE */
  64
  65enum mm_io_opcode {
  66        MMIO_READ = 0x1,     /* struct mmiotrace_rw */
  67        MMIO_WRITE = 0x2,    /* struct mmiotrace_rw */
  68        MMIO_PROBE = 0x3,    /* struct mmiotrace_map */
  69        MMIO_UNPROBE = 0x4,  /* struct mmiotrace_map */
  70        MMIO_UNKNOWN_OP = 0x5, /* struct mmiotrace_rw */
  71};
  72
  73struct mmiotrace_rw {
  74        resource_size_t phys;   /* PCI address of register */
  75        unsigned long value;
  76        unsigned long pc;       /* optional program counter */
  77        int map_id;
  78        unsigned char opcode;   /* one of MMIO_{READ,WRITE,UNKNOWN_OP} */
  79        unsigned char width;    /* size of register access in bytes */
  80};
  81
  82struct mmiotrace_map {
  83        resource_size_t phys;   /* base address in PCI space */
  84        unsigned long virt;     /* base virtual address */
  85        unsigned long len;      /* mapping size */
  86        int map_id;
  87        unsigned char opcode;   /* MMIO_PROBE or MMIO_UNPROBE */
  88};
  89
  90/* in kernel/trace/trace_mmiotrace.c */
  91extern void enable_mmiotrace(void);
  92extern void disable_mmiotrace(void);
  93extern void mmio_trace_rw(struct mmiotrace_rw *rw);
  94extern void mmio_trace_mapping(struct mmiotrace_map *map);
  95extern int mmio_trace_printk(const char *fmt, va_list args);
  96
  97#endif /* MMIOTRACE_H */
  98
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.