diff options
author | Sverker Eriksson <[email protected]> | 2015-05-26 20:12:08 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2015-06-01 19:44:15 +0200 |
commit | 957f619382923be72835500f56e75d8bbe553892 (patch) | |
tree | 6c2c555083d48c8342dd31ec01c8ef239f448538 /erts/emulator/beam/erl_bits.c | |
parent | 9c34c2544981ff2df6ddf94b36f4a9db5d6da6b5 (diff) | |
download | otp-957f619382923be72835500f56e75d8bbe553892.tar.gz otp-957f619382923be72835500f56e75d8bbe553892.tar.bz2 otp-957f619382923be72835500f56e75d8bbe553892.zip |
erts: Fix magic binary alignment on 32-bit
Caused bus error on 32-bit sparc from unaligned 64-bit word in
binary_to_term trap context.
Also add _UNALIGNED_ magic macros to avoid double alignment padding
in NIF resources.
Diffstat (limited to 'erts/emulator/beam/erl_bits.c')
-rw-r--r-- | erts/emulator/beam/erl_bits.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_bits.c b/erts/emulator/beam/erl_bits.c index b8ae93fa58..2e29bf8895 100644 --- a/erts/emulator/beam/erl_bits.c +++ b/erts/emulator/beam/erl_bits.c @@ -107,6 +107,14 @@ erts_bits_destroy_state(ERL_BITS_PROTO_0) void erts_init_bits(void) { + ERTS_CT_ASSERT(offsetof(Binary,orig_bytes) % 8 == 0); + ERTS_CT_ASSERT(offsetof(ErtsMagicBinary,u.aligned.data) % 8 == 0); + ERTS_CT_ASSERT(ERTS_MAGIC_BIN_BYTES_TO_ALIGN == + (offsetof(ErtsMagicBinary,u.aligned.data) + - offsetof(ErtsMagicBinary,u.unaligned.data))); + ERTS_CT_ASSERT(offsetof(ErtsBinary,driver.binary.orig_bytes) + == offsetof(Binary,orig_bytes)); + erts_smp_atomic_init_nob(&bits_bufs_size, 0); #if defined(ERTS_SMP) /* erl_process.c calls erts_bits_init_state() on all state instances */ |