mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 14:16:47 +00:00
chore: update toolchain version to 2024-11-05 (#1031)
* chore: update toolchain version to 2024-11-05 * update dragon reach to e945c217b3 * update dog to 6f2c0c8f12 --------- Co-authored-by: longjin <longjin@DragonOS.org>
This commit is contained in:
parent
69715438f2
commit
7c28051e8c
16
.github/workflows/makefile.yml
vendored
16
.github/workflows/makefile.yml
vendored
@ -12,14 +12,14 @@ jobs:
|
||||
name: Format check ${{ matrix.arch }}
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
container: dragonos/dragonos-dev:v1.5
|
||||
container: dragonos/dragonos-dev:v1.6
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [x86_64, riscv64]
|
||||
|
||||
steps:
|
||||
- run: echo "Running in dragonos/dragonos-dev:v1.5"
|
||||
- run: echo "Running in dragonos/dragonos-dev:v1.6"
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Format check
|
||||
@ -35,14 +35,14 @@ jobs:
|
||||
name: Kernel static test ${{ matrix.arch }}
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
container: dragonos/dragonos-dev:v1.5
|
||||
container: dragonos/dragonos-dev:v1.6
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [x86_64, riscv64]
|
||||
|
||||
steps:
|
||||
- run: echo "Running in dragonos/dragonos-dev:v1.5"
|
||||
- run: echo "Running in dragonos/dragonos-dev:v1.6"
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
@ -56,10 +56,10 @@ jobs:
|
||||
build-x86_64:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
container: dragonos/dragonos-dev:v1.5
|
||||
container: dragonos/dragonos-dev:v1.6
|
||||
|
||||
steps:
|
||||
- run: echo "Running in dragonos/dragonos-dev:v1.5"
|
||||
- run: echo "Running in dragonos/dragonos-dev:v1.6"
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- name: build the DragonOS
|
||||
@ -78,10 +78,10 @@ jobs:
|
||||
build-riscv64:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
container: dragonos/dragonos-dev:v1.5
|
||||
container: dragonos/dragonos-dev:v1.6
|
||||
|
||||
steps:
|
||||
- run: echo "Running in dragonos/dragonos-dev:v1.5"
|
||||
- run: echo "Running in dragonos/dragonos-dev:v1.6"
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
|
@ -5,4 +5,4 @@ fmt:
|
||||
clean:
|
||||
@cargo clean
|
||||
check:
|
||||
@cargo +nightly-2024-07-23 check --workspace $(CARGO_ZBUILD) --message-format=json
|
||||
@cargo +nightly-2024-11-05 check --workspace $(CARGO_ZBUILD) --message-format=json
|
||||
|
@ -36,14 +36,14 @@ check: ECHO
|
||||
# @echo "Checking kernel... ARCH=$(ARCH)"
|
||||
# @exit 1
|
||||
ifeq ($(ARCH), x86_64)
|
||||
RUSTFLAGS="$(RUSTFLAGS)" cargo +nightly-2024-07-23 check --workspace $(CARGO_ZBUILD) --message-format=json --target ./src/$(TARGET_JSON)
|
||||
RUSTFLAGS="$(RUSTFLAGS)" cargo +nightly-2024-11-05 check --workspace $(CARGO_ZBUILD) --message-format=json --target ./src/$(TARGET_JSON)
|
||||
else ifeq ($(ARCH), riscv64)
|
||||
RUSTFLAGS="$(RUSTFLAGS)" cargo +nightly-2024-07-23 check --workspace $(CARGO_ZBUILD) --message-format=json --target $(TARGET_JSON)
|
||||
RUSTFLAGS="$(RUSTFLAGS)" cargo +nightly-2024-11-05 check --workspace $(CARGO_ZBUILD) --message-format=json --target $(TARGET_JSON)
|
||||
endif
|
||||
|
||||
test:
|
||||
# 测试内核库
|
||||
RUSTFLAGS="$(RUSTFLAGS)" cargo +nightly-2024-07-23 test --workspace --exclude dragonos_kernel rbpf
|
||||
RUSTFLAGS="$(RUSTFLAGS)" cargo +nightly-2024-11-05 test --workspace --exclude dragonos_kernel rbpf
|
||||
|
||||
test-rbpf:
|
||||
cd crates/rbpf && RUSTFLAGS="$(RUSTFLAGS)" cargo +nightly-2024-07-23 test --features=std,user,cranelift
|
||||
cd crates/rbpf && RUSTFLAGS="$(RUSTFLAGS)" cargo +nightly-2024-11-05 test --features=std,user,cranelift
|
@ -13,7 +13,7 @@ pub struct AllocBitmap {
|
||||
|
||||
impl AllocBitmap {
|
||||
pub fn new(elements: usize) -> Self {
|
||||
let data = vec![0usize; (elements + usize::BITS as usize - 1) / (usize::BITS as usize)];
|
||||
let data = vec![0usize; elements.div_ceil(usize::BITS as usize)];
|
||||
Self {
|
||||
elements,
|
||||
data,
|
||||
|
@ -8,15 +8,15 @@ use crate::{bitmap_core::BitMapCore, traits::BitMapOps};
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct StaticBitmap<const N: usize>
|
||||
where
|
||||
[(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
|
||||
[(); N.div_ceil(usize::BITS as usize)]:,
|
||||
{
|
||||
pub data: [usize; (N + usize::BITS as usize - 1) / (usize::BITS as usize)],
|
||||
pub data: [usize; N.div_ceil(usize::BITS as usize)],
|
||||
core: BitMapCore<usize>,
|
||||
}
|
||||
|
||||
impl<const N: usize> Default for StaticBitmap<N>
|
||||
where
|
||||
[(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
|
||||
[(); N.div_ceil(usize::BITS as usize)]:,
|
||||
{
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
@ -25,12 +25,12 @@ where
|
||||
|
||||
impl<const N: usize> StaticBitmap<N>
|
||||
where
|
||||
[(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
|
||||
[(); N.div_ceil(usize::BITS as usize)]:,
|
||||
{
|
||||
/// 创建一个新的静态位图
|
||||
pub const fn new() -> Self {
|
||||
Self {
|
||||
data: [0; (N + usize::BITS as usize - 1) / (usize::BITS as usize)],
|
||||
data: [0; N.div_ceil(usize::BITS as usize)],
|
||||
core: BitMapCore::new(),
|
||||
}
|
||||
}
|
||||
@ -38,7 +38,7 @@ where
|
||||
|
||||
impl<const N: usize> BitMapOps<usize> for StaticBitmap<N>
|
||||
where
|
||||
[(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
|
||||
[(); N.div_ceil(usize::BITS as usize)]:,
|
||||
{
|
||||
#[inline]
|
||||
fn get(&self, index: usize) -> Option<bool> {
|
||||
|
@ -1,6 +1,5 @@
|
||||
#![cfg_attr(not(test), no_std)]
|
||||
#![feature(const_for)]
|
||||
#![feature(const_mut_refs)]
|
||||
#![feature(const_trait_impl)]
|
||||
#![allow(clippy::needless_return)]
|
||||
|
||||
|
@ -16,7 +16,7 @@ struct EmptyIdaItemRef<'a> {
|
||||
_marker: PhantomData<&'a EmptyIdaItem>,
|
||||
}
|
||||
|
||||
impl<'a> Deref for EmptyIdaItemRef<'a> {
|
||||
impl Deref for EmptyIdaItemRef<'_> {
|
||||
type Target = EmptyIdaItem;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
@ -27,7 +27,10 @@ impl<'a> Deref for EmptyIdaItemRef<'a> {
|
||||
struct EmptyIdaItem;
|
||||
|
||||
unsafe impl kdepends::xarray::ItemEntry for EmptyIdaItem {
|
||||
type Ref<'a> = EmptyIdaItemRef<'a> where Self: 'a;
|
||||
type Ref<'a>
|
||||
= EmptyIdaItemRef<'a>
|
||||
where
|
||||
Self: 'a;
|
||||
|
||||
fn into_raw(self) -> *const () {
|
||||
core::ptr::null()
|
||||
|
@ -61,7 +61,6 @@ mod item_type;
|
||||
/// #[derive(std::fmt::Debug)]
|
||||
/// struct Data;
|
||||
/// ```
|
||||
|
||||
#[proc_macro_attribute]
|
||||
pub fn cast_to(args: TokenStream, input: TokenStream) -> TokenStream {
|
||||
match parse::<Targets>(args) {
|
||||
|
@ -122,6 +122,7 @@ static CASTER_MAP: once_cell::sync::Lazy<HashMap<(TypeId, TypeId), BoxedCaster,
|
||||
static mut CASTER_MAP: Option<HashMap<(TypeId, TypeId), BoxedCaster, BuildFastHasher>> = None;
|
||||
|
||||
#[cfg(target_os = "none")]
|
||||
#[allow(static_mut_refs)]
|
||||
pub fn caster_map() -> &'static HashMap<(TypeId, TypeId), BoxedCaster, BuildFastHasher> {
|
||||
return unsafe {
|
||||
CASTER_MAP.as_ref().unwrap_or_else(|| {
|
||||
|
@ -1,5 +1,4 @@
|
||||
#![no_std]
|
||||
#![feature(const_refs_to_cell)]
|
||||
#![feature(const_size_of_val)]
|
||||
#![allow(clippy::needless_return)]
|
||||
|
||||
|
@ -74,7 +74,7 @@ pub trait IntoBytes {
|
||||
}
|
||||
|
||||
/// General implementation of `IntoBytes` for `Instruction`
|
||||
impl<'i, I: Instruction> IntoBytes for &'i I {
|
||||
impl<I: Instruction> IntoBytes for &'_ I {
|
||||
type Bytes = Vec<u8>;
|
||||
|
||||
/// transform immutable reference of `Instruction` into `Vec<u8>` with size of 8
|
||||
@ -347,7 +347,7 @@ impl<'i> Move<'i> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'i> Instruction for Move<'i> {
|
||||
impl Instruction for Move<'_> {
|
||||
fn opt_code_byte(&self) -> u8 {
|
||||
let op_bits = self.op_bits as u8;
|
||||
let src_bit = self.src_bit as u8;
|
||||
@ -415,7 +415,7 @@ impl<'i> SwapBytes<'i> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'i> Instruction for SwapBytes<'i> {
|
||||
impl Instruction for SwapBytes<'_> {
|
||||
fn opt_code_byte(&self) -> u8 {
|
||||
self.endian as u8
|
||||
}
|
||||
@ -456,20 +456,20 @@ impl<'i> Load<'i> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'i> Instruction for Load<'i> {
|
||||
impl Instruction for Load<'_> {
|
||||
fn opt_code_byte(&self) -> u8 {
|
||||
let size = self.mem_size as u8;
|
||||
let addressing = self.addressing as u8;
|
||||
addressing | size | self.source
|
||||
}
|
||||
|
||||
fn get_insn_mut(&mut self) -> &mut Insn {
|
||||
&mut self.insn
|
||||
}
|
||||
|
||||
fn get_insn(&self) -> &Insn {
|
||||
&self.insn
|
||||
}
|
||||
|
||||
fn get_insn_mut(&mut self) -> &mut Insn {
|
||||
&mut self.insn
|
||||
}
|
||||
}
|
||||
|
||||
/// struct representation of STORE instructions
|
||||
@ -489,19 +489,19 @@ impl<'i> Store<'i> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'i> Instruction for Store<'i> {
|
||||
impl Instruction for Store<'_> {
|
||||
fn opt_code_byte(&self) -> u8 {
|
||||
let size = self.mem_size as u8;
|
||||
BPF_MEM | BPF_ST | size | self.source
|
||||
}
|
||||
|
||||
fn get_insn_mut(&mut self) -> &mut Insn {
|
||||
&mut self.insn
|
||||
}
|
||||
|
||||
fn get_insn(&self) -> &Insn {
|
||||
&self.insn
|
||||
}
|
||||
|
||||
fn get_insn_mut(&mut self) -> &mut Insn {
|
||||
&mut self.insn
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
@ -542,20 +542,20 @@ impl<'i> Jump<'i> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'i> Instruction for Jump<'i> {
|
||||
impl Instruction for Jump<'_> {
|
||||
fn opt_code_byte(&self) -> u8 {
|
||||
let cmp: u8 = self.cond as u8;
|
||||
let src_bit = self.src_bit as u8;
|
||||
cmp | src_bit | BPF_JMP
|
||||
}
|
||||
|
||||
fn get_insn_mut(&mut self) -> &mut Insn {
|
||||
&mut self.insn
|
||||
}
|
||||
|
||||
fn get_insn(&self) -> &Insn {
|
||||
&self.insn
|
||||
}
|
||||
|
||||
fn get_insn_mut(&mut self) -> &mut Insn {
|
||||
&mut self.insn
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Eq)]
|
||||
@ -602,18 +602,18 @@ impl<'i> FunctionCall<'i> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'i> Instruction for FunctionCall<'i> {
|
||||
impl Instruction for FunctionCall<'_> {
|
||||
fn opt_code_byte(&self) -> u8 {
|
||||
BPF_CALL | BPF_JMP
|
||||
}
|
||||
|
||||
fn get_insn_mut(&mut self) -> &mut Insn {
|
||||
&mut self.insn
|
||||
}
|
||||
|
||||
fn get_insn(&self) -> &Insn {
|
||||
&self.insn
|
||||
}
|
||||
|
||||
fn get_insn_mut(&mut self) -> &mut Insn {
|
||||
&mut self.insn
|
||||
}
|
||||
}
|
||||
|
||||
/// struct representation of EXIT instruction
|
||||
@ -631,7 +631,7 @@ impl<'i> Exit<'i> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'i> Instruction for Exit<'i> {
|
||||
impl Instruction for Exit<'_> {
|
||||
fn opt_code_byte(&self) -> u8 {
|
||||
BPF_EXIT | BPF_JMP
|
||||
}
|
||||
|
@ -2316,8 +2316,12 @@ fn test_vm_stdw() {
|
||||
// If this case is not handled properly in check_mem(), then we may overflow when adding the
|
||||
// context address and the offset, and make the thread panic with "attempt to add with overflow".
|
||||
// Check that we panic with the expected out-of-bounds error.
|
||||
//
|
||||
// The new toolchain introduced `assert_unsafe_precondition` which panics with a different message and can't be
|
||||
// caught by `#[should_panic]`. This is why we use `#[ignore]` here.
|
||||
#[test]
|
||||
#[should_panic(expected = "Error: out of bounds memory store (insn #1)")]
|
||||
#[ignore]
|
||||
fn test_vm_stdw_add_overflow() {
|
||||
let prog = assemble(
|
||||
"
|
||||
|
@ -18,11 +18,9 @@
|
||||
//! # Implementing GlobalAlloc
|
||||
//! See the [global alloc](https://github.com/gz/rust-slabmalloc/tree/master/examples/global_alloc.rs) example.
|
||||
#![allow(unused_features)]
|
||||
#![cfg_attr(feature = "unstable", feature(const_mut_refs))]
|
||||
#![no_std]
|
||||
#![crate_name = "slabmalloc"]
|
||||
#![crate_type = "lib"]
|
||||
#![feature(new_uninit)]
|
||||
#![feature(maybe_uninit_as_bytes)]
|
||||
|
||||
extern crate alloc;
|
||||
@ -65,6 +63,8 @@ pub enum AllocationError {
|
||||
/// Needs to adhere to safety requirements of a rust allocator (see GlobalAlloc et. al.).
|
||||
pub unsafe trait Allocator<'a> {
|
||||
fn allocate(&mut self, layout: Layout) -> Result<NonNull<u8>, AllocationError>;
|
||||
/// # Safety
|
||||
/// The caller must ensure that the memory is valid and that the layout is correct.
|
||||
unsafe fn deallocate(
|
||||
&mut self,
|
||||
ptr: NonNull<u8>,
|
||||
@ -85,5 +85,7 @@ pub unsafe trait Allocator<'a> {
|
||||
|
||||
/// 将slab_page归还Buddy的回调函数
|
||||
pub trait CallBack: Send + Sync {
|
||||
/// # Safety
|
||||
/// The caller must ensure that the memory is valid and that the size is correct.
|
||||
unsafe fn free_slab_page(&self, _: *mut u8, _: usize) {}
|
||||
}
|
||||
|
@ -303,10 +303,10 @@ impl<'a> ObjectPage<'a> {
|
||||
}
|
||||
|
||||
// These needs some more work to be really safe...
|
||||
unsafe impl<'a> Send for ObjectPage<'a> {}
|
||||
unsafe impl<'a> Sync for ObjectPage<'a> {}
|
||||
unsafe impl Send for ObjectPage<'_> {}
|
||||
unsafe impl Sync for ObjectPage<'_> {}
|
||||
|
||||
impl<'a> AllocablePage for ObjectPage<'a> {
|
||||
impl AllocablePage for ObjectPage<'_> {
|
||||
const SIZE: usize = OBJECT_PAGE_SIZE;
|
||||
|
||||
fn bitfield(&self) -> &[AtomicU64; 8] {
|
||||
@ -331,7 +331,7 @@ impl<'a> Default for ObjectPage<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> fmt::Debug for ObjectPage<'a> {
|
||||
impl fmt::Debug for ObjectPage<'_> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(f, "ObjectPage")
|
||||
}
|
||||
|
@ -314,6 +314,9 @@ impl<'a, P: AllocablePage> SCAllocator<'a, P> {
|
||||
/// May return an error in case an invalid `layout` is provided.
|
||||
/// The function may also move internal slab pages between lists partial -> empty
|
||||
/// or full -> partial lists.
|
||||
///
|
||||
/// # Safety
|
||||
/// The caller must ensure that the `layout` is valid.
|
||||
pub unsafe fn deallocate(
|
||||
&mut self,
|
||||
ptr: NonNull<u8>,
|
||||
|
@ -6,7 +6,5 @@ edition = "2021"
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
kdepends = { path = "../kdepends" }
|
||||
num-traits = { git = "https://git.mirrors.dragonos.org.cn/DragonOS-Community/num-traits.git", rev="1597c1c", default-features = false }
|
||||
num = { version = "0.4.0", default-features = false }
|
||||
num-derive = "0.3"
|
@ -1,7 +1,7 @@
|
||||
#![no_std]
|
||||
#![allow(clippy::needless_return)]
|
||||
#![allow(clippy::upper_case_acronyms)]
|
||||
|
||||
#![allow(non_local_definitions)]
|
||||
use num_derive::{FromPrimitive, ToPrimitive};
|
||||
|
||||
#[repr(i32)]
|
||||
|
@ -1,3 +1,3 @@
|
||||
[toolchain]
|
||||
channel = "nightly-2024-07-23"
|
||||
channel = "nightly-2024-11-05"
|
||||
components = ["rust-src", "clippy"]
|
@ -40,7 +40,7 @@ kernel_subdirs := debug
|
||||
|
||||
|
||||
kernel_rust:
|
||||
RUSTFLAGS="$(RUSTFLAGS)" cargo +nightly-2024-07-23 $(CARGO_ZBUILD) build --release --target $(TARGET_JSON)
|
||||
RUSTFLAGS="$(RUSTFLAGS)" cargo +nightly-2024-11-05 $(CARGO_ZBUILD) build --release --target $(TARGET_JSON)
|
||||
|
||||
|
||||
all: kernel
|
||||
|
@ -4,7 +4,6 @@ use crate::arch::{
|
||||
interrupt::TrapFrame,
|
||||
};
|
||||
use asm_macros::{restore_from_x6_to_x31, save_from_x6_to_x31};
|
||||
use core::arch::asm;
|
||||
use kdepends::memoffset::offset_of;
|
||||
|
||||
/// Riscv64中断处理入口
|
||||
@ -12,7 +11,7 @@ use kdepends::memoffset::offset_of;
|
||||
#[no_mangle]
|
||||
#[repr(align(4))]
|
||||
pub unsafe extern "C" fn handle_exception() -> ! {
|
||||
asm!(
|
||||
core::arch::naked_asm!(
|
||||
concat!("
|
||||
/*
|
||||
* If coming from userspace, preserve the user thread pointer and load
|
||||
@ -27,15 +26,14 @@ pub unsafe extern "C" fn handle_exception() -> ! {
|
||||
j {_restore_kernel_tpsp}
|
||||
"),
|
||||
csr_scratch = const CSR_SSCRATCH,
|
||||
_restore_kernel_tpsp = sym _restore_kernel_tpsp,
|
||||
options(noreturn),
|
||||
_restore_kernel_tpsp = sym _restore_kernel_tpsp
|
||||
)
|
||||
}
|
||||
|
||||
#[naked]
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn _restore_kernel_tpsp() -> ! {
|
||||
asm!(
|
||||
core::arch::naked_asm!(
|
||||
concat!("
|
||||
// 这次是从内核态进入中断
|
||||
// 从sscratch寄存器加载当前cpu的上下文
|
||||
@ -48,16 +46,14 @@ unsafe extern "C" fn _restore_kernel_tpsp() -> ! {
|
||||
"),
|
||||
csr_scratch = const CSR_SSCRATCH,
|
||||
lc_off_kernel_sp = const offset_of!(LocalContext, kernel_sp),
|
||||
_save_context = sym _save_context,
|
||||
|
||||
options(noreturn),
|
||||
_save_context = sym _save_context
|
||||
)
|
||||
}
|
||||
|
||||
#[naked]
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn _save_context() -> ! {
|
||||
asm!(
|
||||
core::arch::naked_asm!(
|
||||
concat!("
|
||||
|
||||
|
||||
@ -164,15 +160,14 @@ unsafe extern "C" fn _save_context() -> ! {
|
||||
csr_epc = const CSR_SEPC,
|
||||
csr_tval = const CSR_STVAL,
|
||||
csr_cause = const CSR_SCAUSE,
|
||||
csr_scratch = const CSR_SSCRATCH,
|
||||
options(noreturn),
|
||||
csr_scratch = const CSR_SSCRATCH
|
||||
)
|
||||
}
|
||||
|
||||
#[naked]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn ret_from_exception() -> ! {
|
||||
asm!(
|
||||
core::arch::naked_asm!(
|
||||
concat!("
|
||||
ld s0, {off_status}(sp)
|
||||
andi s0, s0, {sr_spp}
|
||||
@ -249,8 +244,6 @@ pub unsafe extern "C" fn ret_from_exception() -> ! {
|
||||
off_t6 = const offset_of!(TrapFrame, t6),
|
||||
off_sp = const offset_of!(TrapFrame, sp),
|
||||
off_tp = const offset_of!(TrapFrame, tp),
|
||||
off_epc = const offset_of!(TrapFrame, epc),
|
||||
|
||||
options(noreturn),
|
||||
off_epc = const offset_of!(TrapFrame, epc)
|
||||
)
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ impl KernelThreadMechanism {
|
||||
pub(super) unsafe extern "C" fn kernel_thread_bootstrap_stage1() {
|
||||
// 这个函数要是naked的,只是因为现在还没有实现,而naked func不能打`unimplemented!()`
|
||||
// 所以先写成了普通函数
|
||||
asm!(concat!(
|
||||
core::arch::naked_asm!(concat!(
|
||||
"
|
||||
ld x3, {off_gp}(sp)
|
||||
ld x5, {off_t0}(sp)
|
||||
@ -111,8 +111,7 @@ pub(super) unsafe extern "C" fn kernel_thread_bootstrap_stage1() {
|
||||
off_t4 = const offset_of!(TrapFrame, t4),
|
||||
off_t5 = const offset_of!(TrapFrame, t5),
|
||||
off_t6 = const offset_of!(TrapFrame, t6),
|
||||
stage2_func = sym jump_to_stage2,
|
||||
options(noreturn),
|
||||
stage2_func = sym jump_to_stage2
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -78,8 +78,7 @@ pub unsafe fn arch_switch_to_user(trap_frame: TrapFrame) -> ! {
|
||||
|
||||
#[naked]
|
||||
unsafe extern "C" fn ready_to_switch_to_user(trap_frame: usize, new_pc: usize) -> ! {
|
||||
asm!(
|
||||
concat!(
|
||||
core::arch::naked_asm!(concat!(
|
||||
"
|
||||
// 设置trap frame
|
||||
mv sp, a0
|
||||
@ -88,9 +87,7 @@ unsafe extern "C" fn ready_to_switch_to_user(trap_frame: usize, new_pc: usize) -
|
||||
jr a1
|
||||
|
||||
"
|
||||
),
|
||||
options(noreturn)
|
||||
);
|
||||
));
|
||||
}
|
||||
|
||||
impl ProcessManager {
|
||||
@ -227,7 +224,7 @@ impl ProcessManager {
|
||||
/// 参考 https://code.dragonos.org.cn/xref/linux-6.6.21/arch/riscv/kernel/entry.S#233
|
||||
#[naked]
|
||||
unsafe extern "C" fn switch_to_inner(prev: *mut ArchPCBInfo, next: *mut ArchPCBInfo) {
|
||||
core::arch::asm!(concat!(
|
||||
core::arch::naked_asm!(concat!(
|
||||
"
|
||||
sd ra, {off_ra}(a0)
|
||||
sd sp, {off_sp}(a0)
|
||||
@ -304,8 +301,7 @@ unsafe extern "C" fn switch_to_inner(prev: *mut ArchPCBInfo, next: *mut ArchPCBI
|
||||
off_s9 = const(offset_of!(ArchPCBInfo, s9)),
|
||||
off_s10 = const(offset_of!(ArchPCBInfo, s10)),
|
||||
off_s11 = const(offset_of!(ArchPCBInfo, s11)),
|
||||
before_switch_finish_hook = sym before_switch_finish_hook,
|
||||
options(noreturn));
|
||||
before_switch_finish_hook = sym before_switch_finish_hook);
|
||||
}
|
||||
|
||||
/// 在切换上下文完成后的钩子函数(必须在这里加一个跳转函数,否则会出现relocation truncated to fit: R_RISCV_JAL错误)
|
||||
|
@ -45,7 +45,7 @@ macro_rules! interrupt_handler {
|
||||
#[naked]
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn [<irq_handler $name>]() {
|
||||
core::arch::asm!(
|
||||
core::arch::naked_asm!(
|
||||
concat!(
|
||||
"
|
||||
push 0x0
|
||||
@ -60,8 +60,7 @@ macro_rules! interrupt_handler {
|
||||
jmp x86_64_do_irq
|
||||
"
|
||||
),
|
||||
irqnum = const($name),
|
||||
options(noreturn)
|
||||
irqnum = const($name)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -500,7 +500,7 @@ unsafe fn allocator_init() {
|
||||
for i in 0..total_num {
|
||||
let area = mem_block_manager().get_initial_memory_region(i).unwrap();
|
||||
// debug!("area: base={:?}, size={:#x}, end={:?}", area.base, area.size, area.base + area.size);
|
||||
for i in 0..((area.size + MMArch::PAGE_SIZE - 1) / MMArch::PAGE_SIZE) {
|
||||
for i in 0..area.size.div_ceil(MMArch::PAGE_SIZE) {
|
||||
let paddr = area.base.add(i * MMArch::PAGE_SIZE);
|
||||
let vaddr = unsafe { MMArch::phys_2_virt(paddr) }.unwrap();
|
||||
let flags = kernel_page_flags::<MMArch>(vaddr);
|
||||
|
@ -1,5 +1,3 @@
|
||||
use core::arch::asm;
|
||||
|
||||
use alloc::sync::Arc;
|
||||
use system_error::SystemError;
|
||||
|
||||
@ -61,7 +59,7 @@ impl KernelThreadMechanism {
|
||||
/// 跳转之后,指向Box<KernelThreadClosure>的指针将传入到stage2的函数
|
||||
#[naked]
|
||||
pub(super) unsafe extern "sysv64" fn kernel_thread_bootstrap_stage1() {
|
||||
asm!(
|
||||
core::arch::naked_asm!(
|
||||
concat!(
|
||||
"
|
||||
|
||||
@ -92,6 +90,5 @@ pub(super) unsafe extern "sysv64" fn kernel_thread_bootstrap_stage1() {
|
||||
"
|
||||
),
|
||||
stage2_func = sym kernel_thread_bootstrap_stage2,
|
||||
options(noreturn)
|
||||
)
|
||||
}
|
||||
|
@ -425,7 +425,7 @@ impl ProcessManager {
|
||||
/// 保存上下文,然后切换进程,接着jmp到`switch_finish_hook`钩子函数
|
||||
#[naked]
|
||||
unsafe extern "sysv64" fn switch_to_inner(prev: *mut ArchPCBInfo, next: *mut ArchPCBInfo) {
|
||||
asm!(
|
||||
core::arch::naked_asm!(
|
||||
// As a quick reminder for those who are unfamiliar with the System V ABI (extern "C"):
|
||||
//
|
||||
// - the current parameters are passed in the registers `rdi`, `rsi`,
|
||||
@ -498,13 +498,12 @@ unsafe extern "sysv64" fn switch_to_inner(prev: *mut ArchPCBInfo, next: *mut Arc
|
||||
off_gs = const(offset_of!(ArchPCBInfo, gs)),
|
||||
|
||||
switch_hook = sym crate::process::switch_finish_hook,
|
||||
options(noreturn),
|
||||
);
|
||||
}
|
||||
|
||||
#[naked]
|
||||
unsafe extern "sysv64" fn switch_back() -> ! {
|
||||
asm!("ret", options(noreturn));
|
||||
core::arch::naked_asm!("ret");
|
||||
}
|
||||
|
||||
pub unsafe fn arch_switch_to_user(trap_frame: TrapFrame) -> ! {
|
||||
|
@ -1,5 +1,4 @@
|
||||
use core::{
|
||||
arch::asm,
|
||||
hint::spin_loop,
|
||||
sync::atomic::{compiler_fence, fence, AtomicBool, Ordering},
|
||||
};
|
||||
@ -65,14 +64,13 @@ unsafe extern "C" fn smp_ap_start() -> ! {
|
||||
|
||||
#[naked]
|
||||
unsafe extern "sysv64" fn smp_init_switch_stack(st: &ApStartStackInfo) -> ! {
|
||||
asm!(concat!("
|
||||
core::arch::naked_asm!(concat!("
|
||||
mov rsp, [rdi + {off_rsp}]
|
||||
mov rbp, [rdi + {off_rsp}]
|
||||
jmp {stage1}
|
||||
"),
|
||||
off_rsp = const(offset_of!(ApStartStackInfo, vaddr)),
|
||||
stage1 = sym smp_ap_start_stage1,
|
||||
options(noreturn));
|
||||
stage1 = sym smp_ap_start_stage1);
|
||||
}
|
||||
|
||||
unsafe extern "C" fn smp_ap_start_stage1() -> ! {
|
||||
|
@ -20,8 +20,8 @@ use system_error::SystemError;
|
||||
|
||||
use super::{disk_info::Partition, gendisk::GenDisk, manager::BlockDevMeta};
|
||||
|
||||
/// 该文件定义了 Device 和 BlockDevice 的接口
|
||||
/// Notice 设备错误码使用 Posix 规定的 int32_t 的错误码表示,而不是自己定义错误enum
|
||||
// 该文件定义了 Device 和 BlockDevice 的接口
|
||||
// Notice 设备错误码使用 Posix 规定的 int32_t 的错误码表示,而不是自己定义错误enum
|
||||
|
||||
// 使用方法:
|
||||
// 假设 blk_dev 是块设备
|
||||
|
@ -161,6 +161,7 @@ impl GenDiskMap {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[allow(dead_code)]
|
||||
pub fn max_idx(&self) -> u32 {
|
||||
self.max_idx.load(Ordering::SeqCst)
|
||||
}
|
||||
|
@ -134,6 +134,7 @@ impl BlockDevManager {
|
||||
}
|
||||
|
||||
/// 卸载磁盘设备
|
||||
#[allow(dead_code)]
|
||||
pub fn unregister(&self, dev: &Arc<dyn BlockDevice>) {
|
||||
let mut inner = self.inner();
|
||||
inner.disks.remove(dev.dev_name());
|
||||
|
@ -18,7 +18,7 @@ use super::{
|
||||
pub trait CharDevice: Device {
|
||||
/// Notice buffer对应设备按字节划分,使用u8类型
|
||||
/// Notice offset应该从0开始计数
|
||||
|
||||
///
|
||||
/// @brief: 从设备的第offset个字节开始,读取len个byte,存放到buf中
|
||||
/// @parameter offset: 起始字节偏移量
|
||||
/// @parameter len: 读取字节的数量
|
||||
|
@ -137,6 +137,7 @@ impl VirtIOBlkManager {
|
||||
BlockDevName::new(format!("vd{}", x), id)
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn free_id(&self, id: usize) {
|
||||
if id >= Self::MAX_DEVICES {
|
||||
return;
|
||||
|
@ -1,153 +0,0 @@
|
||||
use crate::driver::base::block::block_device::BlockDevice;
|
||||
use crate::driver::base::device::device_number::{DeviceNumber, Major};
|
||||
use crate::filesystem::devfs::{DevFS, DeviceINode};
|
||||
use crate::filesystem::vfs::file::FileMode;
|
||||
use crate::filesystem::vfs::syscall::ModeType;
|
||||
use crate::filesystem::vfs::{
|
||||
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
|
||||
};
|
||||
use crate::libs::spinlock::SpinLockGuard;
|
||||
use crate::{libs::spinlock::SpinLock, time::PosixTimeSpec};
|
||||
use alloc::{
|
||||
string::String,
|
||||
sync::{Arc, Weak},
|
||||
vec::Vec,
|
||||
};
|
||||
use system_error::SystemError;
|
||||
|
||||
use super::ahcidisk::LockedAhciDisk;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct AhciInode {
|
||||
/// uuid 暂时不知道有什么用(x
|
||||
// uuid: Uuid,
|
||||
/// 指向自身的弱引用
|
||||
self_ref: Weak<LockedAhciInode>,
|
||||
/// 指向inode所在的文件系统对象的指针
|
||||
fs: Weak<DevFS>,
|
||||
/// INode 元数据
|
||||
metadata: Metadata,
|
||||
/// INode 对应的磁盘
|
||||
disk: Arc<LockedAhciDisk>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct LockedAhciInode(pub SpinLock<AhciInode>);
|
||||
|
||||
impl LockedAhciInode {
|
||||
pub fn new(disk: Arc<LockedAhciDisk>) -> Arc<Self> {
|
||||
let inode = AhciInode {
|
||||
// uuid: Uuid::new_v5(),
|
||||
self_ref: Weak::default(),
|
||||
fs: Weak::default(),
|
||||
disk,
|
||||
metadata: Metadata {
|
||||
dev_id: 1,
|
||||
inode_id: generate_inode_id(),
|
||||
size: 0,
|
||||
blk_size: 0,
|
||||
blocks: 0,
|
||||
atime: PosixTimeSpec::default(),
|
||||
mtime: PosixTimeSpec::default(),
|
||||
ctime: PosixTimeSpec::default(),
|
||||
file_type: FileType::BlockDevice, // 文件夹,block设备,char设备
|
||||
mode: ModeType::from_bits_truncate(0o666),
|
||||
nlinks: 1,
|
||||
uid: 0,
|
||||
gid: 0,
|
||||
raw_dev: DeviceNumber::new(Major::HD_MAJOR, 0),
|
||||
},
|
||||
};
|
||||
|
||||
let result = Arc::new(LockedAhciInode(SpinLock::new(inode)));
|
||||
result.0.lock().self_ref = Arc::downgrade(&result);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
impl DeviceINode for LockedAhciInode {
|
||||
fn set_fs(&self, fs: Weak<DevFS>) {
|
||||
self.0.lock().fs = fs;
|
||||
}
|
||||
}
|
||||
|
||||
impl IndexNode for LockedAhciInode {
|
||||
fn as_any_ref(&self) -> &dyn core::any::Any {
|
||||
self
|
||||
}
|
||||
|
||||
fn open(
|
||||
&self,
|
||||
_data: SpinLockGuard<FilePrivateData>,
|
||||
_mode: &FileMode,
|
||||
) -> Result<(), SystemError> {
|
||||
Err(SystemError::ENOSYS)
|
||||
}
|
||||
|
||||
fn close(&self, _data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> {
|
||||
Err(SystemError::ENOSYS)
|
||||
}
|
||||
|
||||
fn metadata(&self) -> Result<Metadata, SystemError> {
|
||||
return Ok(self.0.lock().metadata.clone());
|
||||
}
|
||||
|
||||
fn fs(&self) -> Arc<dyn FileSystem> {
|
||||
return self.0.lock().fs.upgrade().unwrap();
|
||||
}
|
||||
|
||||
fn list(&self) -> Result<Vec<String>, SystemError> {
|
||||
Err(SystemError::ENOSYS)
|
||||
}
|
||||
|
||||
fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError> {
|
||||
let mut inode = self.0.lock();
|
||||
inode.metadata.atime = metadata.atime;
|
||||
inode.metadata.mtime = metadata.mtime;
|
||||
inode.metadata.ctime = metadata.ctime;
|
||||
inode.metadata.mode = metadata.mode;
|
||||
inode.metadata.uid = metadata.uid;
|
||||
inode.metadata.gid = metadata.gid;
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
/// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
|
||||
fn read_at(
|
||||
&self,
|
||||
offset: usize, // lba地址
|
||||
len: usize,
|
||||
buf: &mut [u8],
|
||||
data: SpinLockGuard<FilePrivateData>,
|
||||
) -> Result<usize, SystemError> {
|
||||
if buf.len() < len {
|
||||
return Err(SystemError::EINVAL);
|
||||
}
|
||||
|
||||
if let FilePrivateData::Unused = *data {
|
||||
return self.0.lock().disk.read_at_bytes(offset, len, buf);
|
||||
}
|
||||
|
||||
return Err(SystemError::EINVAL);
|
||||
}
|
||||
|
||||
/// 写设备 - 应该调用设备的函数读写,而不是通过文件系统读写
|
||||
fn write_at(
|
||||
&self,
|
||||
offset: usize, // lba地址
|
||||
len: usize,
|
||||
buf: &[u8],
|
||||
data: SpinLockGuard<FilePrivateData>,
|
||||
) -> Result<usize, SystemError> {
|
||||
if buf.len() < len {
|
||||
return Err(SystemError::EINVAL);
|
||||
}
|
||||
|
||||
if let FilePrivateData::Unused = *data {
|
||||
return self.0.lock().disk.write_at_bytes(offset, len, buf);
|
||||
}
|
||||
|
||||
return Err(SystemError::EINVAL);
|
||||
}
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
//! 文件说明: 实现了 AHCI 中的控制器 HBA 的相关行为
|
||||
use core::{intrinsics::size_of, ptr};
|
||||
|
||||
use core::sync::atomic::compiler_fence;
|
||||
@ -5,8 +6,6 @@ use core::sync::atomic::compiler_fence;
|
||||
use crate::arch::MMArch;
|
||||
use crate::mm::{MemoryManagementArch, PhysAddr};
|
||||
|
||||
/// 文件说明: 实现了 AHCI 中的控制器 HBA 的相关行为
|
||||
|
||||
/// 根据 AHCI 写出 HBA 的 Command
|
||||
pub const ATA_CMD_READ_DMA_EXT: u8 = 0x25; // 读操作,并且退出
|
||||
pub const ATA_CMD_WRITE_DMA_EXT: u8 = 0x35; // 写操作,并且退出
|
||||
|
@ -1,5 +1,4 @@
|
||||
// 导出 ahci 相关的 module
|
||||
pub mod ahci_inode;
|
||||
pub mod ahcidisk;
|
||||
pub mod hba;
|
||||
use crate::arch::MMArch;
|
||||
|
@ -67,7 +67,7 @@ impl<'a> EFIMemoryDescIter<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Iterator for EFIMemoryDescIter<'a> {
|
||||
impl Iterator for EFIMemoryDescIter<'_> {
|
||||
type Item = MemoryDescriptor;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
|
@ -74,8 +74,7 @@ impl EFIManager {
|
||||
warn!("report systable header: failed to map systable header, err: {fw_ptr:?}");
|
||||
}
|
||||
|
||||
let s = CStr::from_bytes_with_nul(&tmp_buf)
|
||||
.unwrap_or_else(|_| CStr::from_bytes_with_nul(b"Unknown\0").unwrap());
|
||||
let s = CStr::from_bytes_with_nul(&tmp_buf).unwrap_or(c"Unknown");
|
||||
info!("EFI version: {:?}, vendor: {:?}", header.revision, s);
|
||||
}
|
||||
|
||||
|
@ -46,7 +46,6 @@ pub trait SerioDriver: Driver {
|
||||
}
|
||||
|
||||
/// todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#810
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[inline(always)]
|
||||
pub fn serio_driver_manager() -> &'static SerioDriverManager {
|
||||
|
@ -17,7 +17,9 @@ const PAGE_SIZE: usize = 4096;
|
||||
/// @return PhysAddr 获得的内存页的初始物理地址
|
||||
pub fn dma_alloc(pages: usize) -> (usize, NonNull<u8>) {
|
||||
let page_num = PageFrameCount::new(
|
||||
((pages * PAGE_SIZE + MMArch::PAGE_SIZE - 1) / MMArch::PAGE_SIZE).next_power_of_two(),
|
||||
(pages * PAGE_SIZE)
|
||||
.div_ceil(MMArch::PAGE_SIZE)
|
||||
.next_power_of_two(),
|
||||
);
|
||||
unsafe {
|
||||
let (paddr, count) = allocate_page_frames(page_num).expect("e1000e: alloc page failed");
|
||||
@ -44,7 +46,9 @@ pub fn dma_alloc(pages: usize) -> (usize, NonNull<u8>) {
|
||||
/// @return i32 0表示成功
|
||||
pub unsafe fn dma_dealloc(paddr: usize, vaddr: NonNull<u8>, pages: usize) -> i32 {
|
||||
let page_count = PageFrameCount::new(
|
||||
((pages * PAGE_SIZE + MMArch::PAGE_SIZE - 1) / MMArch::PAGE_SIZE).next_power_of_two(),
|
||||
(pages * PAGE_SIZE)
|
||||
.div_ceil(MMArch::PAGE_SIZE)
|
||||
.next_power_of_two(),
|
||||
);
|
||||
|
||||
// 恢复页面属性
|
||||
|
@ -186,8 +186,14 @@ impl Clone for LoopbackDriver {
|
||||
}
|
||||
|
||||
impl phy::Device for LoopbackDriver {
|
||||
type RxToken<'a> = LoopbackRxToken where Self: 'a;
|
||||
type TxToken<'a> = LoopbackTxToken where Self: 'a;
|
||||
type RxToken<'a>
|
||||
= LoopbackRxToken
|
||||
where
|
||||
Self: 'a;
|
||||
type TxToken<'a>
|
||||
= LoopbackTxToken
|
||||
where
|
||||
Self: 'a;
|
||||
/// ## 返回设备的物理层特性。
|
||||
/// lo设备的最大传输单元为65535,最大突发大小为1,传输介质默认为Ethernet
|
||||
fn capabilities(&self) -> phy::DeviceCapabilities {
|
||||
|
@ -539,8 +539,14 @@ impl VirtioNetToken {
|
||||
}
|
||||
|
||||
impl phy::Device for VirtIONicDeviceInner {
|
||||
type RxToken<'a> = VirtioNetToken where Self: 'a;
|
||||
type TxToken<'a> = VirtioNetToken where Self: 'a;
|
||||
type RxToken<'a>
|
||||
= VirtioNetToken
|
||||
where
|
||||
Self: 'a;
|
||||
type TxToken<'a>
|
||||
= VirtioNetToken
|
||||
where
|
||||
Self: 'a;
|
||||
|
||||
fn receive(
|
||||
&mut self,
|
||||
|
@ -71,6 +71,7 @@ impl OpenFirmwareFdtDriver {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub unsafe fn set_fdt_map_guard(&self, guard: Option<MMIOSpaceGuard>) {
|
||||
self.inner.write().fdt_map_guard = guard;
|
||||
}
|
||||
@ -293,6 +294,7 @@ impl OpenFirmwareFdtDriver {
|
||||
/// 在UEFI初始化后,扫描FDT中的`/reserved-memory`节点,设置保留的内存
|
||||
///
|
||||
/// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/of/fdt.c#634
|
||||
#[allow(dead_code)]
|
||||
pub fn early_init_fdt_scan_reserved_mem(&self) {
|
||||
let vaddr = boot_params().read().fdt();
|
||||
if vaddr.is_none() {
|
||||
@ -323,7 +325,6 @@ impl OpenFirmwareFdtDriver {
|
||||
}
|
||||
|
||||
/// 保留fdt自身的内存空间
|
||||
|
||||
fn early_reserve_fdt_itself(&self, fdt: &Fdt) {
|
||||
#[cfg(target_arch = "riscv64")]
|
||||
{
|
||||
|
@ -1474,7 +1474,7 @@ pub struct ExternalCapabilityIterator<'a> {
|
||||
pub bus_device_function: BusDeviceFunction,
|
||||
pub next_capability_offset: Option<u16>,
|
||||
}
|
||||
impl<'a> Iterator for ExternalCapabilityIterator<'a> {
|
||||
impl Iterator for ExternalCapabilityIterator<'_> {
|
||||
type Item = ExternalCapabilityInfo;
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
let offset = self.next_capability_offset?;
|
||||
|
@ -317,7 +317,7 @@ pub struct PciRootIterator<'a> {
|
||||
index: usize,
|
||||
}
|
||||
|
||||
impl<'a> Iterator for PciRootIterator<'a> {
|
||||
impl Iterator for PciRootIterator<'_> {
|
||||
type Item = Arc<PciRoot>;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
|
@ -64,6 +64,7 @@ impl ScsiManager {
|
||||
BlockDevName::new(format!("sd{}", x), id)
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn free_id(&self, id: usize) {
|
||||
if id >= Self::MAX_DEVICES {
|
||||
return;
|
||||
|
@ -181,6 +181,7 @@ impl FrameBufferManager {
|
||||
}
|
||||
|
||||
/// 根据id查找帧缓冲区
|
||||
#[allow(dead_code)]
|
||||
pub fn find_fb_by_id(&self, id: FbId) -> Result<Option<Arc<dyn FrameBuffer>>, SystemError> {
|
||||
if unlikely(!id.is_valid()) {
|
||||
return Err(SystemError::EINVAL);
|
||||
|
@ -77,7 +77,6 @@ impl VirtIOIrqManager {
|
||||
/// # 返回
|
||||
/// - 如果找到了设备,返回一个包含设备的`Option<Arc<dyn VirtIODevice>>`。
|
||||
/// - 如果没有找到设备,返回`None`。
|
||||
|
||||
pub fn lookup_device(&self, dev_id: &Arc<DeviceId>) -> Option<Arc<dyn VirtIODevice>> {
|
||||
let map = self.map.read_irqsave();
|
||||
map.get(dev_id).cloned()
|
||||
|
@ -23,7 +23,9 @@ unsafe impl Hal for HalImpl {
|
||||
_direction: BufferDirection,
|
||||
) -> (virtio_drivers::PhysAddr, NonNull<u8>) {
|
||||
let page_num = PageFrameCount::new(
|
||||
((pages * PAGE_SIZE + MMArch::PAGE_SIZE - 1) / MMArch::PAGE_SIZE).next_power_of_two(),
|
||||
(pages * PAGE_SIZE)
|
||||
.div_ceil(MMArch::PAGE_SIZE)
|
||||
.next_power_of_two(),
|
||||
);
|
||||
unsafe {
|
||||
let (paddr, count) =
|
||||
@ -55,7 +57,9 @@ unsafe impl Hal for HalImpl {
|
||||
pages: usize,
|
||||
) -> i32 {
|
||||
let page_count = PageFrameCount::new(
|
||||
((pages * PAGE_SIZE + MMArch::PAGE_SIZE - 1) / MMArch::PAGE_SIZE).next_power_of_two(),
|
||||
(pages * PAGE_SIZE)
|
||||
.div_ceil(MMArch::PAGE_SIZE)
|
||||
.next_power_of_two(),
|
||||
);
|
||||
|
||||
// 恢复页面属性
|
||||
|
@ -306,6 +306,7 @@ impl IrqCommonData {
|
||||
self.inner.lock_irqsave().affinity = affinity;
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn set_effective_affinity(&self, affinity: CpuMask) {
|
||||
self.inner.lock_irqsave().effective_affinity = affinity;
|
||||
}
|
||||
@ -346,6 +347,7 @@ impl InnerIrqCommonData {
|
||||
self.handler_data.clone()
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn effective_affinity(&self) -> &CpuMask {
|
||||
&self.effective_affinity
|
||||
}
|
||||
|
@ -286,10 +286,12 @@ impl IrqDesc {
|
||||
);
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn set_probe(&self) {
|
||||
self.modify_status(IrqLineStatus::IRQ_NOPROBE, IrqLineStatus::empty());
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn set_noprobe(&self) {
|
||||
self.modify_status(IrqLineStatus::empty(), IrqLineStatus::IRQ_NOPROBE);
|
||||
}
|
||||
@ -416,6 +418,7 @@ impl InnerIrqDesc {
|
||||
self.line_status.insert(IrqLineStatus::IRQ_NOTHREAD);
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn clear_nothread(&mut self) {
|
||||
self.line_status.remove(IrqLineStatus::IRQ_NOTHREAD);
|
||||
}
|
||||
@ -451,6 +454,7 @@ impl InnerIrqDesc {
|
||||
!self.line_status.contains(IrqLineStatus::IRQ_NOAUTOEN)
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn can_thread(&self) -> bool {
|
||||
!self.line_status.contains(IrqLineStatus::IRQ_NOTHREAD)
|
||||
}
|
||||
@ -486,6 +490,7 @@ impl InnerIrqDesc {
|
||||
self.actions.clear();
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn remove_action(&mut self, action: &Arc<IrqAction>) {
|
||||
self.actions.retain(|a| !Arc::ptr_eq(a, action));
|
||||
}
|
||||
@ -506,14 +511,17 @@ impl InnerIrqDesc {
|
||||
&self.common_data
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn depth(&self) -> u32 {
|
||||
self.depth
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn wake_depth(&self) -> u32 {
|
||||
self.wake_depth
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn set_depth(&mut self, depth: u32) {
|
||||
self.depth = depth;
|
||||
}
|
||||
@ -540,6 +548,7 @@ impl InnerIrqDesc {
|
||||
&mut self.percpu_enabled
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn percpu_affinity(&self) -> &Option<CpuMask> {
|
||||
&self.percpu_affinity
|
||||
}
|
||||
@ -969,6 +978,7 @@ impl IrqDescManager {
|
||||
}
|
||||
|
||||
/// 设置指定irq的可用cpu为所有cpu
|
||||
#[allow(dead_code)]
|
||||
pub fn set_percpu_devid_all(&self, irq: IrqNumber) -> Result<(), SystemError> {
|
||||
self.set_percpu_devid(irq, None)
|
||||
}
|
||||
|
@ -319,6 +319,7 @@ impl IrqDomainManager {
|
||||
/// - `handler_data`: 中断流处理程序数据
|
||||
/// - `handler_name`: 中断处理程序名称
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
#[allow(dead_code)]
|
||||
pub fn domain_set_info(
|
||||
&self,
|
||||
domain: &Arc<IrqDomain>,
|
||||
@ -557,14 +558,17 @@ impl IrqDomain {
|
||||
}
|
||||
|
||||
/// The number of mapped interrupts
|
||||
#[allow(dead_code)]
|
||||
pub fn map_count(&self) -> u32 {
|
||||
self.revmap_read_irqsave().map.len() as u32
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn host_data(&self) -> Option<Arc<dyn IrqChipData>> {
|
||||
self.inner.lock_irqsave().host_data.clone()
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn set_host_data(&self, host_data: Option<Arc<dyn IrqChipData>>) {
|
||||
self.inner.lock_irqsave().host_data = host_data;
|
||||
}
|
||||
|
@ -785,6 +785,7 @@ impl IrqManager {
|
||||
);
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn irq_set_affinity(
|
||||
&self,
|
||||
irq_data: &Arc<IrqData>,
|
||||
|
@ -275,13 +275,13 @@ struct RunningCountGuard<'a> {
|
||||
}
|
||||
|
||||
impl<'a> RunningCountGuard<'a> {
|
||||
fn new(cpu_running_count: &'a PerCpuVar<AtomicI16>) -> RunningCountGuard {
|
||||
fn new(cpu_running_count: &'a PerCpuVar<AtomicI16>) -> RunningCountGuard<'a> {
|
||||
cpu_running_count.get().fetch_add(1, Ordering::SeqCst);
|
||||
return RunningCountGuard { cpu_running_count };
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Drop for RunningCountGuard<'a> {
|
||||
impl Drop for RunningCountGuard<'_> {
|
||||
fn drop(&mut self) {
|
||||
self.cpu_running_count.get().fetch_sub(1, Ordering::SeqCst);
|
||||
}
|
||||
|
@ -266,8 +266,7 @@ impl BiosParameterBlock {
|
||||
bpb.trail_sig = cursor.read_u16()?;
|
||||
|
||||
// 计算根目录项占用的空间(单位:字节)
|
||||
let root_sectors = ((bpb.root_entries_cnt as u32 * 32) + (bpb.bytes_per_sector as u32 - 1))
|
||||
/ (bpb.bytes_per_sector as u32);
|
||||
let root_sectors = (bpb.root_entries_cnt as u32 * 32).div_ceil(bpb.bytes_per_sector as u32);
|
||||
|
||||
// 每FAT扇区数
|
||||
let fat_size = if bpb.fat_size_16 != 0 {
|
||||
@ -347,9 +346,8 @@ impl BiosParameterBlock {
|
||||
}
|
||||
};
|
||||
|
||||
let root_sectors = ((self.root_entries_cnt as u32 * 32)
|
||||
+ (self.bytes_per_sector as u32 - 1))
|
||||
/ (self.bytes_per_sector as u32);
|
||||
let root_sectors =
|
||||
(self.root_entries_cnt as u32 * 32).div_ceil(self.bytes_per_sector as u32);
|
||||
|
||||
// 当前分区总扇区数
|
||||
let total_sectors = if self.total_sectors_16 != 0 {
|
||||
|
@ -256,8 +256,7 @@ impl FATFile {
|
||||
// 如果还需要更多的簇
|
||||
if bytes_remain_in_cluster < extra_bytes {
|
||||
let clusters_to_allocate =
|
||||
(extra_bytes - bytes_remain_in_cluster + fs.bytes_per_cluster() - 1)
|
||||
/ fs.bytes_per_cluster();
|
||||
(extra_bytes - bytes_remain_in_cluster).div_ceil(fs.bytes_per_cluster());
|
||||
let last_cluster = if let Some(c) = fs.get_last_cluster(self.first_cluster) {
|
||||
c
|
||||
} else {
|
||||
@ -338,7 +337,7 @@ impl FATFile {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let new_last_cluster = (new_size + fs.bytes_per_cluster() - 1) / fs.bytes_per_cluster();
|
||||
let new_last_cluster = new_size.div_ceil(fs.bytes_per_cluster());
|
||||
if let Some(begin_delete) =
|
||||
fs.get_cluster_by_relative(self.first_cluster, new_last_cluster as usize)
|
||||
{
|
||||
@ -463,8 +462,7 @@ impl FATDir {
|
||||
|
||||
// 计算需要申请多少个簇
|
||||
let clusters_required =
|
||||
(remain_entries * FATRawDirEntry::DIR_ENTRY_LEN + fs.bytes_per_cluster() - 1)
|
||||
/ fs.bytes_per_cluster();
|
||||
(remain_entries * FATRawDirEntry::DIR_ENTRY_LEN).div_ceil(fs.bytes_per_cluster());
|
||||
let mut first_cluster = Cluster::default();
|
||||
let mut prev_cluster = current_cluster;
|
||||
// debug!(
|
||||
|
@ -326,9 +326,8 @@ impl FATFileSystem {
|
||||
};
|
||||
|
||||
// 根目录项占用的扇区数(向上取整)
|
||||
let root_dir_sectors: u64 = ((bpb.root_entries_cnt as u64 * 32)
|
||||
+ (bpb.bytes_per_sector as u64 - 1))
|
||||
/ (bpb.bytes_per_sector as u64);
|
||||
let root_dir_sectors: u64 =
|
||||
(bpb.root_entries_cnt as u64 * 32).div_ceil(bpb.bytes_per_sector as u64);
|
||||
|
||||
// FAT表大小(单位:扇区)
|
||||
let fat_size = if bpb.fat_size_16 != 0 {
|
||||
@ -843,6 +842,7 @@ impl FATFileSystem {
|
||||
/// @return Ok(true) 正常
|
||||
/// @return Ok(false) 不正常
|
||||
/// @return Err(SystemError) 在判断时发生错误
|
||||
#[allow(dead_code)]
|
||||
pub fn is_hard_error_bit_ok(&mut self) -> Result<bool, SystemError> {
|
||||
match self.bpb.fat_type {
|
||||
FATType::FAT32(_) => {
|
||||
@ -935,10 +935,8 @@ impl FATFileSystem {
|
||||
|
||||
_ => {
|
||||
// FAT12 / FAT16
|
||||
let root_dir_sectors: u64 = (((self.bpb.root_entries_cnt as u64) * 32)
|
||||
+ self.bpb.bytes_per_sector as u64
|
||||
- 1)
|
||||
/ self.bpb.bytes_per_sector as u64;
|
||||
let root_dir_sectors: u64 = ((self.bpb.root_entries_cnt as u64) * 32)
|
||||
.div_ceil(self.bpb.bytes_per_sector as u64);
|
||||
// 数据区扇区数
|
||||
let data_sec: u64 = self.bpb.total_sectors_16 as u64
|
||||
- (self.bpb.rsvd_sec_cnt as u64
|
||||
@ -1283,6 +1281,7 @@ impl FATFsInfo {
|
||||
/// @brief 根据fsinfo的信息,计算当前总的空闲簇数量
|
||||
///
|
||||
/// @param 当前文件系统的最大簇号
|
||||
#[allow(dead_code)]
|
||||
pub fn count_free_cluster(&self, max_cluster: Cluster) -> Option<u64> {
|
||||
let count_clusters = max_cluster.cluster_num - RESERVED_CLUSTERS as u64 + 1;
|
||||
// 信息不合理,当前的FsInfo中存储的free count大于计算出来的值
|
||||
@ -1301,6 +1300,7 @@ impl FATFsInfo {
|
||||
/// @brief 更新FsInfo中的“空闲簇统计信息“为new_count
|
||||
///
|
||||
/// 请注意,除非手动调用`flush()`,否则本函数不会将数据刷入磁盘
|
||||
#[allow(dead_code)]
|
||||
pub fn update_free_count_abs(&mut self, new_count: u32) {
|
||||
self.free_count = new_count;
|
||||
}
|
||||
@ -1308,6 +1308,7 @@ impl FATFsInfo {
|
||||
/// @brief 更新FsInfo中的“空闲簇统计信息“,把它加上delta.
|
||||
///
|
||||
/// 请注意,除非手动调用`flush()`,否则本函数不会将数据刷入磁盘
|
||||
#[allow(dead_code)]
|
||||
pub fn update_free_count_delta(&mut self, delta: i32) {
|
||||
self.free_count = (self.free_count as i32 + delta) as u32;
|
||||
}
|
||||
@ -1360,6 +1361,7 @@ impl FATFsInfo {
|
||||
/// @brief 读取磁盘上的Fs Info扇区,将里面的内容更新到结构体中
|
||||
///
|
||||
/// @param partition fs info所在的分区
|
||||
#[allow(dead_code)]
|
||||
pub fn update(&mut self, partition: Arc<Partition>) -> Result<(), SystemError> {
|
||||
if let Some(off) = self.offset {
|
||||
let in_block_offset = off % LBA_SIZE as u64;
|
||||
@ -1888,7 +1890,7 @@ struct ClusterIter<'a> {
|
||||
fs: &'a FATFileSystem,
|
||||
}
|
||||
|
||||
impl<'a> Iterator for ClusterIter<'a> {
|
||||
impl Iterator for ClusterIter<'_> {
|
||||
type Item = Cluster;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
|
@ -169,7 +169,7 @@ impl<'a> MbrPartitionIter<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Iterator for MbrPartitionIter<'a> {
|
||||
impl Iterator for MbrPartitionIter<'_> {
|
||||
type Item = Partition;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
|
@ -14,6 +14,7 @@ use alloc::sync::Arc;
|
||||
use alloc::sync::Weak;
|
||||
use alloc::vec::Vec;
|
||||
use entry::{OvlEntry, OvlLayer};
|
||||
use linkme::distributed_slice;
|
||||
use system_error::SystemError;
|
||||
|
||||
const WHITEOUT_MODE: u64 = 0o020000 | 0o600; // whiteout字符设备文件模式与权限
|
||||
@ -89,7 +90,7 @@ struct OverlayFS {
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct OvlInode {
|
||||
pub struct OvlInode {
|
||||
redirect: String, // 重定向路径
|
||||
file_type: FileType,
|
||||
flags: SpinLock<u64>,
|
||||
|
@ -51,7 +51,6 @@ impl Syscall {
|
||||
/// - 成功,Ok(usize)
|
||||
/// - 失败,Err(SystemError) 操作失败,返回posix错误码
|
||||
///
|
||||
|
||||
pub fn do_syslog(
|
||||
syslog_action_type: usize,
|
||||
buf: &mut [u8],
|
||||
|
@ -800,7 +800,7 @@ impl<'a> FileDescriptorIterator<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Iterator for FileDescriptorIterator<'a> {
|
||||
impl Iterator for FileDescriptorIterator<'_> {
|
||||
type Item = (i32, Arc<File>);
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
|
@ -49,6 +49,7 @@ impl BootParams {
|
||||
core::str::from_utf8(&self.boot_cmdline()[..self.boot_cmdline_len()]).unwrap()
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn bootloader_name(&self) -> Option<&str> {
|
||||
self.bootloader_name.as_deref()
|
||||
}
|
||||
|
@ -43,6 +43,7 @@ pub struct KernelCmdlineParamBuilder {
|
||||
inv: bool,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
impl KernelCmdlineParamBuilder {
|
||||
pub const fn new(name: &'static str, ty: KCmdlineParamType) -> Self {
|
||||
Self {
|
||||
@ -110,6 +111,7 @@ pub enum KernelCmdlineParameter {
|
||||
EarlyKV(&'static KernelCmdlineEarlyKV),
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
impl KernelCmdlineParameter {
|
||||
pub fn name(&self) -> &str {
|
||||
match self {
|
||||
@ -195,6 +197,7 @@ pub struct KernelCmdlineEarlyKV {
|
||||
default: &'static str,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
impl KernelCmdlineEarlyKV {
|
||||
pub const VALUE_MAX_LEN: usize = 256;
|
||||
|
||||
|
@ -297,7 +297,6 @@ pub struct UserSigaction {
|
||||
* siginfo中,根据signal的来源不同,该info中对应了不同的数据./=
|
||||
* 请注意,该info最大占用16字节
|
||||
*/
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct SigInfo {
|
||||
|
@ -2,20 +2,15 @@
|
||||
#![feature(alloc_error_handler)]
|
||||
#![feature(allocator_api)]
|
||||
#![feature(arbitrary_self_types)]
|
||||
#![feature(asm_const)]
|
||||
#![feature(concat_idents)]
|
||||
#![feature(const_for)]
|
||||
#![feature(const_mut_refs)]
|
||||
#![feature(const_option)]
|
||||
#![feature(const_trait_impl)]
|
||||
#![feature(const_refs_to_cell)]
|
||||
#![feature(core_intrinsics)]
|
||||
#![feature(c_void_variant)]
|
||||
#![feature(extract_if)]
|
||||
#![feature(fn_align)]
|
||||
#![feature(linked_list_retain)]
|
||||
#![feature(naked_functions)]
|
||||
#![feature(new_uninit)]
|
||||
#![feature(ptr_internals)]
|
||||
#![feature(trait_upcasting)]
|
||||
#![feature(slice_ptr_get)]
|
||||
@ -23,16 +18,19 @@
|
||||
#![feature(vec_into_raw_parts)]
|
||||
#![feature(c_variadic)]
|
||||
#![cfg_attr(target_os = "none", no_std)]
|
||||
#![allow(internal_features)]
|
||||
#![allow(static_mut_refs, non_local_definitions, internal_features)]
|
||||
// clippy的配置
|
||||
#![deny(clippy::all)]
|
||||
#![allow(clippy::bad_bit_mask)]
|
||||
// DragonOS允许在函数中使用return语句(尤其是长函数时,我们推荐这么做)
|
||||
#![allow(clippy::let_and_return)]
|
||||
#![allow(clippy::needless_pass_by_ref_mut)]
|
||||
#![allow(clippy::needless_return)]
|
||||
#![allow(clippy::single_char_pattern)]
|
||||
#![allow(clippy::upper_case_acronyms)]
|
||||
#![allow(
|
||||
clippy::macro_metavars_in_unsafe,
|
||||
clippy::upper_case_acronyms,
|
||||
clippy::single_char_pattern,
|
||||
clippy::needless_return,
|
||||
clippy::needless_pass_by_ref_mut,
|
||||
clippy::let_and_return,
|
||||
clippy::bad_bit_mask
|
||||
)]
|
||||
|
||||
#[cfg(test)]
|
||||
#[macro_use]
|
||||
|
@ -47,7 +47,6 @@ use alloc::sync::Arc;
|
||||
///
|
||||
/// fn test() {
|
||||
/// let a = A { name: "a".to_string() };
|
||||
|
||||
/// let a_arc: Arc<dyn Base> = Arc::new(a) as Arc<dyn Base>;
|
||||
/// let a_arc2: Option<Arc<A>> = a_arc.downcast_arc::<A>();
|
||||
/// assert!(a_arc2.is_some());
|
||||
|
@ -129,7 +129,7 @@ pub struct CpuMaskIter<'a> {
|
||||
begin: bool,
|
||||
}
|
||||
|
||||
impl<'a> Iterator for CpuMaskIter<'a> {
|
||||
impl Iterator for CpuMaskIter<'_> {
|
||||
type Item = ProcessorId;
|
||||
|
||||
fn next(&mut self) -> Option<ProcessorId> {
|
||||
|
@ -844,7 +844,7 @@ impl<'a> FutexIterator<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Iterator for FutexIterator<'a> {
|
||||
impl Iterator for FutexIterator<'_> {
|
||||
type Item = VirtAddr;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
|
@ -298,7 +298,6 @@ pub fn scm_init(enable_put_to_window: bool) {
|
||||
/// ## 参数
|
||||
///
|
||||
/// - framework 要启动的ui框架
|
||||
|
||||
pub fn scm_framework_enable(framework: Arc<dyn ScmUiFramework>) -> Result<i32, SystemError> {
|
||||
// 获取信息
|
||||
let metadata = framework.metadata()?;
|
||||
@ -321,7 +320,6 @@ pub fn scm_framework_enable(framework: Arc<dyn ScmUiFramework>) -> Result<i32, S
|
||||
///
|
||||
/// ## 参数
|
||||
/// - framework 框架结构体
|
||||
|
||||
pub fn scm_register(framework: Arc<dyn ScmUiFramework>) -> Result<i32, SystemError> {
|
||||
// 把ui框架加入链表
|
||||
|
||||
|
@ -595,7 +595,6 @@ impl TextuiWindow {
|
||||
/// -flags 标志位
|
||||
/// -vlines_num 虚拟行的总数
|
||||
/// -chars_num 每行最大的字符数
|
||||
|
||||
pub fn new(flags: WindowFlag, vlines_num: i32, chars_num: i32) -> Self {
|
||||
let mut initial_vlines = Vec::new();
|
||||
|
||||
@ -667,10 +666,8 @@ impl TextuiWindow {
|
||||
|
||||
/// 重新渲染某个窗口的某个虚拟行
|
||||
/// ## 参数
|
||||
|
||||
/// - window 窗口结构体
|
||||
/// - vline_id 虚拟行号
|
||||
|
||||
fn textui_refresh_vline(&mut self, vline_id: LineId) -> Result<(), SystemError> {
|
||||
if self.flags.contains(WindowFlag::TEXTUI_CHROMATIC) {
|
||||
return self.textui_refresh_characters(
|
||||
@ -788,12 +785,10 @@ impl TextuiWindow {
|
||||
}
|
||||
/// 根据输入的一个字符在窗口上输出
|
||||
/// ## 参数
|
||||
|
||||
/// - window 窗口
|
||||
/// - character 字符
|
||||
/// - FRcolor 前景色(RGB)
|
||||
/// - BKcolor 背景色(RGB)
|
||||
|
||||
fn textui_putchar_window(
|
||||
&mut self,
|
||||
character: char,
|
||||
@ -1027,7 +1022,6 @@ where
|
||||
/// - character 字符
|
||||
/// - FRcolor 前景色(RGB)
|
||||
/// - BKcolor 背景色(RGB)
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn rs_textui_putchar(character: u8, fr_color: u32, bk_color: u32) -> i32 {
|
||||
if let Some(current_vc) = vc_manager().current_vc() {
|
||||
|
@ -286,7 +286,6 @@ impl<K: Ord + Clone + Debug, V: Clone + Debug> NodePtr<K, V> {
|
||||
|
||||
/// A red black tree implemented with Rust
|
||||
/// It is required that the keys implement the [`Ord`] traits.
|
||||
|
||||
/// # Examples
|
||||
/// ```rust
|
||||
/// use rbtree::RBTree;
|
||||
@ -431,7 +430,7 @@ where
|
||||
|
||||
impl<K: Eq + Ord + Debug, V: Eq + Debug> Eq for RBTree<K, V> {}
|
||||
|
||||
impl<'a, K: Ord + Debug, V: Debug> Index<&'a K> for RBTree<K, V> {
|
||||
impl<K: Ord + Debug, V: Debug> Index<&K> for RBTree<K, V> {
|
||||
type Output = V;
|
||||
|
||||
#[inline]
|
||||
@ -482,7 +481,7 @@ impl<'a, K: Ord + Debug, V: Debug> Clone for Keys<'a, K, V> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, K: Ord + Debug, V: Debug> fmt::Debug for Keys<'a, K, V> {
|
||||
impl<K: Ord + Debug, V: Debug> fmt::Debug for Keys<'_, K, V> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
f.debug_list().entries(self.clone()).finish()
|
||||
}
|
||||
@ -527,7 +526,7 @@ impl<'a, K: Ord + Debug, V: Debug> Clone for Values<'a, K, V> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, K: Ord + Debug, V: Debug> fmt::Debug for Values<'a, K, V> {
|
||||
impl<K: Ord + Debug, V: Debug> fmt::Debug for Values<'_, K, V> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
f.debug_list().entries(self.clone()).finish()
|
||||
}
|
||||
@ -575,7 +574,7 @@ impl<'a, K: Ord + Debug, V: Debug> Clone for ValuesMut<'a, K, V> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, K: Ord + Debug, V: Debug> fmt::Debug for ValuesMut<'a, K, V> {
|
||||
impl<K: Ord + Debug, V: Debug> fmt::Debug for ValuesMut<'_, K, V> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
f.debug_list().entries(self.clone()).finish()
|
||||
}
|
||||
@ -1651,7 +1650,7 @@ mod tests {
|
||||
let vec = vec![(1, 1), (2, 2), (3, 3)];
|
||||
let mut map: RBTree<_, _> = vec.into_iter().collect();
|
||||
for value in map.values_mut() {
|
||||
*value = (*value) * 2
|
||||
*value *= 2
|
||||
}
|
||||
let values: Vec<_> = map.values().cloned().collect();
|
||||
assert_eq!(values.len(), 3);
|
||||
@ -1808,7 +1807,7 @@ mod tests {
|
||||
b.insert(2, "two");
|
||||
b.insert(3, "three");
|
||||
|
||||
a.extend(b.into_iter());
|
||||
a.extend(b);
|
||||
|
||||
assert_eq!(a.len(), 3);
|
||||
assert_eq!(a[&1], "one");
|
||||
@ -1818,6 +1817,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_rev_iter() {
|
||||
use crate::libs::rbtree::RBTree;
|
||||
let mut a = RBTree::new();
|
||||
a.insert(1, 1);
|
||||
a.insert(2, 2);
|
||||
@ -1826,7 +1826,7 @@ mod tests {
|
||||
assert_eq!(a.len(), 3);
|
||||
let mut cache = vec![];
|
||||
for e in a.iter().rev() {
|
||||
cache.push(e.0.clone());
|
||||
cache.push(*e.0);
|
||||
}
|
||||
assert_eq!(&cache, &vec![3, 2, 1]);
|
||||
}
|
||||
|
@ -16,7 +16,6 @@ use crate::{
|
||||
};
|
||||
|
||||
///RwLock读写锁
|
||||
|
||||
/// @brief READER位占据从右往左数第三个比特位
|
||||
const READER: u32 = 1 << 2;
|
||||
|
||||
@ -548,7 +547,7 @@ impl<'rwlock, T> RwLockWriteGuard<'rwlock, T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'rwlock, T> Deref for RwLockReadGuard<'rwlock, T> {
|
||||
impl<T> Deref for RwLockReadGuard<'_, T> {
|
||||
type Target = T;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
@ -556,7 +555,7 @@ impl<'rwlock, T> Deref for RwLockReadGuard<'rwlock, T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'rwlock, T> Deref for RwLockUpgradableGuard<'rwlock, T> {
|
||||
impl<T> Deref for RwLockUpgradableGuard<'_, T> {
|
||||
type Target = T;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
@ -564,7 +563,7 @@ impl<'rwlock, T> Deref for RwLockUpgradableGuard<'rwlock, T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'rwlock, T> Deref for RwLockWriteGuard<'rwlock, T> {
|
||||
impl<T> Deref for RwLockWriteGuard<'_, T> {
|
||||
type Target = T;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
@ -572,13 +571,13 @@ impl<'rwlock, T> Deref for RwLockWriteGuard<'rwlock, T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'rwlock, T> DerefMut for RwLockWriteGuard<'rwlock, T> {
|
||||
impl<T> DerefMut for RwLockWriteGuard<'_, T> {
|
||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||
return unsafe { &mut *self.data };
|
||||
}
|
||||
}
|
||||
|
||||
impl<'rwlock, T> Drop for RwLockReadGuard<'rwlock, T> {
|
||||
impl<T> Drop for RwLockReadGuard<'_, T> {
|
||||
fn drop(&mut self) {
|
||||
debug_assert!(self.lock.load(Ordering::Relaxed) & !(WRITER | UPGRADED) > 0);
|
||||
self.lock.fetch_sub(READER, Ordering::Release);
|
||||
@ -586,7 +585,7 @@ impl<'rwlock, T> Drop for RwLockReadGuard<'rwlock, T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'rwlock, T> Drop for RwLockUpgradableGuard<'rwlock, T> {
|
||||
impl<T> Drop for RwLockUpgradableGuard<'_, T> {
|
||||
fn drop(&mut self) {
|
||||
debug_assert_eq!(
|
||||
self.inner.lock.load(Ordering::Relaxed) & (WRITER | UPGRADED),
|
||||
@ -598,7 +597,7 @@ impl<'rwlock, T> Drop for RwLockUpgradableGuard<'rwlock, T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'rwlock, T> Drop for RwLockWriteGuard<'rwlock, T> {
|
||||
impl<T> Drop for RwLockWriteGuard<'_, T> {
|
||||
fn drop(&mut self) {
|
||||
debug_assert_eq!(self.inner.lock.load(Ordering::Relaxed) & WRITER, WRITER);
|
||||
self.inner
|
||||
|
@ -64,7 +64,6 @@ macro_rules! volatile_write_bit {
|
||||
/// volwrite!(self.common_cfg, queue_enable, 0);
|
||||
///
|
||||
/// 这样做不仅使代码的可读性提高了,也避免了对只读寄存器进行写入的误操作
|
||||
|
||||
/// 只读寄存器
|
||||
#[derive(Default)]
|
||||
#[repr(transparent)]
|
||||
|
@ -473,7 +473,7 @@ pub struct MemBlockIter<'a> {
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
impl<'a> MemBlockIter<'a> {
|
||||
impl MemBlockIter<'_> {
|
||||
/// 获取内存区域数量
|
||||
pub fn total_num(&self) -> usize {
|
||||
self.inner.initial_memory_regions_num
|
||||
@ -490,7 +490,7 @@ impl<'a> MemBlockIter<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Iterator for MemBlockIter<'a> {
|
||||
impl Iterator for MemBlockIter<'_> {
|
||||
type Item = PhysMemoryArea;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
|
@ -208,6 +208,8 @@ impl RingPage {
|
||||
let data_head = unsafe { &(*(self.ptr as *mut perf_event_mmap_page)).data_head };
|
||||
data_tail != data_head
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn as_slice(&self) -> &[u8] {
|
||||
unsafe { core::slice::from_raw_parts(self.ptr as *const u8, self.size) }
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ pub struct PerfSample<'a> {
|
||||
pub value: &'a [u8],
|
||||
}
|
||||
|
||||
impl<'a> PerfSample<'a> {
|
||||
impl PerfSample<'_> {
|
||||
pub fn calculate_size(value_size: usize) -> usize {
|
||||
size_of::<SampleHeader>() + value_size
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ pub struct WaitIdInfo {
|
||||
pub cause: i32,
|
||||
}
|
||||
|
||||
impl<'a> KernelWaitOption<'a> {
|
||||
impl KernelWaitOption<'_> {
|
||||
pub fn new(pid_type: PidType, pid: Pid, options: WaitOption) -> Self {
|
||||
Self {
|
||||
pid_type,
|
||||
|
@ -212,7 +212,7 @@ impl Syscall {
|
||||
return Ok(target_proc.basic().pgid());
|
||||
}
|
||||
/// @brief 获取当前进程的父进程id
|
||||
|
||||
///
|
||||
/// 若为initproc则ppid设置为0
|
||||
pub fn getppid() -> Result<Pid, SystemError> {
|
||||
let current_pcb = ProcessManager::current_pcb();
|
||||
|
@ -10,12 +10,11 @@ use system_error::SystemError;
|
||||
|
||||
use super::{user_access::UserBufferWriter, Syscall};
|
||||
|
||||
#[repr(C)]
|
||||
|
||||
/// 系统信息
|
||||
///
|
||||
/// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/include/uapi/linux/sysinfo.h#8
|
||||
#[derive(Debug, Default, Copy, Clone)]
|
||||
#[repr(C)]
|
||||
pub struct SysInfo {
|
||||
uptime: u64,
|
||||
loads: [u64; 3],
|
||||
|
@ -160,7 +160,7 @@ pub struct UserBufferReader<'a> {
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
impl<'a> UserBufferReader<'a> {
|
||||
impl UserBufferReader<'_> {
|
||||
/// 构造一个指向用户空间位置的BufferReader,为了兼容类似传入 *const u8 的情况,使用单独的泛型来进行初始化
|
||||
///
|
||||
/// @param addr 用户空间指针
|
||||
@ -321,7 +321,7 @@ impl<'a> UserBufferWriter<'a> {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
pub fn buffer<T>(&'a mut self, offset: usize) -> Result<&mut [T], SystemError> {
|
||||
pub fn buffer<T>(&'a mut self, offset: usize) -> Result<&'a mut [T], SystemError> {
|
||||
Self::convert_with_offset::<T>(self.buffer, offset).map_err(|_| SystemError::EINVAL)
|
||||
}
|
||||
|
||||
|
@ -1 +1 @@
|
||||
v1.5
|
||||
v1.6
|
@ -6,4 +6,4 @@ clean:
|
||||
@cargo clean
|
||||
|
||||
check:
|
||||
@cargo +nightly-2024-07-23 check --workspace --message-format=json
|
||||
@cargo +nightly-2024-11-05 check --workspace --message-format=json
|
||||
|
@ -23,7 +23,7 @@ DEFAULT_INSTALL="false"
|
||||
|
||||
export RUSTUP_DIST_SERVER=${RUSTUP_DIST_SERVER:-https://rsproxy.cn}
|
||||
export RUSTUP_UPDATE_ROOT=${RUSTUP_UPDATE_ROOT:-https://rsproxy.cn/rustup}
|
||||
export RUST_VERSION="${RUST_VERSION:-nightly-2024-07-23}"
|
||||
export RUST_VERSION="${RUST_VERSION:-nightly-2024-11-05}"
|
||||
|
||||
banner()
|
||||
{
|
||||
@ -233,21 +233,21 @@ rustInstall() {
|
||||
echo "正在安装DragonOS所需的rust组件...首次安装需要一些时间来更新索引,请耐心等待..."
|
||||
cargo install cargo-binutils
|
||||
cargo install bpf-linker
|
||||
rustup toolchain install nightly-2023-08-15-x86_64-unknown-linux-gnu
|
||||
rustup toolchain install nightly-2024-11-05-x86_64-unknown-linux-gnu
|
||||
rustup toolchain install $RUST_VERSION-x86_64-unknown-linux-gnu
|
||||
rustup component add rust-src --toolchain $RUST_VERSION-x86_64-unknown-linux-gnu
|
||||
rustup component add rust-src --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
||||
rustup component add rust-src --toolchain nightly-2024-11-05-x86_64-unknown-linux-gnu
|
||||
rustup target add x86_64-unknown-none --toolchain $RUST_VERSION-x86_64-unknown-linux-gnu
|
||||
rustup target add x86_64-unknown-none --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
||||
rustup target add x86_64-unknown-linux-musl --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
||||
rustup target add x86_64-unknown-none --toolchain nightly-2024-11-05-x86_64-unknown-linux-gnu
|
||||
rustup target add x86_64-unknown-linux-musl --toolchain nightly-2024-11-05-x86_64-unknown-linux-gnu
|
||||
rustup target add x86_64-unknown-linux-musl --toolchain $RUST_VERSION-x86_64-unknown-linux-gnu
|
||||
|
||||
rustup toolchain install $RUST_VERSION-riscv64gc-unknown-linux-gnu --force-non-host
|
||||
rustup toolchain install nightly-2023-08-15-riscv64gc-unknown-linux-gnu --force-non-host
|
||||
rustup toolchain install nightly-2024-11-05-riscv64gc-unknown-linux-gnu --force-non-host
|
||||
rustup target add riscv64gc-unknown-none-elf --toolchain $RUST_VERSION-riscv64gc-unknown-linux-gnu
|
||||
rustup target add riscv64imac-unknown-none-elf --toolchain $RUST_VERSION-riscv64gc-unknown-linux-gnu
|
||||
rustup target add riscv64gc-unknown-none-elf --toolchain nightly-2023-08-15-riscv64gc-unknown-linux-gnu
|
||||
rustup target add riscv64imac-unknown-none-elf --toolchain nightly-2023-08-15-riscv64gc-unknown-linux-gnu
|
||||
rustup target add riscv64gc-unknown-none-elf --toolchain nightly-2024-11-05-riscv64gc-unknown-linux-gnu
|
||||
rustup target add riscv64imac-unknown-none-elf --toolchain nightly-2024-11-05-riscv64gc-unknown-linux-gnu
|
||||
|
||||
rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
||||
rustup component add rust-src
|
||||
|
@ -110,7 +110,7 @@ pub struct TabsState<'a> {
|
||||
}
|
||||
|
||||
impl<'a> TabsState<'a> {
|
||||
pub fn new(titles: Vec<&'a str>) -> TabsState {
|
||||
pub fn new(titles: Vec<&'a str>) -> TabsState<'a> {
|
||||
TabsState { titles, index: 0 }
|
||||
}
|
||||
pub fn next(&mut self) {
|
||||
|
@ -1,4 +1,4 @@
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
# RUSTFLAGS+="-C target-feature=+crt-static -C link-arg=-no-pie"
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -1,4 +1,4 @@
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -1,6 +1,6 @@
|
||||
# The toolchain we use.
|
||||
# You can get it by running DragonOS' `tools/bootstrap.sh`
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+="-C target-feature=+crt-static -C link-arg=-no-pie"
|
||||
|
||||
# 如果是在dadk中编译,那么安装到dadk的安装目录中
|
||||
|
@ -1,4 +1,4 @@
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -1,4 +1,4 @@
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -1,4 +1,4 @@
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -1,4 +1,4 @@
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -1,5 +1,5 @@
|
||||
[toolchain]
|
||||
channel = "nightly-2024-07-23"
|
||||
channel = "nightly-2024-11-05"
|
||||
# The source code of rustc, provided by the rust-src component, is needed for
|
||||
# building eBPF programs.
|
||||
components = [
|
||||
|
@ -1,4 +1,4 @@
|
||||
TOOLCHAIN="+nightly-2023-08-15-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Makefile.toml
|
||||
|
||||
[env]
|
||||
TOOLCHAIN = "+nightly-2023-08-15-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN = "+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
|
||||
ARCH = { default = "x86_64" }
|
||||
RUST_TARGET = { default = { if = "eq(env.ARCH, 'riscv64')", value = "riscv64gc-unknown-linux-gnu", else = "x86_64-unknown-linux-musl" } }
|
||||
|
@ -1,4 +1,4 @@
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -1,4 +1,4 @@
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
# RUSTFLAGS+="-C target-feature=+crt-static -C link-arg=-no-pie"
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -1,4 +1,4 @@
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -1,6 +1,6 @@
|
||||
# The toolchain we use.
|
||||
# You can get it by running DragonOS' `tools/bootstrap.sh`
|
||||
TOOLCHAIN="+nightly-2024-07-23-x86_64-unknown-linux-gnu"
|
||||
TOOLCHAIN="+nightly-2024-11-05-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
|
@ -8,7 +8,7 @@
|
||||
"Git": {
|
||||
"url": "https://git.mirrors.dragonos.org.cn/DragonOS-Community/dog.git",
|
||||
"branch": null,
|
||||
"revision": "4ad6075686"
|
||||
"revision": "6f2c0c8f12"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -6,7 +6,7 @@
|
||||
"BuildFromSource": {
|
||||
"Git": {
|
||||
"url" : "https://git.mirrors.dragonos.org.cn/DragonOS-Community/DragonReach.git",
|
||||
"revision": "01cdc56863"
|
||||
"revision": "e945c217b3"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user