#include #include #include #include #include #include #include #include "dump_log.h" #define NSECS_PER_SEC 1000000000ULL static void convert_to_ns(unsigned long long t, unsigned long *secs, unsigned long *nsecs) { *secs = (unsigned long)(t / 1000000000ULL); *nsecs = (unsigned long)(t % 1000000000ULL); } static void logdev_print_time_cpu(unsigned long long t, int cpu) { unsigned long nsecs; unsigned long secs; convert_to_ns(t, &secs, &nsecs); printf("[%5lu.%06lu] cpu:%d ", secs, nsecs/1000, cpu); } /* ------------------ place kernel printing here ----------------- */ static void logdev_print_hdr(int cpu, struct logdev_mark_hdr *hdr) { logdev_print_time_cpu(hdr->t, cpu); } static void logdev_mark_switch_print(int cpu, int size, struct logdev_mark_switch *lm) { logdev_print_hdr(cpu, &lm->hdr); printf("%s:%d(%d:%d:%d:%d) -->> ", lm->prev_comm, lm->pid_prev, lm->prev_prio, lm->prev_static_prio, lm->prev_normal_prio, lm->prev_rt_prio); printf("%s:%d(%d:%d:%d:%d)\n", lm->next_comm, lm->pid_next, lm->next_prio, lm->next_static_prio, lm->next_normal_prio, lm->next_rt_prio); } static void logdev_mark_mm_fault_print(int cpu, int size, struct logdev_mark_mm_fault *lm) { logdev_print_hdr(cpu, &lm->hdr); printf("%s:%d mm=%p vma=%p address=%lx write_access=%d\n", lm->comm, lm->pid, lm->mm, lm->vma, lm->address, lm->write_access); } static void logdev_mark_getres_print(int cpu, int size, struct logdev_mark_getres *lm) { logdev_print_hdr(cpu, &lm->hdr); printf("%s:%d getres clock:%d\n", lm->comm, lm->pid, lm->clock); } static void logdev_mark_callback(struct logdev_header *hdr, struct logdev_custom *custom, int cpu, void *rec) { struct logdev_mark_hdr *lm = rec; switch (lm->id) { case LOGMARK_CNTXTSW: logdev_mark_switch_print(cpu, hdr->size, rec); break; case LOGMARK_MM_FAULT: logdev_mark_mm_fault_print(cpu, hdr->size, rec); break; case LOGMARK_GETRES: logdev_mark_getres_print(cpu, hdr->size, rec); break; default: printf("Unknown marker callback id %x\n", custom->id); break; } } /* ---------------- end placement for user printing ------------ */ void logdev_setup_markers(void) { logdev_register_callback(LOGMARK_ID_MARK, logdev_mark_callback); }