| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,152 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License, Version 1.0 only | ||
| * (the "License"). You may not use this file except in compliance | ||
| * with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright (c) 2016, Datto, Inc. All rights reserved. | ||
| */ | ||
|
|
||
| #ifdef _KERNEL | ||
| #include <linux/module.h> | ||
| #include <linux/kernel.h> | ||
| #include <linux/init.h> | ||
| #else | ||
| #define __exit | ||
| #define __init | ||
| #endif | ||
|
|
||
| #include <sys/crypto/common.h> | ||
| #include <sys/crypto/api.h> | ||
| #include <sys/crypto/impl.h> | ||
| #include <sys/crypto/sched_impl.h> | ||
| #include <sys/modhash_impl.h> | ||
| #include <sys/crypto/icp.h> | ||
|
|
||
| /* | ||
| * Changes made to the original Illumos Crypto Layer for the ICP: | ||
| * | ||
| * Several changes were needed to allow the Illumos Crypto Layer | ||
| * to work in the Linux kernel. Almost all of the changes fall into | ||
| * one of the following categories: | ||
| * | ||
| * 1) Moving the syntax to the C90: This was mostly a matter of | ||
| * changing func() definitions to func(void). In a few cases, | ||
| * initializations of structs with unions needed to have brackets | ||
| * added. | ||
| * | ||
| * 2) Changes to allow userspace compilation: The ICP is meant to be | ||
| * compiled and used in both userspace and kernel space (for ztest and | ||
| * libzfs), so the _KERNEL macros did not make sense anymore. For the | ||
| * same reason, many header includes were also changed to use | ||
| * sys/zfs_context.h | ||
| * | ||
| * 3) Moving to a statically compiled architecture: At some point in | ||
| * the future it may make sense to have encryption algorithms that are | ||
| * loadable into the ICP at runtime via separate kernel modules. | ||
| * However, considering that this code will probably not see much use | ||
| * outside of zfs and zfs encryption only requires aes and sha256 | ||
| * algorithms it seemed like more trouble than it was worth to port over | ||
| * Illumos's kernel module structure to a Linux kernel module. In | ||
| * addition, The Illumos code related to keeping track of kernel modules | ||
| * is very much tied to the Illumos OS and proved difficult to port to | ||
| * Linux. Therefore, the structure of the ICP was simplified to work | ||
| * statically and several pieces of code responsible for keeping track | ||
| * of Illumos kernel modules were removed and simplified. All module | ||
| * initialization and destruction is now called in this file during | ||
| * Linux kernel module loading and unloading. | ||
| * | ||
| * 4) Adding destructors: The Illumos Crypto Layer is built into | ||
| * the Illumos kernel and is not meant to be unloaded. Some destructors | ||
| * were added to allow the ICP to be unloaded without leaking | ||
| * structures. | ||
| * | ||
| * 5) Removing CRYPTO_DATA_MBLK related structures and code: | ||
| * crypto_data_t can have 3 formats, CRYPTO_DATA_RAW, CRYPTO_DATA_UIO, | ||
| * and CRYPTO_DATA_MBLK. ZFS only requires the first 2 formats, as the | ||
| * last one is related to streamed data. To simplify the port, code | ||
| * related to this format was removed. | ||
| * | ||
| * 6) Changes for architecture specific code: Some changes were needed | ||
| * to make architecture specific assembly compile. The biggest change | ||
| * here was to functions related to detecting CPU capabilities for amd64. | ||
| * The Illumos Crypto Layer used called into the Illumos kernel's API | ||
| * to discover these. They have been converted to instead use the | ||
| * 'cpuid' instruction as per the Intel spec. In addition, references to | ||
| * the sun4u' and sparc architectures have been removed so that these | ||
| * will use the generic implementation. | ||
| * | ||
| * 7) Removing sha384 and sha512 code: The sha code was actually very | ||
| * wasy to port. However, the generic sha384 and sha512 code actually | ||
| * exceeds the stack size on arm and powerpc architectures. In an effort | ||
| * to remove warnings, this code was removed. | ||
| * | ||
| * 8) Change large allocations from kmem_alloc() to vmem_alloc(): In | ||
| * testing the ICP with the ZFS encryption code, a few allocations were | ||
| * found that could potentially be very large. These caused the SPL to | ||
| * throw warnings and so they were changed to use vmem_alloc(). | ||
| * | ||
| * 9) Makefiles: Makefiles were added that would work with the existing | ||
| * ZFS Makefiles. | ||
| */ | ||
|
|
||
| void __exit | ||
| icp_fini(void) | ||
| { | ||
| sha2_mod_fini(); | ||
| sha1_mod_fini(); | ||
| aes_mod_fini(); | ||
| kcf_sched_destroy(); | ||
| kcf_prov_tab_destroy(); | ||
| kcf_destroy_mech_tabs(); | ||
| mod_hash_fini(); | ||
| } | ||
|
|
||
| /* roughly equivalent to kcf.c: _init() */ | ||
| int __init | ||
| icp_init(void) | ||
| { | ||
| /* initialize the mod hash module */ | ||
| mod_hash_init(); | ||
|
|
||
| /* initialize the mechanisms tables supported out-of-the-box */ | ||
| kcf_init_mech_tabs(); | ||
|
|
||
| /* initialize the providers tables */ | ||
| kcf_prov_tab_init(); | ||
|
|
||
| /* | ||
| * Initialize scheduling structures. Note that this does NOT | ||
| * start any threads since it might not be safe to do so. | ||
| */ | ||
| kcf_sched_init(); | ||
|
|
||
| /* initialize algorithms */ | ||
| aes_mod_init(); | ||
| sha1_mod_init(); | ||
| sha2_mod_init(); | ||
|
|
||
| return (0); | ||
| } | ||
|
|
||
| #if defined(_KERNEL) && defined(HAVE_SPL) | ||
| module_exit(icp_fini); | ||
| module_init(icp_init); | ||
| MODULE_LICENSE("CDDL"); | ||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,170 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2009 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _AES_IMPL_H | ||
| #define _AES_IMPL_H | ||
|
|
||
| /* | ||
| * Common definitions used by AES. | ||
| */ | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #include <sys/zfs_context.h> | ||
| #include <sys/crypto/common.h> | ||
|
|
||
| /* Similar to sysmacros.h IS_P2ALIGNED, but checks two pointers: */ | ||
| #define IS_P2ALIGNED2(v, w, a) \ | ||
| ((((uintptr_t)(v) | (uintptr_t)(w)) & ((uintptr_t)(a) - 1)) == 0) | ||
|
|
||
| #define AES_BLOCK_LEN 16 /* bytes */ | ||
| /* Round constant length, in number of 32-bit elements: */ | ||
| #define RC_LENGTH (5 * ((AES_BLOCK_LEN) / 4 - 2)) | ||
|
|
||
| #define AES_COPY_BLOCK(src, dst) \ | ||
| (dst)[0] = (src)[0]; \ | ||
| (dst)[1] = (src)[1]; \ | ||
| (dst)[2] = (src)[2]; \ | ||
| (dst)[3] = (src)[3]; \ | ||
| (dst)[4] = (src)[4]; \ | ||
| (dst)[5] = (src)[5]; \ | ||
| (dst)[6] = (src)[6]; \ | ||
| (dst)[7] = (src)[7]; \ | ||
| (dst)[8] = (src)[8]; \ | ||
| (dst)[9] = (src)[9]; \ | ||
| (dst)[10] = (src)[10]; \ | ||
| (dst)[11] = (src)[11]; \ | ||
| (dst)[12] = (src)[12]; \ | ||
| (dst)[13] = (src)[13]; \ | ||
| (dst)[14] = (src)[14]; \ | ||
| (dst)[15] = (src)[15] | ||
|
|
||
| #define AES_XOR_BLOCK(src, dst) \ | ||
| (dst)[0] ^= (src)[0]; \ | ||
| (dst)[1] ^= (src)[1]; \ | ||
| (dst)[2] ^= (src)[2]; \ | ||
| (dst)[3] ^= (src)[3]; \ | ||
| (dst)[4] ^= (src)[4]; \ | ||
| (dst)[5] ^= (src)[5]; \ | ||
| (dst)[6] ^= (src)[6]; \ | ||
| (dst)[7] ^= (src)[7]; \ | ||
| (dst)[8] ^= (src)[8]; \ | ||
| (dst)[9] ^= (src)[9]; \ | ||
| (dst)[10] ^= (src)[10]; \ | ||
| (dst)[11] ^= (src)[11]; \ | ||
| (dst)[12] ^= (src)[12]; \ | ||
| (dst)[13] ^= (src)[13]; \ | ||
| (dst)[14] ^= (src)[14]; \ | ||
| (dst)[15] ^= (src)[15] | ||
|
|
||
| /* AES key size definitions */ | ||
| #define AES_MINBITS 128 | ||
| #define AES_MINBYTES ((AES_MINBITS) >> 3) | ||
| #define AES_MAXBITS 256 | ||
| #define AES_MAXBYTES ((AES_MAXBITS) >> 3) | ||
|
|
||
| #define AES_MIN_KEY_BYTES ((AES_MINBITS) >> 3) | ||
| #define AES_MAX_KEY_BYTES ((AES_MAXBITS) >> 3) | ||
| #define AES_192_KEY_BYTES 24 | ||
| #define AES_IV_LEN 16 | ||
|
|
||
| /* AES key schedule may be implemented with 32- or 64-bit elements: */ | ||
| #define AES_32BIT_KS 32 | ||
| #define AES_64BIT_KS 64 | ||
|
|
||
| #define MAX_AES_NR 14 /* Maximum number of rounds */ | ||
| #define MAX_AES_NB 4 /* Number of columns comprising a state */ | ||
|
|
||
| typedef union { | ||
| #ifdef sun4u | ||
| uint64_t ks64[((MAX_AES_NR) + 1) * (MAX_AES_NB)]; | ||
| #endif | ||
| uint32_t ks32[((MAX_AES_NR) + 1) * (MAX_AES_NB)]; | ||
| } aes_ks_t; | ||
|
|
||
| /* aes_key.flags value: */ | ||
| #define INTEL_AES_NI_CAPABLE 0x1 /* AES-NI instructions present */ | ||
|
|
||
| typedef struct aes_key aes_key_t; | ||
| struct aes_key { | ||
| aes_ks_t encr_ks; /* encryption key schedule */ | ||
| aes_ks_t decr_ks; /* decryption key schedule */ | ||
| #ifdef __amd64 | ||
| long double align128; /* Align fields above for Intel AES-NI */ | ||
| int flags; /* implementation-dependent flags */ | ||
| #endif /* __amd64 */ | ||
| int nr; /* number of rounds (10, 12, or 14) */ | ||
| int type; /* key schedule size (32 or 64 bits) */ | ||
| }; | ||
|
|
||
| /* | ||
| * Core AES functions. | ||
| * ks and keysched are pointers to aes_key_t. | ||
| * They are declared void* as they are intended to be opaque types. | ||
| * Use function aes_alloc_keysched() to allocate memory for ks and keysched. | ||
| */ | ||
| extern void *aes_alloc_keysched(size_t *size, int kmflag); | ||
| extern void aes_init_keysched(const uint8_t *cipherKey, uint_t keyBits, | ||
| void *keysched); | ||
| extern int aes_encrypt_block(const void *ks, const uint8_t *pt, uint8_t *ct); | ||
| extern int aes_decrypt_block(const void *ks, const uint8_t *ct, uint8_t *pt); | ||
|
|
||
| /* | ||
| * AES mode functions. | ||
| * The first 2 functions operate on 16-byte AES blocks. | ||
| */ | ||
| extern void aes_copy_block(uint8_t *in, uint8_t *out); | ||
| extern void aes_xor_block(uint8_t *data, uint8_t *dst); | ||
|
|
||
| /* Note: ctx is a pointer to aes_ctx_t defined in modes.h */ | ||
| extern int aes_encrypt_contiguous_blocks(void *ctx, char *data, size_t length, | ||
| crypto_data_t *out); | ||
| extern int aes_decrypt_contiguous_blocks(void *ctx, char *data, size_t length, | ||
| crypto_data_t *out); | ||
|
|
||
| /* | ||
| * The following definitions and declarations are only used by AES FIPS POST | ||
| */ | ||
| #ifdef _AES_IMPL | ||
|
|
||
| typedef enum aes_mech_type { | ||
| AES_ECB_MECH_INFO_TYPE, /* SUN_CKM_AES_ECB */ | ||
| AES_CBC_MECH_INFO_TYPE, /* SUN_CKM_AES_CBC */ | ||
| AES_CBC_PAD_MECH_INFO_TYPE, /* SUN_CKM_AES_CBC_PAD */ | ||
| AES_CTR_MECH_INFO_TYPE, /* SUN_CKM_AES_CTR */ | ||
| AES_CCM_MECH_INFO_TYPE, /* SUN_CKM_AES_CCM */ | ||
| AES_GCM_MECH_INFO_TYPE, /* SUN_CKM_AES_GCM */ | ||
| AES_GMAC_MECH_INFO_TYPE /* SUN_CKM_AES_GMAC */ | ||
| } aes_mech_type_t; | ||
|
|
||
| #endif /* _AES_IMPL */ | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _AES_IMPL_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,385 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2009 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _COMMON_CRYPTO_MODES_H | ||
| #define _COMMON_CRYPTO_MODES_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #include <sys/zfs_context.h> | ||
| #include <sys/crypto/common.h> | ||
| #include <sys/crypto/impl.h> | ||
|
|
||
| #define ECB_MODE 0x00000002 | ||
| #define CBC_MODE 0x00000004 | ||
| #define CTR_MODE 0x00000008 | ||
| #define CCM_MODE 0x00000010 | ||
| #define GCM_MODE 0x00000020 | ||
| #define GMAC_MODE 0x00000040 | ||
|
|
||
| /* | ||
| * cc_keysched: Pointer to key schedule. | ||
| * | ||
| * cc_keysched_len: Length of the key schedule. | ||
| * | ||
| * cc_remainder: This is for residual data, i.e. data that can't | ||
| * be processed because there are too few bytes. | ||
| * Must wait until more data arrives. | ||
| * | ||
| * cc_remainder_len: Number of bytes in cc_remainder. | ||
| * | ||
| * cc_iv: Scratch buffer that sometimes contains the IV. | ||
| * | ||
| * cc_lastp: Pointer to previous block of ciphertext. | ||
| * | ||
| * cc_copy_to: Pointer to where encrypted residual data needs | ||
| * to be copied. | ||
| * | ||
| * cc_flags: PROVIDER_OWNS_KEY_SCHEDULE | ||
| * When a context is freed, it is necessary | ||
| * to know whether the key schedule was allocated | ||
| * by the caller, or internally, e.g. an init routine. | ||
| * If allocated by the latter, then it needs to be freed. | ||
| * | ||
| * ECB_MODE, CBC_MODE, CTR_MODE, or CCM_MODE | ||
| */ | ||
| struct common_ctx { | ||
| void *cc_keysched; | ||
| size_t cc_keysched_len; | ||
| uint64_t cc_iv[2]; | ||
| uint64_t cc_remainder[2]; | ||
| size_t cc_remainder_len; | ||
| uint8_t *cc_lastp; | ||
| uint8_t *cc_copy_to; | ||
| uint32_t cc_flags; | ||
| }; | ||
|
|
||
| typedef struct common_ctx common_ctx_t; | ||
|
|
||
| typedef struct ecb_ctx { | ||
| struct common_ctx ecb_common; | ||
| uint64_t ecb_lastblock[2]; | ||
| } ecb_ctx_t; | ||
|
|
||
| #define ecb_keysched ecb_common.cc_keysched | ||
| #define ecb_keysched_len ecb_common.cc_keysched_len | ||
| #define ecb_iv ecb_common.cc_iv | ||
| #define ecb_remainder ecb_common.cc_remainder | ||
| #define ecb_remainder_len ecb_common.cc_remainder_len | ||
| #define ecb_lastp ecb_common.cc_lastp | ||
| #define ecb_copy_to ecb_common.cc_copy_to | ||
| #define ecb_flags ecb_common.cc_flags | ||
|
|
||
| typedef struct cbc_ctx { | ||
| struct common_ctx cbc_common; | ||
| uint64_t cbc_lastblock[2]; | ||
| } cbc_ctx_t; | ||
|
|
||
| #define cbc_keysched cbc_common.cc_keysched | ||
| #define cbc_keysched_len cbc_common.cc_keysched_len | ||
| #define cbc_iv cbc_common.cc_iv | ||
| #define cbc_remainder cbc_common.cc_remainder | ||
| #define cbc_remainder_len cbc_common.cc_remainder_len | ||
| #define cbc_lastp cbc_common.cc_lastp | ||
| #define cbc_copy_to cbc_common.cc_copy_to | ||
| #define cbc_flags cbc_common.cc_flags | ||
|
|
||
| /* | ||
| * ctr_lower_mask Bit-mask for lower 8 bytes of counter block. | ||
| * ctr_upper_mask Bit-mask for upper 8 bytes of counter block. | ||
| */ | ||
| typedef struct ctr_ctx { | ||
| struct common_ctx ctr_common; | ||
| uint64_t ctr_lower_mask; | ||
| uint64_t ctr_upper_mask; | ||
| uint32_t ctr_tmp[4]; | ||
| } ctr_ctx_t; | ||
|
|
||
| /* | ||
| * ctr_cb Counter block. | ||
| */ | ||
| #define ctr_keysched ctr_common.cc_keysched | ||
| #define ctr_keysched_len ctr_common.cc_keysched_len | ||
| #define ctr_cb ctr_common.cc_iv | ||
| #define ctr_remainder ctr_common.cc_remainder | ||
| #define ctr_remainder_len ctr_common.cc_remainder_len | ||
| #define ctr_lastp ctr_common.cc_lastp | ||
| #define ctr_copy_to ctr_common.cc_copy_to | ||
| #define ctr_flags ctr_common.cc_flags | ||
|
|
||
| /* | ||
| * | ||
| * ccm_mac_len: Stores length of the MAC in CCM mode. | ||
| * ccm_mac_buf: Stores the intermediate value for MAC in CCM encrypt. | ||
| * In CCM decrypt, stores the input MAC value. | ||
| * ccm_data_len: Length of the plaintext for CCM mode encrypt, or | ||
| * length of the ciphertext for CCM mode decrypt. | ||
| * ccm_processed_data_len: | ||
| * Length of processed plaintext in CCM mode encrypt, | ||
| * or length of processed ciphertext for CCM mode decrypt. | ||
| * ccm_processed_mac_len: | ||
| * Length of MAC data accumulated in CCM mode decrypt. | ||
| * | ||
| * ccm_pt_buf: Only used in CCM mode decrypt. It stores the | ||
| * decrypted plaintext to be returned when | ||
| * MAC verification succeeds in decrypt_final. | ||
| * Memory for this should be allocated in the AES module. | ||
| * | ||
| */ | ||
| typedef struct ccm_ctx { | ||
| struct common_ctx ccm_common; | ||
| uint32_t ccm_tmp[4]; | ||
| size_t ccm_mac_len; | ||
| uint64_t ccm_mac_buf[2]; | ||
| size_t ccm_data_len; | ||
| size_t ccm_processed_data_len; | ||
| size_t ccm_processed_mac_len; | ||
| uint8_t *ccm_pt_buf; | ||
| uint64_t ccm_mac_input_buf[2]; | ||
| uint64_t ccm_counter_mask; | ||
| } ccm_ctx_t; | ||
|
|
||
| #define ccm_keysched ccm_common.cc_keysched | ||
| #define ccm_keysched_len ccm_common.cc_keysched_len | ||
| #define ccm_cb ccm_common.cc_iv | ||
| #define ccm_remainder ccm_common.cc_remainder | ||
| #define ccm_remainder_len ccm_common.cc_remainder_len | ||
| #define ccm_lastp ccm_common.cc_lastp | ||
| #define ccm_copy_to ccm_common.cc_copy_to | ||
| #define ccm_flags ccm_common.cc_flags | ||
|
|
||
| /* | ||
| * gcm_tag_len: Length of authentication tag. | ||
| * | ||
| * gcm_ghash: Stores output from the GHASH function. | ||
| * | ||
| * gcm_processed_data_len: | ||
| * Length of processed plaintext (encrypt) or | ||
| * length of processed ciphertext (decrypt). | ||
| * | ||
| * gcm_pt_buf: Stores the decrypted plaintext returned by | ||
| * decrypt_final when the computed authentication | ||
| * tag matches the user supplied tag. | ||
| * | ||
| * gcm_pt_buf_len: Length of the plaintext buffer. | ||
| * | ||
| * gcm_H: Subkey. | ||
| * | ||
| * gcm_J0: Pre-counter block generated from the IV. | ||
| * | ||
| * gcm_len_a_len_c: 64-bit representations of the bit lengths of | ||
| * AAD and ciphertext. | ||
| * | ||
| * gcm_kmflag: Current value of kmflag. Used only for allocating | ||
| * the plaintext buffer during decryption. | ||
| */ | ||
| typedef struct gcm_ctx { | ||
| struct common_ctx gcm_common; | ||
| size_t gcm_tag_len; | ||
| size_t gcm_processed_data_len; | ||
| size_t gcm_pt_buf_len; | ||
| uint32_t gcm_tmp[4]; | ||
| uint64_t gcm_ghash[2]; | ||
| uint64_t gcm_H[2]; | ||
| uint64_t gcm_J0[2]; | ||
| uint64_t gcm_len_a_len_c[2]; | ||
| uint8_t *gcm_pt_buf; | ||
| int gcm_kmflag; | ||
| } gcm_ctx_t; | ||
|
|
||
| #define gcm_keysched gcm_common.cc_keysched | ||
| #define gcm_keysched_len gcm_common.cc_keysched_len | ||
| #define gcm_cb gcm_common.cc_iv | ||
| #define gcm_remainder gcm_common.cc_remainder | ||
| #define gcm_remainder_len gcm_common.cc_remainder_len | ||
| #define gcm_lastp gcm_common.cc_lastp | ||
| #define gcm_copy_to gcm_common.cc_copy_to | ||
| #define gcm_flags gcm_common.cc_flags | ||
|
|
||
| #define AES_GMAC_IV_LEN 12 | ||
| #define AES_GMAC_TAG_BITS 128 | ||
|
|
||
| typedef struct aes_ctx { | ||
| union { | ||
| ecb_ctx_t acu_ecb; | ||
| cbc_ctx_t acu_cbc; | ||
| ctr_ctx_t acu_ctr; | ||
| ccm_ctx_t acu_ccm; | ||
| gcm_ctx_t acu_gcm; | ||
| } acu; | ||
| } aes_ctx_t; | ||
|
|
||
| #define ac_flags acu.acu_ecb.ecb_common.cc_flags | ||
| #define ac_remainder_len acu.acu_ecb.ecb_common.cc_remainder_len | ||
| #define ac_keysched acu.acu_ecb.ecb_common.cc_keysched | ||
| #define ac_keysched_len acu.acu_ecb.ecb_common.cc_keysched_len | ||
| #define ac_iv acu.acu_ecb.ecb_common.cc_iv | ||
| #define ac_lastp acu.acu_ecb.ecb_common.cc_lastp | ||
| #define ac_pt_buf acu.acu_ccm.ccm_pt_buf | ||
| #define ac_mac_len acu.acu_ccm.ccm_mac_len | ||
| #define ac_data_len acu.acu_ccm.ccm_data_len | ||
| #define ac_processed_mac_len acu.acu_ccm.ccm_processed_mac_len | ||
| #define ac_processed_data_len acu.acu_ccm.ccm_processed_data_len | ||
| #define ac_tag_len acu.acu_gcm.gcm_tag_len | ||
|
|
||
| typedef struct blowfish_ctx { | ||
| union { | ||
| ecb_ctx_t bcu_ecb; | ||
| cbc_ctx_t bcu_cbc; | ||
| } bcu; | ||
| } blowfish_ctx_t; | ||
|
|
||
| #define bc_flags bcu.bcu_ecb.ecb_common.cc_flags | ||
| #define bc_remainder_len bcu.bcu_ecb.ecb_common.cc_remainder_len | ||
| #define bc_keysched bcu.bcu_ecb.ecb_common.cc_keysched | ||
| #define bc_keysched_len bcu.bcu_ecb.ecb_common.cc_keysched_len | ||
| #define bc_iv bcu.bcu_ecb.ecb_common.cc_iv | ||
| #define bc_lastp bcu.bcu_ecb.ecb_common.cc_lastp | ||
|
|
||
| typedef struct des_ctx { | ||
| union { | ||
| ecb_ctx_t dcu_ecb; | ||
| cbc_ctx_t dcu_cbc; | ||
| } dcu; | ||
| } des_ctx_t; | ||
|
|
||
| #define dc_flags dcu.dcu_ecb.ecb_common.cc_flags | ||
| #define dc_remainder_len dcu.dcu_ecb.ecb_common.cc_remainder_len | ||
| #define dc_keysched dcu.dcu_ecb.ecb_common.cc_keysched | ||
| #define dc_keysched_len dcu.dcu_ecb.ecb_common.cc_keysched_len | ||
| #define dc_iv dcu.dcu_ecb.ecb_common.cc_iv | ||
| #define dc_lastp dcu.dcu_ecb.ecb_common.cc_lastp | ||
|
|
||
| extern int ecb_cipher_contiguous_blocks(ecb_ctx_t *, char *, size_t, | ||
| crypto_data_t *, size_t, int (*cipher)(const void *, const uint8_t *, | ||
| uint8_t *)); | ||
|
|
||
| extern int cbc_encrypt_contiguous_blocks(cbc_ctx_t *, char *, size_t, | ||
| crypto_data_t *, size_t, | ||
| int (*encrypt)(const void *, const uint8_t *, uint8_t *), | ||
| void (*copy_block)(uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int cbc_decrypt_contiguous_blocks(cbc_ctx_t *, char *, size_t, | ||
| crypto_data_t *, size_t, | ||
| int (*decrypt)(const void *, const uint8_t *, uint8_t *), | ||
| void (*copy_block)(uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int ctr_mode_contiguous_blocks(ctr_ctx_t *, char *, size_t, | ||
| crypto_data_t *, size_t, | ||
| int (*cipher)(const void *, const uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int ccm_mode_encrypt_contiguous_blocks(ccm_ctx_t *, char *, size_t, | ||
| crypto_data_t *, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*copy_block)(uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int ccm_mode_decrypt_contiguous_blocks(ccm_ctx_t *, char *, size_t, | ||
| crypto_data_t *, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*copy_block)(uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int gcm_mode_encrypt_contiguous_blocks(gcm_ctx_t *, char *, size_t, | ||
| crypto_data_t *, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*copy_block)(uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int gcm_mode_decrypt_contiguous_blocks(gcm_ctx_t *, char *, size_t, | ||
| crypto_data_t *, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*copy_block)(uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| int ccm_encrypt_final(ccm_ctx_t *, crypto_data_t *, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| int gcm_encrypt_final(gcm_ctx_t *, crypto_data_t *, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*copy_block)(uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int ccm_decrypt_final(ccm_ctx_t *, crypto_data_t *, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*copy_block)(uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int gcm_decrypt_final(gcm_ctx_t *, crypto_data_t *, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int ctr_mode_final(ctr_ctx_t *, crypto_data_t *, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *)); | ||
|
|
||
| extern int cbc_init_ctx(cbc_ctx_t *, char *, size_t, size_t, | ||
| void (*copy_block)(uint8_t *, uint64_t *)); | ||
|
|
||
| extern int ctr_init_ctx(ctr_ctx_t *, ulong_t, uint8_t *, | ||
| void (*copy_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int ccm_init_ctx(ccm_ctx_t *, char *, int, boolean_t, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int gcm_init_ctx(gcm_ctx_t *, char *, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*copy_block)(uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern int gmac_init_ctx(gcm_ctx_t *, char *, size_t, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *), | ||
| void (*copy_block)(uint8_t *, uint8_t *), | ||
| void (*xor_block)(uint8_t *, uint8_t *)); | ||
|
|
||
| extern void calculate_ccm_mac(ccm_ctx_t *, uint8_t *, | ||
| int (*encrypt_block)(const void *, const uint8_t *, uint8_t *)); | ||
|
|
||
| extern void gcm_mul(uint64_t *, uint64_t *, uint64_t *); | ||
|
|
||
| extern void crypto_init_ptrs(crypto_data_t *, void **, offset_t *); | ||
| extern void crypto_get_ptrs(crypto_data_t *, void **, offset_t *, | ||
| uint8_t **, size_t *, uint8_t **, size_t); | ||
|
|
||
| extern void *ecb_alloc_ctx(int); | ||
| extern void *cbc_alloc_ctx(int); | ||
| extern void *ctr_alloc_ctx(int); | ||
| extern void *ccm_alloc_ctx(int); | ||
| extern void *gcm_alloc_ctx(int); | ||
| extern void *gmac_alloc_ctx(int); | ||
| extern void crypto_free_mode_ctx(void *); | ||
| extern void gcm_set_kmflag(gcm_ctx_t *, int); | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _COMMON_CRYPTO_MODES_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,61 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2007 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SYS_SHA1_H | ||
| #define _SYS_SHA1_H | ||
|
|
||
| #include <sys/types.h> /* for uint_* */ | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| /* | ||
| * NOTE: n2rng (Niagara2 RNG driver) accesses the state field of | ||
| * SHA1_CTX directly. NEVER change this structure without verifying | ||
| * compatiblity with n2rng. The important thing is that the state | ||
| * must be in a field declared as uint32_t state[5]. | ||
| */ | ||
| /* SHA-1 context. */ | ||
| typedef struct { | ||
| uint32_t state[5]; /* state (ABCDE) */ | ||
| uint32_t count[2]; /* number of bits, modulo 2^64 (msb first) */ | ||
| union { | ||
| uint8_t buf8[64]; /* undigested input */ | ||
| uint32_t buf32[16]; /* realigned input */ | ||
| } buf_un; | ||
| } SHA1_CTX; | ||
|
|
||
| #define SHA1_DIGEST_LENGTH 20 | ||
|
|
||
| void SHA1Init(SHA1_CTX *); | ||
| void SHA1Update(SHA1_CTX *, const void *, size_t); | ||
| void SHA1Final(void *, SHA1_CTX *); | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SYS_SHA1_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,65 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License, Version 1.0 only | ||
| * (the "License"). You may not use this file except in compliance | ||
| * with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright (c) 1998, by Sun Microsystems, Inc. | ||
| * All rights reserved. | ||
| */ | ||
|
|
||
| #ifndef _SYS_SHA1_CONSTS_H | ||
| #define _SYS_SHA1_CONSTS_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| /* | ||
| * as explained in sha1.c, loading 32-bit constants on a sparc is expensive | ||
| * since it involves both a `sethi' and an `or'. thus, we instead use `ld' | ||
| * to load the constants from an array called `sha1_consts'. however, on | ||
| * intel (and perhaps other processors), it is cheaper to load the constant | ||
| * directly. thus, the c code in SHA1Transform() uses the macro SHA1_CONST() | ||
| * which either expands to a constant or an array reference, depending on | ||
| * the architecture the code is being compiled for. | ||
| */ | ||
|
|
||
| #include <sys/types.h> /* uint32_t */ | ||
|
|
||
| extern const uint32_t sha1_consts[]; | ||
|
|
||
| #if defined(__sparc) | ||
| #define SHA1_CONST(x) (sha1_consts[x]) | ||
| #else | ||
| #define SHA1_CONST(x) (SHA1_CONST_ ## x) | ||
| #endif | ||
|
|
||
| /* constants, as provided in FIPS 180-1 */ | ||
|
|
||
| #define SHA1_CONST_0 0x5a827999U | ||
| #define SHA1_CONST_1 0x6ed9eba1U | ||
| #define SHA1_CONST_2 0x8f1bbcdcU | ||
| #define SHA1_CONST_3 0xca62c1d6U | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SYS_SHA1_CONSTS_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,73 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2009 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SHA1_IMPL_H | ||
| #define _SHA1_IMPL_H | ||
|
|
||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #define SHA1_HASH_SIZE 20 /* SHA_1 digest length in bytes */ | ||
| #define SHA1_DIGEST_LENGTH 20 /* SHA1 digest length in bytes */ | ||
| #define SHA1_HMAC_BLOCK_SIZE 64 /* SHA1-HMAC block size */ | ||
| #define SHA1_HMAC_MIN_KEY_LEN 1 /* SHA1-HMAC min key length in bytes */ | ||
| #define SHA1_HMAC_MAX_KEY_LEN INT_MAX /* SHA1-HMAC max key length in bytes */ | ||
| #define SHA1_HMAC_INTS_PER_BLOCK (SHA1_HMAC_BLOCK_SIZE/sizeof (uint32_t)) | ||
|
|
||
| /* | ||
| * CSPI information (entry points, provider info, etc.) | ||
| */ | ||
| typedef enum sha1_mech_type { | ||
| SHA1_MECH_INFO_TYPE, /* SUN_CKM_SHA1 */ | ||
| SHA1_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA1_HMAC */ | ||
| SHA1_HMAC_GEN_MECH_INFO_TYPE /* SUN_CKM_SHA1_HMAC_GENERAL */ | ||
| } sha1_mech_type_t; | ||
|
|
||
| /* | ||
| * Context for SHA1 mechanism. | ||
| */ | ||
| typedef struct sha1_ctx { | ||
| sha1_mech_type_t sc_mech_type; /* type of context */ | ||
| SHA1_CTX sc_sha1_ctx; /* SHA1 context */ | ||
| } sha1_ctx_t; | ||
|
|
||
| /* | ||
| * Context for SHA1-HMAC and SHA1-HMAC-GENERAL mechanisms. | ||
| */ | ||
| typedef struct sha1_hmac_ctx { | ||
| sha1_mech_type_t hc_mech_type; /* type of context */ | ||
| uint32_t hc_digest_len; /* digest len in bytes */ | ||
| SHA1_CTX hc_icontext; /* inner SHA1 context */ | ||
| SHA1_CTX hc_ocontext; /* outer SHA1 context */ | ||
| } sha1_hmac_ctx_t; | ||
|
|
||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SHA1_IMPL_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,116 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2009 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
| /* Copyright 2013 Saso Kiselkov. All rights reserved. */ | ||
|
|
||
| #ifndef _SYS_SHA2_H | ||
| #define _SYS_SHA2_H | ||
|
|
||
| #include <sys/types.h> /* for uint_* */ | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #define SHA2_HMAC_MIN_KEY_LEN 1 /* SHA2-HMAC min key length in bytes */ | ||
| #define SHA2_HMAC_MAX_KEY_LEN INT_MAX /* SHA2-HMAC max key length in bytes */ | ||
|
|
||
| #define SHA256_DIGEST_LENGTH 32 /* SHA256 digest length in bytes */ | ||
|
|
||
| #define SHA256_HMAC_BLOCK_SIZE 64 /* SHA256-HMAC block size */ | ||
|
|
||
| #define SHA256 0 | ||
| #define SHA256_HMAC 1 | ||
| #define SHA256_HMAC_GEN 2 | ||
|
|
||
| /* | ||
| * SHA2 context. | ||
| * The contents of this structure are a private interface between the | ||
| * Init/Update/Final calls of the functions defined below. | ||
| * Callers must never attempt to read or write any of the fields | ||
| * in this structure directly. | ||
| */ | ||
| typedef struct { | ||
| uint32_t algotype; /* Algorithm Type */ | ||
|
|
||
| /* state (ABCDEFGH) */ | ||
| union { | ||
| uint32_t s32[8]; /* for SHA256 */ | ||
| uint64_t s64[8]; /* for SHA384/512 */ | ||
| } state; | ||
| /* number of bits */ | ||
| union { | ||
| uint32_t c32[2]; /* for SHA256 , modulo 2^64 */ | ||
| uint64_t c64[2]; /* for SHA384/512, modulo 2^128 */ | ||
| } count; | ||
| union { | ||
| uint8_t buf8[128]; /* undigested input */ | ||
| uint32_t buf32[32]; /* realigned input */ | ||
| uint64_t buf64[16]; /* realigned input */ | ||
| } buf_un; | ||
| } SHA2_CTX; | ||
|
|
||
| typedef SHA2_CTX SHA256_CTX; | ||
| typedef SHA2_CTX SHA384_CTX; | ||
| typedef SHA2_CTX SHA512_CTX; | ||
|
|
||
| extern void SHA2Init(uint64_t mech, SHA2_CTX *); | ||
|
|
||
| extern void SHA2Update(SHA2_CTX *, const void *, size_t); | ||
|
|
||
| extern void SHA2Final(void *, SHA2_CTX *); | ||
|
|
||
| extern void SHA256Init(SHA256_CTX *); | ||
|
|
||
| extern void SHA256Update(SHA256_CTX *, const void *, size_t); | ||
|
|
||
| extern void SHA256Final(void *, SHA256_CTX *); | ||
|
|
||
| #ifdef _SHA2_IMPL | ||
| /* | ||
| * The following types/functions are all private to the implementation | ||
| * of the SHA2 functions and must not be used by consumers of the interface | ||
| */ | ||
|
|
||
| /* | ||
| * List of support mechanisms in this module. | ||
| * | ||
| * It is important to note that in the module, division or modulus calculations | ||
| * are used on the enumerated type to determine which mechanism is being used; | ||
| * therefore, changing the order or additional mechanisms should be done | ||
| * carefully | ||
| */ | ||
| typedef enum sha2_mech_type { | ||
| SHA256_MECH_INFO_TYPE, /* SUN_CKM_SHA256 */ | ||
| SHA256_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA256_HMAC */ | ||
| SHA256_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA256_HMAC_GENERAL */ | ||
| } sha2_mech_type_t; | ||
|
|
||
| #endif /* _SHA2_IMPL */ | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SYS_SHA2_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,219 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License, Version 1.0 only | ||
| * (the "License"). You may not use this file except in compliance | ||
| * with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2005 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SYS_SHA2_CONSTS_H | ||
| #define _SYS_SHA2_CONSTS_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| /* | ||
| * Loading 32-bit constants on a sparc is expensive since it involves both | ||
| * a `sethi' and an `or'. thus, we instead use `ld' to load the constants | ||
| * from an array called `sha2_consts'. however, on intel (and perhaps other | ||
| * processors), it is cheaper to load the constant directly. thus, the c | ||
| * code in SHA transform functions uses the macro SHA2_CONST() which either | ||
| * expands to a constant or an array reference, depending on | ||
| * the architecture the code is being compiled for. | ||
| * | ||
| * SHA512 constants are used for SHA384 | ||
| */ | ||
|
|
||
| #include <sys/types.h> /* uint32_t */ | ||
|
|
||
| extern const uint32_t sha256_consts[]; | ||
| extern const uint64_t sha512_consts[]; | ||
|
|
||
| #if defined(__sparc) | ||
| #define SHA256_CONST(x) (sha256_consts[x]) | ||
| #define SHA512_CONST(x) (sha512_consts[x]) | ||
| #else | ||
| #define SHA256_CONST(x) (SHA256_CONST_ ## x) | ||
| #define SHA512_CONST(x) (SHA512_CONST_ ## x) | ||
| #endif | ||
|
|
||
| /* constants, as provided in FIPS 180-2 */ | ||
|
|
||
| #define SHA256_CONST_0 0x428a2f98U | ||
| #define SHA256_CONST_1 0x71374491U | ||
| #define SHA256_CONST_2 0xb5c0fbcfU | ||
| #define SHA256_CONST_3 0xe9b5dba5U | ||
| #define SHA256_CONST_4 0x3956c25bU | ||
| #define SHA256_CONST_5 0x59f111f1U | ||
| #define SHA256_CONST_6 0x923f82a4U | ||
| #define SHA256_CONST_7 0xab1c5ed5U | ||
|
|
||
| #define SHA256_CONST_8 0xd807aa98U | ||
| #define SHA256_CONST_9 0x12835b01U | ||
| #define SHA256_CONST_10 0x243185beU | ||
| #define SHA256_CONST_11 0x550c7dc3U | ||
| #define SHA256_CONST_12 0x72be5d74U | ||
| #define SHA256_CONST_13 0x80deb1feU | ||
| #define SHA256_CONST_14 0x9bdc06a7U | ||
| #define SHA256_CONST_15 0xc19bf174U | ||
|
|
||
| #define SHA256_CONST_16 0xe49b69c1U | ||
| #define SHA256_CONST_17 0xefbe4786U | ||
| #define SHA256_CONST_18 0x0fc19dc6U | ||
| #define SHA256_CONST_19 0x240ca1ccU | ||
| #define SHA256_CONST_20 0x2de92c6fU | ||
| #define SHA256_CONST_21 0x4a7484aaU | ||
| #define SHA256_CONST_22 0x5cb0a9dcU | ||
| #define SHA256_CONST_23 0x76f988daU | ||
|
|
||
| #define SHA256_CONST_24 0x983e5152U | ||
| #define SHA256_CONST_25 0xa831c66dU | ||
| #define SHA256_CONST_26 0xb00327c8U | ||
| #define SHA256_CONST_27 0xbf597fc7U | ||
| #define SHA256_CONST_28 0xc6e00bf3U | ||
| #define SHA256_CONST_29 0xd5a79147U | ||
| #define SHA256_CONST_30 0x06ca6351U | ||
| #define SHA256_CONST_31 0x14292967U | ||
|
|
||
| #define SHA256_CONST_32 0x27b70a85U | ||
| #define SHA256_CONST_33 0x2e1b2138U | ||
| #define SHA256_CONST_34 0x4d2c6dfcU | ||
| #define SHA256_CONST_35 0x53380d13U | ||
| #define SHA256_CONST_36 0x650a7354U | ||
| #define SHA256_CONST_37 0x766a0abbU | ||
| #define SHA256_CONST_38 0x81c2c92eU | ||
| #define SHA256_CONST_39 0x92722c85U | ||
|
|
||
| #define SHA256_CONST_40 0xa2bfe8a1U | ||
| #define SHA256_CONST_41 0xa81a664bU | ||
| #define SHA256_CONST_42 0xc24b8b70U | ||
| #define SHA256_CONST_43 0xc76c51a3U | ||
| #define SHA256_CONST_44 0xd192e819U | ||
| #define SHA256_CONST_45 0xd6990624U | ||
| #define SHA256_CONST_46 0xf40e3585U | ||
| #define SHA256_CONST_47 0x106aa070U | ||
|
|
||
| #define SHA256_CONST_48 0x19a4c116U | ||
| #define SHA256_CONST_49 0x1e376c08U | ||
| #define SHA256_CONST_50 0x2748774cU | ||
| #define SHA256_CONST_51 0x34b0bcb5U | ||
| #define SHA256_CONST_52 0x391c0cb3U | ||
| #define SHA256_CONST_53 0x4ed8aa4aU | ||
| #define SHA256_CONST_54 0x5b9cca4fU | ||
| #define SHA256_CONST_55 0x682e6ff3U | ||
|
|
||
| #define SHA256_CONST_56 0x748f82eeU | ||
| #define SHA256_CONST_57 0x78a5636fU | ||
| #define SHA256_CONST_58 0x84c87814U | ||
| #define SHA256_CONST_59 0x8cc70208U | ||
| #define SHA256_CONST_60 0x90befffaU | ||
| #define SHA256_CONST_61 0xa4506cebU | ||
| #define SHA256_CONST_62 0xbef9a3f7U | ||
| #define SHA256_CONST_63 0xc67178f2U | ||
|
|
||
| #define SHA512_CONST_0 0x428a2f98d728ae22ULL | ||
| #define SHA512_CONST_1 0x7137449123ef65cdULL | ||
| #define SHA512_CONST_2 0xb5c0fbcfec4d3b2fULL | ||
| #define SHA512_CONST_3 0xe9b5dba58189dbbcULL | ||
| #define SHA512_CONST_4 0x3956c25bf348b538ULL | ||
| #define SHA512_CONST_5 0x59f111f1b605d019ULL | ||
| #define SHA512_CONST_6 0x923f82a4af194f9bULL | ||
| #define SHA512_CONST_7 0xab1c5ed5da6d8118ULL | ||
| #define SHA512_CONST_8 0xd807aa98a3030242ULL | ||
| #define SHA512_CONST_9 0x12835b0145706fbeULL | ||
| #define SHA512_CONST_10 0x243185be4ee4b28cULL | ||
| #define SHA512_CONST_11 0x550c7dc3d5ffb4e2ULL | ||
| #define SHA512_CONST_12 0x72be5d74f27b896fULL | ||
| #define SHA512_CONST_13 0x80deb1fe3b1696b1ULL | ||
| #define SHA512_CONST_14 0x9bdc06a725c71235ULL | ||
| #define SHA512_CONST_15 0xc19bf174cf692694ULL | ||
| #define SHA512_CONST_16 0xe49b69c19ef14ad2ULL | ||
| #define SHA512_CONST_17 0xefbe4786384f25e3ULL | ||
| #define SHA512_CONST_18 0x0fc19dc68b8cd5b5ULL | ||
| #define SHA512_CONST_19 0x240ca1cc77ac9c65ULL | ||
| #define SHA512_CONST_20 0x2de92c6f592b0275ULL | ||
| #define SHA512_CONST_21 0x4a7484aa6ea6e483ULL | ||
| #define SHA512_CONST_22 0x5cb0a9dcbd41fbd4ULL | ||
| #define SHA512_CONST_23 0x76f988da831153b5ULL | ||
| #define SHA512_CONST_24 0x983e5152ee66dfabULL | ||
| #define SHA512_CONST_25 0xa831c66d2db43210ULL | ||
| #define SHA512_CONST_26 0xb00327c898fb213fULL | ||
| #define SHA512_CONST_27 0xbf597fc7beef0ee4ULL | ||
| #define SHA512_CONST_28 0xc6e00bf33da88fc2ULL | ||
| #define SHA512_CONST_29 0xd5a79147930aa725ULL | ||
| #define SHA512_CONST_30 0x06ca6351e003826fULL | ||
| #define SHA512_CONST_31 0x142929670a0e6e70ULL | ||
| #define SHA512_CONST_32 0x27b70a8546d22ffcULL | ||
| #define SHA512_CONST_33 0x2e1b21385c26c926ULL | ||
| #define SHA512_CONST_34 0x4d2c6dfc5ac42aedULL | ||
| #define SHA512_CONST_35 0x53380d139d95b3dfULL | ||
| #define SHA512_CONST_36 0x650a73548baf63deULL | ||
| #define SHA512_CONST_37 0x766a0abb3c77b2a8ULL | ||
| #define SHA512_CONST_38 0x81c2c92e47edaee6ULL | ||
| #define SHA512_CONST_39 0x92722c851482353bULL | ||
| #define SHA512_CONST_40 0xa2bfe8a14cf10364ULL | ||
| #define SHA512_CONST_41 0xa81a664bbc423001ULL | ||
| #define SHA512_CONST_42 0xc24b8b70d0f89791ULL | ||
| #define SHA512_CONST_43 0xc76c51a30654be30ULL | ||
| #define SHA512_CONST_44 0xd192e819d6ef5218ULL | ||
| #define SHA512_CONST_45 0xd69906245565a910ULL | ||
| #define SHA512_CONST_46 0xf40e35855771202aULL | ||
| #define SHA512_CONST_47 0x106aa07032bbd1b8ULL | ||
| #define SHA512_CONST_48 0x19a4c116b8d2d0c8ULL | ||
| #define SHA512_CONST_49 0x1e376c085141ab53ULL | ||
| #define SHA512_CONST_50 0x2748774cdf8eeb99ULL | ||
| #define SHA512_CONST_51 0x34b0bcb5e19b48a8ULL | ||
| #define SHA512_CONST_52 0x391c0cb3c5c95a63ULL | ||
| #define SHA512_CONST_53 0x4ed8aa4ae3418acbULL | ||
| #define SHA512_CONST_54 0x5b9cca4f7763e373ULL | ||
| #define SHA512_CONST_55 0x682e6ff3d6b2b8a3ULL | ||
| #define SHA512_CONST_56 0x748f82ee5defb2fcULL | ||
| #define SHA512_CONST_57 0x78a5636f43172f60ULL | ||
| #define SHA512_CONST_58 0x84c87814a1f0ab72ULL | ||
| #define SHA512_CONST_59 0x8cc702081a6439ecULL | ||
| #define SHA512_CONST_60 0x90befffa23631e28ULL | ||
| #define SHA512_CONST_61 0xa4506cebde82bde9ULL | ||
| #define SHA512_CONST_62 0xbef9a3f7b2c67915ULL | ||
| #define SHA512_CONST_63 0xc67178f2e372532bULL | ||
| #define SHA512_CONST_64 0xca273eceea26619cULL | ||
| #define SHA512_CONST_65 0xd186b8c721c0c207ULL | ||
| #define SHA512_CONST_66 0xeada7dd6cde0eb1eULL | ||
| #define SHA512_CONST_67 0xf57d4f7fee6ed178ULL | ||
| #define SHA512_CONST_68 0x06f067aa72176fbaULL | ||
| #define SHA512_CONST_69 0x0a637dc5a2c898a6ULL | ||
| #define SHA512_CONST_70 0x113f9804bef90daeULL | ||
| #define SHA512_CONST_71 0x1b710b35131c471bULL | ||
| #define SHA512_CONST_72 0x28db77f523047d84ULL | ||
| #define SHA512_CONST_73 0x32caab7b40c72493ULL | ||
| #define SHA512_CONST_74 0x3c9ebe0a15c9bebcULL | ||
| #define SHA512_CONST_75 0x431d67c49c100d4cULL | ||
| #define SHA512_CONST_76 0x4cc5d4becb3e42b6ULL | ||
| #define SHA512_CONST_77 0x597f299cfc657e2aULL | ||
| #define SHA512_CONST_78 0x5fcb6fab3ad6faecULL | ||
| #define SHA512_CONST_79 0x6c44198c4a475817ULL | ||
|
|
||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SYS_SHA2_CONSTS_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,62 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2009 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SHA2_IMPL_H | ||
| #define _SHA2_IMPL_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| typedef enum { | ||
| SHA1_TYPE, | ||
| SHA256_TYPE, | ||
| SHA384_TYPE, | ||
| SHA512_TYPE | ||
| } sha2_mech_t; | ||
|
|
||
| /* | ||
| * Context for SHA2 mechanism. | ||
| */ | ||
| typedef struct sha2_ctx { | ||
| sha2_mech_type_t sc_mech_type; /* type of context */ | ||
| SHA2_CTX sc_sha2_ctx; /* SHA2 context */ | ||
| } sha2_ctx_t; | ||
|
|
||
| /* | ||
| * Context for SHA2 HMAC and HMAC GENERAL mechanisms. | ||
| */ | ||
| typedef struct sha2_hmac_ctx { | ||
| sha2_mech_type_t hc_mech_type; /* type of context */ | ||
| uint32_t hc_digest_len; /* digest len in bytes */ | ||
| SHA2_CTX hc_icontext; /* inner SHA2 context */ | ||
| SHA2_CTX hc_ocontext; /* outer SHA2 context */ | ||
| } sha2_hmac_ctx_t; | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SHA2_IMPL_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License, Version 1.0 only | ||
| * (the "License"). You may not use this file except in compliance | ||
| * with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2005 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SYS_ASM_LINKAGE_H | ||
| #define _SYS_ASM_LINKAGE_H | ||
|
|
||
| #if defined(__i386) || defined(__amd64) | ||
|
|
||
| #include <sys/ia32/asm_linkage.h> /* XX64 x86/sys/asm_linkage.h */ | ||
|
|
||
| #endif | ||
|
|
||
| #endif /* _SYS_ASM_LINKAGE_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,183 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
|
|
||
| /* | ||
| * Copyright 2006 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ | ||
| /* All Rights Reserved */ | ||
|
|
||
|
|
||
| #ifndef _SYS_BITMAP_H | ||
| #define _SYS_BITMAP_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #if defined(__GNUC__) && defined(_ASM_INLINES) && \ | ||
| (defined(__i386) || defined(__amd64)) | ||
| #include <asm/bitmap.h> | ||
| #endif | ||
|
|
||
| /* | ||
| * Operations on bitmaps of arbitrary size | ||
| * A bitmap is a vector of 1 or more ulong_t's. | ||
| * The user of the package is responsible for range checks and keeping | ||
| * track of sizes. | ||
| */ | ||
|
|
||
| #ifdef _LP64 | ||
| #define BT_ULSHIFT 6 /* log base 2 of BT_NBIPUL, to extract word index */ | ||
| #define BT_ULSHIFT32 5 /* log base 2 of BT_NBIPUL, to extract word index */ | ||
| #else | ||
| #define BT_ULSHIFT 5 /* log base 2 of BT_NBIPUL, to extract word index */ | ||
| #endif | ||
|
|
||
| #define BT_NBIPUL (1 << BT_ULSHIFT) /* n bits per ulong_t */ | ||
| #define BT_ULMASK (BT_NBIPUL - 1) /* to extract bit index */ | ||
|
|
||
| #ifdef _LP64 | ||
| #define BT_NBIPUL32 (1 << BT_ULSHIFT32) /* n bits per ulong_t */ | ||
| #define BT_ULMASK32 (BT_NBIPUL32 - 1) /* to extract bit index */ | ||
| #define BT_ULMAXMASK 0xffffffffffffffff /* used by bt_getlowbit */ | ||
| #else | ||
| #define BT_ULMAXMASK 0xffffffff | ||
| #endif | ||
|
|
||
| /* | ||
| * bitmap is a ulong_t *, bitindex an index_t | ||
| * | ||
| * The macros BT_WIM and BT_BIW internal; there is no need | ||
| * for users of this package to use them. | ||
| */ | ||
|
|
||
| /* | ||
| * word in map | ||
| */ | ||
| #define BT_WIM(bitmap, bitindex) \ | ||
| ((bitmap)[(bitindex) >> BT_ULSHIFT]) | ||
| /* | ||
| * bit in word | ||
| */ | ||
| #define BT_BIW(bitindex) \ | ||
| (1UL << ((bitindex) & BT_ULMASK)) | ||
|
|
||
| #ifdef _LP64 | ||
| #define BT_WIM32(bitmap, bitindex) \ | ||
| ((bitmap)[(bitindex) >> BT_ULSHIFT32]) | ||
|
|
||
| #define BT_BIW32(bitindex) \ | ||
| (1UL << ((bitindex) & BT_ULMASK32)) | ||
| #endif | ||
|
|
||
| /* | ||
| * These are public macros | ||
| * | ||
| * BT_BITOUL == n bits to n ulong_t's | ||
| */ | ||
| #define BT_BITOUL(nbits) \ | ||
| (((nbits) + BT_NBIPUL - 1l) / BT_NBIPUL) | ||
| #define BT_SIZEOFMAP(nbits) \ | ||
| (BT_BITOUL(nbits) * sizeof (ulong_t)) | ||
| #define BT_TEST(bitmap, bitindex) \ | ||
| ((BT_WIM((bitmap), (bitindex)) & BT_BIW(bitindex)) ? 1 : 0) | ||
| #define BT_SET(bitmap, bitindex) \ | ||
| { BT_WIM((bitmap), (bitindex)) |= BT_BIW(bitindex); } | ||
| #define BT_CLEAR(bitmap, bitindex) \ | ||
| { BT_WIM((bitmap), (bitindex)) &= ~BT_BIW(bitindex); } | ||
|
|
||
| #ifdef _LP64 | ||
| #define BT_BITOUL32(nbits) \ | ||
| (((nbits) + BT_NBIPUL32 - 1l) / BT_NBIPUL32) | ||
| #define BT_SIZEOFMAP32(nbits) \ | ||
| (BT_BITOUL32(nbits) * sizeof (uint_t)) | ||
| #define BT_TEST32(bitmap, bitindex) \ | ||
| ((BT_WIM32((bitmap), (bitindex)) & BT_BIW32(bitindex)) ? 1 : 0) | ||
| #define BT_SET32(bitmap, bitindex) \ | ||
| { BT_WIM32((bitmap), (bitindex)) |= BT_BIW32(bitindex); } | ||
| #define BT_CLEAR32(bitmap, bitindex) \ | ||
| { BT_WIM32((bitmap), (bitindex)) &= ~BT_BIW32(bitindex); } | ||
| #endif /* _LP64 */ | ||
|
|
||
|
|
||
| /* | ||
| * BIT_ONLYONESET is a private macro not designed for bitmaps of | ||
| * arbitrary size. u must be an unsigned integer/long. It returns | ||
| * true if one and only one bit is set in u. | ||
| */ | ||
| #define BIT_ONLYONESET(u) \ | ||
| ((((u) == 0) ? 0 : ((u) & ((u) - 1)) == 0)) | ||
|
|
||
| #ifndef _ASM | ||
|
|
||
| /* | ||
| * return next available bit index from map with specified number of bits | ||
| */ | ||
| extern index_t bt_availbit(ulong_t *bitmap, size_t nbits); | ||
| /* | ||
| * find the highest order bit that is on, and is within or below | ||
| * the word specified by wx | ||
| */ | ||
| extern int bt_gethighbit(ulong_t *mapp, int wx); | ||
| extern int bt_range(ulong_t *bitmap, size_t *pos1, size_t *pos2, | ||
| size_t end_pos); | ||
| extern int bt_getlowbit(ulong_t *bitmap, size_t start, size_t stop); | ||
| extern void bt_copy(ulong_t *, ulong_t *, ulong_t); | ||
|
|
||
| /* | ||
| * find the parity | ||
| */ | ||
| extern int odd_parity(ulong_t); | ||
|
|
||
| /* | ||
| * Atomically set/clear bits | ||
| * Atomic exclusive operations will set "result" to "-1" | ||
| * if the bit is already set/cleared. "result" will be set | ||
| * to 0 otherwise. | ||
| */ | ||
| #define BT_ATOMIC_SET(bitmap, bitindex) \ | ||
| { atomic_or_long(&(BT_WIM(bitmap, bitindex)), BT_BIW(bitindex)); } | ||
| #define BT_ATOMIC_CLEAR(bitmap, bitindex) \ | ||
| { atomic_and_long(&(BT_WIM(bitmap, bitindex)), ~BT_BIW(bitindex)); } | ||
|
|
||
| #define BT_ATOMIC_SET_EXCL(bitmap, bitindex, result) \ | ||
| { result = atomic_set_long_excl(&(BT_WIM(bitmap, bitindex)), \ | ||
| (bitindex) % BT_NBIPUL); } | ||
| #define BT_ATOMIC_CLEAR_EXCL(bitmap, bitindex, result) \ | ||
| { result = atomic_clear_long_excl(&(BT_WIM(bitmap, bitindex)), \ | ||
| (bitindex) % BT_NBIPUL); } | ||
|
|
||
| /* | ||
| * Extracts bits between index h (high, inclusive) and l (low, exclusive) from | ||
| * u, which must be an unsigned integer. | ||
| */ | ||
| #define BITX(u, h, l) (((u) >> (l)) & ((1LU << ((h) - (l) + 1LU)) - 1LU)) | ||
|
|
||
| #endif /* _ASM */ | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SYS_BITMAP_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,137 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2008 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SYS_CRYPTO_ELFSIGN_H | ||
| #define _SYS_CRYPTO_ELFSIGN_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| /* | ||
| * Consolidation Private Interface for elfsign/libpkcs11/kcfd | ||
| */ | ||
|
|
||
| #include <sys/zfs_context.h> | ||
|
|
||
| /* | ||
| * Project Private structures and types used for communication between kcfd | ||
| * and KCF over the door. | ||
| */ | ||
|
|
||
| typedef enum ELFsign_status_e { | ||
| ELFSIGN_UNKNOWN, | ||
| ELFSIGN_SUCCESS, | ||
| ELFSIGN_FAILED, | ||
| ELFSIGN_NOTSIGNED, | ||
| ELFSIGN_INVALID_CERTPATH, | ||
| ELFSIGN_INVALID_ELFOBJ, | ||
| ELFSIGN_RESTRICTED | ||
| } ELFsign_status_t; | ||
|
|
||
| #define KCF_KCFD_VERSION1 1 | ||
| #define SIG_MAX_LENGTH 1024 | ||
|
|
||
| #define ELF_SIGNATURE_SECTION ".SUNW_signature" | ||
|
|
||
| typedef struct kcf_door_arg_s { | ||
| short da_version; | ||
| boolean_t da_iskernel; | ||
|
|
||
| union { | ||
| char filename[MAXPATHLEN]; /* For request */ | ||
|
|
||
| struct kcf_door_result_s { /* For response */ | ||
| ELFsign_status_t status; | ||
| uint32_t siglen; | ||
| uchar_t signature[1]; | ||
| } result; | ||
| } da_u; | ||
| } kcf_door_arg_t; | ||
|
|
||
| typedef uint32_t filesig_vers_t; | ||
|
|
||
| /* | ||
| * File Signature Structure | ||
| * Applicable to ELF and other file formats | ||
| */ | ||
| struct filesignatures { | ||
| uint32_t filesig_cnt; /* count of signatures */ | ||
| uint32_t filesig_pad; /* unused */ | ||
| union { | ||
| char filesig_data[1]; | ||
| struct filesig { /* one of these for each signature */ | ||
| uint32_t filesig_size; | ||
| filesig_vers_t filesig_version; | ||
| union { | ||
| struct filesig_version1 { | ||
| uint32_t filesig_v1_dnsize; | ||
| uint32_t filesig_v1_sigsize; | ||
| uint32_t filesig_v1_oidsize; | ||
| char filesig_v1_data[1]; | ||
| } filesig_v1; | ||
| struct filesig_version3 { | ||
| uint64_t filesig_v3_time; | ||
| uint32_t filesig_v3_dnsize; | ||
| uint32_t filesig_v3_sigsize; | ||
| uint32_t filesig_v3_oidsize; | ||
| char filesig_v3_data[1]; | ||
| } filesig_v3; | ||
| } _u2; | ||
| } filesig_sig; | ||
| uint64_t filesig_align; | ||
| } _u1; | ||
| }; | ||
| #define filesig_sig _u1.filesig_sig | ||
|
|
||
| #define filesig_v1_dnsize _u2.filesig_v1.filesig_v1_dnsize | ||
| #define filesig_v1_sigsize _u2.filesig_v1.filesig_v1_sigsize | ||
| #define filesig_v1_oidsize _u2.filesig_v1.filesig_v1_oidsize | ||
| #define filesig_v1_data _u2.filesig_v1.filesig_v1_data | ||
|
|
||
| #define filesig_v3_time _u2.filesig_v3.filesig_v3_time | ||
| #define filesig_v3_dnsize _u2.filesig_v3.filesig_v3_dnsize | ||
| #define filesig_v3_sigsize _u2.filesig_v3.filesig_v3_sigsize | ||
| #define filesig_v3_oidsize _u2.filesig_v3.filesig_v3_oidsize | ||
| #define filesig_v3_data _u2.filesig_v3.filesig_v3_data | ||
|
|
||
| #define filesig_ALIGN(s) (((s) + sizeof (uint64_t) - 1) & \ | ||
| (-sizeof (uint64_t))) | ||
| #define filesig_next(ptr) (struct filesig *)((void *)((char *)(ptr) + \ | ||
| filesig_ALIGN((ptr)->filesig_size))) | ||
|
|
||
| #define FILESIG_UNKNOWN 0 /* unrecognized version */ | ||
| #define FILESIG_VERSION1 1 /* version1, all but sig section */ | ||
| #define FILESIG_VERSION2 2 /* version1 format, SHF_ALLOC only */ | ||
| #define FILESIG_VERSION3 3 /* version3, all but sig section */ | ||
| #define FILESIG_VERSION4 4 /* version3 format, SHF_ALLOC only */ | ||
|
|
||
| #define _PATH_KCFD_DOOR "/etc/svc/volatile/kcfd_door" | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SYS_CRYPTO_ELFSIGN_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,136 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License, Version 1.0 only | ||
| * (the "License"). You may not use this file except in compliance | ||
| * with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2005 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SYS_CRYPTO_IOCTLADMIN_H | ||
| #define _SYS_CRYPTO_IOCTLADMIN_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #include <sys/zfs_context.h> | ||
| #include <sys/crypto/common.h> | ||
|
|
||
| #define ADMIN_IOCTL_DEVICE "/dev/cryptoadm" | ||
|
|
||
| #define CRYPTOADMIN(x) (('y' << 8) | (x)) | ||
|
|
||
| /* | ||
| * Administrative IOCTLs | ||
| */ | ||
|
|
||
| typedef struct crypto_get_dev_list { | ||
| uint_t dl_return_value; | ||
| uint_t dl_dev_count; | ||
| crypto_dev_list_entry_t dl_devs[1]; | ||
| } crypto_get_dev_list_t; | ||
|
|
||
| typedef struct crypto_get_soft_list { | ||
| uint_t sl_return_value; | ||
| uint_t sl_soft_count; | ||
| size_t sl_soft_len; | ||
| caddr_t sl_soft_names; | ||
| } crypto_get_soft_list_t; | ||
|
|
||
| typedef struct crypto_get_dev_info { | ||
| uint_t di_return_value; | ||
| char di_dev_name[MAXNAMELEN]; | ||
| uint_t di_dev_instance; | ||
| uint_t di_count; | ||
| crypto_mech_name_t di_list[1]; | ||
| } crypto_get_dev_info_t; | ||
|
|
||
| typedef struct crypto_get_soft_info { | ||
| uint_t si_return_value; | ||
| char si_name[MAXNAMELEN]; | ||
| uint_t si_count; | ||
| crypto_mech_name_t si_list[1]; | ||
| } crypto_get_soft_info_t; | ||
|
|
||
| typedef struct crypto_load_dev_disabled { | ||
| uint_t dd_return_value; | ||
| char dd_dev_name[MAXNAMELEN]; | ||
| uint_t dd_dev_instance; | ||
| uint_t dd_count; | ||
| crypto_mech_name_t dd_list[1]; | ||
| } crypto_load_dev_disabled_t; | ||
|
|
||
| typedef struct crypto_load_soft_disabled { | ||
| uint_t sd_return_value; | ||
| char sd_name[MAXNAMELEN]; | ||
| uint_t sd_count; | ||
| crypto_mech_name_t sd_list[1]; | ||
| } crypto_load_soft_disabled_t; | ||
|
|
||
| typedef struct crypto_unload_soft_module { | ||
| uint_t sm_return_value; | ||
| char sm_name[MAXNAMELEN]; | ||
| } crypto_unload_soft_module_t; | ||
|
|
||
| typedef struct crypto_load_soft_config { | ||
| uint_t sc_return_value; | ||
| char sc_name[MAXNAMELEN]; | ||
| uint_t sc_count; | ||
| crypto_mech_name_t sc_list[1]; | ||
| } crypto_load_soft_config_t; | ||
|
|
||
| typedef struct crypto_load_door { | ||
| uint_t ld_return_value; | ||
| uint_t ld_did; | ||
| } crypto_load_door_t; | ||
|
|
||
| #ifdef _KERNEL | ||
| #ifdef _SYSCALL32 | ||
|
|
||
| typedef struct crypto_get_soft_list32 { | ||
| uint32_t sl_return_value; | ||
| uint32_t sl_soft_count; | ||
| size32_t sl_soft_len; | ||
| caddr32_t sl_soft_names; | ||
| } crypto_get_soft_list32_t; | ||
|
|
||
| #endif /* _SYSCALL32 */ | ||
| #endif /* _KERNEL */ | ||
|
|
||
| #define CRYPTO_GET_VERSION CRYPTOADMIN(1) | ||
| #define CRYPTO_GET_DEV_LIST CRYPTOADMIN(2) | ||
| #define CRYPTO_GET_SOFT_LIST CRYPTOADMIN(3) | ||
| #define CRYPTO_GET_DEV_INFO CRYPTOADMIN(4) | ||
| #define CRYPTO_GET_SOFT_INFO CRYPTOADMIN(5) | ||
| #define CRYPTO_LOAD_DEV_DISABLED CRYPTOADMIN(8) | ||
| #define CRYPTO_LOAD_SOFT_DISABLED CRYPTOADMIN(9) | ||
| #define CRYPTO_UNLOAD_SOFT_MODULE CRYPTOADMIN(10) | ||
| #define CRYPTO_LOAD_SOFT_CONFIG CRYPTOADMIN(11) | ||
| #define CRYPTO_POOL_CREATE CRYPTOADMIN(12) | ||
| #define CRYPTO_POOL_WAIT CRYPTOADMIN(13) | ||
| #define CRYPTO_POOL_RUN CRYPTOADMIN(14) | ||
| #define CRYPTO_LOAD_DOOR CRYPTOADMIN(15) | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SYS_CRYPTO_IOCTLADMIN_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,307 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
|
|
||
| /* | ||
| * Copyright 2008 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _IA32_SYS_ASM_LINKAGE_H | ||
| #define _IA32_SYS_ASM_LINKAGE_H | ||
|
|
||
| #include <sys/stack.h> | ||
| #include <sys/trap.h> | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #ifdef _ASM /* The remainder of this file is only for assembly files */ | ||
|
|
||
| /* | ||
| * make annoying differences in assembler syntax go away | ||
| */ | ||
|
|
||
| /* | ||
| * D16 and A16 are used to insert instructions prefixes; the | ||
| * macros help the assembler code be slightly more portable. | ||
| */ | ||
| #if !defined(__GNUC_AS__) | ||
| /* | ||
| * /usr/ccs/bin/as prefixes are parsed as separate instructions | ||
| */ | ||
| #define D16 data16; | ||
| #define A16 addr16; | ||
|
|
||
| /* | ||
| * (There are some weird constructs in constant expressions) | ||
| */ | ||
| #define _CONST(const) [const] | ||
| #define _BITNOT(const) -1!_CONST(const) | ||
| #define _MUL(a, b) _CONST(a \* b) | ||
|
|
||
| #else | ||
| /* | ||
| * Why not use the 'data16' and 'addr16' prefixes .. well, the | ||
| * assembler doesn't quite believe in real mode, and thus argues with | ||
| * us about what we're trying to do. | ||
| */ | ||
| #define D16 .byte 0x66; | ||
| #define A16 .byte 0x67; | ||
|
|
||
| #define _CONST(const) (const) | ||
| #define _BITNOT(const) ~_CONST(const) | ||
| #define _MUL(a, b) _CONST(a * b) | ||
|
|
||
| #endif | ||
|
|
||
| /* | ||
| * C pointers are different sizes between i386 and amd64. | ||
| * These constants can be used to compute offsets into pointer arrays. | ||
| */ | ||
| #if defined(__amd64) | ||
| #define CLONGSHIFT 3 | ||
| #define CLONGSIZE 8 | ||
| #define CLONGMASK 7 | ||
| #elif defined(__i386) | ||
| #define CLONGSHIFT 2 | ||
| #define CLONGSIZE 4 | ||
| #define CLONGMASK 3 | ||
| #endif | ||
|
|
||
| /* | ||
| * Since we know we're either ILP32 or LP64 .. | ||
| */ | ||
| #define CPTRSHIFT CLONGSHIFT | ||
| #define CPTRSIZE CLONGSIZE | ||
| #define CPTRMASK CLONGMASK | ||
|
|
||
| #if CPTRSIZE != (1 << CPTRSHIFT) || CLONGSIZE != (1 << CLONGSHIFT) | ||
| #error "inconsistent shift constants" | ||
| #endif | ||
|
|
||
| #if CPTRMASK != (CPTRSIZE - 1) || CLONGMASK != (CLONGSIZE - 1) | ||
| #error "inconsistent mask constants" | ||
| #endif | ||
|
|
||
| #define ASM_ENTRY_ALIGN 16 | ||
|
|
||
| /* | ||
| * SSE register alignment and save areas | ||
| */ | ||
|
|
||
| #define XMM_SIZE 16 | ||
| #define XMM_ALIGN 16 | ||
|
|
||
| #if defined(__amd64) | ||
|
|
||
| #define SAVE_XMM_PROLOG(sreg, nreg) \ | ||
| subq $_CONST(_MUL(XMM_SIZE, nreg)), %rsp; \ | ||
| movq %rsp, sreg | ||
|
|
||
| #define RSTOR_XMM_EPILOG(sreg, nreg) \ | ||
| addq $_CONST(_MUL(XMM_SIZE, nreg)), %rsp | ||
|
|
||
| #elif defined(__i386) | ||
|
|
||
| #define SAVE_XMM_PROLOG(sreg, nreg) \ | ||
| subl $_CONST(_MUL(XMM_SIZE, nreg) + XMM_ALIGN), %esp; \ | ||
| movl %esp, sreg; \ | ||
| addl $XMM_ALIGN, sreg; \ | ||
| andl $_BITNOT(XMM_ALIGN-1), sreg | ||
|
|
||
| #define RSTOR_XMM_EPILOG(sreg, nreg) \ | ||
| addl $_CONST(_MUL(XMM_SIZE, nreg) + XMM_ALIGN), %esp; | ||
|
|
||
| #endif /* __i386 */ | ||
|
|
||
| /* | ||
| * profiling causes definitions of the MCOUNT and RTMCOUNT | ||
| * particular to the type | ||
| */ | ||
| #ifdef GPROF | ||
|
|
||
| #define MCOUNT(x) \ | ||
| pushl %ebp; \ | ||
| movl %esp, %ebp; \ | ||
| call _mcount; \ | ||
| popl %ebp | ||
|
|
||
| #endif /* GPROF */ | ||
|
|
||
| #ifdef PROF | ||
|
|
||
| #define MCOUNT(x) \ | ||
| /* CSTYLED */ \ | ||
| .lcomm .L_/**/x/**/1, 4, 4; \ | ||
| pushl %ebp; \ | ||
| movl %esp, %ebp; \ | ||
| /* CSTYLED */ \ | ||
| movl $.L_/**/x/**/1, %edx; \ | ||
| call _mcount; \ | ||
| popl %ebp | ||
|
|
||
| #endif /* PROF */ | ||
|
|
||
| /* | ||
| * if we are not profiling, MCOUNT should be defined to nothing | ||
| */ | ||
| #if !defined(PROF) && !defined(GPROF) | ||
| #define MCOUNT(x) | ||
| #endif /* !defined(PROF) && !defined(GPROF) */ | ||
|
|
||
| #define RTMCOUNT(x) MCOUNT(x) | ||
|
|
||
| /* | ||
| * Macro to define weak symbol aliases. These are similar to the ANSI-C | ||
| * #pragma weak _name = name | ||
| * except a compiler can determine type. The assembler must be told. Hence, | ||
| * the second parameter must be the type of the symbol (i.e.: function,...) | ||
| */ | ||
| #define ANSI_PRAGMA_WEAK(sym, stype) \ | ||
| /* CSTYLED */ \ | ||
| .weak _/**/sym; \ | ||
| /* CSTYLED */ \ | ||
| .type _/**/sym, @stype; \ | ||
| /* CSTYLED */ \ | ||
| _/**/sym = sym | ||
|
|
||
| /* | ||
| * Like ANSI_PRAGMA_WEAK(), but for unrelated names, as in: | ||
| * #pragma weak sym1 = sym2 | ||
| */ | ||
| #define ANSI_PRAGMA_WEAK2(sym1, sym2, stype) \ | ||
| .weak sym1; \ | ||
| .type sym1, @stype; \ | ||
| sym1 = sym2 | ||
|
|
||
| /* | ||
| * ENTRY provides the standard procedure entry code and an easy way to | ||
| * insert the calls to mcount for profiling. ENTRY_NP is identical, but | ||
| * never calls mcount. | ||
| */ | ||
| #define ENTRY(x) \ | ||
| .text; \ | ||
| .align ASM_ENTRY_ALIGN; \ | ||
| .globl x; \ | ||
| .type x, @function; \ | ||
| x: MCOUNT(x) | ||
|
|
||
| #define ENTRY_NP(x) \ | ||
| .text; \ | ||
| .align ASM_ENTRY_ALIGN; \ | ||
| .globl x; \ | ||
| .type x, @function; \ | ||
| x: | ||
|
|
||
| #define RTENTRY(x) \ | ||
| .text; \ | ||
| .align ASM_ENTRY_ALIGN; \ | ||
| .globl x; \ | ||
| .type x, @function; \ | ||
| x: RTMCOUNT(x) | ||
|
|
||
| /* | ||
| * ENTRY2 is identical to ENTRY but provides two labels for the entry point. | ||
| */ | ||
| #define ENTRY2(x, y) \ | ||
| .text; \ | ||
| .align ASM_ENTRY_ALIGN; \ | ||
| .globl x, y; \ | ||
| .type x, @function; \ | ||
| .type y, @function; \ | ||
| /* CSTYLED */ \ | ||
| x: ; \ | ||
| y: MCOUNT(x) | ||
|
|
||
| #define ENTRY_NP2(x, y) \ | ||
| .text; \ | ||
| .align ASM_ENTRY_ALIGN; \ | ||
| .globl x, y; \ | ||
| .type x, @function; \ | ||
| .type y, @function; \ | ||
| /* CSTYLED */ \ | ||
| x: ; \ | ||
| y: | ||
|
|
||
|
|
||
| /* | ||
| * ALTENTRY provides for additional entry points. | ||
| */ | ||
| #define ALTENTRY(x) \ | ||
| .globl x; \ | ||
| .type x, @function; \ | ||
| x: | ||
|
|
||
| /* | ||
| * DGDEF and DGDEF2 provide global data declarations. | ||
| * | ||
| * DGDEF provides a word aligned word of storage. | ||
| * | ||
| * DGDEF2 allocates "sz" bytes of storage with **NO** alignment. This | ||
| * implies this macro is best used for byte arrays. | ||
| * | ||
| * DGDEF3 allocates "sz" bytes of storage with "algn" alignment. | ||
| */ | ||
| #define DGDEF2(name, sz) \ | ||
| .data; \ | ||
| .globl name; \ | ||
| .type name, @object; \ | ||
| .size name, sz; \ | ||
| name: | ||
|
|
||
| #define DGDEF3(name, sz, algn) \ | ||
| .data; \ | ||
| .align algn; \ | ||
| .globl name; \ | ||
| .type name, @object; \ | ||
| .size name, sz; \ | ||
| name: | ||
|
|
||
| #define DGDEF(name) DGDEF3(name, 4, 4) | ||
|
|
||
| /* | ||
| * SET_SIZE trails a function and set the size for the ELF symbol table. | ||
| */ | ||
| #define SET_SIZE(x) \ | ||
| .size x, [.-x] | ||
|
|
||
| /* | ||
| * NWORD provides native word value. | ||
| */ | ||
| #if defined(__amd64) | ||
|
|
||
| /*CSTYLED*/ | ||
| #define NWORD quad | ||
|
|
||
| #elif defined(__i386) | ||
|
|
||
| #define NWORD long | ||
|
|
||
| #endif /* __i386 */ | ||
|
|
||
| #endif /* _ASM */ | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _IA32_SYS_ASM_LINKAGE_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,160 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License, Version 1.0 only | ||
| * (the "License"). You may not use this file except in compliance | ||
| * with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2004 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _IA32_SYS_STACK_H | ||
| #define _IA32_SYS_STACK_H | ||
|
|
||
| #if !defined(_ASM) | ||
|
|
||
| #include <sys/types.h> | ||
|
|
||
| #endif | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| /* | ||
| * In the x86 world, a stack frame looks like this: | ||
| * | ||
| * |--------------------------| | ||
| * 4n+8(%ebp) ->| argument word n | | ||
| * | ... | (Previous frame) | ||
| * 8(%ebp) ->| argument word 0 | | ||
| * |--------------------------|-------------------- | ||
| * 4(%ebp) ->| return address | | ||
| * |--------------------------| | ||
| * 0(%ebp) ->| previous %ebp (optional) | | ||
| * |--------------------------| | ||
| * -4(%ebp) ->| unspecified | (Current frame) | ||
| * | ... | | ||
| * 0(%esp) ->| variable size | | ||
| * |--------------------------| | ||
| */ | ||
|
|
||
| /* | ||
| * Stack alignment macros. | ||
| */ | ||
|
|
||
| #define STACK_ALIGN32 4 | ||
| #define STACK_ENTRY_ALIGN32 4 | ||
| #define STACK_BIAS32 0 | ||
| #define SA32(x) (((x)+(STACK_ALIGN32-1)) & ~(STACK_ALIGN32-1)) | ||
| #define STACK_RESERVE32 0 | ||
| #define MINFRAME32 0 | ||
|
|
||
| #if defined(__amd64) | ||
|
|
||
| /* | ||
| * In the amd64 world, a stack frame looks like this: | ||
| * | ||
| * |--------------------------| | ||
| * 8n+16(%rbp)->| argument word n | | ||
| * | ... | (Previous frame) | ||
| * 16(%rbp) ->| argument word 0 | | ||
| * |--------------------------|-------------------- | ||
| * 8(%rbp) ->| return address | | ||
| * |--------------------------| | ||
| * 0(%rbp) ->| previous %rbp | | ||
| * |--------------------------| | ||
| * -8(%rbp) ->| unspecified | (Current frame) | ||
| * | ... | | ||
| * 0(%rsp) ->| variable size | | ||
| * |--------------------------| | ||
| * -128(%rsp) ->| reserved for function | | ||
| * |--------------------------| | ||
| * | ||
| * The end of the input argument area must be aligned on a 16-byte | ||
| * boundary; i.e. (%rsp - 8) % 16 == 0 at function entry. | ||
| * | ||
| * The 128-byte location beyond %rsp is considered to be reserved for | ||
| * functions and is NOT modified by signal handlers. It can be used | ||
| * to store temporary data that is not needed across function calls. | ||
| */ | ||
|
|
||
| /* | ||
| * Stack alignment macros. | ||
| */ | ||
|
|
||
| #define STACK_ALIGN64 16 | ||
| #define STACK_ENTRY_ALIGN64 8 | ||
| #define STACK_BIAS64 0 | ||
| #define SA64(x) (((x)+(STACK_ALIGN64-1)) & ~(STACK_ALIGN64-1)) | ||
| #define STACK_RESERVE64 128 | ||
| #define MINFRAME64 0 | ||
|
|
||
| #define STACK_ALIGN STACK_ALIGN64 | ||
| #define STACK_ENTRY_ALIGN STACK_ENTRY_ALIGN64 | ||
| #define STACK_BIAS STACK_BIAS64 | ||
| #define SA(x) SA64(x) | ||
| #define STACK_RESERVE STACK_RESERVE64 | ||
| #define MINFRAME MINFRAME64 | ||
|
|
||
| #elif defined(__i386) | ||
|
|
||
| #define STACK_ALIGN STACK_ALIGN32 | ||
| #define STACK_ENTRY_ALIGN STACK_ENTRY_ALIGN32 | ||
| #define STACK_BIAS STACK_BIAS32 | ||
| #define SA(x) SA32(x) | ||
| #define STACK_RESERVE STACK_RESERVE32 | ||
| #define MINFRAME MINFRAME32 | ||
|
|
||
| #endif /* __i386 */ | ||
|
|
||
| #if defined(_KERNEL) && !defined(_ASM) | ||
|
|
||
| #if defined(DEBUG) | ||
| #if STACK_ALIGN == 4 | ||
| #define ASSERT_STACK_ALIGNED() \ | ||
| { \ | ||
| uint32_t __tmp; \ | ||
| ASSERT((((uintptr_t)&__tmp) & (STACK_ALIGN - 1)) == 0); \ | ||
| } | ||
| #elif (STACK_ALIGN == 16) && (_LONG_DOUBLE_ALIGNMENT == 16) | ||
| #define ASSERT_STACK_ALIGNED() \ | ||
| { \ | ||
| long double __tmp; \ | ||
| ASSERT((((uintptr_t)&__tmp) & (STACK_ALIGN - 1)) == 0); \ | ||
| } | ||
| #endif | ||
| #else /* DEBUG */ | ||
| #define ASSERT_STACK_ALIGNED() | ||
| #endif /* DEBUG */ | ||
|
|
||
| struct regs; | ||
|
|
||
| void traceregs(struct regs *); | ||
| void traceback(caddr_t); | ||
|
|
||
| #endif /* defined(_KERNEL) && !defined(_ASM) */ | ||
|
|
||
| #define STACK_GROWTH_DOWN /* stacks grow from high to low addresses */ | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _IA32_SYS_STACK_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,107 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */ | ||
| /* Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T */ | ||
| /* All Rights Reserved */ | ||
|
|
||
| /* | ||
| * Copyright 2006 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _IA32_SYS_TRAP_H | ||
| #define _IA32_SYS_TRAP_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| /* | ||
| * Trap type values | ||
| */ | ||
|
|
||
| #define T_ZERODIV 0x0 /* #de divide by 0 error */ | ||
| #define T_SGLSTP 0x1 /* #db single step */ | ||
| #define T_NMIFLT 0x2 /* NMI */ | ||
| #define T_BPTFLT 0x3 /* #bp breakpoint fault, INT3 insn */ | ||
| #define T_OVFLW 0x4 /* #of INTO overflow fault */ | ||
| #define T_BOUNDFLT 0x5 /* #br BOUND insn fault */ | ||
| #define T_ILLINST 0x6 /* #ud invalid opcode fault */ | ||
| #define T_NOEXTFLT 0x7 /* #nm device not available: x87 */ | ||
| #define T_DBLFLT 0x8 /* #df double fault */ | ||
| #define T_EXTOVRFLT 0x9 /* [not generated: 386 only] */ | ||
| #define T_TSSFLT 0xa /* #ts invalid TSS fault */ | ||
| #define T_SEGFLT 0xb /* #np segment not present fault */ | ||
| #define T_STKFLT 0xc /* #ss stack fault */ | ||
| #define T_GPFLT 0xd /* #gp general protection fault */ | ||
| #define T_PGFLT 0xe /* #pf page fault */ | ||
| #define T_EXTERRFLT 0x10 /* #mf x87 FPU error fault */ | ||
| #define T_ALIGNMENT 0x11 /* #ac alignment check error */ | ||
| #define T_MCE 0x12 /* #mc machine check exception */ | ||
| #define T_SIMDFPE 0x13 /* #xm SSE/SSE exception */ | ||
| #define T_DBGENTR 0x14 /* debugger entry */ | ||
| #define T_ENDPERR 0x21 /* emulated extension error flt */ | ||
| #define T_ENOEXTFLT 0x20 /* emulated ext not present */ | ||
| #define T_FASTTRAP 0xd2 /* fast system call */ | ||
| #define T_SYSCALLINT 0x91 /* general system call */ | ||
| #define T_DTRACE_RET 0x7f /* DTrace pid return */ | ||
| #define T_INT80 0x80 /* int80 handler for linux emulation */ | ||
| #define T_SOFTINT 0x50fd /* pseudo softint trap type */ | ||
|
|
||
| /* | ||
| * Pseudo traps. | ||
| */ | ||
| #define T_INTERRUPT 0x100 | ||
| #define T_FAULT 0x200 | ||
| #define T_AST 0x400 | ||
| #define T_SYSCALL 0x180 | ||
|
|
||
|
|
||
| /* | ||
| * Values of error code on stack in case of page fault | ||
| */ | ||
|
|
||
| #define PF_ERR_MASK 0x01 /* Mask for error bit */ | ||
| #define PF_ERR_PAGE 0x00 /* page not present */ | ||
| #define PF_ERR_PROT 0x01 /* protection error */ | ||
| #define PF_ERR_WRITE 0x02 /* fault caused by write (else read) */ | ||
| #define PF_ERR_USER 0x04 /* processor was in user mode */ | ||
| /* (else supervisor) */ | ||
| #define PF_ERR_EXEC 0x10 /* attempt to execute a No eXec page (AMD) */ | ||
|
|
||
| /* | ||
| * Definitions for fast system call subfunctions | ||
| */ | ||
| #define T_FNULL 0 /* Null trap for testing */ | ||
| #define T_FGETFP 1 /* Get emulated FP context */ | ||
| #define T_FSETFP 2 /* Set emulated FP context */ | ||
| #define T_GETHRTIME 3 /* Get high resolution time */ | ||
| #define T_GETHRVTIME 4 /* Get high resolution virtual time */ | ||
| #define T_GETHRESTIME 5 /* Get high resolution time */ | ||
| #define T_GETLGRP 6 /* Get home lgrpid */ | ||
|
|
||
| #define T_LASTFAST 6 /* Last valid subfunction */ | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _IA32_SYS_TRAP_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,147 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2008 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SYS_MODHASH_H | ||
| #define _SYS_MODHASH_H | ||
|
|
||
| /* | ||
| * Generic hash implementation for the kernel. | ||
| */ | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #include <sys/zfs_context.h> | ||
|
|
||
| /* | ||
| * Opaque data types for storing keys and values | ||
| */ | ||
| typedef void *mod_hash_val_t; | ||
| typedef void *mod_hash_key_t; | ||
|
|
||
| /* | ||
| * Opaque data type for reservation | ||
| */ | ||
| typedef void *mod_hash_hndl_t; | ||
|
|
||
| /* | ||
| * Opaque type for hash itself. | ||
| */ | ||
| struct mod_hash; | ||
| typedef struct mod_hash mod_hash_t; | ||
|
|
||
| /* | ||
| * String hash table | ||
| */ | ||
| mod_hash_t *mod_hash_create_strhash_nodtr(char *, size_t, | ||
| void (*)(mod_hash_val_t)); | ||
| mod_hash_t *mod_hash_create_strhash(char *, size_t, void (*)(mod_hash_val_t)); | ||
| void mod_hash_destroy_strhash(mod_hash_t *); | ||
| int mod_hash_strkey_cmp(mod_hash_key_t, mod_hash_key_t); | ||
| void mod_hash_strkey_dtor(mod_hash_key_t); | ||
| void mod_hash_strval_dtor(mod_hash_val_t); | ||
| uint_t mod_hash_bystr(void *, mod_hash_key_t); | ||
|
|
||
| /* | ||
| * Pointer hash table | ||
| */ | ||
| mod_hash_t *mod_hash_create_ptrhash(char *, size_t, void (*)(mod_hash_val_t), | ||
| size_t); | ||
| void mod_hash_destroy_ptrhash(mod_hash_t *); | ||
| int mod_hash_ptrkey_cmp(mod_hash_key_t, mod_hash_key_t); | ||
| uint_t mod_hash_byptr(void *, mod_hash_key_t); | ||
|
|
||
| /* | ||
| * ID hash table | ||
| */ | ||
| mod_hash_t *mod_hash_create_idhash(char *, size_t, void (*)(mod_hash_val_t)); | ||
| void mod_hash_destroy_idhash(mod_hash_t *); | ||
| int mod_hash_idkey_cmp(mod_hash_key_t, mod_hash_key_t); | ||
| uint_t mod_hash_byid(void *, mod_hash_key_t); | ||
| uint_t mod_hash_iddata_gen(size_t); | ||
|
|
||
| /* | ||
| * Hash management functions | ||
| */ | ||
| mod_hash_t *mod_hash_create_extended(char *, size_t, void (*)(mod_hash_key_t), | ||
| void (*)(mod_hash_val_t), uint_t (*)(void *, mod_hash_key_t), void *, | ||
| int (*)(mod_hash_key_t, mod_hash_key_t), int); | ||
|
|
||
| void mod_hash_destroy_hash(mod_hash_t *); | ||
| void mod_hash_clear(mod_hash_t *); | ||
|
|
||
| /* | ||
| * Null key and value destructors | ||
| */ | ||
| void mod_hash_null_keydtor(mod_hash_key_t); | ||
| void mod_hash_null_valdtor(mod_hash_val_t); | ||
|
|
||
| /* | ||
| * Basic hash operations | ||
| */ | ||
|
|
||
| /* | ||
| * Error codes for insert, remove, find, destroy. | ||
| */ | ||
| #define MH_ERR_NOMEM -1 | ||
| #define MH_ERR_DUPLICATE -2 | ||
| #define MH_ERR_NOTFOUND -3 | ||
|
|
||
| /* | ||
| * Return codes for hash walkers | ||
| */ | ||
| #define MH_WALK_CONTINUE 0 | ||
| #define MH_WALK_TERMINATE 1 | ||
|
|
||
| /* | ||
| * Basic hash operations | ||
| */ | ||
| int mod_hash_insert(mod_hash_t *, mod_hash_key_t, mod_hash_val_t); | ||
| int mod_hash_replace(mod_hash_t *, mod_hash_key_t, mod_hash_val_t); | ||
| int mod_hash_remove(mod_hash_t *, mod_hash_key_t, mod_hash_val_t *); | ||
| int mod_hash_destroy(mod_hash_t *, mod_hash_key_t); | ||
| int mod_hash_find(mod_hash_t *, mod_hash_key_t, mod_hash_val_t *); | ||
| int mod_hash_find_cb(mod_hash_t *, mod_hash_key_t, mod_hash_val_t *, | ||
| void (*)(mod_hash_key_t, mod_hash_val_t)); | ||
| int mod_hash_find_cb_rval(mod_hash_t *, mod_hash_key_t, mod_hash_val_t *, | ||
| int (*)(mod_hash_key_t, mod_hash_val_t), int *); | ||
| void mod_hash_walk(mod_hash_t *, | ||
| uint_t (*)(mod_hash_key_t, mod_hash_val_t *, void *), void *); | ||
|
|
||
| /* | ||
| * Reserving hash operations | ||
| */ | ||
| int mod_hash_reserve(mod_hash_t *, mod_hash_hndl_t *); | ||
| int mod_hash_reserve_nosleep(mod_hash_t *, mod_hash_hndl_t *); | ||
| void mod_hash_cancel(mod_hash_t *, mod_hash_hndl_t *); | ||
| int mod_hash_insert_reserve(mod_hash_t *, mod_hash_key_t, mod_hash_val_t, | ||
| mod_hash_hndl_t); | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SYS_MODHASH_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,108 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License (the "License"). | ||
| * You may not use this file except in compliance with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2006 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SYS_MODHASH_IMPL_H | ||
| #define _SYS_MODHASH_IMPL_H | ||
|
|
||
| /* | ||
| * Internal details for the kernel's generic hash implementation. | ||
| */ | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #include <sys/zfs_context.h> | ||
| #include <sys/modhash.h> | ||
|
|
||
| struct mod_hash_entry { | ||
| mod_hash_key_t mhe_key; /* stored hash key */ | ||
| mod_hash_val_t mhe_val; /* stored hash value */ | ||
| struct mod_hash_entry *mhe_next; /* next item in chain */ | ||
| }; | ||
|
|
||
| struct mod_hash_stat { | ||
| ulong_t mhs_hit; /* tried a 'find' and it succeeded */ | ||
| ulong_t mhs_miss; /* tried a 'find' but it failed */ | ||
| ulong_t mhs_coll; /* occur when insert fails because of dup's */ | ||
| ulong_t mhs_nelems; /* total number of stored key/value pairs */ | ||
| ulong_t mhs_nomem; /* number of times kmem_alloc failed */ | ||
| }; | ||
|
|
||
| struct mod_hash { | ||
| krwlock_t mh_contents; /* lock protecting contents */ | ||
| char *mh_name; /* hash name */ | ||
| int mh_sleep; /* kmem_alloc flag */ | ||
| size_t mh_nchains; /* # of elements in mh_entries */ | ||
|
|
||
| /* key and val destructor */ | ||
| void (*mh_kdtor)(mod_hash_key_t); | ||
| void (*mh_vdtor)(mod_hash_val_t); | ||
|
|
||
| /* key comparator */ | ||
| int (*mh_keycmp)(mod_hash_key_t, mod_hash_key_t); | ||
|
|
||
| /* hash algorithm, and algorithm-private data */ | ||
| uint_t (*mh_hashalg)(void *, mod_hash_key_t); | ||
| void *mh_hashalg_data; | ||
|
|
||
| struct mod_hash *mh_next; /* next hash in list */ | ||
|
|
||
| struct mod_hash_stat mh_stat; | ||
|
|
||
| struct mod_hash_entry *mh_entries[1]; | ||
| }; | ||
|
|
||
| /* | ||
| * MH_SIZE() | ||
| * Compute the size of a mod_hash_t, in bytes, given the number of | ||
| * elements it contains. | ||
| */ | ||
| #define MH_SIZE(n) \ | ||
| (sizeof (mod_hash_t) + ((n) - 1) * (sizeof (struct mod_hash_entry *))) | ||
|
|
||
| /* | ||
| * Module initialization; called once. | ||
| */ | ||
| void mod_hash_fini(void); | ||
| void mod_hash_init(void); | ||
|
|
||
| /* | ||
| * Internal routines. Use directly with care. | ||
| */ | ||
| uint_t i_mod_hash(mod_hash_t *, mod_hash_key_t); | ||
| int i_mod_hash_insert_nosync(mod_hash_t *, mod_hash_key_t, mod_hash_val_t, | ||
| mod_hash_hndl_t); | ||
| int i_mod_hash_remove_nosync(mod_hash_t *, mod_hash_key_t, mod_hash_val_t *); | ||
| int i_mod_hash_find_nosync(mod_hash_t *, mod_hash_key_t, mod_hash_val_t *); | ||
| void i_mod_hash_walk_nosync(mod_hash_t *, uint_t (*)(mod_hash_key_t, | ||
| mod_hash_val_t *, void *), void *); | ||
| void i_mod_hash_clear_nosync(mod_hash_t *hash); | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _SYS_MODHASH_IMPL_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License, Version 1.0 only | ||
| * (the "License"). You may not use this file except in compliance | ||
| * with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2005 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SYS_STACK_H | ||
| #define _SYS_STACK_H | ||
|
|
||
| #if defined(__i386) || defined(__amd64) | ||
|
|
||
| #include <sys/ia32/stack.h> /* XX64 x86/sys/stack.h */ | ||
|
|
||
| #endif | ||
|
|
||
| #endif /* _SYS_STACK_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| /* | ||
| * CDDL HEADER START | ||
| * | ||
| * The contents of this file are subject to the terms of the | ||
| * Common Development and Distribution License, Version 1.0 only | ||
| * (the "License"). You may not use this file except in compliance | ||
| * with the License. | ||
| * | ||
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
| * or http://www.opensolaris.org/os/licensing. | ||
| * See the License for the specific language governing permissions | ||
| * and limitations under the License. | ||
| * | ||
| * When distributing Covered Code, include this CDDL HEADER in each | ||
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
| * If applicable, add the following below this CDDL HEADER, with the | ||
| * fields enclosed by brackets "[]" replaced with your own identifying | ||
| * information: Portions Copyright [yyyy] [name of copyright owner] | ||
| * | ||
| * CDDL HEADER END | ||
| */ | ||
| /* | ||
| * Copyright 2005 Sun Microsystems, Inc. All rights reserved. | ||
| * Use is subject to license terms. | ||
| */ | ||
|
|
||
| #ifndef _SYS_TRAP_H | ||
| #define _SYS_TRAP_H | ||
|
|
||
| #if defined(__i386) || defined(__amd64) | ||
|
|
||
| #include <sys/ia32/trap.h> /* XX64 x86/sys/trap.h */ | ||
|
|
||
| #endif | ||
|
|
||
| #endif /* _SYS_TRAP_H */ |