ref: 8294be6e7c9032e3c472018b53154d5b4faec00c
parent: d09cf07a82cf4ffb846a31d0384e774b4c4661e1
author: henesy <devnull@localhost>
date: Sat Feb 29 11:23:23 EST 2020
merge bea7f0cc7c9cdd883340c80697abc0be028bf944
--- a/emu/port/alloc.c
+++ b/emu/port/alloc.c
@@ -75,11 +75,7 @@
/* tracing */
enum {
-#ifdef __NetBSD__
- Npadlong = 4, /* XXX: preserve 16-byte alignment */
-#else
Npadlong = 2,
-#endif
MallocOffset = 0,
ReallocOffset = 1
};
@@ -383,9 +379,22 @@
unlock(&p->l);
return nil;
}
+#ifdef __NetBSD__
+ /* Align allocations to 16 bytes */
+ {
+ const size_t off = __builtin_offsetof(struct Bhdr, u.data)
+ + Npadlong*sizeof(ulong);
+ struct assert_align {
+ unsigned int align_ok : (off % 8 == 0) ? 1 : -1;
+ };
+
+ const ulong align = (off - 1) % 16;
+ t = (Bhdr *)(((ulong)t + align) & ~align);
+ }
+#else
/* Double alignment */
t = (Bhdr *)(((ulong)t + 7) & ~7);
-
+#endif
if(p->chain != nil && (char*)t-(char*)B2LIMIT(p->chain)-ldr == 0){
/* can merge chains */
if(0)print("merging chains %p and %p in %s\n", p->chain, t, p->name);