Mercurial > hg > truffle
comparison src/cpu/zero/vm/stack_zero.hpp @ 1379:f9271ff9d324
6941224: Improved stack overflow handling for Zero
Summary: Adding stack overflow checking to Shark brought to light a bunch of deficiencies in Zero's stack overflow code.
Reviewed-by: twisti
Contributed-by: Gary Benson <gbenson@redhat.com>
author | twisti |
---|---|
date | Thu, 15 Apr 2010 02:40:12 -0700 |
parents | 354d3184f6b2 |
children | 0c5b3cf3c1f5 |
comparison
equal
deleted
inserted
replaced
1377:ef74d6d1ac1e | 1379:f9271ff9d324 |
---|---|
1 /* | 1 /* |
2 * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. | 2 * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. |
3 * Copyright 2008, 2009 Red Hat, Inc. | 3 * Copyright 2008, 2009, 2010 Red Hat, Inc. |
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5 * | 5 * |
6 * This code is free software; you can redistribute it and/or modify it | 6 * This code is free software; you can redistribute it and/or modify it |
7 * under the terms of the GNU General Public License version 2 only, as | 7 * under the terms of the GNU General Public License version 2 only, as |
8 * published by the Free Software Foundation. | 8 * published by the Free Software Foundation. |
27 private: | 27 private: |
28 intptr_t *_base; // the last available word | 28 intptr_t *_base; // the last available word |
29 intptr_t *_top; // the word past the end of the stack | 29 intptr_t *_top; // the word past the end of the stack |
30 intptr_t *_sp; // the top word on the stack | 30 intptr_t *_sp; // the top word on the stack |
31 | 31 |
32 private: | |
33 int _shadow_pages_size; // how much ABI stack must we keep free? | |
34 | |
32 public: | 35 public: |
33 ZeroStack() | 36 ZeroStack() |
34 : _base(NULL), _top(NULL), _sp(NULL) {} | 37 : _base(NULL), _top(NULL), _sp(NULL) { |
38 _shadow_pages_size = StackShadowPages * os::vm_page_size(); | |
39 } | |
35 | 40 |
36 bool needs_setup() const { | 41 bool needs_setup() const { |
37 return _base == NULL; | 42 return _base == NULL; |
38 } | 43 } |
39 | 44 |
78 void *alloc(size_t size) { | 83 void *alloc(size_t size) { |
79 int count = align_size_up(size, wordSize) >> LogBytesPerWord; | 84 int count = align_size_up(size, wordSize) >> LogBytesPerWord; |
80 assert(count <= available_words(), "stack overflow"); | 85 assert(count <= available_words(), "stack overflow"); |
81 return _sp -= count; | 86 return _sp -= count; |
82 } | 87 } |
88 | |
89 int shadow_pages_size() const { | |
90 return _shadow_pages_size; | |
91 } | |
92 | |
93 public: | |
94 void overflow_check(int required_words, TRAPS); | |
95 static void handle_overflow(TRAPS); | |
83 | 96 |
84 public: | 97 public: |
85 static ByteSize base_offset() { | 98 static ByteSize base_offset() { |
86 return byte_offset_of(ZeroStack, _base); | 99 return byte_offset_of(ZeroStack, _base); |
87 } | 100 } |