NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: lib/39465: threads stack is not aligned properly for gcc on i386



On Saturday, at 13:00, David Holland wrote:
|   >  I do not remember all the details, but IIRC separating sp-- was
|   > the way to get it right (i.e. have the test program pass). I agree
|   > that this seemed/seems bogus to me as well... Couldn't it be
|   > because gcc assumes that the first variable on the stack is aligned
|   > on 16 bytes, handling the ret address differently?
|  
|  It could be any number of similar things... but it's important to
|  figure out what, or it'll probably break if something shifts around a
|  little.

Checking FreeBSD code, I found that they align the stack pointer _after_ the
"sp -= argc + 1", probably to prepare the stack for the upcoming function
calls, not for the very next one (that probably doesn't care, although it
should probably be 4 bytes aligned anyway).

This would be with current NetBSD code (i386) :
        sp  = (unsigned int *)((uintptr_t)ucp->uc_stack.ss_sp +
            ucp->uc_stack.ss_size);
        sp -= argc + 1;                 /* Make room for ret and args. */
        /* Align on 16 bytes boundary. */
        sp  = (unsigned int *)((uintptr_t)sp & ~0xf);

Or, if you're strict:
        sp  = (unsigned int *)((uintptr_t)ucp->uc_stack.ss_sp +
            ucp->uc_stack.ss_size);
        /* Align on word boundary. Required?? */
        sp  = (unsigned int *)((uintptr_t)sp & ~0x3);
        sp -= argc + 1;                 /* Make room for ret and args. */
        /* Align on 16 bytes boundary. */
        sp  = (unsigned int *)((uintptr_t)sp & ~0xf);

Does it make more sense like this? - apart from the fact that the ABI requires
4 bytes alignment only, of course, but that's another issue -

(I haven't tested).


Home | Main Index | Thread Index | Old Index