| // Copyright 2016 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIB_ZIRCON_INTERNAL_KTRACE_H_ |
| #define LIB_ZIRCON_INTERNAL_KTRACE_H_ |
| |
| #include <assert.h> |
| #include <stdint.h> |
| #include <zircon/compiler.h> |
| |
| __BEGIN_CDECLS |
| |
| // clang-format off |
| |
| // KTRACE TAG 0xGGGEEEXZ |
| // |
| // 12 group flags |
| // 12 event id bits |
| // 4 flag bits |
| // 4 bit size (in uint64_t units) |
| |
| #define KTRACE_TAG_EX(evt,grp,siz,flgs) \ |
| ( (((grp)&0xFFF)<<20) | (((evt)&0xFFF)<<8) | (((flgs)&0xF)<<4) | (((siz)>>3)&0x0F) ) |
| |
| #define KTRACE_TAG(evt,grp,siz) KTRACE_TAG_EX(evt, grp, siz, 0) |
| |
| #define KTRACE_TAG_16B(e,g) KTRACE_TAG(e,g,16) |
| #define KTRACE_TAG_32B(e,g) KTRACE_TAG(e,g,32) |
| #define KTRACE_TAG_NAME(e,g) KTRACE_TAG(e,g,48) |
| |
| #define KTRACE_TAG_FLAGS(tag, flags) ((tag) | (((flags)&0xF)<<4)) |
| |
| #define KTRACE_LEN(tag) (((tag)&0xF)<<3) |
| #define KTRACE_GROUP(tag) (((tag)>>20)&0xFFF) |
| #define KTRACE_EVENT(tag) (((tag)>>8)&0xFFF) |
| #define KTRACE_FLAGS(tag) (((tag)>>4)&0xF) |
| |
| #define KTRACE_NAMED_EVENT_BIT (0x800) |
| |
| #define KTRACE_NAMED_EVENT(id) ((id) | KTRACE_NAMED_EVENT_BIT) |
| #define KTRACE_EVENT_NAME_ID(tag) (KTRACE_EVENT(tag) & 0x7ff) |
| |
| #define KTRACE_HDRSIZE (16) |
| #define KTRACE_RECSIZE (32) |
| #define KTRACE_NAMESIZE (12) |
| #define KTRACE_NAMEOFF (8) |
| |
| #define KTRACE_VERSION (0x00020000u) |
| |
| // Filter Groups |
| #define KTRACE_GRP_ALL 0xFFF |
| #define KTRACE_GRP_META 0x001 |
| #define KTRACE_GRP_LIFECYCLE 0x002 |
| #define KTRACE_GRP_SCHEDULER 0x004 |
| #define KTRACE_GRP_TASKS 0x008 |
| #define KTRACE_GRP_IPC 0x010 |
| #define KTRACE_GRP_IRQ 0x020 |
| #define KTRACE_GRP_PROBE 0x040 |
| #define KTRACE_GRP_ARCH 0x080 |
| #define KTRACE_GRP_SYSCALL 0x100 |
| #define KTRACE_GRP_VM 0x200 |
| |
| #define KTRACE_GRP_TO_MASK(grp) ((grp) << 20) |
| |
| #define KTRACE_FLAGS_CPU (0x1) |
| #define KTRACE_FLAGS_BEGIN (0x2) |
| #define KTRACE_FLAGS_END (0x4) |
| #define KTRACE_FLAGS_FLOW (0x8) |
| #define KTRACE_FLAGS_COUNTER (KTRACE_FLAGS_BEGIN | KTRACE_FLAGS_END) |
| |
| typedef struct ktrace_header { |
| uint32_t tag; |
| uint32_t tid; |
| uint64_t ts; |
| } ktrace_header_t; |
| |
| static_assert(sizeof(ktrace_header_t) == KTRACE_HDRSIZE, |
| "ktrace_header_t is not KTRACE_HDRSIZE bytes"); |
| |
| typedef struct ktrace_rec_32b { |
| uint32_t tag; |
| uint32_t tid; |
| uint64_t ts; |
| uint32_t a; |
| uint32_t b; |
| uint32_t c; |
| uint32_t d; |
| } ktrace_rec_32b_t; |
| |
| typedef struct ktrace_rec_name { |
| uint32_t tag; |
| uint32_t id; |
| uint32_t arg; |
| char name[1]; |
| } ktrace_rec_name_t; |
| |
| #define KTRACE_DEF(num,type,name,group) TAG_##name = KTRACE_TAG_##type(num,KTRACE_GRP_##group), |
| enum { |
| #include <lib/zircon-internal/ktrace-def.h> |
| }; |
| |
| #define TAG_PROBE_16(id) KTRACE_TAG(KTRACE_NAMED_EVENT(id),KTRACE_GRP_PROBE,16) |
| #define TAG_PROBE_24(id) KTRACE_TAG(KTRACE_NAMED_EVENT(id),KTRACE_GRP_PROBE,24) |
| #define TAG_PROBE_32(id) KTRACE_TAG(KTRACE_NAMED_EVENT(id),KTRACE_GRP_PROBE,32) |
| |
| #define TAG_BEGIN_DURATION_16(id, group) KTRACE_TAG_EX(KTRACE_NAMED_EVENT(id), \ |
| group,16,KTRACE_FLAGS_BEGIN) |
| #define TAG_END_DURATION_16(id, group) KTRACE_TAG_EX(KTRACE_NAMED_EVENT(id), \ |
| group,16,KTRACE_FLAGS_END) |
| #define TAG_BEGIN_DURATION_32(id, group) KTRACE_TAG_EX(KTRACE_NAMED_EVENT(id), \ |
| group,32,KTRACE_FLAGS_BEGIN) |
| #define TAG_END_DURATION_32(id, group) KTRACE_TAG_EX(KTRACE_NAMED_EVENT(id), \ |
| group,32,KTRACE_FLAGS_END) |
| |
| #define TAG_FLOW_BEGIN(id, group) KTRACE_TAG_EX(KTRACE_NAMED_EVENT(id), \ |
| group,32,KTRACE_FLAGS_FLOW | KTRACE_FLAGS_BEGIN) |
| #define TAG_FLOW_END(id, group) KTRACE_TAG_EX(KTRACE_NAMED_EVENT(id), \ |
| group,32,KTRACE_FLAGS_FLOW | KTRACE_FLAGS_END) |
| #define TAG_FLOW_STEP(id, group) KTRACE_TAG_EX(KTRACE_NAMED_EVENT(id), \ |
| group,32,KTRACE_FLAGS_FLOW | KTRACE_FLAGS_BEGIN | \ |
| KTRACE_FLAGS_END) |
| |
| #define TAG_COUNTER(id, group) KTRACE_TAG_EX(KTRACE_NAMED_EVENT(id), \ |
| group,32,KTRACE_FLAGS_COUNTER) |
| |
| // Actions for ktrace control |
| #define KTRACE_ACTION_START 1 // options = grpmask, 0 = all |
| #define KTRACE_ACTION_STOP 2 // options ignored |
| #define KTRACE_ACTION_REWIND 3 // options ignored |
| #define KTRACE_ACTION_NEW_PROBE 4 // options ignored, ptr = name |
| #define KTRACE_ACTION_START_CIRCULAR 5 // options = grpmask, 0 = all |
| |
| |
| // Flags defined for the INHERIT_PRIORITY ktrace event. See ktrace-def.h for details. |
| #define KTRACE_FLAGS_INHERIT_PRIORITY_CPUID_MASK ((uint32_t)0xFF) |
| #define KTRACE_FLAGS_INHERIT_PRIORITY_KERNEL_TID ((uint32_t)0x100) |
| #define KTRACE_FLAGS_INHERIT_PRIORITY_FINAL_EVT ((uint32_t)0x200) |
| |
| // Flags defined for the FUTEX_* ktrace events. See ktrace-def.h for details. |
| #define KTRACE_FLAGS_FUTEX_CPUID_MASK ((uint32_t)0xFF) |
| #define KTRACE_FLAGS_FUTEX_COUNT_MASK ((uint32_t)0xFF) |
| #define KTRACE_FLAGS_FUTEX_COUNT_SHIFT ((uint32_t)8) |
| #define KTRACE_FLAGS_FUTEX_UNBOUND_COUNT_VAL ((uint32_t)0xFF) |
| #define KTRACE_FLAGS_FUTEX_FLAGS_MASK ((uint32_t) \ |
| ~(KTRACE_FLAGS_FUTEX_CPUID_MASK | \ |
| (KTRACE_FLAGS_FUTEX_COUNT_MASK << KTRACE_FLAGS_FUTEX_COUNT_SHIFT))) |
| #define KTRACE_FLAGS_FUTEX_WAS_ACTIVE_FLAG ((uint32_t)0x80000000) |
| #define KTRACE_FLAGS_FUTEX_WAS_REQUEUE_FLAG ((uint32_t)0x40000000) |
| |
| // Flags defined for the KERNEL_MUTEX_* ktrace events. See ktrace-def.h for details. |
| #define KTRACE_FLAGS_KERNEL_MUTEX_CPUID_MASK ((uint32_t)0xFF) |
| #define KTRACE_FLAGS_KERNEL_MUTEX_FLAGS_MASK (~KTRACE_FLAGS_KERNEL_MUTEX_CPUID_MASK) |
| #define KTRACE_FLAGS_KERNEL_MUTEX_USER_MODE_TID ((uint32_t)0x80000000) |
| |
| __END_CDECLS |
| |
| #endif // LIB_ZIRCON_INTERNAL_KTRACE_H_ |