tlb_set_has_code_multiple
This commit is contained in:
parent
7666805117
commit
2f2fff26a9
|
@ -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 {
|
||||
|
|
|
@ -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 }));
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue