Mac OS X i486 ABI -- 16-byte stack alignment
Paul Hohensee
Paul.Hohensee at Sun.COM
Wed Nov 7 14:16:53 PST 2007
Take a look at the x64 code. The x64 ABI requires 16-byte alignment at
call sites. Compiler-generated code maintains 16-byte alignment at all
times, but the template interpreter doesn't, so calling out from it means
aligning the stack.
See, e.g., call_VM_base in assembler_x86_64.cpp.
Paul
Landon Fuller wrote:
> I've been working on getting the JDK running on Mac OS X Leopard /
> x86, based on the BSD's JDK16 porting work -- so far I've gotten
> 'Hello World' running, while anything more complex quickly runs into
> stack alignment issues -- Mac OS X's x86 calling conventions require a
> 16-byte aligned stack pointer at function entry.
>
> The first issue I've hit is alignment in the
> MacroAssembler::call_VM_base() code generation. It doesn't look like I
> can determine the current stack alignment within the call_VM()
> methods, and there's no gaurantee that the frame started 16-byte
> aligned, either. Given that, I was thinking that doing an alignment
> fixup in call_VM_base() might be a workable solution -- something like:
>
> /* Arguments */
> int argSize = arg_count * wordSize;
>
> pushl %esi ; save %esi, we'll use it to store the current sp
> movl %esp, %esi
> andl $-16, %esp ; force sp to a known (16-byte) alignment
> if (argSize & 15) {
> // Pad SP for alignment if the pushed args aren't going to
> leave us 16-byte aligned
> subl $((argSize + 15) & -16) - argSize, %esp;
> }
> ... push arguments ...
> call
> movl %esi, %esp ; restore pre-alignment sp
> popl %esi ; restore esi
>
> However, this means that call_VM_base() needs to push the arguments on
> to the stack itself, rather than relying on the call_VM()
> implementations to do so. Thus, I was thinking about modifying
> call_VM_base() to accept an arg array:
>
> virtual void call_VM_base( // returns the register
> containing the thread upon return
> Register oop_result, // where an oop-result ends up
> if any; use noreg otherwise
> Register java_thread, // the thread if computed
> before ; use noreg otherwise
> Register last_java_sp, // to set up last_Java_frame in
> stubs; use noreg otherwise
> address entry_point, // the entry point
> int number_of_arguments, // the number of arguments (w/o
> thread) to pop after the call
> Register args[], // call arguments,
> left-to-right ordered <-- NEW ARGUMENT
> bool check_exceptions // whether to check for pending
> exceptions after return
> );
>
> That way, call_VM can fixup the alignment, push the args, do the call,
> and restore esp.
>
> Thoughts, criticism, and suggestions are very much appreciated, as are
> suggestions on where else I should be worrying about stack alignment.
> This is the first I've looked at the hotspot code, so hopefully my
> evaluation is not completely off in the weeds.
>
> Thanks!
> -landonf
More information about the hotspot-dev
mailing list