OSDN Git Service

[CRYPTO] api: Added spawns
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / include / linux / crypto.h
index 7f94624..40a6330 100644 (file)
 #ifndef _LINUX_CRYPTO_H
 #define _LINUX_CRYPTO_H
 
+#include <asm/atomic.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/list.h>
+#include <linux/slab.h>
 #include <linux/string.h>
-#include <asm/page.h>
+#include <linux/uaccess.h>
 
 /*
  * Algorithm masks and types.
  */
-#define CRYPTO_ALG_TYPE_MASK           0x000000ff
+#define CRYPTO_ALG_TYPE_MASK           0x0000000f
 #define CRYPTO_ALG_TYPE_CIPHER         0x00000001
 #define CRYPTO_ALG_TYPE_DIGEST         0x00000002
 #define CRYPTO_ALG_TYPE_COMPRESS       0x00000004
 
+#define CRYPTO_ALG_LARVAL              0x00000010
+#define CRYPTO_ALG_DEAD                        0x00000020
+#define CRYPTO_ALG_DYING               0x00000040
+
 /*
  * Transform masks and values (for crt_flags).
  */
 #define CRYPTO_DIR_ENCRYPT             1
 #define CRYPTO_DIR_DECRYPT             0
 
+/*
+ * The macro CRYPTO_MINALIGN_ATTR (along with the void * type in the actual
+ * declaration) is used to ensure that the crypto_tfm context structure is
+ * aligned correctly for the given architecture so that there are no alignment
+ * faults for C data types.  In particular, this is required on platforms such
+ * as arm where pointers are 32-bit aligned but there are data types such as
+ * u64 which require 64-bit alignment.
+ */
+#if defined(ARCH_KMALLOC_MINALIGN)
+#define CRYPTO_MINALIGN ARCH_KMALLOC_MINALIGN
+#elif defined(ARCH_SLAB_MINALIGN)
+#define CRYPTO_MINALIGN ARCH_SLAB_MINALIGN
+#endif
+
+#ifdef CRYPTO_MINALIGN
+#define CRYPTO_MINALIGN_ATTR __attribute__ ((__aligned__(CRYPTO_MINALIGN)))
+#else
+#define CRYPTO_MINALIGN_ATTR
+#endif
+
 struct scatterlist;
 struct crypto_tfm;
 
@@ -121,12 +147,15 @@ struct compress_alg {
 
 struct crypto_alg {
        struct list_head cra_list;
+       struct list_head cra_users;
+
        u32 cra_flags;
        unsigned int cra_blocksize;
        unsigned int cra_ctxsize;
        unsigned int cra_alignmask;
 
        int cra_priority;
+       atomic_t cra_refcnt;
 
        char cra_name[CRYPTO_MAX_ALG_NAME];
        char cra_driver_name[CRYPTO_MAX_ALG_NAME];
@@ -139,6 +168,7 @@ struct crypto_alg {
 
        int (*cra_init)(struct crypto_tfm *tfm);
        void (*cra_exit)(struct crypto_tfm *tfm);
+       void (*cra_destroy)(struct crypto_alg *alg);
        
        struct module *cra_module;
 };
@@ -231,7 +261,16 @@ struct crypto_tfm {
        
        struct crypto_alg *__crt_alg;
 
-       char __crt_ctx[] __attribute__ ((__aligned__));
+       void *__crt_ctx[] CRYPTO_MINALIGN_ATTR;
+};
+
+enum {
+       CRYPTOA_UNSPEC,
+       CRYPTOA_ALG,
+};
+
+struct crypto_attr_alg {
+       char name[CRYPTO_MAX_ALG_NAME];
 };
 
 /*