drivers/virtualization: Make ivshmem driver userspace ready

Exposing its public API to userspace.

Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This commit is contained in:
Tomasz Bursztyka 2020-12-10 11:28:20 +01:00 committed by Anas Nashif
commit 4ee5101021
4 changed files with 85 additions and 11 deletions

View file

@ -4,3 +4,5 @@ zephyr_library()
zephyr_library_sources_ifdef(CONFIG_IVSHMEM virt_ivshmem.c)
zephyr_library_sources_ifdef(CONFIG_IVSHMEM_SHELL virt_ivshmem_shell.c)
zephyr_library_sources_ifdef(CONFIG_USERSPACE virt_ivshmem_handlers.c)

View file

@ -160,7 +160,7 @@ static bool ivshmem_configure(const struct device *dev)
z_phys_map((uint8_t **)&data->shmem,
mbar_mem.phys_addr, data->size,
K_MEM_CACHE_WB | K_MEM_PERM_RW);
K_MEM_CACHE_WB | K_MEM_PERM_RW | K_MEM_PERM_USER);
LOG_DBG("ivshmem configured:");
LOG_DBG("- Registers at 0x%lx (mapped to 0x%lx)",

View file

@ -0,0 +1,56 @@
/*
* Copyright (c) 2020 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <drivers/virtualization/ivshmem.h>
#include <syscall_handler.h>
#include <string.h>
static inline size_t z_vrfy_ivshmem_get_mem(const struct device *dev,
uintptr_t *memmap)
{
Z_OOPS(Z_SYSCALL_DRIVER_IVSHMEM(dev, get_mem));
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(memmap, sizeof(uintptr_t)));
return z_impl_ivshmem_get_mem(dev, memmap);
}
#include <syscalls/ivshmem_get_mem_mrsh.c>
static inline uint32_t z_vrfy_ivshmem_get_id(const struct device *dev)
{
Z_OOPS(Z_SYSCALL_DRIVER_IVSHMEM(dev, get_id));
return z_impl_ivshmem_get_id(dev);
}
#include <syscalls/ivshmem_get_id_mrsh.c>
static inline uint16_t z_vrfy_ivshmem_get_vectors(const struct device *dev)
{
Z_OOPS(Z_SYSCALL_DRIVER_IVSHMEM(dev, get_vectors));
return z_impl_ivshmem_get_vectors(dev);
}
#include <syscalls/ivshmem_get_vectors_mrsh.c>
static inline int z_vrfy_ivshmem_int_peer(const struct device *dev,
uint32_t peer_id, uint16_t vector)
{
Z_OOPS(Z_SYSCALL_DRIVER_IVSHMEM(dev, int_peer));
return z_impl_ivshmem_int_peer(dev, peer_id, vector);
}
#include <syscalls/ivshmem_int_peer_mrsh.c>
static inline int z_vrfy_ivshmem_register_handler(const struct device *dev,
struct k_poll_signal *signal,
uint16_t vector)
{
Z_OOPS(Z_SYSCALL_DRIVER_IVSHMEM(dev, register_handler));
Z_OOPS(Z_SYSCALL_OBJ(signal, K_OBJ_POLL_SIGNAL));
return z_impl_ivshmem_register_handler(dev, signal, vector);
}
#include <syscalls/ivshmem_register_handler_mrsh.c>