import "objects/object.def"

import "objects/channel.def"
import "objects/endpoint.def"
import "objects/event.def"
import "objects/process.def"
import "objects/system.def"
import "objects/thread.def"
import "objects/vma.def"

interface syscalls [syscall] {
    uid 01d9b6a948961097

    expose ref object
    expose ref system
    expose ref event
    expose ref process
    expose ref thread
    expose ref channel
    expose ref endpoint
    expose ref vma

    # Simple no-op syscall for testing
    function noop

    # Write a message to the kernel log
    function log {
        param message string
    }

    # Get a list of handles owned by this process. If the
    # supplied list is not big enough, will set the size
    # needed in `size` and return j6_err_insufficient
    function handle_list {
        param handles ref object [list inout zero_ok] # A list of handles to be filled
    }

    # Create a clone of an existing handle, possibly with
    # some capabilities masked out.
    function handle_clone {
        param orig ref object [handle cap:clone] # The handle to clone
        param clone ref object [out]             # The new handle
        param mask uint32                        # The capability bitmask
    }

    # Testing mode only: Have the kernel finish and exit QEMU with the given exit code
    function test_finish [test] {
        param exit_code uint32
    }
}
