// 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.

#pragma once

#include <zircon/types.h>

__BEGIN_CDECLS

// ask clang format not to mess up the indentation:
// clang-format off

// Valid topics for zx_object_get_info.
typedef enum {
    ZX_INFO_NONE                       = 0,
    ZX_INFO_HANDLE_VALID               = 1,
    ZX_INFO_HANDLE_BASIC               = 2,  // zx_info_handle_basic_t[1]
    ZX_INFO_PROCESS                    = 3,  // zx_info_process_t[1]
    ZX_INFO_PROCESS_THREADS            = 4,  // zx_koid_t[n]
    ZX_INFO_VMAR                       = 7,  // zx_info_vmar_t[1]
    ZX_INFO_JOB_CHILDREN               = 8,  // zx_koid_t[n]
    ZX_INFO_JOB_PROCESSES              = 9,  // zx_koid_t[n]
    ZX_INFO_THREAD                     = 10, // zx_info_thread_t[1]
    ZX_INFO_THREAD_EXCEPTION_REPORT    = 11, // zx_exception_report_t[1]
    ZX_INFO_TASK_STATS                 = 12, // zx_info_task_stats_t[1]
    ZX_INFO_PROCESS_MAPS               = 13, // zx_info_maps_t[n]
    ZX_INFO_PROCESS_VMOS               = 14, // zx_info_vmo_t[n]
    ZX_INFO_THREAD_STATS               = 15, // zx_info_thread_stats_t[1]
    ZX_INFO_CPU_STATS                  = 16, // zx_info_cpu_stats_t[n]
    ZX_INFO_KMEM_STATS                 = 17, // zx_info_kmem_stats_t[1]
    ZX_INFO_RESOURCE                   = 18, // zx_info_resource_t[1]
    ZX_INFO_LAST
} zx_object_info_topic_t;

typedef enum {
    ZX_OBJ_TYPE_NONE                = 0,
    ZX_OBJ_TYPE_PROCESS             = 1,
    ZX_OBJ_TYPE_THREAD              = 2,
    ZX_OBJ_TYPE_VMO                 = 3,
    ZX_OBJ_TYPE_CHANNEL             = 4,
    ZX_OBJ_TYPE_EVENT               = 5,
    ZX_OBJ_TYPE_PORT                = 6,
    ZX_OBJ_TYPE_INTERRUPT           = 9,
    ZX_OBJ_TYPE_PCI_DEVICE          = 11,
    ZX_OBJ_TYPE_LOG                 = 12,
    ZX_OBJ_TYPE_SOCKET              = 14,
    ZX_OBJ_TYPE_RESOURCE            = 15,
    ZX_OBJ_TYPE_EVENT_PAIR          = 16,
    ZX_OBJ_TYPE_JOB                 = 17,
    ZX_OBJ_TYPE_VMAR                = 18,
    ZX_OBJ_TYPE_FIFO                = 19,
    ZX_OBJ_TYPE_GUEST               = 20,
    ZX_OBJ_TYPE_VCPU                = 21,
    ZX_OBJ_TYPE_TIMER               = 22,
    ZX_OBJ_TYPE_LAST
} zx_obj_type_t;

typedef enum {
    ZX_OBJ_PROP_NONE            = 0,
    ZX_OBJ_PROP_WAITABLE        = 1,
} zx_obj_props_t;

typedef struct zx_info_handle_basic {
    // The unique id assigned by kernel to the object referenced by the
    // handle.
    zx_koid_t koid;

    // The immutable rights assigned to the handle. Two handles that
    // have the same koid and the same rights are equivalent and
    // interchangeable.
    zx_rights_t rights;

    // The object type: channel, event, socket, etc.
    uint32_t type;                // zx_obj_type_t;

    // The koid of the logical counterpart or parent object of the
    // object referenced by the handle. Otherwise this value is zero.
    zx_koid_t related_koid;

    // Set to ZX_OBJ_PROP_WAITABLE if the object referenced by the
    // handle can be waited on; zero otherwise.
    uint32_t props;               // zx_obj_props_t;
} zx_info_handle_basic_t;

typedef struct zx_info_process {
    // The process's return code; only valid if |exited| is true.
    // Guaranteed to be non-zero if the process was killed by |zx_task_kill|.
    int return_code;

    // True if the process has ever left the initial creation state,
    // even if it has exited as well.
    bool started;

    // If true, the process has exited and |return_code| is valid.
    bool exited;

    // True if a debugger is attached to the process.
    bool debugger_attached;
} zx_info_process_t;

typedef struct zx_info_thread {
    // One of ZX_THREAD_STATE_* values.
    uint32_t state;

    // If nonzero, the thread has gotten an exception and is waiting for
    // the exception to be handled by the specified port.
    // The value is one of ZX_EXCEPTION_PORT_TYPE_*.
    // Note: If the thread is waiting for an exception response then |state|
    // will have the value ZX_THREAD_STATE_BLOCKED.
    uint32_t wait_exception_port_type;
} zx_info_thread_t;

typedef struct zx_info_thread_stats {
    // Total accumulated running time of the thread.
    zx_time_t total_runtime;
} zx_info_thread_stats_t;

// Statistics about resources (e.g., memory) used by a task. Can be relatively
// expensive to gather.
typedef struct zx_info_task_stats {
    // The total size of mapped memory ranges in the task.
    // Not all will be backed by physical memory.
    size_t mem_mapped_bytes;

    // For the fields below, a byte is considered committed if it's backed by
    // physical memory. Some of the memory may be double-mapped, and thus
    // double-counted.

    // Committed memory that is only mapped into this task.
    size_t mem_private_bytes;

    // Committed memory that is mapped into this and at least one other task.
    size_t mem_shared_bytes;

    // A number that estimates the fraction of mem_shared_bytes that this
    // task is responsible for keeping alive.
    //
    // An estimate of:
    //   For each shared, committed byte:
    //   mem_scaled_shared_bytes += 1 / (number of tasks mapping this byte)
    //
    // This number is strictly smaller than mem_shared_bytes.
    size_t mem_scaled_shared_bytes;
} zx_info_task_stats_t;

typedef struct zx_info_vmar {
    // Base address of the region.
    uintptr_t base;

    // Length of the region, in bytes.
    size_t len;
} zx_info_vmar_t;


// Types and values used by ZX_INFO_PROCESS_MAPS.

// Describes a VM mapping.
typedef struct zx_info_maps_mapping {
    // MMU flags for the mapping.
    // Bitwise OR of ZX_VM_FLAG_PERM_{READ,WRITE,EXECUTE} values.
    uint32_t mmu_flags;
    // koid of the mapped VMO.
    zx_koid_t vmo_koid;
    // The number of PAGE_SIZE pages in the mapped region of the VMO
    // that are backed by physical memory.
    size_t committed_pages;
} zx_info_maps_mapping_t;

// Types of entries represented by zx_info_maps_t.
// Can't use zx_obj_type_t because not all of these are
// user-visible kernel object types.
typedef enum zx_info_maps_type {
    ZX_INFO_MAPS_TYPE_NONE    = 0,
    ZX_INFO_MAPS_TYPE_ASPACE  = 1,
    ZX_INFO_MAPS_TYPE_VMAR    = 2,
    ZX_INFO_MAPS_TYPE_MAPPING = 3,
    ZX_INFO_MAPS_TYPE_LAST
} zx_info_maps_type_t;

// Describes a node in the aspace/vmar/mapping hierarchy for a user process.
typedef struct zx_info_maps {
    // Name if available; empty string otherwise.
    char name[ZX_MAX_NAME_LEN];
    // Base address.
    zx_vaddr_t base;
    // Size in bytes.
    size_t size;

    // The depth of this node in the tree.
    // Can be used for indentation, or to rebuild the tree from an array
    // of zx_info_maps_t entries, which will be in depth-first pre-order.
    size_t depth;
    // The type of this entry; indicates which union entry is valid.
    uint32_t type; // zx_info_maps_type_t
    union {
        zx_info_maps_mapping_t mapping;
        // No additional fields for other types.
    } u;
} zx_info_maps_t;


// Values and types used by ZX_INFO_PROCESS_VMOS.

// The VMO is backed by RAM, consuming memory.
// Mutually exclusive with ZX_INFO_VMO_TYPE_PHYSICAL.
// See ZX_INFO_VMO_TYPE(flags)
#define ZX_INFO_VMO_TYPE_PAGED              (1u<<0)

// The VMO points to a physical address range, and does not consume memory.
// Typically used to access memory-mapped hardware.
// Mutually exclusive with ZX_INFO_VMO_TYPE_PAGED.
// See ZX_INFO_VMO_TYPE(flags)
#define ZX_INFO_VMO_TYPE_PHYSICAL           (0u<<0)

// Returns a VMO's type based on its flags, allowing for checks like
// if (ZX_INFO_VMO_TYPE(f) == ZX_INFO_VMO_TYPE_PAGED)
#define ZX_INFO_VMO_TYPE(flags)             ((flags) & (1u<<0))

// The VMO is a clone, and is a copy-on-write clone.
#define ZX_INFO_VMO_IS_COW_CLONE            (1u<<2)

// When reading a list of VMOs pointed to by a process, indicates that the
// process has a handle to the VMO, which isn't necessarily mapped.
#define ZX_INFO_VMO_VIA_HANDLE              (1u<<3)

// When reading a list of VMOs pointed to by a process, indicates that the
// process maps the VMO into a VMAR, but doesn't necessarily have a handle to
// the VMO.
#define ZX_INFO_VMO_VIA_MAPPING             (1u<<4)

// Describes a VMO. For mapping information, see |zx_info_maps_t|.
typedef struct zx_info_vmo {
    // The koid of this VMO.
    zx_koid_t koid;

    // The name of this VMO.
    char name[ZX_MAX_NAME_LEN];

    // The size of this VMO; i.e., the amount of virtual address space it
    // would consume if mapped.
    uint64_t size_bytes;

    // If this VMO is a clone, the koid of its parent. Otherwise, zero.
    // See |flags| for the type of clone.
    zx_koid_t parent_koid;

    // The number of clones of this VMO, if any.
    size_t num_children;

    // The number of times this VMO is currently mapped into VMARs.
    // Note that the same process will often map the same VMO twice,
    // and both mappings will be counted here. (I.e., this is not a count
    // of the number of processes that map this VMO; see share_count.)
    size_t num_mappings;

    // An estimate of the number of unique address spaces that
    // this VMO is mapped into. Every process has its own address space,
    // and so does the kernel.
    size_t share_count;

    // Bitwise OR of ZX_INFO_VMO_* values.
    uint32_t flags;

    // If |ZX_INFO_VMO_TYPE(flags) == ZX_INFO_VMO_TYPE_PAGED|, the amount of
    // memory currently allocated to this VMO; i.e., the amount of physical
    // memory it consumes. Undefined otherwise.
    uint64_t committed_bytes;

    // If |flags & ZX_INFO_VMO_VIA_HANDLE|, the handle rights.
    // Undefined otherwise.
    zx_rights_t handle_rights;
} zx_info_vmo_t;

// kernel statistics per cpu
typedef struct zx_info_cpu_stats {
    uint32_t cpu_number;
    uint32_t flags;

    zx_time_t idle_time;

    // kernel scheduler counters
    uint64_t reschedules;
    uint64_t context_switches;
    uint64_t irq_preempts;
    uint64_t preempts;
    uint64_t yields;

    // cpu level interrupts and exceptions
    uint64_t ints;          // hardware interrupts, minus timer interrupts or inter-processor interrupts
    uint64_t timer_ints;    // timer interrupts
    uint64_t timers;        // timer callbacks
    uint64_t page_faults;   // page faults
    uint64_t exceptions;    // exceptions such as undefined opcode
    uint64_t syscalls;

    // inter-processor interrupts
    uint64_t reschedule_ipis;
    uint64_t generic_ipis;
} zx_info_cpu_stats_t;

// Information about kernel memory usage.
// Can be expensive to gather.
typedef struct zx_info_kmem_stats {
    // The total amount of physical memory available to the system.
    uint64_t total_bytes;

    // The amount of unallocated memory.
    uint64_t free_bytes;

    // The amount of memory reserved by and mapped into the kernel for reasons
    // not covered by other fields in this struct. Typically for readonly data
    // like the ram disk and kernel image, and for early-boot dynamic memory.
    uint64_t wired_bytes;

    // The amount of memory allocated to the kernel heap.
    uint64_t total_heap_bytes;

    // The portion of |total_heap_bytes| that is not in use.
    uint64_t free_heap_bytes;

    // The amount of memory committed to VMOs, both kernel and user.
    // A superset of all userspace memory.
    // Does not include certain VMOs that fall under |wired_bytes|.
    //
    // TODO(dbort): Break this into at least two pieces: userspace VMOs that
    // have koids, and kernel VMOs that don't. Or maybe look at VMOs
    // mapped into the kernel aspace vs. everything else.
    uint64_t vmo_bytes;

    // The amount of memory used for architecture-specific MMU metadata
    // like page tables.
    uint64_t mmu_overhead_bytes;

    // Non-free memory that isn't accounted for in any other field.
    uint64_t other_bytes;
} zx_info_kmem_stats_t;

typedef struct zx_info_resource {
    // The resource kind, one of:
    // {ZX_RSRC_KIND_ROOT, ZX_RSRC_KIND_MMIO, ZX_RSRC_KIND_IOPORT, ZX_RSRC_KIND_IRQ}
    uint32_t kind;
    // Resource's low value (inclusive)
    uint64_t low;
    // Resource's high value (inclusive)
    uint64_t high;
} zx_info_resource_t;

#define ZX_INFO_CPU_STATS_FLAG_ONLINE       (1u<<0)

// Object properties.

// Argument is a uint32_t.
#define ZX_PROP_NUM_STATE_KINDS             2u
// Argument is a char[ZX_MAX_NAME_LEN].
#define ZX_PROP_NAME                        3u

#if __x86_64__
// Argument is a uintptr_t.
#define ZX_PROP_REGISTER_FS                 4u
#endif

// Argument is the value of ld.so's _dl_debug_addr, a uintptr_t.
#define ZX_PROP_PROCESS_DEBUG_ADDR          5u

// Argument is the base address of the vDSO mapping (or zero), a uintptr_t.
#define ZX_PROP_PROCESS_VDSO_BASE_ADDRESS   6u

// Argument is an zx_job_importance_t value.
#define ZX_PROP_JOB_IMPORTANCE             7u

// Describes how important a job is.
typedef int32_t zx_job_importance_t;

// Valid zx_job_importance_t values and range.
// The non-negative values must fit in 8 bits.

// A job with this importance will inherit its actual importance from
// the closest ancestor with a non-INHERITED importance property value.
#define ZX_JOB_IMPORTANCE_INHERITED ((zx_job_importance_t)-1)

// The lowest importance. Jobs with this importance value are likely to be
// killed first in an out-of-memory situation.
#define ZX_JOB_IMPORTANCE_MIN       ((zx_job_importance_t)0)

// The highest importance.
#define ZX_JOB_IMPORTANCE_MAX       ((zx_job_importance_t)255)

// Values for zx_info_thread_t.state.
#define ZX_THREAD_STATE_NEW                 0u
#define ZX_THREAD_STATE_RUNNING             1u
#define ZX_THREAD_STATE_SUSPENDED           2u
#define ZX_THREAD_STATE_BLOCKED             3u
#define ZX_THREAD_STATE_DYING               4u
#define ZX_THREAD_STATE_DEAD                5u

__END_CDECLS
