--- /sys/src/9/vt4/fns.h Thu May 29 00:00:00 2014 +++ /sys/src/9/vt4/fns.h Thu May 29 00:00:00 2014 @@ -44,7 +44,6 @@ void dump(void *, int); void eieio(void); void etherclock(void); -void evenaddr(uintptr); void fifoinit(Ether *); void firmware(int); int fpipower(Ureg*); @@ -169,6 +168,7 @@ void uncinit(void); void uncinitwait(void); #define userureg(ur) (((ur)->status & MSR_PR) != 0) +void validalign(uintptr, unsigned); void verifyproc(Proc *); void verifymach(Mach *); #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) --- /sys/src/9/vt4/syscall.c Thu May 29 00:00:00 2014 +++ /sys/src/9/vt4/syscall.c Thu May 29 00:00:00 2014 @@ -275,15 +275,32 @@ } /* - * called in sysfile.c + * called in syscallfmt.c, sysfile.c, sysproc.c */ void -evenaddr(uintptr addr) +validalign(uintptr addr, unsigned align) { - if(addr & (sizeof(uintptr)-1)){ - postnote(up, 1, "sys: misaligned address", NDebug); - error(Ebadarg); - } + /* + * Plan 9 is a 32-bit O/S, and the hardware it runs on + * does not usually have instructions which move 64-bit + * quantities directly, synthesizing the operations + * with 32-bit move instructions. Therefore, the compiler + * (and hardware) usually only enforce 32-bit alignment, + * if at all. + * + * Take this out if the architecture warrants it. + */ + if(align == sizeof(vlong)) + align = sizeof(long); + + /* + * Check align is a power of 2, then addr alignment. + */ + if((align != 0 && !(align & (align-1))) && !(addr & (align-1))) + return; + postnote(up, 1, "sys: odd address", NDebug); + error(Ebadarg); + /*NOTREACHED*/ } uintptr --- /sys/src/9/vt5/fns.h Thu May 29 00:00:00 2014 +++ /sys/src/9/vt5/fns.h Thu May 29 00:00:00 2014 @@ -47,7 +47,6 @@ void dump(void *, int); void eieio(void); void etherclock(void); -void evenaddr(uintptr); void fifoinit(Ether *); void firmware(int); int fpipower(Ureg*); @@ -184,6 +183,7 @@ void uncinit(void); void uncinitwait(void); #define userureg(ur) (((ur)->status & MSR_PR) != 0) +void validalign(uintptr, unsigned); void verifyproc(Proc *); void verifymach(Mach *); #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1]))