@@ -66,6 +66,10 @@ struct PageSizeGetter {
66
66
page_size (sysconf(_SC_PAGE_SIZE))
67
67
{}
68
68
69
+ size_t align_up (size_t l) const {
70
+ return (l + page_size - 1 ) / page_size * page_size;
71
+ }
72
+
69
73
constexpr operator size_t () const { return page_size; }
70
74
};
71
75
const PageSizeGetter page_size{};
@@ -124,10 +128,20 @@ VMContext VMContext::create(void* _code_buf, std::size_t len) {
124
128
VMContext ctx{};
125
129
Impl& impl = *ctx.impl ;
126
130
127
- impl.seg_rodata = SegmentInfo::mmap (header.sh_rodata .mem_size , PROT_READ | PROT_WRITE);
128
- impl.seg_data = SegmentInfo::mmap (header.sh_data .mem_size , PROT_READ | PROT_WRITE);
129
- memcpy (impl.seg_rodata .base , code_buf + header.sh_rodata .offset , header.sh_rodata .file_size );
130
- memcpy (impl.seg_data .base , code_buf + header.sh_data .offset , header.sh_data .file_size );
131
+ {
132
+ impl.seg_rodata .len = page_size.align_up (header.sh_rodata .mem_size );
133
+ impl.seg_data .len = page_size.align_up (header.sh_data .mem_size );
134
+
135
+ impl.data_arena = SegmentInfo::mmap ((1ull << 32 ) + impl.seg_rodata .len , PROT_NONE);
136
+ impl.seg_rodata .base = reinterpret_cast <uint8_t *>(impl.data_arena .base ) + (1ull << 31 );
137
+ impl.seg_data .base = reinterpret_cast <uint8_t *>(impl.seg_rodata .base ) + impl.seg_rodata .len ;
138
+
139
+ impl.seg_rodata .set_prot (PROT_READ | PROT_WRITE);
140
+ impl.seg_data .set_prot (PROT_READ | PROT_WRITE);
141
+
142
+ memcpy (impl.seg_rodata .base , code_buf + header.sh_rodata .offset , header.sh_rodata .file_size );
143
+ memcpy (impl.seg_data .base , code_buf + header.sh_data .offset , header.sh_data .file_size );
144
+ }
131
145
impl.seg_rodata .set_prot (PROT_READ);
132
146
133
147
impl.c_st .functions .reset (header.n_functions );
@@ -145,7 +159,7 @@ VMContext VMContext::create(void* _code_buf, std::size_t len) {
145
159
auto & c_st = impl.c_st ;
146
160
147
161
c_st.seg_got = SegmentInfo{
148
- impl.arena_ptr ,
162
+ impl.code_arena_ptr ,
149
163
page_size
150
164
};
151
165
0 commit comments