Skip to content

Commit

Permalink
change the definetions of lookup and update 4 todos
Browse files Browse the repository at this point in the history
  • Loading branch information
ZhiyuanSue committed Sep 11, 2024
1 parent 8da6f35 commit ed5bae0
Show file tree
Hide file tree
Showing 10 changed files with 372 additions and 301 deletions.
51 changes: 27 additions & 24 deletions kernel/src/interfaces_impl/cspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,9 @@ use sel4_ipc::{endpoint_t, notification_t, Transfer};
use sel4_task::{get_currenct_thread, ksWorkUnitsCompleted, tcb_t};
#[cfg(target_arch = "riscv64")]
use sel4_vspace::find_vspace_for_asid;
use sel4_vspace::{asid_pool_t, asid_t, delete_asid, delete_asid_pool, unmapPage, PTE};
#[cfg(target_arch = "aarch64")]
use sel4_vspace::{
unmap_page_directory, unmap_page_table, unmap_page_upper_directory, PDE, PGDE, PUDE,
};
use sel4_vspace::unmap_page_table;
use sel4_vspace::{asid_pool_t, asid_t, delete_asid, delete_asid_pool, unmapPage, PTE};

#[cfg(target_arch = "riscv64")]
#[no_mangle]
Expand Down Expand Up @@ -89,27 +87,32 @@ pub fn Arch_finaliseCap(cap: &cap_t, final_: bool) -> finaliseCap_ret {
}
}
}
CapTag::CapPageGlobalDirectoryCap => {
if final_ && cap.get_pgd_is_mapped() == 1 {
deleteASID(cap.get_pgd_is_mapped(), cap.get_pgd_base_ptr() as _);
}
}
CapTag::CapPageUpperDirectoryCap => {
if final_ && cap.get_pud_is_mapped() == 1 {
let pud = ptr_to_mut(cap.get_pt_base_ptr() as *mut PUDE);
unmap_page_upper_directory(
cap.get_pud_mapped_asid(),
cap.get_pud_mapped_address(),
pud,
);
}
}
CapTag::CapPageDirectoryCap => {
if final_ && cap.get_pd_is_mapped() == 1 {
let pd = ptr_to_mut(cap.get_pt_base_ptr() as *mut PDE);
unmap_page_directory(cap.get_pd_mapped_asid(), cap.get_pd_mapped_address(), pd);
CapTag::CapVspaceCap => {
if final_ && cap.get_vs_is_mapped() == 1 {
deleteASID(cap.get_vs_is_mapped(), cap.get_vs_base_ptr() as _);
}
}
// CapTag::CapPageGlobalDirectoryCap => {
// if final_ && cap.get_pgd_is_mapped() == 1 {
// deleteASID(cap.get_pgd_is_mapped(), cap.get_pgd_base_ptr() as _);
// }
// }
// CapTag::CapPageUpperDirectoryCap => {
// if final_ && cap.get_pud_is_mapped() == 1 {
// let pud = ptr_to_mut(cap.get_pt_base_ptr() as *mut PUDE);
// unmap_page_upper_directory(
// cap.get_pud_mapped_asid(),
// cap.get_pud_mapped_address(),
// pud,
// );
// }
// }
// CapTag::CapPageDirectoryCap => {
// if final_ && cap.get_pd_is_mapped() == 1 {
// let pd = ptr_to_mut(cap.get_pt_base_ptr() as *mut PDE);
// unmap_page_directory(cap.get_pd_mapped_asid(), cap.get_pd_mapped_address(), pd);
// }
// }
CapTag::CapPageTableCap => {
if final_ && cap.get_pt_is_mapped() == 1 {
let pte = ptr_to_mut(cap.get_pt_base_ptr() as *mut PTE);
Expand Down Expand Up @@ -275,7 +278,7 @@ pub fn deleteASID(asid: asid_t, vspace: *mut PTE) {

#[no_mangle]
#[cfg(target_arch = "aarch64")]
pub fn deleteASID(asid: asid_t, vspace: *mut PGDE) {
pub fn deleteASID(asid: asid_t, vspace: *mut PTE) {
unsafe {
if let Err(lookup_fault) = delete_asid(
asid,
Expand Down
134 changes: 73 additions & 61 deletions kernel/src/syscall/invocation/decode/arch/aarch64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use crate::utils::clear_memory_pt;
use log::debug;
use sel4_common::arch::maskVMRights;
use sel4_common::cap_rights::seL4_CapRights_t;
use sel4_common::fault::lookup_fault_t;
use sel4_common::fault::{lookup_fault_missing_capability, lookup_fault_t};
use sel4_common::sel4_config::{
asidInvalid, asidLowBits, nASIDPools, seL4_AlignmentError, seL4_FailedLookup, seL4_RangeError,
ARM_Huge_Page, ARM_Large_Page, ARM_Small_Page, PAGE_BITS, PGD_INDEX_OFFSET, PUD_INDEX_OFFSET,
Expand Down Expand Up @@ -487,68 +487,80 @@ fn decode_frame_map(length: usize, frame_slot: &mut cte_t, buffer: &seL4_IPCBuff
// frame_slot.cap.set_frame_mapped_asid(asid);
// frame_slot.cap.set_frame_mapped_address(vaddr);

let vspace_root = PGDE::new_from_pte(vspace_root);
let vspace_root = PTE::new_from_pte(vspace_root);
let base = pptr_to_paddr(frame_slot.cap.get_frame_base_ptr());
match frame_size {
ARM_Small_Page => {
let lu_ret = vspace_root.lookup_pt_slot(vaddr);
if lu_ret.status != exception_t::EXCEPTION_NONE {
unsafe {
current_syscall_error._type = seL4_FailedLookup;
current_syscall_error.failedLookupWasSource = 0;
}
return exception_t::EXCEPTION_SYSCALL_ERROR;
}
set_thread_state(get_currenct_thread(), ThreadState::ThreadStateRestart);
let ptSlot = convert_to_mut_type_ref::<PTE>(lu_ret.ptSlot as usize);
invoke_small_page_map(
vaddr,
asid,
frame_slot,
makeUser3rdLevel(base, vm_rights, attr),
ptSlot,
)
}
ARM_Large_Page => {
let lu_ret = vspace_root.lookup_pd_slot(vaddr);
if lu_ret.status != exception_t::EXCEPTION_NONE {
unsafe {
current_syscall_error._type = seL4_FailedLookup;
current_syscall_error.failedLookupWasSource = 0;
}
return exception_t::EXCEPTION_SYSCALL_ERROR;
}
set_thread_state(get_currenct_thread(), ThreadState::ThreadStateRestart);
let pdSlot = convert_to_mut_type_ref::<PDE>(lu_ret.pdSlot as usize);
invoke_large_page_map(
vaddr,
asid,
frame_slot,
make_user_2nd_level(base, vm_rights, attr),
pdSlot,
)
}
ARM_Huge_Page => {
let lu_ret = vspace_root.lookup_pud_slot(vaddr);
if lu_ret.status != exception_t::EXCEPTION_NONE {
unsafe {
current_syscall_error._type = seL4_FailedLookup;
current_syscall_error.failedLookupWasSource = 0;
}
return exception_t::EXCEPTION_SYSCALL_ERROR;
}
set_thread_state(get_currenct_thread(), ThreadState::ThreadStateRestart);
let pudSlot = convert_to_mut_type_ref::<PUDE>(lu_ret.pudSlot as usize);
invoke_huge_page_map(
vaddr,
asid,
frame_slot,
make_user_1st_level(base, vm_rights, attr),
pudSlot,
)
let lu_ret = vspace_root.lookup_pt_slot(vaddr);
if lu_ret.ptBitsLeft != pageBitsForSize(frame_size) {
unsafe {
current_lookup_fault = lookup_fault_missing_capability;
current_syscall_error._type = seL4_FailedLookup;
current_syscall_error.failedLookupWasSource = 0;
return exception_t::EXCEPTION_SYSCALL_ERROR;
}
_ => exception_t::EXCEPTION_SYSCALL_ERROR,
}
set_thread_state(get_currenct_thread(), ThreadState::ThreadStateRestart);
// TODO: unimplement
return invoke_page_map();
}
// match frame_size {
// ARM_Small_Page => {
// let lu_ret = vspace_root.lookup_pt_slot(vaddr);
// if lu_ret.status != exception_t::EXCEPTION_NONE {
// unsafe {
// current_syscall_error._type = seL4_FailedLookup;
// current_syscall_error.failedLookupWasSource = 0;
// }
// return exception_t::EXCEPTION_SYSCALL_ERROR;
// }
// set_thread_state(get_currenct_thread(), ThreadState::ThreadStateRestart);
// let ptSlot = convert_to_mut_type_ref::<PTE>(lu_ret.ptSlot as usize);
// invoke_small_page_map(
// vaddr,
// asid,
// frame_slot,
// makeUser3rdLevel(base, vm_rights, attr),
// ptSlot,
// )
// }
// ARM_Large_Page => {
// let lu_ret = vspace_root.lookup_pd_slot(vaddr);
// if lu_ret.status != exception_t::EXCEPTION_NONE {
// unsafe {
// current_syscall_error._type = seL4_FailedLookup;
// current_syscall_error.failedLookupWasSource = 0;
// }
// return exception_t::EXCEPTION_SYSCALL_ERROR;
// }
// set_thread_state(get_currenct_thread(), ThreadState::ThreadStateRestart);
// let pdSlot = convert_to_mut_type_ref::<PDE>(lu_ret.pdSlot as usize);
// invoke_large_page_map(
// vaddr,
// asid,
// frame_slot,
// make_user_2nd_level(base, vm_rights, attr),
// pdSlot,
// )
// }
// ARM_Huge_Page => {
// let lu_ret = vspace_root.lookup_pud_slot(vaddr);
// if lu_ret.status != exception_t::EXCEPTION_NONE {
// unsafe {
// current_syscall_error._type = seL4_FailedLookup;
// current_syscall_error.failedLookupWasSource = 0;
// }
// return exception_t::EXCEPTION_SYSCALL_ERROR;
// }
// set_thread_state(get_currenct_thread(), ThreadState::ThreadStateRestart);
// let pudSlot = convert_to_mut_type_ref::<PUDE>(lu_ret.pudSlot as usize);
// invoke_huge_page_map(
// vaddr,
// asid,
// frame_slot,
// make_user_1st_level(base, vm_rights, attr),
// pudSlot,
// )
// }
// _ => exception_t::EXCEPTION_SYSCALL_ERROR,
// }
// if length < 3 || get_extra_cap_by_index(0).is_none() {
// debug!("ARMPageMap: Truncated message.");
// unsafe {
Expand Down
152 changes: 81 additions & 71 deletions kernel/src/syscall/invocation/invoke_mmu_op.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,82 +138,92 @@ pub fn invoke_page_map(
exception_t::EXCEPTION_NONE
}
#[cfg(target_arch = "aarch64")]
pub fn invoke_huge_page_map(
vaddr: usize,
asid: usize,
frame_slot: &mut cte_t,
pude: PUDE,
pudSlot: &mut PUDE,
) -> exception_t {
frame_slot.cap.set_frame_mapped_address(vaddr);
frame_slot.cap.set_frame_mapped_asid(asid);
*pudSlot = pude;
unsafe {
asm!(
"dc cvau, {}",
"dmb sy",
in(reg) pudSlot,
);
}
let tlbflush_required = pudSlot.get_pude_type() == 1;
if tlbflush_required {
assert!(asid < BIT!(16));
invalidate_tlb_by_asid_va(asid, vaddr);
}
exception_t::EXCEPTION_NONE
}
pub fn invoke_page_map(
_frame_cap: &mut cap_t,

#[cfg(target_arch = "aarch64")]
pub fn invoke_large_page_map(
vaddr: usize,
asid: usize,
pt_slot: &mut PTE,
frame_slot: &mut cte_t,
pde: PDE,
pdSlot: &mut PDE,
) -> exception_t {
frame_slot.cap.set_frame_mapped_address(vaddr);
frame_slot.cap.set_frame_mapped_asid(asid);
*pdSlot = pde;
unsafe {
asm!(
"dc cvau, {}",
"dmb sy",
in(reg) pdSlot,
);
}
let tlbflush_required = pdSlot.get_pde_type() == 1;
if tlbflush_required {
assert!(asid < BIT!(16));
invalidate_tlb_by_asid_va(asid, vaddr);
}
exception_t::EXCEPTION_NONE
) {
// TODO:unimplement
}
// #[cfg(target_arch = "aarch64")]
// pub fn invoke_huge_page_map(
// vaddr: usize,
// asid: usize,
// frame_slot: &mut cte_t,
// pude: PUDE,
// pudSlot: &mut PUDE,
// ) -> exception_t {
// frame_slot.cap.set_frame_mapped_address(vaddr);
// frame_slot.cap.set_frame_mapped_asid(asid);
// *pudSlot = pude;
// unsafe {
// asm!(
// "dc cvau, {}",
// "dmb sy",
// in(reg) pudSlot,
// );
// }
// let tlbflush_required = pudSlot.get_pude_type() == 1;
// if tlbflush_required {
// assert!(asid < BIT!(16));
// invalidate_tlb_by_asid_va(asid, vaddr);
// }
// exception_t::EXCEPTION_NONE
// }

#[cfg(target_arch = "aarch64")]
pub fn invoke_small_page_map(
vaddr: usize,
asid: usize,
frame_slot: &mut cte_t,
pte: PTE,
ptSlot: &mut PTE,
) -> exception_t {
frame_slot.cap.set_frame_mapped_address(vaddr);
frame_slot.cap.set_frame_mapped_asid(asid);
*ptSlot = pte;
unsafe {
asm!(
"dc cvau, {}",
"dmb sy",
in(reg) ptSlot,
);
}
let tlbflush_required = ptSlot.is_present();
if tlbflush_required {
assert!(asid < BIT!(16));
invalidate_tlb_by_asid_va(asid, vaddr);
}
exception_t::EXCEPTION_NONE
}
// #[cfg(target_arch = "aarch64")]
// pub fn invoke_large_page_map(
// vaddr: usize,
// asid: usize,
// frame_slot: &mut cte_t,
// pde: PDE,
// pdSlot: &mut PDE,
// ) -> exception_t {
// frame_slot.cap.set_frame_mapped_address(vaddr);
// frame_slot.cap.set_frame_mapped_asid(asid);
// *pdSlot = pde;
// unsafe {
// asm!(
// "dc cvau, {}",
// "dmb sy",
// in(reg) pdSlot,
// );
// }
// let tlbflush_required = pdSlot.get_pde_type() == 1;
// if tlbflush_required {
// assert!(asid < BIT!(16));
// invalidate_tlb_by_asid_va(asid, vaddr);
// }
// exception_t::EXCEPTION_NONE
// }

// #[cfg(target_arch = "aarch64")]
// pub fn invoke_small_page_map(
// vaddr: usize,
// asid: usize,
// frame_slot: &mut cte_t,
// pte: PTE,
// ptSlot: &mut PTE,
// ) -> exception_t {
// frame_slot.cap.set_frame_mapped_address(vaddr);
// frame_slot.cap.set_frame_mapped_asid(asid);
// *ptSlot = pte;
// unsafe {
// asm!(
// "dc cvau, {}",
// "dmb sy",
// in(reg) ptSlot,
// );
// }
// let tlbflush_required = ptSlot.is_present();
// if tlbflush_required {
// assert!(asid < BIT!(16));
// invalidate_tlb_by_asid_va(asid, vaddr);
// }
// exception_t::EXCEPTION_NONE
// }

#[cfg(target_arch = "riscv64")]
pub fn invoke_asid_control(
Expand Down
Loading

0 comments on commit ed5bae0

Please sign in to comment.