diff options
| author | Valery Ushakov <uwe@stderr.spb.ru> | 2019-12-19 14:01:01 +0300 |
|---|---|---|
| committer | Valery Ushakov <uwe@stderr.spb.ru> | 2019-12-19 14:01:01 +0300 |
| commit | bea7f0cc7c9cdd883340c80697abc0be028bf944 (patch) | |
| tree | dfb79de7a9b950f38e48a57d939f5092bc212cc3 | |
| parent | 258f4974aca51f197616058e11774242ce91b21d (diff) | |
Properly ensure 16-byte alignment on NetBSD.
| -rw-r--r-- | emu/port/alloc.c | 19 |
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); |
