*: deinline SWAP_xE64 on 32-bit CPUs. Wins !90 bytes both on 32 and 64 bits
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
parent
b102e12253
commit
9ff50b8697
@ -37,8 +37,6 @@
|
||||
#include <termios.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
/* Try to pull in PATH_MAX */
|
||||
#include <limits.h>
|
||||
#include <sys/param.h>
|
||||
#ifdef HAVE_MNTENT_H
|
||||
# include <mntent.h>
|
||||
@ -254,6 +252,11 @@ extern int *const bb_errno;
|
||||
#define errno (*bb_errno)
|
||||
#endif
|
||||
|
||||
#if !(ULONG_MAX > 0xffffffff)
|
||||
/* Only 32-bit CPUs need this, 64-bit ones use inlined version */
|
||||
uint64_t bb_bswap_64(uint64_t x) FAST_FUNC;
|
||||
#endif
|
||||
|
||||
unsigned long long monotonic_ns(void) FAST_FUNC;
|
||||
unsigned long long monotonic_us(void) FAST_FUNC;
|
||||
unsigned long long monotonic_ms(void) FAST_FUNC;
|
||||
|
@ -150,6 +150,7 @@
|
||||
|
||||
/* ---- Endian Detection ------------------------------------ */
|
||||
|
||||
#include <limits.h>
|
||||
#if defined(__digital__) && defined(__unix__)
|
||||
# include <sex.h>
|
||||
#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \
|
||||
@ -189,6 +190,10 @@
|
||||
# error "Can't determine endianness"
|
||||
#endif
|
||||
|
||||
#if ULONG_MAX > 0xffffffff
|
||||
# define bb_bswap_64(x) bswap_64(x)
|
||||
#endif
|
||||
|
||||
/* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */
|
||||
#if BB_BIG_ENDIAN
|
||||
# define SWAP_BE16(x) (x)
|
||||
@ -196,13 +201,13 @@
|
||||
# define SWAP_BE64(x) (x)
|
||||
# define SWAP_LE16(x) bswap_16(x)
|
||||
# define SWAP_LE32(x) bswap_32(x)
|
||||
# define SWAP_LE64(x) bswap_64(x)
|
||||
# define SWAP_LE64(x) bb_bswap_64(x)
|
||||
# define IF_BIG_ENDIAN(...) __VA_ARGS__
|
||||
# define IF_LITTLE_ENDIAN(...)
|
||||
#else
|
||||
# define SWAP_BE16(x) bswap_16(x)
|
||||
# define SWAP_BE32(x) bswap_32(x)
|
||||
# define SWAP_BE64(x) bswap_64(x)
|
||||
# define SWAP_BE64(x) bb_bswap_64(x)
|
||||
# define SWAP_LE16(x) (x)
|
||||
# define SWAP_LE32(x) (x)
|
||||
# define SWAP_LE64(x) (x)
|
||||
|
@ -14,6 +14,7 @@ lib-y += appletlib.o
|
||||
lib-y += ask_confirmation.o
|
||||
lib-y += bb_askpass.o
|
||||
lib-y += bb_basename.o
|
||||
lib-y += bb_bswap_64.o
|
||||
lib-y += bb_do_delay.o
|
||||
lib-y += bb_pwd.o
|
||||
lib-y += bb_qsort.o
|
||||
|
16
libbb/bb_bswap_64.c
Normal file
16
libbb/bb_bswap_64.c
Normal file
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Utility routines.
|
||||
*
|
||||
* Copyright (C) 2010 Denys Vlasenko
|
||||
*
|
||||
* Licensed under GPLv2, see file LICENSE in this source tree.
|
||||
*/
|
||||
|
||||
#include "libbb.h"
|
||||
|
||||
#if !(ULONG_MAX > 0xffffffff)
|
||||
uint64_t FAST_FUNC bb_bswap_64(uint64_t x)
|
||||
{
|
||||
return bswap_64(x);
|
||||
}
|
||||
#endif
|
@ -51,16 +51,6 @@ static ALWAYS_INLINE uint64_t rotr64(uint64_t x, unsigned n)
|
||||
{
|
||||
return (x >> n) | (x << (64 - n));
|
||||
}
|
||||
#if BB_LITTLE_ENDIAN
|
||||
/* ALWAYS_INLINE below sometimes hurts code size, using plain inline: */
|
||||
static inline uint64_t hton64(uint64_t v)
|
||||
{
|
||||
return SWAP_BE64(v);
|
||||
}
|
||||
#else
|
||||
#define hton64(v) (v)
|
||||
#endif
|
||||
#define ntoh64(v) hton64(v)
|
||||
|
||||
|
||||
/* Some arch headers have conflicting defines */
|
||||
@ -274,7 +264,7 @@ static void FAST_FUNC sha512_process_block128(sha512_ctx_t *ctx)
|
||||
|
||||
/* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */
|
||||
for (t = 0; t < 16; ++t)
|
||||
W[t] = ntoh64(words[t]);
|
||||
W[t] = SWAP_BE64(words[t]);
|
||||
for (/*t = 16*/; t < 80; ++t)
|
||||
W[t] = R1(W[t - 2]) + W[t - 7] + R0(W[t - 15]) + W[t - 16];
|
||||
|
||||
@ -475,7 +465,7 @@ void FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf)
|
||||
if (remaining >= 8) {
|
||||
/* Store the 64-bit counter of bits in the buffer in BE format */
|
||||
uint64_t t = ctx->total64 << 3;
|
||||
t = hton64(t);
|
||||
t = SWAP_BE64(t);
|
||||
/* wbuffer is suitably aligned for this */
|
||||
*(uint64_t *) (&ctx->wbuffer[64 - 8]) = t;
|
||||
}
|
||||
@ -509,10 +499,10 @@ void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf)
|
||||
/* Store the 128-bit counter of bits in the buffer in BE format */
|
||||
uint64_t t;
|
||||
t = ctx->total64[0] << 3;
|
||||
t = hton64(t);
|
||||
t = SWAP_BE64(t);
|
||||
*(uint64_t *) (&ctx->wbuffer[128 - 8]) = t;
|
||||
t = (ctx->total64[1] << 3) | (ctx->total64[0] >> 61);
|
||||
t = hton64(t);
|
||||
t = SWAP_BE64(t);
|
||||
*(uint64_t *) (&ctx->wbuffer[128 - 16]) = t;
|
||||
}
|
||||
sha512_process_block128(ctx);
|
||||
@ -524,7 +514,7 @@ void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf)
|
||||
if (BB_LITTLE_ENDIAN) {
|
||||
unsigned i;
|
||||
for (i = 0; i < ARRAY_SIZE(ctx->hash); ++i)
|
||||
ctx->hash[i] = hton64(ctx->hash[i]);
|
||||
ctx->hash[i] = SWAP_BE64(ctx->hash[i]);
|
||||
}
|
||||
memcpy(resbuf, ctx->hash, sizeof(ctx->hash));
|
||||
}
|
||||
|
@ -6,17 +6,6 @@
|
||||
#include "dhcpd.h"
|
||||
#include "unicode.h"
|
||||
|
||||
#if BB_LITTLE_ENDIAN
|
||||
static inline uint64_t hton64(uint64_t v)
|
||||
{
|
||||
return SWAP_BE64(v);
|
||||
}
|
||||
#else
|
||||
#define hton64(v) (v)
|
||||
#endif
|
||||
#define ntoh64(v) hton64(v)
|
||||
|
||||
|
||||
int dumpleases_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||
int dumpleases_main(int argc UNUSED_PARAM, char **argv)
|
||||
{
|
||||
@ -54,7 +43,7 @@ int dumpleases_main(int argc UNUSED_PARAM, char **argv)
|
||||
/* "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 */
|
||||
|
||||
xread(fd, &written_at, sizeof(written_at));
|
||||
written_at = ntoh64(written_at);
|
||||
written_at = SWAP_BE64(written_at);
|
||||
curr = time(NULL);
|
||||
if (curr < written_at)
|
||||
written_at = curr; /* lease file from future! :) */
|
||||
|
@ -11,16 +11,6 @@
|
||||
#include "common.h"
|
||||
#include "dhcpd.h"
|
||||
|
||||
#if BB_LITTLE_ENDIAN
|
||||
static inline uint64_t hton64(uint64_t v)
|
||||
{
|
||||
return SWAP_BE64(v);
|
||||
}
|
||||
#else
|
||||
#define hton64(v) (v)
|
||||
#endif
|
||||
#define ntoh64(v) hton64(v)
|
||||
|
||||
/* on these functions, make sure your datatype matches */
|
||||
static int FAST_FUNC read_str(const char *line, void *arg)
|
||||
{
|
||||
@ -140,7 +130,7 @@ void FAST_FUNC write_leases(void)
|
||||
|
||||
curr = written_at = time(NULL);
|
||||
|
||||
written_at = hton64(written_at);
|
||||
written_at = SWAP_BE64(written_at);
|
||||
full_write(fd, &written_at, sizeof(written_at));
|
||||
|
||||
for (i = 0; i < server_config.max_leases; i++) {
|
||||
@ -190,7 +180,7 @@ void FAST_FUNC read_leases(const char *file)
|
||||
|
||||
if (full_read(fd, &written_at, sizeof(written_at)) != sizeof(written_at))
|
||||
goto ret;
|
||||
written_at = ntoh64(written_at);
|
||||
written_at = SWAP_BE64(written_at);
|
||||
|
||||
time_passed = time(NULL) - written_at;
|
||||
/* Strange written_at, or lease file from old version of udhcpd
|
||||
|
Loading…
Reference in New Issue
Block a user