23 * |
23 * |
24 */ |
24 */ |
25 |
25 |
26 // This function should match SharkStack::CreateStackOverflowCheck |
26 // This function should match SharkStack::CreateStackOverflowCheck |
27 inline void ZeroStack::overflow_check(int required_words, TRAPS) { |
27 inline void ZeroStack::overflow_check(int required_words, TRAPS) { |
28 JavaThread *thread = (JavaThread *) THREAD; |
|
29 |
|
30 // Check the Zero stack |
28 // Check the Zero stack |
31 if (required_words > available_words()) { |
29 if (available_words() < required_words) { |
32 handle_overflow(THREAD); |
30 handle_overflow(THREAD); |
33 return; |
31 return; |
34 } |
32 } |
35 |
33 |
36 // Check the ABI stack |
34 // Check the ABI stack |
37 address stack_top = thread->stack_base() - thread->stack_size(); |
35 if (abi_stack_available(THREAD) < 0) { |
38 int free_stack = ((address) &stack_top) - stack_top; |
|
39 if (free_stack < shadow_pages_size()) { |
|
40 handle_overflow(THREAD); |
36 handle_overflow(THREAD); |
41 return; |
37 return; |
42 } |
38 } |
43 } |
39 } |
|
40 |
|
41 // This method returns the amount of ABI stack available for us |
|
42 // to use under normal circumstances. Note that the returned |
|
43 // value can be negative. |
|
44 inline int ZeroStack::abi_stack_available(Thread *thread) const { |
|
45 int stack_used = thread->stack_base() - (address) &stack_used; |
|
46 int stack_free = thread->stack_size() - stack_used; |
|
47 return stack_free - shadow_pages_size(); |
|
48 } |