From 73e105bfc40023eaf7e8c4ddba628a6409e7133b Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Tue, 24 Nov 2009 21:36:35 -0600 Subject: [PATCH] vm: flush icache after GC --- vm/code_blocks.cpp | 9 ++------- vm/code_blocks.hpp | 5 +++++ vm/collector.hpp | 6 ++++-- vm/full_collector.cpp | 3 +++ vm/vm.hpp | 1 - 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/vm/code_blocks.cpp b/vm/code_blocks.cpp index 9c7349979c..7234ec3ef9 100755 --- a/vm/code_blocks.cpp +++ b/vm/code_blocks.cpp @@ -3,11 +3,6 @@ namespace factor { -void factor_vm::flush_icache_for(code_block *block) -{ - flush_icache((cell)block,block->size()); -} - void *factor_vm::object_xt(cell obj) { switch(tagged(obj).type()) @@ -196,7 +191,7 @@ void factor_vm::update_word_references(code_block *compiled) { word_references_updater updater(this); iterate_relocations(compiled,updater); - flush_icache_for(compiled); + compiled->flush_icache(); } } @@ -224,7 +219,7 @@ void factor_vm::relocate_code_block(code_block *compiled) code->needs_fixup.erase(compiled); code_block_relocator relocator(this); iterate_relocations(compiled,relocator); - flush_icache_for(compiled); + compiled->flush_icache(); } /* Fixup labels. This is done at compile time, not image load time */ diff --git a/vm/code_blocks.hpp b/vm/code_blocks.hpp index dad71786dc..9fbd5ee749 100644 --- a/vm/code_blocks.hpp +++ b/vm/code_blocks.hpp @@ -43,6 +43,11 @@ struct code_block { return (void *)(this + 1); } + + void flush_icache() + { + factor::flush_icache((cell)this,size()); + } }; } diff --git a/vm/collector.hpp b/vm/collector.hpp index 4dac6d28c3..ece4926c28 100644 --- a/vm/collector.hpp +++ b/vm/collector.hpp @@ -145,8 +145,10 @@ struct collector { for(; iter != end; iter++) { - trace_code_block_objects(*iter); - trace_embedded_literals(*iter); + code_block *compiled = *iter; + trace_code_block_objects(compiled); + trace_embedded_literals(compiled); + compiled->flush_icache(); code_blocks_scanned++; } } diff --git a/vm/full_collector.cpp b/vm/full_collector.cpp index d2f2cd2cf2..10a6f53c41 100644 --- a/vm/full_collector.cpp +++ b/vm/full_collector.cpp @@ -149,12 +149,14 @@ void factor_vm::collect_full(bool trace_contexts_p) current_gc->event->op = collect_compact_op; collect_compact_impl(trace_contexts_p); } + flush_icache(code->seg->start,code->seg->size); } void factor_vm::collect_compact(bool trace_contexts_p) { collect_mark_impl(trace_contexts_p); collect_compact_impl(trace_contexts_p); + flush_icache(code->seg->start,code->seg->size); } void factor_vm::collect_growing_heap(cell requested_bytes, bool trace_contexts_p) @@ -164,6 +166,7 @@ void factor_vm::collect_growing_heap(cell requested_bytes, bool trace_contexts_p set_data_heap(data->grow(requested_bytes)); collect_mark_impl(trace_contexts_p); collect_compact_code_impl(trace_contexts_p); + flush_icache(code->seg->start,code->seg->size); delete old; } diff --git a/vm/vm.hpp b/vm/vm.hpp index d8745fbc3e..82f8e39d67 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -500,7 +500,6 @@ struct factor_vm void primitive_fclose(); //code_block - void flush_icache_for(code_block *block); void *object_xt(cell obj); void *xt_pic(word *w, cell tagged_quot); void *word_xt_pic(word *w);