/* * Copyright (C) 2013-2015 Kay Sievers * Copyright (C) 2013-2015 Greg Kroah-Hartman * Copyright (C) 2013-2015 Daniel Mack * Copyright (C) 2013-2015 David Herrmann * Copyright (C) 2013-2015 Linux Foundation * Copyright (C) 2014-2015 Djalal Harouni * * kdbus is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the * Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. */ #ifndef __KDBUS_UTIL_H #define __KDBUS_UTIL_H #include #include #include /* all exported addresses are 64 bit */ #define KDBUS_PTR(addr) ((void __user *)(uintptr_t)(addr)) /* all exported sizes are 64 bit and data aligned to 64 bit */ #define KDBUS_ALIGN8(s) ALIGN((s), 8) #define KDBUS_IS_ALIGNED8(s) (IS_ALIGNED(s, 8)) /** * kdbus_member_set_user - write a structure member to user memory * @_s: Variable to copy from * @_b: Buffer to write to * @_t: Structure type * @_m: Member name in the passed structure * * Return: the result of copy_to_user() */ #define kdbus_member_set_user(_s, _b, _t, _m) \ ({ \ u64 __user *_sz = \ (void __user *)((u8 __user *)(_b) + offsetof(_t, _m)); \ copy_to_user(_sz, _s, FIELD_SIZEOF(_t, _m)); \ }) /** * kdbus_strhash - calculate a hash * @str: String * * Return: hash value */ static inline unsigned int kdbus_strhash(const char *str) { unsigned long hash = init_name_hash(); while (*str) hash = partial_name_hash(*str++, hash); return end_name_hash(hash); } int kdbus_verify_uid_prefix(const char *name, struct user_namespace *user_ns, kuid_t kuid); int kdbus_sanitize_attach_flags(u64 flags, u64 *attach_flags); int kdbus_copy_from_user(void *dest, void __user *user_ptr, size_t size); struct kvec; void kdbus_kvec_set(struct kvec *kvec, void *src, size_t len, u64 *total_len); size_t kdbus_kvec_pad(struct kvec *kvec, u64 *len); #endif