History

Implemented basic native shell - takes compiled Command modules Defined shell Command module - should be implemented to pass modules to native shell Updated intrinsic type descriptors so they are not allocated on VM load

arr committed 10 years ago

Commit 330522f1 parent 8506dc611 files · +251 −139Browse files

Showing the changes to src/vm/stack.cpp (1 of 11 files). Show all

Unified · Split

src/vm/stack.cpp+15−11
@@ -19,7 +19,7 @@ namespace · 18 unmodified lines
19 struct vm_stack_page19 struct vm_stack_page
20 {20 {
21 vm_stack_page *prev_page;21 vm_stack_page *prev_page;
22 uintptr_t page_limit_addr;22 std::uintptr_t page_limit_addr;
23 vm_frame_t *page_top_frame; // Do not free. This is used as a tracking pointer.23 vm_frame_t *page_top_frame; // Do not free. This is used as a tracking pointer.
24 24
25 void *stack_data() const25 void *stack_data() const
@@ -30,7 +30,7 @@ namespace · 4 unmodified lines
30 30
31 bool contains_frame(const vm_frame_t *frame) const31 bool contains_frame(const vm_frame_t *frame) const
32 {32 {
33 return reinterpret_cast<uintptr_t>(stack_data()) <= reinterpret_cast<uintptr_t>(frame) && reinterpret_cast<uintptr_t>(frame) < page_limit_addr;33 return reinterpret_cast<std::uintptr_t>(stack_data()) <= reinterpret_cast<std::uintptr_t>(frame) && reinterpret_cast<std::uintptr_t>(frame) < page_limit_addr;
34 }34 }
35 };35 };
36 36
@@ -66,16 +66,17 @@ namespace · 29 unmodified lines
66 void *new_page()66 void *new_page()
67 {67 {
68 auto current_stack_page = top_page;68 auto current_stack_page = top_page;
69 top_page = alloc_memory<vm_stack_page>(sizeof(vm_stack_page) + stack_page_size);69 top_page = calloc_memory<vm_stack_page>(sizeof(vm_stack_page) + stack_page_size);
70 70
71 // Initialize the stack allocation.71 // Initialize the stack allocation.
72 top_page->prev_page = current_stack_page;72 top_page->prev_page = current_stack_page;
73 73
74 // The top frame member is only for tracking and so is initialized to null.74 // The top frame member is only for tracking and so is initialized to null.
75 top_page->page_top_frame = nullptr;75 top_page->page_top_frame = nullptr;
76 top_page->page_limit_addr = reinterpret_cast<uintptr_t>(top_page)+stack_page_size;76 top_page->page_limit_addr = reinterpret_cast<std::uintptr_t>(top_page)+stack_page_size;
77 77
78 debug::log_msg(debug::component_trace_t::memory, debug::log_level_t::debug, "alloc: vm stack alloc: %#" PRIxPTR " %#" PRIxPTR "\n", top_page, top_page->page_limit_addr);78 if (debug::is_component_tracing_enabled<debug::component_trace_t::memory>())
79 debug::log_msg(debug::component_trace_t::memory, debug::log_level_t::debug, "alloc: vm stack alloc: %#" PRIxPTR " %#" PRIxPTR "\n", top_page, top_page->page_limit_addr);
79 80
80 return top_page->stack_data();81 return top_page->stack_data();
81 }82 }
@@ -87,7 +88,9 @@ namespace · 5 unmodified lines
87 assert(current_stack_page != nullptr);88 assert(current_stack_page != nullptr);
88 89
89 free_memory(top_page);90 free_memory(top_page);
90 debug::log_msg(debug::component_trace_t::memory, debug::log_level_t::debug, "free: vm stack alloc\n");91
92 if (debug::is_component_tracing_enabled<debug::component_trace_t::memory>())
93 debug::log_msg(debug::component_trace_t::memory, debug::log_level_t::debug, "free: vm stack alloc\n");
91 94
92 // Set the top page95 // Set the top page
93 top_page = current_stack_page;96 top_page = current_stack_page;
@@ -158,7 +161,7 @@ vm_module_ref_t *&vm_frame_t::prev_module_ref() const · 64 unmodified lines
158 161
159pointer_t vm_frame_t::fixed_point_register_1() const162pointer_t vm_frame_t::fixed_point_register_1() const
160{163{
161 const auto offset = runtime_constants::fixed_point_register_1_frame_offset;164 const auto offset = vm_frame_constants::fixed_point_register_1_frame_offset;
162 assert(offset < frame_type->size_in_bytes);165 assert(offset < frame_type->size_in_bytes);
163 166
164 auto p = reinterpret_cast<uint8_t *>(base()) + offset;167 auto p = reinterpret_cast<uint8_t *>(base()) + offset;
@@ -167,7 +170,7 @@ pointer_t vm_frame_t::fixed_point_register_1() const · 2 unmodified lines
167 170
168pointer_t vm_frame_t::fixed_point_register_2() const171pointer_t vm_frame_t::fixed_point_register_2() const
169{172{
170 const auto offset = runtime_constants::fixed_point_register_2_frame_offset;173 const auto offset = vm_frame_constants::fixed_point_register_2_frame_offset;
171 assert(offset < frame_type->size_in_bytes);174 assert(offset < frame_type->size_in_bytes);
172 175
173 auto p = reinterpret_cast<uint8_t *>(base()) + offset;176 auto p = reinterpret_cast<uint8_t *>(base()) + offset;
@@ -210,16 +213,17 @@ vm_frame_t *vm_stack_t::alloc_frame(std::shared_ptr<const type_descriptor_t> fra · 36 unmodified lines
210 vm_frame_t *new_frame;213 vm_frame_t *new_frame;
211 if (page_top_frame == nullptr)214 if (page_top_frame == nullptr)
212 {215 {
213 new_frame = ::new(layout->top_page->stack_data())vm_frame_t{ frame_type };216 auto new_frame_addr = layout->top_page->stack_data();
217 new_frame = ::new(new_frame_addr)vm_frame_t{ frame_type };
214 }218 }
215 else219 else
216 {220 {
217 auto current_page_top_frame_addr = reinterpret_cast<std::size_t>(page_top_frame);221 auto current_page_top_frame_addr = reinterpret_cast<std::uintptr_t>(page_top_frame);
218 auto new_frame_addr_maybe = current_page_top_frame_addr + (sizeof(vm_frame_t) + page_top_frame->frame_type->size_in_bytes);222 auto new_frame_addr_maybe = current_page_top_frame_addr + (sizeof(vm_frame_t) + page_top_frame->frame_type->size_in_bytes);
219 223
220 // If the new frame is not going to fit on the current page, create a new page.224 // If the new frame is not going to fit on the current page, create a new page.
221 if ((new_frame_addr_maybe + new_frame_size) >= layout->top_page->page_limit_addr)225 if ((new_frame_addr_maybe + new_frame_size) >= layout->top_page->page_limit_addr)
222 new_frame_addr_maybe = reinterpret_cast<uintptr_t>(layout->new_page());226 new_frame_addr_maybe = reinterpret_cast<std::uintptr_t>(layout->new_page());
223 227
224 new_frame = ::new(reinterpret_cast<void *>(new_frame_addr_maybe))vm_frame_t{ frame_type };228 new_frame = ::new(reinterpret_cast<void *>(new_frame_addr_maybe))vm_frame_t{ frame_type };
225 }229 }