random: Add syscalls for random subsystem

Create syscalls to make possible using random APIs from user mode
threads. These APIs can have different implementations, like using
entropy driver or Xoroshiro128. Some of these implementations also
have some globals to preserve state between calls.

Make it run entire in user space would require user adding these
globals to their memeory domains and/or grant access to entropy device.
Syscalls simplify its usage.

Signed-off-by: Flavio Ceolin <flavio.ceolin@intel.com>
This commit is contained in:
Flavio Ceolin 2020-06-12 13:19:18 -07:00 committed by Anas Nashif
parent 02b7f9d8b9
commit 4210259e81
7 changed files with 26 additions and 5 deletions

View File

@ -20,16 +20,18 @@
#ifndef ZEPHYR_INCLUDE_RANDOM_RAND32_H_
#define ZEPHYR_INCLUDE_RANDOM_RAND32_H_
#include <kernel.h>
#include <zephyr/types.h>
#ifdef __cplusplus
extern "C" {
#endif
extern u32_t sys_rand32_get(void);
__syscall u32_t sys_rand32_get(void);
#ifdef __cplusplus
}
#endif
#include <syscalls/rand32.h>
#endif /* ZEPHYR_INCLUDE_RANDOM_RAND32_H_ */

View File

@ -4,3 +4,9 @@ zephyr_sources_ifdef(CONFIG_TIMER_RANDOM_GENERATOR rand32_timer.c)
zephyr_sources_ifdef(CONFIG_X86_TSC_RANDOM_GENERATOR rand32_timestamp.c)
zephyr_sources_ifdef(CONFIG_ENTROPY_DEVICE_RANDOM_GENERATOR rand32_entropy_device.c)
zephyr_sources_ifdef(CONFIG_XOROSHIRO_RANDOM_GENERATOR rand32_xoroshiro128.c)
# userspace
if (CONFIG_TIMER_RANDOM_GENERATOR OR CONFIG_X86_TSC_RANDOM_GENERATOR OR
CONFIG_ENTROPY_DEVICE_RANDOM_GENERATOR OR CONFIG_XOROSHIRO_RANDOM_GENERATOR)
zephyr_sources_ifdef(CONFIG_USERSPACE rand32_handlers.c)
endif()

View File

@ -10,7 +10,7 @@
static atomic_t entropy_driver;
u32_t sys_rand32_get(void)
u32_t z_impl_sys_rand32_get(void)
{
struct device *dev = (struct device *)atomic_get(&entropy_driver);
u32_t random_num;

View File

@ -0,0 +1,13 @@
/*
* Copyright (c) 2020 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <random/rand32.h>
#include <syscall_handler.h>
Z_SYSCALL_HANDLER(sys_rand32_get)
{
return z_impl_sys_rand32_get();
}

View File

@ -40,7 +40,7 @@ static atomic_val_t _rand32_counter;
* @return a 32-bit number
*/
u32_t sys_rand32_get(void)
u32_t z_impl_sys_rand32_get(void)
{
return k_cycle_get_32() + atomic_add(&_rand32_counter, _RAND32_INC);
}

View File

@ -29,7 +29,7 @@
* @return a 32-bit number
*/
u32_t sys_rand32_get(void)
u32_t z_impl_sys_rand32_get(void)
{
return z_do_read_cpu_timestamp32();
}

View File

@ -90,7 +90,7 @@ static u32_t xoroshiro128_next(void)
return (u32_t)result;
}
u32_t sys_rand32_get(void)
u32_t z_impl_sys_rand32_get(void)
{
u32_t ret;