Zephyr Project API
3.5.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
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
>
15
#include <
zephyr/sys/arch_interface.h
>
16
#include <
zephyr/sys/math_extras.h
>
17
#include <
stdbool.h
>
18
#include <
zephyr/logging/log.h
>
19
20
extern
const
_k_syscall_handler_t _k_syscall_table[K_SYSCALL_LIMIT];
21
22
enum
_obj_init_check {
23
_OBJ_INIT_TRUE = 0,
24
_OBJ_INIT_FALSE = -1,
25
_OBJ_INIT_ANY = 1
26
};
27
49
static
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
81
int
z_object_validate(
struct
z_object *ko,
enum
k_objects
otype,
82
enum
_obj_init_check init);
83
92
extern
void
z_dump_object_error(
int
retval,
const
void
*obj,
93
struct
z_object *ko,
enum
k_objects
otype);
94
105
extern
struct
z_object *z_object_find(
const
void
*obj);
106
107
typedef
void (*_wordlist_cb_func_t)(
struct
z_object *ko,
void
*context);
108
115
extern
void
z_object_wordlist_foreach(_wordlist_cb_func_t
func
,
void
*context);
116
123
extern
void
z_thread_perms_inherit(
struct
k_thread
*parent,
124
struct
k_thread
*child);
125
132
extern
void
z_thread_perms_set(
struct
z_object *ko,
struct
k_thread
*
thread
);
133
140
extern
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
*/
150
extern
void
z_thread_perms_all_clear(
struct
k_thread
*
thread
);
151
160
void
z_object_uninit(
const
void
*obj);
161
179
void
z_object_recycle(
const
void
*obj);
180
204
static
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
225
extern
void
*z_user_alloc_from_copy(
const
void
*src,
size_t
size);
226
240
extern
int
z_user_from_copy(
void
*dst,
const
void
*src,
size_t
size);
241
255
extern
int
z_user_to_copy(
void
*dst,
const
void
*src,
size_t
size);
256
271
extern
char
*z_user_string_alloc_copy(
const
char
*src,
size_t
maxlen);
272
289
extern
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
430
static
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_ */
arch_interface.h
thread
static struct k_thread thread[2]
Definition
atomic.c:26
arch_user_string_nlen
size_t arch_user_string_nlen(const char *s, size_t maxsize, int *err)
Safely take the length of a potentially bad string.
k_is_in_isr
bool k_is_in_isr(void)
Determine if code is running at interrupt level.
kernel.h
Public kernel APIs.
k_objects
k_objects
Kernel Object Types.
Definition
kobject.h:29
log.h
math_extras.h
ret
static ZTEST_BMEM int ret
Definition
main.c:16
stdbool.h
k_thread
Thread Structure.
Definition
thread.h:250
func
static void func(void *arg1, void *arg2, void *arg3)
Definition
main.c:22
include
zephyr
syscall_handler.h
Generated on Tue Mar 5 2024 08:42:07 for Zephyr Project API by
1.9.8