static int kirq_proc_show(struct seq_file *m, void *v)
{
	char *mem = NULL ;
	void * __iomem exc_mem = NULL;
	struct dump_log *dump = NULL;
	struct queue *head = NULL;
	struct irq_info info;
	unsigned long flags = 0;
	u32 count = num_online_cpus();
	unsigned int i = 0;

	exc_mem = (void *)ioremap(ANDROID_DUMP_LOG_ADDR, ANDROID_DUMP_LOG_SIZE);
	if (NULL == exc_mem) {
		printk("%s : failed to ioremap memory\r\n", __FUNCTION__);
		return 0;
	}

	dump = (struct dump_log *)exc_mem;

	mem = (char *)vmalloc(EXCH_INT_SWITCH_SIZE);
	if (!mem) {
		printk("%s : failed to vmalloc memory\n",__FUNCTION__);
		goto kirq_unmap;
	}

	for (i = 0; i < count; i++) {
		head = (struct queue*)(dump->irq_trace + g_irq_record_offset[i]);
		spin_lock_irqsave(&head->lock, flags);
		hisi_io_memcpy(mem, &dump->irq_trace[0], EXCH_INT_SWITCH_SIZE);
		spin_unlock_irqrestore(&head->lock, flags);

		head = (struct queue *)(mem + g_irq_record_offset[i]);
		seq_printf(m, "IRQ Trace cpu[%d]\n", i);
		seq_printf(m, "in %u out %u size %u\n", head->in, head->out, head->max);

		do {
			if (_queue_out(head, (void *)&info, sizeof(struct irq_info)))
				break;

			if (EXCH_INT_EXIT == info.irq)
				seq_printf(m, "[ %10lu ][ %10lu ][ CPU %1d ] IRQ         OUT\n", \
							info.jiff, info.slice, info.cpu);
			else
				seq_printf(m, "[ %10lu ][ %10lu ][ CPU %1d ] IRQ [ %3d ] IN\n", \
							info.jiff, info.slice, info.cpu, info.irq);
		} while(1);

		seq_printf(m, "\n");
	}

	vfree(mem);

kirq_unmap:
	iounmap(exc_mem);
	return 0;
}
int queue_out(struct queue *q, void *element, unsigned int len)
{
    unsigned long flags = 0;
    int ret;

    spin_lock_irqsave(&q->lock, flags);
    ret = _queue_out(q, element, len);
    spin_unlock_irqrestore(&q->lock, flags);

    return ret;
}
static int last_kirq_proc_show(struct seq_file *m, void *v)
{
	char *mem = NULL ;
	struct queue *head = NULL;
	struct irq_info info;
	u32 count = num_online_cpus();
	unsigned int i = 0;

	if (NULL == last_kirq) {
		printk(KERN_ERR "%s: last_kirq is null\n", __FUNCTION__);
		return 0;
	}
	mem = (char *)vmalloc(EXCH_INT_SWITCH_SIZE);
	if (!mem) {
		printk("%s : failed to vmalloc memory\n",__FUNCTION__);
		return 0;
	}

	hisi_io_memcpy(mem, last_kirq, EXCH_INT_SWITCH_SIZE);

	for (i = 0; i < count; i++) {
		head = (struct queue *)(mem + g_irq_record_offset[i]);
		seq_printf(m, "IRQ Trace cpu[%d]\n", i);
		seq_printf(m, "in %u out %u size %u\n", head->in, head->out, head->max);

		do {
			if (_queue_out(head, (void *)&info, sizeof(struct irq_info)))
				break;

			if (EXCH_INT_EXIT == info.irq)
				seq_printf(m, "[ %10lu ][ %10lu ][ CPU %1d ] IRQ         OUT\n", \
							info.jiff, info.slice, info.cpu);
			else
				seq_printf(m, "[ %10lu ][ %10lu ][ CPU %1d ] IRQ [ %3d ] IN\n", \
							info.jiff, info.slice, info.cpu, info.irq);
		} while(1);

		seq_printf(m, "\n");
	}

	vfree(mem);

	return 0;
}
static int last_ktask_proc_show(struct seq_file *m, void *v)
{
	char *mem = NULL;
	struct queue *head = NULL;
	struct task_info info;
	u32 count = num_online_cpus();
	unsigned int i = 0;

	if (NULL == last_ktask) {
		printk(KERN_ERR "%s: last_ktask is null\n", __FUNCTION__);
		return 0;
	}

	mem = (char *)vmalloc(EXCH_TASK_SWITCH_SIZE);
	if (!mem) {
		printk("%s : failed to vmalloc memory\n",__FUNCTION__);
		return 0;
	}

	hisi_io_memcpy(mem, last_ktask, EXCH_TASK_SWITCH_SIZE);

	for (i = 0; i < count; i++) {
		head = (struct queue *)(mem + g_task_record_offset[i]);
		seq_printf(m, "TASK Trace cpu[%d]\n", i);
		seq_printf(m, "in %u out %u size %u\n", head->in, head->out, head->max);

		do {
			if (_queue_out(head, (void *)&info, sizeof(struct task_info)))
				break;

			seq_printf(m, "[ %10lu ][ %10lu ] PID [ %6u ][ %18s ] scheduled in CPU [ %u ]\n", \
						info.jiff, info.slice, info.pid, info.taskname, info.cpu);
		} while(1);

		seq_printf(m, "\n");
	}

	vfree(mem);

	return 0;
}