Blame cbits/cryptonite_align.h

Packit 141393
#ifndef CRYPTONITE_ALIGN_H
Packit 141393
#define CRYPTONITE_ALIGN_H
Packit 141393
Packit 141393
#include "cryptonite_bitfn.h"
Packit 141393
Packit 141393
#if (defined(__i386__))
Packit 141393
# define UNALIGNED_ACCESS_OK
Packit 141393
#elif defined(__x86_64__)
Packit 141393
# define UNALIGNED_ACCESS_OK
Packit 141393
#else
Packit 141393
# define UNALIGNED_ACCESS_FAULT
Packit 141393
#endif
Packit 141393
Packit 141393
/* n need to be power of 2.
Packit 141393
 * IS_ALIGNED(p,8) */
Packit 141393
#define IS_ALIGNED(p,alignment) (((uintptr_t) (p)) & ((alignment)-1))
Packit 141393
Packit 141393
#ifdef WITH_ASSERT_ALIGNMENT
Packit 141393
#include <stdio.h>
Packit 141393
#include <stdlib.h>
Packit 141393
#include <inttypes.h>
Packit 141393
# define ASSERT_ALIGNMENT(up, alignment) \
Packit 141393
	do { if (IS_ALIGNED(up, alignment)) \
Packit 141393
	{ printf("ALIGNMENT-ASSERT-FAILURE: %s:%d: ptr=%p alignment=%d\n", __FILE__, __LINE__, (void *) up, (alignment)); \
Packit 141393
	  exit(99); \
Packit 141393
	}; } while (0)
Packit 141393
#else
Packit 141393
# define ASSERT_ALIGNMENT(p, n) do {} while (0)
Packit 141393
#endif
Packit 141393
Packit 141393
#ifdef UNALIGNED_ACCESS_OK
Packit 141393
#define need_alignment(p,n) (0)
Packit 141393
#else
Packit 141393
#define need_alignment(p,n) IS_ALIGNED(p,n)
Packit 141393
#endif
Packit 141393
Packit 141393
static inline uint32_t load_le32_aligned(const uint8_t *p)
Packit 141393
{
Packit 141393
	return le32_to_cpu(*((uint32_t *) p));		
Packit 141393
}
Packit 141393
Packit 141393
static inline void store_le32_aligned(uint8_t *dst, const uint32_t v)
Packit 141393
{
Packit 141393
	*((uint32_t *) dst) = cpu_to_le32(v);
Packit 141393
}
Packit 141393
Packit 141393
static inline void store_be32_aligned(uint8_t *dst, const uint32_t v)
Packit 141393
{
Packit 141393
	*((uint32_t *) dst) = cpu_to_be32(v);
Packit 141393
}
Packit 141393
Packit 141393
static inline void store_le64_aligned(uint8_t *dst, const uint64_t v)
Packit 141393
{
Packit 141393
	*((uint64_t *) dst) = cpu_to_le64(v);
Packit 141393
}
Packit 141393
Packit 141393
static inline void store_be64_aligned(uint8_t *dst, const uint64_t v)
Packit 141393
{
Packit 141393
	*((uint64_t *) dst) = cpu_to_be64(v);
Packit 141393
}
Packit 141393
Packit 141393
#ifdef UNALIGNED_ACCESS_OK
Packit 141393
#define load_le32(a) load_le32_aligned(a)
Packit 141393
#else
Packit 141393
static inline uint32_t load_le32(const uint8_t *p)
Packit 141393
{
Packit 141393
	return ((uint32_t)p[0]) | ((uint32_t)p[1] <<  8) | ((uint32_t)p[2] << 16) | ((uint32_t)p[3] << 24);
Packit 141393
}
Packit 141393
#endif
Packit 141393
Packit 141393
#ifdef UNALIGNED_ACCESS_OK
Packit 141393
#define store_le32(a, b) store_le32_aligned(a, b)
Packit 141393
#else
Packit 141393
static inline void store_le32(uint8_t *dst, const uint32_t v)
Packit 141393
{
Packit 141393
	dst[0] = v; dst[1] = v >> 8; dst[2] = v >> 16; dst[3] = v >> 24;
Packit 141393
}
Packit 141393
#endif
Packit 141393
Packit 141393
#ifdef UNALIGNED_ACCESS_OK
Packit 141393
#define store_be32(a, b) store_be32_aligned(a, b)
Packit 141393
#else
Packit 141393
static inline void store_be32(uint8_t *dst, const uint32_t v)
Packit 141393
{
Packit 141393
	dst[3] = v; dst[2] = v >> 8; dst[1] = v >> 16; dst[0] = v >> 24;
Packit 141393
}
Packit 141393
#endif
Packit 141393
Packit 141393
#ifdef UNALIGNED_ACCESS_OK
Packit 141393
#define store_le64(a, b) store_le64_aligned(a, b)
Packit 141393
#else
Packit 141393
static inline void store_le64(uint8_t *dst, const uint64_t v)
Packit 141393
{
Packit 141393
	dst[0] = v      ; dst[1] = v >> 8 ; dst[2] = v >> 16; dst[3] = v >> 24;
Packit 141393
	dst[4] = v >> 32; dst[5] = v >> 40; dst[6] = v >> 48; dst[7] = v >> 56;
Packit 141393
}
Packit 141393
#endif
Packit 141393
Packit 141393
#ifdef UNALIGNED_ACCESS_OK
Packit 141393
#define store_be64(a, b) store_be64_aligned(a, b)
Packit 141393
#else
Packit 141393
static inline void store_be64(uint8_t *dst, const uint64_t v)
Packit 141393
{
Packit 141393
	dst[7] = v      ; dst[6] = v >> 8 ; dst[5] = v >> 16; dst[4] = v >> 24;
Packit 141393
	dst[3] = v >> 32; dst[2] = v >> 40; dst[1] = v >> 48; dst[0] = v >> 56;
Packit 141393
}
Packit 141393
#endif
Packit 141393
Packit 141393
#endif