syscalls: remove policy from handler checks

The various macros to do checks in system call handlers all
implictly would generate a kernel oops if a check failed.
This is undesirable for a few reasons:

* System call handlers that acquire resources in the handler
  have no good recourse for cleanup if a check fails.
* In some cases we may want to propagate a return value back
  to the caller instead of just killing the calling thread,
  even though the base API doesn't do these checks.

These macros now all return a value, if nonzero is returned
the check failed. K_OOPS() now wraps these calls to generate
a kernel oops.

At the moment, the policy for all APIs has not changed. They
still all oops upon a failed check/

The macros now use the Z_ notation for private APIs.

Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
Andrew Boie 2018-05-04 15:57:57 -07:00 committed by Anas Nashif
commit 8345e5ebf0
31 changed files with 365 additions and 330 deletions

View file

@ -7,42 +7,42 @@
#include <gpio.h>
#include <syscall_handler.h>
_SYSCALL_HANDLER(gpio_config, port, access_op, pin, flags)
Z_SYSCALL_HANDLER(gpio_config, port, access_op, pin, flags)
{
_SYSCALL_DRIVER_GPIO(port, config);
Z_OOPS(Z_SYSCALL_DRIVER_GPIO(port, config));
return _impl_gpio_config((struct device *)port, access_op, pin, flags);
}
_SYSCALL_HANDLER(gpio_write, port, access_op, pin, value)
Z_SYSCALL_HANDLER(gpio_write, port, access_op, pin, value)
{
_SYSCALL_DRIVER_GPIO(port, write);
Z_OOPS(Z_SYSCALL_DRIVER_GPIO(port, write));
return _impl_gpio_write((struct device *)port, access_op, pin, value);
}
_SYSCALL_HANDLER(gpio_read, port, access_op, pin, value)
Z_SYSCALL_HANDLER(gpio_read, port, access_op, pin, value)
{
_SYSCALL_DRIVER_GPIO(port, read);
_SYSCALL_MEMORY_WRITE(value, sizeof(u32_t));
Z_OOPS(Z_SYSCALL_DRIVER_GPIO(port, read));
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(value, sizeof(u32_t)));
return _impl_gpio_read((struct device *)port, access_op, pin,
(u32_t *)value);
}
_SYSCALL_HANDLER(gpio_enable_callback, port, access_op, pin)
Z_SYSCALL_HANDLER(gpio_enable_callback, port, access_op, pin)
{
_SYSCALL_DRIVER_GPIO(port, enable_callback);
Z_OOPS(Z_SYSCALL_DRIVER_GPIO(port, enable_callback));
return _impl_gpio_enable_callback((struct device *)port, access_op,
pin);
}
_SYSCALL_HANDLER(gpio_disable_callback, port, access_op, pin)
Z_SYSCALL_HANDLER(gpio_disable_callback, port, access_op, pin)
{
_SYSCALL_DRIVER_GPIO(port, disable_callback);
Z_OOPS(Z_SYSCALL_DRIVER_GPIO(port, disable_callback));
return _impl_gpio_disable_callback((struct device *)port, access_op,
pin);
}
_SYSCALL_HANDLER(gpio_get_pending_int, port)
Z_SYSCALL_HANDLER(gpio_get_pending_int, port)
{
_SYSCALL_DRIVER_GPIO(port, get_pending_int);
Z_OOPS(Z_SYSCALL_DRIVER_GPIO(port, get_pending_int));
return _impl_gpio_get_pending_int((struct device *)port);
}