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

library fuchsia.kernel;

using zx;

// The zx library does not include zx_info_kmem_stats_t, so this table is mirroring it.
// See zircon/system/public/zircon/syscalls/object.h for more details.
table MemoryStats {
  1: uint64 total_bytes;
  2: uint64 free_bytes;
  3: uint64 wired_bytes;
  4: uint64 total_heap_bytes;
  5: uint64 free_heap_bytes;
  6: uint64 vmo_bytes;
  7: uint64 mmu_overhead_bytes;
  8: uint64 ipc_bytes;
  9: uint64 other_bytes;
};

// Similarly, this table mirrors zx_info_cpu_stats_t.
// See zircon/system/public/zircon/syscalls/object.h for more details.
table PerCpuStats {
  1: uint32 cpu_number;
  2: uint32 flags;
  3: zx.duration idle_time;
  4: uint64 reschedules;
  5: uint64 context_switches;
  6: uint64 irq_preempts;
  7: uint64 yields;
  8: uint64 ints;
  9: uint64 timer_ints;
  10: uint64 timers;
  11: uint64 page_faults;
  12: uint64 exceptions;
  13: uint64 syscalls;
  14: uint64 reschedule_ipis;
  15: uint64 generic_ipis;
};

struct CpuStats {
  // This is the total number of CPUs on the actual device. This may not be the same as the length
  // of the vector `per_cpu_stats` as it is possible the underlying syscall will not return stats
  // for all CPUs.
  uint64 actual_num_cpus;
  vector<PerCpuStats>:zx.MAX_CPUS? per_cpu_stats;
};

/// Protocol for providing kernel stats. This is roughly a wrapper around zx_object_get_info for
/// the ZX_INFO_KMEM_STATS and ZX_INFO_CPU_STATS topics, which today require the very powerful
/// 'Root Resource' capability to obtain. Instead of vending out that capability, programs that
/// just want stats should use this service instead. If for some reason the protocol fails to
/// retrieve stats, which will be an un-recoverable error, it will close the channel.
[Discoverable]
protocol Stats {
    GetMemoryStats() -> (MemoryStats stats);

    GetCpuStats() -> (CpuStats stats);
};
