kernel: convert pipe APIs to system calls
k_pipe_block_put() will be done in another patch, we need to design handling for the k_mem_block object. Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
parent
468190a795
commit
b9a0578777
2 changed files with 67 additions and 13 deletions
|
@ -3239,8 +3239,8 @@ struct k_pipe {
|
|||
*
|
||||
* @return N/A
|
||||
*/
|
||||
extern void k_pipe_init(struct k_pipe *pipe, unsigned char *buffer,
|
||||
size_t size);
|
||||
__syscall void k_pipe_init(struct k_pipe *pipe, unsigned char *buffer,
|
||||
size_t size);
|
||||
|
||||
/**
|
||||
* @brief Write data to a pipe.
|
||||
|
@ -3261,9 +3261,9 @@ extern void k_pipe_init(struct k_pipe *pipe, unsigned char *buffer,
|
|||
* @retval -EAGAIN Waiting period timed out; between zero and @a min_xfer
|
||||
* minus one data bytes were written.
|
||||
*/
|
||||
extern int k_pipe_put(struct k_pipe *pipe, void *data,
|
||||
size_t bytes_to_write, size_t *bytes_written,
|
||||
size_t min_xfer, s32_t timeout);
|
||||
__syscall int k_pipe_put(struct k_pipe *pipe, void *data,
|
||||
size_t bytes_to_write, size_t *bytes_written,
|
||||
size_t min_xfer, s32_t timeout);
|
||||
|
||||
/**
|
||||
* @brief Read data from a pipe.
|
||||
|
@ -3284,9 +3284,9 @@ extern int k_pipe_put(struct k_pipe *pipe, void *data,
|
|||
* @retval -EAGAIN Waiting period timed out; between zero and @a min_xfer
|
||||
* minus one data bytes were read.
|
||||
*/
|
||||
extern int k_pipe_get(struct k_pipe *pipe, void *data,
|
||||
size_t bytes_to_read, size_t *bytes_read,
|
||||
size_t min_xfer, s32_t timeout);
|
||||
__syscall int k_pipe_get(struct k_pipe *pipe, void *data,
|
||||
size_t bytes_to_read, size_t *bytes_read,
|
||||
size_t min_xfer, s32_t timeout);
|
||||
|
||||
/**
|
||||
* @brief Write memory block to a pipe.
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <wait_q.h>
|
||||
#include <misc/dlist.h>
|
||||
#include <init.h>
|
||||
#include <syscall_handler.h>
|
||||
|
||||
struct k_pipe_desc {
|
||||
unsigned char *buffer; /* Position in src/dest buffer */
|
||||
|
@ -126,7 +127,7 @@ SYS_INIT(init_pipes_module, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_OBJECTS);
|
|||
|
||||
#endif /* CONFIG_NUM_PIPE_ASYNC_MSGS or CONFIG_OBJECT_TRACING */
|
||||
|
||||
void k_pipe_init(struct k_pipe *pipe, unsigned char *buffer, size_t size)
|
||||
void _impl_k_pipe_init(struct k_pipe *pipe, unsigned char *buffer, size_t size)
|
||||
{
|
||||
pipe->buffer = buffer;
|
||||
pipe->size = size;
|
||||
|
@ -139,6 +140,21 @@ void k_pipe_init(struct k_pipe *pipe, unsigned char *buffer, size_t size)
|
|||
_k_object_init(pipe);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USERSPACE
|
||||
u32_t _handler_k_pipe_init(u32_t pipe, u32_t buffer, u32_t size,
|
||||
u32_t arg4, u32_t arg5, u32_t arg6, void *ssf)
|
||||
{
|
||||
_SYSCALL_ARG3;
|
||||
|
||||
_SYSCALL_IS_OBJ(pipe, K_OBJ_PIPE, 1, ssf);
|
||||
_SYSCALL_MEMORY(buffer, size, 1, ssf);
|
||||
|
||||
_impl_k_pipe_init((struct k_pipe *)pipe, (unsigned char *)buffer,
|
||||
size);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Copy bytes from @a src to @a dest
|
||||
*
|
||||
|
@ -527,8 +543,8 @@ int _k_pipe_put_internal(struct k_pipe *pipe, struct k_pipe_async *async_desc,
|
|||
bytes_to_write);
|
||||
}
|
||||
|
||||
int k_pipe_get(struct k_pipe *pipe, void *data, size_t bytes_to_read,
|
||||
size_t *bytes_read, size_t min_xfer, s32_t timeout)
|
||||
int _impl_k_pipe_get(struct k_pipe *pipe, void *data, size_t bytes_to_read,
|
||||
size_t *bytes_read, size_t min_xfer, s32_t timeout)
|
||||
{
|
||||
struct k_thread *writer;
|
||||
struct k_pipe_desc *desc;
|
||||
|
@ -670,8 +686,27 @@ int k_pipe_get(struct k_pipe *pipe, void *data, size_t bytes_to_read,
|
|||
bytes_to_read);
|
||||
}
|
||||
|
||||
int k_pipe_put(struct k_pipe *pipe, void *data, size_t bytes_to_write,
|
||||
size_t *bytes_written, size_t min_xfer, s32_t timeout)
|
||||
#ifdef CONFIG_USERSPACE
|
||||
u32_t _handler_k_pipe_get(u32_t pipe, u32_t data, u32_t bytes_to_read,
|
||||
u32_t bytes_read_p, u32_t min_xfer_p,
|
||||
u32_t timeout, void *ssf)
|
||||
{
|
||||
size_t *bytes_read = (size_t *)bytes_read_p;
|
||||
size_t min_xfer = (size_t)min_xfer_p;
|
||||
|
||||
_SYSCALL_IS_OBJ(pipe, K_OBJ_PIPE, 0, ssf);
|
||||
_SYSCALL_MEMORY(bytes_read, sizeof(*bytes_read), 1, ssf);
|
||||
_SYSCALL_MEMORY((void *)data, bytes_to_read, 1, ssf);
|
||||
_SYSCALL_VERIFY(min_xfer <= bytes_to_read, ssf);
|
||||
|
||||
return _impl_k_pipe_get((struct k_pipe *)pipe, (void *)data,
|
||||
bytes_to_read, bytes_read, min_xfer,
|
||||
timeout);
|
||||
}
|
||||
#endif
|
||||
|
||||
int _impl_k_pipe_put(struct k_pipe *pipe, void *data, size_t bytes_to_write,
|
||||
size_t *bytes_written, size_t min_xfer, s32_t timeout)
|
||||
{
|
||||
__ASSERT(min_xfer <= bytes_to_write, "");
|
||||
__ASSERT(bytes_written != NULL, "");
|
||||
|
@ -681,6 +716,25 @@ int k_pipe_put(struct k_pipe *pipe, void *data, size_t bytes_to_write,
|
|||
min_xfer, timeout);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USERSPACE
|
||||
u32_t _handler_k_pipe_put(u32_t pipe, u32_t data, u32_t bytes_to_write,
|
||||
u32_t bytes_written_p, u32_t min_xfer_p,
|
||||
u32_t timeout, void *ssf)
|
||||
{
|
||||
size_t *bytes_written = (size_t *)bytes_written_p;
|
||||
size_t min_xfer = (size_t)min_xfer_p;
|
||||
|
||||
_SYSCALL_IS_OBJ(pipe, K_OBJ_PIPE, 0, ssf);
|
||||
_SYSCALL_MEMORY(bytes_written, sizeof(*bytes_written), 1, ssf);
|
||||
_SYSCALL_MEMORY((void *)data, bytes_to_write, 0, ssf);
|
||||
_SYSCALL_VERIFY(min_xfer <= bytes_to_write, ssf);
|
||||
|
||||
return _impl_k_pipe_put((struct k_pipe *)pipe, (void *)data,
|
||||
bytes_to_write, bytes_written, min_xfer,
|
||||
timeout);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (CONFIG_NUM_PIPE_ASYNC_MSGS > 0)
|
||||
void k_pipe_block_put(struct k_pipe *pipe, struct k_mem_block *block,
|
||||
size_t bytes_to_write, struct k_sem *sem)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue