c2rust cleanup: Call more functions directly

This commit is contained in:
Fabian 2018-08-21 18:35:41 -05:00
parent 75eecd0d63
commit 3c903338c3
4 changed files with 23 additions and 30 deletions

View file

@ -344,7 +344,11 @@ CPU.prototype.wasm_patch = function(wm)
this.pack_current_state_flags = get_import("pack_current_state_flags");
this.jit_force_generate_unsafe = get_import("jit_force_generate_unsafe");
if(DEBUG)
{
this.jit_force_generate_unsafe = get_import("jit_force_generate_unsafe");
}
this.jit_empty_cache = get_import("jit_empty_cache");
this.jit_dirty_cache = get_import("jit_dirty_cache");
this.codegen_finalize_finished = get_import("codegen_finalize_finished");

View file

@ -25,7 +25,6 @@ pub fn rust_setup() {
}));
}
#[no_mangle]
pub fn jit_find_cache_entry(phys_address: u32, state_flags: u32) -> u32 {
let cached_code {
wasm_table_index,
@ -53,7 +52,6 @@ pub fn codegen_finalize_finished(
)
}
#[no_mangle]
pub fn jit_increase_hotness_and_maybe_compile(phys_address: u32, cs_offset: u32, state_flags: u32) {
::jit::jit_increase_hotness_and_maybe_compile(
get_module(),
@ -65,6 +63,7 @@ pub fn jit_increase_hotness_and_maybe_compile(phys_address: u32, cs_offset: u32,
#[no_mangle]
#[cfg(debug_assertions)]
/// Called from JS
pub fn jit_force_generate_unsafe(phys_addr: u32, cs_offset: u32, state_flags: u32) {
::jit::jit_force_generate_unsafe(
get_module(),
@ -75,19 +74,17 @@ pub fn jit_force_generate_unsafe(phys_addr: u32, cs_offset: u32, state_flags: u3
}
#[no_mangle]
/// Called from JS
pub fn jit_dirty_cache(start_addr: u32, end_addr: u32) {
::jit::jit_dirty_cache(get_module(), start_addr, end_addr);
}
#[no_mangle]
pub fn jit_dirty_cache_small(start_addr: u32, end_addr: u32) {
::jit::jit_dirty_cache_small(get_module(), start_addr, end_addr);
}
#[no_mangle]
pub fn jit_dirty_cache_single(addr: u32) { ::jit::jit_dirty_cache_single(get_module(), addr); }
#[no_mangle]
pub fn jit_page_has_code(page: u32) -> bool {
::jit::jit_page_has_code(get_module(), Page::page_of(page << 12))
}

View file

@ -20,13 +20,6 @@ extern "C" {
fn microtick() -> f64;
#[no_mangle]
fn call_indirect1(f: i32, x: u16);
#[no_mangle]
fn jit_page_has_code(addr: u32) -> bool;
#[no_mangle]
fn jit_find_cache_entry(addr: u32, flags: u8) -> u32;
#[no_mangle]
fn jit_increase_hotness_and_maybe_compile(phys_address: u32, cs_offset: u32, state_flags: u8);
}
use cpu2::global_pointers::*;
@ -422,7 +415,7 @@ pub unsafe fn do_page_translation(
let mut is_in_mapped_range: bool = in_mapped_range(high as u32);
let mut physical_page: i32 = (high as u32 >> 12i32) as i32;
let mut has_code: bool =
!is_in_mapped_range && 0 != jit_page_has_code(physical_page as u32) as i32;
!is_in_mapped_range && 0 != ::c_api::jit_page_has_code(physical_page as u32) as i32;
let mut info_bits: i32 = TLB_VALID
| if 0 != can_write as i32 {
0i32
@ -778,7 +771,7 @@ pub unsafe fn cycle_internal() -> () {
*previous_ip = *instruction_pointer;
let mut phys_addr: u32 = return_on_pagefault!(get_phys_eip()) as u32;
let mut state_flags: cached_state_flags = pack_current_state_flags();
let mut entry: u32 = jit_find_cache_entry(phys_addr, state_flags);
let mut entry: u32 = ::c_api::jit_find_cache_entry(phys_addr, state_flags as u32);
if 0 != entry {
profiler_stat_increment(S_RUN_FROM_CACHE);
initial_tsc = *timestamp_counter as i32;
@ -799,7 +792,11 @@ pub unsafe fn cycle_internal() -> () {
dbg_assert!(!must_not_fault);
must_not_fault = 0 != 1i32
}
jit_increase_hotness_and_maybe_compile(phys_addr, get_seg_cs() as u32, state_flags);
::c_api::jit_increase_hotness_and_maybe_compile(
phys_addr,
get_seg_cs() as u32,
state_flags as u32,
);
if DEBUG {
dbg_assert!(must_not_fault);
must_not_fault = 0 != 0i32
@ -1179,7 +1176,7 @@ pub unsafe fn safe_write16(mut address: i32, mut value: i32) -> Result<(), ()> {
c_comment!(("- can be accessed from any cpl"));
c_comment!(("- does not contain code"));
let mut phys_address: u32 = (entry & !4095i32 ^ address) as u32;
dbg_assert!(!jit_page_has_code(phys_address >> 12i32));
dbg_assert!(!::c_api::jit_page_has_code(phys_address >> 12i32));
dbg_assert!(!in_mapped_range(phys_address));
*(mem8.offset(phys_address as isize) as *mut u16) = value as u16;
}
@ -1223,7 +1220,7 @@ pub unsafe fn safe_write32(mut address: i32, mut value: i32) -> Result<(), ()> {
c_comment!(("- not in memory mapped area"));
c_comment!(("- does not contain code"));
let mut phys_address: u32 = (entry & !4095i32 ^ address) as u32;
dbg_assert!(!jit_page_has_code(phys_address >> 12i32));
dbg_assert!(!::c_api::jit_page_has_code(phys_address >> 12i32));
dbg_assert!(!in_mapped_range(phys_address));
*(mem8.offset(phys_address as isize) as *mut i32) = value;
}

View file

@ -23,11 +23,6 @@ extern "C" {
fn mmap_write32(addr: u32, value: i32);
#[no_mangle]
fn mmap_write128(addr: u32, v0: i32, v1: i32, v2: i32, v3: i32);
#[no_mangle]
fn jit_dirty_cache_small(low: u32, high: u32);
#[no_mangle]
fn jit_dirty_cache_single(addr: u32);
}
use cpu2::cpu::*;
@ -144,7 +139,7 @@ pub unsafe fn write8(mut addr: u32, mut value: i32) -> () {
mmap_write8(addr, value);
}
else {
jit_dirty_cache_single(addr);
::c_api::jit_dirty_cache_single(addr);
*mem8.offset(addr as isize) = value as u8
};
}
@ -157,7 +152,7 @@ pub unsafe fn write16(mut addr: u32, mut value: i32) -> () {
mmap_write16(addr, value);
}
else {
jit_dirty_cache_small(addr, addr.wrapping_add(2i32 as u32));
::c_api::jit_dirty_cache_small(addr, addr.wrapping_add(2i32 as u32));
*(mem8.offset(addr as isize) as *mut u16) = value as u16
};
}
@ -172,7 +167,7 @@ pub unsafe fn write_aligned16(mut addr: u32, mut value: u32) -> () {
mmap_write16(phys_addr, value as i32);
}
else {
jit_dirty_cache_small(phys_addr, phys_addr.wrapping_add(2i32 as u32));
::c_api::jit_dirty_cache_small(phys_addr, phys_addr.wrapping_add(2i32 as u32));
*mem16.offset(addr as isize) = value as u16
};
}
@ -185,7 +180,7 @@ pub unsafe fn write32(mut addr: u32, mut value: i32) -> () {
mmap_write32(addr, value);
}
else {
jit_dirty_cache_small(addr, addr.wrapping_add(4i32 as u32));
::c_api::jit_dirty_cache_small(addr, addr.wrapping_add(4i32 as u32));
*(mem8.offset(addr as isize) as *mut i32) = value
};
}
@ -200,7 +195,7 @@ pub unsafe fn write_aligned32(mut addr: u32, mut value: i32) -> () {
mmap_write32(phys_addr, value);
}
else {
jit_dirty_cache_small(phys_addr, phys_addr.wrapping_add(4i32 as u32));
::c_api::jit_dirty_cache_small(phys_addr, phys_addr.wrapping_add(4i32 as u32));
*mem32s.offset(addr as isize) = value
};
}
@ -217,7 +212,7 @@ pub unsafe fn write64(mut addr: u32, mut value: i64) -> () {
mmap_write32(addr.wrapping_add(4i32 as u32), (value >> 32i32) as i32);
}
else {
jit_dirty_cache_small(addr, addr.wrapping_add(8i32 as u32));
::c_api::jit_dirty_cache_small(addr, addr.wrapping_add(8i32 as u32));
*(mem8.offset(addr as isize) as *mut i64) = value
};
}
@ -236,7 +231,7 @@ pub unsafe fn write128(mut addr: u32, mut value: reg128) -> () {
);
}
else {
jit_dirty_cache_small(addr, addr.wrapping_add(16i32 as u32));
::c_api::jit_dirty_cache_small(addr, addr.wrapping_add(16i32 as u32));
*(mem8.offset(addr as isize) as *mut i64) = value.i64_0[0usize];
*(mem8.offset(addr as isize).offset(8isize) as *mut i64) = value.i64_0[1usize]
};