From fdcf5fd0fed556be7bcac11d4f9d16835d1623aa Mon Sep 17 00:00:00 2001 From: Ruihan Li Date: Wed, 14 Jan 2026 00:39:45 +0800 Subject: [PATCH] Remove the `AT_NULL` variant --- .../process/process_vm/init_stack/aux_vec.rs | 14 +++++++------- .../src/process/process_vm/init_stack/mod.rs | 2 +- .../src/process/program_loader/elf/load_elf.rs | 18 ++++++++---------- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/kernel/src/process/process_vm/init_stack/aux_vec.rs b/kernel/src/process/process_vm/init_stack/aux_vec.rs index 622a4a842..125d8494d 100644 --- a/kernel/src/process/process_vm/init_stack/aux_vec.rs +++ b/kernel/src/process/process_vm/init_stack/aux_vec.rs @@ -17,7 +17,6 @@ use crate::prelude::*; #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] #[repr(u8)] pub enum AuxKey { - AT_NULL = 0, /* end of vector */ AT_IGNORE = 1, /* entry should be ignored */ AT_EXECFD = 2, /* file descriptor of program */ AT_PHDR = 3, /* program headers for program */ @@ -49,6 +48,11 @@ pub enum AuxKey { AT_SYSINFO_EHDR = 33, /* the start address of the page containing the VDSO */ } +impl AuxKey { + /// A special auxiliary key that denotes the end of the auxiliary vector. + pub(super) const AT_NULL: u8 = 0; +} + #[derive(Clone, Default, Debug)] pub struct AuxVec { table: BTreeMap, @@ -61,18 +65,14 @@ impl AuxVec { } } - pub fn set(&mut self, key: AuxKey, val: u64) -> Result<()> { - if key == AuxKey::AT_NULL || key == AuxKey::AT_IGNORE { - return_errno_with_message!(Errno::EINVAL, "Illegal key"); - } + pub fn set(&mut self, key: AuxKey, val: u64) { self.table .entry(key) .and_modify(|val_mut| *val_mut = val) .or_insert(val); - Ok(()) } - pub fn table(&self) -> &BTreeMap { + pub(super) fn table(&self) -> &BTreeMap { &self.table } } diff --git a/kernel/src/process/process_vm/init_stack/mod.rs b/kernel/src/process/process_vm/init_stack/mod.rs index 0bf9b7ca3..42502f0ea 100644 --- a/kernel/src/process/process_vm/init_stack/mod.rs +++ b/kernel/src/process/process_vm/init_stack/mod.rs @@ -259,7 +259,7 @@ impl InitStackWriter<'_> { let random_value = generate_random_for_aux_vec(); self.write_bytes(&random_value)? }; - self.auxvec.set(AuxKey::AT_RANDOM, random_value_pointer)?; + self.auxvec.set(AuxKey::AT_RANDOM, random_value_pointer); self.adjust_stack_alignment(&envp_pointers, &argv_pointers)?; self.write_aux_vec()?; diff --git a/kernel/src/process/program_loader/elf/load_elf.rs b/kernel/src/process/program_loader/elf/load_elf.rs index 902ed8d98..272555020 100644 --- a/kernel/src/process/program_loader/elf/load_elf.rs +++ b/kernel/src/process/program_loader/elf/load_elf.rs @@ -74,9 +74,7 @@ pub fn load_elf_to_vmar( if let Some(vdso_text_base) = map_vdso_to_vmar(vmar) { #[cfg(target_arch = "riscv64")] vmar.process_vm().set_vdso_base(vdso_text_base); - aux_vec - .set(AuxKey::AT_SYSINFO_EHDR, vdso_text_base as u64) - .unwrap(); + aux_vec.set(AuxKey::AT_SYSINFO_EHDR, vdso_text_base as u64); } vmar.process_vm() @@ -166,7 +164,7 @@ fn map_vmos_and_build_aux_vec( } else { 0 }; - aux_vec.set(AuxKey::AT_SECURE, secure)?; + aux_vec.set(AuxKey::AT_SECURE, secure); let entry_point = if let Some(ldso_load_info) = ldso_load_info { ldso_load_info.entry_point @@ -431,7 +429,7 @@ fn init_aux_vec( ) -> Result { let mut aux_vec = AuxVec::new(); - aux_vec.set(AuxKey::AT_PAGESZ, PAGE_SIZE as _)?; + aux_vec.set(AuxKey::AT_PAGESZ, PAGE_SIZE as _); let Some(ph_vaddr) = elf_map_range.relocated_addr_of(elf.find_vaddr_of_phdrs()?) else { return_errno_with_message!( @@ -439,9 +437,9 @@ fn init_aux_vec( "the ELF program headers are not located in any segments" ); }; - aux_vec.set(AuxKey::AT_PHDR, ph_vaddr as u64)?; - aux_vec.set(AuxKey::AT_PHNUM, elf.ph_count() as u64)?; - aux_vec.set(AuxKey::AT_PHENT, elf.ph_ent() as u64)?; + aux_vec.set(AuxKey::AT_PHDR, ph_vaddr as u64); + aux_vec.set(AuxKey::AT_PHNUM, elf.ph_count() as u64); + aux_vec.set(AuxKey::AT_PHENT, elf.ph_ent() as u64); let Some(entry_vaddr) = elf_map_range.relocated_addr_of(elf.entry_point()) else { return_errno_with_message!( @@ -449,10 +447,10 @@ fn init_aux_vec( "the entry point is not located in any segments" ); }; - aux_vec.set(AuxKey::AT_ENTRY, entry_vaddr as u64)?; + aux_vec.set(AuxKey::AT_ENTRY, entry_vaddr as u64); if let Some(ldso_base) = ldso_base { - aux_vec.set(AuxKey::AT_BASE, ldso_base as u64)?; + aux_vec.set(AuxKey::AT_BASE, ldso_base as u64); } Ok(aux_vec)