From 942b16d71d76869ea8d4a10abfb3de34189cc3ad Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 14 Jan 2022 15:30:58 -0600 Subject: [PATCH] Delete {read,write}_aligned --- src/rust/cpu/cpu.rs | 21 +++++++++------------ src/rust/cpu/memory.rs | 39 --------------------------------------- 2 files changed, 9 insertions(+), 51 deletions(-) diff --git a/src/rust/cpu/cpu.rs b/src/rust/cpu/cpu.rs index e7e97a56..d5a6f0a6 100644 --- a/src/rust/cpu/cpu.rs +++ b/src/rust/cpu/cpu.rs @@ -19,10 +19,7 @@ use cpu::fpu::fpu_set_tag_word; use cpu::global_pointers::*; use cpu::memory; use cpu::memory::mem8; -use cpu::memory::{ - in_mapped_range, read8, read16, read32s, read64s, read128, read_aligned32, read_aligned64, - write8, write_aligned32, -}; +use cpu::memory::{in_mapped_range, read8, read16, read32s, read64s, read128, write8}; use cpu::misc_instr::{ adjust_stack_reg, get_stack_pointer, getaf, getcf, getof, getpf, getsf, getzf, pop16, pop32s, push16, push32, @@ -1834,7 +1831,7 @@ pub unsafe fn do_page_walk( let page_dir_idx = ((addr as u32) >> 21) & 0x1FF; let pdpt_addr = (*cr.offset(3) as u32 >> 2).wrapping_add(pdpt_idx << 1); - let pdpt_entry = read_aligned64(pdpt_addr); + let pdpt_entry = read64s(pdpt_addr << 2); if pdpt_entry as i32 & PAGE_TABLE_PRESENT_MASK == 0 { return Err(PageFault { addr, @@ -1850,7 +1847,7 @@ pub unsafe fn do_page_walk( let page_dir_addr = ((pdpt_entry as u32 & 0xFFFFF000) >> 2).wrapping_add(page_dir_idx << 1); - let page_dir_entry = read_aligned64(page_dir_addr); + let page_dir_entry = read64s(page_dir_addr << 2); dbg_assert!( page_dir_entry as u64 & 0x7FFF_FFFF_0000_0000 == 0, "Unsupported: Page directory entry larger than 32 bits" @@ -1865,7 +1862,7 @@ pub unsafe fn do_page_walk( else { let page_dir_idx = (addr as u32) >> 22; let page_dir_addr = (*cr.offset(3) as u32 >> 2).wrapping_add(page_dir_idx); - let page_dir_entry = read_aligned32(page_dir_addr); + let page_dir_entry = read32s(page_dir_addr << 2); (page_dir_addr as i32, page_dir_entry) }; @@ -1911,7 +1908,7 @@ pub unsafe fn do_page_walk( | if for_writing { PAGE_TABLE_DIRTY_MASK } else { 0 }; if side_effects && page_dir_entry != new_page_dir_entry { - write_aligned32(page_dir_addr as u32, new_page_dir_entry); + write8((page_dir_addr as u32) << 2, new_page_dir_entry); } high = if pae { @@ -1927,7 +1924,7 @@ pub unsafe fn do_page_walk( let page_table = (page_dir_entry as u32 & 0xFFFFF000) >> 2; let page_table_idx = (addr as u32 >> 12) & 0x1FF; let page_table_addr = page_table.wrapping_add(page_table_idx << 1); - let page_table_entry = read_aligned64(page_table_addr); + let page_table_entry = read64s(page_table_addr << 2); dbg_assert!( page_table_entry as u64 & 0x7FFF_FFFF_0000_0000 == 0, "Unsupported: Page table entry larger than 32 bits" @@ -1943,7 +1940,7 @@ pub unsafe fn do_page_walk( let page_table = (page_dir_entry as u32 & 0xFFFFF000) >> 2; let page_table_idx = (addr as u32 >> 12) & 0x3FF; let page_table_addr = page_table.wrapping_add(page_table_idx); - let page_table_entry = read_aligned32(page_table_addr); + let page_table_entry = read32s(page_table_addr << 2); (page_table_addr as i32, page_table_entry) }; @@ -1983,13 +1980,13 @@ pub unsafe fn do_page_walk( // Note: dirty bit is only set on the page table entry let new_page_dir_entry = page_dir_entry | PAGE_TABLE_ACCESSED_MASK; if side_effects && new_page_dir_entry != page_dir_entry { - write_aligned32(page_dir_addr as u32, new_page_dir_entry); + write8((page_dir_addr as u32) << 2, new_page_dir_entry); } let new_page_table_entry = page_table_entry | PAGE_TABLE_ACCESSED_MASK | if for_writing { PAGE_TABLE_DIRTY_MASK } else { 0 }; if side_effects && page_table_entry != new_page_table_entry { - write_aligned32(page_table_addr as u32, new_page_table_entry); + write8((page_table_addr as u32) << 2, new_page_table_entry); } high = (page_table_entry as u32 & 0xFFFFF000) as i32; diff --git a/src/rust/cpu/memory.rs b/src/rust/cpu/memory.rs index 867476ab..b2a93710 100644 --- a/src/rust/cpu/memory.rs +++ b/src/rust/cpu/memory.rs @@ -87,29 +87,6 @@ pub unsafe fn read64s(addr: u32) -> i64 { }; } -pub unsafe fn read_aligned32(addr: u32) -> i32 { - dbg_assert!(addr < 0x40000000 as u32); - if in_mapped_range(addr << 2) { - return mmap_read32(addr << 2); - } - else { - return *(mem8 as *mut i32).offset(addr as isize); - }; -} - -pub unsafe fn read_aligned64(addr: u32) -> i64 { - dbg_assert!(addr < 0x40000000 as u32); - dbg_assert!(addr & 1 == 0); - if in_mapped_range(addr << 2) { - let lo = mmap_read32(addr << 2); - let hi = mmap_read32(addr + 1 << 2); - return lo as i64 | (hi as i64) << 32; - } - else { - return *(mem8 as *mut i64).offset((addr >> 1) as isize); - } -} - pub unsafe fn read128(addr: u32) -> reg128 { let mut value: reg128 = reg128 { i8_0: [0 as i8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -170,22 +147,6 @@ pub unsafe fn write32_no_mmap_or_dirty_check(addr: u32, value: i32) { *(mem8.offset(addr as isize) as *mut i32) = value } -pub unsafe fn write_aligned32_no_mmap_or_dirty_check(addr: u32, value: i32) { - *(mem8 as *mut i32).offset(addr as isize) = value -} - -pub unsafe fn write_aligned32(addr: u32, value: i32) { - dbg_assert!(addr < 0x40000000 as u32); - let phys_addr = addr << 2; - if in_mapped_range(phys_addr) { - mmap_write32(phys_addr, value); - } - else { - ::jit::jit_dirty_cache_small(phys_addr, phys_addr.wrapping_add(4 as u32)); - write_aligned32_no_mmap_or_dirty_check(addr, value); - }; -} - pub unsafe fn write64_no_mmap_or_dirty_check(addr: u32, value: u64) { *(mem8.offset(addr as isize) as *mut u64) = value }