add some func

This commit is contained in:
hustccc 2021-03-22 06:08:40 +09:00
parent 350220046a
commit 728566e0fb
4 changed files with 26 additions and 2 deletions

View File

@ -132,6 +132,7 @@ pub extern "C" fn rust_main(hart_id: usize) -> ! {
riscv::register::sscratch::write(0); // todo 寄存器sscratch
riscv::register::sstatus::set_sie() // todo 允许被特权级中断打断
};
task::run_until_idle(
|| unsafe { task::shared_pop_task(shared_scheduler) },
|handle| unsafe { task::shared_add_task(shared_scheduler, handle) }
@ -206,3 +207,7 @@ impl Future for FibonacciFuture {
}
}
}
fn try_enter_user() -> ! {
}

View File

@ -142,6 +142,20 @@ impl Mapping {
asm!("sfence.vma x0, {asid}", asid = in(reg) asid);
}
}
/// 获取当前映射的satp寄存器值
pub fn get_satp(&self, asid: AddressSpaceId) -> usize {
// 60..64 mode
// 44..60 asid
// 0..44 ppn
use riscv::register::satp::Mode;
use bit_field::BitField;
let mut bits = 0usize;
bits.set_bits(60..64, Mode::Sv39 as usize);
bits.set_bits(44..60, asid.into_inner());
bits.set_bits(0..44, self.root_ppn.into());
bits
}
}
// 找到包含虚拟地址段的所有虚拟页

View File

@ -58,6 +58,11 @@ impl Process {
flags |= Flags::VALID;
self.inner.lock().memory_set.alloc_page_range(STACK_SIZE, flags)
}
/// 得到进程对应的satp寄存器值
pub fn satp(&self) -> usize {
let asid = self.inner.lock().memory_set.address_space_id;
self.inner.lock().memory_set.mapping.get_satp(asid)
}
}
/// 进程的编号

View File

@ -236,7 +236,7 @@ use crate::memory::{SWAP_FRAME_VA, SWAP_CONTEXT_VA};
/// 上升到用户态
/// 目前让这个函数接收一个 SwapContext 参数和用户的页表,测试使用
pub fn switch_to_user(context: SwapContext, satp: usize) -> ! {
pub fn switch_to_user(context: &SwapContext, satp: usize) -> ! {
use riscv::register::{sstatus::{self, SPP}, stvec::{self, TrapMode}};
// 关中断
unsafe { sstatus::clear_sie(); }
@ -257,7 +257,7 @@ pub fn switch_to_user(context: SwapContext, satp: usize) -> ! {
riscv::register::sepc::write(context.epc);
// todo: 如何处理 tp 寄存器
// 用户 satp 寄存器
// 需要获取当前任务的页表
let user_satp: usize = satp;