- CTLTYPE_QUAD | CTLFLAG_RD | CTLFLAG_LOCKED,
- &kd_ctrl_page.oldest_time,
- "Find the oldest timestamp still in trace");
-
-#if KDEBUG_MOJO_TRACE
-static kd_event_t *
-binary_search(uint32_t id)
-{
- int low, high, mid;
-
- low = 0;
- high = sizeof(kd_events)/sizeof(kd_event_t) - 1;
-
- while (TRUE)
- {
- mid = (low + high) / 2;
-
- if (low > high)
- return NULL; /* failed */
- else if ( low + 1 >= high) {
- /* We have a match */
- if (kd_events[high].id == id)
- return &kd_events[high];
- else if (kd_events[low].id == id)
- return &kd_events[low];
- else
- return NULL; /* search failed */
- }
- else if (id < kd_events[mid].id)
- high = mid;
- else
- low = mid;
- }
-}
-
-/*
- * Look up event id to get name string.
- * Using a per-cpu cache of a single entry
- * before resorting to a binary search of the full table.
- */
-#define NCACHE 1
-static kd_event_t *last_hit[MAX_CPUS];
-static kd_event_t *
-event_lookup_cache(uint32_t cpu, uint32_t id)
-{
- if (last_hit[cpu] == NULL || last_hit[cpu]->id != id)
- last_hit[cpu] = binary_search(id);
- return last_hit[cpu];
-}
-
-static uint64_t kd_last_timstamp;
-
-static void
-kdebug_serial_print(
- uint32_t cpunum,
- uint32_t debugid,
- uint64_t timestamp,
- uintptr_t arg1,
- uintptr_t arg2,
- uintptr_t arg3,
- uintptr_t arg4,
- uintptr_t threadid
- )
-{
- char kprintf_line[192];
- char event[40];
- uint64_t us = timestamp / NSEC_PER_USEC;
- uint64_t us_tenth = (timestamp % NSEC_PER_USEC) / 100;
- uint64_t delta = timestamp - kd_last_timstamp;
- uint64_t delta_us = delta / NSEC_PER_USEC;
- uint64_t delta_us_tenth = (delta % NSEC_PER_USEC) / 100;
- uint32_t event_id = debugid & KDBG_EVENTID_MASK;
- const char *command;
- const char *bra;
- const char *ket;
- kd_event_t *ep;
-
- /* event time and delta from last */
- snprintf(kprintf_line, sizeof(kprintf_line),
- "%11llu.%1llu %8llu.%1llu ",
- us, us_tenth, delta_us, delta_us_tenth);
-
-
- /* event (id or name) - start prefixed by "[", end postfixed by "]" */
- bra = (debugid & DBG_FUNC_START) ? "[" : " ";
- ket = (debugid & DBG_FUNC_END) ? "]" : " ";
- ep = event_lookup_cache(cpunum, event_id);
- if (ep) {
- if (strlen(ep->name) < sizeof(event) - 3)
- snprintf(event, sizeof(event), "%s%s%s",
- bra, ep->name, ket);
- else
- snprintf(event, sizeof(event), "%s%x(name too long)%s",
- bra, event_id, ket);
- } else {
- snprintf(event, sizeof(event), "%s%x%s",
- bra, event_id, ket);
- }
- snprintf(kprintf_line + strlen(kprintf_line),
- sizeof(kprintf_line) - strlen(kprintf_line),
- "%-40s ", event);
-
- /* arg1 .. arg4 with special cases for strings */
- switch (event_id) {
- case VFS_LOOKUP:
- case VFS_LOOKUP_DONE:
- if (debugid & DBG_FUNC_START) {
- /* arg1 hex then arg2..arg4 chars */
- snprintf(kprintf_line + strlen(kprintf_line),
- sizeof(kprintf_line) - strlen(kprintf_line),
- "%-16lx %-8s%-8s%-8s ",
- arg1, (char*)&arg2, (char*)&arg3, (char*)&arg4);
- break;
- }
- /* else fall through for arg1..arg4 chars */
- case TRACE_STRING_EXEC:
- case TRACE_STRING_NEWTHREAD:
- case TRACE_INFO_STRING:
- snprintf(kprintf_line + strlen(kprintf_line),
- sizeof(kprintf_line) - strlen(kprintf_line),
- "%-8s%-8s%-8s%-8s ",
- (char*)&arg1, (char*)&arg2, (char*)&arg3, (char*)&arg4);
- break;
- default:
- snprintf(kprintf_line + strlen(kprintf_line),
- sizeof(kprintf_line) - strlen(kprintf_line),
- "%-16lx %-16lx %-16lx %-16lx",
- arg1, arg2, arg3, arg4);
- }
-
- /* threadid, cpu and command name */
- if (threadid == (uintptr_t)thread_tid(current_thread()) &&
- current_proc() &&
- current_proc()->p_comm[0])
- command = current_proc()->p_comm;
- else
- command = "-";
- snprintf(kprintf_line + strlen(kprintf_line),
- sizeof(kprintf_line) - strlen(kprintf_line),
- " %-16lx %-2d %s\n",
- threadid, cpunum, command);
-
- kprintf("%s", kprintf_line);
- kd_last_timstamp = timestamp;
-}
-
-#endif