#include #include #include #include #define JSW_PADDING 2*1024*1024 #define C_Stack_Direction 1 extern void * __libc_stack_end; #if defined(NO_OPT) #pragma GCC push_options #pragma GCC optimize ("O0") #endif #if defined(NO_RETURN) # define RinitJVM_with_padding_RETURN(RVAL) { RVAL; } void #else # define RinitJVM_with_padding_RETURN(RVAL) { return RVAL; } intptr_t #endif RinitJVM_with_padding( char *dumdum, intptr_t padding, char *last ) { intptr_t dp; char dummy[1]; dummy[0] = (char)(uintptr_t)&dummy; padding -= (dp = (last - dummy) * C_Stack_Direction); #if !defined(NO_PRINTF) printf("%p %p: padding = %p ; dp = %p\n", __builtin_frame_address(0), dummy, padding, dp); #endif if ( padding > 0 ) RinitJVM_with_padding_RETURN( RinitJVM_with_padding(dumdum, padding, dummy) ) else RinitJVM_with_padding_RETURN( (uintptr_t)dummy ); } #if defined(NO_OPT) #pragma GCC pop_options #endif int main() { char dummy[1], dummy2[45]; uintptr_t R_CStackStart = (uintptr_t) __libc_stack_end; intptr_t R_CStackLimit = 8192 * 1024; intptr_t padding = 0; { int dummy; intptr_t usage = (R_CStackStart - (uintptr_t)&dummy); usage += JSW_PADDING + 512; /* 512 is a buffer for C recursive calls */ if(R_CStackLimit == -1 || usage < ((intptr_t) R_CStackLimit)) padding = JSW_PADDING; } /* reduce the risk that dummy will be optimized out */ dummy[0] = (char) (uintptr_t) &dummy; printf("padding = %p\n", padding); #if defined(NO_RETURN) RinitJVM_with_padding(dummy, padding, dummy); #else padding = RinitJVM_with_padding(dummy, padding, dummy); printf("FINAL: %p - %p = %p\n", dummy, padding, (intptr_t)dummy - padding); #endif return 0; }