Update image and Rust toolchain

This commit is contained in:
Zhang Junyang
2023-12-02 17:23:08 +08:00
committed by Tate, Hongliang Tian
parent 97323f612b
commit 12d01ca1e4
24 changed files with 69 additions and 72 deletions

View File

@ -55,7 +55,7 @@ pub(crate) fn callback_init() {
crate::arch::x86::kernel::pic::allocate_irq(4).unwrap() crate::arch::x86::kernel::pic::allocate_irq(4).unwrap()
} else { } else {
let irq = IrqLine::alloc().unwrap(); let irq = IrqLine::alloc().unwrap();
let mut io_apic = IO_APIC.get().unwrap().get(0).unwrap().lock(); let mut io_apic = IO_APIC.get().unwrap().first().unwrap().lock();
io_apic.enable(4, irq.clone()).unwrap(); io_apic.enable(4, irq.clone()).unwrap();
irq irq
}; };

View File

@ -102,7 +102,7 @@ fn init_periodic_mode() {
let mut apic_lock = APIC_INSTANCE.get().unwrap().lock(); let mut apic_lock = APIC_INSTANCE.get().unwrap().lock();
let mut irq = IrqLine::alloc_specific(super::TIMER_IRQ_NUM.load(Ordering::Relaxed)).unwrap(); let mut irq = IrqLine::alloc_specific(super::TIMER_IRQ_NUM.load(Ordering::Relaxed)).unwrap();
irq.on_active(init_function); irq.on_active(init_function);
let mut io_apic = IO_APIC.get().unwrap().get(0).unwrap().lock(); let mut io_apic = IO_APIC.get().unwrap().first().unwrap().lock();
debug_assert_eq!(io_apic.interrupt_base(), 0); debug_assert_eq!(io_apic.interrupt_base(), 0);
io_apic.enable(2, irq.clone()).unwrap(); io_apic.enable(2, irq.clone()).unwrap();
drop(io_apic); drop(io_apic);
@ -133,7 +133,7 @@ fn init_periodic_mode() {
return; return;
} }
} }
let mut io_apic = IO_APIC.get().unwrap().get(0).unwrap().lock(); let mut io_apic = IO_APIC.get().unwrap().first().unwrap().lock();
io_apic.disable(2).unwrap(); io_apic.disable(2).unwrap();
drop(io_apic); drop(io_apic);
// stop APIC Timer, get the number of tick we need // stop APIC Timer, get the number of tick we need

View File

@ -34,7 +34,7 @@ fn iter_range(range: Range<usize>) {
let mut io_apic = if is_ioapic2 { let mut io_apic = if is_ioapic2 {
io_apics.get(1).unwrap().lock() io_apics.get(1).unwrap().lock()
} else { } else {
io_apics.get(0).unwrap().lock() io_apics.first().unwrap().lock()
}; };
let mut device_count = 0; let mut device_count = 0;
while current > range.start { while current > range.start {

View File

@ -68,7 +68,7 @@ impl PciDeviceLocation {
/// Returns an iterator that enumerates all possible PCI device locations. /// Returns an iterator that enumerates all possible PCI device locations.
pub fn all() -> impl Iterator<Item = PciDeviceLocation> { pub fn all() -> impl Iterator<Item = PciDeviceLocation> {
iter::from_generator(|| { iter::from_coroutine(|| {
for bus in Self::MIN_BUS..=Self::MAX_BUS { for bus in Self::MIN_BUS..=Self::MAX_BUS {
for device in Self::MIN_DEVICE..=Self::MAX_DEVICE { for device in Self::MIN_DEVICE..=Self::MAX_DEVICE {
for function in Self::MIN_FUNCTION..=Self::MAX_FUNCTION { for function in Self::MIN_FUNCTION..=Self::MAX_FUNCTION {

View File

@ -1,13 +1,12 @@
//! The framework part of Asterinas. //! The framework part of Asterinas.
#![feature(alloc_error_handler)] #![feature(alloc_error_handler)]
#![feature(const_maybe_uninit_zeroed)]
#![feature(const_mut_refs)] #![feature(const_mut_refs)]
#![feature(const_ptr_sub_ptr)] #![feature(const_ptr_sub_ptr)]
#![feature(const_trait_impl)] #![feature(const_trait_impl)]
#![feature(core_intrinsics)] #![feature(core_intrinsics)]
#![feature(coroutines)]
#![feature(fn_traits)] #![feature(fn_traits)]
#![feature(generators)] #![feature(iter_from_coroutine)]
#![feature(iter_from_generator)]
#![feature(let_chains)] #![feature(let_chains)]
#![feature(negative_impls)] #![feature(negative_impls)]
#![feature(new_uninit)] #![feature(new_uninit)]

View File

@ -96,7 +96,9 @@ impl WaitQueue {
return Some(res); return Some(res);
}; };
if let Some(ref timer_callback) = timer_callback && timer_callback.is_expired() { if let Some(ref timer_callback) = timer_callback
&& timer_callback.is_expired()
{
return None; return None;
} }

View File

@ -1,4 +1 @@
pub mod recycle_allocator; pub mod recycle_allocator;
mod type_map;
pub use self::type_map::TypeMap;

View File

@ -1,26 +0,0 @@
/// A type map is a collection whose keys are types, rather than values.
pub struct TypeMap {}
pub trait Any: core::any::Any + Send + Sync {}
impl TypeMap {
/// Creates an empty typed map.
pub fn new() -> Self {
todo!()
}
/// Inserts a new item of type `T`.
pub fn insert<T: Any>(&mut self, val: T) -> Option<T> {
todo!()
}
/// Gets an item of type `T`.
pub fn get<T: Any>(&self) -> Option<&T> {
todo!()
}
/// Gets an item of type `T`.
pub fn remove<T: Any>(&self) -> Option<T> {
todo!()
}
}

View File

@ -12,5 +12,5 @@ serde = { version = "1.0.192", features = ["derive"] }
xmas-elf = "0.9.1" xmas-elf = "0.9.1"
[features] [features]
default = [] default = ["trojan64"]
trojan64 = [] trojan64 = []

View File

@ -158,7 +158,7 @@ fn build_trojan_with_arch(source_dir: &Path, out_dir: &Path, arch: &TrojanBuildA
let out_dir = std::fs::canonicalize(out_dir).unwrap(); let out_dir = std::fs::canonicalize(out_dir).unwrap();
// Relocations are fewer in release mode. But with release mode it crashes. // Relocations are fewer in release mode. But with release mode it crashes.
let profile = "debug"; let profile = "release";
let cargo = std::env::var("CARGO").unwrap(); let cargo = std::env::var("CARGO").unwrap();
let mut cmd = std::process::Command::new(cargo); let mut cmd = std::process::Command::new(cargo);

View File

@ -120,5 +120,12 @@ fn efi_phase_runtime(
} }
} }
unsafe {
use crate::console::{print_hex, print_str};
print_str("[EFI stub] Entering Jinux entrypoint at ");
print_hex(super::JINUX_ENTRY_POINT as u64);
print_str("\n");
}
unsafe { super::call_jinux_entrypoint(super::JINUX_ENTRY_POINT, boot_params_ptr as u64) } unsafe { super::call_jinux_entrypoint(super::JINUX_ENTRY_POINT, boot_params_ptr as u64) }
} }

View File

@ -8,6 +8,8 @@ global_asm!(include_str!("setup.S"));
use crate::console::{print_hex, print_str}; use crate::console::{print_hex, print_str};
pub const JINUX_ENTRY_POINT: u32 = 0x8001000;
#[export_name = "_trojan_entry_32"] #[export_name = "_trojan_entry_32"]
extern "cdecl" fn trojan_entry(boot_params_ptr: u32) -> ! { extern "cdecl" fn trojan_entry(boot_params_ptr: u32) -> ! {
// Safety: this init function is only called once. // Safety: this init function is only called once.
@ -27,12 +29,7 @@ extern "cdecl" fn trojan_entry(boot_params_ptr: u32) -> ! {
crate::loader::load_elf(payload); crate::loader::load_elf(payload);
// Safety: the entrypoint and the ptr is valid. // Safety: the entrypoint and the ptr is valid.
unsafe { unsafe { call_jinux_entrypoint(JINUX_ENTRY_POINT, boot_params_ptr.try_into().unwrap()) };
call_jinux_entrypoint(
super::JINUX_ENTRY_POINT,
boot_params_ptr.try_into().unwrap(),
)
};
} }
pub const ASTER_ENTRY_POINT: u32 = 0x8001000; pub const ASTER_ENTRY_POINT: u32 = 0x8001000;

View File

@ -1,10 +1,8 @@
cfg_if::cfg_if! { cfg_if::cfg_if! {
if #[cfg(target_arch = "x86_64")] { if #[cfg(target_arch = "x86_64")] {
mod amd64_efi; mod amd64_efi;
pub use amd64_efi::*;
} else if #[cfg(target_arch = "x86")] { } else if #[cfg(target_arch = "x86")] {
mod legacy_i386; mod legacy_i386;
pub use legacy_i386::*;
} else { } else {
compile_error!("Unsupported target_arch"); compile_error!("Unsupported target_arch");
} }

View File

@ -28,10 +28,21 @@ fn get_rela_array() -> &'static [Elf64Rela] {
let end = __rela_dyn_end as *const Elf64Rela; let end = __rela_dyn_end as *const Elf64Rela;
// FIXME: 2023/11/29 // FIXME: 2023/11/29
// There should be a Rust compiler bug that makes the calculation of len incorrect. // There should be a Rust compiler bug that makes the calculation of len incorrect.
// The current implementation only works in debug mode. // The most sound implementation only works in debug mode.
// To do it in release mode, a workaround is to use inline asm. But that crashes // let len = unsafe { end.offset_from(start) } as usize;
// in debug mode. QaQ // The inline asm solution is a workaround.
let len = unsafe { end.offset_from(start) } as usize; let len = unsafe {
let len: usize;
core::arch::asm!("
mov {len}, {end}
sub {len}, {start}
",
len = out(reg) len,
end = in(reg) end,
start = in(reg) start,
);
len / core::mem::size_of::<Elf64Rela>() as usize
};
#[cfg(feature = "debug_print")] #[cfg(feature = "debug_print")]
unsafe { unsafe {
use crate::console::{print_hex, print_str}; use crate::console::{print_hex, print_str};

View File

@ -64,7 +64,9 @@ pub const IOMMU_DEVICE_ARGS: &[&str] = &[
"ioh3420,id=pcie.0,chassis=1", "ioh3420,id=pcie.0,chassis=1",
]; ];
pub const GRUB_PREFIX: &str = "/usr/local/grub"; // To test legacy boot, use the following:
// pub const GRUB_PREFIX: &str = "/usr/local/grub";
pub const GRUB_PREFIX: &str = "/usr";
pub const GRUB_VERSION: &str = "x86_64-efi"; pub const GRUB_VERSION: &str = "x86_64-efi";
pub fn create_bootdev_image( pub fn create_bootdev_image(

View File

@ -1,3 +1,3 @@
[toolchain] [toolchain]
channel = "nightly-2023-10-05" channel = "nightly-2023-12-01"
components = ["rust-src", "rustc-dev", "llvm-tools-preview"] components = ["rust-src", "rustc-dev", "llvm-tools-preview"]

View File

@ -17,7 +17,6 @@
#![feature(linked_list_remove)] #![feature(linked_list_remove)]
#![feature(trait_alias)] #![feature(trait_alias)]
#![feature(register_tool)] #![feature(register_tool)]
#![feature(trait_upcasting)]
#![feature(format_args_nl)] #![feature(format_args_nl)]
#![feature(int_roundings)] #![feature(int_roundings)]
#![feature(step_trait)] #![feature(step_trait)]

View File

@ -21,7 +21,9 @@ impl Inner {
return; return;
}; };
if let Some(leader) = &self.leader && Arc::ptr_eq(leader, &process) { if let Some(leader) = &self.leader
&& Arc::ptr_eq(leader, &process)
{
self.leader = None; self.leader = None;
} }
} }

View File

@ -28,7 +28,9 @@ impl Inner {
} }
pub(in crate::process) fn remove_process(&mut self, process: &Arc<Process>) { pub(in crate::process) fn remove_process(&mut self, process: &Arc<Process>) {
if let Some(leader) = &self.leader && Arc::ptr_eq(leader, process) { if let Some(leader) = &self.leader
&& Arc::ptr_eq(leader, process)
{
self.leader = None; self.leader = None;
} }
} }

View File

@ -111,7 +111,7 @@ impl Elf {
// An offset to be subtracted from ELF vaddr for PIE // An offset to be subtracted from ELF vaddr for PIE
pub fn base_load_address_offset(&self) -> u64 { pub fn base_load_address_offset(&self) -> u64 {
let phdr = self.program_headers.get(0).unwrap(); let phdr = self.program_headers.first().unwrap();
phdr.virtual_addr - phdr.offset phdr.virtual_addr - phdr.offset
} }
} }

View File

@ -199,12 +199,14 @@ fn base_map_addr(elf: &Elf, root_vmar: &Vmar<Full>) -> Result<Vaddr> {
.program_headers .program_headers
.iter() .iter()
.filter_map(|program_header| { .filter_map(|program_header| {
if let Ok(type_) = program_header.get_type() && type_ == program::Type::Load { if let Ok(type_) = program_header.get_type()
let ph_max_addr = program_header.virtual_addr + program_header.mem_size; && type_ == program::Type::Load
Some(ph_max_addr as usize) {
} else { let ph_max_addr = program_header.virtual_addr + program_header.mem_size;
None Some(ph_max_addr as usize)
} } else {
None
}
}) })
.max() .max()
.ok_or(Error::with_message( .ok_or(Error::with_message(

View File

@ -122,15 +122,21 @@ fn do_select(
let fd = poll_fd.fd().unwrap(); let fd = poll_fd.fd().unwrap();
let revents = poll_fd.revents().get(); let revents = poll_fd.revents().get();
let (readable, writable, except) = convert_events_to_rwe(&revents); let (readable, writable, except) = convert_events_to_rwe(&revents);
if let Some(ref mut fds) = readfds && readable { if let Some(ref mut fds) = readfds
&& readable
{
fds.set(fd)?; fds.set(fd)?;
total_revents += 1; total_revents += 1;
} }
if let Some(ref mut fds) = writefds && writable { if let Some(ref mut fds) = writefds
&& writable
{
fds.set(fd)?; fds.set(fd)?;
total_revents += 1; total_revents += 1;
} }
if let Some(ref mut fds) = exceptfds && except { if let Some(ref mut fds) = exceptfds
&& except
{
fds.set(fd)?; fds.set(fd)?;
total_revents += 1; total_revents += 1;
} }

View File

@ -1,10 +1,7 @@
mod addr; mod addr;
mod socket; mod socket;
pub use addr::{ pub use addr::{read_socket_addr_from_user, write_socket_addr_to_user, SaFamily};
read_socket_addr_from_user, write_socket_addr_to_user, InetAddr, SaFamily, SockAddr,
SockAddrInet, SockAddrInet6, SockAddrUnix,
};
pub use socket::{Protocol, SockFlags, SockType, SOCK_TYPE_MASK}; pub use socket::{Protocol, SockFlags, SockType, SOCK_TYPE_MASK};
#[macro_export] #[macro_export]

View File

@ -121,7 +121,7 @@ FROM build-ovmf as ovmf
# Fetch and build OVMF from the EDK2 official source # Fetch and build OVMF from the EDK2 official source
WORKDIR /root WORKDIR /root
RUN git clone --depth 1 --branch edk2-stable202308 --recurse-submodules --shallow-submodules https://github.com/tianocore/edk2.git RUN git clone --depth 1 --branch edk2-stable202311 --recurse-submodules --shallow-submodules https://github.com/tianocore/edk2.git
WORKDIR /root/edk2 WORKDIR /root/edk2
RUN source ./edksetup.sh \ RUN source ./edksetup.sh \
&& make -C BaseTools \ && make -C BaseTools \
@ -208,7 +208,9 @@ RUN apt update && apt-get install -y --no-install-recommends \
cpuid \ cpuid \
file \ file \
gdb \ gdb \
grub-efi-amd64 \
grub-efi-amd64-bin \ grub-efi-amd64-bin \
grub-efi-amd64-dbg \
libpixman-1-dev `# running dependency for QEMU` \ libpixman-1-dev `# running dependency for QEMU` \
mtools `# used by grub-mkrescue` \ mtools `# used by grub-mkrescue` \
net-tools \ net-tools \