summaryrefslogtreecommitdiff
path: root/emu/port/alloc.c
diff options
context:
space:
mode:
authorValery Ushakov <uwe@stderr.spb.ru>2019-12-19 14:01:01 +0300
committerValery Ushakov <uwe@stderr.spb.ru>2019-12-19 14:01:01 +0300
commitbea7f0cc7c9cdd883340c80697abc0be028bf944 (patch)
treedfb79de7a9b950f38e48a57d939f5092bc212cc3 /emu/port/alloc.c
parent258f4974aca51f197616058e11774242ce91b21d (diff)
Properly ensure 16-byte alignment on NetBSD.
Diffstat (limited to 'emu/port/alloc.c')
-rw-r--r--emu/port/alloc.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/emu/port/alloc.c b/emu/port/alloc.c
index 8b623de0..3cb45552 100644
--- a/emu/port/alloc.c
+++ b/emu/port/alloc.c
@@ -75,11 +75,7 @@ enum {
/* tracing */
enum {
-#ifdef __NetBSD__
- Npadlong = 4, /* XXX: preserve 16-byte alignment */
-#else
Npadlong = 2,
-#endif
MallocOffset = 0,
ReallocOffset = 1
};
@@ -383,9 +379,22 @@ dopoolalloc(Pool *p, ulong asize, ulong pc)
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);