Skip to content

Commit

Permalink
Update kernel 5 (#14)
Browse files Browse the repository at this point in the history
* fix the word the vs used

* fix the page bug, and let the root task work
  • Loading branch information
ZhiyuanSue authored Sep 18, 2024
1 parent a7e3a93 commit af4ab11
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 37 deletions.
15 changes: 8 additions & 7 deletions kernel/src/syscall/invocation/decode/arch/aarch64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,17 +140,17 @@ fn decode_page_table_invocation(
let pd_slot = PTE(vspace_root).lookup_pt_slot(vaddr);

if unlikely(
pd_slot.ptBitsLeft != seL4_PageBits
pd_slot.ptBitsLeft == seL4_PageBits
|| ptr_to_ref(pd_slot.ptSlot).get_type() != (pte_tag_t::pte_invalid) as usize,
) {
global_ops!(current_syscall_error._type = seL4_DeleteFirst);
return exception_t::EXCEPTION_SYSCALL_ERROR;
}

let pte = PTE::pte_new_table(pptr_to_paddr(cte.cap.get_pt_base_ptr()));
cte.cap.set_pt_is_mapped(1);
cte.cap.set_pt_mapped_asid(asid);
cte.cap.set_pt_mapped_address(vaddr);
cte.cap
.set_pt_mapped_address(vaddr & !(MASK!(pd_slot.ptBitsLeft)));
get_currenct_thread().set_state(ThreadState::ThreadStateRestart);

*ptr_to_mut(pd_slot.ptSlot) = pte;
Expand Down Expand Up @@ -480,9 +480,9 @@ 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 mut vspace_root = PTE::new_from_pte(vspace_root);
let mut vspace_root_pte = PTE::new_from_pte(vspace_root);
let base = pptr_to_paddr(frame_slot.cap.get_frame_base_ptr());
let lu_ret = vspace_root.lookup_pt_slot(vaddr);
let lu_ret = vspace_root_pte.lookup_pt_slot(vaddr);
if unlikely(lu_ret.ptBitsLeft != pageBitsForSize(frame_size)) {
unsafe {
current_lookup_fault = lookup_fault_t::new_missing_cap(lu_ret.ptBitsLeft);
Expand All @@ -491,13 +491,14 @@ fn decode_frame_map(length: usize, frame_slot: &mut cte_t, buffer: &seL4_IPCBuff
return exception_t::EXCEPTION_SYSCALL_ERROR;
}
}
let pt_slot = convert_to_mut_type_ref::<PTE>(lu_ret.ptSlot as usize);
set_thread_state(get_currenct_thread(), ThreadState::ThreadStateRestart);
return invoke_page_map(
asid,
frame_slot.cap,
frame_slot.cap.clone(),
frame_slot,
PTE::make_user_pte(base, vm_rights, attr, frame_size),
ptr_to_mut(lu_ret.ptSlot),
pt_slot,
);
// match frame_size {
// ARM_Small_Page => {
Expand Down
12 changes: 5 additions & 7 deletions kernel/src/syscall/invocation/invoke_mmu_op.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ use sel4_common::arch::ArchReg;
#[cfg(target_arch = "aarch64")]
use sel4_common::BIT;

#[cfg(target_arch = "aarch64")]
use sel4_common::utils::convert_ref_type_to_usize;
#[cfg(target_arch = "riscv64")]
use sel4_common::{
arch::maskVMRights,
Expand All @@ -12,13 +14,9 @@ use sel4_common::{
MASK,
};
use sel4_common::{
message_info::seL4_MessageInfo_t,
sel4_config::*,
structures::exception_t,
message_info::seL4_MessageInfo_t, sel4_config::*, structures::exception_t,
utils::convert_to_mut_type_ref,
};
#[cfg(target_arch = "aarch64")]
use sel4_common::utils::convert_ref_type_to_usize;
#[cfg(target_arch = "riscv64")]
use sel4_cspace::interface::cte_insert;
use sel4_cspace::interface::{cap_t, cte_t};
Expand Down Expand Up @@ -151,10 +149,10 @@ pub fn invoke_page_map(
pt_slot: &mut PTE,
) -> exception_t {
let tlbflush_required: bool = pt_slot.get_type() != (pte_tag_t::pte_invalid) as usize;
frame_slot.cap = cap;
// frame_slot.cap = cap;
pt_slot.update(pte);

clean_by_va_pou(
clean_by_va_pou(
convert_ref_type_to_usize(pt_slot),
pptr_to_paddr(convert_ref_type_to_usize(pt_slot)),
);
Expand Down
5 changes: 1 addition & 4 deletions sel4_common/src/arch/aarch64/message_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,7 @@ pub enum MessageLabel {
ARMVSpaceInvalidate_Data,
ARMVSpaceCleanInvalidate_Data,
ARMVSpaceUnify_Instruction,
ARMPageUpperDirectoryMap,
ARMPageUpperDirectoryUnmap,
ARMPageDirectoryMap,
ARMPageDirectoryUnmap,
ARMSMCCall,
ARMPageTableMap,
ARMPageTableUnmap,
ARMPageMap,
Expand Down
2 changes: 1 addition & 1 deletion sel4_cspace/src/arch/aarch64/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ plus_define_bitfield! {
// capPGDIsMapped, get_pgd_is_mapped, set_pgd_is_mapped, 0, 58, 1, 0, false
// },
new_vspace_cap, CapTag::CapVspaceCap as usize => {
capVSMappedASID, get_vs_mapped_asid, set_vs_mapped_asid, 0, 48, 16, 0, false,
capVSMappedASID, get_vs_mapped_asid, set_vs_mapped_asid, 1, 48, 16, 0, false,
capVSBasePtr, get_vs_base_ptr, set_vs_base_ptr, 1, 0, 48, 0, true,
capVSIsMapped, get_vs_is_mapped, set_vs_is_mapped, 0, 58, 1, 0, false
},
Expand Down
5 changes: 1 addition & 4 deletions sel4_vspace/src/arch/aarch64/interface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@ use core::ops::{Deref, DerefMut};
use super::pte::pte_tag_t;
use super::{kpptr_to_paddr, machine::*, UPT_LEVELS};
use crate::arch::VAddr;
use crate::{
asid_t, find_vspace_for_asid, paddr_to_pptr, pptr_t, pptr_to_paddr,
vptr_t, PTE,
};
use crate::{asid_t, find_vspace_for_asid, paddr_to_pptr, pptr_t, pptr_to_paddr, vptr_t, PTE};
use sel4_common::arch::MessageLabel;
use sel4_common::structures::exception_t;
use sel4_common::utils::{pageBitsForSize, ptr_to_mut};
Expand Down
44 changes: 32 additions & 12 deletions sel4_vspace/src/arch/aarch64/pte.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ use super::utils::paddr_to_pptr;
use super::{seL4_VSpaceIndexBits, UPT_LEVELS};
use crate::{lookupPTSlot_ret_t, vptr_t};
use sel4_common::utils::ptr_to_mut;
use sel4_common::MASK;
use sel4_common::{
arch::vm_rights_t,
sel4_config::{seL4_PageBits, seL4_PageTableBits, PT_INDEX_BITS},
utils::{convert_ref_type_to_usize, convert_to_mut_type_ref},
BIT,
};
use sel4_common::MASK;

#[allow(unused)]
pub enum VMPageSize {
Expand Down Expand Up @@ -194,11 +194,30 @@ impl PTE {
if nonexecutable {
flags |= PTEFlags::UXN;
}
let nG: usize = 1;
flags |= Self::ap_from_vm_rights_t(rights);
// let vm_right:usize = Self::ap_from_vm_rights_t(rights) as usize;
// TODO:change the apfromvmright and attridx
if VMPageSize::ARMSmallPage as usize == page_size {
PTE::new_4k_page(paddr, flags)
PTE::pte_new_4k_page(
nonexecutable as usize,
paddr,
nG,
1,
0,
1,
0b100,
)
} else {
PTE::new(paddr, flags)
PTE::pte_new_page(
nonexecutable as usize,
paddr,
nG,
1,
0,
1,
0b100,
)
}
}

Expand All @@ -224,12 +243,12 @@ impl PTE {
| (SH & 0x3) << 8
| (AP & 0x3) << 6
| (AttrIndx & 0x7) << 2
| (0x1 << 0);
| (0x1 << 0);

PTE(val)
}

pub fn pte_new_4k_page(
pub fn pte_new_4k_page(
UXN: usize,
page_base_address: usize,
nG: usize,
Expand All @@ -246,27 +265,28 @@ impl PTE {
| (SH & 0x3) << 8
| (AP & 0x3) << 6
| (AttrIndx & 0x7) << 2
| 0x400000000000003;
| 0x400000000000003;
PTE(val)
}
///用于记录某个虚拟地址`vptr`对应的pte表项在内存中的位置
pub fn lookup_pt_slot(&mut self, vptr: vptr_t) -> lookupPTSlot_ret_t {
let mut pt = self as *mut PTE;
let mut pt = self.0 as *mut PTE;
let mut level: usize = UPT_LEVELS - 1;
let ptBitsLeft = PT_INDEX_BITS * level + seL4_PageBits;
let mut ret = lookupPTSlot_ret_t {
ptSlot: unsafe { pt.add((vptr >> ptBitsLeft) & MASK!(seL4_VSpaceIndexBits)) },
pt = unsafe { pt.add((vptr >> ptBitsLeft) & MASK!(seL4_VSpaceIndexBits)) };
let mut ret: lookupPTSlot_ret_t = lookupPTSlot_ret_t {
ptSlot: pt,
ptBitsLeft: ptBitsLeft,
};

while ptr_to_mut(ret.ptSlot).get_type() == (pte_tag_t::pte_table) as usize && level > 0 {
level = level - 1;
ret.ptBitsLeft = ret.ptBitsLeft - PT_INDEX_BITS;
let paddr = ptr_to_mut(ret.ptSlot).next_level_paddr();
pt = paddr_to_pptr(paddr) as *mut PTE;
ret.ptSlot = unsafe { pt.add((vptr >> ptBitsLeft) & MASK!(PT_INDEX_BITS)) };
pt = unsafe { pt.add((vptr >> ret.ptBitsLeft) & MASK!(PT_INDEX_BITS)) };
ret.ptSlot = pt;
}

ret
}
}
3 changes: 1 addition & 2 deletions sel4_vspace/src/arch/aarch64/structures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ use core::ops::{Deref, DerefMut};

use crate::{vm_attributes_t, PTE};
use sel4_common::{
plus_define_bitfield, sel4_config::asidLowBits,
utils::convert_to_mut_type_ref, BIT,
plus_define_bitfield, sel4_config::asidLowBits, utils::convert_to_mut_type_ref, BIT,
};

use super::machine::mair_types;
Expand Down

0 comments on commit af4ab11

Please sign in to comment.