text: /*
   * Copyright (c) 2017 Intel Corporation
   *
   * SPDX-License-Identifier: Apache-2.0
   */
  
  #include <kernel.h>
  #include <syscall_handler.h>
  #include <kernel_structs.h>
  
  static struct _k_object *validate_any_object(void *obj)
  {
  	struct _k_object *ko;
  	int ret;
  
  	ko = _k_object_find(obj);
  
  	/* This can be any kernel object and it doesn't have to be
  	 * initialized
  	 */
  	ret = _k_object_validate(ko, K_OBJ_ANY, _OBJ_INIT_ANY);
  	if (ret) {
  #ifdef CONFIG_PRINTK
  		_dump_object_error(ret, obj, ko, K_OBJ_ANY);
  #endif
  		return NULL;
  	}
  
  	return ko;
  }
  
  /* Normally these would be included in userspace.c, but the way
   * syscall_dispatch.c declares weak handlers results in build errors if these
   * are located in userspace.c. Just put in a separate file.
   *
   * To avoid double _k_object_find() lookups, we don't call the implementation
   * function, but call a level deeper.
   */
  Z_SYSCALL_HANDLER(k_object_access_grant, object, thread)
  {
  	struct _k_object *ko;
  
  	Z_OOPS(Z_SYSCALL_OBJ_INIT(thread, K_OBJ_THREAD));
  	ko = validate_any_object((void *)object);
  	Z_OOPS(Z_SYSCALL_VERIFY_MSG(ko, "object %p access denied",
  				    (void *)object));
  	_thread_perms_set(ko, (struct k_thread *)thread);
  
  	return 0;
  }
  
  Z_SYSCALL_HANDLER(k_object_release, object)
  {
  	struct _k_object *ko;
  
  	ko = validate_any_object((void *)object);
  	Z_OOPS(Z_SYSCALL_VERIFY_MSG(ko, "object %p access denied",
  				    (void *)object));
  	_thread_perms_clear(ko, _current);
  
  	return 0;
  }
  
  Z_SYSCALL_HANDLER(k_object_alloc, otype)
  {
  	Z_OOPS(Z_SYSCALL_VERIFY_MSG(otype > K_OBJ_ANY && otype < K_OBJ_LAST &&
  				    otype != K_OBJ__THREAD_STACK_ELEMENT,
  				    "bad object type %d requested", otype));
  
  	return (u32_t)_impl_k_object_alloc(otype);
  }
  