comparison src/share/vm/runtime/virtualspace.hpp @ 237:1fdb98a17101

6716785: implicit null checks not triggering with CompressedOops Summary: allocate alignment-sized page(s) below java heap so that memory accesses at heap_base+1page give signal and cause an implicit null check Reviewed-by: kvn, jmasa, phh, jcoomes
author coleenp
date Sat, 19 Jul 2008 17:38:22 -0400
parents a61af66fc99e
children 9ee9cf798b59
comparison
equal deleted inserted replaced
235:9c2ecc2ffb12 237:1fdb98a17101
27 class ReservedSpace VALUE_OBJ_CLASS_SPEC { 27 class ReservedSpace VALUE_OBJ_CLASS_SPEC {
28 friend class VMStructs; 28 friend class VMStructs;
29 private: 29 private:
30 char* _base; 30 char* _base;
31 size_t _size; 31 size_t _size;
32 size_t _noaccess_prefix;
32 size_t _alignment; 33 size_t _alignment;
33 bool _special; 34 bool _special;
34 35
35 // ReservedSpace 36 // ReservedSpace
36 ReservedSpace(char* base, size_t size, size_t alignment, bool special); 37 ReservedSpace(char* base, size_t size, size_t alignment, bool special);
37 void initialize(size_t size, size_t alignment, bool large, 38 void initialize(size_t size, size_t alignment, bool large,
38 char* requested_address = NULL); 39 char* requested_address,
40 const size_t noaccess_prefix);
39 41
40 // Release parts of an already-reserved memory region [addr, addr + len) to 42 // Release parts of an already-reserved memory region [addr, addr + len) to
41 // get a new region that has "compound alignment." Return the start of the 43 // get a new region that has "compound alignment." Return the start of the
42 // resulting region, or NULL on failure. 44 // resulting region, or NULL on failure.
43 // 45 //
57 const size_t prefix_size, 59 const size_t prefix_size,
58 const size_t prefix_align, 60 const size_t prefix_align,
59 const size_t suffix_size, 61 const size_t suffix_size,
60 const size_t suffix_align); 62 const size_t suffix_align);
61 63
64 protected:
65 // Create protection page at the beginning of the space.
66 void protect_noaccess_prefix(const size_t size);
67
62 public: 68 public:
63 // Constructor 69 // Constructor
64 ReservedSpace(size_t size); 70 ReservedSpace(size_t size);
65 ReservedSpace(size_t size, size_t alignment, bool large, 71 ReservedSpace(size_t size, size_t alignment, bool large,
66 char* requested_address = NULL); 72 char* requested_address = NULL,
73 const size_t noaccess_prefix = 0);
67 ReservedSpace(const size_t prefix_size, const size_t prefix_align, 74 ReservedSpace(const size_t prefix_size, const size_t prefix_align,
68 const size_t suffix_size, const size_t suffix_align); 75 const size_t suffix_size, const size_t suffix_align,
76 const size_t noaccess_prefix);
69 77
70 // Accessors 78 // Accessors
71 char* base() const { return _base; } 79 char* base() const { return _base; }
72 size_t size() const { return _size; } 80 size_t size() const { return _size; }
73 size_t alignment() const { return _alignment; } 81 size_t alignment() const { return _alignment; }
74 bool special() const { return _special; } 82 bool special() const { return _special; }
83
84 size_t noaccess_prefix() const { return _noaccess_prefix; }
75 85
76 bool is_reserved() const { return _base != NULL; } 86 bool is_reserved() const { return _base != NULL; }
77 void release(); 87 void release();
78 88
79 // Splitting 89 // Splitting
101 111
102 ReservedSpace ReservedSpace::last_part(size_t partition_size) 112 ReservedSpace ReservedSpace::last_part(size_t partition_size)
103 { 113 {
104 return last_part(partition_size, alignment()); 114 return last_part(partition_size, alignment());
105 } 115 }
116
117 // Class encapsulating behavior specific of memory space reserved for Java heap
118 class ReservedHeapSpace : public ReservedSpace {
119 public:
120 // Constructor
121 ReservedHeapSpace(size_t size, size_t forced_base_alignment,
122 bool large, char* requested_address);
123 ReservedHeapSpace(const size_t prefix_size, const size_t prefix_align,
124 const size_t suffix_size, const size_t suffix_align);
125 };
106 126
107 // VirtualSpace is data structure for committing a previously reserved address range in smaller chunks. 127 // VirtualSpace is data structure for committing a previously reserved address range in smaller chunks.
108 128
109 class VirtualSpace VALUE_OBJ_CLASS_SPEC { 129 class VirtualSpace VALUE_OBJ_CLASS_SPEC {
110 friend class VMStructs; 130 friend class VMStructs;