Delete {read,write}_aligned

This commit is contained in:
Fabian 2022-01-14 15:30:58 -06:00
commit 942b16d71d
2 changed files with 9 additions and 51 deletions

View file

@ -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;

View file

@ -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
}