tlb_set_has_code_multiple

This commit is contained in:
Fabian 2021-04-16 20:46:40 -05:00
parent 7666805117
commit 2f2fff26a9
3 changed files with 27 additions and 6 deletions

View file

@ -36,6 +36,7 @@ use paging::OrPageFault;
use profiler;
use profiler::stat::*;
use state_flags::CachedStateFlags;
use std::collections::HashSet;
pub use util::dbg_trace;
/// The offset for our generated functions in the wasm table. Every index less than this is
@ -2174,13 +2175,13 @@ pub unsafe fn translate_address_write_jit(address: i32) -> OrPageFault<u32> {
}
pub fn tlb_set_has_code(physical_page: Page, has_code: bool) {
let physical_page = physical_page.to_u32();
for i in 0..unsafe { valid_tlb_entries_count } {
let page = unsafe { valid_tlb_entries[i as usize] };
let entry = unsafe { tlb_data[page as usize] };
if 0 != entry {
let tlb_physical_page =
(entry as u32 >> 12 ^ page as u32) - (unsafe { memory::mem8 } as u32 >> 12);
let tlb_physical_page = Page::of_u32(
(entry as u32 >> 12 ^ page as u32) - (unsafe { memory::mem8 } as u32 >> 12),
);
if physical_page == tlb_physical_page {
unsafe {
tlb_data[page as usize] =
@ -2192,6 +2193,26 @@ pub fn tlb_set_has_code(physical_page: Page, has_code: bool) {
check_tlb_invariants();
}
pub fn tlb_set_has_code_multiple(physical_pages: &HashSet<Page>, has_code: bool) {
let physical_pages: Vec<Page> = physical_pages.into_iter().copied().collect();
for i in 0..unsafe { valid_tlb_entries_count } {
let page = unsafe { valid_tlb_entries[i as usize] };
let entry = unsafe { tlb_data[page as usize] };
if 0 != entry {
let tlb_physical_page = Page::of_u32(
(entry as u32 >> 12 ^ page as u32) - (unsafe { memory::mem8 } as u32 >> 12),
);
if physical_pages.contains(&tlb_physical_page) {
unsafe {
tlb_data[page as usize] =
if has_code { entry | TLB_HAS_CODE } else { entry & !TLB_HAS_CODE }
}
}
}
}
check_tlb_invariants();
}
pub fn check_tlb_invariants() {
if !CHECK_TLB_INVARIANTS {

View file

@ -873,9 +873,7 @@ fn jit_analyze_and_generate(
);
profiler::stat_increment_by(stat::COMPILE_PAGE, pages.len() as u64);
for &p in &pages {
cpu::tlb_set_has_code(p, true);
}
cpu::tlb_set_has_code_multiple(&pages, true);
dbg_assert!(ctx.compiling.is_none());
ctx.compiling = Some((wasm_table_index, PageState::Compiling { entries }));

View file

@ -7,6 +7,8 @@ impl Page {
pub fn to_address(self) -> u32 { self.0 << 12 }
pub fn to_u32(self) -> u32 { self.0 }
pub fn of_u32(page: u32) -> Page { Page(page) }
pub fn address_range(self) -> RangeInclusive<u32> {
self.to_address()..=self.to_address() + 4095
}