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; }