Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 6 additions & 14 deletions linux-user/mmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -1180,6 +1180,9 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int target_prot,
#ifdef CONFIG_LATX_AOT
wine_sec_info * wine_sec = NULL;
uint64_t aot_offset = offset;
if (option_aot) {
segment_tree_remove_range(start, start + len);
}
if (option_aot_wine && option_aot) {
wine_dll_track_sections(start, len, offset, fd);
wine_sec = wine_sec_tree_lookup(start);
Expand Down Expand Up @@ -1318,10 +1321,7 @@ int target_munmap(abi_ulong start, abi_ulong len, int rlimit_as_account)
if (ret == 0) {
#ifdef CONFIG_LATX_AOT
if (option_aot) {
seg_info *seg = segment_tree_lookup2(start, start + len);
if (seg) {
segment_tree_remove(seg);
}
segment_tree_remove_range(start, start + len);
}
#endif
page_set_flags(start, start + len, 0);
Expand Down Expand Up @@ -1693,18 +1693,10 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,

#ifdef CONFIG_LATX_AOT
if (option_aot) {
seg_info *seg;

if (!keep_old || (flags & MREMAP_DONTUNMAP)) {
seg = segment_tree_lookup2(old_addr, old_addr + old_size);
if (seg) {
segment_tree_remove(seg);
}
}
seg = segment_tree_lookup2(new_addr, new_addr + new_size);
if (seg) {
segment_tree_remove(seg);
segment_tree_remove_range(old_addr, old_addr + old_size);
}
segment_tree_remove_range(new_addr, new_addr + new_size);
}
#endif
}
Expand Down
35 changes: 35 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -755,6 +755,41 @@ foreach target : target_dirs
aot_pe_load_address_test,
suite: 'lat-pr-fast',
)

aot_segment_unmap_test = executable(
'test-latx-aot-segment-unmap',
files(
'target/i386/latx/sbt/tests/aot-segment-unmap-test.c',
'target/i386/latx/sbt/segment.c',
'target/i386/latx/sbt/aot_lib.c'
) + genh + tcg_trace_genh + [syscall_nr_generated],
c_args: smc_reload_test_c_args,
dependencies: [glib],
include_directories: target_inc,
link_args: smc_reload_test_link_args
)
test('latx-aot-segment-unmap', aot_segment_unmap_test,
suite: 'lat-pr-fast')

foreach variant : ['', '-no-tu']
aot_merge_memory_test = executable(
'test-latx-aot-merge-memory' + variant,
files(
'target/i386/latx/sbt/tests/aot-merge-memory-test.c',
'target/i386/latx/sbt/file_ctx.c'
) + genh + tcg_trace_genh + [syscall_nr_generated],
c_args: smc_reload_test_c_args +
(variant == '' ? [] : ['-DAOT_MERGE_TEST_NO_TU']),
dependencies: [glib],
include_directories: target_inc,
link_args: smc_reload_test_link_args + [
'-Wl,--wrap=malloc', '-Wl,--wrap=free',
'-Wl,--wrap=get_aot_path', '-Wl,--wrap=opendir'
]
)
test('latx-aot-merge-memory' + variant, aot_merge_memory_test,
suite: 'lat-pr-fast')
endforeach
endif

execs = [{
Expand Down
1 change: 1 addition & 0 deletions target/i386/latx/include/segment.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ void segment_tree_insert(char *name, target_ulong offset, target_ulong begin,
seg_info *segment_tree_lookup(target_ulong pc);
seg_info *segment_tree_lookup2(target_ulong begin, target_ulong end);
void segment_tree_remove(seg_info *val);
void segment_tree_remove_range(target_ulong begin, target_ulong end);
bool segment_tree_winepe_lookup(target_ulong pc);
gint get_segment_num(void);
void do_segment_record(seg_info **seg_info_vector);
Expand Down
27 changes: 17 additions & 10 deletions target/i386/latx/sbt/aot_merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ static gint merge_tb_cmp(gconstpointer a, gconstpointer b)
static void merge_tb_tree_init(GTree **tree)
{
*tree = g_tree_new_full((GCompareDataFunc)merge_tb_cmp,
NULL, NULL, NULL);
NULL, NULL, free);
lsassert(*tree);
}

Expand Down Expand Up @@ -687,6 +687,16 @@ typedef enum AOTLoadResult {
AOT_LOAD_INVALID_BASE,
} AOTLoadResult;

static void aot_merge_release_buffers(void)
{
for (int i = 0; i < aot_buffer_all_num; i++) {
free(aot_buffer_all[i].p);
}
g_free(aot_buffer_all);
aot_buffer_all = NULL;
aot_buffer_all_num = 0;
}

static AOTLoadResult aot_load_no_lock(char *lib_name)
{
void *buffer;
Expand Down Expand Up @@ -803,12 +813,7 @@ static AOTLoadResult aot_load_no_lock(char *lib_name)
load_error:
result = AOT_LOAD_ERROR;
release_buffers:
for (int i = 0; i < j; i++) {
free(aot_buffer_all[i].p);
}
g_free(aot_buffer_all);
aot_buffer_all = NULL;
aot_buffer_all_num = 0;
aot_merge_release_buffers();
return result;
}

Expand Down Expand Up @@ -1054,17 +1059,19 @@ AOTMergeResult aot2_merge(char *curr_lib_name, int first_seg_id,
return AOT_MERGE_ERROR;
}
if (aot_buffer_all_num < 2) {
aot_merge_release_buffers();
return AOT_MERGE_ERROR;
}
#ifdef CONFIG_LATX_TU
result = aot2_merge_tu(curr_lib_name, first_seg_id, last_seg_id, cpu);
#else
g_tree_destroy(merge_segment_tree);
merge_segment_tree_init();
merge_rel_entry_num = 0;
result = do_merge_seg_aot() ? AOT_MERGE_READY : AOT_MERGE_ERROR;
/* Tree entries borrow segment and TB data from the input buffers. */
g_tree_destroy(merge_segment_tree);
merge_segment_tree_init();
#endif
aot_buffer_all_num = 0;
aot_merge_release_buffers();
return result;
}
#endif
2 changes: 2 additions & 0 deletions target/i386/latx/sbt/file_ctx.c
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,8 @@ int aot_file_ctx(uint64_t maxSize, uint64_t leftMinSize)
p_dir = opendir(aot_dir);
if (p_dir == NULL) {
qemu_log_mask(LAT_LOG_AOT, "---->can\'t open %s\n", aot_dir);
free(f_info);
free(aot_dir);
return -1;
}
while ((p_dirent = readdir(p_dir))) {
Expand Down
20 changes: 15 additions & 5 deletions target/i386/latx/sbt/segment.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,11 +205,7 @@ void segment_tree_insert(char *name, target_ulong offset, target_ulong begin,
if (is_elf_file(name)) {
seg->seg_flag = IS_ELF_SEG;
}
seg_info * old_seg_info = segment_tree_lookup2(begin, end);
while(old_seg_info) {
segment_tree_remove(old_seg_info);
old_seg_info = segment_tree_lookup2(begin, end);
}
segment_tree_remove_range(begin, end);
/* Now insert this new segment into segment_tree */
g_tree_replace(segment_tree, seg, seg);
}
Expand Down Expand Up @@ -389,6 +385,20 @@ void segment_tree_remove(seg_info* val)
g_tree_remove(segment_tree, val);
}

void segment_tree_remove_range(target_ulong begin, target_ulong end)
{
seg_info *seg;

if (begin >= end) {
return;
}
/* A segment describes one mapping identity; partial replacement also
* invalidates that identity, as in segment_tree_insert(). */
while ((seg = segment_tree_lookup2(begin, end))) {
segment_tree_remove(seg);
}
}

static bool check_winepe_segment(seg_info * res) {
char *file_name = basename(res->file_name);
for (int i = 0; i < 100; i++) {
Expand Down
Loading