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

#include <stdio.h>
#include <zircon/syscalls.h>
#include <zircon/syscalls/debug.h>

int main(int argc, char** argv) {
  printf("--- syscall-check ---\n");

#define SYSCALL_STATUS(syscall, default_args)         \
  printf(#syscall ": ");                              \
  if (syscall default_args == ZX_ERR_NOT_SUPPORTED) { \
    printf("disabled\n");                             \
  } else {                                            \
    printf("enabled\n");                              \
  }

  // TODO(scottmg): Add an output backend to kazoo to emit a full list of stub
  // calls to include here.
  size_t actual;
  SYSCALL_STATUS(zx_debug_read, (ZX_HANDLE_INVALID, nullptr, 0, &actual));
  SYSCALL_STATUS(zx_debug_send_command, (ZX_HANDLE_INVALID, nullptr, 0));
  SYSCALL_STATUS(zx_debug_write, (nullptr, 0));
  SYSCALL_STATUS(zx_ktrace_control, (ZX_HANDLE_INVALID, 0, 0, nullptr));
  SYSCALL_STATUS(zx_ktrace_read, (ZX_HANDLE_INVALID, nullptr, 0, 0, &actual));
  SYSCALL_STATUS(zx_ktrace_write, (ZX_HANDLE_INVALID, 0, 0, 0));
  SYSCALL_STATUS(zx_mtrace_control, (ZX_HANDLE_INVALID, 0, 0, 0, nullptr, 0));
  SYSCALL_STATUS(zx_process_write_memory, (ZX_HANDLE_INVALID, 0, nullptr, 0, &actual));
  SYSCALL_STATUS(zx_system_mexec, (ZX_HANDLE_INVALID, ZX_HANDLE_INVALID, ZX_HANDLE_INVALID));
  SYSCALL_STATUS(zx_system_mexec_payload_get, (ZX_HANDLE_INVALID, nullptr, 0));
  SYSCALL_STATUS(zx_thread_write_state,
                 (ZX_HANDLE_INVALID, ZX_THREAD_STATE_DEBUG_REGS, nullptr, 0));
  SYSCALL_STATUS(zx_vmo_op_range,
                 (ZX_HANDLE_INVALID, ZX_VMO_OP_CACHE_INVALIDATE, 0, 0, nullptr, 0));

#undef SYSCALL_STATUS

  return 0;
}
