libmango: add userspace syscall call-gates

This commit is contained in:
2026-02-19 19:22:06 +00:00
parent 1d4fd4f586
commit 9a90662eaa
9 changed files with 319 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
#ifndef MANGO_CONFIG_H_
#define MANGO_CONFIG_H_
#include <mango/status.h>
#include <mango/types.h>
#include <stddef.h>
extern kern_status_t kern_config_get(
kern_config_key_t key,
void *ptr,
size_t len);
extern kern_status_t kern_config_set(
kern_config_key_t key,
const void *ptr,
size_t len);
#endif

View File

@@ -0,0 +1,9 @@
#ifndef MANGO_HANDLE_H_
#define MANGO_HANDLE_H_
#include <mango/status.h>
#include <mango/types.h>
extern kern_status_t kern_handle_close(kern_handle_t handle);
#endif

View File

@@ -0,0 +1,21 @@
#ifndef MANGO_LOG_H_
#define MANGO_LOG_H_
#include <mango/status.h>
extern kern_status_t kern_log(const char *s);
#ifdef TRACE
#define kern_trace(...) kern_log(__VA_ARGS__)
#define kern_tracef(...) \
do { \
char s[128]; \
snprintf(s, sizeof s, __VA_ARGS__); \
kern_log(s); \
} while (0)
#else
#define kern_trace(...)
#define kern_tracef(...)
#endif
#endif

View File

@@ -0,0 +1,62 @@
#ifndef MANGO_MSG_H_
#define MANGO_MSG_H_
#include <mango/status.h>
#include <mango/types.h>
extern kern_status_t channel_create(
unsigned int id,
channel_flags_t flags,
kern_handle_t *out);
extern kern_status_t port_create(kern_handle_t *out);
extern kern_status_t port_connect(
kern_handle_t port,
tid_t task_id,
unsigned int channel_id);
extern kern_status_t port_disconnect(kern_handle_t port);
extern kern_status_t msg_send(
kern_handle_t port,
msg_flags_t flags,
const struct msg *req,
struct msg *resp);
extern kern_status_t msg_recv(
kern_handle_t channel,
msg_flags_t flags,
msgid_t *out_id,
struct msg *out_msg);
extern kern_status_t msg_reply(
kern_handle_t channel,
msg_flags_t flags,
msgid_t id,
const struct msg *reply);
extern kern_status_t msg_read(
kern_handle_t channel,
msgid_t id,
size_t offset,
struct iovec *out,
size_t nr_out);
extern kern_status_t msg_read_handles(
kern_handle_t channel,
msgid_t id,
size_t offset,
struct handle_list *out,
size_t nr_out);
extern kern_status_t msg_write(
kern_handle_t channel,
msgid_t id,
size_t offset,
const struct iovec *in,
size_t nr_in);
extern kern_status_t msg_write_handles(
kern_handle_t channel,
msgid_t id,
size_t offset,
const struct handle_list *in,
size_t nr_in);
#endif

View File

@@ -0,0 +1,25 @@
#ifndef MANGO_TASK_H_
#define MANGO_TASK_H_
#include <mango/status.h>
#include <mango/types.h>
extern kern_status_t task_exit(int status);
extern kern_status_t task_create(
kern_handle_t parent,
const char *name,
size_t name_len,
kern_handle_t *out_task,
kern_handle_t *out_address_space);
extern kern_status_t task_create_thread(
kern_handle_t task,
virt_addr_t ip,
virt_addr_t sp,
uintptr_t *args,
size_t nr_args,
kern_handle_t *out_thread);
extern kern_status_t thread_start(kern_handle_t thread);
#endif

View File

@@ -0,0 +1,79 @@
#ifndef MANGO_VM_H_
#define MANGO_VM_H_
#include <mango/status.h>
#include <mango/types.h>
extern kern_status_t vm_object_create(
const char *name,
size_t name_len,
size_t data_len,
vm_prot_t prot,
kern_handle_t *out);
extern kern_status_t vm_object_read(
kern_handle_t object,
void *dst,
off_t offset,
size_t count,
size_t *nr_read);
extern kern_status_t vm_object_write(
kern_handle_t object,
const void *src,
off_t offset,
size_t count,
size_t *nr_written);
extern kern_status_t vm_object_copy(
kern_handle_t dst,
off_t dst_offset,
kern_handle_t src,
off_t src_offset,
size_t count,
size_t *nr_copied);
extern kern_status_t vm_region_create(
kern_handle_t parent,
const char *name,
size_t name_len,
off_t offset,
size_t region_len,
vm_prot_t prot,
kern_handle_t *out,
virt_addr_t *out_base_address);
extern kern_status_t vm_region_read(
kern_handle_t region,
void *dst,
off_t offset,
size_t count,
size_t *nr_read);
extern kern_status_t vm_region_write(
kern_handle_t region,
const void *src,
off_t offset,
size_t count,
size_t *nr_read);
extern kern_status_t vm_region_map_absolute(
kern_handle_t region,
virt_addr_t map_address,
kern_handle_t object,
off_t object_offset,
size_t length,
vm_prot_t prot,
virt_addr_t *out_base_address);
extern kern_status_t vm_region_map_relative(
kern_handle_t region,
off_t region_offset,
kern_handle_t object,
off_t object_offset,
size_t length,
vm_prot_t prot,
virt_addr_t *out_base_address);
extern kern_status_t vm_region_unmap_absolute(
kern_handle_t region,
virt_addr_t address,
size_t length);
extern kern_status_t vm_region_unmap_relative(
kern_handle_t region,
off_t offset,
size_t length);
#endif