// 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 KTRACE_DEF
#error must define KTRACE_DEF
#endif

// events before 0x100 may require specialized handling

KTRACE_DEF(0x000, 32B, VERSION, META)       // version
KTRACE_DEF(0x001, 32B, TICKS_PER_MS, META)  // lo32, hi32

KTRACE_DEF(0x020, NAME, KTHREAD_NAME, META)    // ktid, 0, name[]
KTRACE_DEF(0x021, NAME, THREAD_NAME, META)     // tid, pid, name[]
KTRACE_DEF(0x022, NAME, PROC_NAME, META)       // pid, 0, name[]
KTRACE_DEF(0x023, NAME, SYSCALL_NAME, META)    // num, 0, name[]
KTRACE_DEF(0x024, NAME, IRQ_NAME, META)        // num, 0, name[]
KTRACE_DEF(0x025, NAME, PROBE_NAME, META)      // num, 0, name[]
KTRACE_DEF(0x026, NAME, VCPU_META, META)       // meta, 0, name[]
KTRACE_DEF(0x027, NAME, VCPU_EXIT_META, META)  // meta, 0, name[]

KTRACE_DEF(0x030, 16B, IRQ_ENTER, IRQ)          // (irqn << 8) | cpu
KTRACE_DEF(0x031, 16B, IRQ_EXIT, IRQ)           // (irqn << 8) | cpu
KTRACE_DEF(0x032, 16B, SYSCALL_ENTER, SYSCALL)  // (n << 8) | cpu
KTRACE_DEF(0x033, 16B, SYSCALL_EXIT, SYSCALL)   // (n << 8) | cpu

KTRACE_DEF(0x034, 32B, PAGE_FAULT, VM)       // virtual_address_hi, virtual_address_lo, flags, cpu
KTRACE_DEF(0x035, 32B, PAGE_FAULT_EXIT, VM)  // virtual_address_hi, virtual_address_lo, flags, cpu

KTRACE_DEF(0x036, 32B, ACCESS_FAULT, VM)       // virtual_address_hi, virtual_address_lo, flags, cpu
KTRACE_DEF(0x037, 32B, ACCESS_FAULT_EXIT, VM)  // virtual_address_hi, virtual_address_lo, flags, cpu

// to-tid, ((new_thread_prioriy<<24) | (old_thread_priority<<16) | (old_thread_state<<8) | cpu),
// from-kt, to-kt
KTRACE_DEF(0x040, 32B, CONTEXT_SWITCH, SCHEDULER)

// Word 0: inherit event ID
// Word 1: 0
// Word 2: 0
// Word 3: bits [0, 7] CPU ID
KTRACE_DEF(0x041, 32B, INHERIT_PRIORITY_START, SCHEDULER)

// Word 0: inherit event ID.
// Word 1: Target thread TID.
// Word 2: bits [ 0,  7] : old effective priority as an int8_t
//       : bits [ 8, 15] : new effective priority as an int8_t
//       : bits [16, 23] : old inherited priority as an int8_t
//       : bits [24, 31] : new inherited priority as an int8_t
// Word 3: bits [ 0,  7] : CPU ID
//       : bit 8         : Kernel TID flag.
//       : bit 9         : Final event flag.
//
// Note: Target thread TID is one of two things.  Either, the lower 32
// bits of the KOID for a user mode thread dispatcher object, or the
// lower 32 bits of a kernel mode thread structure's kernel address.
// The Kernel TID flag in word #3 can be used to tell the difference
// (1 => kernel TID, 0 => user mode TID)
//
KTRACE_DEF(0x042, 32B, INHERIT_PRIORITY, SCHEDULER)

// Word 0: futex ID bits [0..31]
// Word 1: futex ID bits [32..63]
// Word 2: new owner user-mode TID, or 0 for no owner
// Word 3: bits [0..7] CPU ID
KTRACE_DEF(0x043, 32B, FUTEX_WAIT, SCHEDULER)

// Word 0: futex ID bits [0..31]
// Word 1: futex ID bits [32..63]
// Word 2: zx_status_t result of the wait operation.
// Word 3: bits [0..7] CPU ID
KTRACE_DEF(0x044, 32B, FUTEX_WOKE, SCHEDULER)

// Word 0: futex ID bits [0..31]
// Word 1: futex ID bits [32..63]
// Word 2: assigned owner user-mode TID, or 0 for no owner
// Word 3: bits [0..7] CPU ID
// Word 3: bits [8..15] Low 8 bits of count
//                      [0, 0xFE) => count
//                      0xFE      => count was >= 0xFE
//                      0xFF      => count was unlimited
// Word 3: bit 30; 1 => requeue operation, 0 => wake operation
// Word 3: bit 31; 1 => futex was active, 0 => it was not.
KTRACE_DEF(0x045, 32B, FUTEX_WAKE, SCHEDULER)

// Word 0: requeue target futex ID bits [0..31]
// Word 1: requeue target futex ID bits [32..63]
// Word 2: assigned owner user-mode TID, or 0 for no owner
// Word 3: bits [0..7] CPU ID
// Word 3: bits [8..15] Low 8 bits of count
//                      [0, 0xFE) => count
//                      0xFE      => count was >= 0xFE
//                      0xFF      => count was unlimited
// Word 3: bit 31; 1 => futex was active, 0 => it was not.
KTRACE_DEF(0x046, 32B, FUTEX_REQUEUE, SCHEDULER)

// Trace events logged when a thread interacts with a kernel mutex.  Three
// operations are defined, Acquire, release and block, but the meaning of the
// parameters vary slightly from operation to operation.
//
// Acquire operations are only logged in the case that a mutex is obtained while
// uncontested.  There will never be a TID specified, and the number of waiters
// will always be 0.
//
// Release operations will only log a TID in the case that the mutex is being
// granted atomically to a specific waiter, and the TID will specify the waiter
// that the mutex is being release to.  In the case that an uncontested mutex is
// being released, the TID will be 0.
//
// Block operations will log a TID indicating the TID of the thread which
// current owns the mutex and is blocking them.
//
// Word 0: low 32 bits of kernel mutex address
// Word 1: TID
// Word 2: The number of threads blocked on this mutex
// Word 3: bits [0..7] CPU ID
// Word 3: bit 31: 1 => word 1 TID is user mode
//                 0 => word 1 TID is kernel mode
KTRACE_DEF(0x047, 32B, KERNEL_MUTEX_ACQUIRE, SCHEDULER)
KTRACE_DEF(0x048, 32B, KERNEL_MUTEX_RELEASE, SCHEDULER)
KTRACE_DEF(0x049, 32B, KERNEL_MUTEX_BLOCK, SCHEDULER)

KTRACE_DEF(0x100, 32B, OBJECT_DELETE, LIFECYCLE)  // id

KTRACE_DEF(0x110, 32B, THREAD_CREATE, TASKS)  // tid, pid
KTRACE_DEF(0x111, 32B, THREAD_START, TASKS)   // tid
KTRACE_DEF(0x112, 32B, THREAD_EXIT, TASKS)

KTRACE_DEF(0x120, 32B, PROC_CREATE, TASKS)  // pid
KTRACE_DEF(0x121, 32B, PROC_START, TASKS)   // tid, pid
KTRACE_DEF(0x122, 32B, PROC_EXIT, TASKS)    // pid

KTRACE_DEF(0x130, 32B, CHANNEL_CREATE, IPC)  // id0, id1, flags
KTRACE_DEF(0x131, 32B, CHANNEL_WRITE, IPC)   // id0, bytes, handles
KTRACE_DEF(0x132, 32B, CHANNEL_READ, IPC)    // id1, bytes, handles

KTRACE_DEF(0x140, 32B, PORT_WAIT, IPC)       // id
KTRACE_DEF(0x141, 32B, PORT_WAIT_DONE, IPC)  // id, status
KTRACE_DEF(0x142, 32B, PORT_CREATE, IPC)     // id
KTRACE_DEF(0x143, 32B, PORT_QUEUE, IPC)      // id, size

KTRACE_DEF(0x150, 32B, WAIT_ONE, IPC)       // id, signals, timeoutlo, timeouthi
KTRACE_DEF(0x151, 32B, WAIT_ONE_DONE, IPC)  // id, status, pending

KTRACE_DEF(0x160, 32B, KWAIT_BLOCK, SCHEDULER)    // queue_hi, queue_hi
KTRACE_DEF(0x161, 32B, KWAIT_WAKE, SCHEDULER)     // queue_hi, queue_hi, is_mutex
KTRACE_DEF(0x162, 32B, KWAIT_UNBLOCK, SCHEDULER)  // queue_hi, queue_hi, blocked_status

KTRACE_DEF(0x170, 32B, VCPU_ENTER, TASKS)
KTRACE_DEF(0x171, 32B, VCPU_EXIT, TASKS)     // meta, exit_address_hi, exit_address_lo
KTRACE_DEF(0x172, 32B, VCPU_BLOCK, TASKS)    // meta
KTRACE_DEF(0x173, 32B, VCPU_UNBLOCK, TASKS)  // meta

// events from 0x200-0x2ff are for arch-specific needs

#ifdef __x86_64__
// These are used by Intel Processor Trace support.
KTRACE_DEF(0x200, 32B, IPT_START, ARCH)     // MSR_PLATFORM_INFO[15:8], kernel cr3
KTRACE_DEF(0x201, 32B, IPT_CPU_INFO, ARCH)  // family, model, stepping
KTRACE_DEF(0x202, 32B, IPT_STOP, ARCH)
KTRACE_DEF(0x203, 32B, IPT_PROCESS_CREATE, ARCH)  // pid, cr3
#endif

#undef KTRACE_DEF
