Andrew Boie | 743e468 | 2017-10-04 12:25:50 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2017 Intel Corporation |
| 3 | * |
| 4 | * SPDX-License-Identifier: Apache-2.0 |
| 5 | */ |
| 6 | |
| 7 | #include <kernel.h> |
| 8 | #include <syscall_handler.h> |
Andrew Boie | e9cfc54 | 2018-04-13 13:15:28 -0700 | [diff] [blame] | 9 | #include <kernel_structs.h> |
Andrew Boie | 743e468 | 2017-10-04 12:25:50 -0700 | [diff] [blame] | 10 | |
Andrew Boie | 7e3d3d7 | 2017-10-10 09:31:32 -0700 | [diff] [blame] | 11 | static struct _k_object *validate_any_object(void *obj) |
| 12 | { |
| 13 | struct _k_object *ko; |
| 14 | int ret; |
| 15 | |
Patrik Flykt | 4344e27 | 2019-03-08 14:19:05 -0700 | [diff] [blame] | 16 | ko = z_object_find(obj); |
Andrew Boie | 7e3d3d7 | 2017-10-10 09:31:32 -0700 | [diff] [blame] | 17 | |
| 18 | /* This can be any kernel object and it doesn't have to be |
| 19 | * initialized |
| 20 | */ |
Patrik Flykt | 4344e27 | 2019-03-08 14:19:05 -0700 | [diff] [blame] | 21 | ret = z_object_validate(ko, K_OBJ_ANY, _OBJ_INIT_ANY); |
Flavio Ceolin | 76b3518 | 2018-12-16 12:48:29 -0800 | [diff] [blame] | 22 | if (ret != 0) { |
Andrew Boie | 7e3d3d7 | 2017-10-10 09:31:32 -0700 | [diff] [blame] | 23 | #ifdef CONFIG_PRINTK |
Patrik Flykt | 4344e27 | 2019-03-08 14:19:05 -0700 | [diff] [blame] | 24 | z_dump_object_error(ret, obj, ko, K_OBJ_ANY); |
Andrew Boie | 7e3d3d7 | 2017-10-10 09:31:32 -0700 | [diff] [blame] | 25 | #endif |
| 26 | return NULL; |
| 27 | } |
| 28 | |
| 29 | return ko; |
| 30 | } |
| 31 | |
Andrew Boie | 743e468 | 2017-10-04 12:25:50 -0700 | [diff] [blame] | 32 | /* Normally these would be included in userspace.c, but the way |
| 33 | * syscall_dispatch.c declares weak handlers results in build errors if these |
| 34 | * are located in userspace.c. Just put in a separate file. |
Andrew Boie | 7e3d3d7 | 2017-10-10 09:31:32 -0700 | [diff] [blame] | 35 | * |
Patrik Flykt | 4344e27 | 2019-03-08 14:19:05 -0700 | [diff] [blame] | 36 | * To avoid double z_object_find() lookups, we don't call the implementation |
Andrew Boie | 7e3d3d7 | 2017-10-10 09:31:32 -0700 | [diff] [blame] | 37 | * function, but call a level deeper. |
Andrew Boie | 743e468 | 2017-10-04 12:25:50 -0700 | [diff] [blame] | 38 | */ |
Andrew Boie | 8345e5e | 2018-05-04 15:57:57 -0700 | [diff] [blame] | 39 | Z_SYSCALL_HANDLER(k_object_access_grant, object, thread) |
Andrew Boie | 743e468 | 2017-10-04 12:25:50 -0700 | [diff] [blame] | 40 | { |
Andrew Boie | 7e3d3d7 | 2017-10-10 09:31:32 -0700 | [diff] [blame] | 41 | struct _k_object *ko; |
Andrew Boie | 743e468 | 2017-10-04 12:25:50 -0700 | [diff] [blame] | 42 | |
Andrew Boie | 8345e5e | 2018-05-04 15:57:57 -0700 | [diff] [blame] | 43 | Z_OOPS(Z_SYSCALL_OBJ_INIT(thread, K_OBJ_THREAD)); |
Andrew Boie | 7e3d3d7 | 2017-10-10 09:31:32 -0700 | [diff] [blame] | 44 | ko = validate_any_object((void *)object); |
Flavio Ceolin | 92ea2f9 | 2018-09-20 16:14:57 -0700 | [diff] [blame] | 45 | Z_OOPS(Z_SYSCALL_VERIFY_MSG(ko != NULL, "object %p access denied", |
Andrew Boie | 8345e5e | 2018-05-04 15:57:57 -0700 | [diff] [blame] | 46 | (void *)object)); |
Patrik Flykt | 4344e27 | 2019-03-08 14:19:05 -0700 | [diff] [blame] | 47 | z_thread_perms_set(ko, (struct k_thread *)thread); |
Andrew Boie | 7e3d3d7 | 2017-10-10 09:31:32 -0700 | [diff] [blame] | 48 | |
Andrew Boie | 743e468 | 2017-10-04 12:25:50 -0700 | [diff] [blame] | 49 | return 0; |
| 50 | } |
| 51 | |
Andrew Boie | 8345e5e | 2018-05-04 15:57:57 -0700 | [diff] [blame] | 52 | Z_SYSCALL_HANDLER(k_object_release, object) |
Andrew Boie | a89bf01 | 2017-10-09 14:47:55 -0700 | [diff] [blame] | 53 | { |
| 54 | struct _k_object *ko; |
| 55 | |
Andrew Boie | a89bf01 | 2017-10-09 14:47:55 -0700 | [diff] [blame] | 56 | ko = validate_any_object((void *)object); |
Flavio Ceolin | 92ea2f9 | 2018-09-20 16:14:57 -0700 | [diff] [blame] | 57 | Z_OOPS(Z_SYSCALL_VERIFY_MSG(ko != NULL, "object %p access denied", |
Andrew Boie | 8345e5e | 2018-05-04 15:57:57 -0700 | [diff] [blame] | 58 | (void *)object)); |
Patrik Flykt | 4344e27 | 2019-03-08 14:19:05 -0700 | [diff] [blame] | 59 | z_thread_perms_clear(ko, _current); |
Andrew Boie | a89bf01 | 2017-10-09 14:47:55 -0700 | [diff] [blame] | 60 | |
| 61 | return 0; |
| 62 | } |
Andrew Boie | 97bf001 | 2018-04-24 17:01:37 -0700 | [diff] [blame] | 63 | |
Andrew Boie | 8345e5e | 2018-05-04 15:57:57 -0700 | [diff] [blame] | 64 | Z_SYSCALL_HANDLER(k_object_alloc, otype) |
Andrew Boie | 97bf001 | 2018-04-24 17:01:37 -0700 | [diff] [blame] | 65 | { |
Andrew Boie | 8345e5e | 2018-05-04 15:57:57 -0700 | [diff] [blame] | 66 | Z_OOPS(Z_SYSCALL_VERIFY_MSG(otype > K_OBJ_ANY && otype < K_OBJ_LAST && |
| 67 | otype != K_OBJ__THREAD_STACK_ELEMENT, |
| 68 | "bad object type %d requested", otype)); |
Andrew Boie | 97bf001 | 2018-04-24 17:01:37 -0700 | [diff] [blame] | 69 | |
Patrik Flykt | 4344e27 | 2019-03-08 14:19:05 -0700 | [diff] [blame] | 70 | return (u32_t)z_impl_k_object_alloc(otype); |
Andrew Boie | 97bf001 | 2018-04-24 17:01:37 -0700 | [diff] [blame] | 71 | } |