8#ifndef ZEPHYR_INCLUDE_SYSCALL_HANDLER_H_
9#define ZEPHYR_INCLUDE_SYSCALL_HANDLER_H_
11#ifdef CONFIG_USERSPACE
20extern const _k_syscall_handler_t _k_syscall_table[K_SYSCALL_LIMIT];
49static inline bool z_is_in_user_syscall(
void)
57 return !
k_is_in_isr() && _current->syscall_frame != NULL;
81int z_object_validate(
struct z_object *ko,
enum k_objects otype,
82 enum _obj_init_check init);
92extern void z_dump_object_error(
int retval,
const void *obj,
93 struct z_object *ko,
enum k_objects otype);
105extern struct z_object *z_object_find(
const void *obj);
107typedef void (*_wordlist_cb_func_t)(
struct z_object *ko,
void *context);
115extern void z_object_wordlist_foreach(_wordlist_cb_func_t func,
void *context);
123extern void z_thread_perms_inherit(
struct k_thread *parent,
132extern void z_thread_perms_set(
struct z_object *ko,
struct k_thread *thread);
140extern void z_thread_perms_clear(
struct z_object *ko,
struct k_thread *thread);
150extern void z_thread_perms_all_clear(
struct k_thread *thread);
160void z_object_uninit(
const void *obj);
179void z_object_recycle(
const void *obj);
204static inline size_t z_user_string_nlen(
const char *src,
size_t maxlen,
225extern void *z_user_alloc_from_copy(
const void *src,
size_t size);
240extern int z_user_from_copy(
void *dst,
const void *src,
size_t size);
255extern int z_user_to_copy(
void *dst,
const void *src,
size_t size);
271extern char *z_user_string_alloc_copy(
const char *src,
size_t maxlen);
289extern int z_user_string_copy(
char *dst,
const char *src,
size_t maxlen);
291#define Z_OOPS(expr) \
294 arch_syscall_oops(_current->syscall_frame); \
311#define Z_SYSCALL_VERIFY_MSG(expr, fmt, ...) ({ \
312 bool expr_copy = !(expr); \
314 TOOLCHAIN_IGNORE_WSHADOW_BEGIN \
315 LOG_MODULE_DECLARE(os, CONFIG_KERNEL_LOG_LEVEL); \
316 TOOLCHAIN_IGNORE_WSHADOW_END \
317 LOG_ERR("syscall %s failed check: " fmt, \
318 __func__, ##__VA_ARGS__); \
332#define Z_SYSCALL_VERIFY(expr) Z_SYSCALL_VERIFY_MSG(expr, #expr)
350#define Z_SYSCALL_MEMORY(ptr, size, write) \
351 Z_SYSCALL_VERIFY_MSG(arch_buffer_validate((void *)ptr, size, write) \
353 "Memory region %p (size %zu) %s access denied", \
354 (void *)(ptr), (size_t)(size), \
355 write ? "write" : "read")
370#define Z_SYSCALL_MEMORY_READ(ptr, size) \
371 Z_SYSCALL_MEMORY(ptr, size, 0)
386#define Z_SYSCALL_MEMORY_WRITE(ptr, size) \
387 Z_SYSCALL_MEMORY(ptr, size, 1)
389#define Z_SYSCALL_MEMORY_ARRAY(ptr, nmemb, size, write) \
392 Z_SYSCALL_VERIFY_MSG(!size_mul_overflow((size_t)(nmemb), \
395 "%zux%zu array is too large", \
396 (size_t)(nmemb), (size_t)(size)) || \
397 Z_SYSCALL_MEMORY(ptr, product, write); \
412#define Z_SYSCALL_MEMORY_ARRAY_READ(ptr, nmemb, size) \
413 Z_SYSCALL_MEMORY_ARRAY(ptr, nmemb, size, 0)
427#define Z_SYSCALL_MEMORY_ARRAY_WRITE(ptr, nmemb, size) \
428 Z_SYSCALL_MEMORY_ARRAY(ptr, nmemb, size, 1)
430static inline int z_obj_validation_check(
struct z_object *ko,
433 enum _obj_init_check init)
437 ret = z_object_validate(ko, otype, init);
441 z_dump_object_error(ret, obj, ko, otype);
450#define Z_SYSCALL_IS_OBJ(ptr, type, init) \
451 Z_SYSCALL_VERIFY_MSG(z_obj_validation_check( \
452 z_object_find((const void *)ptr), \
454 type, init) == 0, "access denied")
466#define Z_SYSCALL_DRIVER_OP(ptr, api_name, op) \
468 struct api_name *__device__ = (struct api_name *) \
469 ((const struct device *)ptr)->api; \
470 Z_SYSCALL_VERIFY_MSG(__device__->op != NULL, \
471 "Operation %s not defined for driver " \
494#define Z_SYSCALL_SPECIFIC_DRIVER(_device, _dtype, _api) \
496 const struct device *_dev = (const struct device *)_device; \
497 Z_SYSCALL_OBJ(_dev, _dtype) || \
498 Z_SYSCALL_VERIFY_MSG(_dev->api == _api, \
499 "API structure mismatch"); \
513#define Z_SYSCALL_OBJ(ptr, type) \
514 Z_SYSCALL_IS_OBJ(ptr, type, _OBJ_INIT_TRUE)
527#define Z_SYSCALL_OBJ_INIT(ptr, type) \
528 Z_SYSCALL_IS_OBJ(ptr, type, _OBJ_INIT_ANY)
543#define Z_SYSCALL_OBJ_NEVER_INIT(ptr, type) \
544 Z_SYSCALL_IS_OBJ(ptr, type, _OBJ_INIT_FALSE)
546#include <driver-validation.h>
size_t arch_user_string_nlen(const char *s, size_t maxsize, int *err)
Safely take the length of a potentially bad string.
bool k_is_in_isr(void)
Determine if code is running at interrupt level.
k_objects
Kernel Object Types.
Definition: kobject.h:29
Thread Structure.
Definition: thread.h:250