Zephyr API Documentation  3.5.0
A Scalable Open Source RTOS
3.5.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
syscall_handler.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017, Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7
8#ifndef ZEPHYR_INCLUDE_SYSCALL_HANDLER_H_
9#define ZEPHYR_INCLUDE_SYSCALL_HANDLER_H_
10
11#ifdef CONFIG_USERSPACE
12
13#ifndef _ASMLANGUAGE
14#include <zephyr/kernel.h>
17#include <stdbool.h>
18#include <zephyr/logging/log.h>
19
20extern const _k_syscall_handler_t _k_syscall_table[K_SYSCALL_LIMIT];
21
22enum _obj_init_check {
23 _OBJ_INIT_TRUE = 0,
24 _OBJ_INIT_FALSE = -1,
25 _OBJ_INIT_ANY = 1
26};
27
49static inline bool z_is_in_user_syscall(void)
50{
51 /* This gets set on entry to the syscall's generasted z_mrsh
52 * function and then cleared on exit. This code path is only
53 * encountered when a syscall is made from user mode, system
54 * calls from supervisor mode bypass everything directly to
55 * the implementation function.
56 */
57 return !k_is_in_isr() && _current->syscall_frame != NULL;
58}
59
81int z_object_validate(struct z_object *ko, enum k_objects otype,
82 enum _obj_init_check init);
83
92extern void z_dump_object_error(int retval, const void *obj,
93 struct z_object *ko, enum k_objects otype);
94
105extern struct z_object *z_object_find(const void *obj);
106
107typedef void (*_wordlist_cb_func_t)(struct z_object *ko, void *context);
108
115extern void z_object_wordlist_foreach(_wordlist_cb_func_t func, void *context);
116
123extern void z_thread_perms_inherit(struct k_thread *parent,
124 struct k_thread *child);
125
132extern void z_thread_perms_set(struct z_object *ko, struct k_thread *thread);
133
140extern void z_thread_perms_clear(struct z_object *ko, struct k_thread *thread);
141
142/*
143 * Revoke access to all objects for the provided thread
144 *
145 * NOTE: Unlike z_thread_perms_clear(), this function will not clear
146 * permissions on public objects.
147 *
148 * @param thread Thread object to revoke access
149 */
150extern void z_thread_perms_all_clear(struct k_thread *thread);
151
160void z_object_uninit(const void *obj);
161
179void z_object_recycle(const void *obj);
180
204static inline size_t z_user_string_nlen(const char *src, size_t maxlen,
205 int *err)
206{
207 return arch_user_string_nlen(src, maxlen, err);
208}
209
225extern void *z_user_alloc_from_copy(const void *src, size_t size);
226
240extern int z_user_from_copy(void *dst, const void *src, size_t size);
241
255extern int z_user_to_copy(void *dst, const void *src, size_t size);
256
271extern char *z_user_string_alloc_copy(const char *src, size_t maxlen);
272
289extern int z_user_string_copy(char *dst, const char *src, size_t maxlen);
290
291#define Z_OOPS(expr) \
292 do { \
293 if (expr) { \
294 arch_syscall_oops(_current->syscall_frame); \
295 } \
296 } while (false)
297
311#define Z_SYSCALL_VERIFY_MSG(expr, fmt, ...) ({ \
312 bool expr_copy = !(expr); \
313 if (expr_copy) { \
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__); \
319 } \
320 expr_copy; })
321
332#define Z_SYSCALL_VERIFY(expr) Z_SYSCALL_VERIFY_MSG(expr, #expr)
333
350#define Z_SYSCALL_MEMORY(ptr, size, write) \
351 Z_SYSCALL_VERIFY_MSG(arch_buffer_validate((void *)ptr, size, write) \
352 == 0, \
353 "Memory region %p (size %zu) %s access denied", \
354 (void *)(ptr), (size_t)(size), \
355 write ? "write" : "read")
356
370#define Z_SYSCALL_MEMORY_READ(ptr, size) \
371 Z_SYSCALL_MEMORY(ptr, size, 0)
372
386#define Z_SYSCALL_MEMORY_WRITE(ptr, size) \
387 Z_SYSCALL_MEMORY(ptr, size, 1)
388
389#define Z_SYSCALL_MEMORY_ARRAY(ptr, nmemb, size, write) \
390 ({ \
391 size_t product; \
392 Z_SYSCALL_VERIFY_MSG(!size_mul_overflow((size_t)(nmemb), \
393 (size_t)(size), \
394 &product), \
395 "%zux%zu array is too large", \
396 (size_t)(nmemb), (size_t)(size)) || \
397 Z_SYSCALL_MEMORY(ptr, product, write); \
398 })
399
412#define Z_SYSCALL_MEMORY_ARRAY_READ(ptr, nmemb, size) \
413 Z_SYSCALL_MEMORY_ARRAY(ptr, nmemb, size, 0)
414
427#define Z_SYSCALL_MEMORY_ARRAY_WRITE(ptr, nmemb, size) \
428 Z_SYSCALL_MEMORY_ARRAY(ptr, nmemb, size, 1)
429
430static inline int z_obj_validation_check(struct z_object *ko,
431 const void *obj,
432 enum k_objects otype,
433 enum _obj_init_check init)
434{
435 int ret;
436
437 ret = z_object_validate(ko, otype, init);
438
439#ifdef CONFIG_LOG
440 if (ret != 0) {
441 z_dump_object_error(ret, obj, ko, otype);
442 }
443#else
444 ARG_UNUSED(obj);
445#endif
446
447 return ret;
448}
449
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), \
453 (const void *)ptr, \
454 type, init) == 0, "access denied")
455
466#define Z_SYSCALL_DRIVER_OP(ptr, api_name, op) \
467 ({ \
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 " \
472 "instance %p", \
473 # op, __device__); \
474 })
475
494#define Z_SYSCALL_SPECIFIC_DRIVER(_device, _dtype, _api) \
495 ({ \
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"); \
500 })
501
513#define Z_SYSCALL_OBJ(ptr, type) \
514 Z_SYSCALL_IS_OBJ(ptr, type, _OBJ_INIT_TRUE)
515
527#define Z_SYSCALL_OBJ_INIT(ptr, type) \
528 Z_SYSCALL_IS_OBJ(ptr, type, _OBJ_INIT_ANY)
529
543#define Z_SYSCALL_OBJ_NEVER_INIT(ptr, type) \
544 Z_SYSCALL_IS_OBJ(ptr, type, _OBJ_INIT_FALSE)
545
546#include <driver-validation.h>
547
548#endif /* _ASMLANGUAGE */
549
550#endif /* CONFIG_USERSPACE */
551
552#endif /* ZEPHYR_INCLUDE_SYSCALL_HANDLER_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.
Public kernel APIs.
k_objects
Kernel Object Types.
Definition: kobject.h:29
Thread Structure.
Definition: thread.h:250