#include <linux/moduleparam.h>
static DEFINE_PER_CPU(int, en);
-static DEFINE_PER_CPU(unsigned long, irq_flag);
#define IRQ_D 1
}
void notrace pstore_io_save(unsigned long reg, unsigned long val,
- unsigned long parant, unsigned int flag)
+ unsigned long parant, unsigned int flag,
+ unsigned long *irq_flag)
{
struct pstore_ftrace_record rec;
- int cpu = get_cpu();
- put_cpu();
if (!ramoops_ftrace_en || !ramoops_io_en)
return;
if ((flag == PSTORE_FLAG_IO_R || flag == PSTORE_FLAG_IO_W) && IRQ_D)
- local_irq_save(per_cpu(irq_flag, cpu));
+ local_irq_save(*irq_flag);
rec.ip = CALLER_ADDR0;
rec.parent_ip = parant;
rec.val2 = val;
pstore_ftrace_save(&rec);
- if ((flag == PSTORE_FLAG_IO_R_END || flag == PSTORE_FLAG_IO_W_END)
- && IRQ_D)
- local_irq_restore(per_cpu(irq_flag, cpu));
+ if ((flag == PSTORE_FLAG_IO_R_END || flag == PSTORE_FLAG_IO_W_END) &&
+ IRQ_D)
+ local_irq_restore(*irq_flag);
}
EXPORT_SYMBOL(pstore_io_save);
#define PSTORE_FLAG_MASK 0xF
void notrace pstore_io_save(unsigned long reg, unsigned long val,
- unsigned long parant, unsigned int flag);
+ unsigned long parant, unsigned int flag,
+ unsigned long *irq_flag);
//#define SKIP_IO_TRACE
#if (defined CONFIG_AMLOGIC_DEBUG_FTRACE_PSTORE) && (!defined SKIP_IO_TRACE)
#define pstore_ftrace_io_wr(reg, val) \
-pstore_io_save(reg, val, CALLER_ADDR0, PSTORE_FLAG_IO_W)
+unsigned long irqflg; \
+pstore_io_save(reg, val, CALLER_ADDR0, PSTORE_FLAG_IO_W, &irqflg)
#define pstore_ftrace_io_wr_end(reg, val) \
-pstore_io_save(reg, 0, CALLER_ADDR0, PSTORE_FLAG_IO_W_END)
+pstore_io_save(reg, 0, CALLER_ADDR0, PSTORE_FLAG_IO_W_END, &irqflg)
-#define pstore_ftrace_io_rd(reg) \
-pstore_io_save(reg, 0, CALLER_ADDR0, PSTORE_FLAG_IO_R)
+#define pstore_ftrace_io_rd(reg) \
+unsigned long irqflg; \
+pstore_io_save(reg, 0, CALLER_ADDR0, PSTORE_FLAG_IO_R, &irqflg)
#define pstore_ftrace_io_rd_end(reg) \
-pstore_io_save(reg, 0, CALLER_ADDR0, PSTORE_FLAG_IO_R_END)
+pstore_io_save(reg, 0, CALLER_ADDR0, PSTORE_FLAG_IO_R_END, &irqflg)
#define need_dump_iomap() (ramoops_io_en | dump_iomap)