mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-18 20:16:42 +00:00
Update image and Rust toolchain
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
97323f612b
commit
12d01ca1e4
@ -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
|
||||||
};
|
};
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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)]
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1 @@
|
|||||||
pub mod recycle_allocator;
|
pub mod recycle_allocator;
|
||||||
mod type_map;
|
|
||||||
|
|
||||||
pub use self::type_map::TypeMap;
|
|
||||||
|
@ -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!()
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 = []
|
||||||
|
@ -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);
|
||||||
|
@ -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) }
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
@ -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};
|
||||||
|
@ -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(
|
||||||
|
@ -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"]
|
||||||
|
@ -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)]
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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(
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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]
|
||||||
|
@ -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 \
|
||||||
|
Reference in New Issue
Block a user