diff src/os_cpu/windows_x86/vm/os_windows_x86.cpp @ 5903:da4be62fb889

7147740: add assertions to check stack alignment on VM entry from generated code (x64) Summary: check stack alignment on VM entry on x64. Reviewed-by: kvn, never
author roland
date Mon, 27 Feb 2012 09:17:44 +0100
parents 828eafbd85cc
children 957c266d8bc5 716e6ef4482a
line wrap: on
line diff
--- a/src/os_cpu/windows_x86/vm/os_windows_x86.cpp	Fri Feb 24 12:33:31 2012 -0800
+++ b/src/os_cpu/windows_x86/vm/os_windows_x86.cpp	Mon Feb 27 09:17:44 2012 +0100
@@ -370,6 +370,26 @@
   return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
 }
 
+#ifndef AMD64
+// Returns an estimate of the current stack pointer. Result must be guaranteed
+// to point into the calling threads stack, and be no lower than the current
+// stack pointer.
+address os::current_stack_pointer() {
+  int dummy;
+  address sp = (address)&dummy;
+  return sp;
+}
+#else
+// Returns the current stack pointer. Accurate value needed for
+// os::verify_stack_alignment().
+address os::current_stack_pointer() {
+  typedef address get_sp_func();
+  get_sp_func* func = CAST_TO_FN_PTR(get_sp_func*,
+                                     StubRoutines::x86::get_previous_sp_entry());
+  return (*func)();
+}
+#endif
+
 
 #ifndef AMD64
 intptr_t* _get_previous_fp() {
@@ -546,3 +566,11 @@
   __asm fldcw fpu_cntrl_word;
 #endif // !AMD64
 }
+
+#ifndef PRODUCT
+void os::verify_stack_alignment() {
+#ifdef AMD64
+  assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment");
+#endif
+}
+#endif