This file was automatically generated from api/syscalls.json.
The host APIs exposed to programs running on UVM are organized into
multiple subsystems described in this document.
Each subsystem includes a number of system calls (syscalls).
Arguments to syscalls are pushed on the stack in order.
Each syscall has fixed arity, that is, the number of input arguments is fixed,
and can output either 0 or 1 value on the stack.
The syscalls with a void return type do not output anything.
Core functionality provided by the VM that isn't related to any kind of I/O.
void memset(u8* dst, u8 value, u64 num_bytes)
Fill a block of bytes in the heap with a given value.
void memset32(u32* dst, u32 word, u64 num_words)
Fill a region of memory with 32-bit values. This is useful for some graphics operations.
void memcpy(u8* dst, const u8* src, u64 num_bytes)
Copy a block of memory in the heap from a source address to a destination address.
i32 memcmp(const u8* p_a, const u8* p_b, u64 num_bytes)
Returns: i32 result
Compare two sequences of bytes. Returns 0 if equal, -1 if the first mismatching byte has a lower value in p_a, 1 if greater.
u64 vm_heap_size()
Returns: u64 num_bytes
Report the current heap size in bytes.
u64 vm_grow_heap(u64 num_bytes)
Returns: u64 new_size
Grow the heap to a new size given in bytes. This is similar to the brk() system call on POSIX systems. Note that the heap may be resized to a size larger than requested. The heap size is guaranteed to be a multiple of 8 bytes. If the requested size is smaller than the current heap size, this is a no-op. Returns the new heap size in bytes.
void exit(i8 status)
End program execution with the specified exit status.
u64 thread_spawn(void* fptr, void* arg)
Returns: u64 tid
Spawn a new thread running the given function with the argument value arg.
u64 thread_id()
Returns: u64 tid
Get the id of the current thread.
void thread_sleep(u64 time_ms)
Make the current thread sleep for at least the given time in milliseconds.
u64 thread_join(u64 tid)
Returns: u64 val
Join on the thread with the given id. Produces the return value for the thread.
Stream I/O functionality.
void print_i64(i64 val)
Print an i64 value to standard output.
void print_f32(f32 val)
Print an f32 value to standard output.
void print_str(const char* str)
Print a string to standard output.
void print_endl()
Print a newline to standard output.
i32 putchar(i32 char)
Returns: i32 char
Write one byte to standard output. This is a blocking function. The value -1 is returned on end of file or error. Otherwise the byte written is returned.
i32 getchar()
Returns: i32 val
Read one byte from standard input. This is a blocking function. The value -1 is returned on end of file or error.
Date, time and timing related system calls.
u64 time_current_ms()
Returns: u64 timestamp
Get the UNIX time stamp in milliseconds.
Functionality related to creating windows, drawing graphics, as well as mouse and keyboard input.
u32 window_create(u32 width, u32 height, const char* title, u64 flags)
Returns: u32 window_id
Create a new window with a frame buffer to draw into. The window is initially hidden when created, and will appear as soon as the first frame of image data is drawn.
void window_draw_frame(u32 window_id, const u8* pixel_data)
Copy a frame of pixels to be displayed into the window. The frame must have the same width and height as the window. The pixel format is 32 bits per pixel in BGRA byte order, with 8 bits for each component and the B byte at the lowest address.
bool window_poll_event(void* p_event)
Returns: bool event_read
Try to read an event from the windowing system if available. The event is read into an event struct. Boolean true is returned if an event was read, false if not.
void window_wait_event(void* p_event)
Block until an window event is available.
These are the constants associated with the window subsystem:
u16 EVENT_QUIT = 0u16 EVENT_KEYDOWN = 1u16 EVENT_KEYUP = 2u16 EVENT_MOUSEDOWN = 3u16 EVENT_MOUSEUP = 4u16 EVENT_MOUSEMOVE = 5u16 EVENT_TEXTINPUT = 6u16 KEY_BACKSPACE = 8u16 KEY_TAB = 9u16 KEY_RETURN = 10u16 KEY_ESCAPE = 27u16 KEY_SPACE = 32u16 KEY_COMMA = 44u16 KEY_PERIOD = 46u16 KEY_SLASH = 47u16 KEY_NUM0 = 48u16 KEY_NUM1 = 49u16 KEY_NUM2 = 50u16 KEY_NUM3 = 51u16 KEY_NUM4 = 52u16 KEY_NUM5 = 53u16 KEY_NUM6 = 54u16 KEY_NUM7 = 55u16 KEY_NUM8 = 56u16 KEY_NUM9 = 57u16 KEY_COLON = 58u16 KEY_SEMICOLON = 59u16 KEY_EQUALS = 61u16 KEY_QUESTION = 63u16 KEY_A = 65u16 KEY_B = 66u16 KEY_C = 67u16 KEY_D = 68u16 KEY_E = 69u16 KEY_F = 70u16 KEY_G = 71u16 KEY_H = 72u16 KEY_I = 73u16 KEY_J = 74u16 KEY_K = 75u16 KEY_L = 76u16 KEY_M = 77u16 KEY_N = 78u16 KEY_O = 79u16 KEY_P = 80u16 KEY_Q = 81u16 KEY_R = 82u16 KEY_S = 83u16 KEY_T = 84u16 KEY_U = 85u16 KEY_V = 86u16 KEY_W = 87u16 KEY_X = 88u16 KEY_Y = 89u16 KEY_Z = 90u16 KEY_LEFT = 16001u16 KEY_RIGHT = 16002u16 KEY_UP = 16003u16 KEY_DOWN = 16004u16 KEY_SHIFT = 16005
Audio input and output.
u32 audio_open_output(u32 sample_rate, u16 num_channels, u16 format, void* callback)
Returns: u32 device_id
Open an audio output device, then spawn a new thread which will regularly call the specified callback function to generate audio samples.
u32 audio_open_input(u32 sample_rate, u16 num_channels, u16 format, void* callback)
Returns: u32 device_id
Open an audio input device, then spawn a new thread which will regularly call the specified callback function to process audio samples.
void audio_read_samples(i16* dst_buf, u32 num_samples)
Read available input samples. Must be called from the audio input thread.
These are the constants associated with the audio subsystem:
u16 AUDIO_FORMAT_I16 = 0
Network-related functionality.
u64 net_listen(const char* listen_addr, void* on_new_conn)
Returns: u64 socket_id
Open a listening TCP socket to accept incoming connections. A callback function is called when a new connection request is received.
u64 net_accept(u64 socket_id, char* client_addr_buf, u64 addr_buf_len, void* on_incoming_data)
Returns: u64 socket_id
Accept an incoming connection and creates a new socket. A callback function is called when incoming data is received on the new socket.
u64 net_read(u64 socket_id, u8* buf_ptr, u64 buf_len)
Returns: u64 num_bytes
Read data from a socket into a buffer with specified capacity. Data can only be read if available.
u64 net_write(u64 socket_id, const u8* buf_ptr, u64 buf_len)
Returns: u64 num_bytes
Write data to an open socket. This function will attempt to write the entire buffer and may block if the output buffer is full.
void net_close(u64 socket_id)
Close an open socket.
File I/O and filesystem-related functionality. This subsystem is separated out from the general-purpose io subsystem for security reasons.