From 86d89752cf8cd4bbb242ce11ec7dd4535d13ae3e Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 11 Sep 2022 19:14:42 +1000 Subject: [PATCH 001/368] kernel: update limine version --- src/Cargo.lock | 2 +- src/aero_kernel/Cargo.toml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index 70c8e12f79e..3df52287cc8 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -222,7 +222,7 @@ checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" [[package]] name = "limine" version = "0.1.8" -source = "git+https://github.com/limine-bootloader/limine-rs#59fa1764915ae366d5c9889c2df4fe8177fb8d19" +source = "git+https://github.com/limine-bootloader/limine-rs#bd55281c929ae0d3fe283ba33a9dd411ed58e355" [[package]] name = "log" diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index 2d0ec4c4dc4..e64245a0e10 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -20,7 +20,6 @@ kmemleak = [] vmlog = [] syslog = [] - default = ["round-robin"] [dependencies] From 702626f1f35ff67d51e78523afb2c9ffa81ccffd Mon Sep 17 00:00:00 2001 From: Joshua Price Date: Sun, 11 Sep 2022 19:13:20 -0400 Subject: [PATCH 002/368] build: config option for QEMU memory --- aero.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/aero.py b/aero.py index cd649be213b..62bef80434a 100755 --- a/aero.py +++ b/aero.py @@ -214,6 +214,10 @@ def parse_args(): nargs=argparse.REMAINDER, help='additional arguments to pass as the emulator') + parser.add_argument('--memory', + default='9800M', + help='amount of memory to allocate to QEMU') + return parser.parse_args() @@ -515,10 +519,11 @@ def find(path) -> List[str]: def run_in_emulator(build_info: BuildInfo, iso_path): is_kvm_available = is_kvm_supported() - args = build_info.args + # args = build_info.args + args = parse_args() qemu_args = ['-cdrom', iso_path, - '-m', '9800M', + '-m', args.memory, '-smp', '1', '-serial', 'stdio'] @@ -665,7 +670,7 @@ def main(): kernel_bin = kernel_bin[0] iso_path = prepare_iso(args, kernel_bin, user_bins) - run_in_emulator(args, iso_path) + run_in_emulator(build_info, iso_path) elif args.clean: src_target = os.path.join('src', 'target', args.target) userland_target = os.path.join('userland', 'target') From aa498d9f4f7445fd6cfa8b8a213ae276a9de5faa Mon Sep 17 00:00:00 2001 From: Joshua Price Date: Sun, 11 Sep 2022 19:17:52 -0400 Subject: [PATCH 003/368] refactor: remove unneeded call --- aero.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aero.py b/aero.py index 62bef80434a..88196a2fe3d 100755 --- a/aero.py +++ b/aero.py @@ -519,8 +519,7 @@ def find(path) -> List[str]: def run_in_emulator(build_info: BuildInfo, iso_path): is_kvm_available = is_kvm_supported() - # args = build_info.args - args = parse_args() + args = build_info.args qemu_args = ['-cdrom', iso_path, '-m', args.memory, From 54513bc64b166a79069e02c453748e75d064e856 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 13 Sep 2022 17:40:26 +1000 Subject: [PATCH 004/368] kernel: update limine Signed-off-by: Andy-Python-Programmer --- src/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index 3df52287cc8..5bf634e2707 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -222,7 +222,7 @@ checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" [[package]] name = "limine" version = "0.1.8" -source = "git+https://github.com/limine-bootloader/limine-rs#bd55281c929ae0d3fe283ba33a9dd411ed58e355" +source = "git+https://github.com/limine-bootloader/limine-rs#beb7a4c7c80ab934dcdc220eab131063556b27a0" [[package]] name = "log" From 24cfd4a2454d1d169691a5ba45d7fc137d37362a Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 17 Sep 2022 17:07:26 +1000 Subject: [PATCH 005/368] block: GPT * GPT * NVME make use of PRP2 when the content cannot fit in 1 page (4096 bytes) * NVME Completion Queue - make sure to return an error if has had one * EXT2 framework Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/block/ide/mod.rs | 7 +- .../src/drivers/block/nvme/command.rs | 22 +-- src/aero_kernel/src/drivers/block/nvme/dma.rs | 22 ++- src/aero_kernel/src/drivers/block/nvme/mod.rs | 63 +++++- .../src/drivers/block/nvme/queue.rs | 32 ++-- src/aero_kernel/src/fs/block.rs | 181 ------------------ src/aero_kernel/src/fs/block/gpt.rs | 143 ++++++++++++++ src/aero_kernel/src/fs/block/mod.rs | 157 +++++++++++++++ src/aero_kernel/src/fs/ext2/mod.rs | 86 +++++++++ src/aero_kernel/src/fs/mod.rs | 2 + src/aero_kernel/src/main.rs | 4 +- 11 files changed, 492 insertions(+), 227 deletions(-) delete mode 100644 src/aero_kernel/src/fs/block.rs create mode 100644 src/aero_kernel/src/fs/block/gpt.rs create mode 100644 src/aero_kernel/src/fs/block/mod.rs create mode 100644 src/aero_kernel/src/fs/ext2/mod.rs diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index 830f4e76398..0da0ecdef37 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -20,6 +20,8 @@ mod channel; mod registers; +use core::mem::MaybeUninit; + use channel::*; use alloc::sync::Arc; @@ -50,14 +52,15 @@ impl IdeDrive { } impl BlockDeviceInterface for IdeDrive { - fn read(&self, sector: usize, dest: &mut [u8]) -> Option { + fn read(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { let count = dest.len().ceil_div(512); let request = Arc::new(DmaRequest::new(sector, count)); let res = self.channel.run_request(request.clone(), self.slave); if res.is_some() { - request.copy_into(dest); + todo!() + // request.copy_into(dest); } res diff --git a/src/aero_kernel/src/drivers/block/nvme/command.rs b/src/aero_kernel/src/drivers/block/nvme/command.rs index feab4bac327..e4c3b3d607c 100644 --- a/src/aero_kernel/src/drivers/block/nvme/command.rs +++ b/src/aero_kernel/src/drivers/block/nvme/command.rs @@ -17,8 +17,6 @@ * along with Aero. If not, see . */ -use bit_field::BitField; - #[repr(u8)] #[derive(Default, Copy, Clone)] pub enum IdentifyCns { @@ -58,7 +56,7 @@ pub enum AdminOpcode { Unknown = u8::MAX, } -#[derive(Default, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] #[repr(C)] pub struct DataPointer { pub prp1: u64, @@ -272,7 +270,7 @@ pub struct IdentifyNamespace { const_assert_eq!(core::mem::size_of::(), 0x1000); #[repr(C)] -#[derive(Default, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] pub struct ReadWriteCommand { pub opcode: u8, pub flags: u8, @@ -343,16 +341,12 @@ impl Into for CreateCQCommand { #[derive(Clone, Copy, Debug)] #[repr(C)] pub struct CompletionEntry { - dw0: u32, - dw1: u32, - dw2: u32, - dw3: u32, -} - -impl CompletionEntry { - pub fn get_phase_tag(&self) -> bool { - self.dw3.get_bit(16) - } + pub result: u32, // Used by admin commands to return data. + pub reserved: u32, + pub sq_head: u16, // Portion of the queue that may be reclaimed + pub sq_id: u16, // Submission Queue that generated this entry. + pub command_id: u16, // Command ID of the command that was completed. + pub status: u16, // Reason why the command failed, if it did. } #[repr(C)] diff --git a/src/aero_kernel/src/drivers/block/nvme/dma.rs b/src/aero_kernel/src/drivers/block/nvme/dma.rs index 11174bfab7b..e4ce428770c 100644 --- a/src/aero_kernel/src/drivers/block/nvme/dma.rs +++ b/src/aero_kernel/src/drivers/block/nvme/dma.rs @@ -35,22 +35,26 @@ pub struct DmaAllocator; unsafe impl Allocator for DmaAllocator { fn allocate(&self, layout: Layout) -> Result, AllocError> { // XXX: The DMA buffer must be aligned to a page boundary. - let size = align_up(layout.size() as u64, Size2MiB::SIZE); + let size_bytes = layout.size() as u64; - let pages = size / Size2MiB::SIZE; - assert!(pages == 1); + let phys = if size_bytes <= Size4KiB::SIZE { + let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().ok_or(AllocError)?; + frame.start_address() + } else { + assert!(size_bytes <= Size2MiB::SIZE); - let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().ok_or(AllocError)?; - let virt = frame.start_address().as_hhdm_virt(); + let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().ok_or(AllocError)?; + frame.start_address() + }; + + let virt = phys.as_hhdm_virt(); // SAFETY: The frame is aligned and non-null. let ptr = unsafe { NonNull::new_unchecked(virt.as_mut_ptr() as *mut u8) }; - Ok(NonNull::slice_from_raw_parts(ptr, size as _)) + Ok(NonNull::slice_from_raw_parts(ptr, size_bytes as _)) } - unsafe fn deallocate(&self, _ptr: NonNull, _layout: Layout) { - log::warn!("DMA memory deallocation is not *yet* implemented :) Enjoy the leaks :)") - } + unsafe fn deallocate(&self, _ptr: NonNull, _layout: Layout) {} } pub type DmaBuffer = Box; diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 4d2d331699c..1988b906130 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -21,6 +21,8 @@ mod command; mod dma; mod queue; +use core::mem::MaybeUninit; + use command::*; use dma::*; use queue::*; @@ -36,7 +38,7 @@ use crate::fs::block::{install_block_device, BlockDevice, BlockDeviceInterface}; use crate::mem::paging::*; use crate::utils::sync::Mutex; -use crate::utils::VolatileCell; +use crate::utils::{CeilDiv, VolatileCell}; #[derive(Copy, Clone, Debug)] enum Error { @@ -78,7 +80,8 @@ bitflags::bitflags! { struct Capability(VolatileCell); impl Capability { - /// Returns maximum individual queue size that the controller supports. + /// Returns maximum individual queue size that the controller + /// supports. fn max_queue_entries(&self) -> u16 { self.0.get().get_bits(0..16) as u16 } @@ -88,10 +91,17 @@ impl Capability { self.0.get().get_bits(32..36) } - /// Returns the command sets that are supported by the controller. + /// Returns the command sets that are supported by the + /// controller. fn get_css(&self) -> CommandSetsSupported { CommandSetsSupported::from_bits_truncate(self.0.get().get_bits(37..45) as u8) } + + /// Returns the the minimum host memory page size that the + /// controller supports. + fn mpsmin(&self) -> u64 { + self.0.get().get_bits(48..52) + } } #[repr(u32)] @@ -215,12 +225,15 @@ struct Namespace<'a> { blocks: usize, block_size: usize, size: usize, + max_prps: usize, + prps: Mutex]>>, controller: Arc>, } impl<'a> Namespace<'a> { - fn read(&self, sector: usize, dest: &mut [u8]) { - let length = ((dest.len() / self.block_size) - 1) as u16; + fn read(&self, sector: usize, dest: &mut [MaybeUninit]) { + let size_bytes = dest.len(); + let blocks = size_bytes.ceil_div(self.block_size); let buffer = Dma::::new_uninit_slice(dest.len()); let mut read_cmd = ReadWriteCommand::default(); @@ -228,14 +241,32 @@ impl<'a> Namespace<'a> { read_cmd.opcode = CommandOpcode::Read as u8; read_cmd.nsid = self.nsid; read_cmd.start_lba = sector as u64; - read_cmd.length = length; - read_cmd.data_ptr.prp1 = buffer.addr().as_u64(); + read_cmd.length = (blocks - 1) as u16; + + if size_bytes > Size4KiB::SIZE as usize { + // The data cannot fit in 8KiB frames, so we need to use + // a PRP list. + let prp_num = ((blocks - 1) * self.block_size) / Size4KiB::SIZE as usize; + assert!(prp_num < self.max_prps); + + let mut prps = self.prps.lock(); + + for i in 0..prp_num { + prps[i] + .write((buffer.addr().as_u64() + Size4KiB::SIZE) + (Size4KiB::SIZE * i as u64)); + } + + read_cmd.data_ptr.prp1 = buffer.addr().as_u64(); + read_cmd.data_ptr.prp2 = prps.addr().as_u64(); + } else { + read_cmd.data_ptr.prp1 = buffer.addr().as_u64(); + } self.controller.io_queue.lock().submit_command(read_cmd); // SAFETY: The buffer is initialized above. let buffer = unsafe { buffer.assume_init() }; - dest.copy_from_slice(&*buffer); + MaybeUninit::write_slice(dest, &*buffer); } } @@ -356,6 +387,13 @@ impl<'a> Controller<'a> { admin.submit_command(io_sq_cmd); + let shift = 12 + registers.capability.mpsmin() as usize; + let max_transfer_shift = if identity.mdts != 0 { + shift + identity.mdts as usize + } else { + 20 + }; + let this = Arc::new(Self { identity, namespaces: Mutex::new(alloc::vec![]), @@ -396,12 +434,19 @@ impl<'a> Controller<'a> { let blocks = identity.nsze as usize; let block_size = 1 << identity.lbaf[(identity.flbas & 0b11111) as usize].ds; + // The maximum transfer size is in units of 2^(min page size) + let lba_shift = identity.lbaf[(identity.flbas & 0xf) as usize].ds; + let max_lbas = 1 << (max_transfer_shift - lba_shift as usize); + let max_prps = (max_lbas * (1 << lba_shift)) / Size4KiB::SIZE as usize; + Namespace { controller: this.clone(), nsid: *nsid, blocks, block_size, size: blocks * block_size, + max_prps, + prps: Mutex::new(Dma::new_uninit_slice(max_prps)), } }) .collect::>(); @@ -423,7 +468,7 @@ impl<'a> Controller<'a> { } impl<'a> BlockDeviceInterface for Controller<'a> { - fn read(&self, sector: usize, dest: &mut [u8]) -> Option { + fn read(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { self.namespaces.lock()[0].read(sector, dest); Some(dest.len()) } diff --git a/src/aero_kernel/src/drivers/block/nvme/queue.rs b/src/aero_kernel/src/drivers/block/nvme/queue.rs index 67b2baeda70..d19a232d38d 100644 --- a/src/aero_kernel/src/drivers/block/nvme/queue.rs +++ b/src/aero_kernel/src/drivers/block/nvme/queue.rs @@ -1,4 +1,4 @@ -use core::mem::MaybeUninit; +use core::cell::UnsafeCell; use core::sync::atomic::{AtomicU16, Ordering}; use crate::mem::paging::PhysAddr; @@ -38,7 +38,7 @@ unsafe impl Sync for DoorBell {} pub(super) struct Queue<'bell, T: QueueType> { doorbell: &'bell DoorBell, index: usize, - queue: Dma<[MaybeUninit]>, + queue: Dma<[UnsafeCell]>, phase: bool, } @@ -53,7 +53,7 @@ impl<'bell, T: QueueType> Queue<'bell, T> { Ok(Self { doorbell, - queue: Dma::new_uninit_slice(size), + queue: unsafe { Dma::new_uninit_slice(size).assume_init() }, index: 0, phase: true, }) @@ -66,20 +66,30 @@ impl<'bell, T: QueueType> Queue<'bell, T> { impl Queue<'_, Completion> { pub fn next_cmd_result(&mut self) -> Option { - let cur_completion = unsafe { self.queue[self.index].assume_init() }; - if cur_completion.get_phase_tag() != self.phase { - self.index += 1; - self.doorbell.0.set(self.index as u32); - Some(cur_completion.clone()) - } else { - None + let cmd = &mut self.queue[self.index]; + + while (cmd.get_mut().status & 0x1) != self.phase as u16 { + core::hint::spin_loop(); + } + + let cmd = cmd.get_mut(); + let status = cmd.status >> 1; + + if status != 0 { + log::error!("nvme: command error {status:#x}"); + return None; } + + self.index += 1; + self.doorbell.0.set(self.index as u32); + + Some(cmd.clone()) } } impl Queue<'_, Submisson> { pub fn submit_command(&mut self, command: Command) { - self.queue[self.index] = MaybeUninit::new(command); + self.queue[self.index] = UnsafeCell::new(command); self.index += 1; self.doorbell.0.set(self.index as u32); // ring ring! diff --git a/src/aero_kernel/src/fs/block.rs b/src/aero_kernel/src/fs/block.rs deleted file mode 100644 index 726d6bd8337..00000000000 --- a/src/aero_kernel/src/fs/block.rs +++ /dev/null @@ -1,181 +0,0 @@ -use core::alloc::Layout; - -use alloc::alloc::alloc_zeroed; -use alloc::collections::BTreeMap; -use alloc::sync::{Arc, Weak}; -use alloc::vec::Vec; - -use crate::fs::devfs::install_device; -use crate::fs::Result; - -use crate::mem::paging::VirtAddr; -use crate::utils::sync::Mutex; - -use super::devfs::{alloc_device_marker, Device}; -use super::inode::INodeInterface; - -pub trait BlockDeviceInterface: Send + Sync { - fn read(&self, sector: usize, dest: &mut [u8]) -> Option; - fn write(&self, sector: usize, buf: &[u8]) -> Option; -} - -static BLOCK_DEVS: Mutex>> = Mutex::new(BTreeMap::new()); - -/// Installs the provided block `device` into the filesyetm. -pub fn install_block_device(dev: Arc) -> Result<()> { - let mut devs = BLOCK_DEVS.lock(); - install_device(dev.clone())?; - - log::debug!("block: installed block device {}", dev.name()); - devs.insert(dev.id, dev); - - Ok(()) -} - -pub struct BlockDevice { - id: usize, - name: String, - dev: Arc, - self_ref: Weak, -} - -impl BlockDevice { - pub fn new(name: String, imp: Arc) -> Arc { - Arc::new_cyclic(|me| BlockDevice { - id: alloc_device_marker(), - name, - dev: imp, - self_ref: me.clone(), - }) - } - - pub fn name(&self) -> String { - self.name.clone() - } -} - -impl INodeInterface for BlockDevice {} - -impl Device for BlockDevice { - fn device_marker(&self) -> usize { - self.id - } - - fn device_name(&self) -> String { - self.name() - } - - fn inode(&self) -> Arc { - self.self_ref.upgrade().unwrap().clone() - } -} - -pub trait RawAccess: Send + Sync { - fn read_direct(&self, addr: usize, dest: &mut [u8]) -> Option; - fn write_direct(&self, addr: usize, buf: &[u8]) -> Option; -} - -impl BlockDeviceInterface for T { - fn read(&self, sector: usize, dest: &mut [u8]) -> Option { - self.read_direct(sector * 512, dest) - } - - fn write(&self, sector: usize, buf: &[u8]) -> Option { - self.write_direct(sector * 512, buf) - } -} - -impl RawAccess for BlockDevice { - fn read_direct(&self, offset: usize, dest: &mut [u8]) -> Option { - assert_eq!(offset % 512, 0); - self.dev.read(offset / 512, dest) - } - - fn write_direct(&self, offset: usize, buf: &[u8]) -> Option { - assert_eq!(offset % 512, 0); - self.dev.write(offset / 512, buf) - } -} - -pub struct Mbr { - data: VirtAddr, -} - -impl Mbr { - pub fn new() -> Self { - let layout = unsafe { Layout::from_size_align_unchecked(512, 0x1000) }; - let memory = unsafe { alloc_zeroed(layout) }; - - Self { - data: VirtAddr::new(memory as u64), - } - } - - pub fn bytes(&self) -> &[u8] { - self.bytes_mut() - } - - pub fn bytes_mut(&self) -> &mut [u8] { - unsafe { core::slice::from_raw_parts_mut(self.data.as_mut_ptr(), 512) } - } - - pub fn is_valid(&self) -> bool { - self.bytes()[510..] == [0x55, 0xAA] - } - - pub fn partition(&self, idx: usize) -> Option { - if idx >= 4 { - return None; - } - let off = 0x01BEusize + 0x10 * idx; - - Some(Partition { - data: &self.bytes()[off..off + 16], - }) - } -} - -pub struct Partition<'a> { - data: &'a [u8], -} - -impl Partition<'_> { - pub fn total_sectors(&self) -> u32 { - unsafe { *(self.data.as_ptr().offset(12) as *const u32) } - } -} - -pub fn launch() -> Result<()> { - // NOTE: Copy all of the block devices into a vector since we will - // need to lock the BLOCK_DEVS static when iterating which will - // cause a deadlock. - let mut blocks_copy = Vec::>::new(); - - for (_, device) in BLOCK_DEVS.lock().iter() { - blocks_copy.push(device.clone()); - } - - for block in blocks_copy { - let mbr = Mbr::new(); - - block.read(0, mbr.bytes_mut()); - log::debug!("{:?}", mbr.bytes_mut()); - - if mbr.is_valid() { - log::info!("{}: found MBR partition", block.name()); - - for p in 0..4 { - if let Some(part) = mbr.partition(p) { - if part.total_sectors() > 0 { - let name = alloc::format!("{}p{}", block.name(), p); - let block_device = BlockDevice::new(name, block.clone()); - - install_block_device(block_device)?; - } - } - } - } - } - - Ok(()) -} diff --git a/src/aero_kernel/src/fs/block/gpt.rs b/src/aero_kernel/src/fs/block/gpt.rs new file mode 100644 index 00000000000..8430bc1da28 --- /dev/null +++ b/src/aero_kernel/src/fs/block/gpt.rs @@ -0,0 +1,143 @@ +use super::BlockDevice; +use core::mem::MaybeUninit; + +use alloc::boxed::Box; +use alloc::sync::Arc; + +const GPT_TABLE_SIGNATURE: u64 = 0x5452415020494645; + +#[repr(C)] +pub struct GptTableHeader { + pub signature: u64, + pub revision: u32, + pub header_size: u32, + pub header_checksum: u32, + pub reserved_zero: u32, + pub current_lba: u64, + pub backup_lba: u64, + pub first_lba: u64, + pub last_lba: u64, + pub disk_guid: [u8; 16], + /// Starting LBA of array of partition entries (usually `2` for compatibility). + pub starting_lba: u64, + pub num_entries: u32, + pub entry_size: u32, + pub table_checksum: u32, + pub padding: [u8; 420], +} + +const_assert_eq!(core::mem::size_of::(), 512); + +#[derive(Debug, Copy, Clone, PartialEq)] +#[repr(C)] +pub struct GptGuid { + a: u32, + b: u16, + c: u16, + d: [u8; 2], + e: [u8; 6], +} + +impl GptGuid { + pub const NULL: GptGuid = GptGuid { + a: 0, + b: 0, + c: 0, + d: [0; 2], + e: [0; 6], + }; +} + +const_assert_eq!(core::mem::size_of::(), 16); + +#[derive(Debug)] +#[repr(C)] +pub struct GptEntry { + type_guid: GptGuid, + unique_guid: GptGuid, + first_lba: u64, + last_lba: u64, + attr_flags: u64, + partition_name: [u8; 72], +} + +impl GptEntry { + pub fn start_lba(&self) -> u64 { + self.first_lba + } + + pub fn size(&self) -> u64 { + self.last_lba - self.first_lba + } + + pub fn partition_name(&self) -> String { + let mut result = String::new(); + + // UEFI strings are UCS-2, not UTF-16. That means that each + // source character is exactly two bytes long. + for i in (0..self.partition_name.len()).step_by(2) { + let upper = u16::from(self.partition_name[i + 1]) << 8; + let c = upper | u16::from(self.partition_name[i]); + + // Encountered a null character, so we're done. + if c == 0 { + break; + } + + result.push(char::try_from(u32::from(c)).unwrap_or('�')); + } + + result + } + + pub fn is_used(&self) -> bool { + self.type_guid != GptGuid::NULL + } +} + +const_assert_eq!(core::mem::size_of::(), 128); + +pub struct Gpt { + entries: Box<[GptEntry]>, +} + +impl Gpt { + pub fn new(controller: Arc) -> Option { + // Get the GPT header. + let mut header = Box::::new_uninit(); + + controller + .device() + .read(1, header.as_bytes_mut()) + .expect("gpt: failed to read first sector"); + + // SAFETY: The buffer is initialized above. + let header = unsafe { header.assume_init() }; + + if header.signature != GPT_TABLE_SIGNATURE { + return None; + } + + let entry_size = header.entry_size as usize; + assert_eq!(entry_size, core::mem::size_of::()); + + let mut entry_list = Box::<[GptEntry]>::new_uninit_slice(header.num_entries as usize); + + controller + .device() + .read( + header.starting_lba as _, + MaybeUninit::slice_as_bytes_mut(&mut entry_list), + ) + .expect("gpt: failed to read entry list"); + + // SAFETY: The entries list is initialized above. + let entries = unsafe { entry_list.assume_init() }; + + return Some(Self { entries }); + } + + pub fn entries(&self) -> &[GptEntry] { + &self.entries + } +} diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs new file mode 100644 index 00000000000..4b888836d6c --- /dev/null +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -0,0 +1,157 @@ +mod gpt; + +use gpt::Gpt; + +use core::mem::MaybeUninit; + +use alloc::collections::BTreeMap; +use alloc::sync::{Arc, Weak}; +use alloc::vec::Vec; + +use crate::fs::devfs::install_device; +use crate::fs::{Path, Result, MOUNT_MANAGER}; + +use crate::fs::ext2::Ext2; +use crate::utils::sync::Mutex; + +use super::devfs::{alloc_device_marker, Device}; +use super::inode::INodeInterface; + +pub trait BlockDeviceInterface: Send + Sync { + fn read(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option; + fn write(&self, sector: usize, buf: &[u8]) -> Option; +} + +static BLOCK_DEVS: Mutex>> = Mutex::new(BTreeMap::new()); + +/// Installs the provided block `device` into the filesyetm. +pub fn install_block_device(dev: Arc) -> Result<()> { + let mut devs = BLOCK_DEVS.lock(); + install_device(dev.clone())?; + + log::debug!("block: installed block device {}", dev.name()); + devs.insert(dev.id, dev); + + Ok(()) +} + +pub struct BlockDevice { + id: usize, + name: String, + dev: Arc, + self_ref: Weak, +} + +impl BlockDevice { + pub fn new(name: String, imp: Arc) -> Arc { + Arc::new_cyclic(|me| BlockDevice { + id: alloc_device_marker(), + name, + dev: imp, + self_ref: me.clone(), + }) + } + + pub fn name(&self) -> String { + self.name.clone() + } + + pub fn device(&self) -> Arc { + self.dev.clone() + } +} + +impl INodeInterface for BlockDevice {} + +impl Device for BlockDevice { + fn device_marker(&self) -> usize { + self.id + } + + fn device_name(&self) -> String { + self.name() + } + + fn inode(&self) -> Arc { + self.self_ref.upgrade().unwrap().clone() + } +} + +struct PartitionBlockDevice { + offset: usize, // offset in sectors + size: usize, // capacity in sectors + device: Arc, +} + +impl PartitionBlockDevice { + fn new(offset: usize, size: usize, device: Arc) -> Self { + Self { + offset, + size, + device, + } + } +} + +impl BlockDeviceInterface for PartitionBlockDevice { + fn read(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { + if sector >= self.size { + return None; + } + + self.device.read(self.offset + sector, dest) + } + + fn write(&self, sector: usize, buf: &[u8]) -> Option { + if sector >= self.size { + return None; + } + + self.device.write(self.offset + sector, buf) + } +} + +pub fn launch() -> Result<()> { + let mut blocks_copy = Vec::>::new(); + + for (_, device) in BLOCK_DEVS.lock().iter() { + blocks_copy.push(device.clone()); + } + + for block in blocks_copy { + if let Some(gpt) = Gpt::new(block.clone()) { + log::info!("block: found GPT on {}!", block.name()); + + for (i, entry) in gpt + .entries() + .iter() + .enumerate() + .filter(|(_, e)| e.is_used()) + { + let start = entry.start_lba() as usize; + let size = entry.size() as usize; + + log::info!( + "gpt: found partition (name=`{}`, start={:#x}, size{:#x})!", + entry.partition_name(), + start, + size + ); + + let name = alloc::format!("{}p{}", block.name(), i); + let partition_device = PartitionBlockDevice::new(start, size, block.device()); + let device = BlockDevice::new(name, Arc::new(partition_device)); + + install_block_device(device.clone())?; + + // Check what filesystem is on this partition and mount it. + if let Some(ext2) = Ext2::new(device.clone()) { + log::info!("gpt: found ext2 filesystem on {}!", device.name()); + MOUNT_MANAGER.mount(super::lookup_path(Path::new("/mnt"))?, ext2)?; + } + } + } + } + + Ok(()) +} diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs new file mode 100644 index 00000000000..c3445741d68 --- /dev/null +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -0,0 +1,86 @@ +use alloc::{boxed::Box, sync::Arc}; + +use super::{block::BlockDevice, FileSystem}; + +#[derive(Debug, Copy, Clone)] +#[repr(C, packed)] +pub struct SuperBlock { + pub inodes_count: u32, + pub blocks_count: u32, + pub r_blocks_count: u32, + pub free_blocks_count: u32, + pub free_inodes_count: u32, + pub first_data_block: u32, + pub log_block_size: u32, + pub log_frag_size: u32, + pub blocks_per_group: u32, + pub frags_per_group: u32, + pub inodes_per_group: u32, + pub mtime: u32, + pub wtime: u32, + pub mnt_count: u16, + pub max_mnt_count: u16, + pub magic: u16, + pub state: u16, + pub errors: u16, + pub minor_rev_level: u16, + pub lastcheck: u32, + pub checkinterval: u32, + pub creator_os: u32, + pub rev_level: u32, + pub def_resuid: u16, + pub def_gid: u16, + + // Extended Superblock fields + // + // XXX: If version number >= 1, we have to use the ext2 extended superblock as well :) + pub first_ino: u32, + pub inode_size: u16, + pub block_group_nr: u16, + pub feature_compat: u32, + pub feature_incompat: u32, + pub feature_ro_compat: u32, + pub uuid: [u64; 2usize], + pub volume_name: [u8; 16usize], + pub last_mounted: [u64; 8usize], + pub compression_info: u32, + pub prealloc_blocks: u8, + pub prealloc_dir_blocks: u8, + pub reserved_gdt_blocks: u16, + pub journal_uuid: [u8; 16usize], + pub journal_inum: u32, + pub journal_dev: u32, + pub last_orphan: u32, + pub hash_seed: [u32; 4usize], + pub def_hash_version: u8, + pub jnl_backup_type: u8, + pub group_desc_size: u16, + pub default_mount_opts: u32, + pub first_meta_bg: u32, + pub mkfs_time: u32, + pub jnl_blocks: [u32; 17usize], +} + +pub struct Ext2 {} + +impl Ext2 { + pub fn new(device: Arc) -> Option> { + let mut superblock = Box::::new_uninit(); + device.device().read(2, superblock.as_bytes_mut())?; + + // SAFETY: We have initialized the superblock above. + let superblock = unsafe { superblock.assume_init() }; + + if superblock.magic != 0xef53 { + return None; + } + + Some(Arc::new(Self {})) + } +} + +impl FileSystem for Ext2 { + fn root_dir(&self) -> super::cache::DirCacheItem { + todo!() + } +} diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index 8f7905b47d6..517e11b127b 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -37,6 +37,7 @@ pub mod cache; pub mod devfs; pub mod epoll; pub mod eventfd; +pub mod ext2; pub mod file_table; pub mod initramfs; pub mod inode; @@ -318,6 +319,7 @@ pub fn init() -> Result<()> { root_dir().inode().mkdir("tmp")?; root_dir().inode().mkdir("proc")?; root_dir().inode().mkdir("var")?; + root_dir().inode().mkdir("mnt")?; initramfs::init()?; log::info!("installed initramfs"); diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index f43d524c6e5..7166cffce65 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -41,7 +41,9 @@ const_btree_new, prelude_import, allocator_api, - nonnull_slice_from_raw_parts + nonnull_slice_from_raw_parts, + maybe_uninit_write_slice, + maybe_uninit_as_bytes )] #![deny(trivial_numeric_casts, unused_allocation)] #![test_runner(crate::tests::test_runner)] From 21c13c012edcd6cd698231f7f464703e7ac55a7b Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 18 Sep 2022 16:32:27 +1000 Subject: [PATCH 006/368] ext2: read the BGDT and get the root inode * read the BGDT (Block Group Descriptor Table) * get the root inode * read the inode table for ^^^ Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/block/gpt.rs | 19 +++ src/aero_kernel/src/fs/block/mod.rs | 19 +++ src/aero_kernel/src/fs/cache.rs | 13 +- src/aero_kernel/src/fs/ext2/mod.rs | 245 +++++++++++++++++++++++++++- src/aero_kernel/src/fs/inode.rs | 10 +- src/aero_syscall/src/lib.rs | 12 +- 6 files changed, 294 insertions(+), 24 deletions(-) diff --git a/src/aero_kernel/src/fs/block/gpt.rs b/src/aero_kernel/src/fs/block/gpt.rs index 8430bc1da28..de8102a93fc 100644 --- a/src/aero_kernel/src/fs/block/gpt.rs +++ b/src/aero_kernel/src/fs/block/gpt.rs @@ -1,3 +1,22 @@ +/* + * Copyright (C) 2021-2022 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + use super::BlockDevice; use core::mem::MaybeUninit; diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 4b888836d6c..ac468cf440f 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -1,3 +1,22 @@ +/* + * Copyright (C) 2021-2022 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + mod gpt; use gpt::Gpt; diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index 46512ec006e..7e0345530d3 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -39,6 +39,8 @@ use spin::Once; use crate::fs::inode::{DirEntry, INodeInterface}; use crate::utils::sync::Mutex; +use super::FileSystem; + pub(super) static INODE_CACHE: Once> = Once::new(); pub(super) static DIR_CACHE: Once> = Once::new(); @@ -291,10 +293,13 @@ impl ops::Deref for CachedINode { impl Cacheable for CachedINode { fn cache_key(&self) -> INodeCacheKey { - ( - Weak::as_ptr(&self.weak_filesystem().unwrap()) as *const () as usize, - self.metadata().unwrap().id, - ) + INodeCacheItem::make_key(self.weak_filesystem().unwrap(), self.metadata().unwrap().id) + } +} + +impl INodeCacheItem { + pub fn make_key(fs: Weak, id: usize) -> INodeCacheKey { + (Weak::as_ptr(&fs) as *const () as usize, id) } } diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index c3445741d68..182048c6b7d 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -1,6 +1,36 @@ -use alloc::{boxed::Box, sync::Arc}; +/* + * Copyright (C) 2021-2022 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ -use super::{block::BlockDevice, FileSystem}; +use core::mem::MaybeUninit; + +use alloc::boxed::Box; +use alloc::sync::{Arc, Weak}; + +use crate::utils::CeilDiv; + +use super::block::BlockDevice; + +use super::cache; +use super::cache::{CachedINode, DirCacheItem, INodeCacheItem}; + +use super::inode::{DirEntry, INodeInterface, Metadata}; +use super::FileSystem; #[derive(Debug, Copy, Clone)] #[repr(C, packed)] @@ -61,26 +91,223 @@ pub struct SuperBlock { pub jnl_blocks: [u32; 17usize], } -pub struct Ext2 {} +impl SuperBlock { + const MAGIC: u16 = 0xef53; + + /// Returns the size of a block in bytes. + pub fn block_size(&self) -> usize { + 1024usize << self.log_block_size + } + + /// Returns the length of the BGDT. + pub fn bgdt_len(&self) -> usize { + self.blocks_count.ceil_div(self.blocks_per_group) as usize + } + + /// Returns the sector where the BGDT starts. + pub fn bgdt_sector(&self) -> usize { + // XXX: The block group descriptors are always located in the block immediately + // following the superblock. + match self.block_size() { + 1024 => 4, + x if x > 1024 => x / 512, + _ => unreachable!(), + } + } +} + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct GroupDescriptor { + pub block_bitmap: u32, + pub inode_bitmap: u32, + pub inode_table: u32, + pub free_blocks_count: u16, + pub free_inodes_count: u16, + pub used_dirs_count: u16, + pub pad: u16, + pub reserved: [u8; 12usize], +} + +const_assert_eq!(core::mem::size_of::(), 32); + +pub enum FileType { + Fifo, + CharDev, + Directory, + BlockDev, + File, + Symlink, + Socket, + Unknown, +} + +impl From for super::inode::FileType { + fn from(ty: FileType) -> Self { + match ty { + FileType::Symlink => Self::Symlink, + FileType::Directory => Self::Directory, + FileType::BlockDev | FileType::CharDev => Self::Device, + + _ => Self::File, + } + } +} + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct DiskINode { + type_and_perm: u16, + pub user_id: u16, + pub size_lower: u32, + pub last_access: u32, + pub creation_time: u32, + pub last_modification: u32, + pub deletion_time: u32, + pub group_id: u16, + pub hl_count: u16, + pub sector_count: u32, + pub flags: u32, + pub os_specific: u32, + pub data_ptr: [u32; 15], + pub gen_number: u32, + pub ext_attr_block: u32, + pub size_or_acl: u32, + pub fragment_address: u32, + pub os_specific2: [u8; 12], +} + +impl DiskINode { + pub fn file_type(&self) -> FileType { + let ty = self.type_and_perm >> 12; + + match ty { + 0x1 => FileType::Fifo, + 0x2 => FileType::CharDev, + 0x4 => FileType::Directory, + 0x6 => FileType::BlockDev, + 0x8 => FileType::File, + 0xa => FileType::Symlink, + 0xc => FileType::Socket, + _ => FileType::Unknown, + } + } +} + +const_assert_eq!(core::mem::size_of::(), 128); + +struct INode { + id: usize, + fs: Weak, + inode: Box, +} + +impl INode { + pub fn new(ext2: Weak, id: usize) -> Option { + debug_assert!(id != 0); + + let icache = cache::icache(); + + // Check if the inode is in the cache. + if let Some(inode) = icache.get(INodeCacheItem::make_key(ext2.clone(), id)) { + Some(inode) + } else { + let fs = ext2.upgrade()?; + + let inode_block_group = (id - 1) / fs.superblock.inodes_per_group as usize; + let inode_table_idx = (id - 1) % fs.superblock.inodes_per_group as usize; + + let group_descriptor = &fs.bgdt[inode_block_group]; + let inode_size = core::mem::size_of::(); // TODO: the inode size can be different + + let table_offset = group_descriptor.inode_table as usize * fs.superblock.block_size(); + let inode_offset = table_offset + (inode_size * inode_table_idx); + + let mut inode = Box::::new_uninit(); + fs.block + .device() + .read(inode_offset / 512, inode.as_bytes_mut()); + + // SAFETY: We have initialized the inode above. + let inode = unsafe { inode.assume_init() }; + + Some(icache.make_item_cached(CachedINode::new(Arc::new(Self { + inode, + id, + fs: ext2, + })))) + } + } +} + +impl INodeInterface for INode { + fn weak_filesystem(&self) -> Option> { + Some(self.fs.clone()) + } + + fn metadata(&self) -> super::Result { + Ok(Metadata { + id: self.id, + file_type: self.inode.file_type().into(), + size: self.inode.size_lower as _, + children_len: 0, + }) + } +} + +pub struct Ext2 { + superblock: Box, + bgdt: Box<[GroupDescriptor]>, + block: Arc, + + sref: Weak, +} impl Ext2 { - pub fn new(device: Arc) -> Option> { + const ROOT_INODE_ID: usize = 2; + + pub fn new(block: Arc) -> Option> { let mut superblock = Box::::new_uninit(); - device.device().read(2, superblock.as_bytes_mut())?; + block.device().read(2, superblock.as_bytes_mut())?; // SAFETY: We have initialized the superblock above. let superblock = unsafe { superblock.assume_init() }; - if superblock.magic != 0xef53 { + if superblock.magic != SuperBlock::MAGIC { return None; } - Some(Arc::new(Self {})) + let bgdt_len = superblock.bgdt_len(); + let mut bgdt = Box::<[GroupDescriptor]>::new_uninit_slice(bgdt_len); + + block.device().read( + superblock.bgdt_sector(), + MaybeUninit::slice_as_bytes_mut(&mut bgdt), + )?; + + // SAFETY: We have initialized the BGD (Block Group Descriptor Table) above. + let bgdt = unsafe { bgdt.assume_init() }; + + Some(Arc::new_cyclic(|sref| Self { + bgdt, + superblock, + block, + + sref: sref.clone(), + })) + } + + pub fn find_inode(&self, id: usize) -> Option { + INode::new(self.sref.clone(), id) } } impl FileSystem for Ext2 { - fn root_dir(&self) -> super::cache::DirCacheItem { - todo!() + fn root_dir(&self) -> DirCacheItem { + let inode = self + .find_inode(Ext2::ROOT_INODE_ID) + .expect("ext2: invalid filesystem (root inode not found)"); + + DirEntry::new_root(inode, String::from("/")) } } diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index da4af7a19db..290ca8ca095 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -256,13 +256,7 @@ pub trait INodeInterface: Send + Sync { pub struct Metadata { pub id: usize, pub file_type: FileType, - - /// The total size of the content that the inode holds. Set to `0x00` if - /// the inode file type is *not* a file. pub size: usize, - - /// The length of the children's map of the inode. Set to `0x00` if the inode - /// has no children and if the file type of the inode is *not* a directory. pub children_len: usize, } @@ -330,6 +324,7 @@ pub enum FileType { Directory, Device, Socket, + Symlink, } impl From for aero_syscall::SysFileType { @@ -337,8 +332,9 @@ impl From for aero_syscall::SysFileType { match file { FileType::File => aero_syscall::SysFileType::File, FileType::Directory => aero_syscall::SysFileType::Directory, - FileType::Device => aero_syscall::SysFileType::Device, + FileType::Device => aero_syscall::SysFileType::CharDevice, // FIXME: determine if it is a character or block device. FileType::Socket => aero_syscall::SysFileType::Socket, + FileType::Symlink => aero_syscall::SysFileType::Symlink, } } } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 48048b024a4..4386a781437 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -241,10 +241,14 @@ pub fn syscall_as_str(syscall: usize) -> &'static str { #[derive(Debug)] #[repr(usize)] pub enum SysFileType { - File, - Directory, - Device, - Socket, + Unknown = 0, + Fifo = 1, + CharDevice = 2, + Directory = 4, + BlockDevice = 6, + File = 8, + Symlink = 10, + Socket = 12, } #[repr(C, packed)] From 3cf547b1be27ff454ac4457572b0c2afa30fcbfa Mon Sep 17 00:00:00 2001 From: Joshua P Date: Fri, 16 Sep 2022 12:24:54 +0000 Subject: [PATCH 007/368] env: allocate more memory to QEMU --- .gitpod.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitpod.yml b/.gitpod.yml index 872746fe075..edb8e3da12d 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -11,4 +11,4 @@ ports: tasks: - init: ./aero.py --no-run - command: ./aero.py --only-run + command: ./aero.py --only-run --memory 32G From 35446a35097c05d89e979a60dff0a6c8c30b18df Mon Sep 17 00:00:00 2001 From: Joshua P Date: Fri, 16 Sep 2022 12:25:18 +0000 Subject: [PATCH 008/368] fix(kernel): DRM overflow --- src/aero_kernel/src/drivers/drm/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aero_kernel/src/drivers/drm/mod.rs b/src/aero_kernel/src/drivers/drm/mod.rs index 36e4f23aa99..512b672c63e 100644 --- a/src/aero_kernel/src/drivers/drm/mod.rs +++ b/src/aero_kernel/src/drivers/drm/mod.rs @@ -1093,8 +1093,8 @@ fn make_dmt_modes(max_width: u16, max_height: u16) -> Vec { // Sort the modes by display size: result.sort_by(|e, f| { - (e.hdisplay * e.vdisplay) - .partial_cmp(&(f.hdisplay * f.vdisplay)) + ((e.hdisplay as usize) * (e.vdisplay as usize)) + .partial_cmp(&((f.hdisplay as usize) * (f.vdisplay as usize))) .unwrap() // unreachable }); From dc3c4d83e7112af1fd5f23d0c4c34ab6df9c0033 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 19 Sep 2022 18:02:12 +1000 Subject: [PATCH 009/368] ext2: fix inode table offset calculation Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/block/ide/mod.rs | 8 +++- src/aero_kernel/src/drivers/block/nvme/mod.rs | 8 +++- src/aero_kernel/src/fs/block/gpt.rs | 4 +- src/aero_kernel/src/fs/block/mod.rs | 37 ++++++++++++++--- src/aero_kernel/src/fs/ext2/mod.rs | 40 +++++++++++++------ 5 files changed, 72 insertions(+), 25 deletions(-) diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index 0da0ecdef37..81e534b55bd 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -52,7 +52,7 @@ impl IdeDrive { } impl BlockDeviceInterface for IdeDrive { - fn read(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { + fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { let count = dest.len().ceil_div(512); let request = Arc::new(DmaRequest::new(sector, count)); @@ -66,7 +66,11 @@ impl BlockDeviceInterface for IdeDrive { res } - fn write(&self, _sector: usize, _buf: &[u8]) -> Option { + fn block_size(&self) -> usize { + todo!() + } + + fn write_block(&self, _sector: usize, _buf: &[u8]) -> Option { unimplemented!() } } diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 1988b906130..cc68a6e9944 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -468,12 +468,16 @@ impl<'a> Controller<'a> { } impl<'a> BlockDeviceInterface for Controller<'a> { - fn read(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { + fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { self.namespaces.lock()[0].read(sector, dest); Some(dest.len()) } - fn write(&self, _sector: usize, _buf: &[u8]) -> Option { + fn block_size(&self) -> usize { + self.namespaces.lock()[0].block_size + } + + fn write_block(&self, _sector: usize, _buf: &[u8]) -> Option { unimplemented!() } } diff --git a/src/aero_kernel/src/fs/block/gpt.rs b/src/aero_kernel/src/fs/block/gpt.rs index de8102a93fc..7685bcf094f 100644 --- a/src/aero_kernel/src/fs/block/gpt.rs +++ b/src/aero_kernel/src/fs/block/gpt.rs @@ -127,7 +127,7 @@ impl Gpt { controller .device() - .read(1, header.as_bytes_mut()) + .read_block(1, header.as_bytes_mut()) .expect("gpt: failed to read first sector"); // SAFETY: The buffer is initialized above. @@ -144,7 +144,7 @@ impl Gpt { controller .device() - .read( + .read_block( header.starting_lba as _, MaybeUninit::slice_as_bytes_mut(&mut entry_list), ) diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index ac468cf440f..2902d6d30c1 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -19,6 +19,7 @@ mod gpt; +use alloc::boxed::Box; use gpt::Gpt; use core::mem::MaybeUninit; @@ -31,14 +32,34 @@ use crate::fs::devfs::install_device; use crate::fs::{Path, Result, MOUNT_MANAGER}; use crate::fs::ext2::Ext2; +use crate::mem::paging::{align_down, align_up}; use crate::utils::sync::Mutex; use super::devfs::{alloc_device_marker, Device}; use super::inode::INodeInterface; pub trait BlockDeviceInterface: Send + Sync { - fn read(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option; - fn write(&self, sector: usize, buf: &[u8]) -> Option; + fn block_size(&self) -> usize; + + fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option; + fn write_block(&self, sector: usize, buf: &[u8]) -> Option; + + fn read(&self, offset: usize, dest: &mut [MaybeUninit]) -> Option { + let aligned_offset = align_down(offset as u64, self.block_size() as u64) as usize; + let sector = aligned_offset / self.block_size(); + + let aligned_size = align_up(dest.len() as u64, self.block_size() as u64) as usize; + let mut buffer = Box::<[u8]>::new_uninit_slice(aligned_size); + + self.read_block(sector, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; + // SAFETY: We have initialized the buffer above. + let buffer = unsafe { buffer.assume_init() }; + + let offset = offset - aligned_offset; + MaybeUninit::write_slice(dest, &buffer[offset..(offset + dest.len())]); + + Some(dest.len()) + } } static BLOCK_DEVS: Mutex>> = Mutex::new(BTreeMap::new()); @@ -113,20 +134,24 @@ impl PartitionBlockDevice { } impl BlockDeviceInterface for PartitionBlockDevice { - fn read(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { + fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { if sector >= self.size { return None; } - self.device.read(self.offset + sector, dest) + self.device.read_block(self.offset + sector, dest) + } + + fn block_size(&self) -> usize { + self.device.block_size() } - fn write(&self, sector: usize, buf: &[u8]) -> Option { + fn write_block(&self, sector: usize, buf: &[u8]) -> Option { if sector >= self.size { return None; } - self.device.write(self.offset + sector, buf) + self.device.write_block(self.offset + sector, buf) } } diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 182048c6b7d..5d2a0dcefab 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -22,12 +22,13 @@ use core::mem::MaybeUninit; use alloc::boxed::Box; use alloc::sync::{Arc, Weak}; +use crate::fs::cache::CachedINode; use crate::utils::CeilDiv; use super::block::BlockDevice; use super::cache; -use super::cache::{CachedINode, DirCacheItem, INodeCacheItem}; +use super::cache::{DirCacheItem, INodeCacheItem}; use super::inode::{DirEntry, INodeInterface, Metadata}; use super::FileSystem; @@ -154,7 +155,7 @@ impl From for super::inode::FileType { } } -#[repr(C)] +#[repr(C, packed)] #[derive(Debug, Default, Copy, Clone)] pub struct DiskINode { type_and_perm: u16, @@ -213,24 +214,32 @@ impl INode { Some(inode) } else { let fs = ext2.upgrade()?; + let superblock = &fs.superblock; + + // There is one inode table per block group and can be located by + // the `inode_table` offset in the group descriptor. Also there are + // `inodes_per_group` inodes per table. + let ino_per_group = superblock.inodes_per_group as usize; - let inode_block_group = (id - 1) / fs.superblock.inodes_per_group as usize; - let inode_table_idx = (id - 1) % fs.superblock.inodes_per_group as usize; + let ino_block_group = (id - 1) / ino_per_group; + let ino_table_index = (id - 1) % ino_per_group; - let group_descriptor = &fs.bgdt[inode_block_group]; - let inode_size = core::mem::size_of::(); // TODO: the inode size can be different + let group_descriptor = &fs.bgdt[ino_block_group]; - let table_offset = group_descriptor.inode_table as usize * fs.superblock.block_size(); - let inode_offset = table_offset + (inode_size * inode_table_idx); + let table_offset = group_descriptor.inode_table as usize * superblock.block_size(); let mut inode = Box::::new_uninit(); - fs.block - .device() - .read(inode_offset / 512, inode.as_bytes_mut()); + + fs.block.device().read( + table_offset + (ino_table_index * core::mem::size_of::()), + inode.as_bytes_mut(), + )?; // SAFETY: We have initialized the inode above. let inode = unsafe { inode.assume_init() }; + log::debug!("ino_table_index={ino_table_index:?} inode={inode:?}"); + Some(icache.make_item_cached(CachedINode::new(Arc::new(Self { inode, id, @@ -268,7 +277,7 @@ impl Ext2 { pub fn new(block: Arc) -> Option> { let mut superblock = Box::::new_uninit(); - block.device().read(2, superblock.as_bytes_mut())?; + block.device().read_block(2, superblock.as_bytes_mut())?; // SAFETY: We have initialized the superblock above. let superblock = unsafe { superblock.assume_init() }; @@ -277,10 +286,15 @@ impl Ext2 { return None; } + assert_eq!( + superblock.inode_size as usize, + core::mem::size_of::() + ); + let bgdt_len = superblock.bgdt_len(); let mut bgdt = Box::<[GroupDescriptor]>::new_uninit_slice(bgdt_len); - block.device().read( + block.device().read_block( superblock.bgdt_sector(), MaybeUninit::slice_as_bytes_mut(&mut bgdt), )?; From 1b8c5f97bd4f39caf15364868178c2b45087a4a8 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 19 Sep 2022 19:25:37 +1000 Subject: [PATCH 010/368] ext2: directory entry iterator implementation Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/mod.rs | 99 +++++++++++++++++++++++++++--- tools/mkimage.sh | 20 ++++++ 2 files changed, 112 insertions(+), 7 deletions(-) create mode 100755 tools/mkimage.sh diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 5d2a0dcefab..045b9c1b26b 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -20,6 +20,7 @@ use core::mem::MaybeUninit; use alloc::boxed::Box; +use alloc::string::ToString; use alloc::sync::{Arc, Weak}; use crate::fs::cache::CachedINode; @@ -197,10 +198,12 @@ impl DiskINode { const_assert_eq!(core::mem::size_of::(), 128); -struct INode { +pub struct INode { id: usize, fs: Weak, inode: Box, + + sref: Weak, } impl INode { @@ -238,15 +241,31 @@ impl INode { // SAFETY: We have initialized the inode above. let inode = unsafe { inode.assume_init() }; - log::debug!("ino_table_index={ino_table_index:?} inode={inode:?}"); + Some( + icache.make_item_cached(CachedINode::new(Arc::new_cyclic(|sref| Self { + inode, + id, + fs: ext2, - Some(icache.make_item_cached(CachedINode::new(Arc::new(Self { - inode, - id, - fs: ext2, - })))) + sref: sref.clone(), + }))), + ) } } + + pub fn sref(&self) -> Arc { + self.sref.upgrade().unwrap() + } + + pub fn make_dir_entry( + &self, + parent: DirCacheItem, + name: &str, + entry: &DiskDirEntry, + ) -> Option { + let inode = self.fs.upgrade()?.find_inode(entry.inode as usize)?; + Some(DirEntry::new(parent, inode, name.to_string())) + } } impl INodeInterface for INode { @@ -262,6 +281,72 @@ impl INodeInterface for INode { children_len: 0, }) } + + fn dirent(&self, parent: DirCacheItem, index: usize) -> super::Result> { + Ok(DirEntryIter::new(parent, self.sref()).nth(index)) + } +} + +#[derive(Debug, Copy, Clone)] +#[repr(C, packed)] +pub struct DiskDirEntry { + inode: u32, + entry_size: u16, + name_size: u8, + file_type: u8, +} + +pub struct DirEntryIter { + parent: DirCacheItem, + inode: Arc, + offset: usize, +} + +impl DirEntryIter { + pub fn new(parent: DirCacheItem, inode: Arc) -> Self { + Self { + parent, + inode, + + offset: 0, + } + } +} + +impl Iterator for DirEntryIter { + type Item = DirCacheItem; + + fn next(&mut self) -> Option { + let filesystem = self.inode.fs.upgrade()?; + let file_size = self.inode.inode.size_lower as usize; + + if self.offset + core::mem::size_of::() > file_size { + return None; + } + + let mut entry = Box::::new_uninit(); + + let offset = (self.inode.inode.data_ptr[0] as usize * filesystem.superblock.block_size()) + + self.offset; + + filesystem.block.device().read(offset, entry.as_bytes_mut()); + + // SAFETY: We have initialized the entry above. + let entry = unsafe { entry.assume_init() }; + + let mut name = Box::<[u8]>::new_uninit_slice(entry.name_size as usize); + filesystem.block.device().read( + offset + core::mem::size_of::(), + MaybeUninit::slice_as_bytes_mut(&mut name), + ); + + // SAFETY: We have initialized the name above. + let name = unsafe { name.assume_init() }; + let name = unsafe { core::str::from_utf8_unchecked(&*name) }; + + self.offset += entry.entry_size as usize; + self.inode.make_dir_entry(self.parent.clone(), name, &entry) + } } pub struct Ext2 { diff --git a/tools/mkimage.sh b/tools/mkimage.sh new file mode 100755 index 00000000000..c068660dc2e --- /dev/null +++ b/tools/mkimage.sh @@ -0,0 +1,20 @@ +# XXX: fucking hell andy. you had a reminder to not commit this +# file. you did. you fucking did. you're a fucking idiot. move +# this shit to aero.py. + +rm -rf disk.img + +dd if=/dev/zero bs=1M count=0 seek=512 of=disk.img +parted -s disk.img mklabel gpt +parted -s disk.img mkpart primary 2048s 100% +sudo losetup -Pf --show disk.img > loopback_dev +sudo mkfs.ext2 `cat loopback_dev`p1 +rm -rf disk_image/ +mkdir disk_image +sudo mount `cat loopback_dev`p1 disk_image +sudo cp aero.py disk_image/aero.py +sync +sudo umount disk_image/ +sudo losetup -d `cat loopback_dev` +sync +rm -rf loopback_dev From 5d30c36b2eff608079950e2b70e6be29ac0ba1c0 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 20 Sep 2022 12:55:05 +1000 Subject: [PATCH 011/368] ext2: file read Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/mod.rs | 76 ++++++++++++++++++++++++- src/aero_kernel/src/mem/paging/frame.rs | 9 ++- 2 files changed, 81 insertions(+), 4 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 045b9c1b26b..46190c5ba4b 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -28,8 +28,8 @@ use crate::utils::CeilDiv; use super::block::BlockDevice; -use super::cache; use super::cache::{DirCacheItem, INodeCacheItem}; +use super::{cache, FileSystemError}; use super::inode::{DirEntry, INodeInterface, Metadata}; use super::FileSystem; @@ -282,9 +282,83 @@ impl INodeInterface for INode { }) } + fn stat(&self) -> super::Result { + use super::inode::FileType; + use aero_syscall::{Mode, Stat}; + + let filesystem = self.fs.upgrade().unwrap(); + let filetype = self.metadata()?.file_type(); + + let mut mode = Mode::empty(); + + match filetype { + FileType::File => mode.insert(Mode::S_IFREG), + FileType::Directory => mode.insert(Mode::S_IFDIR), + FileType::Device => mode.insert(Mode::S_IFCHR), + FileType::Socket => mode.insert(Mode::S_IFSOCK), + FileType::Symlink => mode.insert(Mode::S_IFLNK), + } + + // FIXME: read permission bits from the inode. + mode.insert(Mode::S_IRWXU | Mode::S_IRWXG | Mode::S_IRWXO); + + Ok(Stat { + st_ino: self.id as _, + st_blksize: filesystem.superblock.block_size() as _, + st_size: self.inode.size_lower as _, + st_mode: mode, + + ..Default::default() + }) + } + fn dirent(&self, parent: DirCacheItem, index: usize) -> super::Result> { Ok(DirEntryIter::new(parent, self.sref()).nth(index)) } + + fn lookup(&self, dir: DirCacheItem, name: &str) -> super::Result { + DirEntryIter::new(dir, self.sref()) + .find(|e| &e.name() == name) + .ok_or(FileSystemError::EntryNotFound) + } + + fn read_at(&self, offset: usize, buffer: &mut [u8]) -> super::Result { + let filesystem = self.fs.upgrade().unwrap(); + let block_size = filesystem.superblock.block_size(); + + let mut progress = 0; + + let count = core::cmp::min(self.inode.size_lower as usize - offset, buffer.len()); + + while progress < count { + let block = (offset + progress) / block_size; + let loc = (offset + progress) % block_size; + + let mut chunk = count - progress; + + if chunk > block_size - loc { + chunk = block_size - loc; + } + + let block_index = self.inode.data_ptr[block]; + + // TODO: We really should not allocate another buffer here. + let mut data = Box::<[u8]>::new_uninit_slice(chunk); + + filesystem.block.device().read( + (block_index as usize * block_size) + loc, + MaybeUninit::slice_as_bytes_mut(&mut data), + ); + + // SAFETY: We have initialized the data buffer above. + let data = unsafe { data.assume_init() }; + + buffer[progress..progress + data.len()].copy_from_slice(&*data); + progress += chunk; + } + + Ok(count) + } } #[derive(Debug, Copy, Clone)] diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 827cdfc3a50..ed6d01fe165 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -61,7 +61,7 @@ unsafe impl FrameAllocator for LockedFrameAllocator { self.0 .get() .map(|m| { - m.lock() + m.lock_irq() .allocate_frame_inner(0) .map(|f| PhysFrame::containing_address(f)) }) @@ -93,7 +93,7 @@ unsafe impl FrameAllocator for LockedFrameAllocator { self.0 .get() .map(|m| { - m.lock() + m.lock_irq() .allocate_frame_inner(2) .map(|f| PhysFrame::containing_address(f)) }) @@ -111,7 +111,10 @@ unsafe impl FrameAllocator for LockedFrameAllocator { self.0 .get() - .map(|m| m.lock().deallocate_frame_inner(frame.start_address(), 2)) + .map(|m| { + m.lock_irq() + .deallocate_frame_inner(frame.start_address(), 2) + }) .unwrap_or(()); } } From a6951d950a5a6b3e5b53373901f6be220f9cc3d9 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 20 Sep 2022 18:14:54 +1000 Subject: [PATCH 012/368] ext2: inode read Signed-off-by: Andy-Python-Programmer --- .../src/drivers/block/nvme/queue.rs | 11 +- src/aero_kernel/src/fs/block/mod.rs | 28 ++- src/aero_kernel/src/fs/ext2/mod.rs | 230 +++++++++++++----- tools/mkimage.sh | 10 +- 4 files changed, 203 insertions(+), 76 deletions(-) diff --git a/src/aero_kernel/src/drivers/block/nvme/queue.rs b/src/aero_kernel/src/drivers/block/nvme/queue.rs index d19a232d38d..a74edd4df3c 100644 --- a/src/aero_kernel/src/drivers/block/nvme/queue.rs +++ b/src/aero_kernel/src/drivers/block/nvme/queue.rs @@ -66,6 +66,7 @@ impl<'bell, T: QueueType> Queue<'bell, T> { impl Queue<'_, Completion> { pub fn next_cmd_result(&mut self) -> Option { + let queue_len = self.queue.len(); let cmd = &mut self.queue[self.index]; while (cmd.get_mut().status & 0x1) != self.phase as u16 { @@ -80,7 +81,13 @@ impl Queue<'_, Completion> { return None; } - self.index += 1; + self.index = (self.index + 1) % queue_len; + + // invert the phase bit since we are in the next cycle/phase. + if self.index == 0 { + self.phase = !self.phase; + } + self.doorbell.0.set(self.index as u32); Some(cmd.clone()) @@ -91,7 +98,7 @@ impl Queue<'_, Submisson> { pub fn submit_command(&mut self, command: Command) { self.queue[self.index] = UnsafeCell::new(command); - self.index += 1; + self.index = (self.index + 1) % self.queue.len(); self.doorbell.0.set(self.index as u32); // ring ring! } } diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 2902d6d30c1..c988b95f8a9 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -32,7 +32,6 @@ use crate::fs::devfs::install_device; use crate::fs::{Path, Result, MOUNT_MANAGER}; use crate::fs::ext2::Ext2; -use crate::mem::paging::{align_down, align_up}; use crate::utils::sync::Mutex; use super::devfs::{alloc_device_marker, Device}; @@ -45,20 +44,27 @@ pub trait BlockDeviceInterface: Send + Sync { fn write_block(&self, sector: usize, buf: &[u8]) -> Option; fn read(&self, offset: usize, dest: &mut [MaybeUninit]) -> Option { - let aligned_offset = align_down(offset as u64, self.block_size() as u64) as usize; - let sector = aligned_offset / self.block_size(); + let mut progress = 0; + let block_size = self.block_size(); - let aligned_size = align_up(dest.len() as u64, self.block_size() as u64) as usize; - let mut buffer = Box::<[u8]>::new_uninit_slice(aligned_size); + while progress < dest.len() { + let block = (offset + progress) / block_size; + let loc = (offset + progress) % block_size; - self.read_block(sector, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; - // SAFETY: We have initialized the buffer above. - let buffer = unsafe { buffer.assume_init() }; + let mut chunk = dest.len() - progress; - let offset = offset - aligned_offset; - MaybeUninit::write_slice(dest, &buffer[offset..(offset + dest.len())]); + if chunk > (block_size - loc) { + chunk = block_size - loc; + } + + let mut buffer = Box::<[u8]>::new_uninit_slice(block_size); + self.read_block(block, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; + + dest[progress..(progress + chunk)].copy_from_slice(&buffer[loc..loc + chunk]); + progress += chunk; + } - Some(dest.len()) + Some(progress) } } diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 46190c5ba4b..7e21585bfb2 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -19,11 +19,15 @@ use core::mem::MaybeUninit; +use aero_syscall::MMapFlags; use alloc::boxed::Box; use alloc::string::ToString; use alloc::sync::{Arc, Weak}; +use alloc::vec::Vec; +use spin::Once; use crate::fs::cache::CachedINode; +use crate::mem::paging::{FrameAllocator, PhysFrame, FRAME_ALLOCATOR}; use crate::utils::CeilDiv; use super::block::BlockDevice; @@ -168,7 +172,7 @@ pub struct DiskINode { pub deletion_time: u32, pub group_id: u16, pub hl_count: u16, - pub sector_count: u32, + pub block_count: u32, pub flags: u32, pub os_specific: u32, pub data_ptr: [u32; 15], @@ -203,6 +207,11 @@ pub struct INode { fs: Weak, inode: Box, + // TODO: Do not store this in the inode, but rather in a different + // cache using the API provided by fs::cache (consider LRU only?). + block_map: Once>, + entries: Once)>>, + sref: Weak, } @@ -247,14 +256,122 @@ impl INode { id, fs: ext2, + block_map: Once::new(), + entries: Once::new(), + sref: sref.clone(), }))), ) } } - pub fn sref(&self) -> Arc { - self.sref.upgrade().unwrap() + pub fn init_block_map(&self) { + let filesystem = self.fs.upgrade().unwrap(); + let block_size = filesystem.superblock.block_size(); + + let entries_per_block = block_size / core::mem::size_of::(); + let mut block_map = Box::<[u32]>::new_uninit_slice(self.inode.block_count as usize); + + // There are pointers to the first 12 blocks which contain the file's + // data in the inode. There is a pointer to an indirect block (which + // contains pointers to the next set of blocks), a pointer to a doubly + // indirect block and a pointer to a treply indirect block. + for i in 0..block_map.len() { + let mut block = i; + if block < 12 { + // direct block + block_map[i].write(self.inode.data_ptr[block]); + } else { + // indirect block + block -= 12; + + if block >= entries_per_block { + // doubly indirect block + block -= entries_per_block; + + let index = block / entries_per_block; + let mut indirect_block = MaybeUninit::::uninit(); + + if index >= entries_per_block { + // treply indirect block + todo!() + } else { + let block_ptrs = self.inode.data_ptr[13] as usize * block_size; + let offset = block_ptrs + (index * core::mem::size_of::()); + + filesystem + .block + .device() + .read(offset, indirect_block.as_bytes_mut()) + .unwrap(); + } + + // SAFETY: We have initialized the indirect block variable above. + let indirect_block = unsafe { indirect_block.assume_init() } as usize; + + for j in 0..entries_per_block { + if (i + j) >= block_map.len() { + // SAFETY: We have fully initialized the block map. + let block_map = unsafe { block_map.assume_init() }; + self.block_map.call_once(|| block_map); + return; + } + + let offset = indirect_block * block_size + j * core::mem::size_of::(); + filesystem + .block + .device() + .read(offset, block_map[i + j].as_bytes_mut()) + .unwrap(); + } + } else { + // singly indirect block + let block_ptrs = self.inode.data_ptr[12] as usize * block_size; + let offset = block_ptrs + (block * core::mem::size_of::()); + + filesystem + .block + .device() + .read(offset, block_map[i].as_bytes_mut()) + .expect("init_block_map: failed to read singly indirect block"); + } + } + } + + // SAFETY: We have fully initialized the block map. + let block_map = unsafe { block_map.assume_init() }; + self.block_map.call_once(|| block_map); + } + + pub fn read(&self, offset: usize, buffer: &mut [MaybeUninit]) -> super::Result { + let filesystem = self.fs.upgrade().unwrap(); + let block_size = filesystem.superblock.block_size(); + + let mut progress = 0; + + let count = core::cmp::min(self.inode.size_lower as usize - offset, buffer.len()); + + while progress < count { + let block = (offset + progress) / block_size; + let loc = (offset + progress) % block_size; + + let mut chunk = count - progress; + + if chunk > block_size - loc { + chunk = block_size - loc; + } + + let block_index = self.block_map()[block] as usize; + + filesystem.block.device().read( + (block_index * block_size) + loc, + &mut buffer[progress..progress + chunk], + ); + + progress += chunk; + } + + Ok(count) } pub fn make_dir_entry( @@ -266,6 +383,20 @@ impl INode { let inode = self.fs.upgrade()?.find_inode(entry.inode as usize)?; Some(DirEntry::new(parent, inode, name.to_string())) } + + pub fn entries(&self) -> &[(String, Box)] { + self.entries + .call_once(|| DirEntryIter::new(self.sref()).collect::>()) + } + + pub fn block_map(&self) -> &[u32] { + self.init_block_map(); + self.block_map.get().unwrap() + } + + pub fn sref(&self) -> Arc { + self.sref.upgrade().unwrap() + } } impl INodeInterface for INode { @@ -313,51 +444,46 @@ impl INodeInterface for INode { } fn dirent(&self, parent: DirCacheItem, index: usize) -> super::Result> { - Ok(DirEntryIter::new(parent, self.sref()).nth(index)) + if let Some((name, entry)) = self.entries().get(index) { + Ok(self.make_dir_entry(parent, name, entry)) + } else { + Ok(None) + } } - fn lookup(&self, dir: DirCacheItem, name: &str) -> super::Result { - DirEntryIter::new(dir, self.sref()) - .find(|e| &e.name() == name) + fn lookup(&self, parent: DirCacheItem, name: &str) -> super::Result { + let (name, entry) = self + .entries() + .iter() + .find(|(ename, _)| ename == name) .ok_or(FileSystemError::EntryNotFound) - } - - fn read_at(&self, offset: usize, buffer: &mut [u8]) -> super::Result { - let filesystem = self.fs.upgrade().unwrap(); - let block_size = filesystem.superblock.block_size(); - - let mut progress = 0; - - let count = core::cmp::min(self.inode.size_lower as usize - offset, buffer.len()); - - while progress < count { - let block = (offset + progress) / block_size; - let loc = (offset + progress) % block_size; + .cloned()?; - let mut chunk = count - progress; + Ok(self.make_dir_entry(parent, &name, &entry).unwrap()) + } - if chunk > block_size - loc { - chunk = block_size - loc; - } + fn read_at(&self, offset: usize, usr_buffer: &mut [u8]) -> super::Result { + // TODO: We really should not allocate another buffer here. + let mut buffer = Box::<[u8]>::new_uninit_slice(usr_buffer.len()); + let count = self.read(offset, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; - let block_index = self.inode.data_ptr[block]; + // SAFETY: We have initialized the data buffer above. + let buffer = unsafe { buffer.assume_init() }; + usr_buffer.copy_from_slice(&*buffer); - // TODO: We really should not allocate another buffer here. - let mut data = Box::<[u8]>::new_uninit_slice(chunk); + Ok(count) + } - filesystem.block.device().read( - (block_index as usize * block_size) + loc, - MaybeUninit::slice_as_bytes_mut(&mut data), - ); + fn mmap(&self, offset: usize, size: usize, flags: MMapFlags) -> super::Result { + // TODO: support shared file mappings. + assert!(!flags.contains(MMapFlags::MAP_SHARED)); - // SAFETY: We have initialized the data buffer above. - let data = unsafe { data.assume_init() }; + let private_cp: PhysFrame = FRAME_ALLOCATOR.allocate_frame().unwrap(); - buffer[progress..progress + data.len()].copy_from_slice(&*data); - progress += chunk; - } + let buffer = &mut private_cp.as_slice_mut()[..size]; + self.read_at(offset, buffer)?; - Ok(count) + Ok(private_cp) } } @@ -371,27 +497,20 @@ pub struct DiskDirEntry { } pub struct DirEntryIter { - parent: DirCacheItem, inode: Arc, offset: usize, } impl DirEntryIter { - pub fn new(parent: DirCacheItem, inode: Arc) -> Self { - Self { - parent, - inode, - - offset: 0, - } + pub fn new(inode: Arc) -> Self { + Self { inode, offset: 0 } } } impl Iterator for DirEntryIter { - type Item = DirCacheItem; + type Item = (String, Box); fn next(&mut self) -> Option { - let filesystem = self.inode.fs.upgrade()?; let file_size = self.inode.inode.size_lower as usize; if self.offset + core::mem::size_of::() > file_size { @@ -400,26 +519,25 @@ impl Iterator for DirEntryIter { let mut entry = Box::::new_uninit(); - let offset = (self.inode.inode.data_ptr[0] as usize * filesystem.superblock.block_size()) - + self.offset; - - filesystem.block.device().read(offset, entry.as_bytes_mut()); + self.inode.read(self.offset, entry.as_bytes_mut()).ok()?; // SAFETY: We have initialized the entry above. let entry = unsafe { entry.assume_init() }; let mut name = Box::<[u8]>::new_uninit_slice(entry.name_size as usize); - filesystem.block.device().read( - offset + core::mem::size_of::(), - MaybeUninit::slice_as_bytes_mut(&mut name), - ); + self.inode + .read( + self.offset + core::mem::size_of::(), + MaybeUninit::slice_as_bytes_mut(&mut name), + ) + .ok()?; // SAFETY: We have initialized the name above. let name = unsafe { name.assume_init() }; let name = unsafe { core::str::from_utf8_unchecked(&*name) }; self.offset += entry.entry_size as usize; - self.inode.make_dir_entry(self.parent.clone(), name, &entry) + Some((name.to_string(), entry)) } } diff --git a/tools/mkimage.sh b/tools/mkimage.sh index c068660dc2e..e2e6e581086 100755 --- a/tools/mkimage.sh +++ b/tools/mkimage.sh @@ -1,18 +1,14 @@ -# XXX: fucking hell andy. you had a reminder to not commit this -# file. you did. you fucking did. you're a fucking idiot. move -# this shit to aero.py. - rm -rf disk.img -dd if=/dev/zero bs=1M count=0 seek=512 of=disk.img +dd if=/dev/zero bs=1G count=0 seek=512 of=disk.img parted -s disk.img mklabel gpt parted -s disk.img mkpart primary 2048s 100% sudo losetup -Pf --show disk.img > loopback_dev -sudo mkfs.ext2 `cat loopback_dev`p1 +sudo mkfs.ext2 `cat loopback_dev`p1 -I128 rm -rf disk_image/ mkdir disk_image sudo mount `cat loopback_dev`p1 disk_image -sudo cp aero.py disk_image/aero.py +sudo cp -r -v sysroot/system-root/* disk_image/ sync sudo umount disk_image/ sudo losetup -d `cat loopback_dev` From 822f7d2923c49980c7265cd1f5ddf1e4002d4348 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 26 Sep 2022 17:53:28 +1000 Subject: [PATCH 013/368] block: load root filesystem from disk * load root filesystem from the disk * update mkimage to copy all the hidden files aswell * remove initramfs code in the kernel * keep track of the unused items in the cache so we can reuse them to avoid more memory allocations and disk i/o where applicable Signed-off-by: Andy-Python-Programmer --- aero.py | 48 +----- src/Cargo.lock | 17 ++ src/aero_kernel/Cargo.toml | 3 +- src/aero_kernel/src/arch/x86_64/mod.rs | 7 - src/aero_kernel/src/drivers/block/nvme/mod.rs | 2 +- src/aero_kernel/src/fs/block/gpt.rs | 4 +- src/aero_kernel/src/fs/block/mod.rs | 111 +++++++++++-- src/aero_kernel/src/fs/cache.rs | 87 ++++++---- src/aero_kernel/src/fs/ext2/mod.rs | 152 ++++++++++-------- src/aero_kernel/src/fs/initramfs.rs | 109 ------------- src/aero_kernel/src/fs/inode.rs | 18 ++- src/aero_kernel/src/fs/mod.rs | 49 +++--- src/aero_kernel/src/main.rs | 2 - src/aero_kernel/src/mem/vmalloc.rs | 5 +- src/aero_kernel/src/syscall/fs.rs | 2 +- src/aero_kernel/src/userland/task.rs | 36 +++-- tools/mkimage.sh | 10 +- 17 files changed, 340 insertions(+), 322 deletions(-) delete mode 100644 src/aero_kernel/src/fs/initramfs.rs diff --git a/aero.py b/aero.py index 88196a2fe3d..175edd7d75e 100755 --- a/aero.py +++ b/aero.py @@ -25,6 +25,7 @@ import subprocess import sys import tarfile +import time from typing import List @@ -76,9 +77,6 @@ def log_error(msg): MODULE_PATH=boot:///term_background.bmp MODULE_CMDLINE=background - -MODULE_PATH=boot:///initramfs.cpio -MODULE_CMDLINE=initramfs """ @@ -437,47 +435,6 @@ def prepare_iso(args, kernel_bin, user_bins): shutil.copy(os.path.join(limine_path, 'BOOTAA64.EFI'), efi_boot) shutil.copy(os.path.join(limine_path, 'BOOTX64.EFI'), efi_boot) - sysroot_dir = os.path.join(SYSROOT_DIR, 'system-root') - shutil.copytree(BASE_FILES_DIR, sysroot_dir, dirs_exist_ok=True) - - # dynamic linker (ld.so) - mlibc = os.path.join(get_userland_package(), "mlibc") - # gcc libraries required for rust programs - gcc = os.path.join(get_userland_package(), "gcc") - - # FIXME - if "host-rust-prebuilt" in str(mlibc): - shutil.copytree(mlibc, sysroot_dir, dirs_exist_ok=True) - shutil.copytree(gcc, sysroot_dir, dirs_exist_ok=True) - - for file in user_bins: - bin_name = os.path.basename(file) - shutil.copy(file, os.path.join(sysroot_dir, "usr", "bin", bin_name)) - - def find(path) -> List[str]: - _, find_output, _ = run_command(['find', '.', '-type', 'f'], - cwd=path, - stdout=subprocess.PIPE) - - files_without_dot = filter( - lambda x: x != '.', find_output.decode('utf-8').splitlines()) - files_without_prefix = map( - lambda x: remove_prefix(x, './'), files_without_dot) - files = list(files_without_prefix) - - files.append("usr/lib/libiconv.so.2") - return files - - files = find(sysroot_dir) - - with open(os.path.join(iso_root, 'initramfs.cpio'), 'wb') as initramfs: - cpio_input = '\n'.join(files) - code, _, _ = run_command(['cpio', '-o', '-v'], - cwd=sysroot_dir, - stdout=initramfs, - stderr=subprocess.PIPE, - input=cpio_input.encode('utf-8')) - with open(os.path.join(iso_root, 'limine.cfg'), 'w') as limine_cfg: limine_cfg.write(LIMINE_TEMPLATE) @@ -641,6 +598,7 @@ def is_kvm_supported() -> bool: def main(): + t0 = time.time() args = parse_args() # arch-aero_os @@ -699,6 +657,8 @@ def main(): kernel_bin = kernel_bin[0] iso_path = prepare_iso(args, kernel_bin, user_bins) + t1 = time.time() + log_info(f"build completed in {t1 - t0:.2f} seconds") if not args.no_run: run_in_emulator(build_info, iso_path) diff --git a/src/Cargo.lock b/src/Cargo.lock index 5bf634e2707..529227c86c9 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -10,6 +10,7 @@ dependencies = [ "aero_syscall", "bit_field", "bitflags", + "bytemuck", "cfg-if", "cpio_reader", "hashbrown", @@ -18,6 +19,7 @@ dependencies = [ "lazy_static", "limine", "log", + "lru", "nasm-rs", "raw-cpuid", "rustc-demangle", @@ -81,6 +83,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bytemuck" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" + [[package]] name = "cc" version = "1.0.73" @@ -233,6 +241,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "lru" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936d98d2ddd79c18641c6709e7bb09981449694e402d1a0f0f657ea8d61f4a51" +dependencies = [ + "hashbrown", +] + [[package]] name = "memoffset" version = "0.5.6" diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index e64245a0e10..04d6d304c74 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -40,9 +40,10 @@ lai = { git = "https://github.com/aero-os/lai-rs" } uapi = { path = "../uapi" } cpio_reader = { git = "https://github.com/Andy-Python-Programmer/cpio_reader" } static_assertions = "1.1.0" +lru = "0.8.0" +bytemuck = "1.12.1" limine = { git = "https://github.com/limine-bootloader/limine-rs" } - cfg-if = "1.0" # X86_64 specific dependencies: diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index 6fbf4cc7ccd..fcc327022b4 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -194,13 +194,6 @@ extern "C" fn arch_aero_main() -> ! { syscall::init(); - crate::INITRD_MODULE.call_once(|| { - modules - .iter() - .find(|e| e.cmdline.to_str().unwrap().to_str().unwrap() == "initramfs") - .unwrap() - }); - let boot_time = BOOT_TIME.get_response().get().unwrap(); time::EPOCH.store(boot_time.boot_time as _, Ordering::SeqCst); diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index cc68a6e9944..05b5b7e4565 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -262,7 +262,7 @@ impl<'a> Namespace<'a> { read_cmd.data_ptr.prp1 = buffer.addr().as_u64(); } - self.controller.io_queue.lock().submit_command(read_cmd); + self.controller.io_queue.lock_irq().submit_command(read_cmd); // SAFETY: The buffer is initialized above. let buffer = unsafe { buffer.assume_init() }; diff --git a/src/aero_kernel/src/fs/block/gpt.rs b/src/aero_kernel/src/fs/block/gpt.rs index 7685bcf094f..65bde2e39c8 100644 --- a/src/aero_kernel/src/fs/block/gpt.rs +++ b/src/aero_kernel/src/fs/block/gpt.rs @@ -17,6 +17,8 @@ * along with Aero. If not, see . */ +use crate::fs::block::BlockDeviceInterface; + use super::BlockDevice; use core::mem::MaybeUninit; @@ -126,7 +128,6 @@ impl Gpt { let mut header = Box::::new_uninit(); controller - .device() .read_block(1, header.as_bytes_mut()) .expect("gpt: failed to read first sector"); @@ -143,7 +144,6 @@ impl Gpt { let mut entry_list = Box::<[GptEntry]>::new_uninit_slice(header.num_entries as usize); controller - .device() .read_block( header.starting_lba as _, MaybeUninit::slice_as_bytes_mut(&mut entry_list), diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index c988b95f8a9..1b0e65c9bf6 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -29,19 +29,48 @@ use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use crate::fs::devfs::install_device; -use crate::fs::{Path, Result, MOUNT_MANAGER}; +use crate::fs::{FileSystem, Result}; use crate::fs::ext2::Ext2; use crate::utils::sync::Mutex; +use super::cache::{Cache, Cacheable}; use super::devfs::{alloc_device_marker, Device}; use super::inode::INodeInterface; +type CachedBlockKey = (usize, usize); // (block device pointer, block) + +struct CachedBlock { + device: Weak, + block: usize, + buffer: Box<[u8]>, +} + +impl CachedBlock { + fn make_key(device: Weak, block: usize) -> CachedBlockKey { + (device.as_ptr() as *const u8 as usize, block) + } +} + +impl Cacheable for CachedBlock { + fn cache_key(&self) -> CachedBlockKey { + Self::make_key(self.device.clone(), self.block) + } +} + +lazy_static::lazy_static! { + static ref BLOCK_CACHE: Arc> = Cache::new(); +} + pub trait BlockDeviceInterface: Send + Sync { fn block_size(&self) -> usize; fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option; fn write_block(&self, sector: usize, buf: &[u8]) -> Option; +} + +pub trait CachedAccess: BlockDeviceInterface { + fn sref(&self) -> Weak; fn read(&self, offset: usize, dest: &mut [MaybeUninit]) -> Option { let mut progress = 0; @@ -57,10 +86,26 @@ pub trait BlockDeviceInterface: Send + Sync { chunk = block_size - loc; } - let mut buffer = Box::<[u8]>::new_uninit_slice(block_size); - self.read_block(block, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; + let key = CachedBlock::make_key(self.sref(), block); + + if let Some(cached) = BLOCK_CACHE.get(key) { + MaybeUninit::write_slice( + &mut dest[progress..(progress + chunk)], + &cached.buffer[loc..loc + chunk], + ); + } else { + let mut buffer = Box::<[u8]>::new_uninit_slice(block_size); + + self.read_block(block, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; + dest[progress..(progress + chunk)].copy_from_slice(&buffer[loc..loc + chunk]); + + BLOCK_CACHE.make_item_cached(CachedBlock { + device: self.sref(), + block, + buffer: unsafe { buffer.assume_init() }, + }); + } - dest[progress..(progress + chunk)].copy_from_slice(&buffer[loc..loc + chunk]); progress += chunk; } @@ -85,25 +130,41 @@ pub struct BlockDevice { id: usize, name: String, dev: Arc, - self_ref: Weak, + sref: Weak, } impl BlockDevice { pub fn new(name: String, imp: Arc) -> Arc { - Arc::new_cyclic(|me| BlockDevice { + Arc::new_cyclic(|sref| BlockDevice { id: alloc_device_marker(), name, dev: imp, - self_ref: me.clone(), + sref: sref.clone(), }) } pub fn name(&self) -> String { self.name.clone() } +} - pub fn device(&self) -> Arc { - self.dev.clone() +impl BlockDeviceInterface for BlockDevice { + fn block_size(&self) -> usize { + self.dev.block_size() + } + + fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { + self.dev.read_block(sector, dest) + } + + fn write_block(&self, sector: usize, buf: &[u8]) -> Option { + self.dev.write_block(sector, buf) + } +} + +impl CachedAccess for BlockDevice { + fn sref(&self) -> Weak { + self.sref.clone() } } @@ -119,23 +180,27 @@ impl Device for BlockDevice { } fn inode(&self) -> Arc { - self.self_ref.upgrade().unwrap().clone() + self.sref.upgrade().unwrap().clone() } } struct PartitionBlockDevice { + sref: Weak, + offset: usize, // offset in sectors size: usize, // capacity in sectors device: Arc, } impl PartitionBlockDevice { - fn new(offset: usize, size: usize, device: Arc) -> Self { - Self { + fn new(offset: usize, size: usize, device: Arc) -> Arc { + Arc::new_cyclic(|sref| Self { + sref: sref.clone(), + offset, size, device, - } + }) } } @@ -161,6 +226,12 @@ impl BlockDeviceInterface for PartitionBlockDevice { } } +impl CachedAccess for PartitionBlockDevice { + fn sref(&self) -> Weak { + self.sref.clone() + } +} + pub fn launch() -> Result<()> { let mut blocks_copy = Vec::>::new(); @@ -189,19 +260,27 @@ pub fn launch() -> Result<()> { ); let name = alloc::format!("{}p{}", block.name(), i); - let partition_device = PartitionBlockDevice::new(start, size, block.device()); - let device = BlockDevice::new(name, Arc::new(partition_device)); + let partition_device = PartitionBlockDevice::new(start, size, block.clone()); + let device = BlockDevice::new(name, partition_device); install_block_device(device.clone())?; // Check what filesystem is on this partition and mount it. if let Some(ext2) = Ext2::new(device.clone()) { log::info!("gpt: found ext2 filesystem on {}!", device.name()); - MOUNT_MANAGER.mount(super::lookup_path(Path::new("/mnt"))?, ext2)?; + + super::ROOT_FS.call_once(|| ext2.clone()); + super::ROOT_DIR.call_once(|| ext2.root_dir().clone()); } } } } + super::devfs::init()?; + log::info!("installed devfs"); + + super::procfs::init()?; + log::info!("installed procfs"); + Ok(()) } diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index 7e0345530d3..afeb02033f7 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -28,7 +28,10 @@ use core::borrow::Borrow; use core::fmt::Debug; use core::hash::Hash; +use core::num::NonZeroUsize; use core::ops; +use core::sync::atomic::AtomicBool; +use core::sync::atomic::Ordering; use alloc::sync::Arc; use alloc::sync::Weak; @@ -41,8 +44,8 @@ use crate::utils::sync::Mutex; use super::FileSystem; -pub(super) static INODE_CACHE: Once> = Once::new(); -pub(super) static DIR_CACHE: Once> = Once::new(); +pub static INODE_CACHE: Once> = Once::new(); +pub static DIR_CACHE: Once> = Once::new(); // NOTE: We require a custom wrapper around [`Arc`] and [`Weak`] since we need to be able // to move the cache item from the used list to the unused list when the cache item is dropped. @@ -146,22 +149,30 @@ pub trait Cacheable: Sized { fn cache_key(&self) -> K; } -/// Structure representing a cache item in the cache index. See the documentation of [CacheIndex] -/// and the fields of this struct for more information. pub struct CacheItem> { cache: Weak>, value: V, + /// Whether the cache item has active strong references associated + /// with it. + used: AtomicBool, } impl> CacheItem { - /// Constructs a new `CacheItem`. - #[inline] pub fn new(cache: &Weak>, value: V) -> CacheArc { CacheArc::new(Self { cache: cache.clone(), value, + used: AtomicBool::new(false), }) } + + pub fn is_used(&self) -> bool { + self.used.load(Ordering::SeqCst) + } + + pub fn set_used(&self, yes: bool) { + self.used.store(yes, Ordering::SeqCst); + } } impl> ops::Deref for CacheItem { @@ -176,33 +187,37 @@ unsafe impl> Sync for CacheItem {} struct CacheIndex> { used: hashbrown::HashMap>>, + /// Cache items that are longer have any active strong references associated + /// with them. These are stored in the cache index so, if the item is + /// accessed again, we can re-use it; reducing required memory allocation + /// and I/O (if applicable). + unused: lru::LruCache>>, } -/// Structure representing a cache with a key of `K` and value of `V`. The cache -/// key is used to get the cache from the cache index. This structure basically contains -/// the cache index (protected by a mutex) and a weak self reference to itself. pub struct Cache> { index: Mutex>, self_ref: Weak>, } impl> Cache { - pub(super) fn new() -> Arc { + pub fn new() -> Arc { Arc::new_cyclic(|this| Cache:: { index: Mutex::new(CacheIndex { used: hashbrown::HashMap::new(), + unused: lru::LruCache::new(NonZeroUsize::new(512).unwrap()), }), self_ref: this.clone(), }) } - pub(super) fn clear(&self) { + pub fn clear(&self) { let mut index_mut = self.index.lock(); + index_mut.unused.clear(); index_mut.used.clear(); } - pub(super) fn make_item_cached(&self, value: V) -> CacheArc> { + pub fn make_item_cached(&self, value: V) -> CacheArc> { let item = CacheItem::::new(&self.self_ref, value); self.index @@ -210,51 +225,72 @@ impl> Cache { .used .insert(item.cache_key(), Arc::downgrade(&item)); + item.set_used(true); item } - pub(super) fn make_item_no_cache(&self, value: V) -> CacheArc> { + pub fn make_item_no_cache(&self, value: V) -> CacheArc> { CacheItem::::new(&Weak::default(), value) } - pub(super) fn get(&self, key: K) -> Option>> { - let index = self.index.lock(); + pub fn get(&self, key: K) -> Option>> { + let mut index = self.index.lock(); if let Some(entry) = index.used.get(&key) { - Some(CacheArc::from(entry.upgrade()?)) + let entry = entry.upgrade()?; + Some(CacheArc::from(entry)) + } else if let Some(entry) = index.unused.pop(&key) { + entry.set_used(true); + index.used.insert(key, Arc::downgrade(&entry)); + + Some(entry.into()) } else { None } } pub fn log(&self) { + let index = self.index.lock(); + log::debug!("Cache:"); - log::debug!("\t Used entries: {}", self.index.lock().used.len()); - for item in self.index.lock().used.iter() { - log::debug!("\t\t {:?} -> {:?}", item.0, item.1.strong_count()); + log::debug!("\t Used entries: {}", index.used.len()); + for (key, item) in index.used.iter() { + log::debug!("\t\t {:?} -> {:?}", key, item.strong_count()); + } + + log::debug!("\t Unused entries: {}", index.unused.len()); + for (key, item) in index.unused.iter() { + log::debug!("\t\t {:?} -> {:?}", key, Arc::strong_count(item)) } } /// Removes the item with the provided `key` from the cache. - pub(super) fn remove(&self, key: &K) { + pub fn remove(&self, key: &K) { let mut index = self.index.lock(); - index.used.remove(key); + if index.used.remove(key).is_none() { + let _ = index.unused.pop(key); + } } fn mark_item_unused(&self, item: CacheArc>) { - let mut this = self.index.lock(); + item.set_used(false); + + let mut index = self.index.lock_irq(); let key = item.cache_key(); - this.used.remove(&key); + assert!(index.used.remove(&key).is_some()); + index.unused.put(key, item.0.clone()); } } impl> CacheDropper for CacheItem { fn drop_this(&self, this: Arc) { if let Some(cache) = self.cache.upgrade() { - cache.mark_item_unused(this.into()); + if self.is_used() { + cache.mark_item_unused(this.into()); + } } } } @@ -264,9 +300,6 @@ pub type INodeCache = Cache; pub type INodeCacheItem = CacheArc>; pub type INodeCacheWeakItem = CacheWeak>; -/// The cache key for the directory entry cache used to get the cache item. The cache key -/// is the tuple of the parent's cache marker (akin [usize]) and the name of the directory entry -/// (akin [String]). pub type DirCacheKey = (usize, String); pub type DirCache = Cache; pub type DirCacheItem = CacheArc>; diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 7e21585bfb2..4241829e1ef 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -26,11 +26,12 @@ use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use spin::Once; +use crate::fs::block::BlockDeviceInterface; use crate::fs::cache::CachedINode; use crate::mem::paging::{FrameAllocator, PhysFrame, FRAME_ALLOCATOR}; use crate::utils::CeilDiv; -use super::block::BlockDevice; +use super::block::{BlockDevice, CachedAccess}; use super::cache::{DirCacheItem, INodeCacheItem}; use super::{cache, FileSystemError}; @@ -137,6 +138,7 @@ pub struct GroupDescriptor { const_assert_eq!(core::mem::size_of::(), 32); +#[derive(PartialEq)] pub enum FileType { Fifo, CharDev, @@ -160,7 +162,7 @@ impl From for super::inode::FileType { } } -#[repr(C, packed)] +#[repr(C)] #[derive(Debug, Default, Copy, Clone)] pub struct DiskINode { type_and_perm: u16, @@ -242,7 +244,7 @@ impl INode { let mut inode = Box::::new_uninit(); - fs.block.device().read( + fs.block.read( table_offset + (ino_table_index * core::mem::size_of::()), inode.as_bytes_mut(), )?; @@ -265,18 +267,71 @@ impl INode { } } - pub fn init_block_map(&self) { + pub fn read(&self, offset: usize, buffer: &mut [MaybeUninit]) -> super::Result { + let filesystem = self.fs.upgrade().unwrap(); + let block_size = filesystem.superblock.block_size(); + + let mut progress = 0; + + let count = core::cmp::min(self.inode.size_lower as usize - offset, buffer.len()); + + while progress < count { + let block = (offset + progress) / block_size; + let loc = (offset + progress) % block_size; + + let mut chunk = count - progress; + + if chunk > block_size - loc { + chunk = block_size - loc; + } + + let block_index = self.block_map()[block] as usize; + + filesystem.block.read( + (block_index * block_size) + loc, + &mut buffer[progress..progress + chunk], + ); + + progress += chunk; + } + + Ok(count) + } + + pub fn make_dir_entry( + &self, + parent: DirCacheItem, + name: &str, + entry: &DiskDirEntry, + ) -> Option { + let inode = self.fs.upgrade()?.find_inode(entry.inode as usize)?; + Some(DirEntry::new(parent, inode, name.to_string())) + } + + pub fn entries(&self) -> &[(String, Box)] { + self.entries + .call_once(|| DirEntryIter::new(self.sref()).collect::>()) + } + + pub fn block_map(&self) -> &[u32] { + if let Some(map) = self.block_map.get() { + return map; + } + + // The block map is not cached, so we need to make it. let filesystem = self.fs.upgrade().unwrap(); let block_size = filesystem.superblock.block_size(); let entries_per_block = block_size / core::mem::size_of::(); let mut block_map = Box::<[u32]>::new_uninit_slice(self.inode.block_count as usize); + let mut i = 0; + // There are pointers to the first 12 blocks which contain the file's // data in the inode. There is a pointer to an indirect block (which // contains pointers to the next set of blocks), a pointer to a doubly // indirect block and a pointer to a treply indirect block. - for i in 0..block_map.len() { + while i < block_map.len() { let mut block = i; if block < 12 { // direct block @@ -301,7 +356,6 @@ impl INode { filesystem .block - .device() .read(offset, indirect_block.as_bytes_mut()) .unwrap(); } @@ -313,17 +367,17 @@ impl INode { if (i + j) >= block_map.len() { // SAFETY: We have fully initialized the block map. let block_map = unsafe { block_map.assume_init() }; - self.block_map.call_once(|| block_map); - return; + return self.block_map.call_once(|| block_map); } let offset = indirect_block * block_size + j * core::mem::size_of::(); filesystem .block - .device() .read(offset, block_map[i + j].as_bytes_mut()) .unwrap(); } + + i += entries_per_block - 1; } else { // singly indirect block let block_ptrs = self.inode.data_ptr[12] as usize * block_size; @@ -331,67 +385,17 @@ impl INode { filesystem .block - .device() .read(offset, block_map[i].as_bytes_mut()) .expect("init_block_map: failed to read singly indirect block"); } } + + i += 1; } // SAFETY: We have fully initialized the block map. let block_map = unsafe { block_map.assume_init() }; - self.block_map.call_once(|| block_map); - } - - pub fn read(&self, offset: usize, buffer: &mut [MaybeUninit]) -> super::Result { - let filesystem = self.fs.upgrade().unwrap(); - let block_size = filesystem.superblock.block_size(); - - let mut progress = 0; - - let count = core::cmp::min(self.inode.size_lower as usize - offset, buffer.len()); - - while progress < count { - let block = (offset + progress) / block_size; - let loc = (offset + progress) % block_size; - - let mut chunk = count - progress; - - if chunk > block_size - loc { - chunk = block_size - loc; - } - - let block_index = self.block_map()[block] as usize; - - filesystem.block.device().read( - (block_index * block_size) + loc, - &mut buffer[progress..progress + chunk], - ); - - progress += chunk; - } - - Ok(count) - } - - pub fn make_dir_entry( - &self, - parent: DirCacheItem, - name: &str, - entry: &DiskDirEntry, - ) -> Option { - let inode = self.fs.upgrade()?.find_inode(entry.inode as usize)?; - Some(DirEntry::new(parent, inode, name.to_string())) - } - - pub fn entries(&self) -> &[(String, Box)] { - self.entries - .call_once(|| DirEntryIter::new(self.sref()).collect::>()) - } - - pub fn block_map(&self) -> &[u32] { - self.init_block_map(); - self.block_map.get().unwrap() + self.block_map.call_once(|| block_map) } pub fn sref(&self) -> Arc { @@ -463,6 +467,10 @@ impl INodeInterface for INode { } fn read_at(&self, offset: usize, usr_buffer: &mut [u8]) -> super::Result { + if !self.metadata()?.is_file() { + return Err(FileSystemError::NotSupported); + } + // TODO: We really should not allocate another buffer here. let mut buffer = Box::<[u8]>::new_uninit_slice(usr_buffer.len()); let count = self.read(offset, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; @@ -474,6 +482,22 @@ impl INodeInterface for INode { Ok(count) } + fn resolve_link(&self) -> super::Result { + if !self.metadata()?.is_symlink() { + return Err(FileSystemError::NotSupported); + } + + let path_len = self.inode.size_lower as usize; + let data_bytes: &[u8] = bytemuck::cast_slice(&self.inode.data_ptr); + + assert!(path_len <= data_bytes.len() - 1); + + let path_bytes = &data_bytes[..path_len]; + let path = core::str::from_utf8(path_bytes).or(Err(FileSystemError::InvalidPath))?; + + return Ok(path.into()); + } + fn mmap(&self, offset: usize, size: usize, flags: MMapFlags) -> super::Result { // TODO: support shared file mappings. assert!(!flags.contains(MMapFlags::MAP_SHARED)); @@ -554,7 +578,7 @@ impl Ext2 { pub fn new(block: Arc) -> Option> { let mut superblock = Box::::new_uninit(); - block.device().read_block(2, superblock.as_bytes_mut())?; + block.read_block(2, superblock.as_bytes_mut())?; // SAFETY: We have initialized the superblock above. let superblock = unsafe { superblock.assume_init() }; @@ -571,7 +595,7 @@ impl Ext2 { let bgdt_len = superblock.bgdt_len(); let mut bgdt = Box::<[GroupDescriptor]>::new_uninit_slice(bgdt_len); - block.device().read_block( + block.read_block( superblock.bgdt_sector(), MaybeUninit::slice_as_bytes_mut(&mut bgdt), )?; diff --git a/src/aero_kernel/src/fs/initramfs.rs b/src/aero_kernel/src/fs/initramfs.rs deleted file mode 100644 index 2cc9a953535..00000000000 --- a/src/aero_kernel/src/fs/initramfs.rs +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ - -use alloc::sync::Arc; -use cpio_reader::Mode; - -use crate::fs::{FileSystemError, Path}; - -use super::cache::DirCacheItem; -use super::ramfs::RamFs; - -use super::{root_dir, FileSystem, LookupMode, Result, MOUNT_MANAGER}; - -lazy_static::lazy_static! { - static ref INIT_FILESYSTEM: Arc = InitRamFs::new(); -} - -struct InitRamFs(Arc); - -impl InitRamFs { - pub fn new() -> Arc { - Arc::new(Self(RamFs::new())) - } -} - -impl FileSystem for InitRamFs { - fn root_dir(&self) -> DirCacheItem { - self.0.root_dir() - } -} - -pub(super) fn init() -> Result<()> { - lazy_static::initialize(&INIT_FILESYSTEM); - - let initrd_module = crate::INITRD_MODULE.get().unwrap(); - let initrd = unsafe { - core::slice::from_raw_parts( - initrd_module.base.as_ptr().unwrap(), - initrd_module.length as usize, - ) - }; - - let mut symlinks = alloc::vec![]; - - for entry in cpio_reader::iter_files(initrd) { - let path = Path::new(entry.name()); - - if entry.mode().contains(Mode::SYMBOLIK_LINK) { - // CPIO symbolically linked file's contain the target path as their contents. - let target = - core::str::from_utf8(entry.file()).map_err(|_| FileSystemError::InvalidPath)?; - - let (parent, _) = path.parent_and_basename(); - - // We need to create symbolically linked files at the end, after all the - // other files. - symlinks.push((alloc::format!("{}/{}", parent.as_str(), target), path)); - continue; - } - - let component_count = path.components().count(); - - let mut cwd = root_dir().clone(); - - for (i, component) in path.components().enumerate() { - if i == component_count - 1 { - cwd.inode().make_ramfs_inode(component, entry.file())?; - } else { - match cwd.inode().lookup(cwd.clone(), component) { - Ok(new_cwd) => cwd = new_cwd, - Err(FileSystemError::EntryNotFound) => { - cwd.inode().mkdir(component)?; - cwd = cwd.inode().lookup(cwd.clone(), component)?; - } - Err(error) => return Err(error), - } - } - } - } - - for (src, target) in symlinks { - let src = super::lookup_path_with(root_dir().clone(), Path::new(&src), LookupMode::None) - .expect(&alloc::format!("your mom {:?}", src)); - let (target_dir, target_name) = target.parent_and_basename(); - - let target = super::lookup_path_with(root_dir().clone(), target_dir, LookupMode::None) - .expect(&alloc::format!("your dad {:?}", target)); - target.inode().link(target_name, src.inode()).unwrap(); - } - - MOUNT_MANAGER.mount(root_dir().clone(), INIT_FILESYSTEM.clone())?; - Ok(()) -} diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 290ca8ca095..e0e134a5fbe 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -120,6 +120,17 @@ impl From for PollEventFlags { /// files on the disk, etc... #[downcastable] pub trait INodeInterface: Send + Sync { + /// Resolves the symbolically linked file and returns the relative path + /// to the file. + /// + /// ## Errors + /// - `FileSystemError::NotSupported` - If the inode is not a symbolic link or + /// the filesystem does not support symbolic + /// links. + fn resolve_link(&self) -> Result { + Err(FileSystemError::NotSupported) + } + /// Returns the inode metadata of `this` inode. fn metadata(&self) -> Result { Err(FileSystemError::NotSupported) @@ -266,7 +277,6 @@ impl Metadata { self.id } - #[inline] pub fn file_type(&self) -> FileType { self.file_type } @@ -277,16 +287,18 @@ impl Metadata { } /// Returns [`true`] if the file type of the inode is a directory. - #[inline] pub fn is_directory(&self) -> bool { self.file_type == FileType::Directory } /// Returns [`true`] if the file type of the inode is a socket. - #[inline] pub fn is_socket(&self) -> bool { self.file_type == FileType::Socket } + + pub fn is_symlink(&self) -> bool { + matches!(self.file_type, FileType::Symlink) + } } /// Enum representing the inner contents of a file. The file contents depend on the diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index 517e11b127b..488a9e22641 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -27,10 +27,8 @@ use crate::userland::scheduler; use crate::utils::sync::Mutex; use spin::Once; -use crate::fs::inode::FileType; - use self::cache::Cacheable; -use self::{cache::DirCacheItem, ramfs::RamFs}; +use self::cache::DirCacheItem; pub mod block; pub mod cache; @@ -39,13 +37,12 @@ pub mod epoll; pub mod eventfd; pub mod ext2; pub mod file_table; -pub mod initramfs; pub mod inode; pub mod pipe; pub mod procfs; pub mod ramfs; -static ROOT_FS: Once> = Once::new(); +static ROOT_FS: Once> = Once::new(); static ROOT_DIR: Once = Once::new(); lazy_static::lazy_static! { @@ -245,6 +242,7 @@ pub fn lookup_path_with( // After we have resolved all of the special cases that might occur in a path, now // we have to resolve the directory entry itself. For example `a` in `./a/`. let cache_entry = inode::fetch_dir_entry(cwd.clone(), String::from(component)); + let parent = cwd.clone(); if let Some(entry) = cache_entry { cwd = entry; @@ -270,7 +268,15 @@ pub fn lookup_path_with( } } - if cwd.inode().metadata()?.file_type == FileType::Directory { + let inode = cwd.inode(); + let metadata = inode.metadata()?; + + if metadata.is_symlink() { + let relative_path_str = inode.resolve_link()?; + let relative_path = Path::new(&relative_path_str); + + return lookup_path_with(parent, relative_path, LookupMode::None); + } else if metadata.is_directory() { if let Ok(mount_point) = MOUNT_MANAGER.find_mount(cwd.clone()) { cwd = mount_point.root_entry; } @@ -284,7 +290,7 @@ pub fn lookup_path_with( pub fn lookup_path_with_mode(path: &Path, mode: LookupMode) -> Result { let cwd = if !path.is_absolute() { - scheduler::get_scheduler().current_task().get_cwd_dirent() + scheduler::get_scheduler().current_task().cwd_dirent() } else { root_dir().clone() }; @@ -294,7 +300,7 @@ pub fn lookup_path_with_mode(path: &Path, mode: LookupMode) -> Result Result { let cwd = if !path.is_absolute() { - scheduler::get_scheduler().current_task().get_cwd_dirent() + scheduler::get_scheduler().current_task().cwd_dirent() } else { root_dir().clone() }; @@ -309,26 +315,15 @@ pub fn root_dir() -> &'static DirCacheItem { pub fn init() -> Result<()> { cache::init(); - let filesystem = RamFs::new(); - - ROOT_FS.call_once(|| filesystem.clone()); - ROOT_DIR.call_once(|| filesystem.root_dir().clone()); - - root_dir().inode().mkdir("dev")?; - root_dir().inode().mkdir("home")?; - root_dir().inode().mkdir("tmp")?; - root_dir().inode().mkdir("proc")?; - root_dir().inode().mkdir("var")?; - root_dir().inode().mkdir("mnt")?; - - initramfs::init()?; - log::info!("installed initramfs"); - - devfs::init()?; - log::info!("installed devfs"); + // root_dir().inode().mkdir("dev")?; + // root_dir().inode().mkdir("home")?; + // root_dir().inode().mkdir("tmp")?; + // root_dir().inode().mkdir("proc")?; + // root_dir().inode().mkdir("var")?; + // root_dir().inode().mkdir("mnt")?; - procfs::init()?; - log::info!("installed procfs"); + // initramfs::init()?; + // log::info!("installed initramfs"); Ok(()) } diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 7166cffce65..7e9f1f5d271 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -68,7 +68,6 @@ mod prelude { } } -use limine::LimineFile; #[prelude_import] pub use prelude::rust_2021::*; @@ -105,7 +104,6 @@ use self::userland::task::Task; static AERO_SYSTEM_ALLOCATOR: LockedHeap = LockedHeap::new_uninit(); static mut PHYSICAL_MEMORY_OFFSET: VirtAddr = VirtAddr::zero(); -static INITRD_MODULE: spin::Once<&LimineFile> = spin::Once::new(); const IO_VIRTUAL_BASE: VirtAddr = VirtAddr::new(0xffffff0000000000); diff --git a/src/aero_kernel/src/mem/vmalloc.rs b/src/aero_kernel/src/mem/vmalloc.rs index e10f4306458..e7d5de9b0b2 100644 --- a/src/aero_kernel/src/mem/vmalloc.rs +++ b/src/aero_kernel/src/mem/vmalloc.rs @@ -205,5 +205,8 @@ pub fn init() { /// ## Panics /// * If the `vmalloc` allocator is not initialized. pub(super) fn get_vmalloc() -> MutexGuard<'static, Vmalloc> { - VMALLOC.get().expect("get_vmalloc: not initialized").lock() + VMALLOC + .get() + .expect("get_vmalloc: not initialized") + .lock_irq() } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 7ad1d0fbf8f..5daca787792 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -169,7 +169,7 @@ pub fn mkdirat(dfd: usize, path: &Path) -> Result { // pathname is interpreted relative to the current working directory of the // calling task. if dfd as isize == aero_syscall::AT_FDCWD { - let cwd = scheduler::get_scheduler().current_task().get_cwd_dirent(); + let cwd = scheduler::get_scheduler().current_task().cwd_dirent(); (cwd.inode(), path.as_str()) } else { let handle = scheduler::get_scheduler() diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index 76fb159ffd6..b31452c634d 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -86,21 +86,21 @@ struct Cwd { } impl Cwd { - fn new() -> RwLock { + fn new() -> Self { let root = fs::root_dir().clone(); let fs = root.inode().weak_filesystem().unwrap().upgrade().unwrap(); - RwLock::new(Self { + Self { inode: root, filesystem: fs, - }) + } } - fn fork(&self) -> RwLock { - RwLock::new(Self { + fn fork(&self) -> Self { + Self { inode: self.inode.clone(), filesystem: self.filesystem.clone(), - }) + } } } @@ -195,7 +195,7 @@ pub struct Task { pub message_queue: MessageQueue, - cwd: RwLock, + cwd: RwLock>, pub(super) exit_status: AtomicIsize, } @@ -236,7 +236,7 @@ impl Task { parent: Mutex::new(None), signals: Signals::new(), - cwd: Cwd::new(), + cwd: RwLock::new(None), }) } @@ -273,7 +273,7 @@ impl Task { parent: Mutex::new(None), signals: Signals::new(), - cwd: Cwd::new(), + cwd: RwLock::new(None), }) } @@ -305,7 +305,7 @@ impl Task { children: Mutex::new(Default::default()), parent: Mutex::new(None), - cwd: self.cwd.read().fork(), + cwd: RwLock::new(Some(self.cwd.read().as_ref().unwrap().fork())), signals: Signals::new(), }); @@ -363,7 +363,7 @@ impl Task { children: Mutex::new(Default::default()), parent: Mutex::new(None), - cwd: self.cwd.read().fork(), + cwd: RwLock::new(Some(self.cwd.read().as_ref().unwrap().fork())), signals: Signals::new(), }); @@ -457,6 +457,10 @@ impl Task { argv: Option, envv: Option, ) -> Result<(), MapToError> { + if self.cwd.read().is_none() { + *self.cwd.write() = Some(Cwd::new()) + } + *self.executable.lock() = Some(executable.clone()); let vm = self.vm(); @@ -509,19 +513,19 @@ impl Task { self.tid } - pub fn get_cwd_dirent(&self) -> DirCacheItem { - self.cwd.read().inode.clone() + pub fn cwd_dirent(&self) -> DirCacheItem { + self.cwd.read().as_ref().unwrap().inode.clone() } pub fn get_cwd(&self) -> String { - self.cwd.read().inode.absolute_path_str() + self.cwd.read().as_ref().unwrap().inode.absolute_path_str() } pub fn set_cwd(&self, cwd: DirCacheItem) { let filesystem = cwd.inode().weak_filesystem().unwrap().upgrade().unwrap(); - self.cwd.write().inode = cwd; - self.cwd.write().filesystem = filesystem; + self.cwd.write().as_mut().unwrap().inode = cwd; + self.cwd.write().as_mut().unwrap().filesystem = filesystem; } fn get_parent(&self) -> Option> { diff --git a/tools/mkimage.sh b/tools/mkimage.sh index e2e6e581086..c5bcc7e2a4b 100755 --- a/tools/mkimage.sh +++ b/tools/mkimage.sh @@ -8,7 +8,15 @@ sudo mkfs.ext2 `cat loopback_dev`p1 -I128 rm -rf disk_image/ mkdir disk_image sudo mount `cat loopback_dev`p1 disk_image -sudo cp -r -v sysroot/system-root/* disk_image/ +sudo cp -r -v sysroot/system-root/. disk_image/ +pushd disk_image +sudo mkdir -p dev +sudo mkdir -p home +sudo mkdir -p tmp +sudo mkdir -p proc +sudo mkdir -p var +sudo mkdir -p mnt +popd sync sudo umount disk_image/ sudo losetup -d `cat loopback_dev` From be3c623d9a08d23e5fd930675d2eddb32ad7cb2d Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 26 Sep 2022 18:11:45 +1000 Subject: [PATCH 014/368] bashrc: set `TERM` env-var to "linux" Signed-off-by: Andy-Python-Programmer --- base-files/.bashrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/base-files/.bashrc b/base-files/.bashrc index bc8d04262b4..a326c4a1792 100644 --- a/base-files/.bashrc +++ b/base-files/.bashrc @@ -4,6 +4,8 @@ HISTCONTROL=ignoredups HISTSIZE=-1 HISTFILESIZE=-1 +TERM=linux + alias ls="ls --color=auto" alias clear='printf "\e[2J\e[H"' From 67821c18a7ed6f89efd73dfecc8e0c1f4a5ec17f Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 27 Sep 2022 11:52:36 +1000 Subject: [PATCH 015/368] block: page cache Signed-off-by: Andy-Python-Programmer --- aero.py | 5 ++ base-files/.bashrc | 2 +- src/aero_kernel/src/fs/block/mod.rs | 126 ++++++++++++++++++---------- src/aero_kernel/src/fs/epoll.rs | 11 ++- tools/mkimage.sh | 5 ++ 5 files changed, 97 insertions(+), 52 deletions(-) diff --git a/aero.py b/aero.py index 175edd7d75e..f339209b685 100755 --- a/aero.py +++ b/aero.py @@ -435,6 +435,11 @@ def prepare_iso(args, kernel_bin, user_bins): shutil.copy(os.path.join(limine_path, 'BOOTAA64.EFI'), efi_boot) shutil.copy(os.path.join(limine_path, 'BOOTX64.EFI'), efi_boot) + sysroot_dir = os.path.join(SYSROOT_DIR, 'system-root') + for file in user_bins: + bin_name = os.path.basename(file) + shutil.copy(file, os.path.join(sysroot_dir, "usr", "bin", bin_name)) + with open(os.path.join(iso_root, 'limine.cfg'), 'w') as limine_cfg: limine_cfg.write(LIMINE_TEMPLATE) diff --git a/base-files/.bashrc b/base-files/.bashrc index a326c4a1792..113a1e11098 100644 --- a/base-files/.bashrc +++ b/base-files/.bashrc @@ -4,7 +4,7 @@ HISTCONTROL=ignoredups HISTSIZE=-1 HISTFILESIZE=-1 -TERM=linux +export TERM=linux alias ls="ls --color=auto" alias clear='printf "\e[2J\e[H"' diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 1b0e65c9bf6..b0a3db9129d 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -19,7 +19,6 @@ mod gpt; -use alloc::boxed::Box; use gpt::Gpt; use core::mem::MaybeUninit; @@ -32,34 +31,92 @@ use crate::fs::devfs::install_device; use crate::fs::{FileSystem, Result}; use crate::fs::ext2::Ext2; +use crate::mem::paging::*; use crate::utils::sync::Mutex; -use super::cache::{Cache, Cacheable}; +use super::cache::{Cache, CacheArc, CacheItem, Cacheable}; use super::devfs::{alloc_device_marker, Device}; use super::inode::INodeInterface; -type CachedBlockKey = (usize, usize); // (block device pointer, block) +type PageCacheKey = (usize, usize); // (block device pointer, offset) +type PageCacheItem = CacheArc>; -struct CachedBlock { +struct CachedPage { device: Weak, - block: usize, - buffer: Box<[u8]>, + offset: usize, + page: PhysFrame, } -impl CachedBlock { - fn make_key(device: Weak, block: usize) -> CachedBlockKey { - (device.as_ptr() as *const u8 as usize, block) +impl CachedPage { + fn new(device: Weak, offset: usize) -> Self { + Self { + device, + offset, + page: FRAME_ALLOCATOR + .allocate_frame() + .expect("page_cache: out of memory"), + } + } + + fn data_mut(&self) -> &mut [MaybeUninit] { + let data_ptr = self + .page + .start_address() + .as_hhdm_virt() + .as_mut_ptr::>(); + + // SAFETY: It is safe to create a slice of MaybeUninit because it has the same + // size and alignment as T. + unsafe { core::slice::from_raw_parts_mut(data_ptr, Size4KiB::SIZE as usize) } + } + + fn make_key(device: Weak, offset: usize) -> PageCacheKey { + (device.as_ptr() as *const u8 as usize, offset) } } -impl Cacheable for CachedBlock { - fn cache_key(&self) -> CachedBlockKey { - Self::make_key(self.device.clone(), self.block) +impl Cacheable for CachedPage { + fn cache_key(&self) -> PageCacheKey { + Self::make_key(self.device.clone(), self.offset) } } lazy_static::lazy_static! { - static ref BLOCK_CACHE: Arc> = Cache::new(); + static ref PAGE_CACHE: Arc> = Cache::new(); +} + +impl Cache { + /// Returns the cached page at the given offset, if not present, it will be allocated, + /// initialized with the data on the disk and placed in the page cache. + /// + /// ## Arguments + /// + /// * `device` - The device to get the page from. + /// + /// * `offset` - The offset in bytes to the data. This will be rounded down to + /// the nearest page boundary. + pub fn get_page(&self, device: Weak, offset: usize) -> PageCacheItem { + let cache_offset = offset / Size4KiB::SIZE as usize; + let cache_key = CachedPage::make_key(device.clone(), cache_offset); + + if let Some(page) = PAGE_CACHE.get(cache_key) { + return page; + } + + let page = CachedPage::new(device.clone(), offset); + let device = device.upgrade().expect("page_cache: device dropped"); + + let aligned_offset = align_down(offset as u64, Size4KiB::SIZE) as usize; + + device + // FIXME(perf,mem): internally read_block makes use of the DMA API (cc drivers::nvme::dma), which in turn + // allocates another frame in order to make sure the destination buffer is DMA capable. In this + // case, this is not required since we have already allocated a DMA capable frame. + .read_block(aligned_offset / device.block_size(), page.data_mut()) + .expect("page_cache: failed to read block"); + + PAGE_CACHE.make_item_cached(page) + } } pub trait BlockDeviceInterface: Send + Sync { @@ -72,44 +129,23 @@ pub trait BlockDeviceInterface: Send + Sync { pub trait CachedAccess: BlockDeviceInterface { fn sref(&self) -> Weak; - fn read(&self, offset: usize, dest: &mut [MaybeUninit]) -> Option { - let mut progress = 0; - let block_size = self.block_size(); - - while progress < dest.len() { - let block = (offset + progress) / block_size; - let loc = (offset + progress) % block_size; + fn read(&self, mut offset: usize, dest: &mut [MaybeUninit]) -> Option { + let mut loc = 0; - let mut chunk = dest.len() - progress; + while loc < dest.len() { + let page = PAGE_CACHE.get_page(self.sref(), offset); - if chunk > (block_size - loc) { - chunk = block_size - loc; - } + let page_offset = offset % Size4KiB::SIZE as usize; + let size = core::cmp::min(Size4KiB::SIZE as usize - page_offset, dest.len() - loc); - let key = CachedBlock::make_key(self.sref(), block); - - if let Some(cached) = BLOCK_CACHE.get(key) { - MaybeUninit::write_slice( - &mut dest[progress..(progress + chunk)], - &cached.buffer[loc..loc + chunk], - ); - } else { - let mut buffer = Box::<[u8]>::new_uninit_slice(block_size); - - self.read_block(block, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; - dest[progress..(progress + chunk)].copy_from_slice(&buffer[loc..loc + chunk]); - - BLOCK_CACHE.make_item_cached(CachedBlock { - device: self.sref(), - block, - buffer: unsafe { buffer.assume_init() }, - }); - } + let data = &page.data_mut()[page_offset..page_offset + size]; + dest[loc..loc + size].copy_from_slice(data); - progress += chunk; + loc += size; + offset += align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; } - Some(progress) + Some(loc) } } diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index 8b2dc0d1d1a..86814754036 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -86,21 +86,20 @@ impl EPoll { Ok(()) } - /// Retrieves ready events, and delivers them to the caller-supplied event buffer. + /// Retrieves ready events, and delivers them to the caller-supplied event buffer and + /// returns the number of ready events if the call was successful. /// /// ## Arguments /// /// * `events`: Used to return information from the ready list about file descriptors in the - /// interest list that have some events available. + /// interest list that have some events available. /// /// * `max_events`: Maximum number of events. /// /// * `timeout`: specifies the minimum number of milliseconds that epoll wait will block. Specifying - /// a timeout of `-1` will block indefinitely. While specifing a timeout of `0` will return immediately - /// even if there are available no events. + /// a timeout of `-1` will block indefinitely. While specifing a timeout of `0` will return + /// immediately even if there are available no events. /// - /// ## Return - /// Returns the number of ready events if the call was successful. /// /// ## Blocking /// Blocks the current task until either: diff --git a/tools/mkimage.sh b/tools/mkimage.sh index c5bcc7e2a4b..808041cb608 100755 --- a/tools/mkimage.sh +++ b/tools/mkimage.sh @@ -1,3 +1,8 @@ +# sync the sysroot +echo "sysroot: syncing base-files" +cp -r base-files/. sysroot/system-root/ + +# make the disk image rm -rf disk.img dd if=/dev/zero bs=1G count=0 seek=512 of=disk.img From 13acc92dbed8a8786b1de9b767faaf35059c56db Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 27 Sep 2022 14:39:24 +1000 Subject: [PATCH 016/368] page_cache: read directly to the allocate page Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/block/ide/mod.rs | 9 +++ src/aero_kernel/src/drivers/block/nvme/mod.rs | 29 +++++---- src/aero_kernel/src/fs/block/mod.rs | 59 ++++++++++++++++--- 3 files changed, 76 insertions(+), 21 deletions(-) diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index 81e534b55bd..7e370c82299 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -70,6 +70,15 @@ impl BlockDeviceInterface for IdeDrive { todo!() } + fn read_dma( + &self, + _sector: usize, + _start: crate::mem::paging::PhysAddr, + _size: usize, + ) -> Option { + unimplemented!() + } + fn write_block(&self, _sector: usize, _buf: &[u8]) -> Option { unimplemented!() } diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 05b5b7e4565..43dee9996fb 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -231,11 +231,10 @@ struct Namespace<'a> { } impl<'a> Namespace<'a> { - fn read(&self, sector: usize, dest: &mut [MaybeUninit]) { - let size_bytes = dest.len(); - let blocks = size_bytes.ceil_div(self.block_size); + fn read(&self, sector: usize, start: PhysAddr, size_bytes: usize) { + assert!(size_bytes != 0); - let buffer = Dma::::new_uninit_slice(dest.len()); + let blocks = size_bytes.ceil_div(self.block_size); let mut read_cmd = ReadWriteCommand::default(); read_cmd.opcode = CommandOpcode::Read as u8; @@ -252,21 +251,16 @@ impl<'a> Namespace<'a> { let mut prps = self.prps.lock(); for i in 0..prp_num { - prps[i] - .write((buffer.addr().as_u64() + Size4KiB::SIZE) + (Size4KiB::SIZE * i as u64)); + prps[i].write((start.as_u64() + Size4KiB::SIZE) + (Size4KiB::SIZE * i as u64)); } - read_cmd.data_ptr.prp1 = buffer.addr().as_u64(); + read_cmd.data_ptr.prp1 = start.as_u64(); read_cmd.data_ptr.prp2 = prps.addr().as_u64(); } else { - read_cmd.data_ptr.prp1 = buffer.addr().as_u64(); + read_cmd.data_ptr.prp1 = start.as_u64(); } self.controller.io_queue.lock_irq().submit_command(read_cmd); - - // SAFETY: The buffer is initialized above. - let buffer = unsafe { buffer.assume_init() }; - MaybeUninit::write_slice(dest, &*buffer); } } @@ -468,8 +462,17 @@ impl<'a> Controller<'a> { } impl<'a> BlockDeviceInterface for Controller<'a> { + fn read_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option { + self.namespaces.lock()[0].read(sector, start, size); + Some(size) + } + fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { - self.namespaces.lock()[0].read(sector, dest); + let buffer = Dma::::new_uninit_slice(dest.len()); + self.namespaces.lock()[0].read(sector, buffer.addr(), dest.len()); + + // SAFETY: The buffer is initialized above. + dest.copy_from_slice(&buffer); Some(dest.len()) } diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index b0a3db9129d..eff137b2a58 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -70,6 +70,10 @@ impl CachedPage { unsafe { core::slice::from_raw_parts_mut(data_ptr, Size4KiB::SIZE as usize) } } + fn data_addr(&self) -> PhysAddr { + self.page.start_address() + } + fn make_key(device: Weak, offset: usize) -> PageCacheKey { (device.as_ptr() as *const u8 as usize, offset) } @@ -107,12 +111,10 @@ impl Cache { let device = device.upgrade().expect("page_cache: device dropped"); let aligned_offset = align_down(offset as u64, Size4KiB::SIZE) as usize; + let sector = aligned_offset / device.block_size(); device - // FIXME(perf,mem): internally read_block makes use of the DMA API (cc drivers::nvme::dma), which in turn - // allocates another frame in order to make sure the destination buffer is DMA capable. In this - // case, this is not required since we have already allocated a DMA capable frame. - .read_block(aligned_offset / device.block_size(), page.data_mut()) + .read_dma(sector, page.data_addr(), Size4KiB::SIZE as usize) .expect("page_cache: failed to read block"); PAGE_CACHE.make_item_cached(page) @@ -122,6 +124,8 @@ impl Cache { pub trait BlockDeviceInterface: Send + Sync { fn block_size(&self) -> usize; + fn read_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option; + fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option; fn write_block(&self, sector: usize, buf: &[u8]) -> Option; } @@ -147,6 +151,33 @@ pub trait CachedAccess: BlockDeviceInterface { Some(loc) } + + /// Writes the given data to the device at the given offset and returns the + /// number of bytes written. + /// + /// ## Notes + /// + /// * This function does **not** sync the written data to the disk. + fn write(&self, mut offset: usize, buffer: &[u8]) -> Option { + let mut loc = 0; + + while loc < buffer.len() { + let page = PAGE_CACHE.get_page(self.sref(), offset); + + let page_offset = offset % Size4KiB::SIZE as usize; + let size = core::cmp::min(Size4KiB::SIZE as usize - page_offset, buffer.len() - loc); + + MaybeUninit::write_slice( + &mut page.data_mut()[page_offset..page_offset + size], + &buffer[loc..loc + size], + ); + + loc += size; + offset += align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; + } + + Some(loc) + } } static BLOCK_DEVS: Mutex>> = Mutex::new(BTreeMap::new()); @@ -189,6 +220,10 @@ impl BlockDeviceInterface for BlockDevice { self.dev.block_size() } + fn read_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option { + self.dev.read_dma(sector, start, size) + } + fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { self.dev.read_block(sector, dest) } @@ -249,10 +284,6 @@ impl BlockDeviceInterface for PartitionBlockDevice { self.device.read_block(self.offset + sector, dest) } - fn block_size(&self) -> usize { - self.device.block_size() - } - fn write_block(&self, sector: usize, buf: &[u8]) -> Option { if sector >= self.size { return None; @@ -260,6 +291,18 @@ impl BlockDeviceInterface for PartitionBlockDevice { self.device.write_block(self.offset + sector, buf) } + + fn read_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option { + if sector >= self.size { + return None; + } + + self.device.read_dma(self.offset + sector, start, size) + } + + fn block_size(&self) -> usize { + self.device.block_size() + } } impl CachedAccess for PartitionBlockDevice { From e326b985e375419d5336bccc42464a412ada01d1 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 28 Sep 2022 18:51:51 +1000 Subject: [PATCH 017/368] ext2: file creation * file creation * block allocation * inode allocation * fix wrong offset being set in the page cache * appending a block to the inode Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/block/mod.rs | 16 +- src/aero_kernel/src/fs/ext2/disk.rs | 187 +++++++++ src/aero_kernel/src/fs/ext2/group_desc.rs | 216 ++++++++++ src/aero_kernel/src/fs/ext2/mod.rs | 471 ++++++++-------------- 4 files changed, 574 insertions(+), 316 deletions(-) create mode 100644 src/aero_kernel/src/fs/ext2/disk.rs create mode 100644 src/aero_kernel/src/fs/ext2/group_desc.rs diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index eff137b2a58..31178d6e1f4 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -107,7 +107,7 @@ impl Cache { return page; } - let page = CachedPage::new(device.clone(), offset); + let page = CachedPage::new(device.clone(), cache_offset); let device = device.upgrade().expect("page_cache: device dropped"); let aligned_offset = align_down(offset as u64, Size4KiB::SIZE) as usize; @@ -145,8 +145,10 @@ pub trait CachedAccess: BlockDeviceInterface { let data = &page.data_mut()[page_offset..page_offset + size]; dest[loc..loc + size].copy_from_slice(data); + core::mem::forget(page); + loc += size; - offset += align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; + offset = align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; } Some(loc) @@ -172,8 +174,10 @@ pub trait CachedAccess: BlockDeviceInterface { &buffer[loc..loc + size], ); + core::mem::forget(page); + loc += size; - offset += align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; + offset = align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; } Some(loc) @@ -305,12 +309,6 @@ impl BlockDeviceInterface for PartitionBlockDevice { } } -impl CachedAccess for PartitionBlockDevice { - fn sref(&self) -> Weak { - self.sref.clone() - } -} - pub fn launch() -> Result<()> { let mut blocks_copy = Vec::>::new(); diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs new file mode 100644 index 00000000000..573c7c2dabb --- /dev/null +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -0,0 +1,187 @@ +use crate::utils::CeilDiv; + +use super::FileType; + +#[derive(Debug, Copy, Clone)] +#[repr(C, packed)] +pub struct SuperBlock { + pub inodes_count: u32, + pub blocks_count: u32, + pub r_blocks_count: u32, + pub free_blocks_count: u32, + pub free_inodes_count: u32, + pub first_data_block: u32, + pub log_block_size: u32, + pub log_frag_size: u32, + pub blocks_per_group: u32, + pub frags_per_group: u32, + pub inodes_per_group: u32, + pub mtime: u32, + pub wtime: u32, + pub mnt_count: u16, + pub max_mnt_count: u16, + pub magic: u16, + pub state: u16, + pub errors: u16, + pub minor_rev_level: u16, + pub lastcheck: u32, + pub checkinterval: u32, + pub creator_os: u32, + pub rev_level: u32, + pub def_resuid: u16, + pub def_gid: u16, + + // Extended Superblock fields + // + // XXX: If version number >= 1, we have to use the ext2 extended superblock as well :) + pub first_ino: u32, + pub inode_size: u16, + pub block_group_nr: u16, + pub feature_compat: u32, + pub feature_incompat: u32, + pub feature_ro_compat: u32, + pub uuid: [u64; 2usize], + pub volume_name: [u8; 16usize], + pub last_mounted: [u64; 8usize], + pub compression_info: u32, + pub prealloc_blocks: u8, + pub prealloc_dir_blocks: u8, + pub reserved_gdt_blocks: u16, + pub journal_uuid: [u8; 16usize], + pub journal_inum: u32, + pub journal_dev: u32, + pub last_orphan: u32, + pub hash_seed: [u32; 4usize], + pub def_hash_version: u8, + pub jnl_backup_type: u8, + pub group_desc_size: u16, + pub default_mount_opts: u32, + pub first_meta_bg: u32, + pub mkfs_time: u32, + pub jnl_blocks: [u32; 17usize], +} + +impl SuperBlock { + pub const MAGIC: u16 = 0xef53; + + /// Returns the number of entries per block. + pub fn entries_per_block(&self) -> usize { + self.block_size() / core::mem::size_of::() + } + + /// Returns the size of a block in bytes. + pub fn block_size(&self) -> usize { + 1024usize << self.log_block_size + } + + /// Returns the length of the BGDT. + pub fn bgdt_len(&self) -> usize { + self.blocks_count.ceil_div(self.blocks_per_group) as usize + } + + pub fn bgdt_block(&self) -> usize { + // XXX: The block group descriptors are always located in the block immediately + // following the superblock. + let block_size = self.block_size(); + + if block_size >= 2048 { + block_size + } else { + block_size * 2 + } + } +} + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct GroupDescriptor { + pub block_bitmap: u32, + pub inode_bitmap: u32, + pub inode_table: u32, + pub free_blocks_count: u16, + pub free_inodes_count: u16, + pub used_dirs_count: u16, + pub pad: u16, + pub reserved: [u8; 12usize], +} + +const_assert_eq!(core::mem::size_of::(), 32); + +#[derive(Debug, Copy, Clone)] +#[repr(C, packed)] +pub struct DirEntry { + pub inode: u32, + pub entry_size: u16, + pub name_size: u8, + pub file_type: u8, +} + +impl DirEntry { + pub fn set_name(&mut self, name: &str) { + assert!(name.len() < u8::MAX as usize); + + self.name_size = name.len() as u8; + + // SAFETY: Above we have verified that the name will fit in the entry. + let name_ptr = unsafe { (self as *mut _ as *mut u8).add(core::mem::size_of::()) }; + let name_bytes = unsafe { core::slice::from_raw_parts_mut(name_ptr, name.len()) }; + + name_bytes.copy_from_slice(name.as_bytes()); + } + + pub fn avaliable_size(&self) -> usize { + if self.inode == 0 { + self.entry_size as usize + } else { + 0 + } + } + + pub fn as_bytes(&self) -> &[u8] { + unsafe { + core::slice::from_raw_parts(self as *const Self as *const u8, self.entry_size as usize) + } + } +} + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct INode { + type_and_perm: u16, + pub user_id: u16, + pub size_lower: u32, + pub last_access: u32, + pub creation_time: u32, + pub last_modification: u32, + pub deletion_time: u32, + pub group_id: u16, + pub hl_count: u16, + pub block_count: u32, + pub flags: u32, + pub os_specific: u32, + pub data_ptr: [u32; 15], + pub gen_number: u32, + pub ext_attr_block: u32, + pub size_or_acl: u32, + pub fragment_address: u32, + pub os_specific2: [u8; 12], +} + +impl INode { + pub fn file_type(&self) -> FileType { + let ty = self.type_and_perm >> 12; + + match ty { + 0x1 => FileType::Fifo, + 0x2 => FileType::CharDev, + 0x4 => FileType::Directory, + 0x6 => FileType::BlockDev, + 0x8 => FileType::File, + 0xa => FileType::Symlink, + 0xc => FileType::Socket, + _ => FileType::Unknown, + } + } +} + +const_assert_eq!(core::mem::size_of::(), 128); diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs new file mode 100644 index 00000000000..dbabf429fe0 --- /dev/null +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -0,0 +1,216 @@ +use core::mem::MaybeUninit; + +use alloc::boxed::Box; +use alloc::sync::{Arc, Weak}; + +use bit_field::BitField; +use spin::RwLock; + +use crate::fs::block::{BlockDevice, CachedAccess}; +use crate::fs::cache::INodeCacheItem; + +use super::{disk, Ext2}; + +pub struct GroupDescriptors { + descriptors: RwLock>, + ext2: Weak, +} + +impl GroupDescriptors { + /// Reads the block group descriptors from the disk. + /// + /// ## Arguments + /// + /// * `ext2` - Weak pointer to the EXT2 filesystem. This function does not call `upgrade` on + /// the pointer so, it is valid to pass a semi-constructed `Arc` pointer (e.g + /// through `Arc::new_cyclic`) though invoking other functions on the group descriptors + /// require the pointer to be fully constructed). + /// + /// * `superblock` - Reference to the EXT2 superblock. + /// + /// * `device` - Block device to read the group descriptors from. + pub fn new( + ext2: Weak, + device: Arc, + superblock: &disk::SuperBlock, + ) -> Option { + let bgdt_len = superblock.bgdt_len(); + let mut bgdt = Box::<[disk::GroupDescriptor]>::new_uninit_slice(bgdt_len); + + device.read( + superblock.bgdt_block(), + MaybeUninit::slice_as_bytes_mut(&mut bgdt), + )?; + + // SAFETY: We have initialized the BGD (Block Group Descriptor Table) above. + let bgdt = unsafe { bgdt.assume_init() }; + Some(Self { + descriptors: RwLock::new(bgdt), + ext2, + }) + } + + // XXX: The free inodes are managed by bitmaps. An EXT2 filesystem contains + // several block groups where each group contains a bitmap for blocks and + // a bitmap for inodes and their free counts. The group descriptors are located + // after the super block. + + /// Returns the index of the block group which has free block(s) + /// avaliable. + pub fn find_free_block(&self) -> Option { + let (index, _) = self + .descriptors + .read() + .iter() + .enumerate() + .find(|(_, e)| e.free_blocks_count >= 1)?; + + Some(index) + } + + /// Returns the index of the block group which has free inode(s) + /// avaliable. + pub fn find_free_inode(&self) -> Option { + let (index, _) = self + .descriptors + .read() + .iter() + .enumerate() + .find(|(_, e)| e.free_inodes_count >= 1)?; + + Some(index) + } + + pub fn find_inode(&self, id: usize) -> Option> { + let fs = self.ext2.upgrade()?; + let this = self.descriptors.read(); + let superblock = &fs.superblock; + + // There is one inode table per block group and can be located by + // the `inode_table` offset in the group descriptor. Also there are + // `inodes_per_group` inodes per table. + let ino_per_group = superblock.inodes_per_group as usize; + + let ino_block_group = (id - 1) / ino_per_group; + let ino_table_index = (id - 1) % ino_per_group; + + let group_descriptor = this[ino_block_group]; + let table_offset = group_descriptor.inode_table as usize * superblock.block_size(); + + let mut inode = Box::::new_uninit(); + + fs.block.read( + table_offset + (ino_table_index * core::mem::size_of::()), + inode.as_bytes_mut(), + )?; + + // SAFETY: We have initialized the inode above. + let inode = unsafe { inode.assume_init() }; + Some(inode) + } + + /// Allocates a block pointer using the first fit allocation strategy. + pub fn alloc_block_ptr(&self) -> Option { + let fs = self.ext2.upgrade()?; + let blocks_per_group = fs.superblock.blocks_per_group as usize; + + if let Some(block_group_idx) = self.find_free_block() { + let mut descriptors = self.descriptors.write(); + let block_group = &mut descriptors[block_group_idx]; + + let mut bitmap = Bitmap::new(fs.clone(), block_group.block_bitmap as usize)?; + let block_id = block_group_idx * blocks_per_group + bitmap.alloc()?; + + block_group.free_blocks_count -= 1; + drop(descriptors); + + // TODO: decrement the number of free blocks in the superblock. + return Some(block_id); + } + + None + } + + /// Allocates a new inode using the first fit allocation strategy. + pub fn alloc_inode(&self) -> Option { + let fs = self.ext2.upgrade()?; + let ino_per_group = fs.superblock.inodes_per_group as usize; + + if let Some(block_group_idx) = self.find_free_inode() { + let mut descriptors = self.descriptors.write(); + let block_group = &mut descriptors[block_group_idx]; + + let mut bitmap = Bitmap::new(fs.clone(), block_group.inode_bitmap as usize)?; + // Since inode numbers start from 1 rather than 0, the first bit in the first block + // group's inode bitmap represent inode number 1. Thus, we add 1 to the allocated + // inode number. + let inode_id = block_group_idx * ino_per_group + bitmap.alloc()? + 1; + + block_group.free_inodes_count -= 1; + drop(descriptors); // release the lock + + return fs.find_inode(inode_id); + } + + None + } +} + +struct Bitmap { + bitmap: Box<[u8]>, + fs: Weak, + offset: usize, +} + +impl Bitmap { + /// Reads the bitmap at `block` from the disk. The bitmap is required have + /// a size of `block_size` bytes. + /// + /// **Note**: Any changes to the bitmap will be written back to the disk when the + /// bitmap has been dropped. + fn new(fs: Arc, block: usize) -> Option { + let block_size = fs.superblock.block_size(); + let offset = block * block_size; + + let mut bitmap = Box::<[u8]>::new_uninit_slice(block_size); + + fs.block.read(offset, &mut bitmap)?; + + // SAFETY: We have initialized the bitmap above. + let bitmap = unsafe { bitmap.assume_init() }; + + Some(Self { + bitmap, + offset, + fs: Arc::downgrade(&fs), + }) + } + + /// Allocates a free bit in the bitmap and returns its index. + pub fn alloc(&mut self) -> Option { + for (i, e) in self.bitmap.iter_mut().enumerate() { + if *e != u8::MAX { + for bit in 0..8 { + if e.get_bit(bit) == false { + e.set_bit(bit, true); + + return Some(i * 8 + bit); + } + } + } + } + + None + } +} + +impl Drop for Bitmap { + fn drop(&mut self) { + let fs = self + .fs + .upgrade() + .expect("ext2: filesystem has been dropped"); + + fs.block.write(self.offset, &self.bitmap); + } +} diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 4241829e1ef..8b36caff5f9 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -17,19 +17,23 @@ * along with Aero. If not, see . */ +mod disk; +mod group_desc; + use core::mem::MaybeUninit; use aero_syscall::MMapFlags; use alloc::boxed::Box; use alloc::string::ToString; use alloc::sync::{Arc, Weak}; -use alloc::vec::Vec; -use spin::Once; +use spin::RwLock; use crate::fs::block::BlockDeviceInterface; use crate::fs::cache::CachedINode; +use crate::fs::ext2::disk::SuperBlock; use crate::mem::paging::{FrameAllocator, PhysFrame, FRAME_ALLOCATOR}; -use crate::utils::CeilDiv; + +use self::group_desc::GroupDescriptors; use super::block::{BlockDevice, CachedAccess}; @@ -39,105 +43,6 @@ use super::{cache, FileSystemError}; use super::inode::{DirEntry, INodeInterface, Metadata}; use super::FileSystem; -#[derive(Debug, Copy, Clone)] -#[repr(C, packed)] -pub struct SuperBlock { - pub inodes_count: u32, - pub blocks_count: u32, - pub r_blocks_count: u32, - pub free_blocks_count: u32, - pub free_inodes_count: u32, - pub first_data_block: u32, - pub log_block_size: u32, - pub log_frag_size: u32, - pub blocks_per_group: u32, - pub frags_per_group: u32, - pub inodes_per_group: u32, - pub mtime: u32, - pub wtime: u32, - pub mnt_count: u16, - pub max_mnt_count: u16, - pub magic: u16, - pub state: u16, - pub errors: u16, - pub minor_rev_level: u16, - pub lastcheck: u32, - pub checkinterval: u32, - pub creator_os: u32, - pub rev_level: u32, - pub def_resuid: u16, - pub def_gid: u16, - - // Extended Superblock fields - // - // XXX: If version number >= 1, we have to use the ext2 extended superblock as well :) - pub first_ino: u32, - pub inode_size: u16, - pub block_group_nr: u16, - pub feature_compat: u32, - pub feature_incompat: u32, - pub feature_ro_compat: u32, - pub uuid: [u64; 2usize], - pub volume_name: [u8; 16usize], - pub last_mounted: [u64; 8usize], - pub compression_info: u32, - pub prealloc_blocks: u8, - pub prealloc_dir_blocks: u8, - pub reserved_gdt_blocks: u16, - pub journal_uuid: [u8; 16usize], - pub journal_inum: u32, - pub journal_dev: u32, - pub last_orphan: u32, - pub hash_seed: [u32; 4usize], - pub def_hash_version: u8, - pub jnl_backup_type: u8, - pub group_desc_size: u16, - pub default_mount_opts: u32, - pub first_meta_bg: u32, - pub mkfs_time: u32, - pub jnl_blocks: [u32; 17usize], -} - -impl SuperBlock { - const MAGIC: u16 = 0xef53; - - /// Returns the size of a block in bytes. - pub fn block_size(&self) -> usize { - 1024usize << self.log_block_size - } - - /// Returns the length of the BGDT. - pub fn bgdt_len(&self) -> usize { - self.blocks_count.ceil_div(self.blocks_per_group) as usize - } - - /// Returns the sector where the BGDT starts. - pub fn bgdt_sector(&self) -> usize { - // XXX: The block group descriptors are always located in the block immediately - // following the superblock. - match self.block_size() { - 1024 => 4, - x if x > 1024 => x / 512, - _ => unreachable!(), - } - } -} - -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct GroupDescriptor { - pub block_bitmap: u32, - pub inode_bitmap: u32, - pub inode_table: u32, - pub free_blocks_count: u16, - pub free_inodes_count: u16, - pub used_dirs_count: u16, - pub pad: u16, - pub reserved: [u8; 12usize], -} - -const_assert_eq!(core::mem::size_of::(), 32); - #[derive(PartialEq)] pub enum FileType { Fifo, @@ -162,58 +67,13 @@ impl From for super::inode::FileType { } } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone)] -pub struct DiskINode { - type_and_perm: u16, - pub user_id: u16, - pub size_lower: u32, - pub last_access: u32, - pub creation_time: u32, - pub last_modification: u32, - pub deletion_time: u32, - pub group_id: u16, - pub hl_count: u16, - pub block_count: u32, - pub flags: u32, - pub os_specific: u32, - pub data_ptr: [u32; 15], - pub gen_number: u32, - pub ext_attr_block: u32, - pub size_or_acl: u32, - pub fragment_address: u32, - pub os_specific2: [u8; 12], -} - -impl DiskINode { - pub fn file_type(&self) -> FileType { - let ty = self.type_and_perm >> 12; - - match ty { - 0x1 => FileType::Fifo, - 0x2 => FileType::CharDev, - 0x4 => FileType::Directory, - 0x6 => FileType::BlockDev, - 0x8 => FileType::File, - 0xa => FileType::Symlink, - 0xc => FileType::Socket, - _ => FileType::Unknown, - } - } -} - -const_assert_eq!(core::mem::size_of::(), 128); - pub struct INode { id: usize, fs: Weak, - inode: Box, + inode: RwLock>, // TODO: Do not store this in the inode, but rather in a different // cache using the API provided by fs::cache (consider LRU only?). - block_map: Once>, - entries: Once)>>, - sref: Weak, } @@ -228,39 +88,14 @@ impl INode { Some(inode) } else { let fs = ext2.upgrade()?; - let superblock = &fs.superblock; - - // There is one inode table per block group and can be located by - // the `inode_table` offset in the group descriptor. Also there are - // `inodes_per_group` inodes per table. - let ino_per_group = superblock.inodes_per_group as usize; - - let ino_block_group = (id - 1) / ino_per_group; - let ino_table_index = (id - 1) % ino_per_group; - - let group_descriptor = &fs.bgdt[ino_block_group]; - - let table_offset = group_descriptor.inode_table as usize * superblock.block_size(); - - let mut inode = Box::::new_uninit(); - - fs.block.read( - table_offset + (ino_table_index * core::mem::size_of::()), - inode.as_bytes_mut(), - )?; - - // SAFETY: We have initialized the inode above. - let inode = unsafe { inode.assume_init() }; + let inode = fs.bgdt.find_inode(id)?; Some( icache.make_item_cached(CachedINode::new(Arc::new_cyclic(|sref| Self { - inode, + inode: RwLock::new(inode), id, fs: ext2, - block_map: Once::new(), - entries: Once::new(), - sref: sref.clone(), }))), ) @@ -268,12 +103,13 @@ impl INode { } pub fn read(&self, offset: usize, buffer: &mut [MaybeUninit]) -> super::Result { + let inode = self.inode.read(); let filesystem = self.fs.upgrade().unwrap(); let block_size = filesystem.superblock.block_size(); let mut progress = 0; - let count = core::cmp::min(self.inode.size_lower as usize - offset, buffer.len()); + let count = core::cmp::min(inode.size_lower as usize - offset, buffer.len()); while progress < count { let block = (offset + progress) / block_size; @@ -285,12 +121,15 @@ impl INode { chunk = block_size - loc; } - let block_index = self.block_map()[block] as usize; + let block_index = self.get_block(block).unwrap() as usize; - filesystem.block.read( - (block_index * block_size) + loc, - &mut buffer[progress..progress + chunk], - ); + filesystem + .block + .read( + (block_index * block_size) + loc, + &mut buffer[progress..progress + chunk], + ) + .expect("inode: read failed"); progress += chunk; } @@ -298,104 +137,95 @@ impl INode { Ok(count) } - pub fn make_dir_entry( - &self, - parent: DirCacheItem, - name: &str, - entry: &DiskDirEntry, - ) -> Option { - let inode = self.fs.upgrade()?.find_inode(entry.inode as usize)?; - Some(DirEntry::new(parent, inode, name.to_string())) - } + /// Allocates and appends a new block to the inode. + pub fn append_block(&self) -> Option { + let fs = self.fs.upgrade().expect("ext2: filesystem was dropped"); + let block_size = fs.superblock.block_size(); - pub fn entries(&self) -> &[(String, Box)] { - self.entries - .call_once(|| DirEntryIter::new(self.sref()).collect::>()) - } + let new_block = fs.bgdt.alloc_block_ptr()?; + let data_ptrs = self.inode.read().data_ptr; - pub fn block_map(&self) -> &[u32] { - if let Some(map) = self.block_map.get() { - return map; - } + // Check if the there are free direct data pointers avaliable to + // insert the new block.. + for (i, block) in data_ptrs[..12].iter().enumerate() { + if *block == 0 { + drop(data_ptrs); - // The block map is not cached, so we need to make it. - let filesystem = self.fs.upgrade().unwrap(); - let block_size = filesystem.superblock.block_size(); + let mut inode = self.inode.write(); + inode.data_ptr[i] = new_block as u32; + inode.size_lower += block_size as u32; - let entries_per_block = block_size / core::mem::size_of::(); - let mut block_map = Box::<[u32]>::new_uninit_slice(self.inode.block_count as usize); + return Some(new_block); + } + } - let mut i = 0; + todo!("append_block: indirect blocks") + } + pub fn get_block(&self, mut block: usize) -> Option { // There are pointers to the first 12 blocks which contain the file's // data in the inode. There is a pointer to an indirect block (which // contains pointers to the next set of blocks), a pointer to a doubly - // indirect block and a pointer to a treply indirect block. - while i < block_map.len() { - let mut block = i; - if block < 12 { - // direct block - block_map[i].write(self.inode.data_ptr[block]); - } else { - // indirect block - block -= 12; - - if block >= entries_per_block { - // doubly indirect block - block -= entries_per_block; - - let index = block / entries_per_block; - let mut indirect_block = MaybeUninit::::uninit(); - - if index >= entries_per_block { - // treply indirect block - todo!() - } else { - let block_ptrs = self.inode.data_ptr[13] as usize * block_size; - let offset = block_ptrs + (index * core::mem::size_of::()); - - filesystem - .block - .read(offset, indirect_block.as_bytes_mut()) - .unwrap(); - } - - // SAFETY: We have initialized the indirect block variable above. - let indirect_block = unsafe { indirect_block.assume_init() } as usize; - - for j in 0..entries_per_block { - if (i + j) >= block_map.len() { - // SAFETY: We have fully initialized the block map. - let block_map = unsafe { block_map.assume_init() }; - return self.block_map.call_once(|| block_map); - } - - let offset = indirect_block * block_size + j * core::mem::size_of::(); - filesystem - .block - .read(offset, block_map[i + j].as_bytes_mut()) - .unwrap(); - } - - i += entries_per_block - 1; - } else { - // singly indirect block - let block_ptrs = self.inode.data_ptr[12] as usize * block_size; - let offset = block_ptrs + (block * core::mem::size_of::()); - - filesystem - .block - .read(offset, block_map[i].as_bytes_mut()) - .expect("init_block_map: failed to read singly indirect block"); - } - } + // indirect block and a pointer to a triply indirect block. + if block < 12 { + // direct block + return Some(self.inode.read().data_ptr[block]); + } + + // indirect block + block -= 12; + + let fs = self.fs.upgrade()?; + let superblock = &fs.superblock; + + let entries_per_block = superblock.entries_per_block(); + let block_size = superblock.block_size(); + + if block <= entries_per_block { + // singly indirect block + let block_ptrs = self.inode.read().data_ptr[12] as usize * block_size; + let offset = block_ptrs + (block * core::mem::size_of::()); + + let mut res = MaybeUninit::::uninit(); + fs.block.read(offset, res.as_bytes_mut()); - i += 1; + // SAFETY: We have initialized the variable above. + return Some(unsafe { res.assume_init() }); } - // SAFETY: We have fully initialized the block map. - let block_map = unsafe { block_map.assume_init() }; - self.block_map.call_once(|| block_map) + block -= entries_per_block; + + if block <= entries_per_block { + // doubly indirect block + let block_ptrs = self.inode.read().data_ptr[13] as usize * block_size; + let offset = block_ptrs + ((block / entries_per_block) * core::mem::size_of::()); + + let mut indirect_block = MaybeUninit::::uninit(); + fs.block.read(offset, indirect_block.as_bytes_mut()); + + // SAFETY: We have initialized the variable above. + let indirect_block = unsafe { indirect_block.assume_init() } as usize * block_size; + + let offset = indirect_block + entries_per_block * core::mem::size_of::(); + + let mut res = MaybeUninit::::uninit(); + fs.block.read(offset, res.as_bytes_mut()); + + // SAFETY: We have initialized the variable above. + return Some(unsafe { res.assume_init() }); + } + + todo!("triply indirect block") + } + + pub fn make_dir_entry( + &self, + parent: DirCacheItem, + name: &str, + entry: &disk::DirEntry, + ) -> Option { + let inode = self.fs.upgrade()?.find_inode(entry.inode as usize)?; + Some(DirEntry::new(parent, inode, name.to_string())) } pub fn sref(&self) -> Arc { @@ -409,10 +239,12 @@ impl INodeInterface for INode { } fn metadata(&self) -> super::Result { + let inode = self.inode.read(); + Ok(Metadata { id: self.id, - file_type: self.inode.file_type().into(), - size: self.inode.size_lower as _, + file_type: inode.file_type().into(), + size: inode.size_lower as _, children_len: 0, }) } @@ -421,6 +253,8 @@ impl INodeInterface for INode { use super::inode::FileType; use aero_syscall::{Mode, Stat}; + let inode = self.inode.read(); + let filesystem = self.fs.upgrade().unwrap(); let filetype = self.metadata()?.file_type(); @@ -440,7 +274,7 @@ impl INodeInterface for INode { Ok(Stat { st_ino: self.id as _, st_blksize: filesystem.superblock.block_size() as _, - st_size: self.inode.size_lower as _, + st_size: inode.size_lower as _, st_mode: mode, ..Default::default() @@ -448,20 +282,17 @@ impl INodeInterface for INode { } fn dirent(&self, parent: DirCacheItem, index: usize) -> super::Result> { - if let Some((name, entry)) = self.entries().get(index) { - Ok(self.make_dir_entry(parent, name, entry)) + if let Some((name, entry)) = DirEntryIter::new(self.sref()).nth(index) { + Ok(self.make_dir_entry(parent, &name, &entry)) } else { Ok(None) } } fn lookup(&self, parent: DirCacheItem, name: &str) -> super::Result { - let (name, entry) = self - .entries() - .iter() + let (name, entry) = DirEntryIter::new(self.sref()) .find(|(ename, _)| ename == name) - .ok_or(FileSystemError::EntryNotFound) - .cloned()?; + .ok_or(FileSystemError::EntryNotFound)?; Ok(self.make_dir_entry(parent, &name, &entry).unwrap()) } @@ -482,13 +313,54 @@ impl INodeInterface for INode { Ok(count) } + fn touch(&self, parent: DirCacheItem, name: &str) -> super::Result { + let fs = self.fs.upgrade().expect("ext2: filesystem was dropped"); + let inode = fs.bgdt.alloc_inode().ok_or(FileSystemError::EntryExists)?; + + let ext2_inode = inode.downcast_arc::().expect("ext2: invalid inode"); + + log::debug!( + "ext2: allocated inode alloced_id={} this_id={}", + ext2_inode.id, + self.id + ); + + let dirent_size = name.len() + core::mem::size_of::(); + + if let Some((_name, _entry)) = + DirEntryIter::new(self.sref()).find(|(_, e)| e.avaliable_size() >= dirent_size) + { + todo!() + } else { + let block = self.append_block().unwrap(); + let block_size = fs.superblock.block_size(); + + let mut entry = Box::::new_uninit(); + fs.block.read(block * block_size, entry.as_bytes_mut()); + + // SAFETY: We have initialized the entry above. + let mut entry = unsafe { entry.assume_init() }; + + entry.entry_size = block_size as _; + entry.inode = ext2_inode.id as _; + entry.file_type = 2; + entry.set_name(name); + + fs.block.write(block * block_size, entry.as_bytes()); + } + + Ok(DirEntry::new(parent, inode, name.to_string())) + } + fn resolve_link(&self) -> super::Result { if !self.metadata()?.is_symlink() { return Err(FileSystemError::NotSupported); } - let path_len = self.inode.size_lower as usize; - let data_bytes: &[u8] = bytemuck::cast_slice(&self.inode.data_ptr); + let inode = self.inode.read(); + + let path_len = inode.size_lower as usize; + let data_bytes: &[u8] = bytemuck::cast_slice(&inode.data_ptr); assert!(path_len <= data_bytes.len() - 1); @@ -511,15 +383,6 @@ impl INodeInterface for INode { } } -#[derive(Debug, Copy, Clone)] -#[repr(C, packed)] -pub struct DiskDirEntry { - inode: u32, - entry_size: u16, - name_size: u8, - file_type: u8, -} - pub struct DirEntryIter { inode: Arc, offset: usize, @@ -532,26 +395,30 @@ impl DirEntryIter { } impl Iterator for DirEntryIter { - type Item = (String, Box); + type Item = (String, Box); fn next(&mut self) -> Option { - let file_size = self.inode.inode.size_lower as usize; + let file_size = self.inode.inode.read().size_lower as usize; - if self.offset + core::mem::size_of::() > file_size { + if self.offset + core::mem::size_of::() > file_size { return None; } - let mut entry = Box::::new_uninit(); + let mut entry = Box::::new_uninit(); self.inode.read(self.offset, entry.as_bytes_mut()).ok()?; // SAFETY: We have initialized the entry above. let entry = unsafe { entry.assume_init() }; + if entry.inode == 0 { + return None; + } + let mut name = Box::<[u8]>::new_uninit_slice(entry.name_size as usize); self.inode .read( - self.offset + core::mem::size_of::(), + self.offset + core::mem::size_of::(), MaybeUninit::slice_as_bytes_mut(&mut name), ) .ok()?; @@ -567,7 +434,7 @@ impl Iterator for DirEntryIter { pub struct Ext2 { superblock: Box, - bgdt: Box<[GroupDescriptor]>, + bgdt: GroupDescriptors, block: Arc, sref: Weak, @@ -589,22 +456,12 @@ impl Ext2 { assert_eq!( superblock.inode_size as usize, - core::mem::size_of::() + core::mem::size_of::() ); - let bgdt_len = superblock.bgdt_len(); - let mut bgdt = Box::<[GroupDescriptor]>::new_uninit_slice(bgdt_len); - - block.read_block( - superblock.bgdt_sector(), - MaybeUninit::slice_as_bytes_mut(&mut bgdt), - )?; - - // SAFETY: We have initialized the BGD (Block Group Descriptor Table) above. - let bgdt = unsafe { bgdt.assume_init() }; - Some(Arc::new_cyclic(|sref| Self { - bgdt, + bgdt: GroupDescriptors::new(sref.clone(), block.clone(), &superblock) + .expect("ext2: failed to read group descriptors"), superblock, block, From 67c8a3826abb4a54981276d750a679c060584d8e Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 30 Sep 2022 16:06:24 +1000 Subject: [PATCH 018/368] kernel: remove feature request `const_btree_new` since now its stabalized Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 7e9f1f5d271..846a486469e 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -38,7 +38,6 @@ new_uninit, box_syntax, step_trait, - const_btree_new, prelude_import, allocator_api, nonnull_slice_from_raw_parts, From 9f1871ca91c24abb18bc989c4bb94519cd177c94 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 30 Sep 2022 18:13:36 +1000 Subject: [PATCH 019/368] ext2: mkdir Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/disk.rs | 49 +++++++++--- src/aero_kernel/src/fs/ext2/mod.rs | 111 +++++++++++++--------------- 2 files changed, 90 insertions(+), 70 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index 573c7c2dabb..8b0e44bf3ee 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -1,7 +1,6 @@ +use crate::fs::inode; use crate::utils::CeilDiv; -use super::FileType; - #[derive(Debug, Copy, Clone)] #[repr(C, packed)] pub struct SuperBlock { @@ -129,14 +128,6 @@ impl DirEntry { name_bytes.copy_from_slice(name.as_bytes()); } - pub fn avaliable_size(&self) -> usize { - if self.inode == 0 { - self.entry_size as usize - } else { - 0 - } - } - pub fn as_bytes(&self) -> &[u8] { unsafe { core::slice::from_raw_parts(self as *const Self as *const u8, self.entry_size as usize) @@ -144,6 +135,38 @@ impl DirEntry { } } +#[repr(u8)] +#[derive(PartialEq)] +pub enum FileType { + Unknown = 0, + Fifo = 1, + CharDev = 2, + Directory = 4, + BlockDev = 6, + File = 8, + Symlink = 10, + Socket = 12, +} + +impl FileType { + pub fn bits(&self) -> u16 { + let val = *self as u8; + (val as u16) << 12 + } +} + +impl From for inode::FileType { + fn from(ty: FileType) -> Self { + match ty { + FileType::Symlink => Self::Symlink, + FileType::Directory => Self::Directory, + FileType::BlockDev | FileType::CharDev => Self::Device, + + _ => Self::File, + } + } +} + #[repr(C)] #[derive(Debug, Default, Copy, Clone)] pub struct INode { @@ -168,6 +191,12 @@ pub struct INode { } impl INode { + pub fn set_file_type(&mut self, file_type: FileType) { + // The last 4 bits are used to store the filetype. + let mask = 0b0000_1111_1111_1111u16; + self.type_and_perm = file_type.bits() | (self.type_and_perm & mask); + } + pub fn file_type(&self) -> FileType { let ty = self.type_and_perm >> 12; diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 8b36caff5f9..9a3f0b6343d 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -30,7 +30,7 @@ use spin::RwLock; use crate::fs::block::BlockDeviceInterface; use crate::fs::cache::CachedINode; -use crate::fs::ext2::disk::SuperBlock; +use crate::fs::ext2::disk::{FileType, SuperBlock}; use crate::mem::paging::{FrameAllocator, PhysFrame, FRAME_ALLOCATOR}; use self::group_desc::GroupDescriptors; @@ -43,30 +43,6 @@ use super::{cache, FileSystemError}; use super::inode::{DirEntry, INodeInterface, Metadata}; use super::FileSystem; -#[derive(PartialEq)] -pub enum FileType { - Fifo, - CharDev, - Directory, - BlockDev, - File, - Symlink, - Socket, - Unknown, -} - -impl From for super::inode::FileType { - fn from(ty: FileType) -> Self { - match ty { - FileType::Symlink => Self::Symlink, - FileType::Directory => Self::Directory, - FileType::BlockDev | FileType::CharDev => Self::Device, - - _ => Self::File, - } - } -} - pub struct INode { id: usize, fs: Weak, @@ -218,6 +194,51 @@ impl INode { todo!("triply indirect block") } + pub fn make_inode(&self, name: &str, typ: FileType) -> super::Result { + if !self.metadata()?.is_directory() { + return Err(FileSystemError::NotSupported); + } + + if DirEntryIter::new(self.sref()) + .find(|(e, _)| e == name) + .is_some() + { + return Err(FileSystemError::EntryExists); + } + + assert!(self.inode.read().hl_count != 0, "ext2: dangling inode"); + + let fs = self.fs.upgrade().expect("ext2: filesystem was dropped"); + + let inode = fs.bgdt.alloc_inode().expect("ext2: out of inodes"); + let ext2_inode = inode.downcast_arc::().expect("ext2: invalid inode"); + + { + let mut inode = ext2_inode.inode.write(); + inode.set_file_type(typ); + inode.hl_count += 1; + } + + // TODO: scan for unused directory entries and check if this can be + // inserted into the existing block. + let block = self.append_block().unwrap(); + let block_size = fs.superblock.block_size(); + + let mut entry = Box::::new_uninit(); + fs.block.read(block * block_size, entry.as_bytes_mut()); + + // SAFETY: We have initialized the entry above. + let mut entry = unsafe { entry.assume_init() }; + + entry.entry_size = block_size as _; + entry.inode = ext2_inode.id as _; + entry.file_type = 2; + entry.set_name(name); + + fs.block.write(block * block_size, entry.as_bytes()); + Ok(inode) + } + pub fn make_dir_entry( &self, parent: DirCacheItem, @@ -314,44 +335,14 @@ impl INodeInterface for INode { } fn touch(&self, parent: DirCacheItem, name: &str) -> super::Result { - let fs = self.fs.upgrade().expect("ext2: filesystem was dropped"); - let inode = fs.bgdt.alloc_inode().ok_or(FileSystemError::EntryExists)?; - - let ext2_inode = inode.downcast_arc::().expect("ext2: invalid inode"); - - log::debug!( - "ext2: allocated inode alloced_id={} this_id={}", - ext2_inode.id, - self.id - ); - - let dirent_size = name.len() + core::mem::size_of::(); - - if let Some((_name, _entry)) = - DirEntryIter::new(self.sref()).find(|(_, e)| e.avaliable_size() >= dirent_size) - { - todo!() - } else { - let block = self.append_block().unwrap(); - let block_size = fs.superblock.block_size(); - - let mut entry = Box::::new_uninit(); - fs.block.read(block * block_size, entry.as_bytes_mut()); - - // SAFETY: We have initialized the entry above. - let mut entry = unsafe { entry.assume_init() }; - - entry.entry_size = block_size as _; - entry.inode = ext2_inode.id as _; - entry.file_type = 2; - entry.set_name(name); - - fs.block.write(block * block_size, entry.as_bytes()); - } - + let inode = self.make_inode(name, FileType::File)?; Ok(DirEntry::new(parent, inode, name.to_string())) } + fn mkdir(&self, name: &str) -> super::Result { + self.make_inode(name, FileType::Directory) + } + fn resolve_link(&self) -> super::Result { if !self.metadata()?.is_symlink() { return Err(FileSystemError::NotSupported); From 5f0f24492dfb8716a884e39880edec369a0894aa Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 1 Oct 2022 16:42:35 +1000 Subject: [PATCH 020/368] ext2: write and truncate stub Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/disk.rs | 27 +++++++++++ src/aero_kernel/src/fs/ext2/group_desc.rs | 19 ++++++++ src/aero_kernel/src/fs/ext2/mod.rs | 55 ++++++++++++++++++++++- 3 files changed, 99 insertions(+), 2 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index 8b0e44bf3ee..2305a445cad 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -1,3 +1,24 @@ +/* + * Copyright (C) 2021-2022 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +use bit_field::BitField; + use crate::fs::inode; use crate::utils::CeilDiv; @@ -197,6 +218,12 @@ impl INode { self.type_and_perm = file_type.bits() | (self.type_and_perm & mask); } + pub fn set_permissions(&mut self, permissions: u16) { + let mut val = self.type_and_perm; + val.set_bits(..13, permissions); + self.type_and_perm = val; + } + pub fn file_type(&self) -> FileType { let ty = self.type_and_perm >> 12; diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index dbabf429fe0..515000c427e 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -1,3 +1,22 @@ +/* + * Copyright (C) 2021-2022 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + use core::mem::MaybeUninit; use alloc::boxed::Box; diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 9a3f0b6343d..d6513aa29f9 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -84,7 +84,6 @@ impl INode { let block_size = filesystem.superblock.block_size(); let mut progress = 0; - let count = core::cmp::min(inode.size_lower as usize - offset, buffer.len()); while progress < count { @@ -113,7 +112,43 @@ impl INode { Ok(count) } - /// Allocates and appends a new block to the inode. + pub fn write(&self, offset: usize, buffer: &[u8]) -> super::Result { + let filesystem = self.fs.upgrade().unwrap(); + let block_size = filesystem.superblock.block_size(); + + let mut progress = 0; + let count = buffer.len(); + + while progress < count { + let block = (offset + progress) / block_size; + let loc = (offset + progress) % block_size; + + let mut chunk = count - progress; + + if chunk > block_size - loc { + chunk = block_size - loc; + } + + let mut block_index = self.get_block(block).unwrap() as usize; + + if block_index == 0 { + block_index = self.append_block().unwrap(); + } + + filesystem + .block + .write( + (block_index * block_size) + loc, + &buffer[progress..progress + chunk], + ) + .expect("inode: write failed"); + + progress += chunk; + } + + Ok(count) + } + pub fn append_block(&self) -> Option { let fs = self.fs.upgrade().expect("ext2: filesystem was dropped"); let block_size = fs.superblock.block_size(); @@ -215,7 +250,11 @@ impl INode { { let mut inode = ext2_inode.inode.write(); + **inode = disk::INode::default(); + inode.set_file_type(typ); + inode.set_permissions(0o755); + inode.hl_count += 1; } @@ -334,6 +373,18 @@ impl INodeInterface for INode { Ok(count) } + fn write_at(&self, offset: usize, usr_buffer: &[u8]) -> super::Result { + if !self.metadata()?.is_file() { + return Err(FileSystemError::NotSupported); + } + + self.write(offset, usr_buffer) + } + + fn truncate(&self, _size: usize) -> super::Result<()> { + Ok(()) + } + fn touch(&self, parent: DirCacheItem, name: &str) -> super::Result { let inode = self.make_inode(name, FileType::File)?; Ok(DirEntry::new(parent, inode, name.to_string())) From ad0ac5f5633e8c02c98526c57ec6b18a4c08ee7d Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 4 Oct 2022 17:03:07 +1100 Subject: [PATCH 021/368] fcntl: handle F_DUPFD Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/file_table.rs | 2 +- src/aero_kernel/src/syscall/fs.rs | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index b47237d531e..744184a960e 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -242,7 +242,7 @@ impl FileTable { for (i, file) in array.iter_mut().enumerate() { if file.is_none() { *file = Some(handle.duplicate(i, flags)?); - return Ok(i); + return Ok(start + i); } } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 5daca787792..e21a2996cab 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -339,10 +339,19 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result scheduler::get_scheduler() + .current_task() + .file_table + .duplicate(fd, DuplicateHint::GreatorOrEqual(arg), handle.flags), + aero_syscall::prelude::F_DUPFD_CLOEXEC => scheduler::get_scheduler() .current_task() .file_table - .duplicate(fd, DuplicateHint::GreatorOrEqual(arg), OpenFlags::O_CLOEXEC), + .duplicate( + fd, + DuplicateHint::GreatorOrEqual(arg), + handle.flags | OpenFlags::O_CLOEXEC, + ), // Get the value of file descriptor flags. aero_syscall::prelude::F_GETFD => { From ce56d3930bda5cae2196209b2f541ee7e933cffd Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 4 Oct 2022 17:53:52 +1100 Subject: [PATCH 022/368] aero.py: use the disk image Signed-off-by: Andy-Python-Programmer --- aero.py | 12 +++++++++++- tools/mkimage.sh | 14 +++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/aero.py b/aero.py index f339209b685..4fe88fb4ca0 100755 --- a/aero.py +++ b/aero.py @@ -476,6 +476,13 @@ def prepare_iso(args, kernel_bin, user_bins): return None + # create the disk image + disk_path = os.path.join(BUILD_DIR, 'disk.img') + + if not os.path.exists(disk_path): + log_info('creating disk image') + os.system('bash ./tools/mkimage.sh') + return iso_path @@ -486,7 +493,10 @@ def run_in_emulator(build_info: BuildInfo, iso_path): qemu_args = ['-cdrom', iso_path, '-m', args.memory, '-smp', '1', - '-serial', 'stdio'] + '-serial', 'stdio', + '-drive', 'file=build/disk.img,if=none,id=NVME1', '-device', 'nvme,drive=NVME1,serial=nvme', + # Specify the boot order (where `d` is the first CD-ROM drive) + '--boot', 'd'] if args.bios == 'uefi': qemu_args += ['-bios', diff --git a/tools/mkimage.sh b/tools/mkimage.sh index 808041cb608..7693ae32428 100755 --- a/tools/mkimage.sh +++ b/tools/mkimage.sh @@ -1,14 +1,18 @@ +#!/bin/bash + # sync the sysroot echo "sysroot: syncing base-files" cp -r base-files/. sysroot/system-root/ +IMAGE_PATH=build/disk.img + # make the disk image -rm -rf disk.img +rm -rf $IMAGE_PATH -dd if=/dev/zero bs=1G count=0 seek=512 of=disk.img -parted -s disk.img mklabel gpt -parted -s disk.img mkpart primary 2048s 100% -sudo losetup -Pf --show disk.img > loopback_dev +dd if=/dev/zero bs=1G count=0 seek=512 of=$IMAGE_PATH +parted -s $IMAGE_PATH mklabel gpt +parted -s $IMAGE_PATH mkpart primary 2048s 100% +sudo losetup -Pf --show $IMAGE_PATH > loopback_dev sudo mkfs.ext2 `cat loopback_dev`p1 -I128 rm -rf disk_image/ mkdir disk_image From 68ae1b14647540f4b81b47f8cda7df9c19958ad7 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 4 Oct 2022 18:05:38 +1100 Subject: [PATCH 023/368] aero.py: fix build failure when sysroot does not exist Signed-off-by: Andy-Python-Programmer --- aero.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aero.py b/aero.py index 4fe88fb4ca0..0ffcaa30d7d 100755 --- a/aero.py +++ b/aero.py @@ -438,7 +438,9 @@ def prepare_iso(args, kernel_bin, user_bins): sysroot_dir = os.path.join(SYSROOT_DIR, 'system-root') for file in user_bins: bin_name = os.path.basename(file) - shutil.copy(file, os.path.join(sysroot_dir, "usr", "bin", bin_name)) + dest_dir = os.path.join(sysroot_dir, "usr", "bin") + os.makedirs(dest_dir, exist_ok=True) + shutil.copy(file, os.path.join(dest_dir, bin_name)) with open(os.path.join(iso_root, 'limine.cfg'), 'w') as limine_cfg: limine_cfg.write(LIMINE_TEMPLATE) From 105d1242170e827981ee4e3bcfe513f659159702 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 6 Oct 2022 16:50:14 +1100 Subject: [PATCH 024/368] fontconfig: fix build with latest mlibc Signed-off-by: Andy-Python-Programmer --- ...001-fontconfig-aero-specific-changes.patch | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 patches/fontconfig/0001-fontconfig-aero-specific-changes.patch diff --git a/patches/fontconfig/0001-fontconfig-aero-specific-changes.patch b/patches/fontconfig/0001-fontconfig-aero-specific-changes.patch new file mode 100644 index 00000000000..31da2315c26 --- /dev/null +++ b/patches/fontconfig/0001-fontconfig-aero-specific-changes.patch @@ -0,0 +1,26 @@ +From 923dd34de98831460447a85a2786e7c7d6ff3a95 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Wed, 5 Oct 2022 19:43:23 +1100 +Subject: [PATCH] fontconfig: aero specific changes + +Signed-off-by: Andy-Python-Programmer +--- + src/fcstat.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/fcstat.c b/src/fcstat.c +index 4f69eae..8a621dd 100644 +--- a/src/fcstat.c ++++ b/src/fcstat.c +@@ -386,7 +386,7 @@ FcFStatFs (int fd, FcStatFS *statb) + # endif + # if defined(HAVE_STRUCT_STATFS_F_FSTYPENAME) + p = buf.f_fstypename; +-# elif defined(__linux__) || defined (__EMSCRIPTEN__) ++# elif defined(__linux__) || defined(__aero__) || defined (__EMSCRIPTEN__) + switch (buf.f_type) + { + case 0x6969: /* nfs */ +-- +2.25.1 + From 728a8197c52c74f7bc642511cc91f00d1d327486 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 9 Oct 2022 18:24:59 +1100 Subject: [PATCH 025/368] bootstrap: update mlibc and fix ABI breakage Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 11 +- patches/mlibc/mlibc.patch | 182 ++----------------------- rust-toolchain | 3 +- src/aero_kernel/src/drivers/tty.rs | 2 +- src/aero_kernel/src/syscall/process.rs | 2 +- src/aero_syscall/src/lib.rs | 113 +++++++-------- src/aero_syscall/src/signal.rs | 160 +++++++++++++--------- tools/rebuild-sysroot.sh | 6 + 8 files changed, 181 insertions(+), 298 deletions(-) diff --git a/bootstrap.yml b/bootstrap.yml index 451c02c6aed..85bdeaf9779 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -48,14 +48,8 @@ sources: - name: mlibc subdir: 'bundled' - # git: 'https://github.com/managarm/mlibc' - git: 'https://github.com/Andy-Python-Programmer/mlibc' - # 452: The functions FD_{CLR,ISSET,SET,ZERO} were renamed to __FD_{CLR,ISSET,SET,ZERO} and replaced by macros to match Wine's assumptions. - # 511: Musl's regex engine was added, implementing regcomp and regexec. This required some changes to the regex_t struct. - # 504, #580: In both the mlibc and Linux ABIs, a domainname member was added to struct utsname, which is a glibc extension. - # 311: Added all necessary fields in pthread_attr_t required for implementing all pthread_attr functions. - branch: 'abi-break' - commit: '58ceb6648eefd801a774ba5e87b032706105243d' + git: 'https://github.com/managarm/mlibc' + branch: 'master' - name: tzcode subdir: 'bundled' @@ -91,7 +85,6 @@ sources: subdir: 'bundled' git: 'https://github.com/Andy-Python-Programmer/libc.git' branch: 'master' - commit: '54d72b34bd614f0081e0da01e6323c7c69f45395' - name: rust-num-cpus subdir: 'bundled' diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 145a0362b16..2512955ce4d 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,21 +1,20 @@ -From 0eb5403c389aaa7144d6bea297aac57d442bc9f6 Mon Sep 17 00:00:00 2001 +From 52be7281e3becafe49603ed6bbc01c0ded64d9e1 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 8 Jul 2022 12:32:32 +1000 Subject: [PATCH] yes Signed-off-by: Andy-Python-Programmer --- - .gitignore | 2 + - options/ansi/generic/stdlib-stubs.cpp | 142 +++++++++++++++++++++----- - options/glibc/generic/execinfo.cpp | 5 +- - options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 38 +++---- - sysdeps/aero/generic/filesystem.cpp | 25 ++++- - sysdeps/aero/generic/sockets.cpp | 77 +++++++++++++- - sysdeps/aero/generic/time.cpp | 24 +++++ - sysdeps/aero/include/aero/syscall.h | 6 ++ - sysdeps/aero/meson.build | 1 + - 10 files changed, 268 insertions(+), 54 deletions(-) + .gitignore | 2 + + options/glibc/generic/execinfo.cpp | 5 +- + options/rtdl/generic/linker.cpp | 2 +- + sysdeps/aero/generic/aero.cpp | 38 +++++++------- + sysdeps/aero/generic/filesystem.cpp | 25 ++++++++-- + sysdeps/aero/generic/sockets.cpp | 77 ++++++++++++++++++++++++++++- + sysdeps/aero/generic/time.cpp | 24 +++++++++ + sysdeps/aero/include/aero/syscall.h | 6 +++ + sysdeps/aero/meson.build | 1 + + 9 files changed, 152 insertions(+), 28 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -28,159 +27,6 @@ index fdd60a00..9f811f47 100644 .vscode +# clangd cache files: +.cache -diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp -index 4836391e..2a73c6d0 100644 ---- a/options/ansi/generic/stdlib-stubs.cpp -+++ b/options/ansi/generic/stdlib-stubs.cpp -@@ -375,32 +375,122 @@ int mblen(const char *mbs, size_t mb_limit) { - return nseq.it - mbs; - } - --int mbtowc(wchar_t *__restrict wc, const char *__restrict mb, size_t max_size) { -- auto cc = mlibc::current_charcode(); -- __ensure(max_size); -- -- if (mb) { -- if (*mb) { -- // If wc is NULL, decode into a single local character which we discard -- // to obtain the length. -- wchar_t tmp_wc; -- if (!wc) -- wc = &tmp_wc; -- -- mlibc::code_seq wseq{wc, wc + 1}; -- mlibc::code_seq nseq{mb, mb + max_size}; -- auto e = cc->decode_wtranscode(nseq, wseq, mbtowc_state); -- if (e != mlibc::charcode_error::null) -- __ensure(!"decode_wtranscode() errors are not handled"); -- -- return nseq.it - mb; -- } else { -- return 0; // When mbs is a null byte, return 0 -- } -- } else { -- mblen_state = __MLIBC_MBSTATE_INITIALIZER; -- return cc->has_shift_states; -- } -+// int mbtowc(wchar_t *__restrict wc, const char *__restrict mb, size_t max_size) { -+// auto cc = mlibc::current_charcode(); -+// __ensure(max_size); -+// -+// if (mb) { -+// if (*mb) { -+// // If wc is NULL, decode into a single local character which we discard -+// // to obtain the length. -+// wchar_t tmp_wc; -+// if (!wc) -+// wc = &tmp_wc; -+// -+// mlibc::code_seq wseq{wc, wc + 1}; -+// mlibc::code_seq nseq{mb, mb + max_size}; -+// auto e = cc->decode_wtranscode(nseq, wseq, mbtowc_state); -+// if (e != mlibc::charcode_error::null) -+// __ensure(!"decode_wtranscode() errors are not handled"); -+// -+// return nseq.it - mb; -+// } else { -+// return 0; // When mbs is a null byte, return 0 -+// } -+// } else { -+// mblen_state = __MLIBC_MBSTATE_INITIALIZER; -+// return cc->has_shift_states; -+// } -+// } -+ -+// Upper 6 state bits are a negative integer offset to bound-check next byte -+// equivalent to: ( (b-0x80) | (b+offset) ) & ~0x3f -+#define OOB(c, b) (((((b) >> 3) - 0x10) | (((b) >> 3) + ((int32_t)(c) >> 26))) & ~7) -+ -+// Interval [a,b]. Either a must be 80 or b must be c0, lower 3 bits clear. -+#define R(a, b) ((uint32_t)((a == 0x80 ? 0x40u - b : 0u - a) << 23)) -+#define FAILSTATE R(0x80, 0x80) -+ -+#define SA 0xc2u -+#define SB 0xf4u -+ -+// Arbitrary encoding for representing code units instead of characters. -+#define CODEUNIT(c) (0xdfff & (signed char)(c)) -+#define IS_CODEUNIT(c) ((unsigned)(c)-0xdf80 < 0x80) -+ -+#define C(x) ( x<2 ? -1 : ( R(0x80,0xc0) | x ) ) -+#define D(x) C((x+16)) -+#define E(x) ( ( x==0 ? R(0xa0,0xc0) : \ -+ x==0xd ? R(0x80,0xa0) : \ -+ R(0x80,0xc0) ) \ -+ | ( R(0x80,0xc0) >> 6 ) \ -+ | x ) -+#define F(x) ( ( x>=5 ? 0 : \ -+ x==0 ? R(0x90,0xc0) : \ -+ x==4 ? R(0x80,0xa0) : \ -+ R(0x80,0xc0) ) \ -+ | ( R(0x80,0xc0) >> 6 ) \ -+ | ( R(0x80,0xc0) >> 12 ) \ -+ | x ) -+ -+const uint32_t bittab[] = { -+ C(0x2),C(0x3),C(0x4),C(0x5),C(0x6),C(0x7), -+ C(0x8),C(0x9),C(0xa),C(0xb),C(0xc),C(0xd),C(0xe),C(0xf), -+ D(0x0),D(0x1),D(0x2),D(0x3),D(0x4),D(0x5),D(0x6),D(0x7), -+ D(0x8),D(0x9),D(0xa),D(0xb),D(0xc),D(0xd),D(0xe),D(0xf), -+ E(0x0),E(0x1),E(0x2),E(0x3),E(0x4),E(0x5),E(0x6),E(0x7), -+ E(0x8),E(0x9),E(0xa),E(0xb),E(0xc),E(0xd),E(0xe),E(0xf), -+ F(0x0),F(0x1),F(0x2),F(0x3),F(0x4) -+}; -+ -+// Converts a multibyte sequence to a wide character. -+// -+// Credits - MUSL -+int mbtowc(wchar_t *__restrict wc, const char *__restrict src, size_t n) { -+ unsigned c; -+ const unsigned char *s = static_cast((const void *)src); -+ wchar_t dummy; -+ -+ if (!s) return 0; -+ if (!n) goto ilseq; -+ if (!wc) wc = &dummy; -+ -+ if (*s < 0x80) return !!(*wc = *s); -+ if (MB_CUR_MAX == 1) return (*wc = CODEUNIT(*s)), 1; -+ if (*s - SA > SB - SA) goto ilseq; -+ -+ c = bittab[*s++ - SA]; -+ -+ // Avoid excessive checks against n: If shifting the state n-1 -+ // times does not clear the high bit, then the value of n is -+ // insufficient to read a character. -+ if (n < 4 && ((c << (6 * n - 6)) & (1U << 31))) goto ilseq; -+ if (OOB(c, *s)) goto ilseq; -+ -+ c = c << 6 | (*s++ - 0x80); -+ -+ if (!(c & (1U << 31))) { -+ *wc = c; -+ return 2; -+ } -+ -+ if (*s - 0x80u >= 0x40) goto ilseq; -+ -+ c = c << 6 | (*s++ - 0x80); -+ -+ if (!(c & (1U << 31))) { -+ *wc = c; -+ return 3; -+ } -+ -+ if (*s - 0x80u >= 0x40) goto ilseq; -+ -+ *wc = c << 6 | (*s++ - 0x80); -+ return 4; -+ -+ilseq: -+ errno = EILSEQ; -+ return -1; - } - - int wctomb(char *, wchar_t) { diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp index 3474615e..10a2109e 100644 --- a/options/glibc/generic/execinfo.cpp @@ -199,10 +45,10 @@ index 3474615e..10a2109e 100644 char **backtrace_symbols(void *const *, int) { diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp -index 6716ef4f..e5ec8cff 100644 +index f51a543f..74f4e96a 100644 --- a/options/rtdl/generic/linker.cpp +++ b/options/rtdl/generic/linker.cpp -@@ -15,7 +15,7 @@ uintptr_t libraryBase = 0x41000000; +@@ -16,7 +16,7 @@ uintptr_t libraryBase = 0x41000000; constexpr bool verbose = false; constexpr bool stillSlightlyVerbose = false; @@ -477,7 +323,7 @@ index 12f8dc61..03001c46 100644 // Invalid syscall used to trigger a log error in the kernel (as a hint) // so, that we can implement the syscall in the kernel. diff --git a/sysdeps/aero/meson.build b/sysdeps/aero/meson.build -index 3ca8463e..f1d80139 100644 +index 14975990..8e30aa3a 100644 --- a/sysdeps/aero/meson.build +++ b/sysdeps/aero/meson.build @@ -11,6 +11,7 @@ libc_sources += files( diff --git a/rust-toolchain b/rust-toolchain index 721047ac5fc..e3d9c6d8501 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1,3 +1,4 @@ [toolchain] -channel = "nightly" +# https://github.com/rust-lang/rust/pull/101988#issuecomment-1272407248 +channel = "nightly-2022-10-07" components = ["rust-src", "rustfmt", "clippy"] diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 159fca09fbc..977370bdcca 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -43,7 +43,7 @@ lazy_static::lazy_static! { c_cflag: aero_syscall::TermiosCFlag::empty(), c_lflag: aero_syscall::TermiosLFlag::ECHO | aero_syscall::TermiosLFlag::ICANON, c_line: 0, - c_cc: [0; 11], + c_cc: [0; 32], c_ispeed: 0, c_ospeed: 0, }); diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index 95e5c77fbf8..2343f023738 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -65,7 +65,7 @@ pub fn uname(buffer: &mut Utsname) -> Result { fixed[..len].copy_from_slice(init_bytes) } - init_array(&mut buffer.name, "Aero"); + init_array(&mut buffer.sysname, "Aero"); init_array(&mut buffer.nodename, "unknown"); init_array(&mut buffer.version, env!("CARGO_PKG_VERSION")); init_array( diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 4386a781437..16091660e3a 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -260,19 +260,20 @@ pub struct SysDirEntry { pub name: [u8; 0], } -#[derive(Debug)] #[repr(C)] +#[derive(Debug)] pub struct Utsname { - pub name: [u8; 65], + pub sysname: [u8; 65], pub nodename: [u8; 65], pub release: [u8; 65], pub version: [u8; 65], pub machine: [u8; 65], + pub domainname: [u8; 65], } impl Utsname { pub fn name(&self) -> &str { - unsafe { core::str::from_utf8_unchecked(&self.name) } + unsafe { core::str::from_utf8_unchecked(&self.sysname) } } pub fn nodename(&self) -> &str { @@ -295,11 +296,12 @@ impl Utsname { impl Default for Utsname { fn default() -> Self { Self { - name: [0; 65], + sysname: [0; 65], nodename: [0; 65], release: [0; 65], version: [0; 65], machine: [0; 65], + domainname: [0; 65], } } } @@ -346,68 +348,69 @@ pub struct WinSize { bitflags::bitflags! { #[derive(Default)] pub struct TermiosLFlag: u32 { - const ECHO = 0x0001; - const ECHOE = 0x0002; - const ECHOK = 0x0004; - const ECHONL = 0x0008; - const ICANON = 0x0010; - const IEXTEN = 0x0020; - const ISIG = 0x0040; - const NOFLSH = 0x0080; - const TOSTOP = 0x0100; - const ECHOPRT= 0x0200; + const ECHO = 0x8; + const ECHOE = 0x10; + const ECHOK = 0x20; + const ECHONL = 0x40; + const ICANON = 0x2; + const IEXTEN = 0x8000; + const ISIG = 0x1; + const NOFLSH = 0x80; + const TOSTOP = 0x100; + const ECHOPRT = 0x400; } } bitflags::bitflags! { #[derive(Default)] pub struct TermiosCFlag: u32 { - const CSIZE = 0x0003; - const CS5 = 0x0000; - const CS6 = 0x0001; - const CS7 = 0x0002; - const CS8 = 0x0003; - const CSTOPB = 0x0004; - const CREAD = 0x0008; - const PARENB = 0x0010; - const PARODD = 0x0020; - const HUPCL = 0x0040; - const CLOCAL = 0x0080; + const CSIZE = 0x30; + const CS5 = 0x0; + const CS6 = 0x10; + const CS7 = 0x20; + const CS8 = 0x30; + const CSTOPB = 0x40; + const CREAD = 0x80; + const PARENB = 0x100; + const PARODD = 0x200; + const HUPCL = 0x400; + const CLOCAL = 0x800; } } bitflags::bitflags! { #[derive(Default)] pub struct TermiosOFlag: u32 { - const OPOST = 0x0001; - const ONLCR = 0x0002; - const OCRNL = 0x0004; - const ONOCR = 0x0008; - const ONLRET = 0x0010; - const OFDEL = 0x0020; - const OFILL = 0x0040; - const NLDLY = 0x0080; - const NL0 = 0x0000; - const NL1 = 0x0080; - const CRDLY = 0x0300; - const CR0 = 0x0000; - const CR1 = 0x0100; - const CR2 = 0x0200; - const CR3 = 0x0300; - const TABDLY = 0x0C00; - const TAB0 = 0x0000; - const TAB1 = 0x0400; - const TAB2 = 0x0800; - const TAB3 = 0x0C00; - const BSDLY = 0x1000; - const BS0 = 0x0000; - const BS1 = 0x1000; - const VTDLY = 0x2000; - const VT0 = 0x0000; - const VT1 = 0x2000; - const FFDLY = 0x4000; - const FF0 = 0x0000; - const FF1 = 0x4000; + const OPOST = 0x1; + const ONLCR = 0x4; + const OCRNL = 0x8; + const ONOCR = 0x10; + const ONLRET = 0x20; + const OFDEL = 0x80; + const OFILL = 0x40; + const NLDLY = 0x100; + const NL0 = 0x0; + const NL1 = 0x100; + const CRDLY = 0x600; + const CR0 = 0x0; + const CR1 = 0x200; + const CR2 = 0x400; + const CR3 = 0x600; + const TABDLY = 0x1800; + const TAB0 = 0x0; + const TAB1 = 0x800; + const TAB2 = 0x1000; + const TAB3 = 0x1800; + const XTABS = 0x1800; + const BSDLY = 0x2000; + const BS0 = 0x0; + const BS1 = 0x2000; + const VTDLY = 0x4000; + const VT0 = 0x0; + const VT1 = 0x4000; + const FFDLY = 0x8000; + const FF0 = 0x0; + const FF1 = 0x8000; } } @@ -419,7 +422,7 @@ pub struct Termios { pub c_cflag: TermiosCFlag, pub c_lflag: TermiosLFlag, pub c_line: u8, - pub c_cc: [u8; 11], + pub c_cc: [u8; 32], pub c_ispeed: u32, pub c_ospeed: u32, } diff --git a/src/aero_syscall/src/signal.rs b/src/aero_syscall/src/signal.rs index 30eb2ad6e1d..22f44d13619 100644 --- a/src/aero_syscall/src/signal.rs +++ b/src/aero_syscall/src/signal.rs @@ -1,18 +1,50 @@ -pub const SIGHUP: usize = 1; +/* + * Copyright (C) 2021-2022 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +// mlibc/abis/linux/signal.h +pub const SIGABRT: usize = 6; +pub const SIGFPE: usize = 8; +pub const SIGILL: usize = 4; pub const SIGINT: usize = 2; +pub const SIGSEGV: usize = 11; +pub const SIGTERM: usize = 15; +pub const SIGPROF: usize = 27; +pub const SIGIO: usize = 29; +pub const SIGPWR: usize = 30; +pub const SIGRTMIN: usize = 35; +pub const SIGRTMAX: usize = 64; + +// constants for sigprocmask() +pub const SIG_BLOCK: u64 = 0; +pub const SIG_UNBLOCK: u64 = 1; +pub const SIG_SETMASK: u64 = 2; + +pub const SIGHUP: usize = 1; pub const SIGQUIT: usize = 3; -pub const SIGILL: usize = 4; pub const SIGTRAP: usize = 5; -pub const SIGABRT: usize = 6; +pub const SIGIOT: usize = SIGABRT; pub const SIGBUS: usize = 7; -pub const SIGFPE: usize = 8; pub const SIGKILL: usize = 9; pub const SIGUSR1: usize = 10; -pub const SIGSEGV: usize = 11; pub const SIGUSR2: usize = 12; pub const SIGPIPE: usize = 13; pub const SIGALRM: usize = 14; -pub const SIGTERM: usize = 15; pub const SIGSTKFLT: usize = 16; pub const SIGCHLD: usize = 17; pub const SIGCONT: usize = 18; @@ -24,15 +56,15 @@ pub const SIGURG: usize = 23; pub const SIGXCPU: usize = 24; pub const SIGXFSZ: usize = 25; pub const SIGVTALRM: usize = 26; -pub const SIGPROF: usize = 27; pub const SIGWINCH: usize = 28; -pub const SIGIO: usize = 29; -pub const SIGPOLL: usize = SIGIO; -pub const SIGPWR: usize = 30; +pub const SIGPOLL: usize = 29; pub const SIGSYS: usize = 31; -pub const SIGRTMIN: usize = 32; -pub const SIGRTMAX: usize = 33; -pub const SIGCANCEL: usize = 34; +pub const SIGUNUSED: usize = SIGSYS; +pub const SIGCANCEL: usize = 32; + +pub const SIG_ERR: i64 = -1; // error +pub const SIG_DFL: i64 = 0; // default +pub const SIG_IGN: i64 = 1; // ignore #[derive(Debug, Copy, Clone, PartialEq)] pub enum SignalHandler { @@ -41,47 +73,6 @@ pub enum SignalHandler { Handle(fn(usize)), } -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct SigAction { - pub sa_handler: u64, - pub sa_mask: u64, - pub sa_flags: u32, - pub sa_sigaction: u64, -} - -impl SigAction { - pub fn new(handler: SignalHandler, mask: u64, flags: SignalFlags) -> SigAction { - SigAction { - sa_handler: handler.into(), - sa_mask: mask, - sa_flags: flags.bits(), - sa_sigaction: 0, - } - } -} - -bitflags::bitflags! { - #[derive(Default)] - pub struct SignalFlags: u32 { - const SA_NOCLDSTOP = (1 << 0); - const SA_ONSTACK = (1 << 1); - const SA_RESETHAND = (1 << 2); - const SA_RESTART = (1 << 3); - const SA_SIGINFO = (1 << 4); - const SA_NOCLDWAIT = (1 << 5); - const SA_NODEFER = (1 << 6); - } -} - -#[repr(u64)] -#[derive(Debug)] -pub enum SigProcMask { - Block = 1, - Unblock = 2, - Set = 3, -} - impl Default for SignalHandler { fn default() -> Self { SignalHandler::Default @@ -92,8 +83,8 @@ impl From for SignalHandler { fn from(v: u64) -> Self { let v = v as i64; match v { - -3 => SignalHandler::Ignore, - -2 => SignalHandler::Default, + SIG_IGN => SignalHandler::Ignore, + SIG_DFL => SignalHandler::Default, v => SignalHandler::Handle(unsafe { core::mem::transmute::(v as u64) }), } } @@ -102,8 +93,8 @@ impl From for SignalHandler { impl From for usize { fn from(h: SignalHandler) -> Self { match h { - SignalHandler::Ignore => -3isize as usize, - SignalHandler::Default => -2isize as usize, + SignalHandler::Ignore => SIG_IGN as usize, + SignalHandler::Default => SIG_DFL as usize, SignalHandler::Handle(f) => f as usize, } } @@ -112,19 +103,62 @@ impl From for usize { impl From for u64 { fn from(h: SignalHandler) -> Self { match h { - SignalHandler::Ignore => -3isize as u64, - SignalHandler::Default => -2isize as u64, + SignalHandler::Ignore => SIG_IGN as u64, + SignalHandler::Default => SIG_DFL as u64, SignalHandler::Handle(f) => f as u64, } } } +#[repr(C)] +#[derive(Copy, Clone, Debug)] +pub struct SigAction { + pub sa_handler: u64, + pub sa_mask: u64, + pub sa_flags: u32, + pub sa_sigaction: u64, +} + +impl SigAction { + pub fn new(handler: SignalHandler, mask: u64, flags: SignalFlags) -> SigAction { + SigAction { + sa_handler: handler.into(), + sa_mask: mask, + sa_flags: flags.bits(), + sa_sigaction: 0, + } + } +} + +bitflags::bitflags! { + // mlibc/abis/linux/signal.h + #[derive(Default)] + pub struct SignalFlags: u32 { + const SA_NOCLDSTOP = 1; + const SA_NOCLDWAIT = 2; + const SA_SIGINFO = 4; + const SA_ONSTACK = 0x08000000; + const SA_RESTART = 0x10000000; + const SA_NODEFER = 0x40000000; + const SA_RESETHAND = 0x80000000; + const SA_RESTORER = 0x04000000; + } +} + +#[repr(u64)] +#[derive(Debug)] +pub enum SigProcMask { + Block = SIG_BLOCK, + Unblock = SIG_UNBLOCK, + Set = SIG_SETMASK, +} + impl From for SigProcMask { fn from(v: u64) -> Self { match v { - 1 => SigProcMask::Block, - 2 => SigProcMask::Unblock, - 3 => SigProcMask::Set, + SIG_BLOCK => SigProcMask::Block, + SIG_UNBLOCK => SigProcMask::Unblock, + SIG_SETMASK => SigProcMask::Set, _ => panic!("invalid signal procmask {}", v), } } diff --git a/tools/rebuild-sysroot.sh b/tools/rebuild-sysroot.sh index 0c6a22e0980..428aeb2789b 100755 --- a/tools/rebuild-sysroot.sh +++ b/tools/rebuild-sysroot.sh @@ -17,9 +17,15 @@ # You should have received a copy of the GNU General Public License # along with Aero. If not, see . +set -x -e + SPATH=$(dirname $(readlink -f "$0")) AERO_PATH=$(realpath $SPATH/..) +# remove the build directory to ensure the build image +# is rebuilt. +rm -rf $AERO_PATH/build + if [ -z "$1" ]; then echo "Usage: $0 [] [--tool]" exit 1 From 79832146455ffdcb91317e90bab1c21ad27aa923 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 13 Oct 2022 17:06:19 +1100 Subject: [PATCH 026/368] ext2: link Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/mod.rs | 19 +++++++++++++++++-- src/aero_kernel/src/fs/inode.rs | 2 +- src/aero_kernel/src/fs/ramfs.rs | 4 +++- src/aero_kernel/src/syscall/fs.rs | 6 ++++-- src/aero_kernel/src/syscall/mod.rs | 2 +- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index d6513aa29f9..1e2b5e75467 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -271,7 +271,7 @@ impl INode { entry.entry_size = block_size as _; entry.inode = ext2_inode.id as _; - entry.file_type = 2; + entry.file_type = 2; // FIXME: This is fucked. entry.set_name(name); fs.block.write(block * block_size, entry.as_bytes()); @@ -374,13 +374,28 @@ impl INodeInterface for INode { } fn write_at(&self, offset: usize, usr_buffer: &[u8]) -> super::Result { - if !self.metadata()?.is_file() { + if !self.metadata()?.is_file() && !self.metadata()?.is_symlink() { return Err(FileSystemError::NotSupported); } self.write(offset, usr_buffer) } + fn link(&self, name: &str, src: DirCacheItem) -> super::Result<()> { + if !self.metadata()?.is_directory() { + return Err(FileSystemError::NotSupported); + } + + if src.inode().metadata()?.is_directory() { + return Err(FileSystemError::NotSupported); + } + + let inode = self.make_inode(name, FileType::Symlink)?; + inode.write_at(0, src.name().as_bytes())?; + + Ok(()) + } + fn truncate(&self, _size: usize) -> super::Result<()> { Ok(()) } diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index e0e134a5fbe..0e9016a4cbd 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -256,7 +256,7 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSupported) } - fn link(&self, _name: &str, _src: INodeCacheItem) -> Result<()> { + fn link(&self, _name: &str, _src: DirCacheItem) -> Result<()> { Err(FileSystemError::NotSupported) } } diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index 2401653a10c..3f26825a3a9 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -412,7 +412,9 @@ impl INodeInterface for LockedRamINode { Some(self.0.read().filesystem.clone()) } - fn link(&self, name: &str, src: INodeCacheItem) -> Result<()> { + fn link(&self, name: &str, src: DirCacheItem) -> Result<()> { + let src = src.inode(); + // ensure: The dest inode (self) is a directory. if self.metadata()?.file_type() != FileType::Directory { return Err(FileSystemError::NotDirectory); diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index e21a2996cab..71e86cfa3d2 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -520,7 +520,7 @@ pub fn event_fd(_initval: usize, flags: usize) -> Result { /// file. #[syscall] pub fn link(src_path: &Path, dest_path: &Path) -> Result { - let src = fs::lookup_path(src_path)?.inode(); + let src = fs::lookup_path(src_path)?; let (dest_dir, dest_name) = dest_path.parent_and_basename(); let dest_dir = fs::lookup_path(dest_dir)?.inode(); @@ -531,7 +531,9 @@ pub fn link(src_path: &Path, dest_path: &Path) -> Result { // strong references to it. // // TODO: Should this be moved to the inode impl? - if dest_dir.weak_filesystem().unwrap().as_ptr() != src.weak_filesystem().unwrap().as_ptr() { + if dest_dir.weak_filesystem().unwrap().as_ptr() + != src.inode().weak_filesystem().unwrap().as_ptr() + { return Err(SyscallError::EINVAL); } diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index a38a4bbfbcc..48c354e5d0b 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -198,7 +198,7 @@ impl SysLog { pub fn flush(self) { let mut result = String::new(); - if self.result.map(|e| e.is_ok()).unwrap_or_default() { + if self.result.unwrap().is_ok() { result.push_str("\x1b[1;32m"); } else { result.push_str("\x1b[1;31m"); From 7e3654b8f4cda5e92c4e93c5e95f4b709b2de8e1 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 14 Oct 2022 18:14:21 +1100 Subject: [PATCH 027/368] aero_proc::syslog: fix scopes Previously something like the following was generated: ```rs fn foo(bar: u64) -> u64 { fn inner(bar: u64) -> u64 { let body = { // if return is used here then the syscall magic // will not be called. This made the generated // code skip some of the syscalls in the syslog // because the return returned from the function // not the scope it self. So to solve this // problem the body is inserted into an // even_inner function and to be nice, its // annotated with #[inline(always)] // // return 69; }; // syslog magic body } inner(bar); } ``` Sometimes it just happens. Stay safe with scopes guys! Stay Giga :^) Signed-off-by: Andy-Python-Programmer --- src/aero_proc/src/syscall.rs | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/aero_proc/src/syscall.rs b/src/aero_proc/src/syscall.rs index 12b9c2e88f8..7268bf4ccb9 100644 --- a/src/aero_proc/src/syscall.rs +++ b/src/aero_proc/src/syscall.rs @@ -105,6 +105,16 @@ pub fn parse(attr: TokenStream, item: TokenStream) -> TokenStream { let orig_args = &signature.inputs; let processed_args = process_args(orig_args); let call_args = process_call_args(orig_args); + let args = orig_args + .iter() + .map(|e| match e { + FnArg::Typed(arg) => match arg.pat.as_ref() { + Pat::Ident(pat) => pat.ident.clone(), + _ => unimplemented!(), + }, + _ => unimplemented!(), + }) + .collect::>(); let ret = &signature.output; let body = &parsed_fn.block; @@ -150,22 +160,29 @@ pub fn parse(attr: TokenStream, item: TokenStream) -> TokenStream { }; let compiled_body = if config.no_return { - quote::quote! { #body } + quote::quote! { + fn even_inner(#orig_args) #ret #body + even_inner(#(#call_args),*) + } } else { quote::quote! { - let result = #body; - #syslog - result + #[inline(always)] + fn even_inner(#orig_args) #ret #body + + #[inline(always)] + fn syscall_inner(#orig_args) #ret { + let result = even_inner(#(#args),*); + #syslog + result + } + + syscall_inner(#(#call_args),*) } }; let result = quote! { #(#attrs)* #vis fn #name(#(#processed_args),*) #ret { - #(#attrs)* fn inner_syscall(#orig_args) #ret { - #compiled_body - } - - inner_syscall(#(#call_args),*) + #compiled_body } }; From 44743b9fc691894449e8c9a27987e63e5e754e71 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 14 Oct 2022 19:23:19 +1100 Subject: [PATCH 028/368] ext2: make_local_socket_inode Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/group_desc.rs | 5 +- src/aero_kernel/src/fs/ext2/mod.rs | 116 ++++++++++++++++++++-- 2 files changed, 107 insertions(+), 14 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index 515000c427e..71b158eacf8 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -26,7 +26,6 @@ use bit_field::BitField; use spin::RwLock; use crate::fs::block::{BlockDevice, CachedAccess}; -use crate::fs::cache::INodeCacheItem; use super::{disk, Ext2}; @@ -151,7 +150,7 @@ impl GroupDescriptors { } /// Allocates a new inode using the first fit allocation strategy. - pub fn alloc_inode(&self) -> Option { + pub fn alloc_inode(&self) -> Option { let fs = self.ext2.upgrade()?; let ino_per_group = fs.superblock.inodes_per_group as usize; @@ -168,7 +167,7 @@ impl GroupDescriptors { block_group.free_inodes_count -= 1; drop(descriptors); // release the lock - return fs.find_inode(inode_id); + return Some(inode_id); } None diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 1e2b5e75467..a6dcd7a5a16 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -22,7 +22,8 @@ mod group_desc; use core::mem::MaybeUninit; -use aero_syscall::MMapFlags; +use aero_syscall::socket::MessageHeader; +use aero_syscall::{MMapFlags, SyscallError}; use alloc::boxed::Box; use alloc::string::ToString; use alloc::sync::{Arc, Weak}; @@ -33,6 +34,9 @@ use crate::fs::cache::CachedINode; use crate::fs::ext2::disk::{FileType, SuperBlock}; use crate::mem::paging::{FrameAllocator, PhysFrame, FRAME_ALLOCATOR}; +use crate::socket::unix::UnixSocket; +use crate::socket::SocketAddr; + use self::group_desc::GroupDescriptors; use super::block::{BlockDevice, CachedAccess}; @@ -40,13 +44,17 @@ use super::block::{BlockDevice, CachedAccess}; use super::cache::{DirCacheItem, INodeCacheItem}; use super::{cache, FileSystemError}; -use super::inode::{DirEntry, INodeInterface, Metadata}; +use super::inode::{DirEntry, INodeInterface, Metadata, PollFlags, PollTable}; use super::FileSystem; pub struct INode { id: usize, fs: Weak, inode: RwLock>, + // Forwards all of the inode operations to the proxy inode. Note that the + // proxy inode is not saved on the disk. (e.g. This is useful for binding + // a socket inode to a file). + proxy: Option>, // TODO: Do not store this in the inode, but rather in a different // cache using the API provided by fs::cache (consider LRU only?). @@ -54,7 +62,11 @@ pub struct INode { } impl INode { - pub fn new(ext2: Weak, id: usize) -> Option { + pub fn new( + ext2: Weak, + id: usize, + proxy: Option>, + ) -> Option { debug_assert!(id != 0); let icache = cache::icache(); @@ -71,6 +83,7 @@ impl INode { inode: RwLock::new(inode), id, fs: ext2, + proxy, sref: sref.clone(), }))), @@ -229,7 +242,12 @@ impl INode { todo!("triply indirect block") } - pub fn make_inode(&self, name: &str, typ: FileType) -> super::Result { + pub fn make_inode( + &self, + name: &str, + typ: FileType, + proxy: Option>, + ) -> super::Result { if !self.metadata()?.is_directory() { return Err(FileSystemError::NotSupported); } @@ -246,6 +264,8 @@ impl INode { let fs = self.fs.upgrade().expect("ext2: filesystem was dropped"); let inode = fs.bgdt.alloc_inode().expect("ext2: out of inodes"); + let inode = fs.find_inode(inode, proxy).expect("ext2: inode not found"); + let ext2_inode = inode.downcast_arc::().expect("ext2: invalid inode"); { @@ -284,7 +304,7 @@ impl INode { name: &str, entry: &disk::DirEntry, ) -> Option { - let inode = self.fs.upgrade()?.find_inode(entry.inode as usize)?; + let inode = self.fs.upgrade()?.find_inode(entry.inode as usize, None)?; Some(DirEntry::new(parent, inode, name.to_string())) } @@ -358,6 +378,10 @@ impl INodeInterface for INode { } fn read_at(&self, offset: usize, usr_buffer: &mut [u8]) -> super::Result { + if let Some(proxy) = self.proxy.as_ref() { + return proxy.read_at(offset, usr_buffer); + } + if !self.metadata()?.is_file() { return Err(FileSystemError::NotSupported); } @@ -374,6 +398,10 @@ impl INodeInterface for INode { } fn write_at(&self, offset: usize, usr_buffer: &[u8]) -> super::Result { + if let Some(proxy) = self.proxy.as_ref() { + return proxy.write_at(offset, usr_buffer); + } + if !self.metadata()?.is_file() && !self.metadata()?.is_symlink() { return Err(FileSystemError::NotSupported); } @@ -390,23 +418,40 @@ impl INodeInterface for INode { return Err(FileSystemError::NotSupported); } - let inode = self.make_inode(name, FileType::Symlink)?; + let inode = self.make_inode(name, FileType::Symlink, None)?; inode.write_at(0, src.name().as_bytes())?; Ok(()) } fn truncate(&self, _size: usize) -> super::Result<()> { + log::warn!("ext2::truncate is a stub!"); Ok(()) } fn touch(&self, parent: DirCacheItem, name: &str) -> super::Result { - let inode = self.make_inode(name, FileType::File)?; + if !self.metadata()?.is_directory() { + return Err(FileSystemError::NotSupported); + } + + let inode = self.make_inode(name, FileType::File, None)?; Ok(DirEntry::new(parent, inode, name.to_string())) } fn mkdir(&self, name: &str) -> super::Result { - self.make_inode(name, FileType::Directory) + if !self.metadata()?.is_directory() { + return Err(FileSystemError::NotSupported); + } + + self.make_inode(name, FileType::Directory, None) + } + + fn make_local_socket_inode( + &self, + name: &str, + inode: Arc, + ) -> super::Result { + Ok(self.make_inode(name, FileType::Socket, Some(inode))?) } fn resolve_link(&self) -> super::Result { @@ -428,6 +473,8 @@ impl INodeInterface for INode { } fn mmap(&self, offset: usize, size: usize, flags: MMapFlags) -> super::Result { + assert!(self.proxy.is_none()); + // TODO: support shared file mappings. assert!(!flags.contains(MMapFlags::MAP_SHARED)); @@ -438,6 +485,49 @@ impl INodeInterface for INode { Ok(private_cp) } + + fn listen(&self, backlog: usize) -> Result<(), SyscallError> { + if let Some(proxy) = self.proxy.as_ref() { + return proxy.listen(backlog); + } + + return Err(SyscallError::EACCES); + } + + // XXX: We do not require to handle `bind` here since if this function + // is being is called on an EXT2 inode then, it has already been bound. + + fn connect(&self, address: SocketAddr, length: usize) -> super::Result<()> { + if let Some(proxy) = self.proxy.as_ref() { + return proxy.connect(address, length); + } + + return Err(FileSystemError::NotSupported); + } + + fn accept(&self, address: Option<&mut SocketAddr>) -> super::Result> { + if let Some(proxy) = self.proxy.as_ref() { + return proxy.accept(address); + } + + return Err(FileSystemError::NotSupported); + } + + fn recv(&self, message_header: &mut MessageHeader) -> super::Result { + if let Some(proxy) = self.proxy.as_ref() { + return proxy.recv(message_header); + } + + return Err(FileSystemError::NotSupported); + } + + fn poll(&self, table: Option<&mut PollTable>) -> super::Result { + if let Some(proxy) = self.proxy.as_ref() { + return proxy.poll(table); + } + + return Err(FileSystemError::NotSupported); + } } pub struct DirEntryIter { @@ -526,15 +616,19 @@ impl Ext2 { })) } - pub fn find_inode(&self, id: usize) -> Option { - INode::new(self.sref.clone(), id) + pub fn find_inode( + &self, + id: usize, + proxy: Option>, + ) -> Option { + INode::new(self.sref.clone(), id, proxy) } } impl FileSystem for Ext2 { fn root_dir(&self) -> DirCacheItem { let inode = self - .find_inode(Ext2::ROOT_INODE_ID) + .find_inode(Ext2::ROOT_INODE_ID, None) .expect("ext2: invalid filesystem (root inode not found)"); DirEntry::new_root(inode, String::from("/")) From 99faa416bb0ab69cf67293afd2518ae76e67fc40 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 27 Oct 2022 18:59:22 +1100 Subject: [PATCH 029/368] rust-toolchain: revert to using latest nightly Revert to using latest nightly as the rust toolchain since the blocker issue (https://github.com/rust-lang/rust/pull/101988#issuecomment-1272407248) has been resolved. Signed-off-by: Andy-Python-Programmer --- rust-toolchain | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rust-toolchain b/rust-toolchain index e3d9c6d8501..721047ac5fc 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1,4 +1,3 @@ [toolchain] -# https://github.com/rust-lang/rust/pull/101988#issuecomment-1272407248 -channel = "nightly-2022-10-07" +channel = "nightly" components = ["rust-src", "rustfmt", "clippy"] From 15f57c121da9105e6a9a3b72a98e2b3b7d84dafc Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 31 Oct 2022 17:09:02 +1100 Subject: [PATCH 030/368] aero.py: use run_command to run xbstrap Signed-off-by: Andy-Python-Programmer --- aero.py | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/aero.py b/aero.py index 0ffcaa30d7d..abe46e4521a 100755 --- a/aero.py +++ b/aero.py @@ -330,27 +330,7 @@ def build_userland_sysroot(args): # symlink the bootstrap.yml file in the src root to sysroot/bootstrap.link symlink_rel('bootstrap.yml', blink) - os.chdir(SYSROOT_DIR) - - args = { - "update": True, - "all": True, - "dry_run": False, - "check": False, - "recursive": False, - "paranoid": False, - "reset": False, - "hard_reset": False, - "only_wanted": False, - "keep_going": False, - - "progress_file": None, # file that receives machine-ready progress notifications - "reconfigure": False, - "rebuild": False - } - - namespace = argparse.Namespace(**args) - xbstrap.do_install(namespace) + run_command(['xbstrap', 'install', '-u', '--all'], cwd=SYSROOT_DIR) def build_userland(args): @@ -496,7 +476,7 @@ def run_in_emulator(build_info: BuildInfo, iso_path): '-m', args.memory, '-smp', '1', '-serial', 'stdio', - '-drive', 'file=build/disk.img,if=none,id=NVME1', '-device', 'nvme,drive=NVME1,serial=nvme', + '-drive', 'file=build/disk.img,if=none,id=NVME1,format=raw', '-device', 'nvme,drive=NVME1,serial=nvme', # Specify the boot order (where `d` is the first CD-ROM drive) '--boot', 'd'] From 4a6b5e601df7af73baf33b4b8bd4118a1f5ef7a0 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 31 Oct 2022 17:10:45 +1100 Subject: [PATCH 031/368] bootstrap::xorg: remove host-gettext Signed-off-by: Andy-Python-Programmer --- bootstrap/xorg.yml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index d096c5bb9fe..91c0952415e 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -82,22 +82,6 @@ tools: install: - args: ['make', 'install-strip'] - - name: host-gettext - from_source: gettext - exports_aclocal: true - tools_required: - # - host-bison - - host-autoconf-v2.69 - - host-automake-v1.16 - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - compile: - - args: ['make'] - install: - - args: ['make', 'install-strip'] - packages: # `xorg-util-macros` is a set of autoconf macros used by the configure.ac scripts in # other Xorg modular packages, and is needed to generate new versions @@ -1177,7 +1161,6 @@ packages: - host-libtool - host-pkg-config - host-xorg-macros - - host-gettext regenerate: - args: ['./autogen.sh'] environ: From f5588875b4a061cce7d6beedd38cc0d11e02ff84 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 31 Oct 2022 17:14:46 +1100 Subject: [PATCH 032/368] README: update dependencies Signed-off-by: Andy-Python-Programmer --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0755d13ae90..577482b5653 100644 --- a/README.md +++ b/README.md @@ -52,14 +52,15 @@ Aero. If you are using windows, its highly recommended to use WSL 2. ## Dependencies Before building Aero, you need the following things installed: -- `rustc` should be the **latest nightly** -- `qemu` +- `rust` (should be the **latest nightly**) +- `qemu` (optional: required if you want to run it in the Qemu emulator) - `nasm` -- `g++` 5.1 or later -- `ninja` -- `parted` -- `meson` -- `python3` + +If you are building Aero with sysroot then the following dependencies are additionally required: +```sh +# Arch Linux: +sudo pacman -S bash coreutils make patch tar gzip binutils gcc git subversion mercurial curl wget xz nasm mtools meson perl m4 texinfo groff gettext expat bison flex help2man openssl gperf rsync libxslt python python-pip python-mako xcb-proto xorriso boost-libs cmake +``` ## Hardware From 46270be5ed8876b650015330fd5dbd56c0448b6a Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 31 Oct 2022 17:16:08 +1100 Subject: [PATCH 033/368] ext2::FileType: implement Copy and Clone Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/disk.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index 2305a445cad..8bef2562bed 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -157,7 +157,7 @@ impl DirEntry { } #[repr(u8)] -#[derive(PartialEq)] +#[derive(PartialEq, Copy, Clone)] pub enum FileType { Unknown = 0, Fifo = 1, From 61c0a0af00fcdb0536c4cbe51f56328456261dd3 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 31 Oct 2022 17:16:41 +1100 Subject: [PATCH 034/368] bochrc: update Signed-off-by: Andy-Python-Programmer --- bochsrc.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/bochsrc.txt b/bochsrc.txt index 24626017673..5248ae51f7c 100644 --- a/bochsrc.txt +++ b/bochsrc.txt @@ -10,5 +10,3 @@ cpu: count=4, reset_on_triple_fault=0, model=corei7_haswell_4770, ip cpuid: 1g_pages=0, apic=x2apic debug: action=report ata0-master: type=disk, path="build/aero.iso", mode=flat -plugin_ctrl: e1000=1 -e1000: enabled=0, mac=fe:fd:de:ad:be:ef, ethmod=null From af1603be0739943dbf595d13be20f9699f373517 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 31 Oct 2022 17:17:38 +1100 Subject: [PATCH 035/368] tools::mkimage: abort on failure and debug print executed commands Signed-off-by: Andy-Python-Programmer --- tools/mkimage.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/mkimage.sh b/tools/mkimage.sh index 7693ae32428..5cdfc32010d 100755 --- a/tools/mkimage.sh +++ b/tools/mkimage.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -x -e + # sync the sysroot echo "sysroot: syncing base-files" cp -r base-files/. sysroot/system-root/ From d881812779782acefd27166ce395734c26badafe Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 1 Nov 2022 13:58:13 +1100 Subject: [PATCH 036/368] nvme::namespace_list: handle unused entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit According to NVM Express® Base Specification, Revision 2.0c 4.4.2 (Namespace List), unused entries in the namespace list are zero filled. Signed-off-by: Andy-Python-Programmer --- .../src/drivers/block/nvme/command.rs | 1 + src/aero_kernel/src/drivers/block/nvme/dma.rs | 6 ++ src/aero_kernel/src/drivers/block/nvme/mod.rs | 83 ++++++++++--------- .../src/drivers/block/nvme/queue.rs | 20 ++++- 4 files changed, 67 insertions(+), 43 deletions(-) diff --git a/src/aero_kernel/src/drivers/block/nvme/command.rs b/src/aero_kernel/src/drivers/block/nvme/command.rs index e4c3b3d607c..f93c590a189 100644 --- a/src/aero_kernel/src/drivers/block/nvme/command.rs +++ b/src/aero_kernel/src/drivers/block/nvme/command.rs @@ -187,6 +187,7 @@ pub struct IdentifyController { pub sqes: u8, pub cqes: u8, pub maxcmd: u16, + /// This field indicates the maximum value of a valid NSID for the NVM subsystem. pub nn: u32, pub oncs: u16, pub fuses: u16, diff --git a/src/aero_kernel/src/drivers/block/nvme/dma.rs b/src/aero_kernel/src/drivers/block/nvme/dma.rs index e4ce428770c..3a1ec392e1f 100644 --- a/src/aero_kernel/src/drivers/block/nvme/dma.rs +++ b/src/aero_kernel/src/drivers/block/nvme/dma.rs @@ -112,6 +112,12 @@ impl core::ops::DerefMut for Dma { } } +impl core::fmt::Debug for Dma { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.debug_tuple("Dma").field(&self.0).finish() + } +} + impl Dma { pub fn addr(&self) -> PhysAddr { unsafe { diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 43dee9996fb..d99d65cbb00 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -363,9 +363,8 @@ impl<'a> Controller<'a> { io_cq_cmd.prp1 = io_queue.completion_addr().as_u64(); io_cq_cmd.cqid = io_queue.id(); io_cq_cmd.q_size = (io_queue.len() - 1) as u16; - io_cq_cmd.irq_vector = vector as u16; - io_cq_cmd.cq_flags = - (CommandFlags::CQ_IRQ_ENABLED | CommandFlags::QUEUE_PHYS_CONTIG).bits(); + io_cq_cmd.irq_vector = 0; + io_cq_cmd.cq_flags = CommandFlags::QUEUE_PHYS_CONTIG.bits(); admin.submit_command(io_cq_cmd); @@ -376,8 +375,7 @@ impl<'a> Controller<'a> { io_sq_cmd.cqid = io_queue.id(); io_sq_cmd.sqid = io_queue.id(); io_sq_cmd.q_size = (io_queue.len() - 1) as u16; - io_sq_cmd.sq_flags = - (CommandFlags::CQ_IRQ_ENABLED | CommandFlags::QUEUE_PHYS_CONTIG).bits(); + io_sq_cmd.sq_flags = CommandFlags::QUEUE_PHYS_CONTIG.bits(); admin.submit_command(io_sq_cmd); @@ -396,7 +394,8 @@ impl<'a> Controller<'a> { io_queue: Mutex::new(io_queue), }); - let namespace_ids = || { + // Discover and initialize the namespaces. + let nsids = { let nsid_list = Dma::::new_uninit_slice(this.identity.nn as usize); let mut nsid_command = IdentifyCommand::default(); @@ -410,48 +409,50 @@ impl<'a> Controller<'a> { unsafe { nsid_list.assume_init() } }; - // Discover and initialize the namespaces. - let nsids = namespace_ids(); - let namespaces = nsids - .iter() - .map(|nsid| { - let identity = Dma::::new(); - let mut identify_command = IdentifyCommand::default(); - - identify_command.opcode = AdminOpcode::Identify as u8; - identify_command.cns = IdentifyCns::Namespace as u8; - identify_command.nsid = *nsid; - identify_command.data_ptr.prp1 = identity.addr().as_u64(); - - this.admin.lock().submit_command(identify_command); - - let blocks = identity.nsze as usize; - let block_size = 1 << identity.lbaf[(identity.flbas & 0b11111) as usize].ds; - - // The maximum transfer size is in units of 2^(min page size) - let lba_shift = identity.lbaf[(identity.flbas & 0xf) as usize].ds; - let max_lbas = 1 << (max_transfer_shift - lba_shift as usize); - let max_prps = (max_lbas * (1 << lba_shift)) / Size4KiB::SIZE as usize; - - Namespace { - controller: this.clone(), - nsid: *nsid, - blocks, - block_size, - size: blocks * block_size, - max_prps, - prps: Mutex::new(Dma::new_uninit_slice(max_prps)), - } - }) - .collect::>(); + let mut namespaces = alloc::vec![]; + + for &nsid in nsids.iter() { + // Unused entries are zero-filled. + if nsid == 0 { + continue; + } + + let identity = Dma::::new(); + let mut identify_command = IdentifyCommand::default(); + + identify_command.opcode = AdminOpcode::Identify as u8; + identify_command.cns = IdentifyCns::Namespace as u8; + identify_command.nsid = nsid; + identify_command.data_ptr.prp1 = identity.addr().as_u64(); + + this.admin.lock().submit_command(identify_command); + + let blocks = identity.nsze as usize; + let block_size = 1 << identity.lbaf[(identity.flbas & 0b11111) as usize].ds; + + // The maximum transfer size is in units of 2^(min page size) + let lba_shift = identity.lbaf[(identity.flbas & 0xf) as usize].ds; + let max_lbas = 1 << (max_transfer_shift - lba_shift as usize); + let max_prps = (max_lbas * (1 << lba_shift)) / Size4KiB::SIZE as usize; + + let namespace = Namespace { + controller: this.clone(), + nsid, + blocks, + block_size, + size: blocks * block_size, + max_prps, + prps: Mutex::new(Dma::new_uninit_slice(max_prps)), + }; - for namespace in namespaces.iter() { log::trace!( "nvme: identified namespace (blocks={}, block_size={}, size={})", namespace.blocks, namespace.block_size, namespace.size ); + + namespaces.push(namespace); } *this.namespaces.lock() = namespaces; diff --git a/src/aero_kernel/src/drivers/block/nvme/queue.rs b/src/aero_kernel/src/drivers/block/nvme/queue.rs index a74edd4df3c..fdbb3f28c57 100644 --- a/src/aero_kernel/src/drivers/block/nvme/queue.rs +++ b/src/aero_kernel/src/drivers/block/nvme/queue.rs @@ -109,25 +109,41 @@ pub(super) struct QueuePair<'a> { id: u16, size: usize, + cid: u16, + submission: Queue<'a, Submisson>, completion: Queue<'a, Completion>, } impl<'a> QueuePair<'a> { pub fn new(registers: &Registers, size: usize) -> Result { - let queue_id = QUEUE_PAIR_ID.fetch_add(2, Ordering::SeqCst); + let queue_id = QUEUE_PAIR_ID.fetch_add(1, Ordering::SeqCst); Ok(Self { size, id: queue_id, + cid: 0, + submission: Queue::new(registers, size, queue_id)?, completion: Queue::new(registers, size, queue_id)?, }) } pub fn submit_command>(&mut self, command: T) { - self.submission.submit_command(command.into()); + let mut command = command.into(); + + unsafe { + // SAFETY: Command Layout: + // - opcode: u8 + // - flags: u8 + // - command_id: u16 (offset=2 bytes)) + *(&mut command as *mut Command as *mut u16).offset(1) = self.cid; + } + + self.cid += 1; + + self.submission.submit_command(command); self.completion.next_cmd_result().unwrap(); } From 9e6fe453dad89354fb70f8459a149b3c2e295ce6 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 1 Nov 2022 14:12:04 +1100 Subject: [PATCH 037/368] fs::lookup_path: handle absolute symlinks Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/mod.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index 488a9e22641..bb550977c0d 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -272,10 +272,14 @@ pub fn lookup_path_with( let metadata = inode.metadata()?; if metadata.is_symlink() { - let relative_path_str = inode.resolve_link()?; - let relative_path = Path::new(&relative_path_str); + let resolved_path_str = inode.resolve_link()?; + let resolved_path = Path::new(&resolved_path_str); - return lookup_path_with(parent, relative_path, LookupMode::None); + if resolved_path.is_absolute() { + return lookup_path(resolved_path); + } + + return lookup_path_with(parent, resolved_path, LookupMode::None); } else if metadata.is_directory() { if let Ok(mount_point) = MOUNT_MANAGER.find_mount(cwd.clone()) { cwd = mount_point.root_entry; From b75bd4395bfe9d99322fd461bcc5dd778f8f80c7 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 2 Nov 2022 17:47:16 +1100 Subject: [PATCH 038/368] bootstrap::xorg-server: add pkgconfig in required tools This is required so it picks the correct XKB bin path. Signed-off-by: Andy-Python-Programmer --- bootstrap/xorg.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index 91c0952415e..0edc6602001 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -609,6 +609,7 @@ packages: NOCONFIGURE: 'yes' tools_required: - host-gcc + - host-pkg-config pkgs_required: - mlibc - xorg-util-macros From 9c0b0e9b27fc95bfafc876582ae18021ebfc6f00 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 4 Nov 2022 17:03:22 +1100 Subject: [PATCH 039/368] ext2: implement `as_unix_socket` Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/mod.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index a6dcd7a5a16..fbf31a87289 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -528,6 +528,13 @@ impl INodeInterface for INode { return Err(FileSystemError::NotSupported); } + + fn as_unix_socket(&self) -> super::Result> { + self.proxy + .as_ref() + .ok_or(FileSystemError::NotSocket) + .cloned() + } } pub struct DirEntryIter { From f21d239aad08ccdce3c22f1da67730e81d76490e Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 4 Nov 2022 17:04:30 +1100 Subject: [PATCH 040/368] bootstrap::bash: symlink bash as sh Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/bootstrap.yml b/bootstrap.yml index 85bdeaf9779..d10f4bab5e7 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -851,6 +851,7 @@ packages: build: - args: ['make', '-j@PARALLELISM@'] - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] + - args: ['ln', '-sf', 'bash', '@THIS_COLLECT_DIR@/usr/bin/sh'] - name: tcc source: From dfe8a3adab9df13bc8d788417b9d4d44b96a6837 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 5 Nov 2022 15:00:22 +1100 Subject: [PATCH 041/368] unwind::stack_trace: add irq guard Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/unwind.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index d8c76451db8..bbafdd4abf0 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -73,6 +73,8 @@ impl UnwindInfo { } pub fn unwind_stack_trace() { + let _guard = IrqGuard::new(); + let mut address_space = AddressSpace::this(); let offset_table = address_space.offset_page_table(); @@ -158,6 +160,7 @@ pub fn unwind_stack_trace() { #[cfg(feature = "ci")] use crate::emu; +use crate::utils::sync::IrqGuard; #[panic_handler] extern "C" fn rust_begin_unwind(info: &PanicInfo) -> ! { From fe1ec2bdc6134ec0b44f45e987c9af4c2c3bff2f Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 8 Nov 2022 18:12:36 +1100 Subject: [PATCH 042/368] process::exit: log the process path on exit Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/syscall/process.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index 2343f023738..2ee20312e86 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -44,14 +44,13 @@ pub fn exit(status: usize) -> Result { #[cfg(not(feature = "ci"))] { - log::trace!( - "exiting the process (pid={pid}) with status: {status}", - pid = scheduler::get_scheduler().current_task().pid().as_usize(), - status = status - ); + let current_task = scheduler::get_scheduler().current_task(); + let pid = current_task.pid().as_usize(); + let path = current_task.path(); - crate::unwind::unwind_stack_trace(); + log::trace!("exiting the process (pid={pid}, path={path:?}) with status: {status}"); + crate::unwind::unwind_stack_trace(); scheduler::get_scheduler().exit(status as isize); } } From bddd6e2fce6dba82024c8f98815886e70e9be9d5 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 8 Nov 2022 18:15:27 +1100 Subject: [PATCH 043/368] various changes to make xeyes work honestly, couldnt give a fuck to create seperate commit for each change. so good. --- bootstrap.yml | 166 ++++++++++++--------- bootstrap/xorg.yml | 2 +- src/aero_kernel/src/arch/x86_64/signals.rs | 6 - src/aero_kernel/src/arch/x86_64/time.rs | 1 + src/aero_kernel/src/fs/ext2/mod.rs | 8 +- src/aero_kernel/src/fs/file_table.rs | 18 +-- src/aero_kernel/src/fs/inode.rs | 11 +- src/aero_kernel/src/fs/pipe.rs | 3 +- src/aero_kernel/src/mem/alloc.rs | 5 +- src/aero_kernel/src/socket/unix.rs | 90 +++++++---- src/aero_kernel/src/syscall/fs.rs | 61 ++++---- src/aero_kernel/src/syscall/net.rs | 26 ++-- src/aero_kernel/src/syscall/time.rs | 36 ++++- src/aero_kernel/src/userland/task.rs | 26 ++-- src/aero_syscall/src/lib.rs | 69 --------- src/aero_syscall/src/time.rs | 25 ++++ 16 files changed, 297 insertions(+), 256 deletions(-) diff --git a/bootstrap.yml b/bootstrap.yml index d10f4bab5e7..8efb70c4dbe 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -442,61 +442,61 @@ tools: - args: ['ninja', 'install'] packages: - - name: ripgrep - source: - subdir: bundled - git: 'https://github.com/BurntSushi/ripgrep.git' - tag: '12.1.1' - version: '12.1.1' - tools_required: - - host-cargo - sources_required: - - rust-patched-libs - pkgs_required: - - mlibc - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - # cc: https://github.com/rust-lang/cargo/issues/10283 - # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] - build: - - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', './Cargo.toml'] - - args: - - 'cargo' - - 'install' - - '--locked' - - '--path' - - '.' - - '--root' - - '@THIS_COLLECT_DIR@/usr' - - '-j@PARALLELISM@' + # - name: ripgrep + # source: + # subdir: bundled + # git: 'https://github.com/BurntSushi/ripgrep.git' + # tag: '12.1.1' + # version: '12.1.1' + # tools_required: + # - host-cargo + # sources_required: + # - rust-patched-libs + # pkgs_required: + # - mlibc + # configure: + # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + # # cc: https://github.com/rust-lang/cargo/issues/10283 + # # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] + # build: + # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', './Cargo.toml'] + # - args: + # - 'cargo' + # - 'install' + # - '--locked' + # - '--path' + # - '.' + # - '--root' + # - '@THIS_COLLECT_DIR@/usr' + # - '-j@PARALLELISM@' - - name: hex - source: - subdir: bundled - git: 'https://github.com/sitkevij/hex' - tag: 'v0.4.2' - version: '0.4.2' - tools_required: - - host-cargo - sources_required: - - rust-patched-libs - pkgs_required: - - mlibc - configure: - # cc: https://github.com/rust-lang/cargo/issues/10283 - # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - build: - - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', './Cargo.toml'] - - args: - - 'cargo' - - 'install' - - '--locked' - - '--path' - - '.' - - '--root' - - '@THIS_COLLECT_DIR@/usr' - - '-j@PARALLELISM@' + # - name: hex + # source: + # subdir: bundled + # git: 'https://github.com/sitkevij/hex' + # tag: 'v0.4.2' + # version: '0.4.2' + # tools_required: + # - host-cargo + # sources_required: + # - rust-patched-libs + # pkgs_required: + # - mlibc + # configure: + # # cc: https://github.com/rust-lang/cargo/issues/10283 + # # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] + # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + # build: + # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', './Cargo.toml'] + # - args: + # - 'cargo' + # - 'install' + # - '--locked' + # - '--path' + # - '.' + # - '--root' + # - '@THIS_COLLECT_DIR@/usr' + # - '-j@PARALLELISM@' # - name: bat # source: @@ -541,33 +541,53 @@ packages: - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/bin'] - args: ['cp', '@THIS_BUILD_DIR@/qjs', '@THIS_COLLECT_DIR@/usr/bin/qjs'] - - name: sd + # - name: sd + # source: + # subdir: bundled + # git: 'https://github.com/chmln/sd' + # tag: 'v0.7.6' + # version: '0.7.6' + # tools_required: + # - host-cargo + # sources_required: + # - rust-patched-libs + # pkgs_required: + # - mlibc + # configure: + # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + # # cc: https://github.com/rust-lang/cargo/issues/10283 + # # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] + # build: + # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', './Cargo.toml'] + # - args: + # - 'cargo' + # - 'install' + # - '--locked' + # - '--path' + # - '.' + # - '--root' + # - '@THIS_COLLECT_DIR@/usr' + # - '-j@PARALLELISM@' + + - name: socket_test source: subdir: bundled - git: 'https://github.com/chmln/sd' - tag: 'v0.7.6' - version: '0.7.6' + git: 'https://github.com/streaksu/socket_test' + branch: 'main' tools_required: - - host-cargo - sources_required: - - rust-patched-libs + - host-gcc pkgs_required: - mlibc configure: - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - # cc: https://github.com/rust-lang/cargo/issues/10283 - # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] build: - - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', './Cargo.toml'] - - args: - - 'cargo' - - 'install' - - '--locked' - - '--path' - - '.' - - '--root' - - '@THIS_COLLECT_DIR@/usr' - - '-j@PARALLELISM@' + - args: ['make', '-j@PARALLELISM@'] + environ: + CC: "x86_64-aero-gcc" + - args: ['make', 'install'] + environ: + PREFIX: '/usr' + DESTDIR: '@THIS_COLLECT_DIR@' - name: mlibc-headers from_source: mlibc diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index 0edc6602001..30e2af1a2ac 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -658,7 +658,7 @@ packages: CFLAGS: '-Wno-error=array-bounds -O0 -g -pipe' build: - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] + - args: ['make', 'install'] environ: DESTDIR: '@THIS_COLLECT_DIR@' - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/etc/X11'] diff --git a/src/aero_kernel/src/arch/x86_64/signals.rs b/src/aero_kernel/src/arch/x86_64/signals.rs index 64682ce5098..4f8b52114a4 100644 --- a/src/aero_kernel/src/arch/x86_64/signals.rs +++ b/src/aero_kernel/src/arch/x86_64/signals.rs @@ -170,12 +170,6 @@ pub fn sigreturn(stack: &mut InterruptStack) -> usize { *stack = signal_frame.frame; if signal_frame.restart_syscall != u64::MAX { - #[cfg(feature = "syslog")] - log::debug!( - "sigreturn: restarting {} syscall", - aero_syscall::syscall_as_str(signal_frame.restart_syscall as _) - ); - stack.iret.rip -= SYSCALL_INSTRUCTION_SIZE; } diff --git a/src/aero_kernel/src/arch/x86_64/time.rs b/src/aero_kernel/src/arch/x86_64/time.rs index 7fabaf15b5d..7c7c8b31729 100644 --- a/src/aero_kernel/src/arch/x86_64/time.rs +++ b/src/aero_kernel/src/arch/x86_64/time.rs @@ -111,6 +111,7 @@ fn pit_irq_handler(_stack: &mut InterruptStack) { if value % PIT_FREQUENCY_HZ == 0 { UPTIME_SEC.fetch_add(1, Ordering::Relaxed); // Increment uptime seconds + crate::syscall::check_timers(); } } diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index fbf31a87289..7825e90c50a 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -32,7 +32,7 @@ use spin::RwLock; use crate::fs::block::BlockDeviceInterface; use crate::fs::cache::CachedINode; use crate::fs::ext2::disk::{FileType, SuperBlock}; -use crate::mem::paging::{FrameAllocator, PhysFrame, FRAME_ALLOCATOR}; +use crate::mem::paging::{FrameAllocator, PhysFrame, VirtAddr, FRAME_ALLOCATOR}; use crate::socket::unix::UnixSocket; use crate::socket::SocketAddr; @@ -505,7 +505,7 @@ impl INodeInterface for INode { return Err(FileSystemError::NotSupported); } - fn accept(&self, address: Option<&mut SocketAddr>) -> super::Result> { + fn accept(&self, address: Option<(VirtAddr, &mut u32)>) -> super::Result> { if let Some(proxy) = self.proxy.as_ref() { return proxy.accept(address); } @@ -513,9 +513,9 @@ impl INodeInterface for INode { return Err(FileSystemError::NotSupported); } - fn recv(&self, message_header: &mut MessageHeader) -> super::Result { + fn recv(&self, message_header: &mut MessageHeader, non_block: bool) -> super::Result { if let Some(proxy) = self.proxy.as_ref() { - return proxy.recv(message_header); + return proxy.recv(message_header, non_block); } return Err(FileSystemError::NotSupported); diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index 744184a960e..44aaaa01cb3 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -45,7 +45,7 @@ pub struct FileHandle { // We need to store the `offset` behind an Arc since when the file handle // is duplicated, the `offset` needs to be in sync with the parent. pub offset: Arc, - pub flags: OpenFlags, + pub flags: RwLock, pub fd_flags: Mutex, } @@ -56,7 +56,7 @@ impl FileHandle { fd, inode: inode.clone(), offset: Arc::new(AtomicUsize::new(0)), - flags, + flags: RwLock::new(flags), fd_flags: Mutex::new(FdFlags::empty()), } } @@ -123,16 +123,16 @@ impl FileHandle { } pub fn duplicate(&self, dupfd: usize, flags: OpenFlags) -> super::Result> { - let flags = self.flags | flags; + let flags = *self.flags.read() | flags; let new = Arc::new(Self { fd: dupfd, inode: self.inode.clone(), offset: self.offset.clone(), - flags, + flags: RwLock::new(flags), fd_flags: Mutex::new(self.fd_flags.lock().clone()), }); - new.inode.inode().open(flags)?; + new.inode.inode().open(flags, new.clone())?; Ok(new) } @@ -266,7 +266,7 @@ impl FileTable { let handle = handle.duplicate(new_fd, flags)?; let old = files[new_fd].take().unwrap(); - old.inode.inode().close(old.flags); + old.inode.inode().close(*old.flags.read()); files[new_fd] = Some(handle); Ok(0x00) @@ -301,7 +301,7 @@ impl FileTable { if let Some((i, f)) = files.iter_mut().enumerate().find(|e| e.1.is_none()) { let handle = Arc::new(FileHandle::new(i, dentry, flags)); - handle.inode.inode().open(flags)?; + handle.inode.inode().open(flags, handle.clone())?; *f = Some(handle); Ok(i) @@ -309,7 +309,7 @@ impl FileTable { let fd = files.len(); let handle = Arc::new(FileHandle::new(fd, dentry, flags)); - handle.inode.inode().open(flags)?; + handle.inode.inode().open(flags, handle.clone())?; files.push(Some(handle)); Ok(fd) @@ -326,7 +326,7 @@ impl FileTable { if let Some(file) = files.get_mut(fd) { if let Some(handle) = file { - handle.inode.inode().close(handle.flags); + handle.inode.inode().close(*handle.flags.read()); *file = None; return true; diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 0e9016a4cbd..fb1578e7337 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -30,7 +30,7 @@ use alloc::vec::Vec; use intrusive_collections::UnsafeRef; use spin::Once; -use crate::mem::paging::PhysFrame; +use crate::mem::paging::{PhysFrame, VirtAddr}; use crate::socket::unix::UnixSocket; use crate::socket::SocketAddr; use crate::userland::scheduler; @@ -42,6 +42,7 @@ use super::cache::Cacheable; use super::cache::CachedINode; use super::cache::{DirCacheItem, INodeCacheItem}; use super::devfs::DevINode; +use super::file_table::FileHandle; use super::{FileSystem, FileSystemError, Result}; static DIR_CACHE_MARKER: AtomicUsize = AtomicUsize::new(0x00); @@ -70,7 +71,7 @@ impl Drop for PollTable { bitflags::bitflags! { pub struct PollFlags: usize { /// The associated file is available for read operations. - const IN = 1 << 1; + const IN = 1 << 1; /// The associated file is available for write operations. const OUT = 1 << 2; /// Error condition happened on the associated file descriptor. @@ -192,7 +193,7 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSupported) } - fn open(&self, _flags: OpenFlags) -> Result<()> { + fn open(&self, _flags: OpenFlags, _handle: Arc) -> Result<()> { Ok(()) } @@ -239,11 +240,11 @@ pub trait INodeInterface: Send + Sync { Err(SyscallError::ENOTSOCK) } - fn accept(&self, _address: Option<&mut SocketAddr>) -> Result> { + fn accept(&self, _address: Option<(VirtAddr, &mut u32)>) -> Result> { Err(FileSystemError::NotSocket) } - fn recv(&self, _message_header: &mut MessageHeader) -> Result { + fn recv(&self, _message_header: &mut MessageHeader, _non_block: bool) -> Result { Err(FileSystemError::NotSocket) } diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index 4148ba33c5d..b15ac894bfc 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -6,6 +6,7 @@ use alloc::sync::Arc; use crate::utils::buffer::Buffer; use crate::utils::sync::{BlockQueue, Mutex}; +use super::file_table::FileHandle; use super::inode::{INodeInterface, PollFlags, PollTable}; pub struct Pipe { @@ -37,7 +38,7 @@ impl Pipe { } impl INodeInterface for Pipe { - fn open(&self, flags: OpenFlags) -> super::Result<()> { + fn open(&self, flags: OpenFlags, _handle: Arc) -> super::Result<()> { // Write end of the pipe: if flags.contains(OpenFlags::O_WRONLY) { self.num_writers.fetch_add(1, Ordering::SeqCst); diff --git a/src/aero_kernel/src/mem/alloc.rs b/src/aero_kernel/src/mem/alloc.rs index a5069f121fc..3e58a6fb39c 100644 --- a/src/aero_kernel/src/mem/alloc.rs +++ b/src/aero_kernel/src/mem/alloc.rs @@ -34,9 +34,12 @@ impl Allocator { fn alloc(&self, layout: Layout) -> *mut u8 { let size = align_up(layout.size() as _, layout.align() as _); - if size <= 4096 { + if size <= Size4KiB::SIZE { let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().unwrap(); frame.start_address().as_hhdm_virt().as_mut_ptr() + } else if size <= Size2MiB::SIZE { + let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().unwrap(); + frame.start_address().as_hhdm_virt().as_mut_ptr() } else { let size = align_up(size, Size4KiB::SIZE) / Size4KiB::SIZE; diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 9c0832b5a6a..45feed6f045 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -17,19 +17,22 @@ * along with Aero. If not, see . */ -use aero_syscall::{SocketAddrUnix, SyscallError}; +use aero_syscall::{OpenFlags, SocketAddrUnix, SyscallError, AF_UNIX}; use aero_syscall::socket::MessageHeader; use alloc::collections::VecDeque; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; +use spin::Once; use crate::fs; +use crate::fs::file_table::FileHandle; use crate::fs::inode::*; use crate::fs::{FileSystemError, Path}; +use crate::mem::paging::VirtAddr; use crate::utils::sync::{BlockQueue, Mutex}; use super::SocketAddr; @@ -113,11 +116,6 @@ impl AcceptQueue { } } - /// Returns the number of pending connections in the queue. - pub fn len(&self) -> usize { - self.sockets.len() - } - /// Returns `true` if the queue contains no pending connections. pub fn is_empty(&self) -> bool { self.sockets.is_empty() @@ -171,6 +169,13 @@ impl UnixSocketState { fn is_connected(&self) -> bool { matches!(self, Self::Connected(_)) } + + fn queue(&mut self) -> Option<&mut AcceptQueue> { + match self { + Self::Listening(q) => Some(q), + _ => None, + } + } } #[derive(Default)] @@ -186,6 +191,7 @@ pub struct UnixSocket { buffer: Mutex, wq: BlockQueue, weak: Weak, + handle: Once>, } impl UnixSocket { @@ -196,12 +202,22 @@ impl UnixSocket { buffer: Mutex::new(MessageQueue::default()), wq: BlockQueue::new(), weak: weak.clone(), + handle: Once::new(), }) } pub fn sref(&self) -> Arc { self.weak.upgrade().unwrap() } + + pub fn is_non_block(&self) -> bool { + self.handle + .get() + .expect("unix: not bound to an fd") + .flags + .read() + .contains(OpenFlags::O_NONBLOCK) + } } impl INodeInterface for UnixSocket { @@ -214,7 +230,16 @@ impl INodeInterface for UnixSocket { }) } + fn open(&self, _flags: aero_syscall::OpenFlags, handle: Arc) -> fs::Result<()> { + self.handle.call_once(|| handle); + Ok(()) + } + fn read_at(&self, _offset: usize, user_buffer: &mut [u8]) -> fs::Result { + if self.buffer.lock_irq().is_empty() && self.is_non_block() { + return Err(FileSystemError::WouldBlock); + } + let mut buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; let read = buffer.read(user_buffer); @@ -293,21 +318,19 @@ impl INodeInterface for UnixSocket { target.wq.notify_complete(); core::mem::drop(itarget); // release the lock - let _ = self.wq.block_on(&self.inner, |e| e.state.is_connected()); + let _ = self.wq.block_on(&self.inner, |e| e.state.is_connected())?; Ok(()) } - fn accept(&self, _address: Option<&mut SocketAddr>) -> fs::Result> { - let mut inner = self.inner.lock_irq(); - - let queue = match &mut inner.state { - UnixSocketState::Listening(queue) => queue, - _ => return Err(FileSystemError::ConnectionRefused), - }; + fn accept(&self, address: Option<(VirtAddr, &mut u32)>) -> fs::Result> { + let mut inner = self.wq.block_on(&self.inner, |e| { + e.state.queue().map(|x| !x.is_empty()).unwrap_or(false) + })?; - if queue.len() == 0 { - return Err(FileSystemError::WouldBlock); - } + let queue = inner + .state + .queue() + .ok_or(FileSystemError::ConnectionRefused)?; let peer = queue.pop().expect("UnixSocket::accept(): backlog is empty"); let sock = Self::new(); @@ -322,23 +345,37 @@ impl INodeInterface for UnixSocket { peer_data.state = UnixSocketState::Connected(sock.clone()); } + if let Some((address, length)) = address { + let address = address + .read_mut::() + .ok_or(FileSystemError::NotSupported)?; + + if let Some(paddr) = peer.inner.lock_irq().address.as_ref() { + *address = paddr.clone(); + } else { + *address = SocketAddrUnix::default(); + address.family = AF_UNIX; + } + + *length = core::mem::size_of::() as u32; + } + peer.wq.notify_complete(); Ok(sock) } - fn recv(&self, header: &mut MessageHeader) -> fs::Result { + fn recv(&self, header: &mut MessageHeader, non_block: bool) -> fs::Result { let inner = self.inner.lock_irq(); - log::trace!( - "UnixSocket::recv(): expecting a max of {} bytes", - header.iovecs().iter().map(|e| e.len()).sum::(), - ); - let peer = match &inner.state { UnixSocketState::Connected(peer) => peer, _ => return Err(FileSystemError::NotConnected), }; + if self.buffer.lock_irq().is_empty() && non_block { + return Err(FileSystemError::WouldBlock); + } + let mut buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; header @@ -353,22 +390,25 @@ impl INodeInterface for UnixSocket { } fn poll(&self, table: Option<&mut PollTable>) -> fs::Result { + let buffer = self.buffer.lock_irq(); + let inner = self.inner.lock_irq(); + table.map(|e| e.insert(&self.wq)); let mut events = PollFlags::OUT; - let inner = self.inner.lock_irq(); match &inner.state { UnixSocketState::Listening(queue) => { if !queue.is_empty() { events.insert(PollFlags::IN); + return Ok(events); } } _ => {} } - if !self.buffer.lock_irq().is_empty() { + if !buffer.is_empty() { events.insert(PollFlags::IN); } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 71e86cfa3d2..ceb0ff6e79e 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -21,6 +21,7 @@ use aero_syscall::signal::SigProcMask; use aero_syscall::{prelude::*, TimeSpec}; use aero_syscall::{OpenFlags, Stat, SyscallError}; +use crate::fs::cache::DirCacheImpl; use crate::fs::epoll::EPoll; use crate::fs::eventfd::EventFd; use crate::fs::file_table::DuplicateHint; @@ -61,6 +62,7 @@ pub fn read(fd: usize, buffer: &mut [u8]) -> Result { if handle .flags + .read() .intersects(OpenFlags::O_RDONLY | OpenFlags::O_RDWR) { Ok(handle.read(buffer)?) @@ -287,25 +289,24 @@ pub fn pipe(fds: &mut [i32; 2], flags: usize) -> Result { } #[syscall] -pub fn unlink(fd: usize, path: &Path, flags: usize) -> Result { - // TODO: Make use of the open flags. - let _flags = OpenFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; - let name = path.container(); +pub fn unlink(_fd: usize, _path: &Path, _flags: usize) -> Result { + // let _flags = OpenFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; + // let name = path.container(); - if fd as isize == aero_syscall::AT_FDCWD { - let file = fs::lookup_path(path)?; + // if fd as isize == aero_syscall::AT_FDCWD { + // let file = fs::lookup_path(path)?; - if let Some(dir) = file.parent() { - let metadata = file.inode().metadata()?; + // if let Some(dir) = file.parent() { + // let metadata = file.inode().metadata()?; - if metadata.is_file() { - dir.inode().unlink(name.as_str())?; - file.drop_from_cache(); - } - } - } else { - unimplemented!() - } + // if metadata.is_file() { + // dir.inode().unlink(name.as_str())?; + // file.drop_from_cache(); + // } + // } + // } else { + // unimplemented!() + // } Ok(0x00) } @@ -342,7 +343,7 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result scheduler::get_scheduler() .current_task() .file_table - .duplicate(fd, DuplicateHint::GreatorOrEqual(arg), handle.flags), + .duplicate(fd, DuplicateHint::GreatorOrEqual(arg), *handle.flags.read()), aero_syscall::prelude::F_DUPFD_CLOEXEC => scheduler::get_scheduler() .current_task() @@ -350,7 +351,7 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result Result { - let flags = handle.flags.bits(); + let flags = handle.flags.read().bits(); Ok(flags) } aero_syscall::prelude::F_SETFL => { - log::debug!("F_SETFL: is a stub!"); + let flags = OpenFlags::from_bits_truncate(arg); + handle.flags.write().insert(flags); - Ok(0x00) + Ok(0) } _ => unimplemented!("fcntl: unknown command {command}"), @@ -550,6 +552,8 @@ fn do_poll(fds: &mut [PollFd], timeout: Option<&TimeSpec>) -> Result) -> Result v, None => { - fd.revents = PollEventFlags::empty(); return Ok(0); } }; let ready: PollEventFlags = handle.inode().poll(None)?.into(); + log::trace!( + "poll: (fd={} `{:?}`, events={:?} cur={:?})", + fd.fd, + handle.inode.absolute_path_str(), + fd.events, + ready + ); + if !(ready & fd.events).is_empty() { // The registered event is ready; increment the number of ready events // and update revents mask for this event. @@ -581,7 +592,6 @@ fn do_poll(fds: &mut [PollFd], timeout: Option<&TimeSpec>) -> Result 0 { - debug_assert!(refds.len() == 0); return Ok(n); } @@ -596,9 +606,6 @@ fn do_poll(fds: &mut [PollFd], timeout: Option<&TimeSpec>) -> Result Result Result { - // TODO: In the syscall macro, handle Option> param. - let address = if address != 0 { - Some(utils::validate_mut_ptr(address as *mut SocketAddr).ok_or(SyscallError::EINVAL)?) +pub fn accept(fd: usize, address: usize, length: usize) -> Result { + let file_table = scheduler::get_scheduler().current_task().file_table.clone(); + let socket = file_table.get_handle(fd).ok_or(SyscallError::EINVAL)?; + + let address = if address != 0 && length != 0 { + Some(( + VirtAddr::new(address as u64), + VirtAddr::new(length as u64) + .read_mut::() + .ok_or(SyscallError::EACCES)?, + )) } else { None }; - let file_table = scheduler::get_scheduler().current_task().file_table.clone(); - let socket = file_table.get_handle(fd).ok_or(SyscallError::EINVAL)?; - let connection_sock = socket.inode().accept(address)?; let handle = file_table.open_file( DirEntry::from_inode(connection_sock, String::from("")), @@ -75,7 +74,8 @@ pub fn sock_recv( .get_handle(sockfd) .ok_or(SyscallError::EINVAL)?; - Ok(socket.inode().recv(header)?) + let non_block = socket.flags.read().contains(OpenFlags::O_NONBLOCK); + Ok(socket.inode().recv(header, non_block)?) } /// Marks the socket as a passive socket (i.e. as a socket that will be used to accept incoming diff --git a/src/aero_kernel/src/syscall/time.rs b/src/aero_kernel/src/syscall/time.rs index 32cae2b3dca..e0e5f352e91 100644 --- a/src/aero_kernel/src/syscall/time.rs +++ b/src/aero_kernel/src/syscall/time.rs @@ -17,10 +17,14 @@ * along with Aero. If not, see . */ -use aero_syscall::time::ITimerVal; +use aero_syscall::time::{ITimerVal, ITIMER_REAL}; use aero_syscall::{SyscallError, TimeSpec}; +use alloc::sync::Arc; +use alloc::vec::Vec; use crate::userland::scheduler; +use crate::userland::task::Task; +use crate::utils::sync::{IrqGuard, Mutex}; use crate::utils::CeilDiv; const CLOCK_TYPE_REALTIME: usize = 0; @@ -61,16 +65,34 @@ pub fn gettime(clock: usize, timespec: &mut TimeSpec) -> Result>> = Mutex::new(Vec::new()); + +pub fn check_timers() { + // if let Some(task) = TIMERS.lock_irq().pop() { + // task.signal(aero_syscall::signal::SIGALRM); + // } +} + #[syscall] pub fn setitimer( - _which: usize, + which: usize, _new_value: &ITimerVal, - _old_value: &mut ITimerVal, + _old_value: usize, // FIXME: Option<&mut ITimerVal> ) -> Result { - let scheduler = scheduler::get_scheduler(); - scheduler - .current_task() - .signal(aero_syscall::signal::SIGALRM); + let _guard = IrqGuard::new(); + + match which { + // The interval timer value is decremented in real time. The SIGALRM signal is + // generated for the process when this timer expires. + ITIMER_REAL => {} + + _ => unreachable!("setitimer: unimplemented timer (ty={which})"), + } + + TIMERS + .lock_irq() + .push(scheduler::get_scheduler().current_task()); + Ok(0) } diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index b31452c634d..d3bb0ebb857 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -153,12 +153,8 @@ impl Zombies { let (tid, st) = captured; - // WIFEXITED: The child process has been terminated normally by - // either calling sys_exit() or returning from the main function. - *status = 0x200; - // The lower 8-bits are used to store the exit status. - *status |= st as u32 & 0xff; - + log::debug!("waitpid: status = {st}"); + *status = st as u32; Ok(tid.as_usize()) } } @@ -487,15 +483,15 @@ impl Task { } pub(super) fn update_state(&self, state: TaskState) { - if state != TaskState::Runnable { - log::warn!( - "Task::update_state() updated the task state to {state:?}! (pid={:?}, tid={:?})", - self.pid, - self.tid - ); - - crate::unwind::unwind_stack_trace(); - } + // if state != TaskState::Runnable { + // log::warn!( + // "Task::update_state() updated the task state to {state:?}! (pid={:?}, tid={:?})", + // self.pid, + // self.tid + // ); + + // crate::unwind::unwind_stack_trace(); + // } self.state.store(state as _, Ordering::SeqCst); } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 16091660e3a..dce04e9c5c6 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -169,75 +169,6 @@ pub enum SyscallError { Unknown = isize::MAX, } -pub fn syscall_as_str(syscall: usize) -> &'static str { - match syscall { - prelude::SYS_READ => "read", - prelude::SYS_WRITE => "write", - prelude::SYS_OPEN => "open", - prelude::SYS_CLOSE => "close", - prelude::SYS_SHUTDOWN => "shutdown", - prelude::SYS_EXIT => "exit", - prelude::SYS_FORK => "fork", - prelude::SYS_REBOOT => "reboot", - prelude::SYS_MMAP => "mmap", - prelude::SYS_MUNMAP => "munmap", - prelude::SYS_ARCH_PRCTL => "arch_prctl", - prelude::SYS_GETDENTS => "getdents", - prelude::SYS_GETCWD => "getcwd", - prelude::SYS_CHDIR => "chdir", - prelude::SYS_MKDIR => "mkdir", - prelude::SYS_MKDIR_AT => "mkdir_at", - prelude::SYS_RMDIR => "rmdir", - prelude::SYS_EXEC => "exec", - prelude::SYS_LOG => "log", - prelude::SYS_UNAME => "uname", - prelude::SYS_WAITPID => "waitpid", - prelude::SYS_IOCTL => "ioctl", - prelude::SYS_GETPID => "getpid", - prelude::SYS_SOCKET => "socket", - prelude::SYS_CONNECT => "connect", - prelude::SYS_BIND => "bind", - prelude::SYS_LISTEN => "listen", - prelude::SYS_ACCEPT => "accept", - prelude::SYS_SEEK => "seek", - prelude::SYS_GETTID => "gettid", - prelude::SYS_GETTIME => "gettime", - prelude::SYS_SLEEP => "sleep", - prelude::SYS_ACCESS => "access", - prelude::SYS_PIPE => "pipe", - prelude::SYS_UNLINK => "unlink", - prelude::SYS_GETHOSTNAME => "gethostname", - prelude::SYS_SETHOSTNAME => "sethostname", - prelude::SYS_INFO => "info", - prelude::SYS_CLONE => "clone", - prelude::SYS_SIGRETURN => "sigreturn", - prelude::SYS_SIGACTION => "sigaction", - prelude::SYS_SIGPROCMASK => "sigprocmask", - prelude::SYS_DUP => "dup", - prelude::SYS_FCNTL => "fcntl", - prelude::SYS_DUP2 => "dup2", - prelude::SYS_IPC_SEND => "ipc_send", - prelude::SYS_IPC_RECV => "ipc_recv", - prelude::SYS_IPC_DISCOVER_ROOT => "ipc_discover_root", - prelude::SYS_IPC_BECOME_ROOT => "ipc_become_root", - prelude::SYS_STAT => "stat", - prelude::SYS_FSTAT => "fstat", - prelude::SYS_READ_LINK => "readlink", - prelude::SYS_EPOLL_CREATE => "epoll_create", - prelude::SYS_EPOLL_PWAIT => "epoll_pwait", - prelude::SYS_EPOLL_CTL => "epoll_ctl", - prelude::SYS_EVENT_FD => "event_fd", - prelude::SYS_KILL => "kill", - prelude::SYS_FUTEX_WAIT => "futex_wait", - prelude::SYS_FUTEX_WAKE => "futex_wake", - prelude::SYS_LINK => "link", - prelude::SYS_BACKTRACE => "backtrace", - prelude::SYS_POLL => "poll", - - _ => unreachable!("unknown syscall {syscall}"), - } -} - #[derive(Debug)] #[repr(usize)] pub enum SysFileType { diff --git a/src/aero_syscall/src/time.rs b/src/aero_syscall/src/time.rs index 891ce835f21..f65cef34b80 100644 --- a/src/aero_syscall/src/time.rs +++ b/src/aero_syscall/src/time.rs @@ -1,9 +1,34 @@ +/* + * Copyright (C) 2021-2022 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +pub const ITIMER_REAL: usize = 0; +pub const ITIMER_VIRTUAL: usize = 1; +pub const ITIMER_PROF: usize = 2; + +#[derive(Default, PartialEq)] #[repr(C)] pub struct TimeVal { pub tv_sec: i64, pub tv_usec: i64, } +#[derive(Default, PartialEq)] #[repr(C)] pub struct ITimerVal { pub it_interval: TimeVal, // Interval for periodic timer From 1afc215603f4e67f515f1ae13566fc78b5d5343d Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 13 Nov 2022 12:45:49 +1100 Subject: [PATCH 044/368] bootstrap: dwm and dmenu Signed-off-by: Andy-Python-Programmer --- README.md | 10 +- bootstrap.yml | 4 +- bootstrap/xorg.yml | 84 ++++++++ misc/dwm-xeyes.png | Bin 0 -> 45628 bytes patches/dmenu/dmenu.patch | 27 +++ patches/dwm/dwm.patch | 41 ++++ patches/mlibc/mlibc.patch | 70 ++++--- .../xf86-input-keyboard.patch | 192 ++++++++++++++++++ src/aero_kernel/src/drivers/keyboard.rs | 23 ++- src/aero_kernel/src/socket/unix.rs | 4 - src/aero_kernel/src/syscall/fs.rs | 10 - src/aero_kernel/src/syscall/process.rs | 7 - 12 files changed, 417 insertions(+), 55 deletions(-) create mode 100644 misc/dwm-xeyes.png create mode 100644 patches/dmenu/dmenu.patch create mode 100644 patches/dwm/dwm.patch create mode 100644 patches/xf86-input-keyboard/xf86-input-keyboard.patch diff --git a/README.md b/README.md index 577482b5653..0d4bcfabcb1 100644 --- a/README.md +++ b/README.md @@ -19,14 +19,8 @@ No, Aero runs its own kernel that does *not* originate from Linux and does not s **Official Discord Server**: # Screenshots - -

Aero running TCC in Qemu (the background image is by Rick Astley)

- - -

Aero running Quick JS in Qemu (the background image is by Rick Astley)

- - -

Aero running DOOM in Qemu (the background image is by Rick Astley)

+ +

Running DWM and Xeyes in Aero!

# Features - 64-bit higher half kernel diff --git a/bootstrap.yml b/bootstrap.yml index 8efb70c4dbe..f852d4d4812 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -871,7 +871,9 @@ packages: build: - args: ['make', '-j@PARALLELISM@'] - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] - - args: ['ln', '-sf', 'bash', '@THIS_COLLECT_DIR@/usr/bin/sh'] + - args: ['ln', '-sf', '/usr/bin/bash', '@THIS_COLLECT_DIR@/usr/bin/sh'] + - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/bin'] + - args: ['ln', '-sf', '/usr/bin/bash', '@THIS_COLLECT_DIR@/bin/sh'] - name: tcc source: diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index 30e2af1a2ac..d9e21e8f30c 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -1196,6 +1196,90 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: dwm + source: + subdir: 'bundled' + git: 'https://git.suckless.org/dwm/' + branch: master + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-pkg-config + - host-gcc + pkgs_required: + - mlibc + - libx11 + - libxmu + - libxaw + - libxrender + - libxft + - libxt + - libxkbfile + - libiconv + - libxi + - dejavu + configure: + - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + build: + - args: ['make', 'CC=x86_64-aero-gcc', 'CXX=x86_64-aero-g++'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: dmenu + source: + subdir: 'bundled' + git: 'https://git.suckless.org/dmenu/' + branch: master + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-pkg-config + - host-gcc + pkgs_required: + - mlibc + - libx11 + - libxmu + - libxaw + - libxrender + - libxft + - libxt + - libxkbfile + - libiconv + - libxi + - dejavu + configure: + - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + build: + - args: ['make', 'CC=x86_64-aero-gcc', 'CXX=x86_64-aero-g++'] + - args: ['make', 'install'] + environ: + PREFIX: '/usr' + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: dejavu + source: + subdir: bundled + url: 'https://sourceforge.net/projects/dejavu/files/dejavu/2.37/dejavu-fonts-ttf-2.37.tar.bz2' + format: 'tar.bz2' + checksum: blake2b:d8614907887f20967fc7c75cb33b636a0eb5c682a076ccc7aef09f4ac243507afc005ef90d0b2aeee6a4a6a1ff3d5ce4fac0d1722a382525b3883ef53cdec26a + extract_path: 'dejavu-fonts-ttf-2.37' + version: '2.37' + pkgs_required: + - freetype + - fontconfig + revision: 3 + configure: + - args: ['cp', '-r', '@THIS_SOURCE_DIR@/ttf', '@THIS_SOURCE_DIR@/dejavu'] + - args: ['cp', '-r', '@THIS_SOURCE_DIR@/', '@THIS_BUILD_DIR@'] + build: + - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/share/fonts/truetype/'] + - args: ['cp', '-r', '@THIS_BUILD_DIR@/dejavu/dejavu', '@THIS_COLLECT_DIR@/usr/share/fonts/truetype/'] + scripts: + post_install: + - args: 'echo "Running fc-cache; this may take a few seconds..."' + - args: ['fc-cache'] + - name: libxv source: subdir: 'bundled' diff --git a/misc/dwm-xeyes.png b/misc/dwm-xeyes.png new file mode 100644 index 0000000000000000000000000000000000000000..0fd8df9fdea0bf9f7b85a9c17a1c905dea6be0d3 GIT binary patch literal 45628 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 +Date: Sat, 12 Nov 2022 19:41:25 +1100 +Subject: [PATCH] + +--- + config.mk | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/config.mk b/config.mk +index 566348b..ae68b54 100644 +--- a/config.mk ++++ b/config.mk +@@ -9,8 +9,8 @@ X11INC = /usr/X11R6/include + X11LIB = /usr/X11R6/lib + + # Xinerama, comment if you don't want it +-XINERAMALIBS = -lXinerama +-XINERAMAFLAGS = -DXINERAMA ++# XINERAMALIBS = -lXinerama ++# XINERAMAFLAGS = -DXINERAMA + + # freetype + FREETYPELIBS = -lfontconfig -lXft +-- +2.38.1 + diff --git a/patches/dwm/dwm.patch b/patches/dwm/dwm.patch new file mode 100644 index 00000000000..cbc0ed1257d --- /dev/null +++ b/patches/dwm/dwm.patch @@ -0,0 +1,41 @@ +From b037341e78de204069d705b2fcb16f7de53b15b4 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 13 Nov 2022 12:09:35 +1100 +Subject: [PATCH] + +--- + config.def.h | 2 +- + config.mk | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 9efa774..cb4f512 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -58,7 +58,7 @@ static const Layout layouts[] = { + /* commands */ + static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ + static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +-static const char *termcmd[] = { "st", NULL }; ++static const char *termcmd[] = { "xeyes", NULL }; + + static const Key keys[] = { + /* modifier key function argument */ +diff --git a/config.mk b/config.mk +index ef8acf7..3d7341e 100644 +--- a/config.mk ++++ b/config.mk +@@ -11,8 +11,8 @@ X11INC = /usr/X11R6/include + X11LIB = /usr/X11R6/lib + + # Xinerama, comment if you don't want it +-XINERAMALIBS = -lXinerama +-XINERAMAFLAGS = -DXINERAMA ++# XINERAMALIBS = -lXinerama ++# XINERAMAFLAGS = -DXINERAMA + + # freetype + FREETYPELIBS = -lfontconfig -lXft +-- +2.38.1 + diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 2512955ce4d..e145c1352d9 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,24 +1,25 @@ -From 52be7281e3becafe49603ed6bbc01c0ded64d9e1 Mon Sep 17 00:00:00 2001 +From 9ad862a1edb6ce5b86fc4fa49e8ce365af507f47 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Fri, 8 Jul 2022 12:32:32 +1000 +Date: Sat, 12 Nov 2022 18:58:33 +1100 Subject: [PATCH] yes Signed-off-by: Andy-Python-Programmer --- - .gitignore | 2 + - options/glibc/generic/execinfo.cpp | 5 +- - options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 38 +++++++------- - sysdeps/aero/generic/filesystem.cpp | 25 ++++++++-- - sysdeps/aero/generic/sockets.cpp | 77 ++++++++++++++++++++++++++++- - sysdeps/aero/generic/time.cpp | 24 +++++++++ - sysdeps/aero/include/aero/syscall.h | 6 +++ - sysdeps/aero/meson.build | 1 + - 9 files changed, 152 insertions(+), 28 deletions(-) + .gitignore | 2 + + options/glibc/generic/execinfo.cpp | 5 +- + options/posix/generic/termios-stubs.cpp | 5 +- + options/rtdl/generic/linker.cpp | 2 +- + sysdeps/aero/generic/aero.cpp | 38 ++++++------ + sysdeps/aero/generic/filesystem.cpp | 25 ++++++-- + sysdeps/aero/generic/sockets.cpp | 77 ++++++++++++++++++++++++- + sysdeps/aero/generic/time.cpp | 24 ++++++++ + sysdeps/aero/include/aero/syscall.h | 6 ++ + sysdeps/aero/meson.build | 1 + + 10 files changed, 155 insertions(+), 30 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore -index fdd60a00..9f811f47 100644 +index fdd60a0..9f811f4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ subprojects @@ -28,7 +29,7 @@ index fdd60a00..9f811f47 100644 +# clangd cache files: +.cache diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp -index 3474615e..10a2109e 100644 +index 3474615..10a2109 100644 --- a/options/glibc/generic/execinfo.cpp +++ b/options/glibc/generic/execinfo.cpp @@ -1,9 +1,10 @@ @@ -44,11 +45,34 @@ index 3474615e..10a2109e 100644 } char **backtrace_symbols(void *const *, int) { +diff --git a/options/posix/generic/termios-stubs.cpp b/options/posix/generic/termios-stubs.cpp +index 3e621ad..583c1f5 100644 +--- a/options/posix/generic/termios-stubs.cpp ++++ b/options/posix/generic/termios-stubs.cpp +@@ -5,6 +5,7 @@ + + #include + #include ++#include + + speed_t cfgetispeed(const struct termios *tios) { + return tios->ibaud; +@@ -50,8 +51,8 @@ int tcflow(int fd, int action) { + } + + int tcflush(int, int) { +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ mlibc::infoLogger() << "mlibc::tcflush: is a stub!" << frg::endlog; ++ return 0; + } + + int tcgetattr(int fd, struct termios *attr) { diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp -index f51a543f..74f4e96a 100644 +index 2e2d3f1..3ff5fef 100644 --- a/options/rtdl/generic/linker.cpp +++ b/options/rtdl/generic/linker.cpp -@@ -16,7 +16,7 @@ uintptr_t libraryBase = 0x41000000; +@@ -18,7 +18,7 @@ uintptr_t libraryBase = 0x41000000; constexpr bool verbose = false; constexpr bool stillSlightlyVerbose = false; @@ -58,7 +82,7 @@ index f51a543f..74f4e96a 100644 constexpr bool eagerBinding = true; diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 29fb9610..a27da559 100644 +index 29fb961..a27da55 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp @@ -69,22 +69,22 @@ int sys_futex_tid() { @@ -135,7 +159,7 @@ index 29fb9610..a27da559 100644 } diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index a3e2aca2..4187059e 100644 +index a3e2aca..4187059 100644 --- a/sysdeps/aero/generic/filesystem.cpp +++ b/sysdeps/aero/generic/filesystem.cpp @@ -158,11 +158,6 @@ int sys_tcsetattr(int fd, int optional_action, const struct termios *attr) { @@ -176,7 +200,7 @@ index a3e2aca2..4187059e 100644 +} } // namespace mlibc diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp -index b6b18fe7..e03c634b 100644 +index b6b18fe..e03c634 100644 --- a/sysdeps/aero/generic/sockets.cpp +++ b/sysdeps/aero/generic/sockets.cpp @@ -1,5 +1,6 @@ @@ -276,7 +300,7 @@ index b6b18fe7..e03c634b 100644 } // namespace mlibc diff --git a/sysdeps/aero/generic/time.cpp b/sysdeps/aero/generic/time.cpp new file mode 100644 -index 00000000..460412d0 +index 0000000..460412d --- /dev/null +++ b/sysdeps/aero/generic/time.cpp @@ -0,0 +1,24 @@ @@ -306,7 +330,7 @@ index 00000000..460412d0 +} \ No newline at end of file diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 12f8dc61..03001c46 100644 +index 12f8dc6..03001c4 100644 --- a/sysdeps/aero/include/aero/syscall.h +++ b/sysdeps/aero/include/aero/syscall.h @@ -64,6 +64,12 @@ @@ -323,7 +347,7 @@ index 12f8dc61..03001c46 100644 // Invalid syscall used to trigger a log error in the kernel (as a hint) // so, that we can implement the syscall in the kernel. diff --git a/sysdeps/aero/meson.build b/sysdeps/aero/meson.build -index 14975990..8e30aa3a 100644 +index a807b37..878c216 100644 --- a/sysdeps/aero/meson.build +++ b/sysdeps/aero/meson.build @@ -11,6 +11,7 @@ libc_sources += files( @@ -335,5 +359,5 @@ index 14975990..8e30aa3a 100644 if not no_headers -- -2.25.1 +2.38.1 diff --git a/patches/xf86-input-keyboard/xf86-input-keyboard.patch b/patches/xf86-input-keyboard/xf86-input-keyboard.patch new file mode 100644 index 00000000000..3e5fd43a031 --- /dev/null +++ b/patches/xf86-input-keyboard/xf86-input-keyboard.patch @@ -0,0 +1,192 @@ +From 43c032ed1ae85352eca634ed92132242eee99f87 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sat, 12 Nov 2022 19:22:14 +1100 +Subject: [PATCH] keydev: aero specific changes + +Signed-off-by: Andy-Python-Programmer +--- + .gitignore | 2 + + configure.ac | 5 +++ + src/Makefile.am | 7 +++- + src/aero_kbd.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 122 insertions(+), 1 deletion(-) + create mode 100644 src/aero_kbd.c + +diff --git a/.gitignore b/.gitignore +index 5f04578..f10deba 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -76,3 +76,5 @@ core + # Edit the following section as needed + # For example, !report.pc overrides *.pc. See 'man gitignore' + # ++# editor configs: ++.vscode +diff --git a/configure.ac b/configure.ac +index c3ebdf3..33b36f9 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -69,6 +69,10 @@ case $host_os in + IS_SOLARIS="yes" + ;; + ++ aero*) ++ IS_AERO="yes" ++ ;; ++ + gnu*) + IS_HURD="yes" + ;; +@@ -95,6 +99,7 @@ case $host_os in + esac + AC_SUBST([OS_FLAGS]) + ++AM_CONDITIONAL(AERO, [test "x$IS_AERO" = xyes]) + AM_CONDITIONAL(LINUX, [test "x$IS_LINUX" = xyes]) + AM_CONDITIONAL(BSD, [test "x$IS_BSD" = xyes]) + AM_CONDITIONAL(SOLARIS, [test "x$IS_SOLARIS" = xyes]) +diff --git a/src/Makefile.am b/src/Makefile.am +index 8612c87..fac400e 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -26,11 +26,16 @@ kbd_drv_la_SOURCES = kbd.c xf86OSKbd.h xf86Keymap.h atKeynames.h + kbd_drv_la_LIBADD = $(XORG_LIBS) + kbd_drv_ladir = @inputdir@ + ++AERO_SRCS = aero_kbd.c at_scancode.c + BSD_SRCS = bsd_KbdMap.c bsd_kbd.c bsd_kbd.h at_scancode.c + HURD_SRCS = hurd_kbd.c at_scancode.c + LINUX_SRCS = lnx_KbdMap.c lnx_kbd.c lnx_kbd.h at_scancode.c + SOLARIS_SRCS = sun_kbd.c sun_kbd.h sun_kbdMap.c + ++if AERO ++kbd_drv_la_SOURCES += $(AERO_SRCS) ++endif ++ + if BSD + kbd_drv_la_SOURCES += $(BSD_SRCS) + endif +@@ -47,4 +52,4 @@ if HURD + kbd_drv_la_SOURCES += $(HURD_SRCS) + endif + +-EXTRA_DIST = $(BSD_SRCS) $(HURD_SRCS) $(LINUX_SRCS) $(SOLARIS_SRCS) ++EXTRA_DIST = $(AERO_SRCS) $(BSD_SRCS) $(HURD_SRCS) $(LINUX_SRCS) $(SOLARIS_SRCS) +diff --git a/src/aero_kbd.c b/src/aero_kbd.c +new file mode 100644 +index 0000000..c9cbc4e +--- /dev/null ++++ b/src/aero_kbd.c +@@ -0,0 +1,109 @@ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++ ++#include ++#include ++ ++#include "compiler.h" ++ ++#include "xf86.h" ++#include "xf86Priv.h" ++#include "xf86_OSlib.h" ++ ++#include "atKeynames.h" ++#include "xf86Keymap.h" ++#include "xf86OSKbd.h" ++#include "xf86Xinput.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int KbdOn(InputInfoPtr pInfo, int what) { ++ return Success; ++} ++ ++static int KbdOff(InputInfoPtr pInfo, int what) { ++ printf("aero::kbdOff: is a stub!\n"); ++ return -1; ++} ++ ++static void SoundKbdBell(InputInfoPtr pInfo, int loudness, int pitch, int duration) { ++ printf("aero::SoundKbdBell: is a stub!\n"); ++} ++ ++static void SetKbdLeds(InputInfoPtr pInfo, int leds) { printf("aero::SetKbdLeds: is a stub!\n"); } ++ ++static int GetKbdLeds(InputInfoPtr pInfo) { ++ printf("aero::GetKbdLeds: is a stub!\n"); ++ return -1; ++} ++ ++// Save the initial keyboard state. This function is called at the start ++// of each server generation. ++static int KbdInit(InputInfoPtr pInfo, int what) { ++ return Success; ++} ++ ++static void KbdGetMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap) { ++ printf("aero::KbdGetMapping: is a stub!\n"); ++} ++ ++static void ReadInput(InputInfoPtr pInfo) { ++ KbdDevPtr pKbd = (KbdDevPtr) pInfo->private; ++ ++ for(;;) { ++ uint8_t scancode; ++ size_t result = read(pInfo->fd, &scancode, sizeof(uint8_t)); ++ ++ if (result == sizeof(uint8_t)) { ++ pKbd->PostEvent(pInfo, scancode & 0x7f /* scancode */, scancode & 0x80 ? FALSE : TRUE /* released */); ++ } else { ++ return; ++ } ++ } ++} ++ ++static Bool OpenKeyboard(InputInfoPtr pInfo) { ++ char *kbdPath = xf86SetStrOption(pInfo->options, "Device", "/dev/kbd0"); ++ Bool ret; ++ ++ pInfo->fd = open(kbdPath, O_RDONLY | O_NONBLOCK); ++ ++ if (pInfo->fd == -1) { ++ xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", pInfo->name, kbdPath); ++ ret = FALSE; ++ } else { ++ xf86MsgVerb(X_INFO, 3, "%s: opened device \"%s\"\n", pInfo->name, kbdPath); ++ pInfo->read_input = ReadInput; ++ ret = TRUE; ++ ++ // in case it wasn't set and we fell back to default. ++ xf86ReplaceStrOption(pInfo->options, "Device", kbdPath); ++ } ++ ++ free(kbdPath); ++ return ret; ++} ++ ++Bool xf86OSKbdPreInit(InputInfoPtr pInfo) { ++ KbdDevPtr pKbd = pInfo->private; ++ ++ pKbd->KbdInit = KbdInit; ++ pKbd->KbdOn = KbdOn; ++ pKbd->KbdOff = KbdOff; ++ pKbd->Bell = SoundKbdBell; ++ pKbd->SetLeds = SetKbdLeds; ++ pKbd->GetLeds = GetKbdLeds; ++ pKbd->KbdGetMapping = KbdGetMapping; ++ pKbd->OpenKeyboard = OpenKeyboard; ++ ++ pKbd->RemapScanCode = NULL; ++ pKbd->private = NULL; ++ ++ return TRUE; ++} +-- +2.38.1 + diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index 7c7e4ee0403..864b76c7371 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -26,8 +26,8 @@ use crate::fs; use crate::arch::{apic, io}; use crate::fs::devfs::{self, Device}; -use crate::fs::inode::INodeInterface; -use crate::utils::sync::Mutex; +use crate::fs::inode::{INodeInterface, PollFlags}; +use crate::utils::sync::{BlockQueue, Mutex}; pub trait KeyboardListener: Send + Sync { fn on_key(&self, key: KeyCode, released: bool); @@ -189,6 +189,7 @@ struct KeyboardDevice { marker: usize, buffer: Mutex>, sref: Weak, + wq: BlockQueue, } impl KeyboardDevice { @@ -197,6 +198,7 @@ impl KeyboardDevice { marker: devfs::alloc_device_marker(), buffer: Mutex::new(Vec::new()), sref: this.clone(), + wq: BlockQueue::new(), }) } } @@ -222,11 +224,18 @@ impl KeyboardListener for KeyboardDevice { } else { self.buffer.lock_irq().push(keycode as u8); } + + self.wq.notify_complete() } } impl INodeInterface for KeyboardDevice { fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + if self.buffer.lock_irq().is_empty() { + return Ok(0); + } + + // TODO: block using wq let mut sbuf = self.buffer.lock_irq(); let drainage = core::cmp::min(buffer.len(), sbuf.len()); @@ -236,6 +245,16 @@ impl INodeInterface for KeyboardDevice { Ok(drainage) } + + fn poll(&self, table: Option<&mut fs::inode::PollTable>) -> fs::Result { + table.map(|q| q.insert(&self.wq)); + + if !self.buffer.lock_irq().is_empty() { + Ok(PollFlags::IN) + } else { + Ok(PollFlags::empty()) + } + } } /// This function is responsible for initializing PS2 keyboard driver. diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 45feed6f045..577daf9912f 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -79,8 +79,6 @@ impl MessageQueue { } pub fn read(&mut self, buffer: &mut [u8]) -> usize { - log::debug!("MessageQueue::read(): {:?}", self.messages); - if let Some(message) = self.messages.pop_front() { let message_len = message.data.len(); assert!(buffer.len() >= message_len); @@ -95,8 +93,6 @@ impl MessageQueue { pub fn write(&mut self, buffer: &[u8]) { let message = Message::new(buffer.to_vec()); self.messages.push_back(message); - - log::debug!("MessageQueue::write(): {:?}", self.messages); } } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index ceb0ff6e79e..379d0ac3c09 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -569,14 +569,6 @@ fn do_poll(fds: &mut [PollFd], timeout: Option<&TimeSpec>) -> Result) -> Result Result { - let mut path = path; - - // fixme!!!! before MERGE!!!! ANDYYYY - if path.as_str() == "/bin/sh" { - path = Path::new("/usr/bin/bash"); - } - let executable = fs::lookup_path(path)?; if executable.inode().metadata()?.is_directory() { From ff5e11d02c58366702b511fdad9cadfe64ccbf89 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 13 Nov 2022 14:51:15 +1100 Subject: [PATCH 045/368] README: update screenshots Signed-off-by: Andy-Python-Programmer --- README.md | 4 ++-- misc/aero-doom.png | Bin 426682 -> 0 bytes misc/demo.png | Bin 429476 -> 0 bytes misc/dwm-doom-xeyes.png | Bin 0 -> 95111 bytes misc/dwm-xeyes.png | Bin 45628 -> 0 bytes misc/qjs-in-aero.png | Bin 408568 -> 0 bytes 6 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 misc/aero-doom.png delete mode 100644 misc/demo.png create mode 100644 misc/dwm-doom-xeyes.png delete mode 100644 misc/dwm-xeyes.png delete mode 100644 misc/qjs-in-aero.png diff --git a/README.md b/README.md index 0d4bcfabcb1..d0f577b38bb 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,8 @@ No, Aero runs its own kernel that does *not* originate from Linux and does not s **Official Discord Server**: # Screenshots - -

Running DWM and Xeyes in Aero!

+ +

Running DWM, Xeyes and DOOM in Aero!

# Features - 64-bit higher half kernel diff --git a/misc/aero-doom.png b/misc/aero-doom.png deleted file mode 100644 index 08e583604824ab41fa727f55f39e858cb70d0d4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426682 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%0DFYTocj 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

8$z-NWSd+{nr52KByzRr= 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

d`Hs6C|p; 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 diff --git a/misc/dwm-doom-xeyes.png b/misc/dwm-doom-xeyes.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0a50bd7ae22f77657f5d7380fe7faa6b07a44f GIT binary patch literal 95111 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 literal 0 HcmV?d00001 diff --git a/misc/dwm-xeyes.png b/misc/dwm-xeyes.png deleted file mode 100644 index 0fd8df9fdea0bf9f7b85a9c17a1c905dea6be0d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45628 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�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 Date: Sun, 13 Nov 2022 14:53:16 +1100 Subject: [PATCH 046/368] patches: remove doomgeneric_fb patch since now it runs with X! Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 2 +- patches/doomgeneric/doomgeneric.patch | 664 -------------------------- 2 files changed, 1 insertion(+), 665 deletions(-) delete mode 100644 patches/doomgeneric/doomgeneric.patch diff --git a/bootstrap.yml b/bootstrap.yml index f852d4d4812..faa238a8a8c 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -963,7 +963,7 @@ packages: pkgs_required: - mlibc build: - - args: ['make', '-C', '@THIS_SOURCE_DIR@/doomgeneric', '-f', 'Makefile.aero', '-j@PARALLELISM@'] + - args: ['make', '-C', '@THIS_SOURCE_DIR@/doomgeneric', '-f', 'Makefile', '-j@PARALLELISM@', 'CC=x86_64-aero-gcc'] - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/bin'] - args: ['cp', '@THIS_SOURCE_DIR@/doomgeneric/doomgeneric', '@THIS_COLLECT_DIR@/usr/bin/doomgeneric'] diff --git a/patches/doomgeneric/doomgeneric.patch b/patches/doomgeneric/doomgeneric.patch deleted file mode 100644 index 9ccc4902af4..00000000000 --- a/patches/doomgeneric/doomgeneric.patch +++ /dev/null @@ -1,664 +0,0 @@ -From fe158557671423437d813cf623ca1997d498dc19 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sat, 15 Jan 2022 18:07:32 +1100 -Subject: [PATCH] add aero doom - -Signed-off-by: Andy-Python-Programmer ---- - .gitignore | 9 ++ - doomgeneric/Makefile.aero | 80 ++++++++++ - doomgeneric/aero/framebuffer.h | 243 ++++++++++++++++++++++++++++++ - doomgeneric/d_main.c | 4 + - doomgeneric/doomgeneric_aero.c | 266 +++++++++++++++++++++++++++++++++ - 5 files changed, 602 insertions(+) - create mode 100644 .gitignore - create mode 100644 doomgeneric/Makefile.aero - create mode 100644 doomgeneric/aero/framebuffer.h - create mode 100644 doomgeneric/doomgeneric_aero.c - -diff --git a/.gitignore b/.gitignore -new file mode 100644 -index 0000000..e610a33 ---- /dev/null -+++ b/.gitignore -@@ -0,0 +1,9 @@ -+build -+ -+doomgeneric/doomgeneric -+doomgeneric/doomgeneric.map -+ -+doom1.wad -+ -+.vscode -+.clang-format -diff --git a/doomgeneric/Makefile.aero b/doomgeneric/Makefile.aero -new file mode 100644 -index 0000000..3cde87c ---- /dev/null -+++ b/doomgeneric/Makefile.aero -@@ -0,0 +1,80 @@ -+################################################################ -+# -+# $Id:$ -+# -+# $Log:$ -+# -+ -+# Copyright (C) 2021-2022 The Aero Project Developers. -+# -+# This file is part of The Aero Project. -+# -+# Aero is free software: you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation, either version 3 of the License, or -+# (at your option) any later version. -+# -+# Aero is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with Aero. If not, see . -+ -+ifeq ($(V),1) -+ VB='' -+else -+ VB=@ -+endif -+ -+CC=x86_64-aero-gcc -+ -+CFLAGS+=-O0 -g -+LDFLAGS+=-Wl,--gc-sections -+CFLAGS+=-Wall -DNORMALUNIX -DLINUX -DSNDSERV -D_DEFAULT_SOURCE -+ -+LIBS+=-lm -lc -+ -+OBJDIR=build -+OUTPUT=doomgeneric -+ -+SRC_DOOM = i_main.o dummy.o am_map.o doomdef.o doomstat.o dstrings.o d_event.o \ -+ d_items.o d_iwad.o d_loop.o d_main.o d_mode.o d_net.o f_finale.o f_wipe.o \ -+ g_game.o hu_lib.o hu_stuff.o info.o i_cdmus.o i_endoom.o i_joystick.o i_scale.o \ -+ i_sound.o i_system.o i_timer.o memio.o m_argv.o m_bbox.o m_cheat.o m_config.o \ -+ m_controls.o m_fixed.o m_menu.o m_misc.o m_random.o p_ceilng.o p_doors.o p_enemy.o \ -+ p_floor.o p_inter.o p_lights.o p_map.o p_maputl.o p_mobj.o p_plats.o p_pspr.o \ -+ p_saveg.o p_setup.o p_sight.o p_spec.o p_switch.o p_telept.o p_tick.o p_user.o \ -+ r_bsp.o r_data.o r_draw.o r_main.o r_plane.o r_segs.o r_sky.o r_things.o sha1.o \ -+ sounds.o statdump.o st_lib.o st_stuff.o s_sound.o tables.o v_video.o wi_stuff.o \ -+ w_checksum.o w_file.o w_main.o w_wad.o z_zone.o w_file_stdc.o i_input.o i_video.o \ -+ doomgeneric.o doomgeneric_aero.o -+ -+OBJS += $(addprefix $(OBJDIR)/, $(SRC_DOOM)) -+ -+all: $(OUTPUT) -+ -+clean: -+ rm -rf $(OBJDIR) -+ rm -f $(OUTPUT) -+ rm -f $(OUTPUT).gdb -+ rm -f $(OUTPUT).map -+ -+$(OUTPUT): $(OBJS) -+ @echo [Linking $@] -+ -+ $(VB)$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) \ -+ -o $(OUTPUT) $(LIBS) -Wl,-Map,$(OUTPUT).map -+ -+ @echo [Size] -+ -$(CROSS_COMPILE)size $(OUTPUT) -+ -+$(OBJS): | $(OBJDIR) -+ -+$(OBJDIR): -+ mkdir -p $(OBJDIR) -+ -+$(OBJDIR)/%.o: %.c -+ @echo [Compiling $<] -+ $(VB)$(CC) $(CFLAGS) -c $< -o $@ -diff --git a/doomgeneric/aero/framebuffer.h b/doomgeneric/aero/framebuffer.h -new file mode 100644 -index 0000000..6d195f0 ---- /dev/null -+++ b/doomgeneric/aero/framebuffer.h -@@ -0,0 +1,243 @@ -+#ifndef _AERO_FB_H_ -+#define _AERO_FB_H_ -+ -+#include -+#include -+ -+#define FB_MAX 32 -+ -+#define FBIOGET_VSCREENINFO 0x4600 -+#define FBIOPUT_VSCREENINFO 0x4601 -+#define FBIOGET_FSCREENINFO 0x4602 -+#define FBIOGETCMAP 0x4604 -+#define FBIOPUTCMAP 0x4605 -+#define FBIOPAN_DISPLAY 0x4606 -+#define FBIO_CURSOR _IOWR('F', 0x08, struct fb_cursor) -+ -+#define FBIOGET_CON2FBMAP 0x460F -+#define FBIOPUT_CON2FBMAP 0x4610 -+#define FBIOBLANK 0x4611 -+#define FBIOGET_VBLANK _IOWR('F', 0x12, struct fb_vblank) -+#define FBIO_ALLOC 0x4613 -+#define FBIO_FREE 0x4614 -+#define FBIOGET_GLYPH 0x4615 -+#define FBIOGET_HWCINFO 0x4616 -+#define FBIOPUT_MODEINFO 0x4617 -+#define FBIOGET_DISPINFO 0x4618 -+#define FBIO_WAITFORVSYNC _IOW('F', 0x20, unsigned int) -+ -+#define FB_TYPE_PACKED_PIXELS 0 -+#define FB_TYPE_PLANES 1 -+#define FB_TYPE_INTERLEAVED_PLANES 2 -+#define FB_TYPE_TEXT 3 -+#define FB_TYPE_VGA_PLANES 4 -+#define FB_TYPE_FOURCC 5 -+ -+#define FB_VISUAL_MONO01 0 -+#define FB_VISUAL_MONO10 1 -+#define FB_VISUAL_TRUECOLOR 2 -+#define FB_VISUAL_PSEUDOCOLOR 3 -+#define FB_VISUAL_DIRECTCOLOR 4 -+#define FB_VISUAL_STATIC_PSEUDOCOLOR 5 -+#define FB_VISUAL_FOURCC 6 -+ -+#define FB_ACCEL_NONE 0 -+ -+#define FB_NONSTD_HAM 1 -+#define FB_NONSTD_REV_PIX_IN_B 2 -+ -+#define FB_ACTIVATE_NOW 0 -+#define FB_ACTIVATE_NXTOPEN 1 -+#define FB_ACTIVATE_TEST 2 -+#define FB_ACTIVATE_MASK 15 -+ -+#define FB_ACTIVATE_VBL 16 -+#define FB_CHANGE_CMAP 32 -+#define FB_ACTIVATE_ALL 64 -+#define FB_ACTIVATE_FORCE 128 -+#define FB_ACTIVATE_INV_MODE 256 -+#define FB_ACTIVATE_INV_ALL 512 -+ -+#define FB_ACCELF_TEXT 0x1 -+ -+#define FB_SYNC_HOR_HIGH_ACT 0x1 -+#define FB_SYNC_VERT_HIGH_ACT 0x2 -+#define FB_SYNC_EXT 0x4 -+#define FB_SYNC_COMP_HIGH_ACT 0x8 -+#define FB_SYNC_BROADCAST 0x10 -+#define FB_SYNC_ON_GREEN 0x20 -+ -+#define FB_VMODE_NONINTERLACED 0 -+#define FB_VMODE_INTERLACED 1 -+#define FB_VMODE_DOUBLE 2 -+#define FB_VMODE_ODD_FLD_FIRST 4 -+#define FB_VMODE_MASK 255 -+ -+#define FB_VMODE_YWRAP 256 -+#define FB_VMODE_SMOOTH_XPAN 512 -+#define FB_VMODE_CONUPDATE 512 -+ -+#define FB_ROTATE_UR 0 -+#define FB_ROTATE_CW 1 -+#define FB_ROTATE_UD 2 -+#define FB_ROTATE_CCW 3 -+ -+#define PICOS2KHZ(a) (1000000000UL/(a)) -+#define KHZ2PICOS(a) (1000000000UL/(a)) -+ -+#define VESA_NO_BLANKING 0 -+#define VESA_VSYNC_SUSPEND 1 -+#define VESA_HSYNC_SUSPEND 2 -+#define VESA_POWERDOWN 3 -+ -+enum { -+ FB_BLANK_UNBLANK = VESA_NO_BLANKING, -+ FB_BLANK_NORMAL = VESA_NO_BLANKING + 1, -+ FB_BLANK_VSYNC_SUSPEND = VESA_VSYNC_SUSPEND + 1, -+ FB_BLANK_HSYNC_SUSPEND = VESA_HSYNC_SUSPEND + 1, -+ FB_BLANK_POWERDOWN = VESA_POWERDOWN + 1, -+}; -+ -+#define FB_VBLANK_VBLANKING 0x001 -+#define FB_VBLANK_HBLANKING 0x002 -+#define FB_VBLANK_HAVE_VBLANK 0x004 -+#define FB_VBLANK_HAVE_HBLANK 0x008 -+#define FB_VBLANK_HAVE_COUNT 0x010 -+#define FB_VBLANK_HAVE_VCOUNT 0x020 -+#define FB_VBLANK_HAVE_HCOUNT 0x040 -+#define FB_VBLANK_VSYNCING 0x080 -+#define FB_VBLANK_HAVE_VSYNC 0x100 -+ -+#define ROP_COPY 0 -+#define ROP_XOR 1 -+ -+#define FB_CUR_SETIMAGE 0x01 -+#define FB_CUR_SETPOS 0x02 -+#define FB_CUR_SETHOT 0x04 -+#define FB_CUR_SETCMAP 0x08 -+#define FB_CUR_SETSHAPE 0x10 -+#define FB_CUR_SETSIZE 0x20 -+#define FB_CUR_SETALL 0xFF -+ -+struct fb_fix_screeninfo { -+ char id[16]; -+ unsigned long smem_start; -+ unsigned int smem_len; -+ unsigned int type; -+ unsigned int type_aux; -+ unsigned int visual; -+ unsigned short xpanstep; -+ unsigned short ypanstep; -+ unsigned short ywrapstep; -+ unsigned int line_length; -+ unsigned long mmio_start; -+ unsigned int mmio_len; -+ unsigned int accel; -+ unsigned short capabilities; -+ unsigned short reserved[2]; -+}; -+ -+struct fb_bitfield { -+ unsigned int offset; -+ unsigned int length; -+ unsigned int msb_right; -+}; -+ -+struct fb_var_screeninfo { -+ unsigned int xres; -+ unsigned int yres; -+ unsigned int xres_virtual; -+ unsigned int yres_virtual; -+ unsigned int xoffset; -+ unsigned int yoffset; -+ unsigned int bits_per_pixel; -+ unsigned int grayscale; -+ struct fb_bitfield red; -+ struct fb_bitfield green; -+ struct fb_bitfield blue; -+ struct fb_bitfield transp; -+ unsigned int nonstd; -+ unsigned int activate; -+ unsigned int height; -+ unsigned int width; -+ unsigned int accel_flags; -+ unsigned int pixclock; -+ unsigned int left_margin; -+ unsigned int right_margin; -+ unsigned int upper_margin; -+ unsigned int lower_margin; -+ unsigned int hsync_len; -+ unsigned int vsync_len; -+ unsigned int sync; -+ unsigned int vmode; -+ unsigned int rotate; -+ unsigned int colorspace; -+ unsigned int reserved[4]; -+}; -+ -+struct fb_cmap { -+ unsigned int start; -+ unsigned int len; -+ unsigned short *red; -+ unsigned short *green; -+ unsigned short *blue; -+ unsigned short *transp; -+}; -+ -+struct fb_con2fbmap { -+ unsigned int console; -+ unsigned int framebuffer; -+}; -+ -+struct fb_vblank { -+ unsigned int flags; -+ unsigned int count; -+ unsigned int vcount; -+ unsigned int hcount; -+ unsigned int reserved[4]; -+}; -+ -+struct fb_copyarea { -+ unsigned int dx; -+ unsigned int dy; -+ unsigned int width; -+ unsigned int height; -+ unsigned int sx; -+ unsigned int sy; -+}; -+ -+struct fb_fillrect { -+ unsigned int dx; -+ unsigned int dy; -+ unsigned int width; -+ unsigned int height; -+ unsigned int color; -+ unsigned int rop; -+}; -+ -+struct fb_image { -+ unsigned int dx; -+ unsigned int dy; -+ unsigned int width; -+ unsigned int height; -+ unsigned int fg_color; -+ unsigned int bg_color; -+ unsigned char depth; -+ const char *data; -+ struct fb_cmap cmap; -+}; -+ -+struct fbcurpos { -+ unsigned short x, y; -+}; -+ -+struct fb_cursor { -+ unsigned short set; -+ unsigned short enable; -+ unsigned short rop; -+ const char *mask; -+ struct fbcurpos hot; -+ struct fb_image image; -+}; -+ -+#endif // _AERO_FB_H_ -diff --git a/doomgeneric/d_main.c b/doomgeneric/d_main.c -index c7cf977..435e76a 100644 ---- a/doomgeneric/d_main.c -+++ b/doomgeneric/d_main.c -@@ -1357,12 +1357,16 @@ void D_DoomMain (void) - D_BindVariables(); - M_LoadDefaults(); - -+ DEH_printf("I_AtExit: Installing handler to save config at exit.\n"); -+ - // Save configuration at exit. - I_AtExit(M_SaveDefaults, false); - -+ DEH_printf("D_FindIWAD: Searching for the IWAD file.\n"); - // Find main IWAD file and load it. - iwadfile = D_FindIWAD(IWAD_MASK_DOOM, &gamemission); - -+ - // None found? - - if (iwadfile == NULL) -diff --git a/doomgeneric/doomgeneric_aero.c b/doomgeneric/doomgeneric_aero.c -new file mode 100644 -index 0000000..1172db3 ---- /dev/null -+++ b/doomgeneric/doomgeneric_aero.c -@@ -0,0 +1,266 @@ -+/* -+ * Copyright (C) 2021-2022 The Aero Project Developers. -+ * -+ * This file is part of The Aero Project. -+ * -+ * Aero is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * Aero is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with Aero. If not, see . -+ */ -+ -+#include "doomgeneric.h" -+#include "doomkeys.h" -+ -+#include "aero/framebuffer.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#define LOG_INFO 0 -+#define KEYBOARD_QUEUE_SIZE 16 -+ -+FILE *keyboard = NULL; -+ -+static uint32_t *framebuffer_ptr = NULL; -+ -+static uint32_t s_screen_width = 0; -+static uint32_t s_screen_height = 0; -+ -+static uint32_t s_position_x = 0; -+static uint32_t s_position_y = 0; -+ -+static uint16_t s_key_queue[KEYBOARD_QUEUE_SIZE]; -+static uint32_t s_key_queue_write_idx = 0; -+static uint32_t s_key_queue_read_idx = 0; -+ -+static void log_info(char *message, ...) { -+#ifdef LOG_INFO -+ va_list args; -+ va_start(args, message); -+ printf("\x1b[1;32minfo\x1b[0m: "); -+ vprintf(message, args); -+ printf("\n"); -+ va_end(args); -+ fflush(stdout); -+#endif -+} -+ -+static void log_error(char *message) { -+ printf("\x1b[1;31minfo\x1b[0m: %s\n", message); -+ fflush(stdout); -+} -+ -+struct termios orig_termios; -+ -+/// Disables raw TTY mode. -+static void disable_raw_tty() { -+ tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios); -+} -+ -+/// Enables raw TTY mode. -+/// -+/// SAFTEY: Remember to disable raw tty mode on exit. -+static void enable_raw_tty() { -+ tcgetattr(STDIN_FILENO, &orig_termios); -+ -+ struct termios raw = orig_termios; -+ raw.c_lflag &= ~(ECHO | ICANON); -+ raw.c_cc[VMIN] = 0; -+ tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw); -+} -+ -+/// Converts an aero scancode into doom scancode. -+static uint8_t convert_to_doom_key(uint8_t scancode) { -+ uint8_t key = 0; -+ -+ switch (scancode) { -+ case 28: // enter -+ key = KEY_ENTER; -+ break; -+ -+ case 1: // escape -+ key = KEY_ESCAPE; -+ break; -+ -+ case 105: // left -+ key = KEY_LEFTARROW; -+ break; -+ -+ case 106: // right -+ key = KEY_RIGHTARROW; -+ break; -+ -+ case 103: // up -+ key = KEY_UPARROW; -+ break; -+ -+ case 108: // down -+ key = KEY_DOWNARROW; -+ break; -+ -+ case 29: // left control -+ case 97: // right control -+ key = KEY_FIRE; -+ break; -+ -+ case 57: // spacebar -+ key = KEY_USE; -+ break; -+ -+ case 54: // rightshift -+ key = KEY_RSHIFT; -+ break; -+ -+ case 21: // y -+ key = 'y'; -+ break; -+ -+ default: -+ break; -+ } -+ -+ return key; -+} -+ -+/// Pushes a key into the keyboard queue. -+static void push_key_to_queue(uint8_t pressed, uint8_t key_code) { -+ uint8_t key = convert_to_doom_key(key_code); -+ uint16_t key_data = (pressed << 8) | key; -+ -+ s_key_queue[s_key_queue_write_idx] = key_data; -+ s_key_queue_write_idx += 1; -+ s_key_queue_write_idx %= KEYBOARD_QUEUE_SIZE; -+} -+ -+/// Handle the keyboard input and put it into the key queue. -+static void handle_keyboard_input() { -+ // SAFTEY: `/dev/kbd0` is non-blocking. -+ uint8_t scancode = 0; -+ size_t result = read(fileno(keyboard), &scancode, 1); -+ -+ if (result > 0) { -+ uint8_t key_released = (0x80 & scancode); -+ scancode = (0x7F & scancode); -+ -+ if (key_released == 0) -+ push_key_to_queue(1, scancode); -+ else { -+ push_key_to_queue(0, scancode); -+ } -+ } -+} -+ -+/// Initialize doomgeneric. This includes setting up the framebuffer and -+/// keyboard devices. -+void DG_Init() { -+ log_info("initializing framebuffer"); -+ -+ // Open up the framebuffer device. -+ size_t framebuffer = fopen("/dev/fb0", "r+"); -+ -+ // Make sure the there were no errors. -+ if (framebuffer == NULL) { -+ log_error("failed to open `/dev/fb0`"); -+ exit(1); -+ } -+ -+ // Get the framebuffer info. -+ struct fb_var_screeninfo vinfo; -+ int result = ioctl(fileno(framebuffer), FBIOGET_VSCREENINFO, &vinfo); -+ -+ // Make sure the ioctl was successful. -+ if (result) { -+ log_error("failed to get framebuffer vscreen info"); -+ exit(1); -+ } -+ -+ s_screen_width = vinfo.xres; -+ s_screen_height = vinfo.yres; -+ -+ log_info("framebuffer: (width=%lu, height=%lu)", (uint64_t)s_screen_width, -+ (uint64_t)s_screen_height); -+ -+ s_position_x = (s_screen_width - DOOMGENERIC_RESX) / 2; -+ s_position_y = (s_screen_height - DOOMGENERIC_RESY) / 2; -+ -+ uint32_t size = s_screen_width * s_screen_height * vinfo.bits_per_pixel / 8; -+ framebuffer_ptr = (uint32_t *)mmap(NULL, size, PROT_READ | PROT_WRITE, -+ MAP_SHARED, fileno(framebuffer), 0); -+ -+ enable_raw_tty(); -+ atexit(disable_raw_tty); -+ -+ // Open the keyboard device. -+ keyboard = fopen("/dev/kbd0", "r"); -+ -+ // Make sure the there were no errors. -+ if (keyboard == NULL) { -+ log_error("failed to open `/dev/kbd0`"); -+ exit(1); -+ } -+ -+ log_info("successfuly initialized doomgeneric"); -+} -+ -+void DG_DrawFrame() { -+ for (int i = 0; i < DOOMGENERIC_RESY; i++) { -+ size_t index = s_position_x + (i + s_position_y) * s_screen_width; -+ size_t count = DOOMGENERIC_RESX * 4; -+ -+ uint32_t *dest_ptr = &framebuffer_ptr[index]; -+ uint32_t *src_ptr = DG_ScreenBuffer + i * DOOMGENERIC_RESX; -+ -+ memcpy(dest_ptr, src_ptr, count); -+ } -+ -+ handle_keyboard_input(); -+} -+ -+void DG_SleepMs(uint32_t ms) { usleep(ms * 1000); } -+ -+uint32_t DG_GetTicksMs() { -+ struct timeval tp; -+ struct timezone tzp; -+ -+ gettimeofday(&tp, &tzp); -+ -+ return (tp.tv_sec * 1000) + (tp.tv_usec / 1000); -+} -+ -+int DG_GetKey(int *pressed, unsigned char *doomKey) { -+ // The key queue is empty. -+ if (s_key_queue_write_idx == s_key_queue_read_idx) { -+ return 0; -+ } -+ -+ uint16_t key_data = s_key_queue[s_key_queue_read_idx]; -+ s_key_queue_read_idx += 1; -+ s_key_queue_read_idx %= KEYBOARD_QUEUE_SIZE; -+ -+ *pressed = key_data >> 8; -+ *doomKey = key_data & 0xFF; -+ -+ return 1; -+} -+ -+// NOTE: We dont need to set the window title :) -+void DG_SetWindowTitle(const char *title) {} --- -2.25.1 - From ba7886cb938b563ce15798edd3149ec3f4421cb8 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 13 Nov 2022 16:47:01 +1100 Subject: [PATCH 047/368] sockets::unix: reading messages beyond the buffer size Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/socket/unix.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 577daf9912f..606e64ce1d1 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -79,12 +79,19 @@ impl MessageQueue { } pub fn read(&mut self, buffer: &mut [u8]) -> usize { - if let Some(message) = self.messages.pop_front() { + if let Some(message) = self.messages.front_mut() { let message_len = message.data.len(); - assert!(buffer.len() >= message_len); + let size = core::cmp::min(buffer.len(), message_len); - buffer[..message_len].copy_from_slice(message.data.as_slice()); - message_len + buffer[..size].copy_from_slice(&message.data[..size]); + + if size < message_len { + message.data.drain(..size); + return size; + } + + self.messages.pop_front(); + size } else { unreachable!("MessageQueue::read() called when queue is empty"); } From f1ba94dcea6372b7912144e83202afc1c2e7bf10 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 14 Nov 2022 17:34:31 +1100 Subject: [PATCH 048/368] aero.py: build minimal sysroot instead of fetching the bad prebuilt one Signed-off-by: Andy-Python-Programmer --- aero.py | 62 +++++++++++++++++---------------------------------------- 1 file changed, 18 insertions(+), 44 deletions(-) diff --git a/aero.py b/aero.py index abe46e4521a..092ae4b27c9 100755 --- a/aero.py +++ b/aero.py @@ -89,46 +89,8 @@ def __init__(self, target_arch: str, args: argparse.Namespace): self.args = args -def download_userland_host_rust(): - out_file = os.path.join(BUNDLED_DIR, "host-rust-prebuilt.tar.gz") - - # we have already cloned the toolchain - if os.path.exists(out_file): - return - - log_info("downloading prebuilt userland host rust toolchain") - - cmd = r""" - wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=FILE_HASH" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=FILE_HASH" -O OUTPUT_FILE && rm -rf /tmp/cookies.txt - """.replace("FILE_HASH", "1TTC9qa1z-KdLaQkhgMCYxLE5nuKg4gcx").replace("OUTPUT_FILE", out_file) - - subprocess.run(cmd, shell=True) - - log_info("extracting prebuilt userland host rust toolchain") - - # the toolchain is compressed, so we need to extract it - file = tarfile.open(out_file) - file.extractall(os.path.join(BUNDLED_DIR, "host-rust-prebuilt")) - file.close() - - -def get_userland_tool(): - toolchain = os.path.join(SYSROOT_DIR, "tools") - - if os.path.exists(toolchain): - return toolchain - - return os.path.join(BUNDLED_DIR, "host-rust-prebuilt/aero") - - -def get_userland_package(): - toolchain = os.path.join(SYSROOT_DIR, "packages") - - if os.path.exists(toolchain): - return toolchain - - return os.path.join(BUNDLED_DIR, "host-rust-prebuilt/aero") - +def get_userland_tool(): return os.path.join(SYSROOT_DIR, "tools") +def get_userland_package(): return os.path.join(SYSROOT_DIR, "packages") def remove_prefix(string: str, prefix: str): if string.startswith(prefix): @@ -240,7 +202,8 @@ def download_bundled(): '--depth', '1', LIMINE_URL, limine_path]) if not os.path.exists(SYSROOT_DIR): - download_userland_host_rust() + log_info("building minimal sysroot") + build_userland_sysroot(True) def extract_artifacts(stdout): @@ -300,7 +263,7 @@ def symlink_rel(src, dst): os.symlink(rel_path_src, dst) -def build_userland_sysroot(args): +def build_userland_sysroot(minimal): if not os.path.exists(SYSROOT_DIR): os.mkdir(SYSROOT_DIR) @@ -330,10 +293,21 @@ def build_userland_sysroot(args): # symlink the bootstrap.yml file in the src root to sysroot/bootstrap.link symlink_rel('bootstrap.yml', blink) - run_command(['xbstrap', 'install', '-u', '--all'], cwd=SYSROOT_DIR) + if minimal: + run_command(['xbstrap', 'install', '-u', 'bash', 'coreutils'], cwd=SYSROOT_DIR) + else: + run_command(['xbstrap', 'install', '-u', '--all'], cwd=SYSROOT_DIR) def build_userland(args): + # We need to check if we have host-cargo in-order for us to build + # our rust userland applications in `userland/`. + host_cargo = os.path.join(SYSROOT_DIR, "tools/host-cargo") + + if not os.path.exists(host_cargo): + log_error("host-cargo not built as a part of the sysroot, skipping compilation of `userland/`") + return + HOST_CARGO = "host-cargo/bin/cargo" HOST_RUST = "host-rust/bin/rustc" HOST_GCC = "host-gcc/bin/x86_64-aero-gcc" @@ -635,7 +609,7 @@ def main(): if os.path.exists(userland_target): shutil.rmtree(userland_target) elif args.sysroot: - build_userland_sysroot(args) + build_userland_sysroot(False) elif args.document: build_kernel(args) From d4c11af51f5184563e73acac35fddff775573821 Mon Sep 17 00:00:00 2001 From: amada95 Date: Mon, 14 Nov 2022 02:21:48 -0600 Subject: [PATCH 049/368] Fix xbstrap bug in aero.py, add opendoas support --- aero.py | 20 +++++++++----------- loopback_dev | 0 tools/mkimage.sh | 33 +++++++++++++++++++++------------ 3 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 loopback_dev diff --git a/aero.py b/aero.py index 092ae4b27c9..9ae6fcf85f1 100755 --- a/aero.py +++ b/aero.py @@ -292,11 +292,17 @@ def build_userland_sysroot(minimal): if not os.path.islink(blink): # symlink the bootstrap.yml file in the src root to sysroot/bootstrap.link symlink_rel('bootstrap.yml', blink) + + def run_xbstrap(args): + try: + run_command(['xbstrap', *args], cwd=SYSROOT_DIR) + except FileNotFoundError: + run_command([f'{os.environ["HOME"]}/.local/bin/xbstrap', *args], cwd=SYSROOT_DIR) if minimal: - run_command(['xbstrap', 'install', '-u', 'bash', 'coreutils'], cwd=SYSROOT_DIR) + run_xbstrap(['install', '-u', 'bash', 'coreutils']) else: - run_command(['xbstrap', 'install', '-u', '--all'], cwd=SYSROOT_DIR) + run_xbstrap(['install', '-u', '--all']) def build_userland(args): @@ -306,7 +312,7 @@ def build_userland(args): if not os.path.exists(host_cargo): log_error("host-cargo not built as a part of the sysroot, skipping compilation of `userland/`") - return + return [] HOST_CARGO = "host-cargo/bin/cargo" HOST_RUST = "host-rust/bin/rustc" @@ -587,10 +593,6 @@ def main(): if not os.path.exists(iso_path): user_bins = build_userland(args) - - if not user_bins: - return - kernel_bin = build_kernel(args) if not kernel_bin or args.check: @@ -616,10 +618,6 @@ def main(): generate_docs(args) else: user_bins = build_userland(args) - - if not user_bins: - return - kernel_bin = build_kernel(args) if not kernel_bin or args.check: diff --git a/loopback_dev b/loopback_dev new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/mkimage.sh b/tools/mkimage.sh index 5cdfc32010d..2a5600d9ffd 100755 --- a/tools/mkimage.sh +++ b/tools/mkimage.sh @@ -11,25 +11,34 @@ IMAGE_PATH=build/disk.img # make the disk image rm -rf $IMAGE_PATH +# set $(SUID_BINARY) based on installed SUID binary +if ! command -v sudo &> /dev/null +then + echo "mkimage.sh: sudo not found, attempting to use opendoas" + SUID_BINARY=$(which doas) +else + SUID_BINARY=$(which sudo) +fi + dd if=/dev/zero bs=1G count=0 seek=512 of=$IMAGE_PATH parted -s $IMAGE_PATH mklabel gpt parted -s $IMAGE_PATH mkpart primary 2048s 100% -sudo losetup -Pf --show $IMAGE_PATH > loopback_dev -sudo mkfs.ext2 `cat loopback_dev`p1 -I128 +$(SUID_BINARY) losetup -Pf --show $IMAGE_PATH > loopback_dev +$(SUID_BINARY) mkfs.ext2 `cat loopback_dev`p1 -I128 rm -rf disk_image/ mkdir disk_image -sudo mount `cat loopback_dev`p1 disk_image -sudo cp -r -v sysroot/system-root/. disk_image/ +$(SUID_BINARY) mount `cat loopback_dev`p1 disk_image +$(SUID_BINARY) cp -r -v sysroot/system-root/. disk_image/ pushd disk_image -sudo mkdir -p dev -sudo mkdir -p home -sudo mkdir -p tmp -sudo mkdir -p proc -sudo mkdir -p var -sudo mkdir -p mnt +$(SUID_BINARY) mkdir -p dev +$(SUID_BINARY) mkdir -p home +$(SUID_BINARY) mkdir -p tmp +$(SUID_BINARY) mkdir -p proc +$(SUID_BINARY) mkdir -p var +$(SUID_BINARY) mkdir -p mnt popd sync -sudo umount disk_image/ -sudo losetup -d `cat loopback_dev` +$(SUID_BINARY) umount disk_image/ +$(SUID_BINARY) losetup -d `cat loopback_dev` sync rm -rf loopback_dev From d143f5f406cc7cdc48594fd86f869431dab03e72 Mon Sep 17 00:00:00 2001 From: amada95 Date: Mon, 14 Nov 2022 02:58:43 -0600 Subject: [PATCH 050/368] Check for loop kmod before use --- loopback_dev | 0 tools/mkimage.sh | 47 +++++++++++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 20 deletions(-) delete mode 100644 loopback_dev diff --git a/loopback_dev b/loopback_dev deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tools/mkimage.sh b/tools/mkimage.sh index 2a5600d9ffd..01cdb3367c0 100755 --- a/tools/mkimage.sh +++ b/tools/mkimage.sh @@ -8,37 +8,44 @@ cp -r base-files/. sysroot/system-root/ IMAGE_PATH=build/disk.img -# make the disk image -rm -rf $IMAGE_PATH - -# set $(SUID_BINARY) based on installed SUID binary -if ! command -v sudo &> /dev/null -then +# set $SUID_BINARY based on installed SUID binary +if [[ $(sudo -n | head -c1 | wc -c) -ne 0 ]]; then + SUID_BINARY=$(which sudo) +else echo "mkimage.sh: sudo not found, attempting to use opendoas" SUID_BINARY=$(which doas) -else - SUID_BINARY=$(which sudo) fi +# make the disk image +rm -rf $IMAGE_PATH dd if=/dev/zero bs=1G count=0 seek=512 of=$IMAGE_PATH parted -s $IMAGE_PATH mklabel gpt parted -s $IMAGE_PATH mkpart primary 2048s 100% -$(SUID_BINARY) losetup -Pf --show $IMAGE_PATH > loopback_dev -$(SUID_BINARY) mkfs.ext2 `cat loopback_dev`p1 -I128 + +# ensure loop kernel module is enabled +if ! lsmod | grep -q 'loop'; then + echo 'mkimage.sh: `loop` kernel module not found, attempting to load' + $SUID_BINARY modprobe loop +fi + +$SUID_BINARY losetup -Pf --show $IMAGE_PATH > loopback_dev +$SUID_BINARY mkfs.ext2 `cat loopback_dev`p1 -I128 rm -rf disk_image/ mkdir disk_image -$(SUID_BINARY) mount `cat loopback_dev`p1 disk_image -$(SUID_BINARY) cp -r -v sysroot/system-root/. disk_image/ +$SUID_BINARY mount `cat loopback_dev`p1 disk_image +$SUID_BINARY cp -r -v sysroot/system-root/. disk_image/ pushd disk_image -$(SUID_BINARY) mkdir -p dev -$(SUID_BINARY) mkdir -p home -$(SUID_BINARY) mkdir -p tmp -$(SUID_BINARY) mkdir -p proc -$(SUID_BINARY) mkdir -p var -$(SUID_BINARY) mkdir -p mnt +$SUID_BINARY mkdir -p dev +$SUID_BINARY mkdir -p home +$SUID_BINARY mkdir -p tmp +$SUID_BINARY mkdir -p proc +$SUID_BINARY mkdir -p var +$SUID_BINARY mkdir -p mnt popd sync -$(SUID_BINARY) umount disk_image/ -$(SUID_BINARY) losetup -d `cat loopback_dev` +$SUID_BINARY umount disk_image/ + + +$SUID_BINARY losetup -d `cat loopback_dev` sync rm -rf loopback_dev From ba8acde34b8c6014e366e7be0a6b343789182f3d Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 16 Nov 2022 18:40:59 +1100 Subject: [PATCH 051/368] patches: fix xf86-input-keyboard patch cc #89 Signed-off-by: Andy-Python-Programmer --- .../0001-keydev-aero-specific-changes.patch | 111 ------------------ 1 file changed, 111 deletions(-) delete mode 100644 patches/xf86-input-keyboard/0001-keydev-aero-specific-changes.patch diff --git a/patches/xf86-input-keyboard/0001-keydev-aero-specific-changes.patch b/patches/xf86-input-keyboard/0001-keydev-aero-specific-changes.patch deleted file mode 100644 index 9ccd66e3662..00000000000 --- a/patches/xf86-input-keyboard/0001-keydev-aero-specific-changes.patch +++ /dev/null @@ -1,111 +0,0 @@ -From e61108c09c46a9b608c4c6f5e35ac666bf29c372 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Mon, 4 Jul 2022 11:45:06 +1000 -Subject: [PATCH] keydev: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - .gitignore | 2 ++ - configure.ac | 5 +++++ - src/Makefile.am | 7 ++++++- - src/aero_kbd.c | 28 ++++++++++++++++++++++++++++ - 4 files changed, 41 insertions(+), 1 deletion(-) - create mode 100644 src/aero_kbd.c - -diff --git a/.gitignore b/.gitignore -index 5f04578..f10deba 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -76,3 +76,5 @@ core - # Edit the following section as needed - # For example, !report.pc overrides *.pc. See 'man gitignore' - # -+# editor configs: -+.vscode -diff --git a/configure.ac b/configure.ac -index c3ebdf3..33b36f9 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -69,6 +69,10 @@ case $host_os in - IS_SOLARIS="yes" - ;; - -+ aero*) -+ IS_AERO="yes" -+ ;; -+ - gnu*) - IS_HURD="yes" - ;; -@@ -95,6 +99,7 @@ case $host_os in - esac - AC_SUBST([OS_FLAGS]) - -+AM_CONDITIONAL(AERO, [test "x$IS_AERO" = xyes]) - AM_CONDITIONAL(LINUX, [test "x$IS_LINUX" = xyes]) - AM_CONDITIONAL(BSD, [test "x$IS_BSD" = xyes]) - AM_CONDITIONAL(SOLARIS, [test "x$IS_SOLARIS" = xyes]) -diff --git a/src/Makefile.am b/src/Makefile.am -index 8612c87..fac400e 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -26,11 +26,16 @@ kbd_drv_la_SOURCES = kbd.c xf86OSKbd.h xf86Keymap.h atKeynames.h - kbd_drv_la_LIBADD = $(XORG_LIBS) - kbd_drv_ladir = @inputdir@ - -+AERO_SRCS = aero_kbd.c at_scancode.c - BSD_SRCS = bsd_KbdMap.c bsd_kbd.c bsd_kbd.h at_scancode.c - HURD_SRCS = hurd_kbd.c at_scancode.c - LINUX_SRCS = lnx_KbdMap.c lnx_kbd.c lnx_kbd.h at_scancode.c - SOLARIS_SRCS = sun_kbd.c sun_kbd.h sun_kbdMap.c - -+if AERO -+kbd_drv_la_SOURCES += $(AERO_SRCS) -+endif -+ - if BSD - kbd_drv_la_SOURCES += $(BSD_SRCS) - endif -@@ -47,4 +52,4 @@ if HURD - kbd_drv_la_SOURCES += $(HURD_SRCS) - endif - --EXTRA_DIST = $(BSD_SRCS) $(HURD_SRCS) $(LINUX_SRCS) $(SOLARIS_SRCS) -+EXTRA_DIST = $(AERO_SRCS) $(BSD_SRCS) $(HURD_SRCS) $(LINUX_SRCS) $(SOLARIS_SRCS) -diff --git a/src/aero_kbd.c b/src/aero_kbd.c -new file mode 100644 -index 0000000..63fbc29 ---- /dev/null -+++ b/src/aero_kbd.c -@@ -0,0 +1,28 @@ -+#ifdef HAVE_CONFIG_H -+#include -+#endif -+ -+#include -+#include -+ -+#include "compiler.h" -+ -+#include "xf86.h" -+#include "xf86Priv.h" -+#include "xf86_OSlib.h" -+ -+#include "atKeynames.h" -+#include "xf86Keymap.h" -+#include "xf86OSKbd.h" -+#include "xf86Xinput.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+Bool xf86OSKbdPreInit(InputInfoPtr pInfo) { -+ return FALSE; -+} --- -2.25.1 - From 200bb40cc632f1e2914cd10b74814f6cf3adbe2c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 17 Nov 2022 20:39:37 +1100 Subject: [PATCH 052/368] pty: init Signed-off-by: Andy-Python-Programmer --- bootstrap/xorg.yml | 39 +++++ patches/dwm/dwm.patch | 8 +- patches/limine-term/limine-term.patch | 60 +++++++ src/aero_kernel/src/drivers/mod.rs | 1 + src/aero_kernel/src/drivers/pty.rs | 232 ++++++++++++++++++++++++++ src/aero_kernel/src/fs/devfs.rs | 8 + src/aero_kernel/src/fs/file_table.rs | 16 +- src/aero_kernel/src/fs/inode.rs | 4 +- src/aero_kernel/src/fs/mod.rs | 11 -- src/aero_kernel/src/fs/pipe.rs | 9 +- src/aero_kernel/src/fs/ramfs.rs | 23 ++- src/aero_kernel/src/socket/unix.rs | 9 +- src/uapi/src/lib.rs | 1 + src/uapi/src/pty.rs | 3 + tools/mkimage.sh | 5 +- 15 files changed, 398 insertions(+), 31 deletions(-) create mode 100644 patches/limine-term/limine-term.patch create mode 100644 src/aero_kernel/src/drivers/pty.rs create mode 100644 src/uapi/src/pty.rs diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index d9e21e8f30c..dacfcca50c2 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -1196,6 +1196,45 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: limine-term + source: + subdir: 'bundled' + git: 'https://github.com/Andy-Python-Programmer/limine-term-emu' + branch: 'master' + regenerate: + - args: ['git', 'submodule', 'update', '--init'] + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + - virtual: pkgconfig-for-host + program_name: host-pkg-config + - host-gcc + pkgs_required: + - mlibc + - libx11 + - libxmu + - libxaw + - libxrender + - libxft + - libxt + - libxkbfile + - libiconv + - libxi + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja', '-j@PARALLELISM@'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + - name: dwm source: subdir: 'bundled' diff --git a/patches/dwm/dwm.patch b/patches/dwm/dwm.patch index cbc0ed1257d..b0d898b53ae 100644 --- a/patches/dwm/dwm.patch +++ b/patches/dwm/dwm.patch @@ -1,6 +1,6 @@ -From b037341e78de204069d705b2fcb16f7de53b15b4 Mon Sep 17 00:00:00 2001 +From 06a217e185e0010a474cb5434c2b370b1edd0db9 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 13 Nov 2022 12:09:35 +1100 +Date: Thu, 17 Nov 2022 18:11:30 +1100 Subject: [PATCH] --- @@ -9,7 +9,7 @@ Subject: [PATCH] 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h -index 9efa774..cb4f512 100644 +index 9efa774..edc359c 100644 --- a/config.def.h +++ b/config.def.h @@ -58,7 +58,7 @@ static const Layout layouts[] = { @@ -17,7 +17,7 @@ index 9efa774..cb4f512 100644 static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; -+static const char *termcmd[] = { "xeyes", NULL }; ++static const char *termcmd[] = { "limine-term", NULL }; static const Key keys[] = { /* modifier key function argument */ diff --git a/patches/limine-term/limine-term.patch b/patches/limine-term/limine-term.patch new file mode 100644 index 00000000000..831c021acb4 --- /dev/null +++ b/patches/limine-term/limine-term.patch @@ -0,0 +1,60 @@ +From efd05717147288b099e4ad390871c379035cd1e1 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Thu, 17 Nov 2022 19:15:02 +1100 +Subject: [PATCH] + +--- + xterm.c | 22 +++++++--------------- + 1 file changed, 7 insertions(+), 15 deletions(-) + +diff --git a/xterm.c b/xterm.c +index 51b5904..01ce17e 100644 +--- a/xterm.c ++++ b/xterm.c +@@ -129,7 +129,6 @@ int main(int argc, char **argv) { + close(pty_master); + ioctl(pty_slave, TIOCSCTTY, 0); + ioctl(pty_slave, TIOCSWINSZ, &win_size); +- setsid(); + + dup2(pty_slave, 0); + dup2(pty_slave, 1); +@@ -139,11 +138,13 @@ int main(int argc, char **argv) { + execlp("/bin/bash", "/bin/bash", "-l", NULL); + } + +- pthread_t pty_thread; ++ // pthread_t pty_thread; + +- if (pthread_create(&pty_thread, NULL, read_from_pty, NULL) != 0) { +- goto cleanup; +- } ++ // if (pthread_create(&pty_thread, NULL, read_from_pty, NULL) != 0) { ++ // goto cleanup; ++ // } ++ ++ term_write(context, "Hi, from limine-term with X backend!", strlen("Hi, from limine-term with X backend!")); + + while (true) { + XEvent e; +@@ -159,16 +160,7 @@ int main(int argc, char **argv) { + XImage *image = XCreateImage(display, DefaultVisual(display, screen), depth, ZPixmap, 0, (char *)framebuffer, win_size.ws_xpixel, win_size.ws_ypixel, 32, 0); + + for (;;) { +- while (XPending(display) > 0) { +- XEvent e; +- XNextEvent(display, &e); +- +- if (e.type == KeyPress) { +- // TODO +- } +- +- XPutImage(display, window, gc, image, 0, 0, 0, 0, win_size.ws_xpixel, win_size.ws_ypixel); +- } ++ XPutImage(display, window, gc, image, 0, 0, 0, 0, win_size.ws_xpixel, win_size.ws_ypixel); + } + + cleanup: +-- +2.38.1 + diff --git a/src/aero_kernel/src/drivers/mod.rs b/src/aero_kernel/src/drivers/mod.rs index 5f0b2260ab7..85d4ccd927c 100644 --- a/src/aero_kernel/src/drivers/mod.rs +++ b/src/aero_kernel/src/drivers/mod.rs @@ -30,6 +30,7 @@ pub mod lai; // FIXME: aarch64 port #[cfg(target_arch = "x86_64")] pub mod pci; +pub mod pty; pub mod tty; cfg_if::cfg_if! { diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs new file mode 100644 index 00000000000..7914e2b315f --- /dev/null +++ b/src/aero_kernel/src/drivers/pty.rs @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2021-2022 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +use core::sync::atomic::{AtomicU32, Ordering}; + +use alloc::collections::BTreeMap; +use alloc::string::ToString; +use alloc::sync::Arc; +use spin::{Once, RwLock}; +use uapi::pty::TIOCGPTN; + +use crate::fs::cache; +use crate::fs::cache::*; +use crate::fs::devfs; +use crate::fs::inode::{DirEntry, INodeInterface}; +use crate::fs::{self, FileSystemError}; + +use crate::mem::paging::VirtAddr; + +lazy_static::lazy_static! { + static ref PTMX: Arc = Arc::new(Ptmx::new()); +} + +static PTS_FS: Once> = Once::new(); +static PTY_ID: AtomicU32 = AtomicU32::new(0); + +struct Master { + id: u32, +} + +impl Master { + pub fn new() -> Self { + Self { + id: PTY_ID.fetch_add(1, Ordering::SeqCst), + } + } +} + +impl INodeInterface for Master { + fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + log::warn!("Master::read: is a stub!"); + Ok(buffer.len()) + } + + fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { + log::warn!("PTY::Master::read: is a stub!"); + Ok(buffer.len()) + } + + fn ioctl(&self, command: usize, arg: usize) -> fs::Result { + match command { + TIOCGPTN => { + let id = VirtAddr::new(arg as u64) + .read_mut::() + .ok_or(FileSystemError::NotSupported)?; + + *id = self.id; + } + + _ => { + log::warn!("ptmx: unknown ioctl (command={command:#x})") + } + } + + Ok(0) + } +} + +struct Slave { + master: Arc, +} + +impl Slave { + pub fn new(master: Arc) -> Self { + Self { master } + } +} + +impl INodeInterface for Slave { + fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> fs::Result { + panic!() + } + + fn write_at(&self, _offset: usize, _buffer: &[u8]) -> fs::Result { + panic!() + } +} + +struct Ptmx { + device_id: usize, +} + +impl Ptmx { + fn new() -> Self { + Self { + device_id: devfs::alloc_device_marker(), + } + } +} + +impl devfs::Device for Ptmx { + fn device_marker(&self) -> usize { + self.device_id + } + + fn device_name(&self) -> String { + String::from("ptmx") + } + + fn inode(&self) -> Arc { + PTMX.clone() + } +} + +impl INodeInterface for Ptmx { + fn open( + &self, + _flags: aero_syscall::OpenFlags, + _handle: Arc, + ) -> fs::Result> { + let master = Arc::new(Master::new()); + let slave = Arc::new(Slave::new(master.clone())); + let inode = DirEntry::from_inode(master, String::from("")); + + PTS_FS.get().unwrap().insert_slave(slave); + Ok(Some(inode)) + } +} + +#[derive(Default)] +struct PtsINode { + inode: Once, + slaves: RwLock>, +} + +impl INodeInterface for PtsINode { + fn dirent(&self, parent: DirCacheItem, index: usize) -> fs::Result> { + Ok(match index { + 0x00 => Some(DirEntry::new( + parent, + self.inode.get().unwrap().clone(), + String::from("."), + )), + + 0x01 => Some(DirEntry::new( + parent, + self.inode.get().unwrap().clone(), + String::from(".."), + )), + + _ => self + .slaves + .read() + .iter() + .nth(index) + .map(|(id, inode)| DirEntry::new(parent, inode.clone(), id.to_string())), + }) + } + + fn lookup(&self, dir: DirCacheItem, name: &str) -> fs::Result { + let id = name.parse::().unwrap(); + let slaves = self.slaves.read(); + + let (_, inode) = slaves + .iter() + .find(|(&e, _)| e == id) + .ok_or(FileSystemError::EntryNotFound)?; + + Ok(DirEntry::new( + dir.clone(), + inode.clone(), + String::from(name), + )) + } +} + +struct PtsFs { + root_dir: DirCacheItem, +} + +impl PtsFs { + fn new() -> Arc { + let icache = cache::icache(); + let root_inode = icache.make_item_no_cache(CachedINode::new(Arc::new(PtsINode::default()))); + + let root_dir = DirEntry::new_root(root_inode.clone(), String::from("/")); + let pts_root = root_dir.inode().downcast_arc::().unwrap(); + + pts_root.inode.call_once(|| root_inode.clone()); + + Arc::new(Self { root_dir }) + } + + fn insert_slave(&self, slave: Arc) { + let icache = cache::icache(); + + let pts_root = self.root_dir.inode().downcast_arc::().unwrap(); + pts_root.slaves.write().insert( + slave.master.id, + icache.make_item_no_cache(CachedINode::new(slave)), + ); + } +} + +impl fs::FileSystem for PtsFs { + fn root_dir(&self) -> DirCacheItem { + self.root_dir.clone() + } +} + +fn pty_init() { + devfs::install_device(PTMX.clone()).unwrap(); + PTS_FS.call_once(|| PtsFs::new()); +} + +crate::module_init!(pty_init); diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index ccb6d43d68d..680265417bb 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -131,6 +131,14 @@ impl INodeInterface for DevINode { fn poll(&self, table: Option<&mut PollTable>) -> Result { self.0.inode().poll(table) } + + fn open( + &self, + flags: aero_syscall::OpenFlags, + handle: Arc, + ) -> Result> { + self.0.inode().open(flags, handle) + } } /// Implementation of dev filesystem. (See the module-level documentation for more diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index 44aaaa01cb3..3b487aaaf6f 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -299,17 +299,25 @@ impl FileTable { // Check if a file handle was removed, if so re-use the file handle. if let Some((i, f)) = files.iter_mut().enumerate().find(|e| e.1.is_none()) { - let handle = Arc::new(FileHandle::new(i, dentry, flags)); + let mut handle = Arc::new(FileHandle::new(i, dentry, flags)); + + if let Some(inode) = handle.inode.inode().open(flags, handle.clone())? { + // TODO: should open be called on the inner file aswell??? + handle = Arc::new(FileHandle::new(i, inode, flags)) + } - handle.inode.inode().open(flags, handle.clone())?; *f = Some(handle); Ok(i) } else if files.len() < 256 { let fd = files.len(); - let handle = Arc::new(FileHandle::new(fd, dentry, flags)); + let mut handle = Arc::new(FileHandle::new(fd, dentry, flags)); + + if let Some(inode) = handle.inode.inode().open(flags, handle.clone())? { + // TODO: should open be called on the inner file aswell??? + handle = Arc::new(FileHandle::new(fd, inode, flags)) + } - handle.inode.inode().open(flags, handle.clone())?; files.push(Some(handle)); Ok(fd) diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index fb1578e7337..62d65380d99 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -193,8 +193,8 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSupported) } - fn open(&self, _flags: OpenFlags, _handle: Arc) -> Result<()> { - Ok(()) + fn open(&self, _flags: OpenFlags, _handle: Arc) -> Result> { + Ok(None) } fn close(&self, _flags: OpenFlags) {} diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index bb550977c0d..1f75e5193a1 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -318,16 +318,5 @@ pub fn root_dir() -> &'static DirCacheItem { pub fn init() -> Result<()> { cache::init(); - - // root_dir().inode().mkdir("dev")?; - // root_dir().inode().mkdir("home")?; - // root_dir().inode().mkdir("tmp")?; - // root_dir().inode().mkdir("proc")?; - // root_dir().inode().mkdir("var")?; - // root_dir().inode().mkdir("mnt")?; - - // initramfs::init()?; - // log::info!("installed initramfs"); - Ok(()) } diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index b15ac894bfc..2dd03d7ebe7 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -6,6 +6,7 @@ use alloc::sync::Arc; use crate::utils::buffer::Buffer; use crate::utils::sync::{BlockQueue, Mutex}; +use super::cache::DirCacheItem; use super::file_table::FileHandle; use super::inode::{INodeInterface, PollFlags, PollTable}; @@ -38,13 +39,17 @@ impl Pipe { } impl INodeInterface for Pipe { - fn open(&self, flags: OpenFlags, _handle: Arc) -> super::Result<()> { + fn open( + &self, + flags: OpenFlags, + _handle: Arc, + ) -> super::Result> { // Write end of the pipe: if flags.contains(OpenFlags::O_WRONLY) { self.num_writers.fetch_add(1, Ordering::SeqCst); } - Ok(()) + Ok(None) } fn close(&self, flags: OpenFlags) { diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index 3f26825a3a9..faba311d57b 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -17,10 +17,6 @@ * along with Aero. If not, see . */ -//! Implementation of in-memory filesystem. This is used for temporary filesystems (e.g. dev, tmp) and -//! since Aero currently does not have support for actual disk filesystems (e.g. ex2 and FAT32), ram-fs is -//! used as the root filesystem. - use core::sync::atomic::{AtomicUsize, Ordering}; use aero_syscall::MMapFlags; @@ -303,6 +299,25 @@ impl INodeInterface for LockedRamINode { } } + fn open( + &self, + flags: aero_syscall::OpenFlags, + handle: Arc, + ) -> Result> { + let this = self.0.read(); + + match &this.contents { + FileContents::Device(device) => { + let device = device.clone(); + drop(this); + + device.open(flags, handle) + } + + _ => Ok(None), + } + } + fn metadata(&self) -> Result { let this = self.0.read(); diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 606e64ce1d1..ccaf26bc41e 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -27,6 +27,7 @@ use alloc::vec::Vec; use spin::Once; use crate::fs; +use crate::fs::cache::DirCacheItem; use crate::fs::file_table::FileHandle; use crate::fs::inode::*; @@ -233,9 +234,13 @@ impl INodeInterface for UnixSocket { }) } - fn open(&self, _flags: aero_syscall::OpenFlags, handle: Arc) -> fs::Result<()> { + fn open( + &self, + _flags: aero_syscall::OpenFlags, + handle: Arc, + ) -> fs::Result> { self.handle.call_once(|| handle); - Ok(()) + Ok(None) } fn read_at(&self, _offset: usize, user_buffer: &mut [u8]) -> fs::Result { diff --git a/src/uapi/src/lib.rs b/src/uapi/src/lib.rs index 43250f515c9..8b510fb30c3 100644 --- a/src/uapi/src/lib.rs +++ b/src/uapi/src/lib.rs @@ -2,3 +2,4 @@ pub mod drm; pub mod ioctl; +pub mod pty; diff --git a/src/uapi/src/pty.rs b/src/uapi/src/pty.rs new file mode 100644 index 00000000000..37e7cb94318 --- /dev/null +++ b/src/uapi/src/pty.rs @@ -0,0 +1,3 @@ +use crate::ioctl; + +pub const TIOCGPTN: usize = ioctl::ior::('T' as usize, 0x30); diff --git a/tools/mkimage.sh b/tools/mkimage.sh index 01cdb3367c0..dbcb9dce484 100755 --- a/tools/mkimage.sh +++ b/tools/mkimage.sh @@ -9,7 +9,7 @@ cp -r base-files/. sysroot/system-root/ IMAGE_PATH=build/disk.img # set $SUID_BINARY based on installed SUID binary -if [[ $(sudo -n | head -c1 | wc -c) -ne 0 ]]; then +if command -v sudo; then SUID_BINARY=$(which sudo) else echo "mkimage.sh: sudo not found, attempting to use opendoas" @@ -45,7 +45,8 @@ popd sync $SUID_BINARY umount disk_image/ - $SUID_BINARY losetup -d `cat loopback_dev` sync + rm -rf loopback_dev +rm -rf disk_image From f1eb33b8ce020cba60aaf7518ff5715602f28863 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 19 Nov 2022 12:25:20 +1100 Subject: [PATCH 053/368] limine-terminal Signed-off-by: Andy-Python-Programmer --- patches/limine-term/limine-term.patch | 60 ------ src/aero_kernel/src/drivers/block/ahci.rs | 2 +- src/aero_kernel/src/drivers/block/ide/mod.rs | 2 +- src/aero_kernel/src/drivers/block/nvme/mod.rs | 2 +- src/aero_kernel/src/drivers/drm/rawfb.rs | 2 +- src/aero_kernel/src/drivers/keyboard.rs | 2 +- src/aero_kernel/src/drivers/lai.rs | 2 +- src/aero_kernel/src/drivers/pty.rs | 185 ++++++++++++++++-- src/aero_kernel/src/drivers/tty.rs | 2 +- src/aero_kernel/src/fs/mod.rs | 2 +- src/aero_kernel/src/main.rs | 9 - src/aero_kernel/src/modules.rs | 74 +++++-- src/aero_kernel/src/userland/task.rs | 2 + src/aero_syscall/src/lib.rs | 5 +- src/uapi/src/pty.rs | 1 + userland/Cargo.lock | 91 ++++----- userland/apps/init/Cargo.toml | 1 + 17 files changed, 282 insertions(+), 162 deletions(-) delete mode 100644 patches/limine-term/limine-term.patch diff --git a/patches/limine-term/limine-term.patch b/patches/limine-term/limine-term.patch deleted file mode 100644 index 831c021acb4..00000000000 --- a/patches/limine-term/limine-term.patch +++ /dev/null @@ -1,60 +0,0 @@ -From efd05717147288b099e4ad390871c379035cd1e1 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Thu, 17 Nov 2022 19:15:02 +1100 -Subject: [PATCH] - ---- - xterm.c | 22 +++++++--------------- - 1 file changed, 7 insertions(+), 15 deletions(-) - -diff --git a/xterm.c b/xterm.c -index 51b5904..01ce17e 100644 ---- a/xterm.c -+++ b/xterm.c -@@ -129,7 +129,6 @@ int main(int argc, char **argv) { - close(pty_master); - ioctl(pty_slave, TIOCSCTTY, 0); - ioctl(pty_slave, TIOCSWINSZ, &win_size); -- setsid(); - - dup2(pty_slave, 0); - dup2(pty_slave, 1); -@@ -139,11 +138,13 @@ int main(int argc, char **argv) { - execlp("/bin/bash", "/bin/bash", "-l", NULL); - } - -- pthread_t pty_thread; -+ // pthread_t pty_thread; - -- if (pthread_create(&pty_thread, NULL, read_from_pty, NULL) != 0) { -- goto cleanup; -- } -+ // if (pthread_create(&pty_thread, NULL, read_from_pty, NULL) != 0) { -+ // goto cleanup; -+ // } -+ -+ term_write(context, "Hi, from limine-term with X backend!", strlen("Hi, from limine-term with X backend!")); - - while (true) { - XEvent e; -@@ -159,16 +160,7 @@ int main(int argc, char **argv) { - XImage *image = XCreateImage(display, DefaultVisual(display, screen), depth, ZPixmap, 0, (char *)framebuffer, win_size.ws_xpixel, win_size.ws_ypixel, 32, 0); - - for (;;) { -- while (XPending(display) > 0) { -- XEvent e; -- XNextEvent(display, &e); -- -- if (e.type == KeyPress) { -- // TODO -- } -- -- XPutImage(display, window, gc, image, 0, 0, 0, 0, win_size.ws_xpixel, win_size.ws_ypixel); -- } -+ XPutImage(display, window, gc, image, 0, 0, 0, 0, win_size.ws_xpixel, win_size.ws_ypixel); - } - - cleanup: --- -2.38.1 - diff --git a/src/aero_kernel/src/drivers/block/ahci.rs b/src/aero_kernel/src/drivers/block/ahci.rs index 124346dce83..dafd631ffa4 100644 --- a/src/aero_kernel/src/drivers/block/ahci.rs +++ b/src/aero_kernel/src/drivers/block/ahci.rs @@ -985,4 +985,4 @@ pub fn ahci_init() { register_device_driver(get_ahci().clone()); } -crate::module_init!(ahci_init); +crate::module_init!(ahci_init, ModuleType::Block); diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index 7e370c82299..bc926eebf6f 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -229,4 +229,4 @@ fn init() { register_device_driver(get_device().clone()); } -crate::module_init!(init); +crate::module_init!(init, ModuleType::Block); diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index d99d65cbb00..ff544574c24 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -534,4 +534,4 @@ fn nvme_init() { register_device_driver(Handler::new()) } -crate::module_init!(nvme_init); +crate::module_init!(nvme_init, ModuleType::Block); diff --git a/src/aero_kernel/src/drivers/drm/rawfb.rs b/src/aero_kernel/src/drivers/drm/rawfb.rs index a6be41ab4e6..c347d782f32 100644 --- a/src/aero_kernel/src/drivers/drm/rawfb.rs +++ b/src/aero_kernel/src/drivers/drm/rawfb.rs @@ -134,4 +134,4 @@ fn init() { devfs::install_device_at(dri, rfb).expect("ramfs: failed to install DRM device"); } -crate::module_init!(init); +crate::module_init!(init, ModuleType::Block); diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index 864b76c7371..a6beb4333f8 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -441,4 +441,4 @@ pub fn keyboard_irq_handler(_stack: &mut InterruptStack) { } } -crate::module_init!(ps2_keyboard_init); +crate::module_init!(ps2_keyboard_init, ModuleType::Other); diff --git a/src/aero_kernel/src/drivers/lai.rs b/src/aero_kernel/src/drivers/lai.rs index d3b0f7639a9..33353a399d7 100644 --- a/src/aero_kernel/src/drivers/lai.rs +++ b/src/aero_kernel/src/drivers/lai.rs @@ -134,4 +134,4 @@ pub fn init_lai() { aml::init(subsystem); } -crate::module_init!(init_lai); +crate::module_init!(init_lai, ModuleType::Other); diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 7914e2b315f..8fafd81bc7e 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -19,19 +19,31 @@ use core::sync::atomic::{AtomicU32, Ordering}; +use aero_syscall::Termios; +use aero_syscall::WinSize; use alloc::collections::BTreeMap; use alloc::string::ToString; use alloc::sync::Arc; +use alloc::sync::Weak; +use alloc::vec::Vec; use spin::{Once, RwLock}; -use uapi::pty::TIOCGPTN; + +use uapi::pty::*; use crate::fs::cache; use crate::fs::cache::*; use crate::fs::devfs; +use crate::fs::devfs::DEV_FILESYSTEM; +use crate::fs::inode::FileType; use crate::fs::inode::{DirEntry, INodeInterface}; +use crate::fs::FileSystem; +use crate::fs::Path; +use crate::fs::MOUNT_MANAGER; use crate::fs::{self, FileSystemError}; use crate::mem::paging::VirtAddr; +use crate::utils::sync::BlockQueue; +use crate::utils::sync::Mutex; lazy_static::lazy_static! { static ref PTMX: Arc = Arc::new(Ptmx::new()); @@ -42,24 +54,36 @@ static PTY_ID: AtomicU32 = AtomicU32::new(0); struct Master { id: u32, + wq: BlockQueue, + slave_buffer: Mutex>, + buffer: Mutex>, } impl Master { pub fn new() -> Self { Self { id: PTY_ID.fetch_add(1, Ordering::SeqCst), + wq: BlockQueue::new(), + slave_buffer: Mutex::new(Vec::new()), + buffer: Mutex::new(Vec::new()), } } } impl INodeInterface for Master { fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { - log::warn!("Master::read: is a stub!"); - Ok(buffer.len()) + let mut pty_buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; + let size = core::cmp::min(pty_buffer.len(), buffer.len()); + + buffer[..size].copy_from_slice(&pty_buffer.drain(..size).collect::>()); + Ok(size) } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { - log::warn!("PTY::Master::read: is a stub!"); + let mut pty_buffer = self.slave_buffer.lock_irq(); + pty_buffer.extend_from_slice(buffer); + + self.wq.notify_complete(); Ok(buffer.len()) } @@ -82,24 +106,118 @@ impl INodeInterface for Master { } } +struct SlaveInner { + window_size: WinSize, + termios: Termios, +} + struct Slave { master: Arc, + inner: Mutex, } impl Slave { pub fn new(master: Arc) -> Self { - Self { master } + Self { + master, + inner: Mutex::new(SlaveInner { + window_size: WinSize::default(), + termios: Termios { + c_iflag: 0, + c_oflag: aero_syscall::TermiosOFlag::empty(), + c_cflag: aero_syscall::TermiosCFlag::empty(), + c_lflag: aero_syscall::TermiosLFlag::ECHO | aero_syscall::TermiosLFlag::ICANON, + c_line: 0, + c_cc: [0; 32], + c_ispeed: 0, + c_ospeed: 0, + }, + }), + } } } impl INodeInterface for Slave { - fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> fs::Result { - panic!() + fn metadata(&self) -> fs::Result { + Ok(fs::inode::Metadata { + id: 0, + file_type: FileType::Device, + children_len: 0, + size: 0, + }) + } + + fn stat(&self) -> fs::Result { + Ok(aero_syscall::Stat::default()) } - fn write_at(&self, _offset: usize, _buffer: &[u8]) -> fs::Result { + fn ioctl(&self, command: usize, arg: usize) -> fs::Result { + let mut inner = self.inner.lock_irq(); + + match command { + aero_syscall::TIOCSWINSZ => { + let winsize = VirtAddr::new(arg as u64) + .read_mut::() + .ok_or(FileSystemError::NotSupported)?; + + inner.window_size = *winsize; + Ok(0) + } + + aero_syscall::TIOCGWINSZ => { + let winsize = VirtAddr::new(arg as u64) + .read_mut::() + .ok_or(FileSystemError::NotSupported)?; + + *winsize = inner.window_size; + Ok(0) + } + + aero_syscall::TCGETS => { + let termios = VirtAddr::new(arg as u64) + .read_mut::() + .ok_or(FileSystemError::NotSupported)?; + + *termios = inner.termios; + Ok(0) + } + + aero_syscall::TCSETSF => { + let termios = VirtAddr::new(arg as u64) + .read_mut::() + .ok_or(FileSystemError::NotSupported)?; + + inner.termios = *termios; + Ok(0) + } + + _ => Err(FileSystemError::NotSupported), + } + } + + fn poll(&self, _table: Option<&mut fs::inode::PollTable>) -> fs::Result { panic!() } + + fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + let mut pty_buffer = self + .master + .wq + .block_on(&self.master.slave_buffer, |e| !e.is_empty())?; + + let size = core::cmp::min(pty_buffer.len(), buffer.len()); + + buffer[..size].copy_from_slice(&pty_buffer.drain(..size).collect::>()); + Ok(size) + } + + fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { + let mut pty_buffer = self.master.buffer.lock_irq(); + pty_buffer.extend_from_slice(buffer); + + self.master.wq.notify_complete(); + Ok(buffer.len()) + } } struct Ptmx { @@ -146,10 +264,24 @@ impl INodeInterface for Ptmx { #[derive(Default)] struct PtsINode { inode: Once, + fs: Once>, slaves: RwLock>, } impl INodeInterface for PtsINode { + fn metadata(&self) -> fs::Result { + Ok(fs::inode::Metadata { + id: 0, + file_type: FileType::Directory, + children_len: self.slaves.read().len(), + size: 0, + }) + } + + fn stat(&self) -> fs::Result { + Ok(aero_syscall::Stat::default()) + } + fn dirent(&self, parent: DirCacheItem, index: usize) -> fs::Result> { Ok(match index { 0x00 => Some(DirEntry::new( @@ -164,12 +296,16 @@ impl INodeInterface for PtsINode { String::from(".."), )), - _ => self - .slaves - .read() - .iter() - .nth(index) - .map(|(id, inode)| DirEntry::new(parent, inode.clone(), id.to_string())), + _ => { + let a = self + .slaves + .read() + .iter() + .nth(index - 2) + .map(|(id, inode)| DirEntry::new(parent, inode.clone(), id.to_string())); + log::debug!("{}", a.is_some()); + a + } }) } @@ -188,6 +324,10 @@ impl INodeInterface for PtsINode { String::from(name), )) } + + fn weak_filesystem(&self) -> Option> { + Some(self.fs.get()?.clone()) + } } struct PtsFs { @@ -202,9 +342,13 @@ impl PtsFs { let root_dir = DirEntry::new_root(root_inode.clone(), String::from("/")); let pts_root = root_dir.inode().downcast_arc::().unwrap(); + let this = Arc::new(Self { root_dir }); + + // Initialize the PTS root inode. + pts_root.fs.call_once(|| Arc::downgrade(&this)); pts_root.inode.call_once(|| root_inode.clone()); - Arc::new(Self { root_dir }) + this } fn insert_slave(&self, slave: Arc) { @@ -226,7 +370,14 @@ impl fs::FileSystem for PtsFs { fn pty_init() { devfs::install_device(PTMX.clone()).unwrap(); - PTS_FS.call_once(|| PtsFs::new()); + + let fs = PTS_FS.call_once(|| PtsFs::new()); + + let root = DEV_FILESYSTEM.root_dir().inode(); + root.mkdir("pts").unwrap(); + + let pts_dir = fs::lookup_path(Path::new("/dev/pts")).unwrap(); + MOUNT_MANAGER.mount(pts_dir, fs.clone()).unwrap(); } -crate::module_init!(pty_init); +crate::module_init!(pty_init, ModuleType::Other); diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 977370bdcca..91bc0f86f29 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -872,4 +872,4 @@ fn init_tty() { devfs::install_device(TTY.clone()).expect("failed to register tty as a device"); } -crate::module_init!(init_tty); +crate::module_init!(init_tty, ModuleType::Other); diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index 1f75e5193a1..db4b3550a21 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -69,7 +69,7 @@ impl MountManager { Self(Mutex::new(BTreeMap::new())) } - fn mount(&self, directory: DirCacheItem, filesystem: Arc) -> Result<()> { + pub fn mount(&self, directory: DirCacheItem, filesystem: Arc) -> Result<()> { let mut this = self.0.lock(); let mount_key = directory.cache_key(); diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 846a486469e..c272024c877 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -141,21 +141,12 @@ fn aero_main() -> ! { } fn kernel_main_thread() { - let mut address_space = mem::AddressSpace::this(); - let mut offset_table = address_space.offset_page_table(); - modules::init(); log::info!("loaded kernel modules"); #[cfg(target_arch = "x86_64")] arch::enable_acpi(); - #[cfg(target_arch = "x86_64")] - drivers::pci::init(&mut offset_table); - log::info!("loaded PCI driver"); - - fs::block::launch().unwrap(); - #[cfg(test)] test_main(); diff --git a/src/aero_kernel/src/modules.rs b/src/aero_kernel/src/modules.rs index c38e6376311..d112fdce3b7 100644 --- a/src/aero_kernel/src/modules.rs +++ b/src/aero_kernel/src/modules.rs @@ -31,30 +31,39 @@ //! aero_kernel::module_exit!(hello_exit); //! ``` -use crate::utils::linker::LinkerSymbol; +use crate::{drivers, fs, utils::linker::LinkerSymbol}; /// Inner helper function to make sure the function provided to the [module_init] macro /// has a valid function signature. This function returns the passed module init function as /// a const void pointer. -#[inline] -pub const fn make_module_init(init_function: fn() -> ()) -> ModuleInit { - ModuleInit(init_function as *const ()) + +#[derive(Debug, PartialEq, PartialOrd, Eq, Ord)] +#[repr(C)] +pub enum ModuleType { + Block = 0, + Other = 1, } -/// Inner helper structure holding the module init function as a void pointer. This struct -/// is required as we cannot directly store a pointer in the static as it needs to implement -/// [Sync]. -pub struct ModuleInit(*const ()); +#[derive(Debug)] +#[repr(C)] +pub struct Module { + pub init: *const fn() -> (), + pub ty: ModuleType, +} -unsafe impl Sync for ModuleInit {} +unsafe impl Sync for Module {} #[macro_export] macro_rules! module_init { - ($init_function:expr) => { + ($init_function:expr, $ty:path) => { + use crate::modules::ModuleType; + #[used] #[link_section = ".kernel_modules.init"] - static __MODULE_INIT: $crate::modules::ModuleInit = - $crate::modules::make_module_init($init_function); + static __MODULE_INIT: $crate::modules::Module = $crate::modules::Module { + init: $init_function as *const fn() -> (), + ty: $ty, + }; }; } @@ -63,17 +72,40 @@ macro_rules! module_init { /// itself (this is temporary and modules will be loaded from the filesystem in the future). pub(crate) fn init() { extern "C" { - static __kernel_modules_start: LinkerSymbol; - static __kernel_modules_end: LinkerSymbol; + static mut __kernel_modules_start: u8; + static mut __kernel_modules_end: u8; } - /* - * Iterate over the `kernel_modules` linker section containing pointers to module - * initialization functions. - */ unsafe { - (__kernel_modules_start.as_usize()..__kernel_modules_end.as_usize()) - .step_by(0x08) - .for_each(|module| (*(module as *mut fn() -> ()))()); + let size = &__kernel_modules_end as *const u8 as usize + - &__kernel_modules_start as *const u8 as usize; + + let modules = core::slice::from_raw_parts_mut( + &mut __kernel_modules_start as *mut u8 as *mut Module, + size / core::mem::size_of::(), + ); + + modules.sort_by(|e, a| e.ty.cmp(&a.ty)); + + let mut launched_fs = false; + + for module in modules { + log::debug!("{module:?} {launched_fs}"); + + if module.ty != ModuleType::Block && !launched_fs { + let mut address_space = crate::mem::AddressSpace::this(); + let mut offset_table = address_space.offset_page_table(); + + #[cfg(target_arch = "x86_64")] + drivers::pci::init(&mut offset_table); + log::info!("loaded PCI driver"); + + fs::block::launch().unwrap(); + launched_fs = true; + } + + let init = core::mem::transmute::<*const fn() -> (), fn() -> ()>(module.init); + init(); + } } } diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index d3bb0ebb857..cefa36122a7 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -457,6 +457,8 @@ impl Task { *self.cwd.write() = Some(Cwd::new()) } + self.file_table.log(); + *self.executable.lock() = Some(executable.clone()); let vm = self.vm(); diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index dce04e9c5c6..62a3a2d4011 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -264,10 +264,11 @@ impl From for SeekWhence { } pub const TIOCGWINSZ: usize = 0x5413; +pub const TIOCSWINSZ: usize = 0x5414; pub const TCGETS: usize = 0x5401; pub const TCSETSF: usize = 0x5404; -#[derive(Default)] +#[derive(Default, Copy, Clone)] #[repr(C)] pub struct WinSize { pub ws_row: u16, @@ -345,7 +346,7 @@ bitflags::bitflags! { } } -#[derive(Debug, Default, Clone)] +#[derive(Debug, Default, Copy, Clone)] #[repr(C)] pub struct Termios { pub c_iflag: u32, diff --git a/src/uapi/src/pty.rs b/src/uapi/src/pty.rs index 37e7cb94318..fae22eb8955 100644 --- a/src/uapi/src/pty.rs +++ b/src/uapi/src/pty.rs @@ -1,3 +1,4 @@ use crate::ioctl; pub const TIOCGPTN: usize = ioctl::ior::('T' as usize, 0x30); +pub const TIOCSPTLCK: usize = ioctl::iow::('T' as usize, 0x31); diff --git a/userland/Cargo.lock b/userland/Cargo.lock index e4da3fb9b07..1f3fe579f22 100644 --- a/userland/Cargo.lock +++ b/userland/Cargo.lock @@ -10,7 +10,7 @@ dependencies = [ "lazy_static", "postcard", "serde", - "spin 0.9.3", + "spin 0.9.4", ] [[package]] @@ -42,18 +42,18 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" dependencies = [ "memchr", ] [[package]] name = "atomic-polyfill" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14bf7b4f565e5e717d7a7a65b2a05c0b8c96e4db636d6f780f03b15108cdd1b" +checksum = "9c041a8d9751a520ee19656232a18971f18946a7900f1520ee4400002244dd89" dependencies = [ "critical-section", ] @@ -111,9 +111,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cortex-m" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd20d4ac4aa86f4f75f239d59e542ef67de87cce2c282818dc6e84155d3ea126" +checksum = "70858629a458fdfd39f9675c4dc309411f2a3f83bede76988d81bf1a0ecee9e0" dependencies = [ "bare-metal 0.2.5", "bitfield", @@ -145,12 +145,12 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", - "libc 0.2.126", + "libc 0.2.137", "wasi", ] @@ -165,24 +165,24 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] [[package]] name = "heapless" -version = "0.7.14" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065681e99f9ef7e0e813702a0326aedbcbbde7db5e55f097aedd1bf50b9dca43" +checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" dependencies = [ "atomic-polyfill", "hash32", "rustc_version 0.4.0", "serde", - "spin 0.9.3", + "spin 0.9.4", "stable_deref_trait", ] @@ -191,6 +191,7 @@ name = "init" version = "0.1.0" dependencies = [ "aero_syscall", + "libc 0.2.125", ] [[package]] @@ -205,19 +206,19 @@ dependencies = [ [[package]] name = "libc" version = "0.2.125" -source = "git+https://github.com/andy-Python-Programmer/libc#707daa9c11222ac2c3ac4d1ba23c96a21d2d633c" +source = "git+https://github.com/andy-Python-Programmer/libc#213e47d8f5d87b87539e57dc7d9c24c77d9ba609" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg", "scopeguard", @@ -246,9 +247,9 @@ checksum = "546c37ac5d9e56f55e73b677106873d9d9f5190605e41a856503623648488cae" [[package]] name = "once_cell" -version = "1.12.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "postcard" @@ -269,27 +270,27 @@ checksum = "7c68cb38ed13fd7bc9dd5db8f165b7c8d9c1a315104083a2b10f11354c2af97f" [[package]] name = "proc-macro2" -version = "1.0.39" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] [[package]] name = "regex" -version = "1.5.6" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" dependencies = [ "aho-corasick", "memchr", @@ -298,9 +299,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.26" +version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "riscv" @@ -338,7 +339,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.10", + "semver 1.0.14", ] [[package]] @@ -358,9 +359,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.10" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41d061efea015927ac527063765e73601444cdc344ba855bc7bd44578b25e1c" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" [[package]] name = "semver-parser" @@ -370,18 +371,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.137" +version = "1.0.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" dependencies = [ "proc-macro2", "quote", @@ -396,9 +397,9 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "spin" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530c2b0d0bf8b69304b39fe2001993e267461948b890cd037d8ad4293fa1a0d" +checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" dependencies = [ "lock_api", ] @@ -411,9 +412,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "syn" -version = "1.0.96" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" +checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" dependencies = [ "proc-macro2", "quote", @@ -427,14 +428,14 @@ dependencies = [ "aero_ipc", "aero_syscall", "hashbrown", - "spin 0.9.3", + "spin 0.9.4", ] [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] name = "utest" @@ -493,7 +494,7 @@ dependencies = [ "aero_ipc", "aero_syscall", "hashbrown", - "spin 0.9.3", + "spin 0.9.4", ] [[package]] diff --git a/userland/apps/init/Cargo.toml b/userland/apps/init/Cargo.toml index 6b32449314a..3c879f68388 100644 --- a/userland/apps/init/Cargo.toml +++ b/userland/apps/init/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" [dependencies] aero_syscall = { path = "../../../src/aero_syscall" } +libc = { git = "https://github.com/Andy-Python-Programmer/libc" } From b2a1d72b9f94a3fd85a133fb2fc23d4ac0cdb556 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 20 Nov 2022 15:06:07 +1100 Subject: [PATCH 054/368] bootstrap: port alacritty panics in mlibc in pthread mutex init Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 160 +++- bootstrap/xorg.yml | 42 ++ extra-files/rust/config.toml | 7 + patches/dwm/dwm.patch | 16 +- patches/mlibc/mlibc.patch | 36 +- patches/rust-glutin/rust-glutin.patch | 295 ++++++++ patches/rust-libc/rust-libc.patch | 605 +++++++++++++++ patches/rust-libloading/rust-libloading.patch | 50 ++ patches/rust-mio-0.6/rust-mio-0.6.patch | 94 +++ patches/rust-mio-0.8/rust-mio-0.8.patch | 73 ++ patches/rust-nix/rust-nix.patch | 709 ++++++++++++++++++ .../rust-shared-library.patch | 45 ++ 12 files changed, 2091 insertions(+), 41 deletions(-) create mode 100644 patches/rust-glutin/rust-glutin.patch create mode 100644 patches/rust-libc/rust-libc.patch create mode 100644 patches/rust-libloading/rust-libloading.patch create mode 100644 patches/rust-mio-0.6/rust-mio-0.6.patch create mode 100644 patches/rust-mio-0.8/rust-mio-0.8.patch create mode 100644 patches/rust-nix/rust-nix.patch create mode 100644 patches/rust-shared-library/rust-shared-library.patch diff --git a/bootstrap.yml b/bootstrap.yml index faa238a8a8c..f6d84948dc4 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -70,7 +70,7 @@ sources: subdir: 'bundled' git: 'https://github.com/rust-lang/rust.git' branch: 'master' - commit: '22e491ac7ed454d34669151a8b6464cb643c9b41' + commit: 'ff0ffda6b3c3ea392c6cf88c676133666f491e5c' - name: llvm subdir: 'bundled' @@ -98,6 +98,49 @@ sources: tag: 'v0.11.0' version: '0.11.0' + - name: rust-winit + subdir: 'bundled' + git: 'https://github.com/rust-windowing/winit.git' + tag: 'v0.26.1' + version: '0.26.1' + + - name: rust-mio-0.8 + subdir: 'bundled' + git: 'https://github.com/tokio-rs/mio.git' + tag: 'v0.8.3' + version: '0.8.3' + + - name: rust-nix + subdir: 'bundled' + git: 'https://github.com/nix-rust/nix.git' + tag: 'v0.22.3' + version: '0.22.3' + + - name: rust-mio-0.6 + subdir: 'bundled' + git: 'https://github.com/tokio-rs/mio.git' + tag: 'v0.6.23' + version: '0.6.23' + + - name: rust-glutin + subdir: 'bundled' + git: 'https://github.com/rust-windowing/glutin.git' + tag: 'v0.28.0' + version: '0.28.0' + + - name: rust-shared-library + subdir: 'bundled' + git: 'https://github.com/tomaka/shared_library.git' + commit: 'f09e038246a559650c8505b3b3831b820d1a5689' + branch: 'master' + version: '0.1.9' + + - name: rust-libloading + subdir: 'bundled' + git: 'https://github.com/nagisa/rust_libloading.git' + tag: '0.7.3' + version: '0.7.3' + - name: rust-patched-libs subdir: 'bundled' sources_required: @@ -107,10 +150,32 @@ sources: recursive: true - name: rust-users recursive: true + - name: rust-winit + recursive: true + - name: rust-shared-library + recursive: true + - name: rust-mio-0.8 + recursive: true + - name: rust-mio-0.6 + recursive: true + - name: rust-nix + recursive: true + - name: rust-glutin + recursive: true + - name: rust-libloading + recursive: true # --------------------------------------------------------------------------- # Rust patched crates end # --------------------------------------------------------------------------- + - name: host-bootstrap-cargo + subdir: 'bundled' + url: 'https://static.rust-lang.org/dist/2022-04-07/cargo-1.60.0-x86_64-unknown-linux-gnu.tar.xz' + format: 'tar.xz' + checksum: blake2b:d60239d5977bfcf1c6f2d973d9d27e93d6d138ae6e929deb016afde8cd8e0ff0bba8396f8fa62d5e738be7bde7b91e9aa406ec2440e1ab50451c5b9ad2d8fdfb + extract_path: 'cargo-1.60.0-x86_64-unknown-linux-gnu' + version: '0.60.0' + - name: python subdir: 'bundled' patch-path-strip: 1 @@ -254,34 +319,35 @@ tools: install: - args: ['python3', '@THIS_SOURCE_DIR@/x.py', 'install', '-j', '@PARALLELISM@'] - - name: host-cargo - source: - subdir: 'bundled' - git: 'https://github.com/rust-lang/cargo.git' - branch: 'master' - commit: '25fcb135d02ea897ce894b67ae021f48107d522b' - tools_required: - - tool: host-rust - recursive: true - - tool: host-gcc # GCC is used for linking - recursive: true - sources_required: - # This cargo runs on the host, so we don't actually need any patches here. We just - # add the sources used by cargo so that the dependency resolver doesn't complain. - - rust-patched-libs - compile: - - args: - - 'cargo' - - 'install' - - '--target' - - 'x86_64-unknown-linux-gnu' - - '--target-dir' - - '@THIS_BUILD_DIR@' - - '--path' - - '@THIS_SOURCE_DIR@' - - '-j@PARALLELISM@' - - '--root' - - '@PREFIX@' + # - name: host-cargo + # source: + # subdir: 'bundled' + # git: 'https://github.com/rust-lang/cargo.git' + # tag: '0.61.0' + # version: '0.61.0' + # tools_required: + # - tool: host-rust + # recursive: true + # - tool: host-gcc # GCC is used for linking + # recursive: true + # sources_required: + # # This cargo runs on the host, so we don't actually need any patches here. We just + # # add the sources used by cargo so that the dependency resolver doesn't complain. + # - rust-patched-libs + # - host-bootstrap-cargo + # compile: + # - args: + # - 'cargo' + # - 'install' + # - '--target' + # - 'x86_64-unknown-linux-gnu' + # - '--target-dir' + # - '@THIS_BUILD_DIR@' + # - '--path' + # - '@THIS_SOURCE_DIR@' + # - '-j@PARALLELISM@' + # - '--root' + # - '@PREFIX@' - name: host-python from_source: python @@ -442,6 +508,42 @@ tools: - args: ['ninja', 'install'] packages: + - name: alacritty + source: + subdir: 'bundled' + git: 'https://github.com/alacritty/alacritty' + tag: 'v0.10.1' + version: '0.10.1' + tools_required: + # - host-cargo + - host-gcc + sources_required: + - rust-patched-libs + pkgs_required: + - mlibc + - fontconfig + - freetype + - libx11 + configure: + - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] + # - args: ['cargo', 'update', '--manifest-path', '@THIS_SOURCE_DIR@/Cargo.toml'] + build: + - args: ['install', '-D', '@THIS_SOURCE_DIR@/alacritty.yml', '@THIS_COLLECT_DIR@/root/.alacritty.yml'] + - args: + - 'cargo' + - 'install' + - '--no-default-features' + - '--features' + - 'x11' + - '--locked' + - '--target-dir' + - '@THIS_BUILD_DIR@' + - '--path' + - '@THIS_SOURCE_DIR@/alacritty' + - '--root' + - '@THIS_COLLECT_DIR@/usr' + - '-j@PARALLELISM@' + # - name: ripgrep # source: # subdir: bundled diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index dacfcca50c2..3ef44e286c8 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -389,6 +389,48 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: libxcursor + source: + subdir: bundled + git: 'https://gitlab.freedesktop.org/xorg/lib/libxcursor.git' + tag: 'libXcursor-1.2.1' + version: '1.2.1' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + regenerate: + - args: ['./autogen.sh'] + environ: + 'NOCONFIGURE': 'yes' + tools_required: + - host-gcc + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-pkg-config + pkgs_required: + - mlibc + - xorg-util-macros + - xorg-proto + - libx11 + - libxfixes + - libxrender + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + - '--disable-static' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + # `libxkbfile` is used by the X servers and utilities to parse the XKB # configuration data files. - name: libxkbfile diff --git a/extra-files/rust/config.toml b/extra-files/rust/config.toml index f278203c37c..40913d37e88 100644 --- a/extra-files/rust/config.toml +++ b/extra-files/rust/config.toml @@ -13,3 +13,10 @@ linker = "@BUILD_ROOT@/tools/host-gcc/bin/x86_64-aero-gcc" libc = { path = "@SOURCE_ROOT@/bundled/rust-libc" } num_cpus = { path = "@SOURCE_ROOT@/bundled/rust-num-cpus" } users = { path = "@SOURCE_ROOT@/bundled/rust-users" } +winit = { path = "@SOURCE_ROOT@/bundled/rust-winit" } +nix = { path = "@SOURCE_ROOT@/bundled/rust-nix" } +mio-06 = { path = "@SOURCE_ROOT@/bundled/rust-mio-0.6", package = "mio" } +mio-08 = { path = "@SOURCE_ROOT@/bundled/rust-mio-0.8", package = "mio" } +glutin = { path = "@SOURCE_ROOT@/bundled/rust-glutin/glutin" } +shared_library = { path = "@SOURCE_ROOT@/bundled/rust-shared-library" } +libloading = { path = "@SOURCE_ROOT@/bundled/rust-libloading" } diff --git a/patches/dwm/dwm.patch b/patches/dwm/dwm.patch index b0d898b53ae..30c48c1f2e6 100644 --- a/patches/dwm/dwm.patch +++ b/patches/dwm/dwm.patch @@ -1,22 +1,24 @@ -From 06a217e185e0010a474cb5434c2b370b1edd0db9 Mon Sep 17 00:00:00 2001 +From c709d9f916f71104f658e1b8bba922dc66a3523e Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Thu, 17 Nov 2022 18:11:30 +1100 +Date: Sun, 20 Nov 2022 13:43:15 +1100 Subject: [PATCH] --- - config.def.h | 2 +- + config.def.h | 4 ++-- config.mk | 4 ++-- - 2 files changed, 3 insertions(+), 3 deletions(-) + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config.def.h b/config.def.h -index 9efa774..edc359c 100644 +index 9efa774..20b1681 100644 --- a/config.def.h +++ b/config.def.h -@@ -58,7 +58,7 @@ static const Layout layouts[] = { +@@ -57,8 +57,8 @@ static const Layout layouts[] = { + /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ - static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +-static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; ++static const char *dmenucmd[] = { "alacritty", NULL }; +static const char *termcmd[] = { "limine-term", NULL }; static const Key keys[] = { diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index e145c1352d9..d6d7a635dd2 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,12 +1,13 @@ -From 9ad862a1edb6ce5b86fc4fa49e8ce365af507f47 Mon Sep 17 00:00:00 2001 +From 8854e64e2fbfdbe7e15d35aa8814c173480784d6 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sat, 12 Nov 2022 18:58:33 +1100 -Subject: [PATCH] yes +Date: Sun, 20 Nov 2022 14:45:27 +1100 +Subject: [PATCH] -Signed-off-by: Andy-Python-Programmer --- .gitignore | 2 + + options/ansi/generic/stdlib-stubs.cpp | 2 +- options/glibc/generic/execinfo.cpp | 5 +- + options/posix/generic/dlfcn-stubs.cpp | 1 + options/posix/generic/termios-stubs.cpp | 5 +- options/rtdl/generic/linker.cpp | 2 +- sysdeps/aero/generic/aero.cpp | 38 ++++++------ @@ -15,7 +16,7 @@ Signed-off-by: Andy-Python-Programmer sysdeps/aero/generic/time.cpp | 24 ++++++++ sysdeps/aero/include/aero/syscall.h | 6 ++ sysdeps/aero/meson.build | 1 + - 10 files changed, 155 insertions(+), 30 deletions(-) + 12 files changed, 157 insertions(+), 31 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -28,6 +29,19 @@ index fdd60a0..9f811f4 100644 .vscode +# clangd cache files: +.cache +diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp +index c0e54fe..d6f92f3 100644 +--- a/options/ansi/generic/stdlib-stubs.cpp ++++ b/options/ansi/generic/stdlib-stubs.cpp +@@ -392,7 +392,7 @@ int mbtowc(wchar_t *__restrict wc, const char *__restrict mb, size_t max_size) { + mlibc::code_seq nseq{mb, mb + max_size}; + auto e = cc->decode_wtranscode(nseq, wseq, mbtowc_state); + if (e != mlibc::charcode_error::null) +- __ensure(!"decode_wtranscode() errors are not handled"); ++ return -1; + + return nseq.it - mb; + } else { diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp index 3474615..10a2109 100644 --- a/options/glibc/generic/execinfo.cpp @@ -45,6 +59,18 @@ index 3474615..10a2109 100644 } char **backtrace_symbols(void *const *, int) { +diff --git a/options/posix/generic/dlfcn-stubs.cpp b/options/posix/generic/dlfcn-stubs.cpp +index fc9fd84..ab57631 100644 +--- a/options/posix/generic/dlfcn-stubs.cpp ++++ b/options/posix/generic/dlfcn-stubs.cpp +@@ -27,6 +27,7 @@ char *dlerror(void) { + + [[gnu::noinline]] + void *dlopen(const char *file, int flags) { ++ mlibc::infoLogger() << "mlibc memes: " << file << frg::endlog; + auto ra = __builtin_extract_return_addr(__builtin_return_address(0)); + return __dlapi_open(file, flags, ra); + } diff --git a/options/posix/generic/termios-stubs.cpp b/options/posix/generic/termios-stubs.cpp index 3e621ad..583c1f5 100644 --- a/options/posix/generic/termios-stubs.cpp diff --git a/patches/rust-glutin/rust-glutin.patch b/patches/rust-glutin/rust-glutin.patch new file mode 100644 index 00000000000..0656647c7ff --- /dev/null +++ b/patches/rust-glutin/rust-glutin.patch @@ -0,0 +1,295 @@ +From e6b432ef7fcf3df707428759f01b1cc32f048ecc Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 20 Nov 2022 13:18:36 +1100 +Subject: [PATCH] + +--- + glutin/Cargo.toml | 2 +- + glutin/src/api/dlloader.rs | 1 + + glutin/src/api/egl/mod.rs | 6 ++++++ + glutin/src/api/glx/mod.rs | 1 + + glutin/src/api/osmesa/mod.rs | 1 + + glutin/src/lib.rs | 4 ++++ + glutin/src/platform/mod.rs | 1 + + glutin/src/platform/unix.rs | 1 + + glutin/src/platform_impl/mod.rs | 1 + + glutin/src/platform_impl/unix/mod.rs | 1 + + glutin/src/windowed.rs | 2 ++ + glutin_egl_sys/build.rs | 1 + + glutin_egl_sys/src/lib.rs | 2 ++ + glutin_glx_sys/Cargo.toml | 2 +- + glutin_glx_sys/build.rs | 1 + + glutin_glx_sys/src/lib.rs | 1 + + 16 files changed, 26 insertions(+), 2 deletions(-) + +diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml +index ddd23ee..d3c2eac 100644 +--- a/glutin/Cargo.toml ++++ b/glutin/Cargo.toml +@@ -56,7 +56,7 @@ glutin_wgl_sys = { version = "0.1.5", path = "../glutin_wgl_sys" } + glutin_egl_sys = { version = "0.1.5", path = "../glutin_egl_sys" } + parking_lot = "0.11" + +-[target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd"))'.dependencies] ++[target.'cfg(any(target_os = "linux", target_os = "aero", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd"))'.dependencies] + osmesa-sys = "0.1" + wayland-client = { version = "0.29", features = ["dlopen"], optional = true } + wayland-egl = { version = "0.29", optional = true } +diff --git a/glutin/src/api/dlloader.rs b/glutin/src/api/dlloader.rs +index 9cfba93..8b3d93e 100644 +--- a/glutin/src/api/dlloader.rs ++++ b/glutin/src/api/dlloader.rs +@@ -1,6 +1,7 @@ + #![cfg(any( + target_os = "windows", + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +diff --git a/glutin/src/api/egl/mod.rs b/glutin/src/api/egl/mod.rs +index d567678..de59a09 100644 +--- a/glutin/src/api/egl/mod.rs ++++ b/glutin/src/api/egl/mod.rs +@@ -1,6 +1,7 @@ + #![cfg(any( + target_os = "windows", + target_os = "linux", ++ target_os = "aero", + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", +@@ -121,6 +122,7 @@ use parking_lot::Mutex; + target_os = "android", + target_os = "windows", + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +@@ -773,6 +775,7 @@ pub struct ContextPrototype<'a> { + #[cfg(any( + target_os = "linux", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd", +@@ -804,6 +807,7 @@ impl<'a> ContextPrototype<'a> { + #[cfg(any( + target_os = "linux", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd", +@@ -829,6 +833,7 @@ impl<'a> ContextPrototype<'a> { + + #[cfg(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +@@ -847,6 +852,7 @@ impl<'a> ContextPrototype<'a> { + #[cfg(any( + target_os = "android", + target_os = "windows", ++ target_os = "aero", + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", +diff --git a/glutin/src/api/glx/mod.rs b/glutin/src/api/glx/mod.rs +index 61968e6..2ea9702 100644 +--- a/glutin/src/api/glx/mod.rs ++++ b/glutin/src/api/glx/mod.rs +@@ -1,5 +1,6 @@ + #![cfg(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +diff --git a/glutin/src/api/osmesa/mod.rs b/glutin/src/api/osmesa/mod.rs +index 89c0765..80cc2cd 100644 +--- a/glutin/src/api/osmesa/mod.rs ++++ b/glutin/src/api/osmesa/mod.rs +@@ -1,5 +1,6 @@ + #![cfg(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +diff --git a/glutin/src/lib.rs b/glutin/src/lib.rs +index 7ee1522..3282215 100644 +--- a/glutin/src/lib.rs ++++ b/glutin/src/lib.rs +@@ -43,6 +43,7 @@ + #![cfg_attr( + not(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +@@ -56,6 +57,7 @@ + #![cfg_attr( + any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +@@ -73,6 +75,7 @@ + #[cfg(any( + target_os = "windows", + target_os = "linux", ++ target_os = "aero", + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", +@@ -298,6 +301,7 @@ pub enum CreationError { + impl CreationError { + #[cfg(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +diff --git a/glutin/src/platform/mod.rs b/glutin/src/platform/mod.rs +index e508519..c83423b 100644 +--- a/glutin/src/platform/mod.rs ++++ b/glutin/src/platform/mod.rs +@@ -25,6 +25,7 @@ pub mod run_return { + target_os = "windows", + target_os = "macos", + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +diff --git a/glutin/src/platform/unix.rs b/glutin/src/platform/unix.rs +index 66aed2c..9128e23 100644 +--- a/glutin/src/platform/unix.rs ++++ b/glutin/src/platform/unix.rs +@@ -1,5 +1,6 @@ + #![cfg(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +diff --git a/glutin/src/platform_impl/mod.rs b/glutin/src/platform_impl/mod.rs +index 82affa7..7559367 100644 +--- a/glutin/src/platform_impl/mod.rs ++++ b/glutin/src/platform_impl/mod.rs +@@ -5,6 +5,7 @@ pub use self::platform_impl::*; + mod platform_impl; + #[cfg(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +diff --git a/glutin/src/platform_impl/unix/mod.rs b/glutin/src/platform_impl/unix/mod.rs +index 510ec9c..423fc85 100644 +--- a/glutin/src/platform_impl/unix/mod.rs ++++ b/glutin/src/platform_impl/unix/mod.rs +@@ -1,5 +1,6 @@ + #![cfg(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +diff --git a/glutin/src/windowed.rs b/glutin/src/windowed.rs +index b603918..00a1029 100644 +--- a/glutin/src/windowed.rs ++++ b/glutin/src/windowed.rs +@@ -57,6 +57,7 @@ pub type WindowedContext = ContextWrapper; + #[cfg_attr( + not(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +@@ -70,6 +71,7 @@ pub type WindowedContext = ContextWrapper; + any( + target_os = "linux", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd", +diff --git a/glutin_egl_sys/build.rs b/glutin_egl_sys/build.rs +index 2920f3b..6017f1d 100644 +--- a/glutin_egl_sys/build.rs ++++ b/glutin_egl_sys/build.rs +@@ -11,6 +11,7 @@ fn main() { + + if target.contains("linux") + || target.contains("dragonfly") ++ || target.contains("aero") + || target.contains("freebsd") + || target.contains("netbsd") + || target.contains("openbsd") +diff --git a/glutin_egl_sys/src/lib.rs b/glutin_egl_sys/src/lib.rs +index fac07d2..115899d 100644 +--- a/glutin_egl_sys/src/lib.rs ++++ b/glutin_egl_sys/src/lib.rs +@@ -3,6 +3,7 @@ + target_os = "linux", + target_os = "android", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" +@@ -44,6 +45,7 @@ pub type EGLNativeWindowType = *const raw::c_void; + pub type EGLNativeWindowType = *const raw::c_void; + #[cfg(any( + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" +diff --git a/glutin_glx_sys/Cargo.toml b/glutin_glx_sys/Cargo.toml +index a919dec..03f2d9f 100644 +--- a/glutin_glx_sys/Cargo.toml ++++ b/glutin_glx_sys/Cargo.toml +@@ -12,5 +12,5 @@ edition = "2018" + [build-dependencies] + gl_generator = "0.14" + +-[target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os="dragonfly", target_os="netbsd", target_os="openbsd"))'.dependencies] ++[target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os = "aero", target_os="dragonfly", target_os="netbsd", target_os="openbsd"))'.dependencies] + x11-dl = "2.18.3" +diff --git a/glutin_glx_sys/build.rs b/glutin_glx_sys/build.rs +index 21e1cb3..dff1bfc 100644 +--- a/glutin_glx_sys/build.rs ++++ b/glutin_glx_sys/build.rs +@@ -11,6 +11,7 @@ fn main() { + + if target.contains("linux") + || target.contains("dragonfly") ++ || target.contains("aero") + || target.contains("freebsd") + || target.contains("netbsd") + || target.contains("openbsd") +diff --git a/glutin_glx_sys/src/lib.rs b/glutin_glx_sys/src/lib.rs +index fadb62a..6aa9cc2 100644 +--- a/glutin_glx_sys/src/lib.rs ++++ b/glutin_glx_sys/src/lib.rs +@@ -1,6 +1,7 @@ + #![cfg(any( + target_os = "linux", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" +-- +2.38.1 + diff --git a/patches/rust-libc/rust-libc.patch b/patches/rust-libc/rust-libc.patch new file mode 100644 index 00000000000..2d5d37528da --- /dev/null +++ b/patches/rust-libc/rust-libc.patch @@ -0,0 +1,605 @@ +From aaf02ca3edbe7f8f163f626915fd7d4919f7d399 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 20 Nov 2022 14:58:17 +1100 +Subject: [PATCH] + +--- + src/unix/mlibc/mod.rs | 380 ++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 351 insertions(+), 29 deletions(-) + +diff --git a/src/unix/mlibc/mod.rs b/src/unix/mlibc/mod.rs +index 2046530..8404ff9 100644 +--- a/src/unix/mlibc/mod.rs ++++ b/src/unix/mlibc/mod.rs +@@ -47,7 +47,6 @@ pub type fsfilcnt_t = ::c_uint; + pub type sigset_t = ::c_long; + + // abis/mlibc/termios.h +-pub type cc_t = ::c_uint; + pub type speed_t = ::c_uint; + pub type tcflag_t = ::c_uint; + +@@ -70,7 +69,7 @@ pub type in_addr_t = u32; + pub type in_port_t = u16; + + // abis/mlibc/socket.h +-pub type sa_family_t = ::c_uint; ++pub type sa_family_t = ::c_int; + + // options/linux/include/sys/poll.h + pub type nfds_t = ::size_t; +@@ -112,7 +111,7 @@ s! { + pub sa_handler: ::Option, + pub sa_mask: sigset_t, + pub sa_flags: ::c_int, +- pub sa_sigaction: ::Option, ++ pub sa_sigaction: ::sighandler_t, + } + + // abis/mlibc/termios.h +@@ -121,7 +120,7 @@ s! { + pub c_oflag: tcflag_t, + pub c_cflag: tcflag_t, + pub c_lflag: tcflag_t, +- pub c_cc: [cc_t; NCCS], ++ pub c_cc: [::cc_t; NCCS], + pub ibaud: speed_t, + pub obaud: speed_t, + } +@@ -174,7 +173,7 @@ s! { + pub sin_family: sa_family_t, + pub sin_port: in_port_t, + pub sin_addr: in_addr, +- pub __padding: [u8; 8], // std relies on this being public ++ pub sin_zero: [u8; 8], // std relies on this being public + } + pub struct sockaddr_in6 { + pub sin6_family: sa_family_t, +@@ -250,10 +249,14 @@ s! { + pub __mlibc_state: ::c_uint, + pub __mlibc_recursion: ::c_uint, + pub __mlibc_flags: ::c_uint, ++ pub __mlibc_prioceiling: ::c_int, + } + pub struct pthread_mutexattr_t { + pub __mlibc_type: ::c_int, + pub __mlibc_robust: ::c_int, ++ pub __mlibc_protocol: ::c_int, ++ pub __mlibc_pshared: ::c_int, ++ pub __mlibc_prioceiling: ::c_int, + } + pub struct pthread_rwlock_t { + pub __mlibc_m: ::c_uint, +@@ -319,10 +322,73 @@ s! { + pub struct fd_set { + pub fds_bits: [c_char; 128], + } ++ ++ pub struct cmsghdr { ++ // FIXME: mio needs this to be a size_t for some reason ++ // pub cmsg_len: ::socklen_t, ++ pub cmsg_len: ::size_t, ++ pub cmsg_level: ::c_int, ++ pub cmsg_type: ::c_int, ++ } ++ ++ // options/linux/include/sys/epoll.h ++ pub struct epoll_event { ++ pub events: u32, ++ pub u64: u64, ++ } ++ ++ pub struct msghdr { ++ pub msg_name: *mut ::c_void, ++ pub msg_namelen: ::socklen_t, ++ pub msg_iov: *mut ::iovec, ++ pub msg_iovlen: ::c_int, ++ pub msg_control: *mut ::c_void, ++ pub msg_controllen: ::size_t, // nix assumes this is a size_t ++ pub msg_flags: ::c_int, ++ } ++ ++ // options/linux-headers/include/linux/if_packet.h ++ pub struct sockaddr_ll { ++ pub sll_family: ::c_ushort, ++ pub sll_protocol: ::c_ushort, ++ pub sll_ifindex: ::c_int, ++ pub sll_hatype: ::c_ushort, ++ pub sll_pkttype: ::c_uchar, ++ pub sll_halen: ::c_uchar, ++ pub sll_addr: [::c_uchar; 8] ++ } ++ ++ pub struct flock { ++ pub l_type: ::c_short, ++ pub l_whence: ::c_short, ++ pub l_start: ::off_t, ++ pub l_len: ::off_t, ++ pub l_pid: ::pid_t, ++ } + } + + // options/posix/include/sys/wait.h + safe_f! { ++ pub fn CMSG_FIRSTHDR(_mhdr: *const msghdr) -> *mut cmsghdr { ++ core::unimplemented!() ++ } ++ ++ pub fn CMSG_NXTHDR(_mhdr: *const ::msghdr, _cmsg: *const ::cmsghdr) -> *mut ::cmsghdr { ++ core::unimplemented!() ++ } ++ ++ pub fn CMSG_LEN(_length: ::c_uint) -> ::c_uint { ++ core::unimplemented!() ++ } ++ ++ pub fn CMSG_DATA(_cmsg: *const cmsghdr) -> *mut ::c_uchar { ++ core::unimplemented!() ++ } ++ ++ pub fn CMSG_SPACE(_len: ::c_uint) -> ::c_uint { ++ core::unimplemented!() ++ } ++ + pub {const} fn WCOREDUMP(x: ::c_int) -> bool { + x & WCOREFLAG != 0 + } +@@ -356,11 +422,24 @@ pub const MAP_SHARED: ::c_int = 2; + pub const PROT_EXEC: ::c_int = 4; + pub const PROT_READ: ::c_int = 1; + pub const PROT_WRITE: ::c_int = 2; ++pub const PROT_NONE: ::c_int = 0; ++pub const MAP_FIXED: ::c_int = 2; ++pub const MAP_NORESERVE: ::c_int = 0x10; + + // options/posix/include/sys/mman.h ++pub const MAP_FILE: ::c_int = 0; + pub const MAP_FAILED: *mut ::c_void = usize::MAX as *mut ::c_void; + pub const MS_ASYNC: ::c_int = 1; + pub const MS_SYNC: ::c_int = 2; ++pub const MADV_NORMAL: ::c_int = 0; ++pub const MADV_RANDOM: ::c_int = 1; ++pub const MADV_SEQUENTIAL: ::c_int = 2; ++pub const MADV_WILLNEED: ::c_int = 3; ++pub const MADV_DONTNEED: ::c_int = 4; ++pub const MADV_FREE: ::c_int = 8; ++pub const MS_INVALIDATE: ::c_int = 4; ++pub const MCL_CURRENT: ::c_int = 1; ++pub const MCL_FUTURE: ::c_int = 2; + + // options/ansi/include/time.h + pub const CLOCK_MONOTONIC: clockid_t = 1; +@@ -369,33 +448,49 @@ pub const CLOCK_REALTIME: clockid_t = 0; + // options/posix/include/netdb.h + pub const EAI_SYSTEM: ::c_int = 9; + +-// options/posix/include/termios.h - constants for tcsetattr() +-pub const TCSANOW: ::c_int = 1; +-pub const TCSADRAIN: ::c_int = 2; +-pub const TCSAFLUSH: ::c_int = 3; +- +-// options/posix/include/termios.h - bitwise constants for c_lflag in struct termios +-pub const ECHO: ::tcflag_t = 0x0001; +-pub const ECHOE: ::tcflag_t = 0x0002; +-pub const ECHOK: ::tcflag_t = 0x0004; +-pub const ECHONL: ::tcflag_t = 0x0008; +-pub const ICANON: ::tcflag_t = 0x0010; +-pub const IEXTEN: ::tcflag_t = 0x0020; +-pub const ISIG: ::tcflag_t = 0x0040; +-pub const NOFLSH: ::tcflag_t = 0x0080; +-pub const TOSTOP: ::tcflag_t = 0x0100; +-pub const ECHOPR: ::tcflag_t = 0x0200; +- + // abis/mlibc/in.h +-pub const IPV6_ADD_MEMBERSHIP: ::c_int = 1; +-pub const IPV6_DROP_MEMBERSHIP: ::c_int = 2; ++pub const IPV6_JOIN_GROUP: ::c_int = 1; ++pub const IPV6_LEAVE_GROUP: ::c_int = 2; ++pub const IPV6_MULTICAST_HOPS: ::c_int = 3; ++pub const IPV6_MULTICAST_IF: ::c_int = 4; + pub const IPV6_MULTICAST_LOOP: ::c_int = 5; ++pub const IPV6_UNICAST_HOPS: ::c_int = 6; + pub const IPV6_V6ONLY: ::c_int = 7; ++pub const IPV6_PMTUDISC_DONT: ::c_int = 8; ++pub const IPV6_PMTUDISC_DO: ::c_int = 9; ++pub const IPV6_MTU_DISCOVER: ::c_int = 23; ++pub const IPV6_RECVERR: ::c_int = 25; ++pub const IPV6_RECVPKTINFO: ::c_int = 49; ++pub const IPV6_PKTINFO: ::c_int = 50; ++pub const IPV6_RECVHOPLIMIT: ::c_int = 51; ++pub const IPV6_HOPLIMIT: ::c_int = 52; ++pub const IPV6_TCLASS: ::c_int = 67; ++pub const IP_TOS: ::c_int = 1; ++pub const IP_TTL: ::c_int = 2; ++pub const IP_OPTIONS: ::c_int = 4; ++pub const IP_PKTINFO: ::c_int = 8; ++pub const IP_MTU_DISCOVER: ::c_int = 10; ++pub const IP_RECVERR: ::c_int = 11; ++pub const IP_RECVTTL: ::c_int = 12; ++ ++pub const IP_DEFAULT_MULTICAST_TTL: ::c_int = 1; ++pub const IP_MULTICAST_IF: ::c_int = 32; ++pub const IP_MULTICAST_TTL: ::c_int = 33; ++pub const IP_MULTICAST_LOOP: ::c_int = 34; + pub const IP_ADD_MEMBERSHIP: ::c_int = 35; + pub const IP_DROP_MEMBERSHIP: ::c_int = 36; +-pub const IP_MULTICAST_LOOP: ::c_int = 34; +-pub const IP_MULTICAST_TTL: ::c_int = 33; +-pub const IP_TTL: ::c_int = 2; ++pub const IP_UNBLOCK_SOURCE: ::c_int = 37; ++pub const IP_BLOCK_SOURCE: ::c_int = 38; ++pub const IP_ADD_SOURCE_MEMBERSHIP: ::c_int = 39; ++pub const IP_DROP_SOURCE_MEMBERSHIP: ::c_int = 40; ++pub const MCAST_JOIN_SOURCE_GROUP: ::c_int = 46; ++pub const MCAST_LEAVE_SOURCE_GROUP: ::c_int = 47; ++ ++pub const IPV6_ADD_MEMBERSHIP: ::c_int = IPV6_JOIN_GROUP; ++pub const IPV6_DROP_MEMBERSHIP: ::c_int = IPV6_LEAVE_GROUP; ++ ++// FIXME: not defined in mlibc ++pub const TCP_KEEPIDLE: ::c_int = 4; + + // abis/linux/signal.h + pub const SIGABRT: ::c_int = 6; +@@ -436,45 +531,186 @@ pub const SIGSYS: ::c_int = 31; + pub const SIGUNUSED: ::c_int = SIGSYS; + pub const SIGCANCEL: ::c_int = 32; + ++pub const SA_SIGINFO: ::c_int = 4; ++pub const SA_RESTART: ::c_int = 0x10000000; ++ ++pub const SIG_DFL: ::sighandler_t = 0 as ::sighandler_t; ++pub const SIG_IGN: ::sighandler_t = 1 as ::sighandler_t; ++pub const SIG_ERR: ::sighandler_t = !0 as ::sighandler_t; ++ + // abis/mlibc/signal.h - constants for sigprocmask() + pub const SIG_BLOCK: ::c_int = 0; + pub const SIG_UNBLOCK: ::c_int = 1; + pub const SIG_SETMASK: ::c_int = 2; + + // abis/mlibc/termios.h ++pub const B0: ::c_uint = 0; ++pub const B50: ::c_uint = 1; ++pub const B75: ::c_uint = 2; ++pub const B110: ::c_uint = 3; ++pub const B134: ::c_uint = 4; ++pub const B150: ::c_uint = 5; ++pub const B200: ::c_uint = 6; ++pub const B300: ::c_uint = 7; ++pub const B600: ::c_uint = 8; ++pub const B1200: ::c_uint = 9; ++pub const B1800: ::c_uint = 10; ++pub const B2400: ::c_uint = 11; ++pub const B4800: ::c_uint = 12; ++pub const B9600: ::c_uint = 13; ++pub const B19200: ::c_uint = 14; ++pub const B38400: ::c_uint = 15; ++pub const B57600: ::c_uint = 16; ++pub const B115200: ::c_uint = 17; ++pub const B230400: ::c_uint = 18; ++pub const BRKINT: ::c_uint = 0x0001; ++pub const BS0: ::c_int = 0x0000; ++pub const BS1: ::c_int = 0x1000; ++pub const BSDLY: ::c_int = 0x1000; ++pub const CLOCAL: ::c_int = 0x0080; ++pub const CR0: ::c_int = 0x0000; ++pub const CR1: ::c_int = 0x0100; ++pub const CR2: ::c_int = 0x0200; ++pub const CR3: ::c_int = 0x0300; ++pub const CRDLY: ::c_int = 0x0300; ++pub const CREAD: ::c_int = 0x0008; ++pub const CS5: ::c_uint = 0x0000; ++pub const CS6: ::c_int = 0x0001; ++pub const CS7: ::c_int = 0x0002; ++pub const CS8: ::c_int = 0x0003; ++pub const CSIZE: ::c_int = 0x0003; ++pub const CSTOPB: ::c_int = 0x0004; ++pub const ECHO: ::c_uint = 0x0001; ++pub const ECHOE: ::c_int = 0x0002; ++pub const ECHOK: ::c_int = 0x0004; ++pub const ECHONL: ::c_int = 0x0008; ++pub const ECHOPRT: ::c_int = 0x0200; ++pub const FF0: ::c_int = 0x0000; ++pub const FF1: ::c_int = 0x4000; ++pub const FFDLY: ::c_int = 0x4000; ++pub const HUPCL: ::c_int = 0x0040; ++pub const ICANON: ::c_int = 0x0010; ++pub const ICRNL: ::c_uint = 0x0002; ++pub const IEXTEN: ::c_int = 0x0020; ++pub const IGNBRK: ::c_uint = 0x0004; ++pub const IGNCR: ::c_uint = 0x0008; ++pub const IGNPAR: ::c_uint = 0x0010; ++pub const INLCR: ::c_uint = 0x0020; ++pub const INPCK: ::c_uint = 0x0040; ++pub const ISIG: ::c_int = 0x0040; ++pub const ISTRIP: ::c_uint = 0x0080; ++pub const IXANY: ::c_uint = 0x0100; ++pub const IXOFF: ::c_uint = 0x0200; ++pub const IXON: ::c_uint = 0x0400; + pub const NCCS: usize = 11; ++pub const NL0: ::c_int = 0x0000; ++pub const NL1: ::c_int = 0x0080; ++pub const NLDLY: ::c_int = 0x0080; ++pub const NOFLSH: ::c_int = 0x0080; ++pub const OCRNL: ::c_int = 0x0004; ++pub const OFDEL: ::c_int = 0x0020; ++pub const OFILL: ::c_int = 0x0040; ++pub const ONLCR: ::c_int = 0x0002; ++pub const ONLRET: ::c_int = 0x0010; ++pub const ONOCR: ::c_int = 0x0008; ++pub const OPOST: ::c_uint = 0x0001; ++pub const PARENB: ::c_int = 0x0010; ++pub const PARMRK: ::c_uint = 0x0800; ++pub const PARODD: ::c_int = 0x0020; ++pub const TAB0: ::c_int = 0x0000; ++pub const TAB1: ::c_int = 0x0400; ++pub const TAB2: ::c_int = 0x0800; ++pub const TAB3: ::c_int = 0x0C00; ++pub const TABDLY: ::c_int = 0x0C00; ++pub const TCIFLUSH: ::c_int = 1; ++pub const TCIOFF: ::c_int = 1; ++pub const TCIOFLUSH: ::c_int = 2; ++pub const TCION: ::c_int = 2; ++pub const TCOFLUSH: ::c_int = 3; ++pub const TCOOFF: ::c_int = 3; ++pub const TCOON: ::c_int = 4; ++pub const TCSADRAIN: ::c_int = 2; ++pub const TCSAFLUSH: ::c_int = 3; ++pub const TCSANOW: ::c_int = 1; ++pub const TIOCSCTTY: ::c_ulong = 0x540e; ++pub const TIOCSWINSZ: ::c_ulong = 0x5414; ++pub const TOSTOP: ::c_int = 0x0100; ++pub const VT0: ::c_int = 0x0000; ++pub const VT1: ::c_int = 0x2000; ++ ++// The following are usize since they are indices into termios.c_cc ++pub const VEOF: usize = 0; + + // options/posix/include/termios.h + pub const TIOCGWINSZ: ::c_ulong = 0x5413; + ++// options/ansi/include/locale.h ++pub const LC_CTYPE: ::c_int = 3; ++ + // options/ansi/include/stdlib.h + pub const EXIT_FAILURE: ::c_int = 1; + pub const EXIT_SUCCESS: ::c_int = 0; + + // options/posix/include/dlfcn.h + pub const RTLD_DEFAULT: *mut ::c_void = 0 as *mut ::c_void; ++pub const RTLD_LAZY: ::c_int = 32; + + // options/posix/include/unistd.h ++pub const F_OK: ::c_int = 1; ++pub const R_OK: ::c_int = 2; + pub const STDERR_FILENO: ::c_int = 2; + pub const STDIN_FILENO: ::c_int = 0; + pub const STDOUT_FILENO: ::c_int = 1; ++pub const W_OK: ::c_int = 4; ++pub const X_OK: ::c_int = 8; ++pub const _PC_NAME_MAX: ::c_int = 3; ++pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 7; + pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 1; + pub const _SC_NPROCESSORS_ONLN: ::c_int = 6; ++pub const _SC_NGROUPS_MAX: ::c_int = 10; + pub const _SC_PAGESIZE: ::c_int = _SC_PAGE_SIZE; + pub const _SC_PAGE_SIZE: ::c_int = 3; + + // abis/mlibc/socket.h ++pub const AF_APPLETALK: ::c_int = PF_APPLETALK; ++pub const AF_BLUETOOTH: ::c_int = PF_BLUETOOTH; ++pub const AF_DECnet: ::c_int = PF_DECnet; + pub const AF_INET6: ::c_int = PF_INET6; + pub const AF_INET: ::c_int = PF_INET; ++pub const AF_IPX: ::c_int = PF_IPX; ++pub const AF_ISDN: ::c_int = PF_ISDN; ++pub const AF_PACKET: ::c_int = PF_PACKET; ++pub const AF_SNA: ::c_int = PF_SNA; + pub const AF_UNIX: ::c_int = 3; + pub const MSG_PEEK: ::c_int = 0x20; ++pub const MSG_TRUNC: ::c_int = 0x40; ++pub const AF_UNSPEC: ::c_int = PF_UNSPEC; ++pub const MSG_CTRUNC: ::c_int = 1; ++pub const MSG_CMSG_CLOEXEC: ::c_int = 0x2000; ++pub const MSG_EOR: ::c_int = 4; ++pub const MSG_OOB: ::c_int = 8; ++pub const MSG_WAITALL: ::c_int = 0x80; ++pub const PF_APPLETALK: ::c_int = 7; ++pub const PF_BLUETOOTH: ::c_int = 8; ++pub const PF_DECnet: ::c_int = 9; ++pub const MSG_DONTWAIT: ::c_int = 0x1000; + pub const PF_INET6: ::c_int = 2; + pub const PF_INET: ::c_int = 1; + pub const PF_UNIX: ::c_int = 3; ++pub const PF_UNSPEC: ::c_int = 4; ++pub const SCM_RIGHTS: ::c_int = 1; ++pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; + pub const SHUT_RD: ::c_int = 1; + pub const SHUT_RDWR: ::c_int = 2; + pub const SHUT_WR: ::c_int = 3; + pub const SOCK_DGRAM: ::c_int = 1; ++pub const SOCK_RAW: ::c_int = 2; ++pub const SOCK_RDM: ::c_int = 0x40000; ++pub const SOCK_SEQPACKET: ::c_int = 3; ++pub const PF_IPX: ::c_int = 10; ++pub const PF_ISDN: ::c_int = 11; ++pub const PF_PACKET: ::c_int = 13; ++pub const PF_SNA: ::c_int = 12; + pub const SOCK_STREAM: ::c_int = 4; + pub const SOL_SOCKET: ::c_int = 1; + pub const SO_ACCEPTCONN: ::c_int = 1; +@@ -494,6 +730,8 @@ pub const SO_SNDLOWAT: ::c_int = 14; + pub const SO_SNDTIMEO: ::c_int = 15; + pub const SO_TYPE: ::c_int = 16; + pub const SO_SNDBUFFORCE: ::c_int = 17; ++pub const TCP_KEEPCNT: ::c_int = 6; ++pub const TCP_KEEPINTVL: ::c_int = 5; + pub const SO_PEERCRED: ::c_int = 18; + pub const SO_ATTACH_FILTER: ::c_int = 19; + pub const SO_PASSCRED: ::c_int = 20; +@@ -503,6 +741,12 @@ pub const SO_PROTOCOL: ::c_int = 23; + pub const SO_REUSEPORT: ::c_int = 24; + pub const SO_TIMESTAMP: ::c_int = 25; + ++// options/posix/include/sys/file.h ++pub const LOCK_EX: ::c_int = 2; ++pub const LOCK_NB: ::c_int = 4; ++pub const LOCK_SH: ::c_int = 1; ++pub const LOCK_UN: ::c_int = 8; ++ + // abis/mlibc/errno.h + pub const EDOM: ::c_int = 1; + pub const EILSEQ: ::c_int = 2; +@@ -592,15 +836,24 @@ pub const ENOTBLK: ::c_int = 1083; + + // options/posix/include/fcntl.h + pub const AT_FDCWD: ::c_int = -100; +-pub const F_DUPFD: ::c_int = 1; + pub const F_DUPFD_CLOEXEC: ::c_int = 2; ++pub const AT_REMOVEDIR: ::c_int = 8; + pub const F_GETFD: ::c_int = 3; + pub const F_SETFD: ::c_int = 4; ++pub const AT_SYMLINK_FOLLOW: ::c_int = 2; ++pub const AT_SYMLINK_NOFOLLOW: ::c_int = 4; ++pub const F_DUPFD: ::c_int = 1; + pub const F_GETFL: ::c_int = 5; + pub const F_SETFL: ::c_int = 6; + pub const F_GETLK: ::c_int = 7; + pub const F_SETLK: ::c_int = 8; + pub const F_SETLKW: ::c_int = 9; ++pub const O_DIRECTORY: ::c_int = 0x00020; ++pub const O_NOFOLLOW: ::c_int = 0x100; ++pub const O_ASYNC: ::c_int = 0x40000; ++pub const O_NDELAY: ::c_int = 0x400; ++pub const O_NOCTTY: ::c_int = 0x80; ++pub const O_SYNC: ::c_int = 0x2000; + pub const F_GETOWN: ::c_int = 10; + pub const F_SETOWN: ::c_int = 11; + pub const O_ACCMODE: ::c_int = 7; +@@ -649,18 +902,42 @@ pub const WCOREFLAG: ::c_int = 0x80; + pub const WNOHANG: ::c_int = 2; + + // options/linux/include/sys/poll.h +-// TODO: Port epoll! + pub const POLLHUP: ::c_short = 8; + pub const POLLIN: ::c_short = 1; + pub const POLLNVAL: ::c_short = 0x40; + pub const POLLOUT: ::c_short = 2; + ++// options/linux/include/sys/epoll.h ++pub const EPOLLERR: ::c_int = 8; ++pub const EPOLLET: ::c_int = 1 << 31; ++pub const EPOLLHUP: ::c_int = 0x10; ++pub const EPOLLIN: ::c_int = 1; ++pub const EPOLLMSG: ::c_int = 0x400; ++pub const EPOLLONESHOT: ::c_int = 1 << 30; ++pub const EPOLLOUT: ::c_int = 4; ++pub const EPOLLPRI: ::c_int = 2; ++pub const EPOLLRDBAND: ::c_int = 0x80; ++pub const EPOLLRDHUP: ::c_int = 0x2000; ++pub const EPOLLRDNORM: ::c_int = 0x40; ++pub const EPOLLWRBAND: ::c_int = 0x200; ++pub const EPOLLWRNORM: ::c_int = 0x100; ++pub const EPOLLWAKEUP: ::c_int = 1 << 29; ++pub const EPOLL_CLOEXEC: ::c_int = 1; ++pub const EPOLL_CTL_ADD: ::c_int = 1; ++pub const EPOLL_CTL_DEL: ::c_int = 2; ++pub const EPOLL_CTL_MOD: ::c_int = 3; ++ ++// options/linux/include/sys/eventfd.h ++pub const EFD_CLOEXEC: ::c_int = O_CLOEXEC; ++pub const EFD_NONBLOCK: ::c_int = O_NONBLOCK; ++ + // options/glibc/include/sys/ioctl.h + pub const FIOCLEX: ::c_ulong = 0x5451; + pub const FIONBIO: ::c_ulong = 0x5421; + + // options/ansi/include/limits.h + pub const PTHREAD_STACK_MIN: ::size_t = 16384; ++pub const PATH_MAX: ::size_t = 4096; + + // options/posix/include/pthread.h + align_const! { +@@ -668,6 +945,7 @@ align_const! { + __mlibc_state: 0, + __mlibc_recursion: 0, + __mlibc_flags: 0, ++ __mlibc_prioceiling: 0, + }; + pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + __mlibc_seq: 0, +@@ -689,11 +967,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; + pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; + + extern "C" { ++ pub fn __errno_location() -> *mut ::c_int; ++ pub fn acct(filename: *const ::c_char) -> ::c_int; + pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int; + pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn endpwent(); ++ pub fn epoll_create(size: ::c_int) -> ::c_int; ++ pub fn epoll_create1(flags: ::c_int) -> ::c_int; ++ pub fn epoll_ctl(epfd: ::c_int, op: ::c_int, fd: ::c_int, event: *mut ::epoll_event) ++ -> ::c_int; ++ pub fn epoll_wait( ++ epfd: ::c_int, ++ events: *mut ::epoll_event, ++ maxevents: ::c_int, ++ timeout: ::c_int, ++ ) -> ::c_int; ++ pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; ++ pub fn forkpty( ++ amaster: *mut ::c_int, ++ name: *mut ::c_char, ++ termp: *mut termios, ++ winp: *mut ::winsize, ++ ) -> ::pid_t; ++ pub fn futimes(file: ::c_int, times: *const ::timeval) -> ::c_int; ++ pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn getpwent() -> *mut passwd; ++ pub fn openpty( ++ amaster: *mut ::c_int, ++ aslave: *mut ::c_int, ++ name: *mut ::c_char, ++ termp: *const termios, ++ winp: *const ::winsize, ++ ) -> ::c_int; ++ pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, +@@ -728,8 +1035,21 @@ extern "C" { + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; ++ pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; ++ pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; ++ pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; ++ pub fn shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int; ++ pub fn shm_unlink(name: *const ::c_char) -> ::c_int; ++ pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; ++ pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; ++ pub fn utimensat( ++ dirfd: ::c_int, ++ path: *const ::c_char, ++ times: *const ::timespec, ++ flag: ::c_int, ++ ) -> ::c_int; + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + pub fn pthread_condattr_setclock( + attr: *mut pthread_condattr_t, +@@ -752,6 +1072,8 @@ extern "C" { + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; ++ pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; ++ pub fn sendmsg(fd: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn setgroups(ngroups: ::c_int, ptr: *const ::gid_t) -> ::c_int; + pub fn setpwent(); + pub fn writev(fd: ::c_int, iov: *const ::iovec, count: ::c_int) -> ::ssize_t; +-- +2.38.1 + diff --git a/patches/rust-libloading/rust-libloading.patch b/patches/rust-libloading/rust-libloading.patch new file mode 100644 index 00000000000..ac3ec05e6f1 --- /dev/null +++ b/patches/rust-libloading/rust-libloading.patch @@ -0,0 +1,50 @@ +From f5fab150ee8fbfdef46888837b6e6d43fd3ec1c0 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 20 Nov 2022 13:39:51 +1100 +Subject: [PATCH] + +--- + src/os/unix/consts.rs | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/src/os/unix/consts.rs b/src/os/unix/consts.rs +index dbe4df9..fbdd2e3 100644 +--- a/src/os/unix/consts.rs ++++ b/src/os/unix/consts.rs +@@ -58,7 +58,7 @@ mod posix { + use self::cfg_if::cfg_if; + use super::c_int; + cfg_if! { +- if #[cfg(target_os = "haiku")] { ++ if #[cfg(any(target_os = "haiku", target_os = "aero"))] { + pub(super) const RTLD_LAZY: c_int = 0; + } else if #[cfg(any( + target_os = "linux", +@@ -90,7 +90,7 @@ mod posix { + } + + cfg_if! { +- if #[cfg(target_os = "haiku")] { ++ if #[cfg(any(target_os = "haiku", target_os = "aero"))] { + pub(super) const RTLD_NOW: c_int = 1; + } else if #[cfg(any( + target_os = "linux", +@@ -126,6 +126,7 @@ mod posix { + cfg_if! { + if #[cfg(any( + target_os = "haiku", ++ target_os = "aero", + all(target_os = "android",target_pointer_width = "32"), + ))] { + pub(super) const RTLD_GLOBAL: c_int = 2; +@@ -193,6 +194,7 @@ mod posix { + + target_os = "fuchsia", + target_os = "redox", ++ target_os = "aero", + ))] { + pub(super) const RTLD_LOCAL: c_int = 0; + } else { +-- +2.38.1 + diff --git a/patches/rust-mio-0.6/rust-mio-0.6.patch b/patches/rust-mio-0.6/rust-mio-0.6.patch new file mode 100644 index 00000000000..7b37510c61e --- /dev/null +++ b/patches/rust-mio-0.6/rust-mio-0.6.patch @@ -0,0 +1,94 @@ +From 1459849ab415fe1e9459b108a2908c22c8b1c029 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 20 Nov 2022 13:08:41 +1100 +Subject: [PATCH] + +--- + src/event_imp.rs | 10 ++++++---- + src/sys/unix/mod.rs | 2 ++ + src/sys/unix/ready.rs | 7 +++++-- + 3 files changed, 13 insertions(+), 6 deletions(-) + +diff --git a/src/event_imp.rs b/src/event_imp.rs +index f93e1fd..0109f74 100644 +--- a/src/event_imp.rs ++++ b/src/event_imp.rs +@@ -512,8 +512,9 @@ impl ops::Sub for PollOpt { + } + } + +-#[deprecated(since = "0.6.10", note = "removed")] +-#[cfg(feature = "with-deprecated")] ++// Hack: causes errors for us since this isn't upstream. ++// #[deprecated(since = "0.6.10", note = "removed")] ++// #[cfg(feature = "with-deprecated")] + #[doc(hidden)] + impl ops::Not for PollOpt { + type Output = PollOpt; +@@ -999,8 +1000,9 @@ impl> ops::SubAssign for Ready { + } + } + +-#[deprecated(since = "0.6.10", note = "removed")] +-#[cfg(feature = "with-deprecated")] ++// Hack: causes errors for us since this isn't upstream. ++// #[deprecated(since = "0.6.10", note = "removed")] ++// #[cfg(feature = "with-deprecated")] + #[doc(hidden)] + impl ops::Not for Ready { + type Output = Ready; +diff --git a/src/sys/unix/mod.rs b/src/sys/unix/mod.rs +index c5726c0..b702d35 100644 +--- a/src/sys/unix/mod.rs ++++ b/src/sys/unix/mod.rs +@@ -6,6 +6,7 @@ pub mod dlsym; + #[cfg(any( + target_os = "android", + target_os = "illumos", ++ target_os = "aero", + target_os = "linux", + target_os = "solaris" + ))] +@@ -14,6 +15,7 @@ mod epoll; + #[cfg(any( + target_os = "android", + target_os = "illumos", ++ target_os = "aero", + target_os = "linux", + target_os = "solaris" + ))] +diff --git a/src/sys/unix/ready.rs b/src/sys/unix/ready.rs +index ef90147..50237e0 100644 +--- a/src/sys/unix/ready.rs ++++ b/src/sys/unix/ready.rs +@@ -276,6 +276,7 @@ impl UnixReady { + #[cfg(any( + target_os = "android", + target_os = "illumos", ++ target_os = "aero", + target_os = "linux", + target_os = "solaris" + ))] +@@ -407,6 +408,7 @@ impl UnixReady { + #[cfg(any( + target_os = "android", + target_os = "illumos", ++ target_os = "aero", + target_os = "linux", + target_os = "solaris" + ))] +@@ -477,8 +479,9 @@ impl ops::Sub for UnixReady { + } + } + +-#[deprecated(since = "0.6.10", note = "removed")] +-#[cfg(feature = "with-deprecated")] ++// Hack: causes errors for us since this isn't upstream. ++// #[deprecated(since = "0.6.10", note = "removed")] ++// #[cfg(feature = "with-deprecated")] + #[doc(hidden)] + impl ops::Not for UnixReady { + type Output = UnixReady; +-- +2.38.1 + diff --git a/patches/rust-mio-0.8/rust-mio-0.8.patch b/patches/rust-mio-0.8/rust-mio-0.8.patch new file mode 100644 index 00000000000..e148c6f788f --- /dev/null +++ b/patches/rust-mio-0.8/rust-mio-0.8.patch @@ -0,0 +1,73 @@ +From de6c2d83e3db2040ca4933ca97006f1c2ad82a64 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 20 Nov 2022 12:29:48 +1100 +Subject: [PATCH] + +--- + src/sys/unix/pipe.rs | 2 ++ + src/sys/unix/selector/mod.rs | 2 ++ + src/sys/unix/waker.rs | 4 ++-- + 3 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/src/sys/unix/pipe.rs b/src/sys/unix/pipe.rs +index b2865cd..df56531 100644 +--- a/src/sys/unix/pipe.rs ++++ b/src/sys/unix/pipe.rs +@@ -150,6 +150,7 @@ pub fn new() -> io::Result<(Sender, Receiver)> { + #[cfg(any( + target_os = "android", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "linux", + target_os = "netbsd", +@@ -189,6 +190,7 @@ pub fn new() -> io::Result<(Sender, Receiver)> { + target_os = "dragonfly", + target_os = "freebsd", + target_os = "linux", ++ target_os = "aero", + target_os = "netbsd", + target_os = "openbsd", + target_os = "ios", +diff --git a/src/sys/unix/selector/mod.rs b/src/sys/unix/selector/mod.rs +index 9ae4c14..cb1ce72 100644 +--- a/src/sys/unix/selector/mod.rs ++++ b/src/sys/unix/selector/mod.rs +@@ -3,6 +3,7 @@ + target_os = "illumos", + target_os = "linux", + target_os = "redox", ++ target_os = "aero", + ))] + mod epoll; + +@@ -11,6 +12,7 @@ mod epoll; + target_os = "illumos", + target_os = "linux", + target_os = "redox", ++ target_os = "aero", + ))] + pub(crate) use self::epoll::{event, Event, Events, Selector}; + +diff --git a/src/sys/unix/waker.rs b/src/sys/unix/waker.rs +index de88e31..714ac55 100644 +--- a/src/sys/unix/waker.rs ++++ b/src/sys/unix/waker.rs +@@ -1,4 +1,4 @@ +-#[cfg(any(target_os = "linux", target_os = "android"))] ++#[cfg(any(target_os = "linux", target_os = "android", target_os = "aero"))] + mod eventfd { + use crate::sys::Selector; + use crate::{Interest, Token}; +@@ -58,7 +58,7 @@ mod eventfd { + } + } + +-#[cfg(any(target_os = "linux", target_os = "android"))] ++#[cfg(any(target_os = "linux", target_os = "android", target_os = "aero"))] + pub use self::eventfd::Waker; + + #[cfg(any(target_os = "freebsd", target_os = "ios", target_os = "macos"))] +-- +2.38.1 + diff --git a/patches/rust-nix/rust-nix.patch b/patches/rust-nix/rust-nix.patch new file mode 100644 index 00000000000..6ff6e5acb49 --- /dev/null +++ b/patches/rust-nix/rust-nix.patch @@ -0,0 +1,709 @@ +From 608f6dc307498272ec3a6317cac3bbbe2a8b74b1 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 20 Nov 2022 12:21:43 +1100 +Subject: [PATCH] + +--- + src/errno.rs | 217 +++++++++++++++++++++++++++++++++++++++++ + src/lib.rs | 12 ++- + src/sys/mod.rs | 10 +- + src/sys/socket/addr.rs | 16 +-- + src/sys/socket/mod.rs | 5 +- + src/sys/termios.rs | 54 +++++++++- + src/unistd.rs | 27 +++++ + 7 files changed, 327 insertions(+), 14 deletions(-) + +diff --git a/src/errno.rs b/src/errno.rs +index 9c2dfe4..d26d63d 100644 +--- a/src/errno.rs ++++ b/src/errno.rs +@@ -22,6 +22,7 @@ cfg_if! { + } else if #[cfg(any(target_os = "linux", + target_os = "redox", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "fuchsia"))] { + unsafe fn errno_location() -> *mut c_int { + libc::__errno_location() +@@ -183,6 +184,9 @@ fn last() -> Errno { + + fn desc(errno: Errno) -> &'static str { + use self::Errno::*; ++ // TODO: This is completely broken on aero ++ #[allow(unreachable_patterns)] ++ #[allow(unused_variables)] + match errno { + UnknownErrno => "Unknown errno", + EPERM => "Operation not permitted", +@@ -1557,6 +1561,219 @@ mod consts { + } + } + ++#[cfg(target_os = "aero")] ++mod consts { ++ #[derive(Clone, Copy, Debug, Eq, PartialEq)] ++ #[repr(i32)] ++ pub enum Errno { ++ UnknownErrno = 0, ++ E2BIG = libc::E2BIG, ++ EACCES = libc::EACCES, ++ EADDRINUSE = libc::EADDRINUSE, ++ EADDRNOTAVAIL = libc::EADDRNOTAVAIL, ++ // EAFNOSUPPORT = libc::EAFNOSUPPORT, ++ EAGAIN = libc::EAGAIN, ++ // EALREADY = libc::EALREADY, ++ // EAUTH = libc::EAUTH, ++ EBADF = libc::EBADF, ++ // EBADMSG = libc::EBADMSG, ++ // EBADRPC = libc::EBADRPC, ++ // EBUSY = libc::EBUSY, ++ // ECANCELED = libc::ECANCELED, ++ // ECHILD = libc::ECHILD, ++ ECONNABORTED = libc::ECONNABORTED, ++ ECONNREFUSED = libc::ECONNREFUSED, ++ ECONNRESET = libc::ECONNRESET, ++ EDEADLK = libc::EDEADLK, ++ // EDESTADDRREQ = libc::EDESTADDRREQ, ++ // EDOM = libc::EDOM, ++ // EDQUOT = libc::EDQUOT, ++ EEXIST = libc::EEXIST, ++ // EFAULT = libc::EFAULT, ++ // EFBIG = libc::EFBIG, ++ // EFTYPE = libc::EFTYPE, ++ // EHOSTDOWN = libc::EHOSTDOWN, ++ // EHOSTUNREACH = libc::EHOSTUNREACH, ++ // EIDRM = libc::EIDRM, ++ // EILSEQ = libc::EILSEQ, ++ EINPROGRESS = libc::EINPROGRESS, ++ EINTR = libc::EINTR, ++ EINVAL = libc::EINVAL, ++ // EIO = libc::EIO, ++ // EISCONN = libc::EISCONN, ++ // EISDIR = libc::EISDIR, ++ // ELOOP = libc::ELOOP, ++ // EMFILE = libc::EMFILE, ++ // EMLINK = libc::EMLINK, ++ // EMSGSIZE = libc::EMSGSIZE, ++ // EMULTIHOP = libc::EMULTIHOP, ++ ENAMETOOLONG = libc::ENAMETOOLONG, ++ // ENEEDAUTH = libc::ENEEDAUTH, ++ // ENETDOWN = libc::ENETDOWN, ++ // ENETRESET = libc::ENETRESET, ++ // ENETUNREACH = libc::ENETUNREACH, ++ // ENFILE = libc::ENFILE, ++ // ENOATTR = libc::ENOATTR, ++ // ENOBUFS = libc::ENOBUFS, ++ // ENODATA = libc::ENODATA, ++ // ENODEV = libc::ENODEV, ++ ENOENT = libc::ENOENT, ++ // ENOEXEC = libc::ENOEXEC, ++ // ENOLCK = libc::ENOLCK, ++ // ENOLINK = libc::ENOLINK, ++ // ENOMEM = libc::ENOMEM, ++ // ENOMSG = libc::ENOMSG, ++ // ENOPROTOOPT = libc::ENOPROTOOPT, ++ // ENOSPC = libc::ENOSPC, ++ // ENOSR = libc::ENOSR, ++ // ENOSTR = libc::ENOSTR, ++ ENOSYS = libc::ENOSYS, ++ // ENOTBLK = libc::ENOTBLK, ++ ENOTCONN = libc::ENOTCONN, ++ // ENOTDIR = libc::ENOTDIR, ++ // ENOTEMPTY = libc::ENOTEMPTY, ++ // ENOTSOCK = libc::ENOTSOCK, ++ // ENOTSUP = libc::ENOTSUP, ++ ENOTTY = libc::ENOTTY, ++ // ENXIO = libc::ENXIO, ++ // EOPNOTSUPP = libc::EOPNOTSUPP, ++ // EOVERFLOW = libc::EOVERFLOW, ++ EPERM = libc::EPERM, ++ // EPFNOSUPPORT = libc::EPFNOSUPPORT, ++ EPIPE = libc::EPIPE, ++ // EPROCLIM = libc::EPROCLIM, ++ // EPROCUNAVAIL = libc::EPROCUNAVAIL, ++ // EPROGMISMATCH = libc::EPROGMISMATCH, ++ // EPROGUNAVAIL = libc::EPROGUNAVAIL, ++ EPROTO = libc::EPROTO, ++ // EPROTONOSUPPORT = libc::EPROTONOSUPPORT, ++ // EPROTOTYPE = libc::EPROTOTYPE, ++ ERANGE = libc::ERANGE, ++ // EREMOTE = libc::EREMOTE, ++ // EROFS = libc::EROFS, ++ // ERPCMISMATCH = libc::ERPCMISMATCH, ++ // ESHUTDOWN = libc::ESHUTDOWN, ++ // ESOCKTNOSUPPORT = libc::ESOCKTNOSUPPORT, ++ // ESPIPE = libc::ESPIPE, ++ // ESRCH = libc::ESRCH, ++ // ESTALE = libc::ESTALE, ++ // ETIME = libc::ETIME, ++ ETIMEDOUT = libc::ETIMEDOUT, ++ // ETOOMANYREFS = libc::ETOOMANYREFS, ++ // ETXTBSY = libc::ETXTBSY, ++ // EUSERS = libc::EUSERS, ++ // EXDEV = libc::EXDEV, ++ } ++ ++ // pub const ELAST: Errno = Errno::ENOTSUP; ++ pub const EWOULDBLOCK: Errno = Errno::EAGAIN; ++ ++ // pub const EL2NSYNC: Errno = Errno::UnknownErrno; ++ ++ pub fn from_i32(e: i32) -> Errno { ++ use self::Errno::*; ++ ++ match e { ++ // libc::E2BIG => E2BIG, ++ libc::EACCES => EACCES, ++ libc::EADDRINUSE => EADDRINUSE, ++ libc::EADDRNOTAVAIL => EADDRNOTAVAIL, ++ // libc::EAFNOSUPPORT => EAFNOSUPPORT, ++ libc::EAGAIN => EAGAIN, ++ // libc::EALREADY => EALREADY, ++ // libc::EAUTH => EAUTH, ++ libc::EBADF => EBADF, ++ // libc::EBADMSG => EBADMSG, ++ // libc::EBADRPC => EBADRPC, ++ // libc::EBUSY => EBUSY, ++ // libc::ECANCELED => ECANCELED, ++ // libc::ECHILD => ECHILD, ++ libc::ECONNABORTED => ECONNABORTED, ++ libc::ECONNREFUSED => ECONNREFUSED, ++ libc::ECONNRESET => ECONNRESET, ++ libc::EDEADLK => EDEADLK, ++ // libc::EDESTADDRREQ => EDESTADDRREQ, ++ // libc::EDOM => EDOM, ++ // libc::EDQUOT => EDQUOT, ++ libc::EEXIST => EEXIST, ++ // libc::EFAULT => EFAULT, ++ // libc::EFBIG => EFBIG, ++ // libc::EFTYPE => EFTYPE, ++ // libc::EHOSTDOWN => EHOSTDOWN, ++ // libc::EHOSTUNREACH => EHOSTUNREACH, ++ // libc::EIDRM => EIDRM, ++ // libc::EILSEQ => EILSEQ, ++ libc::EINPROGRESS => EINPROGRESS, ++ libc::EINTR => EINTR, ++ libc::EINVAL => EINVAL, ++ // libc::EIO => EIO, ++ // libc::EISCONN => EISCONN, ++ // libc::EISDIR => EISDIR, ++ // libc::ELOOP => ELOOP, ++ // libc::EMFILE => EMFILE, ++ // libc::EMLINK => EMLINK, ++ // libc::EMSGSIZE => EMSGSIZE, ++ // libc::EMULTIHOP => EMULTIHOP, ++ libc::ENAMETOOLONG => ENAMETOOLONG, ++ // libc::ENEEDAUTH => ENEEDAUTH, ++ // libc::ENETDOWN => ENETDOWN, ++ // libc::ENETRESET => ENETRESET, ++ // libc::ENETUNREACH => ENETUNREACH, ++ // libc::ENFILE => ENFILE, ++ // libc::ENOATTR => ENOATTR, ++ // libc::ENOBUFS => ENOBUFS, ++ // libc::ENODATA => ENODATA, ++ // libc::ENODEV => ENODEV, ++ libc::ENOENT => ENOENT, ++ // libc::ENOEXEC => ENOEXEC, ++ // libc::ENOLCK => ENOLCK, ++ // libc::ENOLINK => ENOLINK, ++ // libc::ENOMEM => ENOMEM, ++ // libc::ENOMSG => ENOMSG, ++ // libc::ENOPROTOOPT => ENOPROTOOPT, ++ // libc::ENOSPC => ENOSPC, ++ // libc::ENOSR => ENOSR, ++ // libc::ENOSTR => ENOSTR, ++ libc::ENOSYS => ENOSYS, ++ // libc::ENOTBLK => ENOTBLK, ++ libc::ENOTCONN => ENOTCONN, ++ // libc::ENOTDIR => ENOTDIR, ++ // libc::ENOTEMPTY => ENOTEMPTY, ++ // libc::ENOTSOCK => ENOTSOCK, ++ // libc::ENOTSUP => ENOTSUP, ++ // libc::ENOTTY => ENOTTY, ++ // libc::ENXIO => ENXIO, ++ // libc::EOPNOTSUPP => EOPNOTSUPP, ++ // libc::EOVERFLOW => EOVERFLOW, ++ libc::EPERM => EPERM, ++ // libc::EPFNOSUPPORT => EPFNOSUPPORT, ++ libc::EPIPE => EPIPE, ++ // libc::EPROCLIM => EPROCLIM, ++ // libc::EPROCUNAVAIL => EPROCUNAVAIL, ++ // libc::EPROGMISMATCH => EPROGMISMATCH, ++ // libc::EPROGUNAVAIL => EPROGUNAVAIL, ++ // libc::EPROTO => EPROTO, ++ // libc::EPROTONOSUPPORT => EPROTONOSUPPORT, ++ // libc::EPROTOTYPE => EPROTOTYPE, ++ libc::ERANGE => ERANGE, ++ // libc::EREMOTE => EREMOTE, ++ // libc::EROFS => EROFS, ++ // libc::ERPCMISMATCH => ERPCMISMATCH, ++ // libc::ESHUTDOWN => ESHUTDOWN, ++ // libc::ESOCKTNOSUPPORT => ESOCKTNOSUPPORT, ++ // libc::ESPIPE => ESPIPE, ++ // libc::ESRCH => ESRCH, ++ // libc::ESTALE => ESTALE, ++ // libc::ETIME => ETIME, ++ libc::ETIMEDOUT => ETIMEDOUT, ++ // libc::ETOOMANYREFS => ETOOMANYREFS, ++ // libc::ETXTBSY => ETXTBSY, ++ // libc::EUSERS => EUSERS, ++ // libc::EXDEV => EXDEV, ++ _ => UnknownErrno, ++ } ++ } ++} + + #[cfg(target_os = "dragonfly")] + mod consts { +diff --git a/src/lib.rs b/src/lib.rs +index 3b534a5..f7c8495 100644 +--- a/src/lib.rs ++++ b/src/lib.rs +@@ -5,12 +5,13 @@ + #![crate_name = "nix"] + #![cfg(unix)] + #![allow(non_camel_case_types)] ++#![allow(non_snake_case)] + // latest bitflags triggers a rustc bug with cross-crate macro expansions causing dead_code + // warnings even though the macro expands into something with allow(dead_code) + #![allow(dead_code)] + #![cfg_attr(test, deny(warnings))] + #![recursion_limit = "500"] +-#![deny(unused)] ++// #![deny(unused)] + #![deny(unstable_features)] + #![deny(missing_copy_implementations)] + #![deny(missing_debug_implementations)] +@@ -22,11 +23,13 @@ pub use libc; + #[macro_use] mod macros; + + // Public crates +-#[cfg(not(target_os = "redox"))] ++#[cfg(not(any(target_os = "redox", target_os = "aero")))] + pub mod dir; ++#[cfg(not(target_os = "aero"))] + pub mod env; + pub mod errno; + #[deny(missing_docs)] ++#[cfg(not(target_os = "aero"))] + pub mod features; + pub mod fcntl; + #[deny(missing_docs)] +@@ -54,15 +57,18 @@ pub mod mount; + target_os = "netbsd"))] + pub mod mqueue; + #[deny(missing_docs)] +-#[cfg(not(target_os = "redox"))] ++#[cfg(not(any(target_os = "redox", target_os = "aero")))] + pub mod net; + #[deny(missing_docs)] ++#[cfg(not(target_os = "aero"))] + pub mod poll; + #[deny(missing_docs)] + #[cfg(not(any(target_os = "redox", target_os = "fuchsia")))] + pub mod pty; ++#[cfg(not(target_os = "aero"))] + pub mod sched; + pub mod sys; ++#[cfg(not(target_os = "aero"))] + pub mod time; + // This can be implemented for other platforms as soon as libc + // provides bindings for them. +diff --git a/src/sys/mod.rs b/src/sys/mod.rs +index 43877a1..20dd8e5 100644 +--- a/src/sys/mod.rs ++++ b/src/sys/mod.rs +@@ -6,7 +6,7 @@ + target_os = "netbsd"))] + pub mod aio; + +-#[cfg(any(target_os = "android", target_os = "linux"))] ++#[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + pub mod epoll; + + #[cfg(any(target_os = "dragonfly", +@@ -42,6 +42,7 @@ pub mod mman; + #[cfg(target_os = "linux")] + pub mod personality; + ++#[cfg(not(target_os = "aero"))] + pub mod pthread; + + #[cfg(any(target_os = "android", +@@ -59,7 +60,8 @@ pub mod quota; + #[cfg(any(target_os = "linux"))] + pub mod reboot; + +-#[cfg(not(target_os = "redox"))] ++// #[cfg(not(target_os = "redox"))] ++#[cfg(not(any(target_os = "redox", target_os = "aero")))] + pub mod select; + + #[cfg(any(target_os = "android", +@@ -69,6 +71,7 @@ pub mod select; + target_os = "macos"))] + pub mod sendfile; + ++#[cfg(not(target_os = "aero"))] + pub mod signal; + + #[cfg(any(target_os = "android", target_os = "linux"))] +@@ -89,6 +92,7 @@ pub mod stat; + ))] + pub mod statfs; + ++#[cfg(not(target_os = "aero"))] + pub mod statvfs; + + #[cfg(any(target_os = "android", target_os = "linux"))] +@@ -100,8 +104,10 @@ pub mod time; + + pub mod uio; + ++#[cfg(not(target_os = "aero"))] + pub mod utsname; + ++#[cfg(not(target_os = "aero"))] + pub mod wait; + + #[cfg(any(target_os = "android", target_os = "linux"))] +diff --git a/src/sys/socket/addr.rs b/src/sys/socket/addr.rs +index d486056..b367e18 100644 +--- a/src/sys/socket/addr.rs ++++ b/src/sys/socket/addr.rs +@@ -17,6 +17,7 @@ use std::os::unix::io::RawFd; + use crate::sys::socket::addr::sys_control::SysControlAddr; + #[cfg(any(target_os = "android", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "ios", + target_os = "linux", +@@ -46,6 +47,7 @@ pub enum AddressFamily { + /// Low level packet interface (see [`packet(7)`](https://man7.org/linux/man-pages/man7/packet.7.html)) + #[cfg(any(target_os = "android", + target_os = "linux", ++ target_os = "aero", + target_os = "illumos", + target_os = "fuchsia", + target_os = "solaris"))] +@@ -245,7 +247,7 @@ impl AddressFamily { + libc::AF_NETLINK => Some(AddressFamily::Netlink), + #[cfg(any(target_os = "macos", target_os = "macos"))] + libc::AF_SYSTEM => Some(AddressFamily::System), +- #[cfg(any(target_os = "android", target_os = "linux"))] ++ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + libc::AF_PACKET => Some(AddressFamily::Packet), + #[cfg(any(target_os = "dragonfly", + target_os = "freebsd", +@@ -653,6 +655,7 @@ pub enum SockAddr { + /// Datalink address (MAC) + #[cfg(any(target_os = "android", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "ios", + target_os = "linux", +@@ -705,7 +708,7 @@ impl SockAddr { + SockAddr::Alg(..) => AddressFamily::Alg, + #[cfg(any(target_os = "ios", target_os = "macos"))] + SockAddr::SysControl(..) => AddressFamily::System, +- #[cfg(any(target_os = "android", target_os = "linux"))] ++ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + SockAddr::Link(..) => AddressFamily::Packet, + #[cfg(any(target_os = "dragonfly", + target_os = "freebsd", +@@ -738,7 +741,7 @@ impl SockAddr { + if addr.is_null() { + None + } else { +- match AddressFamily::from_i32(i32::from((*addr).sa_family)) { ++ match AddressFamily::from_i32((*addr).sa_family as i32) { + Some(AddressFamily::Unix) => None, + Some(AddressFamily::Inet) => Some(SockAddr::Inet( + InetAddr::V4(*(addr as *const libc::sockaddr_in)))), +@@ -750,7 +753,7 @@ impl SockAddr { + #[cfg(any(target_os = "ios", target_os = "macos"))] + Some(AddressFamily::System) => Some(SockAddr::SysControl( + SysControlAddr(*(addr as *const libc::sockaddr_ctl)))), +- #[cfg(any(target_os = "android", target_os = "linux"))] ++ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + Some(AddressFamily::Packet) => Some(SockAddr::Link( + LinkAddr(*(addr as *const libc::sockaddr_ll)))), + #[cfg(any(target_os = "dragonfly", +@@ -833,7 +836,7 @@ impl SockAddr { + mem::size_of_val(sa) as libc::socklen_t + + ), +- #[cfg(any(target_os = "android", target_os = "linux"))] ++ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + SockAddr::Link(LinkAddr(ref addr)) => ( + // This cast is always allowed in C + unsafe { +@@ -879,6 +882,7 @@ impl fmt::Display for SockAddr { + #[cfg(any(target_os = "ios", target_os = "macos"))] + SockAddr::SysControl(ref sc) => sc.fmt(f), + #[cfg(any(target_os = "android", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "ios", +@@ -1064,7 +1068,7 @@ pub mod sys_control { + } + + +-#[cfg(any(target_os = "android", target_os = "linux", target_os = "fuchsia"))] ++#[cfg(any(target_os = "android", target_os = "linux", target_os = "aero", target_os = "fuchsia"))] + mod datalink { + use super::{fmt, AddressFamily}; + +diff --git a/src/sys/socket/mod.rs b/src/sys/socket/mod.rs +index da5573c..3bac136 100644 +--- a/src/sys/socket/mod.rs ++++ b/src/sys/socket/mod.rs +@@ -251,6 +251,7 @@ libc_bitflags!{ + /// + /// Only used in [`recvmsg`](fn.recvmsg.html) function. + #[cfg(any(target_os = "android", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "linux", +@@ -866,13 +867,13 @@ impl<'a> ControlMessage<'a> { + + /// The value of CMSG_LEN on this message. + /// Safe because CMSG_LEN is always safe +- #[cfg(any(target_os = "android", ++ #[cfg(any(target_os = "android", target_os = "aero", + all(target_os = "linux", not(target_env = "musl"))))] + fn cmsg_len(&self) -> usize { + unsafe{CMSG_LEN(self.len() as libc::c_uint) as usize} + } + +- #[cfg(not(any(target_os = "android", ++ #[cfg(not(any(target_os = "android", target_os = "aero", + all(target_os = "linux", not(target_env = "musl")))))] + fn cmsg_len(&self) -> libc::c_uint { + unsafe{CMSG_LEN(self.len() as libc::c_uint)} +diff --git a/src/sys/termios.rs b/src/sys/termios.rs +index 36a3601..c7bddc3 100644 +--- a/src/sys/termios.rs ++++ b/src/sys/termios.rs +@@ -467,10 +467,19 @@ impl From for u32 { + } + + // TODO: Add TCSASOFT, which will require treating this as a bitfield. ++#[cfg(target_os = "aero")] + libc_enum! { + /// Specify when a port configuration change should occur. + /// + /// Used as an argument to `tcsetattr()` ++ #[repr(i32)] ++ pub enum SetArg { ++ TCSANOW, ++ } ++} ++ ++#[cfg(not(target_os = "aero"))] ++libc_enum! { + #[repr(i32)] + pub enum SetArg { + /// The change will occur immediately +@@ -482,10 +491,19 @@ libc_enum! { + } + } + ++#[cfg(target_os = "aero")] + libc_enum! { + /// Specify a combination of the input and output buffers to flush + /// + /// Used as an argument to `tcflush()`. ++ #[repr(i32)] ++ pub enum FlushArg { ++ TCIFLUSH, ++ } ++} ++ ++#[cfg(not(target_os = "aero"))] ++libc_enum! { + #[repr(i32)] + pub enum FlushArg { + /// Flush data that was received but not read +@@ -515,8 +533,17 @@ libc_enum! { + } + + // TODO: Make this usable directly as a slice index. ++#[cfg(target_os = "aero")] + libc_enum! { + /// Indices into the `termios.c_cc` array for special characters. ++ #[repr(usize)] ++ pub enum SpecialCharacterIndices { ++ VEOF, ++ } ++} ++ ++#[cfg(not(target_os = "aero"))] ++libc_enum! { + #[repr(usize)] + pub enum SpecialCharacterIndices { + VDISCARD, +@@ -601,13 +628,22 @@ libc_bitflags! { + IXOFF; + #[cfg(not(target_os = "redox"))] + IXANY; +- #[cfg(not(target_os = "redox"))] ++ #[cfg(not(any(target_os = "redox", target_os = "aero")))] + IMAXBEL; + #[cfg(any(target_os = "android", target_os = "linux", target_os = "macos"))] + IUTF8; + } + } + ++#[cfg(target_os = "aero")] ++libc_bitflags! { ++ /// Flags for configuring the output mode of a terminal ++ pub struct OutputFlags: tcflag_t { ++ OPOST; ++ } ++} ++ ++#[cfg(not(target_os = "aero"))] + libc_bitflags! { + /// Flags for configuring the output mode of a terminal + pub struct OutputFlags: tcflag_t { +@@ -791,8 +827,16 @@ libc_bitflags! { + } + } + ++#[cfg(target_os = "aero")] + libc_bitflags! { + /// Flags for setting the control mode of a terminal ++ pub struct ControlFlags: tcflag_t { ++ CS5; ++ } ++} ++ ++#[cfg(not(target_os = "aero"))] ++lib_bitflags! { + pub struct ControlFlags: tcflag_t { + #[cfg(any(target_os = "dragonfly", + target_os = "freebsd", +@@ -859,8 +903,16 @@ libc_bitflags! { + } + } + ++#[cfg(target_os = "aero")] + libc_bitflags! { + /// Flags for setting any local modes ++ pub struct LocalFlags: tcflag_t { ++ ECHO; ++ } ++} ++ ++#[cfg(not(target_os = "aero"))] ++libc_bitflags! { + pub struct LocalFlags: tcflag_t { + #[cfg(not(target_os = "redox"))] + ECHOKE; +diff --git a/src/unistd.rs b/src/unistd.rs +index d94cb99..8e26266 100644 +--- a/src/unistd.rs ++++ b/src/unistd.rs +@@ -1081,6 +1081,7 @@ pub fn pipe() -> std::result::Result<(RawFd, RawFd), Error> { + /// See also [pipe(2)](https://man7.org/linux/man-pages/man2/pipe.2.html) + #[cfg(any(target_os = "android", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "emscripten", + target_os = "freebsd", + target_os = "illumos", +@@ -1478,6 +1479,7 @@ pub fn getgroups() -> Result> { + pub fn setgroups(groups: &[Gid]) -> Result<()> { + cfg_if! { + if #[cfg(any(target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "illumos", + target_os = "ios", +@@ -1799,6 +1801,14 @@ pub fn mkstemp(template: &P) -> Result<(RawFd, PathBuf)> { + /// - [pathconf(2)](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pathconf.html) + /// - [limits.h](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html) + /// - [unistd.h](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html) ++#[cfg(target_os = "aero")] ++#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] ++#[repr(i32)] ++pub enum PathconfVar { ++ NAME_MAX = libc::_PC_NAME_MAX, ++} ++ ++#[cfg(not(target_os = "aero"))] + #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] + #[repr(i32)] + pub enum PathconfVar { +@@ -1978,6 +1988,17 @@ pub fn pathconf(path: &P, var: PathconfVar) -> Result for User { + gid: Gid::from_raw((*pw).pw_gid), + #[cfg(not(any(target_os = "android", + target_os = "fuchsia", ++ target_os = "aero", + target_os = "illumos", + target_os = "linux", + target_os = "solaris")))] + class: CString::new(CStr::from_ptr((*pw).pw_class).to_bytes()).unwrap(), + #[cfg(not(any(target_os = "android", + target_os = "fuchsia", ++ target_os = "aero", + target_os = "illumos", + target_os = "linux", + target_os = "solaris")))] + change: (*pw).pw_change, + #[cfg(not(any(target_os = "android", + target_os = "fuchsia", ++ target_os = "aero", + target_os = "illumos", + target_os = "linux", + target_os = "solaris")))] +-- +2.38.1 + diff --git a/patches/rust-shared-library/rust-shared-library.patch b/patches/rust-shared-library/rust-shared-library.patch new file mode 100644 index 00000000000..ed2c8cf25a0 --- /dev/null +++ b/patches/rust-shared-library/rust-shared-library.patch @@ -0,0 +1,45 @@ +From ccb5e182dc9d035f5ea8316643a5e7e4e966f2d5 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 20 Nov 2022 13:23:56 +1100 +Subject: [PATCH] + +--- + Cargo.toml | 2 +- + src/dynamic_library.rs | 2 ++ + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/Cargo.toml b/Cargo.toml +index e32011c..be74698 100644 +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -1,6 +1,6 @@ + [package] + name = "shared_library" +-version = "0.1.8" ++version = "0.1.9" + authors = ["Pierre Krieger "] + description = "Easily bind to and load shared libraries" + license = "Apache-2.0/MIT" +diff --git a/src/dynamic_library.rs b/src/dynamic_library.rs +index 753b632..d1398bb 100644 +--- a/src/dynamic_library.rs ++++ b/src/dynamic_library.rs +@@ -192,6 +192,7 @@ mod test { + #[test] + #[cfg(any(target_os = "linux", + target_os = "macos", ++ target_os = "aero", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "netbsd", +@@ -213,6 +214,7 @@ mod test { + //TODO: use `unix` shortcut? + #[cfg(any(target_os = "linux", + target_os = "android", ++ target_os = "aero", + target_os = "macos", + target_os = "ios", + target_os = "fuchsia", +-- +2.38.1 + From ce5961db75e37f0e4222076c5a53d49b1cc35ea4 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 29 Nov 2022 16:37:42 +1100 Subject: [PATCH 055/368] bootstrap: mesa Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 71 +++++++--- bootstrap/xorg.yml | 82 ++++++++++++ patches/mesa/mesa.patch | 205 +++++++++++++++++++++++++++++ userland/CMakeToolchain-x86_64.txt | 16 +++ userland/aero.cmake | 1 + userland/cross-llvm-config | 153 +++++++++++++++++++++ 6 files changed, 509 insertions(+), 19 deletions(-) create mode 100644 patches/mesa/mesa.patch create mode 100644 userland/CMakeToolchain-x86_64.txt create mode 100644 userland/aero.cmake create mode 100644 userland/cross-llvm-config diff --git a/bootstrap.yml b/bootstrap.yml index f6d84948dc4..ce3bb840a41 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -225,6 +225,23 @@ sources: NOCONFIGURE: 'yes' tools: + - name: host-cmake + source: + subdir: 'bundled' + git: 'https://gitlab.kitware.com/cmake/cmake.git' + tag: 'v3.24.2' + version: '3.24.2' + configure: + - args: + - '@THIS_SOURCE_DIR@/bootstrap' + - '--prefix=@PREFIX@' + - '--parallel=@PARALLELISM@' + compile: + - args: ['make', '-j@PARALLELISM@'] + install: + - args: ['make', 'install'] + - args: ['ln', '-sf', '@SOURCE_ROOT@/userland/aero.cmake', '@PREFIX@/share/cmake-3.24/Modules/Platform/'] + # We could run an external pkg-config; however, we need the aclocal files. # The easiest way to ensure that they are available is to just install pkg-config. - name: host-pkg-config @@ -671,25 +688,41 @@ packages: # - '@THIS_COLLECT_DIR@/usr' # - '-j@PARALLELISM@' - - name: socket_test - source: - subdir: bundled - git: 'https://github.com/streaksu/socket_test' - branch: 'main' - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - build: - - args: ['make', '-j@PARALLELISM@'] - environ: - CC: "x86_64-aero-gcc" - - args: ['make', 'install'] - environ: - PREFIX: '/usr' - DESTDIR: '@THIS_COLLECT_DIR@' + # - name: llvm + # from_source: llvm + # tools_required: + # - host-gcc + # - host-cmake + # pkgs_required: + # - mlibc + # - zlib + # revision: 3 + # configure: + # - args: + # - 'cmake' + # - '-GNinja' + # - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.txt' + # - '-DCMAKE_INSTALL_PREFIX=/usr' + # # We really have to build LLVM in Release mode. + # # Building it in debug mode produces tens of GiB of debugging info. + # - '-DCMAKE_BUILD_TYPE=Release' + # - '-DLLVM_LINK_LLVM_DYLIB=ON' + # # RTTI affects the ABI. Hence, we enable it. + # - '-DLLVM_ENABLE_RTTI=ON' + # - '-DLLVM_TARGETS_TO_BUILD=X86' + # - '-DLLVM_TARGET_ARCH=X86_64' + # - '-DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-aero' + # - '-DLLVM_HOST_TRIPLE=x86_64-aero' + # # Disable linking against ncurses, which we do not build with -fPIC. + # - '-DLLVM_ENABLE_TERMINFO=OFF' + # # Suppress developer warnings + # - '-Wno-dev' + # - '@THIS_SOURCE_DIR@/llvm' + # build: + # - args: ['ninja'] + # - args: ['ninja', 'install'] + # environ: + # DESTDIR: '@THIS_COLLECT_DIR@' - name: mlibc-headers from_source: mlibc diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index 3ef44e286c8..b5704fd59ae 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -431,6 +431,56 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: mesa + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/mesa/mesa.git' + tag: 'mesa-21.3.5' + version: '21.3.5' + tools_required: + - host-pkg-config + tools_required: + - host-pkg-config + - host-gcc + - wayland-scanner + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + - virtual: pkgconfig-for-host + program_name: host-pkg-config + pkgs_required: + - mlibc + - libdrm + - zlib + - libxrandr + - libxfixes + - libx11 + - libxext + - libxcb + configure: + - args: + - 'meson' + - '--native-file' + - '@SOURCE_ROOT@/userland/native-file.ini' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '--libdir=lib' + # The debug build type enables some additional output from Mesa. + - '--buildtype=debugoptimized' + #- '--buildtype=debug' + - '-Dglx=gallium-xlib' + - '-Dplatforms=x11' + # The Gallium swrast driver seems to be preferred over dri-swrast. + - '-Ddri-drivers=' + - '-Dgallium-drivers=swrast' + - '-Dvulkan-drivers=' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + # `libxkbfile` is used by the X servers and utilities to parse the XKB # configuration data files. - name: libxkbfile @@ -628,6 +678,37 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: libepoxy + source: + subdir: 'bundled' + git: 'https://github.com/anholt/libepoxy.git' + tag: '1.5.10' + version: '1.5.10' + tools_required: + - host-pkg-config + - host-gcc + - virtual: pkgconfig-for-target + triple: "@OPTION:x86_64-aero" + pkgs_required: + - mlibc + - mesa + - xorg-proto + - libx11 + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '-Degl=no' + - '-Dtests=false' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + # The X server accepts requests from client applications to create windows, # which are (normally rectangular) "virtual screens" that the client program # can draw into. @@ -657,6 +738,7 @@ packages: - xorg-util-macros - xorg-proto - openssl + - libepoxy - libxkbfile - libxfont2 - pixman diff --git a/patches/mesa/mesa.patch b/patches/mesa/mesa.patch new file mode 100644 index 00000000000..9beaf9e372b --- /dev/null +++ b/patches/mesa/mesa.patch @@ -0,0 +1,205 @@ +From caa8eb2b0dbe4a49aecb691e3568fb0dc6d1a8e2 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 20 Nov 2022 17:10:35 +1100 +Subject: [PATCH] + +--- + include/drm-uapi/drm.h | 5 +++-- + meson.build | 2 +- + src/compiler/spirv/spirv_to_nir.c | 1 + + src/egl/main/egllog.c | 1 + + src/gallium/drivers/llvmpipe/lp_texture.c | 1 - + src/util/debug.c | 1 + + src/util/detect_os.h | 8 ++++++++ + src/util/os_misc.c | 4 ++-- + src/util/os_time.c | 4 ++-- + src/util/u_printf.h | 2 ++ + src/util/u_thread.h | 4 ++-- + 11 files changed, 23 insertions(+), 10 deletions(-) + +diff --git a/include/drm-uapi/drm.h b/include/drm-uapi/drm.h +index 5e54c3a..be0e26d 100644 +--- a/include/drm-uapi/drm.h ++++ b/include/drm-uapi/drm.h +@@ -35,10 +35,11 @@ + #ifndef _DRM_H_ + #define _DRM_H_ + +-#if defined(__linux__) ++#if defined(__linux__) || defined(__aero__) + ++#include + #include +-#include ++//#include + typedef unsigned int drm_handle_t; + + #else /* One of the BSDs */ +diff --git a/meson.build b/meson.build +index 0aea312..6624be3 100644 +--- a/meson.build ++++ b/meson.build +@@ -164,7 +164,7 @@ with_any_opengl = with_opengl or with_gles1 or with_gles2 + # Only build shared_glapi if at least one OpenGL API is enabled + with_shared_glapi = with_shared_glapi and with_any_opengl + +-system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'gnu/kfreebsd', 'dragonfly', 'linux', 'sunos'].contains(host_machine.system()) ++system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'gnu/kfreebsd', 'dragonfly', 'linux', 'aero', 'sunos'].contains(host_machine.system()) + + dri_drivers = get_option('dri-drivers') + if dri_drivers.contains('auto') +diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c +index 71cdc83..3d26705 100644 +--- a/src/compiler/spirv/spirv_to_nir.c ++++ b/src/compiler/spirv/spirv_to_nir.c +@@ -37,6 +37,7 @@ + #include "util/u_string.h" + + #include ++#include + + #ifndef NDEBUG + static enum nir_spirv_debug_level +diff --git a/src/egl/main/egllog.c b/src/egl/main/egllog.c +index 984dd5b..6a91952 100644 +--- a/src/egl/main/egllog.c ++++ b/src/egl/main/egllog.c +@@ -39,6 +39,7 @@ + #include + #include + #include ++#include + #include "c11/threads.h" + #include "util/macros.h" + #include "util/u_string.h" +diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c +index 5bfc8db..d2b31e1 100644 +--- a/src/gallium/drivers/llvmpipe/lp_texture.c ++++ b/src/gallium/drivers/llvmpipe/lp_texture.c +@@ -1102,7 +1102,6 @@ llvmpipe_resource_get_param(struct pipe_screen *screen, + default: + break; + } +- assert(0); + *value = 0; + return false; + } +diff --git a/src/util/debug.c b/src/util/debug.c +index 89ae613..fbf45f4 100644 +--- a/src/util/debug.c ++++ b/src/util/debug.c +@@ -23,6 +23,7 @@ + + #include + #include ++#include + #include "debug.h" + #include "u_string.h" + +diff --git a/src/util/detect_os.h b/src/util/detect_os.h +index 6506948..f5d49de 100644 +--- a/src/util/detect_os.h ++++ b/src/util/detect_os.h +@@ -81,6 +81,11 @@ + #define DETECT_OS_UNIX 1 + #endif + ++#if defined(__aero__) ++#define DETECT_OS_aero 1 ++#define DETECT_OS_UNIX 1 ++#endif ++ + + /* + * Make sure DETECT_OS_* are always defined, so that they can be used with #if +@@ -127,5 +132,8 @@ + #ifndef DETECT_OS_WINDOWS + #define DETECT_OS_WINDOWS 0 + #endif ++#ifndef DETECT_OS_aero ++#define DETECT_OS_aero 0 ++#endif + + #endif /* DETECT_OS_H */ +diff --git a/src/util/os_misc.c b/src/util/os_misc.c +index 31f1c55..cd3e2c7 100644 +--- a/src/util/os_misc.c ++++ b/src/util/os_misc.c +@@ -57,7 +57,7 @@ + # include + # include + # include +-#elif DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD ++#elif DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD || DETECT_OS_aero + # include + #elif DETECT_OS_OPENBSD || DETECT_OS_FREEBSD + # include +@@ -223,7 +223,7 @@ os_get_option(const char *name) + bool + os_get_total_physical_memory(uint64_t *size) + { +-#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD ++#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD || DETECT_OS_aero + const long phys_pages = sysconf(_SC_PHYS_PAGES); + const long page_size = sysconf(_SC_PAGE_SIZE); + +diff --git a/src/util/os_time.c b/src/util/os_time.c +index d2edd88..47de02d 100644 +--- a/src/util/os_time.c ++++ b/src/util/os_time.c +@@ -53,7 +53,7 @@ + int64_t + os_time_get_nano(void) + { +-#if DETECT_OS_LINUX || DETECT_OS_BSD ++#if DETECT_OS_LINUX || DETECT_OS_BSD || DETECT_OS_aero + + struct timespec tv; + clock_gettime(CLOCK_MONOTONIC, &tv); +@@ -92,7 +92,7 @@ os_time_get_nano(void) + void + os_time_sleep(int64_t usecs) + { +-#if DETECT_OS_LINUX ++#if DETECT_OS_LINUX || DETECT_OS_aero + struct timespec time; + time.tv_sec = usecs / 1000000; + time.tv_nsec = (usecs % 1000000) * 1000; +diff --git a/src/util/u_printf.h b/src/util/u_printf.h +index 44dcce5..e9e23ba 100644 +--- a/src/util/u_printf.h ++++ b/src/util/u_printf.h +@@ -22,6 +22,8 @@ + #ifndef U_PRINTF_H + #define U_PRINTF_H + ++#include ++ + #ifdef __cplusplus + + #include +diff --git a/src/util/u_thread.h b/src/util/u_thread.h +index 013e8be..a30eada 100644 +--- a/src/util/u_thread.h ++++ b/src/util/u_thread.h +@@ -129,7 +129,7 @@ static inline thrd_t u_thread_create(int (*routine)(void *), void *param) + static inline void u_thread_setname( const char *name ) + { + #if defined(HAVE_PTHREAD) +-#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS ++#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_aero + int ret = pthread_setname_np(pthread_self(), name); + if (ret == ERANGE) { + char buf[16]; +@@ -242,7 +242,7 @@ util_set_current_thread_affinity(const uint32_t *mask, + static inline int64_t + util_thread_get_time_nano(thrd_t thread) + { +-#if defined(HAVE_PTHREAD) && !defined(__APPLE__) && !defined(__HAIKU__) ++#if defined(HAVE_PTHREAD) && !defined(__APPLE__) && !defined(__HAIKU__) && !defined(__aero__) + struct timespec ts; + clockid_t cid; + +-- +2.38.1 + diff --git a/userland/CMakeToolchain-x86_64.txt b/userland/CMakeToolchain-x86_64.txt new file mode 100644 index 00000000000..37b45861653 --- /dev/null +++ b/userland/CMakeToolchain-x86_64.txt @@ -0,0 +1,16 @@ +set(CMAKE_SYSTEM_NAME aero) + +set(CMAKE_FIND_ROOT_PATH $ENV{XBSTRAP_SYSROOT_DIR}) + +set(CMAKE_C_COMPILER x86_64-aero-gcc) +set(CMAKE_CXX_COMPILER x86_64-aero-g++) + +# search for programs in the build host directories +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# for libraries and headers in the target directories +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +# flags for shared libraries +set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,") +set(CMAKE_PLATFORM_USES_PATH_WHEN_NO_SONAME 1) diff --git a/userland/aero.cmake b/userland/aero.cmake new file mode 100644 index 00000000000..4f11498b9d8 --- /dev/null +++ b/userland/aero.cmake @@ -0,0 +1 @@ +include(Platform/UnixPaths) \ No newline at end of file diff --git a/userland/cross-llvm-config b/userland/cross-llvm-config new file mode 100644 index 00000000000..e238874164b --- /dev/null +++ b/userland/cross-llvm-config @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 + +import argparse +import os +import sys + +our_version = 14 + + +def do_version(): + return "{}.0.1".format(our_version) + + +def do_components(): + return " ".join( + [ + "all", + "all-targets", + "analysis", + "asmparser", + "asmprinter", + "binaryformat", + "bitreader", + "bitwriter", + "codegen", + "core", + "coroutines", + "coverage", + "debuginfocodeview", + "debuginfodwarf", + "debuginfomsf", + "debuginfopdb", + "demangle", + "dlltooldriver", + "engine", + "executionengine", + "fuzzmutate", + "globalisel", + "gtest", + "gtest_main", + "instcombine", + "instrumentation", + "interpreter", + "ipo", + "irreader", + "libdriver", + "lineeditor", + "linker", + "lto", + "mc", + "mcdisassembler", + "mcjit", + "mcparser", + "mirparser", + "native", + "nativecodegen", + "objcarcopts", + "object", + "objectyaml", + "option", + "orcjit", + "passes", + "profiledata", + "runtimedyld", + "scalaropts", + "selectiondag", + "support", + "symbolize", + "tablegen", + "target", + "testingsupport", + "transformutils", + "vectorize", + "windowsmanifest", + "x86", + "x86asmparser", + "x86asmprinter", + "x86codegen", + "x86desc", + "x86disassembler", + "x86info", + "x86utils", + ] + ) + + +def do_targets_built(): + return "X86" + + +def get_includedir(): + sysroot = os.environ["XBSTRAP_SYSROOT_DIR"] + return sysroot + "/usr/include" + + +def get_libdir(): + sysroot = os.environ["XBSTRAP_SYSROOT_DIR"] + return sysroot + "/usr/lib" + + +def do_has_rtti(): + return "YES" + + +def do_shared_mode(): + return "shared" + + +def do_libs(): + return "-lLLVM-{}".format(our_version) + + +def do_system_libs(): + return "-lLLVM-{}".format(our_version) + + +def do_cppflags(): + return "" + + +def do_cxxflags(): + return "" + + +def do_ldflags(): + return "-L" + get_libdir() + + +parser = argparse.ArgumentParser() +parser.add_argument("--version", action="append_const", dest="command", const=do_version) +parser.add_argument( + "--targets-built", action="append_const", dest="command", const=do_targets_built +) +parser.add_argument("--components", action="append_const", dest="command", const=do_components) +parser.add_argument("--includedir", action="append_const", dest="command", const=get_includedir) +parser.add_argument("--libdir", action="append_const", dest="command", const=get_libdir) +parser.add_argument("--has-rtti", action="append_const", dest="command", const=do_has_rtti) +parser.add_argument("--shared-mode", action="append_const", dest="command", const=do_shared_mode) +parser.add_argument("--link-shared", action="store_const", dest="link", const="shared") +parser.add_argument("--cppflags", action="append_const", dest="command", const=do_cppflags) +parser.add_argument("--cxxflags", action="append_const", dest="command", const=do_cxxflags) +parser.add_argument("--ldflags", action="append_const", dest="command", const=do_ldflags) +parser.add_argument("--libs", action="append_const", dest="command", const=do_libs) +parser.add_argument("--system-libs", action="append_const", dest="command", const=do_system_libs) +parser.add_argument("components", type=str, nargs="*") + +print("cross-llvm-config:", sys.argv, file=sys.stderr) + +args = parser.parse_args() +for command in args.command: + result = command() + print("cross-llvm-config yields:", result, file=sys.stderr) + print(result) From 3d33a7fafc596ef7e715ffa35ab24fd4231046f3 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 29 Nov 2022 16:38:11 +1100 Subject: [PATCH 056/368] ext2: fix invalid doubly indirect block ptr Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/mod.rs | 68 +++++++++++++++++++----------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 7825e90c50a..83353df002c 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -205,32 +205,38 @@ impl INode { let entries_per_block = superblock.entries_per_block(); let block_size = superblock.block_size(); - if block <= entries_per_block { - // singly indirect block - let block_ptrs = self.inode.read().data_ptr[12] as usize * block_size; - let offset = block_ptrs + (block * core::mem::size_of::()); - - let mut res = MaybeUninit::::uninit(); - fs.block.read(offset, res.as_bytes_mut()); - - // SAFETY: We have initialized the variable above. - return Some(unsafe { res.assume_init() }); - } - - block -= entries_per_block; - - if block <= entries_per_block { + if block >= entries_per_block { // doubly indirect block - let block_ptrs = self.inode.read().data_ptr[13] as usize * block_size; - let offset = block_ptrs + ((block / entries_per_block) * core::mem::size_of::()); + block -= entries_per_block; + let index = block / entries_per_block; let mut indirect_block = MaybeUninit::::uninit(); - fs.block.read(offset, indirect_block.as_bytes_mut()); + + if index >= entries_per_block { + // treply indirect block + todo!() + } else { + let block_ptrs = self.inode.read().data_ptr[13] as usize * block_size; + let offset = block_ptrs + (index * core::mem::size_of::()); + + fs.block + .read(offset, indirect_block.as_bytes_mut()) + .unwrap(); + } // SAFETY: We have initialized the variable above. let indirect_block = unsafe { indirect_block.assume_init() } as usize * block_size; + let offset = indirect_block + (block % entries_per_block) * core::mem::size_of::(); - let offset = indirect_block + entries_per_block * core::mem::size_of::(); + let mut res = MaybeUninit::::uninit(); + fs.block.read(offset, res.as_bytes_mut()); + + // SAFETY: We have initialized the variable above. + return Some(unsafe { res.assume_init() }); + } else { + // singly indirect block + let block_ptrs = self.inode.read().data_ptr[12] as usize * block_size; + let offset = block_ptrs + (block * core::mem::size_of::()); let mut res = MaybeUninit::::uninit(); fs.block.read(offset, res.as_bytes_mut()); @@ -238,8 +244,6 @@ impl INode { // SAFETY: We have initialized the variable above. return Some(unsafe { res.assume_init() }); } - - todo!("triply indirect block") } pub fn make_inode( @@ -464,12 +468,20 @@ impl INodeInterface for INode { let path_len = inode.size_lower as usize; let data_bytes: &[u8] = bytemuck::cast_slice(&inode.data_ptr); - assert!(path_len <= data_bytes.len() - 1); + if path_len <= data_bytes.len() { + let path_bytes = &data_bytes[..path_len]; + let path = core::str::from_utf8(path_bytes).or(Err(FileSystemError::InvalidPath))?; + + return Ok(path.into()); + } else { + let mut buffer = Box::<[u8]>::new_uninit_slice(path_len); + self.read(0, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; - let path_bytes = &data_bytes[..path_len]; - let path = core::str::from_utf8(path_bytes).or(Err(FileSystemError::InvalidPath))?; + let path_bytes = unsafe { buffer.assume_init() }; + let path = core::str::from_utf8(&path_bytes).or(Err(FileSystemError::InvalidPath))?; - return Ok(path.into()); + return Ok(path.into()); + } } fn mmap(&self, offset: usize, size: usize, flags: MMapFlags) -> super::Result { @@ -608,6 +620,12 @@ impl Ext2 { return None; } + log::trace!( + "ext2: initialized (block_size={}, entries_per_block={})", + superblock.block_size(), + superblock.entries_per_block() + ); + assert_eq!( superblock.inode_size as usize, core::mem::size_of::() From e7faa514511d47006d96ca8bd1c77d744cd0108f Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 29 Nov 2022 16:39:25 +1100 Subject: [PATCH 057/368] eventfd: read and write Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/eventfd.rs | 35 +++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index 4de9ffcab22..a3ec913a247 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -24,7 +24,7 @@ use crate::utils::sync::{BlockQueue, Mutex}; pub struct EventFd { wq: BlockQueue, - count: Mutex, + count: Mutex, } impl EventFd { @@ -37,16 +37,33 @@ impl EventFd { } impl INodeInterface for EventFd { - fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> super::Result { - self.wq.notify_complete(); + fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> super::Result { + let size = core::mem::size_of::(); + assert!(buffer.len() == size); - unimplemented!() - } + // SAFETY: We have above verified that it is safe to dereference + // the value. + let value = unsafe { &mut *(buffer.as_mut_ptr() as *mut u64) }; + let mut count = self.wq.block_on(&self.count, |e| **e != 0)?; + + *value = *count; + *count = 0; // reset the counter - fn write_at(&self, _offset: usize, _buffer: &[u8]) -> super::Result { self.wq.notify_complete(); + Ok(size) + } - unimplemented!() + fn write_at(&self, _offset: usize, buffer: &[u8]) -> super::Result { + let size = core::mem::size_of::(); + assert!(buffer.len() == size); + + // SAFETY: We have above verified that it is safe to dereference + // the value. + let value = unsafe { *(buffer.as_ptr() as *const u64) }; + + *self.count.lock_irq() += value; + self.wq.notify_complete(); + Ok(size) } fn poll(&self, table: Option<&mut PollTable>) -> super::Result { @@ -59,11 +76,11 @@ impl INodeInterface for EventFd { events.insert(PollFlags::IN); } - if *count == usize::MAX { + if *count == u64::MAX { events.insert(PollFlags::ERR); } - if *count < (usize::MAX - 1) { + if *count < (u64::MAX - 1) { events.insert(PollFlags::OUT); // possible to write a value of at least "1" without blocking. } From 52f2a0786102c6b9f3c61a843b7661b4d73ba790 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 30 Nov 2022 17:21:44 +1100 Subject: [PATCH 058/368] fbdev: cmap stubs Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/devfs.rs | 16 ++++++++++++++++ src/aero_syscall/src/consts.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index 680265417bb..c39d1393449 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -383,6 +383,22 @@ impl INodeInterface for DevFb { Ok(0x00) } + // Device independent colormap information can be get and set using + // the `FBIOGETCMAP` and `FBIOPUTCMAP` ioctls. + FBIOPUTCMAP => { + let struc = VirtAddr::new(arg as _) + .read_mut::() + .ok_or(FileSystemError::NotSupported); + + log::debug!("fbdev: `FBIOPUTCMAP` is a stub! {struc:?}"); + Ok(0) + } + + FBIOGETCMAP => { + log::warn!("fbdev: `FBIOGETCMAP` is a stub!"); + Ok(0) + } + _ => { log::warn!("fbdev: ioctl unknown command: {command:#x}"); Err(FileSystemError::NotSupported) diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index f3c4516d8b4..f118bad86ec 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -214,6 +214,8 @@ bitflags::bitflags! { pub const FBIOGET_VSCREENINFO: usize = 0x4600; pub const FBIOPUT_VSCREENINFO: usize = 0x4601; pub const FBIOGET_FSCREENINFO: usize = 0x4602; +pub const FBIOGETCMAP: usize = 0x4604; +pub const FBIOPUTCMAP: usize = 0x4605; pub const FB_TYPE_PACKED_PIXELS: u32 = 0; pub const FB_TYPE_PLANES: u32 = 1; @@ -259,6 +261,31 @@ impl FramebufferBitField { } } +// device independent colour information: +#[derive(Debug)] +#[repr(C)] +pub struct FramebufferCmap { + pub start: u32, // first entry + pub len: u32, // number of entries + pub red: *mut u16, + pub green: *mut u16, + pub blue: *mut u16, + pub transp: *mut u16, // can be NULL +} + +impl Default for FramebufferCmap { + fn default() -> Self { + Self { + start: Default::default(), + len: Default::default(), + red: core::ptr::null_mut(), + green: core::ptr::null_mut(), + blue: core::ptr::null_mut(), + transp: core::ptr::null_mut(), + } + } +} + // framebuffer variable screen info: #[derive(Default, Debug, Clone)] #[repr(C)] From 93b3a08baadba5d1c11863d98994c1f3cb67971a Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 1 Dec 2022 18:04:03 +1100 Subject: [PATCH 059/368] fix build Signed-off-by: Andy-Python-Programmer --- aero.py | 12 ++- bootstrap.yml | 3 +- patches/rust-winit/rust-winit.patch | 122 ++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 patches/rust-winit/rust-winit.patch diff --git a/aero.py b/aero.py index 9ae6fcf85f1..015e203fb3a 100755 --- a/aero.py +++ b/aero.py @@ -306,15 +306,14 @@ def run_xbstrap(args): def build_userland(args): - # We need to check if we have host-cargo in-order for us to build + # We need to check if we have host-rust in-order for us to build # our rust userland applications in `userland/`. - host_cargo = os.path.join(SYSROOT_DIR, "tools/host-cargo") + host_cargo = os.path.join(SYSROOT_DIR, "tools/host-rust") if not os.path.exists(host_cargo): - log_error("host-cargo not built as a part of the sysroot, skipping compilation of `userland/`") + log_error("host-rust not built as a part of the sysroot, skipping compilation of `userland/`") return [] - HOST_CARGO = "host-cargo/bin/cargo" HOST_RUST = "host-rust/bin/rustc" HOST_GCC = "host-gcc/bin/x86_64-aero-gcc" HOST_BINUTILS = "host-binutils/x86_64-aero/bin" @@ -323,7 +322,6 @@ def build_userland(args): tool_dir = get_userland_tool() pkg_dir = get_userland_package() - def get_cargo(): return os.path.join('..', tool_dir, HOST_CARGO) def get_rustc(): return os.path.join('..', tool_dir, HOST_RUST) def get_gcc(): return os.path.join('..', tool_dir, HOST_GCC) def get_binutils(): return os.path.join("..", tool_dir, HOST_BINUTILS) @@ -348,9 +346,9 @@ def get_mlibc(): return os.path.join("..", pkg_dir, PACKAGE_MLIBC) command = 'check' if args.test: - return build_cargo_workspace('userland', 'build', ['--package', 'utest', *cmd_args], get_cargo()) + return build_cargo_workspace('userland', 'build', ['--package', 'utest', *cmd_args]) else: - return build_cargo_workspace('userland', command, cmd_args, get_cargo()) + return build_cargo_workspace('userland', command, cmd_args) # TODO: Userland check # elif args.check: diff --git a/bootstrap.yml b/bootstrap.yml index ce3bb840a41..d3c1707ce37 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -70,7 +70,7 @@ sources: subdir: 'bundled' git: 'https://github.com/rust-lang/rust.git' branch: 'master' - commit: 'ff0ffda6b3c3ea392c6cf88c676133666f491e5c' + commit: '22e491ac7ed454d34669151a8b6464cb643c9b41' - name: llvm subdir: 'bundled' @@ -533,6 +533,7 @@ packages: version: '0.10.1' tools_required: # - host-cargo + - host-rust - host-gcc sources_required: - rust-patched-libs diff --git a/patches/rust-winit/rust-winit.patch b/patches/rust-winit/rust-winit.patch new file mode 100644 index 00000000000..e5e449da31d --- /dev/null +++ b/patches/rust-winit/rust-winit.patch @@ -0,0 +1,122 @@ +From 4e0723a7be1155a72b64eda807712460079a923e Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Thu, 1 Dec 2022 17:51:20 +1100 +Subject: [PATCH] + +--- + Cargo.toml | 2 +- + src/platform/run_return.rs | 1 + + src/platform/unix.rs | 1 + + src/platform_impl/linux/mod.rs | 8 ++++++++ + src/platform_impl/linux/wayland/mod.rs | 1 + + src/platform_impl/linux/x11/mod.rs | 1 + + src/platform_impl/mod.rs | 2 ++ + 7 files changed, 15 insertions(+), 1 deletion(-) + +diff --git a/Cargo.toml b/Cargo.toml +index b1e4159..08309aa 100644 +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -84,7 +84,7 @@ features = [ + "timeapi" + ] + +-[target.'cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd"))'.dependencies] ++[target.'cfg(any(target_os = "linux", target_os = "aero", target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd"))'.dependencies] + wayland-client = { version = "0.29", default_features = false, features = ["use_system_lib"], optional = true } + wayland-protocols = { version = "0.29", features = [ "staging_protocols"], optional = true } + sctk = { package = "smithay-client-toolkit", version = "0.15.1", default_features = false, features = ["calloop"], optional = true } +diff --git a/src/platform/run_return.rs b/src/platform/run_return.rs +index 932d9e3..4983c4c 100644 +--- a/src/platform/run_return.rs ++++ b/src/platform/run_return.rs +@@ -1,5 +1,6 @@ + #![cfg(any( + target_os = "windows", ++ target_os = "aero", + target_os = "macos", + target_os = "android", + target_os = "linux", +diff --git a/src/platform/unix.rs b/src/platform/unix.rs +index ba600b1..cfa1f03 100644 +--- a/src/platform/unix.rs ++++ b/src/platform/unix.rs +@@ -1,5 +1,6 @@ + #![cfg(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +diff --git a/src/platform_impl/linux/mod.rs b/src/platform_impl/linux/mod.rs +index 953fca1..4f9dbb0 100644 +--- a/src/platform_impl/linux/mod.rs ++++ b/src/platform_impl/linux/mod.rs +@@ -1,6 +1,7 @@ + #![cfg(any( + target_os = "linux", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" +@@ -771,6 +772,13 @@ fn is_main_thread() -> bool { + unsafe { syscall(SYS_gettid) == getpid() as c_long } + } + ++#[cfg(any(target_os = "aero"))] ++fn is_main_thread() -> bool { ++ // This function is only used for assertions (to make sure that library consumers don't do ++ // anything wrong), but we don't currently implement gettid yet so just return true for now. ++ true ++} ++ + #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd"))] + fn is_main_thread() -> bool { + use libc::pthread_main_np; +diff --git a/src/platform_impl/linux/wayland/mod.rs b/src/platform_impl/linux/wayland/mod.rs +index 4ed564a..502545e 100644 +--- a/src/platform_impl/linux/wayland/mod.rs ++++ b/src/platform_impl/linux/wayland/mod.rs +@@ -1,6 +1,7 @@ + #![cfg(any( + target_os = "linux", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" +diff --git a/src/platform_impl/linux/x11/mod.rs b/src/platform_impl/linux/x11/mod.rs +index 27c92c4..7b3d7e3 100644 +--- a/src/platform_impl/linux/x11/mod.rs ++++ b/src/platform_impl/linux/x11/mod.rs +@@ -1,5 +1,6 @@ + #![cfg(any( + target_os = "linux", ++ target_os = "aero", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", +diff --git a/src/platform_impl/mod.rs b/src/platform_impl/mod.rs +index 152065d..a0d471b 100644 +--- a/src/platform_impl/mod.rs ++++ b/src/platform_impl/mod.rs +@@ -6,6 +6,7 @@ mod platform; + #[cfg(any( + target_os = "linux", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" +@@ -32,6 +33,7 @@ mod platform; + not(target_os = "macos"), + not(target_os = "android"), + not(target_os = "dragonfly"), ++ not(target_os = "aero"), + not(target_os = "freebsd"), + not(target_os = "netbsd"), + not(target_os = "openbsd"), +-- +2.38.1 + From 2172ff1a4c5dd2d7a713e48257052c3915cb6275 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 2 Dec 2022 15:35:19 +1100 Subject: [PATCH 060/368] bootstrap: startx Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 9 +- bootstrap/xorg.yml | 44 ++ extra-files/xorg/xinitrc | 2 + patches/mlibc/mlibc.patch | 71 ++- patches/util-linux/util-linux.patch | 630 +++++++++++++++++++++++++ src/aero_kernel/src/syscall/mod.rs | 1 + src/aero_kernel/src/syscall/process.rs | 15 +- src/aero_kernel/src/userland/task.rs | 64 ++- src/aero_syscall/src/consts.rs | 1 + src/aero_syscall/src/lib.rs | 11 + userland/apps/init/src/main.rs | 6 +- 11 files changed, 807 insertions(+), 47 deletions(-) create mode 100644 extra-files/xorg/xinitrc create mode 100644 patches/util-linux/util-linux.patch diff --git a/bootstrap.yml b/bootstrap.yml index d3c1707ce37..1264e025fbe 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -168,14 +168,6 @@ sources: # Rust patched crates end # --------------------------------------------------------------------------- - - name: host-bootstrap-cargo - subdir: 'bundled' - url: 'https://static.rust-lang.org/dist/2022-04-07/cargo-1.60.0-x86_64-unknown-linux-gnu.tar.xz' - format: 'tar.xz' - checksum: blake2b:d60239d5977bfcf1c6f2d973d9d27e93d6d138ae6e929deb016afde8cd8e0ff0bba8396f8fa62d5e738be7bde7b91e9aa406ec2440e1ab50451c5b9ad2d8fdfb - extract_path: 'cargo-1.60.0-x86_64-unknown-linux-gnu' - version: '0.60.0' - - name: python subdir: 'bundled' patch-path-strip: 1 @@ -868,6 +860,7 @@ packages: - '--host=x86_64-aero' - '--prefix=/usr' - 'CFLAGS=-DSLOW_BUT_NO_HACKS -Wno-error' + - '--enable-install-program=hostname' build: - args: ['make', '-j@PARALLELISM@'] - args: ['make', 'install'] diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index b5704fd59ae..f7c13f6c88d 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -709,6 +709,50 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: xorg-xinit + source: + subdir: 'bundled' + git: 'https://github.com/freedesktop/xorg-xinit' + tag: 'xinit-1.3.4' + version: '1.3.4' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + - host-xorg-font-util + - host-xtrans + regenerate: + - args: ['./autogen.sh'] + environ: + NOCONFIGURE: 'yes' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-gcc + - host-pkg-config + pkgs_required: + - mlibc + - xorg-util-macros + - xorg-proto + - xorg-server + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + - '--disable-static' + - '--without-xauth' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install-strip'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + - args: ['cp', '@SOURCE_ROOT@/extra-files/xorg/xinitrc', '@THIS_COLLECT_DIR@/etc/X11/xinit/xinitrc'] + # The X server accepts requests from client applications to create windows, # which are (normally rectangular) "virtual screens" that the client program # can draw into. diff --git a/extra-files/xorg/xinitrc b/extra-files/xorg/xinitrc new file mode 100644 index 00000000000..0514650ee13 --- /dev/null +++ b/extra-files/xorg/xinitrc @@ -0,0 +1,2 @@ +#!/bin/sh +exec dwm \ No newline at end of file diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index d6d7a635dd2..6448545a2ce 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,6 +1,6 @@ -From 8854e64e2fbfdbe7e15d35aa8814c173480784d6 Mon Sep 17 00:00:00 2001 +From 12c60e06a4b58e27d26763cb1bb9c6577c14add5 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 14:45:27 +1100 +Date: Thu, 1 Dec 2022 20:11:07 +1100 Subject: [PATCH] --- @@ -10,13 +10,13 @@ Subject: [PATCH] options/posix/generic/dlfcn-stubs.cpp | 1 + options/posix/generic/termios-stubs.cpp | 5 +- options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 38 ++++++------ + sysdeps/aero/generic/aero.cpp | 62 ++++++++++++-------- sysdeps/aero/generic/filesystem.cpp | 25 ++++++-- sysdeps/aero/generic/sockets.cpp | 77 ++++++++++++++++++++++++- sysdeps/aero/generic/time.cpp | 24 ++++++++ - sysdeps/aero/include/aero/syscall.h | 6 ++ + sysdeps/aero/include/aero/syscall.h | 7 +++ sysdeps/aero/meson.build | 1 + - 12 files changed, 157 insertions(+), 31 deletions(-) + 12 files changed, 176 insertions(+), 37 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -108,10 +108,27 @@ index 2e2d3f1..3ff5fef 100644 constexpr bool eagerBinding = true; diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 29fb961..a27da55 100644 +index 29fb961..cf0503b 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp -@@ -69,22 +69,22 @@ int sys_futex_tid() { +@@ -62,6 +62,16 @@ static frg::vector create_slice(char *const arg[]) { + } + + namespace mlibc { ++int sys_uname(struct utsname *buf) { ++ auto result = syscall(SYS_UNAME, buf); ++ ++ if (result < 0) { ++ return -result; ++ } ++ ++ return result; ++} ++ + int sys_futex_tid() { + // SAFETY: gettid does not return any errors (ie. the call is always + // successful). +@@ -69,22 +79,22 @@ int sys_futex_tid() { } int sys_futex_wait(int *pointer, int expected, const struct timespec *time) { @@ -146,7 +163,7 @@ index 29fb961..a27da55 100644 return 0; } -@@ -124,7 +124,9 @@ int sys_anon_free(void *pointer, size_t size) { +@@ -124,7 +134,9 @@ int sys_anon_free(void *pointer, size_t size) { } void sys_libc_panic() { @@ -157,7 +174,36 @@ index 29fb961..a27da55 100644 sys_exit(1); } -@@ -233,7 +235,7 @@ uid_t sys_geteuid() { +@@ -140,8 +152,15 @@ void sys_exit(int status) { + + pid_t sys_getpid() { + auto result = syscall(SYS_GETPID); ++ __ensure(result >= 0); ++ ++ return result; ++} ++ ++pid_t sys_getppid() { ++ auto result = syscall(SYS_GETPPID); ++ __ensure(result != 0); + +- __ensure(result >= 0); // getpid() cannot fail. + return result; + } + +@@ -162,11 +181,6 @@ pid_t sys_getpgid(pid_t pid, pid_t *pgid) { + return 0; + } + +-pid_t sys_getppid() { +- mlibc::infoLogger() << "sys_getppid() is unimplemented" << frg::endlog; +- return 0; +-} +- + int sys_clock_get(int clock, time_t *secs, long *nanos) { + struct timespec ts; + auto result = syscall(SYS_GETTIME, clock, &ts); +@@ -233,7 +247,7 @@ uid_t sys_geteuid() { return 0; } @@ -166,7 +212,7 @@ index 29fb961..a27da55 100644 int sys_seteuid(uid_t euid) UNIMPLEMENTED("sys_seteuid") gid_t sys_getgid() { -@@ -259,13 +261,13 @@ int sys_setegid(gid_t egid) { +@@ -259,13 +273,13 @@ int sys_setegid(gid_t egid) { void sys_yield() UNIMPLEMENTED("sys_yield") int sys_clone(void *tcb, pid_t *tid_out, void *stack) { @@ -356,10 +402,10 @@ index 0000000..460412d +} \ No newline at end of file diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 12f8dc6..03001c4 100644 +index 12f8dc6..4e330ef 100644 --- a/sysdeps/aero/include/aero/syscall.h +++ b/sysdeps/aero/include/aero/syscall.h -@@ -64,6 +64,12 @@ +@@ -64,6 +64,13 @@ #define SYS_FUTEX_WAIT 57 #define SYS_FUTEX_WAKE 58 #define SYS_LINK 59 @@ -369,6 +415,7 @@ index 12f8dc6..03001c4 100644 +#define SYS_SOCK_RECV 63 +#define SYS_SETITIMER 64 +#define SYS_GETITIMER 65 ++#define SYS_GETPPID 66 // Invalid syscall used to trigger a log error in the kernel (as a hint) // so, that we can implement the syscall in the kernel. diff --git a/patches/util-linux/util-linux.patch b/patches/util-linux/util-linux.patch new file mode 100644 index 00000000000..8ceda5782ed --- /dev/null +++ b/patches/util-linux/util-linux.patch @@ -0,0 +1,630 @@ +From c63f96131bad9edf92f3a6f6353b1d0eba2f712b Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Thu, 1 Dec 2022 20:24:57 +1100 +Subject: [PATCH] + +--- + configure.ac | 258 ++++++++++++++++++++++++++++------ + disk-utils/cfdisk.c | 1 + + include/namespace.h | 2 + + include/path.h | 2 + + lib/cpuset.c | 2 + + lib/path.c | 2 + + libblkid/src/topology/ioctl.c | 2 + + login-utils/logindefs.c | 2 +- + login-utils/lslogins.c | 2 +- + misc-utils/lsblk.h | 2 + + term-utils/agetty.c | 8 ++ + 11 files changed, 239 insertions(+), 44 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 2ac4c2b..a711717 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -212,6 +212,8 @@ bsd_os=no + AS_CASE([${host_os}], + [*linux*], + [linux_os=yes], ++ [*aero*], ++ [linux_os=yes], + [*darwin*], + [darwin_os=yes], + [*bsd*], +@@ -425,7 +427,10 @@ have_pty_h=$ac_cv_header_pty_h + + AS_CASE([$linux_os:$have_linux_version_h], + [yes:no], +- [AC_MSG_ERROR([kernel headers required on Linux])] ++ AS_CASE([${host_os}], ++ [*linux*], ++ [AC_MSG_ERROR([kernel headers required on Linux])] ++ ) + ) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +@@ -1523,20 +1528,37 @@ AS_IF([test "x$enable_hwclock_gplv3" = xyes ], [ + ]) + + +-UL_BUILD_INIT([mkfs], [yes]) ++AC_ARG_ENABLE([mkfs], ++ AS_HELP_STRING([--disable-mkfs], [do not build mkfs]), ++ [], [UL_DEFAULT_ENABLE([mkfs], [yes])] ++) ++UL_BUILD_INIT([mkfs]) + AM_CONDITIONAL([BUILD_MKFS], [test "x$build_mkfs" = xyes]) + ++AC_ARG_ENABLE([isosize], ++ AS_HELP_STRING([--disable-isosize], [do not build isosize]), ++ [], [UL_DEFAULT_ENABLE([isosize], [yes])] ++) ++UL_BUILD_INIT([isosize]) + UL_BUILD_INIT([isosize], [yes]) + AM_CONDITIONAL([BUILD_ISOSIZE], [test "x$build_isosize" = xyes]) + + +-UL_BUILD_INIT([fstrim], [check]) ++AC_ARG_ENABLE([fstrim], ++ AS_HELP_STRING([--disable-fstrim], [do not build fstrim]), ++ [], [UL_DEFAULT_ENABLE([fstrim], [check])] ++) ++UL_BUILD_INIT([fstrim]) + UL_REQUIRES_LINUX([fstrim]) + UL_REQUIRES_BUILD([fstrim], [libmount]) + AM_CONDITIONAL([BUILD_FSTRIM], [test "x$build_fstrim" = xyes]) + + +-UL_BUILD_INIT([swapon], [check]) ++AC_ARG_ENABLE([swapon], ++ AS_HELP_STRING([--disable-swapon], [do not build swapon, swapoff]), ++ [], [UL_DEFAULT_ENABLE([swapon], [check])] ++) ++UL_BUILD_INIT([swapon]) + UL_REQUIRES_LINUX([swapon]) + UL_REQUIRES_SYSCALL_CHECK([swapon], [UL_CHECK_SYSCALL([swapon])], [swapon]) + UL_REQUIRES_SYSCALL_CHECK([swapon], [UL_CHECK_SYSCALL([swapoff])], [swapoff]) +@@ -1548,7 +1570,11 @@ AC_CHECK_FUNCS([swapon]) + AC_CHECK_FUNCS([swapoff]) + + +-UL_BUILD_INIT([lsblk], [check]) ++AC_ARG_ENABLE([lsblk], ++ AS_HELP_STRING([--disable-lsblk], [do not build lsblk]), ++ [], [UL_DEFAULT_ENABLE([lsblk], [check])] ++) ++UL_BUILD_INIT([lsblk]) + UL_REQUIRES_LINUX([lsblk]) + UL_REQUIRES_BUILD([lsblk], [libblkid]) + UL_REQUIRES_BUILD([lsblk], [libmount]) +@@ -1556,7 +1582,11 @@ UL_REQUIRES_BUILD([lsblk], [libsmartcols]) + AM_CONDITIONAL([BUILD_LSBLK], [test "x$build_lsblk" = xyes]) + + +-UL_BUILD_INIT([lscpu], [check]) ++AC_ARG_ENABLE([lscpu], ++ AS_HELP_STRING([--disable-lscpu], [do not build lscpu]), ++ [], [UL_DEFAULT_ENABLE([lscpu], [check])] ++) ++UL_BUILD_INIT([lscpu]) + UL_REQUIRES_LINUX([lscpu]) + UL_REQUIRES_BUILD([lscpu], [libsmartcols]) + UL_REQUIRES_HAVE([lscpu], [cpu_set_t], [cpu_set_t type]) +@@ -1575,7 +1605,11 @@ UL_REQUIRES_HAVE([lslogins], [gnu_utmpx], [GNU utmpx functions]) + AM_CONDITIONAL([BUILD_LSLOGINS], [test "x$build_lslogins" = xyes]) + + +-UL_BUILD_INIT([chcpu], [check]) ++AC_ARG_ENABLE([chcpu], ++ AS_HELP_STRING([--disable-chcpu], [do not build chcpu]), ++ [], [UL_DEFAULT_ENABLE([chcpu], [check])] ++) ++UL_BUILD_INIT([chcpu]) + UL_REQUIRES_LINUX([chcpu]) + UL_REQUIRES_HAVE([chcpu], [cpu_set_t], [cpu_set_t type]) + AM_CONDITIONAL([BUILD_CHCPU], [test "x$build_chcpu" = xyes]) +@@ -1592,12 +1626,20 @@ UL_REQUIRES_HAVE([wdctl], [linux_watchdog_h], [linux/watchdog.h header file]) + AM_CONDITIONAL([BUILD_WDCTL], [test "x$build_wdctl" = xyes]) + + +-UL_BUILD_INIT([swaplabel], [check]) ++AC_ARG_ENABLE([swaplabel], ++ AS_HELP_STRING([--disable-swaplabel], [do not build swaplabel]), ++ [], [UL_DEFAULT_ENABLE([swaplabel], [check])] ++) ++UL_BUILD_INIT([swaplabel]) + UL_REQUIRES_BUILD([swaplabel], [libblkid]) + AM_CONDITIONAL([BUILD_SWAPLABEL], [test "x$build_swaplabel" = xyes]) + + +-UL_BUILD_INIT([mkswap], [yes]) ++AC_ARG_ENABLE([mkswap], ++ AS_HELP_STRING([--disable-mkswap], [do not build mkswap]), ++ [], [UL_DEFAULT_ENABLE([mkswap], [yes])] ++) ++UL_BUILD_INIT([mkswap]) + AM_CONDITIONAL([BUILD_MKSWAP], [test "x$build_mkswap" = xyes]) + AS_IF([test "x$build_mkswap" = xyes && test "x$build_libuuid" != xyes], [ + AC_MSG_WARN([uuid library is not found; mkswap(8) will not generate UUIDs]) +@@ -1618,13 +1660,25 @@ AC_ARG_ENABLE([logger], + UL_BUILD_INIT([logger]) + AM_CONDITIONAL([BUILD_LOGGER], [test "x$build_logger" = xyes]) + +-UL_BUILD_INIT([look], [yes]) ++AC_ARG_ENABLE([look], ++ AS_HELP_STRING([--disable-look], [do not build look]), ++ [], [UL_DEFAULT_ENABLE([look], [yes])] ++) ++UL_BUILD_INIT([look]) + AM_CONDITIONAL([BUILD_LOOK], [test "x$build_look" = xyes]) + +-UL_BUILD_INIT([mcookie], [yes]) ++AC_ARG_ENABLE([mcookie], ++ AS_HELP_STRING([--disable-mcookie], [do not build mcookie]), ++ [], [UL_DEFAULT_ENABLE([mcookie], [yes])] ++) ++UL_BUILD_INIT([mcookie]) + AM_CONDITIONAL([BUILD_MCOOKIE], [test "x$build_mcookie" = xyes]) + +-UL_BUILD_INIT([namei], [yes]) ++AC_ARG_ENABLE([namei], ++ AS_HELP_STRING([--disable-namei], [do not build namei]), ++ [], [UL_DEFAULT_ENABLE([namei], [yes])] ++) ++UL_BUILD_INIT([namei]) + AM_CONDITIONAL([BUILD_NAMEI], [test "x$build_namei" = xyes]) + + matriplet="$($CC -print-multiarch 2>/dev/null || true)" +@@ -1635,16 +1689,28 @@ fi + UL_BUILD_INIT([whereis], [yes]) + AM_CONDITIONAL([BUILD_WHEREIS], [test "x$build_whereis" = xyes]) + +-UL_BUILD_INIT([getopt], [yes]) ++AC_ARG_ENABLE([getopt], ++ AS_HELP_STRING([--disable-getopt], [do not build getopt]), ++ [], [UL_DEFAULT_ENABLE([getopt], [yes])] ++) ++UL_BUILD_INIT([getopt]) + AM_CONDITIONAL([BUILD_GETOPT], [test "x$build_getopt" = xyes]) + + +-UL_BUILD_INIT([blockdev], [check]) ++AC_ARG_ENABLE([blockdev], ++ AS_HELP_STRING([--disable-blockdev], [do not build blockdev]), ++ [], [UL_DEFAULT_ENABLE([blockdev], [check])] ++) ++UL_BUILD_INIT([blockdev]) + UL_REQUIRES_LINUX([blockdev]) + AM_CONDITIONAL([BUILD_BLOCKDEV], [test "x$build_blockdev" = xyes]) + + +-UL_BUILD_INIT([prlimit], [check]) ++AC_ARG_ENABLE([prlimit], ++ AS_HELP_STRING([--disable-prlimit], [do not build prlimit]), ++ [], [UL_DEFAULT_ENABLE([prlimit], [check])] ++) ++UL_BUILD_INIT([prlimit]) + UL_REQUIRES_LINUX([prlimit]) + UL_REQUIRES_BUILD([prlimit], [libsmartcols]) + UL_REQUIRES_SYSCALL_CHECK([prlimit], [UL_CHECK_SYSCALL([prlimit64])], [prlimit64]) +@@ -1654,7 +1720,11 @@ AS_IF([test "x$build_prlimit" = xyes], [ + ]) + + +-UL_BUILD_INIT([lslocks], [check]) ++AC_ARG_ENABLE([lslocks], ++ AS_HELP_STRING([--disable-lslocks], [do not build lslocks]), ++ [], [UL_DEFAULT_ENABLE([lslocks], [check])] ++) ++UL_BUILD_INIT([lslocks]) + UL_REQUIRES_LINUX([lslocks]) + UL_REQUIRES_BUILD([lslocks], [libmount]) + UL_REQUIRES_BUILD([lslocks], [libsmartcols]) +@@ -1682,7 +1752,11 @@ UL_REQUIRES_SYSCALL_CHECK([pivot_root], [UL_CHECK_SYSCALL([pivot_root])]) + AM_CONDITIONAL([BUILD_PIVOT_ROOT], [test "x$build_pivot_root" = xyes]) + + +-UL_BUILD_INIT([flock], [check]) ++AC_ARG_ENABLE([flock], ++ AS_HELP_STRING([--disable-flock], [do not build flock]), ++ [], [UL_DEFAULT_ENABLE([flock], [check])] ++) ++UL_BUILD_INIT([flock]) + UL_REQUIRES_HAVE([flock], [timer], [timer_create/setitimer function]) + AM_CONDITIONAL([BUILD_FLOCK], [test "x$build_flock" = xyes]) + +@@ -1705,7 +1779,11 @@ UL_BUILD_INIT([chmem]) + UL_REQUIRES_LINUX([chmem]) + AM_CONDITIONAL([BUILD_CHMEM], [test "x$build_chmem" = xyes]) + +-UL_BUILD_INIT([ipcmk], [yes]) ++AC_ARG_ENABLE([ipcmk], ++ AS_HELP_STRING([--disable-ipcmk], [do not build ipcmk]), ++ [], [UL_DEFAULT_ENABLE([ipcmk], [yes])] ++) ++UL_BUILD_INIT([ipcmk]) + AM_CONDITIONAL([BUILD_IPCMK], [test "x$build_ipcmk" = xyes]) + + +@@ -1745,22 +1823,38 @@ UL_REQUIRES_BUILD([lsirq], [libsmartcols]) + AM_CONDITIONAL([BUILD_LSIRQ], [test "x$build_lsirq" = xyes]) + + +-UL_BUILD_INIT([choom], [check]) ++AC_ARG_ENABLE([choom], ++ AS_HELP_STRING([--disable-choom], [do not build choom]), ++ [], [UL_DEFAULT_ENABLE([choom], [check])] ++) ++UL_BUILD_INIT([choom]) + UL_REQUIRES_LINUX([choom]) + AM_CONDITIONAL([BUILD_CHOOM], [test "x$build_choom" = xyes]) + +-UL_BUILD_INIT([lsipc], [check]) ++AC_ARG_ENABLE([lsipc], ++ AS_HELP_STRING([--disable-lsipc], [do not build lsipc]), ++ [], [UL_DEFAULT_ENABLE([lsipc], [check])] ++) ++UL_BUILD_INIT([lsipc]) + UL_REQUIRES_LINUX([lsipc]) + UL_REQUIRES_BUILD([lsipc], [libsmartcols]) + AM_CONDITIONAL([BUILD_LSIPC], [test "x$build_lsipc" = xyes]) + +-UL_BUILD_INIT([lsns], [check]) ++AC_ARG_ENABLE([lsns], ++ AS_HELP_STRING([--disable-lsns], [do not build lsns]), ++ [], [UL_DEFAULT_ENABLE([lsns], [check])] ++) ++UL_BUILD_INIT([lsns]) + UL_REQUIRES_LINUX([lsns]) + UL_REQUIRES_BUILD([lsns], [libsmartcols]) + UL_REQUIRES_BUILD([lsns], [libmount]) + AM_CONDITIONAL([BUILD_LSNS], [test "x$build_lsns" = xyes]) + +-UL_BUILD_INIT([renice], [yes]) ++AC_ARG_ENABLE([renice], ++ AS_HELP_STRING([--disable-renice], [do not build renice]), ++ [], [UL_DEFAULT_ENABLE([renice], [yes])] ++) ++UL_BUILD_INIT([renice]) + AM_CONDITIONAL([BUILD_RENICE], [test "x$build_renice" = xyes]) + + +@@ -1774,18 +1868,34 @@ UL_REQUIRES_BUILD([rfkill], [libsmartcols]) + AM_CONDITIONAL([BUILD_RFKILL], [test "x$build_rfkill" = xyes]) + + +-UL_BUILD_INIT([setsid], [yes]) ++AC_ARG_ENABLE([setsid], ++ AS_HELP_STRING([--disable-setsid], [do not build setsid]), ++ [], [UL_DEFAULT_ENABLE([setsid], [yes])] ++) ++UL_BUILD_INIT([setsid]) + AM_CONDITIONAL([BUILD_SETSID], [test "x$build_setsid" = xyes]) + +-UL_BUILD_INIT([readprofile], [check]) ++AC_ARG_ENABLE([readprofile], ++ AS_HELP_STRING([--disable-readprofile], [do not build readprofile]), ++ [], [UL_DEFAULT_ENABLE([readprofile], [check])] ++) ++UL_BUILD_INIT([readprofile]) + UL_REQUIRES_LINUX([readprofile]) + AM_CONDITIONAL([BUILD_READPROFILE], [test "x$build_readprofile" = xyes]) + +-UL_BUILD_INIT([dmesg], [check]) ++AC_ARG_ENABLE([dmesg], ++ AS_HELP_STRING([--disable-dmesg], [do not build dmesg]), ++ [], [UL_DEFAULT_ENABLE([dmesg], [check])] ++) ++UL_BUILD_INIT([dmesg]) + UL_REQUIRES_LINUX([dmesg]) + AM_CONDITIONAL([BUILD_DMESG], [test "x$build_dmesg" = xyes]) + +-UL_BUILD_INIT([ctrlaltdel], [check]) ++AC_ARG_ENABLE([ctrlaltdel], ++ AS_HELP_STRING([--disable-ctrlaltdel], [do not build ctrlaltdel]), ++ [], [UL_DEFAULT_ENABLE([ctrlaltdel], [check])] ++) ++UL_BUILD_INIT([ctrlaltdel]) + UL_REQUIRES_LINUX([ctrlaltdel]) + dnl we assume reboot() to be the 1-argument variant, because even considering + dnl widely used alternative C libraries like uclibc, dietlibc and musl, +@@ -1794,64 +1904,128 @@ dnl earlier than 2.x. + UL_REQUIRES_HAVE([ctrlaltdel], [reboot], [reboot function]) + AM_CONDITIONAL([BUILD_CTRLALTDEL], [test "x$build_ctrlaltdel" = xyes]) + +-UL_BUILD_INIT([fincore], [check]) ++AC_ARG_ENABLE([fincore], ++ AS_HELP_STRING([--disable-fincore], [do not build fincore]), ++ [], [UL_DEFAULT_ENABLE([fincore], [check])] ++) ++UL_BUILD_INIT([fincore]) + UL_REQUIRES_LINUX([fincore]) + UL_REQUIRES_BUILD([fincore], [libsmartcols]) + AM_CONDITIONAL([BUILD_FINCORE], [test "x$build_fincore" = xyes]) + +-UL_BUILD_INIT([fsfreeze], [check]) ++AC_ARG_ENABLE([fsfreeze], ++ AS_HELP_STRING([--disable-fsfreeze], [do not build fsfreeze]), ++ [], [UL_DEFAULT_ENABLE([fsfreeze], [check])] ++) ++UL_BUILD_INIT([fsfreeze]) + UL_REQUIRES_LINUX([fsfreeze]) + AM_CONDITIONAL([BUILD_FSFREEZE], [test "x$build_fsfreeze" = xyes]) + +-UL_BUILD_INIT([blkdiscard], [check]) ++AC_ARG_ENABLE([blkdiscard], ++ AS_HELP_STRING([--disable-blkdiscard], [do not build blkdiscard]), ++ [], [UL_DEFAULT_ENABLE([blkdiscard], [check])] ++) ++UL_BUILD_INIT([blkdiscard]) + UL_REQUIRES_LINUX([blkdiscard]) + AM_CONDITIONAL([BUILD_BLKDISCARD], [test "x$build_blkdiscard" = xyes]) + +-UL_BUILD_INIT([blkzone], [check]) ++AC_ARG_ENABLE([blkzone], ++ AS_HELP_STRING([--disable-blkzone], [do not build blkzone]), ++ [], [UL_DEFAULT_ENABLE([blkzone], [check])] ++) ++UL_BUILD_INIT([blkzone]) + UL_REQUIRES_LINUX([blkzone]) + UL_REQUIRES_HAVE([blkzone], [linux_blkzoned_h], [linux/blkzoned.h header]) + AM_CONDITIONAL([BUILD_BLKZONE], [test "x$build_blkzone" = xyes]) + +-UL_BUILD_INIT([ldattach], [check]) ++AC_ARG_ENABLE([ldattach], ++ AS_HELP_STRING([--disable-ldattach], [do not build ldattach]), ++ [], [UL_DEFAULT_ENABLE([ldattach], [check])] ++) ++UL_BUILD_INIT([ldattach]) + UL_REQUIRES_LINUX([ldattach]) + AM_CONDITIONAL([BUILD_LDATTACH], [test "x$build_ldattach" = xyes]) + +-UL_BUILD_INIT([rtcwake], [check]) ++AC_ARG_ENABLE([rtcwake], ++ AS_HELP_STRING([--disable-rtcwake], [do not build rtcwake]), ++ [], [UL_DEFAULT_ENABLE([rtcwake], [check])] ++) ++UL_BUILD_INIT([rtcwake]) + UL_REQUIRES_LINUX([rtcwake]) + AM_CONDITIONAL([BUILD_RTCWAKE], [test "x$build_rtcwake" = xyes]) + +-UL_BUILD_INIT([setarch], [check]) ++AC_ARG_ENABLE([setarch], ++ AS_HELP_STRING([--disable-setarch], [do not build setarch]), ++ [], [UL_DEFAULT_ENABLE([setarch], [check])] ++) ++UL_BUILD_INIT([setarch]) + UL_REQUIRES_LINUX([setarch]) + AM_CONDITIONAL([BUILD_SETARCH], [test "x$build_setarch" = xyes]) + +-UL_BUILD_INIT([script], [check]) ++AC_ARG_ENABLE([script], ++ AS_HELP_STRING([--disable-script], [do not build script]), ++ [], [UL_DEFAULT_ENABLE([script], [check])] ++) ++UL_BUILD_INIT([script]) + UL_REQUIRES_HAVE([script], [pty]) + AM_CONDITIONAL([BUILD_SCRIPT], [test "x$build_script" = xyes]) + +-UL_BUILD_INIT([scriptreplay], [yes]) ++AC_ARG_ENABLE([scriptreplay], ++ AS_HELP_STRING([--disable-scriptreplay], [do not build scriptreplay]), ++ [], [UL_DEFAULT_ENABLE([scriptreplay], [yes])] ++) ++UL_BUILD_INIT([scriptreplay]) + AM_CONDITIONAL([BUILD_SCRIPTREPLAY], [test "x$build_scriptreplay" = xyes]) + +-UL_BUILD_INIT([scriptlive], [check]) ++AC_ARG_ENABLE([scriptlive], ++ AS_HELP_STRING([--disable-scriptlive], [do not build scriptlive]), ++ [], [UL_DEFAULT_ENABLE([scriptlive], [check])] ++) ++UL_BUILD_INIT([scriptlive]) + UL_REQUIRES_HAVE([scriptlive], [pty]) + AM_CONDITIONAL([BUILD_SCRIPTLIVE], [test "x$build_scriptlive" = xyes]) + +-UL_BUILD_INIT([col], [yes]) ++AC_ARG_ENABLE([col], ++ AS_HELP_STRING([--disable-col], [do not build col]), ++ [], [UL_DEFAULT_ENABLE([col], [yes])] ++) ++UL_BUILD_INIT([col]) + AM_CONDITIONAL([BUILD_COL], [test "x$build_col" = xyes]) + +-UL_BUILD_INIT([colcrt], [yes]) ++AC_ARG_ENABLE([colcrt], ++ AS_HELP_STRING([--disable-colcrt], [do not build colcrt]), ++ [], [UL_DEFAULT_ENABLE([colcrt], [yes])] ++) ++UL_BUILD_INIT([colcrt]) + AM_CONDITIONAL([BUILD_COLCRT], [test "x$build_colcrt" = xyes]) + +-UL_BUILD_INIT([colrm], [yes]) ++AC_ARG_ENABLE([colrm], ++ AS_HELP_STRING([--disable-colrm], [do not build colrm]), ++ [], [UL_DEFAULT_ENABLE([colrm], [yes])] ++) ++UL_BUILD_INIT([colrm]) + AM_CONDITIONAL([BUILD_COLRM], [test "x$build_colrm" = xyes]) + +-UL_BUILD_INIT([column], [check]) ++AC_ARG_ENABLE([column], ++ AS_HELP_STRING([--disable-column], [do not build column]), ++ [], [UL_DEFAULT_ENABLE([column], [check])] ++) ++UL_BUILD_INIT([column]) + UL_REQUIRES_BUILD([column], [libsmartcols]) + AM_CONDITIONAL([BUILD_COLUMN], [test "x$build_column" = xyes]) + +-UL_BUILD_INIT([hexdump], [yes]) ++AC_ARG_ENABLE([hexdump], ++ AS_HELP_STRING([--disable-hexdump], [do not build hexdump]), ++ [], [UL_DEFAULT_ENABLE([hexdump], [yes])] ++) ++UL_BUILD_INIT([hexdump]) + AM_CONDITIONAL([BUILD_HEXDUMP], [test "x$build_hexdump" = xyes]) + +-UL_BUILD_INIT([rev], [yes]) ++AC_ARG_ENABLE([rev], ++ AS_HELP_STRING([--disable-rev], [do not build rev]), ++ [], [UL_DEFAULT_ENABLE([rev], [yes])] ++) ++UL_BUILD_INIT([rev]) + AM_CONDITIONAL([BUILD_REV], [test "x$build_rev" = xyes]) + + +diff --git a/disk-utils/cfdisk.c b/disk-utils/cfdisk.c +index 11f8b9a..bacba72 100644 +--- a/disk-utils/cfdisk.c ++++ b/disk-utils/cfdisk.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + #ifdef HAVE_LIBMOUNT + # include /* keep it optional for non-linux systems */ +diff --git a/include/namespace.h b/include/namespace.h +index 2d0a56e..fb2289f 100644 +--- a/include/namespace.h ++++ b/include/namespace.h +@@ -7,6 +7,7 @@ + */ + #ifndef UTIL_LINUX_NAMESPACE_H + # define UTIL_LINUX_NAMESPACE_H ++#ifndef __aero__ + + # include + +@@ -53,4 +54,5 @@ static inline int setns(int fd, int nstype) + } + # endif + ++#endif /* !__aero__ */ + #endif /* UTIL_LINUX_NAMESPACE_H */ +diff --git a/include/path.h b/include/path.h +index 2a4f80e..ef85c96 100644 +--- a/include/path.h ++++ b/include/path.h +@@ -124,6 +124,7 @@ int ul_path_countf_dirents(struct path_cxt *pc, const char *path, ...) + FILE *ul_prefix_fopen(const char *prefix, const char *path, const char *mode); + + ++#ifndef __aero__ + #ifdef HAVE_CPU_SET_T + # include "cpuset.h" + int ul_path_readf_cpuset(struct path_cxt *pc, cpu_set_t **set, int maxcpus, const char *path, ...) +@@ -132,4 +133,5 @@ int ul_path_readf_cpuset(struct path_cxt *pc, cpu_set_t **set, int maxcpus, cons + int ul_path_readf_cpulist(struct path_cxt *pc, cpu_set_t **set, int maxcpus, const char *path, ...) + __attribute__ ((__format__ (__printf__, 4, 5))); + #endif /* HAVE_CPU_SET_T */ ++#endif /* !__aero__ */ + #endif /* UTIL_LINUX_PATH_H */ +diff --git a/lib/cpuset.c b/lib/cpuset.c +index 2847db8..4adfa6a 100644 +--- a/lib/cpuset.c ++++ b/lib/cpuset.c +@@ -1,3 +1,4 @@ ++#ifndef __aero__ + /* + * Terminology: + * +@@ -411,3 +412,4 @@ usage_err: + exit(EXIT_FAILURE); + } + #endif ++#endif +diff --git a/lib/path.c b/lib/path.c +index 75fa853..9f03ec6 100644 +--- a/lib/path.c ++++ b/lib/path.c +@@ -977,6 +977,7 @@ FILE *ul_prefix_fopen(const char *prefix, const char *path, const char *mode) + return fopen(buf, mode); + } + ++#ifndef __aero__ + #ifdef HAVE_CPU_SET_T + static int ul_path_cpuparse(struct path_cxt *pc, cpu_set_t **set, int maxcpus, int islist, const char *path, va_list ap) + { +@@ -1044,6 +1045,7 @@ int ul_path_readf_cpulist(struct path_cxt *pc, cpu_set_t **set, int maxcpus, con + } + + #endif /* HAVE_CPU_SET_T */ ++#endif /* !__aero__ */ + + + #ifdef TEST_PROGRAM_PATH +diff --git a/libblkid/src/topology/ioctl.c b/libblkid/src/topology/ioctl.c +index 3aba09e..76b750e 100644 +--- a/libblkid/src/topology/ioctl.c ++++ b/libblkid/src/topology/ioctl.c +@@ -16,6 +16,8 @@ + #include + #include + ++#include ++ + #include "topology.h" + + /* +diff --git a/login-utils/logindefs.c b/login-utils/logindefs.c +index 97150dc..35371ec 100644 +--- a/login-utils/logindefs.c ++++ b/login-utils/logindefs.c +@@ -26,7 +26,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c +index 773d13a..90e617f 100644 +--- a/login-utils/lslogins.c ++++ b/login-utils/lslogins.c +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/misc-utils/lsblk.h b/misc-utils/lsblk.h +index 8722127..6ae1ebe 100644 +--- a/misc-utils/lsblk.h ++++ b/misc-utils/lsblk.h +@@ -13,6 +13,8 @@ + + #include + ++#include ++ + #include "c.h" + #include "list.h" + #include "debug.h" +diff --git a/term-utils/agetty.c b/term-utils/agetty.c +index 191fa29..1595672 100644 +--- a/term-utils/agetty.c ++++ b/term-utils/agetty.c +@@ -88,6 +88,14 @@ + # ifndef DEFAULT_STERM + # define DEFAULT_STERM "vt102" + # endif ++#elif defined __aero__ ++# define USE_SYSLOG ++# ifndef DEFAULT_VCTERM ++# define DEFAULT_VCTERM "linux" ++# endif ++# ifndef DEFAULT_STERM ++# define DEFAULT_STERM "vt100" ++# endif + #else + # ifndef DEFAULT_VCTERM + # define DEFAULT_VCTERM "vt100" +-- +2.38.1 + diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 48c354e5d0b..7896016824b 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -239,6 +239,7 @@ pub fn generic_do_syscall( SYS_UNAME => process::uname(b), SYS_WAITPID => process::waitpid(b, c, d), SYS_GETPID => process::getpid(), + SYS_GETPPID => process::getppid(), SYS_GETTID => process::gettid(), SYS_GETHOSTNAME => process::gethostname(b, c), SYS_SETHOSTNAME => process::sethostname(b, c), diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index beccf0478db..9ea1ad5669f 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -18,7 +18,7 @@ */ use aero_syscall::signal::{SigAction, SigProcMask}; -use aero_syscall::{MMapFlags, MMapProt, SysInfo, SyscallError, Utsname}; +use aero_syscall::*; use spin::{Mutex, Once}; use crate::acpi::aml; @@ -157,10 +157,11 @@ pub fn log(msg: &str) -> Result { } #[syscall] -pub fn waitpid(pid: usize, status: &mut u32, _flags: usize) -> Result { +pub fn waitpid(pid: usize, status: &mut u32, flags: usize) -> Result { + let flags = WaitPidFlags::from_bits_truncate(flags); let current_task = scheduler::get_scheduler().current_task(); - Ok(current_task.waitpid(pid as isize, status)?) + Ok(current_task.waitpid(pid as isize, status, flags)?) } #[syscall] @@ -226,6 +227,14 @@ pub fn getpid() -> Result { Ok(scheduler::get_scheduler().current_task().pid().as_usize()) } +#[syscall] +pub fn getppid() -> Result { + Ok(scheduler::get_scheduler() + .current_task() + .parent_pid() + .as_usize()) +} + #[syscall] pub fn gettid() -> Result { Ok(scheduler::get_scheduler().current_task().tid().as_usize()) diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index cefa36122a7..ad6fe3eb5d4 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -17,6 +17,7 @@ * along with Aero. If not, see . */ +use aero_syscall::WaitPidFlags; use alloc::sync::{Arc, Weak}; use spin::RwLock; @@ -129,8 +130,13 @@ impl Zombies { self.block.notify_complete(); } - fn waitpid(&self, pids: &[usize], status: &mut u32) -> SignalResult { - let mut captured = (TaskId(0), 0); + fn waitpid( + &self, + pids: &[usize], + status: &mut u32, + flags: WaitPidFlags, + ) -> SignalResult { + let mut captured = None; self.block.block_on(&self.list, |l| { let mut cursor = l.front_mut(); @@ -138,7 +144,7 @@ impl Zombies { while let Some(t) = cursor.get() { for pid in pids { if t.pid().as_usize() == *pid { - captured = (t.pid(), t.exit_status()); + captured = Some((t.pid(), t.exit_status())); cursor.remove(); return true; @@ -148,14 +154,23 @@ impl Zombies { cursor.move_next(); } + if flags.contains(WaitPidFlags::WNOHANG) { + return true; + } + false })?; - let (tid, st) = captured; - - log::debug!("waitpid: status = {st}"); - *status = st as u32; - Ok(tid.as_usize()) + if let Some((tid, st)) = captured { + log::debug!("waitpid: status = {st}"); + *status = st as u32; + Ok(tid.as_usize()) + } else { + // If `WNOHANG` was specified in flags and there were no children in a waitable + // state, then waitid() returns 0 immediately. + *status = 0; + Ok(0) + } } } @@ -417,7 +432,12 @@ impl Task { self.sleep_duration.load(Ordering::SeqCst) } - pub fn waitpid(&self, pid: isize, status: &mut u32) -> SignalResult { + pub fn waitpid( + &self, + pid: isize, + status: &mut u32, + flags: WaitPidFlags, + ) -> SignalResult { if pid == -1 { // wait for any child process if no specific process is requested. // @@ -433,9 +453,9 @@ impl Task { .collect::>(); pids.extend(self.children.lock_irq().iter().map(|e| e.pid().as_usize())); - self.zombies.waitpid(&pids, status) + self.zombies.waitpid(&pids, status, flags) } else { - self.zombies.waitpid(&[pid as _], status) + self.zombies.waitpid(&[pid as _], status, flags) } } @@ -485,15 +505,15 @@ impl Task { } pub(super) fn update_state(&self, state: TaskState) { - // if state != TaskState::Runnable { - // log::warn!( - // "Task::update_state() updated the task state to {state:?}! (pid={:?}, tid={:?})", - // self.pid, - // self.tid - // ); - - // crate::unwind::unwind_stack_trace(); - // } + if state != TaskState::Runnable { + log::warn!( + "Task::update_state() updated the task state to {state:?}! (pid={:?}, tid={:?})", + self.pid, + self.tid + ); + + crate::unwind::unwind_stack_trace(); + } self.state.store(state as _, Ordering::SeqCst); } @@ -507,6 +527,10 @@ impl Task { self.pid } + pub fn parent_pid(&self) -> TaskId { + self.get_parent().unwrap().pid() + } + pub fn tid(&self) -> TaskId { self.tid } diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index f118bad86ec..ef570ff819f 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -86,6 +86,7 @@ pub const SYS_EXIT_THREAD: usize = 62; pub const SYS_SOCK_RECV: usize = 63; pub const SYS_SETITIMER: usize = 64; pub const SYS_GETITIMER: usize = 65; +pub const SYS_GETPPID: usize = 66; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 62a3a2d4011..52a273db4a8 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -77,6 +77,17 @@ bitflags::bitflags! { } } +bitflags::bitflags! { + pub struct WaitPidFlags: usize { + const WNOHANG = 1; + const WUNTRACED = 2; + const WSTOPPED = 2; + const WEXITED = 4; + const WCONTINUED = 8; + const WNOWAIT = 0x01000000; + } +} + #[derive(Copy, Clone, PartialEq, Debug)] #[repr(isize)] pub enum SyscallError { diff --git a/userland/apps/init/src/main.rs b/userland/apps/init/src/main.rs index ac8a4d91a3a..2309f2fdff3 100644 --- a/userland/apps/init/src/main.rs +++ b/userland/apps/init/src/main.rs @@ -23,7 +23,6 @@ use std::process::Command; use std::mem; -const DEFAULT_SHELL_PATH: &str = "/usr/bin/bash"; const TTY_PATH: &str = "/dev/tty"; fn main() -> Result<(), Box> { @@ -35,7 +34,6 @@ fn main() -> Result<(), Box> { mem::forget(OpenOptions::new().write(true).open(TTY_PATH)?); // fd=1 for stdout mem::forget(OpenOptions::new().write(true).open(TTY_PATH)?); // fd=2 for stderr - Command::new(DEFAULT_SHELL_PATH).spawn()?; - - Ok(()) + Command::new("/usr/bin/startx").spawn()?; + loop {} } From 5c997e162fdcb7a9fbfbafe84cb53c947062dff6 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 2 Dec 2022 15:36:07 +1100 Subject: [PATCH 061/368] patches: remove util-linux patch Signed-off-by: Andy-Python-Programmer --- patches/util-linux/util-linux.patch | 630 ---------------------------- 1 file changed, 630 deletions(-) delete mode 100644 patches/util-linux/util-linux.patch diff --git a/patches/util-linux/util-linux.patch b/patches/util-linux/util-linux.patch deleted file mode 100644 index 8ceda5782ed..00000000000 --- a/patches/util-linux/util-linux.patch +++ /dev/null @@ -1,630 +0,0 @@ -From c63f96131bad9edf92f3a6f6353b1d0eba2f712b Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Thu, 1 Dec 2022 20:24:57 +1100 -Subject: [PATCH] - ---- - configure.ac | 258 ++++++++++++++++++++++++++++------ - disk-utils/cfdisk.c | 1 + - include/namespace.h | 2 + - include/path.h | 2 + - lib/cpuset.c | 2 + - lib/path.c | 2 + - libblkid/src/topology/ioctl.c | 2 + - login-utils/logindefs.c | 2 +- - login-utils/lslogins.c | 2 +- - misc-utils/lsblk.h | 2 + - term-utils/agetty.c | 8 ++ - 11 files changed, 239 insertions(+), 44 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 2ac4c2b..a711717 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -212,6 +212,8 @@ bsd_os=no - AS_CASE([${host_os}], - [*linux*], - [linux_os=yes], -+ [*aero*], -+ [linux_os=yes], - [*darwin*], - [darwin_os=yes], - [*bsd*], -@@ -425,7 +427,10 @@ have_pty_h=$ac_cv_header_pty_h - - AS_CASE([$linux_os:$have_linux_version_h], - [yes:no], -- [AC_MSG_ERROR([kernel headers required on Linux])] -+ AS_CASE([${host_os}], -+ [*linux*], -+ [AC_MSG_ERROR([kernel headers required on Linux])] -+ ) - ) - - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -@@ -1523,20 +1528,37 @@ AS_IF([test "x$enable_hwclock_gplv3" = xyes ], [ - ]) - - --UL_BUILD_INIT([mkfs], [yes]) -+AC_ARG_ENABLE([mkfs], -+ AS_HELP_STRING([--disable-mkfs], [do not build mkfs]), -+ [], [UL_DEFAULT_ENABLE([mkfs], [yes])] -+) -+UL_BUILD_INIT([mkfs]) - AM_CONDITIONAL([BUILD_MKFS], [test "x$build_mkfs" = xyes]) - -+AC_ARG_ENABLE([isosize], -+ AS_HELP_STRING([--disable-isosize], [do not build isosize]), -+ [], [UL_DEFAULT_ENABLE([isosize], [yes])] -+) -+UL_BUILD_INIT([isosize]) - UL_BUILD_INIT([isosize], [yes]) - AM_CONDITIONAL([BUILD_ISOSIZE], [test "x$build_isosize" = xyes]) - - --UL_BUILD_INIT([fstrim], [check]) -+AC_ARG_ENABLE([fstrim], -+ AS_HELP_STRING([--disable-fstrim], [do not build fstrim]), -+ [], [UL_DEFAULT_ENABLE([fstrim], [check])] -+) -+UL_BUILD_INIT([fstrim]) - UL_REQUIRES_LINUX([fstrim]) - UL_REQUIRES_BUILD([fstrim], [libmount]) - AM_CONDITIONAL([BUILD_FSTRIM], [test "x$build_fstrim" = xyes]) - - --UL_BUILD_INIT([swapon], [check]) -+AC_ARG_ENABLE([swapon], -+ AS_HELP_STRING([--disable-swapon], [do not build swapon, swapoff]), -+ [], [UL_DEFAULT_ENABLE([swapon], [check])] -+) -+UL_BUILD_INIT([swapon]) - UL_REQUIRES_LINUX([swapon]) - UL_REQUIRES_SYSCALL_CHECK([swapon], [UL_CHECK_SYSCALL([swapon])], [swapon]) - UL_REQUIRES_SYSCALL_CHECK([swapon], [UL_CHECK_SYSCALL([swapoff])], [swapoff]) -@@ -1548,7 +1570,11 @@ AC_CHECK_FUNCS([swapon]) - AC_CHECK_FUNCS([swapoff]) - - --UL_BUILD_INIT([lsblk], [check]) -+AC_ARG_ENABLE([lsblk], -+ AS_HELP_STRING([--disable-lsblk], [do not build lsblk]), -+ [], [UL_DEFAULT_ENABLE([lsblk], [check])] -+) -+UL_BUILD_INIT([lsblk]) - UL_REQUIRES_LINUX([lsblk]) - UL_REQUIRES_BUILD([lsblk], [libblkid]) - UL_REQUIRES_BUILD([lsblk], [libmount]) -@@ -1556,7 +1582,11 @@ UL_REQUIRES_BUILD([lsblk], [libsmartcols]) - AM_CONDITIONAL([BUILD_LSBLK], [test "x$build_lsblk" = xyes]) - - --UL_BUILD_INIT([lscpu], [check]) -+AC_ARG_ENABLE([lscpu], -+ AS_HELP_STRING([--disable-lscpu], [do not build lscpu]), -+ [], [UL_DEFAULT_ENABLE([lscpu], [check])] -+) -+UL_BUILD_INIT([lscpu]) - UL_REQUIRES_LINUX([lscpu]) - UL_REQUIRES_BUILD([lscpu], [libsmartcols]) - UL_REQUIRES_HAVE([lscpu], [cpu_set_t], [cpu_set_t type]) -@@ -1575,7 +1605,11 @@ UL_REQUIRES_HAVE([lslogins], [gnu_utmpx], [GNU utmpx functions]) - AM_CONDITIONAL([BUILD_LSLOGINS], [test "x$build_lslogins" = xyes]) - - --UL_BUILD_INIT([chcpu], [check]) -+AC_ARG_ENABLE([chcpu], -+ AS_HELP_STRING([--disable-chcpu], [do not build chcpu]), -+ [], [UL_DEFAULT_ENABLE([chcpu], [check])] -+) -+UL_BUILD_INIT([chcpu]) - UL_REQUIRES_LINUX([chcpu]) - UL_REQUIRES_HAVE([chcpu], [cpu_set_t], [cpu_set_t type]) - AM_CONDITIONAL([BUILD_CHCPU], [test "x$build_chcpu" = xyes]) -@@ -1592,12 +1626,20 @@ UL_REQUIRES_HAVE([wdctl], [linux_watchdog_h], [linux/watchdog.h header file]) - AM_CONDITIONAL([BUILD_WDCTL], [test "x$build_wdctl" = xyes]) - - --UL_BUILD_INIT([swaplabel], [check]) -+AC_ARG_ENABLE([swaplabel], -+ AS_HELP_STRING([--disable-swaplabel], [do not build swaplabel]), -+ [], [UL_DEFAULT_ENABLE([swaplabel], [check])] -+) -+UL_BUILD_INIT([swaplabel]) - UL_REQUIRES_BUILD([swaplabel], [libblkid]) - AM_CONDITIONAL([BUILD_SWAPLABEL], [test "x$build_swaplabel" = xyes]) - - --UL_BUILD_INIT([mkswap], [yes]) -+AC_ARG_ENABLE([mkswap], -+ AS_HELP_STRING([--disable-mkswap], [do not build mkswap]), -+ [], [UL_DEFAULT_ENABLE([mkswap], [yes])] -+) -+UL_BUILD_INIT([mkswap]) - AM_CONDITIONAL([BUILD_MKSWAP], [test "x$build_mkswap" = xyes]) - AS_IF([test "x$build_mkswap" = xyes && test "x$build_libuuid" != xyes], [ - AC_MSG_WARN([uuid library is not found; mkswap(8) will not generate UUIDs]) -@@ -1618,13 +1660,25 @@ AC_ARG_ENABLE([logger], - UL_BUILD_INIT([logger]) - AM_CONDITIONAL([BUILD_LOGGER], [test "x$build_logger" = xyes]) - --UL_BUILD_INIT([look], [yes]) -+AC_ARG_ENABLE([look], -+ AS_HELP_STRING([--disable-look], [do not build look]), -+ [], [UL_DEFAULT_ENABLE([look], [yes])] -+) -+UL_BUILD_INIT([look]) - AM_CONDITIONAL([BUILD_LOOK], [test "x$build_look" = xyes]) - --UL_BUILD_INIT([mcookie], [yes]) -+AC_ARG_ENABLE([mcookie], -+ AS_HELP_STRING([--disable-mcookie], [do not build mcookie]), -+ [], [UL_DEFAULT_ENABLE([mcookie], [yes])] -+) -+UL_BUILD_INIT([mcookie]) - AM_CONDITIONAL([BUILD_MCOOKIE], [test "x$build_mcookie" = xyes]) - --UL_BUILD_INIT([namei], [yes]) -+AC_ARG_ENABLE([namei], -+ AS_HELP_STRING([--disable-namei], [do not build namei]), -+ [], [UL_DEFAULT_ENABLE([namei], [yes])] -+) -+UL_BUILD_INIT([namei]) - AM_CONDITIONAL([BUILD_NAMEI], [test "x$build_namei" = xyes]) - - matriplet="$($CC -print-multiarch 2>/dev/null || true)" -@@ -1635,16 +1689,28 @@ fi - UL_BUILD_INIT([whereis], [yes]) - AM_CONDITIONAL([BUILD_WHEREIS], [test "x$build_whereis" = xyes]) - --UL_BUILD_INIT([getopt], [yes]) -+AC_ARG_ENABLE([getopt], -+ AS_HELP_STRING([--disable-getopt], [do not build getopt]), -+ [], [UL_DEFAULT_ENABLE([getopt], [yes])] -+) -+UL_BUILD_INIT([getopt]) - AM_CONDITIONAL([BUILD_GETOPT], [test "x$build_getopt" = xyes]) - - --UL_BUILD_INIT([blockdev], [check]) -+AC_ARG_ENABLE([blockdev], -+ AS_HELP_STRING([--disable-blockdev], [do not build blockdev]), -+ [], [UL_DEFAULT_ENABLE([blockdev], [check])] -+) -+UL_BUILD_INIT([blockdev]) - UL_REQUIRES_LINUX([blockdev]) - AM_CONDITIONAL([BUILD_BLOCKDEV], [test "x$build_blockdev" = xyes]) - - --UL_BUILD_INIT([prlimit], [check]) -+AC_ARG_ENABLE([prlimit], -+ AS_HELP_STRING([--disable-prlimit], [do not build prlimit]), -+ [], [UL_DEFAULT_ENABLE([prlimit], [check])] -+) -+UL_BUILD_INIT([prlimit]) - UL_REQUIRES_LINUX([prlimit]) - UL_REQUIRES_BUILD([prlimit], [libsmartcols]) - UL_REQUIRES_SYSCALL_CHECK([prlimit], [UL_CHECK_SYSCALL([prlimit64])], [prlimit64]) -@@ -1654,7 +1720,11 @@ AS_IF([test "x$build_prlimit" = xyes], [ - ]) - - --UL_BUILD_INIT([lslocks], [check]) -+AC_ARG_ENABLE([lslocks], -+ AS_HELP_STRING([--disable-lslocks], [do not build lslocks]), -+ [], [UL_DEFAULT_ENABLE([lslocks], [check])] -+) -+UL_BUILD_INIT([lslocks]) - UL_REQUIRES_LINUX([lslocks]) - UL_REQUIRES_BUILD([lslocks], [libmount]) - UL_REQUIRES_BUILD([lslocks], [libsmartcols]) -@@ -1682,7 +1752,11 @@ UL_REQUIRES_SYSCALL_CHECK([pivot_root], [UL_CHECK_SYSCALL([pivot_root])]) - AM_CONDITIONAL([BUILD_PIVOT_ROOT], [test "x$build_pivot_root" = xyes]) - - --UL_BUILD_INIT([flock], [check]) -+AC_ARG_ENABLE([flock], -+ AS_HELP_STRING([--disable-flock], [do not build flock]), -+ [], [UL_DEFAULT_ENABLE([flock], [check])] -+) -+UL_BUILD_INIT([flock]) - UL_REQUIRES_HAVE([flock], [timer], [timer_create/setitimer function]) - AM_CONDITIONAL([BUILD_FLOCK], [test "x$build_flock" = xyes]) - -@@ -1705,7 +1779,11 @@ UL_BUILD_INIT([chmem]) - UL_REQUIRES_LINUX([chmem]) - AM_CONDITIONAL([BUILD_CHMEM], [test "x$build_chmem" = xyes]) - --UL_BUILD_INIT([ipcmk], [yes]) -+AC_ARG_ENABLE([ipcmk], -+ AS_HELP_STRING([--disable-ipcmk], [do not build ipcmk]), -+ [], [UL_DEFAULT_ENABLE([ipcmk], [yes])] -+) -+UL_BUILD_INIT([ipcmk]) - AM_CONDITIONAL([BUILD_IPCMK], [test "x$build_ipcmk" = xyes]) - - -@@ -1745,22 +1823,38 @@ UL_REQUIRES_BUILD([lsirq], [libsmartcols]) - AM_CONDITIONAL([BUILD_LSIRQ], [test "x$build_lsirq" = xyes]) - - --UL_BUILD_INIT([choom], [check]) -+AC_ARG_ENABLE([choom], -+ AS_HELP_STRING([--disable-choom], [do not build choom]), -+ [], [UL_DEFAULT_ENABLE([choom], [check])] -+) -+UL_BUILD_INIT([choom]) - UL_REQUIRES_LINUX([choom]) - AM_CONDITIONAL([BUILD_CHOOM], [test "x$build_choom" = xyes]) - --UL_BUILD_INIT([lsipc], [check]) -+AC_ARG_ENABLE([lsipc], -+ AS_HELP_STRING([--disable-lsipc], [do not build lsipc]), -+ [], [UL_DEFAULT_ENABLE([lsipc], [check])] -+) -+UL_BUILD_INIT([lsipc]) - UL_REQUIRES_LINUX([lsipc]) - UL_REQUIRES_BUILD([lsipc], [libsmartcols]) - AM_CONDITIONAL([BUILD_LSIPC], [test "x$build_lsipc" = xyes]) - --UL_BUILD_INIT([lsns], [check]) -+AC_ARG_ENABLE([lsns], -+ AS_HELP_STRING([--disable-lsns], [do not build lsns]), -+ [], [UL_DEFAULT_ENABLE([lsns], [check])] -+) -+UL_BUILD_INIT([lsns]) - UL_REQUIRES_LINUX([lsns]) - UL_REQUIRES_BUILD([lsns], [libsmartcols]) - UL_REQUIRES_BUILD([lsns], [libmount]) - AM_CONDITIONAL([BUILD_LSNS], [test "x$build_lsns" = xyes]) - --UL_BUILD_INIT([renice], [yes]) -+AC_ARG_ENABLE([renice], -+ AS_HELP_STRING([--disable-renice], [do not build renice]), -+ [], [UL_DEFAULT_ENABLE([renice], [yes])] -+) -+UL_BUILD_INIT([renice]) - AM_CONDITIONAL([BUILD_RENICE], [test "x$build_renice" = xyes]) - - -@@ -1774,18 +1868,34 @@ UL_REQUIRES_BUILD([rfkill], [libsmartcols]) - AM_CONDITIONAL([BUILD_RFKILL], [test "x$build_rfkill" = xyes]) - - --UL_BUILD_INIT([setsid], [yes]) -+AC_ARG_ENABLE([setsid], -+ AS_HELP_STRING([--disable-setsid], [do not build setsid]), -+ [], [UL_DEFAULT_ENABLE([setsid], [yes])] -+) -+UL_BUILD_INIT([setsid]) - AM_CONDITIONAL([BUILD_SETSID], [test "x$build_setsid" = xyes]) - --UL_BUILD_INIT([readprofile], [check]) -+AC_ARG_ENABLE([readprofile], -+ AS_HELP_STRING([--disable-readprofile], [do not build readprofile]), -+ [], [UL_DEFAULT_ENABLE([readprofile], [check])] -+) -+UL_BUILD_INIT([readprofile]) - UL_REQUIRES_LINUX([readprofile]) - AM_CONDITIONAL([BUILD_READPROFILE], [test "x$build_readprofile" = xyes]) - --UL_BUILD_INIT([dmesg], [check]) -+AC_ARG_ENABLE([dmesg], -+ AS_HELP_STRING([--disable-dmesg], [do not build dmesg]), -+ [], [UL_DEFAULT_ENABLE([dmesg], [check])] -+) -+UL_BUILD_INIT([dmesg]) - UL_REQUIRES_LINUX([dmesg]) - AM_CONDITIONAL([BUILD_DMESG], [test "x$build_dmesg" = xyes]) - --UL_BUILD_INIT([ctrlaltdel], [check]) -+AC_ARG_ENABLE([ctrlaltdel], -+ AS_HELP_STRING([--disable-ctrlaltdel], [do not build ctrlaltdel]), -+ [], [UL_DEFAULT_ENABLE([ctrlaltdel], [check])] -+) -+UL_BUILD_INIT([ctrlaltdel]) - UL_REQUIRES_LINUX([ctrlaltdel]) - dnl we assume reboot() to be the 1-argument variant, because even considering - dnl widely used alternative C libraries like uclibc, dietlibc and musl, -@@ -1794,64 +1904,128 @@ dnl earlier than 2.x. - UL_REQUIRES_HAVE([ctrlaltdel], [reboot], [reboot function]) - AM_CONDITIONAL([BUILD_CTRLALTDEL], [test "x$build_ctrlaltdel" = xyes]) - --UL_BUILD_INIT([fincore], [check]) -+AC_ARG_ENABLE([fincore], -+ AS_HELP_STRING([--disable-fincore], [do not build fincore]), -+ [], [UL_DEFAULT_ENABLE([fincore], [check])] -+) -+UL_BUILD_INIT([fincore]) - UL_REQUIRES_LINUX([fincore]) - UL_REQUIRES_BUILD([fincore], [libsmartcols]) - AM_CONDITIONAL([BUILD_FINCORE], [test "x$build_fincore" = xyes]) - --UL_BUILD_INIT([fsfreeze], [check]) -+AC_ARG_ENABLE([fsfreeze], -+ AS_HELP_STRING([--disable-fsfreeze], [do not build fsfreeze]), -+ [], [UL_DEFAULT_ENABLE([fsfreeze], [check])] -+) -+UL_BUILD_INIT([fsfreeze]) - UL_REQUIRES_LINUX([fsfreeze]) - AM_CONDITIONAL([BUILD_FSFREEZE], [test "x$build_fsfreeze" = xyes]) - --UL_BUILD_INIT([blkdiscard], [check]) -+AC_ARG_ENABLE([blkdiscard], -+ AS_HELP_STRING([--disable-blkdiscard], [do not build blkdiscard]), -+ [], [UL_DEFAULT_ENABLE([blkdiscard], [check])] -+) -+UL_BUILD_INIT([blkdiscard]) - UL_REQUIRES_LINUX([blkdiscard]) - AM_CONDITIONAL([BUILD_BLKDISCARD], [test "x$build_blkdiscard" = xyes]) - --UL_BUILD_INIT([blkzone], [check]) -+AC_ARG_ENABLE([blkzone], -+ AS_HELP_STRING([--disable-blkzone], [do not build blkzone]), -+ [], [UL_DEFAULT_ENABLE([blkzone], [check])] -+) -+UL_BUILD_INIT([blkzone]) - UL_REQUIRES_LINUX([blkzone]) - UL_REQUIRES_HAVE([blkzone], [linux_blkzoned_h], [linux/blkzoned.h header]) - AM_CONDITIONAL([BUILD_BLKZONE], [test "x$build_blkzone" = xyes]) - --UL_BUILD_INIT([ldattach], [check]) -+AC_ARG_ENABLE([ldattach], -+ AS_HELP_STRING([--disable-ldattach], [do not build ldattach]), -+ [], [UL_DEFAULT_ENABLE([ldattach], [check])] -+) -+UL_BUILD_INIT([ldattach]) - UL_REQUIRES_LINUX([ldattach]) - AM_CONDITIONAL([BUILD_LDATTACH], [test "x$build_ldattach" = xyes]) - --UL_BUILD_INIT([rtcwake], [check]) -+AC_ARG_ENABLE([rtcwake], -+ AS_HELP_STRING([--disable-rtcwake], [do not build rtcwake]), -+ [], [UL_DEFAULT_ENABLE([rtcwake], [check])] -+) -+UL_BUILD_INIT([rtcwake]) - UL_REQUIRES_LINUX([rtcwake]) - AM_CONDITIONAL([BUILD_RTCWAKE], [test "x$build_rtcwake" = xyes]) - --UL_BUILD_INIT([setarch], [check]) -+AC_ARG_ENABLE([setarch], -+ AS_HELP_STRING([--disable-setarch], [do not build setarch]), -+ [], [UL_DEFAULT_ENABLE([setarch], [check])] -+) -+UL_BUILD_INIT([setarch]) - UL_REQUIRES_LINUX([setarch]) - AM_CONDITIONAL([BUILD_SETARCH], [test "x$build_setarch" = xyes]) - --UL_BUILD_INIT([script], [check]) -+AC_ARG_ENABLE([script], -+ AS_HELP_STRING([--disable-script], [do not build script]), -+ [], [UL_DEFAULT_ENABLE([script], [check])] -+) -+UL_BUILD_INIT([script]) - UL_REQUIRES_HAVE([script], [pty]) - AM_CONDITIONAL([BUILD_SCRIPT], [test "x$build_script" = xyes]) - --UL_BUILD_INIT([scriptreplay], [yes]) -+AC_ARG_ENABLE([scriptreplay], -+ AS_HELP_STRING([--disable-scriptreplay], [do not build scriptreplay]), -+ [], [UL_DEFAULT_ENABLE([scriptreplay], [yes])] -+) -+UL_BUILD_INIT([scriptreplay]) - AM_CONDITIONAL([BUILD_SCRIPTREPLAY], [test "x$build_scriptreplay" = xyes]) - --UL_BUILD_INIT([scriptlive], [check]) -+AC_ARG_ENABLE([scriptlive], -+ AS_HELP_STRING([--disable-scriptlive], [do not build scriptlive]), -+ [], [UL_DEFAULT_ENABLE([scriptlive], [check])] -+) -+UL_BUILD_INIT([scriptlive]) - UL_REQUIRES_HAVE([scriptlive], [pty]) - AM_CONDITIONAL([BUILD_SCRIPTLIVE], [test "x$build_scriptlive" = xyes]) - --UL_BUILD_INIT([col], [yes]) -+AC_ARG_ENABLE([col], -+ AS_HELP_STRING([--disable-col], [do not build col]), -+ [], [UL_DEFAULT_ENABLE([col], [yes])] -+) -+UL_BUILD_INIT([col]) - AM_CONDITIONAL([BUILD_COL], [test "x$build_col" = xyes]) - --UL_BUILD_INIT([colcrt], [yes]) -+AC_ARG_ENABLE([colcrt], -+ AS_HELP_STRING([--disable-colcrt], [do not build colcrt]), -+ [], [UL_DEFAULT_ENABLE([colcrt], [yes])] -+) -+UL_BUILD_INIT([colcrt]) - AM_CONDITIONAL([BUILD_COLCRT], [test "x$build_colcrt" = xyes]) - --UL_BUILD_INIT([colrm], [yes]) -+AC_ARG_ENABLE([colrm], -+ AS_HELP_STRING([--disable-colrm], [do not build colrm]), -+ [], [UL_DEFAULT_ENABLE([colrm], [yes])] -+) -+UL_BUILD_INIT([colrm]) - AM_CONDITIONAL([BUILD_COLRM], [test "x$build_colrm" = xyes]) - --UL_BUILD_INIT([column], [check]) -+AC_ARG_ENABLE([column], -+ AS_HELP_STRING([--disable-column], [do not build column]), -+ [], [UL_DEFAULT_ENABLE([column], [check])] -+) -+UL_BUILD_INIT([column]) - UL_REQUIRES_BUILD([column], [libsmartcols]) - AM_CONDITIONAL([BUILD_COLUMN], [test "x$build_column" = xyes]) - --UL_BUILD_INIT([hexdump], [yes]) -+AC_ARG_ENABLE([hexdump], -+ AS_HELP_STRING([--disable-hexdump], [do not build hexdump]), -+ [], [UL_DEFAULT_ENABLE([hexdump], [yes])] -+) -+UL_BUILD_INIT([hexdump]) - AM_CONDITIONAL([BUILD_HEXDUMP], [test "x$build_hexdump" = xyes]) - --UL_BUILD_INIT([rev], [yes]) -+AC_ARG_ENABLE([rev], -+ AS_HELP_STRING([--disable-rev], [do not build rev]), -+ [], [UL_DEFAULT_ENABLE([rev], [yes])] -+) -+UL_BUILD_INIT([rev]) - AM_CONDITIONAL([BUILD_REV], [test "x$build_rev" = xyes]) - - -diff --git a/disk-utils/cfdisk.c b/disk-utils/cfdisk.c -index 11f8b9a..bacba72 100644 ---- a/disk-utils/cfdisk.c -+++ b/disk-utils/cfdisk.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - - #ifdef HAVE_LIBMOUNT - # include /* keep it optional for non-linux systems */ -diff --git a/include/namespace.h b/include/namespace.h -index 2d0a56e..fb2289f 100644 ---- a/include/namespace.h -+++ b/include/namespace.h -@@ -7,6 +7,7 @@ - */ - #ifndef UTIL_LINUX_NAMESPACE_H - # define UTIL_LINUX_NAMESPACE_H -+#ifndef __aero__ - - # include - -@@ -53,4 +54,5 @@ static inline int setns(int fd, int nstype) - } - # endif - -+#endif /* !__aero__ */ - #endif /* UTIL_LINUX_NAMESPACE_H */ -diff --git a/include/path.h b/include/path.h -index 2a4f80e..ef85c96 100644 ---- a/include/path.h -+++ b/include/path.h -@@ -124,6 +124,7 @@ int ul_path_countf_dirents(struct path_cxt *pc, const char *path, ...) - FILE *ul_prefix_fopen(const char *prefix, const char *path, const char *mode); - - -+#ifndef __aero__ - #ifdef HAVE_CPU_SET_T - # include "cpuset.h" - int ul_path_readf_cpuset(struct path_cxt *pc, cpu_set_t **set, int maxcpus, const char *path, ...) -@@ -132,4 +133,5 @@ int ul_path_readf_cpuset(struct path_cxt *pc, cpu_set_t **set, int maxcpus, cons - int ul_path_readf_cpulist(struct path_cxt *pc, cpu_set_t **set, int maxcpus, const char *path, ...) - __attribute__ ((__format__ (__printf__, 4, 5))); - #endif /* HAVE_CPU_SET_T */ -+#endif /* !__aero__ */ - #endif /* UTIL_LINUX_PATH_H */ -diff --git a/lib/cpuset.c b/lib/cpuset.c -index 2847db8..4adfa6a 100644 ---- a/lib/cpuset.c -+++ b/lib/cpuset.c -@@ -1,3 +1,4 @@ -+#ifndef __aero__ - /* - * Terminology: - * -@@ -411,3 +412,4 @@ usage_err: - exit(EXIT_FAILURE); - } - #endif -+#endif -diff --git a/lib/path.c b/lib/path.c -index 75fa853..9f03ec6 100644 ---- a/lib/path.c -+++ b/lib/path.c -@@ -977,6 +977,7 @@ FILE *ul_prefix_fopen(const char *prefix, const char *path, const char *mode) - return fopen(buf, mode); - } - -+#ifndef __aero__ - #ifdef HAVE_CPU_SET_T - static int ul_path_cpuparse(struct path_cxt *pc, cpu_set_t **set, int maxcpus, int islist, const char *path, va_list ap) - { -@@ -1044,6 +1045,7 @@ int ul_path_readf_cpulist(struct path_cxt *pc, cpu_set_t **set, int maxcpus, con - } - - #endif /* HAVE_CPU_SET_T */ -+#endif /* !__aero__ */ - - - #ifdef TEST_PROGRAM_PATH -diff --git a/libblkid/src/topology/ioctl.c b/libblkid/src/topology/ioctl.c -index 3aba09e..76b750e 100644 ---- a/libblkid/src/topology/ioctl.c -+++ b/libblkid/src/topology/ioctl.c -@@ -16,6 +16,8 @@ - #include - #include - -+#include -+ - #include "topology.h" - - /* -diff --git a/login-utils/logindefs.c b/login-utils/logindefs.c -index 97150dc..35371ec 100644 ---- a/login-utils/logindefs.c -+++ b/login-utils/logindefs.c -@@ -26,7 +26,7 @@ - #include - #include - #include --#include -+#include - #include - #include - #include -diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c -index 773d13a..90e617f 100644 ---- a/login-utils/lslogins.c -+++ b/login-utils/lslogins.c -@@ -25,7 +25,7 @@ - #include - #include - #include --#include -+#include - #include - #include - #include -diff --git a/misc-utils/lsblk.h b/misc-utils/lsblk.h -index 8722127..6ae1ebe 100644 ---- a/misc-utils/lsblk.h -+++ b/misc-utils/lsblk.h -@@ -13,6 +13,8 @@ - - #include - -+#include -+ - #include "c.h" - #include "list.h" - #include "debug.h" -diff --git a/term-utils/agetty.c b/term-utils/agetty.c -index 191fa29..1595672 100644 ---- a/term-utils/agetty.c -+++ b/term-utils/agetty.c -@@ -88,6 +88,14 @@ - # ifndef DEFAULT_STERM - # define DEFAULT_STERM "vt102" - # endif -+#elif defined __aero__ -+# define USE_SYSLOG -+# ifndef DEFAULT_VCTERM -+# define DEFAULT_VCTERM "linux" -+# endif -+# ifndef DEFAULT_STERM -+# define DEFAULT_STERM "vt100" -+# endif - #else - # ifndef DEFAULT_VCTERM - # define DEFAULT_VCTERM "vt100" --- -2.38.1 - From a7ade7ad2361c8dcbbbdc58c9f04f91763e40a8b Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Sun, 20 Nov 2022 17:40:19 -0600 Subject: [PATCH 062/368] Added dependency installation helper script --- tools/deps/deps.sh | 40 ++++++++++++++++++++++++++++++++++++++++ tools/deps/deps_darwin | 41 +++++++++++++++++++++++++++++++++++++++++ tools/deps/deps_linux | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100755 tools/deps/deps.sh create mode 100644 tools/deps/deps_darwin create mode 100644 tools/deps/deps_linux diff --git a/tools/deps/deps.sh b/tools/deps/deps.sh new file mode 100755 index 00000000000..330d789e729 --- /dev/null +++ b/tools/deps/deps.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +# deps.sh +# dependency installer script +# +# note: should be replaced as part of build system rework + +PREFIX='deps.sh>' +PLATFORM='unknown' +PKGMAN='unknown' +if [[ "$(uname)" == 'Linux' ]]; then +# TODO: only supports arch-based distros at the moment +PLATFORM='linux' +PKGMAN='pacman -S' +elif [[ "$(uname)" == 'Darwin' ]]; then +PLATFORM='darwin' +PKGMAN='brew install' +else + echo "$PREFIX unsupported OS" + # TODO: support more operating systems +fi + +DEPSDIR='.' +DEPSFILE="$DEPSDIR/deps_$PLATFORM" + +echo "$PREFIX \`$PLATFORM\` system detected" +echo "$PREFIX installing packages from \`$DEPSFILE\` with \`$PKGMAN\`..." + +while read -r line; do + # DEPSFILE comments are made with `#` + pkg=$(echo -n -e $line) + if [[ "$pkg" != *"#"* ]]; then + echo -n "installing $pkg... " + # TODO: handle potential errors in installation commands + $PKGMAN $pkg &>/dev/null + echo "done" + fi +done <$DEPSFILE + +echo "$PREFIX completed" diff --git a/tools/deps/deps_darwin b/tools/deps/deps_darwin new file mode 100644 index 00000000000..3bb3a940a75 --- /dev/null +++ b/tools/deps/deps_darwin @@ -0,0 +1,41 @@ +bash +coreutils +make +gzip +binutils +gcc +git +subversion +mercurial +curl +wget +xz +nasm +mtools +meson +perl +m4 +texinfo +groff +gettext +expat +bison +flex +help2man +openssl +gperf +rsync +libxslt +python +xcb-proto +xorriso +boost +cmake +# +# +# DEPENDENCIES BELOW ARE NOT IN Homebrew REPOS +# +# patch PREINSTALLED ON darwin/macOS +# tar PREINSTALLED ON darwin/macOS +# python-pip TODO: ALTERNATIVE INSTALL +# python-mako TODO: ALTERNATIVE INSTALL diff --git a/tools/deps/deps_linux b/tools/deps/deps_linux new file mode 100644 index 00000000000..4057d00fd2f --- /dev/null +++ b/tools/deps/deps_linux @@ -0,0 +1,40 @@ +bash +coreutils +make +patch +tar +gzip +binutils +gcc +git +subversion +mercurial +curl +wget +xz +nasm +mtools +meson +perl +m4 +texinfo +groff +gettext +expat +bison +flex +help2man +openssl +gperf +rsync +libxslt +python +python-pip +python-mako +xcb-proto +xorriso +boost-libs +cmake +# +# TODO: THIS DEPENDENCY SCRIPT CURRENTLY ONLY SUPPORTS ARCH UNDER LINUX! + From 3becf05be4eefa8aba982cd14eb97cfee3c4c6eb Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Sun, 20 Nov 2022 17:48:39 -0600 Subject: [PATCH 063/368] Document dependency helper script --- README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d0f577b38bb..98e0c7cc7e7 100644 --- a/README.md +++ b/README.md @@ -47,14 +47,18 @@ Aero. If you are using windows, its highly recommended to use WSL 2. Before building Aero, you need the following things installed: - `rust` (should be the **latest nightly**) -- `qemu` (optional: required if you want to run it in the Qemu emulator) - `nasm` +- `qemu` (optional: required if you want to run it in the Qemu emulator) -If you are building Aero with sysroot then the following dependencies are additionally required: +If you are building Aero with sysroot, run the following helper script to install additional dependencies. ```sh -# Arch Linux: -sudo pacman -S bash coreutils make patch tar gzip binutils gcc git subversion mercurial curl wget xz nasm mtools meson perl m4 texinfo groff gettext expat bison flex help2man openssl gperf rsync libxslt python python-pip python-mako xcb-proto xorriso boost-libs cmake +./tools/deps.sh ``` +Note: If your host operating system is not in the list below, you will need to determine the dependency packages' names for your package manager. +- Arch Linux (pacman) +- Arch Linux-based (pacman) +- macOS (Homebrew) + ## Hardware From ff044fb4f5ade9c14753b6d50667a9727e751e0f Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Sun, 20 Nov 2022 17:50:02 -0600 Subject: [PATCH 064/368] Document dependency helper script continued --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 98e0c7cc7e7..c312dcc67b2 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ If you are building Aero with sysroot, run the following helper script to instal ```sh ./tools/deps.sh ``` -Note: If your host operating system is not in the list below, you will need to determine the dependency packages' names for your package manager. +Note: If your host operating system is not in the list below, you will need to determine the dependency packages' names for your package manager (contributions to this tool are welcome!) - Arch Linux (pacman) - Arch Linux-based (pacman) - macOS (Homebrew) From 8c032f9bd4035a7a78b1989e6233109c79adff1a Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Mon, 21 Nov 2022 01:33:09 -0600 Subject: [PATCH 065/368] Update dependency script location to match docs --- tools/{deps => }/deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tools/{deps => }/deps.sh (97%) diff --git a/tools/deps/deps.sh b/tools/deps.sh similarity index 97% rename from tools/deps/deps.sh rename to tools/deps.sh index 330d789e729..55f2af401d3 100755 --- a/tools/deps/deps.sh +++ b/tools/deps.sh @@ -20,7 +20,7 @@ else # TODO: support more operating systems fi -DEPSDIR='.' +DEPSDIR='./tools/deps' DEPSFILE="$DEPSDIR/deps_$PLATFORM" echo "$PREFIX \`$PLATFORM\` system detected" From e588c5ae8e0e6e1866fe618e0ce4acb3788e0867 Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Mon, 21 Nov 2022 18:21:05 -0600 Subject: [PATCH 066/368] Fix relative path to DEPSFILEs --- tools/deps.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/deps.sh b/tools/deps.sh index 55f2af401d3..67515ab13e5 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -4,7 +4,6 @@ # dependency installer script # # note: should be replaced as part of build system rework - PREFIX='deps.sh>' PLATFORM='unknown' PKGMAN='unknown' @@ -20,7 +19,8 @@ else # TODO: support more operating systems fi -DEPSDIR='./tools/deps' +PARENTDIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +DEPSDIR="$PARENTDIR/deps" DEPSFILE="$DEPSDIR/deps_$PLATFORM" echo "$PREFIX \`$PLATFORM\` system detected" From 007c3820cd3cf0cdc54d8d81fd9060a055d13ace Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Wed, 30 Nov 2022 01:02:38 -0600 Subject: [PATCH 067/368] Fix pending issues, set verbose-by-default to pass warnings/errors to user --- tools/deps.sh | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/tools/deps.sh b/tools/deps.sh index 67515ab13e5..3605323032a 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -4,16 +4,36 @@ # dependency installer script # # note: should be replaced as part of build system rework + PREFIX='deps.sh>' + +# setuid binary detection - supports 'sudo' and 'opendoas' +SUID_BINARY='unknown' +if command -v sudo; then + SUID_BINARY=$(which sudo) +else + echo "$PREFIX sudo not found, attempting to use opendoas" + SUID_BINARY=$(which doas) +fi + +# platform/os detection - supports macOS and arch-based distros PLATFORM='unknown' PKGMAN='unknown' +PKGPREFIX='' +PKGINSTALL='' +PKGQUERY='' if [[ "$(uname)" == 'Linux' ]]; then # TODO: only supports arch-based distros at the moment PLATFORM='linux' -PKGMAN='pacman -S' +PKGMAN="pacman" +PKGPREFIX="yes | $SUID_BINARY" +PKGINSTALL="-S" +PKGQUERY="-Q" elif [[ "$(uname)" == 'Darwin' ]]; then PLATFORM='darwin' -PKGMAN='brew install' +PKGMAN='brew' +PKGINSTALL='install' +PKGQUERY='list' else echo "$PREFIX unsupported OS" # TODO: support more operating systems @@ -32,8 +52,17 @@ while read -r line; do if [[ "$pkg" != *"#"* ]]; then echo -n "installing $pkg... " # TODO: handle potential errors in installation commands - $PKGMAN $pkg &>/dev/null - echo "done" + if [[ "$SILENT" == "true" ]]; then + $PKGPREFIX $PKGMAN $PKGINSTALL $pkg &>/dev/null + else + $PKGPREFIX $PKGMAN $PKGINSTALL $pkg + fi + + if grep -q "$pkg" <<< "$($PKGMAN $PKGQUERY)"; then + echo done + else + echo "FAILED" + fi fi done <$DEPSFILE From c576b22daa327c7a9e04442d496186d45ca7e8c3 Mon Sep 17 00:00:00 2001 From: amada <105397288+amada95@users.noreply.github.com> Date: Wed, 30 Nov 2022 01:04:15 -0600 Subject: [PATCH 068/368] Document changes to tools/deps.sh --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index c312dcc67b2..9d7614c522e 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,12 @@ If you are building Aero with sysroot, run the following helper script to instal ```sh ./tools/deps.sh ``` +You can optionally set the environment variable `SILENT` to `true`, which will silence the output of your package manager, +ignoring errors and warnings. +```sh +SILENT=true ./tools/deps.sh +``` + Note: If your host operating system is not in the list below, you will need to determine the dependency packages' names for your package manager (contributions to this tool are welcome!) - Arch Linux (pacman) - Arch Linux-based (pacman) From 6c05c9b77d74058cde34d858e9598573be815c38 Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Wed, 30 Nov 2022 01:07:16 -0600 Subject: [PATCH 069/368] Change default to silent, not verbose --- tools/deps.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/deps.sh b/tools/deps.sh index 3605323032a..14ade2d07cb 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -52,10 +52,10 @@ while read -r line; do if [[ "$pkg" != *"#"* ]]; then echo -n "installing $pkg... " # TODO: handle potential errors in installation commands - if [[ "$SILENT" == "true" ]]; then - $PKGPREFIX $PKGMAN $PKGINSTALL $pkg &>/dev/null - else + if [[ "$VERBOSE" == "true" ]]; then $PKGPREFIX $PKGMAN $PKGINSTALL $pkg + else + $PKGPREFIX $PKGMAN $PKGINSTALL $pkg &>/dev/null fi if grep -q "$pkg" <<< "$($PKGMAN $PKGQUERY)"; then From 6507b80a43eadad73b82a891bf9270127d3c72aa Mon Sep 17 00:00:00 2001 From: amada <105397288+amada95@users.noreply.github.com> Date: Wed, 30 Nov 2022 01:08:29 -0600 Subject: [PATCH 070/368] Update documentation for tools/deps.sh --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9d7614c522e..4c352cb39e1 100644 --- a/README.md +++ b/README.md @@ -54,10 +54,9 @@ If you are building Aero with sysroot, run the following helper script to instal ```sh ./tools/deps.sh ``` -You can optionally set the environment variable `SILENT` to `true`, which will silence the output of your package manager, -ignoring errors and warnings. +You can optionally set the environment variable `VERBOSE` to `true`, which will pass through the output of your package manager for troubleshooting. ```sh -SILENT=true ./tools/deps.sh +VERBOSE=true ./tools/deps.sh ``` Note: If your host operating system is not in the list below, you will need to determine the dependency packages' names for your package manager (contributions to this tool are welcome!) From 3745cfc4c819458e90d5e17918d9bbb87e100c51 Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Wed, 30 Nov 2022 01:14:45 -0600 Subject: [PATCH 071/368] Fix no-confirmation for pacman --- tools/deps.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/deps.sh b/tools/deps.sh index 14ade2d07cb..28dc4a65680 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -26,8 +26,8 @@ if [[ "$(uname)" == 'Linux' ]]; then # TODO: only supports arch-based distros at the moment PLATFORM='linux' PKGMAN="pacman" -PKGPREFIX="yes | $SUID_BINARY" -PKGINSTALL="-S" +PKGPREFIX="$SUID_BINARY" +PKGINSTALL="-S --noconfirm" PKGQUERY="-Q" elif [[ "$(uname)" == 'Darwin' ]]; then PLATFORM='darwin' From 983ed500ae99517fedbdc6d7cf1976d1de9ad539 Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Wed, 30 Nov 2022 01:27:59 -0600 Subject: [PATCH 072/368] Do setuid executable detection after platform detection --- tools/deps.sh | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tools/deps.sh b/tools/deps.sh index 28dc4a65680..80626eb0866 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -7,15 +7,6 @@ PREFIX='deps.sh>' -# setuid binary detection - supports 'sudo' and 'opendoas' -SUID_BINARY='unknown' -if command -v sudo; then - SUID_BINARY=$(which sudo) -else - echo "$PREFIX sudo not found, attempting to use opendoas" - SUID_BINARY=$(which doas) -fi - # platform/os detection - supports macOS and arch-based distros PLATFORM='unknown' PKGMAN='unknown' @@ -39,6 +30,16 @@ else # TODO: support more operating systems fi +# setuid binary detection - supports 'sudo' and 'opendoas' +SUID_BINARY='unknown' +if command -v sudo; then + SUID_BINARY=$(which sudo) +else + echo "$PREFIX sudo not found, attempting to use opendoas" + SUID_BINARY=$(which doas) +fi + + PARENTDIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) DEPSDIR="$PARENTDIR/deps" DEPSFILE="$DEPSDIR/deps_$PLATFORM" From 60ff6c419959b23c8fab2113adf5e7dad8b1b54c Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Wed, 30 Nov 2022 12:58:38 -0600 Subject: [PATCH 073/368] Exit on first error --- tools/deps.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/deps.sh b/tools/deps.sh index 80626eb0866..5d6d4685077 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -5,6 +5,8 @@ # # note: should be replaced as part of build system rework +set -e + PREFIX='deps.sh>' # platform/os detection - supports macOS and arch-based distros From fc38bbd07ba8e75e48ab38fef2bac62ac9dda2d6 Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Wed, 30 Nov 2022 12:59:19 -0600 Subject: [PATCH 074/368] xorriso -> libisoburn --- tools/deps/deps_linux | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/deps/deps_linux b/tools/deps/deps_linux index 4057d00fd2f..d1ca76b0635 100644 --- a/tools/deps/deps_linux +++ b/tools/deps/deps_linux @@ -32,7 +32,7 @@ python python-pip python-mako xcb-proto -xorriso +libisoburn boost-libs cmake # From 2e8ad4de4cf4afbba4c6379767be750e13446af5 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 2 Dec 2022 16:09:57 +1100 Subject: [PATCH 075/368] deps.sh: minor fixes add colour aswell Signed-off-by: Andy-Python-Programmer --- tools/deps.sh | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/tools/deps.sh b/tools/deps.sh index 5d6d4685077..60f15afe3b5 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -7,6 +7,13 @@ set -e +RED='\033[1;31m' +GREEN='\033[1;32m' +NC='\033[0m' # no colour + +function log_info() { echo -e "$PREFIX ${GREEN}info${NC}: $1"; } +function log_error() { echo -e "$PREFIX ${RED}error${NC}: $1"; } + PREFIX='deps.sh>' # platform/os detection - supports macOS and arch-based distros @@ -32,27 +39,22 @@ else # TODO: support more operating systems fi -# setuid binary detection - supports 'sudo' and 'opendoas' -SUID_BINARY='unknown' -if command -v sudo; then - SUID_BINARY=$(which sudo) -else - echo "$PREFIX sudo not found, attempting to use opendoas" - SUID_BINARY=$(which doas) -fi - - PARENTDIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) DEPSDIR="$PARENTDIR/deps" DEPSFILE="$DEPSDIR/deps_$PLATFORM" -echo "$PREFIX \`$PLATFORM\` system detected" -echo "$PREFIX installing packages from \`$DEPSFILE\` with \`$PKGMAN\`..." +log_info "\`$PLATFORM\` system detected" +log_info "installing packages from \`$DEPSFILE\` with \`$PKGMAN\`..." + +if [ "$EUID" -ne 0 ]; then + log_error "please run as root" + exit +fi while read -r line; do # DEPSFILE comments are made with `#` pkg=$(echo -n -e $line) - if [[ "$pkg" != *"#"* ]]; then + if [[ "$pkg" != *"#"* && -n "$pkg" ]]; then echo -n "installing $pkg... " # TODO: handle potential errors in installation commands if [[ "$VERBOSE" == "true" ]]; then @@ -62,11 +64,11 @@ while read -r line; do fi if grep -q "$pkg" <<< "$($PKGMAN $PKGQUERY)"; then - echo done + echo -e "${GREEN}ok${NC}" else - echo "FAILED" + echo -e "${RED}FAILED${NC}" fi fi done <$DEPSFILE -echo "$PREFIX completed" +log_info "$PREFIX completed" From 912afdc504c1b92100ba08af74a929a89ed98b71 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 2 Dec 2022 16:57:30 +1100 Subject: [PATCH 076/368] readme: add a note to indicate that deps.sh requires root perms Signed-off-by: Andy-Python-Programmer --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4c352cb39e1..914cfb84433 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ Before building Aero, you need the following things installed: If you are building Aero with sysroot, run the following helper script to install additional dependencies. ```sh +# make sure to run the script with root privileges! ./tools/deps.sh ``` You can optionally set the environment variable `VERBOSE` to `true`, which will pass through the output of your package manager for troubleshooting. From c1e41f621613f78f8ad70847851fbcb641fcfbe8 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 2 Dec 2022 18:46:14 +1100 Subject: [PATCH 077/368] deps.sh: work on ubuntu Signed-off-by: Andy-Python-Programmer --- tools/deps.sh | 55 ++++++----------- tools/deps/deps_darwin | 81 ++++++++++++++----------- tools/deps/deps_linux | 134 +++++++++++++++++++++++++++++------------ 3 files changed, 159 insertions(+), 111 deletions(-) mode change 100644 => 100755 tools/deps/deps_linux diff --git a/tools/deps.sh b/tools/deps.sh index 60f15afe3b5..4bff2e2c2d8 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -16,32 +16,18 @@ function log_error() { echo -e "$PREFIX ${RED}error${NC}: $1"; } PREFIX='deps.sh>' -# platform/os detection - supports macOS and arch-based distros -PLATFORM='unknown' PKGMAN='unknown' PKGPREFIX='' PKGINSTALL='' PKGQUERY='' -if [[ "$(uname)" == 'Linux' ]]; then -# TODO: only supports arch-based distros at the moment -PLATFORM='linux' -PKGMAN="pacman" -PKGPREFIX="$SUID_BINARY" -PKGINSTALL="-S --noconfirm" -PKGQUERY="-Q" -elif [[ "$(uname)" == 'Darwin' ]]; then -PLATFORM='darwin' -PKGMAN='brew' -PKGINSTALL='install' -PKGQUERY='list' -else - echo "$PREFIX unsupported OS" - # TODO: support more operating systems -fi PARENTDIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) + +PLATFORM=$(uname) DEPSDIR="$PARENTDIR/deps" -DEPSFILE="$DEPSDIR/deps_$PLATFORM" +DEPSFILE="$DEPSDIR/deps_${PLATFORM,,}" + +. $DEPSFILE log_info "\`$PLATFORM\` system detected" log_info "installing packages from \`$DEPSFILE\` with \`$PKGMAN\`..." @@ -51,24 +37,21 @@ if [ "$EUID" -ne 0 ]; then exit fi -while read -r line; do - # DEPSFILE comments are made with `#` - pkg=$(echo -n -e $line) - if [[ "$pkg" != *"#"* && -n "$pkg" ]]; then - echo -n "installing $pkg... " - # TODO: handle potential errors in installation commands - if [[ "$VERBOSE" == "true" ]]; then - $PKGPREFIX $PKGMAN $PKGINSTALL $pkg - else - $PKGPREFIX $PKGMAN $PKGINSTALL $pkg &>/dev/null - fi +for pkg in "${packages[@]}"; do + echo -n "installing $pkg... " + + # TODO: handle potential errors in installation commands + if [[ "$VERBOSE" == "true" ]]; then + install_package $pkg + else + install_package $pkg &>/dev/null + fi - if grep -q "$pkg" <<< "$($PKGMAN $PKGQUERY)"; then - echo -e "${GREEN}ok${NC}" - else - echo -e "${RED}FAILED${NC}" - fi + if query_package $pkg; then + echo -e "${GREEN}ok${NC}" + else + echo -e "${RED}FAILED${NC}" fi -done <$DEPSFILE +done log_info "$PREFIX completed" diff --git a/tools/deps/deps_darwin b/tools/deps/deps_darwin index 3bb3a940a75..2bb951cad24 100644 --- a/tools/deps/deps_darwin +++ b/tools/deps/deps_darwin @@ -1,41 +1,50 @@ -bash -coreutils -make -gzip -binutils -gcc -git -subversion -mercurial -curl -wget -xz -nasm -mtools -meson -perl -m4 -texinfo -groff -gettext -expat -bison -flex -help2man -openssl -gperf -rsync -libxslt -python -xcb-proto -xorriso -boost -cmake +#!/usr/bin/bash + +PKGMAN='brew' + # # # DEPENDENCIES BELOW ARE NOT IN Homebrew REPOS # # patch PREINSTALLED ON darwin/macOS -# tar PREINSTALLED ON darwin/macOS -# python-pip TODO: ALTERNATIVE INSTALL -# python-mako TODO: ALTERNATIVE INSTALL +# tar PREINSTALLED ON darwin/macOS +# python-pip TODO: ALTERNATIVE INSTALL +# python-mako TODO: ALTERNATIVE INSTALL +packages=( + "bash" + "coreutils" + "make" + "gzip" + "binutils" + "gcc" + "git" + "subversion" + "mercurial" + "curl" + "wget" + "xz" + "nasm" + "mtools" + "meson" + "perl" + "m4" + "texinfo" + "groff" + "gettext" + "expat" + "bison" + "flex" + "help2man" + "openssl" + "gperf" + "rsync" + "libxslt" + "python" + "xcb-proto" + "xorriso" + "boost" + "cmake" +) + +function install_package() { brew install $1; } +function query_package() { brew list | grep -q $1; } diff --git a/tools/deps/deps_linux b/tools/deps/deps_linux old mode 100644 new mode 100755 index d1ca76b0635..891b3c316c2 --- a/tools/deps/deps_linux +++ b/tools/deps/deps_linux @@ -1,40 +1,96 @@ -bash -coreutils -make -patch -tar -gzip -binutils -gcc -git -subversion -mercurial -curl -wget -xz -nasm -mtools -meson -perl -m4 -texinfo -groff -gettext -expat -bison -flex -help2man -openssl -gperf -rsync -libxslt -python -python-pip -python-mako -xcb-proto -libisoburn -boost-libs -cmake -# -# TODO: THIS DEPENDENCY SCRIPT CURRENTLY ONLY SUPPORTS ARCH UNDER LINUX! +#!/usr/bin/bash +# We are going to use /etc/os-release to identify which +# Linux distribution we are currently running. +. /etc/os-release + +if [[ $ID_LIKE == "debian" ]]; then +PKGMAN="apt" + +packages=( + "bash" + "coreutils" + "make" + "patch" + "tar" + "gzip" + "binutils" + "gcc" + "git" + "subversion" + "mercurial" + "curl" + "wget" + "xz-utils" + "nasm" + "mtools" + "meson" + "perl" + "m4" + "texinfo" + "groff" + "gettext" + "expat" + "bison" + "flex" + "help2man" + "openssl" + "gperf" + "rsync" + "xsltproc" + "python3" + "python3-pip" + "python3-mako" + "xcb-proto" + "xorriso" + "cmake" +) + +function install_package() { apt-get install -y $1; } +function query_package() { dpkg -l | grep -q $1; } +elif [[ $ID == "arch" ]]; then # if [[ $ID_LIKE == "debian" ]]; then +PKGMAN="pacman" + +packages=( + "bash" + "coreutils" + "make" + "patch" + "tar" + "gzip" + "binutils" + "gcc" + "git" + "subversion" + "mercurial" + "curl" + "wget" + "xz" + "nasm" + "mtools" + "meson" + "perl" + "m4" + "texinfo" + "groff" + "gettext" + "expat" + "bison" + "flex" + "help2man" + "openssl" + "gperf" + "rsync" + "libxslt" + "python" + "python-pip" + "python-mako" + "xcb-proto" + "libisoburn" + "boost-libs" + "cmake" +) + +function install_package() { pacman -S $1 --noconfirm; } +function query_package() { pacman -Q | grep -q $1; } +fi # elif [[ $ID == "arch" ]]; then From 60a3965570a7c295f012094979398eea8a830aa3 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 2 Dec 2022 18:47:49 +1100 Subject: [PATCH 078/368] ci: run deps.sh Signed-off-by: Andy-Python-Programmer --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d0b91c27727..4191e7779ad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,6 +24,7 @@ jobs: sudo apt-get update sudo apt-get install -y nasm meson ninja-build python3 -m pip install requests xbstrap + sudo ./tools/deps.sh - name: Build the kernel and userland run: ./aero.py --no-run - name: Build kernel documentation From 8d68527cd662087de048498832b87fba907dc3e2 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 2 Dec 2022 19:33:17 +1100 Subject: [PATCH 079/368] bootstrap: ncurses Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 42 +++++++++++++++++++++++++++++++++++ patches/ncurses/ncurses.patch | 41 ++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 patches/ncurses/ncurses.patch diff --git a/bootstrap.yml b/bootstrap.yml index 1264e025fbe..7353d8657f0 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -919,6 +919,48 @@ packages: # Default to UTC for localtime, this should be fixed, but that is pending xbstrap support. - args: ['ln', '-sf', '/usr/share/zoneinfo/UTC', '@THIS_COLLECT_DIR@/etc/localtime'] + - name: ncurses + source: + subdir: 'bundled' + git: 'https://github.com/ThomasDickey/ncurses-snapshots.git' + tag: 'v6_2' + version: '6.2' + tools_required: + - host-gcc + - host-pkg-config + pkgs_required: + - mlibc + revision: 4 + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--without-ada' + - '--enable-pc-files' + - '--with-shared' + - '--without-normal' + - '--with-manpage-format=normal' + - '--with-pkg-config-libdir=/usr/lib/pkgconfig' + - '--with-termlib' + - '--enable-widec' + - '--disable-stripping' + environ: + cf_cv_func_nanosleep: 'yes' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] + # As we build ncurses with wide character support, make some compatibility links + - args: | + for lib in ncurses form panel menu tinfo ; do + rm -vf @THIS_COLLECT_DIR@/usr/lib/lib${lib}.so + echo "INPUT(-l${lib}w)" > @THIS_COLLECT_DIR@/usr/lib/lib${lib}.so + ln -sfv ${lib}w.pc @THIS_COLLECT_DIR@/usr/lib/pkgconfig/${lib}.pc + done + rm -vf @THIS_COLLECT_DIR@/usr/lib/libcursesw.so + echo "INPUT(-lncursesw)" > @THIS_COLLECT_DIR@/usr/lib/libcursesw.so + ln -sfv libncurses.so @THIS_COLLECT_DIR@/usr/lib/libcurses.so + - name: gcc from_source: gcc revision: 2 diff --git a/patches/ncurses/ncurses.patch b/patches/ncurses/ncurses.patch new file mode 100644 index 00000000000..daf6ac0a94a --- /dev/null +++ b/patches/ncurses/ncurses.patch @@ -0,0 +1,41 @@ +From 4d53b6fbd2a90d69c153933c413ecf5a0598518a Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Fri, 2 Dec 2022 19:15:20 +1100 +Subject: [PATCH] + +--- + config.sub | 2 +- + configure | 4 ++++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/config.sub b/config.sub +index 0f2234c..0cf7603 100755 +--- a/config.sub ++++ b/config.sub +@@ -1366,7 +1366,7 @@ case $os in + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ +- | nsk* | powerunix) ++ | nsk* | powerunix | aero*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + qnx*) +diff --git a/configure b/configure +index 06f344f..a008d88 100755 +--- a/configure ++++ b/configure +@@ -5961,6 +5961,10 @@ echo "${ECHO_T}$cf_cv_ldflags_search_paths_first" >&6 + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@' + ;; ++ (aero*) ++ CC_SHARED_OPTS='-fPIC' ++ MK_SHARED_LIB='${CC} -shared -o $@' ++ ;; + (mingw*) + cf_cv_shlib_version=mingw + cf_cv_shlib_version_infix=mingw +-- +2.38.1 + From b1d84355d6b538433c9d31880264f2e62066be21 Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Sat, 3 Dec 2022 01:05:25 -0600 Subject: [PATCH 080/368] Fix root check on Darwin systems --- tools/deps.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/deps.sh b/tools/deps.sh index 4bff2e2c2d8..7b42eae6faa 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -32,7 +32,7 @@ DEPSFILE="$DEPSDIR/deps_${PLATFORM,,}" log_info "\`$PLATFORM\` system detected" log_info "installing packages from \`$DEPSFILE\` with \`$PKGMAN\`..." -if [ "$EUID" -ne 0 ]; then +if [[ !("$PLATFORM" == "Darwin") && ("$EUID" -ne 0) ]]; then log_error "please run as root" exit fi @@ -44,7 +44,7 @@ for pkg in "${packages[@]}"; do if [[ "$VERBOSE" == "true" ]]; then install_package $pkg else - install_package $pkg &>/dev/null + install_package $pkg &>/dev/null fi if query_package $pkg; then From 55889e4d126efe29c6dc8d0f94608165066c0b02 Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Sat, 3 Dec 2022 01:07:49 -0600 Subject: [PATCH 081/368] Fix SIGPIPE on package query for macOS brew --- tools/deps/deps_darwin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/deps/deps_darwin b/tools/deps/deps_darwin index 2bb951cad24..377e01509ea 100644 --- a/tools/deps/deps_darwin +++ b/tools/deps/deps_darwin @@ -47,4 +47,4 @@ packages=( ) function install_package() { brew install $1; } -function query_package() { brew list | grep -q $1; } +function query_package() { brew list | { grep -q $1; cat > /dev/null;} } From 16ef5cbcce9da8a0bc5c9fae139042d16072efca Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Sat, 3 Dec 2022 01:09:44 -0600 Subject: [PATCH 082/368] Remove duplicate prefix for completion message --- tools/deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/deps.sh b/tools/deps.sh index 7b42eae6faa..4d28af02a07 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -54,4 +54,4 @@ for pkg in "${packages[@]}"; do fi done -log_info "$PREFIX completed" +log_info "completed" From eea76949e0e5bfaec8c71efe57ff5f41ca359cd1 Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Sat, 3 Dec 2022 01:33:59 -0600 Subject: [PATCH 083/368] How did that get there? :P --- tools/deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/deps.sh b/tools/deps.sh index 4d28af02a07..ce93b7e7367 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -44,7 +44,7 @@ for pkg in "${packages[@]}"; do if [[ "$VERBOSE" == "true" ]]; then install_package $pkg else - install_package $pkg &>/dev/null + install_package $pkg &>/dev/null fi if query_package $pkg; then From 7164c094de3a034588f0b322559d327e09a5c32f Mon Sep 17 00:00:00 2001 From: Amada Mackey <105397288+amada95@users.noreply.github.com> Date: Sat, 3 Dec 2022 02:15:02 -0600 Subject: [PATCH 084/368] Preserve result of package search after SIGPIPE redirect --- tools/deps.sh | 2 +- tools/deps/deps_darwin | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/deps.sh b/tools/deps.sh index ce93b7e7367..579f3c81535 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -46,7 +46,7 @@ for pkg in "${packages[@]}"; do else install_package $pkg &>/dev/null fi - + if query_package $pkg; then echo -e "${GREEN}ok${NC}" else diff --git a/tools/deps/deps_darwin b/tools/deps/deps_darwin index 377e01509ea..f424eb39f09 100644 --- a/tools/deps/deps_darwin +++ b/tools/deps/deps_darwin @@ -47,4 +47,10 @@ packages=( ) function install_package() { brew install $1; } -function query_package() { brew list | { grep -q $1; cat > /dev/null;} } +function query_package() { + brew list | { + RESULT=$(grep -q $1); + cat > /dev/null; + return $RESULT; + } +} From bfc20184e29569e2ba532ee2cf5a63396d4cb2df Mon Sep 17 00:00:00 2001 From: amada <105397288+amada95@users.noreply.github.com> Date: Sat, 3 Dec 2022 02:51:17 -0600 Subject: [PATCH 085/368] Remove whitespace --- tools/deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/deps.sh b/tools/deps.sh index 579f3c81535..ce93b7e7367 100755 --- a/tools/deps.sh +++ b/tools/deps.sh @@ -46,7 +46,7 @@ for pkg in "${packages[@]}"; do else install_package $pkg &>/dev/null fi - + if query_package $pkg; then echo -e "${GREEN}ok${NC}" else From 5c31d40f560a24ab1865ae61527e00d0a350c718 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 7 Dec 2022 18:02:30 +1100 Subject: [PATCH 086/368] readme: update supported systems for deps.sh Signed-off-by: Andy-Python-Programmer --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 914cfb84433..c8deb5f4afd 100644 --- a/README.md +++ b/README.md @@ -61,9 +61,9 @@ VERBOSE=true ./tools/deps.sh ``` Note: If your host operating system is not in the list below, you will need to determine the dependency packages' names for your package manager (contributions to this tool are welcome!) -- Arch Linux (pacman) -- Arch Linux-based (pacman) -- macOS (Homebrew) +- Arch Linux/based (pacman) +- Debian Linux/based (apt) +- macOS (homebrew) ## Hardware From 757bc7a8b4b3e624845b9c1a8da5f3f70ec875bd Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 7 Dec 2022 19:18:29 +1100 Subject: [PATCH 087/368] kernel: fix build warnings Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/block/mod.rs | 6 +---- src/aero_kernel/src/modules.rs | 2 +- src/aero_kernel/src/syscall/fs.rs | 1 - src/aero_kernel/src/utils/linker.rs | 37 ----------------------------- src/aero_kernel/src/utils/mod.rs | 1 - 5 files changed, 2 insertions(+), 45 deletions(-) delete mode 100644 src/aero_kernel/src/utils/linker.rs diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 31178d6e1f4..f7915d106ed 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -260,8 +260,6 @@ impl Device for BlockDevice { } struct PartitionBlockDevice { - sref: Weak, - offset: usize, // offset in sectors size: usize, // capacity in sectors device: Arc, @@ -269,9 +267,7 @@ struct PartitionBlockDevice { impl PartitionBlockDevice { fn new(offset: usize, size: usize, device: Arc) -> Arc { - Arc::new_cyclic(|sref| Self { - sref: sref.clone(), - + Arc::new(Self { offset, size, device, diff --git a/src/aero_kernel/src/modules.rs b/src/aero_kernel/src/modules.rs index d112fdce3b7..ed0a4535770 100644 --- a/src/aero_kernel/src/modules.rs +++ b/src/aero_kernel/src/modules.rs @@ -31,7 +31,7 @@ //! aero_kernel::module_exit!(hello_exit); //! ``` -use crate::{drivers, fs, utils::linker::LinkerSymbol}; +use crate::{drivers, fs}; /// Inner helper function to make sure the function provided to the [module_init] macro /// has a valid function signature. This function returns the passed module init function as diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 379d0ac3c09..8b818316934 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -21,7 +21,6 @@ use aero_syscall::signal::SigProcMask; use aero_syscall::{prelude::*, TimeSpec}; use aero_syscall::{OpenFlags, Stat, SyscallError}; -use crate::fs::cache::DirCacheImpl; use crate::fs::epoll::EPoll; use crate::fs::eventfd::EventFd; use crate::fs::file_table::DuplicateHint; diff --git a/src/aero_kernel/src/utils/linker.rs b/src/aero_kernel/src/utils/linker.rs deleted file mode 100644 index 7c97f98e5e5..00000000000 --- a/src/aero_kernel/src/utils/linker.rs +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ - -extern "C" { - pub type LinkerSymbol; -} - -impl LinkerSymbol { - #[inline] - pub fn as_ptr(&'static self) -> *const u8 { - self as *const Self as *const u8 - } - - #[inline] - pub fn as_usize(&'static self) -> usize { - self.as_ptr() as usize - } -} - -unsafe impl Sync for LinkerSymbol {} -unsafe impl Send for LinkerSymbol {} diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index f8d1679ce93..608fb10aafe 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -32,7 +32,6 @@ fn get_cpu_count() -> usize { pub mod bitmap; pub mod buffer; -pub mod linker; pub mod sync; pub fn validate_mut_ptr(ptr: *mut T) -> Option<&'static mut T> { From b172050bfe733ea016d4719b407f1b3e2d4179a8 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 10 Dec 2022 16:56:35 +1100 Subject: [PATCH 088/368] kernel: update Cargo.lock fixes the crash caused by a bug in the limine crate Signed-off-by: Andy-Python-Programmer --- src/Cargo.lock | 142 ++++++++++++++++++++++++------------------------- 1 file changed, 69 insertions(+), 73 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index 529227c86c9..ccd9906b8d0 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -67,9 +67,9 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bit_field" @@ -85,15 +85,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bytemuck" -version = "1.12.1" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" +checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f" [[package]] name = "cc" -version = "1.0.73" +version = "1.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" [[package]] name = "cfg-if" @@ -111,9 +111,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.1" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if", "crossbeam-utils", @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -132,38 +132,37 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.5" +version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" dependencies = [ + "autocfg", "cfg-if", "crossbeam-utils", - "lazy_static", - "memoffset 0.6.4", + "memoffset 0.7.1", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.8" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ "cfg-if", - "lazy_static", ] [[package]] name = "either" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", "libc", @@ -190,18 +189,18 @@ dependencies = [ [[package]] name = "intrusive-collections" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb4ed164b4cf1c6bd6e18c097490331a0e58fbb0f39e8f6b5ac7f168006511cd" +checksum = "bfe531a7789d7120f3e17d4f3f2cd95f54418ba7354f60b7b622b6644a07888a" dependencies = [ "memoffset 0.5.6", ] [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" [[package]] name = "lai" @@ -223,29 +222,29 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.107" +version = "0.2.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" +checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" [[package]] name = "limine" -version = "0.1.8" -source = "git+https://github.com/limine-bootloader/limine-rs#beb7a4c7c80ab934dcdc220eab131063556b27a0" +version = "0.1.9" +source = "git+https://github.com/limine-bootloader/limine-rs#83c7e72b82ced03f436f022138e7461cc4818a9d" [[package]] name = "log" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] [[package]] name = "lru" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936d98d2ddd79c18641c6709e7bb09981449694e402d1a0f0f657ea8d61f4a51" +checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" dependencies = [ "hashbrown", ] @@ -261,27 +260,27 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.6.4" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ "autocfg", ] [[package]] name = "nasm-rs" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dbff86bd2ee8cb407e8608e2c3504412a967c06286ef7e5cf7c1b9db756f0a9" +checksum = "ce095842aee9aa3ecbda7a5d2a4df680375fd128a8596b6b56f8e497e231f483" dependencies = [ "rayon", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" dependencies = [ "hermit-abi", "libc", @@ -289,9 +288,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.8.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "proc-macro-error" @@ -319,53 +318,50 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] [[package]] name = "raw-cpuid" -version = "10.2.0" +version = "10.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929f54e29691d4e6a9cc558479de70db7aa3d98cd6fe7ab86d7507aa2886b9d2" +checksum = "a6823ea29436221176fe662da99998ad3b4db2c7f31e7b6f5fe43adccd6320bb" dependencies = [ "bitflags", ] [[package]] name = "rayon" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" dependencies = [ - "autocfg", - "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.9.1" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" dependencies = [ "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "lazy_static", "num_cpus", ] @@ -377,9 +373,9 @@ checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" [[package]] name = "scopeguard" @@ -389,15 +385,15 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.133" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a" +checksum = "256b9932320c590e707b94576e3cc1f7c9024d0ee6612dfbcf1cb106cbe8e055" [[package]] name = "serde_json" -version = "1.0.74" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2bb9cd061c5865d345bb02ca49fcef1391741b672b54a0bf7b679badec3142" +checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" dependencies = [ "itoa", "ryu", @@ -424,13 +420,13 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "syn" -version = "1.0.91" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -438,10 +434,10 @@ name = "uapi" version = "0.1.0" [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-ident" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] name = "utf8parse" @@ -450,9 +446,9 @@ source = "git+https://github.com/Andy-Python-Programmer/vte#a9d8bf899d7f7a07ddfd [[package]] name = "version_check" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vte" @@ -475,9 +471,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "xmas-elf" @@ -490,6 +486,6 @@ dependencies = [ [[package]] name = "zero" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f1bc8a6b2005884962297587045002d8cfb8dcec9db332f4ca216ddc5de82c5" +checksum = "2fe21bcc34ca7fe6dd56cc2cb1261ea59d6b93620215aefb5ea6032265527784" From a3ce15fc67c6a7df3b89b075645176a3fe97e41c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 10 Dec 2022 19:20:44 +1100 Subject: [PATCH 089/368] boostrap::xinit: disable xauth Signed-off-by: Andy-Python-Programmer --- bootstrap/xorg.yml | 1 - patches/xorg-xinit/xorg-xinit.patch | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 patches/xorg-xinit/xorg-xinit.patch diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index f7c13f6c88d..67d31787c64 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -745,7 +745,6 @@ packages: - '--sysconfdir=/etc' - '--localstatedir=/var' - '--disable-static' - - '--without-xauth' build: - args: ['make', '-j@PARALLELISM@'] - args: ['make', 'install-strip'] diff --git a/patches/xorg-xinit/xorg-xinit.patch b/patches/xorg-xinit/xorg-xinit.patch new file mode 100644 index 00000000000..800ec95d404 --- /dev/null +++ b/patches/xorg-xinit/xorg-xinit.patch @@ -0,0 +1,25 @@ +From e071d54e12c9feaa8bfd19f52247d13d45e94ab2 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sat, 10 Dec 2022 19:17:27 +1100 +Subject: [PATCH] + +--- + startx.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/startx.cpp b/startx.cpp +index 1c6fce0..e42051c 100644 +--- a/startx.cpp ++++ b/startx.cpp +@@ -113,6 +113,8 @@ if defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read + defaultserverargs="$defaultserverargs -dpi `defaults read $X11_PREFS_DOMAIN dpi`" + fi + ++#elif defined(__aero__) ++enable_xauth=0 + #else + enable_xauth=1 + #endif +-- +2.38.1 + From fcd7ce3b11c3ca38ff4b2b1ce318d1b3d56cb951 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 14 Dec 2022 16:50:13 +1100 Subject: [PATCH 090/368] alacritty: fixes in the kernel to make it show a window :^) Signed-off-by: Andy-Python-Programmer --- bootstrap/xorg.yml | 72 ++++++++ patches/alacritty/alacritty.patch | 71 +++++++ patches/dwm/dwm.patch | 4 +- patches/mesa-utils/mesa-utils.patch | 29 +++ patches/mlibc/mlibc.patch | 254 +++++++++++++++++++++++--- patches/rust-glutin/rust-glutin.patch | 78 +++++--- src/aero_kernel/src/drivers/pty.rs | 13 ++ src/aero_kernel/src/fs/epoll.rs | 28 +-- src/aero_kernel/src/fs/eventfd.rs | 2 +- src/aero_kernel/src/fs/pipe.rs | 10 +- src/aero_kernel/src/socket/unix.rs | 16 ++ src/aero_kernel/src/syscall/fs.rs | 9 +- src/aero_kernel/src/syscall/mod.rs | 1 + src/aero_kernel/src/syscall/net.rs | 43 ++++- src/aero_syscall/src/consts.rs | 1 + src/aero_syscall/src/lib.rs | 1 + tools/cargo-inject-patches.py | 66 ++++--- userland/apps/init/src/main.rs | 5 +- userland/client.c | 36 ---- userland/memory_stress.c | 43 +++++ userland/server.c | 71 ------- 21 files changed, 649 insertions(+), 204 deletions(-) create mode 100644 patches/alacritty/alacritty.patch create mode 100644 patches/mesa-utils/mesa-utils.patch delete mode 100644 userland/client.c create mode 100644 userland/memory_stress.c delete mode 100644 userland/server.c diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index 67d31787c64..b5fe6c3d890 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -431,6 +431,78 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: glu + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/mesa/glu.git' + tag: 'glu-9.0.2' + version: '9.0.2' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['./autogen.sh'] + environ: + NOCONFIGURE: '1' + tools_required: + - host-gcc + pkgs_required: + - mlibc + - gcc # Actually requires libstdc++.so in the system root, otherwise it links against the host libstdc++.so.6 + - mesa + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-static' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: mesa-utils + source: + subdir: 'bundled' + git: 'https://github.com/freedesktop/mesa-demos' + branch: 'master' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + regenerate: + - args: ['./autogen.sh'] + environ: + 'NOCONFIGURE': 'yes' + tools_required: + - host-gcc + pkgs_required: + - mlibc + - mesa + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + - '--disable-static' + - '--disable-gles1' # Requires some linux header that we don't have + - '--disable-vg' + - '--disable-osmesa' + - '--disable-rbug' + - '--with-system-data-files' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + - name: mesa source: subdir: 'bundled' diff --git a/patches/alacritty/alacritty.patch b/patches/alacritty/alacritty.patch new file mode 100644 index 00000000000..3921b7fa3eb --- /dev/null +++ b/patches/alacritty/alacritty.patch @@ -0,0 +1,71 @@ +From b194e3d72903f677f2aacf9293706ff2027a413b Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 11 Dec 2022 18:43:18 +1100 +Subject: [PATCH] + +--- + alacritty/src/display/window.rs | 8 ++++---- + alacritty_terminal/src/tty/unix.rs | 17 +++++++++-------- + 2 files changed, 13 insertions(+), 12 deletions(-) + +diff --git a/alacritty/src/display/window.rs b/alacritty/src/display/window.rs +index ee2e74f..d75996b 100644 +--- a/alacritty/src/display/window.rs ++++ b/alacritty/src/display/window.rs +@@ -128,9 +128,9 @@ fn create_gl_window( + } + + let windowed_context = ContextBuilder::new() +- .with_srgb(srgb) +- .with_vsync(vsync) +- .with_hardware_acceleration(None) ++ // .with_srgb(srgb) ++ // .with_vsync(vsync) ++ // .with_hardware_acceleration(None) + .build_windowed(window, event_loop)?; + + // Make the context current so OpenGL operations can run. +@@ -292,7 +292,7 @@ impl Window { + let builder = WindowBuilder::new() + .with_title(&identity.title) + .with_visible(false) +- .with_transparent(true) ++ .with_transparent(false) + .with_decorations(window_config.decorations != Decorations::None) + .with_maximized(window_config.maximized()) + .with_fullscreen(window_config.fullscreen()); +diff --git a/alacritty_terminal/src/tty/unix.rs b/alacritty_terminal/src/tty/unix.rs +index 206dbe8..cb172ab 100644 +--- a/alacritty_terminal/src/tty/unix.rs ++++ b/alacritty_terminal/src/tty/unix.rs +@@ -90,18 +90,19 @@ fn get_pw_entry(buf: &mut [i8; 1024]) -> Passwd<'_> { + die!("getpwuid_r failed"); + } + +- if res.is_null() { +- die!("pw not found"); +- } ++ // if res.is_null() { ++ // die!("pw not found"); ++ // } + +- // Sanity check. +- assert_eq!(entry.pw_uid, uid); ++ // // Sanity check. ++ // assert_eq!(entry.pw_uid, uid); + + // Build a borrowed Passwd struct. ++ // FIXME(mlibc): Assertion '!"slab_pool corruption. Possible write to unallocated object"' failed! + Passwd { +- name: unsafe { CStr::from_ptr(entry.pw_name).to_str().unwrap() }, +- dir: unsafe { CStr::from_ptr(entry.pw_dir).to_str().unwrap() }, +- shell: unsafe { CStr::from_ptr(entry.pw_shell).to_str().unwrap() }, ++ name: "root", ++ dir: "/", ++ shell: "/usr/bin/bash", + } + } + +-- +2.38.1 + diff --git a/patches/dwm/dwm.patch b/patches/dwm/dwm.patch index 30c48c1f2e6..57ab04c41d5 100644 --- a/patches/dwm/dwm.patch +++ b/patches/dwm/dwm.patch @@ -1,6 +1,6 @@ -From c709d9f916f71104f658e1b8bba922dc66a3523e Mon Sep 17 00:00:00 2001 +From 003f47ada9dd8f0ec6deedebeba2b7bdcc15030f Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 13:43:15 +1100 +Date: Sun, 11 Dec 2022 19:36:22 +1100 Subject: [PATCH] --- diff --git a/patches/mesa-utils/mesa-utils.patch b/patches/mesa-utils/mesa-utils.patch new file mode 100644 index 00000000000..1fd9b0fbd26 --- /dev/null +++ b/patches/mesa-utils/mesa-utils.patch @@ -0,0 +1,29 @@ +From 212ebc20ae9724fb6b69980170a5527fbd9f312e Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 11 Dec 2022 15:18:55 +1100 +Subject: [PATCH] + +--- + configure.ac | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/configure.ac b/configure.ac +index ddc68b5..373e51b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -93,9 +93,9 @@ AC_EGREP_HEADER([glutInitContextProfile], + []) + + dnl Check for GLEW +-PKG_CHECK_MODULES(GLEW, [glew >= 1.5.4]) +-DEMO_CFLAGS="$DEMO_CFLAGS $GLEW_CFLAGS" +-DEMO_LIBS="$DEMO_LIBS $GLEW_LIBS" ++dnl PKG_CHECK_MODULES(GLEW, [glew >= 1.5.4]) ++dnl DEMO_CFLAGS="$DEMO_CFLAGS $GLEW_CFLAGS" ++dnl DEMO_LIBS="$DEMO_LIBS $GLEW_LIBS" + + # LIBS was set by AC_CHECK_LIB above + LIBS="" +-- +2.38.1 + diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 6448545a2ce..5bfeef5637b 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,22 +1,22 @@ -From 12c60e06a4b58e27d26763cb1bb9c6577c14add5 Mon Sep 17 00:00:00 2001 +From fd1ced027b75cff8ee16a12157330ee0986ccefa Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Thu, 1 Dec 2022 20:11:07 +1100 +Date: Mon, 12 Dec 2022 16:37:48 +1100 Subject: [PATCH] --- - .gitignore | 2 + - options/ansi/generic/stdlib-stubs.cpp | 2 +- - options/glibc/generic/execinfo.cpp | 5 +- - options/posix/generic/dlfcn-stubs.cpp | 1 + - options/posix/generic/termios-stubs.cpp | 5 +- - options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 62 ++++++++++++-------- - sysdeps/aero/generic/filesystem.cpp | 25 ++++++-- - sysdeps/aero/generic/sockets.cpp | 77 ++++++++++++++++++++++++- - sysdeps/aero/generic/time.cpp | 24 ++++++++ - sysdeps/aero/include/aero/syscall.h | 7 +++ - sysdeps/aero/meson.build | 1 + - 12 files changed, 176 insertions(+), 37 deletions(-) + .gitignore | 2 + + options/ansi/generic/stdlib-stubs.cpp | 183 +++++++++++++++++++++++- + options/glibc/generic/execinfo.cpp | 5 +- + options/posix/generic/dlfcn-stubs.cpp | 1 + + options/posix/generic/termios-stubs.cpp | 5 +- + options/rtdl/generic/linker.cpp | 2 +- + sysdeps/aero/generic/aero.cpp | 66 +++++---- + sysdeps/aero/generic/filesystem.cpp | 25 +++- + sysdeps/aero/generic/sockets.cpp | 87 ++++++++++- + sysdeps/aero/generic/time.cpp | 24 ++++ + sysdeps/aero/include/aero/syscall.h | 8 ++ + sysdeps/aero/meson.build | 1 + + 12 files changed, 366 insertions(+), 43 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -30,10 +30,199 @@ index fdd60a0..9f811f4 100644 +# clangd cache files: +.cache diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp -index c0e54fe..d6f92f3 100644 +index c0e54fe..b988dea 100644 --- a/options/ansi/generic/stdlib-stubs.cpp +++ b/options/ansi/generic/stdlib-stubs.cpp -@@ -392,7 +392,7 @@ int mbtowc(wchar_t *__restrict wc, const char *__restrict mb, size_t max_size) { +@@ -319,13 +319,182 @@ void qsort(void *base, size_t count, size_t size, + } + } + +-void qsort_r(void *, size_t, size_t, +- int (*compare)(const void *, const void *, void *), +- void *) { +- (void) compare; +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ ++// ---------------- QSORT START ---------------- ++/* ++ * Adapted from https://github.com/noporpoise/sort_r, original ++ * copyright follows: ++ * ++ * Isaac Turner 29 April 2014 Public Domain ++ */ ++#include ++#include ++ ++#define SORT_R_SWAP(a,b,tmp) ((tmp) = (a), (a) = (b), (b) = (tmp)) ++ ++/* swap a and b */ ++/* a and b must not be equal! */ ++static void sort_r_swap(char *__restrict a, char *__restrict b, ++ size_t w) ++{ ++ char tmp, *end = a+w; ++ for(; a < end; a++, b++) { SORT_R_SWAP(*a, *b, tmp); } ++} ++ ++/* swap a, b iff a>b */ ++/* a and b must not be equal! */ ++/* __restrict is same as restrict but better support on old machines */ ++static int sort_r_cmpswap(char *__restrict a, ++ char *__restrict b, size_t w, ++ int (*compar)(const void *_a, ++ const void *_b, ++ void *_arg), ++ void *arg) ++{ ++ if(compar(a, b, arg) > 0) { ++ sort_r_swap(a, b, w); ++ return 1; ++ } ++ return 0; ++} ++ ++/* ++ Swap consecutive blocks of bytes of size na and nb starting at memory addr ptr, ++ with the smallest swap so that the blocks are in the opposite order. Blocks may ++ be internally re-ordered e.g. ++ 12345ab -> ab34512 ++ 123abc -> abc123 ++ 12abcde -> deabc12 ++*/ ++static void sort_r_swap_blocks(char *ptr, size_t na, size_t nb) ++{ ++ if(na > 0 && nb > 0) { ++ if(na > nb) { sort_r_swap(ptr, ptr+na, nb); } ++ else { sort_r_swap(ptr, ptr+nb, na); } ++ } ++} ++ ++/* Implement recursive quicksort ourselves */ ++/* Note: quicksort is not stable, equivalent values may be swapped */ ++void qsort_r(void *base, size_t nel, size_t w, ++ int (*compar)(const void *_a, ++ const void *_b, ++ void *_arg), ++ void *arg) ++{ ++ char *b = (char *)base, *end = b + nel*w; ++ ++ /* for(size_t i=0; i b && sort_r_cmpswap(pj-w,pj,w,compar,arg); pj -= w) {} ++ } ++ } ++ else ++ { ++ /* nel > 6; Quicksort */ ++ ++ int cmp; ++ char *pl, *ple, *pr, *pre, *pivot; ++ char *last = b+w*(nel-1), *tmp; ++ ++ /* ++ Use median of second, middle and second-last items as pivot. ++ First and last may have been swapped with pivot and therefore be extreme ++ */ ++ char *l[3]; ++ l[0] = b + w; ++ l[1] = b+w*(nel/2); ++ l[2] = last - w; ++ ++ /* printf("pivots: %i, %i, %i\n", *(int*)l[0], *(int*)l[1], *(int*)l[2]); */ ++ ++ if(compar(l[0],l[1],arg) > 0) { SORT_R_SWAP(l[0], l[1], tmp); } ++ if(compar(l[1],l[2],arg) > 0) { ++ SORT_R_SWAP(l[1], l[2], tmp); ++ if(compar(l[0],l[1],arg) > 0) { SORT_R_SWAP(l[0], l[1], tmp); } ++ } ++ ++ /* swap mid value (l[1]), and last element to put pivot as last element */ ++ if(l[1] != last) { sort_r_swap(l[1], last, w); } ++ ++ /* ++ pl is the next item on the left to be compared to the pivot ++ pr is the last item on the right that was compared to the pivot ++ ple is the left position to put the next item that equals the pivot ++ ple is the last right position where we put an item that equals the pivot ++ v- end (beyond the array) ++ EEEEEELLLLLLLLuuuuuuuuGGGGGGGEEEEEEEE. ++ ^- b ^- ple ^- pl ^- pr ^- pre ^- last (where the pivot is) ++ Pivot comparison key: ++ E = equal, L = less than, u = unknown, G = greater than, E = equal ++ */ ++ pivot = last; ++ ple = pl = b; ++ pre = pr = last; ++ ++ /* ++ Strategy: ++ Loop into the list from the left and right at the same time to find: ++ - an item on the left that is greater than the pivot ++ - an item on the right that is less than the pivot ++ Once found, they are swapped and the loop continues. ++ Meanwhile items that are equal to the pivot are moved to the edges of the ++ array. ++ */ ++ while(pl < pr) { ++ /* Move left hand items which are equal to the pivot to the far left. ++ break when we find an item that is greater than the pivot */ ++ for(; pl < pr; pl += w) { ++ cmp = compar(pl, pivot, arg); ++ if(cmp > 0) { break; } ++ else if(cmp == 0) { ++ if(ple < pl) { sort_r_swap(ple, pl, w); } ++ ple += w; ++ } ++ } ++ /* break if last batch of left hand items were equal to pivot */ ++ if(pl >= pr) { break; } ++ /* Move right hand items which are equal to the pivot to the far right. ++ break when we find an item that is less than the pivot */ ++ for(; pl < pr; ) { ++ pr -= w; /* Move right pointer onto an unprocessed item */ ++ cmp = compar(pr, pivot, arg); ++ if(cmp == 0) { ++ pre -= w; ++ if(pr < pre) { sort_r_swap(pr, pre, w); } ++ } ++ else if(cmp < 0) { ++ if(pl < pr) { sort_r_swap(pl, pr, w); } ++ pl += w; ++ break; ++ } ++ } ++ } ++ ++ pl = pr; /* pr may have gone below pl */ ++ ++ /* ++ Now we need to go from: EEELLLGGGGEEEE ++ to: LLLEEEEEEEGGGG ++ Pivot comparison key: ++ E = equal, L = less than, u = unknown, G = greater than, E = equal ++ */ ++ sort_r_swap_blocks(b, ple-b, pl-ple); ++ sort_r_swap_blocks(pr, pre-pr, end-pre); ++ ++ /*for(size_t i=0; i nseq{mb, mb + max_size}; auto e = cc->decode_wtranscode(nseq, wseq, mbtowc_state); if (e != mlibc::charcode_error::null) @@ -108,7 +297,7 @@ index 2e2d3f1..3ff5fef 100644 constexpr bool eagerBinding = true; diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 29fb961..cf0503b 100644 +index 29fb961..39cc900 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp @@ -62,6 +62,16 @@ static frg::vector create_slice(char *const arg[]) { @@ -203,16 +392,20 @@ index 29fb961..cf0503b 100644 int sys_clock_get(int clock, time_t *secs, long *nanos) { struct timespec ts; auto result = syscall(SYS_GETTIME, clock, &ts); -@@ -233,7 +247,7 @@ uid_t sys_geteuid() { +@@ -233,7 +247,11 @@ uid_t sys_geteuid() { return 0; } -int sys_setuid(uid_t uid) UNIMPLEMENTED("sys_setuid") -+// int sys_setuid(uid_t uid) UNIMPLEMENTED("sys_setuid") ++int sys_setsid(pid_t *sid) { ++ mlibc::infoLogger() << "mlibc: sys_setsid is a stub" << frg::endlog; ++ return 0; ++} ++ int sys_seteuid(uid_t euid) UNIMPLEMENTED("sys_seteuid") gid_t sys_getgid() { -@@ -259,13 +273,13 @@ int sys_setegid(gid_t egid) { +@@ -259,13 +277,13 @@ int sys_setegid(gid_t egid) { void sys_yield() UNIMPLEMENTED("sys_yield") int sys_clone(void *tcb, pid_t *tid_out, void *stack) { @@ -272,7 +465,7 @@ index a3e2aca..4187059 100644 +} } // namespace mlibc diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp -index b6b18fe..e03c634 100644 +index b6b18fe..b4635df 100644 --- a/sysdeps/aero/generic/sockets.cpp +++ b/sysdeps/aero/generic/sockets.cpp @@ -1,5 +1,6 @@ @@ -293,7 +486,7 @@ index b6b18fe..e03c634 100644 if (result < 0) { return -result; -@@ -56,4 +57,76 @@ int sys_accept(int fd, int *newfd) { +@@ -56,4 +57,86 @@ int sys_accept(int fd, int *newfd) { *newfd = result; return 0; } @@ -310,6 +503,16 @@ index b6b18fe..e03c634 100644 + return 0; +} + ++int sys_socketpair(int domain, int type_and_flags, int proto, int *fds) { ++ auto result = syscall(SYS_SOCKET_PAIR, domain, type_and_flags, proto, fds); ++ ++ if (result < 0) { ++ return -result; ++ } ++ ++ return 0; ++} ++ +int sys_getsockopt(int fd, int layer, int number, void *__restrict buffer, socklen_t *__restrict size) { + (void)fd; (void)size; + if (layer == SOL_SOCKET && number == SO_PEERCRED) { @@ -402,10 +605,10 @@ index 0000000..460412d +} \ No newline at end of file diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 12f8dc6..4e330ef 100644 +index 12f8dc6..7fba5dd 100644 --- a/sysdeps/aero/include/aero/syscall.h +++ b/sysdeps/aero/include/aero/syscall.h -@@ -64,6 +64,13 @@ +@@ -64,6 +64,14 @@ #define SYS_FUTEX_WAIT 57 #define SYS_FUTEX_WAKE 58 #define SYS_LINK 59 @@ -416,6 +619,7 @@ index 12f8dc6..4e330ef 100644 +#define SYS_SETITIMER 64 +#define SYS_GETITIMER 65 +#define SYS_GETPPID 66 ++#define SYS_SOCKET_PAIR 67 // Invalid syscall used to trigger a log error in the kernel (as a hint) // so, that we can implement the syscall in the kernel. diff --git a/patches/rust-glutin/rust-glutin.patch b/patches/rust-glutin/rust-glutin.patch index 0656647c7ff..b472d33e744 100644 --- a/patches/rust-glutin/rust-glutin.patch +++ b/patches/rust-glutin/rust-glutin.patch @@ -1,26 +1,26 @@ -From e6b432ef7fcf3df707428759f01b1cc32f048ecc Mon Sep 17 00:00:00 2001 +From b9cdd46f1acb5a6dd84b08f782f1c01ea40eb23c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 13:18:36 +1100 +Date: Sun, 11 Dec 2022 16:27:48 +1100 Subject: [PATCH] --- - glutin/Cargo.toml | 2 +- - glutin/src/api/dlloader.rs | 1 + - glutin/src/api/egl/mod.rs | 6 ++++++ - glutin/src/api/glx/mod.rs | 1 + - glutin/src/api/osmesa/mod.rs | 1 + - glutin/src/lib.rs | 4 ++++ - glutin/src/platform/mod.rs | 1 + - glutin/src/platform/unix.rs | 1 + - glutin/src/platform_impl/mod.rs | 1 + - glutin/src/platform_impl/unix/mod.rs | 1 + - glutin/src/windowed.rs | 2 ++ - glutin_egl_sys/build.rs | 1 + - glutin_egl_sys/src/lib.rs | 2 ++ - glutin_glx_sys/Cargo.toml | 2 +- - glutin_glx_sys/build.rs | 1 + - glutin_glx_sys/src/lib.rs | 1 + - 16 files changed, 26 insertions(+), 2 deletions(-) + glutin/Cargo.toml | 2 +- + glutin/src/api/dlloader.rs | 1 + + glutin/src/api/egl/mod.rs | 6 ++++++ + glutin/src/api/glx/mod.rs | 7 ++++++- + glutin/src/api/osmesa/mod.rs | 1 + + glutin/src/lib.rs | 16 ++++++++++------ + glutin/src/platform/mod.rs | 1 + + glutin/src/platform/unix.rs | 1 + + glutin/src/platform_impl/mod.rs | 1 + + glutin/src/platform_impl/unix/mod.rs | 1 + + glutin/src/windowed.rs | 2 ++ + glutin_egl_sys/build.rs | 1 + + glutin_egl_sys/src/lib.rs | 2 ++ + glutin_glx_sys/Cargo.toml | 2 +- + glutin_glx_sys/build.rs | 1 + + glutin_glx_sys/src/lib.rs | 1 + + 16 files changed, 37 insertions(+), 9 deletions(-) diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml index ddd23ee..d3c2eac 100644 @@ -100,7 +100,7 @@ index d567678..de59a09 100644 target_os = "dragonfly", target_os = "freebsd", diff --git a/glutin/src/api/glx/mod.rs b/glutin/src/api/glx/mod.rs -index 61968e6..2ea9702 100644 +index 61968e6..e5876a3 100644 --- a/glutin/src/api/glx/mod.rs +++ b/glutin/src/api/glx/mod.rs @@ -1,5 +1,6 @@ @@ -110,6 +110,19 @@ index 61968e6..2ea9702 100644 target_os = "dragonfly", target_os = "freebsd", target_os = "netbsd", +@@ -409,7 +410,11 @@ impl<'a> ContextPrototype<'a> { + unsafe { + extra_functions.SwapIntervalSGI(swap_mode); + } +- } else { ++ } else if self.opengl.vsync { ++ // If vsync was not requested and it is not supported on the system, ++ // then this feature can safely be ignored. ++ // ++ // cc + return Err(CreationError::OsError( + "Couldn't find any available vsync extension".to_string(), + )); diff --git a/glutin/src/api/osmesa/mod.rs b/glutin/src/api/osmesa/mod.rs index 89c0765..80cc2cd 100644 --- a/glutin/src/api/osmesa/mod.rs @@ -122,7 +135,7 @@ index 89c0765..80cc2cd 100644 target_os = "freebsd", target_os = "netbsd", diff --git a/glutin/src/lib.rs b/glutin/src/lib.rs -index 7ee1522..3282215 100644 +index 7ee1522..ff9d6f0 100644 --- a/glutin/src/lib.rs +++ b/glutin/src/lib.rs @@ -43,6 +43,7 @@ @@ -157,6 +170,29 @@ index 7ee1522..3282215 100644 target_os = "dragonfly", target_os = "freebsd", target_os = "netbsd", +@@ -598,16 +602,16 @@ impl Default for PixelFormatRequirements { + #[inline] + fn default() -> PixelFormatRequirements { + PixelFormatRequirements { +- hardware_accelerated: Some(true), +- color_bits: Some(24), ++ hardware_accelerated: None, ++ color_bits: None, + float_color_buffer: false, +- alpha_bits: Some(8), +- depth_bits: Some(24), +- stencil_bits: Some(8), ++ alpha_bits: None, ++ depth_bits: None, ++ stencil_bits: None, + double_buffer: None, + multisampling: None, + stereoscopy: false, +- srgb: true, ++ srgb: false, + release_behavior: ReleaseBehavior::Flush, + x11_visual_xid: None, + } diff --git a/glutin/src/platform/mod.rs b/glutin/src/platform/mod.rs index e508519..c83423b 100644 --- a/glutin/src/platform/mod.rs diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 8fafd81bc7e..ea1a881e66b 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -87,6 +87,13 @@ impl INodeInterface for Master { Ok(buffer.len()) } + fn poll(&self, table: Option<&mut fs::inode::PollTable>) -> fs::Result { + table.map(|e| e.insert(&self.wq)); + let mut flags = fs::inode::PollFlags::IN | fs::inode::PollFlags::OUT; + + Ok(flags) + } + fn ioctl(&self, command: usize, arg: usize) -> fs::Result { match command { TIOCGPTN => { @@ -191,6 +198,12 @@ impl INodeInterface for Slave { Ok(0) } + aero_syscall::TIOCSCTTY => { + // TODO(alacritty): stub! + log::error!("TIOCSCTTY is a stub!"); + Ok(0) + } + _ => Err(FileSystemError::NotSupported), } } diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index 86814754036..1b252391852 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -109,9 +109,9 @@ impl EPoll { /// * The timeout expires. pub fn wait( &self, - ret_events: &mut [&mut EPollEvent], + ret_events: &mut [EPollEvent], max_events: usize, - _timeout: usize, + timeout: usize, ) -> Result { let current_task = scheduler::get_scheduler().current_task(); let file_table = ¤t_task.file_table; @@ -128,6 +128,8 @@ impl EPoll { break; } + ret_events[n].events = EPollEventFlags::empty(); + let fd = file_table .get_handle(*fd) .ok_or(FileSystemError::NotSupported)?; // EINVAL @@ -135,16 +137,13 @@ impl EPoll { let flags = epoll_event.events; let ready: EPollEventFlags = fd.inode().poll(None)?.into(); - if ready.contains(flags) { - // The registered event is ready; increment the number of ready events - // and set event flags mask for this event in the caller-supplied event - // buffer. + if !(ready & flags).is_empty() { ret_events[n].events = ready & flags; n += 1; continue; } - // Not ready; add the event to the poll table. + // // Not ready; add the event to the poll table. fd.inode().poll(Some(&mut poll_table))?; fds.push(fd); } @@ -155,21 +154,24 @@ impl EPoll { return Ok(n); } - 'search: loop { - // Wait till one of the file descriptor deliever an event. - scheduler::get_scheduler().inner.await_io()?; + // Start the timer if timeout specified, if not, we can block indefinitely. + // If the timeout is zero, then we have to return without blocking. + if timeout == 0 { + return Ok(0); + } - for fd in fds.iter() { + 'search: loop { + for (i, fd) in fds.iter().enumerate() { let ready: EPollEventFlags = fd.inode().poll(None)?.into(); let flags = table .get(&fd.fd) .ok_or(FileSystemError::NotSupported)? .events; - if ready.contains(flags) { + if !(ready & flags).is_empty() { // The event is ready; break out of the search loop and set ready // events to 1. - ret_events[0].events = ready & flags; + ret_events[i].events = ready & flags; n = 1; break 'search; } diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index a3ec913a247..2ad835fc366 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -67,7 +67,7 @@ impl INodeInterface for EventFd { } fn poll(&self, table: Option<&mut PollTable>) -> super::Result { - let count = self.count.lock(); + let count = self.count.lock_irq(); let mut events = PollFlags::empty(); table.map(|e| e.insert(&self.wq)); // listen for changes diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index 2dd03d7ebe7..e2cf631fc86 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -32,8 +32,8 @@ impl Pipe { }) } - /// Returns whether the pipe has active writers. - pub fn has_active_writers(&self) -> usize { + /// Returns the number of active writers to the pipe. + pub fn active_writers(&self) -> usize { self.num_writers.load(Ordering::SeqCst) } } @@ -65,8 +65,12 @@ impl INodeInterface for Pipe { } fn read_at(&self, _offset: usize, buf: &mut [u8]) -> super::Result { + if self.active_writers() == 0 { + return Ok(0); + } + let mut buffer = self.readers.block_on(&self.queue, |lock| { - lock.has_data() || !self.has_active_writers() == 0 + lock.has_data() || self.active_writers() != 0 })?; let read = buffer.read_data(buf); diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index ccaf26bc41e..ab59fc8b3aa 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -210,6 +210,22 @@ impl UnixSocket { }) } + pub fn connect_pair(a: DirCacheItem, b: DirCacheItem) -> fs::Result<()> { + let a = a + .inode() + .downcast_arc::() + .ok_or(FileSystemError::NotSocket)?; + + let b = b + .inode() + .downcast_arc::() + .ok_or(FileSystemError::NotSocket)?; + + a.inner.lock_irq().state = UnixSocketState::Connected(b.clone()); + b.inner.lock_irq().state = UnixSocketState::Connected(a.clone()); + Ok(()) + } + pub fn sref(&self) -> Arc { self.weak.upgrade().unwrap() } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 8b818316934..d4c926d93e8 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -236,7 +236,12 @@ pub fn ioctl(fd: usize, command: usize, argument: usize) -> Result { handle.fd_flags.lock().insert(FdFlags::CLOEXEC); - return Ok(0x00); + Ok(0) + } + + FIONBIO => { + handle.flags.write().insert(OpenFlags::O_NONBLOCK); + Ok(0) } // Handle file specific ioctl: @@ -471,7 +476,7 @@ pub fn epoll_ctl( #[syscall] pub fn epoll_pwait( epfd: usize, - event: &mut [&mut EPollEvent], + event: &mut [EPollEvent], timeout: usize, sigmask: usize, ) -> Result { diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 7896016824b..8b47eccf1ba 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -285,6 +285,7 @@ pub fn generic_do_syscall( SYS_LISTEN => net::listen(b, c), SYS_ACCEPT => net::accept(b, c, d), SYS_SOCK_RECV => net::sock_recv(b, c, d), + SYS_SOCKET_PAIR => net::socket_pair(b, c, d, e, f), SYS_GETTIME => time::gettime(b, c), SYS_SLEEP => time::sleep(b), diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index b8f06461649..06e55839952 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -1,6 +1,7 @@ use aero_syscall::socket::MessageHeader; use aero_syscall::*; +use crate::fs::cache::DirCacheItem; use crate::fs::inode::DirEntry; use crate::mem::paging::VirtAddr; @@ -92,8 +93,11 @@ pub fn listen(fd: usize, backlog: usize) -> Result { Ok(0) } -#[syscall] -pub fn socket(domain: usize, socket_type: usize, protocol: usize) -> Result { +fn create_socket( + domain: usize, + socket_type: usize, + protocol: usize, +) -> Result { let socket = match domain as u32 { AF_UNIX => UnixSocket::new(), _ => { @@ -105,10 +109,17 @@ pub fn socket(domain: usize, socket_type: usize, protocol: usize) -> Result")); + Ok(entry) +} + +#[syscall] +pub fn socket(domain: usize, socket_type: usize, protocol: usize) -> Result { + let entry = create_socket(domain, socket_type, protocol)?; + let current_task = scheduler::get_scheduler().current_task(); + + let sockfd_flags = SocketFlags::from_bits_truncate(socket_type).into(); let fd = current_task.file_table.open_file(entry, sockfd_flags)?; Ok(fd) @@ -134,3 +145,27 @@ pub fn bind(fd: usize, address: usize, length: usize) -> Result Err(SyscallError::ENOENT), } } + +/// Create an unbound pair of connected sockets in a specified domain, of a +/// specified type, under the protocol optionally specified by the protocol +/// argument. The two sockets shall be identical. The file descriptors used +/// in referencing the created sockets shall be returned in fds[0] and fds[1]. +#[syscall] +pub fn socket_pair( + domain: usize, + type_and_flags: usize, + protocol: usize, + fds: &mut [i32], +) -> Result { + let current_task = scheduler::get_scheduler().current_task(); + let sockfd_flags = SocketFlags::from_bits_truncate(type_and_flags).into(); + + let a = create_socket(domain, type_and_flags, protocol)?; + let b = create_socket(domain, type_and_flags, protocol)?; + + UnixSocket::connect_pair(a.clone(), b.clone())?; + + fds[0] = current_task.file_table.open_file(a, sockfd_flags)? as i32; + fds[1] = current_task.file_table.open_file(b, sockfd_flags)? as i32; + Ok(0) +} diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index ef570ff819f..f8e936ee4dc 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -87,6 +87,7 @@ pub const SYS_SOCK_RECV: usize = 63; pub const SYS_SETITIMER: usize = 64; pub const SYS_GETITIMER: usize = 65; pub const SYS_GETPPID: usize = 66; +pub const SYS_SOCKET_PAIR: usize = 67; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 52a273db4a8..b4395f47ed4 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -278,6 +278,7 @@ pub const TIOCGWINSZ: usize = 0x5413; pub const TIOCSWINSZ: usize = 0x5414; pub const TCGETS: usize = 0x5401; pub const TCSETSF: usize = 0x5404; +pub const TIOCSCTTY: usize = 0x540e; #[derive(Default, Copy, Clone)] #[repr(C)] diff --git a/tools/cargo-inject-patches.py b/tools/cargo-inject-patches.py index 2b5e4b8bd05..2122efdc5ef 100644 --- a/tools/cargo-inject-patches.py +++ b/tools/cargo-inject-patches.py @@ -1,39 +1,55 @@ +#!/usr/bin/env python3 # Copied over from https://github.com/managarm/bootstrap-managarm/scripts/cargo-inject-patches.py import argparse import os -import subprocess import pathlib +import subprocess patched_libs = { - 'libc': '0.2.93', - 'num_cpus': '1.13.0', - 'users': '0.11.0', + "backtrace": "0.3.64", + "calloop": "0.9.3", + "libc": "0.2.93", + "libloading": "0.7.3", + "mio": ["0.6.23", "0.8.3"], + "nix": "0.22.3", + "num_cpus": "1.13.0", + "users": "0.11.0", + "winit": "0.26.1", + "glutin": "0.28.0", + "glutin_glx_sys": "0.1.7", + "glutin_egl_sys": "0.1.5", + "shared_library": "0.1.9", } -parser = argparse.ArgumentParser( - description='Inject patched Rust libraries into Cargo lockfiles') -parser.add_argument('manifest', type=pathlib.Path, help='path to Cargo.toml') +parser = argparse.ArgumentParser(description="Inject patched Rust libraries into Cargo lockfiles") +parser.add_argument("manifest", type=pathlib.Path, help="path to Cargo.toml") manifest = parser.parse_args().manifest # First, delete the existing lockfile to work around https://github.com/rust-lang/cargo/issues/9470 -lockfile = os.path.join(os.path.dirname(manifest), 'Cargo.lock') -if os.path.exists(lockfile): - print('cargo-inject-patches: workaround cargo bug by removing existing lockfile...') - os.remove(lockfile) +# lockfile = os.path.join(os.path.dirname(manifest), "Cargo.lock") +# if os.path.exists(lockfile): +# print("cargo-inject-patches: workaround cargo bug by removing existing lockfile...") +# os.remove(lockfile) + +for lib, versions in patched_libs.items(): + if not isinstance(versions, list): + versions = [versions] -for lib, version in patched_libs.items(): - cmd = [ - 'cargo', - 'update', - '--manifest-path', manifest, - '--package', lib, - '--precise', version - ] + for version in versions: + cmd = [ + "cargo", + "update", + "--manifest-path", + manifest, + "--package", + lib, + "--precise", + version, + ] - output = subprocess.run(cmd, capture_output=True) - if 'did not match any packages' in str(output.stderr): - print( - f'cargo-inject-patches: Injecting {lib} v{version} failed, patch not used') - else: - print(f'cargo-inject-patches: Injected {lib} v{version}') + output = subprocess.run(cmd) + if "did not match any packages" in str(output.stderr): + print(f"cargo-inject-patches: Injecting {lib} v{version} failed, patch not used") + else: + print(f"cargo-inject-patches: Injected {lib} v{version}") diff --git a/userland/apps/init/src/main.rs b/userland/apps/init/src/main.rs index 2309f2fdff3..97c56e8c9fb 100644 --- a/userland/apps/init/src/main.rs +++ b/userland/apps/init/src/main.rs @@ -34,6 +34,9 @@ fn main() -> Result<(), Box> { mem::forget(OpenOptions::new().write(true).open(TTY_PATH)?); // fd=1 for stdout mem::forget(OpenOptions::new().write(true).open(TTY_PATH)?); // fd=2 for stderr - Command::new("/usr/bin/startx").spawn()?; + Command::new("/usr/bin/startx") + .env("RUST_BACKTRACE", "full") + .spawn()?; + loop {} } diff --git a/userland/client.c b/userland/client.c deleted file mode 100644 index 7b0d7c9a072..00000000000 --- a/userland/client.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#define SOCK_PATH "test.sock" - -int main() { - // Create the socket. - int sockfd = socket(AF_UNIX, SOCK_STREAM, 0); - - // Check for any errors during the creation. - if (sockfd < 0) { - perror("socket"); - return 1; - } - - struct sockaddr_un addr = {.sun_family = AF_UNIX}; - strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path) - 1); - - if (connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == - -1) { - perror("connect"); - return -1; - } - - struct iovec iov[1]; - - iov[0].iov_base = "Hello, world!\n"; - iov[0].iov_len = strlen(iov[0].iov_base); - - writev(sockfd, iov, 1); - close(sockfd); -} \ No newline at end of file diff --git a/userland/memory_stress.c b/userland/memory_stress.c new file mode 100644 index 00000000000..1493a914bb5 --- /dev/null +++ b/userland/memory_stress.c @@ -0,0 +1,43 @@ +// File: ../../../bundled/mlibc/subprojects/frigg/include/frg/slab.hpp:441: +// +// Assertion '!"slab_pool corruption. Possible write to unallocated object"' +// failed! +// +// Hypothesis: I observed that the error only happens in alacritty when the +// memory is under stress and in a secondary thread. So, it is +// likely an issue with how MLIBC locks the slab_pool or maybe +// something related to the futex implementation (but its likely +// not because other people using MLIBC are experiencing the same +// issue). +// +// "Congratulations! You've ran into the same damn bug that stopped chromium and +// webkitgtk join the crying club" - Dennis + +/* +G'day mate! As a bloody good programmer from down under, I'm bloody brilliant at +debugging even the most complex memory corruption issues. Recently, I used a +tool, ASAN, to identify the source of the corruption, and then I used my +bloody mad skills with a debugger like GDB to pinpoint the exact location of the +problem in the program's memory. I was able to quickly and efficiently fix the +issue, and now the program runs smoothly without any bloody memory corruption +errors. I'm bloody proud of my skills and the positive impact they have on the +programs I work on. +*/ + +#include +#include +#include + +void *fuck_around(void *arg) { + while (true) { + int *a = malloc(69); + *a = 69; + free(a); + } + return NULL; +} + +int main() { + pthread_t balls; + pthread_create(&balls, NULL, fuck_around, NULL); +} \ No newline at end of file diff --git a/userland/server.c b/userland/server.c deleted file mode 100644 index dc27ab64553..00000000000 --- a/userland/server.c +++ /dev/null @@ -1,71 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#define SOCK_PATH "test.sock" -#define BACK_LOG 69 - -int main() { - // Create the socket. - int sockfd = socket(AF_UNIX, SOCK_STREAM, 0); - - // Check for any errors during the creation. - if (sockfd < 0) { - perror("socket"); - return 1; - } - - struct sockaddr_un addr = {.sun_family = AF_UNIX}; - strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path) - 1); - - // Bind the socket to the address. - if (bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == - -1) { - perror("bind"); - return 1; - } - - // Listen for new connections. - if (listen(sockfd, BACK_LOG) == -1) { - perror("listen"); - return -1; - } - - for (;;) { - printf("Listening for a connection...\n"); - int con_fd = accept(sockfd, NULL, NULL); - - // Check for any errors during the connection. - if (con_fd < 0) { - perror("accept"); - return -1; - } - - printf("Accepted socket! (fd=%d)\n", con_fd); - - char buffer[4096]; - - struct iovec iov = { - .iov_base = &buffer, - .iov_len = sizeof(buffer), - }; - - struct msghdr msg = {.msg_iov = &iov, .msg_iovlen = 1}; - - int count = recvmsg(con_fd, &msg, 0); - if (count < 0) { - perror("recvmsg"); - return -1; - } - - printf("Received %d bytes: %s\n", count, buffer); - - if (close(con_fd) == -1) { - perror("close"); - return -1; - } - } -} \ No newline at end of file From d45a5f51703e902126858f6b5fbc7a2408a96a42 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 15 Dec 2022 16:34:43 +1100 Subject: [PATCH 091/368] bootstrap::rust_libc: abi-fixes Signed-off-by: Andy-Python-Programmer --- patches/rust-libc/rust-libc.patch | 54 ++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/patches/rust-libc/rust-libc.patch b/patches/rust-libc/rust-libc.patch index 2d5d37528da..3e6ea8a40e6 100644 --- a/patches/rust-libc/rust-libc.patch +++ b/patches/rust-libc/rust-libc.patch @@ -1,14 +1,14 @@ -From aaf02ca3edbe7f8f163f626915fd7d4919f7d399 Mon Sep 17 00:00:00 2001 +From 36ba983c2f910970588929a1c47a051a5163d57f Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 14:58:17 +1100 +Date: Wed, 14 Dec 2022 18:20:52 +1100 Subject: [PATCH] --- - src/unix/mlibc/mod.rs | 380 ++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 351 insertions(+), 29 deletions(-) + src/unix/mlibc/mod.rs | 386 ++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 356 insertions(+), 30 deletions(-) diff --git a/src/unix/mlibc/mod.rs b/src/unix/mlibc/mod.rs -index 2046530..8404ff9 100644 +index 2046530..6d5eaf8 100644 --- a/src/unix/mlibc/mod.rs +++ b/src/unix/mlibc/mod.rs @@ -47,7 +47,6 @@ pub type fsfilcnt_t = ::c_uint; @@ -55,7 +55,15 @@ index 2046530..8404ff9 100644 } pub struct sockaddr_in6 { pub sin6_family: sa_family_t, -@@ -250,10 +249,14 @@ s! { +@@ -244,16 +243,22 @@ s! { + } + pub struct pthread_cond_t { + pub __mlibc_seq: ::c_uint, ++ pub __mlibc_flags: ::c_uint, ++ pub __mlibc_clock: ::clockid_t + } + pub struct pthread_condattr_t {} + pub struct pthread_mutex_t { pub __mlibc_state: ::c_uint, pub __mlibc_recursion: ::c_uint, pub __mlibc_flags: ::c_uint, @@ -70,7 +78,7 @@ index 2046530..8404ff9 100644 } pub struct pthread_rwlock_t { pub __mlibc_m: ::c_uint, -@@ -319,10 +322,73 @@ s! { +@@ -319,10 +324,73 @@ s! { pub struct fd_set { pub fds_bits: [c_char; 128], } @@ -144,7 +152,7 @@ index 2046530..8404ff9 100644 pub {const} fn WCOREDUMP(x: ::c_int) -> bool { x & WCOREFLAG != 0 } -@@ -356,11 +422,24 @@ pub const MAP_SHARED: ::c_int = 2; +@@ -356,11 +424,24 @@ pub const MAP_SHARED: ::c_int = 2; pub const PROT_EXEC: ::c_int = 4; pub const PROT_READ: ::c_int = 1; pub const PROT_WRITE: ::c_int = 2; @@ -169,7 +177,7 @@ index 2046530..8404ff9 100644 // options/ansi/include/time.h pub const CLOCK_MONOTONIC: clockid_t = 1; -@@ -369,33 +448,49 @@ pub const CLOCK_REALTIME: clockid_t = 0; +@@ -369,33 +450,49 @@ pub const CLOCK_REALTIME: clockid_t = 0; // options/posix/include/netdb.h pub const EAI_SYSTEM: ::c_int = 9; @@ -241,7 +249,7 @@ index 2046530..8404ff9 100644 // abis/linux/signal.h pub const SIGABRT: ::c_int = 6; -@@ -436,45 +531,186 @@ pub const SIGSYS: ::c_int = 31; +@@ -436,45 +533,186 @@ pub const SIGSYS: ::c_int = 31; pub const SIGUNUSED: ::c_int = SIGSYS; pub const SIGCANCEL: ::c_int = 32; @@ -428,7 +436,7 @@ index 2046530..8404ff9 100644 pub const SOCK_STREAM: ::c_int = 4; pub const SOL_SOCKET: ::c_int = 1; pub const SO_ACCEPTCONN: ::c_int = 1; -@@ -494,6 +730,8 @@ pub const SO_SNDLOWAT: ::c_int = 14; +@@ -494,6 +732,8 @@ pub const SO_SNDLOWAT: ::c_int = 14; pub const SO_SNDTIMEO: ::c_int = 15; pub const SO_TYPE: ::c_int = 16; pub const SO_SNDBUFFORCE: ::c_int = 17; @@ -437,7 +445,7 @@ index 2046530..8404ff9 100644 pub const SO_PEERCRED: ::c_int = 18; pub const SO_ATTACH_FILTER: ::c_int = 19; pub const SO_PASSCRED: ::c_int = 20; -@@ -503,6 +741,12 @@ pub const SO_PROTOCOL: ::c_int = 23; +@@ -503,6 +743,12 @@ pub const SO_PROTOCOL: ::c_int = 23; pub const SO_REUSEPORT: ::c_int = 24; pub const SO_TIMESTAMP: ::c_int = 25; @@ -450,7 +458,7 @@ index 2046530..8404ff9 100644 // abis/mlibc/errno.h pub const EDOM: ::c_int = 1; pub const EILSEQ: ::c_int = 2; -@@ -592,15 +836,24 @@ pub const ENOTBLK: ::c_int = 1083; +@@ -592,15 +838,24 @@ pub const ENOTBLK: ::c_int = 1083; // options/posix/include/fcntl.h pub const AT_FDCWD: ::c_int = -100; @@ -476,7 +484,7 @@ index 2046530..8404ff9 100644 pub const F_GETOWN: ::c_int = 10; pub const F_SETOWN: ::c_int = 11; pub const O_ACCMODE: ::c_int = 7; -@@ -649,18 +902,42 @@ pub const WCOREFLAG: ::c_int = 0x80; +@@ -649,18 +904,42 @@ pub const WCOREFLAG: ::c_int = 0x80; pub const WNOHANG: ::c_int = 2; // options/linux/include/sys/poll.h @@ -520,7 +528,7 @@ index 2046530..8404ff9 100644 // options/posix/include/pthread.h align_const! { -@@ -668,6 +945,7 @@ align_const! { +@@ -668,9 +947,12 @@ align_const! { __mlibc_state: 0, __mlibc_recursion: 0, __mlibc_flags: 0, @@ -528,7 +536,12 @@ index 2046530..8404ff9 100644 }; pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { __mlibc_seq: 0, -@@ -689,11 +967,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; ++ __mlibc_flags: 0, ++ __mlibc_clock: 0, + }; + pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + __mlibc_m: 0, +@@ -689,11 +971,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; extern "C" { @@ -569,7 +582,7 @@ index 2046530..8404ff9 100644 pub fn getgrgid_r( gid: ::gid_t, grp: *mut ::group, -@@ -728,8 +1035,21 @@ extern "C" { +@@ -728,12 +1039,25 @@ extern "C" { buflen: ::size_t, result: *mut *mut passwd, ) -> ::c_int; @@ -591,7 +604,12 @@ index 2046530..8404ff9 100644 pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; pub fn pthread_condattr_setclock( attr: *mut pthread_condattr_t, -@@ -752,6 +1072,8 @@ extern "C" { +- clock_id: ::clockid_t, ++ clock_id: clockid_t, + ) -> ::c_int; + pub fn pthread_create( + thread: *mut ::pthread_t, +@@ -752,6 +1076,8 @@ extern "C" { addr: *mut ::sockaddr, addrlen: *mut ::socklen_t, ) -> ::ssize_t; From 1cfc7a2314ecc571d64cb7fd963c90af2c60d61b Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 18 Dec 2022 14:06:21 +1100 Subject: [PATCH 092/368] kernel: fixes to get alacritty WORKING! Signed-off-by: Andy-Python-Programmer --- aero.py | 3 +- bootstrap.yml | 2 + patches/dwm/dwm.patch | 4 +- patches/mlibc/mlibc.patch | 38 ++-- patches/rust-libc/rust-libc.patch | 261 ++++++++++++++++++---------- src/aero_kernel/src/drivers/pty.rs | 37 ++-- src/aero_kernel/src/drivers/tty.rs | 10 +- src/aero_kernel/src/fs/epoll.rs | 52 +++++- src/aero_kernel/src/syscall/fs.rs | 1 + src/aero_kernel/src/syscall/time.rs | 2 +- 10 files changed, 274 insertions(+), 136 deletions(-) diff --git a/aero.py b/aero.py index 015e203fb3a..ef3ec84da23 100755 --- a/aero.py +++ b/aero.py @@ -456,7 +456,8 @@ def run_in_emulator(build_info: BuildInfo, iso_path): '-serial', 'stdio', '-drive', 'file=build/disk.img,if=none,id=NVME1,format=raw', '-device', 'nvme,drive=NVME1,serial=nvme', # Specify the boot order (where `d` is the first CD-ROM drive) - '--boot', 'd'] + '--boot', 'd', + '-s'] if args.bios == 'uefi': qemu_args += ['-bios', diff --git a/bootstrap.yml b/bootstrap.yml index 7353d8657f0..8bc22b18c7e 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -553,6 +553,8 @@ packages: - '--root' - '@THIS_COLLECT_DIR@/usr' - '-j@PARALLELISM@' + environ: + RUSTFLAGS: '-Cforce-frame-pointers=yes -Clink-args=-no-pie' # - name: ripgrep # source: diff --git a/patches/dwm/dwm.patch b/patches/dwm/dwm.patch index 57ab04c41d5..40756160e48 100644 --- a/patches/dwm/dwm.patch +++ b/patches/dwm/dwm.patch @@ -1,6 +1,6 @@ -From 003f47ada9dd8f0ec6deedebeba2b7bdcc15030f Mon Sep 17 00:00:00 2001 +From 8b93ffe3d30e2b2d7424b2a9fa7fa93e77f362c2 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 11 Dec 2022 19:36:22 +1100 +Date: Sun, 18 Dec 2022 13:40:10 +1100 Subject: [PATCH] --- diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 5bfeef5637b..c32aae3a8af 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,22 +1,22 @@ -From fd1ced027b75cff8ee16a12157330ee0986ccefa Mon Sep 17 00:00:00 2001 +From f7b84e6b068490f1cd5516a2fd7e66ec5945beae Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Mon, 12 Dec 2022 16:37:48 +1100 +Date: Sat, 17 Dec 2022 15:09:28 +1100 Subject: [PATCH] --- .gitignore | 2 + - options/ansi/generic/stdlib-stubs.cpp | 183 +++++++++++++++++++++++- + options/ansi/generic/stdlib-stubs.cpp | 185 +++++++++++++++++++++++- options/glibc/generic/execinfo.cpp | 5 +- options/posix/generic/dlfcn-stubs.cpp | 1 + options/posix/generic/termios-stubs.cpp | 5 +- options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 66 +++++---- + sysdeps/aero/generic/aero.cpp | 71 +++++---- sysdeps/aero/generic/filesystem.cpp | 25 +++- sysdeps/aero/generic/sockets.cpp | 87 ++++++++++- - sysdeps/aero/generic/time.cpp | 24 ++++ - sysdeps/aero/include/aero/syscall.h | 8 ++ + sysdeps/aero/generic/time.cpp | 24 +++ + sysdeps/aero/include/aero/syscall.h | 8 + sysdeps/aero/meson.build | 1 + - 12 files changed, 366 insertions(+), 43 deletions(-) + 12 files changed, 371 insertions(+), 45 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -30,7 +30,7 @@ index fdd60a0..9f811f4 100644 +# clangd cache files: +.cache diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp -index c0e54fe..b988dea 100644 +index c0e54fe..6d9cc52 100644 --- a/options/ansi/generic/stdlib-stubs.cpp +++ b/options/ansi/generic/stdlib-stubs.cpp @@ -319,13 +319,182 @@ void qsort(void *base, size_t count, size_t size, @@ -231,6 +231,15 @@ index c0e54fe..b988dea 100644 return nseq.it - mb; } else { +@@ -450,7 +619,7 @@ void free(void *ptr) { + } + + void *malloc(size_t size) { +- auto nptr = getAllocator().allocate(size); ++ auto nptr = getAllocator().allocate(size + 16); + // TODO: Print PID only if POSIX option is enabled. + if (mlibc::globalConfig().debugMalloc) + mlibc::infoLogger() << "mlibc (PID ?): malloc() returns " diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp index 3474615..10a2109 100644 --- a/options/glibc/generic/execinfo.cpp @@ -297,7 +306,7 @@ index 2e2d3f1..3ff5fef 100644 constexpr bool eagerBinding = true; diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 29fb961..39cc900 100644 +index 29fb961..ee09678 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp @@ -62,6 +62,16 @@ static frg::vector create_slice(char *const arg[]) { @@ -405,8 +414,15 @@ index 29fb961..39cc900 100644 int sys_seteuid(uid_t euid) UNIMPLEMENTED("sys_seteuid") gid_t sys_getgid() { -@@ -259,13 +277,13 @@ int sys_setegid(gid_t egid) { - void sys_yield() UNIMPLEMENTED("sys_yield") +@@ -256,16 +274,19 @@ int sys_setegid(gid_t egid) { + return 0; + } + +-void sys_yield() UNIMPLEMENTED("sys_yield") ++void sys_yield() { ++ mlibc::infoLogger() << "mlibc: sys_yield is a stub" << frg::endlog; ++ __ensure(!syscall(SYS_BACKTRACE)); ++} int sys_clone(void *tcb, pid_t *tid_out, void *stack) { - auto tid = syscall(SYS_CLONE, (uintptr_t)__mlibc_start_thread, stack); diff --git a/patches/rust-libc/rust-libc.patch b/patches/rust-libc/rust-libc.patch index 3e6ea8a40e6..f3fbd231daa 100644 --- a/patches/rust-libc/rust-libc.patch +++ b/patches/rust-libc/rust-libc.patch @@ -1,14 +1,14 @@ -From 36ba983c2f910970588929a1c47a051a5163d57f Mon Sep 17 00:00:00 2001 +From c6ec5b50fc2d7bc6b984b5c6910d944664da8e08 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Wed, 14 Dec 2022 18:20:52 +1100 +Date: Sat, 17 Dec 2022 15:50:08 +1100 Subject: [PATCH] --- - src/unix/mlibc/mod.rs | 386 ++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 356 insertions(+), 30 deletions(-) + src/unix/mlibc/mod.rs | 453 ++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 417 insertions(+), 36 deletions(-) diff --git a/src/unix/mlibc/mod.rs b/src/unix/mlibc/mod.rs -index 2046530..6d5eaf8 100644 +index 2046530..93fcc61 100644 --- a/src/unix/mlibc/mod.rs +++ b/src/unix/mlibc/mod.rs @@ -47,7 +47,6 @@ pub type fsfilcnt_t = ::c_uint; @@ -37,16 +37,17 @@ index 2046530..6d5eaf8 100644 } // abis/mlibc/termios.h -@@ -121,7 +120,7 @@ s! { +@@ -121,7 +120,8 @@ s! { pub c_oflag: tcflag_t, pub c_cflag: tcflag_t, pub c_lflag: tcflag_t, - pub c_cc: [cc_t; NCCS], ++ pub c_line: ::cc_t, + pub c_cc: [::cc_t; NCCS], pub ibaud: speed_t, pub obaud: speed_t, } -@@ -174,7 +173,7 @@ s! { +@@ -174,7 +174,7 @@ s! { pub sin_family: sa_family_t, pub sin_port: in_port_t, pub sin_addr: in_addr, @@ -55,14 +56,45 @@ index 2046530..6d5eaf8 100644 } pub struct sockaddr_in6 { pub sin6_family: sa_family_t, -@@ -244,16 +243,22 @@ s! { +@@ -238,22 +238,51 @@ s! { + // options/posix/include/bits/posix/pthread_t.h + pub struct __mlibc_thread_data {} + ++ // options/posix/include/sched.h ++ pub struct sched_param { ++ pub sched_priority: ::c_int, ++ } ++ ++ pub struct __mlibc_cpu_set { ++ pub __bits: [::c_ulong; 128 / core::mem::size_of::<::c_long>()], ++ } ++ + // options/posix/include/bits/posix/pthread.h + pub struct pthread_attr_t { +- pub __mlibc_deatchstate: ::c_int, ++ pub __mlibc_guardsize: ::size_t, ++ pub __mlibc_stacksize: ::size_t, ++ pub __mlibc_stackaddr: *mut ::c_void, ++ pub __mlibc_detachstate: ::c_int, ++ pub __mlibc_scope: ::c_int, ++ pub __mlibc_inheritsched: ::c_int, ++ pub __mlibc_schedparam: sched_param, ++ pub __mlibc_schedpolicy: ::c_int, ++ pub __mlibc_cpuset: *mut __mlibc_cpu_set, ++ pub __mlibc_cpusetsize: ::size_t, ++ pub __mlibc_sigmask: sigset_t, ++ pub __mlibc_sigmaskset: ::c_int, } pub struct pthread_cond_t { pub __mlibc_seq: ::c_uint, + pub __mlibc_flags: ::c_uint, -+ pub __mlibc_clock: ::clockid_t ++ pub __mlibc_clock: clockid_t, ++ } ++ pub struct pthread_condattr_t { ++ pub __mlibc_pshared: ::c_int, ++ pub __mlibc_clock: clockid_t, } - pub struct pthread_condattr_t {} +- pub struct pthread_condattr_t {} pub struct pthread_mutex_t { pub __mlibc_state: ::c_uint, pub __mlibc_recursion: ::c_uint, @@ -78,7 +110,7 @@ index 2046530..6d5eaf8 100644 } pub struct pthread_rwlock_t { pub __mlibc_m: ::c_uint, -@@ -319,10 +324,73 @@ s! { +@@ -319,10 +348,73 @@ s! { pub struct fd_set { pub fds_bits: [c_char; 128], } @@ -152,7 +184,112 @@ index 2046530..6d5eaf8 100644 pub {const} fn WCOREDUMP(x: ::c_int) -> bool { x & WCOREFLAG != 0 } -@@ -356,11 +424,24 @@ pub const MAP_SHARED: ::c_int = 2; +@@ -349,6 +441,104 @@ safe_f! { + } + } + ++// abis/linux/termios.h - indices for the `c_cc` array in struct termios ++pub const NCCS: ::size_t = 32; ++pub const VINTR: ::c_int = 0; ++pub const VQUIT: ::c_int = 1; ++pub const VERASE: ::c_int = 2; ++pub const VKILL: ::c_int = 3; ++pub const VEOF: ::size_t = 4; ++pub const VTIME: ::c_int = 5; ++pub const VMIN: ::c_int = 6; ++pub const VSWTC: ::c_int = 7; ++pub const VSTART: ::c_int = 8; ++pub const VSTOP: ::c_int = 9; ++pub const VSUSP: ::c_int = 10; ++pub const VEOL: ::c_int = 11; ++pub const VREPRINT: ::c_int = 12; ++pub const VDISCARD: ::c_int = 13; ++pub const VWERASE: ::c_int = 14; ++pub const VLNEXT: ::c_int = 15; ++pub const VEOL2: ::c_int = 16; ++ ++// abis/linux/termios.h - bitwise flags for c_iflag in struct termios ++pub const BRKINT: ::c_uint = 0o000002; ++pub const ICRNL: ::c_uint = 0o000400; ++pub const IGNBRK: ::c_uint = 0o000001; ++pub const IGNCR: ::c_uint = 0o000200; ++pub const IGNPAR: ::c_uint = 0o000004; ++pub const INLCR: ::c_uint = 0o000100; ++pub const INPCK: ::c_uint = 0o000020; ++pub const ISTRIP: ::c_uint = 0o000040; ++pub const IXANY: ::c_uint = 0o004000; ++pub const IXOFF: ::c_uint = 0o010000; ++pub const IXON: ::c_uint = 0o002000; ++pub const PARMRK: ::c_uint = 0o000010; ++ ++// abis/linux/termios.h - bitwise flags for c_oflag in struct termios ++pub const OPOST: ::c_uint = 0o000001; ++pub const ONLCR: ::c_int = 0o000004; ++pub const OCRNL: ::c_int = 0o000010; ++pub const ONOCR: ::c_int = 0o000020; ++pub const ONLRET: ::c_int = 0o000040; ++pub const OFDEL: ::c_int = 0o000200; ++pub const OFILL: ::c_int = 0o000100; ++ ++pub const NLDLY: ::c_int = 0o000400; ++pub const NL0: ::c_int = 0o000000; ++pub const NL1: ::c_int = 0o000400; ++ ++pub const CRDLY: ::c_int = 0o003000; ++pub const CR0: ::c_int = 0o000000; ++pub const CR1: ::c_int = 0o001000; ++pub const CR2: ::c_int = 0o002000; ++pub const CR3: ::c_int = 0o003000; ++ ++pub const TABDLY: ::c_int = 0o014000; ++pub const TAB0: ::c_int = 0o000000; ++pub const TAB1: ::c_int = 0o004000; ++pub const TAB2: ::c_int = 0o010000; ++pub const TAB3: ::c_int = 0o014000; ++ ++pub const XTABS: ::c_int = 0o014000; ++pub const BSDLY: ::c_int = 0o020000; ++pub const BS0: ::c_int = 0o000000; ++pub const BS1: ::c_int = 0o020000; ++ ++pub const VTDLY: ::c_int = 0o040000; ++pub const VT0: ::c_int = 0o000000; ++pub const VT1: ::c_int = 0o040000; ++ ++pub const FFDLY: ::c_int = 0o100000; ++pub const FF0: ::c_int = 0o000000; ++pub const FF1: ::c_int = 0o100000; ++ ++// abis/linux/termios.h - bitwise constants for c_cflag in struct termios ++pub const CSIZE: ::c_int = 0o000060; ++pub const CS5: ::c_uint = 0o000000; ++pub const CS6: ::c_int = 0o000020; ++pub const CS7: ::c_int = 0o000040; ++pub const CS8: ::c_int = 0o000060; ++ ++pub const CSTOPB: ::c_int = 0o000100; ++pub const CREAD: ::c_int = 0o000200; ++pub const PARENB: ::c_int = 0o000400; ++pub const PARODD: ::c_int = 0o001000; ++pub const HUPCL: ::c_int = 0o002000; ++pub const CLOCAL: ::c_int = 0o004000; ++ ++// abis/linux/termios.h - bitwise constants for c_lflag in struct termios ++pub const ECHO: ::c_uint = 0o000010; ++pub const ECHOE: ::c_int = 0o000020; ++pub const ECHOK: ::c_int = 0o000040; ++pub const ECHONL: ::c_int = 0o000100; ++pub const ICANON: ::c_int = 0o000002; ++pub const IEXTEN: ::c_int = 0o100000; ++pub const ISIG: ::c_int = 0o000001; ++pub const NOFLSH: ::c_int = 0o000200; ++pub const TOSTOP: ::c_int = 0o000400; ++pub const ECHOPRT: ::c_int = 0o002000; ++ + // abis/mlibc/vm-flags.h + pub const MAP_ANON: ::c_int = 8; + pub const MAP_PRIVATE: ::c_int = 1; +@@ -356,11 +546,24 @@ pub const MAP_SHARED: ::c_int = 2; pub const PROT_EXEC: ::c_int = 4; pub const PROT_READ: ::c_int = 1; pub const PROT_WRITE: ::c_int = 2; @@ -177,7 +314,7 @@ index 2046530..6d5eaf8 100644 // options/ansi/include/time.h pub const CLOCK_MONOTONIC: clockid_t = 1; -@@ -369,33 +450,49 @@ pub const CLOCK_REALTIME: clockid_t = 0; +@@ -369,33 +572,49 @@ pub const CLOCK_REALTIME: clockid_t = 0; // options/posix/include/netdb.h pub const EAI_SYSTEM: ::c_int = 9; @@ -249,7 +386,7 @@ index 2046530..6d5eaf8 100644 // abis/linux/signal.h pub const SIGABRT: ::c_int = 6; -@@ -436,45 +533,186 @@ pub const SIGSYS: ::c_int = 31; +@@ -436,45 +655,121 @@ pub const SIGSYS: ::c_int = 31; pub const SIGUNUSED: ::c_int = SIGSYS; pub const SIGCANCEL: ::c_int = 32; @@ -266,6 +403,7 @@ index 2046530..6d5eaf8 100644 pub const SIG_SETMASK: ::c_int = 2; // abis/mlibc/termios.h +-pub const NCCS: usize = 11; +pub const B0: ::c_uint = 0; +pub const B50: ::c_uint = 1; +pub const B75: ::c_uint = 2; @@ -285,65 +423,6 @@ index 2046530..6d5eaf8 100644 +pub const B57600: ::c_uint = 16; +pub const B115200: ::c_uint = 17; +pub const B230400: ::c_uint = 18; -+pub const BRKINT: ::c_uint = 0x0001; -+pub const BS0: ::c_int = 0x0000; -+pub const BS1: ::c_int = 0x1000; -+pub const BSDLY: ::c_int = 0x1000; -+pub const CLOCAL: ::c_int = 0x0080; -+pub const CR0: ::c_int = 0x0000; -+pub const CR1: ::c_int = 0x0100; -+pub const CR2: ::c_int = 0x0200; -+pub const CR3: ::c_int = 0x0300; -+pub const CRDLY: ::c_int = 0x0300; -+pub const CREAD: ::c_int = 0x0008; -+pub const CS5: ::c_uint = 0x0000; -+pub const CS6: ::c_int = 0x0001; -+pub const CS7: ::c_int = 0x0002; -+pub const CS8: ::c_int = 0x0003; -+pub const CSIZE: ::c_int = 0x0003; -+pub const CSTOPB: ::c_int = 0x0004; -+pub const ECHO: ::c_uint = 0x0001; -+pub const ECHOE: ::c_int = 0x0002; -+pub const ECHOK: ::c_int = 0x0004; -+pub const ECHONL: ::c_int = 0x0008; -+pub const ECHOPRT: ::c_int = 0x0200; -+pub const FF0: ::c_int = 0x0000; -+pub const FF1: ::c_int = 0x4000; -+pub const FFDLY: ::c_int = 0x4000; -+pub const HUPCL: ::c_int = 0x0040; -+pub const ICANON: ::c_int = 0x0010; -+pub const ICRNL: ::c_uint = 0x0002; -+pub const IEXTEN: ::c_int = 0x0020; -+pub const IGNBRK: ::c_uint = 0x0004; -+pub const IGNCR: ::c_uint = 0x0008; -+pub const IGNPAR: ::c_uint = 0x0010; -+pub const INLCR: ::c_uint = 0x0020; -+pub const INPCK: ::c_uint = 0x0040; -+pub const ISIG: ::c_int = 0x0040; -+pub const ISTRIP: ::c_uint = 0x0080; -+pub const IXANY: ::c_uint = 0x0100; -+pub const IXOFF: ::c_uint = 0x0200; -+pub const IXON: ::c_uint = 0x0400; - pub const NCCS: usize = 11; -+pub const NL0: ::c_int = 0x0000; -+pub const NL1: ::c_int = 0x0080; -+pub const NLDLY: ::c_int = 0x0080; -+pub const NOFLSH: ::c_int = 0x0080; -+pub const OCRNL: ::c_int = 0x0004; -+pub const OFDEL: ::c_int = 0x0020; -+pub const OFILL: ::c_int = 0x0040; -+pub const ONLCR: ::c_int = 0x0002; -+pub const ONLRET: ::c_int = 0x0010; -+pub const ONOCR: ::c_int = 0x0008; -+pub const OPOST: ::c_uint = 0x0001; -+pub const PARENB: ::c_int = 0x0010; -+pub const PARMRK: ::c_uint = 0x0800; -+pub const PARODD: ::c_int = 0x0020; -+pub const TAB0: ::c_int = 0x0000; -+pub const TAB1: ::c_int = 0x0400; -+pub const TAB2: ::c_int = 0x0800; -+pub const TAB3: ::c_int = 0x0C00; -+pub const TABDLY: ::c_int = 0x0C00; +pub const TCIFLUSH: ::c_int = 1; +pub const TCIOFF: ::c_int = 1; +pub const TCIOFLUSH: ::c_int = 2; @@ -356,12 +435,6 @@ index 2046530..6d5eaf8 100644 +pub const TCSANOW: ::c_int = 1; +pub const TIOCSCTTY: ::c_ulong = 0x540e; +pub const TIOCSWINSZ: ::c_ulong = 0x5414; -+pub const TOSTOP: ::c_int = 0x0100; -+pub const VT0: ::c_int = 0x0000; -+pub const VT1: ::c_int = 0x2000; -+ -+// The following are usize since they are indices into termios.c_cc -+pub const VEOF: usize = 0; // options/posix/include/termios.h pub const TIOCGWINSZ: ::c_ulong = 0x5413; @@ -436,7 +509,7 @@ index 2046530..6d5eaf8 100644 pub const SOCK_STREAM: ::c_int = 4; pub const SOL_SOCKET: ::c_int = 1; pub const SO_ACCEPTCONN: ::c_int = 1; -@@ -494,6 +732,8 @@ pub const SO_SNDLOWAT: ::c_int = 14; +@@ -494,6 +789,8 @@ pub const SO_SNDLOWAT: ::c_int = 14; pub const SO_SNDTIMEO: ::c_int = 15; pub const SO_TYPE: ::c_int = 16; pub const SO_SNDBUFFORCE: ::c_int = 17; @@ -445,7 +518,7 @@ index 2046530..6d5eaf8 100644 pub const SO_PEERCRED: ::c_int = 18; pub const SO_ATTACH_FILTER: ::c_int = 19; pub const SO_PASSCRED: ::c_int = 20; -@@ -503,6 +743,12 @@ pub const SO_PROTOCOL: ::c_int = 23; +@@ -503,6 +800,12 @@ pub const SO_PROTOCOL: ::c_int = 23; pub const SO_REUSEPORT: ::c_int = 24; pub const SO_TIMESTAMP: ::c_int = 25; @@ -458,7 +531,7 @@ index 2046530..6d5eaf8 100644 // abis/mlibc/errno.h pub const EDOM: ::c_int = 1; pub const EILSEQ: ::c_int = 2; -@@ -592,15 +838,24 @@ pub const ENOTBLK: ::c_int = 1083; +@@ -592,15 +895,24 @@ pub const ENOTBLK: ::c_int = 1083; // options/posix/include/fcntl.h pub const AT_FDCWD: ::c_int = -100; @@ -484,7 +557,7 @@ index 2046530..6d5eaf8 100644 pub const F_GETOWN: ::c_int = 10; pub const F_SETOWN: ::c_int = 11; pub const O_ACCMODE: ::c_int = 7; -@@ -649,18 +904,42 @@ pub const WCOREFLAG: ::c_int = 0x80; +@@ -649,18 +961,42 @@ pub const WCOREFLAG: ::c_int = 0x80; pub const WNOHANG: ::c_int = 2; // options/linux/include/sys/poll.h @@ -528,7 +601,7 @@ index 2046530..6d5eaf8 100644 // options/posix/include/pthread.h align_const! { -@@ -668,9 +947,12 @@ align_const! { +@@ -668,9 +1004,12 @@ align_const! { __mlibc_state: 0, __mlibc_recursion: 0, __mlibc_flags: 0, @@ -541,7 +614,7 @@ index 2046530..6d5eaf8 100644 }; pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { __mlibc_m: 0, -@@ -689,11 +971,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; +@@ -689,11 +1028,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; extern "C" { @@ -582,7 +655,7 @@ index 2046530..6d5eaf8 100644 pub fn getgrgid_r( gid: ::gid_t, grp: *mut ::group, -@@ -728,12 +1039,25 @@ extern "C" { +@@ -728,13 +1096,24 @@ extern "C" { buflen: ::size_t, result: *mut *mut passwd, ) -> ::c_int; @@ -590,6 +663,10 @@ index 2046530..6d5eaf8 100644 pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; +- pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; +- pub fn pthread_condattr_setclock( +- attr: *mut pthread_condattr_t, +- clock_id: ::clockid_t, + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int; + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; @@ -600,16 +677,14 @@ index 2046530..6d5eaf8 100644 + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, -+ ) -> ::c_int; - pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; - pub fn pthread_condattr_setclock( - attr: *mut pthread_condattr_t, -- clock_id: ::clockid_t, -+ clock_id: clockid_t, ) -> ::c_int; ++ pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; ++ pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, clock_id: clockid_t) ++ -> ::c_int; pub fn pthread_create( thread: *mut ::pthread_t, -@@ -752,6 +1076,8 @@ extern "C" { + attr: *const ::pthread_attr_t, +@@ -752,6 +1131,8 @@ extern "C" { addr: *mut ::sockaddr, addrlen: *mut ::socklen_t, ) -> ::ssize_t; diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index ea1a881e66b..349619cbb2c 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -55,6 +55,7 @@ static PTY_ID: AtomicU32 = AtomicU32::new(0); struct Master { id: u32, wq: BlockQueue, + window_size: Mutex, slave_buffer: Mutex>, buffer: Mutex>, } @@ -64,6 +65,7 @@ impl Master { Self { id: PTY_ID.fetch_add(1, Ordering::SeqCst), wq: BlockQueue::new(), + window_size: Mutex::new(WinSize::default()), slave_buffer: Mutex::new(Vec::new()), buffer: Mutex::new(Vec::new()), } @@ -72,7 +74,13 @@ impl Master { impl INodeInterface for Master { fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { - let mut pty_buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; + let mut pty_buffer = self.buffer.lock_irq(); + + if pty_buffer.is_empty() { + return Err(FileSystemError::WouldBlock); + } + + // let mut pty_buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; let size = core::cmp::min(pty_buffer.len(), buffer.len()); buffer[..size].copy_from_slice(&pty_buffer.drain(..size).collect::>()); @@ -89,7 +97,11 @@ impl INodeInterface for Master { fn poll(&self, table: Option<&mut fs::inode::PollTable>) -> fs::Result { table.map(|e| e.insert(&self.wq)); - let mut flags = fs::inode::PollFlags::IN | fs::inode::PollFlags::OUT; + let mut flags = fs::inode::PollFlags::OUT; + + if !self.buffer.lock_irq().is_empty() { + flags |= fs::inode::PollFlags::IN; + } Ok(flags) } @@ -104,6 +116,14 @@ impl INodeInterface for Master { *id = self.id; } + aero_syscall::TIOCSWINSZ => { + let winsize = VirtAddr::new(arg as u64) + .read_mut::() + .ok_or(FileSystemError::NotSupported)?; + + *self.window_size.lock_irq() = *winsize; + } + _ => { log::warn!("ptmx: unknown ioctl (command={command:#x})") } @@ -114,7 +134,6 @@ impl INodeInterface for Master { } struct SlaveInner { - window_size: WinSize, termios: Termios, } @@ -128,7 +147,6 @@ impl Slave { Self { master, inner: Mutex::new(SlaveInner { - window_size: WinSize::default(), termios: Termios { c_iflag: 0, c_oflag: aero_syscall::TermiosOFlag::empty(), @@ -162,21 +180,12 @@ impl INodeInterface for Slave { let mut inner = self.inner.lock_irq(); match command { - aero_syscall::TIOCSWINSZ => { - let winsize = VirtAddr::new(arg as u64) - .read_mut::() - .ok_or(FileSystemError::NotSupported)?; - - inner.window_size = *winsize; - Ok(0) - } - aero_syscall::TIOCGWINSZ => { let winsize = VirtAddr::new(arg as u64) .read_mut::() .ok_or(FileSystemError::NotSupported)?; - *winsize = inner.window_size; + *winsize = *self.master.window_size.lock_irq(); Ok(0) } diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 91bc0f86f29..556de74d880 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -248,12 +248,12 @@ impl INodeInterface for Tty { } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { - let mut state = self.state.lock_irq(); - let mut performer = AnsiEscape; + // let mut state = self.state.lock_irq(); + // let mut performer = AnsiEscape; - for character in buffer.iter() { - state.parser.advance(&mut performer, *character); - } + // for character in buffer.iter() { + // state.parser.advance(&mut performer, *character); + // } log::debug!("TTY::write_at(): {}", unsafe { core::str::from_utf8_unchecked(buffer) diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index 1b252391852..f18f38696bb 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -23,6 +23,7 @@ use aero_syscall::SyscallError; use alloc::sync::Arc; use hashbrown::HashMap; +use crate::fs::cache::DirCacheImpl; use crate::userland::scheduler; use crate::utils::sync::Mutex; @@ -34,6 +35,14 @@ pub struct EPoll { } impl EPoll { + // FIXME: The bitflags does not support bitwise or operations in const. + const PRIVATE_BITS: EPollEventFlags = EPollEventFlags::from_bits_truncate( + EPollEventFlags::WAKEUP.bits() + | EPollEventFlags::ONESHOT.bits() + | EPollEventFlags::ET.bits() + | EPollEventFlags::EXCLUSIVE.bits(), + ); + pub fn new() -> Arc { Arc::new(Self { events: Mutex::new(HashMap::new()), @@ -129,6 +138,7 @@ impl EPoll { } ret_events[n].events = EPollEventFlags::empty(); + ret_events[n].data = unsafe { core::mem::zeroed() }; let fd = file_table .get_handle(*fd) @@ -137,15 +147,29 @@ impl EPoll { let flags = epoll_event.events; let ready: EPollEventFlags = fd.inode().poll(None)?.into(); + // If the event mask does not contain any poll(2) events, the event + // descriptor is disabled. This is the effe + if flags == Self::PRIVATE_BITS { + continue; + } + if !(ready & flags).is_empty() { ret_events[n].events = ready & flags; + ret_events[n].data = epoll_event.data; + + if flags.contains(EPollEventFlags::ONESHOT) { + // The `EPOLLONESHOT` bit that disables the descriptor when an event is + // received, until the next `EPOLL_CTL_MOD` will be issued. + epoll_event.events = Self::PRIVATE_BITS; + } + n += 1; continue; } - // // Not ready; add the event to the poll table. + // Not ready; add the event to the poll table. fd.inode().poll(Some(&mut poll_table))?; - fds.push(fd); + fds.push((fd, epoll_event, flags)); } // If all events are ready, we can return now. @@ -161,17 +185,27 @@ impl EPoll { } 'search: loop { - for (i, fd) in fds.iter().enumerate() { + for (fd, event, flags) in fds.iter_mut() { + // If the event mask does not contain any poll(2) events, the event + // descriptor is disabled. This is the effe + if *flags == Self::PRIVATE_BITS { + continue; + } + let ready: EPollEventFlags = fd.inode().poll(None)?.into(); - let flags = table - .get(&fd.fd) - .ok_or(FileSystemError::NotSupported)? - .events; - if !(ready & flags).is_empty() { + if !(ready & *flags).is_empty() { // The event is ready; break out of the search loop and set ready // events to 1. - ret_events[i].events = ready & flags; + ret_events[n].events = ready & *flags; + ret_events[n].data = event.data; + + if flags.contains(EPollEventFlags::ONESHOT) { + // The `EPOLLONESHOT` bit that disables the descriptor when an event is + // received, until the next `EPOLL_CTL_MOD` will be issued. + event.events = Self::PRIVATE_BITS; + } + n = 1; break 'search; } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index d4c926d93e8..6aaaa7e108e 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -21,6 +21,7 @@ use aero_syscall::signal::SigProcMask; use aero_syscall::{prelude::*, TimeSpec}; use aero_syscall::{OpenFlags, Stat, SyscallError}; +use crate::fs::cache::DirCacheImpl; use crate::fs::epoll::EPoll; use crate::fs::eventfd::EventFd; use crate::fs::file_table::DuplicateHint; diff --git a/src/aero_kernel/src/syscall/time.rs b/src/aero_kernel/src/syscall/time.rs index e0e5f352e91..2d7668ec366 100644 --- a/src/aero_kernel/src/syscall/time.rs +++ b/src/aero_kernel/src/syscall/time.rs @@ -68,7 +68,7 @@ pub fn gettime(clock: usize, timespec: &mut TimeSpec) -> Result>> = Mutex::new(Vec::new()); pub fn check_timers() { - // if let Some(task) = TIMERS.lock_irq().pop() { + // for task in TIMERS.lock_irq().iter() { // task.signal(aero_syscall::signal::SIGALRM); // } } From 57b24173d45919928b91bdfc6f934f2503e00d52 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 18 Dec 2022 14:27:04 +1100 Subject: [PATCH 093/368] kernel::syscall: implement sys_readlink Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/syscall/fs.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 6aaaa7e108e..289d451090e 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -413,10 +413,14 @@ pub fn stat(path: &Path, stat: &mut Stat) -> Result { } #[syscall] -pub fn read_link(path: &Path, _buffer: &mut [u8]) -> Result { - log::warn!("read_link: is a stub! (path={path:?})"); +pub fn read_link(path: &Path, buffer: &mut [u8]) -> Result { + // XXX: lookup_path with automatically resolve the link. + let file = fs::lookup_path(path)?; + let resolved_path = file.absolute_path_str(); + let size = core::cmp::min(resolved_path.len(), buffer.len()); - Err(SyscallError::EINVAL) + buffer[..size].copy_from_slice(&resolved_path.as_bytes()[..size]); + Ok(size) } /// Returns a file descriptor referring to the new epoll instance. From 6796a7a7ae26ce59adec4f2ba716b1b67402701a Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 19 Dec 2022 16:24:26 +1100 Subject: [PATCH 094/368] kernel: PTY convert NL to CRNL Signed-off-by: Andy-Python-Programmer --- base-files/.bashrc | 2 +- patches/mlibc/mlibc.patch | 36 ++++++++++++---- src/aero_kernel/src/drivers/pty.rs | 30 ++++++++++--- src/aero_kernel/src/drivers/tty.rs | 2 +- src/aero_kernel/src/fs/ext2/mod.rs | 42 ++++++++++++++----- src/aero_kernel/src/syscall/fs.rs | 5 +++ src/aero_kernel/src/syscall/mod.rs | 1 + src/aero_syscall/src/consts.rs | 1 + src/aero_syscall/src/lib.rs | 67 +++++++++++++++++++++--------- userland/apps/init/src/main.rs | 1 + 10 files changed, 140 insertions(+), 47 deletions(-) diff --git a/base-files/.bashrc b/base-files/.bashrc index 113a1e11098..3c47db12580 100644 --- a/base-files/.bashrc +++ b/base-files/.bashrc @@ -4,7 +4,7 @@ HISTCONTROL=ignoredups HISTSIZE=-1 HISTFILESIZE=-1 -export TERM=linux +export TERM=xterm-256color alias ls="ls --color=auto" alias clear='printf "\e[2J\e[H"' diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index c32aae3a8af..29848ffe16f 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,6 +1,6 @@ -From f7b84e6b068490f1cd5516a2fd7e66ec5945beae Mon Sep 17 00:00:00 2001 +From 9f270baad38e7f90bd7c67780ae8f78d66c00de5 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sat, 17 Dec 2022 15:09:28 +1100 +Date: Sun, 18 Dec 2022 14:31:45 +1100 Subject: [PATCH] --- @@ -11,12 +11,12 @@ Subject: [PATCH] options/posix/generic/termios-stubs.cpp | 5 +- options/rtdl/generic/linker.cpp | 2 +- sysdeps/aero/generic/aero.cpp | 71 +++++---- - sysdeps/aero/generic/filesystem.cpp | 25 +++- + sysdeps/aero/generic/filesystem.cpp | 35 ++++- sysdeps/aero/generic/sockets.cpp | 87 ++++++++++- sysdeps/aero/generic/time.cpp | 24 +++ - sysdeps/aero/include/aero/syscall.h | 8 + + sysdeps/aero/include/aero/syscall.h | 9 ++ sysdeps/aero/meson.build | 1 + - 12 files changed, 371 insertions(+), 45 deletions(-) + 12 files changed, 381 insertions(+), 46 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -440,7 +440,7 @@ index 29fb961..ee09678 100644 } diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index a3e2aca..4187059 100644 +index a3e2aca..a4edac3 100644 --- a/sysdeps/aero/generic/filesystem.cpp +++ b/sysdeps/aero/generic/filesystem.cpp @@ -158,11 +158,6 @@ int sys_tcsetattr(int fd, int optional_action, const struct termios *attr) { @@ -455,7 +455,24 @@ index a3e2aca..4187059 100644 int sys_mkdir(const char *path, mode_t) { auto result = syscall(SYS_MKDIR, path, strlen(path)); -@@ -357,4 +352,24 @@ int sys_eventfd_create(unsigned int initval, int flags, int *fd) { +@@ -243,7 +238,15 @@ int sys_open_dir(const char *path, int *handle) { + return sys_open(path, O_DIRECTORY, 0, handle); + } + +-int sys_rename(const char *path, const char *new_path) UNIMPLEMENTED("sys_rename") ++int sys_rename(const char *path, const char *new_path) { ++ auto result = syscall(SYS_RENAME, path, strlen(path), new_path, strlen(new_path)); ++ ++ if (result < 0) { ++ return -result; ++ } ++ ++ return 0; ++} + + int sys_readlink(const char *path, void *buffer, size_t max_size, ssize_t *length) { + auto result = syscall(SYS_READ_LINK, path, strlen(path), buffer, max_size); +@@ -357,4 +360,24 @@ int sys_eventfd_create(unsigned int initval, int flags, int *fd) { *fd = result; return 0; } @@ -621,10 +638,10 @@ index 0000000..460412d +} \ No newline at end of file diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 12f8dc6..7fba5dd 100644 +index 12f8dc6..afb45f8 100644 --- a/sysdeps/aero/include/aero/syscall.h +++ b/sysdeps/aero/include/aero/syscall.h -@@ -64,6 +64,14 @@ +@@ -64,6 +64,15 @@ #define SYS_FUTEX_WAIT 57 #define SYS_FUTEX_WAKE 58 #define SYS_LINK 59 @@ -636,6 +653,7 @@ index 12f8dc6..7fba5dd 100644 +#define SYS_GETITIMER 65 +#define SYS_GETPPID 66 +#define SYS_SOCKET_PAIR 67 ++#define SYS_RENAME 68 // Invalid syscall used to trigger a log error in the kernel (as a hint) // so, that we can implement the syscall in the kernel. diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 349619cbb2c..87f422e8c5e 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -80,9 +80,7 @@ impl INodeInterface for Master { return Err(FileSystemError::WouldBlock); } - // let mut pty_buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; let size = core::cmp::min(pty_buffer.len(), buffer.len()); - buffer[..size].copy_from_slice(&pty_buffer.drain(..size).collect::>()); Ok(size) } @@ -148,8 +146,8 @@ impl Slave { master, inner: Mutex::new(SlaveInner { termios: Termios { - c_iflag: 0, - c_oflag: aero_syscall::TermiosOFlag::empty(), + c_iflag: aero_syscall::TermiosIFlag::empty(), + c_oflag: aero_syscall::TermiosOFlag::ONLCR, c_cflag: aero_syscall::TermiosCFlag::empty(), c_lflag: aero_syscall::TermiosLFlag::ECHO | aero_syscall::TermiosLFlag::ICANON, c_line: 0, @@ -234,8 +232,28 @@ impl INodeInterface for Slave { } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { - let mut pty_buffer = self.master.buffer.lock_irq(); - pty_buffer.extend_from_slice(buffer); + if self + .inner + .lock_irq() + .termios + .c_oflag + .contains(aero_syscall::TermiosOFlag::ONLCR) + { + let mut master = self.master.buffer.lock_irq(); + + for b in buffer.iter() { + if *b == b'\n' { + // ONLCR: Convert NL to CR + NL + master.extend_from_slice(&[b'\r', b'\n']); + continue; + } + + master.push(*b); + } + } else { + let mut pty_buffer = self.master.buffer.lock_irq(); + pty_buffer.extend_from_slice(buffer); + } self.master.wq.notify_complete(); Ok(buffer.len()) diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 556de74d880..1035fe3c47e 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -38,7 +38,7 @@ lazy_static::lazy_static! { static ref TTY: Arc = Tty::new(); static ref TERMIOS: Mutex = Mutex::new(aero_syscall::Termios { - c_iflag: 0, + c_iflag: aero_syscall::TermiosIFlag::empty(), c_oflag: aero_syscall::TermiosOFlag::empty(), c_cflag: aero_syscall::TermiosCFlag::empty(), c_lflag: aero_syscall::TermiosLFlag::ECHO | aero_syscall::TermiosLFlag::ICANON, diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 83353df002c..c24a8e6e6de 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -36,6 +36,7 @@ use crate::mem::paging::{FrameAllocator, PhysFrame, VirtAddr, FRAME_ALLOCATOR}; use crate::socket::unix::UnixSocket; use crate::socket::SocketAddr; +use crate::utils::CeilDiv; use self::group_desc::GroupDescriptors; @@ -165,25 +166,46 @@ impl INode { pub fn append_block(&self) -> Option { let fs = self.fs.upgrade().expect("ext2: filesystem was dropped"); let block_size = fs.superblock.block_size(); + let entries_per_block = fs.superblock.entries_per_block(); let new_block = fs.bgdt.alloc_block_ptr()?; let data_ptrs = self.inode.read().data_ptr; - // Check if the there are free direct data pointers avaliable to - // insert the new block.. - for (i, block) in data_ptrs[..12].iter().enumerate() { - if *block == 0 { - drop(data_ptrs); + let mut next_block_num = (self.inode.read().size_lower as usize).ceil_div(block_size); - let mut inode = self.inode.write(); - inode.data_ptr[i] = new_block as u32; - inode.size_lower += block_size as u32; + if next_block_num < 12 { + drop(data_ptrs); - return Some(new_block); + let mut inode = self.inode.write(); + + assert_eq!(inode.data_ptr[next_block_num], 0); + + inode.data_ptr[next_block_num] = new_block as u32; + inode.size_lower += block_size as u32; + + return Some(new_block); + } + + // indirect block + next_block_num -= 12; + + if next_block_num >= entries_per_block { + unimplemented!("append_block: doubly and triply indirect") + } else { + // singly indirect block + let mut block_ptrs = self.inode.read().data_ptr[12] as usize; + + if block_ptrs == 0 { + block_ptrs = fs.bgdt.alloc_block_ptr()?; } + + let block_ptrs = block_ptrs * block_size; + let offset = block_ptrs + (new_block * core::mem::size_of::()); + + fs.block.write(offset, &new_block.to_le_bytes()); } - todo!("append_block: indirect blocks") + Some(new_block) } pub fn get_block(&self, mut block: usize) -> Option { diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 289d451090e..8d9723caa79 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -645,3 +645,8 @@ pub fn poll(fds: &mut [PollFd], timeout: usize, sigmask: usize) -> Result Result { + Ok(0) +} diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 8b47eccf1ba..396a3bc0d1a 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -273,6 +273,7 @@ pub fn generic_do_syscall( SYS_EVENT_FD => fs::event_fd(b, c), SYS_LINK => fs::link(b, c, d, e), SYS_POLL => fs::poll(b, c, d, e), + SYS_RENAME => fs::rename(b, c, d, e), // epoll calls: SYS_EPOLL_CREATE => fs::epoll_create(b), diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index f8e936ee4dc..2f5eaa045c1 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -88,6 +88,7 @@ pub const SYS_SETITIMER: usize = 64; pub const SYS_GETITIMER: usize = 65; pub const SYS_GETPPID: usize = 66; pub const SYS_SOCKET_PAIR: usize = 67; +pub const SYS_RENAME: usize = 68; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index b4395f47ed4..14a1f7aeff4 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -55,25 +55,33 @@ bitflags::bitflags! { bitflags::bitflags! { pub struct OpenFlags: usize { - const O_ACCMODE = 0x0007; - const O_EXEC = 1; - const O_RDONLY = 2; - const O_RDWR = 3; - const O_SEARCH = 4; - const O_WRONLY = 5; - const O_APPEND = 0x0008; - const O_CREAT = 0x0010; - const O_DIRECTORY = 0x0020; - const O_EXCL = 0x0040; - const O_NOCTTY = 0x0080; - const O_NOFOLLOW = 0x0100; - const O_TRUNC = 0x0200; - const O_NONBLOCK = 0x0400; - const O_DSYNC = 0x0800; - const O_RSYNC = 0x1000; - const O_SYNC = 0x2000; - const O_CLOEXEC = 0x4000; - const O_PATH = 0x8000; + // reserve 3 bits for the access mode + const O_ACCMODE = 0x0007; + const O_EXEC = 1; + const O_RDONLY = 2; + const O_RDWR = 3; + const O_SEARCH = 4; + const O_WRONLY = 5; + + // these flags get their own bit + const O_APPEND = 0x000008; + const O_CREAT = 0x000010; + const O_DIRECTORY = 0x000020; + const O_EXCL = 0x000040; + const O_NOCTTY = 0x000080; + const O_NOFOLLOW = 0x000100; + const O_TRUNC = 0x000200; + const O_NONBLOCK = 0x000400; + const O_DSYNC = 0x000800; + const O_RSYNC = 0x001000; + const O_SYNC = 0x002000; + const O_CLOEXEC = 0x004000; + const O_PATH = 0x008000; + const O_LARGEFILE = 0x010000; + const O_NOATIME = 0x020000; + const O_ASYNC = 0x040000; + const O_TMPFILE = 0x080000; + const O_DIRECT = 0x100000; } } @@ -289,6 +297,25 @@ pub struct WinSize { pub ws_ypixel: u16, } +// abis/linux/termios.h +bitflags::bitflags! { + #[derive(Default)] + pub struct TermiosIFlag: u32 { + const BRKINT = 0o000002; + const ICRNL = 0o000400; + const IGNBRK = 0o000001; + const IGNCR = 0o000200; + const IGNPAR = 0o000004; + const INLCR = 0o000100; + const INPCK = 0o000020; + const ISTRIP = 0o000040; + const IXANY = 0o004000; + const IXOFF = 0o010000; + const IXON = 0o002000; + const PARMRK = 0o000010; + } +} + bitflags::bitflags! { #[derive(Default)] pub struct TermiosLFlag: u32 { @@ -361,7 +388,7 @@ bitflags::bitflags! { #[derive(Debug, Default, Copy, Clone)] #[repr(C)] pub struct Termios { - pub c_iflag: u32, + pub c_iflag: TermiosIFlag, pub c_oflag: TermiosOFlag, pub c_cflag: TermiosCFlag, pub c_lflag: TermiosLFlag, diff --git a/userland/apps/init/src/main.rs b/userland/apps/init/src/main.rs index 97c56e8c9fb..6e833ed4747 100644 --- a/userland/apps/init/src/main.rs +++ b/userland/apps/init/src/main.rs @@ -36,6 +36,7 @@ fn main() -> Result<(), Box> { Command::new("/usr/bin/startx") .env("RUST_BACKTRACE", "full") + .env("TERM", "linux") .spawn()?; loop {} From 56d993a4bb8837b54a957fa942dc743075f78299 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 22 Dec 2022 13:16:09 +1100 Subject: [PATCH 095/368] bootstrap: neofetch Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 12 ++++++++++ patches/dwm/dwm.patch | 8 +++---- patches/neofetch/neofetch.patch | 34 ++++++++++++++++++++++++++++ src/aero_kernel/src/drivers/pty.rs | 13 +++++++++-- src/aero_kernel/src/drivers/tty.rs | 10 ++++---- src/aero_kernel/src/fs/cache.rs | 2 +- src/aero_kernel/src/fs/devfs.rs | 4 ++-- src/aero_kernel/src/fs/epoll.rs | 1 - src/aero_kernel/src/fs/file_table.rs | 32 +++++++++++++++++++++++++- src/aero_kernel/src/fs/pipe.rs | 23 +++++++++++++++---- src/aero_kernel/src/fs/ramfs.rs | 5 +++- src/aero_kernel/src/syscall/fs.rs | 7 ++++-- src/aero_kernel/src/userland/task.rs | 10 ++++++++ src/aero_kernel/src/utils/buffer.rs | 2 +- userland/apps/init/src/main.rs | 3 +-- 15 files changed, 140 insertions(+), 26 deletions(-) create mode 100644 patches/neofetch/neofetch.patch diff --git a/bootstrap.yml b/bootstrap.yml index 8bc22b18c7e..b3847ce36e8 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -556,6 +556,18 @@ packages: environ: RUSTFLAGS: '-Cforce-frame-pointers=yes -Clink-args=-no-pie' + - name: neofetch + source: + subdir: bundled + git: 'https://github.com/Andy-Python-Programmer/neofetch' + branch: 'master' + configure: + - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + build: + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + # - name: ripgrep # source: # subdir: bundled diff --git a/patches/dwm/dwm.patch b/patches/dwm/dwm.patch index 40756160e48..6e1f9955786 100644 --- a/patches/dwm/dwm.patch +++ b/patches/dwm/dwm.patch @@ -1,6 +1,6 @@ -From 8b93ffe3d30e2b2d7424b2a9fa7fa93e77f362c2 Mon Sep 17 00:00:00 2001 +From 18f9a4c102c12aea6e567501fcb003c4573c844a Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 18 Dec 2022 13:40:10 +1100 +Date: Wed, 21 Dec 2022 12:20:18 +1100 Subject: [PATCH] --- @@ -9,7 +9,7 @@ Subject: [PATCH] 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config.def.h b/config.def.h -index 9efa774..20b1681 100644 +index 9efa774..ce9d766 100644 --- a/config.def.h +++ b/config.def.h @@ -57,8 +57,8 @@ static const Layout layouts[] = { @@ -19,7 +19,7 @@ index 9efa774..20b1681 100644 -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; +static const char *dmenucmd[] = { "alacritty", NULL }; -+static const char *termcmd[] = { "limine-term", NULL }; ++static const char *termcmd[] = { "glxgears", NULL }; static const Key keys[] = { /* modifier key function argument */ diff --git a/patches/neofetch/neofetch.patch b/patches/neofetch/neofetch.patch new file mode 100644 index 00000000000..6b2a9572e7d --- /dev/null +++ b/patches/neofetch/neofetch.patch @@ -0,0 +1,34 @@ +From f1fae2e54122bb1342dec30f218a4bdcdaf3c428 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Wed, 21 Dec 2022 17:37:50 +1100 +Subject: [PATCH] + +--- + neofetch | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/neofetch b/neofetch +index 9f2ba30..2d5c4de 100755 +--- a/neofetch ++++ b/neofetch +@@ -945,7 +945,7 @@ get_os() { + AIX) os=AIX ;; + IRIX*) os=IRIX ;; + FreeMiNT) os=FreeMiNT ;; +- aero) os=Aero;; ++ Aero) os=Aero;; + + Linux|GNU*) + os=Linux +@@ -8528,7 +8528,7 @@ EOF + # TODO: Add proper art + set_colors 2 1 3 5 + read -rd '' ascii_data <<'EOF' +- ,---, ++${c1} ,---, + ' .' \ + / ; '. + : : \ +-- +2.38.1 + diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 87f422e8c5e..42596288a71 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -35,6 +35,7 @@ use crate::fs::cache::*; use crate::fs::devfs; use crate::fs::devfs::DEV_FILESYSTEM; use crate::fs::inode::FileType; +use crate::fs::inode::PollFlags; use crate::fs::inode::{DirEntry, INodeInterface}; use crate::fs::FileSystem; use crate::fs::Path; @@ -215,8 +216,16 @@ impl INodeInterface for Slave { } } - fn poll(&self, _table: Option<&mut fs::inode::PollTable>) -> fs::Result { - panic!() + fn poll(&self, table: Option<&mut fs::inode::PollTable>) -> fs::Result { + table.map(|e| e.insert(&self.master.wq)); + + let mut flags = PollFlags::OUT; + + if !self.master.slave_buffer.lock_irq().is_empty() { + flags |= PollFlags::IN; + } + + Ok(flags) } fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 1035fe3c47e..1391fffbbaf 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -248,12 +248,12 @@ impl INodeInterface for Tty { } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { - // let mut state = self.state.lock_irq(); - // let mut performer = AnsiEscape; + let mut state = self.state.lock_irq(); + let mut performer = AnsiEscape; - // for character in buffer.iter() { - // state.parser.advance(&mut performer, *character); - // } + for character in buffer.iter() { + state.parser.advance(&mut performer, *character); + } log::debug!("TTY::write_at(): {}", unsafe { core::str::from_utf8_unchecked(buffer) diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index afeb02033f7..8a6e461936b 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -204,7 +204,7 @@ impl> Cache { Arc::new_cyclic(|this| Cache:: { index: Mutex::new(CacheIndex { used: hashbrown::HashMap::new(), - unused: lru::LruCache::new(NonZeroUsize::new(512).unwrap()), + unused: lru::LruCache::new(NonZeroUsize::new(4096).unwrap()), }), self_ref: this.clone(), }) diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index c39d1393449..b77935b37db 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -185,8 +185,8 @@ impl INodeInterface for DevNull { Ok(0x00) } - fn write_at(&self, _offset: usize, _buffer: &[u8]) -> Result { - Ok(0x00) + fn write_at(&self, _offset: usize, buffer: &[u8]) -> Result { + Ok(buffer.len()) } } diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index f18f38696bb..e19799ef106 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -23,7 +23,6 @@ use aero_syscall::SyscallError; use alloc::sync::Arc; use hashbrown::HashMap; -use crate::fs::cache::DirCacheImpl; use crate::userland::scheduler; use crate::utils::sync::Mutex; diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index 3b487aaaf6f..4248e201206 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -185,7 +185,7 @@ impl FileHandle { } #[repr(transparent)] -pub struct FileTable(RwLock>>>); +pub struct FileTable(pub RwLock>>>); impl FileTable { pub fn new() -> Self { @@ -221,6 +221,23 @@ impl FileTable { } } + pub fn close_on_exec(&self) { + let mut files = self.0.write(); + + for file in files.iter_mut() { + if let Some(handle) = file { + let flags = *handle.flags.read(); + + if flags.contains(OpenFlags::O_CLOEXEC) + || handle.fd_flags.lock().contains(FdFlags::CLOEXEC) + { + handle.inode().close(flags); + *file = None; + } + } + } + } + /// Duplicates the provided file descriptor based on the provided duplicate /// descriptor hint. Check out the documentation for [`DuplicateHint`] for more /// information. @@ -287,6 +304,19 @@ impl FileTable { pub fn deep_clone(&self) -> Self { let files = self.0.read(); + + for file in files.iter() { + if let Some(handle) = file { + let flags = *handle.flags.read(); + + handle + .inode + .inode() + .open(flags, handle.clone()) + .expect("FileTable::clone: failed to open file"); + } + } + Self(RwLock::new(files.clone())) } diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index e2cf631fc86..5ceef001ce9 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -2,6 +2,7 @@ use core::sync::atomic::{AtomicUsize, Ordering}; use aero_syscall::OpenFlags; use alloc::sync::Arc; +use spin::Once; use crate::utils::buffer::Buffer; use crate::utils::sync::{BlockQueue, Mutex}; @@ -9,6 +10,7 @@ use crate::utils::sync::{BlockQueue, Mutex}; use super::cache::DirCacheItem; use super::file_table::FileHandle; use super::inode::{INodeInterface, PollFlags, PollTable}; +use super::FileSystemError; pub struct Pipe { queue: Mutex, @@ -18,6 +20,8 @@ pub struct Pipe { /// The number of writers currently connected to the pipe. num_writers: AtomicUsize, + + handle: Once>, } impl Pipe { @@ -29,6 +33,8 @@ impl Pipe { writers: BlockQueue::new(), num_writers: AtomicUsize::new(0), + + handle: Once::new(), }) } @@ -42,11 +48,12 @@ impl INodeInterface for Pipe { fn open( &self, flags: OpenFlags, - _handle: Arc, + handle: Arc, ) -> super::Result> { // Write end of the pipe: if flags.contains(OpenFlags::O_WRONLY) { self.num_writers.fetch_add(1, Ordering::SeqCst); + self.handle.call_once(|| handle); } Ok(None) @@ -65,12 +72,20 @@ impl INodeInterface for Pipe { } fn read_at(&self, _offset: usize, buf: &mut [u8]) -> super::Result { - if self.active_writers() == 0 { - return Ok(0); + let flags = *self + .handle + .get() + .expect("pipe: internal error") + .flags + .read(); + + let nonblock = flags.contains(OpenFlags::O_NONBLOCK); + if nonblock && !self.queue.lock_irq().has_data() { + return Err(FileSystemError::WouldBlock); } let mut buffer = self.readers.block_on(&self.queue, |lock| { - lock.has_data() || self.active_writers() != 0 + lock.has_data() || self.active_writers() == 0 })?; let read = buffer.read_data(buf); diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index faba311d57b..58e7ab7c51a 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -254,7 +254,10 @@ impl INodeInterface for LockedRamINode { return Ok(()); } - _ => Err(FileSystemError::NotSupported), + _ => { + log::warn!("ramfs: truncation is not supported"); + Ok(()) + } } } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 8d9723caa79..0c4979ebf19 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -268,8 +268,8 @@ pub fn pipe(fds: &mut [i32; 2], flags: usize) -> Result { let entry = DirEntry::from_inode(pipe, String::from("")); - let flags_1 = OpenFlags::O_RDONLY | (flags & OpenFlags::O_CLOEXEC); - let flags_2 = OpenFlags::O_WRONLY | (flags & OpenFlags::O_CLOEXEC); + let flags_1 = OpenFlags::O_RDONLY | flags; + let flags_2 = OpenFlags::O_WRONLY | flags; let current_task = scheduler::get_scheduler().current_task(); @@ -287,6 +287,9 @@ pub fn pipe(fds: &mut [i32; 2], flags: usize) -> Result { Ok(fd2) => fd2, }; + log::info!("pipe() = [{}, {}]", fd1, fd2); + crate::unwind::unwind_stack_trace(); + fds[0] = fd1 as i32; fds[1] = fd2 as i32; diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index ad6fe3eb5d4..412575a5e94 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -477,6 +477,8 @@ impl Task { *self.cwd.write() = Some(Cwd::new()) } + self.file_table.close_on_exec(); + self.file_table.log(); *self.executable.lock() = Some(executable.clone()); @@ -505,6 +507,14 @@ impl Task { } pub(super) fn update_state(&self, state: TaskState) { + if state == TaskState::Zombie { + for file in self.file_table.0.read().iter() { + if let Some(a) = file { + a.inode().close(*a.flags.read()); + } + } + } + if state != TaskState::Runnable { log::warn!( "Task::update_state() updated the task state to {state:?}! (pid={:?}, tid={:?})", diff --git a/src/aero_kernel/src/utils/buffer.rs b/src/aero_kernel/src/utils/buffer.rs index 695f8aecc25..2c0424233d1 100644 --- a/src/aero_kernel/src/utils/buffer.rs +++ b/src/aero_kernel/src/utils/buffer.rs @@ -22,7 +22,7 @@ use core::fmt::Write; use alloc::vec::Vec; pub struct Buffer { - data: Vec, + pub data: Vec, } impl Buffer { diff --git a/userland/apps/init/src/main.rs b/userland/apps/init/src/main.rs index 6e833ed4747..de4f84c33f5 100644 --- a/userland/apps/init/src/main.rs +++ b/userland/apps/init/src/main.rs @@ -34,9 +34,8 @@ fn main() -> Result<(), Box> { mem::forget(OpenOptions::new().write(true).open(TTY_PATH)?); // fd=1 for stdout mem::forget(OpenOptions::new().write(true).open(TTY_PATH)?); // fd=2 for stderr - Command::new("/usr/bin/startx") + Command::new("startx") .env("RUST_BACKTRACE", "full") - .env("TERM", "linux") .spawn()?; loop {} From 20d4f3697b63fc7cbfb67c6f404b376842f65c81 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 22 Dec 2022 17:49:22 +1100 Subject: [PATCH 096/368] aero.py: abort if xbstrap fails Signed-off-by: Andy-Python-Programmer --- aero.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/aero.py b/aero.py index ef3ec84da23..2efba42ca85 100755 --- a/aero.py +++ b/aero.py @@ -295,14 +295,20 @@ def build_userland_sysroot(minimal): def run_xbstrap(args): try: - run_command(['xbstrap', *args], cwd=SYSROOT_DIR) + return run_command(['xbstrap', *args], cwd=SYSROOT_DIR) except FileNotFoundError: - run_command([f'{os.environ["HOME"]}/.local/bin/xbstrap', *args], cwd=SYSROOT_DIR) + return run_command([f'{os.environ["HOME"]}/.local/bin/xbstrap', *args], cwd=SYSROOT_DIR) + + command = ['install', '-u', '--all'] if minimal: - run_xbstrap(['install', '-u', 'bash', 'coreutils']) - else: - run_xbstrap(['install', '-u', '--all']) + command = ['install', '-u', 'bash', 'coreutils'] + + code, _, _ = run_xbstrap(command) + + if code != 0: + log_error(f"`xbstrap {' '.join(command)}` exited with a non-zero status code") + exit(1) def build_userland(args): From 1e4f2aae7a684cafbe8f6dbd46858218f4c603fa Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 22 Dec 2022 19:06:44 +1100 Subject: [PATCH 097/368] bootstrap::{xorg-server, libxcb}: build without debug info Signed-off-by: Andy-Python-Programmer --- bootstrap/xorg.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index b5fe6c3d890..a9d46351942 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -335,7 +335,6 @@ packages: - '--without-doxygen' - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. environ: - CFLAGS: '-g -O0' PYTHON: '@BUILD_ROOT@/tools/host-python/bin/python3.8' build: - args: ['make', '-j@PARALLELISM@'] @@ -894,7 +893,7 @@ packages: - '--disable-glamor' - '--disable-glx' environ: - CFLAGS: '-Wno-error=array-bounds -O0 -g -pipe' + CFLAGS: '-Wno-error=array-bounds -pipe' build: - args: ['make', '-j@PARALLELISM@'] - args: ['make', 'install'] From 094567dc8c4e0edd45ffecb390b840c0993dfc36 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 22 Dec 2022 19:07:33 +1100 Subject: [PATCH 098/368] syscall::{epoll, poll}: block the task instead of spinning Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/epoll.rs | 6 ++++-- src/aero_kernel/src/syscall/fs.rs | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index e19799ef106..79aa1900cf6 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -147,7 +147,7 @@ impl EPoll { let ready: EPollEventFlags = fd.inode().poll(None)?.into(); // If the event mask does not contain any poll(2) events, the event - // descriptor is disabled. This is the effe + // descriptor is disabled. if flags == Self::PRIVATE_BITS { continue; } @@ -184,9 +184,11 @@ impl EPoll { } 'search: loop { + scheduler::get_scheduler().inner.await_io()?; + for (fd, event, flags) in fds.iter_mut() { // If the event mask does not contain any poll(2) events, the event - // descriptor is disabled. This is the effe + // descriptor is disabled. if *flags == Self::PRIVATE_BITS { continue; } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 0c4979ebf19..e273b6881b1 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -608,6 +608,8 @@ fn do_poll(fds: &mut [PollFd], timeout: Option<&TimeSpec>) -> Result Date: Thu, 22 Dec 2022 19:11:19 +1100 Subject: [PATCH 099/368] net::socket_pair: fix `fds` type Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/syscall/mod.rs | 2 +- src/aero_kernel/src/syscall/net.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 396a3bc0d1a..157c0958cca 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -286,7 +286,7 @@ pub fn generic_do_syscall( SYS_LISTEN => net::listen(b, c), SYS_ACCEPT => net::accept(b, c, d), SYS_SOCK_RECV => net::sock_recv(b, c, d), - SYS_SOCKET_PAIR => net::socket_pair(b, c, d, e, f), + SYS_SOCKET_PAIR => net::socket_pair(b, c, d, e), SYS_GETTIME => time::gettime(b, c), SYS_SLEEP => time::sleep(b), diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index 06e55839952..0d294c47e5a 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -155,7 +155,7 @@ pub fn socket_pair( domain: usize, type_and_flags: usize, protocol: usize, - fds: &mut [i32], + fds: &mut [i32; 2], ) -> Result { let current_task = scheduler::get_scheduler().current_task(); let sockfd_flags = SocketFlags::from_bits_truncate(type_and_flags).into(); From 07a64236fb15dc65c0bf936abf63585969f0c8a0 Mon Sep 17 00:00:00 2001 From: Kian-Meng Ang Date: Fri, 23 Dec 2022 05:34:07 +0800 Subject: [PATCH 100/368] Fix typos Found via: - `codespell -S patches,bundled -L crate,struc,inout,statics,ist,ser,doas` - `typos --format brief`. --- README.md | 6 ++-- aero.py | 4 +-- base-files/hello.asm | 2 +- bootstrap.yml | 10 +++---- src/aero_kernel/build.rs | 2 +- src/aero_kernel/src/acpi/fadt.rs | 2 +- src/aero_kernel/src/acpi/mcfg.rs | 2 +- src/aero_kernel/src/acpi/mod.rs | 2 +- src/aero_kernel/src/arch/aarch64/mod.rs | 4 +-- src/aero_kernel/src/arch/x86_64/apic.rs | 2 +- .../src/arch/x86_64/controlregs.rs | 4 +-- src/aero_kernel/src/arch/x86_64/gdt.rs | 6 ++-- .../src/arch/x86_64/interrupts/exceptions.rs | 2 +- .../src/arch/x86_64/interrupts/mod.rs | 2 +- src/aero_kernel/src/arch/x86_64/mod.rs | 4 +-- src/aero_kernel/src/arch/x86_64/signals.rs | 2 +- .../src/arch/x86_64/syscall_handler.asm | 2 +- src/aero_kernel/src/arch/x86_64/task.rs | 4 +-- src/aero_kernel/src/drivers/block/ahci.rs | 12 ++++---- .../src/drivers/block/ide/registers.rs | 6 ++-- .../src/drivers/block/nvme/queue.rs | 8 ++--- src/aero_kernel/src/drivers/drm/mod.rs | 22 +++++++------- src/aero_kernel/src/drivers/keyboard.rs | 10 +++---- src/aero_kernel/src/drivers/pci.rs | 6 ++-- src/aero_kernel/src/drivers/uart_16550.rs | 4 +-- src/aero_kernel/src/drivers/uart_pl011.rs | 2 +- src/aero_kernel/src/fs/epoll.rs | 2 +- src/aero_kernel/src/fs/ext2/group_desc.rs | 4 +-- src/aero_kernel/src/fs/file_table.rs | 14 ++++----- src/aero_kernel/src/fs/inode.rs | 6 ++-- src/aero_kernel/src/fs/mod.rs | 2 +- src/aero_kernel/src/logger.rs | 2 +- src/aero_kernel/src/main.rs | 2 +- src/aero_kernel/src/mem/mod.rs | 2 +- src/aero_kernel/src/mem/paging/frame.rs | 22 +++++++------- src/aero_kernel/src/mem/paging/mapper.rs | 8 ++--- src/aero_kernel/src/rendy.rs | 2 +- src/aero_kernel/src/socket/unix.rs | 4 +-- src/aero_kernel/src/syscall/fs.rs | 6 ++-- src/aero_kernel/src/syscall/futex.rs | 8 ++--- src/aero_kernel/src/syscall/ipc.rs | 8 ++--- src/aero_kernel/src/unwind.rs | 8 ++--- .../src/userland/scheduler/round_robin.rs | 4 +-- src/aero_kernel/src/userland/task.rs | 2 +- src/aero_kernel/src/userland/vm.rs | 30 +++++++++---------- src/aero_kernel/src/utils/bitmap.rs | 2 +- tools/gdb-debug-userland.py | 2 +- userland/apps/aero_shell/src/main.rs | 2 +- userland/libs/aero_ipc/src/lib.rs | 24 +++++++-------- 49 files changed, 149 insertions(+), 149 deletions(-) diff --git a/README.md b/README.md index c8deb5f4afd..48dbd3b0473 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ No, Aero runs its own kernel that does *not* originate from Linux and does not s # Goals * Creating a modern, safe, beautiful and fast operating system. -* Targetting modern 64-bit architectures and CPU features. +* Targeting modern 64-bit architectures and CPU features. * Good source-level compatibility with Linux so we can port programs over easily. * Making a usable OS which can run on real hardware, not just on emulators or virtual machines. @@ -119,8 +119,8 @@ will not have any effect when you are simply checking or documenting the build. - `--debug` toggles off the release build flag when calling cargo. **Summary**: If the `--debug` flag is not passed then it will build Aero in release mode - and debug symbols will be avaliable. On the other hand, if the debug flag is passed - then it will be built in debug mode and debug symbols will be still avaliable. By default + and debug symbols will be available. On the other hand, if the debug flag is passed + then it will be built in debug mode and debug symbols will be still available. By default Aero is built in release mode (with debug symbols) since it generates faster and smaller binaries which are easier to test. - `--no-run` prevents from running the built disk image in the emulator diff --git a/aero.py b/aero.py index 2efba42ca85..e34deb660cb 100755 --- a/aero.py +++ b/aero.py @@ -49,7 +49,7 @@ def log_error(msg): import requests import xbstrap except ImportError: - log_error('Please install required libraires using the following command:') + log_error('Please install required libraries using the following command:') log_error(' - python3 -m pip install requests xbstrap') sys.exit(0) @@ -575,7 +575,7 @@ def is_kvm_supported() -> bool: fd.close() - # KVM is not avaliable on Windows + # KVM is not available on Windows return False diff --git a/base-files/hello.asm b/base-files/hello.asm index ee386d97bf4..e29fca7d979 100644 --- a/base-files/hello.asm +++ b/base-files/hello.asm @@ -13,7 +13,7 @@ _start: mov rax, 5 ; SYS_EXIT syscall - ud2 ; unreacheable + ud2 ; unreachable section .data msg db "Hello, world!", 0xa diff --git a/bootstrap.yml b/bootstrap.yml index b3847ce36e8..cafc2cbf653 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -302,22 +302,22 @@ tools: - args: | cat << EOF > config.toml changelog-seen = 2 - + [llvm] targets = "X86" - + [build] target = ["x86_64-unknown-aero-system", "x86_64-unknown-linux-gnu"] build-dir = "@THIS_BUILD_DIR@" docs = false - + [install] prefix = "@PREFIX@" - + [rust] codegen-tests = false deny-warnings = false # work around rust-num-cpus warning - + [target.x86_64-unknown-linux-gnu] llvm-config = "@BUILD_ROOT@/tools/host-llvm/bin/llvm-config" diff --git a/src/aero_kernel/build.rs b/src/aero_kernel/build.rs index fef54d2091b..a7e61ad801c 100644 --- a/src/aero_kernel/build.rs +++ b/src/aero_kernel/build.rs @@ -63,7 +63,7 @@ fn main() -> Result<(), Box> { Some(ext) if ext.eq(&OsString::from("inc")) => { let path = path .to_str() - .expect("invalud UTF-8 for file path (skill issue)"); + .expect("invalid UTF-8 for file path (skill issue)"); inc_files.push(path.to_string()) } diff --git a/src/aero_kernel/src/acpi/fadt.rs b/src/aero_kernel/src/acpi/fadt.rs index 31e682225b4..330e3b760af 100644 --- a/src/aero_kernel/src/acpi/fadt.rs +++ b/src/aero_kernel/src/acpi/fadt.rs @@ -34,7 +34,7 @@ pub struct Fadt { // Field used in ACPI 1.0; no longer in use, for compatibility only reserved: u8, - pub preferred_power_managament: u8, + pub preferred_power_management: u8, pub sci_interrupt: u16, pub smi_command_port: u32, pub acpi_enable: u8, diff --git a/src/aero_kernel/src/acpi/mcfg.rs b/src/aero_kernel/src/acpi/mcfg.rs index 53140d9e331..86a79018eff 100644 --- a/src/aero_kernel/src/acpi/mcfg.rs +++ b/src/aero_kernel/src/acpi/mcfg.rs @@ -57,7 +57,7 @@ impl Mcfg { /// /// ## Notes /// Returns false if called before the ACPI tables were initialized. -pub fn is_avaliable() -> bool { +pub fn is_available() -> bool { MCFG.get().is_some() } diff --git a/src/aero_kernel/src/acpi/mod.rs b/src/aero_kernel/src/acpi/mod.rs index a6a97e2dd77..8685086e284 100644 --- a/src/aero_kernel/src/acpi/mod.rs +++ b/src/aero_kernel/src/acpi/mod.rs @@ -18,7 +18,7 @@ */ //! The ACPI (Advanced Configuration and Power Interface) tables help to gather the -//! CPU, interrupt, and timer informations. +//! CPU, interrupt, and timer information. //! //! **Notes**: diff --git a/src/aero_kernel/src/arch/aarch64/mod.rs b/src/aero_kernel/src/arch/aarch64/mod.rs index 36aa7e20a64..2d34734140e 100644 --- a/src/aero_kernel/src/arch/aarch64/mod.rs +++ b/src/aero_kernel/src/arch/aarch64/mod.rs @@ -55,7 +55,7 @@ extern "C" fn arch_aero_main() -> ! { .expect("limine: invalid kernel file pointer"); // Before we start the initialization process, we need to make sure - // the unwind info is avaliable; just in case if there is a kernel + // the unwind info is available; just in case if there is a kernel // panic, it will be able to unwind the stack. crate::unwind::UNWIND_INFO.call_once(|| { use crate::unwind::UnwindInfo; @@ -75,7 +75,7 @@ extern "C" fn arch_aero_main() -> ! { // Now that we have unwind info, we can initialize the COM ports. This // will be used to print panic messages/logs before the debug renderer is - // initialized to the serial output (if avaliable). + // initialized to the serial output (if available). drivers::uart::init(); logger::init(); diff --git a/src/aero_kernel/src/arch/x86_64/apic.rs b/src/aero_kernel/src/arch/x86_64/apic.rs index bf05d776cce..64f27cdd467 100644 --- a/src/aero_kernel/src/arch/x86_64/apic.rs +++ b/src/aero_kernel/src/arch/x86_64/apic.rs @@ -118,7 +118,7 @@ pub struct LocalApic { impl LocalApic { /// Creates a new local APIC instance. /// - /// ## Saftey + /// ## Safety /// The provided `address` points to a valid local APIC memory region and /// the `apic_type` is valid. fn new(address: VirtAddr, apic_type: ApicType) -> Self { diff --git a/src/aero_kernel/src/arch/x86_64/controlregs.rs b/src/aero_kernel/src/arch/x86_64/controlregs.rs index d8663b1bd86..2cab382a896 100644 --- a/src/aero_kernel/src/arch/x86_64/controlregs.rs +++ b/src/aero_kernel/src/arch/x86_64/controlregs.rs @@ -73,7 +73,7 @@ bitflags::bitflags! { const FSGSBASE = 1 << 16; /// Enables process-context identifiers (PCIDs). const PCID = 1 << 17; - /// Enables extendet processor state management instructions, including XGETBV and XSAVE. + /// Enables extended processor state management instructions, including XGETBV and XSAVE. const OSXSAVE = 1 << 18; /// Prevents the execution of instructions that reside in pages accessible by user-mode /// software when the processor is in supervisor-mode. @@ -149,7 +149,7 @@ bitflags::bitflags! { const ALIGNMENT_CHECK = 1 << 18; /// Enable the virtual-8086 mode. const VIRTUAL_8086_MODE = 1 << 17; - /// Allows to restart an instruction following an instrucion breakpoint. + /// Allows to restart an instruction following an instruction breakpoint. const RESUME_FLAG = 1 << 16; /// Used by `iret` in hardware task switch mode to determine if current task is nested. const NESTED_TASK = 1 << 14; diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index 35e7723dc60..3d5fa5ceb08 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -316,7 +316,7 @@ pub fn init_boot() { } } -pub fn get_task_state_segement() -> &'static mut Tss { +pub fn get_task_state_segment() -> &'static mut Tss { &mut get_kpcr().tss } @@ -328,7 +328,7 @@ static STK: [u8; 4096 * 16] = [0; 4096 * 16]; /// Initialize the *actual* GDT stored in TLS. /// -/// ## Saftey +/// ## Safety /// The heap must be initialized before this function is called. pub fn init() { let gdt = unsafe { @@ -346,7 +346,7 @@ pub fn init() { gdt.copy_from_slice(&GDT); unsafe { - let tss_ref = get_task_state_segement(); + let tss_ref = get_task_state_segment(); let tss_ptr = tss_ref as *mut Tss; gdt[GdtEntryType::TSS as usize].set_offset(tss_ptr as u32); diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs index 38a38e5d8e3..56d5136c985 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs @@ -49,7 +49,7 @@ interrupt_exception!(fn debug() => "Debug"); interrupt_exception!(fn non_maskable() => "Non Maskable"); interrupt_exception!(fn overflow() => "Stack Overflow"); interrupt_exception!(fn bound_range() => "Out of Bounds"); -interrupt_exception!(fn device_not_available() => "Device not Avaliable"); +interrupt_exception!(fn device_not_available() => "Device not Available"); interrupt_exception!(fn double_fault() => "Double Fault"); interrupt_exception!(fn invalid_tss() => "Invalid TSS"); interrupt_exception!(fn segment_not_present() => "Segment not Present"); diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs index 44d4cba9c05..7a862772611 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs @@ -110,7 +110,7 @@ impl ApicController { /// PIC (Programmable Interrupt Controller) manages hardware interrupts and sends /// them to the appropriate system interrupt for the x86 architecture. Since APIC -/// has replaced PIC on modern systems, Aero disables PIC when APIC is avaliable. +/// has replaced PIC on modern systems, Aero disables PIC when APIC is available. /// /// ## Notes /// * diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index fcc327022b4..068a8bec6c9 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -90,7 +90,7 @@ extern "C" fn arch_aero_main() -> ! { .expect("limine: invalid kernel file pointer"); // Before we start the initialization process, we need to make sure - // the unwind info is avaliable; just in case if there is a kernel + // the unwind info is available; just in case if there is a kernel // panic, it will be able to unwind the stack. crate::unwind::UNWIND_INFO.call_once(|| { use crate::unwind::UnwindInfo; @@ -110,7 +110,7 @@ extern "C" fn arch_aero_main() -> ! { // Now that we have unwind info, we can initialize the COM ports. This // will be used to print panic messages/logs before the debug renderer is - // initialized to the serial output (if avaliable). + // initialized to the serial output (if available). drivers::uart::init(); logger::init(); diff --git a/src/aero_kernel/src/arch/x86_64/signals.rs b/src/aero_kernel/src/arch/x86_64/signals.rs index 4f8b52114a4..43e0ca67d60 100644 --- a/src/aero_kernel/src/arch/x86_64/signals.rs +++ b/src/aero_kernel/src/arch/x86_64/signals.rs @@ -65,7 +65,7 @@ impl SignalFrame { } pub fn interrupt_check_signals(stack: &mut InterruptStack) { - // SAFTEY: If this interrupt did not originate from userland then we cannot + // SAFETY: If this interrupt did not originate from userland then we cannot // check for signals since the scheduler might not be initialized. if !stack.iret.is_user() { return; diff --git a/src/aero_kernel/src/arch/x86_64/syscall_handler.asm b/src/aero_kernel/src/arch/x86_64/syscall_handler.asm index 8a1341fb307..c82af12db7e 100644 --- a/src/aero_kernel/src/arch/x86_64/syscall_handler.asm +++ b/src/aero_kernel/src/arch/x86_64/syscall_handler.asm @@ -47,7 +47,7 @@ global x86_64_syscall_handler ; ; (note: R12..R15, RBP, RBX are callee-preserved in C ABI) ; -; The instruction saves the RIP to RCX, cleares RFLAGS.RF then saves +; The instruction saves the RIP to RCX, clears RFLAGS.RF then saves ; RFLAGS to R11. Followed by, it loads the new SS, CS, and RIP from ; previously programmed MSRs. ; diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 36b682064d1..1340bbf0a90 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -130,7 +130,7 @@ impl ArchTask { context_switch_rsp: VirtAddr::zero(), // Since the IDLE task is a special kernel task, we use the kernel's - // address space here and we also use the kernel privilage level here. + // address space here and we also use the kernel privilege level here. address_space: AddressSpace::this(), user: false, @@ -484,7 +484,7 @@ pub fn arch_task_spinup(from: &mut ArchTask, to: &ArchTask) { unsafe { // Load the new thread's kernel stack pointer everywhere it's needed. let kstackp = to.context_switch_rsp.as_u64(); - super::gdt::get_task_state_segement().rsp[0] = kstackp; + super::gdt::get_task_state_segment().rsp[0] = kstackp; io::wrmsr(io::IA32_SYSENTER_ESP, kstackp); // switch to the new FS base. diff --git a/src/aero_kernel/src/drivers/block/ahci.rs b/src/aero_kernel/src/drivers/block/ahci.rs index dafd631ffa4..7532ee268b2 100644 --- a/src/aero_kernel/src/drivers/block/ahci.rs +++ b/src/aero_kernel/src/drivers/block/ahci.rs @@ -253,13 +253,13 @@ impl DmaRequest { self.sector } - /// Copys the data from the DMA buffer into the given buffer. + /// Copies the data from the DMA buffer into the given buffer. pub fn copy_into(&self, into: &mut [u8]) { let mut offset = 0x00; // Keep track of the offset - let mut remaning = into.len(); // Keep track of the remaining data + let mut remaining = into.len(); // Keep track of the remaining data for buffer in self.buffer.iter() { - let count = core::cmp::min(remaning, 0x2000); + let count = core::cmp::min(remaining, 0x2000); let buffer_pointer = buffer.start.as_hhdm_virt().as_ptr(); let buffer = unsafe { core::slice::from_raw_parts::(buffer_pointer, count) }; @@ -268,7 +268,7 @@ impl DmaRequest { // calculated offset. into[offset..offset + count].copy_from_slice(buffer); - remaning -= count; // Subtract the size from the remaining size. + remaining -= count; // Subtract the size from the remaining size. offset += count; // Add the size to the offset. } } @@ -634,7 +634,7 @@ impl HbaPort { let ipm = status.interface_power_management(); let dd = status.device_detection(); - // Check if the port is active and is present. If thats the case + // Check if the port is active and is present. If that's the case // we can start the AHCI port. if let (HbaPortDd::PresentAndE, HbaPortIpm::Active) = (dd, ipm) { log::trace!("ahci: enabling port {}", port); @@ -881,7 +881,7 @@ impl AhciProtected { // Add the port to the ports array. self.ports[i] = Some(port); - // Workaround to get access to the HBA and still satify the + // Workaround to get access to the HBA and still satisfy the // borrow checker. hba = self.hba_mem(); } diff --git a/src/aero_kernel/src/drivers/block/ide/registers.rs b/src/aero_kernel/src/drivers/block/ide/registers.rs index 66e7f2d208b..47468e64e7c 100644 --- a/src/aero_kernel/src/drivers/block/ide/registers.rs +++ b/src/aero_kernel/src/drivers/block/ide/registers.rs @@ -79,7 +79,7 @@ impl BaseDriveSelReg { bitflags::bitflags! { pub struct BaseStatusReg: u8 { - const ERR = 0b00000001; // Error occured + const ERR = 0b00000001; // Error occurred const IDX = 0b00000010; // Index. Always set to zero const CORR = 0b00000100; // Corrected data. Always set to zero const DRQ = 0b00001000; // Set when the drive has PIO data to transfer, or is ready to accept PIO data @@ -118,8 +118,8 @@ bitflags::bitflags! { const DMA_ACTIVE = 0b0000_0001; const DMA_FAILED = 0b0000_0010; const DISK_IRQ = 0b0000_0100; - const MASTER_DMA_CAPPABLE = 0b0010_0000; - const SLAVE_DMA_CAPPABLE = 0b0100_0000; + const MASTER_DMA_CAPABLE = 0b0010_0000; + const SLAVE_DMA_CAPABLE = 0b0100_0000; const NO_DMA_SHARING = 0b1000_0000; } } diff --git a/src/aero_kernel/src/drivers/block/nvme/queue.rs b/src/aero_kernel/src/drivers/block/nvme/queue.rs index fdbb3f28c57..ab4fdf5777a 100644 --- a/src/aero_kernel/src/drivers/block/nvme/queue.rs +++ b/src/aero_kernel/src/drivers/block/nvme/queue.rs @@ -12,7 +12,7 @@ const fn calculate_doorbell_offset(queue_id: u16, multiplier: usize, dstrd: usiz } pub struct Completion; -pub struct Submisson; +pub struct Submission; pub trait QueueType { type Type; @@ -24,7 +24,7 @@ impl QueueType for Completion { type Type = CompletionEntry; } -impl QueueType for Submisson { +impl QueueType for Submission { const DOORBELL_OFFSET: usize = 0; type Type = Command; } @@ -94,7 +94,7 @@ impl Queue<'_, Completion> { } } -impl Queue<'_, Submisson> { +impl Queue<'_, Submission> { pub fn submit_command(&mut self, command: Command) { self.queue[self.index] = UnsafeCell::new(command); @@ -111,7 +111,7 @@ pub(super) struct QueuePair<'a> { cid: u16, - submission: Queue<'a, Submisson>, + submission: Queue<'a, Submission>, completion: Queue<'a, Completion>, } diff --git a/src/aero_kernel/src/drivers/drm/mod.rs b/src/aero_kernel/src/drivers/drm/mod.rs index 512b672c63e..cc4db530317 100644 --- a/src/aero_kernel/src/drivers/drm/mod.rs +++ b/src/aero_kernel/src/drivers/drm/mod.rs @@ -75,14 +75,14 @@ trait DrmDevice: Send + Sync { fn framebuffer_create(&self, buffer_object: &BufferObject, width: u32, height: u32, pitch: u32); fn commit(&self, buffer_obj: &BufferObject); - /// Returns tuple containing the minumum dimensions (`xmin`, `ymin`). + /// Returns tuple containing the minimum dimensions (`xmin`, `ymin`). fn min_dim(&self) -> (usize, usize); - /// Returns tuple containing the miximum dimensions (`xmax`, `ymax`). + /// Returns tuple containing the maximum dimensions (`xmax`, `ymax`). fn max_dim(&self) -> (usize, usize); - /// Returns a tuple containg the driver major, minor and patch level respectively. + /// Returns a tuple containing the driver major, minor and patch level respectively. fn driver_version(&self) -> (usize, usize, usize); - /// Returns a tuple contaning the driver name, desc and date respectively. + /// Returns a tuple containing the driver name, desc and date respectively. fn driver_info(&self) -> (&'static str, &'static str, &'static str); } @@ -158,9 +158,9 @@ struct Encoder { /// The current CRTC for this encoder. current_crtc: Arc, - /// A vector contaning all the possible CRTCs for this encoder. + /// A vector containing all the possible CRTCs for this encoder. possible_crtcs: Vec>, - /// A vector contaning all the possible sibling encoders for cloning. + /// A vector containing all the possible sibling encoders for cloning. possible_clones: Vec>, object_id: u32, @@ -206,9 +206,9 @@ struct Connector { status: DrmModeConStatus, /// The current encoder for this connector. current_encoder: Arc, - /// A vector contaning all the possible encoders for this connector. + /// A vector containing all the possible encoders for this connector. possible_encoders: Vec>, - /// A vector contaning all of the possible display modes for this connector. + /// A vector containing all of the possible display modes for this connector. modes: Vec, connector_typ: u32, @@ -450,7 +450,7 @@ impl INodeInterface for Drm { .read_mut::() .unwrap(); - /// Copies the mode object IDs into the user provided buffer. For saftey, checkout + /// Copies the mode object IDs into the user provided buffer. For safety, checkout /// the [`copy_field`] function. fn copy_mode_obj_id( obj: &Mutex>>, @@ -558,7 +558,7 @@ impl INodeInterface for Drm { .as_connector() .unwrap(); - // Fill in the array contaning all of the possible encoders and its length. + // Fill in the array containing all of the possible encoders and its length. let encoder_ids_ptr = struc.encoders_ptr as *mut u32; let mut encoder_count = 0; @@ -585,7 +585,7 @@ impl INodeInterface for Drm { struc.mm_height = 0; // todo struc.subpixel = 0; // todo - // Fill in the array contaning all of the possible modes and its length. + // Fill in the array containing all of the possible modes and its length. let modes_ptr = struc.modes_ptr as *mut DrmModeInfo; let mut modes_count = 0; diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index a6beb4333f8..4f11186a665 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -34,7 +34,7 @@ pub trait KeyboardListener: Send + Sync { } static PS2_KEYBOARD_STATE: Mutex = Mutex::new(Ps2KeyboardState::new()); -static KEYBOARD_LISTNER: RwLock> = RwLock::new(Vec::new()); +static KEYBOARD_LISTENER: RwLock> = RwLock::new(Vec::new()); struct Ps2KeyboardState { special: bool, @@ -301,8 +301,8 @@ pub fn ps2_keyboard_init() { devfs::install_device(KEYBOARD.clone()).expect("failed to install keyboard device"); } -pub fn register_keyboard_listener(listner: &'static dyn KeyboardListener) { - KEYBOARD_LISTNER.write().push(listner) +pub fn register_keyboard_listener(listener: &'static dyn KeyboardListener) { + KEYBOARD_LISTENER.write().push(listener) } pub fn keyboard_irq_handler(_stack: &mut InterruptStack) { @@ -433,8 +433,8 @@ pub fn keyboard_irq_handler(_stack: &mut InterruptStack) { core::mem::drop(lock); - let listners = KEYBOARD_LISTNER.read(); - for listener in listners.iter() { + let listeners = KEYBOARD_LISTENER.read(); + for listener in listeners.iter() { listener.on_key(keycode, released); } } diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index 7038a3b7210..b32f3801e04 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -649,7 +649,7 @@ impl PciHeader { unsafe { self.read::(0x0c) }.get_bit(23) } - /// Returnes the value stored in the PCI header type register which is used to + /// Returns the value stored in the PCI header type register which is used to /// indicate layout for bytes,of the device’s configuration space. pub fn get_header_type(&self) -> u8 { unsafe { self.read::(0x0E) as u8 & 0b01111111 } @@ -790,8 +790,8 @@ pub fn register_device_driver(handle: Arc) { /// Lookup and initialize all PCI devices. pub fn init(offset_table: &mut OffsetPageTable) { - // Check if the MCFG table is avaliable. - if mcfg::is_avaliable() { + // Check if the MCFG table is available. + if mcfg::is_available() { let mcfg_table = mcfg::get_mcfg_table(); let _entry_count = mcfg_table.entry_count(); } diff --git a/src/aero_kernel/src/drivers/uart_16550.rs b/src/aero_kernel/src/drivers/uart_16550.rs index 6ff04d114e9..03d8e44d826 100644 --- a/src/aero_kernel/src/drivers/uart_16550.rs +++ b/src/aero_kernel/src/drivers/uart_16550.rs @@ -71,7 +71,7 @@ impl SerialPort { // Enable FIFO, clear TX/RX queues and set interrupt watermark at 14 bytes. io::outb(self.0 + 2, 0xC7); - // Mark data terminal ready, signal request to send and enable auxilliary + // Mark data terminal ready, signal request to send and enable auxiliary // output #2 (used as interrupt line for CPU). io::outb(self.0 + 4, 0x0B); @@ -127,7 +127,7 @@ impl fmt::Write for SerialPort { } } -/// Initialize the serial ports if avaliable. +/// Initialize the serial ports if available. pub fn init() { unsafe { let com_1 = SerialPort::new(0x3F8).init(); diff --git a/src/aero_kernel/src/drivers/uart_pl011.rs b/src/aero_kernel/src/drivers/uart_pl011.rs index 26497aa0d11..b134461000c 100644 --- a/src/aero_kernel/src/drivers/uart_pl011.rs +++ b/src/aero_kernel/src/drivers/uart_pl011.rs @@ -17,7 +17,7 @@ * along with Aero. If not, see . */ -// REFRENCE: PrimeCell UART (PL011) Technical Reference Manual +// REFERENCE: PrimeCell UART (PL011) Technical Reference Manual use core::fmt; use core::fmt::Write; diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index 79aa1900cf6..ba9a7886389 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -105,7 +105,7 @@ impl EPoll { /// * `max_events`: Maximum number of events. /// /// * `timeout`: specifies the minimum number of milliseconds that epoll wait will block. Specifying - /// a timeout of `-1` will block indefinitely. While specifing a timeout of `0` will return + /// a timeout of `-1` will block indefinitely. While specifying a timeout of `0` will return /// immediately even if there are available no events. /// /// diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index 71b158eacf8..43bc35dc576 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -74,7 +74,7 @@ impl GroupDescriptors { // after the super block. /// Returns the index of the block group which has free block(s) - /// avaliable. + /// available. pub fn find_free_block(&self) -> Option { let (index, _) = self .descriptors @@ -87,7 +87,7 @@ impl GroupDescriptors { } /// Returns the index of the block group which has free inode(s) - /// avaliable. + /// available. pub fn find_free_inode(&self) -> Option { let (index, _) = self .descriptors diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index 4248e201206..8e68475d382 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -178,7 +178,7 @@ impl FileHandle { self.offset.fetch_add(1, Ordering::SeqCst); Ok(reclen) } else { - // nothin to read + // nothing to read Ok(0) } } @@ -255,7 +255,7 @@ impl FileTable { let array = &mut files[start..]; // Loop over the current file descriptor table and find the first - // avaliable file descriptor. + // available file descriptor. for (i, file) in array.iter_mut().enumerate() { if file.is_none() { *file = Some(handle.duplicate(i, flags)?); @@ -323,7 +323,7 @@ impl FileTable { pub fn open_file(&self, dentry: DirCacheItem, mut flags: OpenFlags) -> super::Result { let mut files = self.0.write(); - // Remove all of the unneccessary flags. + // Remove all of the unnecessary flags. flags.remove(OpenFlags::O_CREAT); flags.remove(OpenFlags::O_DIRECTORY); @@ -332,7 +332,7 @@ impl FileTable { let mut handle = Arc::new(FileHandle::new(i, dentry, flags)); if let Some(inode) = handle.inode.inode().open(flags, handle.clone())? { - // TODO: should open be called on the inner file aswell??? + // TODO: should open be called on the inner file as well??? handle = Arc::new(FileHandle::new(i, inode, flags)) } @@ -344,7 +344,7 @@ impl FileTable { let mut handle = Arc::new(FileHandle::new(fd, dentry, flags)); if let Some(inode) = handle.inode.inode().open(flags, handle.clone())? { - // TODO: should open be called on the inner file aswell??? + // TODO: should open be called on the inner file as well??? handle = Arc::new(FileHandle::new(fd, inode, flags)) } @@ -356,8 +356,8 @@ impl FileTable { } } - /// Closes a file descriptor, so that its no longer referes to any file - /// and can be resued. This function will return false if the provided file + /// Closes a file descriptor, so that its no longer refers to any file + /// and can be reused. This function will return false if the provided file /// descriptor index was invalid. pub fn close_file(&self, fd: usize) -> bool { let mut files = self.0.write(); diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 62d65380d99..e9768d29efb 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -156,7 +156,7 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSupported) } - /// Creates a new file with the provoded `name` in the filesystem. + /// Creates a new file with the provided `name` in the filesystem. fn touch(&self, _parent: DirCacheItem, _name: &str) -> Result { Err(FileSystemError::NotSupported) } @@ -216,7 +216,7 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSupported) } - /// ## Saftey + /// ## Safety /// /// The caller is responsible for removing the inode from the cache. fn unlink(&self, _name: &str) -> Result<()> { @@ -262,7 +262,7 @@ pub trait INodeInterface: Send + Sync { } } -/// Structure representing the curcial, characteristics of an inode. The metadata +/// Structure representing the crucial, characteristics of an inode. The metadata /// of an inode can be retrieved by invoking the [INodeInterface::metadata] function. #[derive(Debug, Copy, Clone)] pub struct Metadata { diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index db4b3550a21..a41661bfe0a 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -234,7 +234,7 @@ pub fn lookup_path_with( cwd = parent; } - // Else the entry does not have a parent, ie. the current entry is the root aand + // Else the entry does not have a parent, ie. the current entry is the root and // we can't go any further :^) } diff --git a/src/aero_kernel/src/logger.rs b/src/aero_kernel/src/logger.rs index 4811e6d59f8..7ef667e731e 100644 --- a/src/aero_kernel/src/logger.rs +++ b/src/aero_kernel/src/logger.rs @@ -103,7 +103,7 @@ impl log::Log for AeroLogger { /// Force-unlocks the logger ring buffer to prevent a deadlock. /// -/// ## Saftey +/// ## Safety /// This method is not memory safe and should be only used when absolutely necessary. #[inline] pub unsafe fn force_unlock() { diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index c272024c877..10f16b0046b 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -107,7 +107,7 @@ static mut PHYSICAL_MEMORY_OFFSET: VirtAddr = VirtAddr::zero(); const IO_VIRTUAL_BASE: VirtAddr = VirtAddr::new(0xffffff0000000000); fn aero_main() -> ! { - // NOTE: In this function we only want to initialize essential serivces, including + // NOTE: In this function we only want to initialize essential services, including // the task scheduler. Rest of the initializing (including kernel modules) should go // into the kernel main thread function instead. fs::init().unwrap(); diff --git a/src/aero_kernel/src/mem/mod.rs b/src/aero_kernel/src/mem/mod.rs index ed9ee17a821..588ad9b9dff 100644 --- a/src/aero_kernel/src/mem/mod.rs +++ b/src/aero_kernel/src/mem/mod.rs @@ -122,7 +122,7 @@ impl AddressSpace { unsafe { &mut *(self.cr3.start_address().as_hhdm_virt().as_mut_ptr()) } } - /// Returns a mutable refernce to the mapper pointing to the page table + /// Returns a mutable reference to the mapper pointing to the page table /// allocated for this address space. pub fn offset_page_table(&mut self) -> OffsetPageTable { unsafe { OffsetPageTable::new(self.page_table(), crate::PHYSICAL_MEMORY_OFFSET) } diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index ed6d01fe165..f78133529bc 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -132,7 +132,7 @@ impl<'a> Iterator for RangeMemoryIter<'a> { fn next(&mut self) -> Option { if self.cursor_base >= self.cursor_end { if let Some(entry) = loop { - // We need to find out the next useable memory range from + // We need to find out the next usable memory range from // the memory map and set the cursor to the start of it. let next = self.iter.next()?; @@ -347,7 +347,7 @@ impl GlobalFrameAllocator { }; // Lets goo! Now lets initialize the bootstrap allocator so we can initialize - // our efficient buddy allocator. We need a seperate allocator since some computers + // our efficient buddy allocator. We need a separate allocator since some computers // such as Macs have a shitload of memory map entries so, we cannt assume the amount // of maximum mmap entries and allocate space for it on the stack instead. God damn it. let mut i = 0; @@ -447,17 +447,17 @@ impl GlobalFrameAllocator { /// Inserts the provided memory range. fn insert_range(&mut self, base: PhysAddr, end: PhysAddr) { - let mut remaning = end - base; + let mut remaining = end - base; let mut current = base; - while remaning > 0 { - let order = self.find_order(current, remaning); + while remaining > 0 { + let order = self.find_order(current, remaining); let size = BUDDY_SIZE[order]; self.set_bit(current, order); current += size; - remaning -= size; + remaining -= size; } } @@ -526,15 +526,15 @@ impl GlobalFrameAllocator { if self.free[i] > 0 { let result = self.find_free(i)?; - let mut remaning = bsize - size; + let mut remaining = bsize - size; - if remaning > 0 { + if remaining > 0 { for j in (0..=i).rev() { let sizee = BUDDY_SIZE[j]; - while remaning >= sizee { - self.set_bit(result + (remaning - sizee) + size, j); - remaning -= sizee; + while remaining >= sizee { + self.set_bit(result + (remaining - sizee) + size, j); + remaining -= sizee; } } } diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index ec9fbdac41b..74c7af5ae5b 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -83,7 +83,7 @@ pub enum TranslateResult { Mapped { /// The mapped frame. frame: MappedFrame, - /// The offset whithin the mapped frame. + /// The offset within the mapped frame. offset: u64, /// The entry flags in the lowest-level page table. /// @@ -160,7 +160,7 @@ pub trait Mapper { /// the same physical address. This is undefined behavior in Rust. /// - This can be ensured by mapping each page to an individual physical /// frame that is not mapped anywhere else. - /// - Creating uninitalized or invalid values: Rust requires that all values + /// - Creating uninitialized or invalid values: Rust requires that all values /// have a correct memory layout. For example, a `bool` must be either a 0 /// or a 1 in memory, but not a 3 or 4. An exception is the `MaybeUninit` /// wrapper type, which abstracts over possibly uninitialized memory. @@ -214,7 +214,7 @@ pub trait Mapper { /// the same physical address. This is undefined behavior in Rust. /// - This can be ensured by mapping each page to an individual physical /// frame that is not mapped anywhere else. - /// - Creating uninitalized or invalid values: Rust requires that all values + /// - Creating uninitialized or invalid values: Rust requires that all values /// have a correct memory layout. For example, a `bool` must be either a 0 /// or a 1 in memory, but not a 3 or 4. An exception is the `MaybeUninit` /// wrapper type, which abstracts over possibly uninitialized memory. @@ -1209,7 +1209,7 @@ impl<'a> OffsetPageTable<'a> { }; // We loop through each of the page table entries in the page table which are user - // accessable and we remove the writeable flag from the entry if present. This will + // accessible and we remove the writeable flag from the entry if present. This will // make the page table entry copy on the first write. Then we clone the page table entry // and place it in the new page table. if self.inner.level_5_paging_enabled { diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 7952abbd4d6..e1052db5f58 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -930,7 +930,7 @@ pub fn double_buffer_flush() { /// Force-unlocks the rendy to prevent a deadlock. /// -/// ## Saftey +/// ## Safety /// This method is not memory safe and should be only used when absolutely necessary. pub unsafe fn force_unlock() { DEBUG_RENDY.get().map(|l| l.force_unlock()); diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index ab59fc8b3aa..75ee6e06507 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -41,8 +41,8 @@ use super::SocketAddr; fn path_from_unix_sock<'sock>(address: &'sock SocketAddrUnix) -> fs::Result<&'sock Path> { // The abstract namespace socket allows the creation of a socket // connection which does not require a path to be created. - let abstrat_namespaced = address.path[0] == 0; - assert!(!abstrat_namespaced); + let abstract_namespaced = address.path[0] == 0; + assert!(!abstract_namespaced); let path_len = address .path diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index e273b6881b1..555cda19e47 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -510,7 +510,7 @@ pub fn epoll_pwait( let result = epfd.wait(event, max_events, timeout)?; - // Restore the orignal signal mask. + // Restore the original signal mask. signals.set_mask(SigProcMask::Set, Some(old_mask), None); Ok(result) } @@ -541,7 +541,7 @@ pub fn link(src_path: &Path, dest_path: &Path) -> Result { // Cannot create a hardlink to a file on a different filesystem. // - // SAFTEY: The pointers to the file system are valid since we know that there are + // SAFETY: The pointers to the file system are valid since we know that there are // strong references to it. // // TODO: Should this be moved to the inode impl? @@ -646,7 +646,7 @@ pub fn poll(fds: &mut [PollFd], timeout: usize, sigmask: usize) -> Result = Once::new(); -/// Returns a reference to the futex conatiner; initializing if necessary. -fn get_futex_conatiner() -> &'static FutexContainer { +/// Returns a reference to the futex container; initializing if necessary. +fn get_futex_container() -> &'static FutexContainer { FUTEX_CONTAINER.call_once(|| FutexContainer::new()) } @@ -135,7 +135,7 @@ fn get_futex_conatiner() -> &'static FutexContainer { pub fn wait(ptr: usize, expected: usize, timeout: &TimeSpec) -> Result { let ptr = VirtAddr::new(ptr as u64); - let futex_container = get_futex_conatiner(); + let futex_container = get_futex_container(); futex_container.wait(ptr, expected as u32, timeout)?; Ok(0) @@ -145,7 +145,7 @@ pub fn wait(ptr: usize, expected: usize, timeout: &TimeSpec) -> Result Result { let ptr = VirtAddr::new(ptr as u64); - let futex_container = get_futex_conatiner(); + let futex_container = get_futex_container(); futex_container.wake(ptr)?; Ok(0) diff --git a/src/aero_kernel/src/syscall/ipc.rs b/src/aero_kernel/src/syscall/ipc.rs index 21afd898bf1..9cd2a160420 100644 --- a/src/aero_kernel/src/syscall/ipc.rs +++ b/src/aero_kernel/src/syscall/ipc.rs @@ -49,7 +49,7 @@ impl MessageQueue { } } -fn handle_recieve( +fn handle_receive( pid_ptr: &mut usize, output: &mut [u8], msg: Message, @@ -98,7 +98,7 @@ pub fn recv(pid_ptr: &mut usize, output: &mut [u8], block: usize) -> Result Result output.len() { our_queue.push_front(msg); Err(SyscallError::E2BIG) } else { - handle_recieve(pid_ptr, output, msg) + handle_receive(pid_ptr, output, msg) } } diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index bbafdd4abf0..0c45dafecca 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -101,10 +101,10 @@ pub fn unwind_stack_trace() { } // Make sure the RBP is not NULL. If it is then we cannot do the stack unwinding/tracing - // as no frame pointers were emmited in this build. This should only occur if you + // as no frame pointers were emitted in this build. This should only occur if you // set the field `eliminate-frame-pointer` in the target file to true or manually resetting // the RBP to prevent backtrace to avoid address leaks (for example when jumping to userland). - // If thats the case we return (resumes the parent function). + // If that's the case we return (resumes the parent function). if rbp == 0x00 { log::trace!(""); return; @@ -166,8 +166,8 @@ use crate::utils::sync::IrqGuard; extern "C" fn rust_begin_unwind(info: &PanicInfo) -> ! { prepare_panic(); - let deafult_panic = &format_args!(""); - let panic_message = info.message().unwrap_or(deafult_panic); + let default_panic = &format_args!(""); + let panic_message = info.message().unwrap_or(default_panic); // Get the CPU ID where this panic happened and if PANIC_HOOK_READY is false // then we cannot get the CPU where this panic happened. diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 8522624c208..183c3c21b31 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -34,7 +34,7 @@ use super::SchedulerInterface; /// taskes. struct TaskQueue { /// The kernel idle task is a special kind of task that is run when - /// no taskes in the scheduler's queue are avaliable to execute. The idle task + /// no taskes in the scheduler's queue are available to execute. The idle task /// is to be created for each CPU. idle_task: Arc, preempt_task: Arc, @@ -255,7 +255,7 @@ impl SchedulerInterface for RoundRobin { } fn preempt(&self) { - // We want to preempt under the following curcumstances: + // We want to preempt under the following circumstances: // // 1. When a process switches from the running state to the waiting // state. diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index 412575a5e94..47d26e1d6bb 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -180,7 +180,7 @@ pub struct Task { arch_task: UnsafeCell, state: AtomicU8, - // Note: Aero implementes the threads and as standard processes. This + // Note: Aero implements the threads and as standard processes. This // means that when a new process is created its TID == PID and when a new // thread is created then the PID of the thread will be the process leader's // PID and the TID will be uniquely generated. diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 88829b0f7a8..6cda6b12adf 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -49,7 +49,7 @@ const ELF_PT2_64_SIZE: usize = core::mem::size_of::>(); #[derive(Debug)] pub enum ElfLoadError { - /// Unexpected file system error occured on an IO operation on the file. + /// Unexpected file system error occurred on an IO operation on the file. IOError(FileSystemError), /// The PT1 header has an invalid magic number. InvalidMagic, @@ -57,7 +57,7 @@ pub enum ElfLoadError { InvalidClass, /// The provided program header index is invalid. InvalidProgramHeaderIndex, - /// Unexpected file system error occured when memory mapping an + /// Unexpected file system error occurred when memory mapping an /// ELF segment. MemoryMapError, } @@ -97,7 +97,7 @@ fn parse_elf_header<'header>(file: DirCacheItem) -> Result, ElfL unimplemented!("parse_elf_header: 32-bit executables are not implemented") } - // SAFTEY: ensure the PT1 header has a valid class. + // SAFETY: ensure the PT1 header has a valid class. Class::None | Class::Other(_) => Err(ElfLoadError::InvalidClass), }?; @@ -114,7 +114,7 @@ fn parse_program_header<'pheader>( ) -> Result, ElfLoadError> { let pt2 = &header.pt2; - // SAFTEY: ensure that the provided program header index is valid. + // SAFETY: ensure that the provided program header index is valid. if !(index < pt2.ph_count() && pt2.ph_offset() > 0 && pt2.ph_entry_size() > 0) { return Err(ElfLoadError::InvalidProgramHeaderIndex); } @@ -145,7 +145,7 @@ fn parse_program_header<'pheader>( Ok(ProgramHeader::Ph32(phdr)) } - // SAFTEY: ensure the PT1 header has a valid class. + // SAFETY: ensure the PT1 header has a valid class. Class::None | Class::Other(_) => Err(ElfLoadError::InvalidClass), } } @@ -310,7 +310,7 @@ impl From for PageTableFlags { enum UnmapResult { None, - Parital(Mapping), + Partial(Mapping), Full, Start, End, @@ -352,7 +352,7 @@ struct Mapping { } impl Mapping { - /// Handler routine for private anonymous pages. Since its an annonymous page is not + /// Handler routine for private anonymous pages. Since its an anonymous page is not /// backed by a file, we have to alloctate a frame and map it at the faulted address. fn handle_pf_private_anon( &mut self, @@ -594,7 +594,7 @@ impl Mapping { self.end_addr = end; - Ok(UnmapResult::Parital(new_mapping)) + Ok(UnmapResult::Partial(new_mapping)) } else if start <= self.start_addr && end >= self.end_addr { // We are unmapping the whole region. unmap_range_inner(self.start_addr..self.end_addr)?; @@ -806,17 +806,17 @@ impl VmProtected { } if file.is_some() { - // SAFTEY: We cannot mmap a file with the anonymous flag. + // SAFETY: We cannot mmap a file with the anonymous flag. if flags.contains(MMapFlags::MAP_ANONYOMUS) { return None; } } else { - // SAFTEY: Mappings not backed by a file must be anonymous. + // SAFETY: Mappings not backed by a file must be anonymous. if !flags.contains(MMapFlags::MAP_ANONYOMUS) { return None; } - // SAFTEY: We cannot have a shared and an anonymous mapping. + // SAFETY: We cannot have a shared and an anonymous mapping. if flags.contains(MMapFlags::MAP_SHARED) { return None; } @@ -829,12 +829,12 @@ impl VmProtected { self.find_any_above(VirtAddr::new(0x7000_0000_0000), size_aligned as _) } else { if flags.contains(MMapFlags::MAP_FIXED) { - // SAFTEY: The provided address should be page aligned. + // SAFETY: The provided address should be page aligned. if !address.is_aligned(Size4KiB::SIZE) { return None; } - // SAFTEY: The provided (address + size) should be less then + // SAFETY: The provided (address + size) should be less then // the userland max address. if (address + size_aligned) > userland_last_address() { return None; @@ -1064,7 +1064,7 @@ impl VmProtected { cursor.remove_current(); } - UnmapResult::Parital(mapping) => { + UnmapResult::Partial(mapping) => { cursor.insert_after(mapping); return true; } @@ -1140,7 +1140,7 @@ impl Vm { self.inner.lock_irq().clear() } - /// This function is responsible for handling page faults occured in + /// This function is responsible for handling page faults occurred in /// user mode. It determines the address, the reason of the page fault /// and then passes it off to one of the appropriate page fault handlers. pub(crate) fn handle_page_fault( diff --git a/src/aero_kernel/src/utils/bitmap.rs b/src/aero_kernel/src/utils/bitmap.rs index b5e2a9089a1..2483504c378 100644 --- a/src/aero_kernel/src/utils/bitmap.rs +++ b/src/aero_kernel/src/utils/bitmap.rs @@ -20,7 +20,7 @@ pub struct Bitmap { impl Bitmap { /// Constructs a new bitmap with `size` bits and uses `alloc` - /// as the alloctor. + /// as the allocator. /// /// ## Example /// ```rust diff --git a/tools/gdb-debug-userland.py b/tools/gdb-debug-userland.py index 1383e0e66ac..8b16cc2e792 100755 --- a/tools/gdb-debug-userland.py +++ b/tools/gdb-debug-userland.py @@ -42,7 +42,7 @@ def wait_for_process(process): import gdb # Since GDB does not let us pass arguments to the script and we have a big - # brain, so we pass the arguments to the program as enviornment variables. + # brain, so we pass the arguments to the program as environment variables. program = os.getenv("AERO_DEBUG_USERLAND_PROGRAM") is_lib = os.environ.get("IS_LIB") == "yes" diff --git a/userland/apps/aero_shell/src/main.rs b/userland/apps/aero_shell/src/main.rs index 52a084c2a3d..5a097c20901 100644 --- a/userland/apps/aero_shell/src/main.rs +++ b/userland/apps/aero_shell/src/main.rs @@ -230,7 +230,7 @@ fn repl(history: &mut Vec) -> Result<(), SyscallError> { argv, &[ "TERM=linux", - // The `XDG_RUNTIME_DIR` enviornment variable tells the tells any program you + // The `XDG_RUNTIME_DIR` environment variable tells the tells any program you // run where to find a user-specific directory in which it can store small // temporary files. "XDG_RUNTIME_DIR=tmp", diff --git a/userland/libs/aero_ipc/src/lib.rs b/userland/libs/aero_ipc/src/lib.rs index ac8ab22fafa..45b41e51f87 100644 --- a/userland/libs/aero_ipc/src/lib.rs +++ b/userland/libs/aero_ipc/src/lib.rs @@ -36,7 +36,7 @@ pub trait MessageHandler: Send + Sync { fn handle(&mut self, src: usize, msg: &[u8]) -> Result>, ()>; } -/// A MessageTransport allows for high-level IPC exchanges over the IPC interfce. +/// A MessageTransport allows for high-level IPC exchanges over the IPC interface. /// It also handles the allocation of request identifiers. pub trait MessageTransport { fn alloc_id() -> usize; @@ -44,13 +44,13 @@ pub trait MessageTransport { fn exchange(meta: usize, mid: usize, data: &[u8]) -> Vec; } -/// A SendRecieveTransport transfers messages by using the IPC system calls. -pub struct SendRecieveTransport; +/// A SendReceiveTransport transfers messages by using the IPC system calls. +pub struct SendReceiveTransport; // trust me, this seed is fine static IDALLOC: AtomicUsize = AtomicUsize::new(0xde73_ce13_600f_e4e9); -impl MessageTransport for SendRecieveTransport { +impl MessageTransport for SendReceiveTransport { fn alloc_id() -> usize { let value = IDALLOC.fetch_add(1, Ordering::SeqCst); // a small attempt at seed obfuscation @@ -65,7 +65,7 @@ impl MessageTransport for SendRecieveTransport { fn exchange(meta: usize, mid: usize, msg: &[u8]) -> Vec { // send the data sys_ipc_send(meta, msg).expect("exchange failed: request failed!"); - // now wait for a repsonse + // now wait for a response loop { // get a response let rx = service_with_response_finding(); @@ -87,7 +87,7 @@ impl MessageTransport for SendRecieveTransport { } } -/// The IPC inteface macro +/// The IPC interface macro /// /// You can create interfaces like this: /// ```no_run @@ -98,7 +98,7 @@ impl MessageTransport for SendRecieveTransport { /// ``` /// /// Then, Hello::Client is the client interface, Hello::Server is the server -/// inteface and Hello::handler instantiates a MessageHandler that can be added +/// interface and Hello::handler instantiates a MessageHandler that can be added /// to the listening pool. #[macro_export] macro_rules! ipc { @@ -133,7 +133,7 @@ macro_rules! ipc { )* } - pub fn open(pid: usize) -> Client<$crate::SendRecieveTransport> { + pub fn open(pid: usize) -> Client<$crate::SendReceiveTransport> { Client { pid, phantom: ::core::marker::PhantomData{} } } @@ -154,7 +154,7 @@ macro_rules! ipc { use serde::Deserialize; let mut deser = postcard::Deserializer::from_bytes(msg); - // TODO(pitust): cache this in the recieve part of the handler + // TODO(pitust): cache this in the receive part of the handler //? i don't think it would help *that* much though let msgid: usize = usize::deserialize(&mut deser).or_else(|_e| { println!("\x1b[31;1merr\x1b[0m message id failed to deserialize!"); @@ -209,7 +209,7 @@ pub fn handle_request(src: usize, msg: &[u8]) -> Option> { if (msg[0] & 1) == 1 { println!( - "\x1b[32;1mwarn\x1b[0m recieved random response from {}!", + "\x1b[32;1mwarn\x1b[0m received random response from {}!", src ); return None; @@ -233,7 +233,7 @@ pub fn handle_request(src: usize, msg: &[u8]) -> Option> { fn service_with_response_finding() -> Option<(usize, Vec)> { let mut src: usize = 0; - let mut arena = RX_ARENA.try_lock().expect("recieve arena is locked!"); + let mut arena = RX_ARENA.try_lock().expect("receive arena is locked!"); let msg = sys_ipc_recv(&mut src, arena.as_mut(), true).expect("sys_ipc_recv failed!"); // if it's a response @@ -253,7 +253,7 @@ pub fn service_request() { let mut src: usize = 0; let mut arena = RX_ARENA .try_lock() - .expect("service_request: recieve arena is locked!"); + .expect("service_request: receive arena is locked!"); let msg = sys_ipc_recv(&mut src, arena.as_mut(), true).expect("sys_ipc_recv failed!"); From f4970cbea7e08e7ee39a3b9798afb2d3cdbf476b Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 24 Dec 2022 19:07:05 +1100 Subject: [PATCH 101/368] bootstrap::mesa: do release build Signed-off-by: Andy-Python-Programmer --- bootstrap/xorg.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index a9d46351942..4d86746d0b4 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -537,7 +537,7 @@ packages: - '--prefix=/usr' - '--libdir=lib' # The debug build type enables some additional output from Mesa. - - '--buildtype=debugoptimized' + - '--buildtype=release' #- '--buildtype=debug' - '-Dglx=gallium-xlib' - '-Dplatforms=x11' @@ -547,7 +547,7 @@ packages: - '-Dvulkan-drivers=' - '@THIS_SOURCE_DIR@' build: - - args: ['ninja'] + - args: ['ninja', '-j@PARALLELISM@'] - args: ['ninja', 'install'] environ: DESTDIR: '@THIS_COLLECT_DIR@' From c80888cb4016c79e741919a88e9d5608ab73de03 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 24 Dec 2022 20:18:47 +1100 Subject: [PATCH 102/368] README: update screenshots Signed-off-by: Andy-Python-Programmer --- README.md | 4 ++-- misc/dwm-alacritty-glxgears.png | Bin 0 -> 42252 bytes misc/dwm-doom-xeyes.png | Bin 95111 -> 0 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 misc/dwm-alacritty-glxgears.png delete mode 100644 misc/dwm-doom-xeyes.png diff --git a/README.md b/README.md index 48dbd3b0473..5d56fb9bc0e 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,8 @@ No, Aero runs its own kernel that does *not* originate from Linux and does not s **Official Discord Server**: # Screenshots - -

Running DWM, Xeyes and DOOM in Aero!

+ +

Running DWM, mesa-demos and Alacritty in Aero!

# Features - 64-bit higher half kernel diff --git a/misc/dwm-alacritty-glxgears.png b/misc/dwm-alacritty-glxgears.png new file mode 100644 index 0000000000000000000000000000000000000000..9839dd78d7ae693f7f98a47658134d931fc51dbd GIT binary patch literal 42252 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 RC}1uBf{CSZ$vJey{{uJWMqU5_ literal 0 HcmV?d00001 diff --git a/misc/dwm-doom-xeyes.png b/misc/dwm-doom-xeyes.png deleted file mode 100644 index bf0a50bd7ae22f77657f5d7380fe7faa6b07a44f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95111 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 From 7a0c97692f0c309fc4aeb3ce629e3010576d76e3 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 24 Dec 2022 20:19:35 +1100 Subject: [PATCH 103/368] README: fix screenshot path Signed-off-by: Andy-Python-Programmer --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d56fb9bc0e..e68fbef5daf 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ No, Aero runs its own kernel that does *not* originate from Linux and does not s **Official Discord Server**: # Screenshots - + # Features From 135cfc225847b6b1951ff5f748e8f12c87ae54bd Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 25 Dec 2022 18:38:16 +1100 Subject: [PATCH 104/368] ext2: ensure revision 1 Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/disk.rs | 27 +++++++++++++++++++++++++++ src/aero_kernel/src/fs/ext2/mod.rs | 21 ++++++++++++--------- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index 8bef2562bed..c42dca1b9d9 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -22,6 +22,16 @@ use bit_field::BitField; use crate::fs::inode; use crate::utils::CeilDiv; +trait Revsion {} + +#[derive(Debug, PartialEq)] +pub enum Revision { + Revision0, + /// Revision 1 introduces variable inode sizes, extended + /// attributes, etc. + Revision1, +} + #[derive(Debug, Copy, Clone)] #[repr(C, packed)] pub struct SuperBlock { @@ -89,6 +99,14 @@ impl SuperBlock { self.block_size() / core::mem::size_of::() } + pub fn revision(&self) -> Revision { + match self.rev_level { + 0 => Revision::Revision0, + 1 => Revision::Revision1, + revison => unreachable!("ext2: invalid revison {revison}"), + } + } + /// Returns the size of a block in bytes. pub fn block_size(&self) -> usize { 1024usize << self.log_block_size @@ -218,6 +236,15 @@ impl INode { self.type_and_perm = file_type.bits() | (self.type_and_perm & mask); } + pub fn set_size(&mut self, size: usize) { + self.size_lower = size as u32; + self.size_or_acl = (size >> 32) as u32; + } + + pub fn size(&self) -> usize { + self.size_lower as usize | ((self.size_or_acl as usize) << 32) + } + pub fn set_permissions(&mut self, permissions: u16) { let mut val = self.type_and_perm; val.set_bits(..13, permissions); diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index c24a8e6e6de..c0677760eb2 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -31,7 +31,7 @@ use spin::RwLock; use crate::fs::block::BlockDeviceInterface; use crate::fs::cache::CachedINode; -use crate::fs::ext2::disk::{FileType, SuperBlock}; +use crate::fs::ext2::disk::{FileType, Revision, SuperBlock}; use crate::mem::paging::{FrameAllocator, PhysFrame, VirtAddr, FRAME_ALLOCATOR}; use crate::socket::unix::UnixSocket; @@ -98,7 +98,7 @@ impl INode { let block_size = filesystem.superblock.block_size(); let mut progress = 0; - let count = core::cmp::min(inode.size_lower as usize - offset, buffer.len()); + let count = core::cmp::min(inode.size() - offset, buffer.len()); while progress < count { let block = (offset + progress) / block_size; @@ -171,7 +171,7 @@ impl INode { let new_block = fs.bgdt.alloc_block_ptr()?; let data_ptrs = self.inode.read().data_ptr; - let mut next_block_num = (self.inode.read().size_lower as usize).ceil_div(block_size); + let mut next_block_num = self.inode.read().size().ceil_div(block_size); if next_block_num < 12 { drop(data_ptrs); @@ -181,7 +181,9 @@ impl INode { assert_eq!(inode.data_ptr[next_block_num], 0); inode.data_ptr[next_block_num] = new_block as u32; - inode.size_lower += block_size as u32; + + let size = inode.size() + block_size; + inode.set_size(size); return Some(new_block); } @@ -350,7 +352,7 @@ impl INodeInterface for INode { Ok(Metadata { id: self.id, file_type: inode.file_type().into(), - size: inode.size_lower as _, + size: inode.size(), children_len: 0, }) } @@ -380,7 +382,7 @@ impl INodeInterface for INode { Ok(Stat { st_ino: self.id as _, st_blksize: filesystem.superblock.block_size() as _, - st_size: inode.size_lower as _, + st_size: inode.size() as _, st_mode: mode, ..Default::default() @@ -487,7 +489,7 @@ impl INodeInterface for INode { let inode = self.inode.read(); - let path_len = inode.size_lower as usize; + let path_len = inode.size(); let data_bytes: &[u8] = bytemuck::cast_slice(&inode.data_ptr); if path_len <= data_bytes.len() { @@ -586,7 +588,7 @@ impl Iterator for DirEntryIter { type Item = (String, Box); fn next(&mut self) -> Option { - let file_size = self.inode.inode.read().size_lower as usize; + let file_size = self.inode.inode.read().size(); if self.offset + core::mem::size_of::() > file_size { return None; @@ -645,9 +647,10 @@ impl Ext2 { log::trace!( "ext2: initialized (block_size={}, entries_per_block={})", superblock.block_size(), - superblock.entries_per_block() + superblock.entries_per_block(), ); + assert_eq!(superblock.revision(), Revision::Revision1); assert_eq!( superblock.inode_size as usize, core::mem::size_of::() From fe152e0bb7ca4d3b84112675318c198d1649985c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 28 Jan 2023 17:11:17 +1100 Subject: [PATCH 105/368] all: update copyright Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/build.rs | 2 +- src/aero_kernel/src/acpi/fadt.rs | 2 +- src/aero_kernel/src/acpi/hpet.rs | 2 +- src/aero_kernel/src/acpi/madt.rs | 2 +- src/aero_kernel/src/acpi/mcfg.rs | 2 +- src/aero_kernel/src/acpi/mod.rs | 2 +- src/aero_kernel/src/acpi/rsdp.rs | 2 +- src/aero_kernel/src/acpi/sdt.rs | 2 +- src/aero_kernel/src/arch/aarch64/mod.rs | 2 +- src/aero_kernel/src/arch/aarch64/task.rs | 2 +- src/aero_kernel/src/arch/aarch64/time.rs | 2 +- src/aero_kernel/src/arch/aarch64/tls.rs | 2 +- src/aero_kernel/src/arch/mod.rs | 2 +- src/aero_kernel/src/arch/x86_64/apic.rs | 2 +- src/aero_kernel/src/arch/x86_64/controlregs.rs | 2 +- src/aero_kernel/src/arch/x86_64/gdt.rs | 2 +- src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs | 2 +- src/aero_kernel/src/arch/x86_64/interrupts/idt.rs | 2 +- src/aero_kernel/src/arch/x86_64/interrupts/mod.rs | 2 +- src/aero_kernel/src/arch/x86_64/io.rs | 2 +- src/aero_kernel/src/arch/x86_64/mod.rs | 2 +- src/aero_kernel/src/arch/x86_64/signals.rs | 2 +- src/aero_kernel/src/arch/x86_64/task.rs | 2 +- src/aero_kernel/src/arch/x86_64/time.rs | 2 +- src/aero_kernel/src/arch/x86_64/tls.rs | 2 +- src/aero_kernel/src/drivers/block/ahci.rs | 2 +- src/aero_kernel/src/drivers/block/ide/channel.rs | 2 +- src/aero_kernel/src/drivers/block/ide/mod.rs | 2 +- src/aero_kernel/src/drivers/block/ide/registers.rs | 2 +- src/aero_kernel/src/drivers/block/nvme/command.rs | 2 +- src/aero_kernel/src/drivers/block/nvme/dma.rs | 2 +- src/aero_kernel/src/drivers/block/nvme/mod.rs | 2 +- src/aero_kernel/src/drivers/drm/mod.rs | 2 +- src/aero_kernel/src/drivers/drm/rawfb.rs | 2 +- src/aero_kernel/src/drivers/keyboard.rs | 2 +- src/aero_kernel/src/drivers/lai.rs | 2 +- src/aero_kernel/src/drivers/mod.rs | 2 +- src/aero_kernel/src/drivers/pci.rs | 2 +- src/aero_kernel/src/drivers/pty.rs | 2 +- src/aero_kernel/src/drivers/tty.rs | 2 +- src/aero_kernel/src/drivers/uart_16550.rs | 2 +- src/aero_kernel/src/drivers/uart_pl011.rs | 2 +- src/aero_kernel/src/fs/block/gpt.rs | 2 +- src/aero_kernel/src/fs/block/mod.rs | 2 +- src/aero_kernel/src/fs/cache.rs | 2 +- src/aero_kernel/src/fs/devfs.rs | 2 +- src/aero_kernel/src/fs/epoll.rs | 2 +- src/aero_kernel/src/fs/eventfd.rs | 2 +- src/aero_kernel/src/fs/ext2/disk.rs | 2 +- src/aero_kernel/src/fs/ext2/group_desc.rs | 2 +- src/aero_kernel/src/fs/ext2/mod.rs | 2 +- src/aero_kernel/src/fs/file_table.rs | 2 +- src/aero_kernel/src/fs/inode.rs | 2 +- src/aero_kernel/src/fs/mod.rs | 2 +- src/aero_kernel/src/fs/ramfs.rs | 2 +- src/aero_kernel/src/logger.rs | 2 +- src/aero_kernel/src/main.rs | 2 +- src/aero_kernel/src/mem/alloc.rs | 2 +- src/aero_kernel/src/mem/mod.rs | 2 +- src/aero_kernel/src/mem/paging/addr.rs | 2 +- src/aero_kernel/src/mem/paging/frame.rs | 2 +- src/aero_kernel/src/mem/paging/mapper.rs | 2 +- src/aero_kernel/src/mem/paging/mod.rs | 2 +- src/aero_kernel/src/mem/paging/page.rs | 2 +- src/aero_kernel/src/mem/paging/page_table.rs | 2 +- src/aero_kernel/src/mem/pti.rs | 2 +- src/aero_kernel/src/mem/vmalloc.rs | 2 +- src/aero_kernel/src/modules.rs | 2 +- src/aero_kernel/src/rendy.rs | 2 +- src/aero_kernel/src/socket/mod.rs | 2 +- src/aero_kernel/src/socket/unix.rs | 2 +- src/aero_kernel/src/syscall/fs.rs | 2 +- src/aero_kernel/src/syscall/futex.rs | 2 +- src/aero_kernel/src/syscall/ipc.rs | 2 +- src/aero_kernel/src/syscall/mod.rs | 2 +- src/aero_kernel/src/syscall/process.rs | 2 +- src/aero_kernel/src/syscall/time.rs | 2 +- src/aero_kernel/src/tests.rs | 2 +- src/aero_kernel/src/unwind.rs | 2 +- src/aero_kernel/src/userland/mod.rs | 2 +- src/aero_kernel/src/userland/scheduler/mod.rs | 2 +- src/aero_kernel/src/userland/scheduler/round_robin.rs | 2 +- src/aero_kernel/src/userland/signals.rs | 2 +- src/aero_kernel/src/userland/task.rs | 2 +- src/aero_kernel/src/userland/vm.rs | 2 +- src/aero_kernel/src/utils/buffer.rs | 2 +- src/aero_kernel/src/utils/mod.rs | 2 +- src/aero_proc/src/lib.rs | 2 +- src/aero_proc/src/syscall.rs | 2 +- src/aero_proc/src/test.rs | 2 +- src/aero_syscall/src/consts.rs | 2 +- src/aero_syscall/src/lib.rs | 2 +- src/aero_syscall/src/signal.rs | 2 +- src/aero_syscall/src/syscall.rs | 2 +- src/aero_syscall/src/time.rs | 2 +- 95 files changed, 95 insertions(+), 95 deletions(-) diff --git a/src/aero_kernel/build.rs b/src/aero_kernel/build.rs index a7e61ad801c..88fb7081a64 100644 --- a/src/aero_kernel/build.rs +++ b/src/aero_kernel/build.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/acpi/fadt.rs b/src/aero_kernel/src/acpi/fadt.rs index 330e3b760af..7b202f90049 100644 --- a/src/aero_kernel/src/acpi/fadt.rs +++ b/src/aero_kernel/src/acpi/fadt.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/acpi/hpet.rs b/src/aero_kernel/src/acpi/hpet.rs index 9da7751f1ae..2525786f09a 100644 --- a/src/aero_kernel/src/acpi/hpet.rs +++ b/src/aero_kernel/src/acpi/hpet.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/acpi/madt.rs b/src/aero_kernel/src/acpi/madt.rs index 6a5326207e2..02c9768fa40 100644 --- a/src/aero_kernel/src/acpi/madt.rs +++ b/src/aero_kernel/src/acpi/madt.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/acpi/mcfg.rs b/src/aero_kernel/src/acpi/mcfg.rs index 86a79018eff..a7f220817dc 100644 --- a/src/aero_kernel/src/acpi/mcfg.rs +++ b/src/aero_kernel/src/acpi/mcfg.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/acpi/mod.rs b/src/aero_kernel/src/acpi/mod.rs index 8685086e284..198b3ea5152 100644 --- a/src/aero_kernel/src/acpi/mod.rs +++ b/src/aero_kernel/src/acpi/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/acpi/rsdp.rs b/src/aero_kernel/src/acpi/rsdp.rs index 1bdb437b3be..b5b8d2fadbc 100644 --- a/src/aero_kernel/src/acpi/rsdp.rs +++ b/src/aero_kernel/src/acpi/rsdp.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/acpi/sdt.rs b/src/aero_kernel/src/acpi/sdt.rs index 3589cf115cd..bee1de457e0 100644 --- a/src/aero_kernel/src/acpi/sdt.rs +++ b/src/aero_kernel/src/acpi/sdt.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/aarch64/mod.rs b/src/aero_kernel/src/arch/aarch64/mod.rs index 2d34734140e..858844f6923 100644 --- a/src/aero_kernel/src/arch/aarch64/mod.rs +++ b/src/aero_kernel/src/arch/aarch64/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/aarch64/task.rs b/src/aero_kernel/src/arch/aarch64/task.rs index 2a319d45112..16e3d6ef4ad 100644 --- a/src/aero_kernel/src/arch/aarch64/task.rs +++ b/src/aero_kernel/src/arch/aarch64/task.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/aarch64/time.rs b/src/aero_kernel/src/arch/aarch64/time.rs index c8db1f49de3..29135290a88 100644 --- a/src/aero_kernel/src/arch/aarch64/time.rs +++ b/src/aero_kernel/src/arch/aarch64/time.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/aarch64/tls.rs b/src/aero_kernel/src/arch/aarch64/tls.rs index 87940d1f913..048465dc04e 100644 --- a/src/aero_kernel/src/arch/aarch64/tls.rs +++ b/src/aero_kernel/src/arch/aarch64/tls.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/mod.rs b/src/aero_kernel/src/arch/mod.rs index e529a4f3978..d860434f609 100644 --- a/src/aero_kernel/src/arch/mod.rs +++ b/src/aero_kernel/src/arch/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/apic.rs b/src/aero_kernel/src/arch/x86_64/apic.rs index 64f27cdd467..dbc9c2fbab6 100644 --- a/src/aero_kernel/src/arch/x86_64/apic.rs +++ b/src/aero_kernel/src/arch/x86_64/apic.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/controlregs.rs b/src/aero_kernel/src/arch/x86_64/controlregs.rs index 2cab382a896..c98c5f14b51 100644 --- a/src/aero_kernel/src/arch/x86_64/controlregs.rs +++ b/src/aero_kernel/src/arch/x86_64/controlregs.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index 3d5fa5ceb08..a7e0bc2ffbd 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs index 56d5136c985..ddcceaca7df 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs index 6daee184279..4cd78e7e557 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs index 7a862772611..421c39fb0f4 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/io.rs b/src/aero_kernel/src/arch/x86_64/io.rs index eb7060b6de1..52db0846d3b 100644 --- a/src/aero_kernel/src/arch/x86_64/io.rs +++ b/src/aero_kernel/src/arch/x86_64/io.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index 068a8bec6c9..bb68ac9dec0 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/signals.rs b/src/aero_kernel/src/arch/x86_64/signals.rs index 43e0ca67d60..79eb6e9be5a 100644 --- a/src/aero_kernel/src/arch/x86_64/signals.rs +++ b/src/aero_kernel/src/arch/x86_64/signals.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 1340bbf0a90..8e25c205f7f 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/time.rs b/src/aero_kernel/src/arch/x86_64/time.rs index 7c7c8b31729..db358b0fdd5 100644 --- a/src/aero_kernel/src/arch/x86_64/time.rs +++ b/src/aero_kernel/src/arch/x86_64/time.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/arch/x86_64/tls.rs b/src/aero_kernel/src/arch/x86_64/tls.rs index 1bb776c6d13..19c1c0b323e 100644 --- a/src/aero_kernel/src/arch/x86_64/tls.rs +++ b/src/aero_kernel/src/arch/x86_64/tls.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/block/ahci.rs b/src/aero_kernel/src/drivers/block/ahci.rs index 7532ee268b2..565bffeb2d3 100644 --- a/src/aero_kernel/src/drivers/block/ahci.rs +++ b/src/aero_kernel/src/drivers/block/ahci.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/block/ide/channel.rs b/src/aero_kernel/src/drivers/block/ide/channel.rs index 07bef7fc810..c0552d37aba 100644 --- a/src/aero_kernel/src/drivers/block/ide/channel.rs +++ b/src/aero_kernel/src/drivers/block/ide/channel.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index bc926eebf6f..928108dcdcd 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/block/ide/registers.rs b/src/aero_kernel/src/drivers/block/ide/registers.rs index 47468e64e7c..fe8aefff697 100644 --- a/src/aero_kernel/src/drivers/block/ide/registers.rs +++ b/src/aero_kernel/src/drivers/block/ide/registers.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/block/nvme/command.rs b/src/aero_kernel/src/drivers/block/nvme/command.rs index f93c590a189..af06b2c9a15 100644 --- a/src/aero_kernel/src/drivers/block/nvme/command.rs +++ b/src/aero_kernel/src/drivers/block/nvme/command.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/block/nvme/dma.rs b/src/aero_kernel/src/drivers/block/nvme/dma.rs index 3a1ec392e1f..9e60149243d 100644 --- a/src/aero_kernel/src/drivers/block/nvme/dma.rs +++ b/src/aero_kernel/src/drivers/block/nvme/dma.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index ff544574c24..9aba1f10fdf 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/drm/mod.rs b/src/aero_kernel/src/drivers/drm/mod.rs index cc4db530317..38591f88cb1 100644 --- a/src/aero_kernel/src/drivers/drm/mod.rs +++ b/src/aero_kernel/src/drivers/drm/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/drm/rawfb.rs b/src/aero_kernel/src/drivers/drm/rawfb.rs index c347d782f32..013f9c7ce0f 100644 --- a/src/aero_kernel/src/drivers/drm/rawfb.rs +++ b/src/aero_kernel/src/drivers/drm/rawfb.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index 4f11186a665..6a3c105daa6 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/lai.rs b/src/aero_kernel/src/drivers/lai.rs index 33353a399d7..b6d55ab2ae0 100644 --- a/src/aero_kernel/src/drivers/lai.rs +++ b/src/aero_kernel/src/drivers/lai.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/mod.rs b/src/aero_kernel/src/drivers/mod.rs index 85d4ccd927c..170770a9888 100644 --- a/src/aero_kernel/src/drivers/mod.rs +++ b/src/aero_kernel/src/drivers/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index b32f3801e04..0015b9c442b 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 42596288a71..8b6abab4799 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 1391fffbbaf..8a021a9547a 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/uart_16550.rs b/src/aero_kernel/src/drivers/uart_16550.rs index 03d8e44d826..e7f9d017d9f 100644 --- a/src/aero_kernel/src/drivers/uart_16550.rs +++ b/src/aero_kernel/src/drivers/uart_16550.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/drivers/uart_pl011.rs b/src/aero_kernel/src/drivers/uart_pl011.rs index b134461000c..1838a5b4402 100644 --- a/src/aero_kernel/src/drivers/uart_pl011.rs +++ b/src/aero_kernel/src/drivers/uart_pl011.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/block/gpt.rs b/src/aero_kernel/src/fs/block/gpt.rs index 65bde2e39c8..2d0cf5b16fb 100644 --- a/src/aero_kernel/src/fs/block/gpt.rs +++ b/src/aero_kernel/src/fs/block/gpt.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index f7915d106ed..7e33ae6d31c 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index 8a6e461936b..74edde4b4a3 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index b77935b37db..a4c5c7b80ca 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index ba9a7886389..d01990b6c8b 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index 2ad835fc366..507c955aaf3 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index c42dca1b9d9..68dfc40df6f 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index 43bc35dc576..13a3e7a6230 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index c0677760eb2..7034677ffe9 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index 8e68475d382..1dc34bfd4f2 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index e9768d29efb..fcf9741b7a0 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index a41661bfe0a..ae7ff9ecaec 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index 58e7ab7c51a..caf9c933585 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/logger.rs b/src/aero_kernel/src/logger.rs index 7ef667e731e..2a5dd68425f 100644 --- a/src/aero_kernel/src/logger.rs +++ b/src/aero_kernel/src/logger.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 10f16b0046b..76d5e5ce1ad 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/mem/alloc.rs b/src/aero_kernel/src/mem/alloc.rs index 3e58a6fb39c..472e42ab396 100644 --- a/src/aero_kernel/src/mem/alloc.rs +++ b/src/aero_kernel/src/mem/alloc.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/mem/mod.rs b/src/aero_kernel/src/mem/mod.rs index 588ad9b9dff..5e8079fa325 100644 --- a/src/aero_kernel/src/mem/mod.rs +++ b/src/aero_kernel/src/mem/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 2b9b44d3151..32db783a020 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index f78133529bc..39678c6915c 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index 74c7af5ae5b..f69b4094b13 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/mem/paging/mod.rs b/src/aero_kernel/src/mem/paging/mod.rs index 0fbe6a07d1a..31ffa1db195 100644 --- a/src/aero_kernel/src/mem/paging/mod.rs +++ b/src/aero_kernel/src/mem/paging/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/mem/paging/page.rs b/src/aero_kernel/src/mem/paging/page.rs index e70a635ce85..55f1f8bd6b0 100644 --- a/src/aero_kernel/src/mem/paging/page.rs +++ b/src/aero_kernel/src/mem/paging/page.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/mem/paging/page_table.rs b/src/aero_kernel/src/mem/paging/page_table.rs index 1e6c149e757..78db363ee7a 100644 --- a/src/aero_kernel/src/mem/paging/page_table.rs +++ b/src/aero_kernel/src/mem/paging/page_table.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/mem/pti.rs b/src/aero_kernel/src/mem/pti.rs index 3a562800f1e..a863c75ec26 100644 --- a/src/aero_kernel/src/mem/pti.rs +++ b/src/aero_kernel/src/mem/pti.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/mem/vmalloc.rs b/src/aero_kernel/src/mem/vmalloc.rs index e7d5de9b0b2..8e8befe4df1 100644 --- a/src/aero_kernel/src/mem/vmalloc.rs +++ b/src/aero_kernel/src/mem/vmalloc.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/modules.rs b/src/aero_kernel/src/modules.rs index ed0a4535770..b55d9326edc 100644 --- a/src/aero_kernel/src/modules.rs +++ b/src/aero_kernel/src/modules.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index e1052db5f58..df9bfc8ee20 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index 43382b6e667..8c347b9ab92 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 75ee6e06507..2c18a34d907 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 555cda19e47..e4a1e51677f 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/syscall/futex.rs b/src/aero_kernel/src/syscall/futex.rs index 1d93e57e41d..0aa1ea04ea4 100644 --- a/src/aero_kernel/src/syscall/futex.rs +++ b/src/aero_kernel/src/syscall/futex.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/syscall/ipc.rs b/src/aero_kernel/src/syscall/ipc.rs index 9cd2a160420..66e27c0833b 100644 --- a/src/aero_kernel/src/syscall/ipc.rs +++ b/src/aero_kernel/src/syscall/ipc.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 157c0958cca..abecedac61c 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index 9ea1ad5669f..da1a8075b30 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/syscall/time.rs b/src/aero_kernel/src/syscall/time.rs index 2d7668ec366..787e7a1013a 100644 --- a/src/aero_kernel/src/syscall/time.rs +++ b/src/aero_kernel/src/syscall/time.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/tests.rs b/src/aero_kernel/src/tests.rs index fba81d76bd6..b5f84705858 100644 --- a/src/aero_kernel/src/tests.rs +++ b/src/aero_kernel/src/tests.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index 0c45dafecca..b8c0f213255 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/userland/mod.rs b/src/aero_kernel/src/userland/mod.rs index 904518d1c30..5be8a2a3fc8 100644 --- a/src/aero_kernel/src/userland/mod.rs +++ b/src/aero_kernel/src/userland/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index 981ada53b1d..6f8e4e599f0 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 183c3c21b31..9b15d150050 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/userland/signals.rs b/src/aero_kernel/src/userland/signals.rs index 09e67996bab..b7e499544fd 100644 --- a/src/aero_kernel/src/userland/signals.rs +++ b/src/aero_kernel/src/userland/signals.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index 47d26e1d6bb..9055c61ba0c 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 6cda6b12adf..d3d8dc560b8 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/utils/buffer.rs b/src/aero_kernel/src/utils/buffer.rs index 2c0424233d1..22d3135700b 100644 --- a/src/aero_kernel/src/utils/buffer.rs +++ b/src/aero_kernel/src/utils/buffer.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index 608fb10aafe..b244210e990 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_proc/src/lib.rs b/src/aero_proc/src/lib.rs index b582f34c7c2..2319c447320 100644 --- a/src/aero_proc/src/lib.rs +++ b/src/aero_proc/src/lib.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_proc/src/syscall.rs b/src/aero_proc/src/syscall.rs index 7268bf4ccb9..90a6d3720da 100644 --- a/src/aero_proc/src/syscall.rs +++ b/src/aero_proc/src/syscall.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_proc/src/test.rs b/src/aero_proc/src/test.rs index 27f191cb3bb..11e75f2bfcd 100644 --- a/src/aero_proc/src/test.rs +++ b/src/aero_proc/src/test.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 2f5eaa045c1..ecbd789c4fd 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 14a1f7aeff4..ce1ec909f0d 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_syscall/src/signal.rs b/src/aero_syscall/src/signal.rs index 22f44d13619..77fea5a519b 100644 --- a/src/aero_syscall/src/signal.rs +++ b/src/aero_syscall/src/signal.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_syscall/src/syscall.rs b/src/aero_syscall/src/syscall.rs index 9d0f44364b6..6d80d4a73b8 100644 --- a/src/aero_syscall/src/syscall.rs +++ b/src/aero_syscall/src/syscall.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * diff --git a/src/aero_syscall/src/time.rs b/src/aero_syscall/src/time.rs index f65cef34b80..3c5e6f851a3 100644 --- a/src/aero_syscall/src/time.rs +++ b/src/aero_syscall/src/time.rs @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2023 The Aero Project Developers. * * This file is part of The Aero Project. * From 3a100d317430fb71538a251142928262c9a5fad4 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 28 Jan 2023 17:12:17 +1100 Subject: [PATCH 106/368] license: update copyright Signed-off-by: Andy-Python-Programmer --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 032ca942d9f..3aace0bbf52 100644 --- a/LICENSE +++ b/LICENSE @@ -633,7 +633,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - Copyright (C) 2021 Anhad Singh + Copyright (C) 2021-2023 Anhad Singh This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by From 5043ca528e6b089189fdc32ca811e7753472e901 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 28 Jan 2023 17:31:42 +1100 Subject: [PATCH 107/368] patches::mlibc: update patch Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 29848ffe16f..977e74c45ec 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -269,29 +269,6 @@ index fc9fd84..ab57631 100644 auto ra = __builtin_extract_return_addr(__builtin_return_address(0)); return __dlapi_open(file, flags, ra); } -diff --git a/options/posix/generic/termios-stubs.cpp b/options/posix/generic/termios-stubs.cpp -index 3e621ad..583c1f5 100644 ---- a/options/posix/generic/termios-stubs.cpp -+++ b/options/posix/generic/termios-stubs.cpp -@@ -5,6 +5,7 @@ - - #include - #include -+#include - - speed_t cfgetispeed(const struct termios *tios) { - return tios->ibaud; -@@ -50,8 +51,8 @@ int tcflow(int fd, int action) { - } - - int tcflush(int, int) { -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ mlibc::infoLogger() << "mlibc::tcflush: is a stub!" << frg::endlog; -+ return 0; - } - - int tcgetattr(int fd, struct termios *attr) { diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp index 2e2d3f1..3ff5fef 100644 --- a/options/rtdl/generic/linker.cpp From c3f5944a04b3a6ac4b9854f62e713a71510e9fd2 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 4 Feb 2023 13:21:36 +1100 Subject: [PATCH 108/368] bootstrap::xf86-input-mouse Signed-off-by: Andy-Python-Programmer --- bootstrap/xorg.yml | 41 ++++ patches/mlibc/mlibc.patch | 77 ++++--- .../xf86-input-mouse/xf86-input-mouse.patch | 164 +++++++++++++++ src/aero_kernel/src/drivers/keyboard.rs | 6 +- src/aero_kernel/src/drivers/mod.rs | 1 + src/aero_kernel/src/drivers/mouse.rs | 194 ++++++++++++++++++ src/aero_kernel/src/userland/task.rs | 18 +- 7 files changed, 449 insertions(+), 52 deletions(-) create mode 100644 patches/xf86-input-mouse/xf86-input-mouse.patch create mode 100644 src/aero_kernel/src/drivers/mouse.rs diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index 4d86746d0b4..e71476f1d4d 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -659,6 +659,47 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: xf86-input-mouse + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/xorg/driver/xf86-input-mouse.git' + tag: 'xf86-input-mouse-1.9.4' + version: '1.9.4' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + regenerate: + - args: ['./autogen.sh'] + environ: + NOCONFIGURE: 'yes' + tools_required: + - host-gcc + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-pkg-config + pkgs_required: + - mlibc + - xorg-server + - xorg-util-macros + - libx11 + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + - '--disable-static' + - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install-strip'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + # `libxfont` provides the core of the legacy X11 font system, handling the index # files - name: libxfont2 diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 977e74c45ec..8ab10acacea 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,22 +1,21 @@ -From 9f270baad38e7f90bd7c67780ae8f78d66c00de5 Mon Sep 17 00:00:00 2001 +From 9591f4a8fe0242eafb16c5816455f1d763b19b77 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 18 Dec 2022 14:31:45 +1100 +Date: Wed, 1 Feb 2023 16:53:35 +1100 Subject: [PATCH] --- - .gitignore | 2 + - options/ansi/generic/stdlib-stubs.cpp | 185 +++++++++++++++++++++++- - options/glibc/generic/execinfo.cpp | 5 +- - options/posix/generic/dlfcn-stubs.cpp | 1 + - options/posix/generic/termios-stubs.cpp | 5 +- - options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 71 +++++---- - sysdeps/aero/generic/filesystem.cpp | 35 ++++- - sysdeps/aero/generic/sockets.cpp | 87 ++++++++++- - sysdeps/aero/generic/time.cpp | 24 +++ - sysdeps/aero/include/aero/syscall.h | 9 ++ - sysdeps/aero/meson.build | 1 + - 12 files changed, 381 insertions(+), 46 deletions(-) + .gitignore | 2 + + options/ansi/generic/stdlib-stubs.cpp | 185 ++++++++++++++++++++++++-- + options/glibc/generic/execinfo.cpp | 5 +- + options/posix/generic/dlfcn-stubs.cpp | 1 + + options/rtdl/generic/linker.cpp | 2 +- + sysdeps/aero/generic/aero.cpp | 69 ++++++---- + sysdeps/aero/generic/filesystem.cpp | 35 ++++- + sysdeps/aero/generic/sockets.cpp | 87 +++++++++++- + sysdeps/aero/generic/time.cpp | 24 ++++ + sysdeps/aero/include/aero/syscall.h | 9 ++ + sysdeps/aero/meson.build | 1 + + 11 files changed, 374 insertions(+), 46 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -283,36 +282,32 @@ index 2e2d3f1..3ff5fef 100644 constexpr bool eagerBinding = true; diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 29fb961..ee09678 100644 +index 29fb961..b5945a8 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp -@@ -62,6 +62,16 @@ static frg::vector create_slice(char *const arg[]) { +@@ -62,29 +62,33 @@ static frg::vector create_slice(char *const arg[]) { } namespace mlibc { +-int sys_futex_tid() { +- // SAFETY: gettid does not return any errors (ie. the call is always +- // successful). +- return syscall(SYS_GETTID); +-} +- +-int sys_futex_wait(int *pointer, int expected, const struct timespec *time) { +- auto result = syscall(SYS_FUTEX_WAIT, pointer, expected, time); +int sys_uname(struct utsname *buf) { + auto result = syscall(SYS_UNAME, buf); -+ -+ if (result < 0) { -+ return -result; -+ } -+ + + if (result < 0) { + return -result; + } + + return result; +} + - int sys_futex_tid() { - // SAFETY: gettid does not return any errors (ie. the call is always - // successful). -@@ -69,22 +79,22 @@ int sys_futex_tid() { - } - - int sys_futex_wait(int *pointer, int expected, const struct timespec *time) { -- auto result = syscall(SYS_FUTEX_WAIT, pointer, expected, time); -- -- if (result < 0) { -- return -result; -- } -- ++int sys_futex_wait(int *pointer, int expected, const struct timespec *time) { + // auto result = syscall(SYS_FUTEX_WAIT, pointer, expected, time); + // + // if (result < 0) { @@ -338,7 +333,7 @@ index 29fb961..ee09678 100644 return 0; } -@@ -124,7 +134,9 @@ int sys_anon_free(void *pointer, size_t size) { +@@ -124,7 +128,9 @@ int sys_anon_free(void *pointer, size_t size) { } void sys_libc_panic() { @@ -349,7 +344,7 @@ index 29fb961..ee09678 100644 sys_exit(1); } -@@ -140,8 +152,15 @@ void sys_exit(int status) { +@@ -140,8 +146,15 @@ void sys_exit(int status) { pid_t sys_getpid() { auto result = syscall(SYS_GETPID); @@ -366,7 +361,7 @@ index 29fb961..ee09678 100644 return result; } -@@ -162,11 +181,6 @@ pid_t sys_getpgid(pid_t pid, pid_t *pgid) { +@@ -162,11 +175,6 @@ pid_t sys_getpgid(pid_t pid, pid_t *pgid) { return 0; } @@ -378,7 +373,7 @@ index 29fb961..ee09678 100644 int sys_clock_get(int clock, time_t *secs, long *nanos) { struct timespec ts; auto result = syscall(SYS_GETTIME, clock, &ts); -@@ -233,7 +247,11 @@ uid_t sys_geteuid() { +@@ -233,7 +241,11 @@ uid_t sys_geteuid() { return 0; } @@ -391,7 +386,7 @@ index 29fb961..ee09678 100644 int sys_seteuid(uid_t euid) UNIMPLEMENTED("sys_seteuid") gid_t sys_getgid() { -@@ -256,16 +274,19 @@ int sys_setegid(gid_t egid) { +@@ -256,16 +268,19 @@ int sys_setegid(gid_t egid) { return 0; } @@ -647,5 +642,5 @@ index a807b37..878c216 100644 if not no_headers -- -2.38.1 +2.39.1 diff --git a/patches/xf86-input-mouse/xf86-input-mouse.patch b/patches/xf86-input-mouse/xf86-input-mouse.patch new file mode 100644 index 00000000000..3b7fae010a9 --- /dev/null +++ b/patches/xf86-input-mouse/xf86-input-mouse.patch @@ -0,0 +1,164 @@ +From 560b74fa3e234dced21e0bbf03ea444197b7da15 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sat, 4 Feb 2023 13:21:25 +1100 +Subject: [PATCH xf86-input-mouse] + +--- + configure.ac | 3 ++ + src/Makefile.am | 2 +- + src/aero_mouse.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 119 insertions(+), 1 deletion(-) + create mode 100644 src/aero_mouse.c + +diff --git a/configure.ac b/configure.ac +index 6c453cd..a3dd16d 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -81,6 +81,9 @@ case $host_os in + solaris*) + OS_MOUSE_NAME=sun + ;; ++ aero*) ++ OS_MOUSE_NAME=aero ++ ;; + gnu*) + OS_MOUSE_NAME=hurd + ;; +diff --git a/src/Makefile.am b/src/Makefile.am +index aad8d0e..6de4354 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -32,7 +32,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/include $(XORG_CFLAGS) + + # We have to list all the mouse drivers here, even if we don't build them, so + # they get included in distcheck. +-OS_SRCS = bsd_mouse.c hurd_mouse.c lnx_mouse.c sun_mouse.c ++OS_SRCS = bsd_mouse.c hurd_mouse.c lnx_mouse.c sun_mouse.c aero_mouse.c + + @DRIVER_NAME@_drv_la_SOURCES = \ + mouse.c \ +diff --git a/src/aero_mouse.c b/src/aero_mouse.c +new file mode 100644 +index 0000000..de18985 +--- /dev/null ++++ b/src/aero_mouse.c +@@ -0,0 +1,115 @@ ++#include "mouse.h" ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "xf86_OSlib.h" ++ ++#define MOUSE_FLAG_LB (1 << 0) ++#define MOUSE_FLAG_RB (1 << 1) ++#define MOUSE_FLAG_MB (1 << 2) ++ ++#define DEVPATH "/dev/mouse0" ++ ++struct mouse_packet { ++ int16_t x; ++ int16_t y; ++ ++ uint8_t flags; ++}; ++ ++static void MouseReadInput(InputInfoPtr pInfo) { ++ MouseDevPtr mouse = pInfo->private; ++ ++ struct mouse_packet packet; ++ ++ for (;;) { ++ size_t result = read(pInfo->fd, &packet, sizeof(struct mouse_packet)); ++ ++ if (result != sizeof(struct mouse_packet)) { ++ break; ++ } ++ ++ int b = mouse->lastButtons; ++ b &= ~0x7; ++ ++ b |= (packet.flags & MOUSE_FLAG_RB) ? 1 : 0; ++ b |= (packet.flags & MOUSE_FLAG_MB) ? 2 : 0; ++ b |= (packet.flags & MOUSE_FLAG_LB) ? 4 : 0; ++ ++ mouse->PostEvent(pInfo, b, packet.x, -packet.y, 0, 0); ++ } ++} ++ ++static Bool OsMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags) { ++ MouseDevPtr mouse = pInfo->private; ++ mouse->protocol = protocol; ++ ++ xf86ProcessCommonOptions(pInfo, pInfo->options); ++ ++ pInfo->fd = xf86OpenSerial(pInfo->options); ++ if (pInfo->fd == -1) { ++ xf86Msg(X_ERROR, "%s: cannot open %s\n", pInfo->name, DEVPATH); ++ return FALSE; ++ } ++ ++ mouse->CommonOptions(pInfo); ++ pInfo->read_input = MouseReadInput; ++ return TRUE; ++} ++ ++static const char *internalNames[] = { ++ "Aero", ++ NULL ++}; ++ ++static const char ** BuiltinNames(void) { ++ return internalNames; ++} ++ ++static Bool CheckProtocol(const char *protocol) { ++ for (int i = 0; internalNames[i]; i++) { ++ if (xf86NameCmp(protocol, internalNames[i]) == 0) ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++static const char *FindDevice(InputInfoPtr pInfo, const char *protocol, int flags) { ++ struct stat st; ++ ++ if (stat(DEVPATH, &st) == -1) ++ return NULL; ++ ++ pInfo->options = xf86AddNewOption(pInfo->options, "Device", DEVPATH); ++ return DEVPATH; ++} ++ ++static const char *DefaultProtocol(void) { ++ return "Aero"; ++} ++ ++static int SupportedInterfaces(void) { ++ return MSE_PS2; ++} ++ ++OSMouseInfoPtr OSMouseInit(int flags) { ++ OSMouseInfoPtr p; ++ ++ p = calloc(sizeof(OSMouseInfoRec), 1); ++ if (p == NULL) ++ return NULL; ++ ++ p->SupportedInterfaces = SupportedInterfaces; ++ p->BuiltinNames = BuiltinNames; ++ p->FindDevice = FindDevice; ++ p->DefaultProtocol = DefaultProtocol; ++ p->CheckProtocol = CheckProtocol; ++ p->PreInit = OsMousePreInit; ++ ++ return p; ++} +\ No newline at end of file +-- +2.39.1 + diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index 6a3c105daa6..b41e0d41336 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -280,9 +280,9 @@ pub fn ps2_keyboard_init() { let mut config = ConfigFlags::from_bits_truncate(io::inb(0x60)); - config.remove(ConfigFlags::FIRST_DISABLED); + config.remove(ConfigFlags::FIRST_DISABLED | ConfigFlags::SECOND_DISABLED); config.remove(ConfigFlags::FIRST_TRANSLATE); // Use scancode set 2 - config.insert(ConfigFlags::FIRST_INTERRUPT); + config.insert(ConfigFlags::FIRST_INTERRUPT | ConfigFlags::SECOND_INTERRUPT); io::outb(0x64, 0x60); // command: write config io::outb(0x60, config.bits()); @@ -295,6 +295,8 @@ pub fn ps2_keyboard_init() { apic::io_apic_setup_legacy_irq(1, keyboard_vector, 1); + super::mouse::ps2_mouse_init(); + // TODO: Move this into /dev/input instead // TODO: Add support for multiple keyboards register_keyboard_listener(KEYBOARD.as_ref().clone()); diff --git a/src/aero_kernel/src/drivers/mod.rs b/src/aero_kernel/src/drivers/mod.rs index 170770a9888..1446a709334 100644 --- a/src/aero_kernel/src/drivers/mod.rs +++ b/src/aero_kernel/src/drivers/mod.rs @@ -28,6 +28,7 @@ pub mod keyboard; #[cfg(target_arch = "x86_64")] pub mod lai; // FIXME: aarch64 port +pub mod mouse; #[cfg(target_arch = "x86_64")] pub mod pci; pub mod pty; diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs new file mode 100644 index 00000000000..6f4af8c3109 --- /dev/null +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -0,0 +1,194 @@ +/* + * Copyright (C) 2021-2022 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +use alloc::sync::Arc; +use alloc::vec::Vec; + +use crate::arch::interrupts::InterruptStack; +use crate::arch::{apic, interrupts, io}; +use crate::fs::devfs::Device; +use crate::fs::inode::{INodeInterface, PollFlags, PollTable}; +use crate::fs::{self, devfs}; +use crate::utils::sync::{BlockQueue, Mutex}; + +bitflags::bitflags! { + /// Represents the flags currently set for the mouse. + #[derive(Default)] + pub struct MouseFlags: u8 { + const LEFT_BUTTON = 0b00000001; + const RIGHT_BUTTON = 0b00000010; + const MIDDLE_BUTTON = 0b00000100; + const ALWAYS_ONE = 0b00001000; + const X_SIGN = 0b00010000; + const Y_SIGN = 0b00100000; + const X_OVERFLOW = 0b01000000; + const Y_OVERFLOW = 0b10000000; + } +} + +const DATA_PORT: u16 = 0x60; +const CMD_PORT: u16 = 0x64; + +lazy_static::lazy_static! { + static ref MOUSE: Arc = Arc::new(Mouse::new()); +} + +static PACKETS: Mutex> = Mutex::new(Vec::new()); + +#[derive(Default, Debug, Copy, Clone)] +#[repr(C)] +struct Packet { + x: i16, + y: i16, + + flags: MouseFlags, +} + +struct Mouse { + packet: Mutex<(Packet, usize)>, + wq: BlockQueue, + marker: usize, +} + +impl Mouse { + fn new() -> Mouse { + Self { + packet: Mutex::new((Packet::default(), 0)), + wq: BlockQueue::new(), + marker: devfs::alloc_device_marker(), + } + } + + fn process_packet(&self, packet: u8) { + let sign_extend = |v: u8| ((v as u16) | 0xFF00) as i16; + let mut inner = self.packet.lock_irq(); + + match inner.1 { + 0 => { + // The first packet contains the mouse flags. + let flags = MouseFlags::from_bits_truncate(packet); + let this = &mut inner.0; + + this.flags = flags; + } + + 1 => { + let this = &mut inner.0; + + // The second byte contains the "delta X". + if !this.flags.contains(MouseFlags::X_OVERFLOW) { + if this.flags.contains(MouseFlags::X_SIGN) { + this.x = sign_extend(packet); + } else { + this.x = packet as i16; + } + } + } + + 2 => { + let this = &mut inner.0; + + // The third packet contains the "delta Y". + if !this.flags.contains(MouseFlags::Y_OVERFLOW) { + if this.flags.contains(MouseFlags::Y_SIGN) { + this.y = sign_extend(packet); + } else { + this.y = packet as i16; + } + + PACKETS.lock_irq().push(this.clone()); + self.wq.notify_complete(); + } + } + + _ => unreachable!(), + } + + inner.1 = (inner.1 + 1) % 3; + } +} + +impl Device for Mouse { + fn device_marker(&self) -> usize { + self.marker + } + + fn device_name(&self) -> String { + String::from("mouse0") + } + + fn inode(&self) -> Arc { + MOUSE.clone() + } +} + +impl INodeInterface for Mouse { + fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + let size = core::mem::size_of::(); + let packet = PACKETS + .lock_irq() + .pop() + .ok_or(fs::FileSystemError::WouldBlock)?; + + assert_eq!(buffer.len(), size); + + unsafe { + *(buffer.as_mut_ptr() as *mut Packet) = packet; + } + + Ok(size) + } + + fn poll(&self, table: Option<&mut PollTable>) -> fs::Result { + table.map(|e| e.insert(&MOUSE.wq)); + + if !PACKETS.lock_irq().is_empty() { + Ok(PollFlags::IN) + } else { + Ok(PollFlags::OUT) + } + } +} + +fn irq_handler(_stack: &mut InterruptStack) { + let data = unsafe { io::inb(0x60) }; + MOUSE.process_packet(data); +} + +pub fn ps2_mouse_init() { + let irq_vector = interrupts::allocate_vector(); + interrupts::register_handler(irq_vector, irq_handler); + + unsafe { + io::outb(CMD_PORT, 0xd4); + io::outb(DATA_PORT, 0xF6); + while io::inb(DATA_PORT) != 0xfa {} + io::outb(CMD_PORT, 0xd4); + io::outb(DATA_PORT, 0xf4); + while io::inb(DATA_PORT) != 0xfa {} + io::outb(CMD_PORT, 0xd4); + io::outb(DATA_PORT, 0xE7); + while io::inb(DATA_PORT) != 0xfa {} + } + + apic::io_apic_setup_legacy_irq(12, irq_vector, 1); + + devfs::install_device(MOUSE.clone()).unwrap(); + log::trace!("ps2: initialized mouse"); +} diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index 9055c61ba0c..266b88a66b0 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -515,15 +515,15 @@ impl Task { } } - if state != TaskState::Runnable { - log::warn!( - "Task::update_state() updated the task state to {state:?}! (pid={:?}, tid={:?})", - self.pid, - self.tid - ); - - crate::unwind::unwind_stack_trace(); - } + // if state != TaskState::Runnable { + // log::warn!( + // "Task::update_state() updated the task state to {state:?}! (pid={:?}, tid={:?})", + // self.pid, + // self.tid + // ); + + // crate::unwind::unwind_stack_trace(); + // } self.state.store(state as _, Ordering::SeqCst); } From d421b880a7680e7dfa5d894b69d91c93928a0258 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 4 Feb 2023 15:42:33 +1100 Subject: [PATCH 109/368] dmenu Signed-off-by: Andy-Python-Programmer --- patches/dwm/dwm.patch | 12 ++++++------ src/aero_kernel/src/fs/inode.rs | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/patches/dwm/dwm.patch b/patches/dwm/dwm.patch index 6e1f9955786..9011d0e6040 100644 --- a/patches/dwm/dwm.patch +++ b/patches/dwm/dwm.patch @@ -1,6 +1,6 @@ -From 18f9a4c102c12aea6e567501fcb003c4573c844a Mon Sep 17 00:00:00 2001 +From f0efc438a6fe55e4e99e1de9c71b0bd6fe55aa1c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Wed, 21 Dec 2022 12:20:18 +1100 +Date: Sat, 4 Feb 2023 14:49:42 +1100 Subject: [PATCH] --- @@ -9,7 +9,7 @@ Subject: [PATCH] 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config.def.h b/config.def.h -index 9efa774..ce9d766 100644 +index 9efa774..0d8130f 100644 --- a/config.def.h +++ b/config.def.h @@ -57,8 +57,8 @@ static const Layout layouts[] = { @@ -18,8 +18,8 @@ index 9efa774..ce9d766 100644 static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; -+static const char *dmenucmd[] = { "alacritty", NULL }; -+static const char *termcmd[] = { "glxgears", NULL }; ++static const char *dmenucmd[] = { "dmenu_run", NULL }; ++static const char *termcmd[] = { "alacritty", NULL }; static const Key keys[] = { /* modifier key function argument */ @@ -39,5 +39,5 @@ index ef8acf7..3d7341e 100644 # freetype FREETYPELIBS = -lfontconfig -lXft -- -2.38.1 +2.39.1 diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index fcf9741b7a0..e018e3ab3ca 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -162,7 +162,7 @@ pub trait INodeInterface: Send + Sync { } fn stat(&self) -> Result { - Err(FileSystemError::NotSupported) + Ok(aero_syscall::Stat::default()) } /// Creates a new dev inode with the provided `name` and the device `marker` in From 56b30adac53632a280334cd0214604714c58d3d6 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 7 Feb 2023 19:15:57 +1100 Subject: [PATCH 110/368] 50% performence improvements * Using *BMutex* where appropriate (blocks the task and gets other task's opportunity to run while the task is waiting to get the lock. * Change the scheduler timeslice. * The *sweeper* kernel thread only gets ran when there are dead tasks. * Do not memset the allocated frames because its not required. Thanks to QProfiler! Signed-off-by: Andy-Python-Programmer --- src/Cargo.toml | 3 - src/aero_kernel/Cargo.toml | 1 - .../src/arch/x86_64/interrupts/exceptions.rs | 1 - src/aero_kernel/src/arch/x86_64/task.rs | 2 - src/aero_kernel/src/drivers/block/nvme/mod.rs | 24 +++--- src/aero_kernel/src/drivers/uart_16550.rs | 8 +- src/aero_kernel/src/fs/cache.rs | 8 +- src/aero_kernel/src/fs/inode.rs | 12 +-- src/aero_kernel/src/logger.rs | 10 +-- src/aero_kernel/src/mem/paging/frame.rs | 43 +++-------- src/aero_kernel/src/syscall/fs.rs | 3 - src/aero_kernel/src/userland/scheduler/mod.rs | 2 +- .../src/userland/scheduler/round_robin.rs | 12 ++- src/aero_kernel/src/userland/task.rs | 1 - src/aero_kernel/src/userland/vm.rs | 77 +++---------------- src/aero_kernel/src/utils/mod.rs | 4 +- src/aero_kernel/src/utils/sync.rs | 65 +++++++++++++++- 17 files changed, 124 insertions(+), 152 deletions(-) diff --git a/src/Cargo.toml b/src/Cargo.toml index 2a3e0e90ff0..3dd6a80ae08 100644 --- a/src/Cargo.toml +++ b/src/Cargo.toml @@ -1,5 +1,2 @@ [workspace] members = ["aero_kernel", "aero_syscall", "aero_proc"] - -[profile.release] -debug = true diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index 04d6d304c74..d6d74c6f6e5 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -17,7 +17,6 @@ ci = [] # kernel memory leaks in a way similar to a tracing # garbage collector. kmemleak = [] -vmlog = [] syslog = [] default = ["round-robin"] diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs index ddcceaca7df..67207f5f883 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs @@ -156,7 +156,6 @@ pub(super) fn page_fault(stack: &mut InterruptErrorStack) { .expect("userland application does not have a path set") ); - task.vm.log(); task.file_table.log(); if LOG_PF_PTABLE { diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 8e25c205f7f..cd5e336e9cd 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -316,8 +316,6 @@ impl ArchTask { None, ); - vm.log(); - address_space.switch(); // Perform the address space switch self.context = Unique::dangling(); diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 9aba1f10fdf..56e43b7caaf 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -37,7 +37,7 @@ use crate::drivers::pci::*; use crate::fs::block::{install_block_device, BlockDevice, BlockDeviceInterface}; use crate::mem::paging::*; -use crate::utils::sync::Mutex; +use crate::utils::sync::BMutex; use crate::utils::{CeilDiv, VolatileCell}; #[derive(Copy, Clone, Debug)] @@ -226,7 +226,7 @@ struct Namespace<'a> { block_size: usize, size: usize, max_prps: usize, - prps: Mutex]>>, + prps: BMutex]>>, controller: Arc>, } @@ -260,16 +260,16 @@ impl<'a> Namespace<'a> { read_cmd.data_ptr.prp1 = start.as_u64(); } - self.controller.io_queue.lock_irq().submit_command(read_cmd); + self.controller.io_queue.lock().submit_command(read_cmd); } } struct Controller<'a> { identity: Dma, - namespaces: Mutex>>, + namespaces: BMutex>>, - admin: Mutex>, - io_queue: Mutex>, + admin: BMutex>, + io_queue: BMutex>, } impl<'a> Controller<'a> { @@ -388,10 +388,10 @@ impl<'a> Controller<'a> { let this = Arc::new(Self { identity, - namespaces: Mutex::new(alloc::vec![]), + namespaces: BMutex::new(alloc::vec![]), - admin: Mutex::new(admin), - io_queue: Mutex::new(io_queue), + admin: BMutex::new(admin), + io_queue: BMutex::new(io_queue), }); // Discover and initialize the namespaces. @@ -442,7 +442,7 @@ impl<'a> Controller<'a> { block_size, size: blocks * block_size, max_prps, - prps: Mutex::new(Dma::new_uninit_slice(max_prps)), + prps: BMutex::new(Dma::new_uninit_slice(max_prps)), }; log::trace!( @@ -488,13 +488,13 @@ impl<'a> BlockDeviceInterface for Controller<'a> { // PCI device handler for NVMe controllers. struct Handler<'admin> { - controllers: Mutex>>>, + controllers: BMutex>>>, } impl<'admin> Handler<'admin> { fn new() -> Arc { Arc::new(Self { - controllers: Mutex::new(Vec::new()), + controllers: BMutex::new(Vec::new()), }) } } diff --git a/src/aero_kernel/src/drivers/uart_16550.rs b/src/aero_kernel/src/drivers/uart_16550.rs index e7f9d017d9f..3190fd3ae45 100644 --- a/src/aero_kernel/src/drivers/uart_16550.rs +++ b/src/aero_kernel/src/drivers/uart_16550.rs @@ -147,9 +147,7 @@ pub macro serial_println { #[doc(hidden)] pub fn _serial_print(args: fmt::Arguments) { - COM_1.get().map(|c| { - c.lock_irq() - .write_fmt(args) - .expect("failed to write to COM1") - }); + COM_1 + .get() + .map(|c| c.lock().write_fmt(args).expect("failed to write to COM1")); } diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index 74edde4b4a3..5d4fce36d14 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -40,7 +40,7 @@ use alloc::vec::Vec; use spin::Once; use crate::fs::inode::{DirEntry, INodeInterface}; -use crate::utils::sync::Mutex; +use crate::utils::sync::BMutex; use super::FileSystem; @@ -195,14 +195,14 @@ struct CacheIndex> { } pub struct Cache> { - index: Mutex>, + index: BMutex>, self_ref: Weak>, } impl> Cache { pub fn new() -> Arc { Arc::new_cyclic(|this| Cache:: { - index: Mutex::new(CacheIndex { + index: BMutex::new(CacheIndex { used: hashbrown::HashMap::new(), unused: lru::LruCache::new(NonZeroUsize::new(4096).unwrap()), }), @@ -277,7 +277,7 @@ impl> Cache { fn mark_item_unused(&self, item: CacheArc>) { item.set_used(false); - let mut index = self.index.lock_irq(); + let mut index = self.index.lock(); let key = item.cache_key(); assert!(index.used.remove(&key).is_some()); diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index e018e3ab3ca..f484a8dd6d4 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -35,7 +35,7 @@ use crate::socket::unix::UnixSocket; use crate::socket::SocketAddr; use crate::userland::scheduler; use crate::utils::sync::BlockQueue; -use crate::utils::sync::Mutex; +use crate::utils::sync::{BMutex, Mutex}; use super::cache; use super::cache::Cacheable; @@ -367,7 +367,7 @@ pub(super) struct DirProtectedData { /// A directory entry is basically the mapping of filename to its inode. pub struct DirEntry { - pub(super) data: Mutex, + pub(super) data: BMutex, pub(super) filesystem: Once>, pub(super) cache_marker: usize, } @@ -388,7 +388,7 @@ impl DirEntry { let cache_me = ![".", ".."].contains(&name.as_str()); let entry = Self { - data: Mutex::new(DirProtectedData { + data: BMutex::new(DirProtectedData { parent: Some(parent.clone()), inode: inode.clone(), name, @@ -421,7 +421,7 @@ impl DirEntry { let dcache = cache::dcache(); dcache.make_item_no_cache(Self { - data: Mutex::new(DirProtectedData { + data: BMutex::new(DirProtectedData { parent: None, inode: inode.clone(), name, @@ -437,7 +437,7 @@ impl DirEntry { let inode = icache.make_item_no_cache(CachedINode::new(inode)); cache::dcache().make_item_no_cache(Self { - data: Mutex::new(DirProtectedData { + data: BMutex::new(DirProtectedData { parent: None, name, @@ -464,7 +464,7 @@ impl DirEntry { .make_local_socket_inode(name.as_str(), inode)?; Ok(cache::dcache().make_item_no_cache(Self { - data: Mutex::new(DirProtectedData { + data: BMutex::new(DirProtectedData { parent: Some(parent), inode: inode.clone(), name, diff --git a/src/aero_kernel/src/logger.rs b/src/aero_kernel/src/logger.rs index 2a5dd68425f..a59f12af93f 100644 --- a/src/aero_kernel/src/logger.rs +++ b/src/aero_kernel/src/logger.rs @@ -50,13 +50,6 @@ impl log::Log for AeroLogger { let line = record.line().unwrap_or(0); - if let Some(pp) = record.module_path() { - // Only log the vm logs if the vmlog feature is enabled ;^). - if pp == "aero_kernel::userland::vm" && !cfg!(feature = "vmlog") { - return; - } - } - let level = record.level(); let rendy_dbg = RENDY_DEBUG.load(Ordering::Relaxed); @@ -69,7 +62,8 @@ impl log::Log for AeroLogger { let mut log_ring = LOG_RING_BUFFER.get().unwrap().lock_irq(); let _ = writeln!(log_ring, "[{}] {}", level, record.args()); - serial_print!("\x1b[37;1m{file}:{line} "); + let ticks = crate::arch::time::get_uptime_ticks(); + serial_print!("\x1b[37;1m[{}] {file}:{line} ", ticks); if scheduler::is_initialized() { // fetch the current task, grab the TID and PID. diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 39678c6915c..3665e690688 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -58,18 +58,11 @@ unsafe impl FrameAllocator for LockedFrameAllocator { // let caller = core::panic::Location::caller(); // log::debug!("allocation request of 4KiB by {:?}", caller); - self.0 - .get() - .map(|m| { - m.lock_irq() - .allocate_frame_inner(0) - .map(|f| PhysFrame::containing_address(f)) - }) - .unwrap_or(None) - .map(|frame| { - frame.as_slice_mut().fill(0); - frame - }) + self.0.get().map(|m| { + m.lock_irq() + .allocate_frame_inner(0) + .map(|f| PhysFrame::containing_address(f)) + })? } #[track_caller] @@ -90,18 +83,11 @@ unsafe impl FrameAllocator for LockedFrameAllocator { // let caller = core::panic::Location::caller(); // log::debug!("allocation request of 2MiB by {:?}", caller); - self.0 - .get() - .map(|m| { - m.lock_irq() - .allocate_frame_inner(2) - .map(|f| PhysFrame::containing_address(f)) - }) - .unwrap_or(None) - .map(|frame| { - frame.as_slice_mut().fill(0); - frame - }) + self.0.get().map(|m| { + m.lock_irq() + .allocate_frame_inner(2) + .map(|f| PhysFrame::containing_address(f)) + })? } #[track_caller] @@ -167,6 +153,7 @@ pub enum BuddyOrdering { Size8KiB = 2, } +// FIXME: REMOVE THIS FUNCTION pub fn pmm_alloc(order: BuddyOrdering) -> PhysAddr { let order = order as usize; debug_assert!(order <= BUDDY_SIZE.len()); @@ -179,14 +166,6 @@ pub fn pmm_alloc(order: BuddyOrdering) -> PhysAddr { .allocate_frame_inner(order) .expect("pmm: out of memory"); - let virt = addr.as_hhdm_virt(); - - let fill_size = BUDDY_SIZE[order] as usize; - let slice = unsafe { core::slice::from_raw_parts_mut(virt.as_mut_ptr::(), fill_size) }; - - // We always zero out memory for security reasons. - slice.fill(0x00); - addr } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index e4a1e51677f..ec677adba49 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -287,9 +287,6 @@ pub fn pipe(fds: &mut [i32; 2], flags: usize) -> Result { Ok(fd2) => fd2, }; - log::info!("pipe() = [{}, {}]", fd1, fd2); - crate::unwind::unwind_stack_trace(); - fds[0] = fd1 as i32; fds[1] = fd2 as i32; diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index 6f8e4e599f0..3a51f8ddbd2 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -152,7 +152,7 @@ pub fn is_initialized() -> bool { } static SCHEDULER_VECTOR: Once = Once::new(); -const SCHEDULER_TIMER_US: usize = 20000; +const SCHEDULER_TIMER_US: usize = 5000; fn scheduler_irq_handler(_stack: &mut InterruptStack) { #[cfg(target_arch = "x86_64")] diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 9b15d150050..203bf4c8143 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -25,7 +25,7 @@ use crate::arch; use crate::userland::signals::{SignalError, SignalResult}; use crate::userland::task::{SchedTaskAdapter, Task, TaskState}; -use crate::utils::sync::IrqGuard; +use crate::utils::sync::{BlockQueue, IrqGuard}; use crate::utils::PerCpu; use super::SchedulerInterface; @@ -44,6 +44,8 @@ struct TaskQueue { dead: LinkedList, awaiting: LinkedList, deadline_awaiting: LinkedList, + + dead_wq: BlockQueue, } impl TaskQueue { @@ -58,6 +60,8 @@ impl TaskQueue { dead: LinkedList::new(SchedTaskAdapter::new()), awaiting: LinkedList::new(SchedTaskAdapter::new()), deadline_awaiting: LinkedList::new(SchedTaskAdapter::new()), + + dead_wq: BlockQueue::new(), } } @@ -118,7 +122,10 @@ impl RoundRobin { let _guard = IrqGuard::new(); let queue = self.queue.get_mut(); - if let Some(task) = queue.dead.pop_front() { + if queue.dead.is_empty() { + queue.dead_wq.insert(self.current_task()); + self.await_io().unwrap(); + } else if let Some(task) = queue.dead.pop_front() { task.update_state(TaskState::Zombie); task.into_zombie(); } @@ -298,6 +305,7 @@ impl SchedulerInterface for RoundRobin { .store(status, core::sync::atomic::Ordering::SeqCst); queue.push_dead(current_task.clone()); + queue.dead_wq.notify_complete(); core::mem::drop(guard); self.preempt(); diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index 266b88a66b0..e86f110111d 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -324,7 +324,6 @@ impl Task { this.signals().copy_from(self.signals()); this.vm.fork_from(self.vm()); - this.vm.log(); this } diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index d3d8dc560b8..cacbf839851 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -40,7 +40,7 @@ use crate::mem::paging::*; use crate::mem::AddressSpace; use crate::syscall::ExecArgs; -use crate::utils::sync::Mutex; +use crate::utils::sync::BMutex; const ELF_HEADER_MAGIC: [u8; 4] = [0x7f, b'E', b'L', b'F']; @@ -363,12 +363,6 @@ impl Mapping { let addr_aligned = address.align_down(Size4KiB::SIZE); if !reason.contains(PageFaultErrorCode::PROTECTION_VIOLATION) { - log::trace!( - " - private R: {:#x}..{:#x}", - addr_aligned, - addr_aligned + Size4KiB::SIZE - ); - let frame: PhysFrame = PhysFrame::containing_address(pmm_alloc(BuddyOrdering::Size4KiB)); @@ -389,12 +383,6 @@ impl Mapping { true } else if reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) { - log::trace!( - " - private COW: {:#x}..{:#x}", - addr_aligned, - addr_aligned + Size4KiB::SIZE - ); - self.handle_cow(offset_table, addr_aligned, false) } else { log::error!(" - present page read failed"); @@ -425,13 +413,6 @@ impl Mapping { if !reason.contains(PageFaultErrorCode::PROTECTION_VIOLATION) { // We are writing to private file mapping so copy the content of the page. - log::trace!( - " - private file R: {:?}..{:?} (offset={:#x})", - address, - address + size, - offset - ); - let frame = mmap_file .file .inode() @@ -525,12 +506,9 @@ impl Mapping { if let Some(vm_frame) = phys_addr.as_vm_frame() { if vm_frame.ref_count() > 1 || copy { // This page is used by more then one process, so make it a private copy. - log::trace!(" - making {:?} into a private copy", page); Self::map_copied(offset_table, page, self.protection).unwrap(); } else { // This page is used by only one process, so make it writable. - log::trace!(" - making {:?} writable", page); - unsafe { offset_table.update_flags( page, @@ -635,30 +613,6 @@ impl VmProtected { } } - fn log(&self) { - for mmap in &self.mappings { - if let Some(file) = mmap.file.as_ref() { - log::debug!( - "{:?}..{:?} => {:?}, {:?} (offset={:#x}, size={:#x})", - mmap.start_addr, - mmap.end_addr, - mmap.protection, - mmap.flags, - file.offset, - file.size, - ); - } else { - log::debug!( - "{:?}..{:?} => {:?}, {:?}", - mmap.start_addr, - mmap.end_addr, - mmap.protection, - mmap.flags, - ); - } - } - } - fn handle_page_fault( &mut self, reason: PageFaultErrorCode, @@ -669,8 +623,6 @@ impl VmProtected { .iter_mut() .find(|e| accessed_address >= e.start_addr && accessed_address < e.end_addr) { - log::trace!("mapping {:?} on demand", accessed_address); - if map.protection.is_empty() { return false; } @@ -708,7 +660,6 @@ impl VmProtected { result } else { log::trace!("mapping not found for address: {:#x}", accessed_address); - self.log(); // else the mapping does not exist, so return false. false @@ -748,7 +699,7 @@ impl VmProtected { return Some((address, self.mappings.cursor_front_mut())); } - let mut cursor = self.mappings.cursor_front_mut(); + let mut cursor = self.mappings.cursor_back_mut(); // Search the mappings starting at the current cursor position for a big // enough hole for where the address is above the provided `address`. A hole is @@ -1048,8 +999,6 @@ impl VmProtected { let mut address_space = AddressSpace::this(); let mut offset_table = address_space.offset_page_table(); - log::debug!("unmapping {:?}..{:?}", start, end); - while let Some(map) = cursor.current() { if map.end_addr <= start { cursor.move_next(); @@ -1084,7 +1033,7 @@ impl VmProtected { } fn fork_from(&mut self, parent: &Vm) { - let data = parent.inner.lock_irq(); + let data = parent.inner.lock(); // Copy over all of the mappings from the parent into the child. self.mappings = data.mappings.clone(); @@ -1092,14 +1041,14 @@ impl VmProtected { } pub struct Vm { - inner: Mutex, + inner: BMutex, } impl Vm { /// Creates a new instance of VM. pub(super) fn new() -> Self { Self { - inner: Mutex::new(VmProtected::new()), + inner: BMutex::new(VmProtected::new()), } } @@ -1113,16 +1062,16 @@ impl Vm { file: Option, ) -> Option { self.inner - .lock_irq() + .lock() .mmap(address, size, protection, flags, offset, file) } pub fn munmap(&self, address: VirtAddr, size: usize) -> bool { - self.inner.lock_irq().munmap(address, size) + self.inner.lock().munmap(address, size) } pub(super) fn fork_from(&self, parent: &Vm) { - self.inner.lock_irq().fork_from(parent) + self.inner.lock().fork_from(parent) } /// Mapping the provided `bin` file into the VM. @@ -1132,12 +1081,12 @@ impl Vm { argv: Option, envv: Option, ) -> Result { - self.inner.lock_irq().load_bin(bin, argv, envv) + self.inner.lock().load_bin(bin, argv, envv) } /// Clears and unmaps all of the mappings in the VM. pub(super) fn clear(&self) { - self.inner.lock_irq().clear() + self.inner.lock().clear() } /// This function is responsible for handling page faults occurred in @@ -1149,11 +1098,7 @@ impl Vm { accessed_address: VirtAddr, ) -> bool { self.inner - .lock_irq() + .lock() .handle_page_fault(reason, accessed_address) } - - pub(crate) fn log(&self) { - self.inner.lock_irq().log() - } } diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index b244210e990..46ba8405b42 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -146,12 +146,12 @@ impl PerCpu { #[inline] pub fn get(&self) -> &T { - unsafe { &*self.as_mut_ptr().offset(crate::arch::tls::get_cpuid() as _) } + unsafe { &*self.as_mut_ptr().offset(0) } } #[inline] pub fn get_mut(&self) -> &mut T { - unsafe { &mut *self.as_mut_ptr().offset(crate::arch::tls::get_cpuid() as _) } + unsafe { &mut *self.as_mut_ptr().offset(0) } } } diff --git a/src/aero_kernel/src/utils/sync.rs b/src/aero_kernel/src/utils/sync.rs index 01a5600a6e4..cbdbc2bfd11 100644 --- a/src/aero_kernel/src/utils/sync.rs +++ b/src/aero_kernel/src/utils/sync.rs @@ -13,8 +13,7 @@ pub struct BlockQueue { impl BlockQueue { /// Creates a new block queue. - #[inline] - pub fn new() -> Self { + pub const fn new() -> Self { Self { queue: Mutex::new(Vec::new()), } @@ -118,8 +117,68 @@ impl Drop for IrqGuard { } } +/// A blocking-based lock providing mutually exclusive access to the data. +pub struct BMutex { + wq: BlockQueue, + spin: Mutex, +} + +impl BMutex { + pub const fn new(value: T) -> Self { + Self { + wq: BlockQueue::new(), + spin: Mutex::new(value), + } + } + + pub fn lock(&self) -> BMutexGuard { + let task = scheduler::get_scheduler().current_task(); + self.wq.insert(task.clone()); + + loop { + if let Some(guard) = self.spin.inner.try_lock() { + self.wq.remove(task); + + return BMutexGuard { + guard, + mutex: &self, + }; + } + + let _ = scheduler::get_scheduler().inner.await_io(); + } + } +} + +pub struct BMutexGuard<'a, T: ?Sized + 'a> { + guard: spin::MutexGuard<'a, T>, + mutex: &'a BMutex, +} + +impl<'a, T: ?Sized> core::ops::Deref for BMutexGuard<'a, T> { + type Target = T; + + #[inline] + fn deref(&self) -> &T { + self.guard.deref() + } +} + +impl<'a, T: ?Sized> core::ops::DerefMut for BMutexGuard<'a, T> { + #[inline] + fn deref_mut(&mut self) -> &mut T { + self.guard.deref_mut() + } +} + +impl<'a, T: ?Sized> Drop for BMutexGuard<'a, T> { + fn drop(&mut self) { + self.mutex.wq.notify_complete(); + } +} + /// A spin-based lock providing mutually exclusive access to data. -pub struct Mutex { +pub struct Mutex { inner: spin::Mutex, } From 893b4bc856c193f343b1c3af5fe7a651e48ac988 Mon Sep 17 00:00:00 2001 From: no92 Date: Sat, 4 Feb 2023 23:36:37 +0100 Subject: [PATCH 111/368] meta: use external Linux headers with the new mlibc option --- bootstrap.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/bootstrap.yml b/bootstrap.yml index cafc2cbf653..af3335f1c7e 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -731,18 +731,41 @@ packages: # environ: # DESTDIR: '@THIS_COLLECT_DIR@' + - name: linux-headers + source: + subdir: 'bundled' + url: 'https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.8.tar.xz' + checksum: 'blake2b:1eeab95bf09757131031ebeaa3fb66f01626ecfe3b72d0044176613d027ac6643c688a0bb8f4493ae6faa3d3bf0c89fcdff3c28d7b8375e59ed6e8bd6d856e44' + extract_path: 'linux-6.1.8' + format: 'tar.xz' + version: '6.1.8' + implict_package: true + configure: + - args: ['cp', '-Tr', '@THIS_SOURCE_DIR@', '.'] + build: + - args: ['make', 'ARCH=x86_64', 'headers_install'] + - args: ['find', 'usr/include', '-type', 'f', '!', '-name', '*.h', '-delete'] + - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr'] + # remove this file, as mlibc will override this file with one suited to mlibc + - args: ['rm', 'usr/include/linux/libc-compat.h'] + - args: ['cp', '-r', 'usr/include', '@THIS_COLLECT_DIR@/usr'] + - name: mlibc-headers from_source: mlibc implict_package: true + pkgs_required: + - linux-headers configure: - args: - 'meson' + - 'setup' - '--cross-file' - '@SOURCE_ROOT@/userland/cross-file.ini' - '--prefix=/usr' - '-Dheaders_only=true' - '-Ddisable_iconv_option=true' - '-Dbuildtype=debug' + - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' - '@THIS_SOURCE_DIR@' build: - args: ['ninja'] @@ -758,9 +781,11 @@ packages: implict_package: true pkgs_required: - mlibc-headers + - linux-headers configure: - args: - 'meson' + - 'setup' - '--cross-file' - '@SOURCE_ROOT@/userland/cross-file.ini' - '--prefix=/usr' @@ -768,6 +793,7 @@ packages: - '-Dmlibc_no_headers=true' - '-Ddisable_iconv_option=true' - '-Dbuildtype=debug' + - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' - '@THIS_SOURCE_DIR@' build: - args: ['ninja'] From edf22c2ee8c8e59689ce8d0159b412971af8a114 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 10 Feb 2023 19:49:56 +1100 Subject: [PATCH 112/368] e1000: init Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/e1000.rs | 308 +++++++++++++++++++++++++++ src/aero_kernel/src/drivers/mod.rs | 1 + 2 files changed, 309 insertions(+) create mode 100644 src/aero_kernel/src/drivers/e1000.rs diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs new file mode 100644 index 00000000000..e7354acfe5b --- /dev/null +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -0,0 +1,308 @@ +/* + * Copyright (C) 2021-2023 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +use alloc::sync::Arc; + +use crate::drivers::pci::*; +use crate::mem::paging::*; + +const TX_DESC_NUM: usize = 32; +const TX_DESC_SIZE: usize = TX_DESC_NUM * core::mem::size_of::(); + +const RX_QUEUE_SIZE: usize = 32; + +#[derive(Copy, Clone, Debug)] +enum Error { + UnknownBar, + NoEeprom, + OutOfMemory, + NotSupported, +} + +#[derive(Copy, Clone)] +#[repr(usize)] +enum Register { + Control = 0x00, + Eeprom = 0x14, + + TCtrl = 0x400, + /// Lower bits of the 64 bit descriptor base address. + TxDesLo = 0x3800, + /// Upper 32 bits of the 64 bit descriptor base address. + TxDesHi = 0x3804, + /// Descriptor length and must be 128B aligned. + TxDescLen = 0x3808, + /// Head pointer for the transmit descriptor ring. + TxDescHead = 0x3810, + /// Tail pointer for the transmit descriptor ring. + TxDescTail = 0x3818, + /// Controls the IPG (Inter Packet Gap) timer. + Tipg = 0x410, +} + +bitflags::bitflags! { + struct ControlFlags: u32 { + const LRST = 1 << 3; + const ASDE = 1 << 5; + const SLU = 1 << 6; + const ILOS = 1 << 7; + const RST = 1 << 26; + const VME = 1 << 30; + const PHY_RST = 1 << 31; + } +} + +bitflags::bitflags! { + pub struct TStatus: u8 { + const DD = 1 << 0; // Descriptor Done + const EC = 1 << 1; // Excess Collisions + const LC = 1 << 2; // Late Collision + const TU = 1 << 3; // Transmit Underrun + } +} + +bitflags::bitflags! { + pub struct TCtl: u32 { + const EN = 1 << 1; // Transmit Enable + const PSP = 1 << 3; // Pad Short Packets + const SWXOFF = 1 << 22; // Software XOFF Transmission + const RTLC = 1 << 24; // Re-transmit on Late Collision + } +} + +impl TCtl { + /// Sets the number of attempts at retransmission prior to giving + /// up on the packet (not including the first transmission attempt). + pub fn set_collision_threshold(&mut self, value: u8) { + self.bits |= (value as u32) << 4; + } + + /// Sets the minimum number of byte times which must elapse for + /// proper CSMA/CD operation. + pub fn set_collision_distance(&mut self, value: u8) { + self.bits |= (value as u32) << 12; + } +} + +#[repr(C, packed)] +pub struct TxDescriptor { + pub addr: u64, + pub length: u16, + pub cso: u8, + pub cmd: u8, + pub status: TStatus, + pub css: u8, + pub special: u16, +} + +struct Eeprom<'a> { + e1000: &'a E1000, +} + +impl<'a> Eeprom<'a> { + fn new(e1000: &'a E1000) -> Self { + Self { e1000 } + } + + fn read(&self, addr: u8) -> u32 { + self.e1000.write(Register::Eeprom, 1 | ((addr as u32) << 8)); + + loop { + let res = self.e1000.read(Register::Eeprom); + + if res & (1 << 4) > 0 { + return (res >> 16) & 0xffff; + } + } + } +} + +struct E1000 { + base: VirtAddr, +} + +impl E1000 { + fn new(header: &PciHeader) -> Result<(), Error> { + header.enable_bus_mastering(); + header.enable_mmio(); + + let bar0 = header.get_bar(0).ok_or(Error::UnknownBar)?; + + let registers_addr = match bar0 { + Bar::Memory64 { address, .. } => PhysAddr::new(address), + Bar::Memory32 { address, .. } => PhysAddr::new(address as u64), + _ => return Err(Error::UnknownBar), + }; + + let this = Self { + base: registers_addr.as_hhdm_virt(), + }; + + this.reset(); + + if !this.detect_eeprom() { + return Err(Error::NoEeprom); + } + + let eeprom = Eeprom::new(&this); + + let mut mac = [0u8; 6]; + + // Get the MAC address + for i in 0..3 { + let x = eeprom.read(i) as u16; + mac[i as usize * 2] = (x & 0xff) as u8; + mac[i as usize * 2 + 1] = (x >> 8) as u8; + } + + log::trace!( + "e1000: MAC address {:x}:{:x}:{:x}:{:x}:{:x}:{:x}", + mac[0], + mac[1], + mac[2], + mac[3], + mac[4], + mac[5] + ); + + this.init_tx()?; + this.init_rx()?; + + log::trace!("e1000: successfully initialized"); + Ok(()) + } + + fn init_tx(&self) -> Result<(), Error> { + assert!(core::mem::size_of::() * TX_DESC_NUM < Size4KiB::SIZE as usize); + + let frame: PhysFrame = + FRAME_ALLOCATOR.allocate_frame().ok_or(Error::OutOfMemory)?; + + let addr = frame.start_address().as_hhdm_virt(); + let descriptors = addr + .read_mut::<[TxDescriptor; TX_DESC_NUM]>() + .ok_or(Error::NotSupported)?; + + for desc in descriptors { + desc.status = TStatus::DD; + } + + let phys = frame.start_address(); + + self.write(Register::TxDesLo, phys.as_u64() as _); + self.write(Register::TxDesHi, (phys.as_u64() >> 32) as _); + self.write(Register::TxDescLen, TX_DESC_SIZE as _); + self.write(Register::TxDescHead, 0); + self.write(Register::TxDescTail, 0); + + let mut flags = TCtl::EN | TCtl::PSP | TCtl::RTLC; + flags.set_collision_distance(64); + flags.set_collision_threshold(15); + + self.write(Register::TCtrl, flags.bits()); + + // TODO: Set the default values for the Tx Inter Packet + // Gap Timer. + // self.write(Register::Tipg, 0x??????) + + Ok(()) + } + + fn init_rx(&self) -> Result<(), Error> { + Ok(()) + } + + fn detect_eeprom(&self) -> bool { + self.write(Register::Eeprom, 1); + + for _ in 0..1000 { + let value = self.read(Register::Eeprom); + + if value & (1 << 4) > 0 { + return true; + } + } + + false + } + + fn reset(&self) { + self.insert_flags(Register::Control, ControlFlags::RST.bits()); + + while ControlFlags::from_bits_truncate(self.read(Register::Control)) + .contains(ControlFlags::RST) + { + core::hint::spin_loop(); + } + + // Do not use VLANs, clear reset and do not invert loss-of-signal. + self.remove_flags( + Register::Control, + (ControlFlags::LRST | ControlFlags::PHY_RST | ControlFlags::VME).bits(), + ); + } + + fn remove_flags(&self, register: Register, flag: u32) { + self.write(register, self.read(register) & !flag); + } + + fn insert_flags(&self, register: Register, flag: u32) { + self.write(register, self.read(register) | flag); + } + + fn write(&self, register: Register, value: u32) { + unsafe { + let register = self.base.as_mut_ptr::().add(register as usize); + core::ptr::write_volatile(register as *mut u32, value); + } + } + + fn read(&self, register: Register) -> u32 { + unsafe { self.read_raw(register as u32) } + } + + unsafe fn read_raw(&self, register: u32) -> u32 { + let register = self.base.as_ptr::().add(register as usize); + core::ptr::read_volatile(register as *const u32) + } +} + +struct Handler; + +impl Handler { + fn new() -> Arc { + Arc::new(Self {}) + } +} + +impl PciDeviceHandle for Handler { + fn handles(&self, vendor_id: Vendor, device_id: DeviceType) -> bool { + vendor_id == Vendor::Intel && device_id == DeviceType::EthernetController + } + + fn start(&self, header: &PciHeader, _offset_table: &mut OffsetPageTable) { + E1000::new(header).unwrap() + } +} + +fn init() { + register_device_driver(Handler::new()) +} + +crate::module_init!(init, ModuleType::Block); diff --git a/src/aero_kernel/src/drivers/mod.rs b/src/aero_kernel/src/drivers/mod.rs index 1446a709334..ba761134561 100644 --- a/src/aero_kernel/src/drivers/mod.rs +++ b/src/aero_kernel/src/drivers/mod.rs @@ -28,6 +28,7 @@ pub mod keyboard; #[cfg(target_arch = "x86_64")] pub mod lai; // FIXME: aarch64 port +pub mod e1000; pub mod mouse; #[cfg(target_arch = "x86_64")] pub mod pci; From f4b6b8f0dcbac4adf8f37777bffd2a2e3a644e09 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 11 Feb 2023 13:05:37 +1100 Subject: [PATCH 113/368] e1000: init rx Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/e1000.rs | 122 ++++++++++++++++++++++++--- 1 file changed, 108 insertions(+), 14 deletions(-) diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index e7354acfe5b..bcb8c5669cf 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -22,10 +22,11 @@ use alloc::sync::Arc; use crate::drivers::pci::*; use crate::mem::paging::*; -const TX_DESC_NUM: usize = 32; -const TX_DESC_SIZE: usize = TX_DESC_NUM * core::mem::size_of::(); +const TX_DESC_NUM: u32 = 32; +const TX_DESC_SIZE: u32 = TX_DESC_NUM * core::mem::size_of::() as u32; -const RX_QUEUE_SIZE: usize = 32; +const RX_DESC_NUM: u32 = 32; +const RX_DESC_SIZE: u32 = RX_DESC_NUM * core::mem::size_of::() as u32; #[derive(Copy, Clone, Debug)] enum Error { @@ -41,6 +42,18 @@ enum Register { Control = 0x00, Eeprom = 0x14, + RCtrl = 0x0100, + /// Lower bits of the 64 bit descriptor base address. + RxDescLo = 0x2800, + /// Upper 32 bits of the 64 bit descriptor base address. + RxDescHi = 0x2804, + /// Descriptor length and must be 128B aligned. + RxDescLen = 0x2808, + /// Head pointer for the receive descriptor buffer. + RxDescHead = 0x2810, + /// Tail pointer for the receive descriptor buffer. + RxDescTail = 0x2818, + TCtrl = 0x400, /// Lower bits of the 64 bit descriptor base address. TxDesLo = 0x3800, @@ -69,7 +82,7 @@ bitflags::bitflags! { } bitflags::bitflags! { - pub struct TStatus: u8 { + struct TStatus: u8 { const DD = 1 << 0; // Descriptor Done const EC = 1 << 1; // Excess Collisions const LC = 1 << 2; // Late Collision @@ -78,7 +91,7 @@ bitflags::bitflags! { } bitflags::bitflags! { - pub struct TCtl: u32 { + struct TCtl: u32 { const EN = 1 << 1; // Transmit Enable const PSP = 1 << 3; // Pad Short Packets const SWXOFF = 1 << 22; // Software XOFF Transmission @@ -89,19 +102,54 @@ bitflags::bitflags! { impl TCtl { /// Sets the number of attempts at retransmission prior to giving /// up on the packet (not including the first transmission attempt). - pub fn set_collision_threshold(&mut self, value: u8) { + fn set_collision_threshold(&mut self, value: u8) { self.bits |= (value as u32) << 4; } /// Sets the minimum number of byte times which must elapse for /// proper CSMA/CD operation. - pub fn set_collision_distance(&mut self, value: u8) { + fn set_collision_distance(&mut self, value: u8) { self.bits |= (value as u32) << 12; } } +bitflags::bitflags! { + struct RCtl: u32 { + const EN = 1 << 1; // Receiver Enable + const SBP = 1 << 2; // Store Bad Packets + const UPE = 1 << 3; // Unicast Promiscuous Enabled + const MPE = 1 << 4; // Multicast Promiscuous Enabled + const LPE = 1 << 5; // Long Packet Reception Enable + const LBM_NONE = 0 << 6; // No Loopback + const LBM_PHY = 3 << 6; // PHY or external SerDesc loopback + const RDMTS_HALF = 0 << 8; // Free Buffer Threshold is 1/2 of RDLEN + const RDMTS_QUARTER = 1 << 8; // Free Buffer Threshold is 1/4 of RDLEN + const RDMTS_EIGHTH = 2 << 8; // Free Buffer Threshold is 1/8 of RDLEN + const MO_36 = 0 << 12; // Multicast Offset - bits 47:36 + const MO_35 = 1 << 12; // Multicast Offset - bits 46:35 + const MO_34 = 2 << 12; // Multicast Offset - bits 45:34 + const MO_32 = 3 << 12; // Multicast Offset - bits 43:32 + const BAM = 1 << 15; // Broadcast Accept Mode + const VFE = 1 << 18; // VLAN Filter Enable + const CFIEN = 1 << 19; // Canonical Form Indicator Enable + const CFI = 1 << 20; // Canonical Form Indicator Bit Value + const DPF = 1 << 22; // Discard Pause Frames + const PMCF = 1 << 23; // Pass MAC Control Frames + const SECRC = 1 << 26; // Strip Ethernet CRC + + // Receive Buffer Size - bits 17:16 + const BSIZE_256 = 3 << 16; + const BSIZE_512 = 2 << 16; + const BSIZE_1024 = 1 << 16; + const BSIZE_2048 = 0 << 16; + const BSIZE_4096 = (3 << 16) | (1 << 25); + const BSIZE_8192 = (2 << 16) | (1 << 25); + const BSIZE_16384 = (1 << 16) | (1 << 25); + } +} + #[repr(C, packed)] -pub struct TxDescriptor { +struct TxDescriptor { pub addr: u64, pub length: u16, pub cso: u8, @@ -111,6 +159,16 @@ pub struct TxDescriptor { pub special: u16, } +#[repr(C, packed)] +struct RxDescriptor { + pub addr: u64, + pub length: u16, + pub checksum: u16, + pub status: u8, + pub errors: u8, + pub special: u16, +} + struct Eeprom<'a> { e1000: &'a E1000, } @@ -189,25 +247,25 @@ impl E1000 { } fn init_tx(&self) -> Result<(), Error> { - assert!(core::mem::size_of::() * TX_DESC_NUM < Size4KiB::SIZE as usize); + assert!(TX_DESC_SIZE < Size4KiB::SIZE as u32); let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().ok_or(Error::OutOfMemory)?; - let addr = frame.start_address().as_hhdm_virt(); + let phys = frame.start_address(); + let addr = phys.as_hhdm_virt(); + let descriptors = addr - .read_mut::<[TxDescriptor; TX_DESC_NUM]>() + .read_mut::<[TxDescriptor; TX_DESC_NUM as usize]>() .ok_or(Error::NotSupported)?; for desc in descriptors { desc.status = TStatus::DD; } - let phys = frame.start_address(); - self.write(Register::TxDesLo, phys.as_u64() as _); self.write(Register::TxDesHi, (phys.as_u64() >> 32) as _); - self.write(Register::TxDescLen, TX_DESC_SIZE as _); + self.write(Register::TxDescLen, TX_DESC_SIZE); self.write(Register::TxDescHead, 0); self.write(Register::TxDescTail, 0); @@ -225,6 +283,42 @@ impl E1000 { } fn init_rx(&self) -> Result<(), Error> { + assert!(TX_DESC_SIZE < Size4KiB::SIZE as u32); + + let frame: PhysFrame = + FRAME_ALLOCATOR.allocate_frame().ok_or(Error::OutOfMemory)?; + + let phys = frame.start_address(); + let addr = phys.as_hhdm_virt(); + + let descriptors = addr + .read_mut::<[RxDescriptor; RX_DESC_NUM as usize]>() + .ok_or(Error::NotSupported)?; + + for desc in descriptors { + let frame: PhysFrame = + FRAME_ALLOCATOR.allocate_frame().ok_or(Error::OutOfMemory)?; + + desc.addr = frame.start_address().as_u64(); + } + + self.write(Register::RxDescLo, phys.as_u64() as _); + self.write(Register::RxDescHi, (phys.as_u64() >> 32) as _); + self.write(Register::RxDescLen, RX_DESC_SIZE); + self.write(Register::RxDescHead, 0); + self.write(Register::RxDescTail, RX_DESC_NUM - 1); + + let flags = RCtl::EN + | RCtl::UPE + | RCtl::LPE + | RCtl::MPE + | RCtl::LBM_NONE + | RCtl::RDMTS_EIGHTH + | RCtl::BAM + | RCtl::SECRC + | RCtl::BSIZE_4096; + + self.write(Register::RCtrl, flags.bits()); Ok(()) } From 0704357ce1986c933662a3a005772f36523dc0b4 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 11 Feb 2023 15:50:05 +1100 Subject: [PATCH 114/368] e1000: setup interrupts Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/acpi/aml.rs | 1 + src/aero_kernel/src/drivers/e1000.rs | 64 +++++++++++++++++++++++++++- src/aero_kernel/src/drivers/lai.rs | 8 +++- src/aero_kernel/src/drivers/pci.rs | 13 ++++-- 4 files changed, 80 insertions(+), 6 deletions(-) diff --git a/src/aero_kernel/src/acpi/aml.rs b/src/aero_kernel/src/acpi/aml.rs index 280be84b4cc..60992e06d86 100644 --- a/src/aero_kernel/src/acpi/aml.rs +++ b/src/aero_kernel/src/acpi/aml.rs @@ -17,6 +17,7 @@ pub trait AmlSubsystem: Send + Sync { /// ## Parameters /// * `mode` - IRQ mode (ACPI spec section 5.8.1) fn enable_acpi(&self, mode: u32); + fn pci_route_pin(&self, seg: u16, bus: u8, slot: u8, function: u8, pin: u8) -> u8; } static AML_SUBSYSTEM: Once> = Once::new(); diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index bcb8c5669cf..3c485804960 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -19,6 +19,8 @@ use alloc::sync::Arc; +use crate::acpi::aml; +use crate::arch::interrupts::{self, InterruptStack}; use crate::drivers::pci::*; use crate::mem::paging::*; @@ -39,10 +41,15 @@ enum Error { #[derive(Copy, Clone)] #[repr(usize)] enum Register { - Control = 0x00, + Control = 0x0, + Status = 0x8, + Eeprom = 0x14, - RCtrl = 0x0100, + ICause = 0xc0, + IMask = 0xd0, + + RCtrl = 0x100, /// Lower bits of the 64 bit descriptor base address. RxDescLo = 0x2800, /// Upper 32 bits of the 64 bit descriptor base address. @@ -90,6 +97,18 @@ bitflags::bitflags! { } } +bitflags::bitflags! { + struct ECtl: u32 { + const LRST = (1 << 3); + const ASDE = (1 << 5); + const SLU = (1 << 6); // Set Link Up + const ILOS = (1 << 7); + const RST = (1 << 26); + const VME = (1 << 30); + const PHY_RST = (1 << 31); + } +} + bitflags::bitflags! { struct TCtl: u32 { const EN = 1 << 1; // Transmit Enable @@ -208,6 +227,11 @@ impl E1000 { _ => return Err(Error::UnknownBar), }; + log::debug!( + "{:?}", + header.capabilities().collect::>() + ); + let this = Self { base: registers_addr.as_hhdm_virt(), }; @@ -242,10 +266,42 @@ impl E1000 { this.init_tx()?; this.init_rx()?; + // XXX: The e1000 does not support MSIx and MSI. + let gsi = aml::get_subsystem().pci_route_pin( + 0, + header.bus(), + header.device(), + header.function(), + header.interrupt_pin(), + ); + + let vector = interrupts::allocate_vector(); + interrupts::register_handler(vector, irq_handler); + + crate::arch::apic::io_apic_setup_legacy_irq(gsi, vector, 0); + + // Enable interrupts! + this.write(Register::IMask, 0); + this.read(Register::ICause); + + this.link_up(); + + this.receive(); + log::trace!("e1000: successfully initialized"); Ok(()) } + fn receive(&self) {} + + fn link_up(&self) { + self.insert_flags(Register::Control, ECtl::SLU.bits()); + + while self.read(Register::Status) & 2 != 2 { + core::hint::spin_loop(); + } + } + fn init_tx(&self) -> Result<(), Error> { assert!(TX_DESC_SIZE < Size4KiB::SIZE as u32); @@ -395,6 +451,10 @@ impl PciDeviceHandle for Handler { } } +fn irq_handler(_stack: &mut InterruptStack) { + unreachable!() +} + fn init() { register_device_driver(Handler::new()) } diff --git a/src/aero_kernel/src/drivers/lai.rs b/src/aero_kernel/src/drivers/lai.rs index b6d55ab2ae0..4a9e98a897f 100644 --- a/src/aero_kernel/src/drivers/lai.rs +++ b/src/aero_kernel/src/drivers/lai.rs @@ -121,6 +121,12 @@ impl aml::AmlSubsystem for LaiSubsystem { fn enable_acpi(&self, mode: u32) { lai::enable_acpi(mode); } + + fn pci_route_pin(&self, seg: u16, bus: u8, slot: u8, function: u8, pin: u8) -> u8 { + lai::pci_route_pin(seg, bus, slot, function, pin) + .expect("lai: failed to route pin") + .base as u8 + } } pub fn init_lai() { @@ -134,4 +140,4 @@ pub fn init_lai() { aml::init(subsystem); } -crate::module_init!(init_lai, ModuleType::Other); +crate::module_init!(init_lai, ModuleType::Block); diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index 0015b9c442b..c920f5836f9 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -586,10 +586,13 @@ impl PciHeader { io::outl(PCI_CONFIG_ADDRESS_PORT, address); + let offset = (offset & 0b11) * 8; + let val = io::inl(PCI_CONFIG_DATA_PORT); + match core::mem::size_of::() { - 1 => io::inb(PCI_CONFIG_DATA_PORT) as u32, // u8 - 2 => io::inw(PCI_CONFIG_DATA_PORT) as u32, // u16 - 4 => io::inl(PCI_CONFIG_DATA_PORT), // u32 + 1 => (val >> offset) as u8 as u32, // u8 + 2 => (val >> offset) as u16 as u32, // u16 + 4 => val, // u32 width => unreachable!("unknown PCI read width: `{}`", width), } } @@ -730,6 +733,10 @@ impl PciHeader { } } + pub fn interrupt_pin(&self) -> u8 { + unsafe { self.read::(0x3d) as u8 } + } + // NOTE: The Base Address registers are optional registers used to map internal // (device-specific) registers into Memory or I/O Spaces. Refer to the PCI Local Bus // Specification for a detailed discussion of base address registers. From 5f67579c219627b437517f97aa96c6933d68faa9 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 12 Feb 2023 17:01:00 +1100 Subject: [PATCH 115/368] net: init Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/e1000.rs | 73 ++++++++++++++++++++++--- src/aero_kernel/src/main.rs | 4 ++ src/aero_kernel/src/net/arp.rs | 80 ++++++++++++++++++++++++++++ src/aero_kernel/src/net/dhcp.rs | 29 ++++++++++ src/aero_kernel/src/net/ethernet.rs | 60 +++++++++++++++++++++ src/aero_kernel/src/net/ip.rs | 30 +++++++++++ src/aero_kernel/src/net/mod.rs | 64 ++++++++++++++++++++++ 7 files changed, 334 insertions(+), 6 deletions(-) create mode 100644 src/aero_kernel/src/net/arp.rs create mode 100644 src/aero_kernel/src/net/dhcp.rs create mode 100644 src/aero_kernel/src/net/ethernet.rs create mode 100644 src/aero_kernel/src/net/ip.rs create mode 100644 src/aero_kernel/src/net/mod.rs diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index 3c485804960..f1f8ae86be5 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -23,6 +23,8 @@ use crate::acpi::aml; use crate::arch::interrupts::{self, InterruptStack}; use crate::drivers::pci::*; use crate::mem::paging::*; +use crate::net::{self, ethernet, MacAddr, NetworkDevice}; +use crate::utils::sync::BMutex; const TX_DESC_NUM: u32 = 32; const TX_DESC_SIZE: u32 = TX_DESC_NUM * core::mem::size_of::() as u32; @@ -212,10 +214,14 @@ impl<'a> Eeprom<'a> { struct E1000 { base: VirtAddr, + mac: MacAddr, + + tx_cur: usize, + tx_ring: VirtAddr, } impl E1000 { - fn new(header: &PciHeader) -> Result<(), Error> { + fn new(header: &PciHeader) -> Result { header.enable_bus_mastering(); header.enable_mmio(); @@ -232,8 +238,12 @@ impl E1000 { header.capabilities().collect::>() ); - let this = Self { + let mut this = Self { base: registers_addr.as_hhdm_virt(), + mac: MacAddr([0; 6]), + + tx_cur: 0, + tx_ring: VirtAddr::zero(), }; this.reset(); @@ -263,6 +273,8 @@ impl E1000 { mac[5] ); + this.mac = MacAddr(mac); + this.init_tx()?; this.init_rx()?; @@ -289,7 +301,27 @@ impl E1000 { this.receive(); log::trace!("e1000: successfully initialized"); - Ok(()) + Ok(this) + } + + fn send(&mut self, packet: ethernet::Packet) { + let cur = self.tx_cur; + let ring = self.tx_ring(); + let e: PhysFrame = FRAME_ALLOCATOR.allocate_frame().unwrap(); + + unsafe { + *(e.start_address().as_hhdm_virt().as_ptr::() as *mut ethernet::Packet) = packet; + } + + ring[cur].addr = e.start_address().as_u64(); + ring[cur].length = core::mem::size_of::() as u16; + ring[cur].cmd = 0b1011; + ring[cur].status = TStatus::empty(); + + drop(ring); + self.tx_cur = (self.tx_cur + 1) % TX_DESC_NUM as usize; + + self.write(Register::TxDescTail, self.tx_cur as u32); } fn receive(&self) {} @@ -302,7 +334,13 @@ impl E1000 { } } - fn init_tx(&self) -> Result<(), Error> { + fn tx_ring(&mut self) -> &mut [TxDescriptor] { + self.tx_ring + .read_mut::<[TxDescriptor; TX_DESC_NUM as usize]>() + .unwrap() + } + + fn init_tx(&mut self) -> Result<(), Error> { assert!(TX_DESC_SIZE < Size4KiB::SIZE as u32); let frame: PhysFrame = @@ -319,6 +357,8 @@ impl E1000 { desc.status = TStatus::DD; } + self.tx_ring = addr; + self.write(Register::TxDesLo, phys.as_u64() as _); self.write(Register::TxDesHi, (phys.as_u64() >> 32) as _); self.write(Register::TxDescLen, TX_DESC_SIZE); @@ -433,6 +473,24 @@ impl E1000 { } } +struct Device(BMutex); + +impl Device { + fn new(e1000: E1000) -> Self { + Self(BMutex::new(e1000)) + } +} + +impl NetworkDevice for Device { + fn send(&self, packet: ethernet::Packet) { + self.0.lock().send(packet) + } + + fn mac(&self) -> net::MacAddr { + self.0.lock().mac + } +} + struct Handler; impl Handler { @@ -447,12 +505,15 @@ impl PciDeviceHandle for Handler { } fn start(&self, header: &PciHeader, _offset_table: &mut OffsetPageTable) { - E1000::new(header).unwrap() + let e1000 = E1000::new(header).unwrap(); + let device = Arc::new(Device::new(e1000)); + + net::add_device(device); } } fn irq_handler(_stack: &mut InterruptStack) { - unreachable!() + log::debug!("a!") } fn init() { diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 76d5e5ce1ad..452b2e808f8 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -82,6 +82,7 @@ mod fs; mod logger; mod mem; mod modules; +mod net; mod rendy; mod socket; mod syscall; @@ -144,6 +145,9 @@ fn kernel_main_thread() { modules::init(); log::info!("loaded kernel modules"); + net::init(); + log::info!("initialized networking stack"); + #[cfg(target_arch = "x86_64")] arch::enable_acpi(); diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs new file mode 100644 index 00000000000..bce677fd85b --- /dev/null +++ b/src/aero_kernel/src/net/arp.rs @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2021-2023 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +// Address Resolution Protocol + +use alloc::collections::BTreeMap; +use spin::{Once, RwLock}; + +use super::ethernet::MacAddr; +use super::ip::Ipv4Addr; + +struct Entry { + mac: MacAddr, +} + +impl Entry { + fn new(mac: MacAddr) -> Self { + Self { mac } + } +} + +struct Cache(BTreeMap); + +impl Cache { + fn new() -> Self { + Self(BTreeMap::new()) + } + + fn insert(&mut self, ip: Ipv4Addr, mac: MacAddr) { + if let Some(_entry) = self.0.get_mut(&ip) { + todo!() + } else { + self.0.insert(ip, Entry::new(mac)); + } + } + + fn get(&self, ip: Ipv4Addr) -> Option { + if let Some(entry) = self.0.get(&ip) { + return Some(entry.mac); + } + + None + } +} + +static CACHE: Once> = Once::new(); + +pub fn get(ip: Ipv4Addr) -> Option { + CACHE + .get() + .as_ref() + .expect("arp: cache not initialized") + .read() + .get(ip) +} + +pub fn init() { + CACHE.call_once(|| { + let mut cache = Cache::new(); + cache.insert(Ipv4Addr::BROADCAST, MacAddr::BROADCAST); + + RwLock::new(cache) + }); +} diff --git a/src/aero_kernel/src/net/dhcp.rs b/src/aero_kernel/src/net/dhcp.rs new file mode 100644 index 00000000000..67fe517b3dd --- /dev/null +++ b/src/aero_kernel/src/net/dhcp.rs @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2021-2023 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +// Dynamic Host Configuration Protocol + +use super::{ethernet, ip::Ipv4Addr}; + +pub fn init() { + // Send DHCP discover message (UDP: source port=67; destination port=68). + let balls = ethernet::Packet::new(ethernet::Type::Ip); + + super::ethernet::send_packet(balls, Ipv4Addr::BROADCAST); +} diff --git a/src/aero_kernel/src/net/ethernet.rs b/src/aero_kernel/src/net/ethernet.rs new file mode 100644 index 00000000000..7da3c4d088b --- /dev/null +++ b/src/aero_kernel/src/net/ethernet.rs @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2021-2023 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +use super::arp; +use super::ip::Ipv4Addr; + +#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)] +#[repr(C)] +pub struct MacAddr(pub [u8; 6]); + +impl MacAddr { + pub const BROADCAST: Self = Self([0xff; 6]); +} + +#[repr(u16)] +pub enum Type { + Ip = 0x800, +} + +#[repr(C, packed)] +pub struct Packet { + pub dest_mac: MacAddr, + pub src_mac: MacAddr, + pub typ: Type, +} + +impl Packet { + /// Creates a new ethernet packet. + pub fn new(typ: Type) -> Self { + let src_mac = super::default_device().mac(); + Self { + src_mac, + dest_mac: MacAddr([0; 6]), + typ, + } + } +} + +pub fn send_packet(mut packet: Packet, ip: Ipv4Addr) { + if let Some(addr) = arp::get(ip) { + packet.dest_mac = addr; + super::default_device().send(packet); + } +} diff --git a/src/aero_kernel/src/net/ip.rs b/src/aero_kernel/src/net/ip.rs new file mode 100644 index 00000000000..06b32232801 --- /dev/null +++ b/src/aero_kernel/src/net/ip.rs @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2021-2023 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +/// Size of IPv4 adderess in octets. +/// +/// [RFC 8200 § 2]: https://www.rfc-editor.org/rfc/rfc791#section-3.2 +pub const ADDR_SIZE: usize = 4; + +#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)] +pub struct Ipv4Addr(pub [u8; ADDR_SIZE]); + +impl Ipv4Addr { + pub const BROADCAST: Self = Self([0xff; ADDR_SIZE]); +} diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs new file mode 100644 index 00000000000..d15f4918331 --- /dev/null +++ b/src/aero_kernel/src/net/mod.rs @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2021-2023 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +use alloc::{sync::Arc, vec::Vec}; +use spin::RwLock; + +pub mod arp; +pub mod dhcp; +pub mod ethernet; +pub mod ip; + +pub use ethernet::MacAddr; + +pub trait NetworkDevice: Send + Sync { + fn send(&self, packet: ethernet::Packet); + fn mac(&self) -> MacAddr; +} + +static DEVICES: RwLock>> = RwLock::new(Vec::new()); +static DEFAULT_DEVICE: RwLock>> = RwLock::new(None); + +pub fn add_device(device: Arc) { + DEVICES.write().push(device.clone()); + + let mut default_device = DEFAULT_DEVICE.write(); + if default_device.is_none() { + *default_device = Some(device); + } +} + +pub fn default_device() -> Arc { + DEFAULT_DEVICE + .read() + .as_ref() + .expect("net: no devices found") + .clone() +} + +// Initialize the networking stack. +pub fn init() { + if DEFAULT_DEVICE.read().is_none() { + // No network devices are avaliable. + return; + } + + arp::init(); + dhcp::init(); +} From 0dcccaacd351a637798f6e72cfd402b6165293a9 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 15 Feb 2023 18:22:50 +1100 Subject: [PATCH 116/368] net: init Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/block/nvme/mod.rs | 7 +- .../src/drivers/block/nvme/queue.rs | 2 +- src/aero_kernel/src/drivers/e1000.rs | 216 +++++++++++++--- src/aero_kernel/src/main.rs | 1 + src/aero_kernel/src/net/dhcp.rs | 192 ++++++++++++++- src/aero_kernel/src/net/ethernet.rs | 60 +++-- src/aero_kernel/src/net/ip.rs | 81 ++++++ src/aero_kernel/src/net/mod.rs | 130 +++++++++- src/aero_kernel/src/net/udp.rs | 77 ++++++ src/aero_kernel/src/socket/inet.rs | 28 +++ src/aero_kernel/src/socket/mod.rs | 12 +- .../src/{drivers/block/nvme => utils}/dma.rs | 7 +- src/aero_kernel/src/utils/mod.rs | 1 + userland/Cargo.lock | 232 +++--------------- 14 files changed, 776 insertions(+), 270 deletions(-) create mode 100644 src/aero_kernel/src/net/udp.rs create mode 100644 src/aero_kernel/src/socket/inet.rs rename src/aero_kernel/src/{drivers/block/nvme => utils}/dma.rs (95%) diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 56e43b7caaf..900a58efce5 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -18,13 +18,11 @@ */ mod command; -mod dma; mod queue; use core::mem::MaybeUninit; use command::*; -use dma::*; use queue::*; use alloc::sync::Arc; @@ -37,6 +35,7 @@ use crate::drivers::pci::*; use crate::fs::block::{install_block_device, BlockDevice, BlockDeviceInterface}; use crate::mem::paging::*; +use crate::utils::dma::*; use crate::utils::sync::BMutex; use crate::utils::{CeilDiv, VolatileCell}; @@ -339,7 +338,7 @@ impl<'a> Controller<'a> { registers.set_enable(true)?; - let identity = Dma::::new(); + let identity = Dma::::zeroed(); let mut identify_command = IdentifyCommand::default(); identify_command.opcode = AdminOpcode::Identify as u8; @@ -417,7 +416,7 @@ impl<'a> Controller<'a> { continue; } - let identity = Dma::::new(); + let identity = Dma::::zeroed(); let mut identify_command = IdentifyCommand::default(); identify_command.opcode = AdminOpcode::Identify as u8; diff --git a/src/aero_kernel/src/drivers/block/nvme/queue.rs b/src/aero_kernel/src/drivers/block/nvme/queue.rs index ab4fdf5777a..9e2b3e47976 100644 --- a/src/aero_kernel/src/drivers/block/nvme/queue.rs +++ b/src/aero_kernel/src/drivers/block/nvme/queue.rs @@ -2,9 +2,9 @@ use core::cell::UnsafeCell; use core::sync::atomic::{AtomicU16, Ordering}; use crate::mem::paging::PhysAddr; +use crate::utils::dma::Dma; use super::command::{Command, CompletionEntry}; -use super::dma::Dma; use super::*; const fn calculate_doorbell_offset(queue_id: u16, multiplier: usize, dstrd: usize) -> usize { diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index f1f8ae86be5..d63ad482058 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -18,13 +18,17 @@ */ use alloc::sync::Arc; +use spin::Once; use crate::acpi::aml; use crate::arch::interrupts::{self, InterruptStack}; use crate::drivers::pci::*; use crate::mem::paging::*; -use crate::net::{self, ethernet, MacAddr, NetworkDevice}; -use crate::utils::sync::BMutex; +use crate::userland::scheduler; +use crate::utils::sync::{BlockQueue, Mutex}; + +use crate::net::{self, ethernet}; +use crate::net::{MacAddr, NetworkDevice, PacketBaseTrait}; const TX_DESC_NUM: u32 = 32; const TX_DESC_SIZE: u32 = TX_DESC_NUM * core::mem::size_of::() as u32; @@ -49,6 +53,7 @@ enum Register { Eeprom = 0x14, ICause = 0xc0, + IRate = 0xc4, IMask = 0xd0, RCtrl = 0x100, @@ -91,6 +96,7 @@ bitflags::bitflags! { } bitflags::bitflags! { + #[derive(Default)] struct TStatus: u8 { const DD = 1 << 0; // Descriptor Done const EC = 1 << 1; // Excess Collisions @@ -101,13 +107,13 @@ bitflags::bitflags! { bitflags::bitflags! { struct ECtl: u32 { - const LRST = (1 << 3); - const ASDE = (1 << 5); - const SLU = (1 << 6); // Set Link Up - const ILOS = (1 << 7); - const RST = (1 << 26); - const VME = (1 << 30); - const PHY_RST = (1 << 31); + const LRST = 1 << 3; + const ASDE = 1 << 5; + const SLU = 1 << 6; // Set Link Up + const ILOS = 1 << 7; + const RST = 1 << 26; + const VME = 1 << 30; + const PHY_RST = 1 << 31; } } @@ -169,6 +175,26 @@ bitflags::bitflags! { } } +bitflags::bitflags! { + pub struct InterruptFlags: u32 { + const TXDW = 1 << 0; // Transmit Descriptor Written Back + const TXQE = 1 << 1; // Transmit Queue Empty + const LSC = 1 << 2; // Link Status Change + const RXDMT0 = 1 << 4; // Receive Descriptor Minimum Threshold + const DSW = 1 << 5; // Disable SW Write Access + const RXO = 1 << 6; // Receiver Overrun + const RXT0 = 1 << 7; // Receiver Timer Interrupt + const MDAC = 1 << 9; // MDIO Access Complete + const PHYINT = 1 << 12; // PHY Interrupt + const LSECPN = 1 << 14; // MACsec Packet Number + const TXD_LOW = 1 << 15; // Transmit Descriptor Low Threshold hit + const SRPD = 1 << 16; // Small Receive Packet Detected + const ACK = 1 << 17; // Receive ACK Frame Detected + const ECCER = 1 << 22; // ECC Error + } +} + +#[derive(Default)] #[repr(C, packed)] struct TxDescriptor { pub addr: u64, @@ -180,6 +206,7 @@ struct TxDescriptor { pub special: u16, } +#[derive(Default)] #[repr(C, packed)] struct RxDescriptor { pub addr: u64, @@ -218,6 +245,9 @@ struct E1000 { tx_cur: usize, tx_ring: VirtAddr, + + rx_cur: usize, + rx_ring: VirtAddr, } impl E1000 { @@ -233,17 +263,15 @@ impl E1000 { _ => return Err(Error::UnknownBar), }; - log::debug!( - "{:?}", - header.capabilities().collect::>() - ); - let mut this = Self { base: registers_addr.as_hhdm_virt(), mac: MacAddr([0; 6]), tx_cur: 0, tx_ring: VirtAddr::zero(), + + rx_cur: 0, + rx_ring: VirtAddr::zero(), }; this.reset(); @@ -292,29 +320,63 @@ impl E1000 { crate::arch::apic::io_apic_setup_legacy_irq(gsi, vector, 0); + // Clear statistical counters. + for i in 0..128 { + unsafe { + this.write_raw(0x5200 + i * 4, 0); + } + } + // Enable interrupts! - this.write(Register::IMask, 0); + this.write( + Register::IMask, + (InterruptFlags::TXDW + | InterruptFlags::TXQE + | InterruptFlags::LSC + | InterruptFlags::RXDMT0 + | InterruptFlags::DSW + | InterruptFlags::RXO + | InterruptFlags::RXT0 + | InterruptFlags::MDAC + | InterruptFlags::PHYINT + | InterruptFlags::LSECPN + | InterruptFlags::TXD_LOW + | InterruptFlags::SRPD + | InterruptFlags::ACK + | InterruptFlags::ECCER) + .bits(), + ); this.read(Register::ICause); this.link_up(); - this.receive(); - log::trace!("e1000: successfully initialized"); Ok(this) } - fn send(&mut self, packet: ethernet::Packet) { - let cur = self.tx_cur; - let ring = self.tx_ring(); - let e: PhysFrame = FRAME_ALLOCATOR.allocate_frame().unwrap(); + fn handle_irq(&mut self) { + let cause = self.read(Register::ICause); + log::debug!("cause: {cause}"); + if cause & 0x80 != 0x80 { + return; + } - unsafe { - *(e.start_address().as_hhdm_virt().as_ptr::() as *mut ethernet::Packet) = packet; + let idx = self.rx_cur; + let descriptor = &self.rx_ring()[idx]; + log::debug!("{}", descriptor.status); + + if descriptor.status & 0x1 == 0x1 { + // we got some packies right here mate. lets notify the boyz + DEVICE.get().unwrap().wq.notify_complete(); } + } - ring[cur].addr = e.start_address().as_u64(); - ring[cur].length = core::mem::size_of::() as u16; + fn send(&mut self, packet: net::Packet) { + let cur = self.tx_cur; + let ring = self.tx_ring(); + + ring[cur].addr = unsafe { packet.addr() - crate::PHYSICAL_MEMORY_OFFSET }; + ring[cur].length = packet.len() as _; ring[cur].cmd = 0b1011; ring[cur].status = TStatus::empty(); @@ -324,7 +386,36 @@ impl E1000 { self.write(Register::TxDescTail, self.tx_cur as u32); } - fn receive(&self) {} + fn recv(&mut self) -> Option { + let id = self.rx_cur; + let desc = &mut self.rx_ring()[id]; + + if desc.status & 0x1 != 0x1 { + return None; + } + + Some(net::RecvPacket { + packet: net::Packet::::new( + PhysAddr::new(desc.addr).as_hhdm_virt(), + desc.length as usize, + ), + id, + }) + } + + fn recv_end(&mut self, id: usize) { + let desc = &mut self.rx_ring()[id]; + + if desc.status & 0x1 != 0x1 { + unreachable!() + } + + desc.status = 0; + + let old = self.rx_cur; + self.rx_cur = (self.rx_cur + 1) % RX_DESC_NUM as usize; + self.write(Register::RxDescTail, old as u32); + } fn link_up(&self) { self.insert_flags(Register::Control, ECtl::SLU.bits()); @@ -334,6 +425,12 @@ impl E1000 { } } + fn rx_ring(&mut self) -> &mut [RxDescriptor] { + self.rx_ring + .read_mut::<[RxDescriptor; RX_DESC_NUM as usize]>() + .unwrap() + } + fn tx_ring(&mut self) -> &mut [TxDescriptor] { self.tx_ring .read_mut::<[TxDescriptor; TX_DESC_NUM as usize]>() @@ -354,6 +451,7 @@ impl E1000 { .ok_or(Error::NotSupported)?; for desc in descriptors { + *desc = TxDescriptor::default(); desc.status = TStatus::DD; } @@ -365,7 +463,7 @@ impl E1000 { self.write(Register::TxDescHead, 0); self.write(Register::TxDescTail, 0); - let mut flags = TCtl::EN | TCtl::PSP | TCtl::RTLC; + let mut flags = TCtl { bits: 1 << 28 } | TCtl::EN | TCtl::PSP | TCtl::RTLC; flags.set_collision_distance(64); flags.set_collision_threshold(15); @@ -373,12 +471,12 @@ impl E1000 { // TODO: Set the default values for the Tx Inter Packet // Gap Timer. - // self.write(Register::Tipg, 0x??????) + // self.write(Register::Tipg, 0x???????); Ok(()) } - fn init_rx(&self) -> Result<(), Error> { + fn init_rx(&mut self) -> Result<(), Error> { assert!(TX_DESC_SIZE < Size4KiB::SIZE as u32); let frame: PhysFrame = @@ -395,9 +493,12 @@ impl E1000 { let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().ok_or(Error::OutOfMemory)?; + *desc = RxDescriptor::default(); desc.addr = frame.start_address().as_u64(); } + self.rx_ring = addr; + self.write(Register::RxDescLo, phys.as_u64() as _); self.write(Register::RxDescHi, (phys.as_u64() >> 32) as _); self.write(Register::RxDescLen, RX_DESC_SIZE); @@ -457,37 +558,71 @@ impl E1000 { } fn write(&self, register: Register, value: u32) { - unsafe { - let register = self.base.as_mut_ptr::().add(register as usize); - core::ptr::write_volatile(register as *mut u32, value); - } + unsafe { self.write_raw(register as u32, value) } } fn read(&self, register: Register) -> u32 { unsafe { self.read_raw(register as u32) } } + unsafe fn write_raw(&self, register: u32, value: u32) { + unsafe { + let register = self.base.as_mut_ptr::().add(register as usize); + core::ptr::write_volatile(register as *mut u32, value); + } + } + unsafe fn read_raw(&self, register: u32) -> u32 { let register = self.base.as_ptr::().add(register as usize); core::ptr::read_volatile(register as *const u32) } } -struct Device(BMutex); +struct Device { + e1000: Mutex, + wq: BlockQueue, +} impl Device { fn new(e1000: E1000) -> Self { - Self(BMutex::new(e1000)) + Self { + e1000: Mutex::new(e1000), + wq: BlockQueue::new(), + } + } + + fn handle_irq(&self) { + self.e1000.lock().handle_irq() } } impl NetworkDevice for Device { - fn send(&self, packet: ethernet::Packet) { - self.0.lock().send(packet) + fn send(&self, packet: net::Packet) { + self.e1000.lock_irq().send(packet) + } + + fn recv(&self) -> net::RecvPacket { + let task = scheduler::get_scheduler().current_task(); + self.wq.insert(task.clone()); + + loop { + let mut e1000 = self.e1000.lock_irq(); + if let Some(data) = e1000.recv() { + self.wq.remove(task.clone()); + return data; + } else { + // drop(e1000); + // scheduler::get_scheduler().inner.await_io().unwrap(); + } + } + } + + fn recv_end(&self, packet_id: usize) { + self.e1000.lock_irq().recv_end(packet_id) } fn mac(&self) -> net::MacAddr { - self.0.lock().mac + self.e1000.lock_irq().mac } } @@ -508,12 +643,15 @@ impl PciDeviceHandle for Handler { let e1000 = E1000::new(header).unwrap(); let device = Arc::new(Device::new(e1000)); + DEVICE.call_once(|| device.clone()); net::add_device(device); } } +static DEVICE: Once> = Once::new(); + fn irq_handler(_stack: &mut InterruptStack) { - log::debug!("a!") + DEVICE.get().map(|e| e.handle_irq()); } fn init() { diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 452b2e808f8..f22f166fb4c 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -42,6 +42,7 @@ allocator_api, nonnull_slice_from_raw_parts, maybe_uninit_write_slice, + slice_ptr_get, maybe_uninit_as_bytes )] #![deny(trivial_numeric_casts, unused_allocation)] diff --git a/src/aero_kernel/src/net/dhcp.rs b/src/aero_kernel/src/net/dhcp.rs index 67fe517b3dd..c728e468b70 100644 --- a/src/aero_kernel/src/net/dhcp.rs +++ b/src/aero_kernel/src/net/dhcp.rs @@ -19,11 +19,195 @@ // Dynamic Host Configuration Protocol -use super::{ethernet, ip::Ipv4Addr}; +use byteorder::{ByteOrder, NetworkEndian}; +use simple_endian::BigEndian; + +use super::ip::Ipv4Addr; +use super::udp::{self, Udp}; +use super::{ConstPacketKind, Packet, PacketDownHierarchy, PacketHeader, PacketUpHierarchy}; + +const DHCP_XID: u32 = 0x43424140; + +#[repr(u8)] +enum DhcpType { + BootRequest = 1u8.swap_bytes(), + BootReply = 2u8.swap_bytes(), +} + +#[repr(u8)] +enum HType { + Ethernet = 1u8.swap_bytes(), +} + +#[repr(C, packed)] +struct Header { + op: DhcpType, + htype: HType, + hlen: BigEndian, + hops: BigEndian, + xid: BigEndian, + seconds: BigEndian, + flags: BigEndian, + client_ip: Ipv4Addr, + your_ip: Ipv4Addr, + server_ip: Ipv4Addr, + gateway_ip: Ipv4Addr, + client_hw_addr: [u8; 16], + server_name: [u8; 64], + file: [u8; 128], + options: [u8; 64], +} + +impl Header { + fn options_mut(&mut self) -> OptionsWriter<'_> { + OptionsWriter::new(&mut self.options) + } +} + +pub struct Dhcp; + +impl ConstPacketKind for Dhcp { + const HSIZE: usize = core::mem::size_of::
(); +} + +impl PacketUpHierarchy for Packet {} +impl PacketHeader
for Packet { + fn send(&self) { + self.downgrade().send() // send the UDP packet + } +} + +#[repr(u8)] +enum MessageType { + Discover = 1u8.swap_bytes(), +} + +#[repr(u8)] +enum DhcpOption { + HostName = 12, + MessageType = 53, + ParameterRequestList = 55, + ClientIdentifier = 61, + End = 255, +} + +struct OptionsWriter<'a>(&'a mut [u8]); + +impl<'a> OptionsWriter<'a> { + fn new(options: &'a mut [u8]) -> Self { + options.fill(0); + Self(options).set_magic_cookie() + } + + fn insert(&mut self, kind: DhcpOption, data: &'_ [u8]) { + let total_len = 2 + data.len(); + + assert!(data.len() < u8::MAX as _); + assert!(self.0.len() > total_len); + + let (buf, rest) = core::mem::take(&mut self.0).split_at_mut(total_len); + self.0 = rest; + + buf[0] = kind as u8; + buf[1] = data.len() as _; + buf[2..].copy_from_slice(data); + } + + fn insert_padding(&mut self, size: usize) { + let (buf, rest) = core::mem::take(&mut self.0).split_at_mut(size); + self.0 = rest; + + buf.fill(0); + } + + fn set_magic_cookie(mut self) -> Self { + let (buf, rest) = core::mem::take(&mut self.0).split_at_mut(core::mem::size_of::()); + + // The first four octets of the 'options' field of the DHCP message + // contain the (decimal) values 99, 130, 83 and 99, respectively. + // + // CC: (https://www.rfc-editor.org/rfc/rfc2131#section-3) + NetworkEndian::write_u32(buf, 0x63825363); + self.0 = rest; + self + } + + fn set_message_type(mut self, typ: MessageType) -> Self { + self.insert(DhcpOption::MessageType, &[typ as u8]); + self + } + + fn set_parameter_request_list(mut self) -> Self { + // TODO: Take all of the request flags as an argument. + self.insert( + DhcpOption::ParameterRequestList, + &[ + 1, // Subnet Mask + 3, // Router + 15, // Domain Name + 6, // Domain Server + ], + ); + self + } + + fn set_client_identifier(mut self) -> Self { + let mac = super::default_device().mac(); + + let mut data = [0; 7]; + data[0] = HType::Ethernet as u8; + data[1..].copy_from_slice(mac.0.as_slice()); + + self.insert(DhcpOption::ClientIdentifier, data.as_slice()); + self + } + + fn set_host_name(mut self, name: &str) -> Self { + self.insert(DhcpOption::HostName, name.as_bytes()); + self.insert_padding(1); // null-terminator + self + } +} + +impl<'a> Drop for OptionsWriter<'a> { + fn drop(&mut self) { + self.insert(DhcpOption::End, &[]); + } +} pub fn init() { - // Send DHCP discover message (UDP: source port=67; destination port=68). - let balls = ethernet::Packet::new(ethernet::Type::Ip); + // Send DHCP discover message. + let mut packet = Packet::::create(68, 67, Dhcp::HSIZE, Ipv4Addr::BROADCAST).upgrade(); + let header = packet.header_mut(); + + header.htype = HType::Ethernet; + header.hlen = BigEndian::::from(6); + header.hops = BigEndian::::from(0); + header.xid = BigEndian::::from(DHCP_XID); + header.seconds = BigEndian::::from(0); + { + // Set the HW address. + let mac = super::default_device().mac(); + header.client_hw_addr[0..6].copy_from_slice(mac.0.as_slice()); + header.client_hw_addr[6..].fill(0); + } + header.server_name.fill(0); + header.file.fill(0); + header.options.fill(0); + + header.op = DhcpType::BootRequest; + header.flags = BigEndian::from(0x8000); // broadcast + header.client_ip = Ipv4Addr::EMPTY; + header.your_ip = Ipv4Addr::EMPTY; + header.server_ip = Ipv4Addr::EMPTY; + header.gateway_ip = Ipv4Addr::EMPTY; + + let _ = header + .options_mut() + .set_message_type(MessageType::Discover) + .set_host_name("Aero") + .set_client_identifier() + .set_parameter_request_list(); - super::ethernet::send_packet(balls, Ipv4Addr::BROADCAST); + packet.send() } diff --git a/src/aero_kernel/src/net/ethernet.rs b/src/aero_kernel/src/net/ethernet.rs index 7da3c4d088b..fbaf49bf163 100644 --- a/src/aero_kernel/src/net/ethernet.rs +++ b/src/aero_kernel/src/net/ethernet.rs @@ -17,8 +17,12 @@ * along with Aero. If not, see . */ -use super::arp; -use super::ip::Ipv4Addr; +use core::alloc::{Allocator, Layout}; + +use crate::mem::paging::{PageSize, Size4KiB}; +use crate::utils::dma::DmaAllocator; + +use super::*; #[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)] #[repr(C)] @@ -30,31 +34,55 @@ impl MacAddr { #[repr(u16)] pub enum Type { - Ip = 0x800, + Ip = 0x800u16.swap_bytes(), } #[repr(C, packed)] -pub struct Packet { +pub struct Header { pub dest_mac: MacAddr, pub src_mac: MacAddr, pub typ: Type, } -impl Packet { - /// Creates a new ethernet packet. - pub fn new(typ: Type) -> Self { +#[derive(Debug, Clone)] +pub struct Eth; + +impl ConstPacketKind for Eth { + const HSIZE: usize = core::mem::size_of::
(); +} + +impl Packet { + pub fn create(typ: Type, mut size: usize) -> Packet { + size += Eth::HSIZE; + let src_mac = super::default_device().mac(); - Self { - src_mac, - dest_mac: MacAddr([0; 6]), - typ, - } + + // Allocate the packet (needs to be 4KiB aligned). + let layout = unsafe { Layout::from_size_align_unchecked(size, Size4KiB::SIZE as usize) }; + let ptr = DmaAllocator.allocate_zeroed(layout).expect("net: OOM!"); + let addr = VirtAddr::new(ptr.as_mut_ptr() as u64); + + let mut packet = Packet::::new(addr, size); + let header = packet.header_mut(); + + header.src_mac = src_mac; + header.typ = typ; + + packet } } -pub fn send_packet(mut packet: Packet, ip: Ipv4Addr) { - if let Some(addr) = arp::get(ip) { - packet.dest_mac = addr; - super::default_device().send(packet); +impl PacketHeader
for Packet { + fn send(&self) { + let ip = self.upgrade().header().dest_ip; + + if let Some(addr) = arp::get(ip) { + let mut packet = self.clone(); + { + let header = packet.header_mut(); + header.dest_mac = addr; + } + super::default_device().send(packet); + } } } diff --git a/src/aero_kernel/src/net/ip.rs b/src/aero_kernel/src/net/ip.rs index 06b32232801..838221b0aca 100644 --- a/src/aero_kernel/src/net/ip.rs +++ b/src/aero_kernel/src/net/ip.rs @@ -17,6 +17,10 @@ * along with Aero. If not, see . */ +use simple_endian::BigEndian; + +use super::*; + /// Size of IPv4 adderess in octets. /// /// [RFC 8200 § 2]: https://www.rfc-editor.org/rfc/rfc791#section-3.2 @@ -27,4 +31,81 @@ pub struct Ipv4Addr(pub [u8; ADDR_SIZE]); impl Ipv4Addr { pub const BROADCAST: Self = Self([0xff; ADDR_SIZE]); + pub const EMPTY: Self = Self([0x00; ADDR_SIZE]); +} + +#[derive(Debug, Copy, Clone)] +#[repr(u8)] +pub enum Type { + Udp = 17u8.swap_bytes(), +} + +#[repr(C, packed)] +pub struct Header { + pub v: BigEndian, + pub tos: BigEndian, + pub length: BigEndian, + pub ident: BigEndian, + pub frag_offset: BigEndian, + pub ttl: BigEndian, + pub protocol: Type, + pub hcrc: BigEndian, + pub src_ip: Ipv4Addr, + pub dest_ip: Ipv4Addr, +} + +impl Header { + /// Set the payload length. + fn set_length(&mut self, length: u16) { + self.length = BigEndian::from(length); + } +} + +#[derive(Clone)] +pub struct Ipv4; + +impl ConstPacketKind for Ipv4 { + const HSIZE: usize = core::mem::size_of::
(); +} + +impl Packet { + pub fn create(protocol: Type, dest: Ipv4Addr, mut size: usize) -> Packet { + size += Ipv4::HSIZE; + + let mut packet = Packet::::create(ethernet::Type::Ip, size).upgrade(); + let header = packet.header_mut(); + + header.v = BigEndian::::from(0x45); + header.tos = BigEndian::::from(0); + header.ident = BigEndian::::from(0); + header.frag_offset = BigEndian::::from(0); + header.ttl = BigEndian::::from(64); + header.hcrc = BigEndian::::from(0); + + header.set_length(size as _); + + header.protocol = protocol; + header.dest_ip = dest; + + // FIXME: Set the source IPv4 address. + header.src_ip = Ipv4Addr([0; 4]); + + // TODO: Header checksum + packet + } +} + +impl PacketUpHierarchy for Packet {} +impl PacketHeader
for Packet { + fn send(&self) { + { + let mut this = self.clone(); + let header = this.header_mut(); + { + header.hcrc = BigEndian::from(0); + // FIXME: + } + } + self.downgrade().send() // send the ethernet packet + } } diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index d15f4918331..41558718de4 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -17,6 +17,8 @@ * along with Aero. If not, see . */ +use core::marker::PhantomData; + use alloc::{sync::Arc, vec::Vec}; use spin::RwLock; @@ -24,17 +26,132 @@ pub mod arp; pub mod dhcp; pub mod ethernet; pub mod ip; +pub mod udp; + +pub use ethernet::{Eth, MacAddr}; -pub use ethernet::MacAddr; +use crate::{ + mem::paging::VirtAddr, + userland::{scheduler, task::Task}, +}; +#[downcastable] pub trait NetworkDevice: Send + Sync { - fn send(&self, packet: ethernet::Packet); + fn send(&self, packet: Packet); + fn recv(&self) -> RecvPacket; + fn recv_end(&self, packet_id: usize); fn mac(&self) -> MacAddr; } +#[derive(Debug)] +pub struct RecvPacket { + pub packet: Packet, + pub id: usize, +} + +impl Drop for RecvPacket { + fn drop(&mut self) { + default_device().recv_end(self.id) + } +} + +pub trait PacketKind {} + +pub trait ConstPacketKind: PacketKind { + const HSIZE: usize; +} + +impl PacketKind for T {} + +impl PacketDownHierarchy for Packet +where + U: PacketKind, + D: ConstPacketKind, + Packet: PacketUpHierarchy, +{ +} + +pub trait PacketBaseTrait { + fn addr(&self) -> VirtAddr; + fn len(&self) -> usize; +} + +pub trait PacketTrait: PacketBaseTrait { + fn header_size(&self) -> usize; +} + +impl PacketTrait for Packet { + fn header_size(&self) -> usize { + T::HSIZE + } +} + +#[derive(Debug, Copy, Clone)] +pub struct Packet { + pub addr: VirtAddr, + pub len: usize, + _phantom: PhantomData, +} + +impl PacketBaseTrait for Packet { + fn addr(&self) -> VirtAddr { + self.addr + } + + fn len(&self) -> usize { + self.len + } +} + +impl Packet { + pub fn new(addr: VirtAddr, len: usize) -> Packet { + Packet:: { + addr, + len, + _phantom: PhantomData::default(), + } + } +} + +pub trait PacketUpHierarchy: PacketTrait { + fn upgrade(&self) -> Packet { + let header_size = self.header_size(); + Packet::::new(self.addr() + header_size, self.len() - header_size) + } +} + +pub trait PacketDownHierarchy: PacketBaseTrait { + fn downgrade(&self) -> Packet { + let header_size = B::HSIZE; + Packet::::new(self.addr() - header_size, self.len() + header_size) + } +} + +pub trait PacketHeader: PacketBaseTrait { + fn send(&self); + + fn header(&self) -> &H { + self.addr().read_mut::().unwrap() + } + + fn header_mut(&mut self) -> &mut H { + self.addr().read_mut::().unwrap() + } +} + static DEVICES: RwLock>> = RwLock::new(Vec::new()); static DEFAULT_DEVICE: RwLock>> = RwLock::new(None); +fn packet_processor_thread() { + let device = default_device(); + + loop { + log::debug!("bruh!"); + let packet = device.recv(); + log::debug!("{packet:?}"); + } +} + pub fn add_device(device: Arc) { DEVICES.write().push(device.clone()); @@ -42,6 +159,12 @@ pub fn add_device(device: Arc) { if default_device.is_none() { *default_device = Some(device); } + + scheduler::get_scheduler().register_task(Task::new_kernel(packet_processor_thread, true)); +} + +pub fn has_default_device() -> bool { + DEFAULT_DEVICE.read().as_ref().is_some() } pub fn default_device() -> Arc { @@ -54,11 +177,12 @@ pub fn default_device() -> Arc { // Initialize the networking stack. pub fn init() { - if DEFAULT_DEVICE.read().is_none() { + if !has_default_device() { // No network devices are avaliable. return; } arp::init(); + log::info!("net::arp: initialized cache"); dhcp::init(); } diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs new file mode 100644 index 00000000000..51733d2cc78 --- /dev/null +++ b/src/aero_kernel/src/net/udp.rs @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2021-2023 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +use simple_endian::BigEndian; + +use super::ip::{Ipv4, Ipv4Addr}; +use super::{ip, PacketDownHierarchy}; + +use super::{ConstPacketKind, Packet, PacketHeader, PacketUpHierarchy}; + +#[derive(Copy, Clone)] +pub struct Udp; + +impl ConstPacketKind for Udp { + const HSIZE: usize = core::mem::size_of::
(); +} + +impl Packet { + pub fn create(src_port: u16, dest_port: u16, mut size: usize, target: Ipv4Addr) -> Packet { + size += Udp::HSIZE; + + let ip_packet = Packet::::create(ip::Type::Udp, target, size); + let mut packet = ip_packet.upgrade(); + + let header = packet.header_mut(); + + header.src_port = BigEndian::from(src_port); + header.dst_port = BigEndian::from(dest_port); + header.len = BigEndian::from(size as u16); + + packet + } +} + +impl PacketUpHierarchy for Packet {} +impl PacketHeader
for Packet { + fn send(&self) { + { + let mut this = self.clone(); + let header = this.header_mut(); + header.compute_checksum(self.downgrade().header()); + } + + self.downgrade().send() // send the IP packet + } +} + +#[repr(C, packed)] +pub struct Header { + pub src_port: BigEndian, + pub dst_port: BigEndian, + pub len: BigEndian, + pub crc: BigEndian, +} + +impl Header { + fn compute_checksum(&mut self, _header: &ip::Header) { + self.crc = BigEndian::from(0); + // FIXME: + } +} diff --git a/src/aero_kernel/src/socket/inet.rs b/src/aero_kernel/src/socket/inet.rs new file mode 100644 index 00000000000..863f29e2843 --- /dev/null +++ b/src/aero_kernel/src/socket/inet.rs @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2021-2023 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +use alloc::sync::Arc; + +pub struct InetSocket {} + +impl InetSocket { + pub fn new() -> Arc { + Arc::new(Self {}) + } +} diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index 8c347b9ab92..fda07b7c1b5 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -17,6 +17,9 @@ * along with Aero. If not, see . */ +pub mod inet; +pub mod unix; + use aero_syscall::*; use crate::mem::paging::VirtAddr; @@ -45,6 +48,11 @@ impl<'a> SocketAddr<'a> { _ => None, } } -} -pub mod unix; + pub fn as_inet(&self) -> Option<&'a SocketAddrInet> { + match self { + SocketAddr::INet(addr) => Some(addr), + _ => None, + } + } +} diff --git a/src/aero_kernel/src/drivers/block/nvme/dma.rs b/src/aero_kernel/src/utils/dma.rs similarity index 95% rename from src/aero_kernel/src/drivers/block/nvme/dma.rs rename to src/aero_kernel/src/utils/dma.rs index 9e60149243d..9a5f63e3370 100644 --- a/src/aero_kernel/src/drivers/block/nvme/dma.rs +++ b/src/aero_kernel/src/utils/dma.rs @@ -63,6 +63,11 @@ pub type DmaBuffer = Box; pub struct Dma(DmaBuffer); impl Dma { + /// Creates a new DMA buffer intialized with `value`. + pub fn new(value: T) -> Self { + Dma(DmaBuffer::new_in(value, DmaAllocator)) + } + /// Creates a new DMA (Direct Memory Access) buffer and is initialized /// with zeros. /// @@ -70,7 +75,7 @@ impl Dma { /// ```rust,no_run /// let dma: Command = Dma::new(); /// ``` - pub fn new() -> Self { + pub fn zeroed() -> Self { let mut buffer = DmaBuffer::new_uninit_in(DmaAllocator); // SAFETY: Box returns a non-null and aligned pointer. diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index 46ba8405b42..ec5ed2f7051 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -32,6 +32,7 @@ fn get_cpu_count() -> usize { pub mod bitmap; pub mod buffer; +pub mod dma; pub mod sync; pub fn validate_mut_ptr(ptr: *mut T) -> Option<&'static mut T> { diff --git a/userland/Cargo.lock b/userland/Cargo.lock index 1f3fe579f22..276703d9a8c 100644 --- a/userland/Cargo.lock +++ b/userland/Cargo.lock @@ -10,7 +10,7 @@ dependencies = [ "lazy_static", "postcard", "serde", - "spin 0.9.4", + "spin 0.9.5", ] [[package]] @@ -40,20 +40,11 @@ dependencies = [ "version_check", ] -[[package]] -name = "aho-corasick" -version = "0.7.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" -dependencies = [ - "memchr", -] - [[package]] name = "atomic-polyfill" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c041a8d9751a520ee19656232a18971f18946a7900f1520ee4400002244dd89" +checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28" dependencies = [ "critical-section", ] @@ -64,33 +55,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "bare-metal" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" -dependencies = [ - "rustc_version 0.2.3", -] - -[[package]] -name = "bare-metal" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603" - -[[package]] -name = "bit_field" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4" - -[[package]] -name = "bitfield" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" - [[package]] name = "bitflags" version = "1.3.2" @@ -109,39 +73,11 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cortex-m" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70858629a458fdfd39f9675c4dc309411f2a3f83bede76988d81bf1a0ecee9e0" -dependencies = [ - "bare-metal 0.2.5", - "bitfield", - "embedded-hal", - "volatile-register", -] - [[package]] name = "critical-section" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95da181745b56d4bd339530ec393508910c909c784e8962d15d722bacf0bcbcd" -dependencies = [ - "bare-metal 1.0.0", - "cfg-if", - "cortex-m", - "riscv", -] - -[[package]] -name = "embedded-hal" -version = "0.2.7" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" -dependencies = [ - "nb 0.1.3", - "void", -] +checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52" [[package]] name = "getrandom" @@ -150,7 +86,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", - "libc 0.2.137", + "libc 0.2.139", "wasi", ] @@ -180,9 +116,9 @@ checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" dependencies = [ "atomic-polyfill", "hash32", - "rustc_version 0.4.0", + "rustc_version", "serde", - "spin 0.9.4", + "spin 0.9.5", "stable_deref_trait", ] @@ -206,13 +142,13 @@ dependencies = [ [[package]] name = "libc" version = "0.2.125" -source = "git+https://github.com/andy-Python-Programmer/libc#213e47d8f5d87b87539e57dc7d9c24c77d9ba609" +source = "git+https://github.com/andy-Python-Programmer/libc#403b85dfae3708de1328a8c4b246c437194b8e6d" [[package]] name = "libc" -version = "0.2.137" +version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" [[package]] name = "lock_api" @@ -224,32 +160,11 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "nb" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" -dependencies = [ - "nb 1.0.0", -] - -[[package]] -name = "nb" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "546c37ac5d9e56f55e73b677106873d9d9f5190605e41a856503623648488cae" - [[package]] name = "once_cell" -version = "1.16.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "postcard" @@ -270,76 +185,29 @@ checksum = "7c68cb38ed13fd7bc9dd5db8f165b7c8d9c1a315104083a2b10f11354c2af97f" [[package]] name = "proc-macro2" -version = "1.0.47" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" dependencies = [ "proc-macro2", ] -[[package]] -name = "regex" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" - -[[package]] -name = "riscv" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6907ccdd7a31012b70faf2af85cd9e5ba97657cc3987c4f13f8e4d2c2a088aba" -dependencies = [ - "bare-metal 1.0.0", - "bit_field", - "riscv-target", -] - -[[package]] -name = "riscv-target" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88aa938cda42a0cf62a20cfe8d139ff1af20c2e681212b5b34adb5a58333f222" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.14", + "semver", ] [[package]] @@ -350,39 +218,24 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" - -[[package]] -name = "semver-parser" -version = "0.7.0" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" [[package]] name = "serde" -version = "1.0.147" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ "proc-macro2", "quote", @@ -397,9 +250,9 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "spin" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +checksum = "7dccf47db1b41fa1573ed27ccf5e08e3ca771cb994f776668c5ebda893b248fc" dependencies = [ "lock_api", ] @@ -412,9 +265,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "syn" -version = "1.0.103" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ "proc-macro2", "quote", @@ -428,14 +281,14 @@ dependencies = [ "aero_ipc", "aero_syscall", "hashbrown", - "spin 0.9.4", + "spin 0.9.5", ] [[package]] name = "unicode-ident" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" [[package]] name = "utest" @@ -454,33 +307,12 @@ dependencies = [ "syn", ] -[[package]] -name = "vcell" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" - [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "volatile-register" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee8f19f9d74293faf70901bc20ad067dc1ad390d2cbf1e3f75f721ffee908b6" -dependencies = [ - "vcell", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -494,7 +326,7 @@ dependencies = [ "aero_ipc", "aero_syscall", "hashbrown", - "spin 0.9.4", + "spin 0.9.5", ] [[package]] From 484d7b0752538826eeb51a1854f617a894a0a1bf Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 17 Feb 2023 18:16:07 +1100 Subject: [PATCH 117/368] bootstrap::llvm: update to 14.0.1 Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 4 +- patches/llvm/llvm.patch | 159 ++++++++++++++++++++-------------------- 2 files changed, 82 insertions(+), 81 deletions(-) diff --git a/bootstrap.yml b/bootstrap.yml index af3335f1c7e..cfa6e692fb0 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -75,8 +75,8 @@ sources: - name: llvm subdir: 'bundled' git: 'https://github.com/llvm/llvm-project.git' - tag: 'llvmorg-13.0.0' - version: '13.0.0' + tag: 'llvmorg-14.0.1' + version: '14.0.1' # --------------------------------------------------------------------------- # Rust patched crates start diff --git a/patches/llvm/llvm.patch b/patches/llvm/llvm.patch index fdf2018b488..17987cb2a11 100644 --- a/patches/llvm/llvm.patch +++ b/patches/llvm/llvm.patch @@ -1,34 +1,34 @@ -From e8b0511dc10a7bf17b34021e58f7ca71bef59fc5 Mon Sep 17 00:00:00 2001 -From: czapek1337 -Date: Sat, 8 Jan 2022 05:22:31 +0100 -Subject: [PATCH] targets: add new aero target +From 20cff6e42171169bd1b78d7ccffec0ab608e1eaa Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Thu, 16 Feb 2023 17:54:52 +1100 +Subject: [PATCH] targets: add aero +Signed-off-by: Andy-Python-Programmer --- - clang/lib/Basic/Targets.cpp | 6 + - clang/lib/Basic/Targets/OSTargets.h | 28 ++ - clang/lib/Driver/CMakeLists.txt | 1 + - clang/lib/Driver/Driver.cpp | 4 + - clang/lib/Driver/ToolChains/Aero.cpp | 438 ++++++++++++++++++ - clang/lib/Driver/ToolChains/Aero.h | 49 ++ - clang/lib/Driver/ToolChains/Gnu.cpp | 13 +- - llvm/cmake/modules/CrossCompile.cmake | 4 +- - llvm/include/llvm/ADT/Triple.h | 5 +- - llvm/include/llvm/Support/SwapByteOrder.h | 2 +- - llvm/lib/Support/Triple.cpp | 6 + - llvm/lib/Support/Unix/Path.inc | 6 +- - llvm/lib/Support/Unix/Program.inc | 1 + - llvm/tools/llvm-dwarfdump/Statistics.cpp | 1 + - llvm/tools/llvm-shlib/CMakeLists.txt | 1 + - llvm/utils/benchmark/src/benchmark_register.h | 1 + - 16 files changed, 556 insertions(+), 10 deletions(-) + clang/lib/Basic/Targets.cpp | 6 + + clang/lib/Basic/Targets/OSTargets.h | 28 ++ + clang/lib/Driver/CMakeLists.txt | 1 + + clang/lib/Driver/Driver.cpp | 4 + + clang/lib/Driver/ToolChains/Aero.cpp | 438 ++++++++++++++++++++++ + clang/lib/Driver/ToolChains/Aero.h | 49 +++ + clang/lib/Driver/ToolChains/Gnu.cpp | 13 +- + llvm/cmake/modules/CrossCompile.cmake | 4 +- + llvm/include/llvm/ADT/Triple.h | 5 +- + llvm/include/llvm/Support/SwapByteOrder.h | 2 +- + llvm/lib/Support/Triple.cpp | 6 + + llvm/lib/Support/Unix/Path.inc | 6 +- + llvm/lib/Support/Unix/Program.inc | 1 + + llvm/tools/llvm-dwarfdump/Statistics.cpp | 2 + + llvm/tools/llvm-shlib/CMakeLists.txt | 1 + + 15 files changed, 556 insertions(+), 10 deletions(-) create mode 100644 clang/lib/Driver/ToolChains/Aero.cpp create mode 100644 clang/lib/Driver/ToolChains/Aero.h diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp -index c063f8ca4..d8b6878f1 100644 +index 994a491cdd..098b0d5fb7 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp -@@ -144,6 +144,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, +@@ -149,6 +149,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, return new NetBSDTargetInfo(Triple, Opts); case llvm::Triple::OpenBSD: return new OpenBSDTargetInfo(Triple, Opts); @@ -37,7 +37,7 @@ index c063f8ca4..d8b6878f1 100644 case llvm::Triple::Win32: switch (Triple.getEnvironment()) { case llvm::Triple::GNU: -@@ -387,6 +389,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, +@@ -420,6 +422,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, return new FuchsiaTargetInfo(Triple, Opts); case llvm::Triple::Linux: return new LinuxTargetInfo(Triple, Opts); @@ -46,7 +46,7 @@ index c063f8ca4..d8b6878f1 100644 default: return new RISCV64TargetInfo(Triple, Opts); } -@@ -553,6 +557,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, +@@ -586,6 +590,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, } case llvm::Triple::Haiku: return new HaikuTargetInfo(Triple, Opts); @@ -56,13 +56,13 @@ index c063f8ca4..d8b6878f1 100644 return new NaClTargetInfo(Triple, Opts); case llvm::Triple::PS4: diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h -index 70fac030b..93fc21c3d 100644 +index 3c1830d5f8..2123019378 100644 --- a/clang/lib/Basic/Targets/OSTargets.h +++ b/clang/lib/Basic/Targets/OSTargets.h -@@ -342,6 +342,34 @@ public: +@@ -338,6 +338,34 @@ public: : OSTargetInfo(Triple, Opts) {} }; - + +// Aero Target +template +class LLVM_LIBRARY_VISIBILITY AeroTargetInfo : public OSTargetInfo { @@ -95,10 +95,10 @@ index 70fac030b..93fc21c3d 100644 template class LLVM_LIBRARY_VISIBILITY MinixTargetInfo : public OSTargetInfo { diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt -index 6f25d3588..a59e549ef 100644 +index 78e8fd1852..8a53a0a7ab 100644 --- a/clang/lib/Driver/CMakeLists.txt +++ b/clang/lib/Driver/CMakeLists.txt -@@ -54,6 +54,7 @@ add_clang_library(clangDriver +@@ -59,6 +59,7 @@ add_clang_library(clangDriver ToolChains/Hexagon.cpp ToolChains/Hurd.cpp ToolChains/Linux.cpp @@ -107,10 +107,10 @@ index 6f25d3588..a59e549ef 100644 ToolChains/MinGW.cpp ToolChains/Minix.cpp diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp -index fb8335a36..05adcae7d 100644 +index 3bfddeefc7..9773e5efd1 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp -@@ -29,6 +29,7 @@ +@@ -30,6 +30,7 @@ #include "ToolChains/Hurd.h" #include "ToolChains/Lanai.h" #include "ToolChains/Linux.h" @@ -118,7 +118,7 @@ index fb8335a36..05adcae7d 100644 #include "ToolChains/MSP430.h" #include "ToolChains/MSVC.h" #include "ToolChains/MinGW.h" -@@ -4853,6 +4854,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, +@@ -5564,6 +5565,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, case llvm::Triple::Fuchsia: TC = std::make_unique(*this, Target, Args); break; @@ -130,7 +130,7 @@ index fb8335a36..05adcae7d 100644 break; diff --git a/clang/lib/Driver/ToolChains/Aero.cpp b/clang/lib/Driver/ToolChains/Aero.cpp new file mode 100644 -index 000000000..4cd7765ae +index 0000000000..4cd7765aeb --- /dev/null +++ b/clang/lib/Driver/ToolChains/Aero.cpp @@ -0,0 +1,438 @@ @@ -574,7 +574,7 @@ index 000000000..4cd7765ae + diff --git a/clang/lib/Driver/ToolChains/Aero.h b/clang/lib/Driver/ToolChains/Aero.h new file mode 100644 -index 000000000..e9016f4a8 +index 0000000000..e9016f4a81 --- /dev/null +++ b/clang/lib/Driver/ToolChains/Aero.h @@ -0,0 +1,49 @@ @@ -628,7 +628,7 @@ index 000000000..e9016f4a8 + +#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MANAGARM_H diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp -index da39f29e4..b6f6bb439 100644 +index 7a9570a686..8114baabb0 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -246,6 +246,8 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) { @@ -640,40 +640,40 @@ index da39f29e4..b6f6bb439 100644 return "aarch64linux"; case llvm::Triple::aarch64_be: return "aarch64linuxb"; -@@ -2077,7 +2079,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( +@@ -2073,7 +2075,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( static const char *const AArch64LibDirs[] = {"/lib64", "/lib"}; static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", -- "aarch64-suse-linux", "aarch64-linux-android"}; -+ "aarch64-suse-linux", "aarch64-linux-android", -+ "aarch64-aero", "aarch64-aero-system", "aarch64-aero-kernel"}; +- "aarch64-suse-linux"}; ++ "aarch64-suse-linux", "aarch64-aero", "aarch64-aero-system", ++ "aarch64-aero-kernel"}; static const char *const AArch64beLibDirs[] = {"/lib"}; static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu", "aarch64_be-linux-gnu"}; -@@ -2105,7 +2108,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( +@@ -2099,7 +2102,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( "x86_64-redhat-linux", "x86_64-suse-linux", "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux", "x86_64-unknown-linux", -- "x86_64-amazon-linux", "x86_64-linux-android"}; -+ "x86_64-amazon-linux", "x86_64-linux-android", -+ "x86_64-aero", "x86_64-aero-system", "x86_64-aero-kernel"}; +- "x86_64-amazon-linux"}; ++ "x86_64-amazon-linux", "x86_64-aero", "x86_64-aero-system", ++ "x86_64-aero-kernel"}; static const char *const X32Triples[] = {"x86_64-linux-gnux32", "x86_64-pc-linux-gnux32"}; static const char *const X32LibDirs[] = {"/libx32", "/lib"}; -@@ -2183,7 +2187,10 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( +@@ -2171,7 +2175,10 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( + static const char *const RISCV64LibDirs[] = {"/lib64", "/lib"}; + static const char *const RISCV64Triples[] = {"riscv64-unknown-linux-gnu", "riscv64-linux-gnu", - "riscv64-unknown-elf", - "riscv64-redhat-linux", -- "riscv64-suse-linux"}; -+ "riscv64-suse-linux", +- "riscv64-unknown-elf"}; ++ "riscv64-unknown-elf", + "riscv64-aero", + "riscv64-aero-kernel", + "riscv64-aero-system"}; - + static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"}; static const char *const SPARCv8Triples[] = {"sparc-linux-gnu", diff --git a/llvm/cmake/modules/CrossCompile.cmake b/llvm/cmake/modules/CrossCompile.cmake -index 8a6e880c4..fb86a7c17 100644 +index 2a39b6a40a..ceceb2aab9 100644 --- a/llvm/cmake/modules/CrossCompile.cmake +++ b/llvm/cmake/modules/CrossCompile.cmake @@ -17,8 +17,8 @@ function(llvm_create_cross_target project_name target_name toolchain buildtype) @@ -688,10 +688,10 @@ index 8a6e880c4..fb86a7c17 100644 endif() set(CROSS_TOOLCHAIN_FLAGS_${target_name} ${CROSS_TOOLCHAIN_FLAGS_INIT} diff --git a/llvm/include/llvm/ADT/Triple.h b/llvm/include/llvm/ADT/Triple.h -index 76a754d67..5899b5449 100644 +index 42277c0130..35516ec5af 100644 --- a/llvm/include/llvm/ADT/Triple.h +++ b/llvm/include/llvm/ADT/Triple.h -@@ -168,6 +168,7 @@ public: +@@ -181,6 +181,7 @@ public: Linux, Lv2, // PS3 MacOSX, @@ -699,7 +699,7 @@ index 76a754d67..5899b5449 100644 NetBSD, OpenBSD, Solaris, -@@ -217,7 +218,9 @@ public: +@@ -232,7 +233,9 @@ public: CoreCLR, Simulator, // Simulator variants of other systems, e.g., Apple's iOS MacABI, // Mac Catalyst variant of Apple's iOS deployment target. @@ -711,12 +711,12 @@ index 76a754d67..5899b5449 100644 enum ObjectFormatType { UnknownObjectFormat, diff --git a/llvm/include/llvm/Support/SwapByteOrder.h b/llvm/include/llvm/Support/SwapByteOrder.h -index e8612ba66..7c4e941bd 100644 +index e8612ba665..7c4e941bd2 100644 --- a/llvm/include/llvm/Support/SwapByteOrder.h +++ b/llvm/include/llvm/Support/SwapByteOrder.h @@ -22,7 +22,7 @@ #endif - + #if defined(__linux__) || defined(__GNU__) || defined(__HAIKU__) || \ - defined(__Fuchsia__) || defined(__EMSCRIPTEN__) + defined(__Fuchsia__) || defined(__EMSCRIPTEN__) || defined(__aero__) @@ -724,18 +724,18 @@ index e8612ba66..7c4e941bd 100644 #elif defined(_AIX) #include diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp -index 883115463..e27e27ecc 100644 +index a9afcc9db9..ccb0ca0601 100644 --- a/llvm/lib/Support/Triple.cpp +++ b/llvm/lib/Support/Triple.cpp -@@ -189,6 +189,7 @@ StringRef Triple::getOSTypeName(OSType Kind) { +@@ -195,6 +195,7 @@ StringRef Triple::getOSTypeName(OSType Kind) { case UnknownOS: return "unknown"; - + case AIX: return "aix"; + case Aero: return "aero"; case AMDHSA: return "amdhsa"; case AMDPAL: return "amdpal"; case Ananas: return "ananas"; -@@ -245,6 +246,7 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { +@@ -251,6 +252,7 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { case GNUX32: return "gnux32"; case GNUILP32: return "gnu_ilp32"; case Itanium: return "itanium"; @@ -743,23 +743,23 @@ index 883115463..e27e27ecc 100644 case MSVC: return "msvc"; case MacABI: return "macabi"; case Musl: return "musl"; -@@ -252,6 +254,7 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { +@@ -258,6 +260,7 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { case MuslEABIHF: return "musleabihf"; case MuslX32: return "muslx32"; case Simulator: return "simulator"; + case System: return "system"; } - + llvm_unreachable("Invalid EnvironmentType!"); -@@ -502,6 +505,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) { - +@@ -512,6 +515,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) { + static Triple::OSType parseOS(StringRef OSName) { return StringSwitch(OSName) + .StartsWith("aero", Triple::Aero) .StartsWith("ananas", Triple::Ananas) .StartsWith("cloudabi", Triple::CloudABI) .StartsWith("darwin", Triple::Darwin) -@@ -560,9 +564,11 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { +@@ -570,9 +574,11 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { .StartsWith("musl", Triple::Musl) .StartsWith("msvc", Triple::MSVC) .StartsWith("itanium", Triple::Itanium) @@ -772,11 +772,11 @@ index 883115463..e27e27ecc 100644 .Default(Triple::UnknownEnvironment); } diff --git a/llvm/lib/Support/Unix/Path.inc b/llvm/lib/Support/Unix/Path.inc -index 2a03dc682..e75ff461d 100644 +index 788460d657..85d46701e2 100644 --- a/llvm/lib/Support/Unix/Path.inc +++ b/llvm/lib/Support/Unix/Path.inc -@@ -64,7 +64,7 @@ extern char **environ; - +@@ -74,7 +74,7 @@ extern char **environ; + #include #if !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(__FreeBSD__) && \ - !defined(__linux__) && !defined(__FreeBSD_kernel__) && !defined(_AIX) @@ -784,7 +784,7 @@ index 2a03dc682..e75ff461d 100644 #include #define STATVFS statvfs #define FSTATVFS fstatvfs -@@ -73,7 +73,7 @@ extern char **environ; +@@ -83,7 +83,7 @@ extern char **environ; #if defined(__OpenBSD__) || defined(__FreeBSD__) #include #include @@ -793,9 +793,9 @@ index 2a03dc682..e75ff461d 100644 #if defined(HAVE_LINUX_MAGIC_H) #include #else -@@ -431,7 +431,7 @@ std::error_code remove(const Twine &path, bool IgnoreNonExisting) { +@@ -478,7 +478,7 @@ std::error_code remove(const Twine &path, bool IgnoreNonExisting) { } - + static bool is_local_impl(struct STATVFS &Vfs) { -#if defined(__linux__) || defined(__GNU__) +#if defined(__linux__) || defined(__GNU__) || defined(__aero__) @@ -803,32 +803,32 @@ index 2a03dc682..e75ff461d 100644 #define NFS_SUPER_MAGIC 0x6969 #endif diff --git a/llvm/lib/Support/Unix/Program.inc b/llvm/lib/Support/Unix/Program.inc -index 520685a0e..e6c2ddf20 100644 +index 089342030b..0616096541 100644 --- a/llvm/lib/Support/Unix/Program.inc +++ b/llvm/lib/Support/Unix/Program.inc -@@ -39,6 +39,7 @@ +@@ -41,6 +41,7 @@ #if HAVE_UNISTD_H #include #endif +#undef HAVE_POSIX_SPAWN #ifdef HAVE_POSIX_SPAWN #include - + diff --git a/llvm/tools/llvm-dwarfdump/Statistics.cpp b/llvm/tools/llvm-dwarfdump/Statistics.cpp -index 19a971afa..929184bfc 100644 +index 5c08e43b4b..a19c74e82c 100644 --- a/llvm/tools/llvm-dwarfdump/Statistics.cpp +++ b/llvm/tools/llvm-dwarfdump/Statistics.cpp @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// - + +#include + #include "llvm-dwarfdump.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/StringSet.h" diff --git a/llvm/tools/llvm-shlib/CMakeLists.txt b/llvm/tools/llvm-shlib/CMakeLists.txt -index 3eb6db33a..554264a07 100644 +index 8e2b78f1b8..e1bd74eaf7 100644 --- a/llvm/tools/llvm-shlib/CMakeLists.txt +++ b/llvm/tools/llvm-shlib/CMakeLists.txt @@ -36,6 +36,7 @@ if(LLVM_BUILD_LLVM_DYLIB) @@ -839,5 +839,6 @@ index 3eb6db33a..554264a07 100644 OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "DragonFly") --- -2.34.1 +-- +2.39.1 + From 46e65c2a4d1bbcca1aeadfcea4c1c36fdbf9f1f2 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 17 Feb 2023 18:23:21 +1100 Subject: [PATCH 118/368] e1000::recv: await on packet Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/e1000.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index d63ad482058..2e6728f5852 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -611,8 +611,8 @@ impl NetworkDevice for Device { self.wq.remove(task.clone()); return data; } else { - // drop(e1000); - // scheduler::get_scheduler().inner.await_io().unwrap(); + drop(e1000); + scheduler::get_scheduler().inner.await_io().unwrap(); } } } From 964f17187bd23d927a12d957d9e07c3436439b1a Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 17 Feb 2023 18:26:25 +1100 Subject: [PATCH 119/368] kernel: update Cargo.toml Signed-off-by: Andy-Python-Programmer --- src/Cargo.lock | 15 ++++++++++++++- src/aero_kernel/Cargo.toml | 4 +++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index ccd9906b8d0..cfc02ca1d81 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -11,6 +11,7 @@ dependencies = [ "bit_field", "bitflags", "bytemuck", + "byteorder", "cfg-if", "cpio_reader", "hashbrown", @@ -24,6 +25,7 @@ dependencies = [ "raw-cpuid", "rustc-demangle", "serde_json", + "simple_endian", "spin 0.9.4", "static_assertions", "uapi", @@ -89,6 +91,12 @@ version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f" +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + [[package]] name = "cc" version = "1.0.77" @@ -205,7 +213,7 @@ checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" [[package]] name = "lai" version = "0.1.0" -source = "git+https://github.com/aero-os/lai-rs#dd82efe66790fc59413f084fa48e17ec9f8312b8" +source = "git+https://github.com/aero-os/lai-rs#a6b2554cfd6e6fd12d8301b4cb8ad8aa0178cb4d" dependencies = [ "cc", "log", @@ -400,6 +408,11 @@ dependencies = [ "serde", ] +[[package]] +name = "simple_endian" +version = "0.2.1" +source = "git+https://github.com/michalfita/simple-endian-rs?branch=bugfix/4/fix-no_std-support-right-way#7210f40881d16f7f2e3d8d40f6381fa222843caa" + [[package]] name = "spin" version = "0.5.2" diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index d6d74c6f6e5..95ae7f17241 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -41,7 +41,9 @@ cpio_reader = { git = "https://github.com/Andy-Python-Programmer/cpio_reader" } static_assertions = "1.1.0" lru = "0.8.0" bytemuck = "1.12.1" - +# the crate is not mainted but who cares it works (tm)! +simple_endian = { git = "https://github.com/michalfita/simple-endian-rs", branch = "bugfix/4/fix-no_std-support-right-way", default_features = false, features = ["bitwise", "comparisons", "format", "math_ops", "neg_ops", "shift_ops", "both_endian", "float_impls", "integer_impls", "byte_impls"] } +byteorder = { version = "*", default-features=false} limine = { git = "https://github.com/limine-bootloader/limine-rs" } cfg-if = "1.0" From 23905a18664a846e703c35fcd34635462e0fe566 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 17 Feb 2023 18:27:03 +1100 Subject: [PATCH 120/368] bootstrap::rust-libc: update to 0.2.139 Signed-off-by: Andy-Python-Programmer --- patches/rust-libc/rust-libc.patch | 208 ++++++++++++++++++++++++++++-- tools/cargo-inject-patches.py | 2 +- 2 files changed, 198 insertions(+), 12 deletions(-) diff --git a/patches/rust-libc/rust-libc.patch b/patches/rust-libc/rust-libc.patch index f3fbd231daa..2eead4473fb 100644 --- a/patches/rust-libc/rust-libc.patch +++ b/patches/rust-libc/rust-libc.patch @@ -1,14 +1,191 @@ -From c6ec5b50fc2d7bc6b984b5c6910d944664da8e08 Mon Sep 17 00:00:00 2001 +From 06433417feda99e2f407026d95349e3dbde054d1 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sat, 17 Dec 2022 15:50:08 +1100 +Date: Fri, 17 Feb 2023 18:18:23 +1100 Subject: [PATCH] --- - src/unix/mlibc/mod.rs | 453 ++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 417 insertions(+), 36 deletions(-) + .../linux_like/linux/gnu/b64/x86_64/mod.rs | 4 +- + src/unix/linux_like/linux/gnu/mod.rs | 4 +- + src/unix/linux_like/linux/mod.rs | 28 +- + src/unix/mlibc/mod.rs | 457 ++++++++++++++++-- + 4 files changed, 439 insertions(+), 54 deletions(-) +diff --git a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs +index e6307e2..cae81c4 100644 +--- a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs ++++ b/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs +@@ -330,7 +330,7 @@ cfg_if! { + impl Eq for user_fpregs_struct {} + + impl ::fmt::Debug for user_fpregs_struct { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("user_fpregs_struct") + .field("cwd", &self.cwd) + .field("ftw", &self.ftw) +@@ -375,7 +375,7 @@ cfg_if! { + impl Eq for ucontext_t {} + + impl ::fmt::Debug for ucontext_t { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_flags) + .field("uc_link", &self.uc_link) +diff --git a/src/unix/linux_like/linux/gnu/mod.rs b/src/unix/linux_like/linux/gnu/mod.rs +index b8b6ded..98b49a0 100644 +--- a/src/unix/linux_like/linux/gnu/mod.rs ++++ b/src/unix/linux_like/linux/gnu/mod.rs +@@ -519,7 +519,7 @@ cfg_if! { + impl Eq for utmpx {} + + impl ::fmt::Debug for utmpx { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("utmpx") + .field("ut_type", &self.ut_type) + .field("ut_pid", &self.ut_pid) +@@ -568,7 +568,7 @@ cfg_if! { + + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_ptrace_syscall_info_data { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + unsafe { + f.debug_struct("__c_anonymous_ptrace_syscall_info_data") + .field("entry", &self.entry) +diff --git a/src/unix/linux_like/linux/mod.rs b/src/unix/linux_like/linux/mod.rs +index be12190..c8762d5 100644 +--- a/src/unix/linux_like/linux/mod.rs ++++ b/src/unix/linux_like/linux/mod.rs +@@ -840,7 +840,7 @@ cfg_if! { + } + impl Eq for sockaddr_nl {} + impl ::fmt::Debug for sockaddr_nl { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("sockaddr_nl") + .field("nl_family", &self.nl_family) + .field("nl_pid", &self.nl_pid) +@@ -873,7 +873,7 @@ cfg_if! { + impl Eq for dirent {} + + impl ::fmt::Debug for dirent { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) +@@ -911,7 +911,7 @@ cfg_if! { + impl Eq for dirent64 {} + + impl ::fmt::Debug for dirent64 { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("dirent64") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) +@@ -941,7 +941,7 @@ cfg_if! { + impl Eq for pthread_cond_t {} + + impl ::fmt::Debug for pthread_cond_t { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("pthread_cond_t") + // FIXME: .field("size", &self.size) + .finish() +@@ -963,7 +963,7 @@ cfg_if! { + impl Eq for pthread_mutex_t {} + + impl ::fmt::Debug for pthread_mutex_t { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("pthread_mutex_t") + // FIXME: .field("size", &self.size) + .finish() +@@ -985,7 +985,7 @@ cfg_if! { + impl Eq for pthread_rwlock_t {} + + impl ::fmt::Debug for pthread_rwlock_t { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("pthread_rwlock_t") + // FIXME: .field("size", &self.size) + .finish() +@@ -1007,7 +1007,7 @@ cfg_if! { + impl Eq for pthread_barrier_t {} + + impl ::fmt::Debug for pthread_barrier_t { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("pthread_barrier_t") + .field("size", &self.size) + .finish() +@@ -1041,7 +1041,7 @@ cfg_if! { + impl Eq for sockaddr_alg {} + + impl ::fmt::Debug for sockaddr_alg { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("sockaddr_alg") + .field("salg_family", &self.salg_family) + .field("salg_type", &self.salg_type) +@@ -1072,7 +1072,7 @@ cfg_if! { + impl Eq for uinput_setup {} + + impl ::fmt::Debug for uinput_setup { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("uinput_setup") + .field("id", &self.id) + .field("name", &&self.name[..]) +@@ -1103,7 +1103,7 @@ cfg_if! { + impl Eq for uinput_user_dev {} + + impl ::fmt::Debug for uinput_user_dev { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("uinput_setup") + .field("name", &&self.name[..]) + .field("id", &self.id) +@@ -1152,7 +1152,7 @@ cfg_if! { + + #[allow(deprecated)] + impl ::fmt::Debug for af_alg_iv { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("af_alg_iv") + .field("ivlen", &self.ivlen) + .finish() +@@ -1176,7 +1176,7 @@ cfg_if! { + } + impl Eq for mq_attr {} + impl ::fmt::Debug for mq_attr { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("mq_attr") + .field("mq_flags", &self.mq_flags) + .field("mq_maxmsg", &self.mq_maxmsg) +@@ -1195,7 +1195,7 @@ cfg_if! { + } + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_ifr_ifru { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("ifr_ifru") + .field("ifru_addr", unsafe { &self.ifru_addr }) + .field("ifru_dstaddr", unsafe { &self.ifru_dstaddr }) +@@ -1214,7 +1214,7 @@ cfg_if! { + } + } + impl ::fmt::Debug for ifreq { +- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { + f.debug_struct("ifreq") + .field("ifr_name", &self.ifr_name) + .field("ifr_ifru", &self.ifr_ifru) diff --git a/src/unix/mlibc/mod.rs b/src/unix/mlibc/mod.rs -index 2046530..93fcc61 100644 +index 2046530..abae13c 100644 --- a/src/unix/mlibc/mod.rs +++ b/src/unix/mlibc/mod.rs @@ -47,7 +47,6 @@ pub type fsfilcnt_t = ::c_uint; @@ -557,7 +734,16 @@ index 2046530..93fcc61 100644 pub const F_GETOWN: ::c_int = 10; pub const F_SETOWN: ::c_int = 11; pub const O_ACCMODE: ::c_int = 7; -@@ -649,18 +961,42 @@ pub const WCOREFLAG: ::c_int = 0x80; +@@ -644,23 +956,51 @@ pub const S_IXGRP: mode_t = 0o10; + pub const S_IXOTH: mode_t = 0o1; + pub const S_IXUSR: mode_t = 0o100; + ++// Used by utimensat() and friends ++pub const UTIME_NOW: c_long = (1 << 30) - 1; ++pub const UTIME_OMIT: c_long = (1 << 30) - 2; ++ + // options/posix/include/sys/wait.h + pub const WCOREFLAG: ::c_int = 0x80; pub const WNOHANG: ::c_int = 2; // options/linux/include/sys/poll.h @@ -601,7 +787,7 @@ index 2046530..93fcc61 100644 // options/posix/include/pthread.h align_const! { -@@ -668,9 +1004,12 @@ align_const! { +@@ -668,9 +1008,12 @@ align_const! { __mlibc_state: 0, __mlibc_recursion: 0, __mlibc_flags: 0, @@ -614,7 +800,7 @@ index 2046530..93fcc61 100644 }; pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { __mlibc_m: 0, -@@ -689,11 +1028,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; +@@ -689,11 +1032,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; extern "C" { @@ -655,7 +841,7 @@ index 2046530..93fcc61 100644 pub fn getgrgid_r( gid: ::gid_t, grp: *mut ::group, -@@ -728,13 +1096,24 @@ extern "C" { +@@ -728,13 +1100,24 @@ extern "C" { buflen: ::size_t, result: *mut *mut passwd, ) -> ::c_int; @@ -684,7 +870,7 @@ index 2046530..93fcc61 100644 pub fn pthread_create( thread: *mut ::pthread_t, attr: *const ::pthread_attr_t, -@@ -752,6 +1131,8 @@ extern "C" { +@@ -752,6 +1135,8 @@ extern "C" { addr: *mut ::sockaddr, addrlen: *mut ::socklen_t, ) -> ::ssize_t; @@ -694,5 +880,5 @@ index 2046530..93fcc61 100644 pub fn setpwent(); pub fn writev(fd: ::c_int, iov: *const ::iovec, count: ::c_int) -> ::ssize_t; -- -2.38.1 +2.39.1 diff --git a/tools/cargo-inject-patches.py b/tools/cargo-inject-patches.py index 2122efdc5ef..6d2d6fe48b3 100644 --- a/tools/cargo-inject-patches.py +++ b/tools/cargo-inject-patches.py @@ -9,7 +9,7 @@ patched_libs = { "backtrace": "0.3.64", "calloop": "0.9.3", - "libc": "0.2.93", + "libc": "0.2.139", "libloading": "0.7.3", "mio": ["0.6.23", "0.8.3"], "nix": "0.22.3", From bb61d194ec388c3811909c10db21384d3b3f3470 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 17 Feb 2023 18:29:16 +1100 Subject: [PATCH 121/368] bootstrap::rust: update to latest nightly Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 3 +- patches/rust/rust.patch | 338 +++++++++++++++++++++++----------------- 2 files changed, 198 insertions(+), 143 deletions(-) diff --git a/bootstrap.yml b/bootstrap.yml index cfa6e692fb0..784640315fb 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -70,7 +70,7 @@ sources: subdir: 'bundled' git: 'https://github.com/rust-lang/rust.git' branch: 'master' - commit: '22e491ac7ed454d34669151a8b6464cb643c9b41' + commit: '0416b1a6f6d5c42696494e1a3a33580fd3f669d8' - name: llvm subdir: 'bundled' @@ -304,6 +304,7 @@ tools: changelog-seen = 2 [llvm] + download-ci-llvm = false targets = "X86" [build] diff --git a/patches/rust/rust.patch b/patches/rust/rust.patch index 2928a43e403..e8d5de44a4d 100644 --- a/patches/rust/rust.patch +++ b/patches/rust/rust.patch @@ -1,32 +1,33 @@ -From 13f0d6bc6ed1ccf0155e27be832ec121cf138b85 Mon Sep 17 00:00:00 2001 +From be8fa0845294e187d6f41004a6967c8ce299fbbe Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Wed, 12 Jan 2022 15:57:15 +1100 -Subject: [PATCH] targets: add aero target and port std to it +Date: Fri, 17 Feb 2023 18:28:24 +1100 +Subject: [PATCH] update to latest nightly Signed-off-by: Andy-Python-Programmer --- Cargo.lock | 4 +- Cargo.toml | 1 + - .../rustc_target/src/spec/aero_system_base.rs | 35 +++++ + .../rustc_target/src/spec/aero_system_base.rs | 34 +++++ compiler/rustc_target/src/spec/mod.rs | 3 + .../src/spec/x86_64_unknown_aero_system.rs | 19 +++ + library/std/Cargo.toml | 2 +- library/std/build.rs | 1 + - library/std/src/os/aero/fs.rs | 148 ++++++++++++++++++ + library/std/src/os/aero/fs.rs | 144 ++++++++++++++++++ library/std/src/os/aero/mod.rs | 6 + library/std/src/os/aero/raw.rs | 66 ++++++++ library/std/src/os/mod.rs | 2 + library/std/src/os/unix/mod.rs | 2 + library/std/src/sys/unix/args.rs | 3 +- library/std/src/sys/unix/env.rs | 11 ++ - library/std/src/sys/unix/fs.rs | 6 +- - library/std/src/sys/unix/os.rs | 39 ++++- + library/std/src/sys/unix/fs.rs | 5 +- + library/std/src/sys/unix/os.rs | 34 ++++- library/std/src/sys/unix/thread.rs | 7 + - library/std/src/sys/unix/thread_local_dtor.rs | 3 +- - library/std/src/sys/unix/time.rs | 7 +- - library/unwind/build.rs | 2 + - src/bootstrap/bootstrap.py | 8 +- + library/std/src/sys/unix/thread_local_dtor.rs | 2 +- + library/unwind/build.rs | 18 +++ + src/bootstrap/Cargo.lock | 40 ++++- + src/bootstrap/bootstrap.py | 7 +- src/bootstrap/builder.rs | 6 +- - 21 files changed, 359 insertions(+), 20 deletions(-) + 22 files changed, 399 insertions(+), 18 deletions(-) create mode 100644 compiler/rustc_target/src/spec/aero_system_base.rs create mode 100644 compiler/rustc_target/src/spec/x86_64_unknown_aero_system.rs create mode 100644 library/std/src/os/aero/fs.rs @@ -34,25 +35,25 @@ Signed-off-by: Andy-Python-Programmer create mode 100644 library/std/src/os/aero/raw.rs diff --git a/Cargo.lock b/Cargo.lock -index ef9f91fd..e303ef85 100644 +index 15f051d0cff..f3548683f44 100644 --- a/Cargo.lock +++ b/Cargo.lock -@@ -1950,9 +1950,7 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +@@ -2326,9 +2326,7 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" --version = "0.2.108" +-version = "0.2.138" -source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" -+version = "0.2.125" +-checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" ++version = "0.2.139" dependencies = [ "rustc-std-workspace-core", ] diff --git a/Cargo.toml b/Cargo.toml -index cae48d79..a3328ea6 100644 +index 15cbb2659c9..098e8227659 100644 --- a/Cargo.toml +++ b/Cargo.toml -@@ -130,6 +130,7 @@ rustc-workspace-hack = { path = 'src/tools/rustc-workspace-hack' } +@@ -114,6 +114,7 @@ rustc-workspace-hack = { path = 'src/tools/rustc-workspace-hack' } rustc-std-workspace-core = { path = 'library/rustc-std-workspace-core' } rustc-std-workspace-alloc = { path = 'library/rustc-std-workspace-alloc' } rustc-std-workspace-std = { path = 'library/rustc-std-workspace-std' } @@ -62,16 +63,16 @@ index cae48d79..a3328ea6 100644 clippy_lints = { path = "src/tools/clippy/clippy_lints" } diff --git a/compiler/rustc_target/src/spec/aero_system_base.rs b/compiler/rustc_target/src/spec/aero_system_base.rs new file mode 100644 -index 00000000..795047af +index 00000000000..1237a432e76 --- /dev/null +++ b/compiler/rustc_target/src/spec/aero_system_base.rs -@@ -0,0 +1,35 @@ -+use crate::spec::{LinkArgs, LinkerFlavor, RelroLevel, TargetOptions}; +@@ -0,0 +1,34 @@ ++use crate::spec::{cvs, LinkArgs, LinkerFlavor, RelroLevel, TargetOptions, Cc, Lld}; + +pub fn opts() -> TargetOptions { + let mut args = LinkArgs::new(); + args.insert( -+ LinkerFlavor::Gcc, ++ LinkerFlavor::Gnu(Cc::Yes, Lld::No), + vec![ + // We want to be able to strip as much executable code as possible + // from the linker command line, and this flag indicates to the @@ -80,18 +81,17 @@ index 00000000..795047af + // resolutions the linker does). This option only applies to all + // following libraries so we're sure to pass it as one of the first + // arguments. -+ "-Wl,--as-needed".to_string(), ++ "-Wl,--as-needed".into(), + // Always enable NX protection when it is available -+ "-Wl,-z,noexecstack".to_string(), ++ "-Wl,-z,noexecstack".into(), + ], + ); + + TargetOptions { -+ os: "aero".to_string(), ++ os: "aero".into(), + dynamic_linking: true, + executables: true, -+ families: vec!["unix".to_string()], -+ linker_is_gnu: true, ++ families: cvs!["unix"], + has_rpath: true, + pre_link_args: args, + position_independent_executables: true, @@ -102,18 +102,18 @@ index 00000000..795047af + } +} diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs -index 2c149318..81c93277 100644 +index bc1920e3424..d4d049a8631 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs -@@ -62,6 +62,7 @@ +@@ -65,6 +65,7 @@ mod freebsd_base; mod fuchsia_base; mod haiku_base; +mod aero_system_base; mod hermit_base; - mod hermit_kernel_base; mod illumos_base; -@@ -889,6 +890,8 @@ fn $module() { + mod l4re_base; +@@ -1105,6 +1106,8 @@ fn $module() { ("i686-unknown-haiku", i686_unknown_haiku), ("x86_64-unknown-haiku", x86_64_unknown_haiku), @@ -124,34 +124,47 @@ index 2c149318..81c93277 100644 ("i686-apple-darwin", i686_apple_darwin), diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_aero_system.rs b/compiler/rustc_target/src/spec/x86_64_unknown_aero_system.rs new file mode 100644 -index 00000000..51c44ef8 +index 00000000000..d4e4097fb4b --- /dev/null +++ b/compiler/rustc_target/src/spec/x86_64_unknown_aero_system.rs @@ -0,0 +1,19 @@ -+use crate::spec::{LinkerFlavor, StackProbeType, Target}; ++use crate::spec::{LinkerFlavor, StackProbeType, Target, Cc, Lld}; + +pub fn target() -> Target { + let mut base = super::aero_system_base::opts(); -+ base.cpu = "x86-64".to_string(); ++ base.cpu = "x86-64".into(); + base.max_atomic_width = Some(64); -+ base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); ++ base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); + // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. + base.stack_probes = StackProbeType::Call; + + Target { -+ llvm_target: "x86_64-unknown-aero-system".to_string(), ++ llvm_target: "x86_64-unknown-aero-system".into(), + pointer_width: 64, + data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -+ .to_string(), -+ arch: "x86_64".to_string(), ++ .into(), ++ arch: "x86_64".into(), + options: base, + } +} +diff --git a/library/std/Cargo.toml b/library/std/Cargo.toml +index 349cd91c89e..aa84feaec7b 100644 +--- a/library/std/Cargo.toml ++++ b/library/std/Cargo.toml +@@ -15,7 +15,7 @@ cfg-if = { version = "1.0", features = ['rustc-dep-of-std'] } + panic_unwind = { path = "../panic_unwind", optional = true } + panic_abort = { path = "../panic_abort" } + core = { path = "../core" } +-libc = { version = "0.2.138", default-features = false, features = ['rustc-dep-of-std'] } ++libc = { path = "../../../rust-libc", default-features = false, features = ['rustc-dep-of-std'] } + compiler_builtins = { version = "0.1.87" } + profiler_builtins = { path = "../profiler_builtins", optional = true } + unwind = { path = "../unwind" } diff --git a/library/std/build.rs b/library/std/build.rs -index 43168e77..5a6e296c 100644 +index 8b1a06ee750..683976b2a47 100644 --- a/library/std/build.rs +++ b/library/std/build.rs -@@ -23,6 +23,7 @@ fn main() { +@@ -24,6 +24,7 @@ fn main() { || target.contains("l4re") || target.contains("redox") || target.contains("haiku") @@ -161,10 +174,10 @@ index 43168e77..5a6e296c 100644 || target.contains("wasm64") diff --git a/library/std/src/os/aero/fs.rs b/library/std/src/os/aero/fs.rs new file mode 100644 -index 00000000..412bbc44 +index 00000000000..a3c953ca169 --- /dev/null +++ b/library/std/src/os/aero/fs.rs -@@ -0,0 +1,148 @@ +@@ -0,0 +1,144 @@ +#![stable(feature = "raw_ext", since = "1.1.0")] + +use crate::fs::Metadata; @@ -185,11 +198,7 @@ index 00000000..412bbc44 + /// Unix platforms. The `os::unix::fs::MetadataExt` trait contains the + /// cross-Unix abstractions contained within the raw stat. + #[stable(feature = "metadata_ext", since = "1.1.0")] -+ #[rustc_deprecated( -+ since = "1.8.0", -+ reason = "deprecated in favor of the accessor \ -+ methods of this trait" -+ )] ++ #[deprecated(since = "1.8.0", note = "other methods of this trait are now preferred")] + #[allow(deprecated)] + fn as_raw_stat(&self) -> &raw::stat; + @@ -315,7 +324,7 @@ index 00000000..412bbc44 +} diff --git a/library/std/src/os/aero/mod.rs b/library/std/src/os/aero/mod.rs new file mode 100644 -index 00000000..ea3291a2 +index 00000000000..ea3291a2f18 --- /dev/null +++ b/library/std/src/os/aero/mod.rs @@ -0,0 +1,6 @@ @@ -327,7 +336,7 @@ index 00000000..ea3291a2 +pub mod raw; diff --git a/library/std/src/os/aero/raw.rs b/library/std/src/os/aero/raw.rs new file mode 100644 -index 00000000..c5e56b8b +index 00000000000..c5e56b8b7b9 --- /dev/null +++ b/library/std/src/os/aero/raw.rs @@ -0,0 +1,66 @@ @@ -398,11 +407,11 @@ index 00000000..c5e56b8b + pub st_blocks: libc::blkcnt_t, +} diff --git a/library/std/src/os/mod.rs b/library/std/src/os/mod.rs -index 90c30313..bf76ad34 100644 +index 42773805cdb..24158d5da87 100644 --- a/library/std/src/os/mod.rs +++ b/library/std/src/os/mod.rs -@@ -129,6 +129,8 @@ pub mod windows {} - pub mod ios; +@@ -133,6 +133,8 @@ pub mod windows {} + pub mod l4re; #[cfg(target_os = "macos")] pub mod macos; +#[cfg(target_os = "aero")] @@ -411,7 +420,7 @@ index 90c30313..bf76ad34 100644 pub mod netbsd; #[cfg(target_os = "openbsd")] diff --git a/library/std/src/os/unix/mod.rs b/library/std/src/os/unix/mod.rs -index 62f750fa..a69d31b5 100644 +index f97fa0fb06f..9174b0da9a3 100644 --- a/library/std/src/os/unix/mod.rs +++ b/library/std/src/os/unix/mod.rs @@ -37,6 +37,8 @@ @@ -424,24 +433,24 @@ index 62f750fa..a69d31b5 100644 pub use crate::os::android::*; #[cfg(target_os = "dragonfly")] diff --git a/library/std/src/sys/unix/args.rs b/library/std/src/sys/unix/args.rs -index ee5e3983..5ad752ab 100644 +index a5ce6d5120d..3dfe759830f 100644 --- a/library/std/src/sys/unix/args.rs +++ b/library/std/src/sys/unix/args.rs -@@ -68,7 +68,8 @@ fn next_back(&mut self) -> Option { - target_os = "l4re", +@@ -69,7 +69,8 @@ fn next_back(&mut self) -> Option { target_os = "fuchsia", target_os = "redox", -- target_os = "vxworks" -+ target_os = "vxworks", + target_os = "vxworks", +- target_os = "horizon" ++ target_os = "horizon", + target_os = "aero" ))] mod imp { use super::Args; diff --git a/library/std/src/sys/unix/env.rs b/library/std/src/sys/unix/env.rs -index 60551aeb..fabb5e63 100644 +index c9ba661c829..5894baf74f2 100644 --- a/library/std/src/sys/unix/env.rs +++ b/library/std/src/sys/unix/env.rs -@@ -195,3 +195,14 @@ pub mod os { +@@ -217,3 +217,14 @@ pub mod os { pub const EXE_SUFFIX: &str = ""; pub const EXE_EXTENSION: &str = ""; } @@ -457,34 +466,33 @@ index 60551aeb..fabb5e63 100644 + pub const EXE_EXTENSION: &str = ""; +} diff --git a/library/std/src/sys/unix/fs.rs b/library/std/src/sys/unix/fs.rs -index bcf2be0e..f523f5c5 100644 +index 8e1f35d6cc9..18910365f20 100644 --- a/library/std/src/sys/unix/fs.rs +++ b/library/std/src/sys/unix/fs.rs -@@ -612,7 +612,8 @@ pub fn file_type(&self) -> io::Result { - target_os = "fuchsia", +@@ -834,7 +834,8 @@ pub fn file_type(&self) -> io::Result { target_os = "redox", target_os = "vxworks", -- target_os = "espidf" -+ target_os = "espidf", + target_os = "espidf", +- target_os = "horizon" ++ target_os = "horizon", + target_os = "aero" ))] pub fn ino(&self) -> u64 { self.entry.d_ino as u64 -@@ -652,7 +653,8 @@ fn name_bytes(&self) -> &[u8] { - target_os = "l4re", - target_os = "haiku", - target_os = "vxworks", -- target_os = "espidf" -+ target_os = "espidf", -+ target_os = "aero" - ))] - fn name_bytes(&self) -> &[u8] { - unsafe { CStr::from_ptr(self.entry.d_name.as_ptr()).to_bytes() } +@@ -887,7 +888,7 @@ fn name_bytes(&self) -> &[u8] { + target_os = "solaris", + target_os = "illumos", + target_os = "fuchsia", +- target_os = "redox" ++ target_os = "redox", + )))] + fn name_cstr(&self) -> &CStr { + unsafe { CStr::from_ptr(self.entry.d_name.as_ptr()) } diff --git a/library/std/src/sys/unix/os.rs b/library/std/src/sys/unix/os.rs -index 8a028d99..7e0a25f8 100644 +index 2f2663db607..5a4b2bc6b10 100644 --- a/library/std/src/sys/unix/os.rs +++ b/library/std/src/sys/unix/os.rs -@@ -39,7 +39,7 @@ +@@ -41,7 +41,7 @@ } extern "C" { @@ -493,7 +501,7 @@ index 8a028d99..7e0a25f8 100644 #[cfg_attr( any( target_os = "linux", -@@ -69,13 +69,18 @@ +@@ -71,13 +71,13 @@ } /// Returns the platform-specific value of errno @@ -504,17 +512,12 @@ index 8a028d99..7e0a25f8 100644 } /// Sets the platform-specific value of errno --#[cfg(all(not(target_os = "linux"), not(target_os = "dragonfly"), not(target_os = "vxworks")))] // needed for readdir and syscall! -+#[cfg(all( -+ not(target_os = "linux"), -+ not(target_os = "dragonfly"), -+ not(target_os = "vxworks"), -+ not(target_os = "aero") -+))] // needed for readdir and syscall! +-#[cfg(all(not(target_os = "dragonfly"), not(target_os = "vxworks")))] // needed for readdir and syscall! ++#[cfg(all(not(target_os = "dragonfly"), not(target_os = "vxworks"), not(target_os = "aero")))] // needed for readdir and syscall! #[allow(dead_code)] // but not all target cfgs actually end up using it pub fn set_errno(e: i32) { unsafe { *errno_location() = e as c_int } -@@ -109,6 +114,29 @@ pub fn set_errno(e: i32) { +@@ -111,6 +111,29 @@ pub fn set_errno(e: i32) { } } @@ -544,8 +547,8 @@ index 8a028d99..7e0a25f8 100644 /// Gets a detailed string description for the given error number. pub fn error_string(errno: i32) -> String { extern "C" { -@@ -454,6 +482,11 @@ pub fn current_exe() -> io::Result { - super::unsupported::unsupported() +@@ -471,6 +494,11 @@ pub fn current_exe() -> io::Result { + if !path.is_absolute() { getcwd().map(|cwd| cwd.join(path)) } else { Ok(path) } } +#[cfg(target_os = "aero")] @@ -557,10 +560,10 @@ index 8a028d99..7e0a25f8 100644 iter: vec::IntoIter<(OsString, OsString)>, } diff --git a/library/std/src/sys/unix/thread.rs b/library/std/src/sys/unix/thread.rs -index 9e02966b..b6e326d8 100644 +index cc0e5929569..b952e199aa2 100644 --- a/library/std/src/sys/unix/thread.rs +++ b/library/std/src/sys/unix/thread.rs -@@ -140,6 +140,13 @@ pub fn set_name(name: &CStr) { +@@ -160,6 +160,13 @@ pub fn set_name(name: &CStr) { } } @@ -573,65 +576,117 @@ index 9e02966b..b6e326d8 100644 + #[cfg(target_os = "netbsd")] pub fn set_name(name: &CStr) { - use crate::ffi::CString; + unsafe { diff --git a/library/std/src/sys/unix/thread_local_dtor.rs b/library/std/src/sys/unix/thread_local_dtor.rs -index c3f41035..cf0139b1 100644 +index 236d2f2ee29..30008fc151d 100644 --- a/library/std/src/sys/unix/thread_local_dtor.rs +++ b/library/std/src/sys/unix/thread_local_dtor.rs -@@ -15,7 +15,8 @@ - target_os = "linux", - target_os = "fuchsia", - target_os = "redox", -- target_os = "emscripten" -+ target_os = "emscripten", -+ target_os = "aero" - ))] +@@ -11,7 +11,7 @@ + // Note, however, that we run on lots older linuxes, as well as cross + // compiling from a newer linux to an older linux, so we also have a + // fallback implementation to use as well. +-#[cfg(any(target_os = "linux", target_os = "fuchsia", target_os = "redox"))] ++#[cfg(any(target_os = "linux", target_os = "fuchsia", target_os = "redox", target_os = "aero"))] pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) { use crate::mem; -diff --git a/library/std/src/sys/unix/time.rs b/library/std/src/sys/unix/time.rs -index 824283ef..de405297 100644 ---- a/library/std/src/sys/unix/time.rs -+++ b/library/std/src/sys/unix/time.rs -@@ -362,12 +362,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - } - } - -- #[cfg(not(any(target_os = "dragonfly", target_os = "espidf")))] -- pub type clock_t = libc::c_int; -- #[cfg(any(target_os = "dragonfly", target_os = "espidf"))] -- pub type clock_t = libc::c_ulong; -- -- fn now(clock: clock_t) -> Timespec { -+ fn now(clock: libc::clockid_t) -> Timespec { - let mut t = Timespec { t: libc::timespec { tv_sec: 0, tv_nsec: 0 } }; - cvt(unsafe { libc::clock_gettime(clock, &mut t.t) }).unwrap(); - t + use crate::sys_common::thread_local_dtor::register_dtor_fallback; diff --git a/library/unwind/build.rs b/library/unwind/build.rs -index a3f52241..2e3bf0d3 100644 +index 5c3c02fb6ad..9071008e3b9 100644 --- a/library/unwind/build.rs +++ b/library/unwind/build.rs -@@ -46,5 +46,7 @@ fn main() { - println!("cargo:rustc-link-lib=gcc_s"); - } else if target.contains("redox") { - // redox is handled in lib.rs +@@ -21,5 +21,23 @@ fn main() { + if has_unwind { + println!("cargo:rustc-cfg=feature=\"system-llvm-libunwind\""); + } ++ } else if target.contains("solaris") { ++ println!("cargo:rustc-link-lib=gcc_s"); ++ } else if target.contains("illumos") { ++ println!("cargo:rustc-link-lib=gcc_s"); ++ } else if target.contains("dragonfly") { ++ println!("cargo:rustc-link-lib=gcc_pic"); ++ } else if target.contains("pc-windows-gnu") { ++ // This is handled in the target spec with late_link_args_[static|dynamic] ++ } else if target.contains("uwp-windows-gnu") { ++ println!("cargo:rustc-link-lib=unwind"); ++ } else if target.contains("fuchsia") { ++ println!("cargo:rustc-link-lib=unwind"); ++ } else if target.contains("haiku") { ++ println!("cargo:rustc-link-lib=gcc_s"); ++ } else if target.contains("redox") { ++ // redox is handled in lib.rs + } else if target.contains("aero") { + println!("cargo:rustc-link-lib=gcc_s"); } } +diff --git a/src/bootstrap/Cargo.lock b/src/bootstrap/Cargo.lock +index 4a0ba592577..d7b4d646308 100644 +--- a/src/bootstrap/Cargo.lock ++++ b/src/bootstrap/Cargo.lock +@@ -335,9 +335,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + + [[package]] + name = "libc" +-version = "0.2.137" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" ++version = "0.2.139" + + [[package]] + name = "linux-raw-sys" +@@ -802,3 +800,39 @@ name = "yansi" + version = "0.5.1" + source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" ++ ++[[patch.unused]] ++name = "glutin" ++version = "0.28.0" ++ ++[[patch.unused]] ++name = "libloading" ++version = "0.7.3" ++ ++[[patch.unused]] ++name = "mio" ++version = "0.6.23" ++ ++[[patch.unused]] ++name = "mio" ++version = "0.8.3" ++ ++[[patch.unused]] ++name = "nix" ++version = "0.22.3" ++ ++[[patch.unused]] ++name = "num_cpus" ++version = "1.13.0" ++ ++[[patch.unused]] ++name = "shared_library" ++version = "0.1.9" ++ ++[[patch.unused]] ++name = "users" ++version = "0.11.0" ++ ++[[patch.unused]] ++name = "winit" ++version = "0.26.1" diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py -index 7c36bb26..c22ac54c 100644 +index 013d1ab525b..624c8070fca 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py -@@ -972,7 +972,7 @@ class RustBuild(object): +@@ -717,7 +717,7 @@ class RustBuild(object): ... "debug", "bootstrap") True """ - return os.path.join(self.build_dir, "bootstrap", "debug", "bootstrap") + return os.path.join(self.build_dir, "bootstrap", self.build, "debug", "bootstrap") - def build_bootstrap(self): + def build_bootstrap(self, color, verbose_count): """Build bootstrap""" -@@ -981,7 +981,7 @@ class RustBuild(object): +@@ -726,7 +726,7 @@ class RustBuild(object): if self.clean and os.path.exists(build_dir): shutil.rmtree(build_dir) env = os.environ.copy() @@ -640,22 +695,21 @@ index 7c36bb26..c22ac54c 100644 # See also: . if "CARGO_BUILD_TARGET" in env: del env["CARGO_BUILD_TARGET"] -@@ -1028,6 +1028,10 @@ class RustBuild(object): - args.append("--locked") - if self.use_vendored_sources: - args.append("--frozen") -+ +@@ -791,6 +791,9 @@ class RustBuild(object): + elif color == "never": + args.append("--color=never") + + args.append("--target") + args.append(self.build) + - run(args, env=env, verbose=self.verbose) + # Run this from the source directory so cargo finds .cargo/config + run(args, env=env, verbose=self.verbose, cwd=self.rust_root) - def build_triple(self): diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs -index 6ccf8b1d..0bbe8685 100644 +index b4fc1d4f28d..7ef092488fe 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs -@@ -1120,6 +1120,8 @@ pub fn cargo( +@@ -1479,6 +1479,8 @@ pub fn cargo( self.clear_if_dirty(&out_dir, &self.rustc(compiler)); } @@ -664,24 +718,24 @@ index 6ccf8b1d..0bbe8685 100644 // Customize the compiler we're running. Specify the compiler to cargo // as our shim and then pass it some various options used to configure // how the actual compiler itself is called. -@@ -1132,7 +1134,7 @@ pub fn cargo( +@@ -1491,7 +1493,7 @@ pub fn cargo( .env("RUSTC_STAGE", stage.to_string()) .env("RUSTC_SYSROOT", &sysroot) .env("RUSTC_LIBDIR", &libdir) -- .env("RUSTDOC", self.out.join("bootstrap/debug/rustdoc")) +- .env("RUSTDOC", self.bootstrap_out.join("rustdoc")) + .env("RUSTDOC", artifact_dir.join("rustdoc")) .env( "RUSTDOC_REAL", if cmd == "doc" || cmd == "rustdoc" || (cmd == "test" && want_rustdoc) { -@@ -1146,7 +1148,7 @@ pub fn cargo( +@@ -1505,7 +1507,7 @@ pub fn cargo( // Clippy support is a hack and uses the default `cargo-clippy` in path. // Don't override RUSTC so that the `cargo-clippy` in path will be run. if cmd != "clippy" { -- cargo.env("RUSTC", self.out.join("bootstrap/debug/rustc")); +- cargo.env("RUSTC", self.bootstrap_out.join("rustc")); + cargo.env("RUSTC", artifact_dir.join("rustc")); } // Dealing with rpath here is a little special, so let's go into some -- -2.25.1 +2.39.1 From e29d5f8d8767abfaafb28e342e09a60949c78edc Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 17 Feb 2023 18:44:55 +1100 Subject: [PATCH 122/368] kernel: update cargo.lock Signed-off-by: Andy-Python-Programmer --- src/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index cfc02ca1d81..e7b9041421e 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -213,7 +213,7 @@ checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" [[package]] name = "lai" version = "0.1.0" -source = "git+https://github.com/aero-os/lai-rs#a6b2554cfd6e6fd12d8301b4cb8ad8aa0178cb4d" +source = "git+https://github.com/aero-os/lai-rs#756017f3c847e388b8b245357dd6c7ee7e755b97" dependencies = [ "cc", "log", From c8b2f17f0564e526c4f948609a4d6887049a797c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 17 Feb 2023 19:21:33 +1100 Subject: [PATCH 123/368] bootstrap::mlibc: add sys_ptsname sysdep Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 41 ++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 8ab10acacea..da9d4786756 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,6 +1,6 @@ -From 9591f4a8fe0242eafb16c5816455f1d763b19b77 Mon Sep 17 00:00:00 2001 +From adcc64e89eb5e570e6ad2bc578fd8b891ee6bd9a Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Wed, 1 Feb 2023 16:53:35 +1100 +Date: Fri, 17 Feb 2023 19:21:05 +1100 Subject: [PATCH] --- @@ -10,12 +10,12 @@ Subject: [PATCH] options/posix/generic/dlfcn-stubs.cpp | 1 + options/rtdl/generic/linker.cpp | 2 +- sysdeps/aero/generic/aero.cpp | 69 ++++++---- - sysdeps/aero/generic/filesystem.cpp | 35 ++++- + sysdeps/aero/generic/filesystem.cpp | 51 ++++++- sysdeps/aero/generic/sockets.cpp | 87 +++++++++++- sysdeps/aero/generic/time.cpp | 24 ++++ sysdeps/aero/include/aero/syscall.h | 9 ++ sysdeps/aero/meson.build | 1 + - 11 files changed, 374 insertions(+), 46 deletions(-) + 11 files changed, 389 insertions(+), 47 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -269,7 +269,7 @@ index fc9fd84..ab57631 100644 return __dlapi_open(file, flags, ra); } diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp -index 2e2d3f1..3ff5fef 100644 +index 6eb9d09..2ab5bc9 100644 --- a/options/rtdl/generic/linker.cpp +++ b/options/rtdl/generic/linker.cpp @@ -18,7 +18,7 @@ uintptr_t libraryBase = 0x41000000; @@ -412,10 +412,20 @@ index 29fb961..b5945a8 100644 } diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index a3e2aca..a4edac3 100644 +index a3e2aca..8a1e086 100644 --- a/sysdeps/aero/generic/filesystem.cpp +++ b/sysdeps/aero/generic/filesystem.cpp -@@ -158,11 +158,6 @@ int sys_tcsetattr(int fd, int optional_action, const struct termios *attr) { +@@ -118,7 +118,8 @@ int sys_ioctl(int fd, unsigned long request, void *arg, int *result) { + return -sys_res; + } + +- *result = sys_res; ++ if (result) ++ *result = sys_res; + return 0; + } + +@@ -158,11 +159,6 @@ int sys_tcsetattr(int fd, int optional_action, const struct termios *attr) { return 0; } @@ -427,7 +437,7 @@ index a3e2aca..a4edac3 100644 int sys_mkdir(const char *path, mode_t) { auto result = syscall(SYS_MKDIR, path, strlen(path)); -@@ -243,7 +238,15 @@ int sys_open_dir(const char *path, int *handle) { +@@ -243,7 +239,15 @@ int sys_open_dir(const char *path, int *handle) { return sys_open(path, O_DIRECTORY, 0, handle); } @@ -444,7 +454,7 @@ index a3e2aca..a4edac3 100644 int sys_readlink(const char *path, void *buffer, size_t max_size, ssize_t *length) { auto result = syscall(SYS_READ_LINK, path, strlen(path), buffer, max_size); -@@ -357,4 +360,24 @@ int sys_eventfd_create(unsigned int initval, int flags, int *fd) { +@@ -357,4 +361,37 @@ int sys_eventfd_create(unsigned int initval, int flags, int *fd) { *fd = result; return 0; } @@ -468,6 +478,19 @@ index a3e2aca..a4edac3 100644 + + return sys_ppoll(fds, count, &ts, NULL, num_events); +} ++ ++#ifndef MLIBC_BUILDING_RTDL ++#include ++int sys_ptsname(int fd, char *buffer, size_t length) { ++ int index; ++ if(int e = sys_ioctl(fd, TIOCGPTN, &index, NULL); e) ++ return e; ++ if((size_t)snprintf(buffer, length, "/dev/pts/%d", index) >= length) { ++ return ERANGE; ++ } ++ return 0; ++} ++#endif } // namespace mlibc diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp index b6b18fe..b4635df 100644 From 16e0c81b5e4f40e3a870f44c62c9a6d32ecef538 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 18 Feb 2023 17:22:40 +1100 Subject: [PATCH 124/368] mesa: make use of LLVMPipe instead of softpipe This makes the startup of alacritty faster! Blazingly fast (well kindof)! Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 35 ++++++ bootstrap/xorg.yml | 13 ++- patches/mesa/mesa.patch | 22 +++- patches/mlibc/mlibc.patch | 68 ++++++----- src/aero_kernel/src/syscall/mod.rs | 1 + src/aero_kernel/src/syscall/process.rs | 11 ++ src/aero_kernel/src/userland/vm.rs | 109 +++++++++++++++++- src/aero_syscall/src/consts.rs | 1 + ...x86_64.txt => CMakeToolchain-x86_64.cmake} | 0 userland/cross-file.ini | 27 ++--- userland/cross-llvm-config | 0 11 files changed, 240 insertions(+), 47 deletions(-) rename userland/{CMakeToolchain-x86_64.txt => CMakeToolchain-x86_64.cmake} (100%) mode change 100644 => 100755 userland/cross-llvm-config diff --git a/bootstrap.yml b/bootstrap.yml index 784640315fb..1a7252a1ef9 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -518,6 +518,41 @@ tools: - args: ['ninja', 'install'] packages: + - name: llvm + from_source: llvm + tools_required: + - host-cmake + - host-gcc + pkgs_required: + - mlibc + - zlib + configure: + - args: + - 'cmake' + - '-GNinja' + - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.cmake' + - '-DCMAKE_INSTALL_PREFIX=/usr' + # We really have to build LLVM in Release mode. + # Building it in debug mode produces tens of GiB of debugging info. + - '-DCMAKE_BUILD_TYPE=Release' + - '-DLLVM_LINK_LLVM_DYLIB=ON' + # RTTI affects the ABI. Hence, we enable it. + - '-DLLVM_ENABLE_RTTI=ON' + - '-DLLVM_TARGETS_TO_BUILD=X86' + - '-DLLVM_TARGET_ARCH=X86_64' + - '-DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-aero' + - '-DLLVM_HOST_TRIPLE=x86_64-aero' + # Disable linking against ncurses, which we do not build with -fPIC. + - '-DLLVM_ENABLE_TERMINFO=OFF' + # Suppress developer warnings + - '-Wno-dev' + - '@THIS_SOURCE_DIR@/llvm' + build: + - args: ['ninja', '-j@PARALLELISM@'] + - args: ['ninja', 'install/strip'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + - name: alacritty source: subdir: 'bundled' diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index e71476f1d4d..dee9a91cfb4 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -513,7 +513,6 @@ packages: tools_required: - host-pkg-config - host-gcc - - wayland-scanner - virtual: pkgconfig-for-target triple: "x86_64-aero" - virtual: pkgconfig-for-host @@ -527,13 +526,21 @@ packages: - libx11 - libxext - libxcb + - llvm configure: + - args: ['cp', '@SOURCE_ROOT@/userland/cross-file.ini', 'meson.cross-file'] + - args: + - 'sed' + - '-i' + - "/^# sed adds binaries here.$/a llvm-config = '@SOURCE_ROOT@/userland/cross-llvm-config'" + - 'meson.cross-file' - args: - 'meson' + - 'setup' - '--native-file' - '@SOURCE_ROOT@/userland/native-file.ini' - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' + - 'meson.cross-file' - '--prefix=/usr' - '--libdir=lib' # The debug build type enables some additional output from Mesa. @@ -545,6 +552,8 @@ packages: - '-Ddri-drivers=' - '-Dgallium-drivers=swrast' - '-Dvulkan-drivers=' + # Force Mesa to build with LLVM. + - '-Dllvm=enabled' - '@THIS_SOURCE_DIR@' build: - args: ['ninja', '-j@PARALLELISM@'] diff --git a/patches/mesa/mesa.patch b/patches/mesa/mesa.patch index 9beaf9e372b..05dab1ee953 100644 --- a/patches/mesa/mesa.patch +++ b/patches/mesa/mesa.patch @@ -1,6 +1,6 @@ -From caa8eb2b0dbe4a49aecb691e3568fb0dc6d1a8e2 Mon Sep 17 00:00:00 2001 +From 17fb4ad377b2cd0d43a62af25b8c8375909da019 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 17:10:35 +1100 +Date: Sat, 18 Feb 2023 14:31:17 +1100 Subject: [PATCH] --- @@ -11,11 +11,12 @@ Subject: [PATCH] src/gallium/drivers/llvmpipe/lp_texture.c | 1 - src/util/debug.c | 1 + src/util/detect_os.h | 8 ++++++++ + src/util/futex.h | 2 +- src/util/os_misc.c | 4 ++-- src/util/os_time.c | 4 ++-- src/util/u_printf.h | 2 ++ src/util/u_thread.h | 4 ++-- - 11 files changed, 23 insertions(+), 10 deletions(-) + 12 files changed, 24 insertions(+), 11 deletions(-) diff --git a/include/drm-uapi/drm.h b/include/drm-uapi/drm.h index 5e54c3a..be0e26d 100644 @@ -121,6 +122,19 @@ index 6506948..f5d49de 100644 +#endif #endif /* DETECT_OS_H */ +diff --git a/src/util/futex.h b/src/util/futex.h +index 43097f4..98af1db 100644 +--- a/src/util/futex.h ++++ b/src/util/futex.h +@@ -24,7 +24,7 @@ + #ifndef UTIL_FUTEX_H + #define UTIL_FUTEX_H + +-#if defined(HAVE_LINUX_FUTEX_H) ++#if defined(HAVE_LINUX_FUTEX_H) && defined(__linux__) + #define UTIL_FUTEX_SUPPORTED 1 + + #include diff --git a/src/util/os_misc.c b/src/util/os_misc.c index 31f1c55..cd3e2c7 100644 --- a/src/util/os_misc.c @@ -201,5 +215,5 @@ index 013e8be..a30eada 100644 clockid_t cid; -- -2.38.1 +2.39.1 diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index da9d4786756..977c587ed28 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,21 +1,21 @@ -From adcc64e89eb5e570e6ad2bc578fd8b891ee6bd9a Mon Sep 17 00:00:00 2001 +From bf4093ec8e528fb9ebcb248d467784e3ecce47cb Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Fri, 17 Feb 2023 19:21:05 +1100 +Date: Sat, 18 Feb 2023 14:53:00 +1100 Subject: [PATCH] --- .gitignore | 2 + options/ansi/generic/stdlib-stubs.cpp | 185 ++++++++++++++++++++++++-- + options/ansi/meson.build | 1 + options/glibc/generic/execinfo.cpp | 5 +- - options/posix/generic/dlfcn-stubs.cpp | 1 + options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 69 ++++++---- + sysdeps/aero/generic/aero.cpp | 77 +++++++---- sysdeps/aero/generic/filesystem.cpp | 51 ++++++- sysdeps/aero/generic/sockets.cpp | 87 +++++++++++- sysdeps/aero/generic/time.cpp | 24 ++++ - sysdeps/aero/include/aero/syscall.h | 9 ++ + sysdeps/aero/include/aero/syscall.h | 10 ++ sysdeps/aero/meson.build | 1 + - 11 files changed, 389 insertions(+), 47 deletions(-) + 11 files changed, 398 insertions(+), 47 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -239,6 +239,18 @@ index c0e54fe..6d9cc52 100644 // TODO: Print PID only if POSIX option is enabled. if (mlibc::globalConfig().debugMalloc) mlibc::infoLogger() << "mlibc (PID ?): malloc() returns " +diff --git a/options/ansi/meson.build b/options/ansi/meson.build +index 0820de3..afd8bbe 100644 +--- a/options/ansi/meson.build ++++ b/options/ansi/meson.build +@@ -47,6 +47,7 @@ if not no_headers + install_headers( + 'include/bits/ansi/timespec.h', + 'include/bits/ansi/time_t.h', ++ 'include/bits/ansi/fenv.h', + subdir: 'bits/ansi' + ) + endif diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp index 3474615..10a2109 100644 --- a/options/glibc/generic/execinfo.cpp @@ -256,18 +268,6 @@ index 3474615..10a2109 100644 } char **backtrace_symbols(void *const *, int) { -diff --git a/options/posix/generic/dlfcn-stubs.cpp b/options/posix/generic/dlfcn-stubs.cpp -index fc9fd84..ab57631 100644 ---- a/options/posix/generic/dlfcn-stubs.cpp -+++ b/options/posix/generic/dlfcn-stubs.cpp -@@ -27,6 +27,7 @@ char *dlerror(void) { - - [[gnu::noinline]] - void *dlopen(const char *file, int flags) { -+ mlibc::infoLogger() << "mlibc memes: " << file << frg::endlog; - auto ra = __builtin_extract_return_addr(__builtin_return_address(0)); - return __dlapi_open(file, flags, ra); - } diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp index 6eb9d09..2ab5bc9 100644 --- a/options/rtdl/generic/linker.cpp @@ -282,7 +282,7 @@ index 6eb9d09..2ab5bc9 100644 constexpr bool eagerBinding = true; diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 29fb961..b5945a8 100644 +index 29fb961..31b1a9b 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp @@ -62,29 +62,33 @@ static frg::vector create_slice(char *const arg[]) { @@ -333,7 +333,22 @@ index 29fb961..b5945a8 100644 return 0; } -@@ -124,7 +128,9 @@ int sys_anon_free(void *pointer, size_t size) { +@@ -114,6 +118,14 @@ int sys_vm_unmap(void *address, size_t size) { + return syscall(SYS_MUNMAP, address, size); + } + ++int sys_vm_protect(void *pointer, size_t size, int prot) { ++ auto res = syscall(SYS_MPROTECT, pointer, size, prot); ++ if (res < 0) ++ return -res; ++ ++ return 0; ++} ++ + int sys_anon_allocate(size_t size, void **pointer) { + return sys_vm_map(nullptr, size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0, pointer); +@@ -124,7 +136,9 @@ int sys_anon_free(void *pointer, size_t size) { } void sys_libc_panic() { @@ -344,7 +359,7 @@ index 29fb961..b5945a8 100644 sys_exit(1); } -@@ -140,8 +146,15 @@ void sys_exit(int status) { +@@ -140,8 +154,15 @@ void sys_exit(int status) { pid_t sys_getpid() { auto result = syscall(SYS_GETPID); @@ -361,7 +376,7 @@ index 29fb961..b5945a8 100644 return result; } -@@ -162,11 +175,6 @@ pid_t sys_getpgid(pid_t pid, pid_t *pgid) { +@@ -162,11 +183,6 @@ pid_t sys_getpgid(pid_t pid, pid_t *pgid) { return 0; } @@ -373,7 +388,7 @@ index 29fb961..b5945a8 100644 int sys_clock_get(int clock, time_t *secs, long *nanos) { struct timespec ts; auto result = syscall(SYS_GETTIME, clock, &ts); -@@ -233,7 +241,11 @@ uid_t sys_geteuid() { +@@ -233,7 +249,11 @@ uid_t sys_geteuid() { return 0; } @@ -386,7 +401,7 @@ index 29fb961..b5945a8 100644 int sys_seteuid(uid_t euid) UNIMPLEMENTED("sys_seteuid") gid_t sys_getgid() { -@@ -256,16 +268,19 @@ int sys_setegid(gid_t egid) { +@@ -256,16 +276,19 @@ int sys_setegid(gid_t egid) { return 0; } @@ -633,10 +648,10 @@ index 0000000..460412d +} \ No newline at end of file diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 12f8dc6..afb45f8 100644 +index 12f8dc6..78fc99d 100644 --- a/sysdeps/aero/include/aero/syscall.h +++ b/sysdeps/aero/include/aero/syscall.h -@@ -64,6 +64,15 @@ +@@ -64,6 +64,16 @@ #define SYS_FUTEX_WAIT 57 #define SYS_FUTEX_WAKE 58 #define SYS_LINK 59 @@ -649,6 +664,7 @@ index 12f8dc6..afb45f8 100644 +#define SYS_GETPPID 66 +#define SYS_SOCKET_PAIR 67 +#define SYS_RENAME 68 ++#define SYS_MPROTECT 69 // Invalid syscall used to trigger a log error in the kernel (as a hint) // so, that we can implement the syscall in the kernel. diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index abecedac61c..ba6301b5cf8 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -234,6 +234,7 @@ pub fn generic_do_syscall( SYS_FORK => process::fork(), SYS_MMAP => process::mmap(b, c, d, e, f, g), SYS_MUNMAP => process::munmap(b, c), + SYS_MPROTECT => process::mprotect(b, c, d), SYS_EXEC => process::exec(b, c, d, e, f, g), SYS_LOG => process::log(b, c), SYS_UNAME => process::uname(b), diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index da1a8075b30..d59a919ba9e 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -216,6 +216,17 @@ pub fn munmap(address: usize, size: usize) -> Result { } } +#[syscall] +pub fn mprotect(ptr: usize, size: usize, prot: usize) -> Result { + let ptr = VirtAddr::new(ptr as _); + let prot = MMapProt::from_bits(prot).ok_or(SyscallError::EINVAL)?; + + let task = scheduler::get_scheduler().current_task(); + task.vm().mprotect(ptr, size, prot); + + Ok(0) +} + #[syscall] pub fn backtrace() -> Result { crate::unwind::unwind_stack_trace(); diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index cacbf839851..70aa0f2a637 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -349,6 +349,7 @@ struct Mapping { end_addr: VirtAddr, file: Option, + refresh_flags: bool, } impl Mapping { @@ -385,8 +386,26 @@ impl Mapping { } else if reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) { self.handle_cow(offset_table, addr_aligned, false) } else { - log::error!(" - present page read failed"); - false + if !self.refresh_flags { + return false; + } + + unsafe { + // The page is present but most likely the flags need to be updated after mprotect(2). + let page: Page = Page::containing_address(address); + offset_table + .update_flags( + page, + PageTableFlags::USER_ACCESSIBLE + | PageTableFlags::PRESENT + | self.protection.into(), + ) + .unwrap() + .flush(); + } + + self.refresh_flags = false; + true } } @@ -568,6 +587,7 @@ impl Mapping { start_addr: end, end_addr: end + (self.end_addr - end), file: new_file, + refresh_flags: true, }; self.end_addr = end; @@ -600,6 +620,34 @@ impl Mapping { Ok(UnmapResult::End) } } + + fn size(&self) -> usize { + (self.end_addr - self.start_addr) as usize + } + + fn split(&self, start: VirtAddr, end: VirtAddr) -> (Mapping, Mapping, Mapping) { + assert!(start > self.start_addr && end < self.end_addr); + + let mut left = self.clone(); + left.end_addr = start; + + let mut mid = self.clone(); + mid.start_addr = start; + mid.end_addr = end; + + let mut right = self.clone(); + right.start_addr = end; + + if self.file.is_some() { + left.file.as_mut().unwrap().size = left.size(); + mid.file.as_mut().unwrap().offset += left.size(); + mid.file.as_mut().unwrap().size = mid.size(); + right.file.as_mut().unwrap().offset += mid.size(); + right.file.as_mut().unwrap().size = right.size(); + } + + (left, mid, right) + } } struct VmProtected { @@ -819,6 +867,7 @@ impl VmProtected { end_addr: addr + size_aligned, file: file.map(|f| MMapFile::new(f, offset, size)), + refresh_flags: true, }); Some(addr) @@ -1032,6 +1081,58 @@ impl VmProtected { success } + fn mprotect(&mut self, addr: VirtAddr, size: usize, prot: MMapProt) -> bool { + let start = addr.align_up(Size4KiB::SIZE); + let end = (addr + size).align_up(Size4KiB::SIZE); + + let mut cursor = self.mappings.cursor_front_mut(); + + while let Some(map) = cursor.current() { + if map.end_addr <= start { + cursor.move_next(); + } else { + if end <= map.start_addr || start >= map.end_addr { + break; + } else if start > map.start_addr && end < map.end_addr { + // The address we want to unmap is in the middle of the region. So we + // will need to split the mapping and update the end address accordingly. + let (left, mut mid, right) = map.split(start, end); + mid.protection = prot; + + cursor.insert_after(right); + cursor.insert_after(mid); + cursor.insert_after(left); + cursor.remove_current(); + break; + } else if start <= map.start_addr && end >= map.end_addr { + // full + map.protection = prot; + cursor.move_next(); + } else if start <= map.start_addr && end < map.end_addr { + // start + let mut mapping = map.clone(); + mapping.end_addr = end; + mapping.protection = prot; + + map.start_addr = end; + cursor.insert_before(mapping); + break; + } else { + // end + let mut mapping = map.clone(); + mapping.start_addr = end; + mapping.protection = prot; + + map.end_addr = start; + cursor.insert_after(mapping); + cursor.move_next(); + } + } + } + + return true; + } + fn fork_from(&mut self, parent: &Vm) { let data = parent.inner.lock(); @@ -1070,6 +1171,10 @@ impl Vm { self.inner.lock().munmap(address, size) } + pub fn mprotect(&self, ptr: VirtAddr, size: usize, prot: MMapProt) { + assert!(self.inner.lock().mprotect(ptr, size, prot)) + } + pub(super) fn fork_from(&self, parent: &Vm) { self.inner.lock().fork_from(parent) } diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index ecbd789c4fd..52f3c96bd34 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -89,6 +89,7 @@ pub const SYS_GETITIMER: usize = 65; pub const SYS_GETPPID: usize = 66; pub const SYS_SOCKET_PAIR: usize = 67; pub const SYS_RENAME: usize = 68; +pub const SYS_MPROTECT: usize = 69; // haha funny number // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; diff --git a/userland/CMakeToolchain-x86_64.txt b/userland/CMakeToolchain-x86_64.cmake similarity index 100% rename from userland/CMakeToolchain-x86_64.txt rename to userland/CMakeToolchain-x86_64.cmake diff --git a/userland/cross-file.ini b/userland/cross-file.ini index 61aaa230496..87deb26d1ee 100644 --- a/userland/cross-file.ini +++ b/userland/cross-file.ini @@ -1,13 +1,14 @@ -[binaries] -c = 'x86_64-aero-gcc' -cpp = 'x86_64-aero-g++' -ar = 'x86_64-aero-ar' -strip = 'x86_64-aero-strip' -ld = 'x86_64-aero-ld' -pkgconfig = 'x86_64-aero-pkg-config' - -[host_machine] -system = 'aero' -cpu_family = 'x86_64' -cpu = 'x86_64' -endian = 'little' +[binaries] +c = 'x86_64-aero-gcc' +cpp = 'x86_64-aero-g++' +ar = 'x86_64-aero-ar' +strip = 'x86_64-aero-strip' +ld = 'x86_64-aero-ld' +pkgconfig = 'x86_64-aero-pkg-config' +# sed adds binaries here. + +[host_machine] +system = 'aero' +cpu_family = 'x86_64' +cpu = 'x86_64' +endian = 'little' diff --git a/userland/cross-llvm-config b/userland/cross-llvm-config old mode 100644 new mode 100755 From d924a19b2587ea55af1eb065436c454be6e7dde9 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 18 Feb 2023 17:57:21 +1100 Subject: [PATCH 125/368] aero.py: set qemu binary path Signed-off-by: Andy-Python-Programmer --- aero.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/aero.py b/aero.py index e34deb660cb..3f1dd657878 100755 --- a/aero.py +++ b/aero.py @@ -496,7 +496,13 @@ def run_in_emulator(build_info: BuildInfo, iso_path): log_error("unknown target architecture") exit(1) - qemu_binary = f'qemu-system-{build_info.target_arch}' + qemu_binary = os.getenv("QEMU_PATH") + if not qemu_binary: + qemu_binary = f'qemu-system-{build_info.target_arch}' + else: + qemu_binary = os.path.join(qemu_binary, f'qemu-system-{build_info.target_arch}'); + + log_info(f"{qemu_binary} {' '.join(qemu_args)}") run_command([qemu_binary, *qemu_args]) From 8c0964c6a76c2c15800a94fba64ea7f50cab51f1 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 20 Feb 2023 18:27:54 +1100 Subject: [PATCH 126/368] x86_64::task: FPU, SSE Signed-off-by: Andy-Python-Programmer --- .../src/arch/x86_64/controlregs.rs | 110 ++++++++++++++++++ .../src/arch/x86_64/interrupts/exceptions.rs | 17 ++- src/aero_kernel/src/arch/x86_64/mod.rs | 23 +++- src/aero_kernel/src/arch/x86_64/task.rs | 78 ++++++++++++- 4 files changed, 221 insertions(+), 7 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/controlregs.rs b/src/aero_kernel/src/arch/x86_64/controlregs.rs index c98c5f14b51..2d875074f02 100644 --- a/src/aero_kernel/src/arch/x86_64/controlregs.rs +++ b/src/aero_kernel/src/arch/x86_64/controlregs.rs @@ -185,6 +185,73 @@ bitflags::bitflags! { } } +bitflags::bitflags! { + pub struct MxCsr: u32 { + const INVALID_OPERATION = 1 << 0; + const DENORMAL = 1 << 1; + const DIVIDE_BY_ZERO = 1 << 2; + const OVERFLOW = 1 << 3; + const UNDERFLOW = 1 << 4; + const PRECISION = 1 << 5; + const DENORMALS_ARE_ZEROS = 1 << 6; + const INVALID_OPERATION_MASK = 1 << 7; + const DENORMAL_MASK = 1 << 8; + const DIVIDE_BY_ZERO_MASK = 1 << 9; + const OVERFLOW_MASK = 1 << 10; + const UNDERFLOW_MASK = 1 << 11; + const PRECISION_MASK = 1 << 12; + const ROUNDING_CONTROL_NEGATIVE = 1 << 13; + const ROUNDING_CONTROL_POSITIVE = 1 << 14; + const ROUNDING_CONTROL_ZERO = 3 << 13; + const FLUSH_TO_ZERO = 1 << 15; + } +} + +bitflags::bitflags! { + /// Configuration flags of the XCr0 register. + /// + /// For MPX, [`BNDREG`](XCr0Flags::BNDREG) and [`BNDCSR`](XCr0Flags::BNDCSR) must be set/unset simultaneously. + /// For AVX-512, [`OPMASK`](XCr0Flags::OPMASK), [`ZMM_HI256`](XCr0Flags::ZMM_HI256), and [`HI16_ZMM`](XCr0Flags::HI16_ZMM) + /// must be set/unset simultaneously. + #[repr(transparent)] + pub struct XCr0Flags: u64 { + /// Enables using the x87 FPU state + /// with `XSAVE`/`XRSTOR`. + /// + /// Must be set. + const X87 = 1; + /// Enables using MXCSR and the XMM registers + /// with `XSAVE`/`XRSTOR`. + /// + /// Must be set if [`AVX`](XCr0Flags::AVX) is set. + const SSE = 1 << 1; + /// Enables AVX instructions and using the upper halves of the AVX registers + /// with `XSAVE`/`XRSTOR`. + const AVX = 1 << 2; + /// Enables MPX instructions and using the BND0-BND3 bound registers + /// with `XSAVE`/`XRSTOR` (Intel Only). + const BNDREG = 1 << 3; + /// Enables MPX instructions and using the BNDCFGU and BNDSTATUS registers + /// with `XSAVE`/`XRSTOR` (Intel Only). + const BNDCSR = 1 << 4; + /// Enables AVX-512 instructions and using the K0-K7 mask registers + /// with `XSAVE`/`XRSTOR` (Intel Only). + const OPMASK = 1 << 5; + /// Enables AVX-512 instructions and using the upper halves of the lower ZMM registers + /// with `XSAVE`/`XRSTOR` (Intel Only). + const ZMM_HI256 = 1 << 6; + /// Enables AVX-512 instructions and using the upper ZMM registers + /// with `XSAVE`/`XRSTOR` (Intel Only). + const HI16_ZMM = 1 << 7; + /// Enables using the PKRU register + /// with `XSAVE`/`XRSTOR`. + const MPK = 1 << 9; + /// Enables Lightweight Profiling extensions and managing LWP state + /// with `XSAVE`/`XRSTOR` (AMD Only). + const LWP = 1 << 62; + } +} + /// Returns the current value of the RFLAGS register. pub fn read_rflags() -> RFlags { let value: u64; @@ -230,6 +297,35 @@ pub fn read_cr0() -> Cr0Flags { Cr0Flags::from_bits_truncate(value) // Get the flags from the bits. } +pub fn read_xcr0() -> XCr0Flags { + let (low, high): (u32, u32); + + unsafe { + asm!( + "xgetbv", + in("ecx") 0, + out("rax") low, out("rdx") high, + options(nomem, nostack, preserves_flags), + ); + } + + XCr0Flags::from_bits_truncate((high as u64) << 32 | (low as u64)) +} + +pub unsafe fn write_xcr0(value: XCr0Flags) { + let low = value.bits() as u32; + let high = (value.bits() >> 32) as u32; + + unsafe { + asm!( + "xsetbv", + in("ecx") 0, + in("rax") low, in("rdx") high, + options(nomem, nostack, preserves_flags), + ); + } +} + /// Write the given set of CR4 flags. /// /// ## Safety @@ -273,3 +369,17 @@ pub fn read_cr2() -> VirtAddr { VirtAddr::new(value) } } + +pub fn read_mxcsr() -> MxCsr { + let mut mxcsr: u32 = 0; + unsafe { + asm!("stmxcsr [{}]", in(reg) &mut mxcsr, options(nostack, preserves_flags)); + } + MxCsr::from_bits_truncate(mxcsr) +} + +pub fn write_mxcsr(value: MxCsr) { + unsafe { + asm!("ldmxcsr [{}]", in(reg) &value, options(nostack, readonly)); + } +} diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs index 67207f5f883..0a003f8785a 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs @@ -58,10 +58,25 @@ interrupt_exception!(fn protection() => "Protection Fault"); interrupt_exception!(fn fpu_fault() => "FPU floating point fault"); interrupt_exception!(fn alignment_check() => "Alignment check fault"); interrupt_exception!(fn machine_check() => "Machine check fault"); -interrupt_exception!(fn simd() => "SIMD floating point fault"); interrupt_exception!(fn virtualization() => "Virtualization fault"); interrupt_exception!(fn security() => "Security exception"); +pub fn simd(stack: &mut InterruptErrorStack) { + unwind::prepare_panic(); + + log::error!("EXCEPTION: SIMD floating point fault"); + log::error!("Stack: {:#x?}", stack); + log::error!("MXCSR: {:?}", controlregs::read_mxcsr()); + + unwind::unwind_stack_trace(); + + unsafe { + loop { + super::halt(); + } + } +} + pub fn invalid_opcode(stack: &mut InterruptErrorStack) { // Catch SYSENTER on AMD CPUs. // diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index bb68ac9dec0..a8b39f15fe9 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -235,17 +235,27 @@ pub fn enable_acpi() { aml::get_subsystem().enable_acpi(INTERRUPT_CONTROLLER.method() as _); } +fn enable_xsave() { + use controlregs::XCr0Flags; + + // Enable XSAVE and x{get,set}bv + let mut cr4 = controlregs::read_cr4(); + cr4.insert(controlregs::Cr4Flags::OSXSAVE); + unsafe { controlregs::write_cr4(cr4) } + + let mut xcr0 = controlregs::read_xcr0(); + xcr0.insert(XCr0Flags::X87 | XCr0Flags::SSE); + unsafe { controlregs::write_xcr0(xcr0) } +} + pub fn init_cpu() { unsafe { // Enable the no-execute page protection feature. io::wrmsr(io::IA32_EFER, io::rdmsr(io::IA32_EFER) | 1 << 11); - // Check if SSE is supported. SSE support is a requirement for running Aero. - let has_sse = CpuId::new() - .get_feature_info() - .map_or(false, |i| i.has_sse()); + let features = CpuId::new().get_feature_info().unwrap(); - assert!(has_sse); + assert!(features.has_sse()); { let mut cr0 = controlregs::read_cr0(); @@ -264,5 +274,8 @@ pub fn init_cpu() { controlregs::write_cr4(cr4); } + + assert!(features.has_xsave(), "init: xsave not supported!"); + enable_xsave(); } } diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index cd5e336e9cd..39edcf71195 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -35,17 +35,20 @@ use alloc::alloc::alloc_zeroed; use aero_syscall::{MMapFlags, MMapProt}; +use alloc::boxed::Box; use alloc::vec::Vec; +use raw_cpuid::CpuId; use core::alloc::Layout; use core::ptr::Unique; -use crate::arch::interrupts::InterruptErrorStack; +use crate::arch::controlregs::MxCsr; use crate::fs::cache::DirCacheItem; use crate::mem::paging::*; use crate::syscall::ExecArgs; use crate::userland::vm::Vm; use crate::utils::StackHelper; +use crate::{arch::interrupts::InterruptErrorStack, mem::alloc_boxed_buffer}; use super::{controlregs, io}; @@ -121,6 +124,8 @@ pub struct ArchTask { fs_base: VirtAddr, gs_base: VirtAddr, + + fpu_storage: Option>, } impl ArchTask { @@ -136,6 +141,8 @@ impl ArchTask { fs_base: VirtAddr::zero(), gs_base: VirtAddr::zero(), + + fpu_storage: None, } } @@ -178,6 +185,8 @@ impl ArchTask { fs_base: VirtAddr::zero(), gs_base: VirtAddr::zero(), + + fpu_storage: None, } } @@ -221,6 +230,9 @@ impl ArchTask { context.rip = fork_init as _; context.cr3 = address_space.cr3().start_address().as_u64(); + let mut fpu_storage = alloc_boxed_buffer::(xsave_size() as usize); + fpu_storage.copy_from_slice(self.fpu_storage.as_ref().unwrap()); + Ok(Self { context: unsafe { Unique::new_unchecked(context) }, context_switch_rsp: VirtAddr::new(switch_stack as u64), @@ -230,6 +242,8 @@ impl ArchTask { // The FS and GS bases are inherited from the parent process. fs_base: self.fs_base.clone(), gs_base: self.gs_base.clone(), + + fpu_storage: Some(fpu_storage), }) } @@ -272,6 +286,9 @@ impl ArchTask { context.rip = fork_init as u64; context.cr3 = new_address_space.cr3().start_address().as_u64(); + let mut fpu_storage = alloc_boxed_buffer::(xsave_size() as usize); + fpu_storage.copy_from_slice(self.fpu_storage.as_ref().unwrap()); + Ok(Self { context: unsafe { Unique::new_unchecked(context) }, context_switch_rsp: VirtAddr::new(switch_stack as u64), @@ -281,6 +298,8 @@ impl ArchTask { // The FS and GS bases are inherited from the parent process. fs_base: self.fs_base.clone(), gs_base: self.gs_base.clone(), + + fpu_storage: Some(fpu_storage), }) } @@ -324,6 +343,33 @@ impl ArchTask { self.fs_base = VirtAddr::zero(); self.gs_base = VirtAddr::zero(); + let mut fpu_storage = alloc_boxed_buffer::(xsave_size() as usize); + + unsafe { + xrstor(&fpu_storage); + + // The x87 FPU control word is set to 0x37f (default), which masks all + // floating-point exceptions, sets rounding to nearest, and sets the x87 + // FPU precision to 64 bits (as documented in Intel SDM volume 1 section + // 8.1.5). + const DEFAULT_FPU_CWORD: u16 = 0x37f; + asm!("fldcw [{}]", in(reg) &DEFAULT_FPU_CWORD, options(nomem)); + + // Set the default MXCSR value at reset as documented in Intel SDM volume 2A. + controlregs::write_mxcsr( + MxCsr::INVALID_OPERATION_MASK + | MxCsr::DENORMAL_MASK + | MxCsr::DIVIDE_BY_ZERO_MASK + | MxCsr::OVERFLOW_MASK + | MxCsr::UNDERFLOW_MASK + | MxCsr::PRECISION_MASK, + ); + + xsave(&mut fpu_storage); + } + + self.fpu_storage = Some(fpu_storage); + extern "C" { fn jump_userland_exec(stack: VirtAddr, rip: VirtAddr, rflags: u64); } @@ -473,6 +519,28 @@ impl ArchTask { } } +fn xsave_size() -> u32 { + static XSAVE_SIZE: Option = None; + XSAVE_SIZE.unwrap_or_else(|| { + CpuId::new() + .get_extended_state_info() + .expect("xsave: cpuid extended state info unavailable") + .xsave_size() + }) +} + +fn xsave(fpu: &mut Box<[u8]>) { + unsafe { + asm!("xsave [{}]", in(reg) fpu.as_ptr(), in("eax") 0xffffffffu32, in("edx") 0xffffffffu32) + } +} + +fn xrstor(fpu: &Box<[u8]>) { + unsafe { + asm!("xrstor [{}]", in(reg) fpu.as_ptr(), in("eax") 0xffffffffu32, in("edx") 0xffffffffu32); + } +} + /// Check out the module level documentation for more information. pub fn arch_task_spinup(from: &mut ArchTask, to: &ArchTask) { extern "C" { @@ -491,6 +559,14 @@ pub fn arch_task_spinup(from: &mut ArchTask, to: &ArchTask) { // update the swap GS target to point to the new GS base. io::wrmsr(io::IA32_KERNEL_GSBASE, to.gs_base.as_u64()); + if let Some(fpu) = from.fpu_storage.as_mut() { + xsave(fpu); + } + + if let Some(fpu) = to.fpu_storage.as_ref() { + xrstor(fpu); + } + task_spinup(&mut from.context, to.context.as_ref()); } } From b179742dfb4afedb4d4fbeb1c9c575fdc6769813 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 20 Feb 2023 18:43:03 +1100 Subject: [PATCH 127/368] bootstrap::mlibc: enable map DSO segments and file windows Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 977c587ed28..e2aae431024 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,10 +1,11 @@ -From bf4093ec8e528fb9ebcb248d467784e3ecce47cb Mon Sep 17 00:00:00 2001 +From f4c7bb3f8556d4f50fe132109de2dfedfccac293 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sat, 18 Feb 2023 14:53:00 +1100 +Date: Mon, 20 Feb 2023 18:40:41 +1100 Subject: [PATCH] --- .gitignore | 2 + + meson.build | 4 + options/ansi/generic/stdlib-stubs.cpp | 185 ++++++++++++++++++++++++-- options/ansi/meson.build | 1 + options/glibc/generic/execinfo.cpp | 5 +- @@ -15,7 +16,7 @@ Subject: [PATCH] sysdeps/aero/generic/time.cpp | 24 ++++ sysdeps/aero/include/aero/syscall.h | 10 ++ sysdeps/aero/meson.build | 1 + - 11 files changed, 398 insertions(+), 47 deletions(-) + 12 files changed, 402 insertions(+), 47 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -28,6 +29,21 @@ index fdd60a0..9f811f4 100644 .vscode +# clangd cache files: +.cache +diff --git a/meson.build b/meson.build +index 7dc495d..f419404 100644 +--- a/meson.build ++++ b/meson.build +@@ -125,6 +125,10 @@ if host_machine.system() == 'linux' + elif host_machine.system() == 'aero' + rtdl_include_dirs += include_directories('sysdeps/aero/include') + libc_include_dirs += include_directories('sysdeps/aero/include') ++ ++ internal_conf.set10('MLIBC_MAP_DSO_SEGMENTS', true) ++ internal_conf.set10('MLIBC_MAP_FILE_WINDOWS', true) ++ + subdir('sysdeps/aero') + elif host_machine.system() == 'managarm' + # TODO: Adopt the include_directories() commands from the managarm meson.build. diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp index c0e54fe..6d9cc52 100644 --- a/options/ansi/generic/stdlib-stubs.cpp From 6b32655e313c7184cbcc5a14b4028e6deaf6c5a8 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 25 Feb 2023 15:47:05 +1100 Subject: [PATCH 128/368] pci: fix write Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/pci.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index c920f5836f9..ee3dc32bdc0 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -598,17 +598,30 @@ impl PciHeader { } unsafe fn write(&self, offset: u32, value: u32) { + let current = self.read::(offset); + let bus = self.bus() as u32; let device = self.device() as u32; let func = self.function() as u32; + let address = (bus << 16) | (device << 11) | (func << 8) | (offset & 0xFC) | 0x80000000; + let noffset = (offset & 0b11) * 8; io::outl(PCI_CONFIG_ADDRESS_PORT, address); - match core::mem::size_of::() { - 1 => io::outb(PCI_CONFIG_DATA_PORT, value as u8), // u8 - 2 => io::outw(PCI_CONFIG_DATA_PORT, value as u16), // u16 - 4 => io::outl(PCI_CONFIG_DATA_PORT, value), // u32 + 1 => { + let mask = !(0xffu32 << offset); + let value = (current & mask) | ((value & 0xff) << offset); + io::outl(PCI_CONFIG_DATA_PORT, value) + } // u8 + + 2 => { + let mask = !(0xffffu32 << noffset); + let value = (current & mask) | ((value & 0xffff) << noffset); + io::outl(PCI_CONFIG_DATA_PORT, value) + } // u16 + + 4 => io::outl(PCI_CONFIG_DATA_PORT, value), // u32 width => unreachable!("unknown PCI write width: `{}`", width), } } From f86a7cae558dcd41f62ff549af9e848e6ec99620 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 25 Feb 2023 15:48:30 +1100 Subject: [PATCH 129/368] Msix::new(): disable legacy IRQ for the device Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/pci.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index ee3dc32bdc0..5a9e64c70a7 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -124,6 +124,7 @@ impl<'a> Msix<'a> { message_control.set_bit(15, true); // enable MSI-X message_control.set_bit(14, false); // function mask + header.disable_legacy_irq(); header.write::(offset + 2, message_control as u32); } @@ -649,6 +650,15 @@ impl PciHeader { unsafe { self.write::(0x04, command | (1 << 2)) } } + pub fn disable_legacy_irq(&self) { + // Set the Interrupt Disable bit, which is bit 10 of the Command register + // (at Configuration Space offset 0x4) to disable legacy interrupts. + let mut command = unsafe { self.read::(0x04) }; + command.set_bit(10, true); + + unsafe { self.write::(0x04, command) } + } + /// Returns the value stored in the PCI vendor ID register which is used to identify /// the manufacturer of the PCI device. pub fn get_vendor(&self) -> Vendor { From 0f61a8ab33fd66973a604eee55cb3489ace6fb27 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 25 Feb 2023 15:49:13 +1100 Subject: [PATCH 130/368] msix: set delivery mode Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/pci.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index 5a9e64c70a7..bd7f72f18d1 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -47,6 +47,13 @@ bitflags::bitflags! { } } +#[repr(u32)] +pub enum DeliveryMode { + /// Deliver the signal to all the agents listed in the destination. The Trigger Mode for + /// fixed delivery mode can be edge or level. + Fixed = 0b000, +} + #[repr(C)] struct Message { addr_lower: VolatileCell, @@ -62,13 +69,18 @@ impl Message { fn set_masked(&self, masked: bool) { self.mask.set(*self.mask.get().set_bit(0, masked)); + self.mask.set(*self.mask.get().set_bit(30, masked)); } - fn set(&mut self, vector: u8) { + fn set(&mut self, vector: u8, delivery_mode: DeliveryMode) { assert!(self.is_masked(), "msix: message is unmasked"); let mut data = 0; data.set_bits(0..8, vector as u32); + data.set_bits(8..11, delivery_mode as u32); + data.set_bit(14, false); + data.set_bit(15, false); + data.set_bits(16..32, 0); let mut addr = 0; addr.set_bits(12..20, apic::get_bsp_id() as u32); @@ -143,7 +155,7 @@ impl<'a> Msix<'a> { self.table.set(msix_vector, true); let message = &mut self.messages[msix_vector]; - message.set(vector); + message.set(vector, DeliveryMode::Fixed); message.set_masked(false); msix_vector From ab20d27581af15f0888b3b9051151fc0c9c017c6 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 25 Feb 2023 16:06:44 +1100 Subject: [PATCH 131/368] nvme: remove unreachable!() in interrupt handler Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/block/nvme/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 900a58efce5..7d2453a4d5b 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -525,7 +525,7 @@ impl PciDeviceHandle for Handler<'static> { } fn irq_handler(_stack: &mut InterruptStack) { - unimplemented!("nvme: interrupt handler!") + // unimplemented!("nvme: interrupt handler!") } fn nvme_init() { From 5b871709b6ef6cf90f9660b9ec07af5afc649da0 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 27 Feb 2023 18:48:40 +1100 Subject: [PATCH 132/368] inet::{new, bind, connect, send}: implement * implement inet::{new, bind, connect, send} * remove the in-kernel dhcp client * remove the dependency of libc in userland applications (ones inside `userland/`) * init: launch the DHCP client (`dhcpd`) Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 1 + bootstrap/net.yml | 29 ++++ patches/mlibc/mlibc.patch | 32 ++-- src/Cargo.lock | 24 +++ src/aero_kernel/Cargo.toml | 16 +- src/aero_kernel/src/fs/ext2/mod.rs | 8 + src/aero_kernel/src/fs/inode.rs | 4 + src/aero_kernel/src/net/checksum.rs | 76 ++++++++++ src/aero_kernel/src/net/dhcp.rs | 213 --------------------------- src/aero_kernel/src/net/ip.rs | 17 +-- src/aero_kernel/src/net/mod.rs | 12 +- src/aero_kernel/src/net/udp.rs | 53 ++++++- src/aero_kernel/src/socket/inet.rs | 144 +++++++++++++++++- src/aero_kernel/src/socket/unix.rs | 2 +- src/aero_kernel/src/syscall/mod.rs | 1 + src/aero_kernel/src/syscall/net.rs | 31 +++- src/aero_syscall/Cargo.toml | 14 ++ src/aero_syscall/src/consts.rs | 1 + src/aero_syscall/src/lib.rs | 64 ++++++-- src/aero_syscall/src/socket.rs | 7 +- userland/Cargo.lock | 37 ++++- userland/apps/aero_shell/Cargo.toml | 1 - userland/apps/aero_shell/src/main.rs | 18 +-- userland/apps/init/Cargo.toml | 1 - userland/apps/init/src/main.rs | 1 + 25 files changed, 527 insertions(+), 280 deletions(-) create mode 100644 bootstrap/net.yml create mode 100644 src/aero_kernel/src/net/checksum.rs delete mode 100644 src/aero_kernel/src/net/dhcp.rs diff --git a/bootstrap.yml b/bootstrap.yml index 1a7252a1ef9..82c259f86c9 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -1,5 +1,6 @@ imports: - file: bootstrap/xorg.yml + - file: bootstrap/net.yml general: cargo: diff --git a/bootstrap/net.yml b/bootstrap/net.yml new file mode 100644 index 00000000000..605e1f6fb95 --- /dev/null +++ b/bootstrap/net.yml @@ -0,0 +1,29 @@ +packages: + - name: dhcpd + source: + subdir: 'bundled' + git: 'https://github.com/Andy-Python-Programmer/dhcpd' + branch: 'main' + tools_required: + - host-rust + - host-gcc + sources_required: + - rust-patched-libs + pkgs_required: + - mlibc + configure: + - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] + build: + - args: + - 'cargo' + - 'install' + - '--locked' + - '--target-dir' + - '@THIS_BUILD_DIR@' + - '--path' + - '@THIS_SOURCE_DIR@' + - '--root' + - '@THIS_COLLECT_DIR@/usr' + - '-j@PARALLELISM@' + environ: + RUSTFLAGS: '-Cforce-frame-pointers=yes -Clink-args=-no-pie' \ No newline at end of file diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index e2aae431024..43f3db32de0 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,6 +1,6 @@ -From f4c7bb3f8556d4f50fe132109de2dfedfccac293 Mon Sep 17 00:00:00 2001 +From a5ec321f99ccfe66889e802626230a792a3d7140 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Mon, 20 Feb 2023 18:40:41 +1100 +Date: Sun, 26 Feb 2023 17:20:53 +1100 Subject: [PATCH] --- @@ -12,11 +12,11 @@ Subject: [PATCH] options/rtdl/generic/linker.cpp | 2 +- sysdeps/aero/generic/aero.cpp | 77 +++++++---- sysdeps/aero/generic/filesystem.cpp | 51 ++++++- - sysdeps/aero/generic/sockets.cpp | 87 +++++++++++- + sysdeps/aero/generic/sockets.cpp | 96 ++++++++++++- sysdeps/aero/generic/time.cpp | 24 ++++ - sysdeps/aero/include/aero/syscall.h | 10 ++ + sysdeps/aero/include/aero/syscall.h | 11 ++ sysdeps/aero/meson.build | 1 + - 12 files changed, 402 insertions(+), 47 deletions(-) + 12 files changed, 412 insertions(+), 47 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -524,17 +524,18 @@ index a3e2aca..8a1e086 100644 +#endif } // namespace mlibc diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp -index b6b18fe..b4635df 100644 +index b6b18fe..0ee0838 100644 --- a/sysdeps/aero/generic/sockets.cpp +++ b/sysdeps/aero/generic/sockets.cpp -@@ -1,5 +1,6 @@ +@@ -1,5 +1,7 @@ #include #include +#include ++#include #include #include -@@ -46,8 +47,8 @@ int sys_listen(int fd, int backlog) { +@@ -46,8 +48,8 @@ int sys_listen(int fd, int backlog) { return 0; } @@ -545,11 +546,19 @@ index b6b18fe..b4635df 100644 if (result < 0) { return -result; -@@ -56,4 +57,86 @@ int sys_accept(int fd, int *newfd) { +@@ -56,4 +58,94 @@ int sys_accept(int fd, int *newfd) { *newfd = result; return 0; } + ++int sys_msg_send(int fd, const struct msghdr *hdr, int flags, ssize_t *length) { ++ auto result = syscall(SYS_SOCK_SEND, fd, hdr, flags); ++ if (result < 0) ++ return -result; ++ ++ *length = result; ++ return 0; ++} + +int sys_msg_recv(int sockfd, struct msghdr *msg_hdr, int flags, ssize_t *length) { + auto result = syscall(SYS_SOCK_RECV, sockfd, msg_hdr, flags); @@ -664,10 +673,10 @@ index 0000000..460412d +} \ No newline at end of file diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 12f8dc6..78fc99d 100644 +index 12f8dc6..432bad2 100644 --- a/sysdeps/aero/include/aero/syscall.h +++ b/sysdeps/aero/include/aero/syscall.h -@@ -64,6 +64,16 @@ +@@ -64,6 +64,17 @@ #define SYS_FUTEX_WAIT 57 #define SYS_FUTEX_WAKE 58 #define SYS_LINK 59 @@ -681,6 +690,7 @@ index 12f8dc6..78fc99d 100644 +#define SYS_SOCKET_PAIR 67 +#define SYS_RENAME 68 +#define SYS_MPROTECT 69 ++#define SYS_SOCK_SEND 70 // Invalid syscall used to trigger a log error in the kernel (as a hint) // so, that we can implement the syscall in the kernel. diff --git a/src/Cargo.lock b/src/Cargo.lock index e7b9041421e..f4314f3069a 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -22,6 +22,7 @@ dependencies = [ "log", "lru", "nasm-rs", + "num-traits", "raw-cpuid", "rustc-demangle", "serde_json", @@ -48,6 +49,9 @@ name = "aero_syscall" version = "0.1.0" dependencies = [ "bitflags", + "num-derive", + "num-traits", + "simple_endian", ] [[package]] @@ -284,6 +288,26 @@ dependencies = [ "rayon", ] +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.14.0" diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index 95ae7f17241..1241838cfaa 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -42,10 +42,22 @@ static_assertions = "1.1.0" lru = "0.8.0" bytemuck = "1.12.1" # the crate is not mainted but who cares it works (tm)! -simple_endian = { git = "https://github.com/michalfita/simple-endian-rs", branch = "bugfix/4/fix-no_std-support-right-way", default_features = false, features = ["bitwise", "comparisons", "format", "math_ops", "neg_ops", "shift_ops", "both_endian", "float_impls", "integer_impls", "byte_impls"] } -byteorder = { version = "*", default-features=false} +simple_endian = { git = "https://github.com/michalfita/simple-endian-rs", branch = "bugfix/4/fix-no_std-support-right-way", default_features = false, features = [ + "bitwise", + "comparisons", + "format", + "math_ops", + "neg_ops", + "shift_ops", + "both_endian", + "float_impls", + "integer_impls", + "byte_impls", +] } +byteorder = { version = "*", default-features = false } limine = { git = "https://github.com/limine-bootloader/limine-rs" } cfg-if = "1.0" +num-traits = { version = "0.2", default-features = false } # X86_64 specific dependencies: [target.'cfg(target_arch = "x86_64")'.dependencies] diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 7034677ffe9..10be15572f3 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -549,6 +549,14 @@ impl INodeInterface for INode { return Err(FileSystemError::NotSupported); } + fn send(&self, message_header: &mut MessageHeader) -> super::Result { + if let Some(proxy) = self.proxy.as_ref() { + return proxy.send(message_header); + } + + return Err(FileSystemError::NotSupported); + } + fn recv(&self, message_header: &mut MessageHeader, non_block: bool) -> super::Result { if let Some(proxy) = self.proxy.as_ref() { return proxy.recv(message_header, non_block); diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index f484a8dd6d4..7b0284be28b 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -244,6 +244,10 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSocket) } + fn send(&self, _message_hdr: &mut MessageHeader) -> Result { + Err(FileSystemError::NotSupported) + } + fn recv(&self, _message_header: &mut MessageHeader, _non_block: bool) -> Result { Err(FileSystemError::NotSocket) } diff --git a/src/aero_kernel/src/net/checksum.rs b/src/aero_kernel/src/net/checksum.rs new file mode 100644 index 00000000000..250cf2124fe --- /dev/null +++ b/src/aero_kernel/src/net/checksum.rs @@ -0,0 +1,76 @@ +use simple_endian::BigEndian; + +use super::ip::{self, Ipv4Addr}; + +#[repr(C, packed)] +pub struct PseudoHeader { + src_ip: Ipv4Addr, + dst_ip: Ipv4Addr, + reserved: u8, + ty: ip::Type, + size: BigEndian, +} + +impl PseudoHeader { + pub fn new(ip_hdr: &ip::Header) -> PseudoHeader { + let len = ip_hdr.length; + PseudoHeader { + src_ip: ip_hdr.src_ip, + dst_ip: ip_hdr.dest_ip, + reserved: 0, + ty: ip_hdr.protocol, + size: BigEndian::from(len.to_native() - core::mem::size_of::() as u16), + } + } +} + +/// Compute the 32-bit internet checksum for `data`. +fn calculate_checksum(data: &[u8]) -> u32 { + let bytes = unsafe { + core::slice::from_raw_parts( + data.as_ptr() as *const BigEndian, + data.len() / core::mem::size_of::(), + ) + }; + + let mut sum = 0; + + for i in 0..(data.len() / 2) { + sum += bytes[i].to_native() as u32 + } + + // Add left-over byte, if any. + if data.len() % 2 == 1 { + sum += ((*data.last().unwrap()) as u32) << 8; + } + + sum +} + +/// Folds the 32-bit sum (`sum`) to 16 bits in the network byte order. +pub fn make(mut sum: u32) -> BigEndian { + while (sum >> 16) != 0 { + sum = (sum & 0xffff) + (sum >> 16); + } + + BigEndian::from(!(sum as u16)) +} + +/// Combine several RFC 1071 compliant checksums. +pub fn make_combine(a: &[u32]) -> BigEndian { + make(a.iter().sum()) +} + +/// Compute the internet checksum for `value`. +pub fn calculate(value: &T) -> u32 { + let bytes = unsafe { + core::slice::from_raw_parts(value as *const _ as *const u8, core::mem::size_of::()) + }; + calculate_checksum(bytes) +} + +/// Compute the internet checksum for `value` of `size`. +pub fn calculate_with_len(value: &T, size: usize) -> u32 { + let bytes = unsafe { core::slice::from_raw_parts(value as *const _ as *const u8, size) }; + calculate_checksum(bytes) +} diff --git a/src/aero_kernel/src/net/dhcp.rs b/src/aero_kernel/src/net/dhcp.rs deleted file mode 100644 index c728e468b70..00000000000 --- a/src/aero_kernel/src/net/dhcp.rs +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ - -// Dynamic Host Configuration Protocol - -use byteorder::{ByteOrder, NetworkEndian}; -use simple_endian::BigEndian; - -use super::ip::Ipv4Addr; -use super::udp::{self, Udp}; -use super::{ConstPacketKind, Packet, PacketDownHierarchy, PacketHeader, PacketUpHierarchy}; - -const DHCP_XID: u32 = 0x43424140; - -#[repr(u8)] -enum DhcpType { - BootRequest = 1u8.swap_bytes(), - BootReply = 2u8.swap_bytes(), -} - -#[repr(u8)] -enum HType { - Ethernet = 1u8.swap_bytes(), -} - -#[repr(C, packed)] -struct Header { - op: DhcpType, - htype: HType, - hlen: BigEndian, - hops: BigEndian, - xid: BigEndian, - seconds: BigEndian, - flags: BigEndian, - client_ip: Ipv4Addr, - your_ip: Ipv4Addr, - server_ip: Ipv4Addr, - gateway_ip: Ipv4Addr, - client_hw_addr: [u8; 16], - server_name: [u8; 64], - file: [u8; 128], - options: [u8; 64], -} - -impl Header { - fn options_mut(&mut self) -> OptionsWriter<'_> { - OptionsWriter::new(&mut self.options) - } -} - -pub struct Dhcp; - -impl ConstPacketKind for Dhcp { - const HSIZE: usize = core::mem::size_of::
(); -} - -impl PacketUpHierarchy for Packet {} -impl PacketHeader
for Packet { - fn send(&self) { - self.downgrade().send() // send the UDP packet - } -} - -#[repr(u8)] -enum MessageType { - Discover = 1u8.swap_bytes(), -} - -#[repr(u8)] -enum DhcpOption { - HostName = 12, - MessageType = 53, - ParameterRequestList = 55, - ClientIdentifier = 61, - End = 255, -} - -struct OptionsWriter<'a>(&'a mut [u8]); - -impl<'a> OptionsWriter<'a> { - fn new(options: &'a mut [u8]) -> Self { - options.fill(0); - Self(options).set_magic_cookie() - } - - fn insert(&mut self, kind: DhcpOption, data: &'_ [u8]) { - let total_len = 2 + data.len(); - - assert!(data.len() < u8::MAX as _); - assert!(self.0.len() > total_len); - - let (buf, rest) = core::mem::take(&mut self.0).split_at_mut(total_len); - self.0 = rest; - - buf[0] = kind as u8; - buf[1] = data.len() as _; - buf[2..].copy_from_slice(data); - } - - fn insert_padding(&mut self, size: usize) { - let (buf, rest) = core::mem::take(&mut self.0).split_at_mut(size); - self.0 = rest; - - buf.fill(0); - } - - fn set_magic_cookie(mut self) -> Self { - let (buf, rest) = core::mem::take(&mut self.0).split_at_mut(core::mem::size_of::()); - - // The first four octets of the 'options' field of the DHCP message - // contain the (decimal) values 99, 130, 83 and 99, respectively. - // - // CC: (https://www.rfc-editor.org/rfc/rfc2131#section-3) - NetworkEndian::write_u32(buf, 0x63825363); - self.0 = rest; - self - } - - fn set_message_type(mut self, typ: MessageType) -> Self { - self.insert(DhcpOption::MessageType, &[typ as u8]); - self - } - - fn set_parameter_request_list(mut self) -> Self { - // TODO: Take all of the request flags as an argument. - self.insert( - DhcpOption::ParameterRequestList, - &[ - 1, // Subnet Mask - 3, // Router - 15, // Domain Name - 6, // Domain Server - ], - ); - self - } - - fn set_client_identifier(mut self) -> Self { - let mac = super::default_device().mac(); - - let mut data = [0; 7]; - data[0] = HType::Ethernet as u8; - data[1..].copy_from_slice(mac.0.as_slice()); - - self.insert(DhcpOption::ClientIdentifier, data.as_slice()); - self - } - - fn set_host_name(mut self, name: &str) -> Self { - self.insert(DhcpOption::HostName, name.as_bytes()); - self.insert_padding(1); // null-terminator - self - } -} - -impl<'a> Drop for OptionsWriter<'a> { - fn drop(&mut self) { - self.insert(DhcpOption::End, &[]); - } -} - -pub fn init() { - // Send DHCP discover message. - let mut packet = Packet::::create(68, 67, Dhcp::HSIZE, Ipv4Addr::BROADCAST).upgrade(); - let header = packet.header_mut(); - - header.htype = HType::Ethernet; - header.hlen = BigEndian::::from(6); - header.hops = BigEndian::::from(0); - header.xid = BigEndian::::from(DHCP_XID); - header.seconds = BigEndian::::from(0); - { - // Set the HW address. - let mac = super::default_device().mac(); - header.client_hw_addr[0..6].copy_from_slice(mac.0.as_slice()); - header.client_hw_addr[6..].fill(0); - } - header.server_name.fill(0); - header.file.fill(0); - header.options.fill(0); - - header.op = DhcpType::BootRequest; - header.flags = BigEndian::from(0x8000); // broadcast - header.client_ip = Ipv4Addr::EMPTY; - header.your_ip = Ipv4Addr::EMPTY; - header.server_ip = Ipv4Addr::EMPTY; - header.gateway_ip = Ipv4Addr::EMPTY; - - let _ = header - .options_mut() - .set_message_type(MessageType::Discover) - .set_host_name("Aero") - .set_client_identifier() - .set_parameter_request_list(); - - packet.send() -} diff --git a/src/aero_kernel/src/net/ip.rs b/src/aero_kernel/src/net/ip.rs index 838221b0aca..93d23082ece 100644 --- a/src/aero_kernel/src/net/ip.rs +++ b/src/aero_kernel/src/net/ip.rs @@ -27,11 +27,15 @@ use super::*; pub const ADDR_SIZE: usize = 4; #[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)] +#[repr(C)] pub struct Ipv4Addr(pub [u8; ADDR_SIZE]); impl Ipv4Addr { pub const BROADCAST: Self = Self([0xff; ADDR_SIZE]); - pub const EMPTY: Self = Self([0x00; ADDR_SIZE]); + + pub fn new(addr: [u8; ADDR_SIZE]) -> Self { + Self(addr) + } } #[derive(Debug, Copy, Clone)] @@ -89,8 +93,7 @@ impl Packet { // FIXME: Set the source IPv4 address. header.src_ip = Ipv4Addr([0; 4]); - - // TODO: Header checksum + header.hcrc = checksum::make(checksum::calculate(header)); packet } } @@ -98,14 +101,6 @@ impl Packet { impl PacketUpHierarchy for Packet {} impl PacketHeader
for Packet { fn send(&self) { - { - let mut this = self.clone(); - let header = this.header_mut(); - { - header.hcrc = BigEndian::from(0); - // FIXME: - } - } self.downgrade().send() // send the ethernet packet } } diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 41558718de4..5120b72180a 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -23,7 +23,7 @@ use alloc::{sync::Arc, vec::Vec}; use spin::RwLock; pub mod arp; -pub mod dhcp; +mod checksum; pub mod ethernet; pub mod ip; pub mod udp; @@ -78,6 +78,15 @@ pub trait PacketBaseTrait { pub trait PacketTrait: PacketBaseTrait { fn header_size(&self) -> usize; + + fn as_slice_mut(&mut self) -> &mut [u8] { + let hsize = self.header_size(); + + let start = self.addr() + hsize; + let size = self.len() - hsize; + + unsafe { core::slice::from_raw_parts_mut(start.as_mut_ptr(), size) } + } } impl PacketTrait for Packet { @@ -184,5 +193,4 @@ pub fn init() { arp::init(); log::info!("net::arp: initialized cache"); - dhcp::init(); } diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs index 51733d2cc78..c7f5f322a1c 100644 --- a/src/aero_kernel/src/net/udp.rs +++ b/src/aero_kernel/src/net/udp.rs @@ -17,10 +17,13 @@ * along with Aero. If not, see . */ +use alloc::collections::BTreeMap; +use alloc::sync::Arc; use simple_endian::BigEndian; +use spin::RwLock; use super::ip::{Ipv4, Ipv4Addr}; -use super::{ip, PacketDownHierarchy}; +use super::{checksum, ip, PacketDownHierarchy}; use super::{ConstPacketKind, Packet, PacketHeader, PacketUpHierarchy}; @@ -70,8 +73,52 @@ pub struct Header { } impl Header { - fn compute_checksum(&mut self, _header: &ip::Header) { + fn compute_checksum(&mut self, header: &ip::Header) { self.crc = BigEndian::from(0); - // FIXME: + + let length = self.len; + self.crc = checksum::make_combine(&[ + checksum::calculate(&checksum::PseudoHeader::new(header)), + checksum::calculate_with_len(self, length.to_native() as usize), + ]); } } + +static HANDLERS: RwLock>> = RwLock::new(BTreeMap::new()); + +pub trait UdpHandler: Send + Sync {} + +pub fn alloc_ephemeral_port(socket: Arc) -> Option { + const EPHEMERAL_START: u16 = 49152; + const EPHEMERAL_END: u16 = u16::MAX; + + let mut handlers = HANDLERS.write(); + + // Ephemeral ports in the range 49152..65535 are not + // assigned, controlled, or registered and are used + // for temporary or private ports. + for port in EPHEMERAL_START..=EPHEMERAL_END { + if handlers.contains_key(&port) { + continue; + } + + handlers.insert(port, socket); + return Some(port); + } + + None +} + +pub fn bind(port: u16, socket: Arc) { + log::trace!("udp: bind(port={port})"); + + let mut handlers = HANDLERS.write(); + // check if the port is already in use + assert!(!handlers.contains_key(&port)); + + handlers.insert(port, socket); +} + +pub fn connect(host: Ipv4Addr, port: u16) { + log::trace!("udp: connect(host={host:?}, port={port})"); +} diff --git a/src/aero_kernel/src/socket/inet.rs b/src/aero_kernel/src/socket/inet.rs index 863f29e2843..dbd7bfaaf3f 100644 --- a/src/aero_kernel/src/socket/inet.rs +++ b/src/aero_kernel/src/socket/inet.rs @@ -17,12 +17,148 @@ * along with Aero. If not, see . */ -use alloc::sync::Arc; +use aero_syscall::{IpProtocol, SocketAddrInet, SocketType, SyscallError}; +use alloc::sync::{Arc, Weak}; +use alloc::vec::Vec; -pub struct InetSocket {} +use crate::fs::inode::{FileType, INodeInterface, Metadata}; +use crate::fs::{self, FileSystemError}; +use crate::net::ip::Ipv4Addr; +use crate::net::udp::{self, Udp, UdpHandler}; +use crate::net::{Packet, PacketHeader, PacketTrait}; +use crate::utils::sync::Mutex; + +#[derive(Default)] +enum SocketState { + /// The socket is not connected. + #[default] + Disconnected, + Connected(SocketAddrInet), +} + +#[derive(Default)] +struct InetSocketInner { + /// The address that the socket has been bound to. + address: Option, + state: SocketState, +} + +pub struct InetSocket { + typ: SocketType, + protocol: IpProtocol, + inner: Mutex, + + sref: Weak, +} impl InetSocket { - pub fn new() -> Arc { - Arc::new(Self {}) + pub fn new(typ: SocketType, protocol: IpProtocol) -> Result, SyscallError> { + Ok(Arc::new_cyclic(|sref| Self { + typ, + protocol, + + inner: Mutex::new(Default::default()), + sref: sref.clone(), + })) + } + + fn sref(&self) -> Arc { + self.sref.upgrade().unwrap() + } + + fn set_state(&self, state: SocketState) { + self.inner.lock_irq().state = state; + } + + fn set_addr(&self, addr: SocketAddrInet) { + self.inner.lock_irq().address = Some(addr); + } + + fn src_port(&self) -> Option { + self.inner + .lock_irq() + .address + .as_ref() + .map(|e| e.port.to_native()) + } + + fn dest(&self) -> SocketAddrInet { + match &self.inner.lock_irq().state { + SocketState::Connected(addr) => addr.clone(), + _ => unreachable!(), + } } } + +impl INodeInterface for InetSocket { + fn metadata(&self) -> fs::Result { + Ok(Metadata { + id: 0, + file_type: FileType::Socket, + size: 0, + children_len: 0, + }) + } + + fn bind(&self, address: super::SocketAddr, _length: usize) -> fs::Result<()> { + let address = address.as_inet().ok_or(FileSystemError::NotSupported)?; + + match (self.typ, self.protocol) { + (SocketType::Dgram, IpProtocol::Default) => { + self.set_addr(address.clone()); + udp::bind(address.port.to_native(), self.sref()); + Ok(()) + } + + _ => unreachable!(), + } + } + + fn connect(&self, address: super::SocketAddr, _length: usize) -> fs::Result<()> { + let address = address.as_inet().ok_or(FileSystemError::NotSupported)?; + + match (self.typ, self.protocol) { + (SocketType::Dgram, IpProtocol::Default) => { + let host_addr = Ipv4Addr::new(address.sin_addr.addr.to_be_bytes()); + udp::connect(host_addr, address.port.to_native()); + + self.set_state(SocketState::Connected(address.clone())); + Ok(()) + } + + _ => unreachable!(), + } + } + + fn send(&self, message_hdr: &mut aero_syscall::socket::MessageHeader) -> fs::Result { + let name = message_hdr + .name_mut::() + .cloned() + .unwrap_or_else(|| self.dest()); + + let dest_port = name.port.to_native(); + let dest_ip = Ipv4Addr::new(name.addr()); + + let src_port = self.src_port().unwrap_or_else(|| { + udp::alloc_ephemeral_port(self.sref()).expect("inet: out of ephemeral ports") + }); + + let data = message_hdr + .iovecs() + .iter() + .map(|e| e.as_slice()) + .flatten() + .copied() + .collect::>(); + + let mut packet = Packet::::create(src_port, dest_port, data.len(), dest_ip); + + let dest = packet.as_slice_mut(); + dest.copy_from_slice(data.as_slice()); + + packet.send(); + Ok(data.len()) + } +} + +impl UdpHandler for InetSocket {} diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 2c18a34d907..733b1ee8ae3 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -409,7 +409,7 @@ impl INodeInterface for UnixSocket { Ok(header .iovecs_mut() .iter_mut() - .map(|iovec| buffer.read(iovec.as_mut_slice())) + .map(|iovec| buffer.read(iovec.as_slice_mut())) .sum::()) } diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index ba6301b5cf8..b240cfd3151 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -287,6 +287,7 @@ pub fn generic_do_syscall( SYS_LISTEN => net::listen(b, c), SYS_ACCEPT => net::accept(b, c, d), SYS_SOCK_RECV => net::sock_recv(b, c, d), + SYS_SOCK_SEND => net::sock_send(b, c, d), SYS_SOCKET_PAIR => net::socket_pair(b, c, d, e), SYS_GETTIME => time::gettime(b, c), diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index 0d294c47e5a..e8b3f8e66ee 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -1,10 +1,15 @@ +use num_traits::cast::FromPrimitive; + use aero_syscall::socket::MessageHeader; use aero_syscall::*; +use alloc::sync::Arc; use crate::fs::cache::DirCacheItem; use crate::fs::inode::DirEntry; +use crate::fs::inode::INodeInterface; use crate::mem::paging::VirtAddr; +use crate::socket::inet::InetSocket; use crate::socket::unix::*; use crate::socket::SocketAddr; @@ -61,6 +66,23 @@ pub fn accept(fd: usize, address: usize, length: usize) -> Result Result { + assert!(flags == 0, "sock_send: flags are not currently supported"); + + let current_task = scheduler::get_scheduler().current_task(); + let socket = current_task + .file_table + .get_handle(fd) + .ok_or(SyscallError::EINVAL)?; + + Ok(socket.inode().send(header)?) +} + #[syscall] pub fn sock_recv( sockfd: usize, @@ -98,11 +120,16 @@ fn create_socket( socket_type: usize, protocol: usize, ) -> Result { + let typ = SocketType::from_usize(socket_type).ok_or(SyscallError::EINVAL)?; + let protocol = IpProtocol::from_usize(protocol).ok_or(SyscallError::EINVAL)?; + let socket = match domain as u32 { - AF_UNIX => UnixSocket::new(), + AF_UNIX => UnixSocket::new() as Arc, + PF_INET => InetSocket::new(typ, protocol)? as Arc, + _ => { log::warn!( - "unsupported socket type: domain={domain}, socket_type={socket_type}, protocol={protocol}" + "unsupported socket type: domain={domain}, socket_type={socket_type}, protocol={protocol:?}" ); return Err(SyscallError::EINVAL); diff --git a/src/aero_syscall/Cargo.toml b/src/aero_syscall/Cargo.toml index a371ea5b74b..f5852b26768 100644 --- a/src/aero_syscall/Cargo.toml +++ b/src/aero_syscall/Cargo.toml @@ -6,3 +6,17 @@ edition = "2021" [dependencies] bitflags = "1.2.1" +num-derive = { version = "0.3", default-features = false } +num-traits = { version = "0.2", default-features = false } +simple_endian = { git = "https://github.com/michalfita/simple-endian-rs", branch = "bugfix/4/fix-no_std-support-right-way", default_features = false, features = [ + "bitwise", + "comparisons", + "format", + "math_ops", + "neg_ops", + "shift_ops", + "both_endian", + "float_impls", + "integer_impls", + "byte_impls", +] } diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 52f3c96bd34..49b54c3b7e8 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -90,6 +90,7 @@ pub const SYS_GETPPID: usize = 66; pub const SYS_SOCKET_PAIR: usize = 67; pub const SYS_RENAME: usize = 68; pub const SYS_MPROTECT: usize = 69; // haha funny number +pub const SYS_SOCK_SEND: usize = 70; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index ce1ec909f0d..8efa8e34e82 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -20,12 +20,17 @@ #![no_std] #![feature(decl_macro)] +#[macro_use] +extern crate num_derive; + pub mod consts; pub mod signal; pub mod socket; pub mod syscall; pub mod time; +use simple_endian::BigEndian; + pub use crate::syscall::*; pub mod prelude { @@ -663,30 +668,69 @@ impl Default for SocketAddrUnix { } } +#[derive(Debug, Clone)] +#[repr(C)] +pub struct InAddr { + pub addr: u32, +} + #[derive(Debug, Clone)] #[repr(C)] pub struct SocketAddrInet { pub family: u32, - pub port: [u8; 2], - pub address: [u8; 4], + pub port: BigEndian, + pub sin_addr: InAddr, pub padding: [u8; 8], } +impl SocketAddrInet { + pub fn addr(&self) -> [u8; 4] { + self.sin_addr.addr.to_be_bytes() + } +} + impl SocketAddr for SocketAddrUnix {} impl SocketAddr for SocketAddrInet {} -// constants for the socket types: -// -// mlibc/sysdeps/aero/include/abi-bits/socket.h -pub const SOCK_DGRAM: usize = 1; -pub const SOCK_RAW: usize = 2; -pub const SOCK_SEQPACKET: usize = 3; -pub const SOCK_STREAM: usize = 4; +// mlibc/abi-bits/mlibc/in.h +#[derive(Debug, Copy, Clone, FromPrimitive, PartialEq)] +pub enum IpProtocol { + Default = 0, + Ip = 1, + Ipv6 = 2, + Icmp = 3, + Raw = 4, + Tcp = 5, + Udp = 6, + Igmp = 7, + Ipip = 8, + Dccp = 33, + Routing = 43, + Gre = 47, + Esp = 50, + Ah = 51, + Icmpv6 = 58, + Dstopts = 60, + Comp = 108, + Sctp = 132, + Max = 256, +} + +// mlibc/abi-bits/mlibc/socket.h +#[derive(Debug, Copy, Clone, FromPrimitive, PartialEq)] +pub enum SocketType { + Dgram = 1, + Raw = 2, + SeqPacket = 3, + Stream = 4, + Dccp = 5, +} bitflags::bitflags! { pub struct SocketFlags: usize { const NONBLOCK = 0x10000; - const CLOEXEC = 0x20000; + const CLOEXEC = 0x20000; + const RDM = 0x40000; } } diff --git a/src/aero_syscall/src/socket.rs b/src/aero_syscall/src/socket.rs index a01d2f65b0c..e25003e2746 100644 --- a/src/aero_syscall/src/socket.rs +++ b/src/aero_syscall/src/socket.rs @@ -53,7 +53,12 @@ pub struct IoVec { } impl IoVec { - pub fn as_mut_slice(&mut self) -> &mut [u8] { + pub fn as_slice(&self) -> &[u8] { + // SAFETY: We know that the `base` pointer is valid and initialized. + unsafe { core::slice::from_raw_parts_mut(self.base, self.len) } + } + + pub fn as_slice_mut(&mut self) -> &mut [u8] { // SAFETY: We know that the `base` pointer is valid, initialized and we have // exclusive access so, its safe to construct a mutable slice from it. unsafe { core::slice::from_raw_parts_mut(self.base, self.len) } diff --git a/userland/Cargo.lock b/userland/Cargo.lock index 276703d9a8c..f9e33fd2825 100644 --- a/userland/Cargo.lock +++ b/userland/Cargo.lock @@ -19,7 +19,6 @@ version = "0.1.0" dependencies = [ "aero_ipc", "aero_syscall", - "libc 0.2.125", ] [[package]] @@ -27,6 +26,9 @@ name = "aero_syscall" version = "0.1.0" dependencies = [ "bitflags", + "num-derive", + "num-traits", + "simple_endian", ] [[package]] @@ -86,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", - "libc 0.2.139", + "libc", "wasi", ] @@ -127,7 +129,6 @@ name = "init" version = "0.1.0" dependencies = [ "aero_syscall", - "libc 0.2.125", ] [[package]] @@ -139,11 +140,6 @@ dependencies = [ "spin 0.5.2", ] -[[package]] -name = "libc" -version = "0.2.125" -source = "git+https://github.com/andy-Python-Programmer/libc#403b85dfae3708de1328a8c4b246c437194b8e6d" - [[package]] name = "libc" version = "0.2.139" @@ -160,6 +156,26 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + [[package]] name = "once_cell" version = "1.17.1" @@ -242,6 +258,11 @@ dependencies = [ "syn", ] +[[package]] +name = "simple_endian" +version = "0.2.1" +source = "git+https://github.com/michalfita/simple-endian-rs?branch=bugfix/4/fix-no_std-support-right-way#7210f40881d16f7f2e3d8d40f6381fa222843caa" + [[package]] name = "spin" version = "0.5.2" diff --git a/userland/apps/aero_shell/Cargo.toml b/userland/apps/aero_shell/Cargo.toml index 543df72bdaf..a54ac524191 100644 --- a/userland/apps/aero_shell/Cargo.toml +++ b/userland/apps/aero_shell/Cargo.toml @@ -7,4 +7,3 @@ edition = "2021" [dependencies] aero_syscall = { path = "../../../src/aero_syscall" } aero_ipc = { path = "../../libs/aero_ipc" } -libc = { git = "https://github.com/andy-Python-Programmer/libc" } diff --git a/userland/apps/aero_shell/src/main.rs b/userland/apps/aero_shell/src/main.rs index 5a097c20901..98ad84deee9 100644 --- a/userland/apps/aero_shell/src/main.rs +++ b/userland/apps/aero_shell/src/main.rs @@ -25,7 +25,6 @@ use std::io::{BufRead, BufReader}; use std::fs::File; use std::fs; -use std::process; use aero_ipc::SystemService; use aero_syscall::*; @@ -440,19 +439,18 @@ fn uname() -> Result<(), SyscallError> { Ok(()) } -fn handle_segmentation_fault(_fault: usize) { - error!("segmentation fault"); - process::exit(1); -} +// fn handle_segmentation_fault(_fault: usize) { +// error!("segmentation fault"); +// process::exit(1); +// } -/// Sets the disposition of the signal number to handler. -fn install_sighandler(signum: libc::c_int, handler: fn(usize)) -> libc::sighandler_t { - unsafe { libc::signal(signum, handler as libc::sighandler_t) } -} +// fn install_sighandler(signum: libc::c_int, handler: fn(usize)) -> libc::sighandler_t { +// unsafe { libc::signal(signum, handler as libc::sighandler_t) } +// } fn main() { // install all the necessary signal handlers. - install_sighandler(libc::SIGSEGV, handle_segmentation_fault); + // install_sighandler(libc::SIGSEGV, handle_segmentation_fault); let mut history = vec![]; diff --git a/userland/apps/init/Cargo.toml b/userland/apps/init/Cargo.toml index 3c879f68388..6b32449314a 100644 --- a/userland/apps/init/Cargo.toml +++ b/userland/apps/init/Cargo.toml @@ -6,4 +6,3 @@ edition = "2021" [dependencies] aero_syscall = { path = "../../../src/aero_syscall" } -libc = { git = "https://github.com/Andy-Python-Programmer/libc" } diff --git a/userland/apps/init/src/main.rs b/userland/apps/init/src/main.rs index de4f84c33f5..29234703bfe 100644 --- a/userland/apps/init/src/main.rs +++ b/userland/apps/init/src/main.rs @@ -34,6 +34,7 @@ fn main() -> Result<(), Box> { mem::forget(OpenOptions::new().write(true).open(TTY_PATH)?); // fd=1 for stdout mem::forget(OpenOptions::new().write(true).open(TTY_PATH)?); // fd=2 for stderr + Command::new("dhcpd").spawn()?; Command::new("startx") .env("RUST_BACKTRACE", "full") .spawn()?; From d29cb6694f692816b64c74d74847436acb1bcfc1 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 27 Feb 2023 19:12:39 +1100 Subject: [PATCH 133/368] INodeInterface::recv: dont take `non-block` Do not take `non_block` as a parameter for `recv` since you can check if the file handle has NON_BLOCK flag set inside the inode. Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/mod.rs | 8 ++++---- src/aero_kernel/src/fs/inode.rs | 2 +- src/aero_kernel/src/socket/unix.rs | 4 ++-- src/aero_kernel/src/syscall/net.rs | 3 +-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 10be15572f3..7420d8d9ce2 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -549,17 +549,17 @@ impl INodeInterface for INode { return Err(FileSystemError::NotSupported); } - fn send(&self, message_header: &mut MessageHeader) -> super::Result { + fn send(&self, message_hdr: &mut MessageHeader) -> super::Result { if let Some(proxy) = self.proxy.as_ref() { - return proxy.send(message_header); + return proxy.send(message_hdr); } return Err(FileSystemError::NotSupported); } - fn recv(&self, message_header: &mut MessageHeader, non_block: bool) -> super::Result { + fn recv(&self, message_hdr: &mut MessageHeader) -> super::Result { if let Some(proxy) = self.proxy.as_ref() { - return proxy.recv(message_header, non_block); + return proxy.recv(message_hdr); } return Err(FileSystemError::NotSupported); diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 7b0284be28b..6f07dddd8dc 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -248,7 +248,7 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSupported) } - fn recv(&self, _message_header: &mut MessageHeader, _non_block: bool) -> Result { + fn recv(&self, _message_hdr: &mut MessageHeader) -> Result { Err(FileSystemError::NotSocket) } diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 733b1ee8ae3..bc5aea3ec2c 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -388,7 +388,7 @@ impl INodeInterface for UnixSocket { Ok(sock) } - fn recv(&self, header: &mut MessageHeader, non_block: bool) -> fs::Result { + fn recv(&self, header: &mut MessageHeader) -> fs::Result { let inner = self.inner.lock_irq(); let peer = match &inner.state { @@ -396,7 +396,7 @@ impl INodeInterface for UnixSocket { _ => return Err(FileSystemError::NotConnected), }; - if self.buffer.lock_irq().is_empty() && non_block { + if self.buffer.lock_irq().is_empty() && self.is_non_block() { return Err(FileSystemError::WouldBlock); } diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index e8b3f8e66ee..df3b5f5cf17 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -97,8 +97,7 @@ pub fn sock_recv( .get_handle(sockfd) .ok_or(SyscallError::EINVAL)?; - let non_block = socket.flags.read().contains(OpenFlags::O_NONBLOCK); - Ok(socket.inode().recv(header, non_block)?) + Ok(socket.inode().recv(header)?) } /// Marks the socket as a passive socket (i.e. as a socket that will be used to accept incoming From 50b9e44dc594d49f93c0304bccd0842ff36372c1 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 2 Mar 2023 17:01:49 +1100 Subject: [PATCH 134/368] Socket::INet: recv Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/e1000.rs | 2 +- src/aero_kernel/src/net/ethernet.rs | 9 +++ src/aero_kernel/src/net/ip.rs | 17 ++++++ src/aero_kernel/src/net/mod.rs | 14 ++++- src/aero_kernel/src/net/udp.rs | 20 +++++- src/aero_kernel/src/socket/inet.rs | 91 +++++++++++++++++++++++++--- src/aero_kernel/src/syscall/fs.rs | 2 +- src/aero_kernel/src/syscall/net.rs | 2 +- 8 files changed, 143 insertions(+), 14 deletions(-) diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index 2e6728f5852..f6bb23d28db 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -592,7 +592,7 @@ impl Device { } fn handle_irq(&self) { - self.e1000.lock().handle_irq() + self.e1000.lock_irq().handle_irq() } } diff --git a/src/aero_kernel/src/net/ethernet.rs b/src/aero_kernel/src/net/ethernet.rs index fbaf49bf163..ecb45b9257a 100644 --- a/src/aero_kernel/src/net/ethernet.rs +++ b/src/aero_kernel/src/net/ethernet.rs @@ -85,4 +85,13 @@ impl PacketHeader
for Packet { super::default_device().send(packet); } } + + fn recv(&self) { + match self.header().typ { + Type::Ip => { + let packet: Packet = self.upgrade(); + packet.recv() + } + } + } } diff --git a/src/aero_kernel/src/net/ip.rs b/src/aero_kernel/src/net/ip.rs index 93d23082ece..1f4cb176661 100644 --- a/src/aero_kernel/src/net/ip.rs +++ b/src/aero_kernel/src/net/ip.rs @@ -63,6 +63,10 @@ impl Header { fn set_length(&mut self, length: u16) { self.length = BigEndian::from(length); } + + fn length(&self) -> BigEndian { + self.length + } } #[derive(Clone)] @@ -103,4 +107,17 @@ impl PacketHeader
for Packet { fn send(&self) { self.downgrade().send() // send the ethernet packet } + + fn recv(&self) { + let mut packet = self.clone(); + let header = self.header(); + + packet.len = header.length().to_native() as usize; + match header.protocol { + Type::Udp => { + let packet: Packet = packet.upgrade(); + packet.recv(); + } + } + } } diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 5120b72180a..ff7ef74de96 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -79,6 +79,7 @@ pub trait PacketBaseTrait { pub trait PacketTrait: PacketBaseTrait { fn header_size(&self) -> usize; + // TODO: Rename as_slice{_mut} to payload{_mut}? fn as_slice_mut(&mut self) -> &mut [u8] { let hsize = self.header_size(); @@ -87,6 +88,15 @@ pub trait PacketTrait: PacketBaseTrait { unsafe { core::slice::from_raw_parts_mut(start.as_mut_ptr(), size) } } + + fn as_slice(&self) -> &[u8] { + let hsize = self.header_size(); + + let start = self.addr() + hsize; + let size = self.len() - hsize; + + unsafe { core::slice::from_raw_parts(start.as_ptr(), size) } + } } impl PacketTrait for Packet { @@ -138,6 +148,7 @@ pub trait PacketDownHierarchy: PacketBaseTrait { pub trait PacketHeader: PacketBaseTrait { fn send(&self); + fn recv(&self); fn header(&self) -> &H { self.addr().read_mut::().unwrap() @@ -155,9 +166,8 @@ fn packet_processor_thread() { let device = default_device(); loop { - log::debug!("bruh!"); let packet = device.recv(); - log::debug!("{packet:?}"); + packet.packet.recv(); } } diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs index c7f5f322a1c..3776e718b08 100644 --- a/src/aero_kernel/src/net/udp.rs +++ b/src/aero_kernel/src/net/udp.rs @@ -62,6 +62,18 @@ impl PacketHeader
for Packet { self.downgrade().send() // send the IP packet } + + fn recv(&self) { + let header = self.header(); + let dest_port = header.dst_port().to_native(); + + let handlers = HANDLERS.read(); + let handler = handlers + .get(&dest_port) + .expect("udp: no handler registered"); + + handler.recv(self.clone()) + } } #[repr(C, packed)] @@ -82,11 +94,17 @@ impl Header { checksum::calculate_with_len(self, length.to_native() as usize), ]); } + + fn dst_port(&self) -> BigEndian { + self.dst_port + } } static HANDLERS: RwLock>> = RwLock::new(BTreeMap::new()); -pub trait UdpHandler: Send + Sync {} +pub trait UdpHandler: Send + Sync { + fn recv(&self, packet: Packet); +} pub fn alloc_ephemeral_port(socket: Arc) -> Option { const EPHEMERAL_START: u16 = 49152; diff --git a/src/aero_kernel/src/socket/inet.rs b/src/aero_kernel/src/socket/inet.rs index dbd7bfaaf3f..e6fcf15a38a 100644 --- a/src/aero_kernel/src/socket/inet.rs +++ b/src/aero_kernel/src/socket/inet.rs @@ -17,16 +17,20 @@ * along with Aero. If not, see . */ -use aero_syscall::{IpProtocol, SocketAddrInet, SocketType, SyscallError}; +use aero_syscall::socket::MessageHeader; +use aero_syscall::{IpProtocol, OpenFlags, SocketAddrInet, SocketType, SyscallError}; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; +use spin::Once; -use crate::fs::inode::{FileType, INodeInterface, Metadata}; +use crate::fs::cache::DirCacheItem; +use crate::fs::file_table::FileHandle; +use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags}; use crate::fs::{self, FileSystemError}; use crate::net::ip::Ipv4Addr; use crate::net::udp::{self, Udp, UdpHandler}; use crate::net::{Packet, PacketHeader, PacketTrait}; -use crate::utils::sync::Mutex; +use crate::utils::sync::{BlockQueue, Mutex}; #[derive(Default)] enum SocketState { @@ -41,22 +45,32 @@ struct InetSocketInner { /// The address that the socket has been bound to. address: Option, state: SocketState, + incoming: Vec>, } pub struct InetSocket { typ: SocketType, protocol: IpProtocol, inner: Mutex, + wq: BlockQueue, + handle: Once>, sref: Weak, } impl InetSocket { pub fn new(typ: SocketType, protocol: IpProtocol) -> Result, SyscallError> { + if typ != SocketType::Dgram && protocol != IpProtocol::Udp { + return Err(SyscallError::EINVAL); + } + Ok(Arc::new_cyclic(|sref| Self { typ, protocol, + wq: BlockQueue::new(), + handle: Once::new(), + inner: Mutex::new(Default::default()), sref: sref.clone(), })) @@ -88,9 +102,27 @@ impl InetSocket { _ => unreachable!(), } } + + pub fn is_non_block(&self) -> bool { + self.handle + .get() + .expect("inet: not bound to an fd") + .flags + .read() + .contains(OpenFlags::O_NONBLOCK) + } } impl INodeInterface for InetSocket { + fn open( + &self, + _flags: aero_syscall::OpenFlags, + handle: Arc, + ) -> fs::Result> { + self.handle.call_once(|| handle); + Ok(None) + } + fn metadata(&self) -> fs::Result { Ok(Metadata { id: 0, @@ -130,7 +162,7 @@ impl INodeInterface for InetSocket { } } - fn send(&self, message_hdr: &mut aero_syscall::socket::MessageHeader) -> fs::Result { + fn send(&self, message_hdr: &mut MessageHeader) -> fs::Result { let name = message_hdr .name_mut::() .cloned() @@ -139,9 +171,17 @@ impl INodeInterface for InetSocket { let dest_port = name.port.to_native(); let dest_ip = Ipv4Addr::new(name.addr()); - let src_port = self.src_port().unwrap_or_else(|| { - udp::alloc_ephemeral_port(self.sref()).expect("inet: out of ephemeral ports") - }); + let src_port; + + if let Some(port) = self.src_port() { + src_port = port; + } else { + src_port = udp::alloc_ephemeral_port(self.sref()).ok_or(FileSystemError::WouldBlock)?; + log::debug!("Inet::send(): allocated ephemeral port {}", src_port); + + // FIXME: handle ephemeral port INET socket + return Err(FileSystemError::NotSupported); + } let data = message_hdr .iovecs() @@ -159,6 +199,41 @@ impl INodeInterface for InetSocket { packet.send(); Ok(data.len()) } + + fn recv(&self, message_hdr: &mut MessageHeader) -> fs::Result { + if self.inner.lock_irq().incoming.is_empty() && self.is_non_block() { + return Err(FileSystemError::WouldBlock); + } + + let mut this = self.wq.block_on(&self.inner, |e| !e.incoming.is_empty())?; + let packet = this.incoming.pop().expect("recv: someone was greedy"); + + let mut data = packet.as_slice().to_vec(); + + Ok(message_hdr + .iovecs_mut() + .iter_mut() + .map(|iovec| { + let iovec = iovec.as_slice_mut(); + let size = core::cmp::min(iovec.len(), data.len()); + iovec.copy_from_slice(&data.drain(..size).collect::>()); + size + }) + .sum::()) + } + + fn poll(&self, table: Option<&mut fs::inode::PollTable>) -> fs::Result { + if let Some(table) = table { + table.insert(&self.wq); + } + + Ok(PollFlags::OUT) + } } -impl UdpHandler for InetSocket {} +impl UdpHandler for InetSocket { + fn recv(&self, packet: Packet) { + self.inner.lock_irq().incoming.push(packet); + self.wq.notify_complete(); + } +} diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index ec677adba49..560d92b4b94 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -381,7 +381,7 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result { let flags = OpenFlags::from_bits_truncate(arg); - handle.flags.write().insert(flags); + *handle.flags.write() = flags; Ok(0) } diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index df3b5f5cf17..b7c78187de4 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -124,7 +124,7 @@ fn create_socket( let socket = match domain as u32 { AF_UNIX => UnixSocket::new() as Arc, - PF_INET => InetSocket::new(typ, protocol)? as Arc, + AF_INET => InetSocket::new(typ, protocol)? as Arc, _ => { log::warn!( From 3000bdca55eceebb77abb572628cda243a15bfd3 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 2 Mar 2023 17:42:20 +1100 Subject: [PATCH 135/368] fcntl: fix F_{GET, SET}FD Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/file_table.rs | 10 ++------- src/aero_kernel/src/syscall/fs.rs | 33 +++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index 1dc34bfd4f2..f67e7b55c3c 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -19,13 +19,12 @@ use core::sync::atomic::{AtomicUsize, Ordering}; -use aero_syscall::prelude::FdFlags; use aero_syscall::{OpenFlags, SysDirEntry}; use alloc::sync::Arc; use alloc::vec::Vec; -use spin::{Mutex, RwLock}; +use spin::RwLock; use crate::fs::cache::DirCacheImpl; @@ -46,7 +45,6 @@ pub struct FileHandle { // is duplicated, the `offset` needs to be in sync with the parent. pub offset: Arc, pub flags: RwLock, - pub fd_flags: Mutex, } impl FileHandle { @@ -57,7 +55,6 @@ impl FileHandle { inode: inode.clone(), offset: Arc::new(AtomicUsize::new(0)), flags: RwLock::new(flags), - fd_flags: Mutex::new(FdFlags::empty()), } } @@ -129,7 +126,6 @@ impl FileHandle { inode: self.inode.clone(), offset: self.offset.clone(), flags: RwLock::new(flags), - fd_flags: Mutex::new(self.fd_flags.lock().clone()), }); new.inode.inode().open(flags, new.clone())?; @@ -228,9 +224,7 @@ impl FileTable { if let Some(handle) = file { let flags = *handle.flags.read(); - if flags.contains(OpenFlags::O_CLOEXEC) - || handle.fd_flags.lock().contains(FdFlags::CLOEXEC) - { + if flags.contains(OpenFlags::O_CLOEXEC) { handle.inode().close(flags); *file = None; } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 560d92b4b94..45d650f8f73 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -236,7 +236,7 @@ pub fn ioctl(fd: usize, command: usize, argument: usize) -> Result { - handle.fd_flags.lock().insert(FdFlags::CLOEXEC); + handle.flags.write().insert(OpenFlags::O_CLOEXEC); Ok(0) } @@ -327,6 +327,14 @@ pub fn access(fd: usize, path: &Path, _mode: usize, _flags: usize) -> Result Result { let handle = scheduler::get_scheduler() @@ -361,14 +369,26 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result { - let flags = handle.fd_flags.lock().bits(); - Ok(flags) + let flags = handle.flags.read(); + let mut result = FdFlags::empty(); + + if flags.contains(OpenFlags::O_CLOEXEC) { + result.insert(FdFlags::CLOEXEC); + } + + Ok(result.bits()) } // Set the value of file descriptor flags: aero_syscall::prelude::F_SETFD => { - let flags = FdFlags::from_bits(arg).ok_or(SyscallError::EINVAL)?; - handle.fd_flags.lock().insert(flags); + let mut flags = handle.flags.write(); + let fd_flags = FdFlags::from_bits_truncate(arg); + + if fd_flags.contains(FdFlags::CLOEXEC) { + flags.insert(OpenFlags::O_CLOEXEC); + } else { + flags.remove(OpenFlags::O_CLOEXEC); + } Ok(0) } @@ -381,7 +401,8 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result { let flags = OpenFlags::from_bits_truncate(arg); - *handle.flags.write() = flags; + let old_flags = *handle.flags.read(); + *handle.flags.write() = (flags & SETFL_MASK) | (old_flags & !SETFL_MASK); Ok(0) } From 90422c2f5a979d013ec64cd3c3fa82a94d674096 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 2 Mar 2023 17:43:01 +1100 Subject: [PATCH 136/368] scheduler: switch to idle task when no the only task is not in a runnable state! Signed-off-by: Andy-Python-Programmer --- .../src/userland/scheduler/round_robin.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 203bf4c8143..135a47c4b6b 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -181,15 +181,16 @@ impl RoundRobin { queue.preempt_task.arch_task_mut(), current.arch_task(), ); + return; } - } else { - queue.current_task = None; - core::mem::drop(guard); - arch::task::arch_task_spinup( - queue.preempt_task.arch_task_mut(), - queue.idle_task.arch_task(), - ); } + + queue.current_task = None; + core::mem::drop(guard); + arch::task::arch_task_spinup( + queue.preempt_task.arch_task_mut(), + queue.idle_task.arch_task(), + ); } } } From 49de4dfc29a155964c5578aa7539fb474145e800 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 2 Mar 2023 17:50:34 +1100 Subject: [PATCH 137/368] init: ensure the std{in,out,err} are avaliable before the X session is started Signed-off-by: Andy-Python-Programmer --- bootstrap/net.yml | 2 +- userland/Cargo.lock | 8 ++++++- userland/apps/init/Cargo.toml | 1 + userland/apps/init/src/main.rs | 41 +++++++++++++++++++++++++--------- 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/bootstrap/net.yml b/bootstrap/net.yml index 605e1f6fb95..9f894b133dc 100644 --- a/bootstrap/net.yml +++ b/bootstrap/net.yml @@ -26,4 +26,4 @@ packages: - '@THIS_COLLECT_DIR@/usr' - '-j@PARALLELISM@' environ: - RUSTFLAGS: '-Cforce-frame-pointers=yes -Clink-args=-no-pie' \ No newline at end of file + RUSTFLAGS: '-Cforce-frame-pointers=yes -Clink-args=-no-pie' diff --git a/userland/Cargo.lock b/userland/Cargo.lock index f9e33fd2825..b5a98bd6974 100644 --- a/userland/Cargo.lock +++ b/userland/Cargo.lock @@ -88,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", - "libc", + "libc 0.2.139 (registry+https://github.com/rust-lang/crates.io-index)", "wasi", ] @@ -129,6 +129,7 @@ name = "init" version = "0.1.0" dependencies = [ "aero_syscall", + "libc 0.2.139 (git+https://github.com/Andy-Python-Programmer/libc)", ] [[package]] @@ -146,6 +147,11 @@ version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +[[package]] +name = "libc" +version = "0.2.139" +source = "git+https://github.com/Andy-Python-Programmer/libc#0a8654ec90fe3940d4a1750fcf69cf67f49bc2b9" + [[package]] name = "lock_api" version = "0.4.9" diff --git a/userland/apps/init/Cargo.toml b/userland/apps/init/Cargo.toml index 6b32449314a..3c879f68388 100644 --- a/userland/apps/init/Cargo.toml +++ b/userland/apps/init/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" [dependencies] aero_syscall = { path = "../../../src/aero_syscall" } +libc = { git = "https://github.com/Andy-Python-Programmer/libc" } diff --git a/userland/apps/init/src/main.rs b/userland/apps/init/src/main.rs index 29234703bfe..75001f5f583 100644 --- a/userland/apps/init/src/main.rs +++ b/userland/apps/init/src/main.rs @@ -18,26 +18,47 @@ */ use std::error::Error; -use std::fs::OpenOptions; +use std::fs::{File, OpenOptions}; +use std::os::fd::AsRawFd; use std::process::Command; -use std::mem; - const TTY_PATH: &str = "/dev/tty"; +fn remove_cloexec(file: &File) { + // By default rust automatically sets the close-on-exe flag to prevent + // leaking file descriptors. + // + // OpenOptions::custom_flags() only allows insertion of flags and are + // overwritten by the flags set by the standard library. So here, we + // need to manually update the flags after opening the file. + let fd = file.as_raw_fd(); + + unsafe { + assert!(libc::fcntl(fd, libc::F_SETFD, 0 /* flags */) == 0); + } +} + fn main() -> Result<(), Box> { // Open the stdin, stdout and stderr file descriptors. - // - // mem::forget(): don't drop the object which in turn will close the - // file. - mem::forget(OpenOptions::new().read(true).open(TTY_PATH)?); // fd=0 for stdin - mem::forget(OpenOptions::new().write(true).open(TTY_PATH)?); // fd=1 for stdout - mem::forget(OpenOptions::new().write(true).open(TTY_PATH)?); // fd=2 for stderr + let stdin = OpenOptions::new().read(true).open(TTY_PATH)?; // fd=0 + let stdout = OpenOptions::new().write(true).open(TTY_PATH)?; // fd=1 + let stderr = OpenOptions::new().write(true).open(TTY_PATH)?; // fd=2 + + remove_cloexec(&stdin); + remove_cloexec(&stdout); + remove_cloexec(&stderr); Command::new("dhcpd").spawn()?; + + // Close the std{in,out,err} file descriptors, since now we are going to + // start an X session. + drop(stdin); + drop(stdout); + drop(stderr); + Command::new("startx") .env("RUST_BACKTRACE", "full") .spawn()?; - loop {} + Ok(()) } From 3870ef09fd1b740394b59192f1c51b659483a81c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 2 Mar 2023 17:58:54 +1100 Subject: [PATCH 138/368] xbstrap: fix build Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 43f3db32de0..f32ca7f12d0 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -255,18 +255,6 @@ index c0e54fe..6d9cc52 100644 // TODO: Print PID only if POSIX option is enabled. if (mlibc::globalConfig().debugMalloc) mlibc::infoLogger() << "mlibc (PID ?): malloc() returns " -diff --git a/options/ansi/meson.build b/options/ansi/meson.build -index 0820de3..afd8bbe 100644 ---- a/options/ansi/meson.build -+++ b/options/ansi/meson.build -@@ -47,6 +47,7 @@ if not no_headers - install_headers( - 'include/bits/ansi/timespec.h', - 'include/bits/ansi/time_t.h', -+ 'include/bits/ansi/fenv.h', - subdir: 'bits/ansi' - ) - endif diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp index 3474615..10a2109 100644 --- a/options/glibc/generic/execinfo.cpp From 9d171f0351d5f8540c1caaf625390dbd2c16f33c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 3 Mar 2023 16:45:53 +1100 Subject: [PATCH 139/368] socket::inet: implement SIOCGIFHWADDR Signed-off-by: Andy-Python-Programmer --- patches/rust-libc/rust-libc.patch | 23 +++++++++++++---------- src/aero_kernel/src/net/ethernet.rs | 5 +++-- src/aero_kernel/src/socket/inet.rs | 18 +++++++++++++++++- src/aero_syscall/src/consts.rs | 3 +++ 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/patches/rust-libc/rust-libc.patch b/patches/rust-libc/rust-libc.patch index 2eead4473fb..3ba72f9fc99 100644 --- a/patches/rust-libc/rust-libc.patch +++ b/patches/rust-libc/rust-libc.patch @@ -1,14 +1,14 @@ -From 06433417feda99e2f407026d95349e3dbde054d1 Mon Sep 17 00:00:00 2001 +From 1c11650435d49430ddc9838ae0e59a8bcdad8243 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Fri, 17 Feb 2023 18:18:23 +1100 +Date: Fri, 3 Mar 2023 16:39:55 +1100 Subject: [PATCH] --- .../linux_like/linux/gnu/b64/x86_64/mod.rs | 4 +- src/unix/linux_like/linux/gnu/mod.rs | 4 +- src/unix/linux_like/linux/mod.rs | 28 +- - src/unix/mlibc/mod.rs | 457 ++++++++++++++++-- - 4 files changed, 439 insertions(+), 54 deletions(-) + src/unix/mlibc/mod.rs | 460 ++++++++++++++++-- + 4 files changed, 442 insertions(+), 54 deletions(-) diff --git a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs index e6307e2..cae81c4 100644 @@ -185,7 +185,7 @@ index be12190..c8762d5 100644 .field("ifr_name", &self.ifr_name) .field("ifr_ifru", &self.ifr_ifru) diff --git a/src/unix/mlibc/mod.rs b/src/unix/mlibc/mod.rs -index 2046530..abae13c 100644 +index 2046530..0d74760 100644 --- a/src/unix/mlibc/mod.rs +++ b/src/unix/mlibc/mod.rs @@ -47,7 +47,6 @@ pub type fsfilcnt_t = ::c_uint; @@ -734,7 +734,7 @@ index 2046530..abae13c 100644 pub const F_GETOWN: ::c_int = 10; pub const F_SETOWN: ::c_int = 11; pub const O_ACCMODE: ::c_int = 7; -@@ -644,23 +956,51 @@ pub const S_IXGRP: mode_t = 0o10; +@@ -644,23 +956,54 @@ pub const S_IXGRP: mode_t = 0o10; pub const S_IXOTH: mode_t = 0o1; pub const S_IXUSR: mode_t = 0o100; @@ -784,10 +784,13 @@ index 2046530..abae13c 100644 // options/ansi/include/limits.h pub const PTHREAD_STACK_MIN: ::size_t = 16384; +pub const PATH_MAX: ::size_t = 4096; ++ ++// abis/linux/ioctls.h ++pub const SIOCGIFHWADDR: ::c_ulong = 0x00008927; // options/posix/include/pthread.h align_const! { -@@ -668,9 +1008,12 @@ align_const! { +@@ -668,9 +1011,12 @@ align_const! { __mlibc_state: 0, __mlibc_recursion: 0, __mlibc_flags: 0, @@ -800,7 +803,7 @@ index 2046530..abae13c 100644 }; pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { __mlibc_m: 0, -@@ -689,11 +1032,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; +@@ -689,11 +1035,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; extern "C" { @@ -841,7 +844,7 @@ index 2046530..abae13c 100644 pub fn getgrgid_r( gid: ::gid_t, grp: *mut ::group, -@@ -728,13 +1100,24 @@ extern "C" { +@@ -728,13 +1103,24 @@ extern "C" { buflen: ::size_t, result: *mut *mut passwd, ) -> ::c_int; @@ -870,7 +873,7 @@ index 2046530..abae13c 100644 pub fn pthread_create( thread: *mut ::pthread_t, attr: *const ::pthread_attr_t, -@@ -752,6 +1135,8 @@ extern "C" { +@@ -752,6 +1138,8 @@ extern "C" { addr: *mut ::sockaddr, addrlen: *mut ::socklen_t, ) -> ::ssize_t; diff --git a/src/aero_kernel/src/net/ethernet.rs b/src/aero_kernel/src/net/ethernet.rs index ecb45b9257a..e2fb53f71ff 100644 --- a/src/aero_kernel/src/net/ethernet.rs +++ b/src/aero_kernel/src/net/ethernet.rs @@ -26,10 +26,11 @@ use super::*; #[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)] #[repr(C)] -pub struct MacAddr(pub [u8; 6]); +pub struct MacAddr(pub [u8; Self::ADDR_SIZE]); impl MacAddr { - pub const BROADCAST: Self = Self([0xff; 6]); + pub const ADDR_SIZE: usize = 6; + pub const BROADCAST: Self = Self([0xff; Self::ADDR_SIZE]); } #[repr(u16)] diff --git a/src/aero_kernel/src/socket/inet.rs b/src/aero_kernel/src/socket/inet.rs index e6fcf15a38a..77614b49f77 100644 --- a/src/aero_kernel/src/socket/inet.rs +++ b/src/aero_kernel/src/socket/inet.rs @@ -17,6 +17,7 @@ * along with Aero. If not, see . */ +use aero_syscall::prelude::SIOCGIFHWADDR; use aero_syscall::socket::MessageHeader; use aero_syscall::{IpProtocol, OpenFlags, SocketAddrInet, SocketType, SyscallError}; use alloc::sync::{Arc, Weak}; @@ -29,7 +30,7 @@ use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags}; use crate::fs::{self, FileSystemError}; use crate::net::ip::Ipv4Addr; use crate::net::udp::{self, Udp, UdpHandler}; -use crate::net::{Packet, PacketHeader, PacketTrait}; +use crate::net::{self, MacAddr, Packet, PacketHeader, PacketTrait}; use crate::utils::sync::{BlockQueue, Mutex}; #[derive(Default)] @@ -222,6 +223,21 @@ impl INodeInterface for InetSocket { .sum::()) } + fn ioctl(&self, command: usize, arg: usize) -> fs::Result { + match command { + SIOCGIFHWADDR => { + let hwaddr = + unsafe { core::slice::from_raw_parts_mut(arg as *mut u8, MacAddr::ADDR_SIZE) }; + + let mac_addr = net::default_device().mac(); + hwaddr.copy_from_slice(&mac_addr.0.as_slice()); + Ok(0) + } + + _ => unreachable!("inet::ioctl(): unknown command {command}"), + } + } + fn poll(&self, table: Option<&mut fs::inode::PollTable>) -> fs::Result { if let Some(table) = table { table.insert(&self.wq); diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 49b54c3b7e8..24a58cb1365 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -346,3 +346,6 @@ pub struct FramebufferFScreenInfo { pub capabilities: u16, pub reserved: [u16; 2], } + +// networking ioctls: +pub const SIOCGIFHWADDR: usize = 0x8927; From 8599330025eec44b5763190df4d04b5aa32f446e Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 3 Mar 2023 18:54:45 +1100 Subject: [PATCH 140/368] inet: implement SIOCSIFADDR ioctl Signed-off-by: Andy-Python-Programmer --- patches/rust-libc/rust-libc.patch | 77 +++++++++++++++++++++------- src/aero_kernel/src/drivers/e1000.rs | 8 +-- src/aero_kernel/src/net/mod.rs | 44 ++++++++++++++-- src/aero_kernel/src/socket/inet.rs | 28 +++++++++- src/aero_syscall/src/consts.rs | 27 ++++++++++ 5 files changed, 155 insertions(+), 29 deletions(-) diff --git a/patches/rust-libc/rust-libc.patch b/patches/rust-libc/rust-libc.patch index 3ba72f9fc99..eaf8833c692 100644 --- a/patches/rust-libc/rust-libc.patch +++ b/patches/rust-libc/rust-libc.patch @@ -1,14 +1,14 @@ -From 1c11650435d49430ddc9838ae0e59a8bcdad8243 Mon Sep 17 00:00:00 2001 +From 698a2f63c0fde81a3c2aec2c2de0e7ccfe0f3bd8 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Fri, 3 Mar 2023 16:39:55 +1100 +Date: Fri, 3 Mar 2023 18:52:53 +1100 Subject: [PATCH] --- .../linux_like/linux/gnu/b64/x86_64/mod.rs | 4 +- src/unix/linux_like/linux/gnu/mod.rs | 4 +- src/unix/linux_like/linux/mod.rs | 28 +- - src/unix/mlibc/mod.rs | 460 ++++++++++++++++-- - 4 files changed, 442 insertions(+), 54 deletions(-) + src/unix/mlibc/mod.rs | 499 ++++++++++++++++-- + 4 files changed, 481 insertions(+), 54 deletions(-) diff --git a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs index e6307e2..cae81c4 100644 @@ -185,7 +185,7 @@ index be12190..c8762d5 100644 .field("ifr_name", &self.ifr_name) .field("ifr_ifru", &self.ifr_ifru) diff --git a/src/unix/mlibc/mod.rs b/src/unix/mlibc/mod.rs -index 2046530..0d74760 100644 +index 2046530..b479ed2 100644 --- a/src/unix/mlibc/mod.rs +++ b/src/unix/mlibc/mod.rs @@ -47,7 +47,6 @@ pub type fsfilcnt_t = ::c_uint; @@ -287,7 +287,7 @@ index 2046530..0d74760 100644 } pub struct pthread_rwlock_t { pub __mlibc_m: ::c_uint, -@@ -319,10 +348,73 @@ s! { +@@ -319,10 +348,111 @@ s! { pub struct fd_set { pub fds_bits: [c_char; 128], } @@ -333,6 +333,44 @@ index 2046530..0d74760 100644 + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, ++ } ++} ++ ++s_no_extra_traits! { ++ // options/posix/include/net/if.h ++ #[cfg(libc_union)] ++ pub union __c_anonymous_ifr_ifru { ++ pub ifru_addr: ::sockaddr, ++ pub ifru_dstaddr: ::sockaddr, ++ pub ifru_broadaddr: ::sockaddr, ++ pub ifru_netmask: ::sockaddr, ++ pub ifru_hwaddr: ::sockaddr, ++ pub ifru_flags: ::c_short, ++ pub ifru_ifindex: ::c_int, ++ pub ifru_metric: ::c_int, ++ pub ifru_mtu: ::c_int, ++ pub ifru_map: __c_anonymous_ifru_map, ++ pub ifru_slave: [::c_char; ::IFNAMSIZ], ++ pub ifru_newname: [::c_char; ::IFNAMSIZ], ++ pub ifru_data: *mut ::c_char, ++ } ++ ++ pub struct __c_anonymous_ifru_map { ++ pub mem_start: ::c_ulong, ++ pub mem_end: ::c_ulong, ++ pub base_addr: ::c_ushort, ++ pub irq: ::c_uchar, ++ pub dma: ::c_uchar, ++ pub port: ::c_uchar, ++ } ++ ++ pub struct ifreq { ++ /// if name, e.g. "en0" ++ pub ifr_name: [::c_char; ::IFNAMSIZ], ++ #[cfg(libc_union)] ++ pub ifr_ifru: __c_anonymous_ifr_ifru, ++ #[cfg(not(libc_union))] ++ pub ifr_ifru: ::sockaddr, + } } @@ -361,7 +399,7 @@ index 2046530..0d74760 100644 pub {const} fn WCOREDUMP(x: ::c_int) -> bool { x & WCOREFLAG != 0 } -@@ -349,6 +441,104 @@ safe_f! { +@@ -349,6 +479,104 @@ safe_f! { } } @@ -466,7 +504,7 @@ index 2046530..0d74760 100644 // abis/mlibc/vm-flags.h pub const MAP_ANON: ::c_int = 8; pub const MAP_PRIVATE: ::c_int = 1; -@@ -356,11 +546,24 @@ pub const MAP_SHARED: ::c_int = 2; +@@ -356,11 +584,24 @@ pub const MAP_SHARED: ::c_int = 2; pub const PROT_EXEC: ::c_int = 4; pub const PROT_READ: ::c_int = 1; pub const PROT_WRITE: ::c_int = 2; @@ -491,7 +529,7 @@ index 2046530..0d74760 100644 // options/ansi/include/time.h pub const CLOCK_MONOTONIC: clockid_t = 1; -@@ -369,33 +572,49 @@ pub const CLOCK_REALTIME: clockid_t = 0; +@@ -369,33 +610,49 @@ pub const CLOCK_REALTIME: clockid_t = 0; // options/posix/include/netdb.h pub const EAI_SYSTEM: ::c_int = 9; @@ -563,7 +601,7 @@ index 2046530..0d74760 100644 // abis/linux/signal.h pub const SIGABRT: ::c_int = 6; -@@ -436,45 +655,121 @@ pub const SIGSYS: ::c_int = 31; +@@ -436,45 +693,121 @@ pub const SIGSYS: ::c_int = 31; pub const SIGUNUSED: ::c_int = SIGSYS; pub const SIGCANCEL: ::c_int = 32; @@ -686,7 +724,7 @@ index 2046530..0d74760 100644 pub const SOCK_STREAM: ::c_int = 4; pub const SOL_SOCKET: ::c_int = 1; pub const SO_ACCEPTCONN: ::c_int = 1; -@@ -494,6 +789,8 @@ pub const SO_SNDLOWAT: ::c_int = 14; +@@ -494,6 +827,8 @@ pub const SO_SNDLOWAT: ::c_int = 14; pub const SO_SNDTIMEO: ::c_int = 15; pub const SO_TYPE: ::c_int = 16; pub const SO_SNDBUFFORCE: ::c_int = 17; @@ -695,7 +733,7 @@ index 2046530..0d74760 100644 pub const SO_PEERCRED: ::c_int = 18; pub const SO_ATTACH_FILTER: ::c_int = 19; pub const SO_PASSCRED: ::c_int = 20; -@@ -503,6 +800,12 @@ pub const SO_PROTOCOL: ::c_int = 23; +@@ -503,6 +838,12 @@ pub const SO_PROTOCOL: ::c_int = 23; pub const SO_REUSEPORT: ::c_int = 24; pub const SO_TIMESTAMP: ::c_int = 25; @@ -708,7 +746,7 @@ index 2046530..0d74760 100644 // abis/mlibc/errno.h pub const EDOM: ::c_int = 1; pub const EILSEQ: ::c_int = 2; -@@ -592,15 +895,24 @@ pub const ENOTBLK: ::c_int = 1083; +@@ -592,15 +933,24 @@ pub const ENOTBLK: ::c_int = 1083; // options/posix/include/fcntl.h pub const AT_FDCWD: ::c_int = -100; @@ -734,7 +772,7 @@ index 2046530..0d74760 100644 pub const F_GETOWN: ::c_int = 10; pub const F_SETOWN: ::c_int = 11; pub const O_ACCMODE: ::c_int = 7; -@@ -644,23 +956,54 @@ pub const S_IXGRP: mode_t = 0o10; +@@ -644,23 +994,55 @@ pub const S_IXGRP: mode_t = 0o10; pub const S_IXOTH: mode_t = 0o1; pub const S_IXUSR: mode_t = 0o100; @@ -786,11 +824,12 @@ index 2046530..0d74760 100644 +pub const PATH_MAX: ::size_t = 4096; + +// abis/linux/ioctls.h -+pub const SIOCGIFHWADDR: ::c_ulong = 0x00008927; ++pub const SIOCGIFHWADDR: ::c_ulong = 0x8927; ++pub const SIOCSIFADDR: ::c_ulong = 0x8916; // options/posix/include/pthread.h align_const! { -@@ -668,9 +1011,12 @@ align_const! { +@@ -668,9 +1050,12 @@ align_const! { __mlibc_state: 0, __mlibc_recursion: 0, __mlibc_flags: 0, @@ -803,7 +842,7 @@ index 2046530..0d74760 100644 }; pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { __mlibc_m: 0, -@@ -689,11 +1035,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; +@@ -689,11 +1074,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; extern "C" { @@ -844,7 +883,7 @@ index 2046530..0d74760 100644 pub fn getgrgid_r( gid: ::gid_t, grp: *mut ::group, -@@ -728,13 +1103,24 @@ extern "C" { +@@ -728,13 +1142,24 @@ extern "C" { buflen: ::size_t, result: *mut *mut passwd, ) -> ::c_int; @@ -873,7 +912,7 @@ index 2046530..0d74760 100644 pub fn pthread_create( thread: *mut ::pthread_t, attr: *const ::pthread_attr_t, -@@ -752,6 +1138,8 @@ extern "C" { +@@ -752,6 +1177,8 @@ extern "C" { addr: *mut ::sockaddr, addrlen: *mut ::socklen_t, ) -> ::ssize_t; diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index f6bb23d28db..db5500cb585 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -27,8 +27,8 @@ use crate::mem::paging::*; use crate::userland::scheduler; use crate::utils::sync::{BlockQueue, Mutex}; -use crate::net::{self, ethernet}; -use crate::net::{MacAddr, NetworkDevice, PacketBaseTrait}; +use crate::net::{self, ethernet, NetworkDevice}; +use crate::net::{MacAddr, NetworkDriver, PacketBaseTrait}; const TX_DESC_NUM: u32 = 32; const TX_DESC_SIZE: u32 = TX_DESC_NUM * core::mem::size_of::() as u32; @@ -596,7 +596,7 @@ impl Device { } } -impl NetworkDevice for Device { +impl NetworkDriver for Device { fn send(&self, packet: net::Packet) { self.e1000.lock_irq().send(packet) } @@ -644,7 +644,7 @@ impl PciDeviceHandle for Handler { let device = Arc::new(Device::new(e1000)); DEVICE.call_once(|| device.clone()); - net::add_device(device); + net::add_device(NetworkDevice::new(device)); } } diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index ff7ef74de96..6225a2dc393 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -35,14 +35,47 @@ use crate::{ userland::{scheduler, task::Task}, }; +use self::ip::Ipv4Addr; + #[downcastable] -pub trait NetworkDevice: Send + Sync { +pub trait NetworkDriver: Send + Sync { fn send(&self, packet: Packet); fn recv(&self) -> RecvPacket; fn recv_end(&self, packet_id: usize); fn mac(&self) -> MacAddr; } +#[derive(Default)] +struct Metadata { + ip: Ipv4Addr, +} + +pub struct NetworkDevice { + driver: Arc, + metadata: RwLock, +} + +impl NetworkDevice { + pub fn new(driver: Arc) -> Self { + Self { + driver, + metadata: RwLock::new(Metadata::default()), + } + } + + pub fn set_ip(&self, ip: Ipv4Addr) { + self.metadata.write().ip = ip; + } +} + +impl core::ops::Deref for NetworkDevice { + type Target = Arc; + + fn deref(&self) -> &Self::Target { + &self.driver + } +} + #[derive(Debug)] pub struct RecvPacket { pub packet: Packet, @@ -159,8 +192,8 @@ pub trait PacketHeader: PacketBaseTrait { } } -static DEVICES: RwLock>> = RwLock::new(Vec::new()); -static DEFAULT_DEVICE: RwLock>> = RwLock::new(None); +static DEVICES: RwLock>> = RwLock::new(Vec::new()); +static DEFAULT_DEVICE: RwLock>> = RwLock::new(None); fn packet_processor_thread() { let device = default_device(); @@ -171,7 +204,8 @@ fn packet_processor_thread() { } } -pub fn add_device(device: Arc) { +pub fn add_device(device: NetworkDevice) { + let device = Arc::new(device); DEVICES.write().push(device.clone()); let mut default_device = DEFAULT_DEVICE.write(); @@ -186,7 +220,7 @@ pub fn has_default_device() -> bool { DEFAULT_DEVICE.read().as_ref().is_some() } -pub fn default_device() -> Arc { +pub fn default_device() -> Arc { DEFAULT_DEVICE .read() .as_ref() diff --git a/src/aero_kernel/src/socket/inet.rs b/src/aero_kernel/src/socket/inet.rs index 77614b49f77..a39dab4ad4f 100644 --- a/src/aero_kernel/src/socket/inet.rs +++ b/src/aero_kernel/src/socket/inet.rs @@ -17,7 +17,7 @@ * along with Aero. If not, see . */ -use aero_syscall::prelude::SIOCGIFHWADDR; +use aero_syscall::prelude::{IfReq, SIOCGIFHWADDR, SIOCSIFADDR}; use aero_syscall::socket::MessageHeader; use aero_syscall::{IpProtocol, OpenFlags, SocketAddrInet, SocketType, SyscallError}; use alloc::sync::{Arc, Weak}; @@ -28,11 +28,14 @@ use crate::fs::cache::DirCacheItem; use crate::fs::file_table::FileHandle; use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags}; use crate::fs::{self, FileSystemError}; +use crate::mem::paging::VirtAddr; use crate::net::ip::Ipv4Addr; use crate::net::udp::{self, Udp, UdpHandler}; use crate::net::{self, MacAddr, Packet, PacketHeader, PacketTrait}; use crate::utils::sync::{BlockQueue, Mutex}; +use super::SocketAddr; + #[derive(Default)] enum SocketState { /// The socket is not connected. @@ -234,6 +237,29 @@ impl INodeInterface for InetSocket { Ok(0) } + SIOCSIFADDR => { + let ifreq = VirtAddr::new(arg as _) + .read_mut::() + .ok_or(FileSystemError::NotSupported)?; + + let name = ifreq.name().ok_or(FileSystemError::InvalidPath)?; + let socket = SocketAddr::from_family( + VirtAddr::new(&ifreq.sa_family as *const _ as _), + ifreq.sa_family, + ) + .ok_or(FileSystemError::NotSupported)? + .as_inet() + .ok_or(FileSystemError::NotSupported)?; + + // FIXME: + assert!(name == "eth0"); + + let device = net::default_device(); + device.set_ip(Ipv4Addr::new(socket.addr())); + + Ok(0) + } + _ => unreachable!("inet::ioctl(): unknown command {command}"), } } diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 24a58cb1365..34d50290317 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -17,6 +17,8 @@ * along with Aero. If not, see . */ +use core::ffi::CStr; + use crate::OpenFlags; // syscall number constants: @@ -349,3 +351,28 @@ pub struct FramebufferFScreenInfo { // networking ioctls: pub const SIOCGIFHWADDR: usize = 0x8927; +pub const SIOCSIFADDR: usize = 0x8916; // set PA address + +const IF_NAME_SIZE: usize = 16; + +#[repr(C)] +pub struct IfReq { + /// interface name, e.g. "en0" + pub name: [u8; IF_NAME_SIZE], + pub sa_family: u32, + pub sa_data: [u8; 14], +} + +impl IfReq { + /// Get the interface name, e.g. "en0". [`None`] is returned if UTF-8 + /// validation failed. + pub fn name(&self) -> Option<&str> { + match CStr::from_bytes_until_nul(&self.name) { + Ok(s) => s.to_str(), + // The name does not have a null terminator, that means + // the whole buffer has the name. + Err(_) => core::str::from_utf8(&self.name), + } + .ok() + } +} From 9ad9db89db85d6c897676a6d4d3aaecd6186681d Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 5 Mar 2023 17:33:51 +1100 Subject: [PATCH 141/368] inet: fix `SIOCGIFHWADDR` Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/socket/inet.rs | 12 ++++++++++-- src/aero_syscall/src/consts.rs | 12 +++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/aero_kernel/src/socket/inet.rs b/src/aero_kernel/src/socket/inet.rs index a39dab4ad4f..adbe243176e 100644 --- a/src/aero_kernel/src/socket/inet.rs +++ b/src/aero_kernel/src/socket/inet.rs @@ -229,8 +229,16 @@ impl INodeInterface for InetSocket { fn ioctl(&self, command: usize, arg: usize) -> fs::Result { match command { SIOCGIFHWADDR => { - let hwaddr = - unsafe { core::slice::from_raw_parts_mut(arg as *mut u8, MacAddr::ADDR_SIZE) }; + let ifreq = VirtAddr::new(arg as _) + .read_mut::() + .ok_or(FileSystemError::NotSupported)?; + + let name = ifreq.name().ok_or(FileSystemError::InvalidPath)?; + assert!(name == "eth0"); + + let hwaddr = unsafe { + core::slice::from_raw_parts_mut(ifreq.sa_data.as_mut_ptr(), MacAddr::ADDR_SIZE) + }; let mac_addr = net::default_device().mac(); hwaddr.copy_from_slice(&mac_addr.0.as_slice()); diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 34d50290317..b1d3393c5d7 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -17,8 +17,6 @@ * along with Aero. If not, see . */ -use core::ffi::CStr; - use crate::OpenFlags; // syscall number constants: @@ -367,12 +365,8 @@ impl IfReq { /// Get the interface name, e.g. "en0". [`None`] is returned if UTF-8 /// validation failed. pub fn name(&self) -> Option<&str> { - match CStr::from_bytes_until_nul(&self.name) { - Ok(s) => s.to_str(), - // The name does not have a null terminator, that means - // the whole buffer has the name. - Err(_) => core::str::from_utf8(&self.name), - } - .ok() + let null_index = self.name.iter().position(|&x| x == 0).unwrap_or_default(); + let name = &self.name[..null_index]; + core::str::from_utf8(name).ok() } } From 2fce3e4b239a6161d76bd8d6aabbbca1f17c408f Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 5 Mar 2023 18:02:49 +1100 Subject: [PATCH 142/368] add .rustfmt.toml * wrap comments Signed-off-by: Andy-Python-Programmer --- .rustfmt.toml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .rustfmt.toml diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 00000000000..a313d021dcd --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,5 @@ +edition = "2021" +newline_style = "Unix" + +comment_width = 100 +wrap_comments = true From 0af18b5c46432b0ea42c85df3e36374769c28058 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 7 Mar 2023 13:51:45 +1100 Subject: [PATCH 143/368] ext2: rename Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/block/ide/mod.rs | 9 ++ .../src/drivers/block/nvme/command.rs | 1 + src/aero_kernel/src/drivers/block/nvme/mod.rs | 18 +++- src/aero_kernel/src/fs/block/mod.rs | 92 ++++++++++++++++++- src/aero_kernel/src/fs/cache.rs | 14 +++ src/aero_kernel/src/fs/ext2/disk.rs | 6 -- src/aero_kernel/src/fs/ext2/mod.rs | 92 ++++++++++++------- src/aero_kernel/src/fs/inode.rs | 31 +++++-- src/aero_kernel/src/syscall/fs.rs | 20 +++- 9 files changed, 229 insertions(+), 54 deletions(-) diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index 928108dcdcd..5bcd4c82ded 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -79,6 +79,15 @@ impl BlockDeviceInterface for IdeDrive { unimplemented!() } + fn write_dma( + &self, + _sector: usize, + _start: crate::mem::paging::PhysAddr, + _size: usize, + ) -> Option { + todo!() + } + fn write_block(&self, _sector: usize, _buf: &[u8]) -> Option { unimplemented!() } diff --git a/src/aero_kernel/src/drivers/block/nvme/command.rs b/src/aero_kernel/src/drivers/block/nvme/command.rs index af06b2c9a15..56b25a43b23 100644 --- a/src/aero_kernel/src/drivers/block/nvme/command.rs +++ b/src/aero_kernel/src/drivers/block/nvme/command.rs @@ -39,6 +39,7 @@ bitflags::bitflags! { #[repr(u8)] #[derive(Default, Copy, Clone)] pub enum CommandOpcode { + Write = 0x1, Read = 0x2, #[default] diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 7d2453a4d5b..662b4d7e78a 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -230,13 +230,13 @@ struct Namespace<'a> { } impl<'a> Namespace<'a> { - fn read(&self, sector: usize, start: PhysAddr, size_bytes: usize) { + fn rw_command(&self, opcode: CommandOpcode, sector: usize, start: PhysAddr, size_bytes: usize) { assert!(size_bytes != 0); let blocks = size_bytes.ceil_div(self.block_size); let mut read_cmd = ReadWriteCommand::default(); - read_cmd.opcode = CommandOpcode::Read as u8; + read_cmd.opcode = opcode as u8; read_cmd.nsid = self.nsid; read_cmd.start_lba = sector as u64; read_cmd.length = (blocks - 1) as u16; @@ -463,13 +463,23 @@ impl<'a> Controller<'a> { impl<'a> BlockDeviceInterface for Controller<'a> { fn read_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option { - self.namespaces.lock()[0].read(sector, start, size); + self.namespaces.lock()[0].rw_command(CommandOpcode::Read, sector, start, size); + Some(size) + } + + fn write_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option { + self.namespaces.lock()[0].rw_command(CommandOpcode::Write, sector, start, size); Some(size) } fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { let buffer = Dma::::new_uninit_slice(dest.len()); - self.namespaces.lock()[0].read(sector, buffer.addr(), dest.len()); + self.namespaces.lock()[0].rw_command( + CommandOpcode::Read, + sector, + buffer.addr(), + dest.len(), + ); // SAFETY: The buffer is initialized above. dest.copy_from_slice(&buffer); diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 7e33ae6d31c..bcd34973010 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -22,6 +22,8 @@ mod gpt; use gpt::Gpt; use core::mem::MaybeUninit; +use core::ops::{Deref, DerefMut}; +use core::sync::atomic::{AtomicBool, Ordering}; use alloc::collections::BTreeMap; use alloc::sync::{Arc, Weak}; @@ -45,6 +47,7 @@ struct CachedPage { device: Weak, offset: usize, page: PhysFrame, + dirty: AtomicBool, } impl CachedPage { @@ -55,6 +58,7 @@ impl CachedPage { page: FRAME_ALLOCATOR .allocate_frame() .expect("page_cache: out of memory"), + dirty: AtomicBool::new(false), } } @@ -77,6 +81,39 @@ impl CachedPage { fn make_key(device: Weak, offset: usize) -> PageCacheKey { (device.as_ptr() as *const u8 as usize, offset) } + + /// Returns whether the page has been marked dirty. + fn is_dirty(&self) -> bool { + self.dirty.load(Ordering::SeqCst) + } + + fn mark_dirty(&self) { + self.dirty.store(true, Ordering::SeqCst); + } + + fn device(&self) -> Arc { + self.device.upgrade().unwrap() + } + + fn sync(&self) { + if !self.is_dirty() { + return; + } + + // Commit the changes made to the cache to the disk. + let disk = self.device(); + + let offset_bytes = self.offset * Size4KiB::SIZE as usize; + let sector = offset_bytes / disk.block_size(); + + disk.write_dma(sector, self.data_addr(), Size4KiB::SIZE as usize); + } +} + +impl Drop for CachedPage { + fn drop(&mut self) { + self.sync() + } } impl Cacheable for CachedPage { @@ -96,9 +133,8 @@ impl Cache { /// ## Arguments /// /// * `device` - The device to get the page from. - /// - /// * `offset` - The offset in bytes to the data. This will be rounded down to - /// the nearest page boundary. + /// * `offset` - The offset in bytes to the data. This will be rounded down to the nearest page + /// boundary. pub fn get_page(&self, device: Weak, offset: usize) -> PageCacheItem { let cache_offset = offset / Size4KiB::SIZE as usize; let cache_key = CachedPage::make_key(device.clone(), cache_offset); @@ -121,10 +157,48 @@ impl Cache { } } +pub struct DirtyRef { + cache: PageCacheItem, + ptr: *mut T, +} + +impl DirtyRef { + pub fn new(device: Weak, offset: usize) -> Self { + let cache = PAGE_CACHE.get_page(device, offset); + + let ptr_offset = offset % Size4KiB::SIZE as usize; + let ptr = &cache.data_mut()[ptr_offset..ptr_offset + core::mem::size_of::()]; + + Self { + ptr: ptr.as_ptr() as *mut T, + cache, + } + } +} + +impl Deref for DirtyRef { + type Target = T; + + fn deref(&self) -> &Self::Target { + unsafe { &*self.ptr } + } +} + +impl DerefMut for DirtyRef { + fn deref_mut(&mut self) -> &mut Self::Target { + self.cache.mark_dirty(); + unsafe { &mut *self.ptr } + } +} + +unsafe impl Sync for DirtyRef {} +unsafe impl Send for DirtyRef {} + pub trait BlockDeviceInterface: Send + Sync { fn block_size(&self) -> usize; fn read_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option; + fn write_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option; fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option; fn write_block(&self, sector: usize, buf: &[u8]) -> Option; @@ -228,6 +302,10 @@ impl BlockDeviceInterface for BlockDevice { self.dev.read_dma(sector, start, size) } + fn write_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option { + self.dev.write_dma(sector, start, size) + } + fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { self.dev.read_block(sector, dest) } @@ -292,6 +370,14 @@ impl BlockDeviceInterface for PartitionBlockDevice { self.device.write_block(self.offset + sector, buf) } + fn write_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option { + if sector >= self.size { + return None; + } + + self.write_dma(self.offset + sector, start, size) + } + fn read_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option { if sector >= self.size { return None; diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index 5d4fce36d14..97d4ba579b9 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -249,6 +249,20 @@ impl> Cache { } } + pub fn rehash(&self, item: CacheArc>, update: F) + where + F: FnOnce(), + { + let mut index = self.index.lock(); + let key = item.cache_key(); + + index.used.remove(&key).expect("cache: item is not used"); + update(); + + let new_key = item.cache_key(); + index.used.insert(new_key, Arc::downgrade(&item)); + } + pub fn log(&self) { let index = self.index.lock(); diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index 68dfc40df6f..0d8482490b5 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -166,12 +166,6 @@ impl DirEntry { name_bytes.copy_from_slice(name.as_bytes()); } - - pub fn as_bytes(&self) -> &[u8] { - unsafe { - core::slice::from_raw_parts(self as *const Self as *const u8, self.entry_size as usize) - } - } } #[repr(u8)] diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 7420d8d9ce2..317365fdbf4 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -29,10 +29,10 @@ use alloc::string::ToString; use alloc::sync::{Arc, Weak}; use spin::RwLock; -use crate::fs::block::BlockDeviceInterface; +use crate::fs::block::{BlockDeviceInterface, DirtyRef}; use crate::fs::cache::CachedINode; use crate::fs::ext2::disk::{FileType, Revision, SuperBlock}; -use crate::mem::paging::{FrameAllocator, PhysFrame, VirtAddr, FRAME_ALLOCATOR}; +use crate::mem::paging::*; use crate::socket::unix::UnixSocket; use crate::socket::SocketAddr; @@ -40,7 +40,7 @@ use crate::utils::CeilDiv; use self::group_desc::GroupDescriptors; -use super::block::{BlockDevice, CachedAccess}; +use super::block::{self, BlockDevice, CachedAccess}; use super::cache::{DirCacheItem, INodeCacheItem}; use super::{cache, FileSystemError}; @@ -92,6 +92,24 @@ impl INode { } } + /// Reads the data at `offset` as `T`. + /// + /// ## Safety + /// * The data being read should be of a valid value for `T`. + pub unsafe fn read_mut(&self, offset: usize) -> block::DirtyRef { + assert!(core::mem::size_of::() <= Size4KiB::SIZE as usize); + + let filesystem = self.fs.upgrade().unwrap(); + let block_size = filesystem.superblock.block_size(); + + let block = offset / block_size; + let loc = offset % block_size; + + let block_index = self.get_block(block).unwrap() as usize; + + block::DirtyRef::new(filesystem.block.sref(), (block_index * block_size) + loc) + } + pub fn read(&self, offset: usize, buffer: &mut [MaybeUninit]) -> super::Result { let inode = self.inode.read(); let filesystem = self.fs.upgrade().unwrap(); @@ -270,6 +288,20 @@ impl INode { } } + pub fn make_disk_dirent(&self, inode: Arc, file_type: u8, name: &str) { + // TODO: scan for unused directory entries and check if this can be + // inserted into the existing block. + let block = self.append_block().unwrap(); + let fs = self.fs.upgrade().expect("ext2: filesystem was dropped"); + let block_size = fs.superblock.block_size(); + + let mut entry = DirtyRef::::new(fs.block.sref(), block * block_size); + entry.entry_size = block_size as _; + entry.inode = inode.id as _; + entry.file_type = file_type; + entry.set_name(name); + } + pub fn make_inode( &self, name: &str, @@ -306,27 +338,12 @@ impl INode { inode.hl_count += 1; } - // TODO: scan for unused directory entries and check if this can be - // inserted into the existing block. - let block = self.append_block().unwrap(); - let block_size = fs.superblock.block_size(); - - let mut entry = Box::::new_uninit(); - fs.block.read(block * block_size, entry.as_bytes_mut()); - - // SAFETY: We have initialized the entry above. - let mut entry = unsafe { entry.assume_init() }; - - entry.entry_size = block_size as _; - entry.inode = ext2_inode.id as _; - entry.file_type = 2; // FIXME: This is fucked. - entry.set_name(name); - - fs.block.write(block * block_size, entry.as_bytes()); + // FIXME: Fix the filetype! + self.make_disk_dirent(ext2_inode, 2, name); Ok(inode) } - pub fn make_dir_entry( + pub fn make_dirent( &self, parent: DirCacheItem, name: &str, @@ -391,7 +408,7 @@ impl INodeInterface for INode { fn dirent(&self, parent: DirCacheItem, index: usize) -> super::Result> { if let Some((name, entry)) = DirEntryIter::new(self.sref()).nth(index) { - Ok(self.make_dir_entry(parent, &name, &entry)) + Ok(self.make_dirent(parent, &name, &entry)) } else { Ok(None) } @@ -402,7 +419,7 @@ impl INodeInterface for INode { .find(|(ename, _)| ename == name) .ok_or(FileSystemError::EntryNotFound)?; - Ok(self.make_dir_entry(parent, &name, &entry).unwrap()) + Ok(self.make_dirent(parent, &name, &entry).unwrap()) } fn read_at(&self, offset: usize, usr_buffer: &mut [u8]) -> super::Result { @@ -437,6 +454,25 @@ impl INodeInterface for INode { self.write(offset, usr_buffer) } + fn rename(&self, old: DirCacheItem, dest: &str) -> super::Result<()> { + assert!(self.metadata()?.is_directory()); + + if DirEntryIter::new(self.sref()) + .find(|(name, _)| name == dest) + .is_some() + { + return Err(FileSystemError::EntryExists); + } + + if let Some(_parent) = old.parent() { + // FIXME: Remove the directory entry from the parent + self.make_disk_dirent(old.inode().downcast_arc().unwrap(), 2, dest); + return Ok(()); + } + + Err(FileSystemError::NotSupported) + } + fn link(&self, name: &str, src: DirCacheItem) -> super::Result<()> { if !self.metadata()?.is_directory() { return Err(FileSystemError::NotSupported); @@ -593,7 +629,7 @@ impl DirEntryIter { } impl Iterator for DirEntryIter { - type Item = (String, Box); + type Item = (String, block::DirtyRef); fn next(&mut self) -> Option { let file_size = self.inode.inode.read().size(); @@ -602,13 +638,7 @@ impl Iterator for DirEntryIter { return None; } - let mut entry = Box::::new_uninit(); - - self.inode.read(self.offset, entry.as_bytes_mut()).ok()?; - - // SAFETY: We have initialized the entry above. - let entry = unsafe { entry.assume_init() }; - + let entry = unsafe { self.inode.read_mut::(self.offset) }; if entry.inode == 0 { return None; } diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 6f07dddd8dc..77df73e40f0 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -125,9 +125,8 @@ pub trait INodeInterface: Send + Sync { /// to the file. /// /// ## Errors - /// - `FileSystemError::NotSupported` - If the inode is not a symbolic link or - /// the filesystem does not support symbolic - /// links. + /// - `FileSystemError::NotSupported` - If the inode is not a symbolic link or the filesystem + /// does not support symbolic links. fn resolve_link(&self) -> Result { Err(FileSystemError::NotSupported) } @@ -197,6 +196,16 @@ pub trait INodeInterface: Send + Sync { Ok(None) } + /// Renames a file (`src`) to `dest`, moving it between directories if required. Any other hard + /// links to the file (as created using [`INodeInterface::link`]) are unaffected. + /// + /// ## Atomicity + /// * If `dest` already exists, it will be atomically replaced. + /// * There can be a window in which both `src` and `dest` refer to the file being renamed. + fn rename(&self, _src: DirCacheItem, _dest: &str) -> Result<()> { + Err(FileSystemError::NotSupported) + } + fn close(&self, _flags: OpenFlags) {} fn dirent(&self, _parent: DirCacheItem, _index: usize) -> Result> { @@ -349,7 +358,9 @@ impl From for aero_syscall::SysFileType { match file { FileType::File => aero_syscall::SysFileType::File, FileType::Directory => aero_syscall::SysFileType::Directory, - FileType::Device => aero_syscall::SysFileType::CharDevice, // FIXME: determine if it is a character or block device. + FileType::Device => aero_syscall::SysFileType::CharDevice, /* FIXME: determine if it */ + // is a character or + // block device. FileType::Socket => aero_syscall::SysFileType::Socket, FileType::Symlink => aero_syscall::SysFileType::Symlink, } @@ -383,8 +394,8 @@ impl DirEntry { let dcache = cache::dcache(); /* - * Helper bool to avoid situations where the directory entry is already cached. The possible - * cases are: + * Helper bool to avoid situations where the directory entry is already cached. The + * possible cases are: * * "." (ie. we do not want to re-cache the current directory) * ".." (ie. we do not want to re-cache the current directory's, parent directory). @@ -486,6 +497,14 @@ impl DirEntry { self.data.lock().name.clone() } + pub fn set_name(&self, name: &str) { + self.data.lock().name = name.into(); + } + + pub fn set_parent(&self, parent: DirCacheItem) { + self.data.lock().parent = Some(parent); + } + /// Returns the inner cached inode item of the directory entry. pub fn inode(&self) -> INodeCacheItem { self.data.lock().inode.clone() diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 45d650f8f73..73f97f6cb61 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -21,7 +21,7 @@ use aero_syscall::signal::SigProcMask; use aero_syscall::{prelude::*, TimeSpec}; use aero_syscall::{OpenFlags, Stat, SyscallError}; -use crate::fs::cache::DirCacheImpl; +use crate::fs::cache::{self, DirCacheImpl}; use crate::fs::epoll::EPoll; use crate::fs::eventfd::EventFd; use crate::fs::file_table::DuplicateHint; @@ -584,9 +584,9 @@ fn do_poll(fds: &mut [PollFd], timeout: Option<&TimeSpec>) -> Result Result Result { + let src = fs::lookup_path(src)?; + let (dest, name) = { + let (dir, name) = dest.parent_and_basename(); + (fs::lookup_path(dir)?, name) + }; + + dest.inode().rename(src.clone(), name)?; + + cache::dcache().rehash(src.clone(), || { + src.set_name(name); + src.set_parent(dest); + }); Ok(0) } From aa0c4618e3b64ec470ed94a139d4c90023657ad3 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 7 Mar 2023 15:27:13 +1100 Subject: [PATCH 144/368] fcntl: stub F_SETLKW and F_SETLK Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/cache.rs | 2 +- src/aero_kernel/src/syscall/fs.rs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index 97d4ba579b9..a1956910586 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -294,7 +294,7 @@ impl> Cache { let mut index = self.index.lock(); let key = item.cache_key(); - assert!(index.used.remove(&key).is_some()); + index.used.remove(&key); index.unused.put(key, item.0.clone()); } } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 73f97f6cb61..db4cc4522e4 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -407,6 +407,11 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result { + log::warn!("fcntl: F_SETLKW,F_SETLK are a stub!"); + Ok(0) + } + _ => unimplemented!("fcntl: unknown command {command}"), } } From 1c651de2e482618a7016b4609463b75003a3d544 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 11 Mar 2023 15:20:42 +1100 Subject: [PATCH 145/368] bootstrap::mlibc: update Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index f32ca7f12d0..f02cc9eec5d 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -29,21 +29,6 @@ index fdd60a0..9f811f4 100644 .vscode +# clangd cache files: +.cache -diff --git a/meson.build b/meson.build -index 7dc495d..f419404 100644 ---- a/meson.build -+++ b/meson.build -@@ -125,6 +125,10 @@ if host_machine.system() == 'linux' - elif host_machine.system() == 'aero' - rtdl_include_dirs += include_directories('sysdeps/aero/include') - libc_include_dirs += include_directories('sysdeps/aero/include') -+ -+ internal_conf.set10('MLIBC_MAP_DSO_SEGMENTS', true) -+ internal_conf.set10('MLIBC_MAP_FILE_WINDOWS', true) -+ - subdir('sysdeps/aero') - elif host_machine.system() == 'managarm' - # TODO: Adopt the include_directories() commands from the managarm meson.build. diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp index c0e54fe..6d9cc52 100644 --- a/options/ansi/generic/stdlib-stubs.cpp From 6340acf20a810ea7a7dd5726bdd6b377c0eea938 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 11 Mar 2023 15:21:18 +1100 Subject: [PATCH 146/368] bootstrap::mlibc: remove 16 bytes padding in malloc() Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index f02cc9eec5d..482cbb7a608 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,22 +1,20 @@ -From a5ec321f99ccfe66889e802626230a792a3d7140 Mon Sep 17 00:00:00 2001 +From 6350f126765046a3a97d6acf40dc7d85ccddffad Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 26 Feb 2023 17:20:53 +1100 +Date: Sat, 11 Mar 2023 15:20:58 +1100 Subject: [PATCH] --- .gitignore | 2 + - meson.build | 4 + - options/ansi/generic/stdlib-stubs.cpp | 185 ++++++++++++++++++++++++-- - options/ansi/meson.build | 1 + + options/ansi/generic/stdlib-stubs.cpp | 183 +++++++++++++++++++++++++- options/glibc/generic/execinfo.cpp | 5 +- options/rtdl/generic/linker.cpp | 2 +- sysdeps/aero/generic/aero.cpp | 77 +++++++---- sysdeps/aero/generic/filesystem.cpp | 51 ++++++- - sysdeps/aero/generic/sockets.cpp | 96 ++++++++++++- + sysdeps/aero/generic/sockets.cpp | 96 +++++++++++++- sysdeps/aero/generic/time.cpp | 24 ++++ sysdeps/aero/include/aero/syscall.h | 11 ++ sysdeps/aero/meson.build | 1 + - 12 files changed, 412 insertions(+), 47 deletions(-) + 10 files changed, 406 insertions(+), 46 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -30,7 +28,7 @@ index fdd60a0..9f811f4 100644 +# clangd cache files: +.cache diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp -index c0e54fe..6d9cc52 100644 +index c0e54fe..b988dea 100644 --- a/options/ansi/generic/stdlib-stubs.cpp +++ b/options/ansi/generic/stdlib-stubs.cpp @@ -319,13 +319,182 @@ void qsort(void *base, size_t count, size_t size, @@ -231,15 +229,6 @@ index c0e54fe..6d9cc52 100644 return nseq.it - mb; } else { -@@ -450,7 +619,7 @@ void free(void *ptr) { - } - - void *malloc(size_t size) { -- auto nptr = getAllocator().allocate(size); -+ auto nptr = getAllocator().allocate(size + 16); - // TODO: Print PID only if POSIX option is enabled. - if (mlibc::globalConfig().debugMalloc) - mlibc::infoLogger() << "mlibc (PID ?): malloc() returns " diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp index 3474615..10a2109 100644 --- a/options/glibc/generic/execinfo.cpp From a04cc497f09ff12c797c9054c4ef3ea3987ff9b6 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 11 Mar 2023 17:20:04 +1100 Subject: [PATCH 147/368] bootstrap::mlibc: remove qsort_r Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 225 ++++---------------------------------- 1 file changed, 20 insertions(+), 205 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 482cbb7a608..fdf9648ca8d 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,20 +1,20 @@ -From 6350f126765046a3a97d6acf40dc7d85ccddffad Mon Sep 17 00:00:00 2001 +From fb1766aa2abfb310b6c1b0904f849f5d6c8fb62b Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sat, 11 Mar 2023 15:20:58 +1100 +Date: Sat, 11 Mar 2023 16:55:47 +1100 Subject: [PATCH] --- - .gitignore | 2 + - options/ansi/generic/stdlib-stubs.cpp | 183 +++++++++++++++++++++++++- - options/glibc/generic/execinfo.cpp | 5 +- - options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 77 +++++++---- - sysdeps/aero/generic/filesystem.cpp | 51 ++++++- - sysdeps/aero/generic/sockets.cpp | 96 +++++++++++++- - sysdeps/aero/generic/time.cpp | 24 ++++ - sysdeps/aero/include/aero/syscall.h | 11 ++ - sysdeps/aero/meson.build | 1 + - 10 files changed, 406 insertions(+), 46 deletions(-) + .gitignore | 2 + + options/ansi/generic/stdlib-stubs.cpp | 6 +- + options/glibc/generic/execinfo.cpp | 5 +- + options/rtdl/generic/linker.cpp | 2 +- + sysdeps/aero/generic/aero.cpp | 77 +++++++++++++-------- + sysdeps/aero/generic/filesystem.cpp | 51 ++++++++++++-- + sysdeps/aero/generic/sockets.cpp | 96 ++++++++++++++++++++++++++- + sysdeps/aero/generic/time.cpp | 24 +++++++ + sysdeps/aero/include/aero/syscall.h | 11 +++ + sysdeps/aero/meson.build | 1 + + 10 files changed, 234 insertions(+), 41 deletions(-) create mode 100644 sysdeps/aero/generic/time.cpp diff --git a/.gitignore b/.gitignore @@ -28,204 +28,19 @@ index fdd60a0..9f811f4 100644 +# clangd cache files: +.cache diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp -index c0e54fe..b988dea 100644 +index c0e54fe..ddeec8a 100644 --- a/options/ansi/generic/stdlib-stubs.cpp +++ b/options/ansi/generic/stdlib-stubs.cpp -@@ -319,13 +319,182 @@ void qsort(void *base, size_t count, size_t size, - } - } - --void qsort_r(void *, size_t, size_t, -- int (*compare)(const void *, const void *, void *), -- void *) { -- (void) compare; -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ -+// ---------------- QSORT START ---------------- -+/* -+ * Adapted from https://github.com/noporpoise/sort_r, original -+ * copyright follows: -+ * -+ * Isaac Turner 29 April 2014 Public Domain -+ */ -+#include -+#include -+ -+#define SORT_R_SWAP(a,b,tmp) ((tmp) = (a), (a) = (b), (b) = (tmp)) -+ -+/* swap a and b */ -+/* a and b must not be equal! */ -+static void sort_r_swap(char *__restrict a, char *__restrict b, -+ size_t w) -+{ -+ char tmp, *end = a+w; -+ for(; a < end; a++, b++) { SORT_R_SWAP(*a, *b, tmp); } -+} -+ -+/* swap a, b iff a>b */ -+/* a and b must not be equal! */ -+/* __restrict is same as restrict but better support on old machines */ -+static int sort_r_cmpswap(char *__restrict a, -+ char *__restrict b, size_t w, -+ int (*compar)(const void *_a, -+ const void *_b, -+ void *_arg), -+ void *arg) -+{ -+ if(compar(a, b, arg) > 0) { -+ sort_r_swap(a, b, w); -+ return 1; -+ } -+ return 0; -+} -+ -+/* -+ Swap consecutive blocks of bytes of size na and nb starting at memory addr ptr, -+ with the smallest swap so that the blocks are in the opposite order. Blocks may -+ be internally re-ordered e.g. -+ 12345ab -> ab34512 -+ 123abc -> abc123 -+ 12abcde -> deabc12 -+*/ -+static void sort_r_swap_blocks(char *ptr, size_t na, size_t nb) -+{ -+ if(na > 0 && nb > 0) { -+ if(na > nb) { sort_r_swap(ptr, ptr+na, nb); } -+ else { sort_r_swap(ptr, ptr+nb, na); } -+ } -+} -+ -+/* Implement recursive quicksort ourselves */ -+/* Note: quicksort is not stable, equivalent values may be swapped */ -+void qsort_r(void *base, size_t nel, size_t w, -+ int (*compar)(const void *_a, -+ const void *_b, -+ void *_arg), -+ void *arg) -+{ -+ char *b = (char *)base, *end = b + nel*w; -+ -+ /* for(size_t i=0; i b && sort_r_cmpswap(pj-w,pj,w,compar,arg); pj -= w) {} -+ } -+ } -+ else -+ { -+ /* nel > 6; Quicksort */ -+ -+ int cmp; -+ char *pl, *ple, *pr, *pre, *pivot; -+ char *last = b+w*(nel-1), *tmp; -+ -+ /* -+ Use median of second, middle and second-last items as pivot. -+ First and last may have been swapped with pivot and therefore be extreme -+ */ -+ char *l[3]; -+ l[0] = b + w; -+ l[1] = b+w*(nel/2); -+ l[2] = last - w; -+ -+ /* printf("pivots: %i, %i, %i\n", *(int*)l[0], *(int*)l[1], *(int*)l[2]); */ -+ -+ if(compar(l[0],l[1],arg) > 0) { SORT_R_SWAP(l[0], l[1], tmp); } -+ if(compar(l[1],l[2],arg) > 0) { -+ SORT_R_SWAP(l[1], l[2], tmp); -+ if(compar(l[0],l[1],arg) > 0) { SORT_R_SWAP(l[0], l[1], tmp); } -+ } -+ -+ /* swap mid value (l[1]), and last element to put pivot as last element */ -+ if(l[1] != last) { sort_r_swap(l[1], last, w); } -+ -+ /* -+ pl is the next item on the left to be compared to the pivot -+ pr is the last item on the right that was compared to the pivot -+ ple is the left position to put the next item that equals the pivot -+ ple is the last right position where we put an item that equals the pivot -+ v- end (beyond the array) -+ EEEEEELLLLLLLLuuuuuuuuGGGGGGGEEEEEEEE. -+ ^- b ^- ple ^- pl ^- pr ^- pre ^- last (where the pivot is) -+ Pivot comparison key: -+ E = equal, L = less than, u = unknown, G = greater than, E = equal -+ */ -+ pivot = last; -+ ple = pl = b; -+ pre = pr = last; -+ -+ /* -+ Strategy: -+ Loop into the list from the left and right at the same time to find: -+ - an item on the left that is greater than the pivot -+ - an item on the right that is less than the pivot -+ Once found, they are swapped and the loop continues. -+ Meanwhile items that are equal to the pivot are moved to the edges of the -+ array. -+ */ -+ while(pl < pr) { -+ /* Move left hand items which are equal to the pivot to the far left. -+ break when we find an item that is greater than the pivot */ -+ for(; pl < pr; pl += w) { -+ cmp = compar(pl, pivot, arg); -+ if(cmp > 0) { break; } -+ else if(cmp == 0) { -+ if(ple < pl) { sort_r_swap(ple, pl, w); } -+ ple += w; -+ } -+ } -+ /* break if last batch of left hand items were equal to pivot */ -+ if(pl >= pr) { break; } -+ /* Move right hand items which are equal to the pivot to the far right. -+ break when we find an item that is less than the pivot */ -+ for(; pl < pr; ) { -+ pr -= w; /* Move right pointer onto an unprocessed item */ -+ cmp = compar(pr, pivot, arg); -+ if(cmp == 0) { -+ pre -= w; -+ if(pr < pre) { sort_r_swap(pr, pre, w); } -+ } -+ else if(cmp < 0) { -+ if(pl < pr) { sort_r_swap(pl, pr, w); } -+ pl += w; -+ break; -+ } -+ } -+ } -+ -+ pl = pr; /* pr may have gone below pl */ -+ -+ /* -+ Now we need to go from: EEELLLGGGGEEEE -+ to: LLLEEEEEEEGGGG -+ Pivot comparison key: -+ E = equal, L = less than, u = unknown, G = greater than, E = equal -+ */ -+ sort_r_swap_blocks(b, ple-b, pl-ple); -+ sort_r_swap_blocks(pr, pre-pr, end-pre); -+ -+ /*for(size_t i=0; i wseq{wc, wc + 1}; mlibc::code_seq nseq{mb, mb + max_size}; auto e = cc->decode_wtranscode(nseq, wseq, mbtowc_state); - if (e != mlibc::charcode_error::null) +- if (e != mlibc::charcode_error::null) - __ensure(!"decode_wtranscode() errors are not handled"); ++ if (e != mlibc::charcode_error::null) { ++ errno = EILSEQ; + return -1; ++ } return nseq.it - mb; } else { From 48bd19a6bc819605f99eaab54acf04c3f44c0a96 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 12 Mar 2023 15:38:02 +1100 Subject: [PATCH 148/368] frame::BuddyAllocator: fix deallocation bug Each block is a power of two number of pages and the allocator assumed that the buddy size was incremented by power of two which was incorrect since we went from Size8KiB to Size2MiB which introduced the pesky dealloction bug. This is now solved by having the buddy size's as follows: ```rust const BUDDY_SIZE: [u64; 10] = [ Size4KiB::SIZE, // 4 KiB Size4KiB::SIZE * 2, // 8 KiB Size4KiB::SIZE * 4, // 16 KiB Size4KiB::SIZE * 8, // 32 KiB Size4KiB::SIZE * 16, // 64 KiB Size4KiB::SIZE * 32, // 128 KiB Size4KiB::SIZE * 64, // 256 KiB Size4KiB::SIZE * 128, // 512 KiB Size4KiB::SIZE * 256, // 1 MiB Size2MiB::SIZE, // 2 MiB ]; ``` NOTE: The linux buddy allocator has 11 order's, in which the last one is 4 MiB. Should we have that or no? Signed-off-by: Andy-Python-Programmer --- aero.py | 2 +- src/aero_kernel/src/main.rs | 3 +- src/aero_kernel/src/mem/paging/frame.rs | 91 ++++++++++++++------ src/aero_kernel/src/mem/paging/page_table.rs | 2 +- 4 files changed, 69 insertions(+), 29 deletions(-) diff --git a/aero.py b/aero.py index 3f1dd657878..5204dc934bf 100755 --- a/aero.py +++ b/aero.py @@ -491,7 +491,7 @@ def run_in_emulator(build_info: BuildInfo, iso_path): qemu_args += ['-device', 'ramfb', '-M', 'virt', '-cpu', 'cortex-a72'] elif build_info.target_arch == "x86_64": - qemu_args += ["-cpu", "qemu64,+la57" if args.la57 else "qemu64"] + qemu_args += ["-cpu", "qemu64,+la57" if args.la57 else "max"] else: log_error("unknown target architecture") exit(1) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index f22f166fb4c..1c16fa87971 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -18,7 +18,8 @@ */ //! # Aero -//! Aero is a new modern, unix based operating system. It is being developed for educational purposes. +//! Aero is a new modern, unix based operating system. It is being developed for educational +//! purposes. //! //! ## Code organization and architecture //! The code is divided into different *modules*, each representing a *subsystem* of the kernel. diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 3665e690688..acce85cd807 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -34,7 +34,35 @@ use crate::mem::paging::align_up; use crate::utils::bitmap::Bitmap; use crate::utils::sync::Mutex; -static BUDDY_SIZE: [u64; 3] = [Size4KiB::SIZE, Size4KiB::SIZE * 4, Size2MiB::SIZE]; +const BUDDY_SIZE: [u64; 10] = [ + Size4KiB::SIZE, // 4 KiB + Size4KiB::SIZE * 2, // 8 KiB + Size4KiB::SIZE * 4, // 16 KiB + Size4KiB::SIZE * 8, // 32 KiB + Size4KiB::SIZE * 16, // 64 KiB + Size4KiB::SIZE * 32, // 128 KiB + Size4KiB::SIZE * 64, // 256 KiB + Size4KiB::SIZE * 128, // 512 KiB + Size4KiB::SIZE * 256, // 1 MiB + Size2MiB::SIZE, // 2 MiB +]; + +const fn order_from_size(size: u64) -> usize { + // UNSTABLE: We cannot make an iterator from `BUDDY_SIZE` or use a for loop + // in const context. + let mut order = 0; + + while order < BUDDY_SIZE.len() { + let buddy_size = BUDDY_SIZE[order]; + if buddy_size >= size { + return order; + } + + order += 1; + } + + unreachable!() +} pub struct LockedFrameAllocator(Once>); @@ -60,8 +88,12 @@ unsafe impl FrameAllocator for LockedFrameAllocator { self.0.get().map(|m| { m.lock_irq() - .allocate_frame_inner(0) - .map(|f| PhysFrame::containing_address(f)) + .allocate_frame_inner(order_from_size(Size4KiB::SIZE)) + .map(|f| { + let frame = PhysFrame::containing_address(f); + frame.as_slice_mut().fill(0); + frame + }) })? } @@ -70,10 +102,13 @@ unsafe impl FrameAllocator for LockedFrameAllocator { // let caller = core::panic::Location::caller(); // log::debug!("deallocation request of 4KiB by {:?}", caller); - // self.0 - // .get() - // .map(|m| m.lock().deallocate_frame_inner(frame.start_address(), 0)) - // .unwrap_or(()); + self.0 + .get() + .map(|m| { + m.lock_irq() + .deallocate_frame_inner(frame.start_address(), order_from_size(Size4KiB::SIZE)) + }) + .unwrap_or(()); } } @@ -85,7 +120,7 @@ unsafe impl FrameAllocator for LockedFrameAllocator { self.0.get().map(|m| { m.lock_irq() - .allocate_frame_inner(2) + .allocate_frame_inner(order_from_size(Size2MiB::SIZE)) .map(|f| PhysFrame::containing_address(f)) })? } @@ -99,7 +134,7 @@ unsafe impl FrameAllocator for LockedFrameAllocator { .get() .map(|m| { m.lock_irq() - .deallocate_frame_inner(frame.start_address(), 2) + .deallocate_frame_inner(frame.start_address(), order_from_size(Size2MiB::SIZE)) }) .unwrap_or(()); } @@ -150,7 +185,7 @@ impl<'a> Iterator for RangeMemoryIter<'a> { #[repr(usize)] pub enum BuddyOrdering { Size4KiB = 0, - Size8KiB = 2, + Size8KiB = 1, } // FIXME: REMOVE THIS FUNCTION @@ -247,35 +282,32 @@ unsafe impl Send for BootAllocRef {} static VM_FRAMES: Once> = Once::new(); -/// Buddy allocator combines power-of-two allocator with free buffer -/// coalescing. +/// Buddy allocator combines power-of-two allocator with free buffer coalescing. /// /// ## Overview /// /// Overview of the buddy allocation algorithm: /// -/// * Memory is broken up into large blocks of pages where each block -/// is a power of two number of pages. +/// * Memory is broken up into large blocks of pages where each block is a power of two number of +/// pages. /// -/// * If a block of the desired size is not available, a larger block is -/// broken up in half and the two blocks are marked as buddies then one half -/// is used for the allocation and the other half is marked free. +/// * If a block of the desired size is not available, a larger block is broken up in half and the +/// two blocks are marked as buddies then one half is used for the allocation and the other half +/// is marked free. /// -/// * The blocks are continuously halved as necessary until a block of the -/// desired size is available. +/// * The blocks are continuously halved as necessary until a block of the desired size is +/// available. /// -/// * When a block is later freed, the buddy is examined and the two coalesced -/// if it is free. +/// * When a block is later freed, the buddy is examined and the two coalesced if it is free. pub struct GlobalFrameAllocator { - buddies: [Bitmap; 3], - free: [usize; 3], + buddies: [Bitmap; 10], + free: [usize; 10], base: PhysAddr, end: PhysAddr, } impl GlobalFrameAllocator { - /// Create a new global frame allocator from the memory map provided by the bootloader. fn new(memory_map: &mut [NonNullPtr]) -> Self { // Find a memory map entry that is big enough to fit all of the items in // range memory iter. @@ -350,8 +382,15 @@ impl GlobalFrameAllocator { Bitmap::empty(bref.clone()), Bitmap::empty(bref.clone()), Bitmap::empty(bref.clone()), + Bitmap::empty(bref.clone()), + Bitmap::empty(bref.clone()), + Bitmap::empty(bref.clone()), + Bitmap::empty(bref.clone()), + Bitmap::empty(bref.clone()), + Bitmap::empty(bref.clone()), + Bitmap::empty(bref.clone()), ], - free: [0; 3], + free: [0; 10], }; let size = this.end - this.base; @@ -455,7 +494,7 @@ impl GlobalFrameAllocator { let idx = self.get_bit_idx(addr, order); let buddy = &mut self.buddies[order]; - let change = buddy.is_set(idx) == true; + let change = buddy.is_set(idx); if change { buddy.set(idx, false); diff --git a/src/aero_kernel/src/mem/paging/page_table.rs b/src/aero_kernel/src/mem/paging/page_table.rs index 78db363ee7a..98651965fb7 100644 --- a/src/aero_kernel/src/mem/paging/page_table.rs +++ b/src/aero_kernel/src/mem/paging/page_table.rs @@ -129,7 +129,7 @@ impl PageTableEntry { /// /// - `FrameError::FrameNotPresent` if the entry doesn't have the `PRESENT` flag set. /// - `FrameError::HugeFrame` if the entry has the `HUGE_PAGE` flag set (for huge pages the - /// `addr` function must be used) + /// `addr` function must be used) pub fn frame(&self) -> Result { if !self.flags().contains(PageTableFlags::PRESENT) { Err(FrameError::FrameNotPresent) From 8c9b70ed1093cf3387bfd4d1173b9996eff2556e Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 12 Mar 2023 16:23:32 +1100 Subject: [PATCH 149/368] paging::FrameAllocator: remove `#[track_caller]` Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/mem/paging/frame.rs | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index acce85cd807..243a4dbaef4 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -81,11 +81,7 @@ impl LockedFrameAllocator { } unsafe impl FrameAllocator for LockedFrameAllocator { - #[track_caller] fn allocate_frame(&self) -> Option> { - // let caller = core::panic::Location::caller(); - // log::debug!("allocation request of 4KiB by {:?}", caller); - self.0.get().map(|m| { m.lock_irq() .allocate_frame_inner(order_from_size(Size4KiB::SIZE)) @@ -97,27 +93,19 @@ unsafe impl FrameAllocator for LockedFrameAllocator { })? } - #[track_caller] fn deallocate_frame(&self, frame: PhysFrame) { - // let caller = core::panic::Location::caller(); - // log::debug!("deallocation request of 4KiB by {:?}", caller); - self.0 .get() .map(|m| { m.lock_irq() .deallocate_frame_inner(frame.start_address(), order_from_size(Size4KiB::SIZE)) }) - .unwrap_or(()); + .unwrap() } } unsafe impl FrameAllocator for LockedFrameAllocator { - #[track_caller] fn allocate_frame(&self) -> Option> { - // let caller = core::panic::Location::caller(); - // log::debug!("allocation request of 2MiB by {:?}", caller); - self.0.get().map(|m| { m.lock_irq() .allocate_frame_inner(order_from_size(Size2MiB::SIZE)) @@ -125,18 +113,14 @@ unsafe impl FrameAllocator for LockedFrameAllocator { })? } - #[track_caller] fn deallocate_frame(&self, frame: PhysFrame) { - // let caller = core::panic::Location::caller(); - // log::debug!("deallocation request of 2MiB by {:?}", caller); - self.0 .get() .map(|m| { m.lock_irq() .deallocate_frame_inner(frame.start_address(), order_from_size(Size2MiB::SIZE)) }) - .unwrap_or(()); + .unwrap() } } From 36cbc6b01faa40cbda41228be9dcc36556d5701d Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 13 Mar 2023 14:21:41 +1100 Subject: [PATCH 150/368] dma: allocate the nearest size Currently in the `DmaAllocator`, if the request size was greater than PAGE_SIZE (4KiB), the allocator would allocate a 2MiB page to satisfy the allocation request. The memory required to satisfy the request is relaxed by finding the nearest buddy order from the allocation request size and allocating with that order instead. Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/mem/paging/addr.rs | 8 ++++- src/aero_kernel/src/mem/paging/frame.rs | 44 ++++++++++++------------- src/aero_kernel/src/utils/dma.rs | 20 ++--------- 3 files changed, 31 insertions(+), 41 deletions(-) diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 32db783a020..32b2a8d81d0 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -111,6 +111,11 @@ impl VirtAddr { } } + pub fn as_bytes_mut(&self, size_bytes: usize) -> &mut [u8] { + assert!(self.validate_read::<&[u8]>()); + unsafe { core::slice::from_raw_parts_mut(self.as_mut_ptr(), size_bytes) } + } + /// Converts this HHDM (Higher Half Direct Map) virtual address to its physical address. pub fn as_hhdm_phys(&self) -> PhysAddr { unsafe { PhysAddr::new(self.clone() - crate::PHYSICAL_MEMORY_OFFSET) } @@ -118,7 +123,8 @@ impl VirtAddr { /// Returns if the address is valid to read `sizeof(T)` bytes at the address. fn validate_read(&self) -> bool { - // FIXME: (*self + core::mem::size_of::()) <= crate::arch::task::userland_last_address() // in-range + // FIXME: (*self + core::mem::size_of::()) <= crate::arch::task::userland_last_address() + // // in-range self.0 != 0 // non-null } diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 243a4dbaef4..ce8d5b782fa 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -78,19 +78,26 @@ impl LockedFrameAllocator { self.0 .call_once(|| Mutex::new(GlobalFrameAllocator::new(memory_map))); } + + pub fn alloc(&self, size_bytes: usize) -> Option { + let order = order_from_size(size_bytes as u64); + + let mut allocator = self.0.get()?.lock_irq(); + allocator.allocate_frame_inner(order) + } + + pub fn alloc_zeroed(&self, size_bytes: usize) -> Option { + let addr = self.alloc(size_bytes)?; + addr.as_hhdm_virt().as_bytes_mut(size_bytes).fill(0); + + Some(addr) + } } unsafe impl FrameAllocator for LockedFrameAllocator { fn allocate_frame(&self) -> Option> { - self.0.get().map(|m| { - m.lock_irq() - .allocate_frame_inner(order_from_size(Size4KiB::SIZE)) - .map(|f| { - let frame = PhysFrame::containing_address(f); - frame.as_slice_mut().fill(0); - frame - }) - })? + let phys = self.alloc(Size4KiB::SIZE as _)?; + Some(PhysFrame::containing_address(phys)) } fn deallocate_frame(&self, frame: PhysFrame) { @@ -106,11 +113,8 @@ unsafe impl FrameAllocator for LockedFrameAllocator { unsafe impl FrameAllocator for LockedFrameAllocator { fn allocate_frame(&self) -> Option> { - self.0.get().map(|m| { - m.lock_irq() - .allocate_frame_inner(order_from_size(Size2MiB::SIZE)) - .map(|f| PhysFrame::containing_address(f)) - })? + let phys = self.alloc(Size2MiB::SIZE as _)?; + Some(PhysFrame::containing_address(phys)) } fn deallocate_frame(&self, frame: PhysFrame) { @@ -177,15 +181,9 @@ pub fn pmm_alloc(order: BuddyOrdering) -> PhysAddr { let order = order as usize; debug_assert!(order <= BUDDY_SIZE.len()); - let addr = super::FRAME_ALLOCATOR - .0 - .get() - .expect("pmm: frame allocator not initialized") - .lock() - .allocate_frame_inner(order) - .expect("pmm: out of memory"); - - addr + super::FRAME_ALLOCATOR + .alloc_zeroed(BUDDY_SIZE[order] as _) + .unwrap() } #[derive(Debug)] diff --git a/src/aero_kernel/src/utils/dma.rs b/src/aero_kernel/src/utils/dma.rs index 9a5f63e3370..5a2863843d1 100644 --- a/src/aero_kernel/src/utils/dma.rs +++ b/src/aero_kernel/src/utils/dma.rs @@ -35,23 +35,14 @@ pub struct DmaAllocator; unsafe impl Allocator for DmaAllocator { fn allocate(&self, layout: Layout) -> Result, AllocError> { // XXX: The DMA buffer must be aligned to a page boundary. - let size_bytes = layout.size() as u64; - - let phys = if size_bytes <= Size4KiB::SIZE { - let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().ok_or(AllocError)?; - frame.start_address() - } else { - assert!(size_bytes <= Size2MiB::SIZE); - - let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().ok_or(AllocError)?; - frame.start_address() - }; + let size_bytes = layout.size(); + let phys = FRAME_ALLOCATOR.alloc(size_bytes).ok_or(AllocError)?; let virt = phys.as_hhdm_virt(); // SAFETY: The frame is aligned and non-null. let ptr = unsafe { NonNull::new_unchecked(virt.as_mut_ptr() as *mut u8) }; - Ok(NonNull::slice_from_raw_parts(ptr, size_bytes as _)) + Ok(NonNull::slice_from_raw_parts(ptr, size_bytes)) } unsafe fn deallocate(&self, _ptr: NonNull, _layout: Layout) {} @@ -63,11 +54,6 @@ pub type DmaBuffer = Box; pub struct Dma(DmaBuffer); impl Dma { - /// Creates a new DMA buffer intialized with `value`. - pub fn new(value: T) -> Self { - Dma(DmaBuffer::new_in(value, DmaAllocator)) - } - /// Creates a new DMA (Direct Memory Access) buffer and is initialized /// with zeros. /// From 73749b9a61c167d4f125e99e9fb710848e260614 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 13 Mar 2023 14:26:48 +1100 Subject: [PATCH 151/368] patches::mlibc: update The sysdep changes have been upstreamed in the PR: https://github.com/managarm/mlibc/pull/809 Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 411 +------------------------------------- 1 file changed, 1 insertion(+), 410 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index fdf9648ca8d..b5b0e151ece 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -73,416 +73,7 @@ index 6eb9d09..2ab5bc9 100644 +constexpr bool logBaseAddresses = true; constexpr bool logRpath = false; constexpr bool eagerBinding = true; - -diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 29fb961..31b1a9b 100644 ---- a/sysdeps/aero/generic/aero.cpp -+++ b/sysdeps/aero/generic/aero.cpp -@@ -62,29 +62,33 @@ static frg::vector create_slice(char *const arg[]) { - } - - namespace mlibc { --int sys_futex_tid() { -- // SAFETY: gettid does not return any errors (ie. the call is always -- // successful). -- return syscall(SYS_GETTID); --} -- --int sys_futex_wait(int *pointer, int expected, const struct timespec *time) { -- auto result = syscall(SYS_FUTEX_WAIT, pointer, expected, time); -+int sys_uname(struct utsname *buf) { -+ auto result = syscall(SYS_UNAME, buf); - - if (result < 0) { - return -result; - } - -+ return result; -+} -+ -+int sys_futex_wait(int *pointer, int expected, const struct timespec *time) { -+ // auto result = syscall(SYS_FUTEX_WAIT, pointer, expected, time); -+ // -+ // if (result < 0) { -+ // return -result; -+ // } -+ // - return 0; - } - - int sys_futex_wake(int *pointer) { -- auto result = syscall(SYS_FUTEX_WAKE, pointer); -- -- if (result < 0) { -- return -result; -- } -- -+ // auto result = syscall(SYS_FUTEX_WAKE, pointer); -+ // -+ // if (result < 0) { -+ // return -result; -+ // } -+ // - return 0; - } - -@@ -114,6 +118,14 @@ int sys_vm_unmap(void *address, size_t size) { - return syscall(SYS_MUNMAP, address, size); - } - -+int sys_vm_protect(void *pointer, size_t size, int prot) { -+ auto res = syscall(SYS_MPROTECT, pointer, size, prot); -+ if (res < 0) -+ return -res; -+ -+ return 0; -+} -+ - int sys_anon_allocate(size_t size, void **pointer) { - return sys_vm_map(nullptr, size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0, pointer); -@@ -124,7 +136,9 @@ int sys_anon_free(void *pointer, size_t size) { - } - - void sys_libc_panic() { -- sys_libc_log("libc panic!"); -+ mlibc::infoLogger() << "libc_panic: panicked at 'unknown'" << frg::endlog; -+ __ensure(!syscall(SYS_BACKTRACE)); -+ - sys_exit(1); - } - -@@ -140,8 +154,15 @@ void sys_exit(int status) { - - pid_t sys_getpid() { - auto result = syscall(SYS_GETPID); -+ __ensure(result >= 0); -+ -+ return result; -+} -+ -+pid_t sys_getppid() { -+ auto result = syscall(SYS_GETPPID); -+ __ensure(result != 0); - -- __ensure(result >= 0); // getpid() cannot fail. - return result; - } - -@@ -162,11 +183,6 @@ pid_t sys_getpgid(pid_t pid, pid_t *pgid) { - return 0; - } - --pid_t sys_getppid() { -- mlibc::infoLogger() << "sys_getppid() is unimplemented" << frg::endlog; -- return 0; --} -- - int sys_clock_get(int clock, time_t *secs, long *nanos) { - struct timespec ts; - auto result = syscall(SYS_GETTIME, clock, &ts); -@@ -233,7 +249,11 @@ uid_t sys_geteuid() { - return 0; - } - --int sys_setuid(uid_t uid) UNIMPLEMENTED("sys_setuid") -+int sys_setsid(pid_t *sid) { -+ mlibc::infoLogger() << "mlibc: sys_setsid is a stub" << frg::endlog; -+ return 0; -+} -+ - int sys_seteuid(uid_t euid) UNIMPLEMENTED("sys_seteuid") - - gid_t sys_getgid() { -@@ -256,16 +276,19 @@ int sys_setegid(gid_t egid) { - return 0; - } - --void sys_yield() UNIMPLEMENTED("sys_yield") -+void sys_yield() { -+ mlibc::infoLogger() << "mlibc: sys_yield is a stub" << frg::endlog; -+ __ensure(!syscall(SYS_BACKTRACE)); -+} - - int sys_clone(void *tcb, pid_t *tid_out, void *stack) { -- auto tid = syscall(SYS_CLONE, (uintptr_t)__mlibc_start_thread, stack); -+ auto result = syscall(SYS_CLONE, (uintptr_t)__mlibc_start_thread, stack); - -- if (tid < 0) { -- return -tid; -+ if (result < 0) { -+ return -result; - } - -- *tid_out = (pid_t)tid; -+ *tid_out = (pid_t)result; - return 0; - } - -diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index a3e2aca..8a1e086 100644 ---- a/sysdeps/aero/generic/filesystem.cpp -+++ b/sysdeps/aero/generic/filesystem.cpp -@@ -118,7 +118,8 @@ int sys_ioctl(int fd, unsigned long request, void *arg, int *result) { - return -sys_res; - } - -- *result = sys_res; -+ if (result) -+ *result = sys_res; - return 0; - } - -@@ -158,11 +159,6 @@ int sys_tcsetattr(int fd, int optional_action, const struct termios *attr) { - return 0; - } - --int sys_poll(struct pollfd *fds, nfds_t count, int timeout, int *num_events) { -- mlibc::infoLogger() << "sys_poll() is not implemented" << frg::endlog; -- return 0; --} -- - int sys_mkdir(const char *path, mode_t) { - auto result = syscall(SYS_MKDIR, path, strlen(path)); - -@@ -243,7 +239,15 @@ int sys_open_dir(const char *path, int *handle) { - return sys_open(path, O_DIRECTORY, 0, handle); - } - --int sys_rename(const char *path, const char *new_path) UNIMPLEMENTED("sys_rename") -+int sys_rename(const char *path, const char *new_path) { -+ auto result = syscall(SYS_RENAME, path, strlen(path), new_path, strlen(new_path)); -+ -+ if (result < 0) { -+ return -result; -+ } -+ -+ return 0; -+} - - int sys_readlink(const char *path, void *buffer, size_t max_size, ssize_t *length) { - auto result = syscall(SYS_READ_LINK, path, strlen(path), buffer, max_size); -@@ -357,4 +361,37 @@ int sys_eventfd_create(unsigned int initval, int flags, int *fd) { - *fd = result; - return 0; - } -+ -+int sys_ppoll(struct pollfd *fds, int nfds, const struct timespec *timeout, -+ const sigset_t *sigmask, int *num_events) { -+ auto result = syscall(SYS_POLL, fds, nfds, timeout, sigmask); -+ -+ if (result < 0) { -+ return -result; -+ } -+ -+ *num_events = result; -+ return 0; -+} -+ -+int sys_poll(struct pollfd *fds, nfds_t count, int timeout, int *num_events) { -+ struct timespec ts; -+ ts.tv_sec = timeout / 1000; -+ ts.tv_nsec = (timeout % 1000) * 1000000; -+ -+ return sys_ppoll(fds, count, &ts, NULL, num_events); -+} -+ -+#ifndef MLIBC_BUILDING_RTDL -+#include -+int sys_ptsname(int fd, char *buffer, size_t length) { -+ int index; -+ if(int e = sys_ioctl(fd, TIOCGPTN, &index, NULL); e) -+ return e; -+ if((size_t)snprintf(buffer, length, "/dev/pts/%d", index) >= length) { -+ return ERANGE; -+ } -+ return 0; -+} -+#endif - } // namespace mlibc -diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp -index b6b18fe..0ee0838 100644 ---- a/sysdeps/aero/generic/sockets.cpp -+++ b/sysdeps/aero/generic/sockets.cpp -@@ -1,5 +1,7 @@ - #include - #include -+#include -+#include - - #include - #include -@@ -46,8 +48,8 @@ int sys_listen(int fd, int backlog) { - return 0; - } - --int sys_accept(int fd, int *newfd) { -- auto result = syscall(SYS_ACCEPT, fd); -+int sys_accept(int sockfd, int *newfd, struct sockaddr *addr_ptr, socklen_t *addr_length) { -+ auto result = syscall(SYS_ACCEPT, sockfd, addr_ptr, addr_length); - - if (result < 0) { - return -result; -@@ -56,4 +58,94 @@ int sys_accept(int fd, int *newfd) { - *newfd = result; - return 0; - } -+ -+int sys_msg_send(int fd, const struct msghdr *hdr, int flags, ssize_t *length) { -+ auto result = syscall(SYS_SOCK_SEND, fd, hdr, flags); -+ if (result < 0) -+ return -result; -+ -+ *length = result; -+ return 0; -+} -+ -+int sys_msg_recv(int sockfd, struct msghdr *msg_hdr, int flags, ssize_t *length) { -+ auto result = syscall(SYS_SOCK_RECV, sockfd, msg_hdr, flags); -+ -+ if (result < 0) { -+ return -result; -+ } -+ -+ *length = result; -+ return 0; -+} -+ -+int sys_socketpair(int domain, int type_and_flags, int proto, int *fds) { -+ auto result = syscall(SYS_SOCKET_PAIR, domain, type_and_flags, proto, fds); -+ -+ if (result < 0) { -+ return -result; -+ } -+ -+ return 0; -+} -+ -+int sys_getsockopt(int fd, int layer, int number, void *__restrict buffer, socklen_t *__restrict size) { -+ (void)fd; (void)size; -+ if (layer == SOL_SOCKET && number == SO_PEERCRED) { -+ mlibc::infoLogger() << "\e[31mmlibc: getsockopt() call with SOL_SOCKET and SO_PEERCRED is unimplemented\e[39m" << frg::endlog; -+ *(int *)buffer = 0; -+ return 0; -+ } else if(layer == SOL_SOCKET && number == SO_SNDBUF) { -+ mlibc::infoLogger() << "\e[31mmlibc: getsockopt() call with SOL_SOCKET and SO_SNDBUF is unimplemented\e[39m" << frg::endlog; -+ *(int *)buffer = 4096; -+ return 0; -+ } else if(layer == SOL_SOCKET && number == SO_TYPE) { -+ mlibc::infoLogger() << "\e[31mmlibc: getsockopt() call with SOL_SOCKET and SO_TYPE is unimplemented, hardcoding SOCK_STREAM\e[39m" << frg::endlog; -+ *(int *)buffer = SOCK_STREAM; -+ return 0; -+ } else if(layer == SOL_SOCKET && number == SO_ERROR) { -+ mlibc::infoLogger() << "\e[31mmlibc: getsockopt() call with SOL_SOCKET and SO_ERROR is unimplemented, hardcoding 0\e[39m" << frg::endlog; -+ *(int *)buffer = 0; -+ return 0; -+ } else if(layer == SOL_SOCKET && number == SO_KEEPALIVE) { -+ mlibc::infoLogger() << "\e[31mmlibc: getsockopt() call with SOL_SOCKET and SO_KEEPALIVE is unimplemented, hardcoding 0\e[39m" << frg::endlog; -+ *(int *)buffer = 0; -+ return 0; -+ } else{ -+ mlibc::panicLogger() << "\e[31mmlibc: Unexpected getsockopt() call, layer: " << layer << " number: " << number << "\e[39m" << frg::endlog; -+ __builtin_unreachable(); -+ } -+ -+ return 0; -+} -+ -+int sys_setsockopt(int fd, int layer, int number, const void *buffer, socklen_t size) { -+ (void)fd; (void)buffer; (void)size; -+ -+ if (layer == SOL_SOCKET && number == SO_PASSCRED) { -+ mlibc::infoLogger() << "\e[31mmlibc: setsockopt(SO_PASSCRED) is not implemented correctly\e[39m" << frg::endlog; -+ return 0; -+ } else if (layer == SOL_SOCKET && number == SO_ATTACH_FILTER) { -+ mlibc::infoLogger() << "\e[31mmlibc: setsockopt(SO_ATTACH_FILTER) is not implemented correctly\e[39m" << frg::endlog; -+ return 0; -+ } else if (layer == SOL_SOCKET && number == SO_RCVBUFFORCE) { -+ mlibc::infoLogger() << "\e[31mmlibc: setsockopt(SO_RCVBUFFORCE) is not implemented correctly\e[39m" << frg::endlog; -+ return 0; -+ } else if (layer == SOL_SOCKET && number == SO_SNDBUF) { -+ mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with SOL_SOCKET and SO_SNDBUF is unimplemented\e[39m" << frg::endlog; -+ return 0; -+ } else if (layer == SOL_SOCKET && number == SO_KEEPALIVE) { -+ mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with SOL_SOCKET and SO_KEEPALIVE is unimplemented\e[39m" << frg::endlog; -+ return 0; -+ } else if (layer == SOL_SOCKET && number == SO_REUSEADDR) { -+ mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with SOL_SOCKET and SO_REUSEADDR is unimplemented\e[39m" << frg::endlog; -+ return 0; -+ } else if (layer == AF_NETLINK && number == SO_ACCEPTCONN) { -+ mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with AF_NETLINK and SO_ACCEPTCONN is unimplemented\e[39m" << frg::endlog; -+ return 0; -+ } else { -+ mlibc::panicLogger() << "\e[31mmlibc: Unexpected setsockopt() call, layer: " << layer << " number: " << number << "\e[39m" << frg::endlog; -+ __builtin_unreachable(); -+ } -+} - } // namespace mlibc -diff --git a/sysdeps/aero/generic/time.cpp b/sysdeps/aero/generic/time.cpp -new file mode 100644 -index 0000000..460412d ---- /dev/null -+++ b/sysdeps/aero/generic/time.cpp -@@ -0,0 +1,24 @@ -+#include -+#include -+ -+namespace mlibc { -+int sys_setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value) { -+ auto result = syscall(SYS_SETITIMER, which, new_value, old_value); -+ -+ if (result < 0) { -+ return -result; -+ } -+ -+ return 0; -+} -+ -+int sys_getitimer(int which, struct itimerval *curr_value) { -+ auto result = syscall(SYS_GETITIMER, which, curr_value); -+ -+ if (result < 0) { -+ return -result; -+ } -+ -+ return 0; -+} -+} -\ No newline at end of file -diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 12f8dc6..432bad2 100644 ---- a/sysdeps/aero/include/aero/syscall.h -+++ b/sysdeps/aero/include/aero/syscall.h -@@ -64,6 +64,17 @@ - #define SYS_FUTEX_WAIT 57 - #define SYS_FUTEX_WAKE 58 - #define SYS_LINK 59 -+#define SYS_BACKTRACE 60 -+#define SYS_POLL 61 -+#define SYS_EXIT_THREAD 62 -+#define SYS_SOCK_RECV 63 -+#define SYS_SETITIMER 64 -+#define SYS_GETITIMER 65 -+#define SYS_GETPPID 66 -+#define SYS_SOCKET_PAIR 67 -+#define SYS_RENAME 68 -+#define SYS_MPROTECT 69 -+#define SYS_SOCK_SEND 70 - - // Invalid syscall used to trigger a log error in the kernel (as a hint) - // so, that we can implement the syscall in the kernel. -diff --git a/sysdeps/aero/meson.build b/sysdeps/aero/meson.build -index a807b37..878c216 100644 ---- a/sysdeps/aero/meson.build -+++ b/sysdeps/aero/meson.build -@@ -11,6 +11,7 @@ libc_sources += files( - 'generic/filesystem.cpp', - 'generic/sockets.cpp', - 'generic/signals.cpp', -+ 'generic/time.cpp', - ) - - if not no_headers + -- 2.39.1 From 7bfbb0f4a57e119d5ed01ce1e76a05759f36bc9d Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 13 Mar 2023 15:48:11 +1100 Subject: [PATCH 152/368] init: swap `/dev/tty` std{in,out,err} file descriptors with `/dev/null` * This fixes the fwrite() errors in mlibc on Xorg startup. * Implement poll() on `/dev/null` Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/devfs.rs | 4 +++ userland/apps/init/src/main.rs | 55 +++++++++++++++++++++------------ 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index a4c5c7b80ca..878f3b609b0 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -188,6 +188,10 @@ impl INodeInterface for DevNull { fn write_at(&self, _offset: usize, buffer: &[u8]) -> Result { Ok(buffer.len()) } + + fn poll(&self, _table: Option<&mut PollTable>) -> Result { + Ok(PollFlags::OUT) + } } struct DevKmsg(usize); diff --git a/userland/apps/init/src/main.rs b/userland/apps/init/src/main.rs index 75001f5f583..5b08dcba9d2 100644 --- a/userland/apps/init/src/main.rs +++ b/userland/apps/init/src/main.rs @@ -1,5 +1,5 @@ /* -* Copyright (C) 2021-2022 The Aero Project Developers. + * Copyright (C) 2021-2022 The Aero Project Developers. * * This file is part of The Aero Project. * @@ -23,18 +23,29 @@ use std::os::fd::AsRawFd; use std::process::Command; const TTY_PATH: &str = "/dev/tty"; +const DEV_NULL: &str = "/dev/null"; -fn remove_cloexec(file: &File) { - // By default rust automatically sets the close-on-exe flag to prevent - // leaking file descriptors. - // - // OpenOptions::custom_flags() only allows insertion of flags and are - // overwritten by the flags set by the standard library. So here, we - // need to manually update the flags after opening the file. - let fd = file.as_raw_fd(); +struct FileSet([File; N]); - unsafe { - assert!(libc::fcntl(fd, libc::F_SETFD, 0 /* flags */) == 0); +impl FileSet { + fn new(files: [File; N]) -> Self { + Self(files) + } + + fn remove_cloexec(&self) { + for file in self.0.iter() { + // By default rust automatically sets the close-on-exe flag to prevent + // leaking file descriptors. + // + // OpenOptions::custom_flags() only allows insertion of flags and are + // overwritten by the flags set by the standard library. So here, we + // need to manually update the flags after opening the file. + let fd = file.as_raw_fd(); + + unsafe { + assert!(libc::fcntl(fd, libc::F_SETFD, 0 /* flags */) == 0); + } + } } } @@ -44,17 +55,21 @@ fn main() -> Result<(), Box> { let stdout = OpenOptions::new().write(true).open(TTY_PATH)?; // fd=1 let stderr = OpenOptions::new().write(true).open(TTY_PATH)?; // fd=2 - remove_cloexec(&stdin); - remove_cloexec(&stdout); - remove_cloexec(&stderr); + { + let stdset = FileSet::new([stdin, stdout, stderr]); + stdset.remove_cloexec(); + + Command::new("dhcpd").spawn()?; + } - Command::new("dhcpd").spawn()?; + // Swap the `/dev/tty` std{in,out,err} file descriptors with `/dev/null` to suppress the Xorg + // server logs. + let stdin = OpenOptions::new().read(true).open(DEV_NULL)?; // fd=0 + let stdout = OpenOptions::new().write(true).open(DEV_NULL)?; // fd=1 + let stderr = OpenOptions::new().write(true).open(DEV_NULL)?; // fd=2 - // Close the std{in,out,err} file descriptors, since now we are going to - // start an X session. - drop(stdin); - drop(stdout); - drop(stderr); + let stdset = FileSet::new([stdin, stdout, stderr]); + stdset.remove_cloexec(); Command::new("startx") .env("RUST_BACKTRACE", "full") From 20ad092bcdc732addf6addf91ba1754c6de765fc Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 13 Mar 2023 16:21:04 +1100 Subject: [PATCH 153/368] sockets::inet:: `SIOCGIFINDEX` stub Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 66 +++++++++++++++++++++++------- src/aero_kernel/src/socket/inet.rs | 29 ++++++++++--- src/aero_syscall/src/consts.rs | 25 ++++++++++- 3 files changed, 98 insertions(+), 22 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index b5b0e151ece..359b2199990 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,21 +1,15 @@ -From fb1766aa2abfb310b6c1b0904f849f5d6c8fb62b Mon Sep 17 00:00:00 2001 +From 7ffa4a93ab4c1a5a5dd129dce1d03f784ace2e06 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sat, 11 Mar 2023 16:55:47 +1100 +Date: Mon, 13 Mar 2023 16:14:34 +1100 Subject: [PATCH] --- - .gitignore | 2 + - options/ansi/generic/stdlib-stubs.cpp | 6 +- - options/glibc/generic/execinfo.cpp | 5 +- + .gitignore | 2 ++ + options/ansi/generic/stdlib-stubs.cpp | 6 ++++-- + options/glibc/generic/execinfo.cpp | 5 +++-- options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 77 +++++++++++++-------- - sysdeps/aero/generic/filesystem.cpp | 51 ++++++++++++-- - sysdeps/aero/generic/sockets.cpp | 96 ++++++++++++++++++++++++++- - sysdeps/aero/generic/time.cpp | 24 +++++++ - sysdeps/aero/include/aero/syscall.h | 11 +++ - sysdeps/aero/meson.build | 1 + - 10 files changed, 234 insertions(+), 41 deletions(-) - create mode 100644 sysdeps/aero/generic/time.cpp + sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++++++ + 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index fdd60a0..9f811f4 100644 @@ -73,7 +67,49 @@ index 6eb9d09..2ab5bc9 100644 +constexpr bool logBaseAddresses = true; constexpr bool logRpath = false; constexpr bool eagerBinding = true; - + +diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp +index c730bff..39cacb4 100644 +--- a/sysdeps/aero/generic/sockets.cpp ++++ b/sysdeps/aero/generic/sockets.cpp +@@ -4,7 +4,11 @@ + #include + + #include ++ ++#include + #include ++#include ++#include + + namespace mlibc { + int sys_socket(int family, int type, int protocol, int *fd) { +@@ -187,4 +191,25 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, + __builtin_unreachable(); + } + } ++ ++int sys_if_nametoindex(const char *name, unsigned int *ret) { ++ int fd = 0; ++ ++ // TODO(andypython): is the SOCK_CLOEXEC flag required in this case? ++ int r = sys_socket(AF_INET, SOCK_DGRAM, AF_UNSPEC, &fd); ++ if (r) ++ return r; ++ ++ struct ifreq ifr; ++ strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); ++ ++ r = sys_ioctl(fd, SIOCGIFINDEX, &ifr, NULL); ++ close(fd); ++ ++ if (r) ++ return r; ++ ++ *ret = ifr.ifr_ifindex; ++ return 0; ++} + } // namespace mlibc -- -2.39.1 +2.39.2 diff --git a/src/aero_kernel/src/socket/inet.rs b/src/aero_kernel/src/socket/inet.rs index adbe243176e..85793b88a21 100644 --- a/src/aero_kernel/src/socket/inet.rs +++ b/src/aero_kernel/src/socket/inet.rs @@ -17,7 +17,7 @@ * along with Aero. If not, see . */ -use aero_syscall::prelude::{IfReq, SIOCGIFHWADDR, SIOCSIFADDR}; +use aero_syscall::prelude::{IfReq, SIOCGIFHWADDR, SIOCGIFINDEX, SIOCSIFADDR}; use aero_syscall::socket::MessageHeader; use aero_syscall::{IpProtocol, OpenFlags, SocketAddrInet, SocketType, SyscallError}; use alloc::sync::{Arc, Weak}; @@ -64,7 +64,9 @@ pub struct InetSocket { impl InetSocket { pub fn new(typ: SocketType, protocol: IpProtocol) -> Result, SyscallError> { - if typ != SocketType::Dgram && protocol != IpProtocol::Udp { + if typ != SocketType::Dgram + && (protocol != IpProtocol::Udp || protocol != IpProtocol::Default) + { return Err(SyscallError::EINVAL); } @@ -228,6 +230,18 @@ impl INodeInterface for InetSocket { fn ioctl(&self, command: usize, arg: usize) -> fs::Result { match command { + SIOCGIFINDEX => { + let ifreq = VirtAddr::new(arg as _) + .read_mut::() + .ok_or(FileSystemError::NotSupported)?; + + let name = ifreq.name().unwrap(); + assert!(name == "eth0"); + + ifreq.data.ifindex = 1; // FIXME: Fill the actual interface index + Ok(0) + } + SIOCGIFHWADDR => { let ifreq = VirtAddr::new(arg as _) .read_mut::() @@ -237,7 +251,10 @@ impl INodeInterface for InetSocket { assert!(name == "eth0"); let hwaddr = unsafe { - core::slice::from_raw_parts_mut(ifreq.sa_data.as_mut_ptr(), MacAddr::ADDR_SIZE) + core::slice::from_raw_parts_mut( + ifreq.data.addr.sa_data.as_mut_ptr(), + MacAddr::ADDR_SIZE, + ) }; let mac_addr = net::default_device().mac(); @@ -250,10 +267,12 @@ impl INodeInterface for InetSocket { .read_mut::() .ok_or(FileSystemError::NotSupported)?; + let family = unsafe { ifreq.data.addr.sa_family }; + let name = ifreq.name().ok_or(FileSystemError::InvalidPath)?; let socket = SocketAddr::from_family( - VirtAddr::new(&ifreq.sa_family as *const _ as _), - ifreq.sa_family, + VirtAddr::new(&unsafe { ifreq.data.addr } as *const _ as _), + family, ) .ok_or(FileSystemError::NotSupported)? .as_inet() diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index b1d3393c5d7..5eb16b639b0 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -17,6 +17,8 @@ * along with Aero. If not, see . */ +use core::ffi; + use crate::OpenFlags; // syscall number constants: @@ -348,17 +350,36 @@ pub struct FramebufferFScreenInfo { } // networking ioctls: +pub const SIOCGIFINDEX: usize = 0x8933; pub const SIOCGIFHWADDR: usize = 0x8927; pub const SIOCSIFADDR: usize = 0x8916; // set PA address const IF_NAME_SIZE: usize = 16; +#[derive(Clone, Copy)] +#[repr(C)] +pub struct SockAddrStorage { + pub sa_family: u32, + pub sa_data: [u8; 14], +} + +#[repr(C)] +pub union IfrIfru { + pub addr: SockAddrStorage, + pub flags: ffi::c_short, + pub ifindex: ffi::c_int, + pub metric: ffi::c_int, + pub mtu: ffi::c_int, + pub slave: [u8; IF_NAME_SIZE], + pub newname: [u8; IF_NAME_SIZE], + pub data: *mut u8, +} + #[repr(C)] pub struct IfReq { /// interface name, e.g. "en0" pub name: [u8; IF_NAME_SIZE], - pub sa_family: u32, - pub sa_data: [u8; 14], + pub data: IfrIfru, } impl IfReq { From 3f2fb2c1501f6e19aff0357a3f675416fd3089df Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 15 Mar 2023 16:34:03 +1100 Subject: [PATCH 154/368] kernel: update the limine crate Signed-off-by: Andy-Python-Programmer --- src/Cargo.lock | 4 ++-- src/aero_kernel/src/arch/x86_64/mod.rs | 20 ++++++++++---------- src/aero_kernel/src/cmdline.rs | 6 +++--- src/aero_kernel/src/mem/paging/frame.rs | 12 ++++++------ src/aero_kernel/src/mem/paging/mod.rs | 4 ++-- src/aero_kernel/src/rendy.rs | 8 ++++---- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index f4314f3069a..30fb60cfebf 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -240,8 +240,8 @@ checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" [[package]] name = "limine" -version = "0.1.9" -source = "git+https://github.com/limine-bootloader/limine-rs#83c7e72b82ced03f436f022138e7461cc4818a9d" +version = "0.1.10" +source = "git+https://github.com/limine-bootloader/limine-rs#2f0ae642064749372a61cf3290f22ce71d21df27" [[package]] name = "log" diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index a8b39f15fe9..372fdbe067c 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -48,15 +48,15 @@ use limine::*; use self::interrupts::INTERRUPT_CONTROLLER; -static MEMMAP: LimineMemmapRequest = LimineMemmapRequest::new(0); -static SMP: LimineSmpRequest = LimineSmpRequest::new(0); -static KERNEL_FILE: LimineKernelFileRequest = LimineKernelFileRequest::new(0); -static MODULES: LimineModuleRequest = LimineModuleRequest::new(0); -static FRAMEBUFFER: LimineFramebufferRequest = LimineFramebufferRequest::new(0); -static RSDP: LimineRsdpRequest = LimineRsdpRequest::new(0); -static BOOT_TIME: LimineBootTimeRequest = LimineBootTimeRequest::new(0); -static STACK: LimineStackSizeRequest = LimineStackSizeRequest::new(0).stack_size(0x1000 * 32); // 16KiB of stack for both the BSP and the APs -static HHDM: LimineHhdmRequest = LimineHhdmRequest::new(0); +static MEMMAP: MemmapRequest = MemmapRequest::new(0); +static SMP: SmpRequest = SmpRequest::new(0); +static KERNEL_FILE: KernelFileRequest = KernelFileRequest::new(0); +static MODULES: ModuleRequest = ModuleRequest::new(0); +static FRAMEBUFFER: FramebufferRequest = FramebufferRequest::new(0); +static RSDP: RsdpRequest = RsdpRequest::new(0); +static BOOT_TIME: BootTimeRequest = BootTimeRequest::new(0); +static STACK: StackSizeRequest = StackSizeRequest::new(0).stack_size(0x1000 * 32); // 16KiB of stack for both the BSP and the APs +static HHDM: HhdmRequest = HhdmRequest::new(0); #[no_mangle] extern "C" fn arch_aero_main() -> ! { @@ -203,7 +203,7 @@ extern "C" fn arch_aero_main() -> ! { } #[no_mangle] -extern "C" fn x86_64_aero_ap_main(boot_info: *const LimineSmpInfo) -> ! { +extern "C" fn x86_64_aero_ap_main(boot_info: *const SmpInfo) -> ! { let boot_info = unsafe { &*boot_info }; let ap_id = boot_info.processor_id as usize; diff --git a/src/aero_kernel/src/cmdline.rs b/src/aero_kernel/src/cmdline.rs index 682c9c949d4..23649470514 100644 --- a/src/aero_kernel/src/cmdline.rs +++ b/src/aero_kernel/src/cmdline.rs @@ -1,6 +1,6 @@ use core::num::ParseIntError; -use limine::{LimineFile, NonNullPtr}; +use limine::NonNullPtr; use spin::Once; use crate::rendy; @@ -27,7 +27,7 @@ impl CommandLine { } } -fn resolve_module(modules: &[NonNullPtr], name: &str) -> &'static [u8] { +fn resolve_module(modules: &[NonNullPtr], name: &str) -> &'static [u8] { modules .iter() .find(|m| { @@ -55,7 +55,7 @@ fn parse_number(mut string: &str) -> Result { } } -pub fn parse(cmdline: &'static str, modules: &[NonNullPtr]) -> CommandLine { +pub fn parse(cmdline: &'static str, modules: &[NonNullPtr]) -> CommandLine { RAW_CMDLINE_STR.call_once(|| cmdline); // Chew up the leading spaces. diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index ce8d5b782fa..64a6994498c 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -22,7 +22,7 @@ use core::ptr::NonNull; use core::sync::atomic::{AtomicUsize, Ordering}; use alloc::vec::Vec; -use limine::{LimineMemmapEntry, LimineMemoryMapEntryType, NonNullPtr}; +use limine::{MemmapEntry, MemoryMapEntryType, NonNullPtr}; use spin::Once; use super::mapper::*; @@ -74,7 +74,7 @@ impl LockedFrameAllocator { } /// Initializes the inner locked global frame allocator. - pub(super) fn init(&self, memory_map: &mut [NonNullPtr]) { + pub(super) fn init(&self, memory_map: &mut [NonNullPtr]) { self.0 .call_once(|| Mutex::new(GlobalFrameAllocator::new(memory_map))); } @@ -129,7 +129,7 @@ unsafe impl FrameAllocator for LockedFrameAllocator { } struct RangeMemoryIter<'a> { - iter: core::slice::Iter<'a, NonNullPtr>, + iter: core::slice::Iter<'a, NonNullPtr>, cursor_base: PhysAddr, cursor_end: PhysAddr, @@ -145,7 +145,7 @@ impl<'a> Iterator for RangeMemoryIter<'a> { // the memory map and set the cursor to the start of it. let next = self.iter.next()?; - if next.typ == LimineMemoryMapEntryType::Usable { + if next.typ == MemoryMapEntryType::Usable { break Some(next); } } { @@ -290,7 +290,7 @@ pub struct GlobalFrameAllocator { } impl GlobalFrameAllocator { - fn new(memory_map: &mut [NonNullPtr]) -> Self { + fn new(memory_map: &mut [NonNullPtr]) -> Self { // Find a memory map entry that is big enough to fit all of the items in // range memory iter. let requested_size = (core::mem::size_of::() * memory_map.len()) as u64; @@ -300,7 +300,7 @@ impl GlobalFrameAllocator { let entry = &mut memory_map[i]; // Make sure that the memory map entry is marked as usable. - if entry.typ != LimineMemoryMapEntryType::Usable { + if entry.typ != MemoryMapEntryType::Usable { continue; } diff --git a/src/aero_kernel/src/mem/paging/mod.rs b/src/aero_kernel/src/mem/paging/mod.rs index 31ffa1db195..02e9c3c53f7 100644 --- a/src/aero_kernel/src/mem/paging/mod.rs +++ b/src/aero_kernel/src/mem/paging/mod.rs @@ -30,7 +30,7 @@ pub use self::mapper::*; pub use self::page::*; pub use self::page_table::*; -use limine::LimineMemmapEntry; +use limine::MemmapEntry; use limine::NonNullPtr; pub use frame::LockedFrameAllocator; @@ -81,7 +81,7 @@ pub const fn level_5_paging_enabled() -> bool { /// Initialize paging. pub fn init( - memory_regions: &mut [NonNullPtr], + memory_regions: &mut [NonNullPtr], ) -> Result, MapToError> { let active_level_4 = unsafe { active_level_4_table() }; let offset_table = unsafe { OffsetPageTable::new(active_level_4, PHYSICAL_MEMORY_OFFSET) }; diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index df9bfc8ee20..f5b7ca00752 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -24,7 +24,7 @@ use core::u8; use alloc::boxed::Box; -use limine::LimineFramebuffer; +use limine::Framebuffer; use spin::Once; use crate::cmdline::CommandLine; @@ -823,8 +823,8 @@ pub fn reset_default() { set_text_color(DEFAULT_TEXT_FOREGROUND, DEFAULT_TEXT_BACKGROUND) } -/// Returns the terminal's resolution in the form of a `(horizontal_resolution, vertical_resolution)` -/// tuple. +/// Returns the terminal's resolution in the form of a `(horizontal_resolution, +/// vertical_resolution)` tuple. /// /// # Panics /// This function was called before the terminal was initialized. @@ -936,7 +936,7 @@ pub unsafe fn force_unlock() { DEBUG_RENDY.get().map(|l| l.force_unlock()); } -pub fn init(framebuffer_tag: &LimineFramebuffer, cmdline: &CommandLine) { +pub fn init(framebuffer_tag: &Framebuffer, cmdline: &CommandLine) { let framebuffer_info = RendyInfo { byte_len: framebuffer_tag.size(), bits_per_pixel: framebuffer_tag.bpp as usize, From 49feaa0fc463a27dbcf530fda336d44fcd8753b2 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 15 Mar 2023 17:37:51 +1100 Subject: [PATCH 155/368] VirtAddr::read_mut: return `ReadErr` instead of None This makes error handling in the syscalls much cleaner. Another thing that we could do is specifically have a `UserVirtAddr` structure, which on reads validates that the memory that we are reading is valid for memory R/W (depending of mutablity) in the read_{mut} function and the address is a valid userland address (under arch::userland_max_address()). Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/e1000.rs | 16 ++++--- src/aero_kernel/src/drivers/pty.rs | 28 ++++-------- src/aero_kernel/src/fs/devfs.rs | 5 +-- src/aero_kernel/src/main.rs | 3 +- src/aero_kernel/src/mem/paging/addr.rs | 60 +++++++++++++++++--------- src/aero_kernel/src/socket/inet.rs | 14 ++---- src/aero_kernel/src/socket/mod.rs | 8 ++-- src/aero_kernel/src/socket/unix.rs | 7 +-- src/aero_kernel/src/syscall/fs.rs | 2 +- src/aero_kernel/src/syscall/futex.rs | 2 +- src/aero_kernel/src/syscall/net.rs | 12 ++---- src/aero_kernel/src/utils/mod.rs | 26 +++++------ src/aero_proc/src/syscall.rs | 14 +++--- 13 files changed, 95 insertions(+), 102 deletions(-) diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index db5500cb585..d828655cb4f 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -41,7 +41,13 @@ enum Error { UnknownBar, NoEeprom, OutOfMemory, - NotSupported, + ReadErr(ReadErr), +} + +impl From for Error { + fn from(value: ReadErr) -> Self { + Self::ReadErr(value) + } } #[derive(Copy, Clone)] @@ -446,9 +452,7 @@ impl E1000 { let phys = frame.start_address(); let addr = phys.as_hhdm_virt(); - let descriptors = addr - .read_mut::<[TxDescriptor; TX_DESC_NUM as usize]>() - .ok_or(Error::NotSupported)?; + let descriptors = addr.read_mut::<[TxDescriptor; TX_DESC_NUM as usize]>()?; for desc in descriptors { *desc = TxDescriptor::default(); @@ -485,9 +489,7 @@ impl E1000 { let phys = frame.start_address(); let addr = phys.as_hhdm_virt(); - let descriptors = addr - .read_mut::<[RxDescriptor; RX_DESC_NUM as usize]>() - .ok_or(Error::NotSupported)?; + let descriptors = addr.read_mut::<[RxDescriptor; RX_DESC_NUM as usize]>()?; for desc in descriptors { let frame: PhysFrame = diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 8b6abab4799..78ea5f877dd 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -108,18 +108,12 @@ impl INodeInterface for Master { fn ioctl(&self, command: usize, arg: usize) -> fs::Result { match command { TIOCGPTN => { - let id = VirtAddr::new(arg as u64) - .read_mut::() - .ok_or(FileSystemError::NotSupported)?; - + let id = VirtAddr::new(arg as u64).read_mut::()?; *id = self.id; } aero_syscall::TIOCSWINSZ => { - let winsize = VirtAddr::new(arg as u64) - .read_mut::() - .ok_or(FileSystemError::NotSupported)?; - + let winsize = VirtAddr::new(arg as u64).read_mut::()?; *self.window_size.lock_irq() = *winsize; } @@ -180,29 +174,23 @@ impl INodeInterface for Slave { match command { aero_syscall::TIOCGWINSZ => { - let winsize = VirtAddr::new(arg as u64) - .read_mut::() - .ok_or(FileSystemError::NotSupported)?; - + let winsize = VirtAddr::new(arg as u64).read_mut::()?; *winsize = *self.master.window_size.lock_irq(); + Ok(0) } aero_syscall::TCGETS => { - let termios = VirtAddr::new(arg as u64) - .read_mut::() - .ok_or(FileSystemError::NotSupported)?; - + let termios = VirtAddr::new(arg as u64).read_mut::()?; *termios = inner.termios; + Ok(0) } aero_syscall::TCSETSF => { - let termios = VirtAddr::new(arg as u64) - .read_mut::() - .ok_or(FileSystemError::NotSupported)?; - + let termios = VirtAddr::new(arg as u64).read_mut::()?; inner.termios = *termios; + Ok(0) } diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index 878f3b609b0..e385ab6ab09 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -390,10 +390,7 @@ impl INodeInterface for DevFb { // Device independent colormap information can be get and set using // the `FBIOGETCMAP` and `FBIOPUTCMAP` ioctls. FBIOPUTCMAP => { - let struc = VirtAddr::new(arg as _) - .read_mut::() - .ok_or(FileSystemError::NotSupported); - + let struc = VirtAddr::new(arg as _).read_mut::()?; log::debug!("fbdev: `FBIOPUTCMAP` is a stub! {struc:?}"); Ok(0) } diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 1c16fa87971..b4519d3eb1a 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -44,7 +44,8 @@ nonnull_slice_from_raw_parts, maybe_uninit_write_slice, slice_ptr_get, - maybe_uninit_as_bytes + maybe_uninit_as_bytes, + pointer_is_aligned )] #![deny(trivial_numeric_casts, unused_allocation)] #![test_runner(crate::tests::test_runner)] diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 32b2a8d81d0..c88752eb8df 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -23,6 +23,8 @@ use core::fmt; use core::iter::Step; use core::ops::{Add, AddAssign, Sub, SubAssign}; +use crate::fs::FileSystemError; + use super::page_table::{PageOffset, PageTableIndex}; use super::{PageSize, Size4KiB, VmFrame}; @@ -52,14 +54,28 @@ pub struct VirtAddr(u64); #[repr(transparent)] pub struct PhysAddr(u64); -/// A passed `u64` was not a valid virtual address. -/// -/// This means that bits 48 to 64 are not -/// a valid sign extension and are not null either. So automatic sign extension would have -/// overwritten possibly meaningful bits. This likely indicates a bug, for example an invalid -/// address calculation. -#[derive(Debug)] -pub struct VirtAddrNotValid(u64); +#[derive(Copy, Clone, Debug)] +pub enum ReadErr { + Null, + NotAligned, +} + +impl From for FileSystemError { + fn from(_: ReadErr) -> Self { + // `FileSystemError::NotSupported` will be converted to `EINVAL` on + // syscall error conversion. + FileSystemError::NotSupported + } +} + +impl From for aero_syscall::SyscallError { + fn from(value: ReadErr) -> Self { + match value { + ReadErr::Null => Self::EINVAL, + ReadErr::NotAligned => Self::EACCES, + } + } +} impl VirtAddr { /// Creates a new canonical virtual address. @@ -99,20 +115,15 @@ impl VirtAddr { /// /// ## Example /// ```no_run - /// let address: &mut SomeStruct = VirtAddr::new(0xcafebabe) - /// .read_mut::(); - /// .ok_or(AeroSyscallError::EFAULT)?; + /// let address: &mut SomeStruct = VirtAddr::new(0xcafebabe).read_mut::()?; /// ``` - pub fn read_mut<'struc, T: Sized>(&self) -> Option<&'struc mut T> { - if self.validate_read::() { - Some(unsafe { &mut *(self.as_mut_ptr() as *mut T) }) - } else { - None - } + pub fn read_mut<'a, T: Sized>(&self) -> Result<&'a mut T, ReadErr> { + self.validate_read::()?; + Ok(unsafe { &mut *(self.as_mut_ptr() as *mut T) }) } pub fn as_bytes_mut(&self, size_bytes: usize) -> &mut [u8] { - assert!(self.validate_read::<&[u8]>()); + self.validate_read::<&[u8]>().unwrap(); unsafe { core::slice::from_raw_parts_mut(self.as_mut_ptr(), size_bytes) } } @@ -122,10 +133,17 @@ impl VirtAddr { } /// Returns if the address is valid to read `sizeof(T)` bytes at the address. - fn validate_read(&self) -> bool { + fn validate_read(&self) -> Result<(), ReadErr> { // FIXME: (*self + core::mem::size_of::()) <= crate::arch::task::userland_last_address() - // // in-range - self.0 != 0 // non-null + let raw = self.as_ptr::(); + + if raw.is_null() { + return Err(ReadErr::Null); + } else if !raw.is_aligned() { + return Err(ReadErr::NotAligned); + } + + Ok(()) } /// Aligns the virtual address downwards to the given alignment. diff --git a/src/aero_kernel/src/socket/inet.rs b/src/aero_kernel/src/socket/inet.rs index 85793b88a21..47dece88f9a 100644 --- a/src/aero_kernel/src/socket/inet.rs +++ b/src/aero_kernel/src/socket/inet.rs @@ -231,9 +231,7 @@ impl INodeInterface for InetSocket { fn ioctl(&self, command: usize, arg: usize) -> fs::Result { match command { SIOCGIFINDEX => { - let ifreq = VirtAddr::new(arg as _) - .read_mut::() - .ok_or(FileSystemError::NotSupported)?; + let ifreq = VirtAddr::new(arg as _).read_mut::()?; let name = ifreq.name().unwrap(); assert!(name == "eth0"); @@ -243,9 +241,7 @@ impl INodeInterface for InetSocket { } SIOCGIFHWADDR => { - let ifreq = VirtAddr::new(arg as _) - .read_mut::() - .ok_or(FileSystemError::NotSupported)?; + let ifreq = VirtAddr::new(arg as _).read_mut::()?; let name = ifreq.name().ok_or(FileSystemError::InvalidPath)?; assert!(name == "eth0"); @@ -263,9 +259,7 @@ impl INodeInterface for InetSocket { } SIOCSIFADDR => { - let ifreq = VirtAddr::new(arg as _) - .read_mut::() - .ok_or(FileSystemError::NotSupported)?; + let ifreq = VirtAddr::new(arg as _).read_mut::()?; let family = unsafe { ifreq.data.addr.sa_family }; @@ -274,7 +268,7 @@ impl INodeInterface for InetSocket { VirtAddr::new(&unsafe { ifreq.data.addr } as *const _ as _), family, ) - .ok_or(FileSystemError::NotSupported)? + .map_err(|_| FileSystemError::NotSupported)? .as_inet() .ok_or(FileSystemError::NotSupported)?; diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index fda07b7c1b5..83cbe0987fd 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -31,12 +31,12 @@ pub enum SocketAddr<'a> { } impl<'a> SocketAddr<'a> { - pub fn from_family(address: VirtAddr, family: u32) -> Option { + pub fn from_family(address: VirtAddr, family: u32) -> Result { match family { - AF_UNIX => Some(SocketAddr::Unix(address.read_mut::()?)), - AF_INET => Some(SocketAddr::INet(address.read_mut::()?)), + AF_UNIX => Ok(SocketAddr::Unix(address.read_mut::()?)), + AF_INET => Ok(SocketAddr::INet(address.read_mut::()?)), - _ => None, + _ => Err(SyscallError::EINVAL), } } diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index bc5aea3ec2c..1cb1e58ea59 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -111,8 +111,7 @@ pub struct AcceptQueue { impl AcceptQueue { /// # Parameters - /// * `backlog`: The maximum number of pending connections that the - /// queue can hold. + /// * `backlog`: The maximum number of pending connections that the queue can hold. pub fn new(backlog: usize) -> Self { Self { sockets: VecDeque::with_capacity(backlog), @@ -370,9 +369,7 @@ impl INodeInterface for UnixSocket { } if let Some((address, length)) = address { - let address = address - .read_mut::() - .ok_or(FileSystemError::NotSupported)?; + let address = address.read_mut::()?; if let Some(paddr) = peer.inner.lock_irq().address.as_ref() { *address = paddr.clone(); diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index db4cc4522e4..4128a709308 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -654,7 +654,7 @@ pub fn poll(fds: &mut [PollFd], timeout: usize, sigmask: usize) -> Result().ok_or(SyscallError::EINVAL)?; + let value = uaddr.read_mut::()?; if value.load(Ordering::SeqCst) == expected { let futex = self.get_alloc(key); diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index b7c78187de4..654aa92011e 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -18,12 +18,8 @@ use crate::userland::scheduler; /// Creates a [`SocketAddr`] from the provided userland socket structure address. This /// is done by looking at the family field present in every socket address structure. fn socket_addr_from_addr<'sys>(address: VirtAddr) -> Result, SyscallError> { - let family = address - .read_mut::() - .ok_or(SyscallError::EINVAL)? - .clone(); - - Ok(SocketAddr::from_family(address, family).ok_or(SyscallError::EINVAL)?) + let family = address.read_mut::()?.clone(); + Ok(SocketAddr::from_family(address, family)?) } /// Connects the socket to the specified address. @@ -49,9 +45,7 @@ pub fn accept(fd: usize, address: usize, length: usize) -> Result() - .ok_or(SyscallError::EACCES)?, + VirtAddr::new(length as u64).read_mut::()?, )) } else { None diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index ec5ed2f7051..3d44ea6661c 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -20,7 +20,7 @@ use alloc::{alloc::alloc_zeroed, sync::Arc}; use core::{alloc::Layout, any::Any, cell::UnsafeCell, mem, ptr::Unique}; -use crate::mem::paging::{align_down, VirtAddr}; +use crate::mem::paging::{align_down, ReadErr, VirtAddr}; #[cfg(target_arch = "x86_64")] use crate::arch::apic::get_cpu_count; @@ -35,40 +35,42 @@ pub mod buffer; pub mod dma; pub mod sync; -pub fn validate_mut_ptr(ptr: *mut T) -> Option<&'static mut T> { +pub fn validate_mut_ptr(ptr: *mut T) -> Result<&'static mut T, ReadErr> { VirtAddr::new(ptr as _).read_mut::() } -pub fn validate_ptr(ptr: *const T) -> Option<&'static T> { +pub fn validate_ptr(ptr: *const T) -> Result<&'static T, ReadErr> { // SAFETY: Safe to cast const pointer to mutable since the pointer is not - // mutated and the returned reference is immutable. + // mutated and the returned reference is immutable. validate_mut_ptr(ptr as *mut T).map(|e| &*e) } -pub fn validate_slice_mut(ptr: *mut T, len: usize) -> Option<&'static mut [T]> { +pub fn validate_slice_mut(ptr: *mut T, len: usize) -> Result<&'static mut [T], ReadErr> { if len == 0 { - Some(&mut []) + Ok(&mut []) } else { let _ = validate_ptr(ptr)?; // ensure non-null and in-range let _ = validate_ptr(unsafe { ptr.add(len) })?; // ensure in-range // SAFETY: We have validated the pointer above. - Some(unsafe { core::slice::from_raw_parts_mut(ptr, len) }) + Ok(unsafe { core::slice::from_raw_parts_mut(ptr, len) }) } } -pub fn validate_slice(ptr: *const T, len: usize) -> Option<&'static [T]> { +pub fn validate_slice(ptr: *const T, len: usize) -> Result<&'static [T], ReadErr> { // SAFETY: Safe to cast const pointer to mutable since the pointer is not - // mutated and the returned reference is immutable. + // mutated and the returned reference is immutable. validate_slice_mut(ptr as *mut T, len).map(|e| &*e) } -pub fn validate_str(ptr: *const u8, len: usize) -> Option<&'static str> { +pub fn validate_str(ptr: *const u8, len: usize) -> Result<&'static str, ReadErr> { let slice = validate_slice(ptr, len)?; - core::str::from_utf8(slice).ok() + core::str::from_utf8(slice).map_err(|_| ReadErr::Null) } -pub fn validate_array_mut(ptr: *mut T) -> Option<&'static mut [T; COUNT]> { +pub fn validate_array_mut( + ptr: *mut T, +) -> Result<&'static mut [T; COUNT], ReadErr> { let slice = validate_slice_mut::(ptr, COUNT); // Convert the validated slice to an array. // diff --git a/src/aero_proc/src/syscall.rs b/src/aero_proc/src/syscall.rs index 90a6d3720da..cd8a0d88fad 100644 --- a/src/aero_proc/src/syscall.rs +++ b/src/aero_proc/src/syscall.rs @@ -280,11 +280,11 @@ fn process_call_args(args: &Punctuated) -> Vec { ArgType::Slice(is_mut) => { let slice_expr: Expr = if is_mut { syn::parse_quote! { - crate::utils::validate_slice_mut(#data_ident as *mut _, #len_ident).ok_or(SyscallError::EINVAL)? + crate::utils::validate_slice_mut(#data_ident as *mut _, #len_ident)? } } else { syn::parse_quote! { - crate::utils::validate_slice(#data_ident as *const _, #len_ident).ok_or(SyscallError::EINVAL)? + crate::utils::validate_slice(#data_ident as *const _, #len_ident)? } }; @@ -293,7 +293,7 @@ fn process_call_args(args: &Punctuated) -> Vec { ArgType::Array(is_mut) => { let array_expr: Expr = if is_mut { syn::parse_quote! { - crate::utils::validate_array_mut(#data_ident as *mut _).ok_or(SyscallError::EINVAL)? + crate::utils::validate_array_mut(#data_ident as *mut _)? } } else { unimplemented!() @@ -313,22 +313,22 @@ fn process_call_args(args: &Punctuated) -> Vec { ArgType::Reference(is_mut) => { let ref_expr: Expr = if is_mut { syn::parse_quote!({ - crate::utils::validate_mut_ptr(#ident as *mut _).ok_or(SyscallError::EINVAL)? + crate::utils::validate_mut_ptr(#ident as *mut _)? }) } else { syn::parse_quote!({ - crate::utils::validate_ptr(#ident as *const _).ok_or(SyscallError::EINVAL)? + crate::utils::validate_ptr(#ident as *const _)? }) }; result.push(ref_expr); } ArgType::String => result.push(syn::parse_quote! { - crate::utils::validate_str(#data_ident as *const _, #len_ident).ok_or(SyscallError::EINVAL)? + crate::utils::validate_str(#data_ident as *const _, #len_ident)? }), ArgType::Path => result.push(syn::parse_quote! { { - let string = crate::utils::validate_str(#data_ident as *const _, #len_ident).ok_or(SyscallError::EINVAL)?; + let string = crate::utils::validate_str(#data_ident as *const _, #len_ident)?; let path = Path::new(string); path } From 35efdda829d31b859207fda2bbbdd3afc0c2373e Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 23 Mar 2023 18:28:02 +1100 Subject: [PATCH 156/368] alloc: small slab allocator * Slab allocator for small objects (under 1/8 of page) Signed-off-by: Andy-Python-Programmer --- src/Cargo.lock | 2 +- src/Cargo.toml | 3 + src/aero_kernel/Cargo.toml | 4 +- src/aero_kernel/src/main.rs | 5 +- src/aero_kernel/src/mem/alloc.rs | 51 ++++++++--- src/aero_kernel/src/mem/mod.rs | 1 + src/aero_kernel/src/mem/slab.rs | 141 +++++++++++++++++++++++++++++++ src/aero_kernel/src/utils/dma.rs | 2 +- 8 files changed, 194 insertions(+), 15 deletions(-) create mode 100644 src/aero_kernel/src/mem/slab.rs diff --git a/src/Cargo.lock b/src/Cargo.lock index 30fb60cfebf..11983aedfd8 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -217,7 +217,7 @@ checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" [[package]] name = "lai" version = "0.1.0" -source = "git+https://github.com/aero-os/lai-rs#756017f3c847e388b8b245357dd6c7ee7e755b97" +source = "git+https://github.com/aero-os/lai-rs#b183090306c75cc09118ddff9fac4cab2a8a310c" dependencies = [ "cc", "log", diff --git a/src/Cargo.toml b/src/Cargo.toml index 3dd6a80ae08..2a3e0e90ff0 100644 --- a/src/Cargo.toml +++ b/src/Cargo.toml @@ -1,2 +1,5 @@ [workspace] members = ["aero_kernel", "aero_syscall", "aero_proc"] + +[profile.release] +debug = true diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index 1241838cfaa..d64382eaddc 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -33,7 +33,9 @@ log = "0.4.14" xmas-elf = "0.8.0" hashbrown = "0.12.3" rustc-demangle = "0.1.20" -intrusive-collections = "0.9.2" +# intrusive-collections: +# `nightly`: Get access to const variants of the functions. +intrusive-collections = { version = "0.9.2", features = ["nightly"] } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } lai = { git = "https://github.com/aero-os/lai-rs" } uapi = { path = "../uapi" } diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index b4519d3eb1a..b2aa773e7f3 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -45,7 +45,10 @@ maybe_uninit_write_slice, slice_ptr_get, maybe_uninit_as_bytes, - pointer_is_aligned + pointer_is_aligned, + const_trait_impl, + int_roundings, + const_ptr_is_null )] #![deny(trivial_numeric_casts, unused_allocation)] #![test_runner(crate::tests::test_runner)] diff --git a/src/aero_kernel/src/mem/alloc.rs b/src/aero_kernel/src/mem/alloc.rs index 472e42ab396..731e18fceeb 100644 --- a/src/aero_kernel/src/mem/alloc.rs +++ b/src/aero_kernel/src/mem/alloc.rs @@ -20,33 +20,56 @@ use core::alloc; use core::alloc::{GlobalAlloc, Layout}; -use super::paging::FRAME_ALLOCATOR; +use super::slab::{SlabHeader, SmallSlab}; use super::vmalloc; use crate::mem::paging::*; +use crate::utils::sync::IrqGuard; -struct Allocator {} +struct Allocator { + zones: [SmallSlab; 9], +} impl Allocator { const fn new() -> Self { - Self {} + Self { + zones: [ + SmallSlab::new(8), + SmallSlab::new(16), + SmallSlab::new(32), + SmallSlab::new(64), + SmallSlab::new(128), + SmallSlab::new(256), + SmallSlab::new(512), + SmallSlab::new(1024), + SmallSlab::new(2048), + ], + } } fn alloc(&self, layout: Layout) -> *mut u8 { + let _guard = IrqGuard::new(); + let size = align_up(layout.size() as _, layout.align() as _); - if size <= Size4KiB::SIZE { - let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().unwrap(); - frame.start_address().as_hhdm_virt().as_mut_ptr() - } else if size <= Size2MiB::SIZE { - let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().unwrap(); - frame.start_address().as_hhdm_virt().as_mut_ptr() + for slab in self.zones.iter() { + if size as usize <= slab.size() { + return slab.alloc(); + } + } + + if size <= Size2MiB::SIZE { + FRAME_ALLOCATOR + .alloc(size as usize) + .unwrap() + .as_hhdm_virt() + .as_mut_ptr() } else { let size = align_up(size, Size4KiB::SIZE) / Size4KiB::SIZE; vmalloc::get_vmalloc() .alloc(size as usize) .map(|addr| addr.as_mut_ptr::()) - .unwrap_or(core::ptr::null_mut()) + .unwrap() } } @@ -58,7 +81,13 @@ impl Allocator { return; } - // TODO: free the slab. + let _guard = IrqGuard::new(); + if layout.size() <= 1024 { + let slab_header = (ptr as usize & !(0xfff)) as *mut SlabHeader; + + let slab_header = unsafe { &mut *slab_header }; + slab_header.ptr.dealloc(ptr); + } } } diff --git a/src/aero_kernel/src/mem/mod.rs b/src/aero_kernel/src/mem/mod.rs index 5e8079fa325..7399e6a526e 100644 --- a/src/aero_kernel/src/mem/mod.rs +++ b/src/aero_kernel/src/mem/mod.rs @@ -20,6 +20,7 @@ pub mod alloc; pub mod paging; pub mod pti; +mod slab; mod vmalloc; use core::alloc::Layout; diff --git a/src/aero_kernel/src/mem/slab.rs b/src/aero_kernel/src/mem/slab.rs new file mode 100644 index 00000000000..6fc5341c5f1 --- /dev/null +++ b/src/aero_kernel/src/mem/slab.rs @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2021-2023 The Aero Project Developers. + * + * This file is part of The Aero Project. + * + * Aero is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aero is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aero. If not, see . + */ + +use core::ptr::NonNull; + +use intrusive_collections::UnsafeRef; + +use crate::mem::paging::*; +use crate::utils::sync::Mutex; + +#[repr(C)] +pub struct SlabHeader { + pub ptr: UnsafeRef, +} + +const_assert_eq!(core::mem::size_of::(), 8); + +/// For small slabs, the [`BufCtl`]s are stored inline. +struct BufCtl(Option>); + +impl BufCtl { + const NULL: Self = Self(None); + + /// Constructs a [`BufCtl`] from a raw pointer. + const fn from_ptr(ptr: *mut BufCtl) -> Self { + assert!(!ptr.is_null()); + + // SAFETY: We have verified above that the pointer is non-null. + Self(Some(unsafe { NonNull::new_unchecked(ptr) })) + } +} + +const_assert_eq!(core::mem::size_of::(), 8); + +/// Used for allocations smaller than `1/8` of a page. +pub struct SmallSlab { + /// Size of the slab. + size: usize, + first_free: Mutex, +} + +impl SmallSlab { + pub const fn new(size: usize) -> Self { + assert!(size.is_power_of_two()); + + Self { + size, + first_free: Mutex::new(BufCtl::NULL), + } + } + + pub fn alloc(&self) -> *mut u8 { + let mut first_free = self.first_free.lock_irq(); + + if let Some(entry) = first_free.0 { + *first_free = BufCtl(unsafe { entry.as_ref() }.0); + entry.as_ptr().cast() + } else { + drop(first_free); + + self.expand(); + self.alloc() + } + } + + pub fn dealloc(&self, ptr: *mut u8) { + assert!(!ptr.is_null()); + + let mut first_free = self.first_free.lock_irq(); + + let mut new_head = BufCtl::from_ptr(ptr.cast()); + new_head.0 = first_free.0; + *first_free = new_head; + } + + fn expand(&self) { + let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().expect("slab: OOM"); + + let ptr = frame.start_address().as_hhdm_virt().as_mut_ptr::(); + let header_size = + align_up(core::mem::size_of::() as u64, self.size as u64) as usize; + + let avaliable_size = Size4KiB::SIZE as usize - header_size; + let slab_ptr = unsafe { &mut *ptr.cast::() }; + + // SAFETY: We are constructing an [`UnsafeRef`] from ourselves which is a valid reference. + slab_ptr.ptr = unsafe { UnsafeRef::from_raw(self as *const _) }; + + let first_free = unsafe { ptr.add(header_size).cast() }; + *self.first_free.lock_irq() = BufCtl::from_ptr(first_free); + + // Initialize the free-list: + // + // For objects smaller than 1/8 of a page, A slab is built by allocating a 4KiB page, + // placing the slab header at the end, and dividing the rest into equal-size buffers: + // + // ------------------------------------------------------ + // | buffer | buffer | buffer | buffer | slab header + // ------------------------------------------------------ + // 4KiB + let max = (avaliable_size / self.size) - 1; + let fact = self.size / 8; + + for i in 0..max { + unsafe { + let entry = first_free.add(i * fact); + let next = first_free.add((i + 1) * fact); + + (&mut *entry).0 = Some(NonNull::new_unchecked(next)); + } + } + + unsafe { + let entry = &mut *first_free.add(max * fact); + *entry = BufCtl::NULL; + } + } + + pub fn size(&self) -> usize { + self.size + } +} + +unsafe impl Send for SmallSlab {} +unsafe impl Sync for SmallSlab {} diff --git a/src/aero_kernel/src/utils/dma.rs b/src/aero_kernel/src/utils/dma.rs index 5a2863843d1..364724922f6 100644 --- a/src/aero_kernel/src/utils/dma.rs +++ b/src/aero_kernel/src/utils/dma.rs @@ -37,7 +37,7 @@ unsafe impl Allocator for DmaAllocator { // XXX: The DMA buffer must be aligned to a page boundary. let size_bytes = layout.size(); - let phys = FRAME_ALLOCATOR.alloc(size_bytes).ok_or(AllocError)?; + let phys = FRAME_ALLOCATOR.alloc_zeroed(size_bytes).ok_or(AllocError)?; let virt = phys.as_hhdm_virt(); // SAFETY: The frame is aligned and non-null. From b3a33947f53b1e08ae8a4465f4bad695b51509ad Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 23 Mar 2023 18:47:27 +1100 Subject: [PATCH 157/368] alloc::slab: add SlabHeader::from_object and `as_slab` to cleanup Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/mem/alloc.rs | 6 ++---- src/aero_kernel/src/mem/slab.rs | 27 +++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/aero_kernel/src/mem/alloc.rs b/src/aero_kernel/src/mem/alloc.rs index 731e18fceeb..70c8fbb2a77 100644 --- a/src/aero_kernel/src/mem/alloc.rs +++ b/src/aero_kernel/src/mem/alloc.rs @@ -83,10 +83,8 @@ impl Allocator { let _guard = IrqGuard::new(); if layout.size() <= 1024 { - let slab_header = (ptr as usize & !(0xfff)) as *mut SlabHeader; - - let slab_header = unsafe { &mut *slab_header }; - slab_header.ptr.dealloc(ptr); + let slab_header = SlabHeader::from_object(ptr); + slab_header.as_slab().dealloc(ptr); } } } diff --git a/src/aero_kernel/src/mem/slab.rs b/src/aero_kernel/src/mem/slab.rs index 6fc5341c5f1..14de4a017b1 100644 --- a/src/aero_kernel/src/mem/slab.rs +++ b/src/aero_kernel/src/mem/slab.rs @@ -26,11 +26,30 @@ use crate::utils::sync::Mutex; #[repr(C)] pub struct SlabHeader { - pub ptr: UnsafeRef, + /// Reference to the slab pool. + ptr: UnsafeRef, +} + +impl SlabHeader { + /// Gets the [`SlabHeader`] from an allocated object. + pub fn from_object<'a>(ptr: *const u8) -> &'a Self { + assert!(!ptr.is_null()); + + let ptr = (ptr as usize & !(0xfff)) as *mut SlabHeader; + unsafe { &*ptr } + } + + /// Returns the slab pool to which this header belongs to. + pub fn as_slab<'a>(&'a self) -> &'a SmallSlab { + self.ptr.as_ref() + } } const_assert_eq!(core::mem::size_of::(), 8); +unsafe impl Send for SlabHeader {} +unsafe impl Sync for SlabHeader {} + /// For small slabs, the [`BufCtl`]s are stored inline. struct BufCtl(Option>); @@ -48,6 +67,9 @@ impl BufCtl { const_assert_eq!(core::mem::size_of::(), 8); +unsafe impl Send for BufCtl {} +unsafe impl Sync for BufCtl {} + /// Used for allocations smaller than `1/8` of a page. pub struct SmallSlab { /// Size of the slab. @@ -136,6 +158,3 @@ impl SmallSlab { self.size } } - -unsafe impl Send for SmallSlab {} -unsafe impl Sync for SmallSlab {} From 6295e91d94134da10241ab4dae537c97637691b0 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 24 Mar 2023 17:33:33 +1100 Subject: [PATCH 158/368] ext2::read_at: avoid the extra allocation Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/ext2/mod.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 317365fdbf4..a1b6a09c5bf 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -431,15 +431,11 @@ impl INodeInterface for INode { return Err(FileSystemError::NotSupported); } - // TODO: We really should not allocate another buffer here. - let mut buffer = Box::<[u8]>::new_uninit_slice(usr_buffer.len()); - let count = self.read(offset, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; + let buffer = unsafe { + core::slice::from_raw_parts_mut(usr_buffer.as_mut_ptr().cast(), usr_buffer.len()) + }; - // SAFETY: We have initialized the data buffer above. - let buffer = unsafe { buffer.assume_init() }; - usr_buffer.copy_from_slice(&*buffer); - - Ok(count) + self.read(offset, buffer) } fn write_at(&self, offset: usize, usr_buffer: &[u8]) -> super::Result { From 7f6b5ff6d59a83dfb9c897116dba5eade9ead8d2 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 27 Mar 2023 18:19:34 +1100 Subject: [PATCH 159/368] CachedAccess: do not leak the page on RW Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/fs/block/mod.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index bcd34973010..02f4ff9984e 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -219,8 +219,6 @@ pub trait CachedAccess: BlockDeviceInterface { let data = &page.data_mut()[page_offset..page_offset + size]; dest[loc..loc + size].copy_from_slice(data); - core::mem::forget(page); - loc += size; offset = align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; } @@ -248,8 +246,6 @@ pub trait CachedAccess: BlockDeviceInterface { &buffer[loc..loc + size], ); - core::mem::forget(page); - loc += size; offset = align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; } From 6ca54d8f39ac4c94cdd02e6bccda4ef09004709b Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 27 Mar 2023 18:25:09 +1100 Subject: [PATCH 160/368] kernel: remove the unused `box_syntax` feature request The `box_syntax` was removed from the rust compiler and we didnt make use of it anyway anymore. Anyways, this fixes #96 Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index b2aa773e7f3..2b7d5a6a3fc 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -37,7 +37,6 @@ linked_list_cursors, extern_types, new_uninit, - box_syntax, step_trait, prelude_import, allocator_api, From 522252090c89b7cb55239dc14057999773d6ee47 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 27 Mar 2023 18:50:47 +1100 Subject: [PATCH 161/368] bootstrap::mlibc: link against libgcc mlibc required libgcc to build so simply force link mlibc against prebuilt libgcc-binaries; the alternative is to build GCC twice (which is a tedious task). Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 13 ++++++++++ patches/mlibc/mlibc.patch | 54 +++++++++++++++++++++++++++++++++++---- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/bootstrap.yml b/bootstrap.yml index 82c259f86c9..b6eb4fa2511 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -47,6 +47,13 @@ sources: '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', '@THIS_SOURCE_DIR@/mpfr-3.1.6/config.sub'] + # This repository contains several precompiled freestanding libgcc.a libraries, + # for different architectural targets. + - name: libgcc-binaries + subdir: 'bundled' + git: 'https://github.com/mintsuki/libgcc-binaries.git' + branch: 'trunk' + - name: mlibc subdir: 'bundled' git: 'https://github.com/managarm/mlibc' @@ -815,6 +822,7 @@ packages: tools_required: - tool: host-gcc stage_dependencies: [compiler] + sources_required: ['libgcc-binaries'] implict_package: true pkgs_required: - mlibc-headers @@ -832,6 +840,11 @@ packages: - '-Dbuildtype=debug' - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' - '@THIS_SOURCE_DIR@' + environ: + # mlibc requires libgcc to build so simply force link mlibc against + # prebuilt libgcc-binaries; the alternative is to build GCC twice (which + # is a tedious task). + LDFLAGS: '-Wl,@THIS_SOURCE_DIR@/../libgcc-binaries/libgcc-x86_64.a' build: - args: ['ninja'] - args: ['ninja', 'install'] diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 359b2199990..dfcd99edf48 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,15 +1,16 @@ -From 7ffa4a93ab4c1a5a5dd129dce1d03f784ace2e06 Mon Sep 17 00:00:00 2001 +From 8b458716d4a65d2da069678130c32c30395fed89 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Mon, 13 Mar 2023 16:14:34 +1100 +Date: Tue, 28 Mar 2023 17:15:29 +1100 Subject: [PATCH] --- .gitignore | 2 ++ - options/ansi/generic/stdlib-stubs.cpp | 6 ++++-- + meson.build | 32 ++++++++++++++++----------- + options/ansi/generic/stdlib-stubs.cpp | 6 +++-- options/glibc/generic/execinfo.cpp | 5 +++-- options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++++++ - 5 files changed, 35 insertions(+), 5 deletions(-) + sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++ + 6 files changed, 54 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index fdd60a0..9f811f4 100644 @@ -21,6 +22,49 @@ index fdd60a0..9f811f4 100644 .vscode +# clangd cache files: +.cache +diff --git a/meson.build b/meson.build +index 2261926..92b936d 100644 +--- a/meson.build ++++ b/meson.build +@@ -315,19 +315,25 @@ subdir('options/bsd') + rtlib_deps = [] + + if not headers_only +- libgcc = meson.get_compiler('c').find_library('gcc', required: false) +- +- compiler_rt_name = 'libclang_rt.builtins-' + host_machine.cpu_family() +- compiler_rt = meson.get_compiler('c').find_library(compiler_rt_name, required: false) +- +- if libgcc.found() +- rtlib_deps += libgcc +- elif compiler_rt.found() +- rtlib_deps += compiler_rt +- else +- error('neither libgcc nor ' + compiler_rt_name + ' was found') +- endif +- ++ # XXX: for Aero and Lyre, we force link mlibc against prebuilt ++ # libgcc-binaries; the alternative is to build GCC twice (which ++ # is a tedious task). ++ # ++ # TODO: maybe upstream this by having a libgcc path option. ++ ++ # libgcc = meson.get_compiler('c').find_library('gcc', required: false) ++ # ++ # compiler_rt_name = 'libclang_rt.builtins-' + host_machine.cpu_family() ++ # compiler_rt = meson.get_compiler('c').find_library(compiler_rt_name, required: false) ++ # ++ # if libgcc.found() ++ # rtlib_deps += libgcc ++ # elif compiler_rt.found() ++ # rtlib_deps += compiler_rt ++ # else ++ # error('neither libgcc nor ' + compiler_rt_name + ' was found') ++ # endif ++ + ld_cpp_args = [ + '-fvisibility=hidden', + '-fno-stack-protector', diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp index c0e54fe..ddeec8a 100644 --- a/options/ansi/generic/stdlib-stubs.cpp From 439e4608f891fa35eafa6a301e7f6fe6a3a5dd3a Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 29 Mar 2023 10:28:17 +1100 Subject: [PATCH 162/368] bootstrap: add xwallpaper port Signed-off-by: Andy-Python-Programmer --- base-files/wallpaper.png | Bin 0 -> 276336 bytes bootstrap/xorg.yml | 112 +++++++++++++++++++++++++++++++++++++++ extra-files/xorg/xinitrc | 3 +- 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 base-files/wallpaper.png diff --git a/base-files/wallpaper.png b/base-files/wallpaper.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9f1c62716c788d443bd482fd25095ec347d2b9 GIT binary patch literal 276336 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

bArih2)jc4Y=&re(VgNG1sf_c@SLqxPAg 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�r2M2c8npY~cyx#=B-t`RsbCMV_ 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�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'sjy?G)5 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 literal 0 HcmV?d00001 diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index dee9a91cfb4..e43d4f6ac09 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -186,6 +186,79 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: libxcb-image + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/xorg/lib/libxcb-image' + tag: 'xcb-util-image-0.4.1' + version: '0.4.1' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + regenerate: + - args: ['git', 'submodule', 'update', '--init'] + - args: ['./autogen.sh'] + environ: + NOCONFIGURE: 'yes' + tools_required: + - host-gcc + pkgs_required: + - mlibc + - xorg-util-macros + - xorg-proto + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install-strip'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: libxcb-util + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/xorg/lib/libxcb-util' + tag: 'xcb-util-0.4.1' + version: '0.4.1' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + regenerate: + - args: ['git', 'submodule', 'update', '--init'] + - args: ['./autogen.sh'] + environ: + NOCONFIGURE: 'yes' + tools_required: + - host-gcc + - host-python + pkgs_required: + - mlibc + - xorg-util-macros + - xorg-proto + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install-strip'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + # `libxdmcp` is X Display Manager Control Protocol library. - name: libxdmcp source: @@ -1553,6 +1626,45 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: xwallpaper + source: + subdir: 'bundled' + git: 'https://github.com/stoeckmann/xwallpaper' + branch: 'master' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + regenerate: + - args: ['./autogen.sh'] + environ: + NOCONFIGURE: 'yes' + tools_required: + - host-gcc + - host-pkg-config + pkgs_required: + - mlibc + - xorg-util-macros + - xorg-proto + - libx11 + - libxcb-image + - libxcb-util + - libpng + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install-strip'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + - name: dmenu source: subdir: 'bundled' diff --git a/extra-files/xorg/xinitrc b/extra-files/xorg/xinitrc index 0514650ee13..7a0c74fde5b 100644 --- a/extra-files/xorg/xinitrc +++ b/extra-files/xorg/xinitrc @@ -1,2 +1,3 @@ #!/bin/sh -exec dwm \ No newline at end of file +dwm & +xwallpaper --zoom ~/wallpaper.png \ No newline at end of file From b1b6865637dfb158084283dd516b551ae036e045 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 29 Mar 2023 14:11:25 +1100 Subject: [PATCH 163/368] README: update screenshot to the riced version * Also rice DWM :) Signed-off-by: Andy-Python-Programmer --- aero.py | 1 + misc/dwm-alacritty-glxgears.png | Bin 42252 -> 475532 bytes patches/dwm/0001-uselessgaps.patch | 81 +++++++++++++++++++++++++++++ patches/dwm/dwm.patch | 44 +++++++++++++--- 4 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 patches/dwm/0001-uselessgaps.patch diff --git a/aero.py b/aero.py index 5204dc934bf..80197dd627e 100755 --- a/aero.py +++ b/aero.py @@ -74,6 +74,7 @@ def log_error(msg): KASLR=no KERNEL_PATH=boot:///aero.elf CMDLINE=term-background=background theme-background=0x50000000 +#RESOLUTION=1920x1080 MODULE_PATH=boot:///term_background.bmp MODULE_CMDLINE=background diff --git a/misc/dwm-alacritty-glxgears.png b/misc/dwm-alacritty-glxgears.png index 9839dd78d7ae693f7f98a47658134d931fc51dbd..62175efef9d8b0bd546f52ae376115bb809281d6 100644 GIT binary patch literal 475532 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%0DWRmlIoiROOy9IqDNb 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ⅇcXmn`=6Md-Fts1(C7IMEQ18DrXYTY=lfgpN*FI7E($fmwVcSL-^M7!_cDQ_}6?r*YH zu&p()x2Y{EBs%?bpj(dL$`X0*1tO0QX<|h&vz&GWq583Y$QHQa=6QFK+WPgsRP{!9 zqteG|rKk!pz{(O<=FmcfeR%e>=oUwK4|kXV`l~fXq9(WF5C!8{xg?xC#F=ZWEqJ3} zIu34RDORI7eEQIl<0t%YZf9`4hMt8y?8nu@5YMezXEGjUqDLOHG|hb?=hjJHYucmsw-J7`gr6P&Gq;0g;jcUMpSYC3Z9+GDOh;OUV-%T)(@<}iu6`8wC)@GVRFuw)YydD75Or!U%Y{m$pV>c0M4 zG79%FlGfiARess$IE_-&#yhI}MA>Ch;VUQ{eLy8eR7#H=SC9G;*zswxp6tj}9 zumhNr`)o_nB%5a>D3v5+t#TG(BDX%~M|$KMWoOe~$?;xsxoIZQv)+|g z_Xf~Wv!a6h_H{PDyYT%J8!O`%D9NjFPLr{F@2{s2 zs1`Zf=A8wc=b?iP0f`Uq2d6VHyY&kN|6$GoS5Pn@DN`Fq56jVWM6!|0@Vq$&=9Te2 z{btyWpH-G@Y|0zW8Q9l1V@GgOB()&ZXZSQ1p-mdZ#5MQJ*+$*{O~AtY60dltE636~ zWqZgR0B3`CHW=ard3Rf41 zl?1IscK-+n&30mgSky`|4-wStXoVjL0 z1`M~++b|<0#F4S=_aB0D6G8bP{Uk@4C+WXzTSmT}hUbM2)=ya+WqF=2%Cad<&mabx z*($&W3-~V>j7edSKF|9sYp?c?mK_0Q6eDIW{Kmsj;Tigd= zMpxq=zWL2e8>CUID9bm6 z>X_T-YGTEU60)(eO)r#IFV_{E6>E~;T)lBe+!|5B%jQNlY8)w}MqHWr{XKFWj4aOd zFXhw49WK6$DFjDc;)*Xx)iuH8=>qzF^)#QriZ?+fzgvFGIvhojJ5b`T7e`+42$w6# zvx^hGwO;KFD6@Br8xP-0vyHZHoz_T6?!s!%eS)X}&t8@_ zosBMw78H3Ntx#AT$!Z3YmfH(mk2!Sdl=tRUE4B%n_lb&}jwgKPAT3Y7JoU@EfRWQ_ zUYyH#BCva0suE=wg0C+IcqUZh5l*ZeTuX-Jog5(*M1{J)o@PZ z5{#d|VrZc;TWx#1;(j(>Vf?w7IAWbuCu(Mjc>ZO*zfeual(dDP7uX#@9-sWS-s56q zj#yvP;)o42`(d~p-?jgI5yBmjz-_rXN6QA=jR{2-nY_XoUL|8@^83#pyQV+&d83S; zLUXQ5(t_hexxL;8!GSSD)>c5-2FG%k)rHyVMLraWG;^P9f=L0RWhpb+X$W>zFD8!k zP`6EO68)x_Y2Qy0g)$Rx4F`!Au|YWHbT}HI9PK%yV{60l<=cb;80nFR$Xf1QiO#|YAPDwD(12-?cAuLs>|%Y{|bjA+QsJ#AFALLI<4_8GX(a*1qjB|PZ~z+}k++}Zp7z(T`Ju!E16r5(6>RoQim9Lxn!R`QCqhRF^H=S!YvEv06t z_?7TgSJ(W$S?4aqaHiKCbRz^oy3Orj#-p$Tj3ItYXh9HP`zAdsCJMw3Dpm?a7*%`> z0C3pa>q=?lNB=9LZ}8r4g)aj`@*4l@W0?Rli|2w&dWa?zG|VcSN%BXuBYgWMz~mWK<8K_~-D5}6s37p; zHRkRbWdN4pKh*+aCYuTA&m(a!M`Por4IM! zE!t!~>s;^gYbj%y5HK*>g+>KBkrNM%zm87O=C*p;Z+6!nX%bX2Td#8nn&lzisL^mAdCOjjnUG}fk zSHS>ZHa9u8(t;&Y{*)d1V5sfYB`CD7$){Uts^7r z#hvE#8G-R^Rn(?0IPngmC}$M2pdk(fKlr;#y6XkYctToCnxu6-;8s;VJ-l0KmNvA& zyW_Jr_Nw6EDBFu(I~sQXRp!wz$Zh9&;E@Zb!a3re6y;g3`N2pD4BS>7C_^HnooWTy zB2ik=ftRF7PBQ#!u+Czwjv=UL)jwfkuDYlKw8GLG1EOT8eV9F*&4f?%k3o5y_eI8} zfiL0nsb`{UzSNxly2Mc07Ja;maNKF8Sn8uZ#^h727()y17Y>4k$t>jJhVhyF#yb|` z@5bA=t9RAkw9njhUFYCs4NpA8J#G=0F-*PSv-lNCg)_51=exJsiXBLw*KbPa zxZ-!@eyLVUJozrNdg|Zo^n+h%EKSJ0B{Dux71miZKIVlOb|sjm`iYet~qarp#rTELsFl zCHG-GMt0nmY2zrn$6$2EkWT{E?qKXt!7>0=8qq*1ok3f5;{W^Z3(!{nvnsouqg&4* zSejmZ9u|7AloNcR*WObs#Vw@|d+v6Qez`!CuJODp_ZH@>Cm>3lo$GkKIxL|I!^Ld8 zMy6wK1DuuPcW>wln582tiCIQGwTX15qmSaMH?r~Tp&dd`4Y#7k|Fs*VbNqj4$H%yO z=;wS%;ul|lC2$ABzh#18r2`}UzA7w3L5KJdET+WKf*qd1>S|M$NcY#B5$L|7UJSZO zHN|QQEyYMcPaX*bX`qi)$bY-K$x>k^;<7))?P3}0WAQ#cQ&YFYS>x2NPpC(b?;V*@P=d+?%|V=$`x+3y4x&wvHwS5jqB2< zg?Y>mK>4+SA^=(fsTp{EJ8nIQrs@B+``~haV!Ng$v8wjt2X4uLfl^D_S6R^!nUy$= z6>~H<)|zt~*lk;VQpQo_l1@qvrf!Q0(6uK3m1`0Hi0^&L%gh-zKlRtBgQnx-PesTFqOV|IG^ zA>t3ajAS00+@RTOiIo8%-dUx|wiL~=c>j%c*(cdJtzDZl_kC%6G*B}?D z^<01nUsLeQ%!%z_~M%yqU z(}d93tsoZk+SDDVHjdBB=ScXl@=i>bq;7cj7neFF8iFU_cFI+$>+hV5fZfFWIL|~z zRe4PVWeNSoE*w*fU#vn885Ad2`;#=@Tivhr<8hKj1&X0!zF)Xx$!s4_PYKqO*^8w< zBw#upZt~7>xOpd?Cfje-^iQ2U@lDh`rUeROkQHJu zcf9+L)h=vIKvyfVbc_yONC+w(mBTSai0b zFRXOd?Q;6waKruhGi_yyQMkb=N8PKom7`L_lPnyb!ttznfnU6&2Q8{2lt3xK(t|OV z7FNG^9qK_j`e4a%57yx3YqES(oELc6t`Ks>x>Bp~N#@}wu{>UNd09>aBea%B?c)fv zMCs7i>x;)?*OtzpmxWwPUm(rS;9q5{Sf(xJaUNesQT>f9T#A8)ShZLkvVWXAIX|GW zwyOz$5_*tz*x{lnAilU6%hBN%`|*Z{407d&idLKl99buKoXOB*&(Nkp;#>Eor3w#M zg>y&duY}r*613EPNffED(&X8jJ>{qk#)jUeJsTR{?s(0lCRwxRu1kSY0vNK_YqxBg^P8HN=P`{o_a1*VUwRCPWjRa1chfy$)L{ z9P!yDIu>$KI^=Sh_%upeQTDkWUbD?wWkk$HCR58!YUdztRy6;(GtwTha1!hpWJQ4 z@vt%#_UBC|3y|c=&;|XD{UPhO2pbBPdIyh_rkXWX`hJUamgDHK%uVnPn#kx@r&}&} zblZOxPEbcK5kG24xKLU>mT}4{?j1b2#=n%nW`8&H-yu8+s4TwW+sXS7cQg@uYfvl7 z*K=LLIBbVnyZ}?}OmF?SE}o(Z^Sjr(oaqll`KXUs6v&X+HGf7-*fW5V;ZNCrTO^dC zaNHn-OU|r*aR!a}#Y%9Wpu1^vR4*0cvd8QUHkeRF;jg2Q9TI=`u*KNUIZ6iva4lH) ze-DUAB4Ep8h|xhmet9D)E+UHo1_t5Dl~a$!&2%pyctm0~P1QKbhc4<&Fuym!j2>|J zTK<5HCll*^obyiWy?|+|gW0xkAo^uqT=XaP5TZF1->&?HbLN}!%WRlF!S$hd0tUq9 z{PynOSIo<~vm0|to3Z#uia0_>bCTBg85?9qYq7Y zj2p{zo#AOne;px9@x~?hSSM(Ra%A~QG+H*vW3~<6Aeuh}MY&nc)kdq(w5{B1dLhLD z0XxM`nJ{=GQIv0(E1-{05^?)iOmUKCtZ0Nsy?{J6@u#}mZb>vL1Xsr$-A>kbpRIsc zs|oopIB(8ueO(m+I6~RDaLuv=5X!5H@6z}C{)T(Qymet4vi%-JA<~%*V;8Vim*mXE z5|HsCPQ5wW7m1_m#Jx=vM9fUZ)jFq}6LfO@!?ktZFQDF%G)u?KUzViV8i)&48gfuBuBA_lU+ym=&n-eM3!Y#=j`en9O;E zoT+T@BShP0Iia(X38O^`pFk&o&**F@a{xSrNsCXk!v)73{X%RFenp(u_uC(~ zI$5CV3`N7%{6v+Za0Cme=iH~y&%aStT}g9Un3VL@^CPKQiEqhwDaRk7FG5=j^9jsY zajwf+QhaLnbt;KEeu2cazTqA2w48qO!96~pCRdYKW*j62lMHGTbssLGkub%c#WdNLM5DC;lyQ}ZK`s;q+HGjTHA zseI4>{@{O@5enqy@K-dzk{$B|B%0T*FKz6^Z1L{sRC!OaQyfULvaG$n`i~OFHS4>! zEs)^XfG^2ES-gpdSUj-j-tN<+v|Nzov*4`7mQ1q;NR6!8f^=Vd--3wWo|9efZ!snc zaVnoq?_ymmx$B3avy~Y03I^z&tF;N=@zE4oP9l`i>$GBVqn{boDX-e0aHd5{q9?(g zeeOiY4!Hk~UDxya^8w-X6>t&0_@AwBD0l@NtAe}z*ZyYL)Y zo`F9T6msy*;zKeBI)CtXt}#K__Aw|PYDa2}m__%o`ySLvCTF#_u0b)HVL<^x{zI9% z1#$Sg(|ZRKGX-BP1Eh-ZDdFha4WH{n9Uo)eE@u?@i2s`u5X{^zo&Ti@^WrrP#~r-I z$gqP7rH>-nphu%|a7~Oz4I+znppYXp6H6zyF7%M>V-|fIOc1{0bD@X|h+&6niCY`k2i42kiRqV*G zNF!fyce>wg8^bQOyP-vU-6#k*Lnq!E8dLi&pNrW5#x419=zgRaO->$l^thq$8T>bb z&Ij2-<9fErbd4Qt!C@UYq?@j`lm0RrJEYjUlJovnJy!&~8oq1BBhhAN|3nyuvt_6e z*KxDk3AIOpYY^u0yOs-18m>$cBeo#0LZHxw@A7f3ay+>vPt0}hR03A&1@%)Ul&T(> z9sOkbtFi>=ny`x?lq0L~s}fR8^1FRh1t(b@=&zc!Dzk0%*uwZ-rRniNzczq4WJNDS_wODHjgCV8%>#L#d%6B) z+P>LF9KQn@l`5Q)p&G_|I&$j;8IB%ff;#)Vxi7AIB|ofnPo%uE#7jfqdW3@L-_xIh zseC~AiePspkcR=1OjD|Q5{ZKM-3RgGJXVJXwI!qia`K6h&1wgg=DeM$>fzZ_2}**+ z3py;PiC=ES;{@)GRfr}laHV>Xj0y$JP;F2hnYkRyayUD= zQ#*NVkuKBoun}~9*WTPm56^l7A5>P9KW8m zHE3e+nVyL8z8AHtZeIE-N3RlDFZuUZEp>q|%m~kVWJA@}Ds;LaR;v|xRia9*EH1+e z`Xkbq#iu^smEJ|(tJDnh0zQR+M_^&D7#`4iC8j}?sBC665$Ds)*r!1 zd@Meijr*`&l*|NNM$_xiO+%y%$kza{B z6BMGY>s7LfTGgNA;>PY};BE}2Zog0aA_rrNwA%RW?6vz&&Q=KDGkW7Qru`Knxl9EC5#3jV~aho_b=?I>I8KK-DX%{86ljq$UecYV?oRu)!^UC$=`c4yty z8Dct9i{_FM6d^nrEUz47uul&w&4S#lL3|gG(IkL>SLfASsRnj&#crD>>OxWa_Q?@A z7LZgD*g1!FWGEoo!W$D`u5k$mNANF(OT1D0xWl(vHL;H}^*_684V}||jR~Sp%&0@X?`!?O|qh9`QtqX#9#0d1A#O`TK@i zC9~kx7zwX4JU2U(7acY4H==8I#8GWHMjppBvjh#qKhLH~n&)Ckip#B`>&xP-=^^*# za3Bc#d4HWP7YFh9mGq-Z=im{SbXVUemg5B08m#Wl6I3U!i@O-Uk%{U}xE|Gtj-6yV zLx+Px`eztC?RDktnE5r7mS&=}q0 zhSTf+sp%s;Q13CwTxqW|aDtVDKdwP_v)cq~?bkQ&4+=Q&ArnMN&?>`@@N(pS_0Apx zefOQ!~8!jfPCGsXoJB}d(!hW-C(DU-lOF-qj>u5=x3lR21;Y= z_CMkOS0j%~J3Nq~*tt?b6qg?pUvsYI+6k{Gj^5imi0Jk7yMKUWdO?NR`PhTVe>RCp zXt8(tz0X*kzvtK*#~R5^6M8tY5lGd`g6<%8%+o#*J~uVh@LopgEDHpR*u@)knhHRR z}ox z!N%svF#+Q=S7lz*>j{B~7Hw{&5NEuIG_T^Z6A1>69`Gnb&*Xt@5DXAM>i7z^p$6?x z!kb`bM*Cn>>A}-KW~2sHeggq_2=-)MU;hmYwwfY(UHBo{dUfLoS}4U%-aLk7Pi@HF zc)G46b^+HGy^C~r*IGXkacmcy;e2Ur2j2r$#BU^bQ}ENDvmM8lb2I&*Jf$J-j%Jqz zKNOzT2Pl7Efxinz-W>iN#|SRcFbov+Bt+6{xZx_$Q}cA8_bor4-x5SlDFZDOg% zYw-iy`yZD~TNZsGO`MDVSXlf>{W6NJKt<^^FuPu=t6N%2RT@cfDExJarc26~ojTRu zJ`HiC+;HddO0mgv%2WEW%p6pVTqq-}`7N{3<={(sH@0R+Hn%V^;wDhA>#5 zpDGUFsn@N}^_R}ls{`UsU1`thKppGUZ^*Y<=mA7h08tWjg94q1>d_$}6LgvqTRM`= zx{&a$hB;N>{{UKQ{|zzVv&DpAU#H~`1Kl}Hvv=FZh{!Y8Vc024*xpSTYCb3OeWYO# z{Mj`V2mgtBb>Woo%UIm?=DL$H6MAw$*@40_q@UtXKV@oUJFTg%!ByBYpE9q6#Z7|; z5nBsR+091+)EMu3L4qJ(c8+i_1@P@DF^~nmO_{N_fMR`y^cV9{L z(Ix5>jQ=!)btF%Az^7S=d;2B4or6(t3q{v|9}sOA4C4`gnSwoDxu@lgWD9r4!IWY? z;L1b)mN1D6Oh8vmfPImN^=yP!GeyWAPBGZJw<6`XT%!$gm0cUksc!erD|5E2>9K+N znw*Ki@Ry8JXt?0!@wCEfeIsp+Gk@m9sdj1z0kwKL5i7GDRZWu%|w^{wSt|$CbHTK_fe^mN3eMEQC z%+7|2z}jMa8+zio&im(^D6U?HZ+{#p4>?*;xW=nqId%^VOhRlsg5C$Mv&m}D#&zqg zD#rfsvGaYuTDNIJ>Usu$abr-FpW`@s2pRN_1KPz*B~q{4`6%3t+$8rOvtX<8T_PKJ znvpy0FSANxkzY}Ke=D@>ERRsRKbi21l0!i~zK|Wx7{;@h0+SU-&h(FN+5;z*6lK(^ zu5Rxr9u4&}ye#|c)&uy;Pq@zNaeHQyF||F3!n2-u0Yn0CR_B!~Jr_H28NCZ787u6M z+zv}O)5y`mzyIEwm zkZ0(!e2=z+Nx_%QLj$92-FeQ^!CL$$TwS+NjAO*Mu*CYt;d-VCI{OxEK0lR8_tKN z2{Q67sXO=aRvQ%VsNw^V2hX7Y_;dbX5a&13*LS%;)iy9ws$8YYC53DFbMbXL7G=G8 zfqBb36OrRxw8t$k0?Tg;Z{dd%uq4ZWQx~z!o=%)ZA)4=kDFlGHJ&DPjb>baOD!nDI zT-PacwCtgP-I@SQ2^5WF(B0uF-iInHCtc5VY8z>-Ay#9)1DDDn6+(G$Y~)jxBA#ck zP#R0WrdhDkAi0(FH&sq%aSnYq^beBXJ#F*WPW0|p&ZwK~g6*1u05zw-=J)AKv_i#L zSH+YR?&eC|6ZsxwRJ@A(j!-7x`?`Wl?7}N1da49Z9fE4iHCv(boP6|alaV;X6E+!k zU*j5I=XA8_y4^dzIOb66;5s1`gQkS?%mawT_SyGI%9Gf2zerbt;Ef;ZM5vO~tlscB zfkURd&i_!V$7a3TS52OlE8YYr*yc0xL)XfoXq9apKt09unvDHDVN&JV9a&7NdxdMr z(sJYAFMbE#$nCo>v|6K@BBzY zRvr?YZ5!vOX@*zR$(jQ~4JZl&Ke~QvDqa2dkZP5anfjo!Nw--PxnXO1WJ_R@Yn<g!|Mmcad z>+{`e7Lq*Oa5w!X`*;rzmATF9hoZ*%cCA+V+(nL|jr-B?CeS)n>jP#>&4msPhG%|7 z^912F0uX(*#iX7(bPyaK&v%cl(D#(gsl(7i2dRQ{TVi;TU$I{U?zmyFJzeg;keJ*l zE_zA+6ou%D?%kiyWkxH=atu+YXhC<|WjU$-LkEifJSK2zKWF?euIMZQNCD$pY}_PY zU_5bdc+sXmY1Y5d@p{Iz=m*3PQSbi%JNUiAIZ@udC-S@6%AzxdNALsyj8le-I@_tY zaD{t8FyxJ}q#lK9(0NF3WP)*haxtY`Vww`5pwP%&7y&)@I1^;NoOFu^;!Rg-3Q_6x zC-(+nct5I1>3ATeZ$pppvbw*I%3Ky2U(;mI#d1R|Udf2M zd(-ywS%e)jJQ!|9wV>!-q4Pw|L{k!A#g$TAFI5I2kxyUm+bN%36(o*CjKE4b42n`# zVmEt{%ICYnFkPl4Yxk$%1E2FB0B~=F|cZJh~ZHSd7 z^bosY#Z&OfsD`sZK8Dl1Z#0tzDS5&T?I*o`8 zh}HfD!*-|SjZm%aG0S!%QOLg=jB%75weJ;b;1r96tM#kl^`boaKS2Gy@* zEPL%FTW4V7^ryAqk)(Gh@!N}c?<(<|UzZNjq3}_O?7?A3q$3{!YHN-)+bl~}Ri`lN zdy_c2D#(lGuPQEUe8HBon~hd0jQ(I1CfzLmsk7cL6mKX6ny`EGcSCb~tnRd-GbZ>Q zvLs0rV`iR3Q!VEnI(6p#-IuC#x3Zo;e6}SVerIvq=F`Y+-eZ%+TLQrgH1&Qw4Zj2j z19Eg#cz2bJftJnL`+4pBcI{cs;${D>lh6A}H`Z$pG+@1lse_nuX`Bo)B)4j*s5=?c zkpXZSA3Mct24v7#YxwR3WmgdjBC|HY(>1I@7)0A+{MG~f|6K4G?Iro`nqD{2zq}Lw zbrN~K7wlXuW!a}Bqn1O^mpp$dy*61~tB?s<5;bR!I&r?mlFGdPJkgu|KHW721pgPu z#JHPPP-8Rt>EmGcZ}*Hl$Se==cJ>W0TjC{+Zg{_rd63Ge1<_*$P8Hk;0PTHn`#o`) zbzPaiepUyY;x-w9YKdlbQLLS!n>t&>kne9b_kI}{HUiXZ!BShTo>5}&;K|c34ojR< zts=xMlpK4K`V|3xYiP-1bgP0j36Fw4x zfYu5?W}$Hnxh>wUJZw0}tc?Qe8PRm%RfcuK@*LE`7PQdLJf-cT#UHL;rgjWgoAome=H0$f4@`Qb8N%*v4#4o%*p`;SYA_b3S^(gElhSmDs%ZAmK&0Mmly*8*$s{&%??C43!mFLHE zHWznq)G$@9A(@yi$=+0_cl>cXTu!UcpzXWUpD69*6J-TQh8 z+!Z3`=hf8#NY9jU;=CP!qKXYw_)D7EHkom(*Ih7=%RRK)3fE!XJEyaj(8bP=g+U`2 z5$kYgm*8u-SdUAU^PmSfap*b&*tP~PA*Osr;8c$n*Me)%fy2zp5WEI}N;|S0)P03E z#2wxv2AQlQHOIJrn?4MmeDu#;p7NI6bz7;=9Xkji-_XcG56g}5RQC}&g{H68gGb;v z8h^@Eka?9t28b0Pqh|oQ@<0+|a~A2{(MtZR%dqN&=C5;iEhe~S*Q%$Z#hS8BZmNQy@E39QqgAMl;!R5}y)H*@FI7TW}V)pL>W=h>?d z$6Vn@@O11stJua}M{0BsvVT~Ki^75x2U|G+_W?i_4xq&w3T^;4+DU46c>e=*GT!}= zqr38Kg_K!|^5L754!C{Q^1YsmM)aEH2l|jMCpA9H<*)0=Jm3i&{=p~pGuLqL()=OZiIgHg%8bN+;Rp4YCl-=kZ=&JhB}qy8FGc5O`ikv zd0(iet%&{9o}`vOm`s=@Y}kw=(j`+o=IX&)f<54Zm*Q@!t>%mrJqcwBpi^d; z6Xfo9S}~@Y$iFg*%%ZQEh@UU$y9>#?ki1Ju^TDB;JL*OL`{XQtQ*)xA9l%|WC~tJ4 zG$~4A>UG2nwZDIyq1)=aoClhBzmw!yZASy0z>a*zBG|l(DBQ3`oRv0J^?Rw^OpPQk zGN5mXhh@+s>6%0TX>r+UehzOTrb~o1LT~y7?a4xI4vr9*0$giuIptaAa#%yrgVIb} zlVyU;jB}$lv*~8_sH&r=FL-HLpH`6*Vb&2p|#tp1j!q9hA&Dd0$_H@ zV$d@0pm)h4_=h*j$Re8ySj5H&){j2IiPPI$0P8^nDIjT1!e-{}IOZ%*_K%ixJsua~ng4oFlgDwIPXg;gdB$^7v%q%2BPj&lIWz>>xk z+@QJCz=`o#<4*g{p4OuE!7zKRyQ@Z5lyzrnqM7%U?^xvHnh5O`;!FSe27moCP0Ph+ z?A!$_)K9rV3MflCH<1Sfv0KywkCOe=FWY8YTRgu{Tr0AII!H~_4xzelbG7g2RM*3p zDR`W*1oB~nwqmv1iE@QdC#dIh(~x%OLQ=S>vLp5VeyD;vCRUgbio=Fm@1P5T7IS@r z*gM*oHoDK&%?Rsby%TAiLckPbj`mT?V(LC#%o20z-?ehD?@?eQwh;d`=W!lE82XTu zRu@v=MmPX+S6+zY{ZcA<(b@j|&L28ZVwci9&_C2k8XUNU4|8-4fF`J(@3N-VJZLQr zr;ZgjRGAvFa^$*DWevyGs@^(Tltv;(X(Qr}Xzw?NFw>diGl;Wd`T3wMS}%A%{0cTP z4eS62V;}!N$ko+ zVfOc*xf3Q%&^z>FpyKGXqF{r69_TD}F^-oY+cq6KAAKE_PGLmUbQHred*U4;IC!`h z(JFN~6pkAs$dCfVbGBJje&j`dAW&6hNlqAZytp{Sh&%T;<3g$+H_escJ7yE}{X2wn ziRDK}-C?v~(Iq|O3|TKN=}wy8!X)`GOLV%6tvYJt3gWugRjXIrN?%z+C7e*S8?Vev ze*8B(O8-Ao@A-!|{lY<&l{Xw{*7SHbs+J*bZ0sxYW3N#_{aZPrhi$PVZndG9(c(KK3${?%8z=&ylyB+5)Lk7|N8mM0b z)z=40pmeT;$=m8GjnhOH!?5lOCyX5myvb(kBuCii?lyeTfT_HZlW1y>qG(Zvy&*C%i0PwFP8(7Mk`TV|J?488C*7rsxMC zF%VCT3p9qxSb?tQUO%epKH}|G2%xFz^&9YeDn)x$Jd|98lnMps@4X^UMD9%#J6Tk< z_VKG@Rm6{1?4bdhM+mCQ;gl^}1d)(rH=|{(y^89+Qy5+uWJAL#Ok{>k%}dW_NC5=kt|`eIZLH(39WOUh)Ud6S)(4#VB?oRpV)S% z(APe=xlG+m83pUog%~rcE}|<4px0OgcfB^~$0^u_&6lH=rI<3JFQT7W1Yc$bghrLI z=sz@8WNFkxji1!oINaeCH}(|~=m+IvX(JzbemaY*yu3_aM~X7Qda)go;w|?Hkmtnc zB=6s7e)BW8a=xZn%En+AiM@_6wf*^7eQ1_BO8awk4O-kNk6hLAe(Ir;&6TOD1_Qau zmy?wcBBya8^Xi4d4)BzE>my0#+iezw>qRfSVH0$R_0$;mkYz)+{M1$4d4mZ_uoFbo z1eV@%MBQqo-p}dD;VsS|OrGH+E9tSMpC3795UfvLV4NR#GWUx6Z!&)3+8n;yvHX>| z>h6Y~prFJj9!TiG;S}|pW@3F5gqC3GD%(KFJS8EKbkpVC>a2PY`Hh?DtaaBzChgd) z15H*)@6V$6yVgj8IN~wG+r#9_*T7`qn%c}ZTr7*=6u~beGP3R<_iM}-E7>dBv^DVx zb}#-(e9RZB51&uIRpLHbh;b|}`0yR~be5s|*{4Y{TNxZQ3W->Fei1S=Wx@u^vO@#Z z=+)J(iD045*&}bh%T=oaa63lh%H&0h#5D&za_i~fJWa#M3)BJmXc#R^!C3u5<=WZC zgytIif;6XY@Up4|=E9Bx?n|59A(9D|s-7I8m7hBOhx`)i2FF}mQ&WKS)PXpk-kQ$M z5+wC?&HOfdg@MXt37bE3ENy=-PS9EY3or1v00|F61E&vkzahbL4oy2Etcoy4i!r&xc@NsMP5%F|KFOkGbXb{?BKV37Gqr6%3}!g z<4zFU{F_Yn^zyj?BlZ`rh1Z3Uf$`1z9<>Tze46W~Ph@R30?YRWLXx)=!2_P>75kd! zKUd^YR*=XC$&%H5!3w82s)bwU^?;8l#$X~J^FMsF0tV!RrIFx08-f5~`gS1wr{G_* zEQaGJ*{Mstk=~E?z#il`wEU@>7t^}yYbJh5`Y4PNfVDYEC|8(fvjP-O0D;Y~kN-&% z9((fF`l~@V#ulIz5$zIW`X^T$Q1R3}6Aqj1`7i7*;=k=DqVA zl^_$WOSpe88s~LTnd==>;CcWoxb}17$`vGB4Fy-A+L14tuN1+pm!rSMO z6!qcHk(0VH^(c39eom>ooq{B197fGzaOWf!Uf-dhY8RH5c%QdFFpGPt2X)wb!?w!t5bMJ z9;{)}(Qt1i)+Q@x3zuIa)SMGdd%(ianMb`GdE18^ankR}SM=$RqKEuvHYjI<+JtLhB@vD+&J+kwpli0+=o0F^sRB|I zplg$WsED_(@o{=DN`(JW6>@Tk)%&ocG?3;FquOwP)DYp(@X}QBT|3 zEZxd&>&?Xkep-o%{5c|rr(ID)Ah=dhOfWt>Vlfv>KG%XO?GV0(+dze@0=i$;8V6~~ zn72P+#E&B*{5)N=EY^8(qp-z6+}4RhJWb8v!PaLYq}QG9REASZGtj`cq~+JwH(w1a zd=TV+i24ekxT0-Y2yO!eceg+wL4rHMH3WBex4{VzAi>=o0t9!5;BJFE1a}=={>i)d z{Z|DAR80+YX7=7^t?pjk?0^M83UCT)?mmrI&sBa&i1MX(5h-`LIIM8V0gMSKJBUS@ z^hBL$P~F3P$Awq|h+5KlThgbea~V(cx^SGS8};CGa9 zhdin`N4W979E#OX->m<@pd8GBZf=McId#AHIY*07n0^KdH-x2@8UzQKlOMHvI^Y70 zYtz;Upj$T;6zDbg3kCf@ID$cFFjoJ@Y&CgC~!{%-wv(soEVfz-(lfY4* zi&u)Y;rV4}=W9kP5w{994dys{xo0 zf|!LSROJK|i}~N~l=IPDKkeboyBh}ilPqHWud!AoiQYfr8|qALA(p;mlsZ7geNr_Md#{3C7L}F}U`RK(cwfo^$UOk~ zTG%{&2zvBMJBa=Cmb6lUR!W)sVi1%suP3DT~O{{p2>()wkr%JK` zZ)NKjVYf(ZueSU@40tYuaMIS)?}kZ6(?6{}F+Ohqxd^~~$<{{vS)rRmNBWs3saW|T zBjCK-3}&)=LUQI)$-2zR3@Dp_sGr`bM_4h1av)O(d(|B?Fn-_#$pKdRU!&t7A#N$x z!T9dr{dLQ3q&h$@e*+?-L3nH12nAVSgxJ2YA<)VBalhYC_H~}#*?xoF=K&mnN7{l0 zJURvCYN#>JB9ev96P2%uC97??QlmJ&&LeEHfzBQM^V2xLNA>fra3F!6X4}mh(lTU& z(fqBPp?>VZI=l=4zA@I8@?Y<*)6Efd!7ruA^hui=dRP(+E1S4&Q@o@0x>BwuT4nyH zGLzJ$CWQmJUVvh(kmkw-g;kU!n$}Jivd-PVQ2wz4Th8WI$7W$kBf5zyB|y2s*l%EQ zq2NO`k+DX6%rOo4=HxGOjgGxL74Zsw26QzbkBqU1S(#7pdOPc;!tLvKhU4yWZwkO5 z0S?iZ=RwbPDY6>v4=62kJAD64t|+lnPY-L`*@r8y`7uRVDoz82&3SOGtR7cO_@`66PB3YAGuYAPBM9Q>PJ7pTadbF;P)@76*1*| zB}le|9e=-St2k3Nfrk>f`32l+SF$X7w$4|#Vh(f zidtz*RV0pUtj9~JP>?W_rLDt{$i=k1nSoViPWT^jX$PR&xEGv}Q~TgZ&&XnNGWMqA#c5KC~eZ5g;(yaiEIw#W$;UatBN^gX~gf_sn+W$zGa1 z^`qFs_O-u#BSV22;+eXQCx6A0WI^?hAQoaox~{^8+Gc2c0onOnOX@DkSP(?}IlweK z{q6pxnhfQ&YF`N0-*xg)2C%=WX(t}WFmYF5Cyi~AmJifd$}~cJzFP)Ubv`5?e$OA} z`CP-04g`5TjMsfTu6-9pFjaIogky7ZoCI->*a^zlzIk(%+~xQNp#P*OUf`j_LsI%m-9C8{ zlv{}HU0C%+e+~#@HKPLwv^ZtUu?uSPFfw(c_nSEUA>n^JZZ`Wx`CUmfg4`(|t8zA{ zx>*^?5Z=vTx7A{&OG4OAlNIii^CQ9()9@%CCQjjgs|=Z(_3ISx5;LAA$F#cyLUx4G|1|K84Bwo2kyoaX(XR39^==l8BMlazN-r(sW>YL z?8ww!4_+yDb7j}dm))6dG1&$hCoK``X%4wcEwG)&8{@XDSfhcc_Xpur!;5WJ1yX&Vc{Ag=-X* zFmy&l zYIGnE9SP#e*!BI;QQ4NnZmki&Rys66dH2cX$b!bo4_9mIwEvUwOb~@1CK9)OPLn}D zP-*^d)^lCP7&UlB{R58G3{SzTnY%dx@r!aqRTtZZ5CGQBnm#W~z4O_kmzT_824K*9 z$4h8fdF3}8t;sAE+D`0Qw2W&Gb=;~GFs^fC@JUsFKh7@-JRG~voY_12Es=O9cH)l9 z(IfCZ{H*flZSX@jpBa}kf0=@Jb#GUn`zFpefhbD*mn(yf8_bR%{?|*rglR4bz?R4N z3>z_$8o$yXfs`#zcUVC{OK0I8rmZ(Jp?pnPGiJX3NPW8o8`EBcpf?GCQhxGt5A0fH zqzzbIZzq+!Cp+jg z|7r4Sr<)adW8PMIp%)c_4V*pOE!a4MC3>3KQ><-{Tt7M>pG&{+XryM*hnQ0~w-reV z1Z^h;0^S;!`mZFw6cCIhgK{l^g8(2eEsaIP^Ey0G{` z7u$q>Y_@2%qVN|W^!opp0nzEc_5XCTLN2nbx)O%>e5AjB`bk~cNV~k*&3+~}b|JtD z8#CELdxafh=zRLY_Vi}Se(BqiaIOFQJoo%Se&GjDf;(Bz+Cj%X^3Bh@I!6FIzy&e_ zo;D=rw%M3k^=4wn7f-04P}l%^85kVVLH&EKh!1ci)rFK_)gHs%8la>;Sr3h&E7sxdMolXIBTHna2WBa^@AL2tZd*Mr}U+2ScQEjbbDY#HOkPI;Iz>2W;ci>o$>!#?7y zVM}m`+J6Db4#2$CtpyM#@wm66wysQJE8;y;GUC(h#@~3qA@o2Tc^G+osnxUf{#-(N zdo^en2G!xz(-zP@@yi7=H`=iavhMk^?uPv#7gL-)fxonxEI$1~UK-#gJPPtsjK=6B+`j*vky7*2*w&Wk)8 zn+ZRJENRz*vBR1=w7`$TLX15m?m>Al;|B<5mpufj-}h0BUWN%aevJ1V;7n;Cg74-! zc2!l?pg8Y18AKeBs-GZ@SlR1;fOdV<{}dAzruih#PFUo47zCspAM^?fiVA5zX4?-K znjqR@lNbdv$d}I$W~r23{1|}TAOYkJT6{5UJ2Tu8m|bc-VW3mx`7;6 zlh5(mQ}yr{#Patlfbjz=%WmZ_tTZi{o-_hy92cAOds=0X;lUEioPlo827cF177^7P z(uAlp&O9>|#O9)FE&^tWGRT%Rhl^nmA+WPH zEb&grW;DARXL|%vu~2y5vgOeeob(b?Mca@ZUzFk5Fl&Z0MfVi@xBe?or&}n4z}?2{ zBWuH&KgPf!*-Z5G{)`+W`I@-fD=V;^Tj$`nKs{usK_e93`Sye2+f2As##r>Do|K4lrQT zt=Zu2Zd2dW!7fs&n;FyS^d+|AmL8S=_Tqf3m8YpW$g3lOztT4>e>qxt%-rb+$-(Gs ztTR+#vzKNnXMOqslK^6(yZq?_bwEM z=Z5Na$}r~;ld9(%*ayMB4;G#RsN-cu2ZataEspo{Xou=Q6xU-QurTkey(x0MC0mpm zmthCOEq<1Q5E;qsOpf;aze_m?i#SzAockCqbb11V0J%bq#t8TT4h4|X)n;RQioANW zhsI5dXXozf9%DFK=!ce;H0%%O4RaLM={chd7J=#NYIp#CRxhSEAY^kT1*ql4-zE|v z`8qOVi1dy25hg_CwND7Y6H|j#8Z5D^Q<>e=RUlu3bU(PFdB*n^IE0Gf>@0j6^F_#DGDFbQ+#_-t+f;6ctXhqpM8tYnNTxSwK``g%V+MJ8d?B({ zot0({%FLDwzj?ZTY=5_a`uwyfUn?fLmm1(}NzLhrD7H{u5)0qQmIqsWKJ6ijnfz@X zwyWKdYcd>hx8DH?<%7|MMM-qU2n-DcDrL*btG`BMb>agOBr3(TxG0NTpUF1?bmIixVuRoXt2<*F=Z5J7fF%CMZiw1SNQ9U_ORrCe*I>aR3u(s)ocHhkOCg3iXK3d^ zOPc&Se##72^~NOp6g|q5)nt)aWntA_$y=Rd`&jGBMPI&7&v)^A`Q3W$Tqaq?jllkf z(}L2LZ{*Gas&vDIWp6r8tKBSLF#$8<+4{HNpt|S~mZJPr*grcrCYwVVF>Q`0v57Gy ztC>Fse2O=V&$M zp<#*FK0vp>7e`f@d-gX_R2eUn-=r=M_Z;9&d@rr<@mi*;EHAcmbA%8qQk~L-iyp5w zeb+Xk;AHrNBl{Qp3PKdT`pbgdgObwfOm?_o+qCLpubqn*x&U?ATe z>5LY!FK&>_dCUeQ>I!7EREnYUhMrrFHW;J90-2<`hu-x*<;eXYjFr6g z%zkr!PU+)*x>9Rt5Ui#J%kLg8Uqu_W-t!{At zmbA{KAR{u&ff;cHv|bMSx_mU}RHb%8>2ii>eXqBC!|8ItTcFPRE$Inx+;){{17y>t z_cF9>WjRtSk_$5J{~e!Iyn-U%$CUy)`f2hg zCvjc0b6&hvU#!&+T`d+^yI9XE&#niweRCByLZf!advy&aw^1JnJFX(y_Rv)}fx+@_ zeJfkN<$5$5ohs^j-;bDtS)U^3qs60D(G@E~f`66U^$Ethg=h_MPxv;%y>i3=CG??7>B1M}#E4JX z>@D*u+vH2LQ9={cSFM3oegkP(lfd?VScxp4;clfjt>d5+C4(8NXSBXY{Hn&kIOd2x zd~k>i(ym64BZrmMfn^kNM58x#wSVl5RH5^(;f=^6-GIl=<3`o^fC7B^+rm!u$^Fl; z_W>%koCbEvY5-xHpbL?IQs1M=p0fkzf2Kez4E~RQ-TexTea{+1MgTh#oHL_!A^Hh=tdY#s!}!Lat_DXZ zjo3!OIP+FF-RIe^VKx*R(@>n>K$TX06h!BXS6S)0dlQ!|9Q}8Wzi6&DZ*XwM8|R?a zfztc+{dU8;xCK}nP%(!BtzThfo==9T!IY3Q(S?VkZH}5n*TQi5DRTcJDAlG9l7*z; zLyQk)@uWP!(Za5gn49k1`m0l2F(x|_afIIL=*S$Tcz}GrEL{KIU@ZB3Y3P-tssi4d z2PI$OatLKq^ZLkBWmIyeU<$E+$BuOPQ2-!TsllY<9=gxOZfVaxxGd*ZO&c=Q_tnfg z0Q=WI3D3|1d|Z=%!&zB6&j-#!6hEO0JeNCsyDbtysaqqT2()03-fSn4G6V#}a_Plr zJMHO~8qV50z`*J$EOV7(Rof}E5YU(mF&JNH%Q6U8y(u+lTtbYkZeK83h`gZ7woLc; z@8+0WL!R@_DD%~@eU;iCQH$!aS%&o9E?Hd*FWt4`CGAhy_*_>;!@q?1R%-CHLaD+p( zA3N}V$alM2Y0qjrc#*bpKDOidJkz?K@VEjqIDtG#I;$L1ndJ+cPCS2Wb8?Y_U=u2Q zg|$a)bC-YTs__K^le;i~&Z((Kl)i0B=-vmhnY@%}bn*LcNO1oX(F0S$q(@#oVRsEl ziBt4)2k(GJGs$IWEKiAiMVu%V8|^C*9U?spZ|8EVaxV5=?rZ3lm7vx%oYPsA##f z<_GfcC!S#gnI|Y~F5Uvn7~rLVT0MJ&JZd0m_`+^nILtB)Bgkf};hm~^z# zA^*s8v^8T?nMrGrR_baG&zVnU9Rr)Xh=cM>p}| zbwwiwgt*u3Ml5`8an|`=+Yd9ekz<1v8-1j!>xU!5d`t@=N%(~TCg5Gtj*PnS6PX@) z-DyYCF&TbLwyGGu&+4`bO$;cr87L@WP1WNQ zWKcT8qWt(sPz1oNFen>WuFHCLhjz&JLdbY~xTGn(*})8q zM%JGqQm`16*@LcldR_z*ololcc^1tqha+*s#WH3z81W{R`@P2J%lw$oJXtH4xZQPZ$rpqw z7;1RYiR_XTK3O;N&);^n-eGI6gb~eO?FKKYGl@pM9f84$3a)y3YNYZKm#*v#=%!NQ zz1U7=5{G0IvOu{7_t?z#FNbyrhX)RO7=Ykx59A3wn4GB4HaW9P!D$;#Hq(riR?p&> z$%8K_u9v*apWxw6Q$k>UGlU2lZI|zDtxV-78$Z%?WPND1eV#*g697NA-fcYkhv+!G z5T12DSb&czUo}=9ru=(@m`Uo;kG{V-3{7|Bn{AXJna$h5ykKpVxFz$oJPd>%*(3gr zw`!YYzRWQ)uKLAo3;x+}o&7AotLxw^1y;`Xfgvi4{^U5p#2gpfn&<0pv@pO6s$1g)^*9COrYv4xHwT*whLZ5s8+&nZutd=(HcnA;odnuyfw2q&~m4hf7!JLImN-(`JGU<$I7c;9wHR*|0 zAeTqCCKy-&f)6$(h}*@{yPfB;Pq=$2`PCatqpIm;tuGFrJ{y~*HEtodf#_;m zs@)eVd>4IpPVu6o>wn^~?@Hp~cfHpHjc0c46re(>_aSeNWKNn#NZhhpdF`8+v}YV# z^~DKfG}-)u2)yERR()~&0fNwhOh+&93e|I7%zK-=zseAYLEiy_L2(=3Yp?ju%tP1a zSg)tXjkwR?9uzgSzj_;b_Dyhpqq@>md?ej}cZgU7xx#x>nH)2`*6eXf_e8v&5#+}z zDVuFq6eI4Ol%(?p-uUvHJ`xbNcA2>SAYh|%+eLv1;Ah7u+84b5CujBCdd;am(a!1rIj&vr2fjnt zK83sIM~wNuOf%Gae@&5FR-? zyUJ!BxS$-b^Ft;lzuThJi*0 z7)VO-$`Ys8IKB<-y*11X4xk^wl1-zK{~W6&motB2{Mygv2uG`5+eL12a!1j-KMbMz9aHK+*uWi~4v-QWB?8P{1)z;t&Xa^OkNJ z&}Xfa2`IJh-?nmkM1n$%!SJ9Ql_ zL2AVwq4Yw!N|Ic8;*Ju$Yd*o@V1zg{p2zRWn;V};g_8PrbsX|i+Fu8SS%Dgt+V_Ph z_${n!8Yyv~NwCFu2}{OMhkWRyVCI z++=2qimJnLn`%styksKx#bS?gmCI60>3ye2!hv5r0+OGUwaMUdgg9j}z*}e=q>9o) z*c&_wsosI?dJLN`1K43+>?#u;8c{ZNf~|t@qW8$J9cc36KNNXs&qaioYdJK?Yrc5A zZAdozGcusoLM{f?cItSjQ(5L z!I{Q4{=}dloA`ugIRt8EGgCPtg|OXFq2M!0InBxiWA8(JvWBIxLiX#PzPYv;v7 zspZVr`cK4w?-rfkrRk-A*osNY330EGW3y@naI=Wt$Sj#W2UwnZj1A~FtRWCYXOb*0 zv|NgF$_~)nTQ;U!;@3Fd<5NA-amp&-Vk$a1p8Yg?d3+XnXczLS)^Y(l78nzP1Z=3{PL<>r1Didjsn?-_E?aZ+1YrNH;aaHSp!C~>sO!DjPMb3V*2UIB{9 zdhw*KPd0n%C+;gw!DA#^S(%c#dK$`O^D2Ui>0zzr`Lks-)p;FE@1-C-O^=_n69rmM z=nwmb)+brb&%P1R4R-O!E_yHc>>*j!69bo7G(0hY*LN&PtDYrRyCi1*{@W_aW6YC% zSdEt;o-F*#6{C!DpvCk&S3MkML){^9iRFQcvRX8hpa89^<_G)>KrAD!;kMy#@0xvFL6l z-O%`-kWGB+9h~XcJx^Gdy=*D36W+mU1o5@hLLn5W?qHHK^KW5PPqDXjnckV?-3OG~ zZV1gMZ@!Ft42uhJuN6nxx6XxikQOVg5V;KBcblOYAX7vdmQvfUr7O@dNprR5$K(Z) zFwhR8!9izps2IpuSjHBtaLNwqcSUWE=Z8!ZUR)tTj{^y>)T1UoAM=coP}p`If3MS! zau)XgYD+*fY2Jkxsfjlew{tDpy9?pJORD#c0WF9># zC(JReFF```(ETloNr8l?AM5ZrvHT1k7d<2Xm$YO;?y zZ6x|?*15I?9-6Tm}t?kl!chqSNt-$dt&8h@U z75rfu9(3qH5?Q8?oU@YXR*ai-`6cNlYiZd%^ww)CEChtvk4ht^rNmjAaA9?5M!L+; zdi|VGC&&@E6y`nKNmXj`69}n7CJ~b1r^+qr9)mz-k#c+Afb~T>*9WHhkt}C_T5{v^ z(PxCb($zt`pgK)gO9opnHm`{_R{;-(N?u&Qm@vf-+!I;BqP{)t*0KIcTXVHNUhj0* z5$UOV#~{&56=n8;>cgJ6HD+}rs8JMa62>P8chm9h)eyT`CqNd>C+jhYtuy&oGJ_LquZ!Lapq+ePNnnCS6xio*xhE4b;)M3jgKv=5fhBGkOK{0M|PC?HZ5<)uc75r$j z+S&AV>|{uU{c}Hmn~$VES7iON2r>&TzmzYwrjbn}^#D3rPLf@Rm$+hqHraJA^C5#c zC8(wl3yv?vg@R}QoHvzD|E`k3z$$l#ji-2}HfzrEL1e;alcmPh;Hn?o+FjtT%NHT9 z;e}$wu{(Qr1I^)u6C4$`sLlhDRK0=W@Jhq`W(ONWYhFg9mxFb&a@V}nUxjK8G+0-# zFhKhClS-xe(i@S&i0qfcvuPJ?-&QU@4XP&|E0YI5DM&QLLP@-yB(mC;eEFgCyPIwS9Me)gEa8Q<6fKm|!toSjy^*6?E2lD}8_0lz(~tP9c8F@SsX|q*L9J zG6MwZD9fe}^--+A8M-WQ5gW;_8r^P*!C6TNoT+WC>_T!F_z>8Jb^>;QgEWhV{oB!GJ z28~q?FH1n_;=XW^in>N;^y1PPWN3>RSe)5dKYx+~ZhMp)3WXGJjQc-!#+_0xFi#-<~St%H>oVXgKJhdjtwdo)w;e z4d*VpN9;@tqqAMAhKf^4ZyU5m{mx1%@lcn?7S3Q6xyQq1l_UsVS!otJLI`@>-nTT+qvm1N*#Nw5YTr<0Hl`4ER*$PnC*QLisOH>c}rsZN5gBdjh>sX=l{8#mvv zfxKIoM73x(NkD|P4_a%ZvWu%z8}G7Oicm?d@|;#JwQWwF9ia_okr@$9)L}6lp$V?Z z(*4y|HPmqJ_M5?Hpt@bsDyhJH(Wq-|nk3qswqA?G@UeslYTL_F%Y6)E{u3r7#*Q0T zK`-5oxi(9}&>Uf}^G3L5b9>5)d-8XpW$F=%jbNzaQeuaX^W$>yE~aCX3(|>p!3;D&B0qOPkUg=aUda^$oQqVSY^pAPnP~Ujp;sD1o7|!dDtOn~|6fDa2DdhZl;O z;R(+9^v``ieJl>VlLkMLaO1O$(GZeF<*LVK8Hm42ge2$`tr8K1E{4*vA2GQmu-ZRO za|!rdc_+#CZJOH$yS+CZk*@5QA~a3nsz^=)JDMfmm7~UhS;!E#F zWJ9OL8-RIG0alzjt_;*K4|vK3cXO4~VGCx{+hEZJ{ThMCdmhkI1XF`?(!rhipM^M1 zI}+A-lhCM;U(bVqgY-ZLV0<#3lDbu{WFUW;wgERuqyvqp`Oh7K> zdhY_0lNEGOY*(9}$f7cSxyrI=H^+9_`Z@RuY!H$bZxbz>gafi1fx(}ZLbh&-@U79> zy$x4htNVoL(tU9W$~ciy_1=Dd9nOj15qeKeFE8=~C;^uAXb(kt-*ECP#xNP?7{{`` zAe9V9)B%$-q<{2*g_kvS`de&=Rb5+_^?dCi3qd8D3r*a^h93wt4%-E_9i+joQiX3tZAdQ(+^GXp)7HQ25Ajpu;`T?;S1&)L3C61Kq(rLwjAjsE8 zWGzIP$+MuXfbvp)@ZFk{W7U1Gx%>tK0py5nlF1v0HtRXC%m@Uu4QTe{7k!M+83GZ4 z?MW~LB_r_-Pcr>${FQ&tpZy6Ri)uUob1ux)n{!d*IHBg}eu*Q)S6qrVDGJ6qpb%25jLD+i`oA;+LY(VJNbj&}LKvw3+45`JzMB^@B-MkL zsnD&haLpFSjDT+bjT1!_c?M+$>R(G{O#hj1p$E&^C1m<1M)IUh6ltDCCiJ_?-I!Nv zk0}*C;{Ik8E9z?8zVUkB;ORp?3ktb>u(D*)>~~zppdE2C#Q|g$IkD>|PTVZW;pCan zJ7zwsv_b_2t&km3%!GDK{K+$=Cj0Gdu=7jBK0ltid3W2az<_UXGu?b zbo!CQ!$tk1KJ$as=J4r_Ke=iS)9EwcQZP>>NeXT8GkRd1&V#V!V$*jN4CrYcysT%- zY@w#5TD(W|CVed8Qg;4dvph&~tkpp3=v>Q)5z^Ki_$kLUMi~rNaPiyU%54N)6f_Uq z6>{N?OCe(SV1n8F(6IM{utR6$MB>+5h(jFwi0%oj&N}JES;x8aRy|B%=fSGVX{doH z!Z-G0)(aL63qjBP=^LL>>|b$Vl(Q0cDxtoSb(@ClFyliC5=Y#!3fftcq@^8YiX6N9 zM5g|u{7I8%@7~Y+4BdCrPVv1wy1v@D{wbTK-+?|P9IkzVC7YjjZ~w5u5jHydhvY&N zvJ)Sby)}3{ech#A8!p-WZTMn*;Q+4J@Xd)kLEAP(D(km$wwo*2ijYhj?&|y9Qp?8C z^}pAW5Y1P}bb=vp*C6sPby$v+jc1=4z`Ua2ECgdEcGf<^2mw7XAYl0Xb9YwljL$zC6w}TG)Mr zM(wGR_?@&3uEv0ve>~$DcjG2(gY-AKG84KvCPv-KPYk*I!9I0jj<*@mp4v;iH*mUbX;4GmWb#4?}zs#=OWrLshE)bS5L0*bH$w8t@n z|3FAWwVRO>G;t}@KJ-ItO0Ma$`GM`2uPBkfc{{nSX5RYavFqBAz*zBAcAnThSW$`;oi`TSe`%(%dQ@@H7 zxRr#KmUm(o-B<+ce_k4q`(AIl4iW#1B!EX|#g-yDGkFY}KYv+&MnL743P~uaxCGeQq6~G3BJ98zKn|Cbs9omAjb>tEG1ct_dztStY7&F>RHU=X|`O&SjY{ z{W!etDfaHY#>80<+1CFN{a=~65`$>1eG~)c29LKL%Z!4o z4iCn&zhW?#+pRTyw&YQIwREhP4o3_Bd+VuS3XPZjf<;jH{D)o zFc5QJKiQfKeiL)Q>qpHk@V`iY_!^XL*`Yd^M2WD4ET3IJTI5FomH5OT z5@C`z1~#oxtmR{;$zQBaejhJ`{JbQCf1w6FX;X$M6)_;wJzH|~r*zf@Y(IIPw>==D zZGK_%JK?56qU#ajVSQ$N?mN88Gf-;HHGH`=Lyntp?bM6IWM=DlQSrL9SoJ6GqPQ$qg{=qkN&zX8f z475`w@qRk$whrJAx8+33{7eob>@&f2nZb=*I$2Tiw^3Gr3s(H1z|oLp(hu|b#ozUR zS~Jf3>(Fb|zBbm6R!nuoK+`We3(DGzFfSM1u05_97(FhLC@)33$A5Ob8r0*GpF^Y5wSA5bTw%f=xbThw%nF$fwcaxd`96BF`?AwH=AW zmD&{lT>~n&)2pUyel{9+b5N%GKuwu+JAdYz41s9-M!6z|k4yMQZbR41$Lv$7F?0+S zdzH{WKZiGy@qnMG5Sxh}5(5#& zgHW44g7I}i5{n27XE`GPqHH=BPm}GTO@=}7EWAVTXtYH~$*8+_%Vv_%h9iI@}Pp=IZRRbz()82GQ>?> z(hZ(O7J7oX!0n!4Isf2rHh-k*(MwJBs7RgHYl4vMGjvVn&>oZ`)qkM<-IfdR@LYak zf%g=$C7wJ!j)9Kv0`BFeiwTY#Q9(_#u#a#_RUF{(hKy3`j7ysA_qnClSm~H1uWKJ$ zPFQv00tQ`UAY;xVzQh8a^s>Bc-AQp+h`n}~^0@b_f6vWH#mj4~x|{lTdw7}#M%CW2 z)3U@P>bOP6d@_!Ker0clwM()n<;)comc28nO=-RU%!5EaW(`MHh%vqy@PTp=Xyim< z+N86*5fuSoV_w|e0qz!1KHIkC*F<`A6PZs2c+hvf%_klB23NEh2$iUs@_>@o&3d(* zoFc=GICo55EZM%G)Z6tB5f`FR+4M@_m?!DI07Y%b;s8u>f>&#0~2XE?FWD9M0c*fiFMeq7$@=x~kEr9GCU z1c*}-h$H+^e(8-g)fiDX{S{~ZTy)rj%_)iei5(U=$p%aeJ^*|h^ zCkD6w)82kVddR&CD&U1(T~OPB5zkpDg|yuDO z_I~-=V_6IR{7}Dv&+-T|s?efeDqH`|PBl|XW|~C7v0{;YJkXc?%3wN|RP_WoGdgHq z@0ogLUU*qt&y5?|1T$k6mRS02;7gE~Yh%p&pA#%J`@7|lbi#1%U>STJ0aj3qeq_3H z8OxsB@V5`;)`C4T=3{4x=)w#uoUP>D?T5(|7IMVosU8>uK1pm1)KOZ2U`g&B00I*0 z6gJ%hyx;@taG2MU$o39;q|ugKP}pAxZb#DCO-C}K7|;dDWFHim^ln^|h<}-U)*)m5 zw6;3;Vcs+|xO>+VmVDiGPav^7cX!=ZFwPf%5Ok7A7Ef2Xxi8M!vvXXlekks_Iuy9+ zxXoa4S9zKtaU3xPtHQGQ`{5lKc#(E&vuCgZwvh0JapJY$u;bQsDWg654aYwmgdAIF zJtmBsW8XGs@V9qym&q4u3bz<~gyOj=zERn&s(j7zIw!<=b^dbRGJ=ntCGtPWO z0TmG-!HjNKDU{ihV|KS71!Gmjn2Q8){xmPz33_$W%nD`&deu)nBL?vuBK`hjGcYYL zBR2@oDTaU`Fcm4E3Hk57czyQQCJFAAOi&c}+Q8|mhjO{kb!gB4!T|4v>m^n@)x!YJ zPZQ{(!{5In>s@`xok64D*+gP|Hh6N>t&5?G6|4K21#ibrLc}OOP}<&I^a#9_d&hR> z=$vK}sqN7xO2%|enrN0M6Jv!iJb+i1j@rIfhDXdPe9|IzRqMS41CYe+4RoBYwjX>0 zrgwmxwr|@SuVLie@Z6Q;IBAE?PP`hQZK>G5*zf47)yf0-)Ua`Rc9+ZAYwG;n=uYC@C4z{sV^?IIEI~9mbKbclil&ix5 zl~PIHz$Q6XMNy6J35nz7n+#Tzj$UekE}mg2%x``a9U}0u zt!7?uX&y2uX`O~GzF8hrF)89;bBqA5tww!ovCAKa@e@Lc%fFL}V|?K3>sE=*bx8}i zfg_Ss0BMmy!M{uqKh z=hAWfpcSH_goQ(&u(LIKX)ZyL?zEzQpPGF11eS>?!7W&I*&WO|w~c)ml^} zio##E7lx6ljOH~TCPDwiWE4!M2-N)`o-ayPZB^sfpt#7F=TrE3jlN`B21V7k zRS=`vJFSj^aq5!Fw+kl$AOItj8y`MVdalL7_T=K}k0x6a2+*Fv!<%IR$TZG|I$_c(u5k_+rWnU&laQ z@~JfoKsxo>2J@?GgRIB3Rh8G#PiZ=R(WeLydB$T@>}K%*?vRHL_QYJObrn{$ay{8k zqfk~5wjQG@qM_q8&a59wCdh0zb5_%+)=|HDkyqs=?vg)(qiA%I>Oh$ml~Z|5i9p9` zqbH%tvETh;71KbfT{o2SfhvspL{&$FV&g{G7c)^crf5x?_**afN{|WXqLf%?joa7_ zO|4V<4Oxg+65-qIowUUX=yT?dzIchz>cPQAH2ZGMS(*Zz(I+SzStz$N@p#(F8B6KN z%|P*x-_$27cvHFiI3!gYDR-(wa zot$3@N-3AsKYB^B;@0`-$C@|CA`Y`NseEXQ^^0;sY#kg{i)Re+_XvNDc7kV;P%(ofWFgv+FJlEtHZjKj9)Kbd(vQN|L zV(~ZBK*)N=#tfh)bG_ooR?1&ZY5aC&;Bl_P3X(tgZiWM!E1={aEo`*xTQXdlS&)pd zS0;Jf$j9j|V%|pB(F3sWgK1HiGBu2fJ3yfjvQGg-e%!j9v^WlAann`#Fjd#&EvRK3 zNkU6`9sdj#*v?r2@Hv=Dnm{ZflR59kuQFH4(`jYM@ikGvuu!}i^1+HdBXUvDVYTJC z_1DT}3K@c%k#hx4fcgL32yZO(@F+sLD_#o`qulkS#a}uJr{rsl0$$+x=Py{aYyz9O zPt`>K4k*yxe)?$n6KjIH0vQcGIA;7mXp+H1)&H;9RB-|+1Gnlz>9Ytv)ZTa&%w=&r zXK^=2G|Rm^!I#dq?^qwz4rGt3Hx6Qt3rr8)$DUGax!X8b2t2p(G5%AY#Ir#%&b; z8pXHfZ3S9sWm2oB2LS#Pr+rcGg}4}zGFKTI*-Rosyu0%5j7_(&-UjC zlZwxST(L{0arx|aN(EQD!L*}(U!E}UnAlTU)mr#Z^Zjq)s`(DRlz-- zF`HWtQnS$tgIB#znvx4YAoj`1bNa*BbnyK9*ei!bvJpB(DnCmAI_QMVZpZH{U+nRc3K!HC!&5!Z09i}+o2 z7_D#W2|!9ej(tUtgcdV&K(8CIZv|02pBWFdt3d$9dJt}qckd)4G^+Q4x|^*ja$kTr zUQSMc&kDpnWqkfn8!~FbM)i75>|XJN1>ivooqjkPowwOew~=Q;5Z&ZsaAG^h%7DzB zaYJS5$MUv864w0J67m9^`PGVI!w6ZFSN9^+Z*9kRt zgJl>-;@u9J^pd*Ghm4u6(*b#ls)nP_QW}f$(O;MeG3$ohv@yFLK@=aUd z95!cvCZXRGc(C*AVJ|Qw6?9zayy5d@_Kb74OrpqtvKg;-J0d0U;?wc>6I=Sx;c%$s z++a8V(@o)V-hnv*)$pB=;3tRdzLeG{HCl~qN!Ly4rvtUI*Qu*u7ZgA;g_g{bfJGtI zn_dWoDne{yxczOuBfj}aAtCc;DhLMyM`1~`Xf~0)+4+C90N(()0Z>q3#Ji6`c1mV> z=#o(c^_V#sVOOo(HgGc%5-aeCT{A)Y?UJW%UV~+rG9J!)27G1RUHrht0SDHYd)APP ziPTz&2&&`P&^=^#&#Mvw$s>lW2>=kTPJ2?+fEv*vC(&W@BMw>wPu}l{y3S;%!Aqc zgT0+&8wvl5*Z2zbbw6AGLvaj;OUc9(z$*1$jQJn#{lfM)cwWrkEB|5ztlm0sXQgao zi{U2tCAs5iO-;^6vi43IKOXk_yW%-1+!uJpYmB7C_1rptjv*@08Z874z{#yXX1HhW z7nImxk90#6yp9ch`OtTPV0_Q@0coxOtU_}@PVfEa2T24g_f){~DmGY|kfOT?x(Ebx zn;yT2$0aA2!J#+2e5wj126iD0v4$!-?pHy+x7pw#D5>Ht^hh)Un=+Fn0QxamN=Vv; z;{Mz~8LZ-a&emxzsDt z_ZMapr^#^DR0_qV)=kxA@sZV700<3$q`2C@d}sQ`|G`1u^;A16 z*dFWK6T24%1^hFbXn1KpuKa~@@^y3pMhAkhMW#1vuu~)xTAaKrfP(w8Eijj4$c-sh zx|rXoSG&B-T&j*(uHq2I+;cs6yc5>jY51JjEbMN=V832!I_1=G{u2F7Gessl1I2pG z{8ih{M1St+H@U1ezz;v%`>x>6qbJhM&U4U%(ubh?4v6yw0h}w zoSwX@)JT-JhqhAYn}BkTd@qZLN22M29nl=|G*{26zeQ~liV8HiHgLzt%>J1 z;fCDhNFpR>vc9iK3P`P1)u4M{AzLg?? zHO(xmsarle&5^u&y-Ghb`sk&d>b}f;?%uSo1mzEL|A|u&zOy$q5I!hzZw1XMN(?!> z@sqmRs>YhU&6cjd2yDzK|B^7R6iPXHMaB)&3e?%w9|4+{2q=_K4R?PCk#VMeCDoDm z9mP8d#dLETtpEeVL(z{Rx3^*c4(BNkPVB8;+!yQiCtskqev~GugcVI+cGPa!0Uk_b zFH|`IO?#E*-(GPYuorp}yqD%%M6RdBxMJ~UE)>foR_7s}&D$Fh#93Iex)-=A*pS3N zE*WI#rB#uUWnVWgTg!4pROtw;aaG(D=^Vk-nVA{ShO~vqoI`bDR=hvUZy56{?nk5| z{0|ws2P(tc< z9d1x5xXh-g>+crmbsLy*6u!ew3WS=GR%&%OdSS>55A+pJz$(bu$tHGJG5f4WsF;9qxXovmfhaDYvCoe7PZtZN~Rh zZ7L4HIz`XP3oc(}2Ci|}2>{nhrP({6RAa0$*mg=Tw1%zmi{bXNG$ZD$N44|8r&##) z;@rgTR`|Zl(^Mk^6r!|3;w_gO?o{urHHOGnh*O@-HRQ;Z4%ctEM+S336B>$hSLdfl z#xUH--x!A#1#5O3*unt*G=}&vUJzTdXS>v!{aMbxNK{IQ8#%2lu0Zy#_ucsO!}#&z z>q=Xjxf9J5H)uvAt>4-0+5pF9E-OFrX(7cCd!`gqNBL%;ebI^Y? zw%my0N8UIS;*9{D&TEgCqdoZ29h@sg^aK3^|6n(jfMc{>q*3k-{`>`J8eFiM;n^ZI7J%-Acb^}<%VO$AA zb4R}T@#(ll(?j583Js~C#~Bq~z&Qfb!DVmwcL?92=@dvY`QzCsdUQm|ImhIHa2^PW zg&lr|Pvn*!NQ?@GGH{Sl!qr+0YBZdK_EQ028Et$;slHZDDy70IzpRLJ>|V^hE}e^N zlTt>pr_}mwuu0N`0w5u!^W6MnAb4=J`0{(vH$xDgi$Z5|P9mui7t>mNryXXWmchBC z8#c1y$V#gsiGFV>zCyxHb>-kM(*X}*@AaJ36!m`X4~6gYu-yF3uq0OVG@mpjDAKDu^tB3eo89zl4~ z^v<>Y8>wzL;=VurN7=HAH(TNIYWJ_XVH>R`e8PT~r3(Gb>!-v!pTbM{0{@LAsvEwR z*)un0DR*+qyBFcH#*B--YjwT;06erAiF<1?aQtXC@`09`>V%7iDE>??0czyCU8M00 zAc3KArQMO}fpI6lt-zt>6AHSeJ4x+GcQY2p0FPyF} zv-1IfpJ6nmPs=(GB#bMN#cBE{{+Ky27A&`P5wyyfnQYK6*rS6%wyO;{tA+xG z+U>ir6^9_}0V)%(nyKZL+104LV{mfG^0hGB_hN)FmF&}FcbP6dJ5}hrJKuDy{KOw$ zA1arZJI83p9eM*-a`}!)WC3tKWz=b}d`^Nn1CF=Fe0rQ8!u1*p5)c zr+d#(^3})Qt?vI9b)9qhUHlVVpFg>X)vgbYJ|MYdl;+B~7To^;_;yTppfBi!L&cp+ z)67>h25=>}-d&e}UBfDCNZcM)RqVfX;Yn83e6%{d-iG^I7`W%xxK zj{1IzFGxQKBv4@f{Uoq=1j5=x;jc;+uk->;(>5d;o}ciykKVD zfx_{*dSMLAPb5!7I6RF?i6^}KVn5+}w_&diD8G_I+JJ(B_&`m)0b5Kc53 zqK9-PlvJPgyec)1FJ%J(-NiPbwdDZ8=U@XJK}+4AdVxypF{~pd*~2Ie+?~&C0~$hM zGWt&$r1Pn1T75^pkB_q#HzQTlq%g(toYOJ(do*U8BkS7|t^&00a%&(o^Xkj-L~pJZ zSO1N!76lG2;|urk8~)y?O!aMVjV7eZ>*#}HsdW7NRH@fmt+j9rlwt^WxxVmWY88lc z{lDg5r`|Wt3VskOx3O}%F&V6;YZW=4sSdP8Qm76chLvj0S=A?OD)VPr(4;owN2(~< zJFAuW8h^)2ZE4P>7n|O$CeYeWmPF%tH1wF|;ycbu@HgQW+KL$hk=#?^+AS`KM7CWJ zC0N#ed3gF3p-k*~;S^yfi?RPNS79lju~CtfxTu&vHTanOG>5I%cXR7!kRA)j{MGfm zq0V~lp9&JBcICr89A|-Qez@A|(llTf7h@ARWL-Cc zGyUO?m#q#_To|^}=EyupjPi$&9GJ1Lk5pL&FgbZuq^+YX;t$yl^RajmK4De!Raw<@ zX3rG4)@MdAUM*WH{K#I3`HM{E)$2wIcfT7OY<3arB_waq= zZCFETqymK^?!Hvr=nkjddGD)AD3EM@FY#6_u5#(f2h#7^v%6!r>`n*(ZcabeYmsa_ zu`88aPF$a=?4gD<1qu}c%sIuh?5ty`_g2LhKqi#8;Zi*_`*!g& z1rrjjexLr|LyVmEMHmH5lf~%`UH<_LETxxx|3iP<`~Uxpi;6CUd?7;exLJX#v_cD2 zj~0{y##G^4{b!SZp$Hu8U631@du1da;JG}g;PqVkgbp|kXn3Xqx*k8k0j9?5@*VX) zQD6aCmCF8gO|V@W8(`-`hp__*^dbFs6R(h9iicHh^)=6+TY$DpM=O)RNB-JWrs z@7cXVW82IiP5AJFcN62_{N~?B4%vu%Z#i(9(DG%%&X@PQU6#*DENYIt(X;a{w{Ki& z6)|Z?#|2eI@+V$tul=8=zCDshaa(P^UwM{-UU{zUm`bMj;YxP`=gN?@w2@`;<0Qr; z74|Y%Iw@Gsq~tsrTzeA+gFVULsNqr!IE;hy$-^yu4P=+`9LGH6m%;^8g3u2b4}jRS z3Hu*wL;`yGJk@RtxWt~IJS;5apTZmIXkljpc> zG)IkC_yD58@0)~8-kNwn(0NzN1i(b$o0iWY2x$7{rRKmPYV4o!`Vb1%;0vDkihrJ*nRI7)*Q_et!lOyoJK2lH^Z^0z~fI(8Blz%YQD zIspw?@sPjwMB$Drl#m(>8x}8$T|c=vFWhv3#o+7p!6$r$GfFu=!d2Fs9#3RRvz>nV z5P$j1mm@nDduJ&i3gk`aPvr`UEEM(ZA<;itSh`YvRWDx}?L{xgt#<(B0n-ghKX_V)i8++IEo?3=eM4`dOUgV73M; zFD`O;QL31niKGid=eFL3b5+;**VU!G$nT9LQqQK@fO^S6&7@b45o?1#5NMF__$M!AS{QZFI@*EvpWKgzkSK3mX(zV>R@ey;r^>?Fxn)u8 zI|i)|l@itTvePoQ+2}I`~y#84AjVIPGSXC{l zY|(4@t~KJ~PCiH`*P>Xgt^e5(hGLaq(9KaAAMO>lEcdC{hIzOwUnc)qO!KGf9;~hF z^*>@+SEP<*-xvV02=W@fQt$vQWd9D!AHVcU0K^J#-vLx2!G=(Ytcwk4AmH1Oy*un! z&zK&)gh;=o1uzxJL|@={yQ+YR44DLm0&qBRZ%hPWKi69}F(skuN9Aq9yeXjoqQS2Y zw@I;Pr6puN#O3KqgmcYLprgc-h{Q1k|(}<&;(Y2gJ07nwS2FL{Z~p?0WnhHgX*_A7Kx{r=u)emjnU&; z2hE?%>HKASBC;$V7<(~^%B7O3^u!+|Y0|yDZL=zP4zK-JkQ7L>6AcAspZB?apBvvu zw0h9k#+T5>VRh<9C0rPE^vy0N!}lrAsEevq97K?%!x`!G)vU=A;6!fPqfe$z{zZM0 zybN$Esq;zei%026ZD?$E0|5yyrsaA!Sc$l)wu9;*6W)%V^P?A^g-58AX;&}tg>j^{ zo|T)d;AAr?ox(SqWKg$2qMOA)Q08oh+2=Ym1RDw4!~-4}7}_*pkhU;KPwdz(R#GSi zqdg8V9V?!BPm8JCYI`DYt{D%fgo0*V5O2O(I{XTG+Y)f^qt$(hwlBCq-ytGcmgh_H z)%9-I>R~1ipPW-);6GUoZW5A%oU6Q|K13tBig++VLH_Fcyww>dSrv?uWHhW7;-PGvlm zR8oNaIV(74DRxmpmwDaKoN1~+?-1y*3A>6fW?_Z|Fmu*SzTh7Vxc8mQ6e#a{#L?0i z#pj|X_MI^Xo=}VmsQE4iH!N|x9o1{GXhBuxHHGc(90eoQLkd1?7nr*)!?QF*g-WA^ zts4I07-EJ!ftx6QalMxHM46i)XZKk411DFk5>i}@Z3YZH1QG?MKB8M)mF>>&DAk9J z-rdF}LsVh|D3aVTs?~j%;U1~6^S=@FPAGoB7QX>40piFlAxkxwIsCvs91y8He#C40 z;9Y}qVZeBi23j5M6Y4!T+<(J;E5kZ%e5)SHiWL#ftWH#%-gN;Rd}rP8bzLj$U$@`2 z*z*AkDtAlC@uztuef6;Eex}0XpcWZL1vJyqznC92@&3b_A+=}>%$fn@tzy4eWCNIj zCed!8*6FkRm)iXNca_u6^7NPVFdGh1pWs(nKe5yvIv3|FPXmmav?Y>Dk6lXr`NEnawz^4b*ic?znVrr?ed1$hUm%e{iZ{In~DSj7$< z$Di}g>3T6{uLx0TH2R;EQO2<6|DbWkjrgd8zY4XKG@JZgDL5M|P!%E2K1R*j7Ey6i z_sS{r8l%?y zrH$Y8na3w{j$Qy<#WLw3)Kmpsy(bFom4_CylA7lJ%w$wfAa>MOK3txhwPl$wAxgr< zoCec>&Tfu3YN)jSX@e`CyF;W+-mT|bdmKalx*GkFqLu0mce@utaX%e^rzsIPV)jW& zVlVGRGbutZg?E{*N1)Xrr6o4M+;Ov}R&9r;6SC%;stm2t$t{ikDeT_5_h=?7|1!)0 zpnb4IJ`V8mSBzUp_t4A@@&XVtYjF5xwnH@25)-Z67r0Gog+9c?rueg~670ORFbxwQ zn|t;5l}9BCm=erry6YhjE8dS-&#Z)GQMh(haVGv?7fL5&4Riq z|CUv?DB*MB&5y8%PwSqYja0>EQ3*Ug@dM29zqeDPGsL65AEu6wA0{cr(?w=Dl@gqgI@8mah%Vm;PyyaJ%Gt>Ir*b=AKM=qWepGypl@= zvzmjK+1GdmvTg{Xh1jHbXWI^5>O?Q@&Am8B#U=*jP)z4k#@6rc18sl0eAwB4z^B>tLnwZ=-vzz`k`Re* ziJW| zaEg1FKt($LiS`u#sVZtT>2mB%7znEWxXZXhyqjSGI_IVQ{{&GGqr}4GEzwJ9)Fxg6 z_kld#4<6j^_k9fAIK_9AZ79bM4%{mSc3%;>xx<1)J7%HtPr&YBhWev1D6k3}30RMy z2eyMc5037_tU-5a_|6hlHSM{g-AvsU6Z7$=nh%LcH{S&e;lW1PRPgXJ9KtU`S^G{C z3|4tr!xktu7!B>=Y%BCjy!pNNmVv0$^<+FvPzZ&adu)I1hWIL9M}u?b@_t68QRw`v zu&@zOZWMgC57+}sr3csm<$gymXqReSk8DBg;fJQGgGpqcRnP#9%-ZSrcGNWGz0m+G zh|6N-MUGw^hHF!`Pe}n%r#f+=Ln(*Wx_r+AsPeIsdtW$no%;&D&`Tc7m7rEI+#f4UN*i94`1qZEpN|4!ODrJcjDzuiLiU25Q;4s;C z-dAkNcwsq8(~?|5vxomg<-8m8I^IkyLQpzAD5vEvu$wuZ@+(qwYpG12?%t>|wm@>= z?irgDrex-VX5_+lXYBC<`TrqQ^D@xizJNKWd0AMjV?3aH1>K`B``MJW^J^ zN98s6V3z)5!_Mg)obK^|bK6~bYtYIy8ir5dGC%S4$w&&yi8XtTu^%hsv1>SR_2THi$=i>9>`p-uP!eCnbJOs!P@CL z%knc^+AM|MAFK|?y;AYl&fa)NWNl*UAe(gF2UExqgM-cP1qq>wzuYXxw?Ac$@IS9R zyoxw@K>+n`mXd_VALcAS<)k%NArv-#gpylMn`FQE6b)Mt65FOwsl=s4GrTk=Vk3H7 zDX6%!p0P6^w%U}A{|p(&C9vCP=BN~eoYBZABP>TjZ#iQ)-&*c(y&RkS(@4iDt-r7#SozqrM`x~p2YN5{m(*iJd zzY$h_4CVf!e2w?J0+!IHyuiJ@!mz&Dd;6T!K<3%Yg z&~j>vg!`R|GgS4%ARS2a-n}G&hgI)D8w5~ocdtODk={r;jIJMNajdh~gW-qH4d4H9 z_d|kXZ53l0ExdriO|W(7h#MK^F?Kh4GT)=Id{tlX?iWVxy!VhJvdNTg@P6#q8_6By z0aPs?HlgBLD7gY~5lZFdD5; zFvP)J^o8H;`*&UPzH7v3|18w9kB*y4(C~rRzH2>>{h6!TZk9zAOfpWca~(xYIhoKF ze89gomYeaDa~)eC+Dkj3ej9>rl>rd2Dxc~9YGdLT>^p5xz3hMd^Lv*MFxx4AHGIVK z{C?Y_0-m>RM-r#`)rK~}fwycoMr%%MI#^y>PeJ>TK2o|&nOyLPZdcmu%y&Xp3o%HA z24A+*l;TYBScGWhL`Gtc(IDI(HWEANzZaAIOe`Elu<>SN5{uyMkKv>(xOmA;?pizL z8aAbVo|wt`7%x^4v%5v`&0m6wb2I^N3PIubRkeqg!o2Zv$9l z7K_>r+>ojplv!ArQT5@5i4r+jZbZlV>2SZz$V6gKEjU=`YA5 z)w9f;Ev6R0N~@nUyBH|zIrGpYuSvO+dw;SSLP#{_@0|xN+GNBCv9e`@_ap1fmfK_y zjk^H$XF^UoV)Bxe(^j*TKYaZ=1pJ-x?CL^)2?FQ8(41>9ziMWrfVe2|n_#`FgP}6_otme{29-a|Lde%ikqFZLTJzz z=~{ribSl_}FzEp{CM%%P*w@OXPuyRVp#I4}fGPm*7X|K$vsbfOqRC`Q>evLs!gmpI z?{;H?ULve9oC+k*VnBhbrvkmC1}z6<7)X1~_3jACvO~9%9t;@;k_MO6Mgb?Vis5yO z79u&5`u}1^^TZFCJ^#bjfA1!|)7d`XamDF*Ap^Fg!16n?z+G-gVHspz58+$;K5j3O zgi!06LuD74(2*Sph^x){qhVFZq2s(6 zr9YW5{e{NLd51P*v^dk)9Ev-I@?RSz0*C?vTVJqZTluru%jGY}ZkVDXid`&43^08S zN>j6eP8`PC#L2HY!IxANwK+oBNtT2fm+JR?G1H4J=E{N+Z>+SUTZp z)JoR6Mi8{ih{FoLs`Fm(z8XMBR2PultgJf?JY%Udj#j@Q-$1EZI7*66um*(+sB4LQW~t5U#zotE^FIYFowwycZHv37ad!QF%g zEy79uVmK`6pILLUHQWz5q_0;0_UzV7y_5Q^>D0g~Z|z3raHW;vIZM9`r4Xz% zf>nR@5=no$dQ{JsJWtHl8i-~0-G;v zDa+DJ9w`MIORtV4GIcX8pEAklV z_98wOq!U{ACt-ZH=j2n_qyS=wu$G_8!nn@&b@_CIxRaHUfd=}ijGcJP+!;+vQd!<# z;yMWV{sPA9yLw(k%K4T!Ri45GKX#rHD3WS$w6i3vxU3~DWSSSn$RDk`BNjrq`F$eUrBi)kT;r#gm-1tVu%FbWEnF7G2^!XE!72^ukvxT-lZ zQksUY%wb5xoGJ2MAP!Tu7NgamRz|aI7BFoyu9NV|IOri+d9Ps;td-?@9dr)7mP zyq>R>w>Q|o0tBYB=JX{Aw_O*MBqxjK@Mb_(5KHfaVfk!)c?;kSEik^$P3N4$@js zPuVpW`SLLig6>LcT7)%!LBpELWV!>mH|Yu~LIGPXj8(1O$6V&JYI(M>#ryt>?*EKVRJ;?xu)I zdS>~c@CIh;M%W(IYth_y&Q9V^w&A}FoyMzseRK5Zx7Cl6RcE6>QLM=p2jA2d zs3e6aO&^v-;Wqgd}+4bk?&A za(yC9yo>}Y?;F2#2;w0M3{P|XnT+J8;l_#Y=uEh< z+2xO>y&|SY3thIh$F^nt2p6&l5vrIrIH5aE{Kf~Oee`kehf+9tf*c9ftk2>mx8whw zLO_hD5hz;Z-VKG1=Vk7z5O~LQ;EXDc zRTsQf7p{Z`)62FiAy8rydOJHN3W#quOT)&h)#*kk$-^0^ekcF^L0yvbPAmV%7pMHd zG+03*efn(?-sz`lQbe`>)F<5q&e2itJAu(%HLLL)Ge;Ws?z^;vJ&KQ$Ys!bRvT6KD z)Zde1gSuGMdi+r?6oFTxG@!nemz@HRwOt%Nlyuq9ZX`X5zH;pz94}REH3s`(#cK8R z9_^g-@A`k`i{|Li?uS{reh`W3yecv#DOCr)*U!J@lkiubZ6}+duudaIv?<%>u)4w` zw_A?{h%|=}D5E=tAP(xn6@R+*39+GGU^_Hx(T2^@tPpxkg9jb_F@%X|L#O(C_sQ&s z&?m4FiT4reJ|stjhiH*vwI-a&0UL&*WZEPQHbYotnUyCz#Qhd%AH+bi?OCh1^K9#?bG|F zlkCtP(7kXy#mOC_B2j30Cr%ZKyK{c(SRN}#w~B6{p~AaFOh;T5L)K0V749s@jH5N7 z!5+J+F=V!0gkRZQ0pGjR$Rxl7z?5NQHF!RjU6jL)(5f2d&7tTvMV+ci0KN2){g0=4f4_au!D| zP~%|l)k2j%^3pnRIBSawrdn%0oC8bvmz1zw4*!n1qkde#V6^n$7zaoTk<#`yt)9Eh zzu1_mFm9SNmxkYz3;{3^ejX5Pp<`PSG?n=~gJaSjOaD>}*PTqlWr@g5oG3F>;yqA< z8kn4AeXmKPGQ$1wS@dSkSeroue<)m{`o>s~K2)obyp|q{TIMlT0!c>LInnp0AwTGv zKvo_i(gmw8Sw>i4evdL#>0miuY3@R=WiyS!-9yk5AQvy7sPu@N#+`zt)5*<$?4-Mec&N`SI(fi5bHEK8DMUg^To>_9tXY{go%!gOl- zCbyK(y2Ss3r!#2-I2>1rse z>SjYd7o-)(x52%%)eeMW*-xV8`Y~H__>|j)&ZD0c$H=o`m$!I1rOTHJte>jzNv!SrjT_iC9Mb9s z4yqN1EpiSD?*EsPh9{i)X-xGrmM^y}H@crWTcFxhiJ%ccBASI7#*S9$gWNis zW+VHoNs*>`5zy?7TLq?PmF&_q9Pn-(G;Jb!+q_m*xNf=0;<7-DO)oEL;F=jX{n@|; zhud|6k-TA);FcgS)RSt(T)9-coUG|w(sLDMcn7)+iL)rh%X5n66yNE!y-~xgR;KDxznHX*{tJY7K!mxE7g!a z$7h9N0&MwaK)d{{k{ZHi$Gx*hexd0Q(*_?i2(bU=0Y40A95zH7Av?J(N2J&vG5Xul zJOc(hWwhg=F%Mh4&0d?FLu%0me7y{6D$vX}=_;+e$!^Lqke2+3wcIwLJ2hg1sf^uD z6&6H`NxX>|fY09@EZr99R37e9;S;6Km>8%_dz7a&TH(whHJAb)Z4Bz3F%5j6ET|t1 zFqT2O*GYapN=VDMwFup(L_a0>+W@CKEWfs0($9CgYz?zjs6rM>xmh)WAk#!-U{o(* z$?=|W!tBE_5nR)Nx60HHi)FSAAuov!dQ1D9q2dzrd#@zqw1rL2L`{XQ=Ngz(4jXUW zpKsxMvg8kTwfA~w+KvkC_n@w#?E2SkYlnDJyYMTQ?1Lwb?eOfCe~ZB@XT}av`BMER ze>`C&c4lDL6Ppcjhmg*m5cZ6@vp*jO{@(cf2H$a2E_Wb=PZ08`qPp%*n?z;I@HPWY z;eceB&hS=iZK!j88C|rbrO${flkbA8Nuj$LtXLYnSUNyiFl=Wwm8IuWD%hMHiIa&y z%j9~eE0b|JBXUZVN9!w9LUM4?pY0WtA&~mRN{AvPx z%ANAlu+j*HgUK>e{pIYX(PM0P^pT$fHnPyY3cdVuyryjZaM@@ipE1~`={I;7xKt#}n<9LfhJRv#wVNI^Qp-HY*>x`IVreM8PSNnRRA*Y< z`|0S^7N_kBy4N2`!}ZuO<*OLCLioe5S{EA(_PdRI5^w9x@D~hb zzGxs<0+!nB?ZLol&Dd4EwfAvXb=P*DAGA=r_i?PGIg8rmNkOzzv9J z2wm@%7IG)Yx4BNC_V}*F&4zyfan5Wx4Z9DjevJTLkA$-jp`8RKls1X`29=B7E6sq>hm|BVi2o~z%q6}81-Zfr1KjKgcr5t)fh#12S$M0 zl|J7~jqp;UE`@ajuP%!lil3?%41_GAY7kN>7Pt+(~7CEex7}^?p!IKSN2ConaIINl4psY?M(b;q2#ougC zc1hge%&OxUoY3+X5SUrc8Hi_PQ$tW!MKp~wm+8azO7?;;zZ8fxkMJ<6hUNKJ8Zd*{ ztva+efR56`8WSi+EEB`>H^ymyn1s<%M)gwpgSmV3(fk5~u8PlY(eI>yS0l3lzH(@itB2=`?(&kWbpx;5BMGc?&d3 zjOxI&NLSNYrAHRHCjUI=*t(nrARBaLs_-LVt;@{0lCU}2=Q)@ei2Yq-K?wFw)|y$} z(E6YJ?Z-{y@E4G{O^PACc>sqr9wQJu~+w`zIQb*G_djW9Z0;+_37CoMSI=_ zANb$o2s~bXj8L)OXDvYn$PdK~Fbktb8pc`vg*B{v4*#CddPJm=$)x1>>5rPcMU*=C z#``fI4}N@zaT?zpzj>1$DTd_E4%>Mw)`-A&D(j7xV1m;6Eq0=;SlQAeC|m^3n7HZb zJ97#=G+BoMNNlFGertD!5a}&uY!j!$;9ri=rTUDAN&*mHFpF!FY$RE6A9Icb&sb?x z@hs%r5VQOQhHBc8HiPi~A#9tfr-=OqkR1od5A{^{xbCejG6Brg#xW@Re0p3ehFq z^VQHk5E&pgzS`qpZ`AFzp)|hD&@vGiW!V3ySt=(<9RIg}+^3=O*9VsgP3@2FMKbdt zg+rr{4B-6Ls8kcPnr5_+Wp68`?4xbf;9>Ej0n1#DnlZs?Q-xerMZ~ol^icCZ1(M8N zfitJ6dZQZPEHOqk;ksl2#U~_Aqp&gjw~FJfs$~nBu2UR1?N<`V7kVo%85o=Y!_>~C znhnne`v}T@#BEh!N8mT>y_M+xp!{!2*odAmx_^x8g-sBIj~fNjLy8s-Dihkei7Nr674}fYRW0~^JC!(K>&_|2eU$|aS zwG6sj6P)K+po_~}EYSGTB>qYe7a%xJHGR`6lgobq|21c7bgo3J$f&MZEs!23>^5dv zEdA4|e&Xp!5jBM|(ITCHVzTsh1T?}|!e2K#T<>?2tQBmIZ1k}M3S_CCJ7)2{hS|Y6 z4g0%7FCzH?`MBa%#y$~CYD2`9WK~R&X_-5JU;Lym-L{HzJscQ?=0{MR<<)LXjnyJ@ zEAB$1w3nkREfayk@)sdmTqgI*hRVnCP=U4EWFzBQ&LRi?Ua9Kx?s`7`hqqV8Bwu%K z@x*F!vq}Z=fRVBV(e-df&JUwK#uWSQa2E7-EP+^g%9bqo^ryt!?SU9B>%{IyxIr9& zm};BCVfhJ8(D=y9!^|a$(aWG@zAB9&@d{W_KSFYEs1r-&$&Tf#u;LyU_VR7jf-Ui(t7<4f$Z|1_xt~Sbj82S9tqx>WzMMn?&#@(xHGFI zqg?jm>mE6OssYjlZ7H=%%+EK7r{&5<>eB1`=BUonJb+I%K+5)|I-2>;-!6;n2>`sXvD{XG@^m??`0lJO>5{a z5naeNIAfX~QWVDw(fzrqfH7f3xNX73`jepHC;vvjya_r_5gG1Xv=^$rk)C$>y;)WJ z4sY4LS#vjNI&^2&L-zeT^_#e8R<{P7>3#!Z!OYrZ)m_oLx%v)#s@E|8H~Nwl=Q}e7 z7c(TX4@eh@lNHLxxU7A#5}3c0vsu^i z6YnMY6mD|2Z8LF80GRuO?uVvkyDXCHNCdxcx?hb~GRDur&%nh>KeL*j2M=eQg_${8 zUvQGTlObmR+);G4@gqlYeBc)NBXZqeJ3sOFt_{9PWC6uRt6Gf=SH8ZvsX~Fd(-VZe zWQSpf0u8yB^_24FACUJ02#V8kbtXA{wJc;$_Pp7DfOs??ozHmIW3ok_^VMp0a=)Y~ ze3ONrBrJ)^^}Bg*k3-G@K}7 ziD-8+cw>{)_GqaV&P0V@cWbowE%%EVzJQwu=Uq(4st51;=_hn*{UGUbiRJcN@R1#% zC&ZhOPh-Vo@afzyExJhAqsW#02;XsG8QFMZw)M?(zb|kq6K${t)7A97byLSjLGOO| z;asxqfE{!JXRZG9(;>pAeC%fz3zs~Q7A1}Yhd;3O12+x8Y#`70ead#5x)WwDrEwW~ zh*D%PzaLA!W$KkGbV;kPsd1jer;pgauV7dD#2&fFZT|rR|NoCKLL$0AEP2_AA7TS8og66sZwEFjmPdNktyWb64!R`NduqiA?EL?asH*^q z>W%gwN~cISNSAbjfP#d8NJ)2h_Y%_5EiED--QC^YolDmO3oI<}`hWB0%`m_&_wMd2 z`y94 ztIB00#2HEH8!Fu@rqBqKrh_7Aj^5KBYG=d`~{`Picm;1|yNBQ0NfR^h{c4dTLCxr+B6E(?B`t9a# zhQz^DA#wz6zOKDg4hKY%o9J_lMW!^@ZHsL^4doe$P^mgti-Vp(RGpf2lC9rDt{!js z!KxHp*C8BzX})HBtST>#-Pnoy`wr)LuE%JwYSoWfXX33*(NNB2JPi*COl+!$2|p^9 zWN!5Im#rp5-F%ItbotV8h$_wLsTnVElo}=)qR*cvce!VU37U~ti97bqGd*T3s_ekn zy$N1L&6uBetj<($gLS-Vf`6nh&=PAURG{*c7+#d|rle$+%oht@D(34hHGP#nVNqAK z#eL-T18vdCiTvjq{{Oda`KeQiy9I%j@Z@=&%MhbMiD3Kl&I~&l1vlRXfL50MeuGX= z{$w&~OumP~|wD#K9Ebb!(% zg%;(5J1)+sv$0=CoiUnc(;0KW5L^i>eNQl002!4YSB$SK%c=(S`GXI{>wIhBA+MQC zBLOFwHe-~_r`bwvQm6JL*!#9oBZTFzZF*TvcCkt20WJmuuvCrCt2#lZc-q0C?D#ON z4GmTTHP(Q(fgrW-l4I^z%UmGAMHLCM38x3+$|IFBwLGq(FYKD%RxA{%Ai6glDQR>8FU5ImWsVbc5HO%tO?y)9-DB z1mvxl_+*G%!VnPLb6(xMA}a9UdCIm3`R&GrBwbp&=?*%C@Iv0}o2b<6l_QG$fsRSq z%%kczsHfNda{eye!_A-H6en7G)H91I(K zoM%C)zp|(i^|}f$c$ac_$rg->%<7^4214KE$>1L~Iv`Z_;h}`jI!?|s1T#aeq@ri2-~R7*oFQqkH7{4@gRPyMl2DITE7Rb$o?!O{@Z_qr}*KX3d0 zz2?8)So2)gJ?OB->yF3x^NZJ=SV5ZGdj+b+y%!hn>K!&>;^XlE342BW(_xILq*kL_ zJXt;jxX*T@oua3wM}oW_IDU@PK2n0SW zvpMgfl}G>_`CBAatlGKFU1f%FLfNtOvWApLlq{sr3?Oh}!1do_AtNEW#qAFfdK9|7 zt9b}O+@i&q{z%#Ieo-HQ`PF`!$75P9Q(=o8fn}OTju6}xCE#)4CQ+l-q}4gLeSK!?^UH7*#<&8UeG1t8wvn0o!NFb@XSh&!{O0oU85 zZ!4HJeMo;)aBo?9{uLC~?ptN^z7Nt;*yB z?1N>iHbttozF>8D;AgR43u4Lq$_0wsiLq^V1SQrK5R#Y}0ff&cu?AsD_fD!G2~zCo z7&ZFd7${bYzxB~e*y+u2U7cQdjW0R!+GlW;v1IqI#7yoHl_vEbqG_33e>EW=&G$w4 zr(N1euTqsTa4aP2)}p3rytmr!zDynaEnvCd6zt2<@R4zHbN2RsVw#vVtJ7GTW_-&z zC6xCq{am0ueC+Yz`clK?gJt`LNic&yLco{}VV2GHQ{R$BViHu5!6Te1hZJw(;e9osMDU z(SNpp1RS#j;K*m>~sHZLDh zw;SlSZ>^SJ9(UHvcOcB8Mdm!@y?(dLC=oaTf>UMmugV|d=QLs&+--w5;%op@mQ{${ z{c*Pt$H>z2;)mYOxPw21#QmZ4-Hx9sx~=ft9$us67*qy=LGw*KTOcw%uvns2kP z*>MIZ4R>CHV`tr2?trXeM4D_Hoof^?|UB>PE-Q) zSMF!45iMuU7%lFn-IqH9@k6GL+r4O_u#*}=_Y-2+d11CUy2pl}fPLdu=vRN5M-9IS zFBbP=HI`M!9;`;#Sd})?tf=w``v!K-57|a8YtImaa_>zFanQfsW829 zNQ(y6=hUH`Ni7=ua8xPngmQ3~eZK}X&F`KobF~Iz1a9?GxjklcXdzzrHa~6Rmo}bH zr(VeOU{p9tp~`5o3d=jKjiw$%rnzBKZf`XAidP7pmX?(V=A;XXT7dwM7;oCWTm680 zW@PbXB(7c$V?!m^>C7txg{OjU-A?>=m3m(!0zn-f7)Q3?U{!nCXBv{s@AH-+>)Qbq zbrqo%X76f7AWn;Igh$#OgcOPkPS;xBuIZmPe=h!+FYYp|O;6p-D;C~Ppyomv=*hIn zyLHU!lKm>U>RYTI)}0c$m37bbMN*XEG?8>Yks37eY9CP|dW>y9vJ`8rP8{9HHjq>} zt$Qfa$mHG)HASO9y_%E6QrCheQTE^_6&GhbSMBwH4SsUutGD@4O!FsB72+uSXOe@a z-BeX-*6hAJD|tLZlWlO-`P7%m#j{M`zB6>)CoJZ2_4)3WE_$L-qz1Xs`{PTYBv#={ z*+Hh39&hi{?8W=jV=oB0QK4l}`55&euo*ZNRVgJ#jI`r~x8TnT^+Pl=pK7OQMO zItEdDgZ<7)~GhSk?%Q z%cerW;yU6$SO&JuJ2xKhomG%7%+ao07W+yMnC#6$#Cj3!zHkZKWBL1^7jV-4AbLt! zzOz&^_s~{s6Zf-5O{9HFcz$KSc)|~eqr|K?H$RJP^qZv`+?r=}Sr?pmmD~VU^iGpS zjx;w7JilsYZsU1PVzVD-{YOM_*!Uu!@B?I$yO6nDxnY@@57>U(??bwBZh9{yyN%XyeR^}NWV+7xq`yn*Z9$m}+|(-TfmwVYNg zQjJc6o{u-$S0`mk?y6Q!f$H;&3|#}^PQdu&ZBFsGh&FK$Err5Q!+kGy$P931j7esE z3g6Xu5P@mVu32Mywkf5O8e~}z)Jh0Uw-tc+#3XUu2?mhPLFXRK6|nhM`$ua@U^yiH z3FG32Yu7Hfp%?$~G8BXg646xg&Pr| zb`r|JMa=VDdw4l$D-tuGeU=EeiKnhSFX)(C|aMmUJGo&I$ z^ff<6*y{6u8&!mW=O|Y=LHo>+Z!wC6kd}d(3+R~P9qmU6pURV@kx9&NISuWfUBWrZ z?XG%W8jVq)8{eIXzl>ow-hHId5^W|5k)n*~bTa+QWm)U3)k^1hgWWSN^8HXkJn-yN z;pGZCrGd2&p(`5!_bdMX1Fm1OGdG7-HXgbM+!Tq|TKKRb1@>tDXje9*wvS=q68%D& zc}Xrulc$q6hsUp1OJ=pkdW-J~Cb|vhqGIyLZ1!s zPMXH{Um>`&Ayjf!{k)Hkfw;1bRFzqbjzxg-(i}7+e}4XLAjQS73)x#DE{uKDrJ3bi z)*RdC>rh;t)u~0zM$HH1<4lDJ4m3PE6R7j^hyQT*>mkpZh<@0yWkb8ETB}~OkZf8M z-8f(u?oCaY%%}rEea1te!TtctCC*UvV_M-r{4LsHg+pyrv>lwh5Q4mBZp_>_E|TDI z-=x4+=yaCR+N8L$^KEU8*8pwJ!1D5(&-fRJsk@_N65im2jF&AGAXN`{R4rERvaIT{ z6xf_h1iklOiY;i$pUgOM#QD)_J%vR2DxsL%RQuydQ)iB>>H~+Cd*ofOiP5oVQRci@ zudn|mI8f@({raq{Qa%I(2q{opfsJWnutH+nW5wk`euq@m z;v=P-uqxA=#cDI2Y|m{uTM;O^=xvEXPL<75({WkKv34Ki>WUk_^Xwn(!j?MX1YcwE zS7gA4pMsuQr_*`Q+Mps@*kMx(8#omMYZ?^Hw~u=U{=_=8RW;$pveTp* zQ4*$%beC8!e=*$t=Go8L4WNnjIlaL@SDC4FOCKoRD@c~q^e=o>2c}FU8RBh9S{+UC z_KZme;CC+LQ3maH!4?L=1=16=9!^2CHx&PqI>z>9s$`>WJKb1KvVd2wl{Pmutpoqn1ue z2qh)tV@0m6rx2=ahUef+Vt%xd5(3KCw{MroEcHIyBrGwBRad6?W8U~5DO=!lu7p&d8`I&F-@sR zIQpV_*OU`FRHf{w4yS(GaNdp z!R8~;wk;J}_s?vboBI{f@j&5n(WWHAu`jMlBlG^h3wUgDfymJ#8?V8j-}go7GucNN zhDrxf+?|z1VOG-&5SJLzoFz9%jr=%D?uo51gU@81_^Hqs5MhZ0!E26~H(kHxs0E2a z#{Uvz!phEKuYK``8;tjKtNk}lC`u-ngFlBgp_yl=pwl+qIik0jj0(PXbzz7nU@J5s z0YYPoexq(^FSJX=nLTh8u1p)@UiltBBJI{kY?`EER>a|4nIO0q(;M`~o8Cmv-FVrh zX9J#QGGMK_husjkcET;tU+>!#yky!;=>gNx(4d4Y55 zG>dc4vy!gcn0lOgU||ki%>ODehYtYpu9L@ZpWY@EK3>dN*KPmF5D$;e;Fl_#F#>jb z3D{E4VuMG{uD{J*+>(I?eR*v8~>yJ!ty6JG9 zUvRcwFd_u3=MF&IJtTCVO{ic@;(u@Ar=5FrD7P7T&kL*m%g6G-4(SzvFoPJI}}rPZ#By?s!^ zUF?;g{svvh{^^2!vHeL(jfFrIp26ri)km}iResKLgHacd6|^6xcQCKO}lm$nt~zHU6jaS##C{gojEA+Xyv^em;Yu?&Ij zf>eFH(wf)zUQZ77obqo4fVLelolON^D+t-ZMi`BM!sG10fbT2smy^zbs zi}utq+mwX--@C%h3klXWYITud)#4xN>4~3LED0n;)?t)siZZ@iInRsd|$D! zQ@>*0Q`WE^+3^hP81RFxG2X8VtN=NlYo#Rl0!e5yMjqc%p32Y{W_6u?o`QMQ;Hejh z4p^%t6OwhRGB-DCgP+^#jok@qM#D4#l?6z7!5!TayacVBNf%KLubrxdV<@A3J8#~- zru~YaCU#ePpm4G{Eh>t@i_Ge)vw?IoYct3;k?*tSzH2O5)Eu@+Y43~JyJ@Ny9+seD zorLhW(u-ZN2^8o@Oeshi>a!RkRUZHZYB22%d#-HX0KG6Kj9#0%!>PIR^Dex8deCfq-!JwipE=x;op{$3@cLtO`;}sT-nUs4NY(W=MacRM)A|* zl-w818kfIJJ5Kw0Wtb!L?KZ~eU6V!1N0B3TVZ!6T4F_6DCF8%%-Yqb817|x{I9K1Y zy_I6ac6C(1fxTF6C|_sjDgcfxs%3eb`c?2@wfw99C0T~ZOWAX#7}1H7uWKUvGLGDs z`D+1*oKJ+piAXjaaNHO86SU2OQK}pvb432Q+$1|LyTorC`QuGsdpgJcL-ghaB9g8N zRk>dZT<|4t3owfl^szO(O`AtpZ- z<(9W#IiO6xKqZ=(`>M~|-(yG;W<G3 zTIUa--j>6R^WnG@s%lE&H1gu;e@OYk=|@!tCzMR7YOS zl0k<*xw6=ej_)PLbC5b+$;D+X2s7|~xZfwMh9#%XPRYkRMv0Fs$^Cz#Ew;Yqv{NW- zy^Em~8m@O5VHemM7wHJu8Bpppt}=w|M`M{(n~#yce1Yh@w*i;<5gWS$)U8()ryH>V z+1;CMxm_-CTDzg@T!2H4J@=Buf_7FENu!Ys;0qwhJe6L74lkl^1tUyM?9S6O^W#s4 zL#>1waZ{de#F)r~d(J0I zHAD~$44^cUIh{A0_hf6{Zsmh+j6`o29aM_d-U*1rl1X^-kOP~<@tH%!^18KRLH~rj z)l=xr-8k^1YaSpnq+q1GtJIF~0TPq%Bzhl_YGb6G{Y#qY%vyi<=FPTF$&0w3blzfc z_O3nO*u4y*@jZ|h;N4Wy9F|a}cWeD^Y3qwQ5UX78w_aSN#$x2{jcl^B^NTZENk9T= zbfj`Ye^fZ{1o~3`|h=`FIQRo>ur~QEaFY#p!SLPjCbv{XZyUSf@>&12sQ2VZCYA zC?SXyy+S=}+=(IZyHrppncH6XIqwU`5l7Ac@?af0PT5J}R$I+N2ubrfZ9qtyt9C9R zANMD_CS(VqHE&qFq)7~K-_2R4s}uFR!HO+vIGEP!G++}{+S+*+cCRV8a2aE75L%QOyVc#(NrzXRgt z{NzXK#@ZKln$mask)S4Lv1bD(>sBsK8*3~U$bY#kU-oxB*W-m1980BG2B{&MQ9z9&1grVc@$Y=55^?q+y z-yO^rl7o%!11;@osXa6MMKUsV$$3`>^7_TmlkZV2gIvweN798^bWgI!No0p9mDx3M zeGa(G)L24L{O_nA;RxA2w_dH+)2sjx9$9+cX!8-E^f?ho`B5Vey=k+I%+tw z|JgR{?9BcR`p4GWWyBA(c#6u(J6mC(sdpCBhrIrG!6;lJB4Gnmpch*g+%hsUKS!&- z&Uk_Cq%}1K;1G$k&fYF*RAgySC#ZtwqrgpAkLtrKguF@G{}w~Bnxp0RyBC3m!DD4d zx?Xe1p748#?SE1sHEu7b|0NTHvf|d?k_z3+b_J3s99^jY<9594Wj6+>cY2#vf2D(} z<9=+X@mh83lyAItxk|Q7V<$|)7a@`HPu#?wp%9G2di>UT106)jb%3SB> zG&e5?ayqlce5&3_#Gd@E0 z(GOp^MMBW`yHU4Yapy0LNfPuG=|3XS)C<&87LD-pfg1VSBW^T3w_t4)7VJwiL;q+b zII}bJH{@$vuCA@kRSul7H>{7sJCg1WkDO^*SAEAn71Q-)!_HyY8nHh%+hHBiAb7XL z_OeYy;F$SNElmM-8IKssKfiz9Tc_hO`ByZVfbm4OSmXVEhK{B_;^}G=KJ50iXTD5l zBknj$&Tg%l;NR`>ED_-LnlEH*vBm<2-`@6_$l{-aF&w`6ljo9Lv_$U{M?qf0k;-6l zt_m~Y4#h{BZ;_qKwBI5q7tFseH`LI~)BaeXN@&w=hh^J_Ot?XcFlrsY32-$>e{RfZ zNu-*Q@H^Gl+=CjwZK2w6pLdOF4-GG43~z36B9|9j<_jiu+=y3qgLR8Thb_VI=QOgV z57}P1?MXp3vG*#aJT`_-=_((S*L2dtsk!hKm;pucw@G^F@n2VYTt#}j8tszb`nV!X z+V@rOH163YiwbB%R8`ls-3I{V#iA%XaN4O|BsY zvsp96b3CrdneipH*{WPC-UoI+T}!1YVvAyU;Z9-_9meXDo6db42Y$woZ|TI+gXk~6 zj~^!6fwVDL0cauPFGL-Ox*986j`K%JGyBJpnxtzHuJy#E+{ldr>CP#wYFD!O$XS!Z zH9>=7?o<3<2U5Dc^&zt&XM{frTzOfA=dT6Pqw$7Ld%;p%a?7I@QNP^oE=|t3(bq9F zXsP%!MqD#$v5c$OU1JqE3XG_#r3*BBOy~0o8_2RRqc&Gu=}(ZzHqXccK39a4V-n}R z-!y$$FP>540GRW4nIMTeA9gI030bWX>fo+FCD65R=O!HA&UdzJ9jWRV`jLUa?gznF z`D>l?j1WtwpEL-Q!@bq-M4E&W>jUp3QcGirx;|jkDckrPA?`U-fP{Rm-mYdp3^V6X zg=g3|;{k}mplc24iveBt5b*Z#$(vaK_10NT=)c8x@`Yr0Y|emSa=LzF>Om40*mp?e zv*z6KxW3F#NRC7hfGZ%(6)a@Ld|LKTJX=7&&(-C~S21jN zA&7kS##&3ePMh5`CQUoKc=qla^Q$15vkoMhMlYYQFUFqe=&^OiD1c%?&-iJKZ0z^K zu~C(l>~@^HK<0R{NrTW?QgJpgc!Z~AcT<&`(6ixQWj)zr%k5S#=wwXi8oClYExOExE8OaSr@?V@Ki{ zVk79}`9Y*okAl0ie5xm=vnFu%%<>9Utroz$C+lrwRQH3j7d1J2XQ{oK zD9@{3WG$2+VL|T}UE?G}71^QyTV8d<3J9jYjN!o{=&AX#TVoZMb@^)m{#~jak7%hJ zn0e89%n>lxQ<|+_v>P{KMx8m(6hR$Ye@)x2))Q9_$yD`n67H5{g_f7>&|eFPCg(2InL3~v!G(-6~%ng8}ogdNZjn7 z9MB(4TpmmaEfdQsVYNL2YSV(2)v=}k&vpqrKAq%m49j9OPV%Q79WX?vaYR%4irF_R zYlglhjOaK#7FWquuZ>Uu2>zi-v6Oo|GFB@ZSu?R}yupJ~m}DCeD$wYL=el8^ zW>kx2-!179FE5YWuJLS}#%FAOBMCyu?mr+9sS>QiR6{g@QU}-C8u4s2m`?Nott>^# zy>WxPtLE^nSf3^pL^H9-XbKtLXbtU6}uON1=2Rw*=B&t)^ z@16xyOJ)0$BB4pkxpJ#!oldO1o*`3cf!S1AM zidQu0B5xZ|=kOpBoqfhY3+62Z4J@t|MPE&U5K(2`l(b7oYM>0wO7~WudXxqeBFm2U zA|)E`GHJ4)aujgA+Yi(z43%P#u2Kut?Rvy+(PGIjDw6t>l>g!OH-2YCLw7wS7UHz0 zXkR=*7sOO?r2^@~SEzJNCsi2@x^yu_6gyr$X~fl*=Q1$nx?7VT7fxta`3s(4Fx!5n zz47Wft8sicWr}kZ8kY5l)Jh-*f_dZw4Ow<0;XI<|so?H8zsi9XPB?48dyTmsdn6v| z=F4@Wrl$D*iH#RBL4HFhVe+_x`s~)4H4XFj|y&MgvMeDOq z6r9XLlGf{j1QF3ahYy8Y&t1MaV1*-3xi7Tw0Yj#*pPnsp{IDz9wKt@!g1@ z!`q$0ux`6QcHnHJ5UCj0Sx1-{L+VJ?X=cskZX%}oXL)SUN}u)EylT1+72DTmdqyhx zrgPrJ-!^iUO?q{a7R){;^^rLR1@w&{CeJ^p9(}3`EB@LIK)y6VPgERi=49CB#lynzAs{6ie3){mS8^ z*@Bz-d-9J$cjG4@!kA%!yFO)iQMweWzOp`+OKNlb&pfpjiuQFT*;~et&RCd!GgT_^ z^l@XgZ&1au3}tUHRF)W0k~(6LS6fj(lX(3HZh;Yo*M@*PBRQ zYoHdeemA5io;D{|gu9vKy&MkVMg}Hpm4;ZjW+;eFns^JgtMeepeOMIuuX~MEr1XqxSzcDlrBuOizpU zXS83L<a}+%Ctt(n67-Jg2a#f>*(aNCX!?4 zjR6*TQ;G`tReVh^m^`WN{W>lwXP%dQet^|mHuhzQGUIH6uo(KP)`ijzDL*2c#KC<& zfoMdo6aK?|;up3yqtO!zUPqGJi@%WuVT|!rJp?hC>-*EStN%^sTF`O( z6v~_vc1X;Mwo~DiW=UgueI=!+idlInM1OT}8W|Z~c|nd6keyA*^yX%O+|SSN0ws+K zJhbQhPg0qZ1x56P;h1;{1p(y8UQ@HjGg+P<&~kB~&n+Ydh~W32ZbM!}SJyg2+uDTn z+^~^7;l1;PnVFe`vopdqXib)X+4rC>YGh<&!2#q47#?N_=~0S2J(Cw_%(8k-RrtV8 z_y<~IDyqcQ`NQRz(k%B=FV>>9yP-Xo!nVkghEx${7z_qz+bh=6^5peDMNWUDCS^J{ zd(kBhQB%g680O}Pnb&Er^!p-BKPD;_1pif(V$pL$j< zP`!XXofwFxiU7;^=H|xO*;@YkS(#A+I6TwuRzvg=0?c20zI%0h-nYiNooNTIywUE< zOA>bI)B5~2F;gt!##?NZ5W>9V+x)*YqXeKCimE%{Ilqdn(rB`u`-seLN*{r-2ntbA znW9tnSsMQZAcSkYb=n{83NA05M6U+v9E3IA=c#NCNWi)H?Sy$?zcbP7mTS=@;Fqyv z{!3691%QXe%TjjTc|uUm0my(yS2GvEN92c^J*PvHnB{GKzNWT;4>;V>7q)MJbeef; ze4qHl=a*Y0V!ny2z;;fcB`y?bGV%0g>eG&N&et!@sZzdM#0dM6*Yea^Zsz+KSv3>= zl#C@Z+;v1{z@V2_bJu80L&&&CzD19hmd~O28)y3ZF~AuF;=sUEkfIBXs4Kj&TCw}( zVd^0AF@__s4AD0E36EZwZmPkbsU%)`u8hHjs<=cW$v1EDs8Co66zM=KLaCd+8C$|3 zlkG2Y6fP2^h*c$Z-R(lOXLB}nN2blBidDM1<3HZbHv_b&a%=hYB3cg>93W_IJF+LT zrQZff50nTmr+S@3$nQNVOw3LwgT`jUQ}*cGQo12{(>}B)Inscz`?mrKU9lN=hj#QUG5wd% zD@x?(Tj5rCyiPS+?E zkhW-S!wk?L8ufVFR78Bqc~3!H*G?SiL_fT^T$>ijZIfFLd}zf`Li#^hlD*Q7Tz(Rc zAI#>TZq4G(Qm~2_-czNxnHUhnFEAl7(ygy?B1bDvzguk^9ugYwN5J7?|9C-{H2*>U|D3U&zZ8E-Y;2_ z|GJqW0%Z&n^BO1+;_%XndFdPrd}w#>~1-eS4Klws9kSjb{%~f!$dFZeTx8d6Tj7rNmQ% zg}}BoLBc>82jTD%@-HdDpV8Ohdlon6}u6Smc65%fOIj2n^)@7IF z+`prsPHlN^&H6?-oD3prA%@MPc=0^n040kW8#cX|Ek=*k~5l&OYTg%NHC?PxG9T;2c2jN5L+C z9u6|Wq7yDL&2FykV88P{4}Y-PiTAuxy`r+q7+=SjI%jL7ER~t*` z+Uz`>UjOx4M1~2>+Fv{uoitVi9)jQpl;*LCY~~hvWW>cX@Ybq+3IF^77^eEiBQ{Zi zh!^wE0@mPciQC^jmi9$KjtWy;5RXx3yz64#Y;+%08N6Pq zCJUR1nAv&Rv`%1D1`gE|ckOurCBv{eF^3i`#}x_(HQFc*XF=xc+`TJL{fDHj7_yUd z<2Xnvc<7=;_993S?fO3JR82R(2LCASiPLu46AtASraTH?&R)skzUtMj?~%+{;ROc} zNR;fjjA@yRwASR+RmU*!gEL}I=S;wtR#c*bVoFDI!VxaAg76Wq*CL@JzXIG=MjH)l zlpnfKmG$E)?Fzp(ef29)wUI_#F#?zQuK?=1L8*uOrGkV~kOG;fdwPkw3=1bV|cGNia6r$8DN^{<~{~dx)Gv*=EdvUk&NBJjuq+ ztE9sqt>UeU`uv>1=luu=8(FX8%gE2+Wzg_F)#El3n97Qa7+8-IpRi>rCUUjKgNiaX ztmA1DMdeM%io-L5gwLkr4mjsw*TVCOOn<;a0%~O)*{$qRp-2~q#)DB~^%bnEW>>l1fV=R&)C%a_6&C%Y8? zi(snP5#O5tUnt@OEgL)g)zSnUNmg9SF2V`!Cj;SpOG!^p-|~6BH^{J8mN>QT&Hg%P&K zFhqoXbFdd!WMj=kgls71`Eeb@(`JSNx>*24FnQlkr^3^H;65f~fgO)~`o7}vIPkS+ znH013+qxC6gS;?-Ss4kh#fjBJM*XMVE%P!mk2N=e_)lpKZKv$K8K2v4%37A%?J(-R z!5tn-^Ab2>ckd)tpXlKG4(q`1$^CYifAv|m;bNvIiJ$m2F6dge!SS#l^sP!p{!`X!YcQ_b8`hC(F*Q!nZ3~^nMr7+(PLrN~Fzo$%WI*%`Mq$#G)-$ zqMax}fwLp&e8a`Tz{`_=|0v62{iERPeLAWq+z_ewFiPL>>uFV;tTAmI*tg?{!xE|t zfnWOfqP)DbDHRC7+_r|+dpkd{vUm=da|5cm`iLTMxi4`~b@!GkDk^H#ZvjMHaagFt z>4V^Z88y(j?Um~CbW_oN=v>{}I(lmGjO?-TWS8$R;pQr~=Hi$eh;N@s{u zI#3VS=wFle5Y}LMFCDs17V%-})&#tF745w=7`Gvt`!mxT;u-;zWW5oN2K<+Sq0`iY z+l6r)dB0wh;gH#-RFihAbWq8?e~%vZ8=Ld1mXgb3S4+6!iRnoYc>BiZQl8QT=#YMv z8QH%a7mKGAeQjIwwPC=vMt?xJ!^F$3rn6ksT_3h+vSSn@!9TI+W#b=X!&rfS2u$V5 zG<4JVshG)W5#>0NrvQDRbz@r7C|p^*d3Zos@P<903EQxp40AL@$&^Xz74O{mSk02! z?XXy|>cO1J%8`rO2N*=3EuHNH^jkR+_ZBm~Z zb>_jV&9f;y?oHMd3qy-0<6ciqdga<+CCA3Q5zz6n9OhH0j>z8 zFJ62zFdajDaRmikvmgUFz@mNqp}v7Sl9uZJVqm4kUx6xHFYeTI&55kZ^tILdf;5GK*z6|5}A?uW^Xo0;t^PR5rOjPxXY zpxoh$V&DbN$+F^UJ}T`NhYB}6>;VxolBP?HN{b0f`62sH+29?|%Md1GP z$&|H|)*~ETKe85|UdC6^&Yr#BFUhTF;E^Q+`7trPb5n!Dp1fA*`0?N zJGHCDYiRd2eH0lkBEUXROk}epx~^ZvTBd;-bN5+@Im4NI-aJ^mqj||{G?fFs#Pnwl z8`}1T%|+lt8HMw_{g1YbePIo~3H9Sfe(PA09-IFApJsjB$M?1ZvGOI!ZtbULI*h+t z2?A|mS_lNn@_)D7|0d&Tq*@U+N*VK7#Of=ZsF2rZ5ZpfZ@&AUmJ%4W|g97bN?s>Rh zcOVy`xr{zW^4>Ki8*iAnU%^>#qVjc>(6VY%;$(AYeA#d_jKssT8kx-BF)xf#R{w2b zP6^fZ>8SwU9ONn7%)wY@Q@o~I6Qx_eaAmz2Y+oU z+ERc~*q4eKRZ0Tuo^%WPKBwvY`6WP86mog{!x4{NKX77xff{QPMv2~WV*xHD^N$6p zE+W!y;ET?RDpYt4`=w+LX`!;I;KPN{?fTP4fB2a4)h_6n=f2?M{w+M*xm+Z4jjeDd zf;hbTn7+bn!9ib^T6lTkIP|p+LRvGmqqSH1iy-_wRF;fcE(^EL<#`RVf4h zHx%h5VhbZmvHs|q^um<rZ{=& zk`7NF^B-BBmfH!Fe`DY;f99gC6_4fQ)-5_2>6d8FmJ(;upEWxf)wkhU~*8)znth zjsgaevC6Dsvd-|=aDt={B9iU-)sG_U1B-U7Z`xf~TwU$-ipdt|l-!Rd%68^<5`>fL zZ*&@}DLHMh56oJ~`Ee`$_)b3M=d9XGkC*pp8c@kB>>mQ$MMl^4 zT?zdzUg&48xdJt7JBYUIEC;!^{YZM1OC2kru72vN3v2%p#~*iiZ3f-i{DcyG0kR>Q zdh?jMoMq{g!wnnDoX7&MmUWYDrwy6mn19f&^)wBsa@i>=`h-WtxAZ+%Aoz9LD|=;n-zIdP{>B`N?T9Vt>tuLXExL4e z`U@l>+m9sU%ZQWfS>5<_&Yn+cC^B+d`fbs)mk|v7w6cr%TYkyN&)0`02)%Y(4Z|AETt4DxI=JvzUj5r z{XOpw<_BwFGQ-I^dmpwzq3f&uOt$=BO2u}~5BZV!r0{hN+^mjIhEQd?srDSUwDvcT z%7#Ac9Tyg^VBhq!zs0#TZ41J_@^Y85eq^R@b#%zJDl9huq)-j=KGApuGp6HCvkcf| z^ngXpYP-Ws&$M;pL=~7i>s^#*)~Hs5 z*(IVPtTsGCWS?jcp>MAe7cCAO*I1f?t>+mMrGdTWuZ>#!SA0n#9+tdzPbbQ40 zSL1IA7ac{W%vfGXkC#SG9Y{ErL(a9HBZbgNqBNMM4zERJeeHyzj15VLD8}@qy@&F? zZT9_8wifnxm=NlA+(U6z;#&cCq*%cVZf8xal+Bu~OTVdavbR<1v_=tC(LGNa`-Y=C3cQEt7!Evh%%#gVGDbg1SPnONC!UW~0tr%GjizZ5* z`bVmSG1&~t3Oh7J&RWfT)-Fmxi}O<)LslLak>#LiG4-1ud5{&&tMQi!7!x3OK?8AD zTHETY{F}0*WZ|Y6w%XIWtko5aE1*vd3%-s$*zI^u10Hy)6ejN9JHH2_N~=U|K!(xle>2U*e7u!27 zkvH$mzXEc^Y%@r1={yxw26KutsZBp`?aLh$vN;QGJ_9}ka(5ekuPQiKp@Q;hs0e^V z`*&^c0ukBb^S7m)9MkK_%bHQp9oP_l3O@DSJo6XYfaE@GoFgo8b5tuQT6E9-o#9pD zgijZsV<0>Db<$2$q85sR%2bIUQh=zTq7J@2#pLI7MnZo_I78XDCMlt zw9>LN-;378z*5Bf(|zyGtnKY>Zf9AuS*RnSYw!(nq>=b3=4p(sJ>9@u(W0aO+pLIp zG66s4RH=)oiX*UPYPjnh8zF6(!+0dGzKb*{LXC?w*|Y0KbzsA{pTqU1FKAY0dY+Hi z9^bOK379n15>q&vR~6wcYe^Aj4KCy2%}z~88hJ~8$V&V@03FjL5px%{G2qY};*Glc zy?7~d{ioT8A)fV)q$7XwZYW-b-vGW;?P1VQQx(EDiCEsTybl^Dl3K(WB+;Co2P?W3Sd7&Kn4@tA?;{ zD)JpQ!yXeRHuKp=$Nz3z`&mrK3PBS2jW^cb=2U$@i))jo2*mqw`-kis;L7e zr!K_J-{i+V#(o*7ydRS+@?BnFtth+V6ViSy{)*&Dt3K+)@L(vW`XH>dx#pF{pVk^O za%|{wJ_O`c>!HuL{%IY$q4jg4-lYK+H-scfgLR1SaC=P0gsD=@O%vk%gBAfa@PCIO zaxYz{d$2G}NJwb#2JkG5*$&fhnH>1(jbKh8S~{DIgaIO{4P|mLn-Zj&w(xL&!7VgP zPAdFg`A_hwYk+MOw(d*Odc#fjW7CYW)K<`KG3c9GbxjUVcA17_4OQ}U-DDUjE8Zo~ zalYNBj9SOJ-YYs3S*$$^5cyR`=$+cVTuQNV4|5w z-~GWojoRD|P9(XFp$x`Nn_GVfO2kQWwdTyRSJ+!h)O&V`?|o${-;K<{Y=JbSd`-1n z`R=I)H`Y|lH{MlI;R1KamSOipU|}vKeayu?egdFBtvgEiW(lP)Q6`Qbna2fH6&WLf_=+6&)bo_!T*?Q; zt`p54^(3T5XA81GyA7NiLOtVHC5|$bC?Hi5V(cupz2oZ`9t4$oj3V;nmYl>2uDmEJ zibU{b-A!V*OtyS3q%q}>qHCr$5;iwHyRuk#RNq~|lA8IMvAM=1{m=S_z>dewob#5e z&{7W~=>1UCG{`TTJhAC|u2BllTN3Pj?97nTJTs!3QWJ;PBz0*xRTw)vhW%~MxXg$Q z!kIZMI*F_0BzwG5_no>(7(wHyjI80_N(dL~nq7AebRWtV-`E5mh7k2B;?j%zem2H< zKSZBjoWIs2=Y78r)@+n5|K=xO@~sfhDdct-lz%gQLUo=ZeoGRh-|>TBj_I( z7$5CXQy6RAv7TIFiQ1-rq(#{10rK)ki7Me33Vvj}Xdx76{WJJ^e0lQhWo1;IX+`Bk z(*Lv6|6BCG(RWWQj(y;HfY~Vz@HEv31ok<7nRDR>5cGgMl-YryEB9gVe85F7M^GXL z;Brd25y(0AYX^j*`vA^UbM|6u^Yd@;^Di3G8ij_CY%kKY7D=1^cfBQeAW*hXKnY+8Mb7x}EobiQBCQNh@&(`6}qcu5x^!2xy1>0eWoZ4yOZ zZkn~?O>cvjFrr9Q$6i=F^?CF)_X*TZQTQXn*!DiDPa@NlCYm<8lSlcUd2y_H2r@MI zTrwRiFm;Wm$nw%O_y+fRr0gg>xn zNV5w@#>p_PGe5J?)EkEoc-x=pAlu#pJC6Lasx|phC5;qFxttt4QRCEC2$ng>d|x2s zH_PrSoQlvl#M}l-bn;fo-?}UJT>lcl1yIx`e>`a*vIsFk9=gMvoXM)Mh*QGf-=3(Xuz1JR0Y)*#l^@qU zgJ2OHYu#)u>dc@$uky;k$RX4PwZQXR+={*SK4UoHF?4xuZ*~;5b?$SQ+r)QPKSLo0 zQD|TI2|*7Df0BaEML~w<^0IKOq9BeATd^dJb;|9f2u~DxN4~r@OuBuvhs6&kJ1+Mw z6HY*m0lfm+37EFb>xfIqLJc`*NhfM$cc{~)0cCVYpDsF=X~jgX7-h-#2+fLSs!StK z2`PRh^TggFmRSNKy63_A4(;CZ#|AIk+i-97pDqW|x0|L@>6%kxvr z^-D|6O50Xpv=6Y1gRf&|r00EBV~u^+Q%z9WJFg~PYC8cD5A3LqRITEUyJV{K{><2G zRK^7LTJ-_TtI5&nLPuaecY)wWy(FCubVvojIwOFjKT&T(UuEO<93+gZi~NEXlXuro)jbOC-SRc-FEsbblA=heYS3;ac})YQ*LUKw?L^7fuJcdr z$}Zu*+tX8FWz)eUkloJBtYR#&p03Y%oXrnGxh)TUp zFDxAT8<$0_g)#$ft;<1MzyDw=f2f*n#@#hV!f^*}Pk=$RkjtR|Rxd96ZW!(ov;{Q< zRxgcX(Yz-)rZb_O=l$u|oq04#1Nip~Nd>7J1Q($1JUsOUo4hqL0VMb@B=*-frkrdcq0KG@_pHnGrQ!fvE*X_#gf0at=WI&1zprEE?C>jjc2t;siS?wc zkK2BXrWuzvU5)8DtFy7B)LTm)ebSH{c^N!DH5iWZ##w$-U74Eflv9M)#2x$VhGuO$oZZ*tq??9Il4 z>XJjWP2+Peu*l|fA|Jn`0vzZKWt825`Zaqh;kiauLkl$13i@* zE%`Jjje(r+Bj7u5SIumJM5}oSBJ1m>m^W#%e+@NH3#OS}#Hfj0ekHR9m6VBn&Xy}5 zskV~fnq=5jp!mjeZE&`e$ABFiOT+Ozem_{$^ezQ~hEkO`x zw{h&#{6^`l)A9;J(5CM^Q)6=jG3J6wHJRJ{J`(8}CT#JuwO|!-WfKb}Sap)69DANx zeWPnud%D?@$KXw8I5I*^#hqo1>`j(cK5OGjD~iO?BBV{9&*GW<5ZJ8>;f?JGkwn;e zdNB9xTAr*W&DyUof6r6qf=_P7aJTX+Ffu01rFHFr|Mo+2ys#7m9?9uaai_^Zc->{C zZ74G6)-G0bwJnn5gDUzDCmD|=B^-l0`qkwN)62!Mz0~`v!<Fq=u3qX3 z$pTpb>du&9jr55KWgvWYBSY`qha9YUsuXfZjWWl^oqe9rV_QJ5w}VH~s1= z+s0FZN{B-87-qj#$&*UoJ^E;r4Hq$zj2qRqQW#|bW zYO?V&pPc{2{_4`NufRX_SPe(eHl@#iYv-E%-fD2i9r;|qm?L0|e<*Ea7}5#4Euz%w zcYO=3Xy6+XFB{t!D+sb^nQ^E5UmNver?dgQshva%i0w-ObeU-zK(1&=Vsp=fibffM zRIPdY18;87mORcAktivqtv%>F z!zgTmg{-SaGKx3*8&r%Zbd{d_r>3apKt;1UW|m#rqeUps0-c_6HTvv69TKIpw3@yw&UHL#Dqke=Aj3rP-Yd z=Gjo(QLH;z=V0dC(u4-S&;+gAhV17NRIeCNg9KceqZ8G2!1FEh1$n}OR zm>~Q7@mvc%fLJ{ONX)v(@6N&-BI5)R3Mrlt==eU2g2r;5Z(?c)uXP1jl1JC=qMM~A zZKp7M6WeOB8Tq-r$%-J&EWEoL32niQNIRqe7*v@NfqC@Mplb<#emoqj)EdxIyuYBeU) z*Myxcm@5&ZkU|*!gO;EDnFoxk$kN;x4S&N^d6!6nooNZI{>@Puk7|$!(!sw~vV&VL zq&+y z2nAu%$XAA~UIS-4?~~tFk#XV3U5?aBG>@mXV+y9aM2lP@#+v=CYs8CO(sWv--)gBN zT`K8%8U5$j2YoYSp`#=>zXd!B6k&!^Y!k1A@w7D12Sg&5abT&`7RrV1^SVjj0vKCL zDtgkE>^H|AIZ1pyMR}<=mdJ44EIg`8nb1^AVoZdovwDHTk@VXMCUw=fZdEvW5lMo% zqw2pasC{zA)tNS!pB0K#(mfYZWrhlw#z$XDr}TN0u*JDFN4MmYTzyL;0G@bHy0m-2 z&uOn1rxtmOn}lUx7C4&fW0<@&x!bb)JnP7m5_j z+i%XYV_ts#s~CJ5@tLm%@Yl889)^pHjoG{&4_7RClXthfsZcg%JDbu0;+qxuzuKK| z091;(RqC>}fU51xRWBEB+~C$JWb^?1xhJrZz#7XOIOP@9NXJ?zsY`3tflJ4gjkLz@ zZB^u;Y>xG&A=R8XT3gc?CZUA_X?Wr}jp_ z^CE;F_?lf)p@HNF*#frdx0<6LW_LRNIyan`06D>nLod1?ZnT^&r|N1D zet1kPH17Loa+ISTr|MPb7mq=ltv!)&ij`whv)^;~<3f4J8K-?heZ4ZhfSdT%cn^pR zsoZ>+DwpL)+jDlDxR=Q9-6t=HKC!2zfe^Phkmm{LF#6&Xc z#bjIS(of_@h|AzJAXXb;;q@}pCScb0$W4x!?%ZipbeVpJ!Nlaq6ff8`ZSN#pD*iM@It9A0XWbZP3{i&$^vxpeRRJum#TktHDp<=$fjaYDa8>~r zD8LZ%!HTE<%l6Rg$xFk{?c2wg_EoMmddD6}N4R%ihWK}B&qf{bI$l{Cnr??wb>+gu z#0+Gbg@-K}ok<@X>{VF6k1rJ2ri2;Y_7=&wdr_Zalpir{OJ;np)RZepNj{p?-f{V? zsY;KNT%Ojr`M50kFo6=Z_Z#U@rzpUxaUxjpw#p}!zC$`evQDw$9bQ(1I-BmRP`XT( z`Y?{%5w1E*B07^&O--WNWf?ED2u?}|Q;FAp?tI#Bld7IkzkyaOml)EdvEgN+6}`pB z*Y2WuoMMIREp4?d9hO+|2&7FrfB~fkS{*i)G2=ws=Py;`Nh>iGtLO@i3d@O!`JY(m zOCwlj&)%5ws}97rYSS2LMmW2#DyO}QeXc-ZYU9PMXj$TBVMhKxEr29&IkSXUYGE2D zj_1l@z&Z2+Z+>oGB#6{WS_p(_RTSY@@wBOi@IGvHpsR%0TUkl6^VgK4ZF8+yrC%`+ z9>I)5N@>cgGILZ*UP*pcl#rc!Lzf*MHunx-O81xE1a%Usjfan*`u4zulR6?v(H16Z`lZ~ZY4C3!w`oHAuVS+2Je$ueJN9hvm`~qf0S^kVKwz+=H(na zna9`Om?m=wvUY=D%`az3KfYM5`uMVSUo+Nn>~((r z5?o?u8a;W0qAZgY=ky0pl4K8}Ynf*i2{mRWtPClm8CTNju@Of6T=qJIKdi>yZn&C$ zE@Zsj^zMWMnG9t|CpoQPkM4u^D2P$>N^$@ztyTca$lLwlPTbyc)0!igY0B7>S4xUA zDwO&r&nHPOc!wJ`nE`A@agJtSwlC-aj@&*6Movvm99;#-C&dSJe1J?|MF-`amh#_m zcGGkZk03mIPjaKB+^SJZIL}P4T5Fefs>~#5-{Q3EBJtoxSAV}N^<$;m zF>z?$6%Z>F$KP=TdK9pHVg`f_1b@8UrR%(V0~Bg6#Ev4>j>3a|Fp`t;)=qrIu15h$ z@ZqRRtPF>WirVoqc5wgY0}#q87Dr+KfUM5D-7bl}eAzM*9pn^tzxk2FdD6J!`1#1D zx7n5A8_ObAj@rY!gT8Zm}PMLB^}bJrpV$NK-O40$?3@rYJ`Tt$wr;dTVnVKvDj+6C8iuP zjZFz%^0H(h16tyjFFdHe8uuTrwKpf38S|+gW*iis$di1-`FMQ$4A9h0gO99`KZdzz zl*@ikz3&3xZdAgQki!qs*{Ppg z!g{VW%iTGFM+n~W8e$BmUPqLVl_-4JJ1q04NscnZ-f@f-2$WhJhIw;YvnbAHHWvwp z32l5eq1X|uzJZPDpUzEsmKNAKMoc__?T%Eh=3ZI4gwr?8y4F~d*MeBtYaPiA4LH>H zC|3JvxPb=%COUK(u~lL4Je$j!PvhEv#wGEo24tOk2|)ybJ)A&co@p}UYFCK0Z3*Y~ zYpCg@nPVIfX!8#3M>du=!MNer2X+SVYdn=_1|o&a4)&GG*@SWs{#P#pXVctrjmM9d z|8OO@zL9<-AySxCkN{MaG`QFWv>4Ca9Eg^?hqUb^|8#d1@chmXuk!>pxzSt}#jmFx zp94%wN9~e`(5ac3YdpS=Yf_XgBDVC2=nQ(ozxwce65fYT;YY|l9sg?`AdoJ=@mrEh ziOQsS-*csg=QZo$;L+=XPyJoD%wnUlwM;n4(sQXV9#8x_cEIJ`D%GyxBKu}nJt%PN z61FO_rk!Y9`LpX6T}VQ>F;~35v;_~zhd1+R>@SmBWnT%H6azkjtxIbQYM5kboe!FO zPdxU^Z7&L1!rm{#iXAZ|URv6u)%b%yEW`>|0Zoe@js-PA<}5E-Y^g?Pi*c!Bavg?j ztVf^@Jts+N0y}kx$m>wLTLFE6KlO5q<1w52k~uv9<$yt8+&xR!_N?sBM%B1xoMDS{ zZ$W+fZ_>b$I96_$r}oh2qM@*yjQZD9*ix&wfOMvUKQqkPQj1fvNFu~3Rav1_KcQlP zSAT-(=hWxvG&K8-Qc7(?GE=O@R&gs%o%d6+o780)pK~I7> zj`FRRDzYB)v%t7iJF^Bb-V9S3OM)vIx4EKOo=ZyLnnMQ_Ym_A_mPx*)i~o=grLQrM z4877}OQU4~9uO|6x>_1B1$x4Wp1x2E@acdNWAV=t3DGly-+KO#qxG2KDx#rU3k6_h zlfUmnJJ?FV67^qwhN90IHWl!6cv1+1NbHg`bI2Ai2$)}8XyP`zdR8SCj6Ju z8hky;-{3j*yNS;QwmuQC&hkL%8jKXa{1YxF=@CRx1*Abj0?*T%Z)nWpqkMSP^ zv`r*`+p9-i|q%o?3c#dVWvib7Tkf zx*RKKu0G`dSoMXYIPW8lhf{0Q`}#DGGv3a2^Q`~lOI6c;479s_h`kj^qKj(}y18NliOU$g%k-B%_u(zdgF&%loM13T;k7}hCX zoE0myJ@a+E(pscY8v1>BXC?dSWWZK5%`-2UW+egK;&aF$)I8ll4brxdv@6c?ir!YM~PO?zkln6VMmE`Db<5)bf zL#KLR6ge;SY=`JQ$FsOL#(RtWBE#Fa@OT2b4I_W??>aRwrY3W6fP-WFSRLrXH?`8B)K4&p5929-JWYA?tTYUUGY+TlMT2L;WnRS*;cuQ@;aV+M4XCKarBO z9jo5qi}tk*k0p>M8&is+PGtr4gzVGK#pt5aH#pfbD$-007?;x6RaJCFX6@vJPa>Dq zjbJU>)OzI!=}}2}L%8^&m&WW*w?%|-OLo)&4540*%jb(}_l5-|Oz)UTteTIMwh4=P zuSzAgUQ5OuV+p4pVf6}ri#Eed2Q~j#0&jk;p-4!a6SLwb#8cfkHSZ!-DGz%`<2x_l z;DEs&NUdZKo3^oK;`pldE{pxIy3P{~N|$GIRHG5(rVOwdGSJH<5EtLug8ffzg?42D zQ@gb-&$~Fqf42Y~L=iJ4vm$2pll4?CnB?>DE&6u?xb^fQpqfGX9-#j&G;~c6@D7>q z!Xat8!xKK zL`N&ld5&Dz^JVQWUOdCVsA%e_ft`~8F=h<6mvZ7Z=2X4p-g5(q-EuIXPjzZxyE~s? zd3(17#BDNAP_ENZ-V@!N?=z$tuGwOX^m}*Q&0`|RhQdh`;j7DL4`+)49+!+d1{+Ji z$^fehpVi3rxJ_Jp8lR=oYbt&TK{>Jo4{|yG3PU&o<7&BuPrme3b%B-_Reom{roYdXYG7!w(Ok% z(L&41W;LmGIk+S%g#lHkw$=W?9ivCZL6ahj!Uh1@dBEiTHXdC~y#4zl#oqa?ifO{5 zcke|c-gEtJm>(~Y8z8@-1N0Kxc*G=7`V1>9vwkJITIcfF)S;Qd*&Nsq1o4GtsHYE# z5F}?X9MI!kqaz|(o3wGqh!g>6A%7ESHK0Bk9O<~GOH#W}Y55z(CDgV@t()wdq8PiT zrS#%2Ot&J7FJI0bma{e{(?v7;@)#h~kowi<7-&AydhjFqDb>_4*(aBh3pGFH0bMro zeCmQO>)IhTI^%8Sbb#V`O?967B<|cblf2{2@{f&|fl{W;+`b=2iPEmTzF+wQ4Y!ks zGMyP6KK8qJ)xs06XKglC5(xsR>ehp`I+uMCG@FFOU>c4@XW?a*O=1;m>$()+?}8wo zZ@t~|g_S6^Ht^W-Q9If7wn-`MBW01Qbzqxe2Q(L%(}mST%XM;2nl!18nl?9+H%{}v z9#E{Jtmfph42QUH!#BZ}yJe~XKXo!hkKKw$jP2>lKFPVY*&DhxZuYz%7;h2!oGuM~ zK&YmXUKyn@Ki9!Ow_ElA8-b8mvp?ht=DPR$BRRzBH-D=L=ceqATjsRS^dUeh{9_(J z47)ZKO}X-A%3_7faGa=>GTO5Epb|t<=$q&&%?sf)_%;nb(u4~y7!}DoyJfgd=szXH z0-3tB%m+)D0Z@c!Ml3|jWl1BGwbWx=qXI+SkgX^M>hHudK|(Pg<=~QfsGUy2926ey z2eVm8UP@EHp@4nPW+L@jFoYDe$HSfhK%9dM!Da#&+jW{FNu=XTuuzu;bGWD7 zo{}DvKGi`*I0yNtM8CvPSDxI2iU(I#V}~_!7dHiZO@&)v%pgEK*@3nOD$*s5kl+xj z4buYC;AFmTNH@Ik(5Xxs64($C+` zXn9)|yP0ruU#}ht99@b&W9Xu_ZB)6tqOtGN%0&E1z?QJ5MvrR(YgQN=8C*y?h*d3D zq>|j{%Qt9B#VF+S95OP)lq3Img{&PBL^*u@Ao8iK#^ES)gsYJ)tm-i%CK&|-Ix}yH z>hyXa6Tf_kM@U&0zE!BUYF?I3}w7 zECM1};|cJ?c#?Cw)e7E3Y3$hbdOq+d@*6kSXed!CPA0QhZI*GV^her{F-pPvAR%04 zP(b9n8Rf{o4#aJ$&imE#c(sl$LAkO;XVz62cntC}P}Rs6PyVygT`j#7|M|~`C-x9J z!o|xQs^$=AaFi$)q)L^ys+D(51AGw~WUpLi;Y1*S$66M`iE+dinD7H1YErD&6b z(7mZ#Q?a>-oiibL9ECWYziJtu=WhG>LEBbo(B_g2bPTbf&e-!uJw~td+Q#K(r<3%- z)N`mR67K(yBm953ZRu&uyu=>Zb`O~S;Boz05VK|dn^B94jrU2f?2a&5oSDKRXiPSc z|IY`tG+DXTw%yo==&AcNVV|pqBUzEZ+pP^EM0qxAb4s{mShpIKb&+ViFxl&AE!w0_sj%wLI}@BRK)Euj ztw65mx%TTJ-*AwG)cZ^KuhWLwl`g%u)WhkBx@~nf9fiF9>Y3%958pFq)yO$%%ypjL z&Dt9SCf#foc*|zp(f93QBMdc@s-{2nU!?x1w(#m0QQ9Q=D&4TH)plF~X~f7wSUOHM zIAYeN+=yFo)~U?YRG@KgQcoOh(Ga?DK39YFr0JfsZ`qS{vdKn(r>_axmyeEFg0;^i?5^Z$NIhpV{eKF*7UPRJFirOsx;qUl-fKta2r+|gr1oQZi7-VoxWJQ zY{fVc*3AH|r?P6Vx+7*+P@=R*55N^m)4Ul7WSVnfc%1#CkQyLC3-bFtYKFHasdNcX zXjcF^4jYb2h+8UY{+D;3xS8t{2JNSjIqo~e8Gzuzj`dSEv!;8w)gTw1uq@g$nYZzf z_b|_tCHW8CXmIGo9e|-qTJL3k$tO*llEG7#a$GNsq892;v7&yphcz)^QWOE@^*XW0 z)vTz5tg{ew6-j7T0km+erV%UW8X;9Jj-8M?N+qlbh~Zc__>GSX{}Lkil@=WLLAFmX zd^8cqLAHBya*f2Yb!F{@;Oz-r$OLmi;v<*N@ZJ)U5)XnxQ=Df}&xv(HM-%c4b!~QL zR)Idai~RTtddJbbj?(<)B5c;>gt?gB?(s2eV{;CgBb->L2|I31{GLVpkI=ytO^O2J zvRwA$h;RuHPCkM$RlF)JV>BK|Op?mM>E8meI(rzeBXekmDJRvZBYn`0b+XX_`goar zym1Qs$(diWW<`_~jy{uagj4)7!cE&PSfN z#kqWezLg8KOKuuw>@<&p$k3{0)24v;%P`58R_z*1j25EU7v<|!wBWuB;qMXZ70HJE zD{(iko(GPz9Rx(2w=A6b30aQD z|J!^UiBAd_1%DXqc{LcAk&0a>#*>yi0&?kxElg6fng7$eZI5w-PnwhI85m|d?oM+v z{aXm);WJRjsj-C-V0;yjWTWOUUZ#a?cD42JI9AT${PTf)-Aw>?nWS_TEPg6s>VGD) zOOg8#{_PRr{Ul}?B5W`1E>0tNI`!l7pErsneRbiT?c0HDl#4?p>2q0aD+&4v+CUnhiLo=Pku8?tdd}-VR)nOug?`u3vrQ)9mWMjRKaqjpF z6{%xc*uWE}jLYMf+>s}#U938Dl)OLx`fIOR?O{t?e^tRW}1tP?pox~D)PVzdYzB=!tqwtgNgZDB1d)vIWp zIH(zEQR=jm1~0X&CNrVpB(SE-=oWvIZ>T-1J^=KA6G>lo@Drr@>y0g)ZoYpOs9CQ{ zStkKHX$xw}ATirE-8b`$vGiX?WW>zur7j2Qp3_0*rBDM5or@kKxfD1ko@wC#QLMLZbjI%!~j2gK*kE?8))$J_?b zI!R&bbe#CbE!u@tLQHy&0s-s}SU3Ufg9A@Sr6cO3Lw1ZQV1OnP@=5Cb_n%)Do%6Gv z!z4bqtzbt9JfUFD;HuR6!zVkR>5P>Z?baWj07>E)7$>*O@|F7a4Z%XNdNpmAZlgh! z#YD_E^hL4407x&-pDZ4=b6_+J|6svfSr9Dxq{L=EqR5~H(d!f%U?QczxxqsVs!{*^ zDJ!5xQvLLu6|&aqz4}PTKVBa{-c|#($CsY?TP0uqYb2nSyDEz3Ppka|R}kd*Dy2W= zDx>SxBP~lE1W@ZsZa;q-RGraZB`HgJXp~RI{&-mkIO)+<04-l!y4_M*j+EG-2j;K6 zcWJdtXg&!_=)MMz2STg)Dr&X=ZIV$Gm@|R(%Ul){m2P&z zWJulsXh)5PT6PcnM~~hEB3&XR2zGS9AGGN}R*3OS(#ei56R;V&jK&&y5%1~aB3kai z>&x4Ar0f$he!1fLfgi^)LLo>C9YLc}^(uQzM5U$A*(Uf>S2){)qqqSI7*IgcH|!#* z`w>Y^llBEL%cj6HhXym+vx-7@#58it2d#O_6i}~E+}_{#?7Z}LTl*#DEVeCoZBizr ztCy!mk=KgQYgZp8{l#izIf`-Ml-4{ydl2TnuU%$DF}to`c9c2sN~^l6(a<2AcmJie zQ}}9AcMPiBR=BZ#!Ih)2o_w-ZPZ%{-_03s`Ykt>gKK$BHRD_%cAOBS^ZPLrPufhX{ z_mprWu9(WuFG=2ax_&;^jQrz+7C-lsq2)-}7)=EY`$~fa6hMV5Q=v7eb9gz&mU86P z^K&7LzFT1Jg+oaVRf-1EZSV&IB*ga`U^yK$DK&tC=c%ZG26NX>p|S#m12DwwCEkQ5OwiggjJ_p(z*S6>kPuiGg00! zg)JG}X5a8uxSkarmn=XGw-v!tk&WEVIFhCiKGyK)8}NzFUR7|4mrE3_$5W_d8{ku6 zOOciQ!5ljs#%fV*^OV+gidaGve#4MQRA+!E{WmGb;cB!c6nNAA#oBuI2>dGN&X;SE--4Yqh1n%iKFk|xfP;adx# zX{95fd0k4#%O~1y|I-2_^gzz3Z;#JCQ_=Wy2JJ2b8D<&W{T~G&F%sqxOD~D~>Lq*w z#V-q@HfbvV;-Ka|sbhR~mHr$cr@!GLWDWyFrn>9N>SwIhJf(E=QTeZ^eZ>0eKTmtp z7=t@qlMT@OK!*y1n&sc(V{ks!jFEI~$7SPMvJuW`E!ZdM4}4rsCeCjFsmLhAzfcDv z$;HpTgHzVm=_vdzk-i8=iY2YQTkc09BbK&h!zSK&68JK-3M+Cz@``+k7ENH=#xK|9 zn~np2ec{HzxjC}MGn2*0gYN6=zMhfKq}#EsKBAr1jt}2}S!1Z@&`#pOo#fy?AV#M7 z=ubCxU8DBOo@+2EJZ`a%LHuYS&8Zp%=|${dnE7PS&y(M8UbJNik7V1JyMNYOyl^mm zxL&@4EpEYFot;lA^%kSei5R0ihVrOps+|(&FLE6x zzLh;Y2@k%^yV^gva`_i!@g0a=Nu&w)?ItxF!G1WzCNKBrcDz!|IMYy z>)41fc(2yfZE^Kj6uW9{X^`+C$!|S0P{QW?>!avmMS)ncN(!rL$xn{^yeeP22;kl#wg6;BGnxVx7a*P}Q9j2WU2wrL6%ddlU zRa1Xlry}wnz&KU}Jyc<*$9O2KXyV-tQ9IF}^c=R^eEyFm!Ms0JYjc>~uOdO{EP@-l zyeT11PJQnqF(*|yM#~$gMLN58w%^1mM&~F^lp7-*>b(l(Ez1bZYg!SeA)PL}jfZU- zjaghj$%IQ!KxrmJ&sB0GvN4CQ)>-vB>j!pnN{A+PhzH)Q*np0QUQCh3eTL+cf| z%ElbeGmH=v<;lY@P|zT7v=!fvv|6t=c}wr5ykDYYx+4_Za-&vuZ!XV=-^9+py~)DV zJzyQ3#=L{QKixFUbtxiT4(Q$lFH!|F4{e0zBno*t3bw?WrbOCnvFUrC;Ag zT;8Al+&~Ooh@A6re72;j6qk1yB|6&l@!kCEHex2+Dg&nKUa1r0>oBBXBGmmFNOa*j zJ+hNSH#y?$xwfF=r{eic%jwMNbof1z+%m%8H@g)h1zXIi_=2rDFMoY0RlUHR__CjK z?qcL5OUEQ?b5LuFvyrNY344lN;Ok>uzrdc~yOLq4W6{R(k(n5*`X^D+ zwN5J~yyyzCv$`~roVHO+<0*sLiN*7~4Q)xbHyPxLj=okjziyi%vNaF0-cHD-H9o5d zNZM2Kr{#U#o+4{M!x&KQKV2++QPoke*e(G!f&R_Cqp4y3l z8fyb>+MRWJKc?8Z6M12Z?EsQY`WXw7;KP}TbCYjrCzm+SSje$uzI{BrXJe%Pven>L z{s@$8Qzd6Z7yYM6zUmiw8`56|SXAaN&HAmLugd;n-p?J#Sng>XrRbipt`koG_@QLa zs}}is{JI!-Aji14dA`umDCI@}V(wl(NAY(fzQ9GAB1Yg=Dr%<&s;x9;-!qQCehnYU>CUrnsmzjTnnr7Mjv2;-|?0gsI-k?x$@#OL7#*&XDU zJk=l4xJ7ugVm+L^=zx<{0Ngk)`dFyN}EM_BNS3lPMlU-;Zw+*0l@|fn^9@k4me%ChJM_`v7>$l5LJ+Y~ z?ZezvVTyXz=jA)U$Zk61WHHXespP-AuH1;3ZpBZZ{5|r`gtF({u>*UH{ZxyD5nSrc zvo}h_eC)f=HVX;n4%ko02BB|DR%Ln|u+>i8$p~dqe_;mfwNMl?FKf5_A~_?+HzAG_ zPLoisauRPHS~;SQb;zn_waj`eI!51+B-3PKJk^avy$~-v4$wU?w78q&Q937*BPlg`8K_Es$hIckQ91lP}17ihPGU0#o zboTcTNjr}ufFaZ?N_>;ClPfk>ne^fh9cF8CL2Eg;$=(m~TbX^6lYGI4FS~;uf{Qlq z{W~wH?nlLMUj^Oq2R)b3xV-4RG6F(f%@(|FjOsS=fVU+Ux!7>0&*Dgd{i`5U^F2-Q zy=`#NnC0E>!?7vA%k6JH00K3$XCEyClYxlDyhShZ=E8rkE6Wr9o!3D{*H_Wv!OwiBI>LQ_o^~ z%~65q1RtBQP`LcOW?w7lytbp@mzf5>LW!r>Z0u9-CyUiFyJXFxr|cWpoAx?FWF5Al z{~uLv9oNPmbd5rxK#RLO1&Tv)EiJBvQrz9$wZ%P1aY^yw?hvfFLm@zLcb7nrn?BF` zyYIb!WRp*l-DCqh-#K&6nR${#m>!h<*iz)ml2+(n%QK^zjtD7p&;MoH!N!VLb&@z{ z`x6Ms(nXc*Zq(=LCm`P&g|AaAT6S{La)CmMCPJer)%Hp3mNJK-J4N{D?uUr{eEMnR zDNcX)yk9P2*QS89L{QCv*FzlU*2h>+_|^FLwm7kN|32L7-3SK7nVb5P{EobtK{b$k z4!A#A!avM`@yL(%YV~)AyWcv*xoam4vr4pac;=*!PkGmUgqT&|@A8Aa(c=udF!rqb z+1-n~yUf5I)x-9AC+o4(D)czi%6w*NB|2yzfTuD@C&h)$YO_V4J;<=aqa(2zlzWLN z5!*G{(cQYHAOsTVeMV<(O}u=zM4~U4w!fL?eGTz+(NELhkZ)e@O; z{;OC6`Iq5I0&B6&PrZFN`9hGQ>b2VAdW2A=E-HITfgD|>0(oabA*6YznD>DaT?F0+ldy{!)5A;#|0{Y2K?4d4@zHAgDuh^JAG-|{K*hFSI|=lXAgJ2Fh8cT*lBgC0N;VSrk$U!SfG zT+uU_BZW^{6><0P9AY)-mioL=Uoto>HEy#IUv(NC$@r}v>TaVP@o|9f=!5vZbj{J5 zYvREdC8=*G%vwC3bkmmeUDjh`VPE!z=-mViyb6KN*e#g^*E&4={IDMqsL!N8r%mTn zqnC^3u63btULA?Mu9s^4PS+GTJX-TBRnGW-uV;7;nwA1@*nU6hzb|$cSUTQPWth6K zXVasoliCXJDISqhQmq~*oJvXqDjtP@R) za!{EyGk6c#Xu;8NfwJcdAdP9G!bt<92E4drU~`U~7h8CdtT+;U@F26)6lg%;7B0r& z6D@s_zxiC5^PZB#jx3P>m}!iSs#>D-;*V8GFO@l@xwRLq5irlI3?AozP!CU9{6$h*cv97? zvsMwrm>2tb`%Lnta|g8!=%Adl>zkjfXY@g(kETQ9HVpe#1Bb?Oq!4K z%n?mdt?O(Aq^ogb?JTS=4W@*4^UunBdDrAcKIA40I!NMkZ>rM3UQetad~5G?lFU+! z+lECaCAZ-c>s+wdXPbfhia1#0CoDkZ)7uD=ZJb(2m8ZO0PwiQJb2DiCOBs0}m zx!Rd&g?T}DCfG~nxb?kHAaAwcCsLr58u~3TgMDcs6ZfN9f8Qt`8`j8IhYeX|X5uq9k z`seKMUJ#*=LriNym@&I=-wmH;{WR$Xp-VotmlxTzA)&cTi>mL$53yfM;xY<-b~=d? zpO?L$k6{ZEvo|S9@8Dgbvq4)}j$Kd4#GHn{rON+{{r{o!N-zTlhXve zJL<=>Ut|9GprFZj$kw@+B z%g+uH-;3e)U}i@7xi20_B&!?k?sRDLq1t9Ny_9SF_v1gA8dpFqvIp9@gRZ|Fd0RXk zW9+%RyO%7_E!@9r6461v8AyL5F$Qie3QOi(h=i4sdmx7*w3D%d`N`FCE}H6C0Dn0t zfhGPnfL>R}KjAe&;9I%|52!zE^K_^sY)3!z2PTj;M1(p`h2XtW1wsKFdW_k71W1tC zS#b^G@KG$*gCu5xNHk)%e)TocmT9RM;S!wh-sj*#Hn*yPD`d6o4L<4+9K@3?*~ndH z8t?qb!borc$P@0GaYcc-nY37`U?9cN;_0glWqXgSoj!n?6Gqq*>_53QGx4ko|qo94_N*#U)-$NFV;o|ZzkdLRb~xQuprW zi^j-1e2KRvFq{I)RMKC)ThA4ayv!IAX8SKVv{Y2>=d!P+TS*{h7XdsrK-DFQkH@*z z9)Frz)`}N9+)ZgS!4It`iBA;bK)q4GamIN7Vc!KMbWrHOo1Rz*|JQ?zwu zFHw)b;OxTb%@O5(heY7!&^fV`fl$4&Y*Xvq@;zU!1rxvA?t>LWX(jkQJIR6wW!?L@ zxny+vY>4H?_NyI5zx~YM(>L}(jTqqy*ns;mj8Bu&3M|l8cs9Vp z5);N-S{O|e(}Qgw%qWtwTQgZ1ko_bsChEzejQqJs&9PR??y~}ISmauR_E^cZKF%Q{ z{1E#ak}^eYYJ*5b*u)EuOB~UO2-Fnd0;UHx_Puk=l;gUdi8-a51p}++APKi!?gZS;Xj$A_I0Z*YCZSx$ca7oBdI)P zirsC0JXxk)24-#N+1D7@1ElH0z;!4s#!)KZKNCYVs4o=t4#aqPixx;aIL_w<2#YF> zVTscWfCg2rbMpt$_kg(d`9Idr4mPb=$8E}4m&_Dt3?+>29~)Njcs1ZuXcZv6c5vso zc!uzo4~E>~PhP!;Lq#@DD4V$YuSfqBcbNir``oygc3uP2%Qqt;JuuCEy>=TEw=`+F zk%WYr90V6OCi83sVjVo4j?SU0y(aiqdhQ@ruX8kcX1RsuiQcbDYN!H z56&CB-`B`85N?6CN;Mdg8?k?uEZ7i9NFcF`Ji_*8MW1eS(qG23A7x_J(sMu0=Lg?oAsOmGJ?cNSunhXYpxr&;2))mSbl?7_7Tg2?PizCN2g(4!^`> zKkrswg z7noJz3_JBc4}6{<#&3AX>?AP6VR>!Ss&Y&;Xr)Aumrvke%d>tzw!5lKpF;TV z$C0piZVX#FuU9TA_h(0+ALjhZ0bT%4kE`O76o!n3#J;-@B>pi<@xG;uhz0Q%oe^S? zT)Qjb+MSC5toUJKoU`74*CeU+HG{O&q&0&&OZ>@ZyLi|f+mX?VjN&`FLXD=}6=}tH zRj`gu>UFP_&{&5hwZ%J8e?XR_-;Sb@G0ZM4T~BY|CVj!G%Z!f3*pq!b)c+UIut1fL z5ZS7-YJAx?HxOLdG;Mq`#?z@u4RN31Ap;!&7U;|I#uY?9QuF)%j-r7ur_7a}HJo>b zJYN`4Q^Vht|Il>6B|!qd^Ea0+2ERQ%G}|RTs}!dXH0u|JDuF%E9RQvXbB@yK zMZ07@F6YC5rIxX@I^O0i64IQiEn^r}G$&0I9f;5$ORnwH6HO zJlR2Y3*8i~%si7tjwUwatqnhMb#+M+WP;8rW#J5xc`$*}tO+PR4`e9&&7484aBe@} z0?%EHSnqs#<_(-u(K?s^&0{brtvqxMA*y4bEBQviI`mVSIO!TPf8&s@I&GIVl!PWe z-I3%Yrpv@#DPw`ap8UP)gYa4rM%YoA z?I52`zq)QGdP6U{)(}z;)KDYLI9*q|VJFu^R;I4vM13>(b;qOn>h7)DM@6PzZckl) z(9{@iU@?S$8t-i|!_1k^!uK5?26bEBwJH8;yRCN&Njh<>juD}WA90Wis}z03!z|hx zyq3nOvtm}Y(A{j1X`$S)nd&wfL``T_>swhpr1l~zyj83ye%jZP8t?Glz)Ph7_J_zf z87lP=hH|D$SSL;LE*nLHWQD zj7>QzqsSEQ1}@wnYYl7&nh9e7olKW|X2k5GmoduPiFGAJ-G1M>*Y-xtU%8m#eO>O9 zJeBf0&>uL)XaWf_IYK7Bu%YN%J})U!zYADyk(uA52WQSKtqb#xzTGUw}J9lCisDjvwEay2o#B zl93j0*`QGj%HT*b=pgzF$G!EN6j#}~WX$nBOLe&Iped(s*x2qni#E)Xa3$WU7FY1t z(ow2cY+m`bW~cfzBR4x+KmyU~${l-TK}e#L7Mz`8N+z&GRsBqD72|STCLg%?OUEXe zqtG!@84JSC>cBq{6n|3>+$aS+F=e)&B#N7S_hz^J?Z8JDYWv$p?$Dd)e7?S2fNu@@ z)G6@kGTfv0fp(Km!>Wte1URTxJBu?_;J~zHwRJm)+cG-^azQ?YE*IRZ^avVNi;Az= z93J1vOy_W8)Y-M8)^x)3ly9r%;O!wI=IRTClc#z%0$D4NGZqi}3x?ig?3i6uP_~AI z-D4=In^aFra#}2`mTj^2b!8S^`fm5#Sa~7+cqRqQkqE3yb zfi26N<%iZu!JAFFCM#VvIm;U~?Ec^Jwh+FVOVItQxaxU9c-7#(lSFS`f zaXfvDvOxFC;T!8k^AEzEmgi=q(uqU1Z(=|3_)-DSz#*rUHb?gY17ERg`t-EQ&7RNkY1Ip_Tt1hIPNlJydf(4moh`&D6-&ld7ai1e#0d&*BaPS>;mP zc)dyM!a|xM+l?)&ZzD%A2F#Q7r#^!Sa~br&7Tj^I*jrCc#n=V>DnCs{DLJ3d-((L< z>U=|kv8R^@{2#jY{b%2?kKp6Z|KAMje;>W}m3|$B9yZ()*TpfiXOt}>XmkuR!g@FY z30OWHz1Nw$*9}N3EKZmwU`Z=yTjf{1-z2J(A>_-5I;3iU!AYXaXC%ZsplIVBoCbq( z@Yn7OD*Q+Fgl^9P&c{8?QrdH0KxZ2;s?@~-h)rUak;TDjS6Crq2phpSS%M;$+2WDA z0Nru2e1<%7xBUT%V6Kmvw~&REd1WiKYd?o3(4&0C1Cg$9#7{Z8_jD1bx|z`#1|pQd ze7%6xYQjW)-2>;N3ZD>B(l>w1Po})5%mN%n$UzVagrgO(5^Hu83CC0-IA6doA|vjn zo|#A$AM_u}tqugpLfW10TCR)iBx$DZ=tTr3&!iA{mNeavxiJGn;|xTF1$e5N<#_qm zOcI2{X{gHaX=5hY0M}n3wz1GZhl>nu^2o?-H>-%TR}4yykyqoKnuoKgHk>q*w@^TUFknB4?-^o1LNRxS<`He^`j0cI-OERjoOGBbM!{xUjSnsu1;N=g~rQv zE}I9`hu0;T29*piZ-~Mv&iIv}NVp!r+Aw9$PHpOZs*{!GjrVsNuB3OwgCc{|J$b+_ zS;p|N|Fi(&*rT+sd@1w-Sgm)KEX9OHT>jL~k&m~apPj|u;pcY|8c5DX?4NlX3m?~e zH+;NreOq;6K+GhLDM57#nG;cLwzu++2lpvNOnx(ndL+s%zya%PPe?QGo*!4|vY43j zHcg};vAK=*F4@*!C}mid1AuDjACh=8#pWk|!r2$HN-D)sq2o&a6HDOA6aSNIR_=a% zpb4r4Z5Z$;t}oWk3S7+fW37SNVwTrS7ctYDHpUV*Rrl`@dSd?63T~vjDg423cdP0a zKl=#8fr`O(}mHvkYCgAg6`10iY-u9SQ<~8{b=eo#Gniu&kj>EBcD=F3i{t zbNJb>fm7%zYMUeOARs6aBl9-zX#JX!!k?@vE=j%ifxnP2b^fg&EC3m?Fni!ug}!(4 z0R%XLEd-F~Sqxk@$f* z>9P~5aZO-7O;@e33mX^w(6G-M9;2TUkaw~6F6jHG0`7ac!Cc878l zujk3HrGPn>-$P^w7NAR559*e@>m)D7Z%2#K9sIPNYEJW1xeR{hhR}S3Gr`Aq!{qXh zD~6%RD8Y4msNx?CTuCV#_i9}$(m@#CJe95AIgL@ z;-h<0is%kLsNnmE4?i^8o(oZZ{-(ObdXvK#C}U#P9L0)iNM_C`77t3x>oIih< zuzm{o(EBxw2*Wiz{>w?h5MI@h@_-8fwaDuKUvaa1W!bYvtPI!Ajizy~sb>+p1y(bx zAvVXR`4){k6=z7PZSI$!Zh17XVRoPRgv?fp|4Cs2T3sC%Xs@8;nwfarB3f%MZKu^! zv|3pd0$28O|C}DrF0>7u-cRQJUi!;@V@@`BJk{b!wB~kBfnFjaHhS&bcDr4Y?>c}M zs9*QIU9#WcSlOjnKhWp~P;0;BzK}6&ZU_+=jojj%dyN!6%-wE>~NVO|d2uq3g=I#^U)5 zjh9Cz>YW+0AUTVxR_o;(CW-!{!Cd(42sn_Md;XH~*=y@wT%A$Uk^3VdXO4E{>k8RP zRd|ZmN?xHAP~y}5Vj@&g@9&prSKDs4)Rm+8)*5tBpI1c@dfC)qy^q8lKv>4D(NjqtYLLEjDY5i^_JH zO}kRajaY{_D3<%o1c!dXex>;7 zQ@-8ew10s7FGw@D9wUfh$|eggjmvY4N4EMbqAdMuOUOC{IdCwSqWkr-E%vt*`Mo6G zG6!MrAJhy$EUJ0vQ=aMf@c5D1WB+Q04H2qnmI6DLagemuWi7!E%Mxt)4A5B|3Y(cL zi-CgOJp$oM6LaNGt$kXRO-SD6)-2?trsb!!+V*|`pP|H3vU~u8I0p6vKc-Bovyiw4#%bxeH2YAuC_9b3bSM8U{k1f^Z@(aFbm`M^Qs)oQc z4sQLM%yFt{Ix~4=mRG4K>bk=wXE)A#ZzR)fZk4V-;i(aDsgud@NLDY)WP)vO*yUKK zDYA0JXR@g}fEvQn;%_kUWNufXfgcHqCj?xTi^%72XIaK`qsrxZ+3hw#IsXv=|7pQ~ z8LIWHwYIjVErpUF;sc?`PX1fuI{NzC3$b!>cxY#espBK2-NP z*!6zT^$q1&P>|}*qt&9%F88q^Yws&FG3?3GJ*i-v5GWrM6_AlmP0jIl_Dg2;s{x{c?9e? z9yO3PT8m024|7@#SDVWwj0%w1C5i3Cq~P+p@1v5?6@TWf-See)_>5dtHjFN=z@?f zlGTfcofyK~suQ=HV=Hc0fg~-2zxDF3RjC6X;}S(Gc+vq$a`)`gHE^?|D#A23l#xnj zaOHsHdiC8q7n4SW0c2ejrqc z!~Isisp?xuyWU_zhn`khOAww?{Jzha3tnJ&iF=BY99q{-`fXo!mDJt zyN5{(7@aVr)bl*j&(JgCM^n2cr5g=*hjJI6iR5rQ1{IW5@OGn25eI= zJt@(t>sWSd?b3b7&VsrC7DDEDwxMXJo=WCAba8*+DJ%qRyB}gNS3Q#xiHpVE3Sw05 z-x#(=vw*U0JAwLBCz> zGbPg{WLlOgPF)DBg3m7rWPdv7IOLuy;&(&h;p!DXxZFf;Rb8 z`vUy}Pz@5N`NDoO)OR*g-!m=y(fU5^a7d?M;rRZaK=5B&Fl6h@5ANdha=)Mlh{BtR zJZL^&tG*D7zJ11hyq;CPTD=3M-N8-!0`@Ngq%i;6V;w`-68Q25w*U9NT)%kN)-hBG zs3cV&)I|KY7O+zDG#U^HM|~Uyqb?iw2I4LUtdI3~0pC>vkFkAjLa;9esPFy!A>^w+ zlBU$IF`5G)5JAsPF4EzR168r%AXwkpc82UT^+P4ulP2bQt*?XrVDU=XmR}#|vXsj; z`|6z-PPYf!u_3x70qzcQD&K}5N4t?<_WbF$hn#uv)>{NoaL+NXvxC=nNMqt(F1J4= z-wu$q!6d0Z@Zab41V{hWpITvBEZ+ku7h4IFd$?#6EnkiW_)d?-gpDnqA<16s#;QW% zj*x=2g;PkNr9gYy99iw7X80n93DFhWS1991S(PclEH0TZv&6jB@xgkG#-O`Q0{Eh? z4E0D~7!F-q6)Gl}4Mj#ea)WiS#`Pt%irw=g&4e@r$moA>vpvYvR1A-*Tk$-n6O{e5KC?B;+HMO8s!p&Q33fz^&mI+!j+=SU+mgzzZplB z@(wZ+wJDb)?|o?VV|Ph2x!2awyh|wLE)=dbz2EbNIx_iUlUCyADz`fUXzKdzGIA9C zhLR%Z8tDm|a#f_Dr*n<3G}mPCq~}%G>z@BI3VpUZvL`k8I%Pj}^d|cW!J@;>2asYW z-4Q>YCqlFcwI!ub`KU7Vvz)y!R^h-LmyFSd;W(afBhiax9Bq+oBmNztMCF%Gb)-qz z5xeyV_clh)qL?jT`2D3n9>hI?f%_u`F;DH?w+NNBw>6V7I_iesC5Z?U8}ev}={yyR znI3*;2G2Famq_0Lbm_0ZwM5|DA)J?lW3GG}441)>ZeY5aPPcKYb{hmV;gFEAsxow&xO;7kMmQ{>EC%<(zI98!`HM}AC z1Oq8TrD*ig!L31r@e}LEak5}!7-RV$v7FDR(C>_uA3uFckQSXBoP3Qq9>4!OeP=;G zSeazqM^QHTc{HuOg35>{ZF;el?AO6v)(RTt$%DA-d+EmMemOfe991P2HqJelCJ0>U z*a@*XiN`zjL?tyL`AFXPSe2{KkT#8bq#4?m5;Hu6{V_C(5oqjJ?eojt%6$Hm`E>x5 zb5kU^DItuON=L?cM?0~BCXaarVO&&uO*%x01$RBr?1*sk0i)ihpxY?2|5Ru@j-h-I z9zIHG_F8lxG(cihB=8hS?fnc_=U>FUT<#%yAL(@g z?;h)e9>)0{{;A{t3xv-yhlGTW0q~B{lQ|-T*pJ=VQj%*fPe(yd)%V?~;?67L&&4P~ z0{r~mTjXnU1=E7(nMZB^2Dxlr3{rPFQgiNga?dIy|1Hz zke`-!UqJK4dh@DcQ_E1EpW$G}S4DlF-8WP)&X+`VKp^uc9Mz;VKeb(lPl`!X>hz>2 z(MjEI2DVyVBlBqz@_u(dc)ECMna*14%0o@c9AeKdzMZ#mtZShhFLOb!gMa0yQJ89N zd974slbLEI58zzDf6vOmbVThnoA~t{rWC+({U^AP9by?R zNmEaKNoYpgV{sb$5st{{GPhcG$y2t_mYq2?CvzjCay3*eLX>)OP$^|Ug87f=uPA%$ zIRDtgqg#AI(iX{vpshDqrnkCIQuPZsVG6i~I4-z*Cxf;r|9ivbC3IoiTSt}YUm2_d zD5hEt@-q-YTxvW;^AwCnt8(CX9>)UhNs$(8rSAwb`X&Llp!+SCqXUTUZjohFvQ}%q zMeFWNNe;P;g~hAo1KUYOJ+y=Tt2x#TJ2--2GSE|KE(Ir(dK6kgr5(#bg-Sq)JYA{j zjr~j*K^fg_s$!hxbJ#8nj{V4! zx9-kn?_V|vmN_4VL$dv5B{K3jv=oX#dd{kC8%O?pm(R;CSGqYneQvlct&0Z*#7WFT z?4JY_$fH*S#%(eALtCmR%Sm zB1&v`kJiODenj6Sy(FL}3dc(>ECwA-{WA)I$bEWMO>m6SZllgZ2A${nO+p)Q23=0{ zi8uRg=CSFZyw>Na$51aEr-?nI5Q^{Q$g3^X`n`CVw^>iEwHeYw*>@5CdsW_h+gYEM zc0lS!E%@LS9CHw<>*cPWEzQ7Ua6#D58?H{ip?eGg6}J^8EN=&Hn2D#sau! z#;MQ{^rD{mE6okzD&Wj-?a#V}e%CpASGVfRwQ910@^i56EH8Yh^~&jX(BG~v?~>(t z9UjDfaW<|#oqE;R)^gw6I5v+0o)!QX$Muscl~=B-aHPb`K`#JMW6mpl`*`mZL?Vf> zfx6mbN7aEX`Mp;^_&)44R?d_lENoB^mZ7@7Mwht=H;t|J-8~`PWGm4}BW||VQk(Bw zEGH8HR$}stxJ5XRPuGY)!}Ku!m1SitcniEwl%guFyryS+42t3pq$0sMHxRo_^O%gN z8-WQp=lwzLen^bf-f+Rfkx#LC(dzk2?x<=-GP|X-J#qV9jSDE&uASFYkCzo(Grj@4 zdQ5Ep!t2AZZ|%wMPA};}kCty(UBN&AmrJ(xV?c=Sw1pbG=c?^%ecPl8W}<_KaA+K^ zMp0HQfrhi9#%}%`$^JaeWz&rmM1V=aU+jR!u0`XU3Ap3Mc)14Sv%jMw_viaovFlj= zeF3!8h^bm{YNmv~lv}{9B~j^{Uua#0##WWdgkuK7BVW3i z;09l~4wths*d6z8B2)C| zm%#_l3iCz&_Q=Z~CE#NnE=@bCr^=OEWGmJaPU>tJ19-ww)-3`mULotSWdVm!wN0Fw z@Ut9(pQXz+h_4KMTM|#0-*FR5RJoPt*Vid|Hm}Q9NGG%9#`umJm zcHS4Z_?ERq5nkfjYNhJ5q(=O4Y??XIh?2^jkgF;=o3C@0XrN@~(5UA6c2NTdr`bK@ zNe0kQ@5VcS^!t5Wt_`XeQWm12&M*VB(|m@ajdrT)WW##~LS8krI{J2gEb(FUSLF_y zkqOt*O&pqX7QC@3Y;a{&A-ep`l?~kCQ}5XkxrWJA5`7XP^oNo>!qwiWJaNRj@KWA= zQ2MwX8c&^`Q&r_SJYAa}~Tx?nv4?rQ`Oi1jTO*3Q0ud2IvU@?u5` z;W7w47-!B%to3_y5Y9nYC&c(<;@xleJU<-Oqbv?M6E#lr(TR=xCnsF<&P31avfnq8 z`07Mg0F7ecm5K{njYE5Suq;nXdVF7;Sq3VJEd%bL%fV(|vAHifzt1<}NT*wWyrfV# z08(O3PyJj!v%4Q)w*V9SA~m8__EYn+B3D0hep)~yv@I%KbFod+;%1vJ5E4xCz>i@X zMzY%YHD;71Bf2&p@0km~x8fe)VI|EOI5W)f~^*kKr}0P{F1bW$Y(BGNKU$ zqUt5tn~w=azbg)-kPw@>W}ygFI$CgTr}5WDubK(WU7q1U?n)Fii@jfGGnY7SaVL`M zSkDb&*I~StkV4IqFT#dW&JLlelsP%hm9it;$QRI-#PN`}jhDeudb#8G3w!c`BtWpY zk8ak*ZJ$C&%R^$ z|g`?(NSaXTrC9n)C!il@i5r^moXtgN7B6Ry}BMOG_^kb+YdS`0UDEiIj6(< zqEI#`eik_SL_qA$(k`X~%-Fke5+0dx%`{ifn{5(=T~ocR1+{$);u4U@^S;spTxB{L zFea;&p4>n;iJPE*f#QH8th;3a)6+ho1BPVbaZ7XvDA4l;Y3&7tMXTCnhjkCD!}Boy z>*ML!BL}<}`{lNL;7cEMtE15ty#3&#EWz&E#~E0JMBz)3(S!6vuGnCN`1Qu`34fQ| z@i=8eSS2>yTe_eNV!-(Z_KW1--R;uk#}jIQ5!rYON!3GprpPz;QrT^ST-O4_PKhi(#Z$Cs7U(uw(POr zNVJ#w1uW5X#n>?!K-rc!{{Lk$-Niahd4e$eKBgMw)*fn>_fx-IP_NY(mdtK!QNKVv zjygyr$I{%48y4+Xf1Ys|b`0UGigMq0=%jLEY?0e6DSZg&OPNwZZ{o>(Dp5PVXk-!(8vS8J(>ACzJBzej|B+t;kUB=g%96Xc zDNHmzj!u%1Hn_+QfmKL6F{@Pb1=|x!AtL@LS9Ma;o{%ApoQo5#I;r)xk3WfNN5z=} zPdNNj$dc#Bf>p3DT8H)V5Pvv!MkFP0N87-ifxE4;FGlK-pOmBkfk91$> zQqVA;mbbK^O9cSuTUBwnu5axo>jLfGp((T2rgsiiIV-)#+Hgv4vC)}5ZKn3#*l8ia z|7BeV3+(u$Uo)S(Cwuf(sozNT^5yiZ5tqVCTXyc-xzKk^qkm{!G(0@s0y>~JmiLk@ z6aW{;KDl&wQXGkaPB*k&q}=@3t0MBSU=?r$<`Px8S89u=Co7qNXaxEd={#^rDk=Db zI*U0M4;jR$JV8u1@)Z>%3kIi~D&2Mv>h&GfR;$b^cBaIBd{Peym-poU?9(-VSPI9@ zl*Sn`@=KNCSBne}>L@Ee`tv2bmW$OKHy~8H++p!@MKc&9SaL}uCedMSq~=3d3H^2@ zL^cAjV~xyxMbdNskw(o>Ng~Lt90cbC{TExYoFWgLZ1ii!HyFw zJwXV8`&(oJWO{NXbAGc$*#|jzA&VTX&z@6atu&7egylrtEyOd2YvzimeosX9LhyH$?>)%Xu6Ac0se!1L)K{QBHDv!o#gEy zd{TdfsUBRfL;>qlICW99LnyPYVAa{&{QOr;#7b z$cO_0_@dNspX00j5D$zee;lAlG;S`5F-5y7{~yUww5d8IKa{Pv9v?3A=oC?(gwBJ! zBaWa~-kQZ<4^HM1SvFy4z+p#dne6e)}-fW$CM4NYGx8C^5@V!^9?DZ}&oLmjC1 zPbUj;a-Rz-8Frn@Xor}w-gU1eti&`9u6;@AQv!R#pklqjY*=8^q^FI*m^i{t{@oX( zBa$^Fm-b#Uu0T)ITYx#{U|snjaIkja`KJePAHK(=8R>{i=hfNr51Ure+eJ*z5lTGU zbAw(;;JN22^l4CznT|NOlt*g{Dk2e>iQ47y&epF$xH7!I0HD8h!HEKNsXDsarw4mq zC)#EE2}2WijzDIF^=Ie9@IXBcse63v@~7;&J?n}P=(uM_=r=vz>iJr7IW~TfEzv$m zALN;$Il2o01%x#}o!}>mN!;E|oQDgn4ZKXQW<|(*rrbRN+t-%b%kM1sZ^o<{;ut>S z88>|ob|BJ2F*SQ_7U+Tp!~G#x8%HT3=t(6Km@PQWX>8i@4yPM^1e?58u*u9G35A}P zHkGvU1O51nqKB5($>_@289?vuwo>n#m{OGK<^PS)!|Kb5PR3n^W8XP>{# zHC&UZ;!v3XdPvt~Z?CAteRWXM%l(fv`V@r=#jZ!kz=O24&XV!+X-onA$-_f3r>>)% zj=j#VVe(ZdQg+Mf(*Dh+c_N(QAn1Cge!-V`nw1!}62Br{y_jfrJBeE1&S$>tMl#w+ z20rpiT<=nE_f(4x!IvJ?jtga{$g0`ar(3NH)t5zp%cK}^y(I9^>fVSNic=l5Vt1c= z_H|AnFFCT<);B8U_g^Wi|N0inB82l0dbwM)Am-l_X0>H0a`J; zn+62_)Pr}3wz;*gsD&>}9MtcE&Sj20UkjyJokAUyRLp()?g9juQez_XBlG3FK>!-G z3W*Dv)Yh&uKq0c^M}l{;j_As&^ig;xnn<(9o5K9j`6eWk`jgTGg`?#D;SFvZyp|rA z*^puCmhk(6S$)w?6%)q6AIa#vBb8`sS-@d+PJuC* z3EiMiKQC%LXDl7+e|+y=x_?U!codtPlXYIfO$igTh>kHYNo~3JGl~iR9wqBh8NXOt z)8_f}8g7C(r--?o5O(#nRn00O7&HPm`@+2Y{I7i}vM7wSek+y;XoF0|dj-#A<+J*3 zxh2R&BI;{DymY){v1>%E@bX{NqGrK7w(&QLjtTp{!q%+Q7ARgvns4__nK4;?dWI!O z9iMeCVdmQ*Wyn2JvUZiMS9u&yN{@AB;WyHDM;iJm{qlO}n#gJ1VRPOZ{p;B1pNsu` zBGKRTw*wdzRJ|lb5YyrzxVW2W=fljdO`;O3%GAdu?Oof+cfSlYH zDWYAb2RyD~Hkt)VQ?Wlr<5>{!%5df=Q5FQ$5%0&QCUx07E8rKJSr zCG!~)+EPSC;#n8lI@{W>tWLR&Ql|zJgn(TT^)@?ss=gyb;#gbhe;$ zBzi%=@SQJ1C0{T~y720(^uGN0aX2+f8_;+2uAIB?dC1bAJ&NQ_CNEcY`nL-QfwD&e z0`BwHi1Qm|uWq1q6%-mOadCrHP7^oiQ#fw!dhdD|2VhbD40CZm$5FcICNq12+1%v} z$9HnRY{7W!l`gZHCY9F2dWRPV?!->7a6&H)t#|_Yle{jm#GJ(ROf^^5GDry_YA!JV zTF+ck(Fm8P6C`tZCtoh#8_WgN3+1^YtZ27H`-%CtT>siQfC`@=;Uuaf-Ic8 zEj{R4_ZzZ(E7APtqDbD|Kr%I$dN_%J4($~n=-w_}23EFv89=S}69*X=TwBW)BIA(d z*#3iAp~s*rKh%NjIt5=G^{=glkk^Zmnvj>}dZQz!WX6b{+Krv|MW%gun^Ln0%AJ3z z9)YE6gI!Nnl!5})!|}tGo;l-;5(nWB2L+Qr=h!9YRpBMsK@>p@cqN!7@^{$){23&- zFi`(q^j6x}djyzBfHRNW7fzyw2QbyjVL2AZ*!KBF!8R9iRaOS6rqZ8zw{7F2levUQ;T+0@rh@F<+YWX(L zlE=duZ_ZiG0r;r#-7*y;P31$&DE}W$vo>b5?KE`zR9_O$Z-|i3}rN1uM&IBXNLUU)C&E4V8P{<>Eqf61WAtPE`WYgP0DLbK8Et0c&n~D0K z*uPH_s6_8A{$4rH&}K^&gRbW&j-!g<%aRSTtikK?g1?g^$P}u~Rd2e$C{e7*@o-AX9uh{J}<}?;Q~Rv`J-rkL!Ga zZLZ+$j=8jncF!Iu7OKkF#%+?jki1M|fc4@w18ITH=DqmUS0Msv(|V1w@?Z=?Q~Ul3 zh0>Wns*3GbzJb)bItPM@0m?YI!V}+(5?4r~J=0(E{!|Fp$Yk=Dog}9OGx+h45-!CL zy8X@pMTM{oF*FH~Mr>0d29W6cFp7N_lp#VIbA;McK(anU2h64f#KY0!VfaQ)uIzn= z9bJF#8jl{>*vu0cepFU+ z6veII9fGNsd+$tag~O^8VPy5x$||-RBb1hwAC#0!pb|h~;`MBaC18Vyi$UVcInc1j zZ}r7C@I=6{N91J=9bw2EiEiXFPc#^zw4wKZUfM%i8~yh{gO6r%Yy#8py+@-R;K+;` z_Vx5}gL>l`MorQ>u!9e-bM_B|N!;&2pHF>U4AS5vbgh|e>lq04K5dku>z2f*?apvy zho|xIYtYJ=XY2A^I>v-%PZ*Yi9*o%yM{1f+=VDM z*rT?BM#y22NE6$qvW(^4Kex1$?%y8%*QXM(&yPcTYrV(EV}!8B2XI%s#KRUqDhNLL zXaEGh+q%*=i{qRBZ!_aob?L?Vt^Av%Wz{3~oNDvt%XDk@Z5!$US8T~6$O!Fpj1OZ= z$mh(d{r_R=t)rrN|M*cw32A90r5g!pSn2NW4(aX%MPUg61?leYt_5iXq`NzorEAGM zpWi*dd%yqgnVH?QXP%ko{mPE#-dPjNtl>AuHT~!_= z|91IK@&244Xj~A-?R~M^N zYy99@y5y{8B0RiszdPa4=HfaJ^x|>VyPt;5J^bapa_9Lp&7o@M#m+Yd{}3=r5F30T zf@+~1hpNKidT@zy5NJ1N>t53pT2&>jUE_e`;=Z}VdSp~i6Di?oT1wqLx^}}!6L|U8 z3AMzD4~f^!adijw4e|Rop0*;TfFRWhb9(Q`DlwznX5K&3wUncT7AbiFx{&%;!aa|s z(4b6}ykM7jhns-Tc=9RniEXI2)kT<}-Rnntg`6ogyb*hr;@dRC6pM=^KE=6FkDT_f z+~M&T;skg7=F44As^D!Q85G>5d;RgXc!rci%+401#y#8&1cG3 zu{oFe+91oXFTke=t|QG(Zu9m$`S5yhANcHkeDuA{{UH0W$XOSC6os}P<8G%fT8cG=$d+r;&dm9e z`kj*?qt%9Q1Z)!^FS#+Z z?VP0%Y05@w!7|pdcY37XC16+BLv|eY1|eu0ncq`~&Ko?y+8)t1Ny{29b8O;>=^iR5 zEm|jYR(P2>RMo0(j_t&_kw3;ydVfRY@u=~jmTD0S$}w?}L}8XX;(_CYgbSkfLgd4=@d=|r%~nhRvu zwR*Vz^6C5E-7RbPDbh)OtQ>opHKd;Eez2X|Mj(1#Xc`T~;BJc&}JHnt9TiVO_>JbX$7cj&tzWZ4k z^g+#%KldhTj0a{ zvX4aZdgR}9Yw|EK4__Zlgm8_nqK=KM&>^NhBZJS!T%-t)kMHljDE+J;o(4Ok&$k9r zHNo9FQaB286G?0EHxHb^hN|bA=YbPydA!z2kF97%zb&%hFP=i9 z=jSh1uN#}rx1Jv=!DAaZh@Yj@*vBpW+oCDAlTSOU&~HY31OG)IIXWi-(s`f9WmQ>S z86%YtYAMTSSTMpRfT8cEYz%yS5qMQ*8UZcbS`)J3`(*-L!lD}KT!cI@%T5NkX zG57?&eAm(Bv44kecek2An?pWqW(#MlgvF`s%^>?r?M9w@U}KLLM+?TpDsFc0*}kmpAQkm?zN2z)ETN9TT`D&@-Mi0 z-7x#wJ!%&D`v>+;M-`Pgwo{DQvI_~MGmDqo!buEK_wE)r3PQ^ft1gny_rM#VaDfauvscLM4GhS}^%Zxv%^asS zwHU~1Ti4=$erL$OSU_~4h(FCaJI>9L>}=Xrw<>jJ?)(|A4x)LS%;#<(E<-K+OXjzf zmNr8L^Mr8`yzxybNxPq8K)zRKdgWxZp5!3Y{4Lvv>ZchgZetN?t01?KS;V^#jw$C9 zy~L=W=!^Q&2W@4##mEu5Ro2M2Yn0yeHQv9fF+7md-BAs{7j8*iq(*+~sjhZRius(k zTi<2lVp8{3i`|Fca6;dyd{!Md*)TQV9U792rIStXRuXE#aL%KFL*G%&OA6n5n0$Se zL6k`IGwq)YTxJQa6b~{IpP>XKgt4(HPwJIz9pYgPhtw+-eg2stCuz`sD!Q0Cyd4aDNNju(jW9ZoRJMN-n^AgiH^ zw*0#uBD;Bx*cawq-j30Ej$xK4#{tm@9yWbJPpF>o;z09g@4TxLx6V*YH?(=wSNI(d zQjrKA|H@R?;#N@qn61cel3>=ESByl&fF+T6x}`jF!n!tJ@DS4 zAq(Ojp4mmt7+httb_^qf8Jfme=It@)Hy_M+Hf4VLZM98_bUi6a2DSvR4LECma&6uT zopYO8dV1s2aV3k$5e~*=&!Dh@s`|4iwn4wGluBh`;;_CV)b6=3x}4sDAJMDFrKAXd z;s~~Off|(0_s(DQ1vLFW0c{ zqDg>f)aInrc9uii{W;?$C?+RUOkiOyE0E7n=_V)VqHY1LFP*$D$`0D<6)J{QU$(+3 zBZNZ+!bB`pdgXH26hR_9+rgs3j+MSjP*OUtz>&lFC8o~_dHkz`ifeb@+HX;h*Y~kF zH^WY#84G!`%)3+nrL%te+#ocq`f;bYnrZW+~qa+Vm!CuNRNOI&-h9(#ORIIt)C(?|<=jEIkige94yh(XiWZgG9=v0Z$Cs%Cr-ZQ@_p+2Penw4`;qxyQ9W8+x+zEY4lkdg zm&S!)YGMb!&@DHULDlC8Cz5Rsp#sJb@X0%(RM}}2+xnn%wzk0?rT3vO0lvynfeN$* ztX5K_+zPHZ-X(7v>ZU%s$BDSAI!-=AUu$6&r8DQ}HbBA;t}uj^*j0Xte@~1SikIP* zS-0ORo=?WQ~vmRo(@C|FMwtNakOmJjMVUJQM&x1Krn zm{8V6vSIE(p3Dzjoqs2bsOH>uS28z>lUu(vkTH*p58!ef`2gxD>>I8$jqGP!I^)U- zyXw4bT|Y@cys2$o+KG7i+Am`aV{+WT^&`*4g@n8tvhT zbGctQ_z?LaKG+}ci|UGp^O~i^Oesp(Ms6wI$?XvF>27dfND@>e9I?Qo?JOV|eR3ao z`>II5Z;SWj5w3ettIHufR#nm9N{*u(@4Ev>Z9yRF+7BQqm!maxD?7tC&e_Fy&&Qzl z-)*Z1k<};8tg))60o_yl=gr+BPqOy3ZPO2O{QbM6r8Q=s50OvxM9t0M`B z7xt*@jpomg`aki)6)xam!ljqD@gRgi)zh)=#VeQQZ+(5z*i>S@4yHHnj@vIrbsb?T z=l{zkoG5`6>4SZ|y*WVp`r||Kj5ng!iH6Rkh{c2_*?ome&&4Mj&!hPoaIC2R<^JGY zW|^&Jd5uKDq`s@uvUA46#@@@e{c4+)Y$L4dUE;>!hvnd>;Fg<<=cH)HtZm@GNb@g> zp73tI&&$fz2FPSoU)yLUzF4{;w2&{k2kIXsn((!7NLGlT{6g=mlNcgBmTyz3Z13)L z&02MBEjtYYHhD+Si3)gNx0z#oQ?Q!IzT32KZSYNvuQOF*;p!{dQ_j?pG&CGB3;hj7 zjy*C5=8dm-Yu;(kgnns$#rW+$&{`XNyshI*1#_k-|2JAdo10Bq$x z65maUaFdNj>O4x`UFpu+w`~PHUdR?PXRynjk$w~tWB5GK(1G?==9>Pv zr})h69?aII7l7DCs@zjwv|o1y-d<^=?yp+Re@S;c8&bcicXc!7>@up0>I+*1LkGNX zq;Y}J6@Z8NDV^_mszg2)xW0`fCT6Irb2t7s#|4)4K_fP`6@|YC zpLScEtmJzS=h?{9qzRB&9K2qO&%;4Nk~<^Vup&jatYpTlDSeP}cgef@R1^$NK^-b) zt`3djQ+|Zupw`4tivs#Fu zjs~}{*yQ(r{ob!?6;A7llh$8m7jNA?ox-FH_%0w(j+s^C$FFZ~3zDStjjM9mtlVxq zu;lfanK0_5afBJ`0zHY|ehuw=WAz$69S8#d@Tws4LOBIwH@Ein>?EmDN zbW8=lec#9@Y~B2aBm{F{f0{^(y(pv-5&MAJ1$o+I7JH1S<0T{FUlkcX!`GCjnt>E@qe$t$zrmVHJDqgWmNgc1?eXxp z>H)740ezNXNZaT}VCXvT@vq&l33~41o;<^E&N6Qvh%tNCf5}pISO^C{rgU!j1l{}G zR-X8Cb)IDfXP7?tJSQ$Ww}moh1)fJbiE4_){{ML0RR;4$p`mHZGloOfd+^rRF>Ltr zDFieU`?Mb`R`>5n($LV5je}$JnD)(iTjzb-L$B&X@Aw?BZKPbi?dOjPyavwp)4$KN zxH*drPUmmmz)Au?rObkFRtBO>A2z|!j~#3GqCr4$OyIr)6=G1K2d7iuX+g5z^k;}NPG;F?roNRjp z`*E7yrhx|dWG!*EwHf)jq`j}-*_Xv``iV!BclthT8ExD6G&THAYLa# z;aoY!=!BOvj&QW3yz;cSCNFE-SN!ZG?$*Ed2*;n3>wv!~i(^3`7xl5*BE}P!bZk?sGCu^B{b9GGguJ~4t;?o$$w{_j)owpqM@SEW6-1RkimLtyXLX^30RqB^dt+>mv{`-E4 zS^@K$4~}Z$Le-Uf?9vHkwKQ9c&fB(uN|P#e%ajO5-!T_w2FbeR)##bISv>*DUX~x` zBAK{aY%%9Nm+zr-XCz@BFV~TW(8?@-F&BO&B^q^4+acSfeeP*2m-{ll_uPF({ZC9R zqg8xonRJo|RZoa-c(&lsRrp>cK5y2Y9zN6;NTAAIp{8FIpCUKKjLhVqjdxJ5Y^5!6 zP5m*=`u>P-A%$&40adUlmxVi$M%@@VZpcDQNXdjpx^24mP*2H3GvC-gM-guyPiCq6 zP;YzBoi|my?=!eV{C!sLP8(X>m!ptW9l)>4M8Grsmz^OAy?&Vea)>wDJqn<8m3wH? zCaR5a@@DC?Cb)o%**uyTGE3;YaQf!MXpYc6kt>@d2@Yw?I{BRBh|=lT%DFn9HQNj2 zE&`)H6++YTMCQn8>gmLN>U$(xUL3 zyn=n!E=ViJp2ztGi{i!#T+?)>*XkWb#&B3_J(%ql&{C&$#TjkB9k%&)9t4p15_}i8 zI_&Z_?shl+k^1$w`XCFsGOb)!O!?`uWX_|N@IG2~O@KC=>8ylwKOdUVnR_l_kh{w0cq zRR`1SB^~P$(39?mIg=;TlIu3ko>_l-V7{%JHf%eQe4kgl)ykyF90YqNeSF@xRjlf? z3_S_%QHP!)w4tXh+V&sgTUsz>b+&+Jeedz8S@VE)?JpI44 zz<&=MaN9lw)tx}_Wo7WAV_QuTw16cztL&!r-@kw7rMex5wOa(z8_F*JQ-gDz_%&ny zHD3z`-kw?y7;|`!&D3$t>fzEUg0q)OH9Kx`uRLyO|FZbIrCb}FGW#xF->%$r_)wo= zobD$ZU53R>vz7D-}YKXk1l3tdmNYY zAGYT>({7QO*eES`=%2$MrfE>Ko<#}vuuZO0@&nh3pk7}mElq9UIh?K=4yOGLD=#l= z78*(_`A>~7$_O8nPDO}^xm_vJY#Nl>@U$e3L#<<);+b|^5}0QL5=vDzvE~p7pA`Vi z{(SMv%@d>hiSLY;i^Fk7I=yzxK zGnu=M&x2L7TvQ{{0#7Fa1;*_?_YujIoQh}UpUD`K636a+^~if{p_o|g-2)d$Y2^%% zv}ZRL!v7D*LCIS_>>+NlxPi?yd2=lSQF0hr(}9WSI+k|Y?(_eMroc~QR2dPQBH-%q zM4g%?LMioZW9R64{C>V4+IV#$Y?<$a1k+g&j_w^f;IS(j5I-fS=6J)pYtMYBcp(By8w=&GSL5r zF=Lim>N^XK@lwuCo0VUM-Ew zh9iXCN_|Za;t{0y;|Yj6UjUe02#fmQet8!2)&btrcbNkT`dhQF9KR+BcyTm1#=THZ zyAj{;9f6cbmSNz5h?50dGWnA4toMi1aHK9M2$FcRscQE&NN@+KGBy+kIbl*IJ`t{_ z$MKW-h#}~G*SrnApoCM>to?_QiF!vqpVY@&9gBHG{ZFICO6&x8&^;LocVX;OEKLZ5 zdc}*gRPEm{tzgyHANtPfB+mxld_N~#Qlbmm8jF#7&B%)>FRJi1h%d!eCHn{DeX8tc z6kt2~Q79#__JgKQV+8ARpiECuG*u2ynfw~EMP`h#be7w~=g?N=GP|f3Lq<>e^6!=N zZ^!mU@8#W;tMz9_^K(~_Wo6?EanDR zP_dX41hiZSU0YiRg*YDl{l>a5#VV?}vDo8f{N@^wGMfcHC#OQJf3ECwOU-)r;oJp1 z%>{R}s?Qz@m`Cr{vX3t%s!jstfAnjNq2JKa) zPX~s4+%>rekZa8)Dk^$@1)+ip5ljaCpQ()w4ap_=eu-1~7|5FB(bUwWH4Wy-imrjy z(MQtwvwYhVs(+`gl!vcP7+I^}|6Xo4Xk%KM1wP@D?O0KH-U51jjWL(LT{!o^V{(eK z*8BIWiDtOXg&YBuEm|?#OeJ0q5L;MqP^%}1qsuD@;fGQ%%Do`#-#^?a(ik0O#C`pB zXRjl5_ioG6-f-===$ePV@S|UAG)1H$GWqbvW(n4AWlFze$}KeZ1Yuwo;C%o&mJE z$KMAxnZ!^TeCD`wjgKnaE|yiOj&JQV69~A%;X}wQFfa0{14&j0{KY~AW}g5A7Fp${ z6|gmOE%%JGQeQ8;>KfMA)8LrCa2!DNmFXYA`N_1%AFnIFn9w&6;0su|z0B#uxAa!u zsMDH-O&FPX=AxbfEE$nFE-vn=NLFYbkCIA0Fo#K~(|M8s9W~W8I`mmn3%-sREy=mi z39G9OJObWD<0xQ4d|yR_q%s4Hfvve?yWTvXMBA{_R2{#;rjC<8YpZ47sXprr(Pd`0lA{%`sK*8ksGyf@AWVYc*SWOcKPAqt|Hf8+LP zN4#y~>C#^(@r8j2lr~<6S+oW}J2w7yjSjEHKJH2yuqxO3+eC$(NT}p!IUvL3qbI%N z0S83eV))VJ`(RYuS#g?`)x*~gU%qky#NS5vmcUkyy!il`TscF{*q>(O*Jn&=>LI>p zVnU7sS<1OZd1n!A&ayNm5b8Yez>>86KtG`HTdy(x?%tk}n9n4?Cv5V4JJeXjWvM<- zYN6PhTzHu)11*jG+SZd^0u%CB2;W2meYbEX_2%^v;FCIsK7_3VC~(d}$qfWA8J&Yc z@Qz({OF~uu{(&RLu)O{NC>1^BmfNdbZynv->tgUiY4t=HqXJ!Wx__W!iGu`{WR$Z-3&T1q*eR^FWi&F$UpnBEEp zZOt8Tt$=R)g07OFa;#z8&pL6I3(G!ZSv7b2mSc^q|AP?&$^go^T_T+4d)uXme7?Cc z9JmiTr0uvBmf~fTCFFm}#LCJV_^?Gqb$18!*Z=v?R4?V`34NRkg3mR(nqNMC^oW9R z!Ul@xhiXUuvy~ZNBWxu({e~0;0 zgqq%;;&O9RrrQ9w zcW*eT3&nYz{zzl! zOihXr%Ta%42iYFRn%-LUOrBwzo7`>6(b|bWXU1yy5&vKINJad5R*HHhS4izl%?*X5 zXr8*?Ia_X`q{7gC-1jYHDxG;%N5}$jS*F$>GhQKo_w+EOmn4UZNu2P@Y%C11QwzsG zlaOG&T60e^NX>3Ekkz73jpmrD^ZSt)N{430jQj_(X_UDu6EC4M@R59y6szz0;Fi)~ zrmx9JYK$?!45`VQ>zDF`9jOurk=^gqef{WvDyUA}(oXEjiVDp2hbS5*d6t59q=Y^0 zKMSZ+*lwu{2AVV2sybAZ&j+>Ybut{CnTLA9#k$os8{k-&T*Qb&y6h}swXqn=<~GF94S>_ zf?amjaN22{V*EiBha<|%iqWhZs27CG;RrFAVGEi(TAOKT%a=hL-XbRIV!W9dA&&vu zQv<$?4D7mr!arwrE^$d)ikplA3P z>OCiuKwntIUEju6d!RmY;Hd=3!@$>KCkqr10{u}b82#(`HPM{s*Mwafp90QCn&VO> z@u-)ld58zu$8wX&mPPJd@8V{cGrre)W^)*E-*Uj(iA=kmg%`{$?6mK;t~YDBK@)p> zISWV$yOrSY+3uGS8ltIt7A-Zl_ZBUrFtSxK-uR+PZr~j9xt^=u}sI`Qc*Z~k}llgtENJdnD?*IgTYa&u>a1g*}6yV<3{fITTQSC>s{-eM5 zhV{uYu$}BaGa@zuM0NvO1+hI11(}VBuDA$0L(=~~-Yk!L=))V88|=s7Mw#h6|DQtX zzfnZA>8hK5b*SX|o_MU0Ea1?v^!z3VLYX_|XHz;;DFZsE1$DbT&bqjru5--t#t)s& zHbE0WPg|hXI_`Nla!Ow_+?zYCgRiKRU2d6a&l3c%fnbpJS3saE1zLovGZ3CVwg)uN z6C7OHO`8H{Dd5`vtt;dXSg(rRb8ljmUu+AwMaKgx(@w8M75*4Hxh24u~cz^RQlWEiLfzfwM zt4sV2Ih;@|QUn+8`OY}uu~NvsBqql2Bx67<9LfFg2!9wQ;(67)`(jM^jjQxv`>kk4 z&-hf&th-?S)dwS2a@ys+U>u6}Ghe?K4&2Db1uxK9A$bQ(glufO|4n`w~PK&$(VH@aJ5{~EWM!; zZ9Usaqr3rbia~m|Ux`c*m+FCI3NXqCy_aoUr7vL3Hv%M)m}7nAq@K!YS|*I31nW92 z#*Dckc0#1`8dQh9zi({>aA$VVrhU~dL?kU0B`$qrOA?Z0zg>E$*&V3o~`tqX=ZLRlvqvW?YqO15z1ZsUbL0bX8FFo{x1;sw2qHGb}@ci%#906vWX>alq z5kOK--oN#;mllFPmvBV&NxleW;QOQ7^Nj``YKD}&=}?`UaYV-dSVaDlKA%Ya$L(Yt zzdq2+Y3h80r-OnsQ7L`DsDckQe-B%Wo&N&r7usJ7cpXkprOqFF3emDUWMOD%C#VK) z;{SK>e~~;7hgDB3MJgGae^9BcY;0`CY_oEpu~t987M7Hw zYV$Xm-_Q&7Je{@+>>iKlmpSC^yZ;Wv&g$@N?FEc30*O$N zT+_17`nwUR95MlKV>hY;-1l?}fk<}gPiWQiwjobLeIf}Bi^sPnoikW0m!+`iuR)-4 z5rXe8?^FOFf|1wN$@w68W-{^biz0^H0P-R%$ij*14n&xc&kK?kz%-JF)k_=Y*mr59>eQX5&W-uVoS0DL1EsN9K1h1j!JF#? ziN%R%*Ax zh?fS-=S$Z#n@I&#*b|f)5s~A`0G~rvYXb{;yFF_^G=0tTj#oQkd1Zgl|i)>DozA6A;Wo2)vsnx=q7)5&e;}=6GH8X|w}2G^AXn_wwA8FtepU;AV}Jm~~%wl26*-q<&NurHFXazA!M4 zNulNE^4MmelkO=_yl%*}HE5A|OK+V0FyG;rbbE7CZGl~^a)c7B5le+3{eYjTzh*K@Bgs*z+UEh z&nK%l?+#ztGH8&DW|#6uWU6eIJETR6KL;f5G-n9dAnX@oc2MSzC>w>O$Oqnz_PCC& zv`#>DR#gKI*Xd*eh^OFNr~#=nXB}p$;JMg4ZR3SHrv|5yM#7xT`0F-hS_##Yj|@K~ z!@>X9DQt6p7B1DOu~EH#NnbJf`CT#e%S0p7zg^sqDWi2uzz+LED#MEZhqZt4goVUN z`R*)bv`|f%zb4MuC8h%F zy0$cAspi-DJGe|zN`ZVUJH8OMh0LE?W6T~I&V7;&D~r699$^<=dDX&ktrVM=$Y`` z&u#PO@AKB>#yOfM+zq}<^}D{Zs%HR_E_3v3q+TxF{M0}Xfn!le3Hy>XMp2{7aUHpm z?~$`~Bd4`pcrOtNY9I7S5i^AJwqfaI5(j3XefXF)un@80!G>~cZ3L2d&v<{|-y4X> zqwtds3)G&CWs!0drB68n!t5hoM1KYri{5VY-2=Qqc9bmG#z2>r0Ir7V#m4adT4#i* zTxo|!%caipSJDoeLm*$64$7S?^vpZ_c?DxBt@pJ5*FU%IbDIi$bC-CuW%Y}GLfP}M z;w6E9{GV-syWw_IV3FTQH{3dAi99R^2qBUbj=lcbm(zU}<{fvY1Z=mwyBj>&i*N=q zdf(z)@T9W_^0k=Wi}N!Mq*H|K##Ff_Kbp(!nHL|r2I56gmu`ePypuL*^6@mea zt0}gBey>RUW-a)+4&FVL8*tKbvt$utE4fx_YfOND&FdIF6 zed}&SHs&#*Nvd%`o|@V3c9gxTJ@L~Dd3d>lN+4q>kLhJ9uP;Yb?%`27;`|F7Sb1)@ zjdM9gsAZv9P8DJg^pwxt1M{u7XqkI};3BSk99}PHdp^46yb`uB7eiaMwFNV5({ub-fZ4}Aumt!7dM(7r@kP-m$N?9yZtr(k7+XF*1~8;3|_1#iT7B_!V(;kKf8vvJ<}@yJDGz4LG6F#b0C4Y z=J9or++SW?JH`GkyxfRE9_}gjd{uu{z=ACnWKy8zY_|1{1(14y^>%Ul$f@ubV`-!6 z;*_AtG7XP8z8eA|zBke!3GF>PzZdw*!-d(v>s<(8@lJ_&$kmOd|4RmLCwc$-ZUTt* zV2!s3L(isnL-LND$sO0f9<>qqG)b;$(Fb=RzOWHIwNo(1A@gY7U>06*g;hi)Eu6tv z#+=UvD#Z<4i0ESime;I<0qxnan~@VanB1NO-Ivqx#Kd=x&RuZ2`f!#`!}m8%byRCK ztzW!%STt!EXV8I{BG|Iqs}HOaqY5Oc(2`eeD&6t1Wo{(rgE-rQm<<${cTF5(@BIWv zyzo}ir9>f?-B06tR^%MEpal?{*x8vpo432tyo(@5%Wnl8-LQWF-g&c-Ov*6a6X6Td ze2;m`u%~0g00q*PM0MMM=}ZQ$m7b$mp;wlFoSIht%APz)dKw2b8k7F7Gq5J}mA{J4 z6B2EiE?G3nf41$%5uppr{gsm-{vCI}Z5V)s-8eaD9kC5>Qk?h>5c*#)&;6HBJ8s7- z0}Z0DA#*6V)vR=)$xoX1KcAk_p1)R$EiI*$=gwuKVMR~0ew_eqlx9ijb93ZQK}uPE zU7MRz`Yy7Rc1XOSnk6dvO8K|aTlO>y`_CZ<-|#&TDRr8Ziy9HXEA$EIwLXTzuyrEf zx|w?$izv0_Gz#2s9jvvRam~-I84Q(6v7t>)@pme3JnoSe4qgqm#$?X?w0c`-nPZ0@ z$2RFiGD4YR1OGJ&MPKMP!p?K5^;{t*hSr2-PN+?xH)y;P&HMEiHm!g~6f;_j=*0$L zFFuM=GG%~Ys#Z>uX&LRVAsqpJdR5(>>l@KLF0gOhsK-)qYIm`NA6~XVdarJM<|CW6Npu)u63tnRy!DOf*BC zY$5Os1|{;X*_LV87y~xVp8nrLE$eujmO8wUEp1|zHUcOORkZ-5?yEt`*NHaOc}GJM ztoTihmw8T`$VLWqns7D z2QOmHyxF9fi+M9ed58KJoFMXg06D$G02LiSSm=B{Q=SJ(mHfbq&Q{iHcrfdK= zT2ihO#4#XKBIC^RZPJTbH+6g0T_Eh6#eM!>t>>`QQQ=jOG}g&a z`cL1{JIJ$LT3)VBT>yG4@wa(%-&c)#O2xiG#5Jq|&0Ji7c5bF>X>wt`fi*yfYA4RO zYgr?1*=m_;{eW!68hu`M;91Bk-JkGj)ZU8zjp3=fSExowOp!vkAK?(j5e>SLzkAxI zg*pEQ3%d9W`{PWBg--PG2-Xsq$!2V=BF+n3E%IR*EvNPVo7$&Ll`XF$GmhXUkcl|! z*kyk&oUvcl>HTaBCQrpGWq(|)qsvs*X$`xu@d|y# zUUmlJW$-dKFv)!^8V z%4`LV?cl(p172M<^K%n8t8pB=88iu7h-fiEl{ou-b3d(1me@cW*3_}QMHk2?I4jcmR4o?8Oo zGxwE!iB=UR)mW?1x?K#8@-M!8m`-NHyb6Onej&32pal z*Dt*&Ke$NR2OH@eTpA2!0_IG7o*&&{t5C1D(l&!Qr=jT^zsuWw_(dkr%MCthXjREL z5&zW}c5BpTSuakR#f&2MdQ8`tk=*bZ8U>@%jwunT^(*+EcRrBoTo z9UwICp7QB5Hi&Af*4O*FZg}-2r_7I-7}u*A-I{<3O zZzqzq%8Z4-@AC5U5MOd12HP@zK5p`Z8J+;ynFwtEfB-}vXAmL;;ZeD%d&Op@zgyu0 z4fT0GJ^}K_+f!gwo!HWee%A}Hu>8~boi;)3H=+;MZL34DwNoLEmTe14zinFwXU#?; zVOQ> zqJ<`xH4o@NDEQvQv-3B(SYUEQLYrVyNw>{zX>IdlKf|>9HVUd6)_8sEx zX+)JH?pRgBp!l_R>qbk25;<{_LeA{^^L}Ga;TEkSYTBLA5ahv;W-OXBjuZ{fnwv+T zwB}Q?dhuZ;3zI1WmH&#Pj`SA)SHt(e(>X2u9@sYwtF>Ct! z#cvX5LBRxd8ogc=DwMvzdvMkUXm6f)cKXm0B%*&^iH=YhpI&q8(@|(&0m$kPSHg%>I+{48$4_K@8b zJ#<@Pn2G$zuA8~>|4Lm#Zx1Q_)X0vvKakQGsl3( zb<2IqmesVFrf?c1qx$Hcx^Oyi%yu683rSMRv{LM16Lyi+2a!c(pwBr+&(f}b_@WbP zT4cZR8}oazQcHfk20?EsR-&SUId{l9wY`0lumBD6(whw| z7;jWgr|DXg9r+!PTTl>nla(+YAk5kjxPNkacWBSTFHF3Kx~BRZs2iCEYFY?N>thMD zP3_Cke*gwR&H!7`t1Qwrl}^-@gJu{6GHWF}#TyxlWZHQH+jcK{ zlAh(+8EXkQ-Kq1vNLw3J=3njF1Kl(|Oi)2%fdHYj_N#wQu02?Ds6w#W*fZ0o&F36F zmeYvX;1HbW9ogG6NzfZ;_6oKl=f9C<*D4Wz3vD$Ud~3XgbB6lj!g z_&rd`mR)d3Up@O?UUE!%M^n8rZ*N)z^0jkd{p~#we#!273Bf-{f|RtA}eY6 zIup$Qev{76x6x(IDOMZ}g@ZMm9TE6w68eg+E){Z z0s*QNOJ7CM(D7?X&=Z?%@EPZPPUd{#XSH_f33!XEfng0+SXx12{FIU{cX)Vb32X@saFa%IVWd?_8=W+2)Zt3qWVGVuA)S3(m)7e}EaIUz;#T190? zKGwSAfXGcs3ib8CJ&Ku9VwdYr>9_KU#d>@OKA7r0YJ{YJPVrI^5`+!HF=}9F-@5s{?vr|vt}A!yLN zO?+}&%#zx#0CB>F1a>aJ3`R z@Lg>H-Z3KJtdH2^jGp-HKoy(_@H@b3Zylml7VUG<3ai?|33|Tq9WZv;x=S*R&1E4M zajkxG@xf_Y_Q#-lxWI9}JvD#YR((od^WPJ0-kD8XXbJ{lTwtJubiquX4W8CWTEm$}S0TSFLXbA4^?(VL^ z-7UyKfZ!I~AwX~$+$HGX?i$?Pb-t7P?tQQ7_tmGx}vgMbGNM#jf47RUVpdpuz)i3+@rzg6 z*$pRHkrKrI&ma3Cv94PRTvb(7PO`IwmP0ue%MF*UXRkzS7cq?&yL@W{z#=D6uWR7p zKUUcKXu=O@PVkF9L6gQTf!}R-`}Qpz$_?_@vT>UiRBuxS8vg9Zh=|LO;mB21UAlY-3@a}V%afuZB3}3C(W|zh z$bLP=<-R;WWvjW9ZRUXWr5lMlGe12~c)L?;zC`T|D}vQVyGj&9=)X(;?%m7Y4f92m zmJEe0YoP<#tWPM4{b5g^M0DAAxjX3wLy_a?aV4C6qNDDet$Pk`T(Q$7#y=WJIWY>l;Y&e;=CYzX8e@}Ip@M3IC7p_jANn0 zeqPv`U6u;uz6XpPk7w zNZ)y9_}lXZ6*U$Dp@2&iU8PmIS?fU|!NZAXd%|jK=OEzO`}FX{^a=y+c;N)b&-GHy zB&NSjXRHn2cAPi7C13Z(h~(un{|a1F!oh$hbrF7iiA%9Gt zJuYtmzdYrb55s1pSNe1%k0M7|*j_YaH`uL>thGM{buKsb1i-*AUJ~{_JX{tPwT4pV ztn`EmU23(RfzI}x)}exDFYR|#?#rsaV-5dVGnX44dLd`K@p6ot{RHjr68`No>KZ$a z(A&s>wP_`x9$39bX7+6sYWww$=#CCUV$gN9u;pH*!SQNqiVz6;bpO2WmmK>%Yvgjp zz*XU8bh6|Hl)k-#gM_jCmscEM^!~`3ti^w|>%Rgvvu|)c$?1B3Qlm^@9Gm}fKmT}f z`n8c<3D@WLcwGFgm>Jg?ch z%1F`=q#yR{X=CiYuqM6(`nP)82J?8L_V3!I86*92Z>7ylu`GwA^P+H+%Il6<2Wq+> ziL}@nu5>x|ePPmw&v19mcq8fQGQVA}Gb?22*7t5c&qO57w-b10a!E=6l;udqV zi+rA8Ii6T5$$lTHW=PhIU*M`8ql!u5e`p3{UZ(`&cM%b47GooC#UN*8i7G`W=R#zo z_>(W?Kq<8s@?s}RM^uoCGHx#+KvbxMGW~_C96Qg`L86neKn-QTurYYQ@Qba)L4E!$ zNY=6>n{*oEFyeX)D20RsTclVMcj>O9+?+QD{R?y%INGTUKs`uyOX3PnG_9Oeu}tT+ ztLr-xu^v~z^;d73>}UOt47sX!M!$8bYxY`O4_2=+JldXTrLB`9wpBgoO{|gK2q4ZZ z&L#Vl((jU*5rDF=f=^NQC!Wr_T&{k8nNV<5G22Ye$KvczNK46>7BeC*_F$hff2jpa z!Db>-i1(C;DyzR8I*aHuy%h#_k3Q!bR_?ZGuD-3Td3j;|_fNb+9brTX{1FE~2$f~H zf|LRX3p7!lbg1WldT-6>7m181ZKH3wxaw{(@3>g;x2?nR$cqu>nuPSfcl@izX0t=- z6WQMsaN8WtL{~|$6j?ZkbX)W;i+Z(MU1=^90@Bf+ASiazQ=t(1g6xv&=f&WX=+}VV z?wUy4jBj5KK6`5WB;ZnZp*b^6H~A&>ATUD(A9|mLIZU0E?~%u{&cA}aKzJ&{sr)KQ z;{?hmB_~A~y~8MYhw??%c7=XdC2JoPM%K1&g_QAG7JoG=y(w)psXzZVW6~Qe;a`B) z5adyu+vCX^F>3;(9!ilU3wausZ^y<~K_|CwZR!pyCXN+3YZohH$iwyh9tuPXj!c2d z23xDG&Uno6c^7;Y{p4}AMIzKYa?KtqbnzbgJifkLnBkyrVWgq)IuCth4MicA1kWyX zLUkyql-`{WX|>0byzGDWyZ?*IZr~TgGaq8T{c{tTbqw4DY5Q=zL5OoMo|*F zL84OHU8pf1W^KPYn!mz@p80P8@?Wlw%Or5+;+W0TQm3Q;&vJYsq8-%N^ScRlWC<1R zPGf-_|JVNqc-^!3d7dS8XH^_n7JY|%~2XvC6*j}KBL^rCb6SmAk|KL7fOYvtZW@Kxwk z63kHjY2~RNdjUcwHw9Cjuy~vyT^&X+hnjlXmr;1Kn_|}*v@El*7r1a{2!zZxEPz#=gW9*(hNiNZ1ZJ$7BZKz-u0(YE>Qe9?K^20wM~>wL6~_4cTDtAi&Zsw zp-R3kjq1p_N?DRKVTOqxju@D1khOi!C<04~|q5hI*rDO+46x{82CCO3N|xNsY5%HA*#LaN(&n8_FcuXA@F=q4ZMSq$ zoE1I`8TFq`4UFPck-t^{SY(A3Tk-)rvb>yh)^0OBP)|>hA!W2TX!~UFfZxUc-MrfX zrD+A7?3V%D(k6pX7rE>bJ$B{4g8#&*u@6)Zo8aLDr(w8oh6GkcQSzi}-ObM)xee5O zPc@W{Xeq>n@u?08kn^SP3%4v{b{dQ^caDIoJfK&h38jrPnAV9u+S+&t*$HV1J`sQZ z_(XEAe>a`dmxxehqVb~ww--AOGQ zsf|G=S$q!i$9$L1OM7zCjSSz;o>lG`{^f#whg$`jwdzW^YPbA=*y1( zw!xV<6;tzdJe)rYA@=~6ClpgEmUxSA{gqKk@WD)3r7am$VMdjpctx`I)arX%o0G4q z^KdsYdv4-q>G2=94!D?*Yz8DRfOB{3KUt<3>o~L#X&lR@{*%$m;ico2;Qaj|kk7UL zJi3k+*{7)`D5pY=)dZMO8d`Ay3_>002eL0IZSPD^@j^Bztjr~V&aeb)PifeLc6CRE zn~#%)A;3IMyCK}L?0tI}!*Fi{gM5C-k!Xc(zqD*=&LJSNc^@k73fa^)*~fUW*gP za`6;jLyTZX!Jlf+Y`o)B3GJMRjNzgU{y|1OlA6)#b%m!ydU>4eh|OStCDFr&zkC<1;IXDtr2 z58m=~UM$XpxbKrE6>>Zm@j^)i6g@~sfj-#<-a^`J>#ez4H~6r0T7<-B^Svow=z!Av zR+TOHPlyMK$lH*{>jXY-u~IIXGi@Y}N@W^#okrWREgwbJ7EqX}Qs&pyN@Ln!+C2l# z{(DnQB*$a(%M!vKJ$U6LyqaYi*BepEL; zmKQ^YxE~Xlp^?hV3z^X7+BHF@D5O7N+W(CvV^8$Uqefc6jb@Jy$>BIyA}jnw?b_j3 zgy}GGZ}>XOU1d;fu%CUTMx>7&M&}@crBT_$iZt9RwOAvxdK89R1F>=cCe8kr4o)!I zY|UQmO3sH;QxFe-2tAzo$f#RNaS?29)0B4f5g7Bbiw1uZ0&9lOLb)|pZeBN@PH((~ zVq!#SEdt5B*}vdK_GGD7?sqqCqFNM2JsLLF{n{DGNKeHCtTfvdLPMA&(7Jlco9s-T_0Opnvy-jIxl+bSo+s z9EPGj0&sr7MeKM~jli*+!`Mg;u12YC4FkrAY~0)fK&-;qLoCTXsjF*rr&^t;jPw8s&WuL8?i%_A`{kj#&byb8oOSp4<%d1!lfB>Lxzbxa5}~meqUDDhBY&9K zmrG~*;XK_k7O%XE$lq$s)*c2;t_n}Oqhle_1p9}Fo8zy?FkRz)k9=GH&@G{JDgS$_ zk+HFc`nBf!|5qX|L39irT2(veWDB|l?pCgzd9Db*-kq+})7QNwb7XptFD30V(9>7> z+@&3WA4E5@eNJ_5^kTC7I*Bq*ewqiHoT4?*vHG~7R&GtOHD%{Aq{N*NzY&f%n_48s zlF&=AHvp@aCASF{B!^oc4#bO6E=Q6Nb~WZnsE}nHP$Zm46hkjHGWiBKFWT|y5eg2z z&}Y*B>c<|j2?*ZuQL+ZRHalO7ZZYN7<6O7UbvfIWCT-$FDOeUe(Rq?>WO4}$zZ*td zcscl12cYn-Bs8YksViWlQP^y1Vog+_6(rsI{C!8>vN>E_+9Md{Kwu*qd#uKlf?I}+ zH7fYxQlR{0wsu>sY0vRgILw5XBtl6LD<|Nm5PJH4mC#i}q#hL-lOneC4LJ<& z{*-UHy1*(`zQ8nXF>^TjW6M4^CF?$(ziMJ@wzX;uI+KB*9TL6H09^x zW@^)Zgz#eZgaLf5+0QT%oNMSM8hue50V!1oQA#ybh^79n4Kq6xI*(`f?qa3!H|3_5C5eu8%yUF zPcXJ_yI%K`{ob)6kmFpEyWD<7_wXfx4A6-00PyzH{hucxyyu659-$rc8{%ZZxccG2 z%j3jG2!9%(SwAM4fQvKAex)j4Wo9P*I8n}g^P*r+5=+9{$6Ij`97^&^WAwDtzU{&T zP!s-4(g^jDv$s3kDC5N3e}ZvO$udUIv(8q=E3;Y`+Pv7FZclAZF0P&a{uOCBTOfWm zh!*jfLe7#`FBKpXJ^hsb3LfUhl6ii(C0hQ3q296xx%9oo2++$eE+_X=-;qOlI$Jw z)&3K7{OdKXNG#niJvn@L*>ZF)^vo^!1YZu6pt6;q7AL~cap2)HI**Ai0O^_0;qJg? zSdPuJB9F)S9`pYg_~wYQGfSLRtik7db);i%tD}`d19E$W0eDJdM*F4nQ%xy)WKq@O zY&0O8r=tzx1D9#xH)$7c+2EhX>oy~n(UksOQ&czaVjOb;>4041K(A;1T( zlT=?5X@BYg6ZYz}Pr{#8?Y)N}R<2(PW{qgX%n2x0vBUt;kdHhWwMSmE_h+V+Y^F zf!_Kmv!K5T`l7Rd%}!IGu{OB`K7yg+&WJQzy@gr^_&Y62tuk3g_?9LEtEo=Qqgvax zJD2MXQRi3^*oVOekRScVw33Ow2x8mL_WnNDF4V@1!ZL zypU|xuD=0=+3PDDVv4#^{6hk4T@+l1f-kiKFuw!C)*CvNO7*x}F;ua3sO5~dT#cF$uz%VwgFO*?_o9rhMf~3rkr$wHw`~I-< za2fsZj;AD;{0ikT98dIA{HXsik31OeGSj}mZ3Zh&Nq1w(%F4UG(_ zo%y7ci7VecW-90LL#&jw7RY9?7-aR^z#x3L5!>G78-stWaYn_qh3$h+lbwYkgEyRF(4< zoI~r21~Ao`v7`%ubgn=JDqBxKRr){NAfcjOgmATGD`brCy`HUgQu2kOknBERjhnjJ zA&H)K(_959GY(|ZuuXul4OGcMzN2n zITiGjBf!v^vB9_Ak%P#%(EU%mH3v3=w7#x7Vn+7ecis6{$=}^B8}?B__aG@M^g${6 zOHIx&1Y8cn8rbnAqC9Gqbm0*%ZR7wf;Xv$b`t#PdF*g*FMCPUfI-i{-sMxV5xRLnsYuVND=f$$@=Vj zVr#SohCYI|W(f!vzYW=zW3^sfIRB$b$Fho`$Q^qG{&$}KkUe0~R^vvI$^(#@_zI)F zS4|^snLo>GU=Fv{lMWR2b|Z+C%6S9no+-=ZzsD;u@gX4($t`8U7?f9@r29aYT%uNi zHEAM4KP;S#tEZdPt53d-u~k@v9%F1U_2CjQP9{kj;uBOQ?5DvtI(s{zmD=yp*sp7;wYSItj;i1QpAw6>1AWVaSaw`98H0FTK%Gf;|gnY z^SjoNlbM!sv5URFCdRZiU_9Ajnj=+`iQqcQJdKAp_LJHl_sL&WVT`Akb+2u2L2$T^z}# zC+#zv0?Cl~6r_V)o^hf5gI|=m+68RLdIlbF$x56zK}Y)s!#@vXO%8AZsYz2&STy?o zNGMQ~69&Xv*EDHUEN6&=KV6$AG+|@*xU2YV$rBlo0{tn69W;Wo+c{1g9Vt{@J~%yE zSLsqVB)AbrJQ~A(~hWyZnc0|3gAAPvlPUun{tYHg%B|PwZskAzBq`G`p6(N>RcO4se!aI0WU{~f`mCY zw~flB#{Zs&910TWFmNt7Qik3wqtOlD(z+eFlvvbQH$}RP_Eu$n)o--3gBav_Rz8u$ z1o`6_FRtg4Kt0d|!AWShLP$b_;S*lLAVf%e(rAqXt5K{M-o}e0$N}QVmSyocn2JGe z^umXh+;b7$e|T?)-Y9r#nmcHi-qlGkY8QguE~oNj49)dgd2Uw85O#v*3rgK#OWx!2 zXAU#93T^ChMIDKb+m+!3gCe^-**5kHbg&)SLj?1jKRh*0`GM}on@*aBeeFC>=Y!WA zjTfcVg%&q?Y+#$|`oC-ZYHUn_UM2N6$RZ*}w(Zt;_Rn0iOQDc#3~YQEkymn^9_6|q z=zM^y?AWDMEg_E;d_+|IQLH(>?k3pkaq?FWdhMT4>2#h+$70ICnZWIP1Jd#S58i7(XFR8D`-U8b4`lk1+BXEsMhr9`}88CFFJcmUarXq>I%+ zfe76$l2_!M+U>`57JLvA>SAbIljqH{aB~A9`P$PEnOc56ok3F?PRjdolB$3)u9a_F z$ZZFsor841(_f@wHk%j=RB6I)7Cp3#qAXdMx&Htf6POj(@%eYUTjAj!A0HpTjoKQG zqLSQyPBy>j#Z;P_UF|C~0`Ya;rfbz2_rRS(Pdm?}9gk7)N+>BQsc{fi{GROFPTj%A zz?T58`;b6y9Z?%j#!Hr(UmuTv;xv@_QD*t5?UAD~C*f@5zvV2q-gynzN>{f3!ztoP ze*_w1%X3I=M^|@3tl-3@Wl&HM|I=~pp8DB3&@%&2Ej|f}k;<9;1P&Oh72ug_J z)IV|>O0!PO<@tPIn3jTuWdCA{`z}mI@C9fv_p9|XX=*n%Rd%UxVX~?^n1)NE>=%AN zCCKw9d|A#hq{Ow5{cyu*#mG2V`5w@lj1TH!j&B2-h_HF}p~myv$rH%Erv@;0{BA#I zFPLR||IV>8lHfiQUz#CfIflNBHQ5-}gIuDQGbR!C@Q=vbVpMO{l>W$jh+>e^+ORXC?s?`yaTaiJ{q&bK(Gk(2KcCq%pJ{`Z8 zHX%l&uUokdb+pH&L)#$2a+NFJWP&60qxZl&WIxHzfChPWzv-6@7BVKpx&83Qjj+{9 zxf}TR3nPH_>hWKPV!+GUFN zeJK44JPRuz+QW)AasXj)j0kAB86c-F<_Qaa|NKsm>;r$+2(gwA( z^yymGr$y+5#wo?eFPcT~375NcO*|VQUiGbRw68g1FLpOb*(lw6KD-_EEmXGcLZfJ) zqTmbt_1t~FiIjR|9YObbg6vxN{|fd0$02rqI}`E^0zV&+v`;vchqu#hJICSsA&`d!;GSq}HKp&q7>O>&#j*(e9!3NkgogNmA{85>gkF|D z*mmwG7P15|g&F)Uui7&cNA4Fji@Lp+Q9HA|T9N*csSYI&xT!-~`bkWM9gMKRS#6If z24?lYmiet6U-{~8RsB9(y?yQD+s!FirRvqT1+7IO(&$2T*3cdg)m6po^x$pE*pJ zV%yufI#CfKNa$LP;RPJ(Jr~76H{RxD^k^jVanaUIrQ)aOZ0eV645sxjgE%rGGJh)&qo)L={yC8$q0OOtb~0Li>|WxY(_ z>Uxatug4O$T#2z=M}K94;}2whDnJIaw8al^*1o9l2qqR z-*wstSB<{~xn)IorA6~%vx!qDeeni<*VPCZ{hvz@t$g$9`W;4XWUYbpK+gOR4wRwx zAvC@{>eVU;n@Rgh`Rc_gOKTSF-LJZU^3xzml&1|$ZQ#m{BBSs*V`4&quL`qaT^8l+ zPJQ1Jlv!e?O6PqzJAneaut^-VL^x5stPECN=$oe0FW^r%T^Q)l>Glf%PUJg3u(2qYOjF!*z0m>@x~y~)2;K}swcQ~zU1-b zuYRBgor->HH#@Sp$Th7UEOUe_cSE%GOtE^zhwiDP7F8O67_SyDHReZ{cXuWvn0K$D zhha$mrJY)&I=0n<()9l0wyHDwyz~C*CF`5`m%ZwPN51`aKcd=D;=a-(WfRu+qo=s- z+o!v%kJKz_r*ZV}h)4D5lT09^j+S=Q!C`rBlJhQv1Zv>Fyqsbgk3qkwK4=$4mk*}4 zqzK0Y62lg8p|bv2(qGbE5o+;D&M`$i$W=Q?AYiL^S*!oQ%yy6fIk?5 z(exr6F%WK9sNHCq`Y`xhQ?GdmiSSi!cbI2xhLIaw-12Foo$pd;A0aXl7XIZ)KfH1Q zYd3v?(e(Mn!Zkpd=_|JWKJg%{(1D7PT&br=PsUT4P{+U^Of5i+nESDgPY8#E7b&Xt zb;;0<5M@zeYvJ!J<|0vs^Sy%sSySFBs8sF)tw!?$>rM@db<)bKbwn-2fAoW*^U83| zRQ=~I#H>Nq+u3+()38kVN20I${Iy9Kg-1^Nf7#*vJfg&&TnQg{SY)qw?1sq^M9`Y| z8(J5fSA(x_04xmIVox^gL-{i22Za(@?W_v5rgJNMVv{^2_7z52Lke0l z`q$i$AKzDUzCQQz|HjrY@iThv1?S8h&+)hHCU*C3zZ-HwST4%pV@9S42DAwBL|IZl z-@|cT{|Q8)NT?otVK&O=%lg{Hg$$c@Djx_uK&=r8eBi>Ih$3NTu5vkRo%{Ed0Q?rV zkLPrO660Vek_~egYMqlrr1JxTFG+uZLcLsBl_&9o!$f#*SK~p5l^8(W;3@TC0R&H6 ze99Uw>dDRi5$X;O&8)osum~`9m3~aq^vde+bK&E0FBU-FV7!2|I~?}3zt)y#5b_@k z8sE$Gn!R+U(|<+~{izMSOk6}*ja-(a)_7HQ6zLk+P4@3So&^F^R$TRQ^#hwnuX_ab z8(ooB>zwtu77&F+6DAc}yZq>Q+Sd2)-T5HtLmT8}B%##ZkAm@W+jiPTI`X;?i%73& z4We{HS~Vnstx0GvE+Y4ek|*~r_r#Jfx8nj)K-&42HgMH3g!5C6=Igz5LsQPbF_gKX zy;-z+lKSRP-ABP^staSXp6`-#4EO}a#~T+{JTSUOkMGX{_P^aPUhF9J82sL{30eV8 zX~}ELP?yNWQaT7t>GZJ!du^xg^Z##$@=J1_yL-N=R)y+9oVlI;zWHYXnj;jdh~9a{ z*V%)q#9v*ymUgVws(LIxz1(}_$ZvWipw$EfNAo!S{Zs0lWeD&Ya)32}$eZDb zNt1s)-`nC{6lF$6<+9{zc^Dl{n9?2fQbd(RCn9hx7{7GH9!>=-yibk0A$V&cEbj+B z-9m#A>>k-LZNY;Kj?ys@aThg2)=-j4_e z`Qdr3{OPiiJhsg3janvuNaT0h#7Wy>IweJT%>rQ$Gq(D81u`P3Ni%sMDO6jfGRgh@ z`=|(jm-U=TX!IeMtJgODYKn^K;|lcQ0f?1be|aa^k_+mTMTEcpZIdKgx1cXz(BsMu zpQkeyc+yqvE573*T3G0*7BI{)Vkp^MI%UnO(x*ErW&wB4&s4xQJA$}?{`{zEAVQvu z!1SNAnUOG8x4fcwTHx?OlkNyO!2u^y{-BJfQ~_qW8YUU{(jVrFRxH>e7?Wlnd#WZk z5n>#2X<6f`;XpbCO`^s%--~6Xor8Z+2atZ1c_+{=1B4Q?80gPaEGPV^3Eyh5DwX%E z5iaMG?9i3~r}wITN~d)-G0AR^eg0nZqQsh#K`|+Sw*m`cO(pS%YtN*LsLYMFYrA&A zh>-MZ_>rk9Lx)glyrnLW&wF;YZj7qC>*N<2h z6Jm@P4IQ_u6xJ2-j58($0euY6RHrd98kN~-ix?>vC}!x-jlw|#;MRS0FeKi;#ToV% z%Te<;+G3Mn(jotrTY)pztp7hD*fO9?a%)iyDfTV#Wx#w|%yDt3*(!hl2 zxL@{Z&U%*3lS1gl)u`mI1pEa-R88pRo~w5KI3{==A;*9&Lxr!ym%H&fYbSqIux$bl zTD5ZM@Z(H-fyCd4;E_$9K{GvD!p(tCFm!8f%&VTQagp!$te=(`U%O2}@>zkVl}FBt z=T~(H2no~xE4e+@=WM-d1;I8Ps(ZH_)3JiRwby!PJ#6?-|JsEZ(0c04m!j|DJS;@O z>F^c$Y6(n*{@+ua)0y%5S->*BGw2I}mb?iuuUptZuEP`(vo~JCu?Y-lF#5ml`F8+k zc%{ApgU2}k6_S>r7exk_qhS6~w#*9P6XLu5g+xaKtah{9)%^ZH69f#|?}aru;>GmP z$niN=W1G3dx47}Vv6pX)GYsY>W=)!6BDb`gDqC$X=iLnmm;0UDP!%a;`fKEYWRiF@ zyXEe_G7QZbym)fJ%qPY$uZCH|#_7x8nu=s2at$yW>UoZfH#?WuWr?x#Kp4E}EL)42 zxT{#@bV;oSf6MIYOJZS-ZUFw8RwQY(fD}l|+H`<16|@&X_e%@OTe23*Vu(6joFk{F~m&zoIUU!bkx0Z2uV&ll3c%${VthN$S%_ zmq?hzKzKNy$f_C@r&O%S1CTb04TdGBivMW=%+U2e9RojT>6)+-y^$Ph=BjFVwMGC9 z9K5DtagVeSLEQ$}4ge}dld}P|aU+CTmcXdj6%_(-C%~_iD!`Dl7{_f2L=#miQc(-*bgZm?wo9pEwzW0-WzZysefE%9&-vPynHh+Wgd<)|blXmY(r=R5Lt2L9Vw0Wn$ zEKEN%MDG8eSuVVmuis57!{!o%s|*rNCw^mk24VQL3CDc-l;93aboW;um#iN1fFn4F$Do2S$ju4uyZal=IxLI%KTx< zwT!Qa1B7{$2}JS;nHE%Z@SkN^WJ;oH~6T@ zu)gAeemOtq9C^5MD{zZ*1i94HfPY=nEl<`t07csR)Mxwim3JCR}J!dZ-_Wu;0+uZ}Jx!7W~X9&=jbBS<|04zUcKk*2Slw zoMzj+!!dmP<7}lya+P4Hk)%`qj&|3*HKZpw`F9JHc&8@nglbB3tD{4OgTU=ife*P} zQTDCV^FLJ;KkrU+xGxNm8=dY!)jzf^akk?nm*J(WW9D9UeQirAOI*_&P{ohrX!mjw zNqQp1^Kl224_(KY2k~(OD*OmC<2`rqJKls}>cx}m8KTMLtZCdmK{|@ZITl}!-ZYEV zQonqR2pRMRaN)ElQjtkBMx$Ky@{N9hPiyhEY^+lXH)e6!?gsKi*%DO-z@Sg;qc$3~ zmfQYZDlfO(ofVF;iWE)yZ+-Myn?QQ9kAW%dmD<4gI9^f#YLOh|j`YL3Bwu7Yt^Vu^ zlaB~|4u)g&dDN`H4qUlIs($p*Ku24btB^k5s=EtuNkS+el5${KFECMm2joAG0#!u`K5`IavGhgihlUY znXhweJgS~P)PXwLY#d=FMEt5-k~&2iT4JQ9LifbpS0(=WXnIzXMhR59Y?h_Cn9}3g zGXoKfM-*L6mc=0ZuRE=j%O5>$JCiHJ+@$)^1)%>oVT}kwh%>c>DE0 zNZYTyqAL1?=8JavZ2mBnviAZ$Jy!xv+Q|WV{qJP=EzsV-RY_!y)>S?^qKK9tmywK5 zB(>gdVQjEB)`6RSz~qieq0c7p4{6@=VYyZ-`*1+87M4DsO2?2n^}L4}Q93EmfczfT zNd!%qgW?zK*mcna9h_tq%6y92>PH*wtcP&^BM$}@vj13rBm#*Zdk@V|AfHn?^NO)} zb&dEo(#5Z4UOhGDLFU6>2~hA>I63PsSzlRp)a@1X< zb}ekdMtRD8*R*9QDOJ~Kw(NN6XdNfHTTQueSi8G4*OV#P@f({QEFNe=@4T1j9i4gF zIU{KKJU|nx9RuNY8nsgr)Frg_?GP<8&d0aO@xAVo()5X+%pXuAfNh^w(#`1Bjv@Up zm?WRs5R^SVn53YaVQ*o`EHiQ8M2|av%j|}I{JjEE<5CT_{08TtnlOOiYdsOWL2koZ zgjq3B&aW+%H2NuRhhMg|TcMB=!DWu~AAfZ2TqWT)$6oA#d*g%OkfxW0%UH5y7%I_-Kh5SBY5BUjS zpQs~77R=sO6ss95{wb|^7pMOePGBTiz&xANMK^#2ap~n73S4p4XToLgj>*Xmr<0Rz z3A8J1=akXeHB>VubS}Ry`%M?u{#iO?YPc{uC;Ta*GvdT&Y650ILrZl^N6W+Pq(A;Q zWGLA1;jqt|69~;rtFS6Cmr z7e6Q1AeHH;dh6j;)+au=oqLr5s%e4jLA+~5@_LU*@wY|vBiarfT;?KOCs+SitNyX} z==YOOI43e!xRad3z^*Rf*0T`eQ9NhaJw?3h`DQl+{&gSeY>Pb zC9`MDmt`pe%&G0%(~mt|R*e0K$z8K3^V`?2;`lpzq?dhsbnZl0XIOg33#WHeDaEqP zUo8NR{J($vS!QXSTHovIIUG7)ZsP)jmEcc2GJveC=&QYPBWpE}o#%(E6^~{6y5*F+ z*O3?1ve~AW+hr+)bW1aSgWiCdmpp5@f}!__Oy2h7pryVu3#e`d9DyyaHAks-MT-;D z8E5vH2h7B0(p+n}hwi^ZOJOiA7L|B1!tjC?m0_lOO^WbktG{N;C(9kt-xFu=N$Mny zeme0Wnm=%ZEC~?|Tb3{iIS;<@&jNmu^mOGyj|Oduk+V|7zZ<5=wK%JmgLVo~4Y(ke z2RDWd$G}fG?kBYpZb=14Dz|c1>GJlF%3nWaufuch`g*vA9oAML{j^BC<9q_)O>>Qi ztF2zTi-R*ltGSwyEvx&tw)sL<12Xd8ta`nr%k7V^E}<7NJEygiB+9UU-!;xADs{1_ zE~ORVTg?+v%$}2QMw6t+bZmIJV<3mJ(FeHld2YVt$w9iD%yMv=!*3NtSh1@>L-2IP z(tqtzUXUYYc|v)z;g>DF@&ojzXh?`*hQ$uVyC4yzH$%RO^WeFNOrOt#%OrKB>tlSS#gr>yL}snEZ>oM-0J={B(SJo|(E z(LN`ykOg!sAs|%doxQTqWyq|~cnH!dE57uwV7N}|iD}F?d=?~Ubqe}9f$ULt;7>ZV z7QNid*=q{B3eIgO`h&ds)sk6jL{PB~_e3^1;R<8;{pU!voereAq(hJX4(*P6vuns_ z_u;Oacf{>YFAy@5#VeS@)hlX?X$Hso$01t|#N``j{+!vR+cVBcR~1czmDp4soRlp~ zQwQGWpG$%bMs_53B+Ip`_BXq)3##=@uF9E_Rz=*naU!nxKNg@>QGIo{COYE!klzA9 z$3I@{anL~-ne(JVVdQMITY?Fky-%{@D_UUg`kzY{%Aj;1M_&BJ_!S}Mg&diwY@$BD z1&|PuE?7n8HmAWu#w3S)IG=3H8S6=EanFZh&D2__aMMshuXWg3sRsI6V6b}XR*XMI zWRI&^()vlL`E;|%`ijWyR%)X;ak1=R$Xo?=XyE_-;RRc2>@po^cOg`@vKs z;>_D>%h&e+6FFuU&>M|Orz{kU%7v7RNBKX_ykfO>o?;ptDDBsf4ilU(@;nSNK953q?#G|pVhf#cCsI(MA>t1=B&0fjM_X%dH~jfrEGjU@ z*5|#Sv~}tCRhNmYPqRC`7G0!ToQt}p#yCh(fr=fO`5kM$wV-~B;RS}!@F47WLPOVC zoi^!IB-;J-c*QLktB7_sDj_GD1fvrZNJ&F(;fl+J)sq%3#z^ykTB_cA=g=j{muJ3K zZF<%)V_~dY^3CI2UfptgsUjb<7NZ;RLT)#ysnIvJF-9smB@O;6&05D#8%oPblmnOU2$qx z+sH5m8gb~S2O2wuXy5GeL~C~@wS{7BQVBaw;Ro?2Lk~?f%YmeF@3V&{dRdA{&&}I@ z6H7P;BaiAfdn2$vIHP^}B;QhuuqnE82;)%Qb7YM$_{l$b#C$S)L6K#+N$Ye;ZAOET z>DN~qtN4}H(2HGLRF}JhS>WX4&L36AwwsrVCwEima^a6C4B7eiLp=U>OX2w?CcL+f zD{#L2S*-VFf?=p+O8vwj($bvtvp?G2wf$F$2JZTq4l{?F#6d03*ihuKQYDw_GLzOa z=uUCX_eA8>k1QR$1xr5`J9#*y23fQ

$la#9%pcoM_LHP%|x9T8sNk-GKXq3kjCy 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�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�(?|TfNwz_(%WI74H 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 YN6H-}t@QW#@?W6#u9xe+zxnI`0E<|z)c^nh literal 42252 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 RC}1uBf{CSZ$vJey{{uJWMqU5_ diff --git a/patches/dwm/0001-uselessgaps.patch b/patches/dwm/0001-uselessgaps.patch new file mode 100644 index 00000000000..d9cacbecb6d --- /dev/null +++ b/patches/dwm/0001-uselessgaps.patch @@ -0,0 +1,81 @@ +From 58a5ece9406ca6c90dc362617c065e4aac19417f Mon Sep 17 00:00:00 2001 +From: Cyril Cressent +Date: Wed, 3 Jul 2019 21:33:45 -0700 +Subject: [PATCH] Port the uselessgap patch to 6.2 + +--- + config.def.h | 1 + + dwm.c | 36 ++++++++++++++++++++++++++++++------ + 2 files changed, 31 insertions(+), 6 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..b11471d 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -2,6 +2,7 @@ + + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ ++static const unsigned int gappx = 6; /* gaps between windows */ + static const unsigned int snap = 32; /* snap pixel */ + static const int showbar = 1; /* 0 means no bar */ + static const int topbar = 1; /* 0 means bottom bar */ +diff --git a/dwm.c b/dwm.c +index 4465af1..4545e05 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -52,8 +52,8 @@ + #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) + #define LENGTH(X) (sizeof X / sizeof X[0]) + #define MOUSEMASK (BUTTONMASK|PointerMotionMask) +-#define WIDTH(X) ((X)->w + 2 * (X)->bw) +-#define HEIGHT(X) ((X)->h + 2 * (X)->bw) ++#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx) ++#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx) + #define TAGMASK ((1 << LENGTH(tags)) - 1) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + +@@ -1276,12 +1276,36 @@ void + resizeclient(Client *c, int x, int y, int w, int h) + { + XWindowChanges wc; ++ unsigned int n; ++ unsigned int gapoffset; ++ unsigned int gapincr; ++ Client *nbc; + +- c->oldx = c->x; c->x = wc.x = x; +- c->oldy = c->y; c->y = wc.y = y; +- c->oldw = c->w; c->w = wc.width = w; +- c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; ++ ++ /* Get number of clients for the selected monitor */ ++ for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++); ++ ++ /* Do nothing if layout is floating */ ++ if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { ++ gapincr = gapoffset = 0; ++ } else { ++ /* Remove border and gap if layout is monocle or only one client */ ++ if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) { ++ gapoffset = 0; ++ gapincr = -2 * borderpx; ++ wc.border_width = 0; ++ } else { ++ gapoffset = gappx; ++ gapincr = 2 * gappx; ++ } ++ } ++ ++ c->oldx = c->x; c->x = wc.x = x + gapoffset; ++ c->oldy = c->y; c->y = wc.y = y + gapoffset; ++ c->oldw = c->w; c->w = wc.width = w - gapincr; ++ c->oldh = c->h; c->h = wc.height = h - gapincr; ++ + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +-- +2.22.0 + diff --git a/patches/dwm/dwm.patch b/patches/dwm/dwm.patch index 9011d0e6040..64e1887b23d 100644 --- a/patches/dwm/dwm.patch +++ b/patches/dwm/dwm.patch @@ -1,17 +1,45 @@ -From f0efc438a6fe55e4e99e1de9c71b0bd6fe55aa1c Mon Sep 17 00:00:00 2001 +From 21113e6d56c83249371b8f57a9cd3128df2f2436 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sat, 4 Feb 2023 14:49:42 +1100 +Date: Wed, 29 Mar 2023 12:17:14 +1100 Subject: [PATCH] --- - config.def.h | 4 ++-- - config.mk | 4 ++-- - 2 files changed, 4 insertions(+), 4 deletions(-) + config.def.h | 22 +++++++++++----------- + config.mk | 4 ++-- + 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/config.def.h b/config.def.h -index 9efa774..0d8130f 100644 +index 9efa774..1be6069 100644 --- a/config.def.h +++ b/config.def.h +@@ -4,18 +4,18 @@ + static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ + static const int showbar = 1; /* 0 means no bar */ +-static const int topbar = 1; /* 0 means bottom bar */ ++static const int topbar = 0; /* 0 means bottom bar */ + static const char *fonts[] = { "monospace:size=10" }; + static const char dmenufont[] = "monospace:size=10"; +-static const char col_gray1[] = "#222222"; +-static const char col_gray2[] = "#444444"; +-static const char col_gray3[] = "#bbbbbb"; +-static const char col_gray4[] = "#eeeeee"; +-static const char col_cyan[] = "#005577"; ++static const char col_gray1[] = "#2e3440"; ++static const char col_gray2[] = "#434c5e"; ++static const char col_gray3[] = "#e5e9f0"; ++static const char col_gray4[] = "#d8dee9"; ++static const char col_cyan[] = "#88c0d0"; + static const char *colors[][3] = { +- /* fg bg border */ +- [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, +- [SchemeSel] = { col_gray4, col_cyan, col_cyan }, ++ /* fg bg border */ ++ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, ++ [SchemeSel] = { col_gray1, col_cyan, col_cyan }, + }; + + /* tagging */ @@ -57,8 +57,8 @@ static const Layout layouts[] = { /* commands */ @@ -24,7 +52,7 @@ index 9efa774..0d8130f 100644 static const Key keys[] = { /* modifier key function argument */ diff --git a/config.mk b/config.mk -index ef8acf7..3d7341e 100644 +index ba64d3d..d360492 100644 --- a/config.mk +++ b/config.mk @@ -11,8 +11,8 @@ X11INC = /usr/X11R6/include @@ -39,5 +67,5 @@ index ef8acf7..3d7341e 100644 # freetype FREETYPELIBS = -lfontconfig -lXft -- -2.39.1 +2.39.2 From 3b581ecf9e25756bb0a55fb3af9a57663038917d Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 31 Mar 2023 19:57:09 +1100 Subject: [PATCH 164/368] kernel: remove the `syslog` feature for `trace` syscall ```rust /// Enables syscall tracer for this process/thread. /// /// When the tracer is enabled for a process, it also applies to any child processes spawned by the /// process. pub fn trace() -> Result { /* ... */ } ``` The trace system call has the same functionality as the old `syslog` feature, but now it can be enabled per task. This commit also introduces the `systrace` command which you can run to get the system call trace for a process. Though currently, the systrace is printed in the kernel. Maybe in the future we might want to implement this via `ptrace()` or return the logs to the user? Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 61 +++++++++++++++++++------- patches/mlibc/mlibc.patch | 59 +++++++++---------------- src/aero_kernel/Cargo.toml | 1 - src/aero_kernel/src/fs/block/mod.rs | 4 ++ src/aero_kernel/src/fs/ext2/mod.rs | 1 + src/aero_kernel/src/syscall/mod.rs | 3 +- src/aero_kernel/src/syscall/process.rs | 10 +++++ src/aero_kernel/src/userland/task.rs | 18 ++++++++ src/aero_proc/src/syscall.rs | 19 +++++--- src/aero_syscall/src/consts.rs | 1 + userland/Cargo.lock | 7 +++ userland/apps/systrace/Cargo.toml | 7 +++ userland/apps/systrace/src/main.rs | 16 +++++++ 13 files changed, 144 insertions(+), 63 deletions(-) create mode 100644 userland/apps/systrace/Cargo.toml create mode 100644 userland/apps/systrace/src/main.rs diff --git a/bootstrap.yml b/bootstrap.yml index b6eb4fa2511..b6e87952532 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -47,13 +47,6 @@ sources: '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', '@THIS_SOURCE_DIR@/mpfr-3.1.6/config.sub'] - # This repository contains several precompiled freestanding libgcc.a libraries, - # for different architectural targets. - - name: libgcc-binaries - subdir: 'bundled' - git: 'https://github.com/mintsuki/libgcc-binaries.git' - branch: 'trunk' - - name: mlibc subdir: 'bundled' git: 'https://github.com/managarm/mlibc' @@ -447,6 +440,51 @@ tools: - args: ['make', '-j@PARALLELISM@', 'all-target-libstdc++-v3'] install: - args: ['make', 'install-strip-target-libstdc++-v3'] + + - name: bootstrap-host-gcc + from_source: gcc + tools_required: + - tool: host-binutils + recursive: true + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--prefix=@PREFIX@' + - '--target=x86_64-aero' + - '--with-sysroot=@SYSROOT_DIR@' + - '--enable-languages=c,c++' + - '--disable-multilib' + - '--disable-shared' + - '--enable-initfini-array' + # -g blows up GCC's binary size. + - 'CFLAGS=-O2' + - 'CXXFLAGS=-O2' + stages: + - name: compiler + pkgs_required: + - mlibc-headers + compile: + # GCC complains if the include directory is non-existant. + - args: ['mkdir', '-p', '@SYSROOT_DIR@/usr/include'] + - args: ['make', '-j@PARALLELISM@', 'inhibit_libc=true', 'all-gcc'] + install: + - args: ['make', 'install-gcc'] + # GCC does *not* look for target-prefixed LD/AS. + # Instead, it searches a list of prefix directories. Link AS/LD to make it happy. + - args: ['mkdir', '-p', '@PREFIX@/x86_64-aero/bin'] + - args: ['ln', '-sf', '../../../cross-binutils/x86_64-aero/bin/as', + '@PREFIX@/x86_64-aero/bin/as'] + - args: ['ln', '-sf', '../../../cross-binutils/x86_64-aero/bin/ld', + '@PREFIX@/x86_64-aero/bin/ld'] + + - name: libgcc + tools_required: + - tool: bootstrap-host-gcc + stage_dependencies: [compiler] + compile: + - args: ['make', '-j@PARALLELISM@', 'inhibit_libc=true', 'all-target-libgcc'] + install: + - args: ['make', 'install-target-libgcc'] - name: host-llvm from_source: llvm @@ -820,9 +858,7 @@ packages: - name: mlibc from_source: mlibc tools_required: - - tool: host-gcc - stage_dependencies: [compiler] - sources_required: ['libgcc-binaries'] + - bootstrap-host-gcc implict_package: true pkgs_required: - mlibc-headers @@ -840,11 +876,6 @@ packages: - '-Dbuildtype=debug' - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' - '@THIS_SOURCE_DIR@' - environ: - # mlibc requires libgcc to build so simply force link mlibc against - # prebuilt libgcc-binaries; the alternative is to build GCC twice (which - # is a tedious task). - LDFLAGS: '-Wl,@THIS_SOURCE_DIR@/../libgcc-binaries/libgcc-x86_64.a' build: - args: ['ninja'] - args: ['ninja', 'install'] diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index dfcd99edf48..8fd27ffd765 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,16 +1,16 @@ -From 8b458716d4a65d2da069678130c32c30395fed89 Mon Sep 17 00:00:00 2001 +From e2f45d46f3b5bf3ffed794dce944913c5adea918 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Tue, 28 Mar 2023 17:15:29 +1100 +Date: Thu, 30 Mar 2023 18:06:10 +1100 Subject: [PATCH] --- .gitignore | 2 ++ - meson.build | 32 ++++++++++++++++----------- - options/ansi/generic/stdlib-stubs.cpp | 6 +++-- + meson.build | 6 +++--- + options/ansi/generic/stdlib-stubs.cpp | 6 ++++-- options/glibc/generic/execinfo.cpp | 5 +++-- options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++ - 6 files changed, 54 insertions(+), 18 deletions(-) + sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++++++ + 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index fdd60a0..9f811f4 100644 @@ -23,44 +23,27 @@ index fdd60a0..9f811f4 100644 +# clangd cache files: +.cache diff --git a/meson.build b/meson.build -index 2261926..92b936d 100644 +index 2261926..b7078fb 100644 --- a/meson.build +++ b/meson.build -@@ -315,19 +315,25 @@ subdir('options/bsd') - rtlib_deps = [] +@@ -316,10 +316,10 @@ rtlib_deps = [] if not headers_only -- libgcc = meson.get_compiler('c').find_library('gcc', required: false) + libgcc = meson.get_compiler('c').find_library('gcc', required: false) - -- compiler_rt_name = 'libclang_rt.builtins-' + host_machine.cpu_family() -- compiler_rt = meson.get_compiler('c').find_library(compiler_rt_name, required: false) -- -- if libgcc.found() -- rtlib_deps += libgcc -- elif compiler_rt.found() -- rtlib_deps += compiler_rt -- else -- error('neither libgcc nor ' + compiler_rt_name + ' was found') -- endif ++ + compiler_rt_name = 'libclang_rt.builtins-' + host_machine.cpu_family() + compiler_rt = meson.get_compiler('c').find_library(compiler_rt_name, required: false) - -+ # XXX: for Aero and Lyre, we force link mlibc against prebuilt -+ # libgcc-binaries; the alternative is to build GCC twice (which -+ # is a tedious task). -+ # -+ # TODO: maybe upstream this by having a libgcc path option. + -+ # libgcc = meson.get_compiler('c').find_library('gcc', required: false) -+ # -+ # compiler_rt_name = 'libclang_rt.builtins-' + host_machine.cpu_family() -+ # compiler_rt = meson.get_compiler('c').find_library(compiler_rt_name, required: false) -+ # -+ # if libgcc.found() -+ # rtlib_deps += libgcc -+ # elif compiler_rt.found() -+ # rtlib_deps += compiler_rt -+ # else -+ # error('neither libgcc nor ' + compiler_rt_name + ' was found') -+ # endif + if libgcc.found() + rtlib_deps += libgcc + elif compiler_rt.found() +@@ -327,7 +327,7 @@ if not headers_only + else + error('neither libgcc nor ' + compiler_rt_name + ' was found') + endif +- + ld_cpp_args = [ '-fvisibility=hidden', @@ -155,5 +138,5 @@ index c730bff..39cacb4 100644 +} } // namespace mlibc -- -2.39.2 +2.40.0 diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index d64382eaddc..c51cb714630 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -17,7 +17,6 @@ ci = [] # kernel memory leaks in a way similar to a tracing # garbage collector. kmemleak = [] -syslog = [] default = ["round-robin"] diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 02f4ff9984e..a475f1b66ae 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -219,6 +219,8 @@ pub trait CachedAccess: BlockDeviceInterface { let data = &page.data_mut()[page_offset..page_offset + size]; dest[loc..loc + size].copy_from_slice(data); + core::mem::forget(page); + loc += size; offset = align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; } @@ -246,6 +248,8 @@ pub trait CachedAccess: BlockDeviceInterface { &buffer[loc..loc + size], ); + page.mark_dirty(); + loc += size; offset = align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; } diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index a1b6a09c5bf..ef4eba5e756 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -547,6 +547,7 @@ impl INodeInterface for INode { assert!(!flags.contains(MMapFlags::MAP_SHARED)); let private_cp: PhysFrame = FRAME_ALLOCATOR.allocate_frame().unwrap(); + private_cp.as_slice_mut().fill(0); let buffer = &mut private_cp.as_slice_mut()[..size]; self.read_at(offset, buffer)?; diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index b240cfd3151..75c22003951 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -155,7 +155,6 @@ pub fn exec_args_from_slice(args: usize, size: usize) -> ExecArgs { ExecArgs { inner: result } } -#[cfg(feature = "syslog")] pub(super) struct SysLog { name: &'static str, /// The result of the syscall. @@ -164,7 +163,6 @@ pub(super) struct SysLog { args: Vec, } -#[cfg(feature = "syslog")] impl SysLog { pub fn new(name: &'static str) -> Self { Self { @@ -250,6 +248,7 @@ pub fn generic_do_syscall( SYS_CLONE => process::clone(b, c), SYS_KILL => process::kill(b, c), SYS_BACKTRACE => process::backtrace(), + SYS_TRACE => process::trace(), SYS_READ => fs::read(b, c, d), SYS_OPEN => fs::open(b, c, d, e), diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index d59a919ba9e..ab321930a54 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -233,6 +233,16 @@ pub fn backtrace() -> Result { Ok(0) } +/// Enables syscall tracer for this process/thread. +/// +/// When the tracer is enabled for a process, it also applies to any child processes spawned by the +/// process. +#[syscall] +pub fn trace() -> Result { + scheduler::get_scheduler().current_task().enable_systrace(); + Ok(0) +} + #[syscall] pub fn getpid() -> Result { Ok(scheduler::get_scheduler().current_task().pid().as_usize()) diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index e86f110111d..0dc73b75d75 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -209,6 +209,8 @@ pub struct Task { cwd: RwLock>, pub(super) exit_status: AtomicIsize, + + systrace: AtomicBool, } impl Task { @@ -248,6 +250,8 @@ impl Task { signals: Signals::new(), cwd: RwLock::new(None), + + systrace: AtomicBool::new(false), }) } @@ -285,6 +289,8 @@ impl Task { signals: Signals::new(), cwd: RwLock::new(None), + + systrace: AtomicBool::new(false), }) } @@ -318,6 +324,8 @@ impl Task { cwd: RwLock::new(Some(self.cwd.read().as_ref().unwrap().fork())), signals: Signals::new(), + + systrace: AtomicBool::new(self.systrace()), }); self.add_child(this.clone()); @@ -375,6 +383,8 @@ impl Task { cwd: RwLock::new(Some(self.cwd.read().as_ref().unwrap().fork())), signals: Signals::new(), + + systrace: AtomicBool::new(self.process_leader().systrace()), }); self.add_child(this.clone()); @@ -632,6 +642,14 @@ impl Task { } } } + + pub fn systrace(&self) -> bool { + self.systrace.load(Ordering::SeqCst) + } + + pub fn enable_systrace(&self) { + self.systrace.store(true, Ordering::SeqCst); + } } // SAFETY: It's alright to access [`Task`] through references from other diff --git a/src/aero_proc/src/syscall.rs b/src/aero_proc/src/syscall.rs index cd8a0d88fad..7e987962bf8 100644 --- a/src/aero_proc/src/syscall.rs +++ b/src/aero_proc/src/syscall.rs @@ -151,13 +151,18 @@ pub fn parse(attr: TokenStream, item: TokenStream) -> TokenStream { }) .collect::>(); - let syslog = quote::quote! { - #[cfg(feature = "syslog")] - crate::syscall::SysLog::new(stringify!(#name)) - #(#syslog_args)* - .set_result(result) - .flush(); - }; + let syslog = quote::quote! {{ + // Check if the current task has systrace enabled. + use crate::userland::scheduler; + + let current_task = scheduler::get_scheduler().current_task(); + if current_task.systrace() { + crate::syscall::SysLog::new(stringify!(#name)) + #(#syslog_args)* + .set_result(result) + .flush(); + } + }}; let compiled_body = if config.no_return { quote::quote! { diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 5eb16b639b0..5961a3c8a24 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -93,6 +93,7 @@ pub const SYS_SOCKET_PAIR: usize = 67; pub const SYS_RENAME: usize = 68; pub const SYS_MPROTECT: usize = 69; // haha funny number pub const SYS_SOCK_SEND: usize = 70; +pub const SYS_TRACE: usize = 71; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; diff --git a/userland/Cargo.lock b/userland/Cargo.lock index b5a98bd6974..7cc758b7f7f 100644 --- a/userland/Cargo.lock +++ b/userland/Cargo.lock @@ -311,6 +311,13 @@ dependencies = [ "spin 0.9.5", ] +[[package]] +name = "systrace" +version = "0.1.0" +dependencies = [ + "aero_syscall", +] + [[package]] name = "unicode-ident" version = "1.0.6" diff --git a/userland/apps/systrace/Cargo.toml b/userland/apps/systrace/Cargo.toml new file mode 100644 index 00000000000..88e5bf272f2 --- /dev/null +++ b/userland/apps/systrace/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "systrace" +version = "0.1.0" +edition = "2021" + +[dependencies] +aero_syscall = { path = "../../../src/aero_syscall" } diff --git a/userland/apps/systrace/src/main.rs b/userland/apps/systrace/src/main.rs new file mode 100644 index 00000000000..c3c4cdbdb08 --- /dev/null +++ b/userland/apps/systrace/src/main.rs @@ -0,0 +1,16 @@ +use std::env; +use std::process::Command; + +use std::os::unix::process::CommandExt; + +use aero_syscall::syscall0; + +fn main() { + // [1..] to ignore the name of our binary. + let args = &env::args().collect::>()[1..]; + + syscall0(aero_syscall::prelude::SYS_TRACE); + + Command::new(&args[0]).args(&args[1..]).exec(); + unreachable!("systrace: failed to execute target process {args:?}") +} From cca37551a0ecbc089f129b9a01002a3888deb3f0 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 3 Apr 2023 17:20:48 +1000 Subject: [PATCH 165/368] tty: remove the keyboard listiner when there are no references to it Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/keyboard.rs | 15 ++++++-- src/aero_kernel/src/drivers/tty.rs | 49 ++++++++++++++++++++----- src/aero_kernel/src/userland/task.rs | 4 -- 3 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index b41e0d41336..0d9124d012f 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -34,7 +34,7 @@ pub trait KeyboardListener: Send + Sync { } static PS2_KEYBOARD_STATE: Mutex = Mutex::new(Ps2KeyboardState::new()); -static KEYBOARD_LISTENER: RwLock> = RwLock::new(Vec::new()); +static KEYBOARD_LISTENER: RwLock>> = RwLock::new(Vec::new()); struct Ps2KeyboardState { special: bool, @@ -299,14 +299,23 @@ pub fn ps2_keyboard_init() { // TODO: Move this into /dev/input instead // TODO: Add support for multiple keyboards - register_keyboard_listener(KEYBOARD.as_ref().clone()); + register_keyboard_listener(KEYBOARD.clone()); devfs::install_device(KEYBOARD.clone()).expect("failed to install keyboard device"); } -pub fn register_keyboard_listener(listener: &'static dyn KeyboardListener) { +pub fn register_keyboard_listener(listener: Arc) { KEYBOARD_LISTENER.write().push(listener) } +pub fn remove_keyboard_listener(target: Arc) { + for (index, listener) in KEYBOARD_LISTENER.read().iter().enumerate() { + if Arc::ptr_eq(listener, &target) { + KEYBOARD_LISTENER.write().remove(index); + return; + } + } +} + pub fn keyboard_irq_handler(_stack: &mut InterruptStack) { let scancode = unsafe { io::inb(0x60) }; diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 8a021a9547a..51b4f5135b2 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -17,6 +17,8 @@ * along with Aero. If not, see . */ +use core::sync::atomic::{AtomicUsize, Ordering}; + use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; @@ -199,6 +201,8 @@ struct Tty { stdin: Mutex, block_queue: BlockQueue, + + connected: AtomicUsize, } impl Tty { @@ -218,12 +222,35 @@ impl Tty { }), block_queue: BlockQueue::new(), stdin: Mutex::new(StdinBuffer::new()), + connected: AtomicUsize::new(0), sref: sref.clone(), }) } } impl INodeInterface for Tty { + fn open( + &self, + _flags: aero_syscall::OpenFlags, + _handle: Arc, + ) -> fs::Result> { + let connected = self.connected.fetch_add(1, Ordering::SeqCst); + if connected == 0 { + super::keyboard::register_keyboard_listener(TTY.clone()); + } + + Ok(None) + } + + fn close(&self, _flags: aero_syscall::OpenFlags) { + let connected = self.connected.fetch_sub(1, Ordering::SeqCst); + if connected == 1 { + // We were the last process that was connected to the TTY; remove + // the keyboard listener. + super::keyboard::remove_keyboard_listener(TTY.clone()); + } + } + fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { self.block_queue .block_on(&self.stdin, |future| future.is_complete())?; @@ -824,18 +851,24 @@ impl vte::Perform for AnsiEscape { let p1 = arg_typee[0]; match p1 { - // A colour number from 0 to 255, for use in 256-colour terminal + // A colour number from 0 to 255, for use in + // 256-colour terminal // environments. // - // - Colours 0 to 7 are the `Black` to `White` variants respectively. - // - Colours 8 to 15 are brighter versions of the eight colours above. - // - Colours 16 to 231 contain several palettes of bright colours, - // - Colours 232 to 255 are shades of grey from black to white. + // - Colours 0 to 7 are the `Black` to + // `White` variants respectively. + // - Colours 8 to 15 are brighter versions + // of the eight colours above. + // - Colours 16 to 231 contain several + // palettes of bright colours, + // - Colours 232 to 255 are shades of grey + // from black to white. // // [cc]: https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg 5 => parse_fixed(setter, piter), - // A 24-bit RGB color, as specified by ISO-8613-3. + // A 24-bit RGB color, as specified by + // ISO-8613-3. 2 => parse_rgb(setter, piter), _ => (), @@ -865,10 +898,6 @@ impl vte::Perform for AnsiEscape { } fn init_tty() { - // TODO: aarch64 port - #[cfg(target_arch = "x86_64")] - super::keyboard::register_keyboard_listener(TTY.as_ref().clone()); - devfs::install_device(TTY.clone()).expect("failed to register tty as a device"); } diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task.rs index 0dc73b75d75..8f56fb773fb 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task.rs @@ -180,10 +180,6 @@ pub struct Task { arch_task: UnsafeCell, state: AtomicU8, - // Note: Aero implements the threads and as standard processes. This - // means that when a new process is created its TID == PID and when a new - // thread is created then the PID of the thread will be the process leader's - // PID and the TID will be uniquely generated. pid: TaskId, tid: TaskId, From e2c5e20cf035d8d00e26999e50a4b0ebffd1d6d0 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 4 Apr 2023 16:32:00 +1000 Subject: [PATCH 166/368] syscalls::setpgid: stub Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 50 ++++++++++++++++++++++++-- src/aero_kernel/src/syscall/mod.rs | 1 + src/aero_kernel/src/syscall/process.rs | 26 ++++++++++++++ src/aero_syscall/src/consts.rs | 1 + 4 files changed, 75 insertions(+), 3 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 8fd27ffd765..e902b988405 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,6 +1,6 @@ -From e2f45d46f3b5bf3ffed794dce944913c5adea918 Mon Sep 17 00:00:00 2001 +From dff703a240b871909f3618835ca8f74a2c619eef Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Thu, 30 Mar 2023 18:06:10 +1100 +Date: Mon, 3 Apr 2023 18:29:16 +1000 Subject: [PATCH] --- @@ -9,8 +9,10 @@ Subject: [PATCH] options/ansi/generic/stdlib-stubs.cpp | 6 ++++-- options/glibc/generic/execinfo.cpp | 5 +++-- options/rtdl/generic/linker.cpp | 2 +- + sysdeps/aero/generic/aero.cpp | 7 +++++++ sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++++++ - 6 files changed, 38 insertions(+), 8 deletions(-) + sysdeps/aero/include/aero/syscall.h | 8 ++++++++ + 8 files changed, 53 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index fdd60a0..9f811f4 100644 @@ -95,6 +97,24 @@ index 6eb9d09..2ab5bc9 100644 constexpr bool logRpath = false; constexpr bool eagerBinding = true; +diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp +index 0faf386..3a5b40f 100644 +--- a/sysdeps/aero/generic/aero.cpp ++++ b/sysdeps/aero/generic/aero.cpp +@@ -239,6 +239,13 @@ int sys_sleep(time_t *sec, long *nanosec) { + return 0; + } + ++int sys_setpgid(pid_t pid, pid_t pgid) { ++ auto ret = syscall(SYS_SETPGID, pid, pgid); ++ if (int e = sc_error(ret); e) ++ return e; ++ return 0; ++} ++ + uid_t sys_getuid() { + mlibc::infoLogger() << "mlibc: sys_setuid is a stub" << frg::endlog; + return 0; diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp index c730bff..39cacb4 100644 --- a/sysdeps/aero/generic/sockets.cpp @@ -137,6 +157,30 @@ index c730bff..39cacb4 100644 + return 0; +} } // namespace mlibc +diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h +index 432bad2..2ffde22 100644 +--- a/sysdeps/aero/include/aero/syscall.h ++++ b/sysdeps/aero/include/aero/syscall.h +@@ -75,6 +75,8 @@ + #define SYS_RENAME 68 + #define SYS_MPROTECT 69 + #define SYS_SOCK_SEND 70 ++#define SYS_TRACE 71 ++#define SYS_SETPGID 72 + + // Invalid syscall used to trigger a log error in the kernel (as a hint) + // so, that we can implement the syscall in the kernel. +@@ -217,4 +219,10 @@ __attribute__((always_inline)) static inline long syscall(sc_word_t call, + T... args) { + return _syscall(call, sc_cast(args)...); + } ++ ++inline int sc_error(long ret) { ++ if (ret < 0) ++ return -ret; ++ return 0; ++} + #endif // SYSCALL_H -- 2.40.0 diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 75c22003951..75c3919e0e7 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -249,6 +249,7 @@ pub fn generic_do_syscall( SYS_KILL => process::kill(b, c), SYS_BACKTRACE => process::backtrace(), SYS_TRACE => process::trace(), + SYS_SETPGID => process::setpgid(b, c), SYS_READ => fs::read(b, c, d), SYS_OPEN => fs::open(b, c, d, e), diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index ab321930a54..42d54559445 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -364,3 +364,29 @@ pub fn shutdown() -> Result { unreachable!("aml: failed to shutdown (enter state S5)") } + +pub fn setpgid(pid: usize, pgid: usize) -> Result { + // If `pid` is 0, the process ID of the calling process is used. If `pgid` is 0, the process ID + // of the process specified by the `pid` argument. process shall be used. + let current_task = scheduler::get_scheduler().current_task(); + let _process = if pid == 0 || pid == current_task.pid().as_usize() { + current_task.clone() + } else { + let task = scheduler::get_scheduler() + .find_task(TaskId::new(pid)) + .ok_or(SyscallError::ESRCH)?; + + if !task.is_process_leader() { + return Err(SyscallError::EPERM); + } + + task + }; + + // if process.is_session_leader() { + // return Err(SyscallError::EPERM); + // } + + log::debug!("setpgid: is a stub! (pid={pid} pgid={pgid})"); + Ok(0) +} diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 5961a3c8a24..e8e510cd005 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -94,6 +94,7 @@ pub const SYS_RENAME: usize = 68; pub const SYS_MPROTECT: usize = 69; // haha funny number pub const SYS_SOCK_SEND: usize = 70; pub const SYS_TRACE: usize = 71; +pub const SYS_SETPGID: usize = 72; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; From 9ed00ae954932beea082cde82e63fd615fa8a9e4 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 6 Apr 2023 16:01:18 +1000 Subject: [PATCH 167/368] kernel: process sessions, groups and line discipline Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 58 +++++-- src/aero_kernel/src/drivers/pty.rs | 45 +++--- src/aero_kernel/src/drivers/tty.rs | 12 ++ src/aero_kernel/src/syscall/mod.rs | 2 + src/aero_kernel/src/syscall/process.rs | 64 ++++++-- src/aero_kernel/src/userland/mod.rs | 1 + src/aero_kernel/src/userland/scheduler/mod.rs | 2 + .../src/userland/{task.rs => task/mod.rs} | 67 +++++++- src/aero_kernel/src/userland/task/sessions.rs | 146 ++++++++++++++++++ src/aero_kernel/src/userland/terminal.rs | 112 ++++++++++++++ src/aero_syscall/src/consts.rs | 2 + 11 files changed, 465 insertions(+), 46 deletions(-) rename src/aero_kernel/src/userland/{task.rs => task/mod.rs} (87%) create mode 100644 src/aero_kernel/src/userland/task/sessions.rs create mode 100644 src/aero_kernel/src/userland/terminal.rs diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index e902b988405..15b520bc18d 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,6 +1,6 @@ -From dff703a240b871909f3618835ca8f74a2c619eef Mon Sep 17 00:00:00 2001 +From 64a5317fc58a29c4c2cf99b836c9d2d00cec0a8d Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Mon, 3 Apr 2023 18:29:16 +1000 +Date: Thu, 6 Apr 2023 14:57:57 +1000 Subject: [PATCH] --- @@ -9,10 +9,10 @@ Subject: [PATCH] options/ansi/generic/stdlib-stubs.cpp | 6 ++++-- options/glibc/generic/execinfo.cpp | 5 +++-- options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 7 +++++++ + sysdeps/aero/generic/aero.cpp | 27 +++++++++++++++++++-------- sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++++++ - sysdeps/aero/include/aero/syscall.h | 8 ++++++++ - 8 files changed, 53 insertions(+), 8 deletions(-) + sysdeps/aero/include/aero/syscall.h | 10 ++++++++++ + 8 files changed, 67 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index fdd60a0..9f811f4 100644 @@ -98,16 +98,38 @@ index 6eb9d09..2ab5bc9 100644 constexpr bool eagerBinding = true; diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 0faf386..3a5b40f 100644 +index 0faf386..e6bd277 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp -@@ -239,6 +239,13 @@ int sys_sleep(time_t *sec, long *nanosec) { +@@ -176,13 +176,6 @@ int sys_kill(int pid, int sig) { return 0; } +-pid_t sys_getpgid(pid_t pid, pid_t *pgid) { +- mlibc::infoLogger() << "sys_getpgid() is unimplemented" << frg::endlog; +- *pgid = 0; +- +- return 0; +-} +- + int sys_clock_get(int clock, time_t *secs, long *nanos) { + struct timespec ts; + auto result = syscall(SYS_GETTIME, clock, &ts); +@@ -239,6 +232,21 @@ int sys_sleep(time_t *sec, long *nanosec) { + return 0; + } + ++pid_t sys_getpgid(pid_t pid, pid_t *pgid) { ++ auto ret = syscall(SYS_GETPGID, pid); ++ if(int e = sc_error(ret); e) ++ return e; ++ *pgid = ret; ++ return 0; ++} ++ +int sys_setpgid(pid_t pid, pid_t pgid) { + auto ret = syscall(SYS_SETPGID, pid, pgid); -+ if (int e = sc_error(ret); e) ++ if(int e = sc_error(ret); e) + return e; + return 0; +} @@ -115,6 +137,18 @@ index 0faf386..3a5b40f 100644 uid_t sys_getuid() { mlibc::infoLogger() << "mlibc: sys_setuid is a stub" << frg::endlog; return 0; +@@ -250,7 +258,10 @@ uid_t sys_geteuid() { + } + + int sys_setsid(pid_t *sid) { +- mlibc::infoLogger() << "mlibc: sys_setsid is a stub" << frg::endlog; ++ auto ret = syscall(SYS_SETSID); ++ if(int e = sc_error(ret); e) ++ return e; ++ *sid = ret; + return 0; + } + diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp index c730bff..39cacb4 100644 --- a/sysdeps/aero/generic/sockets.cpp @@ -158,19 +192,21 @@ index c730bff..39cacb4 100644 +} } // namespace mlibc diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 432bad2..2ffde22 100644 +index 432bad2..ba56ce9 100644 --- a/sysdeps/aero/include/aero/syscall.h +++ b/sysdeps/aero/include/aero/syscall.h -@@ -75,6 +75,8 @@ +@@ -75,6 +75,10 @@ #define SYS_RENAME 68 #define SYS_MPROTECT 69 #define SYS_SOCK_SEND 70 +#define SYS_TRACE 71 +#define SYS_SETPGID 72 ++#define SYS_SETSID 73 ++#define SYS_GETPGID 74 // Invalid syscall used to trigger a log error in the kernel (as a hint) // so, that we can implement the syscall in the kernel. -@@ -217,4 +219,10 @@ __attribute__((always_inline)) static inline long syscall(sc_word_t call, +@@ -217,4 +221,10 @@ __attribute__((always_inline)) static inline long syscall(sc_word_t call, T... args) { return _syscall(call, sc_cast(args)...); } diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 78ea5f877dd..f0b4a676fa0 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -43,6 +43,10 @@ use crate::fs::MOUNT_MANAGER; use crate::fs::{self, FileSystemError}; use crate::mem::paging::VirtAddr; +use crate::userland::scheduler; +use crate::userland::task::Task; +use crate::userland::terminal::LineDiscipline; +use crate::userland::terminal::TerminalDevice; use crate::utils::sync::BlockQueue; use crate::utils::sync::Mutex; @@ -57,8 +61,9 @@ struct Master { id: u32, wq: BlockQueue, window_size: Mutex, - slave_buffer: Mutex>, buffer: Mutex>, + + discipline: LineDiscipline, } impl Master { @@ -67,8 +72,9 @@ impl Master { id: PTY_ID.fetch_add(1, Ordering::SeqCst), wq: BlockQueue::new(), window_size: Mutex::new(WinSize::default()), - slave_buffer: Mutex::new(Vec::new()), buffer: Mutex::new(Vec::new()), + + discipline: LineDiscipline::new(), } } } @@ -87,10 +93,7 @@ impl INodeInterface for Master { } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { - let mut pty_buffer = self.slave_buffer.lock_irq(); - pty_buffer.extend_from_slice(buffer); - - self.wq.notify_complete(); + self.discipline.write(buffer); Ok(buffer.len()) } @@ -126,6 +129,13 @@ impl INodeInterface for Master { } } +impl TerminalDevice for Master { + fn attach(&self, task: Arc) { + assert!(task.is_session_leader()); + self.discipline.set_foreground(task); + } +} + struct SlaveInner { termios: Termios, } @@ -195,8 +205,10 @@ impl INodeInterface for Slave { } aero_syscall::TIOCSCTTY => { - // TODO(alacritty): stub! - log::error!("TIOCSCTTY is a stub!"); + let current_task = scheduler::get_scheduler().current_task(); + assert!(current_task.is_session_leader()); + + current_task.attach(self.master.clone()); Ok(0) } @@ -205,11 +217,14 @@ impl INodeInterface for Slave { } fn poll(&self, table: Option<&mut fs::inode::PollTable>) -> fs::Result { - table.map(|e| e.insert(&self.master.wq)); + if let Some(table) = table { + table.insert(&self.master.wq); + table.insert(self.master.discipline.wait_queue()); + } let mut flags = PollFlags::OUT; - if !self.master.slave_buffer.lock_irq().is_empty() { + if !self.master.discipline.is_empty() { flags |= PollFlags::IN; } @@ -217,15 +232,7 @@ impl INodeInterface for Slave { } fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { - let mut pty_buffer = self - .master - .wq - .block_on(&self.master.slave_buffer, |e| !e.is_empty())?; - - let size = core::cmp::min(pty_buffer.len(), buffer.len()); - - buffer[..size].copy_from_slice(&pty_buffer.drain(..size).collect::>()); - Ok(size) + Ok(self.master.discipline.read(buffer)?) } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 51b4f5135b2..d532d3aad9f 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -29,6 +29,9 @@ use crate::rendy; use crate::fs::inode::INodeInterface; use crate::mem::paging::VirtAddr; +use crate::userland::scheduler; +use crate::userland::task::Task; +use crate::userland::terminal::TerminalDevice; use crate::utils::sync::{BlockQueue, Mutex}; #[cfg(target_arch = "x86_64")] @@ -239,6 +242,9 @@ impl INodeInterface for Tty { super::keyboard::register_keyboard_listener(TTY.clone()); } + let current_task = scheduler::get_scheduler().current_task(); + current_task.attach(self.sref.upgrade().unwrap()); + Ok(None) } @@ -366,6 +372,12 @@ impl devfs::Device for Tty { } } +impl TerminalDevice for Tty { + fn attach(&self, _task: Arc) { + /* FIXME: We should handle foreground groups in TTY aswell */ + } +} + #[cfg(target_arch = "x86_64")] impl KeyboardListener for Tty { fn on_key(&self, key: KeyCode, released: bool) { diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 75c3919e0e7..8eb69352200 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -250,6 +250,8 @@ pub fn generic_do_syscall( SYS_BACKTRACE => process::backtrace(), SYS_TRACE => process::trace(), SYS_SETPGID => process::setpgid(b, c), + SYS_SETSID => process::setsid(), + SYS_GETPGID => process::getpgid(b), SYS_READ => fs::read(b, c, d), SYS_OPEN => fs::open(b, c, d, e), diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index 42d54559445..d52d0edff2e 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -19,6 +19,7 @@ use aero_syscall::signal::{SigAction, SigProcMask}; use aero_syscall::*; +use alloc::sync::Arc; use spin::{Mutex, Once}; use crate::acpi::aml; @@ -28,7 +29,8 @@ use crate::fs::Path; use crate::mem::paging::VirtAddr; use crate::userland::scheduler; use crate::userland::signals::SignalEntry; -use crate::userland::task::TaskId; +use crate::userland::task::sessions::SESSIONS; +use crate::userland::task::{Task, TaskId}; use crate::utils::sync::IrqGuard; static HOSTNAME: Once> = Once::new(); @@ -365,28 +367,60 @@ pub fn shutdown() -> Result { unreachable!("aml: failed to shutdown (enter state S5)") } -pub fn setpgid(pid: usize, pgid: usize) -> Result { - // If `pid` is 0, the process ID of the calling process is used. If `pgid` is 0, the process ID - // of the process specified by the `pid` argument. process shall be used. +fn find_task_by_pid(pid: usize) -> Result, SyscallError> { let current_task = scheduler::get_scheduler().current_task(); - let _process = if pid == 0 || pid == current_task.pid().as_usize() { - current_task.clone() + + // If `pid` is 0, the process ID of the calling process is used. + if pid == 0 || pid == current_task.pid().as_usize() { + Ok(current_task) } else { - let task = scheduler::get_scheduler() + scheduler::get_scheduler() .find_task(TaskId::new(pid)) - .ok_or(SyscallError::ESRCH)?; + .ok_or(SyscallError::ESRCH) + } +} - if !task.is_process_leader() { +#[syscall] +pub fn getpgid(pid: usize) -> Result { + let task = find_task_by_pid(pid)?; + let group = SESSIONS.find_group(task).unwrap(); + + Ok(group.id()) +} + +#[syscall] +pub fn setpgid(pid: usize, pgid: usize) -> Result { + let current_task = scheduler::get_scheduler().current_task(); + let task = find_task_by_pid(pid)?; + + if task.is_session_leader() + || !task.is_process_leader() + || task.session_id() != current_task.session_id() + { + return Err(SyscallError::EPERM); + } + + if let Some(parent) = task.get_parent() { + if parent.tid() != current_task.tid() { return Err(SyscallError::EPERM); } + } else { + return Err(SyscallError::EPERM); + } - task - }; + // If `pgid` is 0, the process ID of the process specified by the `pid` argument shall + // be used. + log::error!("setpgid: is a stub! (pid={pid} pgid={pgid})"); + Ok(0) +} - // if process.is_session_leader() { - // return Err(SyscallError::EPERM); - // } +#[syscall] +pub fn setsid() -> Result { + let current_task = scheduler::get_scheduler().current_task(); + if current_task.is_group_leader() { + return Err(SyscallError::EPERM); + } - log::debug!("setpgid: is a stub! (pid={pid} pgid={pgid})"); + SESSIONS.isolate(current_task); Ok(0) } diff --git a/src/aero_kernel/src/userland/mod.rs b/src/aero_kernel/src/userland/mod.rs index 5be8a2a3fc8..80ef4a53329 100644 --- a/src/aero_kernel/src/userland/mod.rs +++ b/src/aero_kernel/src/userland/mod.rs @@ -23,6 +23,7 @@ use crate::fs::Path; pub mod scheduler; pub mod signals; pub mod task; +pub mod terminal; pub mod vm; pub fn run() -> fs::Result<()> { diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index 3a51f8ddbd2..35a530e6881 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -30,6 +30,7 @@ use spin::Once; use self::round_robin::RoundRobin; use super::signals::SignalResult; +use super::task::sessions::SESSIONS; use super::task::{Task, TaskId}; static SCHEDULER: Once = Once::new(); @@ -99,6 +100,7 @@ impl Scheduler { pub fn register_task(&self, task: Arc) { self.tasks.register_task(task.pid(), task.clone()); self.inner.register_task(task.clone()); + SESSIONS.register_task(task); } #[inline] diff --git a/src/aero_kernel/src/userland/task.rs b/src/aero_kernel/src/userland/task/mod.rs similarity index 87% rename from src/aero_kernel/src/userland/task.rs rename to src/aero_kernel/src/userland/task/mod.rs index 8f56fb773fb..bd3a5e6b297 100644 --- a/src/aero_kernel/src/userland/task.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -17,6 +17,8 @@ * along with Aero. If not, see . */ +pub mod sessions; + use aero_syscall::WaitPidFlags; use alloc::sync::{Arc, Weak}; @@ -40,6 +42,7 @@ use intrusive_collections::{intrusive_adapter, LinkedList, LinkedListLink}; use super::scheduler; use super::signals::{SignalResult, TriggerResult}; +use super::terminal::TerminalDevice; use super::vm::Vm; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] @@ -183,6 +186,9 @@ pub struct Task { pid: TaskId, tid: TaskId, + sid: AtomicUsize, + gid: AtomicUsize, + parent: Mutex>>, children: Mutex>, @@ -206,6 +212,7 @@ pub struct Task { pub(super) exit_status: AtomicIsize, + controlling_terminal: Mutex>>, systrace: AtomicBool, } @@ -226,6 +233,8 @@ impl Task { message_queue: MessageQueue::new(), tid: pid.clone(), + sid: AtomicUsize::new(pid.as_usize()), + gid: AtomicUsize::new(pid.as_usize()), pid, executable: Mutex::new(None), @@ -248,6 +257,7 @@ impl Task { cwd: RwLock::new(None), systrace: AtomicBool::new(false), + controlling_terminal: Mutex::new(None), }) } @@ -269,6 +279,8 @@ impl Task { state: AtomicU8::new(TaskState::Runnable as _), tid: pid.clone(), + gid: AtomicUsize::new(pid.as_usize()), + sid: AtomicUsize::new(pid.as_usize()), pid, link: Default::default(), @@ -287,6 +299,7 @@ impl Task { cwd: RwLock::new(None), systrace: AtomicBool::new(false), + controlling_terminal: Mutex::new(None), }) } @@ -310,6 +323,8 @@ impl Task { exit_status: AtomicIsize::new(0), tid: pid.clone(), + sid: AtomicUsize::new(self.session_id()), + gid: AtomicUsize::new(self.group_id()), pid, executable: Mutex::new(self.executable.lock().clone()), @@ -322,6 +337,7 @@ impl Task { signals: Signals::new(), systrace: AtomicBool::new(self.systrace()), + controlling_terminal: Mutex::new(self.controlling_terminal.lock_irq().clone()), }); self.add_child(this.clone()); @@ -369,6 +385,8 @@ impl Task { exit_status: AtomicIsize::new(0), tid: pid.clone(), + sid: AtomicUsize::new(self.session_id()), + gid: AtomicUsize::new(self.group_id()), pid, executable: Mutex::new(self.executable.lock().clone()), @@ -381,6 +399,12 @@ impl Task { signals: Signals::new(), systrace: AtomicBool::new(self.process_leader().systrace()), + controlling_terminal: Mutex::new( + self.process_leader() + .controlling_terminal + .lock_irq() + .clone(), + ), }); self.add_child(this.clone()); @@ -565,7 +589,7 @@ impl Task { self.cwd.write().as_mut().unwrap().filesystem = filesystem; } - fn get_parent(&self) -> Option> { + pub fn get_parent(&self) -> Option> { let parent = self.parent.lock(); parent.clone() } @@ -646,6 +670,47 @@ impl Task { pub fn enable_systrace(&self) { self.systrace.store(true, Ordering::SeqCst); } + + pub fn attach(&self, terminal: Arc) { + if self.is_session_leader() { + terminal.attach(self.sref.upgrade().unwrap()); + *self.controlling_terminal.lock_irq() = Some(terminal); + } else { + // FIXME: If its not the session leader then we needs to be a part of the the same + // session as the terminal's foreground group. + // todo!() + } + } + + /// Returns whether the task is the session leader (`pid` == `sid`). + pub fn is_session_leader(&self) -> bool { + self.session_id() == self.pid().as_usize() + } + + /// Returns whether the task is the group leader (`pid` == `gid`). + pub fn is_group_leader(&self) -> bool { + self.group_id() == self.pid().as_usize() + } + + /// Returns the group identifier of the task (`GID`). + pub fn group_id(&self) -> usize { + self.gid.load(Ordering::SeqCst) + } + + /// Returns the session identifier of the task (`SID`). + pub fn session_id(&self) -> usize { + self.sid.load(Ordering::SeqCst) + } + + /// Sets the session identifier of the task (`SID`) to `session_id`. + pub(super) fn set_session_id(&self, session_id: usize) { + self.sid.store(session_id, Ordering::SeqCst); + } + + /// Sets the group identifier of the task (`GID`) to `group_id`. + pub(super) fn set_group_id(&self, group_id: usize) { + self.gid.store(group_id, Ordering::SeqCst); + } } // SAFETY: It's alright to access [`Task`] through references from other diff --git a/src/aero_kernel/src/userland/task/sessions.rs b/src/aero_kernel/src/userland/task/sessions.rs new file mode 100644 index 00000000000..e845bdc514c --- /dev/null +++ b/src/aero_kernel/src/userland/task/sessions.rs @@ -0,0 +1,146 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +use alloc::sync::Arc; +use hashbrown::HashMap; + +use crate::utils::sync::Mutex; + +use super::{Task, TaskId}; + +/// Process Group +/// +/// A process group is a collection of one or more processes that are grouped together so that +/// they can be manipulated as a single entity. +pub struct Group { + /// Unique identifier of the process group. + id: usize, + /// Processes part of the process group. + tasks: Mutex>>, +} + +impl Group { + /// Creates a new process group. + pub fn new(leader: Arc) -> Arc { + let mut tasks = HashMap::new(); + tasks.insert(leader.pid(), leader.clone()); + + leader.set_group_id(leader.pid().as_usize()); + + Arc::new(Self { + id: leader.pid().as_usize(), + tasks: Mutex::new(tasks), + }) + } + + pub fn id(&self) -> usize { + self.id + } + + pub fn register_task(&self, task: Arc) { + assert!(self.tasks.lock_irq().insert(task.pid(), task).is_none()); + } + + pub fn signal(&self, target: usize) { + for (_, task) in self.tasks.lock_irq().iter() { + log::error!("Sending signal to task: {:?}", task.path()); + + task.signal(target); + } + } +} + +/// Process Session +pub struct Session { + groups: Mutex>>, +} + +impl Session { + /// Creates a new process session. + pub fn new(leader: Arc) -> Arc { + let mut groups = HashMap::new(); + groups.insert(leader.pid().as_usize(), Group::new(leader.clone())); + + leader.set_session_id(leader.pid().as_usize()); + + Arc::new(Self { + groups: Mutex::new(groups), + }) + } + + pub fn find(&self, target: Arc) -> Option> { + self.groups.lock_irq().get(&target.group_id()).cloned() + } + + pub fn register_task(&self, task: Arc) { + assert!(!task.is_session_leader()); + + let mut groups = self.groups.lock_irq(); + if let Some(group) = groups.get(&task.group_id()) { + assert!(!task.is_group_leader()); + group.register_task(task); + } else { + assert!(task.is_group_leader()); + groups.insert(task.group_id(), Group::new(task)); + } + } +} + +pub struct SessionList(Mutex>>); + +impl SessionList { + /// Creates and registers a new process session with the given `leader` as the leader task. + pub fn create_session(&self, leader: Arc) { + self.0 + .lock_irq() + .insert(leader.pid().as_usize(), Session::new(leader)); + } + + pub fn find_group(&self, target: Arc) -> Option> { + self.0.lock_irq().get(&target.session_id())?.find(target) + } + + pub fn register_task(&self, task: Arc) { + assert!(task.is_process_leader()); + + let sessions = self.0.lock_irq(); + + if let Some(session) = sessions.get(&task.session_id()) { + session.register_task(task); + } else { + drop(sessions); + self.create_session(task); + } + } + + pub fn isolate(&self, task: Arc) { + assert!(!task.is_group_leader() && !task.is_session_leader()); + + let leader = task.process_leader(); + + { + let mut sessions = self.0.lock_irq(); + sessions.remove(&task.session_id()); + } + + self.create_session(leader) + } +} + +lazy_static::lazy_static! { + pub static ref SESSIONS: SessionList = SessionList(Mutex::new(HashMap::new())); +} diff --git a/src/aero_kernel/src/userland/terminal.rs b/src/aero_kernel/src/userland/terminal.rs new file mode 100644 index 00000000000..ecd7927371b --- /dev/null +++ b/src/aero_kernel/src/userland/terminal.rs @@ -0,0 +1,112 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +use aero_syscall::signal; + +use alloc::sync::{Arc, Weak}; +use alloc::vec::Vec; + +use spin::RwLock; + +use crate::utils::sync::{BlockQueue, Mutex}; + +use super::signals::SignalError; +use super::task::sessions::{Group, SESSIONS}; +use super::task::Task; + +/// Terminal Device +pub trait TerminalDevice: Send + Sync { + /// Called when a session leader is attached/connected to the terminal device. + /// + /// The processs group of `task` will be set as the active process group that is associated with + /// the terminal (foreground). + fn attach(&self, task: Arc); +} + +/// Line Discipline +/// +/// The middle terminal subsystem layer, used to implement behavior common to terminal devices. +/// +/// For example, the line discipline handles special characters such as the interrupt character +/// (`Ctrl+C`), the erase character (Backspace or Delete), and the kill character (`Ctrl+U`) on +/// input. +pub struct LineDiscipline { + wq: BlockQueue, + buffer: Mutex>, + foreground: RwLock>, +} + +impl LineDiscipline { + /// Creates a new line discipline. + pub fn new() -> Self { + Self { + wq: BlockQueue::new(), + buffer: Mutex::new(Vec::new()), + foreground: RwLock::new(Weak::default()), + } + } + + /// Reads data from the line discipline buffer. + pub fn read(&self, target: &mut [u8]) -> Result { + let mut buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; + + let size = core::cmp::min(target.len(), buffer.len()); + target[..size].copy_from_slice(&buffer.drain(..size).collect::>()); + + Ok(size) + } + + /// Writes data to the line discipline buffer. + pub fn write(&self, target: &[u8]) { + let mut buffer = self.buffer.lock_irq(); + + for byte in target { + match byte { + // ETX: End of Text (`Ctrl+C`) + 0x3 => { + if let Some(foreground) = self.foreground() { + log::warn!("LineDiscipline: recieved End of Text (`Ctrl+C`)"); + foreground.signal(signal::SIGINT); + } + } + + _ => buffer.push(*byte), + } + } + + drop(buffer); + self.wq.notify_complete(); + } + + pub fn foreground(&self) -> Option> { + self.foreground.read().upgrade() + } + + pub fn set_foreground(&self, task: Arc) { + *self.foreground.write() = Arc::downgrade(&SESSIONS.find_group(task).unwrap()); + } + + /// Returns whether the line discipline buffer is empty. + pub fn is_empty(&self) -> bool { + self.buffer.lock_irq().is_empty() + } + + /// Returns the line discipline's wait queue. + pub fn wait_queue(&self) -> &BlockQueue { + &self.wq + } +} diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index e8e510cd005..ff386ff9e7a 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -95,6 +95,8 @@ pub const SYS_MPROTECT: usize = 69; // haha funny number pub const SYS_SOCK_SEND: usize = 70; pub const SYS_TRACE: usize = 71; pub const SYS_SETPGID: usize = 72; +pub const SYS_SETSID: usize = 73; +pub const SYS_GETPGID: usize = 74; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; From 5eabe9b63a7a9e4bbe134f2b5f30818451f811fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Apr 2023 06:08:00 +0000 Subject: [PATCH 168/368] build(deps): bump spin from 0.9.4 to 0.9.8 in /src Bumps [spin](https://github.com/mvdnes/spin-rs) from 0.9.4 to 0.9.8. - [Release notes](https://github.com/mvdnes/spin-rs/releases) - [Changelog](https://github.com/mvdnes/spin-rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/mvdnes/spin-rs/commits) --- updated-dependencies: - dependency-name: spin dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- src/Cargo.lock | 6 +++--- src/aero_kernel/Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index 11983aedfd8..3df9a23cd2a 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -27,7 +27,7 @@ dependencies = [ "rustc-demangle", "serde_json", "simple_endian", - "spin 0.9.4", + "spin 0.9.8", "static_assertions", "uapi", "vte", @@ -445,9 +445,9 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "spin" -version = "0.9.4" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "static_assertions" diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index c51cb714630..631dd850763 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -21,7 +21,7 @@ kmemleak = [] default = ["round-robin"] [dependencies] -spin = { version = "0.9.4", default-features = false, features = [ +spin = { version = "0.9.8", default-features = false, features = [ "spin_mutex", "rwlock", "once", From 64d1fc4b2da59629cf70f624577e4a851cf7ebdb Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 6 Apr 2023 17:37:25 +1000 Subject: [PATCH 169/368] x86_64::sigreturn: set the syscall result Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/arch/x86_64/signals.rs | 15 +++++++++------ src/aero_kernel/src/arch/x86_64/syscall.rs | 3 +-- src/aero_syscall/src/signal.rs | 6 ++++-- userland/apps/utest/src/main.rs | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/signals.rs b/src/aero_kernel/src/arch/x86_64/signals.rs index 79eb6e9be5a..be5e414bbee 100644 --- a/src/aero_kernel/src/arch/x86_64/signals.rs +++ b/src/aero_kernel/src/arch/x86_64/signals.rs @@ -52,15 +52,21 @@ impl SignalFrame { frame: &mut InterruptStack, sigmask: u64, ) -> SignalFrame { - SignalFrame { + let mut frame = SignalFrame { restart_syscall: if restart { frame.scratch.rax // syscall number } else { - syscall_result + u64::MAX }, frame: *frame, sigmask, + }; + + if !restart { + frame.frame.scratch.rax = syscall_result; } + + frame } } @@ -152,7 +158,7 @@ pub fn syscall_check_signals(syscall_result: isize, stack: &mut InterruptStack) } } -pub fn sigreturn(stack: &mut InterruptStack) -> usize { +pub fn sigreturn(stack: &mut InterruptStack) { let mut writer = StackHelper::new(&mut stack.iret.rsp); let signal_frame = unsafe { writer.get::() }; @@ -166,12 +172,9 @@ pub fn sigreturn(stack: &mut InterruptStack) -> usize { writer.get_by(REDZONE_SIZE); - let result = signal_frame.frame.scratch.rax; *stack = signal_frame.frame; if signal_frame.restart_syscall != u64::MAX { stack.iret.rip -= SYSCALL_INSTRUCTION_SIZE; } - - result as usize } diff --git a/src/aero_kernel/src/arch/x86_64/syscall.rs b/src/aero_kernel/src/arch/x86_64/syscall.rs index 89846d616dd..23ec2e0cc9c 100644 --- a/src/aero_kernel/src/arch/x86_64/syscall.rs +++ b/src/aero_kernel/src/arch/x86_64/syscall.rs @@ -92,8 +92,7 @@ pub(super) extern "C" fn x86_64_do_syscall(stack: &mut InterruptErrorStack) { match syscall_number { // handle arch-specific syscalls (`sigreturn` and `arch_prctl`): aero_syscall::prelude::SYS_SIGRETURN => { - let result = super::signals::sigreturn(stack); - stack.scratch.rax = result as u64; + super::signals::sigreturn(stack); return; } diff --git a/src/aero_syscall/src/signal.rs b/src/aero_syscall/src/signal.rs index 77fea5a519b..9071e4b8921 100644 --- a/src/aero_syscall/src/signal.rs +++ b/src/aero_syscall/src/signal.rs @@ -70,7 +70,7 @@ pub const SIG_IGN: i64 = 1; // ignore pub enum SignalHandler { Ignore, Default, - Handle(fn(usize)), + Handle(extern "C" fn(usize)), } impl Default for SignalHandler { @@ -85,7 +85,9 @@ impl From for SignalHandler { match v { SIG_IGN => SignalHandler::Ignore, SIG_DFL => SignalHandler::Default, - v => SignalHandler::Handle(unsafe { core::mem::transmute::(v as u64) }), + v => SignalHandler::Handle(unsafe { + core::mem::transmute::(v as u64) + }), } } } diff --git a/userland/apps/utest/src/main.rs b/userland/apps/utest/src/main.rs index db20abf6daa..985fa506b0c 100644 --- a/userland/apps/utest/src/main.rs +++ b/userland/apps/utest/src/main.rs @@ -139,7 +139,7 @@ fn signal_handler() -> Result<(), SyscallError> { static PIPE_WRITE: AtomicUsize = AtomicUsize::new(0); PIPE_WRITE.store(pipe[1], Ordering::SeqCst); - fn handle_segmentation_fault(fault: usize) { + extern "C" fn handle_segmentation_fault(fault: usize) { core::assert_eq!(fault, 11); let pfd = PIPE_WRITE.load(Ordering::SeqCst); From 5940bade4145a45be5d9821955157f45a01c911d Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 7 Apr 2023 14:13:33 +1000 Subject: [PATCH 170/368] kernel::sched: remove task from session, group on exit Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/userland/scheduler/mod.rs | 2 +- src/aero_kernel/src/userland/task/sessions.rs | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index 35a530e6881..ebecc268cb8 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -119,8 +119,8 @@ impl Scheduler { pub fn exit(&self, status: isize) -> ! { let current_task = self.inner.current_task(); + SESSIONS.remove_task(current_task.clone()); self.tasks.remove_task(current_task); - self.inner.exit(status) } diff --git a/src/aero_kernel/src/userland/task/sessions.rs b/src/aero_kernel/src/userland/task/sessions.rs index e845bdc514c..9b3ce8f1c5e 100644 --- a/src/aero_kernel/src/userland/task/sessions.rs +++ b/src/aero_kernel/src/userland/task/sessions.rs @@ -55,6 +55,14 @@ impl Group { assert!(self.tasks.lock_irq().insert(task.pid(), task).is_none()); } + pub fn remove_task(&self, task: Arc) { + assert!(self.tasks.lock_irq().remove(&task.pid()).is_some()); + } + + pub fn is_empty(&self) -> bool { + self.tasks.lock_irq().is_empty() + } + pub fn signal(&self, target: usize) { for (_, task) in self.tasks.lock_irq().iter() { log::error!("Sending signal to task: {:?}", task.path()); @@ -98,6 +106,24 @@ impl Session { groups.insert(task.group_id(), Group::new(task)); } } + + pub fn remove_task(&self, task: Arc) { + let mut groups = self.groups.lock(); + let group = groups + .get(&task.group_id()) + .expect("Session::remove_task: ESRCH"); + + group.remove_task(task.clone()); + + if group.is_empty() { + assert!(task.is_group_leader()); + groups.remove(&task.group_id()); + } + } + + pub fn is_empty(&self) -> bool { + self.groups.lock_irq().is_empty() + } } pub struct SessionList(Mutex>>); @@ -127,6 +153,20 @@ impl SessionList { } } + pub fn remove_task(&self, task: Arc) { + let mut sessions = self.0.lock_irq(); + let session = sessions + .get(&task.session_id()) + .expect("SessionList::remove_task: ESRCH"); + + session.remove_task(task.clone()); + + if session.is_empty() { + assert!(task.is_session_leader()); + sessions.remove(&task.session_id()); + } + } + pub fn isolate(&self, task: Arc) { assert!(!task.is_group_leader() && !task.is_session_leader()); From 62fa164970c2016c12b1cf532668c9645811c2e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Apr 2023 04:15:23 +0000 Subject: [PATCH 171/368] build(deps): bump spin from 0.9.5 to 0.9.8 in /userland Bumps [spin](https://github.com/mvdnes/spin-rs) from 0.9.5 to 0.9.8. - [Release notes](https://github.com/mvdnes/spin-rs/releases) - [Changelog](https://github.com/mvdnes/spin-rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/mvdnes/spin-rs/commits) --- updated-dependencies: - dependency-name: spin dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- userland/Cargo.lock | 12 ++++++------ userland/servers/system_server/Cargo.toml | 2 +- userland/servers/window_server/Cargo.toml | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/userland/Cargo.lock b/userland/Cargo.lock index 7cc758b7f7f..04b43fefabb 100644 --- a/userland/Cargo.lock +++ b/userland/Cargo.lock @@ -10,7 +10,7 @@ dependencies = [ "lazy_static", "postcard", "serde", - "spin 0.9.5", + "spin 0.9.8", ] [[package]] @@ -120,7 +120,7 @@ dependencies = [ "hash32", "rustc_version", "serde", - "spin 0.9.5", + "spin 0.9.8", "stable_deref_trait", ] @@ -277,9 +277,9 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "spin" -version = "0.9.5" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dccf47db1b41fa1573ed27ccf5e08e3ca771cb994f776668c5ebda893b248fc" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" dependencies = [ "lock_api", ] @@ -308,7 +308,7 @@ dependencies = [ "aero_ipc", "aero_syscall", "hashbrown", - "spin 0.9.5", + "spin 0.9.8", ] [[package]] @@ -360,7 +360,7 @@ dependencies = [ "aero_ipc", "aero_syscall", "hashbrown", - "spin 0.9.5", + "spin 0.9.8", ] [[package]] diff --git a/userland/servers/system_server/Cargo.toml b/userland/servers/system_server/Cargo.toml index 47545079c1b..b875cdaa3e7 100644 --- a/userland/servers/system_server/Cargo.toml +++ b/userland/servers/system_server/Cargo.toml @@ -6,6 +6,6 @@ edition = "2021" [dependencies] hashbrown = "0.12.0" -spin = "0.9.2" +spin = "0.9.8" aero_syscall = { path = "../../../src/aero_syscall" } aero_ipc = { path = "../../libs/aero_ipc" } diff --git a/userland/servers/window_server/Cargo.toml b/userland/servers/window_server/Cargo.toml index e934c6b580e..d10bc5f79b0 100644 --- a/userland/servers/window_server/Cargo.toml +++ b/userland/servers/window_server/Cargo.toml @@ -6,6 +6,6 @@ edition = "2021" [dependencies] hashbrown = "0.12.0" -spin = "0.9.2" +spin = "0.9.8" aero_syscall = { path = "../../../src/aero_syscall" } aero_ipc = { path = "../../libs/aero_ipc" } From 8c0f8c893b2a4967d20b8e6e0692f8a50f2174fc Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 7 Apr 2023 18:33:02 +1000 Subject: [PATCH 172/368] task: handle termination by signal Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/arch/x86_64/syscall.rs | 4 +- src/aero_kernel/src/syscall/process.rs | 4 +- src/aero_kernel/src/userland/scheduler/mod.rs | 10 ++++- .../src/userland/scheduler/round_robin.rs | 8 ++-- src/aero_kernel/src/userland/signals.rs | 17 ++++---- src/aero_kernel/src/userland/task/mod.rs | 39 ++++++++++++------- 6 files changed, 48 insertions(+), 34 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/syscall.rs b/src/aero_kernel/src/arch/x86_64/syscall.rs index 23ec2e0cc9c..002219f37ab 100644 --- a/src/aero_kernel/src/arch/x86_64/syscall.rs +++ b/src/aero_kernel/src/arch/x86_64/syscall.rs @@ -3,7 +3,7 @@ use raw_cpuid::CpuId; use crate::arch::gdt::GdtEntryType; use crate::mem::paging::VirtAddr; -use crate::userland::scheduler; +use crate::userland::scheduler::{self, ExitStatus}; use crate::utils::sync::IrqGuard; use super::interrupts::InterruptErrorStack; @@ -73,7 +73,7 @@ pub(super) extern "sysv64" fn x86_64_check_sysenter(stack: &mut InterruptErrorSt log::error!("bad sysenter: rip={:#018x},rsp={:#018x}", rip, rsp); // Forcibly kill the process, we have nowhere to return to. - scheduler::get_scheduler().exit(-1); + scheduler::get_scheduler().exit(ExitStatus::Normal(-1)); } } diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index d52d0edff2e..2e0eba14e23 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -27,7 +27,7 @@ use crate::fs; use crate::fs::Path; use crate::mem::paging::VirtAddr; -use crate::userland::scheduler; +use crate::userland::scheduler::{self, ExitStatus}; use crate::userland::signals::SignalEntry; use crate::userland::task::sessions::SESSIONS; use crate::userland::task::{Task, TaskId}; @@ -53,7 +53,7 @@ pub fn exit(status: usize) -> Result { log::trace!("exiting the process (pid={pid}, path={path:?}) with status: {status}"); crate::unwind::unwind_stack_trace(); - scheduler::get_scheduler().exit(status as isize); + scheduler::get_scheduler().exit(ExitStatus::Normal(status as isize)); } } diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index ebecc268cb8..4210c261676 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -57,7 +57,7 @@ pub trait SchedulerInterface: Send + Sync { fn preempt(&self); /// Exits the current task. - fn exit(&self, status: isize) -> !; + fn exit(&self, status: ExitStatus) -> !; } struct TaskContainer(Mutex>>); @@ -79,6 +79,12 @@ impl TaskContainer { unsafe impl Send for TaskContainer {} unsafe impl Sync for TaskContainer {} +#[derive(Debug, Clone)] +pub enum ExitStatus { + Normal(isize), + Signal(usize), +} + pub struct Scheduler { tasks: TaskContainer, pub inner: Arc, @@ -117,7 +123,7 @@ impl Scheduler { self.inner.current_task() } - pub fn exit(&self, status: isize) -> ! { + pub fn exit(&self, status: ExitStatus) -> ! { let current_task = self.inner.current_task(); SESSIONS.remove_task(current_task.clone()); self.tasks.remove_task(current_task); diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 135a47c4b6b..2f7022eadf5 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -28,7 +28,7 @@ use crate::userland::task::{SchedTaskAdapter, Task, TaskState}; use crate::utils::sync::{BlockQueue, IrqGuard}; use crate::utils::PerCpu; -use super::SchedulerInterface; +use super::{ExitStatus, SchedulerInterface}; /// Scheduler queue containing a vector of all of the task of the enqueued /// taskes. @@ -291,7 +291,7 @@ impl SchedulerInterface for RoundRobin { self.sleep(None) } - fn exit(&self, status: isize) -> ! { + fn exit(&self, status: ExitStatus) -> ! { let guard = IrqGuard::new(); let queue = self.queue.get_mut(); @@ -301,9 +301,7 @@ impl SchedulerInterface for RoundRobin { .expect("attempted to exit current task before it was initialized") .clone(); - current_task - .exit_status - .store(status, core::sync::atomic::Ordering::SeqCst); + current_task.exit_status.call_once(|| status); queue.push_dead(current_task.clone()); queue.dead_wq.notify_complete(); diff --git a/src/aero_kernel/src/userland/signals.rs b/src/aero_kernel/src/userland/signals.rs index b7e499544fd..20b10b75a27 100644 --- a/src/aero_kernel/src/userland/signals.rs +++ b/src/aero_kernel/src/userland/signals.rs @@ -28,17 +28,18 @@ use bit_field::BitField; use aero_syscall::SyscallError; -use super::scheduler; +use super::scheduler::{self, ExitStatus}; use crate::fs::FileSystemError; use crate::utils::sync::{Mutex, MutexGuard}; mod default { use crate::userland::scheduler; + use crate::userland::scheduler::ExitStatus; #[derive(Copy, Clone, PartialEq)] pub enum Action { Ignore, - Handle(fn()), + Handle(fn(usize)), } /// Some of the default actions for the signals. @@ -80,15 +81,15 @@ mod default { Action::Ignore, // UNUSED ]; - fn terminate() { - scheduler::get_scheduler().exit(1); + fn terminate(signal: usize) { + scheduler::get_scheduler().exit(ExitStatus::Signal(signal)); } - fn terminate_thread() { + fn terminate_thread(_signal: usize) { unimplemented!() } - fn stop() { + fn stop(_signal: usize) { unimplemented!() } @@ -102,7 +103,7 @@ mod default { let action = DEFAULT_ACTIONS[signal]; if let Action::Handle(f) = action { - (f)(); + (f)(signal); } } } @@ -436,7 +437,7 @@ pub fn check_for_signals() -> Option<(usize, SignalEntry)> { // Check if a SIGKILL is pending, and if so, kill the task. if signals.is_pending(SIGKILL as u64) { signals.clear_pending(SIGKILL as u64); - scheduler::get_scheduler().exit(1); + scheduler::get_scheduler().exit(ExitStatus::Normal(1)); } for i in 0..SIGNAL_COUNT { diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index bd3a5e6b297..85dbb896a27 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -22,10 +22,10 @@ pub mod sessions; use aero_syscall::WaitPidFlags; use alloc::sync::{Arc, Weak}; -use spin::RwLock; +use spin::{Once, RwLock}; use core::cell::UnsafeCell; -use core::sync::atomic::{AtomicBool, AtomicIsize, AtomicU8, AtomicUsize, Ordering}; +use core::sync::atomic::{AtomicBool, AtomicU8, AtomicUsize, Ordering}; use crate::fs::cache::{DirCacheImpl, DirCacheItem}; use crate::fs::{self, FileSystem}; @@ -40,7 +40,7 @@ use crate::userland::signals::Signals; use intrusive_collections::{intrusive_adapter, LinkedList, LinkedListLink}; -use super::scheduler; +use super::scheduler::{self, ExitStatus}; use super::signals::{SignalResult, TriggerResult}; use super::terminal::TerminalDevice; use super::vm::Vm; @@ -147,7 +147,7 @@ impl Zombies { while let Some(t) = cursor.get() { for pid in pids { if t.pid().as_usize() == *pid { - captured = Some((t.pid(), t.exit_status())); + captured = Some((t.pid(), t.exit_status().clone())); cursor.remove(); return true; @@ -164,9 +164,18 @@ impl Zombies { false })?; - if let Some((tid, st)) = captured { - log::debug!("waitpid: status = {st}"); - *status = st as u32; + if let Some((tid, exit_status)) = captured { + // mlibc/abis/linux/wait.h (`W_EXITCODE`) + match exit_status { + ExitStatus::Normal(code) => { + *status = ((code as u32) << 8) | 0; + } + + ExitStatus::Signal(signal) => { + *status = (0 << 8) | signal as u32; + } + } + Ok(tid.as_usize()) } else { // If `WNOHANG` was specified in flags and there were no children in a waitable @@ -210,7 +219,7 @@ pub struct Task { cwd: RwLock>, - pub(super) exit_status: AtomicIsize, + pub(super) exit_status: Once, controlling_terminal: Mutex>>, systrace: AtomicBool, @@ -248,7 +257,7 @@ impl Task { pending_io: AtomicBool::new(false), sleep_duration: AtomicUsize::new(0), - exit_status: AtomicIsize::new(0), + exit_status: Once::new(), children: Mutex::new(Default::default()), parent: Mutex::new(None), @@ -287,7 +296,7 @@ impl Task { clink: Default::default(), sleep_duration: AtomicUsize::new(0), - exit_status: AtomicIsize::new(0), + exit_status: Once::new(), executable: Mutex::new(None), pending_io: AtomicBool::new(false), @@ -320,7 +329,7 @@ impl Task { clink: Default::default(), sleep_duration: AtomicUsize::new(0), - exit_status: AtomicIsize::new(0), + exit_status: Once::new(), tid: pid.clone(), sid: AtomicUsize::new(self.session_id()), @@ -382,7 +391,7 @@ impl Task { clink: Default::default(), sleep_duration: AtomicUsize::new(0), - exit_status: AtomicIsize::new(0), + exit_status: Once::new(), tid: pid.clone(), sid: AtomicUsize::new(self.session_id()), @@ -449,8 +458,8 @@ impl Task { children.push_back(child); } - fn exit_status(&self) -> isize { - self.exit_status.load(Ordering::SeqCst) + fn exit_status(&self) -> &ExitStatus { + self.exit_status.get().unwrap() } pub fn set_sleep_duration(&self, duration: usize) { @@ -658,7 +667,7 @@ impl Task { parent.zombies.add_zombie(self.this()); if self.is_process_leader() { - // parent.signal(aero_syscall::signal::SIGCHLD); + parent.signal(aero_syscall::signal::SIGCHLD); } } } From bf35c4047e5181c102b28067e2ddb736e48da91a Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 8 Apr 2023 13:33:57 +1000 Subject: [PATCH 173/368] pty::Slave: set `c_lflag` and `c_cc` defaults Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/pty.rs | 46 +++++++++++++++++------- src/aero_kernel/src/userland/task/mod.rs | 2 +- src/aero_syscall/src/lib.rs | 25 +++++++++++++ 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index f0b4a676fa0..5c3a2ee00a6 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -147,20 +147,42 @@ struct Slave { impl Slave { pub fn new(master: Arc) -> Self { + use aero_syscall::*; + + // converts ^X into X + let ctrl = |c| (c as u8 - 0x40); + + let mut termios = Termios { + c_iflag: aero_syscall::TermiosIFlag::empty(), + c_oflag: aero_syscall::TermiosOFlag::ONLCR, + c_cflag: aero_syscall::TermiosCFlag::empty(), + c_lflag: TermiosLFlag::ECHOKE + | TermiosLFlag::ECHOE + | TermiosLFlag::ECHOK + | TermiosLFlag::ECHO + | TermiosLFlag::ECHOCTL + | TermiosLFlag::ISIG + | TermiosLFlag::ICANON + | TermiosLFlag::IEXTEN, + c_line: 0, + c_cc: [0; 32], + c_ispeed: 0, + c_ospeed: 0, + }; + + termios.c_cc[VINTR] = ctrl('C'); + termios.c_cc[VQUIT] = ctrl('\\'); + termios.c_cc[VERASE] = 127; // DEL character + termios.c_cc[VKILL] = ctrl('U'); + termios.c_cc[VEOF] = ctrl('D'); + termios.c_cc[VMIN] = 1; + termios.c_cc[VSTART] = ctrl('Q'); + termios.c_cc[VSTOP] = ctrl('S'); + termios.c_cc[VSUSP] = ctrl('Z'); + Self { master, - inner: Mutex::new(SlaveInner { - termios: Termios { - c_iflag: aero_syscall::TermiosIFlag::empty(), - c_oflag: aero_syscall::TermiosOFlag::ONLCR, - c_cflag: aero_syscall::TermiosCFlag::empty(), - c_lflag: aero_syscall::TermiosLFlag::ECHO | aero_syscall::TermiosLFlag::ICANON, - c_line: 0, - c_cc: [0; 32], - c_ispeed: 0, - c_ospeed: 0, - }, - }), + inner: Mutex::new(SlaveInner { termios }), } } } diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 85dbb896a27..2e094cfe14d 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -179,7 +179,7 @@ impl Zombies { Ok(tid.as_usize()) } else { // If `WNOHANG` was specified in flags and there were no children in a waitable - // state, then waitid() returns 0 immediately. + // state, then waipid() returns 0 immediately. *status = 0; Ok(0) } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 8efa8e34e82..6e91a2bb7aa 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -302,7 +302,27 @@ pub struct WinSize { pub ws_ypixel: u16, } +// indices for the c_cc array in struct termios +// // abis/linux/termios.h +pub const VINTR: usize = 0; +pub const VQUIT: usize = 1; +pub const VERASE: usize = 2; +pub const VKILL: usize = 3; +pub const VEOF: usize = 4; +pub const VTIME: usize = 5; +pub const VMIN: usize = 6; +pub const VSWTC: usize = 7; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VSUSP: usize = 10; +pub const VEOL: usize = 11; +pub const VREPRINT: usize = 12; +pub const VDISCARD: usize = 13; +pub const VWERASE: usize = 14; +pub const VLNEXT: usize = 15; +pub const VEOL2: usize = 16; + bitflags::bitflags! { #[derive(Default)] pub struct TermiosIFlag: u32 { @@ -334,6 +354,11 @@ bitflags::bitflags! { const NOFLSH = 0x80; const TOSTOP = 0x100; const ECHOPRT = 0x400; + // options/posix/include/termios.h + const ECHOCTL = 0o001000; + const FLUSHO = 0o010000; + const IMAXBEL = 0o020000; + const ECHOKE = 0o040000; } } From 69087f2b37706e7f4538c00f1cecb2ad6f6a1534 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 8 Apr 2023 13:37:09 +1000 Subject: [PATCH 174/368] patches::mlibc: fix The current version of the patch had useless sha1 information (meson.build). Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 15b520bc18d..5bf653a1434 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -24,32 +24,6 @@ index fdd60a0..9f811f4 100644 .vscode +# clangd cache files: +.cache -diff --git a/meson.build b/meson.build -index 2261926..b7078fb 100644 ---- a/meson.build -+++ b/meson.build -@@ -316,10 +316,10 @@ rtlib_deps = [] - - if not headers_only - libgcc = meson.get_compiler('c').find_library('gcc', required: false) -- -+ - compiler_rt_name = 'libclang_rt.builtins-' + host_machine.cpu_family() - compiler_rt = meson.get_compiler('c').find_library(compiler_rt_name, required: false) -- -+ - if libgcc.found() - rtlib_deps += libgcc - elif compiler_rt.found() -@@ -327,7 +327,7 @@ if not headers_only - else - error('neither libgcc nor ' + compiler_rt_name + ' was found') - endif -- -+ - ld_cpp_args = [ - '-fvisibility=hidden', - '-fno-stack-protector', diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp index c0e54fe..ddeec8a 100644 --- a/options/ansi/generic/stdlib-stubs.cpp From 8ed8a9dc77489ace2b5b21f31b0665e0dac902af Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 8 Apr 2023 14:22:19 +1000 Subject: [PATCH 175/368] mlibc::sys_tcsetattr: do not ignore `optional_action` Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 5bf653a1434..7ac7bfc7996 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,18 +1,18 @@ -From 64a5317fc58a29c4c2cf99b836c9d2d00cec0a8d Mon Sep 17 00:00:00 2001 +From 986ca7e14a843967eab13d704b8a3fe742ef2bfc Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Thu, 6 Apr 2023 14:57:57 +1000 +Date: Sat, 8 Apr 2023 14:20:23 +1000 Subject: [PATCH] --- .gitignore | 2 ++ - meson.build | 6 +++--- options/ansi/generic/stdlib-stubs.cpp | 6 ++++-- options/glibc/generic/execinfo.cpp | 5 +++-- options/rtdl/generic/linker.cpp | 2 +- sysdeps/aero/generic/aero.cpp | 27 +++++++++++++++++++-------- + sysdeps/aero/generic/filesystem.cpp | 14 ++++++++------ sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++++++ sysdeps/aero/include/aero/syscall.h | 10 ++++++++++ - 8 files changed, 67 insertions(+), 16 deletions(-) + 8 files changed, 72 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index fdd60a0..9f811f4 100644 @@ -123,6 +123,33 @@ index 0faf386..e6bd277 100644 return 0; } +diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp +index 38b0e1b..acbcef9 100644 +--- a/sysdeps/aero/generic/filesystem.cpp ++++ b/sysdeps/aero/generic/filesystem.cpp +@@ -155,14 +155,16 @@ int sys_tcgetattr(int fd, struct termios *attr) { + } + + int sys_tcsetattr(int fd, int optional_action, const struct termios *attr) { +- if (optional_action) +- mlibc::infoLogger() +- << "mlibc: warning: sys_tcsetattr ignores optional_action" +- << frg::endlog; ++ int req; + +- int result; ++ switch (optional_action) { ++ case TCSANOW: req = TCSETS; break; ++ case TCSADRAIN: req = TCSETSW; break; ++ case TCSAFLUSH: req = TCSETSF; break; ++ default: return EINVAL; ++ } + +- if (int e = sys_ioctl(fd, TCSETSF, (void *)attr, &result); e) ++ if (int e = sys_ioctl(fd, req, (void *)attr, NULL); e) + return e; + + return 0; diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp index c730bff..39cacb4 100644 --- a/sysdeps/aero/generic/sockets.cpp From 353521eda409e0d3bdfb13bc6724eff81e80df61 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 8 Apr 2023 17:15:31 +1000 Subject: [PATCH 176/368] pty: echo `^X` if exited by signal Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/pty.rs | 115 ++++++++++++++--------- src/aero_kernel/src/drivers/tty.rs | 13 ++- src/aero_kernel/src/userland/task/mod.rs | 14 ++- src/aero_kernel/src/userland/terminal.rs | 2 +- src/aero_syscall/src/lib.rs | 6 ++ 5 files changed, 97 insertions(+), 53 deletions(-) diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 5c3a2ee00a6..3a6c461491e 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -44,6 +44,7 @@ use crate::fs::{self, FileSystemError}; use crate::mem::paging::VirtAddr; use crate::userland::scheduler; +use crate::userland::scheduler::ExitStatus; use crate::userland::task::Task; use crate::userland::terminal::LineDiscipline; use crate::userland::terminal::TerminalDevice; @@ -62,21 +63,60 @@ struct Master { wq: BlockQueue, window_size: Mutex, buffer: Mutex>, + termios: Mutex, discipline: LineDiscipline, } impl Master { pub fn new() -> Self { + use aero_syscall::*; + + // converts `^X` into `X` + let ctrl = |c| (c as u8 - 0x40); + + let mut termios = Termios { + c_iflag: aero_syscall::TermiosIFlag::empty(), + c_oflag: aero_syscall::TermiosOFlag::ONLCR, + c_cflag: aero_syscall::TermiosCFlag::empty(), + c_lflag: TermiosLFlag::ECHOKE + | TermiosLFlag::ECHOE + | TermiosLFlag::ECHOK + | TermiosLFlag::ECHO + | TermiosLFlag::ECHOCTL + | TermiosLFlag::ISIG + | TermiosLFlag::ICANON + | TermiosLFlag::IEXTEN, + c_line: 0, + c_cc: [0; 32], + c_ispeed: 0, + c_ospeed: 0, + }; + + termios.c_cc[VINTR] = ctrl('C'); + termios.c_cc[VQUIT] = ctrl('\\'); + termios.c_cc[VERASE] = 127; // DEL character + termios.c_cc[VKILL] = ctrl('U'); + termios.c_cc[VEOF] = ctrl('D'); + termios.c_cc[VMIN] = 1; + termios.c_cc[VSTART] = ctrl('Q'); + termios.c_cc[VSTOP] = ctrl('S'); + termios.c_cc[VSUSP] = ctrl('Z'); + Self { id: PTY_ID.fetch_add(1, Ordering::SeqCst), wq: BlockQueue::new(), window_size: Mutex::new(WinSize::default()), buffer: Mutex::new(Vec::new()), + termios: Mutex::new(termios), discipline: LineDiscipline::new(), } } + + pub fn is_cooked(&self) -> bool { + self.termios.lock_irq().is_cooked() + } } impl INodeInterface for Master { @@ -134,56 +174,39 @@ impl TerminalDevice for Master { assert!(task.is_session_leader()); self.discipline.set_foreground(task); } -} -struct SlaveInner { - termios: Termios, + fn detach(&self, task: Arc) { + use aero_syscall::signal::*; + use aero_syscall::*; + + if !self.is_cooked() { + return; + } + + if let ExitStatus::Signal(signo) = task.exit_status() { + let mut buffer = self.buffer.lock_irq(); + let termios = self.termios.lock_irq(); + + // converts `X` into `^X` and pushes the result into the master PTY buffer. + let mut ctrl = |c| { + buffer.extend_from_slice(&[b'^', c + 0x40]); + }; + + match *signo { + SIGINT => ctrl(termios.c_cc[VINTR]), + _ => {} + }; + } + } } struct Slave { master: Arc, - inner: Mutex, } impl Slave { pub fn new(master: Arc) -> Self { - use aero_syscall::*; - - // converts ^X into X - let ctrl = |c| (c as u8 - 0x40); - - let mut termios = Termios { - c_iflag: aero_syscall::TermiosIFlag::empty(), - c_oflag: aero_syscall::TermiosOFlag::ONLCR, - c_cflag: aero_syscall::TermiosCFlag::empty(), - c_lflag: TermiosLFlag::ECHOKE - | TermiosLFlag::ECHOE - | TermiosLFlag::ECHOK - | TermiosLFlag::ECHO - | TermiosLFlag::ECHOCTL - | TermiosLFlag::ISIG - | TermiosLFlag::ICANON - | TermiosLFlag::IEXTEN, - c_line: 0, - c_cc: [0; 32], - c_ispeed: 0, - c_ospeed: 0, - }; - - termios.c_cc[VINTR] = ctrl('C'); - termios.c_cc[VQUIT] = ctrl('\\'); - termios.c_cc[VERASE] = 127; // DEL character - termios.c_cc[VKILL] = ctrl('U'); - termios.c_cc[VEOF] = ctrl('D'); - termios.c_cc[VMIN] = 1; - termios.c_cc[VSTART] = ctrl('Q'); - termios.c_cc[VSTOP] = ctrl('S'); - termios.c_cc[VSUSP] = ctrl('Z'); - - Self { - master, - inner: Mutex::new(SlaveInner { termios }), - } + Self { master } } } @@ -202,8 +225,6 @@ impl INodeInterface for Slave { } fn ioctl(&self, command: usize, arg: usize) -> fs::Result { - let mut inner = self.inner.lock_irq(); - match command { aero_syscall::TIOCGWINSZ => { let winsize = VirtAddr::new(arg as u64).read_mut::()?; @@ -214,14 +235,14 @@ impl INodeInterface for Slave { aero_syscall::TCGETS => { let termios = VirtAddr::new(arg as u64).read_mut::()?; - *termios = inner.termios; + *termios = *self.master.termios.lock_irq(); Ok(0) } aero_syscall::TCSETSF => { let termios = VirtAddr::new(arg as u64).read_mut::()?; - inner.termios = *termios; + *self.master.termios.lock_irq() = *termios; Ok(0) } @@ -259,9 +280,9 @@ impl INodeInterface for Slave { fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { if self - .inner - .lock_irq() + .master .termios + .lock_irq() .c_oflag .contains(aero_syscall::TermiosOFlag::ONLCR) { diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index d532d3aad9f..ab9bcc0fee6 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -240,10 +240,13 @@ impl INodeInterface for Tty { let connected = self.connected.fetch_add(1, Ordering::SeqCst); if connected == 0 { super::keyboard::register_keyboard_listener(TTY.clone()); - } - let current_task = scheduler::get_scheduler().current_task(); - current_task.attach(self.sref.upgrade().unwrap()); + // FIXME: This is wrong since programs assume that /dev/tty points to the controlling + // terminal not TTY1,TTY2, etc.. This means that the Aero rendy should be another device + // node. + let current_task = scheduler::get_scheduler().current_task(); + current_task.attach(self.sref.upgrade().unwrap()); + } Ok(None) } @@ -376,6 +379,10 @@ impl TerminalDevice for Tty { fn attach(&self, _task: Arc) { /* FIXME: We should handle foreground groups in TTY aswell */ } + + fn detach(&self, _task: Arc) { + /* FIXME: TTY handle */ + } } #[cfg(target_arch = "x86_64")] diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 2e094cfe14d..17fa9c45f03 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -458,7 +458,7 @@ impl Task { children.push_back(child); } - fn exit_status(&self) -> &ExitStatus { + pub fn exit_status(&self) -> &ExitStatus { self.exit_status.get().unwrap() } @@ -660,6 +660,7 @@ impl Task { } pub(super) fn into_zombie(&self) { + self.detach(); self.arch_task_mut().dealloc(); if let Some(parent) = self.get_parent() { @@ -680,6 +681,15 @@ impl Task { self.systrace.store(true, Ordering::SeqCst); } + pub fn detach(&self) { + let mut controlling_terminal = self.controlling_terminal.lock_irq(); + + if let Some(term) = controlling_terminal.as_ref() { + term.detach(self.sref.upgrade().unwrap()); + *controlling_terminal = None; + } + } + pub fn attach(&self, terminal: Arc) { if self.is_session_leader() { terminal.attach(self.sref.upgrade().unwrap()); @@ -687,7 +697,7 @@ impl Task { } else { // FIXME: If its not the session leader then we needs to be a part of the the same // session as the terminal's foreground group. - // todo!() + *self.controlling_terminal.lock_irq() = Some(terminal); } } diff --git a/src/aero_kernel/src/userland/terminal.rs b/src/aero_kernel/src/userland/terminal.rs index ecd7927371b..3c4db887007 100644 --- a/src/aero_kernel/src/userland/terminal.rs +++ b/src/aero_kernel/src/userland/terminal.rs @@ -35,6 +35,7 @@ pub trait TerminalDevice: Send + Sync { /// The processs group of `task` will be set as the active process group that is associated with /// the terminal (foreground). fn attach(&self, task: Arc); + fn detach(&self, task: Arc); } /// Line Discipline @@ -79,7 +80,6 @@ impl LineDiscipline { // ETX: End of Text (`Ctrl+C`) 0x3 => { if let Some(foreground) = self.foreground() { - log::warn!("LineDiscipline: recieved End of Text (`Ctrl+C`)"); foreground.signal(signal::SIGINT); } } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 6e91a2bb7aa..248c5d0a4e8 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -428,6 +428,12 @@ pub struct Termios { pub c_ospeed: u32, } +impl Termios { + pub fn is_cooked(&self) -> bool { + self.c_lflag.contains(TermiosLFlag::ICANON) + } +} + pub const AT_FDCWD: isize = -100; #[repr(C)] From 3d2bc2e25b3a44438a9dc63a5f0f136e303b526c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 9 Apr 2023 16:55:59 +1000 Subject: [PATCH 177/368] mlibc: `sys_tcflow` stub Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 25 +++++++++++++++++++------ src/aero_syscall/src/lib.rs | 16 ++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 7ac7bfc7996..453d7fba8d6 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,6 +1,6 @@ -From 986ca7e14a843967eab13d704b8a3fe742ef2bfc Mon Sep 17 00:00:00 2001 +From 37a6ba3adc5c0f3594703bf55e8c0411f1f674bd Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sat, 8 Apr 2023 14:20:23 +1000 +Date: Sun, 9 Apr 2023 15:36:45 +1000 Subject: [PATCH] --- @@ -9,10 +9,10 @@ Subject: [PATCH] options/glibc/generic/execinfo.cpp | 5 +++-- options/rtdl/generic/linker.cpp | 2 +- sysdeps/aero/generic/aero.cpp | 27 +++++++++++++++++++-------- - sysdeps/aero/generic/filesystem.cpp | 14 ++++++++------ + sysdeps/aero/generic/filesystem.cpp | 22 ++++++++++++++++------ sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++++++ sysdeps/aero/include/aero/syscall.h | 10 ++++++++++ - 8 files changed, 72 insertions(+), 19 deletions(-) + 8 files changed, 80 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index fdd60a0..9f811f4 100644 @@ -124,10 +124,10 @@ index 0faf386..e6bd277 100644 } diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index 38b0e1b..acbcef9 100644 +index 38b0e1b..4f85512 100644 --- a/sysdeps/aero/generic/filesystem.cpp +++ b/sysdeps/aero/generic/filesystem.cpp -@@ -155,14 +155,16 @@ int sys_tcgetattr(int fd, struct termios *attr) { +@@ -155,19 +155,29 @@ int sys_tcgetattr(int fd, struct termios *attr) { } int sys_tcsetattr(int fd, int optional_action, const struct termios *attr) { @@ -150,6 +150,19 @@ index 38b0e1b..acbcef9 100644 return e; return 0; + } + ++int sys_tcflow(int fd, int action) { ++ int res = syscall(SYS_IOCTL, fd, TCXONC, action); ++ if (int e = sc_error(res); e) ++ return e; ++ ++ return 0; ++} ++ + int sys_mkdir(const char *path, mode_t) { + auto result = syscall(SYS_MKDIR, path, strlen(path)); + diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp index c730bff..39cacb4 100644 --- a/sysdeps/aero/generic/sockets.cpp diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 248c5d0a4e8..84b12a23ef5 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -289,10 +289,26 @@ impl From for SeekWhence { pub const TIOCGWINSZ: usize = 0x5413; pub const TIOCSWINSZ: usize = 0x5414; + +// 0x54 is just a magic number to make these relatively unique ('T') +// +// linux-headers/include/uapi/asm-generic/ioctls.h pub const TCGETS: usize = 0x5401; +pub const TCSETS: usize = 0x5402; +pub const TCSETSW: usize = 0x5403; pub const TCSETSF: usize = 0x5404; + +pub const TCXONC: usize = 0x540a; pub const TIOCSCTTY: usize = 0x540e; +// constants for tcflow() +// +// mlibc/options/posix/include/termios.h +pub const TCIOFF: usize = 1; +pub const TCION: usize = 2; +pub const TCOOFF: usize = 3; +pub const TCOON: usize = 4; + #[derive(Default, Copy, Clone)] #[repr(C)] pub struct WinSize { From 551ddbf74046c540f86623e107924b3b16cfac72 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 9 Apr 2023 17:32:03 +1000 Subject: [PATCH 178/368] Revert "mlibc: `sys_tcflow` stub" This reverts commit 3d2bc2e25b3a44438a9dc63a5f0f136e303b526c. --- patches/mlibc/mlibc.patch | 25 ++++++------------------- src/aero_syscall/src/lib.rs | 16 ---------------- 2 files changed, 6 insertions(+), 35 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 453d7fba8d6..7ac7bfc7996 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,6 +1,6 @@ -From 37a6ba3adc5c0f3594703bf55e8c0411f1f674bd Mon Sep 17 00:00:00 2001 +From 986ca7e14a843967eab13d704b8a3fe742ef2bfc Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sun, 9 Apr 2023 15:36:45 +1000 +Date: Sat, 8 Apr 2023 14:20:23 +1000 Subject: [PATCH] --- @@ -9,10 +9,10 @@ Subject: [PATCH] options/glibc/generic/execinfo.cpp | 5 +++-- options/rtdl/generic/linker.cpp | 2 +- sysdeps/aero/generic/aero.cpp | 27 +++++++++++++++++++-------- - sysdeps/aero/generic/filesystem.cpp | 22 ++++++++++++++++------ + sysdeps/aero/generic/filesystem.cpp | 14 ++++++++------ sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++++++ sysdeps/aero/include/aero/syscall.h | 10 ++++++++++ - 8 files changed, 80 insertions(+), 19 deletions(-) + 8 files changed, 72 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index fdd60a0..9f811f4 100644 @@ -124,10 +124,10 @@ index 0faf386..e6bd277 100644 } diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index 38b0e1b..4f85512 100644 +index 38b0e1b..acbcef9 100644 --- a/sysdeps/aero/generic/filesystem.cpp +++ b/sysdeps/aero/generic/filesystem.cpp -@@ -155,19 +155,29 @@ int sys_tcgetattr(int fd, struct termios *attr) { +@@ -155,14 +155,16 @@ int sys_tcgetattr(int fd, struct termios *attr) { } int sys_tcsetattr(int fd, int optional_action, const struct termios *attr) { @@ -150,19 +150,6 @@ index 38b0e1b..4f85512 100644 return e; return 0; - } - -+int sys_tcflow(int fd, int action) { -+ int res = syscall(SYS_IOCTL, fd, TCXONC, action); -+ if (int e = sc_error(res); e) -+ return e; -+ -+ return 0; -+} -+ - int sys_mkdir(const char *path, mode_t) { - auto result = syscall(SYS_MKDIR, path, strlen(path)); - diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp index c730bff..39cacb4 100644 --- a/sysdeps/aero/generic/sockets.cpp diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 84b12a23ef5..248c5d0a4e8 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -289,26 +289,10 @@ impl From for SeekWhence { pub const TIOCGWINSZ: usize = 0x5413; pub const TIOCSWINSZ: usize = 0x5414; - -// 0x54 is just a magic number to make these relatively unique ('T') -// -// linux-headers/include/uapi/asm-generic/ioctls.h pub const TCGETS: usize = 0x5401; -pub const TCSETS: usize = 0x5402; -pub const TCSETSW: usize = 0x5403; pub const TCSETSF: usize = 0x5404; - -pub const TCXONC: usize = 0x540a; pub const TIOCSCTTY: usize = 0x540e; -// constants for tcflow() -// -// mlibc/options/posix/include/termios.h -pub const TCIOFF: usize = 1; -pub const TCION: usize = 2; -pub const TCOOFF: usize = 3; -pub const TCOON: usize = 4; - #[derive(Default, Copy, Clone)] #[repr(C)] pub struct WinSize { From 3ab3858781da4e7ddbb526d685d76d6e1d15d994 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 10 Apr 2023 11:54:15 +1000 Subject: [PATCH 179/368] kernel: mlibc 4.0 ABI-breakage The ones that effect us is: * https://github.com/managarm/mlibc/pull/816 -> `struct epoll_event` now gets correctly packed on `x86_64`. In this commit, the `rust-libc` crate patch is updated to pack the `struct epoll_event` if on`x86_64` and the `aero_syscall` crate does the same aswell. Happy ABI-breakage :) Btw, happy easter aswell :) Signed-off-by: Andy-Python-Programmer --- patches/rust-libc/rust-libc.patch | 144 +++++++++++++++++++++++------- src/aero_syscall/src/consts.rs | 7 +- 2 files changed, 115 insertions(+), 36 deletions(-) diff --git a/patches/rust-libc/rust-libc.patch b/patches/rust-libc/rust-libc.patch index eaf8833c692..9cbf64b2577 100644 --- a/patches/rust-libc/rust-libc.patch +++ b/patches/rust-libc/rust-libc.patch @@ -1,15 +1,30 @@ -From 698a2f63c0fde81a3c2aec2c2de0e7ccfe0f3bd8 Mon Sep 17 00:00:00 2001 +From 1771fe68c2fd9d0e35a2396634c9b79fcb1bb2ab Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Fri, 3 Mar 2023 18:52:53 +1100 +Date: Mon, 10 Apr 2023 11:45:10 +1000 Subject: [PATCH] --- + checkedout.xbstrap | 0 + fetched.xbstrap | 0 + patched.xbstrap | 0 .../linux_like/linux/gnu/b64/x86_64/mod.rs | 4 +- src/unix/linux_like/linux/gnu/mod.rs | 4 +- src/unix/linux_like/linux/mod.rs | 28 +- - src/unix/mlibc/mod.rs | 499 ++++++++++++++++-- - 4 files changed, 481 insertions(+), 54 deletions(-) + src/unix/mlibc/mod.rs | 560 ++++++++++++++++-- + 7 files changed, 542 insertions(+), 54 deletions(-) + create mode 100644 checkedout.xbstrap + create mode 100644 fetched.xbstrap + create mode 100644 patched.xbstrap +diff --git a/checkedout.xbstrap b/checkedout.xbstrap +new file mode 100644 +index 0000000..e69de29 +diff --git a/fetched.xbstrap b/fetched.xbstrap +new file mode 100644 +index 0000000..e69de29 +diff --git a/patched.xbstrap b/patched.xbstrap +new file mode 100644 +index 0000000..e69de29 diff --git a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs index e6307e2..cae81c4 100644 --- a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs @@ -185,7 +200,7 @@ index be12190..c8762d5 100644 .field("ifr_name", &self.ifr_name) .field("ifr_ifru", &self.ifr_ifru) diff --git a/src/unix/mlibc/mod.rs b/src/unix/mlibc/mod.rs -index 2046530..b479ed2 100644 +index 2046530..3436cb1 100644 --- a/src/unix/mlibc/mod.rs +++ b/src/unix/mlibc/mod.rs @@ -47,7 +47,6 @@ pub type fsfilcnt_t = ::c_uint; @@ -287,7 +302,7 @@ index 2046530..b479ed2 100644 } pub struct pthread_rwlock_t { pub __mlibc_m: ::c_uint, -@@ -319,10 +348,111 @@ s! { +@@ -319,10 +348,172 @@ s! { pub struct fd_set { pub fds_bits: [c_char; 128], } @@ -300,12 +315,6 @@ index 2046530..b479ed2 100644 + pub cmsg_type: ::c_int, + } + -+ // options/linux/include/sys/epoll.h -+ pub struct epoll_event { -+ pub events: u32, -+ pub u64: u64, -+ } -+ + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, @@ -334,9 +343,85 @@ index 2046530..b479ed2 100644 + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } ++ ++ pub struct __c_anonymous_ifru_map { ++ pub mem_start: ::c_ulong, ++ pub mem_end: ::c_ulong, ++ pub base_addr: ::c_ushort, ++ pub irq: ::c_uchar, ++ pub dma: ::c_uchar, ++ pub port: ::c_uchar, ++ } ++} ++ ++cfg_if! { ++ if #[cfg(feature = "extra_traits")] { ++ impl ::fmt::Debug for epoll_event { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { ++ let events = self.events; ++ let u64 = self.u64; ++ f.debug_struct("epoll_event") ++ .field("events", &events) ++ .field("u64", &u64) ++ .finish() ++ } ++ } ++ impl PartialEq for epoll_event { ++ fn eq(&self, other: &epoll_event) -> bool { ++ self.events == other.events ++ && self.u64 == other.u64 ++ } ++ } ++ impl Eq for epoll_event {} ++ impl ::hash::Hash for epoll_event { ++ fn hash(&self, state: &mut H) { ++ let events = self.events; ++ let u64 = self.u64; ++ events.hash(state); ++ u64.hash(state); ++ } ++ } ++ ++ #[cfg(libc_union)] ++ impl ::fmt::Debug for __c_anonymous_ifr_ifru { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { ++ f.debug_struct("ifr_ifru") ++ .field("ifru_addr", unsafe { &self.ifru_addr }) ++ .field("ifru_dstaddr", unsafe { &self.ifru_dstaddr }) ++ .field("ifru_broadaddr", unsafe { &self.ifru_broadaddr }) ++ .field("ifru_netmask", unsafe { &self.ifru_netmask }) ++ .field("ifru_hwaddr", unsafe { &self.ifru_hwaddr }) ++ .field("ifru_flags", unsafe { &self.ifru_flags }) ++ .field("ifru_ifindex", unsafe { &self.ifru_ifindex }) ++ .field("ifru_metric", unsafe { &self.ifru_metric }) ++ .field("ifru_mtu", unsafe { &self.ifru_mtu }) ++ .field("ifru_map", unsafe { &self.ifru_map }) ++ .field("ifru_slave", unsafe { &self.ifru_slave }) ++ .field("ifru_newname", unsafe { &self.ifru_newname }) ++ .field("ifru_data", unsafe { &self.ifru_data }) ++ .finish() ++ } ++ } ++ ++ impl ::fmt::Debug for ifreq { ++ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { ++ f.debug_struct("ifreq") ++ .field("ifr_name", &self.ifr_name) ++ .field("ifr_ifru", &self.ifr_ifru) ++ .finish() ++ } ++ } ++ } +} + +s_no_extra_traits! { ++ // options/linux/include/sys/epoll.h ++ #[cfg_attr(target_arch = "x86_64", repr(packed))] ++ pub struct epoll_event { ++ pub events: u32, ++ pub u64: u64, ++ } ++ + // options/posix/include/net/if.h + #[cfg(libc_union)] + pub union __c_anonymous_ifr_ifru { @@ -355,15 +440,6 @@ index 2046530..b479ed2 100644 + pub ifru_data: *mut ::c_char, + } + -+ pub struct __c_anonymous_ifru_map { -+ pub mem_start: ::c_ulong, -+ pub mem_end: ::c_ulong, -+ pub base_addr: ::c_ushort, -+ pub irq: ::c_uchar, -+ pub dma: ::c_uchar, -+ pub port: ::c_uchar, -+ } -+ + pub struct ifreq { + /// if name, e.g. "en0" + pub ifr_name: [::c_char; ::IFNAMSIZ], @@ -399,7 +475,7 @@ index 2046530..b479ed2 100644 pub {const} fn WCOREDUMP(x: ::c_int) -> bool { x & WCOREFLAG != 0 } -@@ -349,6 +479,104 @@ safe_f! { +@@ -349,6 +540,104 @@ safe_f! { } } @@ -504,7 +580,7 @@ index 2046530..b479ed2 100644 // abis/mlibc/vm-flags.h pub const MAP_ANON: ::c_int = 8; pub const MAP_PRIVATE: ::c_int = 1; -@@ -356,11 +584,24 @@ pub const MAP_SHARED: ::c_int = 2; +@@ -356,11 +645,24 @@ pub const MAP_SHARED: ::c_int = 2; pub const PROT_EXEC: ::c_int = 4; pub const PROT_READ: ::c_int = 1; pub const PROT_WRITE: ::c_int = 2; @@ -529,7 +605,7 @@ index 2046530..b479ed2 100644 // options/ansi/include/time.h pub const CLOCK_MONOTONIC: clockid_t = 1; -@@ -369,33 +610,49 @@ pub const CLOCK_REALTIME: clockid_t = 0; +@@ -369,33 +671,49 @@ pub const CLOCK_REALTIME: clockid_t = 0; // options/posix/include/netdb.h pub const EAI_SYSTEM: ::c_int = 9; @@ -601,7 +677,7 @@ index 2046530..b479ed2 100644 // abis/linux/signal.h pub const SIGABRT: ::c_int = 6; -@@ -436,45 +693,121 @@ pub const SIGSYS: ::c_int = 31; +@@ -436,45 +754,121 @@ pub const SIGSYS: ::c_int = 31; pub const SIGUNUSED: ::c_int = SIGSYS; pub const SIGCANCEL: ::c_int = 32; @@ -724,7 +800,7 @@ index 2046530..b479ed2 100644 pub const SOCK_STREAM: ::c_int = 4; pub const SOL_SOCKET: ::c_int = 1; pub const SO_ACCEPTCONN: ::c_int = 1; -@@ -494,6 +827,8 @@ pub const SO_SNDLOWAT: ::c_int = 14; +@@ -494,6 +888,8 @@ pub const SO_SNDLOWAT: ::c_int = 14; pub const SO_SNDTIMEO: ::c_int = 15; pub const SO_TYPE: ::c_int = 16; pub const SO_SNDBUFFORCE: ::c_int = 17; @@ -733,7 +809,7 @@ index 2046530..b479ed2 100644 pub const SO_PEERCRED: ::c_int = 18; pub const SO_ATTACH_FILTER: ::c_int = 19; pub const SO_PASSCRED: ::c_int = 20; -@@ -503,6 +838,12 @@ pub const SO_PROTOCOL: ::c_int = 23; +@@ -503,6 +899,12 @@ pub const SO_PROTOCOL: ::c_int = 23; pub const SO_REUSEPORT: ::c_int = 24; pub const SO_TIMESTAMP: ::c_int = 25; @@ -746,7 +822,7 @@ index 2046530..b479ed2 100644 // abis/mlibc/errno.h pub const EDOM: ::c_int = 1; pub const EILSEQ: ::c_int = 2; -@@ -592,15 +933,24 @@ pub const ENOTBLK: ::c_int = 1083; +@@ -592,15 +994,24 @@ pub const ENOTBLK: ::c_int = 1083; // options/posix/include/fcntl.h pub const AT_FDCWD: ::c_int = -100; @@ -772,7 +848,7 @@ index 2046530..b479ed2 100644 pub const F_GETOWN: ::c_int = 10; pub const F_SETOWN: ::c_int = 11; pub const O_ACCMODE: ::c_int = 7; -@@ -644,23 +994,55 @@ pub const S_IXGRP: mode_t = 0o10; +@@ -644,23 +1055,55 @@ pub const S_IXGRP: mode_t = 0o10; pub const S_IXOTH: mode_t = 0o1; pub const S_IXUSR: mode_t = 0o100; @@ -829,7 +905,7 @@ index 2046530..b479ed2 100644 // options/posix/include/pthread.h align_const! { -@@ -668,9 +1050,12 @@ align_const! { +@@ -668,9 +1111,12 @@ align_const! { __mlibc_state: 0, __mlibc_recursion: 0, __mlibc_flags: 0, @@ -842,7 +918,7 @@ index 2046530..b479ed2 100644 }; pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { __mlibc_m: 0, -@@ -689,11 +1074,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; +@@ -689,11 +1135,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; extern "C" { @@ -883,7 +959,7 @@ index 2046530..b479ed2 100644 pub fn getgrgid_r( gid: ::gid_t, grp: *mut ::group, -@@ -728,13 +1142,24 @@ extern "C" { +@@ -728,13 +1203,24 @@ extern "C" { buflen: ::size_t, result: *mut *mut passwd, ) -> ::c_int; @@ -912,7 +988,7 @@ index 2046530..b479ed2 100644 pub fn pthread_create( thread: *mut ::pthread_t, attr: *const ::pthread_attr_t, -@@ -752,6 +1177,8 @@ extern "C" { +@@ -752,6 +1238,8 @@ extern "C" { addr: *mut ::sockaddr, addrlen: *mut ::socklen_t, ) -> ::ssize_t; @@ -922,5 +998,5 @@ index 2046530..b479ed2 100644 pub fn setpwent(); pub fn writev(fd: ::c_int, iov: *const ::iovec, count: ::c_int) -> ::ssize_t; -- -2.39.1 +2.40.0 diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index ff386ff9e7a..366b9cec022 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -141,6 +141,7 @@ pub union EPollData { // options/linux/include/sys/epoll.h bitflags::bitflags! { + #[repr(transparent)] pub struct EPollEventFlags: u32 { const IN = 0x001; /// There is an exceptional condition on the file descriptor. @@ -162,7 +163,7 @@ bitflags::bitflags! { } #[derive(Copy, Clone)] -#[repr(C)] +#[cfg_attr(target_arch = "x86_64", repr(packed))] pub struct EPollEvent { pub events: EPollEventFlags, pub data: EPollData, @@ -170,8 +171,10 @@ pub struct EPollEvent { impl core::fmt::Debug for EPollEvent { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let events = self.events; + f.debug_struct("EPollEvent") - .field("events", &self.events) + .field("events", &events) .finish() } } From f808ce62fb5ba6ac76a6fa9cbd6e7ae9a0902792 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 10 Apr 2023 13:23:24 +1000 Subject: [PATCH 180/368] bootstrap::curl: :) Signed-off-by: Andy-Python-Programmer --- base-files/.curlrc | 1 + base-files/a | 2 + bootstrap.yml | 277 ++++++++++++++++++++++++++++++++------------- bootstrap/net.yml | 148 ++++++++++++++++++++++++ 4 files changed, 347 insertions(+), 81 deletions(-) create mode 100644 base-files/.curlrc create mode 100644 base-files/a diff --git a/base-files/.curlrc b/base-files/.curlrc new file mode 100644 index 00000000000..56c4b7bb593 --- /dev/null +++ b/base-files/.curlrc @@ -0,0 +1 @@ +--ipv4 \ No newline at end of file diff --git a/base-files/a b/base-files/a new file mode 100644 index 00000000000..f419cee78de --- /dev/null +++ b/base-files/a @@ -0,0 +1,2 @@ +#!/usr/bin/bash +systrace curl https://andypy.dev diff --git a/bootstrap.yml b/bootstrap.yml index b6e87952532..b04d9825b39 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -195,11 +195,11 @@ sources: environ: 'NOCONFIGURE': 'yes' - - name: wayland - subdir: 'bundled' - git: 'https://github.com/wayland-project/wayland.git' - tag: '1.20.0' - version: '1.20.0' + # - name: wayland + # subdir: 'bundled' + # git: 'https://github.com/wayland-project/wayland.git' + # tag: '1.20.0' + # version: '1.20.0' - name: libxtrans subdir: 'bundled' @@ -293,6 +293,17 @@ tools: - args: ['make', 'install-strip'] - args: ['ln', '-sf', '@PREFIX@/share/aclocal-1.16', '@PREFIX@/share/aclocal'] + - name: host-autoconf-archive + exports_aclocal: true + source: + subdir: 'bundled' + git: 'https://github.com/autoconf-archive/autoconf-archive.git' + tag: 'v2019.01.06' + version: '2019.01.06' + install: + - args: ['mkdir', '-p', '@BUILD_ROOT@/tools/host-autoconf-archive/share/'] + - args: ['cp', '-r', '@THIS_SOURCE_DIR@/m4', '@BUILD_ROOT@/tools/host-autoconf-archive/share/aclocal'] + - name: host-rust from_source: rust tools_required: @@ -542,26 +553,26 @@ tools: install: - args: ['make', 'install'] - - name: wayland-scanner - from_source: wayland - tools_required: - - virtual: pkgconfig-for-host - program_name: host-pkg-config - configure: - - args: - - 'meson' - - '--native-file' - - '@SOURCE_ROOT@/userland/native-file.ini' - - '--prefix=@PREFIX@' - - '-Ddtd_validation=false' - - '-Ddocumentation=false' - - '-Dscanner=true' - - '-Dlibraries=false' - - '@THIS_SOURCE_DIR@' - compile: - - args: ['ninja'] - install: - - args: ['ninja', 'install'] + # - name: wayland-scanner + # from_source: wayland + # tools_required: + # - virtual: pkgconfig-for-host + # program_name: host-pkg-config + # configure: + # - args: + # - 'meson' + # - '--native-file' + # - '@SOURCE_ROOT@/userland/native-file.ini' + # - '--prefix=@PREFIX@' + # - '-Ddtd_validation=false' + # - '-Ddocumentation=false' + # - '-Dscanner=true' + # - '-Dlibraries=false' + # - '@THIS_SOURCE_DIR@' + # compile: + # - args: ['ninja'] + # install: + # - args: ['ninja', 'install'] packages: - name: llvm @@ -1288,30 +1299,30 @@ packages: - args: ['make', 'install', 'INSTALL_TOP=@THIS_COLLECT_DIR@/usr'] # -------------------- wayland -------------------- - - name: wayland-protocols - source: - subdir: 'bundled' - git: 'https://github.com/wayland-project/wayland-protocols.git' - tag: '1.24' - version: '1.24' - tools_required: - - host-gcc - - wayland-scanner - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--buildtype=release' - - '-Dtests=false' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - quiet: true + # - name: wayland-protocols + # source: + # subdir: 'bundled' + # git: 'https://github.com/wayland-project/wayland-protocols.git' + # tag: '1.24' + # version: '1.24' + # tools_required: + # - host-gcc + # - wayland-scanner + # configure: + # - args: + # - 'meson' + # - '--cross-file' + # - '@SOURCE_ROOT@/userland/cross-file.ini' + # - '--prefix=/usr' + # - '--buildtype=release' + # - '-Dtests=false' + # - '@THIS_SOURCE_DIR@' + # build: + # - args: ['ninja'] + # - args: ['ninja', 'install'] + # environ: + # DESTDIR: '@THIS_COLLECT_DIR@' + # quiet: true - name: libexpat source: @@ -1378,58 +1389,125 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' - - name: wayland - from_source: wayland + # - name: wayland + # from_source: wayland + # tools_required: + # - host-pkg-config + # - host-gcc + # - wayland-scanner + # - host-libtool + # - virtual: pkgconfig-for-target + # triple: "x86_64-aero" + # - virtual: pkgconfig-for-host + # program_name: host-pkg-config + # pkgs_required: + # - mlibc + # - libexpat + # - libffi + # configure: + # - args: + # - 'meson' + # - '--native-file' + # - '@SOURCE_ROOT@/userland/native-file.ini' + # - '--cross-file' + # - '@SOURCE_ROOT@/userland/cross-file.ini' + # - '--prefix=/usr' + # - '--buildtype=debugoptimized' + # - '-Ddtd_validation=false' + # - '-Ddocumentation=false' + # - '-Dscanner=false' + # - '@THIS_SOURCE_DIR@' + # environ: + # PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' + # build: + # - args: ['ninja'] + # - args: ['ninja', 'install'] + # environ: + # DESTDIR: '@THIS_COLLECT_DIR@' + + - name: zlib + source: + subdir: 'bundled' + git: 'https://github.com/madler/zlib.git' + tag: 'v1.2.12' + version: '1.2.12' tools_required: - - host-pkg-config - host-gcc - - wayland-scanner - - host-libtool - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - - virtual: pkgconfig-for-host - program_name: host-pkg-config pkgs_required: - mlibc - - libexpat - - libffi configure: - args: - - 'meson' - - '--native-file' - - '@SOURCE_ROOT@/userland/native-file.ini' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--buildtype=debugoptimized' - - '-Ddtd_validation=false' - - '-Ddocumentation=false' - - '-Dscanner=false' - - '@THIS_SOURCE_DIR@' + - '@THIS_SOURCE_DIR@/configure' environ: - PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' + CHOST: 'x86_64-aero' + prefix: '/usr' build: - - args: ['ninja'] - - args: ['ninja', 'install'] + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] environ: DESTDIR: '@THIS_COLLECT_DIR@' - - name: zlib + # zstd fast compression library + # + # This package provides the programs to interact with Zstandard compressed files. + - name: zstd + source: + subdir: bundled + git: 'https://github.com/facebook/zstd.git' + tag: 'v1.5.2' + version: '1.5.2' + tools_required: + - host-gcc + pkgs_required: + - mlibc + - zlib + - xz-utils + revision: 2 + configure: + - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + build: + - args: ['make', '-j@PARALLELISM@'] + environ: + CC: 'x86_64-aero-gcc' + CXX: 'x86_64-aero-g++' + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + PREFIX: '/usr' + + # Utilities for managing LZMA compressed files + # + # This package provides the programs to compress and decompress lzma and + # xz compressed files. + - name: xz-utils source: subdir: 'bundled' - git: 'https://github.com/madler/zlib.git' - tag: 'v1.2.12' - version: '1.2.12' + git: 'https://git.tukaani.org/xz.git' + tag: 'v5.2.5' + version: '5.2.5' + disable_shallow_fetch: true + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + regenerate: + - args: ['./autogen.sh', '--no-po4a'] tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool - host-gcc pkgs_required: - mlibc + - zlib + revision: 4 configure: - args: - '@THIS_SOURCE_DIR@/configure' - environ: - CHOST: 'x86_64-aero' - prefix: '/usr' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-static' + - '--disable-nls' build: - args: ['make', '-j@PARALLELISM@'] - args: ['make', 'install'] @@ -1685,6 +1763,43 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + # Library for manipulating Unicode and C strings according to Unicode standard + # + # This package provides a library containing functions for manipulating Unicode + # strings and for manipulating C strings according to the Unicode standard. + - name: libunistring + source: + subdir: 'bundled' + url: 'https://ftp.gnu.org/gnu/libunistring/libunistring-1.0.tar.xz' + format: 'tar.xz' + checksum: blake2b:8208fe33d4ac2f015b0efb56b0c7dd87afc4bb1c6ca4eb3ded86d7e2101d7b7f68bfd8991af4b6dd408282ec73f134ee0b884e761ff6d52e8a1e398326aec420 + extract_path: 'libunistring-1.0' + version: '1.0' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['autoreconf', '-fvi'] + tools_required: + - host-gcc + pkgs_required: + - mlibc + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. + - '--disable-static' + - '--docdir=/usr/share/doc/libunistring-1.0' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + # - name: weston # labels: [aarch64] # architecture: '@OPTION:arch@' diff --git a/bootstrap/net.yml b/bootstrap/net.yml index 9f894b133dc..0521107425e 100644 --- a/bootstrap/net.yml +++ b/bootstrap/net.yml @@ -27,3 +27,151 @@ packages: - '-j@PARALLELISM@' environ: RUSTFLAGS: '-Cforce-frame-pointers=yes -Clink-args=-no-pie' + + # C library for the Public Suffix List + # + # This package provides a library for accessing and resolving information from the Public + # Suffix List (PSL). The PSL is a set of domain names beyond the standard suffixes, such + # as .com. + - name: libpsl + source: + subdir: 'bundled' + git: 'https://github.com/rockdaboot/libpsl.git' + tag: '0.21.1' + version: '0.21.1' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['./autogen.sh'] + tools_required: + - host-gcc + pkgs_required: + - mlibc + - libidn2 + - libunistring + - libiconv + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-static' + - '--enable-builtin=libidn2' + - '--enable-runtime=libidn2' + # Gentoo disables asan, cfi and ubsan + - '--disable-asan' + - '--disable-cfi' + - '--disable-ubsan' + - '--disable-man' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: libidn2 + source: + subdir: 'bundled' + git: 'https://gitlab.com/libidn/libidn2.git' + tag: 'v2.3.2' + version: '2.3.2' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['./bootstrap'] + - args: ['autoreconf', '-fvi'] + tools_required: + - host-gcc + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + pkgs_required: + - mlibc + - libunistring + - libiconv + configure: + # Remove some files from the source directory if they exist. + - args: | + if [ -f @THIS_SOURCE_DIR@/lib/gendata ]; then + rm -rv @THIS_SOURCE_DIR@/lib/gendata + fi + - args: | + if [ -f @THIS_SOURCE_DIR@/lib/gentr46map ]; then + rm -rv @THIS_SOURCE_DIR@/lib/gentr46map + fi + # Configure for the host, we need some files to be generated + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--disable-doc' + - '--disable-nls' + # Broken out of tree build, but also broken in tree for some reason, work around it + - args: ['cp', '-v', '@THIS_SOURCE_DIR@/lib/idna-tables-properties.csv', '@THIS_BUILD_DIR@/lib/'] + - args: ['cp', '-v', '@THIS_BUILD_DIR@/lib/idn2.h', '@THIS_SOURCE_DIR@/lib/'] + # Build it so we get our files + - args: ['make', '-j@PARALLELISM@'] + # Copy the files to the source dir, where libidn2 wants them + - args: ['cp', '-v', '@THIS_BUILD_DIR@/lib/gendata', '@THIS_SOURCE_DIR@/lib/gendata'] + - args: ['cp', '-v', '@THIS_BUILD_DIR@/lib/gentr46map', '@THIS_SOURCE_DIR@/lib/gentr46map'] + # Finally, configure for managarm + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. + - '--disable-static' + - '--disable-doc' + - '--disable-nls' + # Again, copy the header, it might've changed due to configure. + - args: ['cp', '-v', '@THIS_BUILD_DIR@/lib/idn2.h', '@THIS_SOURCE_DIR@/lib/'] + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: curl + source: + subdir: 'bundled' + git: 'https://github.com/curl/curl.git' + tag: 'curl-7_84_0' + version: '7.84.0' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-autoconf-archive + regenerate: + - args: ['autoreconf', '-fiv'] + tools_required: + - host-pkg-config + - host-gcc + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - libidn2 + - libpsl + - openssl + - zlib + - zstd + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-static' + - '--with-ca-path=/etc/ssl/certs' + - '--enable-threaded-resolver' + - '--with-openssl' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' From 272a2a3910cd3d678e9bcb3dc4883bedd0d12550 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 13 Apr 2023 13:48:09 +1000 Subject: [PATCH 181/368] net: ARP Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 44 +++++---- patches/rust-libc/rust-libc.patch | 21 +++-- src/aero_kernel/src/fs/ext2/mod.rs | 18 ++-- src/aero_kernel/src/fs/inode.rs | 6 +- src/aero_kernel/src/fs/mod.rs | 10 -- src/aero_kernel/src/net/arp.rs | 137 +++++++++++++++++++++++++++- src/aero_kernel/src/net/ethernet.rs | 20 +++- src/aero_kernel/src/net/ip.rs | 21 ++--- src/aero_kernel/src/net/mod.rs | 20 +++- src/aero_kernel/src/socket/inet.rs | 66 +++++++++----- src/aero_kernel/src/socket/mod.rs | 11 ++- src/aero_kernel/src/socket/unix.rs | 6 +- src/aero_kernel/src/syscall/net.rs | 9 +- src/aero_syscall/src/consts.rs | 1 + src/aero_syscall/src/lib.rs | 2 +- src/aero_syscall/src/socket.rs | 38 ++++++-- 16 files changed, 320 insertions(+), 110 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 7ac7bfc7996..8f5c8e2f5c7 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,6 +1,6 @@ -From 986ca7e14a843967eab13d704b8a3fe742ef2bfc Mon Sep 17 00:00:00 2001 +From 1c62d94e16ce0981d6d8ed646192bf1bbeb2a772 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Sat, 8 Apr 2023 14:20:23 +1000 +Date: Mon, 10 Apr 2023 15:19:49 +1000 Subject: [PATCH] --- @@ -8,14 +8,14 @@ Subject: [PATCH] options/ansi/generic/stdlib-stubs.cpp | 6 ++++-- options/glibc/generic/execinfo.cpp | 5 +++-- options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 27 +++++++++++++++++++-------- - sysdeps/aero/generic/filesystem.cpp | 14 ++++++++------ - sysdeps/aero/generic/sockets.cpp | 25 +++++++++++++++++++++++++ - sysdeps/aero/include/aero/syscall.h | 10 ++++++++++ - 8 files changed, 72 insertions(+), 19 deletions(-) + sysdeps/aero/generic/aero.cpp | 27 +++++++++++++++++-------- + sysdeps/aero/generic/filesystem.cpp | 14 +++++++------ + sysdeps/aero/generic/sockets.cpp | 29 +++++++++++++++++++++++++-- + sysdeps/aero/include/aero/syscall.h | 10 +++++++++ + 8 files changed, 74 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore -index fdd60a0..9f811f4 100644 +index fdd60a00..9f811f47 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ subprojects @@ -25,10 +25,10 @@ index fdd60a0..9f811f4 100644 +# clangd cache files: +.cache diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp -index c0e54fe..ddeec8a 100644 +index 4c5c3975..38d8d9d5 100644 --- a/options/ansi/generic/stdlib-stubs.cpp +++ b/options/ansi/generic/stdlib-stubs.cpp -@@ -391,8 +391,10 @@ int mbtowc(wchar_t *__restrict wc, const char *__restrict mb, size_t max_size) { +@@ -396,8 +396,10 @@ int mbtowc(wchar_t *__restrict wc, const char *__restrict mb, size_t max_size) { mlibc::code_seq wseq{wc, wc + 1}; mlibc::code_seq nseq{mb, mb + max_size}; auto e = cc->decode_wtranscode(nseq, wseq, mbtowc_state); @@ -42,7 +42,7 @@ index c0e54fe..ddeec8a 100644 return nseq.it - mb; } else { diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp -index 3474615..10a2109 100644 +index 3474615e..10a2109e 100644 --- a/options/glibc/generic/execinfo.cpp +++ b/options/glibc/generic/execinfo.cpp @@ -1,9 +1,10 @@ @@ -59,7 +59,7 @@ index 3474615..10a2109 100644 char **backtrace_symbols(void *const *, int) { diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp -index 6eb9d09..2ab5bc9 100644 +index 003a162d..ab01a7a4 100644 --- a/options/rtdl/generic/linker.cpp +++ b/options/rtdl/generic/linker.cpp @@ -18,7 +18,7 @@ uintptr_t libraryBase = 0x41000000; @@ -72,7 +72,7 @@ index 6eb9d09..2ab5bc9 100644 constexpr bool eagerBinding = true; diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 0faf386..e6bd277 100644 +index 0faf386d..e6bd277e 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp @@ -176,13 +176,6 @@ int sys_kill(int pid, int sig) { @@ -124,7 +124,7 @@ index 0faf386..e6bd277 100644 } diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index 38b0e1b..acbcef9 100644 +index 38b0e1bf..acbcef9a 100644 --- a/sysdeps/aero/generic/filesystem.cpp +++ b/sysdeps/aero/generic/filesystem.cpp @@ -155,14 +155,16 @@ int sys_tcgetattr(int fd, struct termios *attr) { @@ -151,7 +151,7 @@ index 38b0e1b..acbcef9 100644 return 0; diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp -index c730bff..39cacb4 100644 +index c730bff9..a32a34fb 100644 --- a/sysdeps/aero/generic/sockets.cpp +++ b/sysdeps/aero/generic/sockets.cpp @@ -4,7 +4,11 @@ @@ -166,8 +166,16 @@ index c730bff..39cacb4 100644 namespace mlibc { int sys_socket(int family, int type, int protocol, int *fd) { -@@ -187,4 +191,25 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, - __builtin_unreachable(); +@@ -181,10 +185,31 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, + << frg::endlog; + return 0; + } else { +- mlibc::panicLogger() ++ mlibc::infoLogger() + << "\e[31mmlibc: Unexpected setsockopt() call, layer: " << layer + << " number: " << number << "\e[39m" << frg::endlog; +- __builtin_unreachable(); ++ return 0; } } + @@ -193,7 +201,7 @@ index c730bff..39cacb4 100644 +} } // namespace mlibc diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 432bad2..ba56ce9 100644 +index 432bad2f..ba56ce95 100644 --- a/sysdeps/aero/include/aero/syscall.h +++ b/sysdeps/aero/include/aero/syscall.h @@ -75,6 +75,10 @@ diff --git a/patches/rust-libc/rust-libc.patch b/patches/rust-libc/rust-libc.patch index 9cbf64b2577..deeaee0c247 100644 --- a/patches/rust-libc/rust-libc.patch +++ b/patches/rust-libc/rust-libc.patch @@ -1,6 +1,6 @@ -From 1771fe68c2fd9d0e35a2396634c9b79fcb1bb2ab Mon Sep 17 00:00:00 2001 +From 56759ca28e1aa33227e0085bcafd535ebbfdcf4c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Mon, 10 Apr 2023 11:45:10 +1000 +Date: Mon, 10 Apr 2023 14:02:17 +1000 Subject: [PATCH] --- @@ -10,8 +10,8 @@ Subject: [PATCH] .../linux_like/linux/gnu/b64/x86_64/mod.rs | 4 +- src/unix/linux_like/linux/gnu/mod.rs | 4 +- src/unix/linux_like/linux/mod.rs | 28 +- - src/unix/mlibc/mod.rs | 560 ++++++++++++++++-- - 7 files changed, 542 insertions(+), 54 deletions(-) + src/unix/mlibc/mod.rs | 561 ++++++++++++++++-- + 7 files changed, 543 insertions(+), 54 deletions(-) create mode 100644 checkedout.xbstrap create mode 100644 fetched.xbstrap create mode 100644 patched.xbstrap @@ -200,7 +200,7 @@ index be12190..c8762d5 100644 .field("ifr_name", &self.ifr_name) .field("ifr_ifru", &self.ifr_ifru) diff --git a/src/unix/mlibc/mod.rs b/src/unix/mlibc/mod.rs -index 2046530..3436cb1 100644 +index 2046530..a19b7fa 100644 --- a/src/unix/mlibc/mod.rs +++ b/src/unix/mlibc/mod.rs @@ -47,7 +47,6 @@ pub type fsfilcnt_t = ::c_uint; @@ -848,7 +848,7 @@ index 2046530..3436cb1 100644 pub const F_GETOWN: ::c_int = 10; pub const F_SETOWN: ::c_int = 11; pub const O_ACCMODE: ::c_int = 7; -@@ -644,23 +1055,55 @@ pub const S_IXGRP: mode_t = 0o10; +@@ -644,23 +1055,56 @@ pub const S_IXGRP: mode_t = 0o10; pub const S_IXOTH: mode_t = 0o1; pub const S_IXUSR: mode_t = 0o100; @@ -902,10 +902,11 @@ index 2046530..3436cb1 100644 +// abis/linux/ioctls.h +pub const SIOCGIFHWADDR: ::c_ulong = 0x8927; +pub const SIOCSIFADDR: ::c_ulong = 0x8916; ++pub const SIOCSIFNETMASK: ::c_ulong = 0x891c; // options/posix/include/pthread.h align_const! { -@@ -668,9 +1111,12 @@ align_const! { +@@ -668,9 +1112,12 @@ align_const! { __mlibc_state: 0, __mlibc_recursion: 0, __mlibc_flags: 0, @@ -918,7 +919,7 @@ index 2046530..3436cb1 100644 }; pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { __mlibc_m: 0, -@@ -689,11 +1135,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; +@@ -689,11 +1136,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; extern "C" { @@ -959,7 +960,7 @@ index 2046530..3436cb1 100644 pub fn getgrgid_r( gid: ::gid_t, grp: *mut ::group, -@@ -728,13 +1203,24 @@ extern "C" { +@@ -728,13 +1204,24 @@ extern "C" { buflen: ::size_t, result: *mut *mut passwd, ) -> ::c_int; @@ -988,7 +989,7 @@ index 2046530..3436cb1 100644 pub fn pthread_create( thread: *mut ::pthread_t, attr: *const ::pthread_attr_t, -@@ -752,6 +1238,8 @@ extern "C" { +@@ -752,6 +1239,8 @@ extern "C" { addr: *mut ::sockaddr, addrlen: *mut ::socklen_t, ) -> ::ssize_t; diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index ef4eba5e756..8f71f3f0b98 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -22,7 +22,7 @@ mod group_desc; use core::mem::MaybeUninit; -use aero_syscall::socket::MessageHeader; +use aero_syscall::socket::{MessageFlags, MessageHeader}; use aero_syscall::{MMapFlags, SyscallError}; use alloc::boxed::Box; use alloc::string::ToString; @@ -582,20 +582,20 @@ impl INodeInterface for INode { return Err(FileSystemError::NotSupported); } - fn send(&self, message_hdr: &mut MessageHeader) -> super::Result { + fn send(&self, message_hdr: &mut MessageHeader, flags: MessageFlags) -> super::Result { if let Some(proxy) = self.proxy.as_ref() { - return proxy.send(message_hdr); + proxy.send(message_hdr, flags) + } else { + Err(FileSystemError::NotSupported) } - - return Err(FileSystemError::NotSupported); } - fn recv(&self, message_hdr: &mut MessageHeader) -> super::Result { + fn recv(&self, message_hdr: &mut MessageHeader, flags: MessageFlags) -> super::Result { if let Some(proxy) = self.proxy.as_ref() { - return proxy.recv(message_hdr); + proxy.recv(message_hdr, flags) + } else { + Err(FileSystemError::NotSupported) } - - return Err(FileSystemError::NotSupported); } fn poll(&self, table: Option<&mut PollTable>) -> super::Result { diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 77df73e40f0..f9f28367052 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -20,7 +20,7 @@ use core::sync::atomic::{AtomicUsize, Ordering}; use aero_syscall::prelude::{EPollEventFlags, PollEventFlags}; -use aero_syscall::socket::MessageHeader; +use aero_syscall::socket::{MessageFlags, MessageHeader}; use aero_syscall::{MMapFlags, OpenFlags, SyscallError}; use alloc::sync::Arc; @@ -253,11 +253,11 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSocket) } - fn send(&self, _message_hdr: &mut MessageHeader) -> Result { + fn send(&self, _message_hdr: &mut MessageHeader, _flags: MessageFlags) -> Result { Err(FileSystemError::NotSupported) } - fn recv(&self, _message_hdr: &mut MessageHeader) -> Result { + fn recv(&self, _message_hdr: &mut MessageHeader, _flags: MessageFlags) -> Result { Err(FileSystemError::NotSocket) } diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index ae7ff9ecaec..af00a0c8979 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -180,16 +180,6 @@ impl Path { &self.0 } - pub fn container(&self) -> &Path { - let dir = self.0.rfind("/"); - - match dir { - Some(0) => Path::new(&self.0[1..]), - Some(v) => Path::new(&self.0[v + 1..]), - None => Path::new(&self.0), - } - } - /// Helper function that returns the parent path and the base name /// of the path. pub fn parent_and_basename(&self) -> (&Self, &str) { diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index bce677fd85b..e0785c991b5 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -17,21 +17,32 @@ * along with Aero. If not, see . */ -// Address Resolution Protocol +//! Address Resolution Protocol use alloc::collections::BTreeMap; +use alloc::vec::Vec; +use simple_endian::BigEndian; use spin::{Once, RwLock}; +use crate::net::{default_device, ethernet, PacketUpHierarchy}; + use super::ethernet::MacAddr; use super::ip::Ipv4Addr; +use super::{ConstPacketKind, Eth, Packet, PacketDownHierarchy, PacketHeader}; + +enum Status { + Resolved, + Pending(Vec>), +} struct Entry { mac: MacAddr, + status: Status, } impl Entry { - fn new(mac: MacAddr) -> Self { - Self { mac } + fn new(mac: MacAddr, status: Status) -> Self { + Self { mac, status } } } @@ -43,10 +54,32 @@ impl Cache { } fn insert(&mut self, ip: Ipv4Addr, mac: MacAddr) { - if let Some(_entry) = self.0.get_mut(&ip) { + if let Some(entry) = self.0.get_mut(&ip) { + let status = core::mem::replace(&mut entry.status, Status::Resolved); + + if let Status::Pending(queue) = status { + entry.mac = mac; + entry.status = Status::Resolved; + + for mut packet in queue { + log::trace!("[ ARP ] (!!) Sending queued packed to {ip:?} {mac:?}"); + packet.header_mut().dest_mac = mac; + super::default_device().send(packet); + } + } + } else { + self.0.insert(ip, Entry::new(mac, Status::Resolved)); + } + } + + fn request(&mut self, ip: Ipv4Addr, packet: Packet) { + if let Some(_) = self.0.get_mut(&ip) { todo!() } else { - self.0.insert(ip, Entry::new(mac)); + let queue = alloc::vec![packet]; + let entry = Entry::new(MacAddr::NULL, Status::Pending(queue)); + + self.0.insert(ip, entry); } } @@ -78,3 +111,97 @@ pub fn init() { RwLock::new(cache) }); } + +/// Hardware Address Space (e.g., Ethernet, Packet Radio Net.) +#[derive(Copy, Clone)] +#[repr(u16)] +pub enum HType { + Ethernet = 1u16.swap_bytes(), +} + +/// Internetwork Protocol for which the ARP request is intended. +#[derive(Copy, Clone)] +#[repr(u16)] +pub enum PType { + Ipv4 = 0x0800u16.swap_bytes(), +} + +/// ARP Opcode +#[derive(Copy, Clone, Eq, PartialEq)] +#[repr(u16)] +pub enum Opcode { + Request = 1u16.swap_bytes(), + // Reply = 2u16.swap_bytes(), +} + +#[repr(C, packed)] +pub struct ArpHeader { + pub htype: HType, + pub ptype: PType, + /// Length (in octets) of a hardware address. + pub hlen: BigEndian, + /// Length (in octets) of internetwork addresses. + pub plen: BigEndian, + pub opcode: Opcode, + pub src_mac: MacAddr, + pub src_ip: Ipv4Addr, + pub dest_mac: MacAddr, + pub dest_ip: Ipv4Addr, +} + +#[derive(Debug, Copy, Clone)] +pub struct Arp {} + +impl ConstPacketKind for Arp { + const HSIZE: usize = core::mem::size_of::(); +} + +impl PacketUpHierarchy for Packet {} +impl PacketHeader for Packet { + fn send(&self) { + self.downgrade().send() + } + + fn recv(&self) { + let header = self.header(); + + CACHE + .get() + .as_ref() + .expect("arp: cache not initialized") + .write() + .insert(header.src_ip, header.src_mac); + + // if header.opcode() == Opcode::Request {} else if header.opcode() == Opcode::Reply {} + } +} + +pub fn request_ip(target: Ipv4Addr, to: Packet) { + let mut packet: Packet = + Packet::::create(ethernet::Type::Arp, core::mem::size_of::()).upgrade(); + + let device = default_device(); + + let header = packet.header_mut(); + header.htype = HType::Ethernet; + header.ptype = PType::Ipv4; + header.hlen = BigEndian::from(MacAddr::ADDR_SIZE as u8); + header.plen = BigEndian::from(Ipv4Addr::ADDR_SIZE as u8); + + header.opcode = Opcode::Request; + header.src_ip = device.ip(); + header.src_mac = device.mac(); + header.dest_ip = target; + header.dest_mac = MacAddr::NULL; + + log::debug!("[ ARP ] (!!) Sending request for {target:?}"); + + CACHE + .get() + .as_ref() + .expect("arp: cache not initialized") + .write() + .request(target, to); + + packet.send(); +} diff --git a/src/aero_kernel/src/net/ethernet.rs b/src/aero_kernel/src/net/ethernet.rs index e2fb53f71ff..180d35e37ac 100644 --- a/src/aero_kernel/src/net/ethernet.rs +++ b/src/aero_kernel/src/net/ethernet.rs @@ -25,17 +25,19 @@ use crate::utils::dma::DmaAllocator; use super::*; #[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)] -#[repr(C)] +#[repr(transparent)] pub struct MacAddr(pub [u8; Self::ADDR_SIZE]); impl MacAddr { pub const ADDR_SIZE: usize = 6; pub const BROADCAST: Self = Self([0xff; Self::ADDR_SIZE]); + pub const NULL: Self = Self([0; Self::ADDR_SIZE]); } #[repr(u16)] pub enum Type { Ip = 0x800u16.swap_bytes(), + Arp = 0x0806u16.swap_bytes(), } #[repr(C, packed)] @@ -75,7 +77,14 @@ impl Packet { impl PacketHeader

for Packet { fn send(&self) { - let ip = self.upgrade().header().dest_ip; + let ip = match self.header().typ { + Type::Ip => { + let packet: Packet = self.upgrade(); + packet.header().dest_ip + } + + Type::Arp => Ipv4Addr::BROADCAST, + }; if let Some(addr) = arp::get(ip) { let mut packet = self.clone(); @@ -84,6 +93,8 @@ impl PacketHeader
for Packet { header.dest_mac = addr; } super::default_device().send(packet); + } else { + arp::request_ip(ip, self.clone()); } } @@ -93,6 +104,11 @@ impl PacketHeader
for Packet { let packet: Packet = self.upgrade(); packet.recv() } + + Type::Arp => { + let packet: Packet = self.upgrade(); + packet.recv() + } } } } diff --git a/src/aero_kernel/src/net/ip.rs b/src/aero_kernel/src/net/ip.rs index 1f4cb176661..2b2bf14eaed 100644 --- a/src/aero_kernel/src/net/ip.rs +++ b/src/aero_kernel/src/net/ip.rs @@ -21,19 +21,18 @@ use simple_endian::BigEndian; use super::*; -/// Size of IPv4 adderess in octets. -/// -/// [RFC 8200 § 2]: https://www.rfc-editor.org/rfc/rfc791#section-3.2 -pub const ADDR_SIZE: usize = 4; - #[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)] #[repr(C)] -pub struct Ipv4Addr(pub [u8; ADDR_SIZE]); +pub struct Ipv4Addr(pub [u8; Self::ADDR_SIZE]); impl Ipv4Addr { - pub const BROADCAST: Self = Self([0xff; ADDR_SIZE]); + /// Size of IPv4 adderess in octets. + /// + /// [RFC 8200 § 2]: https://www.rfc-editor.org/rfc/rfc791#section-3.2 + pub const ADDR_SIZE: usize = 4; + pub const BROADCAST: Self = Self([0xff; Self::ADDR_SIZE]); - pub fn new(addr: [u8; ADDR_SIZE]) -> Self { + pub fn new(addr: [u8; Self::ADDR_SIZE]) -> Self { Self(addr) } } @@ -80,7 +79,7 @@ impl Packet { pub fn create(protocol: Type, dest: Ipv4Addr, mut size: usize) -> Packet { size += Ipv4::HSIZE; - let mut packet = Packet::::create(ethernet::Type::Ip, size).upgrade(); + let mut packet: Packet = Packet::::create(ethernet::Type::Ip, size).upgrade(); let header = packet.header_mut(); header.v = BigEndian::::from(0x45); @@ -95,8 +94,8 @@ impl Packet { header.protocol = protocol; header.dest_ip = dest; - // FIXME: Set the source IPv4 address. - header.src_ip = Ipv4Addr([0; 4]); + header.src_ip = default_device().ip(); + log::debug!("{:?}", header.src_ip); header.hcrc = checksum::make(checksum::calculate(header)); packet } diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 6225a2dc393..8cf32ddae33 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -48,6 +48,8 @@ pub trait NetworkDriver: Send + Sync { #[derive(Default)] struct Metadata { ip: Ipv4Addr, + #[allow(dead_code)] + subnet_mask: Ipv4Addr, } pub struct NetworkDevice { @@ -57,15 +59,31 @@ pub struct NetworkDevice { impl NetworkDevice { pub fn new(driver: Arc) -> Self { + // FIXME(andy): DHCPD should handle static IP assignment. + let mut metadata = Metadata::default(); + metadata.ip = Ipv4Addr::new([192, 168, 122, 0]); + Self { driver, - metadata: RwLock::new(Metadata::default()), + metadata: RwLock::new(metadata), } } pub fn set_ip(&self, ip: Ipv4Addr) { self.metadata.write().ip = ip; } + + pub fn set_subnet_mask(&self, mask: Ipv4Addr) { + self.metadata.write().ip = mask; + } + + pub fn ip(&self) -> Ipv4Addr { + self.metadata.read().ip + } + + pub fn subnet_mask(&self) -> Ipv4Addr { + self.metadata.read().subnet_mask + } } impl core::ops::Deref for NetworkDevice { diff --git a/src/aero_kernel/src/socket/inet.rs b/src/aero_kernel/src/socket/inet.rs index 47dece88f9a..4bb4ff21d6e 100644 --- a/src/aero_kernel/src/socket/inet.rs +++ b/src/aero_kernel/src/socket/inet.rs @@ -17,8 +17,8 @@ * along with Aero. If not, see . */ -use aero_syscall::prelude::{IfReq, SIOCGIFHWADDR, SIOCGIFINDEX, SIOCSIFADDR}; -use aero_syscall::socket::MessageHeader; +use aero_syscall::prelude::{IfReq, SIOCGIFHWADDR, SIOCGIFINDEX, SIOCSIFADDR, SIOCSIFNETMASK}; +use aero_syscall::socket::{MessageFlags, MessageHeader}; use aero_syscall::{IpProtocol, OpenFlags, SocketAddrInet, SocketType, SyscallError}; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; @@ -64,12 +64,6 @@ pub struct InetSocket { impl InetSocket { pub fn new(typ: SocketType, protocol: IpProtocol) -> Result, SyscallError> { - if typ != SocketType::Dgram - && (protocol != IpProtocol::Udp || protocol != IpProtocol::Default) - { - return Err(SyscallError::EINVAL); - } - Ok(Arc::new_cyclic(|sref| Self { typ, protocol, @@ -148,7 +142,7 @@ impl INodeInterface for InetSocket { Ok(()) } - _ => unreachable!(), + _ => unreachable!("bind: {:?} {:?}", self.typ, self.protocol), } } @@ -156,7 +150,7 @@ impl INodeInterface for InetSocket { let address = address.as_inet().ok_or(FileSystemError::NotSupported)?; match (self.typ, self.protocol) { - (SocketType::Dgram, IpProtocol::Default) => { + (SocketType::Dgram | SocketType::Stream, IpProtocol::Default) => { let host_addr = Ipv4Addr::new(address.sin_addr.addr.to_be_bytes()); udp::connect(host_addr, address.port.to_native()); @@ -164,11 +158,11 @@ impl INodeInterface for InetSocket { Ok(()) } - _ => unreachable!(), + _ => unreachable!("connect: {:?} {:?}", self.typ, self.protocol), } } - fn send(&self, message_hdr: &mut MessageHeader) -> fs::Result { + fn send(&self, message_hdr: &mut MessageHeader, _flags: MessageFlags) -> fs::Result { let name = message_hdr .name_mut::() .cloned() @@ -184,8 +178,10 @@ impl INodeInterface for InetSocket { } else { src_port = udp::alloc_ephemeral_port(self.sref()).ok_or(FileSystemError::WouldBlock)?; log::debug!("Inet::send(): allocated ephemeral port {}", src_port); + } - // FIXME: handle ephemeral port INET socket + // FIXME: loopback + if dest_ip == Ipv4Addr::new([127, 0, 0, 1]) { return Err(FileSystemError::NotSupported); } @@ -206,7 +202,9 @@ impl INodeInterface for InetSocket { Ok(data.len()) } - fn recv(&self, message_hdr: &mut MessageHeader) -> fs::Result { + fn recv(&self, message_hdr: &mut MessageHeader, _flags: MessageFlags) -> fs::Result { + // assert!(flags.is_empty()); + if self.inner.lock_irq().incoming.is_empty() && self.is_non_block() { return Err(FileSystemError::WouldBlock); } @@ -222,7 +220,7 @@ impl INodeInterface for InetSocket { .map(|iovec| { let iovec = iovec.as_slice_mut(); let size = core::cmp::min(iovec.len(), data.len()); - iovec.copy_from_slice(&data.drain(..size).collect::>()); + iovec[..size].copy_from_slice(&data.drain(..size).collect::>()); size }) .sum::()) @@ -260,23 +258,35 @@ impl INodeInterface for InetSocket { SIOCSIFADDR => { let ifreq = VirtAddr::new(arg as _).read_mut::()?; - - let family = unsafe { ifreq.data.addr.sa_family }; + let socket = SocketAddr::from_ifreq(ifreq) + .map_err(|_| FileSystemError::NotSupported)? + .as_inet() + .ok_or(FileSystemError::NotSupported)?; let name = ifreq.name().ok_or(FileSystemError::InvalidPath)?; - let socket = SocketAddr::from_family( - VirtAddr::new(&unsafe { ifreq.data.addr } as *const _ as _), - family, - ) - .map_err(|_| FileSystemError::NotSupported)? - .as_inet() - .ok_or(FileSystemError::NotSupported)?; // FIXME: assert!(name == "eth0"); let device = net::default_device(); device.set_ip(Ipv4Addr::new(socket.addr())); + Ok(0) + } + + SIOCSIFNETMASK => { + let ifreq = VirtAddr::new(arg as _).read_mut::()?; + let socket = SocketAddr::from_ifreq(ifreq) + .map_err(|_| FileSystemError::NotSupported)? + .as_inet() + .ok_or(FileSystemError::NotSupported)?; + + let name = ifreq.name().ok_or(FileSystemError::InvalidPath)?; + + // FIXME: + assert!(name == "eth0"); + + let device = net::default_device(); + device.set_subnet_mask(Ipv4Addr::new(socket.addr())); Ok(0) } @@ -290,7 +300,13 @@ impl INodeInterface for InetSocket { table.insert(&self.wq); } - Ok(PollFlags::OUT) + let mut flags = PollFlags::OUT; + + if !self.inner.lock_irq().incoming.is_empty() { + flags |= PollFlags::IN; + } + + Ok(flags) } } diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index 83cbe0987fd..e9ba39255eb 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -20,7 +20,7 @@ pub mod inet; pub mod unix; -use aero_syscall::*; +use aero_syscall::{prelude::IfReq, *}; use crate::mem::paging::VirtAddr; @@ -40,6 +40,15 @@ impl<'a> SocketAddr<'a> { } } + pub fn from_ifreq(ifreq: &IfReq) -> Result { + // SAFETY??? + let family = unsafe { ifreq.data.addr.sa_family }; + SocketAddr::from_family( + VirtAddr::new(&unsafe { ifreq.data.addr } as *const _ as _), + family, + ) + } + /// Converts the socket address into a unix socket address. Returns [`None`] if /// the address is not a unix socket address. pub fn as_unix(&self) -> Option<&'a SocketAddrUnix> { diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 1cb1e58ea59..b8d340aa2d3 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -19,7 +19,7 @@ use aero_syscall::{OpenFlags, SocketAddrUnix, SyscallError, AF_UNIX}; -use aero_syscall::socket::MessageHeader; +use aero_syscall::socket::{MessageFlags, MessageHeader}; use alloc::collections::VecDeque; use alloc::sync::{Arc, Weak}; @@ -385,7 +385,9 @@ impl INodeInterface for UnixSocket { Ok(sock) } - fn recv(&self, header: &mut MessageHeader) -> fs::Result { + fn recv(&self, header: &mut MessageHeader, flags: MessageFlags) -> fs::Result { + assert!(flags.is_empty()); + let inner = self.inner.lock_irq(); let peer = match &inner.state { diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index 654aa92011e..a9d939d0c62 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -1,3 +1,4 @@ +use aero_syscall::socket::MessageFlags; use num_traits::cast::FromPrimitive; use aero_syscall::socket::MessageHeader; @@ -66,7 +67,7 @@ pub fn sock_send( header: &mut MessageHeader, flags: usize, ) -> Result { - assert!(flags == 0, "sock_send: flags are not currently supported"); + let flags = MessageFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; let current_task = scheduler::get_scheduler().current_task(); let socket = current_task @@ -74,7 +75,7 @@ pub fn sock_send( .get_handle(fd) .ok_or(SyscallError::EINVAL)?; - Ok(socket.inode().send(header)?) + Ok(socket.inode().send(header, flags)?) } #[syscall] @@ -83,7 +84,7 @@ pub fn sock_recv( header: &mut MessageHeader, flags: usize, ) -> Result { - assert!(flags == 0, "sock_recv: flags are not currently supported"); + let flags = MessageFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; let current_task = scheduler::get_scheduler().current_task(); let socket = current_task @@ -91,7 +92,7 @@ pub fn sock_recv( .get_handle(sockfd) .ok_or(SyscallError::EINVAL)?; - Ok(socket.inode().recv(header)?) + Ok(socket.inode().recv(header, flags)?) } /// Marks the socket as a passive socket (i.e. as a socket that will be used to accept incoming diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 366b9cec022..13dd937e3c2 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -360,6 +360,7 @@ pub struct FramebufferFScreenInfo { pub const SIOCGIFINDEX: usize = 0x8933; pub const SIOCGIFHWADDR: usize = 0x8927; pub const SIOCSIFADDR: usize = 0x8916; // set PA address +pub const SIOCSIFNETMASK: usize = 0x891c; // set network PA mask const IF_NAME_SIZE: usize = 16; diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 248c5d0a4e8..bf24e6680af 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -716,7 +716,7 @@ pub struct SocketAddrInet { impl SocketAddrInet { pub fn addr(&self) -> [u8; 4] { - self.sin_addr.addr.to_be_bytes() + self.sin_addr.addr.to_le_bytes() } } diff --git a/src/aero_syscall/src/socket.rs b/src/aero_syscall/src/socket.rs index e25003e2746..cbe997300da 100644 --- a/src/aero_syscall/src/socket.rs +++ b/src/aero_syscall/src/socket.rs @@ -1,6 +1,28 @@ use crate::SocketAddr; -// sysdeps/aero/include/abi-bits/socket.h +bitflags::bitflags! { + // mlibc/abis/mlibc/socket.h + pub struct MessageFlags: usize { + const CTRUNC = 0x1; + const DONTROUTE = 0x2; + const EOR = 0x4; + const OOB = 0x8; + const NOSIGNAL = 0x10; + const PEEK = 0x20; + const TRUNC = 0x40; + const WAITALL = 0x80; + const FIN = 0x200; + const CONFIRM = 0x800; + + // Linux extensions. + const DONTWAIT = 0x1000; + const CMSG_CLOEXEC = 0x2000; + const MORE = 0x4000; + const FASTOPEN = 0x20000000; + } +} + +// mlibc/abis/mlibc/socket.h #[derive(Debug)] #[repr(C)] pub struct MessageHeader { @@ -26,9 +48,9 @@ impl MessageHeader { assert!(self.name_len == core::mem::size_of::()); - // SAFETY: We know that the `name` pointer is valid and we have an exclusive reference to it. - // The size of name is checked above with the size of `T` and `T` is a `SocketAddr` so, its - // safe to create a mutable reference of `T` from the ptr. + // SAFETY: We know that the `name` pointer is valid and we have an exclusive reference to + // it. The size of name is checked above with the size of `T` and `T` is a `SocketAddr` so, + // its safe to create a mutable reference of `T` from the ptr. unsafe { Some(&mut *(self.name as *mut T)) } } @@ -38,8 +60,8 @@ impl MessageHeader { } pub fn iovecs_mut(&mut self) -> &mut [IoVec] { - // SAFETY: We know that the `iovec` pointer is valid, initialized and we have - // exclusive access so, its safe to construct a mutable slice from it. + // SAFETY: We know that the `iovec` pointer is valid, initialized and we have exclusive + // access so, its safe to construct a mutable slice from it. unsafe { core::slice::from_raw_parts_mut(self.iovec, self.iovec_len as usize) } } } @@ -59,8 +81,8 @@ impl IoVec { } pub fn as_slice_mut(&mut self) -> &mut [u8] { - // SAFETY: We know that the `base` pointer is valid, initialized and we have - // exclusive access so, its safe to construct a mutable slice from it. + // SAFETY: We know that the `base` pointer is valid, initialized and we have exclusive + // access so, its safe to construct a mutable slice from it. unsafe { core::slice::from_raw_parts_mut(self.base, self.len) } } From c38179c89bc6b0bebbcbd0c346d2096073d1a541 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 13 Apr 2023 16:29:46 +1000 Subject: [PATCH 182/368] patches::mlibc: fix SHA1 information Signed-off-by: Andy-Python-Programmer --- patches/mlibc/mlibc.patch | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 8f5c8e2f5c7..7f23452334c 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,8 +1,9 @@ -From 1c62d94e16ce0981d6d8ed646192bf1bbeb2a772 Mon Sep 17 00:00:00 2001 +From 5e9f6dd73080e121201fd2a26f282b2921053871 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Mon, 10 Apr 2023 15:19:49 +1000 +Date: Thu, 13 Apr 2023 16:28:35 +1000 Subject: [PATCH] +Signed-off-by: Andy-Python-Programmer --- .gitignore | 2 ++ options/ansi/generic/stdlib-stubs.cpp | 6 ++++-- @@ -15,7 +16,7 @@ Subject: [PATCH] 8 files changed, 74 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore -index fdd60a00..9f811f47 100644 +index fdd60a0..9f811f4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ subprojects @@ -25,7 +26,7 @@ index fdd60a00..9f811f47 100644 +# clangd cache files: +.cache diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp -index 4c5c3975..38d8d9d5 100644 +index c33dfba..ec8baa4 100644 --- a/options/ansi/generic/stdlib-stubs.cpp +++ b/options/ansi/generic/stdlib-stubs.cpp @@ -396,8 +396,10 @@ int mbtowc(wchar_t *__restrict wc, const char *__restrict mb, size_t max_size) { @@ -42,7 +43,7 @@ index 4c5c3975..38d8d9d5 100644 return nseq.it - mb; } else { diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp -index 3474615e..10a2109e 100644 +index 3474615..10a2109 100644 --- a/options/glibc/generic/execinfo.cpp +++ b/options/glibc/generic/execinfo.cpp @@ -1,9 +1,10 @@ @@ -59,7 +60,7 @@ index 3474615e..10a2109e 100644 char **backtrace_symbols(void *const *, int) { diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp -index 003a162d..ab01a7a4 100644 +index 003a162..ab01a7a 100644 --- a/options/rtdl/generic/linker.cpp +++ b/options/rtdl/generic/linker.cpp @@ -18,7 +18,7 @@ uintptr_t libraryBase = 0x41000000; @@ -72,7 +73,7 @@ index 003a162d..ab01a7a4 100644 constexpr bool eagerBinding = true; diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 0faf386d..e6bd277e 100644 +index 0faf386..e6bd277 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp @@ -176,13 +176,6 @@ int sys_kill(int pid, int sig) { @@ -124,7 +125,7 @@ index 0faf386d..e6bd277e 100644 } diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index 38b0e1bf..acbcef9a 100644 +index a2c483b..5332f22 100644 --- a/sysdeps/aero/generic/filesystem.cpp +++ b/sysdeps/aero/generic/filesystem.cpp @@ -155,14 +155,16 @@ int sys_tcgetattr(int fd, struct termios *attr) { @@ -151,11 +152,11 @@ index 38b0e1bf..acbcef9a 100644 return 0; diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp -index c730bff9..a32a34fb 100644 +index 4db9956..4cb3ee8 100644 --- a/sysdeps/aero/generic/sockets.cpp +++ b/sysdeps/aero/generic/sockets.cpp -@@ -4,7 +4,11 @@ - #include +@@ -5,7 +5,11 @@ + #include #include + @@ -164,9 +165,9 @@ index c730bff9..a32a34fb 100644 +#include +#include - namespace mlibc { - int sys_socket(int family, int type, int protocol, int *fd) { -@@ -181,10 +185,31 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, + namespace { + +@@ -210,10 +214,31 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, << frg::endlog; return 0; } else { @@ -201,7 +202,7 @@ index c730bff9..a32a34fb 100644 +} } // namespace mlibc diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 432bad2f..ba56ce95 100644 +index aa642e5..d8bf99e 100644 --- a/sysdeps/aero/include/aero/syscall.h +++ b/sysdeps/aero/include/aero/syscall.h @@ -75,6 +75,10 @@ @@ -215,7 +216,7 @@ index 432bad2f..ba56ce95 100644 // Invalid syscall used to trigger a log error in the kernel (as a hint) // so, that we can implement the syscall in the kernel. -@@ -217,4 +221,10 @@ __attribute__((always_inline)) static inline long syscall(sc_word_t call, +@@ -217,4 +221,10 @@ __attribute__((__always_inline__)) static inline long syscall(sc_word_t call, T... args) { return _syscall(call, sc_cast(args)...); } From 93178ac57a39a0206d76fed9779a38e685f452e4 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Thu, 13 Apr 2023 16:46:30 +1000 Subject: [PATCH 183/368] net::TcpSocket: stubs Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/net/mod.rs | 1 + src/aero_kernel/src/net/tcp.rs | 94 ++++++++++++++++ src/aero_kernel/src/net/udp.rs | 11 +- src/aero_kernel/src/socket/mod.rs | 3 +- src/aero_kernel/src/socket/tcp.rs | 100 ++++++++++++++++++ .../src/socket/{inet.rs => udp.rs} | 51 +++------ src/aero_kernel/src/syscall/net.rs | 21 +++- 7 files changed, 239 insertions(+), 42 deletions(-) create mode 100644 src/aero_kernel/src/net/tcp.rs create mode 100644 src/aero_kernel/src/socket/tcp.rs rename src/aero_kernel/src/socket/{inet.rs => udp.rs} (86%) diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 8cf32ddae33..849977bd4f6 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -26,6 +26,7 @@ pub mod arp; mod checksum; pub mod ethernet; pub mod ip; +pub mod tcp; pub mod udp; pub use ethernet::{Eth, MacAddr}; diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs new file mode 100644 index 00000000000..1b8f45e8f60 --- /dev/null +++ b/src/aero_kernel/src/net/tcp.rs @@ -0,0 +1,94 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +use alloc::collections::BTreeMap; +use alloc::sync::Arc; + +use bit_field::BitField; +use simple_endian::BigEndian; +use spin::RwLock; + +use super::ip::Ipv4; +use super::{Packet, PacketHeader, PacketKind, PacketTrait, PacketUpHierarchy}; + +#[derive(Debug, Copy, Clone)] +pub struct Tcp {} + +impl PacketKind for Tcp {} +impl PacketUpHierarchy for Packet {} +impl PacketHeader for Packet { + fn send(&self) { + todo!() + } + + fn recv(&self) { + todo!() + } +} + +impl PacketTrait for Packet { + fn header_size(&self) -> usize { + self.header().header_len() as usize + } +} + +#[repr(C, packed)] +pub struct TcpHeader { + src_port: BigEndian, + dst_port: BigEndian, + seq_nr: BigEndian, + ack_nr: BigEndian, + flags: BigEndian, + window: BigEndian, + checksum: BigEndian, + urgent_ptr: BigEndian, +} + +impl TcpHeader { + /// Return the header length, in octets. + pub fn header_len(&self) -> u8 { + let flags = self.flags; + (flags.to_native().get_bits(12..=15) * 4) as u8 + } +} + +static HANDLERS: RwLock>> = RwLock::new(BTreeMap::new()); + +pub trait TcpHandler: Send + Sync { + fn recv(&self, packet: Packet); +} + +pub fn alloc_ephemeral_port(socket: Arc) -> Option { + const EPHEMERAL_START: u16 = 49152; + const EPHEMERAL_END: u16 = u16::MAX; + + let mut handlers = HANDLERS.write(); + + // Ephemeral ports in the range 49152..65535 are not + // assigned, controlled, or registered and are used + // for temporary or private ports. + for port in EPHEMERAL_START..=EPHEMERAL_END { + if handlers.contains_key(&port) { + continue; + } + + handlers.insert(port, socket); + return Some(port); + } + + None +} diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs index 3776e718b08..c93962fa695 100644 --- a/src/aero_kernel/src/net/udp.rs +++ b/src/aero_kernel/src/net/udp.rs @@ -39,7 +39,7 @@ impl Packet { size += Udp::HSIZE; let ip_packet = Packet::::create(ip::Type::Udp, target, size); - let mut packet = ip_packet.upgrade(); + let mut packet: Packet = ip_packet.upgrade(); let header = packet.header_mut(); @@ -68,11 +68,12 @@ impl PacketHeader
for Packet { let dest_port = header.dst_port().to_native(); let handlers = HANDLERS.read(); - let handler = handlers - .get(&dest_port) - .expect("udp: no handler registered"); - handler.recv(self.clone()) + if let Some(handler) = handlers.get(&dest_port) { + handler.recv(self.clone()); + } else { + log::warn!("udp: no handler registered for port {}", dest_port); + } } } diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index e9ba39255eb..a5ab57ae1eb 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -17,7 +17,8 @@ * along with Aero. If not, see . */ -pub mod inet; +pub mod tcp; +pub mod udp; pub mod unix; use aero_syscall::{prelude::IfReq, *}; diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs new file mode 100644 index 00000000000..19ad996c189 --- /dev/null +++ b/src/aero_kernel/src/socket/tcp.rs @@ -0,0 +1,100 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +use alloc::sync::{Arc, Weak}; +use spin::Once; + +use crate::fs::cache::DirCacheItem; +use crate::fs::file_table::FileHandle; +use crate::fs::inode::{FileType, INodeInterface, Metadata}; +use crate::fs::{self, FileSystemError}; +use crate::net::tcp::{self, TcpHandler}; + +pub struct TcpSocket { + sref: Weak, + handle: Once>, +} + +impl TcpSocket { + pub fn new() -> Arc { + Arc::new_cyclic(|sref| Self { + handle: Once::new(), + sref: sref.clone(), + }) + } + + fn sref(&self) -> Arc { + self.sref.upgrade().unwrap() + } +} + +impl INodeInterface for TcpSocket { + fn metadata(&self) -> fs::Result { + Ok(Metadata { + id: 0, + file_type: FileType::Socket, + size: 0, + children_len: 0, + }) + } + + fn open( + &self, + _flags: aero_syscall::OpenFlags, + handle: Arc, + ) -> fs::Result> { + self.handle.call_once(|| handle); + Ok(None) + } + + fn bind(&self, _address: super::SocketAddr, _length: usize) -> fs::Result<()> { + todo!() + } + + fn connect(&self, address: super::SocketAddr, _length: usize) -> fs::Result<()> { + let _address = address.as_inet().ok_or(FileSystemError::NotSupported)?; + tcp::alloc_ephemeral_port(self.sref()); + + Ok(()) + } + + fn recv( + &self, + _message_hdr: &mut aero_syscall::socket::MessageHeader, + _flags: aero_syscall::socket::MessageFlags, + ) -> fs::Result { + todo!() + } + + fn send( + &self, + _message_hdr: &mut aero_syscall::socket::MessageHeader, + _flags: aero_syscall::socket::MessageFlags, + ) -> fs::Result { + todo!() + } + + fn poll(&self, _table: Option<&mut fs::inode::PollTable>) -> fs::Result { + todo!() + } +} + +impl TcpHandler for TcpSocket { + fn recv(&self, _packet: crate::net::Packet) { + todo!() + } +} diff --git a/src/aero_kernel/src/socket/inet.rs b/src/aero_kernel/src/socket/udp.rs similarity index 86% rename from src/aero_kernel/src/socket/inet.rs rename to src/aero_kernel/src/socket/udp.rs index 4bb4ff21d6e..b8cbe570e9d 100644 --- a/src/aero_kernel/src/socket/inet.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -19,7 +19,7 @@ use aero_syscall::prelude::{IfReq, SIOCGIFHWADDR, SIOCGIFINDEX, SIOCSIFADDR, SIOCSIFNETMASK}; use aero_syscall::socket::{MessageFlags, MessageHeader}; -use aero_syscall::{IpProtocol, OpenFlags, SocketAddrInet, SocketType, SyscallError}; +use aero_syscall::{OpenFlags, SocketAddrInet}; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use spin::Once; @@ -45,35 +45,30 @@ enum SocketState { } #[derive(Default)] -struct InetSocketInner { +struct UdpSocketInner { /// The address that the socket has been bound to. address: Option, state: SocketState, incoming: Vec>, } -pub struct InetSocket { - typ: SocketType, - protocol: IpProtocol, - inner: Mutex, +pub struct UdpSocket { + inner: Mutex, wq: BlockQueue, handle: Once>, sref: Weak, } -impl InetSocket { - pub fn new(typ: SocketType, protocol: IpProtocol) -> Result, SyscallError> { - Ok(Arc::new_cyclic(|sref| Self { - typ, - protocol, - +impl UdpSocket { + pub fn new() -> Arc { + Arc::new_cyclic(|sref| Self { wq: BlockQueue::new(), handle: Once::new(), inner: Mutex::new(Default::default()), sref: sref.clone(), - })) + }) } fn sref(&self) -> Arc { @@ -113,7 +108,7 @@ impl InetSocket { } } -impl INodeInterface for InetSocket { +impl INodeInterface for UdpSocket { fn open( &self, _flags: aero_syscall::OpenFlags, @@ -135,31 +130,19 @@ impl INodeInterface for InetSocket { fn bind(&self, address: super::SocketAddr, _length: usize) -> fs::Result<()> { let address = address.as_inet().ok_or(FileSystemError::NotSupported)?; - match (self.typ, self.protocol) { - (SocketType::Dgram, IpProtocol::Default) => { - self.set_addr(address.clone()); - udp::bind(address.port.to_native(), self.sref()); - Ok(()) - } - - _ => unreachable!("bind: {:?} {:?}", self.typ, self.protocol), - } + self.set_addr(address.clone()); + udp::bind(address.port.to_native(), self.sref()); + Ok(()) } fn connect(&self, address: super::SocketAddr, _length: usize) -> fs::Result<()> { let address = address.as_inet().ok_or(FileSystemError::NotSupported)?; - match (self.typ, self.protocol) { - (SocketType::Dgram | SocketType::Stream, IpProtocol::Default) => { - let host_addr = Ipv4Addr::new(address.sin_addr.addr.to_be_bytes()); - udp::connect(host_addr, address.port.to_native()); - - self.set_state(SocketState::Connected(address.clone())); - Ok(()) - } + let host_addr = Ipv4Addr::new(address.sin_addr.addr.to_be_bytes()); + udp::connect(host_addr, address.port.to_native()); - _ => unreachable!("connect: {:?} {:?}", self.typ, self.protocol), - } + self.set_state(SocketState::Connected(address.clone())); + Ok(()) } fn send(&self, message_hdr: &mut MessageHeader, _flags: MessageFlags) -> fs::Result { @@ -310,7 +293,7 @@ impl INodeInterface for InetSocket { } } -impl UdpHandler for InetSocket { +impl UdpHandler for UdpSocket { fn recv(&self, packet: Packet) { self.inner.lock_irq().incoming.push(packet); self.wq.notify_complete(); diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index a9d939d0c62..e33d8e55b8f 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -10,7 +10,8 @@ use crate::fs::inode::DirEntry; use crate::fs::inode::INodeInterface; use crate::mem::paging::VirtAddr; -use crate::socket::inet::InetSocket; +use crate::socket::tcp::TcpSocket; +use crate::socket::udp::UdpSocket; use crate::socket::unix::*; use crate::socket::SocketAddr; @@ -119,7 +120,23 @@ fn create_socket( let socket = match domain as u32 { AF_UNIX => UnixSocket::new() as Arc, - AF_INET => InetSocket::new(typ, protocol)? as Arc, + AF_INET => match (typ, protocol) { + (SocketType::Dgram, IpProtocol::Default | IpProtocol::Udp) => { + UdpSocket::new() as Arc + } + + (SocketType::Stream, IpProtocol::Default | IpProtocol::Tcp) => { + TcpSocket::new() as Arc + } + + _ => { + log::warn!( + "unsupported socket type: domain={domain}, socket_type={socket_type}, protocol={protocol:?}" + ); + + return Err(SyscallError::EINVAL); + } + }, _ => { log::warn!( From 7ee87dccfdbd891d7fff252eba393212e3698304 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 14 Apr 2023 14:08:21 +1000 Subject: [PATCH 184/368] sockets::tcp: 3 way handshake :skull: Signed-off-by: Andy-Python-Programmer --- base-files/a | 2 +- src/Cargo.lock | 9 ++- src/aero_kernel/Cargo.toml | 14 +--- src/aero_kernel/src/net/ip.rs | 13 ++-- src/aero_kernel/src/net/tcp.rs | 116 ++++++++++++++++++++++++++++-- src/aero_kernel/src/socket/tcp.rs | 106 ++++++++++++++++++++++++--- src/aero_syscall/src/lib.rs | 4 ++ 7 files changed, 231 insertions(+), 33 deletions(-) diff --git a/base-files/a b/base-files/a index f419cee78de..d9ae7e1d5e3 100644 --- a/base-files/a +++ b/base-files/a @@ -1,2 +1,2 @@ #!/usr/bin/bash -systrace curl https://andypy.dev +systrace curl 192.168.1.25:8080 diff --git a/src/Cargo.lock b/src/Cargo.lock index 3df9a23cd2a..d3a912bde5c 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -26,7 +26,7 @@ dependencies = [ "raw-cpuid", "rustc-demangle", "serde_json", - "simple_endian", + "simple_endian 0.2.1 (git+https://github.com/Andy-Python-Programmer/simple-endian-rs)", "spin 0.9.8", "static_assertions", "uapi", @@ -51,7 +51,7 @@ dependencies = [ "bitflags", "num-derive", "num-traits", - "simple_endian", + "simple_endian 0.2.1 (git+https://github.com/michalfita/simple-endian-rs?branch=bugfix/4/fix-no_std-support-right-way)", ] [[package]] @@ -437,6 +437,11 @@ name = "simple_endian" version = "0.2.1" source = "git+https://github.com/michalfita/simple-endian-rs?branch=bugfix/4/fix-no_std-support-right-way#7210f40881d16f7f2e3d8d40f6381fa222843caa" +[[package]] +name = "simple_endian" +version = "0.2.1" +source = "git+https://github.com/Andy-Python-Programmer/simple-endian-rs#626b4f2a7dfb8bfaa46a728fd6db886fe8b42fa3" + [[package]] name = "spin" version = "0.5.2" diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index 631dd850763..7b4448d75a5 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -42,19 +42,7 @@ cpio_reader = { git = "https://github.com/Andy-Python-Programmer/cpio_reader" } static_assertions = "1.1.0" lru = "0.8.0" bytemuck = "1.12.1" -# the crate is not mainted but who cares it works (tm)! -simple_endian = { git = "https://github.com/michalfita/simple-endian-rs", branch = "bugfix/4/fix-no_std-support-right-way", default_features = false, features = [ - "bitwise", - "comparisons", - "format", - "math_ops", - "neg_ops", - "shift_ops", - "both_endian", - "float_impls", - "integer_impls", - "byte_impls", -] } +simple_endian = { git = "https://github.com/Andy-Python-Programmer/simple-endian-rs" } byteorder = { version = "*", default-features = false } limine = { git = "https://github.com/limine-bootloader/limine-rs" } cfg-if = "1.0" diff --git a/src/aero_kernel/src/net/ip.rs b/src/aero_kernel/src/net/ip.rs index 2b2bf14eaed..e4493a3a4ac 100644 --- a/src/aero_kernel/src/net/ip.rs +++ b/src/aero_kernel/src/net/ip.rs @@ -40,6 +40,7 @@ impl Ipv4Addr { #[derive(Debug, Copy, Clone)] #[repr(u8)] pub enum Type { + Tcp = 6u8.swap_bytes(), Udp = 17u8.swap_bytes(), } @@ -63,8 +64,8 @@ impl Header { self.length = BigEndian::from(length); } - fn length(&self) -> BigEndian { - self.length + pub fn length(&self) -> u16 { + self.length.into() } } @@ -95,7 +96,6 @@ impl Packet { header.dest_ip = dest; header.src_ip = default_device().ip(); - log::debug!("{:?}", header.src_ip); header.hcrc = checksum::make(checksum::calculate(header)); packet } @@ -111,12 +111,17 @@ impl PacketHeader
for Packet { let mut packet = self.clone(); let header = self.header(); - packet.len = header.length().to_native() as usize; + packet.len = header.length() as usize; match header.protocol { Type::Udp => { let packet: Packet = packet.upgrade(); packet.recv(); } + + Type::Tcp => { + let packet: Packet = packet.upgrade(); + packet.recv(); + } } } } diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs index 1b8f45e8f60..91ce8b0c847 100644 --- a/src/aero_kernel/src/net/tcp.rs +++ b/src/aero_kernel/src/net/tcp.rs @@ -22,21 +22,77 @@ use bit_field::BitField; use simple_endian::BigEndian; use spin::RwLock; -use super::ip::Ipv4; -use super::{Packet, PacketHeader, PacketKind, PacketTrait, PacketUpHierarchy}; +use super::ip::{self, Ipv4, Ipv4Addr}; +use super::{ + checksum, Packet, PacketDownHierarchy, PacketHeader, PacketKind, PacketTrait, PacketUpHierarchy, +}; #[derive(Debug, Copy, Clone)] pub struct Tcp {} +impl Packet { + pub fn create(src_port: u16, dest_port: u16, size: usize, target: Ipv4Addr) -> Packet { + let total_size = core::mem::size_of::() + size; + let mut packet: Packet = + Packet::::create(ip::Type::Tcp, target, total_size).upgrade(); + + let header = packet.header_mut(); + + header.src_port = src_port.into(); + header.dest_port = dest_port.into(); + header.set_header_len(core::mem::size_of::() as u8); + + packet + } + + pub fn ack_len(&self) -> u32 { + let data_size = self.as_slice().len() as u32; + let flags = self.header().flags(); + + let mut addend = 0; + if flags.contains(TcpFlags::FIN) | flags.contains(TcpFlags::SYN) { + addend = 1; + } + + data_size + addend + } +} + +bitflags::bitflags! { + pub struct TcpFlags: u16 { + const FIN = 1 << 0; + const SYN = 1 << 1; + const RST = 1 << 2; + const PSH = 1 << 3; + const ACK = 1 << 4; + const URG = 1 << 5; + } +} + impl PacketKind for Tcp {} impl PacketUpHierarchy for Packet {} impl PacketHeader for Packet { fn send(&self) { - todo!() + let ip_packet = self.downgrade(); + + let mut packet = self.clone(); + let header = packet.header_mut(); + + header.compute_checksum(ip_packet.header()); + ip_packet.send(); } fn recv(&self) { - todo!() + let header = self.header(); + let dest_port = header.dest_port(); + + let handlers = HANDLERS.read(); + + if let Some(handler) = handlers.get(&dest_port) { + handler.recv(self.clone()); + } else { + log::warn!("tcp: no handler registered for port {}", dest_port); + } } } @@ -49,7 +105,7 @@ impl PacketTrait for Packet { #[repr(C, packed)] pub struct TcpHeader { src_port: BigEndian, - dst_port: BigEndian, + dest_port: BigEndian, seq_nr: BigEndian, ack_nr: BigEndian, flags: BigEndian, @@ -58,12 +114,62 @@ pub struct TcpHeader { urgent_ptr: BigEndian, } +const_assert_eq!(core::mem::size_of::(), 20); + impl TcpHeader { /// Return the header length, in octets. pub fn header_len(&self) -> u8 { let flags = self.flags; (flags.to_native().get_bits(12..=15) * 4) as u8 } + + pub fn set_ack_number(&mut self, val: u32) { + self.ack_nr = val.into(); + } + + pub fn set_header_len(&mut self, val: u8) { + let mut flags = self.flags.to_native(); + flags.set_bits(12..=15, val as u16 / 4); + self.flags = flags.into(); + } + + pub fn compute_checksum(&mut self, ip_header: &ip::Header) { + self.checksum = BigEndian::from(0); + self.checksum = checksum::make_combine(&[ + checksum::calculate(&checksum::PseudoHeader::new(ip_header)), + checksum::calculate_with_len( + self, + ip_header.length() as usize - core::mem::size_of::(), + ), + ]); + } + + pub fn dest_port(&self) -> u16 { + self.dest_port.to_native() + } + + pub fn set_sequence_number(&mut self, val: u32) { + self.seq_nr = val.into(); + } + + pub fn sequence_number(&self) -> u32 { + self.seq_nr.to_native() + } + + pub fn set_window(&mut self, val: u16) { + self.window = val.into(); + } + + pub fn set_flags(&mut self, val: TcpFlags) { + let mut flags = self.flags.to_native(); + flags.set_bits(0..=5, val.bits()); + self.flags = flags.into(); + } + + pub fn flags(&self) -> TcpFlags { + let raw = self.flags.to_native().get_bits(0..=5); + TcpFlags::from_bits_truncate(raw) + } } static HANDLERS: RwLock>> = RwLock::new(BTreeMap::new()); diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 19ad996c189..0d5a6548149 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -20,12 +20,88 @@ use spin::Once; use crate::fs::cache::DirCacheItem; use crate::fs::file_table::FileHandle; -use crate::fs::inode::{FileType, INodeInterface, Metadata}; +use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags}; use crate::fs::{self, FileSystemError}; -use crate::net::tcp::{self, TcpHandler}; +use crate::net::ip::Ipv4Addr; +use crate::net::tcp::{self, Tcp, TcpFlags, TcpHandler}; +use crate::net::{Packet, PacketHeader, PacketTrait}; +use crate::utils::sync::Mutex; + +#[derive(Default)] +struct TransmissionControl { + /// Sequence number of the next byte to be sent. + send_next: u32, + recv_next: u32, +} + +#[derive(Default, PartialEq, Eq, Debug)] +enum State { + #[default] + Closed, + SynSent, + Established, +} + +#[derive(Default)] +struct TcpData { + control: TransmissionControl, + state: State, + + src_port: u16, + dest_port: u16, + target: Ipv4Addr, +} + +impl TcpData { + fn make_packet(&self, size: usize, flags: TcpFlags) -> Packet { + let mut packet = Packet::::create(self.src_port, self.dest_port, size, self.target); + let header = packet.header_mut(); + + header.set_sequence_number(self.control.send_next); + header.set_window(u16::MAX); + header.set_flags(flags); + + packet + } + + fn send_sync(&mut self) { + self.make_packet(0, TcpFlags::SYN).send(); + self.state = State::SynSent; + } + + fn send_ack(&mut self) { + let mut packet = self.make_packet(0, TcpFlags::empty()); + let header = packet.header_mut(); + + header.set_ack_number(self.control.recv_next); + packet.send(); + + self.state = State::Established; + } + + fn recv(&mut self, packet: Packet) { + let header = packet.header(); + + match self.state { + State::SynSent => { + assert!(header.flags().contains(TcpFlags::ACK | TcpFlags::SYN)); + self.control.recv_next = header.sequence_number().wrapping_add(packet.ack_len()); + self.send_ack(); + } + + State::Established => { + assert!(packet.as_slice().is_empty() && !header.flags().contains(TcpFlags::FIN)); + log::trace!("[ TCP ] Connection Established!"); + } + + State::Closed => unreachable!(), + } + } +} pub struct TcpSocket { sref: Weak, + data: Mutex, handle: Once>, } @@ -34,6 +110,7 @@ impl TcpSocket { Arc::new_cyclic(|sref| Self { handle: Once::new(), sref: sref.clone(), + data: Mutex::new(TcpData::default()), }) } @@ -66,9 +143,15 @@ impl INodeInterface for TcpSocket { } fn connect(&self, address: super::SocketAddr, _length: usize) -> fs::Result<()> { - let _address = address.as_inet().ok_or(FileSystemError::NotSupported)?; - tcp::alloc_ephemeral_port(self.sref()); + let address = address.as_inet().ok_or(FileSystemError::NotSupported)?; + let port = tcp::alloc_ephemeral_port(self.sref()).unwrap(); + let mut inner = self.data.lock_irq(); + inner.src_port = port; + inner.dest_port = address.port(); + inner.target = Ipv4Addr::new(address.addr()); + + inner.send_sync(); Ok(()) } @@ -88,13 +171,20 @@ impl INodeInterface for TcpSocket { todo!() } - fn poll(&self, _table: Option<&mut fs::inode::PollTable>) -> fs::Result { - todo!() + fn poll(&self, _table: Option<&mut fs::inode::PollTable>) -> fs::Result { + let mut flags = PollFlags::empty(); + let data = self.data.lock_irq(); + + if data.state != State::Closed { + flags |= PollFlags::OUT; + } + + Ok(flags) } } impl TcpHandler for TcpSocket { - fn recv(&self, _packet: crate::net::Packet) { - todo!() + fn recv(&self, packet: Packet) { + self.data.lock_irq().recv(packet); } } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index bf24e6680af..ce549aa186a 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -718,6 +718,10 @@ impl SocketAddrInet { pub fn addr(&self) -> [u8; 4] { self.sin_addr.addr.to_le_bytes() } + + pub fn port(&self) -> u16 { + self.port.to_native() + } } impl SocketAddr for SocketAddrUnix {} From 413e10b7916445dcaf9371c993d0d9ff6956becb Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 14 Apr 2023 16:44:32 +1000 Subject: [PATCH 185/368] arp: send reply Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/net/arp.rs | 53 +++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index e0785c991b5..52941d4779a 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -131,7 +131,7 @@ pub enum PType { #[repr(u16)] pub enum Opcode { Request = 1u16.swap_bytes(), - // Reply = 2u16.swap_bytes(), + Reply = 2u16.swap_bytes(), } #[repr(C, packed)] @@ -149,9 +149,35 @@ pub struct ArpHeader { pub dest_ip: Ipv4Addr, } +impl ArpHeader { + pub fn opcode(&self) -> Opcode { + self.opcode + } +} + #[derive(Debug, Copy, Clone)] pub struct Arp {} +impl Packet { + pub fn create() -> Packet { + let device = default_device(); + + let mut packet: Packet = + Packet::::create(ethernet::Type::Arp, core::mem::size_of::()).upgrade(); + + let header = packet.header_mut(); + header.htype = HType::Ethernet; + header.ptype = PType::Ipv4; + header.hlen = BigEndian::from(MacAddr::ADDR_SIZE as u8); + header.plen = BigEndian::from(Ipv4Addr::ADDR_SIZE as u8); + + header.src_ip = device.ip(); + header.src_mac = device.mac(); + + packet + } +} + impl ConstPacketKind for Arp { const HSIZE: usize = core::mem::size_of::(); } @@ -172,25 +198,26 @@ impl PacketHeader for Packet { .write() .insert(header.src_ip, header.src_mac); - // if header.opcode() == Opcode::Request {} else if header.opcode() == Opcode::Reply {} + let device = default_device(); + + if header.opcode() == Opcode::Request && header.dest_ip == device.ip() { + let mut packet = Packet::::create(); + let reply_header = packet.header_mut(); + + reply_header.opcode = Opcode::Reply; + reply_header.dest_ip = header.src_ip; + reply_header.dest_mac = header.src_mac; + + packet.send(); + } } } pub fn request_ip(target: Ipv4Addr, to: Packet) { - let mut packet: Packet = - Packet::::create(ethernet::Type::Arp, core::mem::size_of::()).upgrade(); - - let device = default_device(); - + let mut packet = Packet::::create(); let header = packet.header_mut(); - header.htype = HType::Ethernet; - header.ptype = PType::Ipv4; - header.hlen = BigEndian::from(MacAddr::ADDR_SIZE as u8); - header.plen = BigEndian::from(Ipv4Addr::ADDR_SIZE as u8); header.opcode = Opcode::Request; - header.src_ip = device.ip(); - header.src_mac = device.mac(); header.dest_ip = target; header.dest_mac = MacAddr::NULL; From 5cc928afdcb9266fe3e8737066df5b4132ad94f7 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 14 Apr 2023 16:44:46 +1000 Subject: [PATCH 186/368] kernel: `nonnull_slice_from_raw_parts` is now stabalized :) Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 2b7d5a6a3fc..1c444bacbdf 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -40,7 +40,6 @@ step_trait, prelude_import, allocator_api, - nonnull_slice_from_raw_parts, maybe_uninit_write_slice, slice_ptr_get, maybe_uninit_as_bytes, From d98fa83e44c4c4cebf83f120f27cad39d5bc9348 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 14 Apr 2023 16:45:34 +1000 Subject: [PATCH 187/368] tcp::set_ack_number: set the ACK flag aswell Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/net/tcp.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs index 91ce8b0c847..c3d865355c2 100644 --- a/src/aero_kernel/src/net/tcp.rs +++ b/src/aero_kernel/src/net/tcp.rs @@ -123,8 +123,13 @@ impl TcpHeader { (flags.to_native().get_bits(12..=15) * 4) as u8 } + /// Sets the ACK number to `val` and sets the [`TcpFlags::ACK`] flag. pub fn set_ack_number(&mut self, val: u32) { self.ack_nr = val.into(); + + let mut flags = self.flags(); + flags.insert(TcpFlags::ACK); + self.set_flags(flags); } pub fn set_header_len(&mut self, val: u8) { From 2b8daeea795eef9f6b9a78250da546a95880d1c0 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 14 Apr 2023 16:46:40 +1000 Subject: [PATCH 188/368] sockets::tcp: send Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/socket/tcp.rs | 56 ++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 0d5a6548149..e2da41088eb 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -16,6 +16,7 @@ // along with Aero. If not, see . use alloc::sync::{Arc, Weak}; +use alloc::vec::Vec; use spin::Once; use crate::fs::cache::DirCacheItem; @@ -64,19 +65,22 @@ impl TcpData { packet } - fn send_sync(&mut self) { - self.make_packet(0, TcpFlags::SYN).send(); - self.state = State::SynSent; - } - - fn send_ack(&mut self) { - let mut packet = self.make_packet(0, TcpFlags::empty()); + fn make_ack_packet(&self, size: usize) -> Packet { + let mut packet = self.make_packet(size, TcpFlags::empty()); let header = packet.header_mut(); header.set_ack_number(self.control.recv_next); + packet + } + + fn send_packet(&mut self, packet: Packet) { + self.control.send_next = self.control.send_next.wrapping_add(packet.ack_len()); packet.send(); + } - self.state = State::Established; + fn send_sync(&mut self) { + self.send_packet(self.make_packet(0, TcpFlags::SYN)); + self.state = State::SynSent; } fn recv(&mut self, packet: Packet) { @@ -86,12 +90,20 @@ impl TcpData { State::SynSent => { assert!(header.flags().contains(TcpFlags::ACK | TcpFlags::SYN)); self.control.recv_next = header.sequence_number().wrapping_add(packet.ack_len()); - self.send_ack(); + + self.send_packet(self.make_ack_packet(0)); + self.state = State::Established; } State::Established => { - assert!(packet.as_slice().is_empty() && !header.flags().contains(TcpFlags::FIN)); - log::trace!("[ TCP ] Connection Established!"); + if !packet.as_slice().is_empty() { + let data = packet.as_slice(); + log::debug!("{:?}", core::str::from_utf8(data)); + } else if header.flags().contains(TcpFlags::FIN) { + todo!() + } else { + log::trace!("[ TCP ] Connection Established!"); + } } State::Closed => unreachable!(), @@ -165,10 +177,28 @@ impl INodeInterface for TcpSocket { fn send( &self, - _message_hdr: &mut aero_syscall::socket::MessageHeader, + message_hdr: &mut aero_syscall::socket::MessageHeader, _flags: aero_syscall::socket::MessageFlags, ) -> fs::Result { - todo!() + const MAX_MTU: usize = 1460; + + let data = message_hdr + .iovecs() + .iter() + .map(|e| e.as_slice()) + .flatten() + .copied() + .collect::>(); + + let mut inner = self.data.lock_irq(); + + for chunk in data.chunks(MAX_MTU) { + let mut packet = inner.make_ack_packet(chunk.len()); + packet.as_slice_mut().copy_from_slice(chunk); + inner.send_packet(packet); + } + + Ok(data.len()) } fn poll(&self, _table: Option<&mut fs::inode::PollTable>) -> fs::Result { From fe3d0e7acc72f68e21c0f7202aff61ccfd320942 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 14 Apr 2023 17:33:28 +1000 Subject: [PATCH 189/368] sockets::tcp: recv Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/socket/tcp.rs | 80 +++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 8 deletions(-) diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index e2da41088eb..ed02424ef25 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use alloc::boxed::Box; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use spin::Once; @@ -23,11 +24,55 @@ use crate::fs::cache::DirCacheItem; use crate::fs::file_table::FileHandle; use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags}; use crate::fs::{self, FileSystemError}; +use crate::mem::alloc_boxed_buffer; use crate::net::ip::Ipv4Addr; use crate::net::tcp::{self, Tcp, TcpFlags, TcpHandler}; use crate::net::{Packet, PacketHeader, PacketTrait}; use crate::utils::sync::Mutex; +/// TCP Stream +struct Stream { + read_cursor: usize, + write_cursor: usize, + + buffer: Box<[u8]>, +} + +impl Stream { + fn write(&mut self, buffer: &[u8]) { + assert!(self.write_cursor < self.buffer.len()); + + self.buffer[self.write_cursor..self.write_cursor + buffer.len()].copy_from_slice(buffer); + self.write_cursor += buffer.len(); + } + + fn read(&mut self, buffer: &mut [u8]) -> usize { + assert!(self.write_cursor > self.read_cursor); + + let size = buffer.len().min(self.write_cursor - self.read_cursor); + + buffer[..size].copy_from_slice(&self.buffer[self.read_cursor..self.read_cursor + size]); + self.read_cursor += buffer.len(); + + size + } + + fn is_empty(&self) -> bool { + self.read_cursor == self.write_cursor + } +} + +impl Default for Stream { + fn default() -> Self { + Self { + read_cursor: 0, + write_cursor: 0, + + buffer: alloc_boxed_buffer(4096), + } + } +} + #[derive(Default)] struct TransmissionControl { /// Sequence number of the next byte to be sent. @@ -51,6 +96,8 @@ struct TcpData { src_port: u16, dest_port: u16, target: Ipv4Addr, + + stream: Stream, } impl TcpData { @@ -89,25 +136,26 @@ impl TcpData { match self.state { State::SynSent => { assert!(header.flags().contains(TcpFlags::ACK | TcpFlags::SYN)); - self.control.recv_next = header.sequence_number().wrapping_add(packet.ack_len()); - - self.send_packet(self.make_ack_packet(0)); self.state = State::Established; } State::Established => { if !packet.as_slice().is_empty() { let data = packet.as_slice(); - log::debug!("{:?}", core::str::from_utf8(data)); + self.stream.write(data); } else if header.flags().contains(TcpFlags::FIN) { todo!() } else { log::trace!("[ TCP ] Connection Established!"); + return; } } State::Closed => unreachable!(), } + + self.control.recv_next = header.sequence_number().wrapping_add(packet.ack_len()); + self.send_packet(self.make_ack_packet(0)); } } @@ -169,10 +217,20 @@ impl INodeInterface for TcpSocket { fn recv( &self, - _message_hdr: &mut aero_syscall::socket::MessageHeader, + message_hdr: &mut aero_syscall::socket::MessageHeader, _flags: aero_syscall::socket::MessageFlags, ) -> fs::Result { - todo!() + let mut data = self.data.lock_irq(); + assert!(!data.stream.is_empty()); + + Ok(message_hdr + .iovecs_mut() + .iter_mut() + .map(|iovec| { + let iovec = iovec.as_slice_mut(); + data.stream.read(iovec) + }) + .sum::()) } fn send( @@ -205,8 +263,14 @@ impl INodeInterface for TcpSocket { let mut flags = PollFlags::empty(); let data = self.data.lock_irq(); - if data.state != State::Closed { - flags |= PollFlags::OUT; + if data.state == State::Closed { + return Ok(flags); + } + + flags |= PollFlags::OUT; + + if !data.stream.is_empty() { + flags |= PollFlags::IN; } Ok(flags) From b5211ff2e5dc50befc15f668ebab687d4413db3e Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 15 Apr 2023 18:21:56 +1000 Subject: [PATCH 190/368] bootstrap: `git` and `pcre` Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 42 ++++++++++++++++++++++++++++++++++++++ bootstrap/vcs.yml | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 bootstrap/vcs.yml diff --git a/bootstrap.yml b/bootstrap.yml index b04d9825b39..fb2e86187b3 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -1,6 +1,7 @@ imports: - file: bootstrap/xorg.yml - file: bootstrap/net.yml + - file: bootstrap/vcs.yml general: cargo: @@ -1800,6 +1801,47 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: pcre + source: + subdir: 'bundled' + # Use a git mirror as pcre retired their svn repositories + git: 'https://github.com/vinix-os/pcre' + tag: '1767' + # Seems to be 8.45? + version: '8.45' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-autoconf-archive + regenerate: + - args: ['./autogen.sh'] + tools_required: + - host-gcc + - host-autoconf-v2.69 + - host-automake-v1.16 + pkgs_required: + - mlibc + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. + - '--enable-unicode-properties' + - '--enable-pcre8' + - '--enable-pcre16' + - '--enable-pcre32' + - '--disable-static' + environ: + PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' + PKG_CONFIG_LIBDIR: '@BUILD_ROOT@/system-root/usr/lib/pkgconfig:@BUILD_ROOT@/system-root/usr/share/pkgconfig' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] + + # - name: weston # labels: [aarch64] # architecture: '@OPTION:arch@' diff --git a/bootstrap/vcs.yml b/bootstrap/vcs.yml new file mode 100644 index 00000000000..8b477baa697 --- /dev/null +++ b/bootstrap/vcs.yml @@ -0,0 +1,51 @@ +packages: + # The Git version control system + # + # Git is one of the most used version control systems designed to + # handle large projects efficiently. + - name: git + source: + subdir: 'bundled' + git: 'https://github.com/git/git.git' + tag: 'v2.32.0' + version: '2.32.0' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + regenerate: + - args: ['autoreconf'] + tools_required: + - host-pkg-config + - host-gcc + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - python + - libexpat + - zlib + - openssl + - curl + - libiconv + - pcre + configure: + - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + - args: + - './configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--with-python=python3' + - '--with-gitconfig=/etc/gitconfig' + - '--with-curl=@SYSROOT_DIR@/usr' + - '--without-iconv' + - '--with-libpcre' + - 'ac_cv_fread_reads_directories=1' + - 'ac_cv_snprintf_returns_bogus=1' + environ: + CURL_CONFIG: '@SYSROOT_DIR@/usr/bin/curl-config' + build: + - args: ['make', 'NO_GETTEXT=YesPlease', '-j@PARALLELISM@'] + - args: ['make', 'NO_GETTEXT=YesPlease', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' From 0bd7f98b40019873eec41d407ed0d1a7ec57e744 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Mon, 17 Apr 2023 14:27:57 +1000 Subject: [PATCH 191/368] bootstrap: add `links` Signed-off-by: Andy-Python-Programmer --- bootstrap/net.yml | 54 +++++++++++++++++++++++++ misc/dwm-alacritty-glxgears.png | Bin 475532 -> 440070 bytes patches/mlibc/mlibc.patch | 8 ++-- src/aero_kernel/src/net/mod.rs | 2 +- src/aero_kernel/src/socket/tcp.rs | 63 +++++++++++++++++------------- 5 files changed, 95 insertions(+), 32 deletions(-) diff --git a/bootstrap/net.yml b/bootstrap/net.yml index 0521107425e..cf2aea07890 100644 --- a/bootstrap/net.yml +++ b/bootstrap/net.yml @@ -175,3 +175,57 @@ packages: - args: ['make', 'install'] environ: DESTDIR: '@THIS_COLLECT_DIR@' + + - name: links + source: + subdir: 'bundled' + url: 'http://links.twibright.com/download/links-2.28.tar.gz' + format: 'tar.gz' + checksum: blake2b:5695cfa26fac30f021ef415e75edb9456ad0360b0edeefa02d2862b149f757a1f1f4d5e5a1e6f3f198696bf35129c93f0f46bdf06ab1b0eb6c91f22e08fffb07 + extract_path: 'links-2.28' + version: '2.28' + tools_required: + - host-pkg-config + - host-gcc + - virtual: pkgconfig-for-target + triple: x86_64-aero + pkgs_required: + - mlibc + - zlib + - openssl + - libpng + - zstd + - libxext + - freetype + - fontconfig + - xz-utils + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--mandir=/usr/share/man' + - '--enable-graphics' + - '--without-directfb' + - '--without-librsvg' + - '--with-bzip2' + - '--with-X' + - '--x-includes=@SYSROOT_DIR@/usr/include' + - '--x-libraries=@SYSROOT_DIR@/usr/lib' + - '--with-zlib' + - '--with-zstd' + - '--with-openssl' + - '--with-libjpeg' + - '--without-libtiff' + - '--without-openmp' + - '--with-lzma' + - '--with-freetype' + - '--without-ipv6' + environ: + # Configure doesn't set CC correctly and assumes gcc unless manually overridden. + CC: 'x86_64-aero-gcc' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' \ No newline at end of file diff --git a/misc/dwm-alacritty-glxgears.png b/misc/dwm-alacritty-glxgears.png index 62175efef9d8b0bd546f52ae376115bb809281d6..e700524fa25c8e32f6216226ca127ecb07a3870d 100644 GIT binary patch literal 440070 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

hul zoo3oekdH$sv0@9+j{}}C<#DeWq5Y;gxC-Z>N1G(0uSFYp+l%b=1ig5-2((xKz>KOu zn3{3yh^~N>-mVFlDHv1<-za2li~g9|VGiXMy&^%n^T75`|z zK&mGYp9+HAQI(XV^m}D!y$1cm{he&PsXg#n7(Am!wjxtqIfW7D3@N#v%;ym78{`z# ztI-CqoUS?U-OF_`AV7P!yp48_G?&WiCaV<676K{H#4kqx5M&3wTwbz55~Z$i4XN2Y zFr<*l;l(8z5KSJiXCi-r?7E%ka=PM}sp(n%fk?3w+x>o@xljcNOMtjNuTJRtw7Z&$ z-t6rJec<7L)*c z*h2)Ik>8krxrji81lh^+k{*L38G2L_GjpOKWVmAGnp3fnGJm3PbTZdGcC2sOYJpqeIwT4BPk} z9cq@c6w0uueCm~xJX1ra&CTRY7MJ~N2ro9#JBLY)rr() zQ2SAzvqnLC=oGB0AtV-$(#$@sBi_gM-HIAGH|;jEO$_64nt(UU2E8t-j!%Rw&4~S+%5_zt8fH@Bq%mvnbUDM#@f2>?zw%bbmquBu57_H@AN? zdUG@SP9i7}APf)?bR)k`H8Rc!4>mIH{CTDIUTN}6aI&w^lg@yRqL4y>`49%n`a9q9 zv9qc@uDW`(vI8_Y7_%5&9#eV3-(CjK@$SlY-ohY(gyf8bgky>u} zr@CniFBG}>!Z7s+1JbQX4o~V(Sqr#467p0*71A zf}~|_d{Goy(CmF5Ejw%MW+#g>R}92LXh}Pj+uPhs0vIauL`{(LXl82p7M68Z+}8zi zXof-;^pl;au*4C0jiG}O;pP0a7lV>G{ciQF$U|)kwwhI!aE0?5&)2AIF&AE+1?+%L zs|L6C;;8%LjHgPp>Q@kf(sn|!&};*padV|76=`B6`7yh$N`c1V&zD`cEHq)kixZ+! z&4w`hTm2oc7URv!2SjR^h(gh(NiuYZ`p^Ofn8ISgRYFADFZz@=UZ?9Ri4yepmcAB> zH~GVfKia{W?^_i`gGPy}r{shuAHu`ck-gbmJb_X{f7xUaezj8U7To9-Pnk$2HJ1k> z^R}m%#|R-diDAIj@tqG?nW*Y9pD6gsXp)xQ4@$@bHNY8;n*V!hy0r2brozM)n)Ibi z!$AVJunu*4E-+HOa0WO1*9|pQ-gZB)zYc*(Ayz}$kB=yP=rTVQPP#Ws0zSuZ&1;*+ z0uOQhaGQ1g1h&<{!*OeIIsdic^HXo>g!-pil0zNyTVVdgK^YF(-F0#Qk()drnzEzW zyS6cgijpc$Zqg}!GbnDnxcFY_ubxkOp49k;n}1ET48xFkx|EBy8^tu;7AEhl2N`X@ zES!UXswyX%l^VY3`!44idmQhzH@0Y5r_Qtbz*Q=j>W}Yye4o6SOZ$!aEpX0u!`$+e z<#w6@_|j}~E2ph1_9UjXlPu9c&VR1~f4kbEa)U58Ci9^hDst)bhesS37tz-{u3Uqs z*Fj!(T@CTWhTZYfMQ?42WTeSO2jg32U)>*j^GK;vRO#6k$5UJ#cY&*+E}V?Sb|d2R zzP)7>jaeiV8DznoQZ~Y2)*r0wS_YY@>4oW&^pvKVS`xS(eqZ*$?6=K{!>lx`x?_y} z5uD22@hd%GU#a>i35uv53Ymd&pJ#aL_{&74;~Yb_gdPgNVwQ?|Qmuj5>l(#qUT>*} ztusoe5R9H6m7WedxI`>W zvZSx+xZkc;MqzciB}52Puvie7vC0ThgL(uDgPXk=V16!?p^s-%g42zz4H6t`B*BgS z*PgvXj4RF73oUGwQawqQ7#+eLQKVdneUwq0BUusi?;2WTMc85wZjBoiyzP^83naJp zAWI!@9P*3{b@qe-RDa`E9R6&cp}jKe@=BdO3*2+&nLeWo&wf@c#4;vW0WN0pa6cH= z;g2f207@a&2-&^LGkbT4(xF_&s7cVWX404dsZk~zhgN5t>XIO5e?jH@1N@x*OvX{A z;N?A2=tvIK+Gl*2)3O|;@&1G64+JIi$R#|a$q{?m>D`G;tq|Mvb)Bl|S~qJAe(e`1 z8`**d?xE}Bx6_hVa$0YCy#Ooy>x2eBt0Y% zYBcWpgx10YTg&~|?V3nYy?+Ppi%OylReA=khXZtj>GYz*ROJ`?^(Vwk5;8$Il9BqM zGw)*?@{bLs{B;V6~!is zI<3_htA93lM?c>2&-Ea!opOyjkmiXX1!|#eUeYf%2a-%#X$W8gO3|%=$kJ`8pw6Aq z#Qh3`<2G9VB!zVw%D^wjTV^=FXe045$D6|@A8i=ImHMUD>pxharj2)ktnlrUKlqby z**yg*=6{RdM4bt~jWCE|FByOp->C7G?N>?{DlrtsHWSP`>ceu=DY6A5%&v%nmW;2O zHmLdCaD?i@O>reZ0mB3h?%VQGr)KKm@YcB73`rm2h~?3R?xERczacRvlK;r2NzbPF zkq!JHeIxs6?f$76sQ4814KlJx9qeU~+OwRrH@Q=iIl=qiE(Sa(l^N>e?EK#bXBvAu zO@%;V!zz6@O6Z_4{n)P$6uf@-ZMG-(?yyQ2E!#tU^h%sNpQ^Mo)|=Q*AW#%Q5Ea5J zC61XckKg7wo;$T1N5}I;y2LaLTb`o`A|s0;8SO5McEN(hh}R0j{dyCvlp}E$4pbMp zR_dkCL02Ffx(5V2uXl+ho84$@j)Tlid%MTikq9ekWR$_ggJJ`jJ~`G zJnu$4=*l~#Mn*s(dt%bs6+`O#qFFCnSh&W#gG1ZjmFCmb)&@=TOq9B-Eq)iRQqQX? z{?@(e+wC^-}W zceE&TI+9x0oyBJdJhu{@#O)I27HJ2*zH!};%*BbB@v1BQOTjEadqZJj@k?Nf`5vxPwgnb)%?tv)BT9;e-u- znKS!f_nlVoU7r61F^k`IURwa#jsh}tqaK%9v?Bm?Vnmpi3qRr)ENLZtA)aES@a|o6 zd0c&Y?eeenKWnmG^@1q3Ud#n3IPghri4B1l@*p?QDfGGi9b5fu?z!FIoADz`O_66t zz&77WNe4fh-;82bJn&u~BE;I0dY_zg2>tx|$gL|YhFnoDmN5qJL#P4=v;Tl0WYAGB z4bm5Jdt2tV6Jq-I_VVU=YDwqu0P+}Kx^Rx2-jNO*pS(WbVE4bu zC9tAcVtrrOr{=~l)jw8QFK=~Oo-eYe`2_SQBLp_4bl&~Vkr6`u>1agSi5+4d{iW(1 z4OhXSKzo$*E_NyKtZVFz!H|RnTPM%NXrFd_s~nxyWfk&&EC4`2r1oCS?D2?ajs1Oh z#{MI?bB2X15k>9m61fNWQ2g6kfM;zp5%maxQDf!VMzH_KA`K}dYJ{yA^1Qtc9 z6h&5Du6Yvw=bnW|`)Gp+wjR`tsT!N`S>NoYtgLtGr~JWUc`13XeX=icOf&U(H*KE2 zNWk_Eo)uN=s9sy`rHs_}BLtlkB!XHO#x_=Zj#dJNuGXIgKi@ne^gFv6Ozu3fx@Bry zExaaXe0n8+N22owMppE!2}JB2Co?|@W1JbAbUtQTpjjmUb3=feGny<4q42t0#@~zW zSeX&DJ%Bv;c-*^hSmxMBx9*=O4HgG!^wq=VS^NI|H*9+}Us#0k{3m|)rRfwpJ+m_Lv5S%0@B1iU zS-`Fe5=f?4ossywV%`=bSG#{lUBo)YunnkzPS2)D%%F5RiyqjEH4Adh3X6{ZP)7VI zdFwK%vB5dV+vzqGeKM-D2)@Wu^84MMU*kRY>*%&DiK!(Dm$0Je9hXfN&yqo_l9xaL z)zxgX{jO+FEWV(mCfqjvyMiz8 zr{ZJN>juKEdKStD^+98JDZC+I4C*~Wjr?~bXM&!nnbyNUn=4`26>!EML%^#%8y!sYs zggT#a0oqv z;Ma~af!JCB&F=}Wz|$e?Z^~ycEzHP&4$u{pcGT~F3|7|W!xF_@yk2SOcay4FYcAs{ z4jc=$_@=D(Z4_#(^_*}joh;n+*d9d6G1vl=ibw@khAUV$$YWaVI+Tr zm9^c^!4L9D=~UyH;%b=Tu#e{l&?-txa^8H@Ay0Y>BX%0-^79t2Zk(5wB9hs6jy7q} zv+7l?;Sl^z{x>3MvI2)5v_>9q43ACX>v_bxclX;>wf_<r)yHiV=z(w9{H&3i7xC zKD-Mv!eCpBNMWpR+0y*}%sq`4covEA(_FOsh&0P1r1#-g7ZhBk?gb~f5 zH=o7LFu}sm8Sl3_a8=v~>eqPs(+~dr{CkT<=DEH9H=(nwp2)iq4e4v?iml|AW}4w# z?0BN&cIf!rwPI%EZjHTwdNSz1!vISm*Q36V#(1Zt6l@UQzxM~@%e7pTq9GY1#_4OU zazbW63WwoixJ>Rsc`9B7!Am5p2senj3{pPaX}^ zPS*=ccZ8Td{?&ihf zY*2!pk{ToTMK~8lEBZ=R9Bs(~2E8B?`I9;OXG9+T6`Ml1kBvW%3|bOFNtyAj3-8gv z;{g)RBdGoAqWKF;TwhN20`BfrLc^(_jbo)Nq|WRJn5*k=tp+Xy$4O7L#Ly9`OD`U= zB|-7M87&t=Sb%#C$9r8O($f+xIBUwsKH``taE!Mg;0D80PLwGu_bQ4Pzbht6mOeRE z6c?^&a);UA=)2QY9$R~>3|@9Osi?mD|pTzwhDYZl2eQNXiT!E(e<-)rDWiLEScX_YVM(SW#M z{66LwetOC-!r>47jMcgQmjtQ|QSbFj@sFWcPn^IZvO7(9vid-t1@V7eosCh}``dvP zzuI5gx#nBjxUi2;{~3kBlX{}yVdQ~8Uesc54uAGr)X}m~^>-<1Ly^X}@WX<_rOCld zi`LLUQD^SG@mP7Ib1zkBc5s}jXYH=-Vz96##LV=?Kcfaovul6+^bh3Dm|)LI&~?UP znUcOdVYY7JvI5FEtusbO?Z8a|2wnsYrtBB)Y(lMA6x!$iZf*F7pVEGcgNUS5L(QM< zC2R>Sl*yM*F_p-O00VG-l8lhk`@hpIp-o?-ng88ml_l9gKB|<|6yG_rw?;Z6L_YuU zok0%=tRHgrbG$}AT(cy&`r*P;3X)}ZkHRgOtFJUw%kLF_-8I*e-tmJx5pi3+B;mYn zLO%5PEm$Vt$#T~b9KWk>V6z0=M3=V*lO!2SmIQr&toZ$FcZ+TsNQ&9itrz?pj?co#=g&|XC5#B$p7=ih9{0I2J3RaUom-TdKfqE z_Z7Mxm^DEGZ|@SDXUa{Qb3!F9Gu{G`gCY(tH*fu4aYTigGjjNwoVNyv4}-`kjxmb$ zi!+s{B8p4V(R8S;?y-|aW2`8AtaPMX#vWryCoAkaJK&y!IK6~pm)ulB{E8-aLqEW{ z{O)bVZnno73X`1}`1*D0u?G6xty*yGir$%1pb_Ww*9BCXvexG@5sQbGH$;HB?4umw z)C6(-6w|ncL3S^!HojHVO<{%$evMq@lbb_SKEv+}b`lXdj>B+{xMUJ^{gz|PgFO3L zirb+x{DsKi14&+xGRid1qbC(mAufhp?#LrIF>n#CfjOfJD<&FkA;+TscirbL*P)?5 zpGOpZa~>jGy5P|8kS_^*{1YT4RYlQ>i$u@94s$iut}*cMv;gYWL-2JRgU0OT+WZBsUSrggnMtdC-^92tC6U1z#NV7#I)<;KiJ<61# z#US=6J39}>a_BQVw(gWW-q3@z)}B7fPp~^(ejaSkh zA2w#$ZTQEZVXPmA%VA6P)P1NoG=5Y=#XG&;@~cS8em#c30aqqKl2W)~uqSIn6q#0T zLf>qAdu3EV!|Zl%582B*iUj^xs9M5XSZsqxh2EY#iUfOZVl`zb0R`H^!!i5AfZq11 zqcEh&Gy`8y7|pLJ9!C=cJwh>LQKyPXwhT9H;+G4WZ)HfJsEzPm+{6&_A=Y*E8qwouLQs9eZ>njN8RyM=y>AYF}>=15B{4w^q>HbK+w(A=j$i|C05Squtj$Ng_VOVxub!~eM z!DSb~c4shli}9Qf@CGa&8XFR)(gG3xdbujFrzPtb^Wa@fdAxoidE4A@+5!1X26z-L zsFojD&UCIRiUtLKHWp#X$&6?7F^3B9ermPES_voR;5r#T4gb#wpt!z0Zp?guoo z2kaiUePR_)?ZVEr-V=VOqVU6>KbYOWNaZf$hzz@$>>B?2c-x(#t0G<7m)Mi@tXjaWi6}Q<>!eP5)rwei|x-X&E``)K6d-0mlwfr z!)xcSh$VXG)Aq^#C_ic1Bg)DKeeuf3zJ>n($t{Lju^5y86O#e0#g;_~ot)n%@@D&E zy=9juV?g{^);aMJn}rSx)e6}UeR0i~NuGmdLQg>hpv5^nqLTje2i?mhx`0!V)hsH@ zv|M7$Zju~x$MDUuAtn0AbOm+<6|G7U7AI2t;g@K|Fj&_ z+o0G1Vy4{)+nLqWhm^S$+QK_Ql23Jq*9u*Cb1+>)1=!s;MBhD8#n0faJA7-&X1Wo`fi_x6nxk$p_bly#nt$2S|@$2 zFV@?Sq%rV_BGW$GGv`znmpQvIGvN1K((#P|PRbZ9_W4VQkx9^j83FTwQMP&4L@UoB z`l;>$8?P5E99U@QM%8QhnCqsTlrU?1n66*v27$%fRYcx<+t(ZRyhG$I+DI$>(0%NZ zDV1vj%GGA8h*XW)emmac&_gd-^L+9gf*ODa_P7-bXHc#%lYJu* zQ7uUXdX``4$(6?5x;MO>T&t%Vu2j1LVc%EU=ZM^&!Hzg&Y+i6vB$L9S17|83eG3RB zWe}CcKDZ{|+~=1(c2=MCy+g30)RY7j$H27XSCi8{nkYl*yQjeoX3VkB?!7^ugzRYJ zA~ug(=HyA(1XqNm^P=Xt(iQ8;RlX(JUxxLS3A)~EH4@Z@MTsDF&wKJ9vL8C$F!2+Y zDmduU{dypK%&e$iFC9+DG81m6t)F~Xq})Ah))JgbLb01kPFcO!K9^1Pk*ZbT5GC62Z(w)DEbJE;*pOt=@?#Llollse*|nfb6uY#T|Jw1@4*$k4+deNg_0etwc%OK9 zLL@H-T{Ejgq)Y1#Zqbp^pc&gN$$E14`KrOpU4q#p4pl%7irDL^USFkpyY4EStH#U{ zR{q-!-%dr{e71+GK1<=_qcVS-#XdAGxlINdnT_H{lSMe ze#_8onbAk*QGZlA)W~8>{ZBk0b1>i4_&e)05Ekglb~k@ZI8Qt& zSz*5uNA#5Hu=ycs6WM!0UHZw8n%gbmoA>1`-POKo*NkYYITN`oP}q69lUMJ3+SN5{ z3&j7v-k3k@;J7WyUV5x-K~z|I;E;hbOnJC>wAg@Tg~&zLj&NYC9rc26a1gSizh+O+ z>ukLEQj6!G^*~7=Q1ubg&eHfq(#Vw6?~dh$OYG>bFdG;nQfcg-)95v5Q880_wF#pM zdJDYTqvSs|Jp%!g!zNjl6RWO!o&-vS0k;uO0#Y zV!hXH;bMRmZLQ;>x^WS9EJrZbQubq>Y>=p6i)@!AD=+)k!Na+8h}9Q)B~REQ3A?+L zG?gJ`LyNNR$J=v`gRJmZ7CCm3c#oJ!l79taOU`xS{|vCMQlvhY?1yPmw(GqX*-!dX z(Y)m|H8Klved~8IEQJd)tSzIxRbA1BXjq^3e)=#=PK>NwzIthz-twnh%@5WA_h#Jp zFh1RH=eQWhfKvFp7XzzWSa?XrdIuw3-(}LH|HwVY~ez9u?!kfi+z?-mE18xaK95lbBm6H z0CH)&>@K;q_DzH*RcPc$zvuv!&j>W)!eV>7jzoB_a^CyNkTdVy(auY^ zM`_@&IdAZS48T&#?HWM`NV>6&0~v-lIa^R9$#$B4uaya!&{2Fji@a+YVKJ*;! zPXSlm;OVaALYCy&IGl5`(v|gSWiT;*{F*?*?rE@3y=V?I^HZydH+c zSXzNh3+WZ%z^Fl5;=te;%A>kle2U)itq)2?8H|RcV(#YwICrK$YC0PtjdmQS{Nlps zuF`UZ5pM;nC90N7)p;%|5`E6*iv&}ii%eHmkKHPEkEtw81zVeyE?c5T<5Z$LDNY9LZ^@7Pe@^qI^yqZqPjjF`T z;orYAcIrD+E;5fX%8;Ph*hSOTu7R6cK9Qu&(Q~xe7s2iNoKN# zX;ha2a4zHIIZFtd;fO3j^t%>HT2BQ*-d`l|Q0vR81Icd|JQ!n6;QzO0YuIZ!6q z&)92DCUL;_uwmzMic=$n?J&LUy(yecYYj4W4fO~Fi2Cl`D^@kzt1tN~{Oyj9ALE(L zUntPM}>8CpV#qP49Iy3G;7F_96e?8oImsp;S zbxzNWz!&%CgC-l!;m{;dRrY%NB|DeolU$Ss>PC1 z%&D9RXX+oiwnjp`Q<;8>wRxHv*vxPEDAWT)-U-Kty6fW{tSIx2A6LDbt56GFCJ8sy zOE8|V{7FIA04PNT&!@CjlA{vU3)Eo@I9|}m!eiyAZR`7cmmx&1iS`l`&?k~ zygqfA?QEf(y^Q6}tg-+~{_X9PtS~8V=VRB_r97YkQJ!0a^ewOVnBh_zel5}q3kOCD zD7WMCQJ|EX-iFLZjQ z`B4DGbKg~B=Hj#a_Kd_WUs5@^A1%-Vc*Q7M0*mhr@nraV$v)S6OmM7*$#Qd=6f^A~ zo8ctA)1E)*fh>oJy4;o}-k)0}|d!-J_X(5pTuT;##U;pH~(M}Tiq`}rHL|0C(^d!Y8V(fefeiLekW zdbIOZV_2`MQSa7tfA$4IGY`k?4mki#&V?H;LppDF+I&{@Wbsib9#)L1=@|~$k-6RP z;~3uyH!HK63mb4_`*1giMfy^R*`wtKiuemn+@F9zXPA)7gXwfa9dLklYT8-q*q zR&7{ZBJTr@MQ`|N;{Bb|!q342IbF{Ibbqk%EkQ`I5513PQf=3WfPjV_U`hq z6Ev5HthemX8_$*k5HCw$4E6Z`W9l5E z>x|ZD9h;5K290gAY1}xCZQDu1#*K}}w#~-2v18l!>pka;d;fG~kC8Ol-(Gmom8257)w+mU~Ak(X}3$=C4z9#M<{-t}T;yY_)GvGyNeF zD^Gcxeoidx+HheG4`wn@4xHo_g>L?i-;qGexMHH!1$xR~wkOROQHB;t3SINZCNdvz zZ(sJZH%zQ{YhJXyj~Eh!F{e+QUWBsJrKTaIuwc0*w=&16Z&x^A*0F(FCdZAN%yjBv zy0Qzm^MyNA@})&IG(#=oe)-jJM}pF`eR#+k^hul=Q;DXnzyDR@-=d`Henars_m_p& z^FMZxp4I;+)aV#R(BPHM_xqQ^h7lo$}!<(0DJm0%6L4sF(VuUFmZILNo4? zYsE=k;^+yA>31}u$h!HaA8YmVTt^LGoYS%D6=AB^9eJY|kAfe;G0)JpS4*8yB<6^d zu*G5Dc*Nb#rLNDVJhNcpJm*^0lSE8xq5%G@yoUy1ip6;u>6y2}F<|%<5cnaJBt0aN z=(4ipPsWjIHvMAMPWLvV%b&pz9)yI^Bmmrn(o}hfJO@k1b>}GpqS0hGu^k}Xg!*pF>L|GPZAWoMun#V^f=KCo9^;e)=@T3XxCmR`5 zjK9G!wdc79P<^U*_Fmg{va&X&@83H`X|L8+Ge}OzO`MY@)bOw?6fFo~8g%&mAPUKf z2KCmDoW(hrbnV_PR=O;=KGb1!900)9wbW5k)>JXEAayu#s%yj7P4;l6A0qJmm+mH_ ze`#N*>51uEUoOi5Db;Zc6HhZ`F&~Q+72MP%XGz93W7i1ns+ZHy;mg|k9qrP+T`B}D zOfH+6)ggqf>nS~f>)!sPalb!E5FuvGf*beA*RFbX^Cfn@?eWl_>L)3JZI(Hsc>Z4h zA~D`anjI7u!;8EtJOD;#0rA1cGguw_Pd)}3;s*D9y{MH zxR81-@#xoDM2@Z)WE3jDZ}uGJHwmQ?oIqLSLHQMiiZW^eNCcS)62bm zq-yB>lGwm;?RKuT>OFQWwOP>Ui(0iOg(5D3wx$TJyWF?XkzSlj=}8|tM9h5itp1g$ zD_F{3x6Toa%Pc2DRzRokrP)P<4rDlF)?=@l&ifJ#Ms%#(^%eSP~mo(yQmXAp%} z0TzC+lz9*ChL|*C(sF*QZ_N8QVU7=SAc~B{m-kzk=gzcFH|0?%^0ogh-nE(E&>_j- zmwo)Kvl4|Ms43A+rc3LYV(a4-8TudPc(SN$#5nk0zx@q?4mbLD$19(^iO`0beVUX- zn44NY&w}s0UWs~B<}NX6_+K{ZYnly(%P;IrYE$3qm^$9G-Dqq6Quwj85{+mI36NV0%!;O8eah2v0hs@1cK^2ZD{`ZQ2CBtz;u7|l5iaT z%1M$y=o0a-^w8XDwBT8b`l17cOrv(gFPhp7@^W3HL&Au3GI=2(JlR`bkG$HmSphwkW6K0`u%@_iokckS4X&IbM=4?`s(Z~*Ma z8#}*rzRj0eqbeb%{gdJVnxg^Qv_zD6@)q3+D=scPBw6d#!GrITgO}AnWyyVK_`8z_ zx1@`PcX)Xhv?R>kGdJKAy3nO&jV2Gh_EHIBLMegIlcg<*+)13d?k9 zD)F|B+*M}jalTzjw1+xhFE{IpZ$JgqAjVu7vsZ#e005EC9YK=N`Rl6^0(=kCbY8TA z8@UY)BMWcYgv*0u(R^N}c7h5MgD8KTMri^1^a1avK~C^_qU(=c{pE;nmM&u5<3QIh z_3NohH5TnvDAt=t6(%i3flHL@5^&S1cfl+jV_U#&2!<8PPxFK0*4=rd$jUYlg4*#_ z^X&}LWU79i_QE9!&6{Gx5nl3Y8i@#5r1+f`)8?bSY8kI7+x$@6s%g0U+*WBIzjUWe zG{TOoR@L>bYVotzy$kCvc+PX%nycwHaWkgf*}%3t!5H=FRPN-#MqTOzoxJ-!{0hr( zwfqPRe1L#Ia_SPPQ|@&i>{CZBxO~nyP*fNvrxh}?7cGuHP%WFuwL7(aHpeYWtCCl) z({(^pS=ab&akgs(-?dJW6vuG^XnNDj zAo18VQ>JsGn=nU;1AwhC4rTzF3z!f9Y+O4^3ov^#m9FldyP-_R0D6H^ba~y}|KpT= zO(?g%yR=7SySv5>Y(9#S&*EH;;O`*zi(X5!2HetTiNpX?;FZrW?2`=fuzJTwle;ky z53V0x)MG)Sjb=(FjA@fZl}=H;V~}nYA`=_RQsr|8V<3m{uRjV{d=6oAbqoXmIVN+c z0f{(G2N;>svJ%DE$G5Fi4Wf{K8WMx$9z?a(rr5c;ho~g1K`l%9ol&CvMvLL%%KX`iL*8gz&XAFgpeo@KLL>V)iXZ; zqW@jS9Z0k>)y@33<5gL)I&eyKI6snaR!0&46|*Umr^EnqcV%~t-Xa;`y8)5$rb|+1 z^eH>K*1-%iU*}-r;XT2&C|qe-SV4YwIqLi2KX_Kg_?rHRO?}-@%W$Owlw+3*t$OYD z3n1KSDy=cn;l67v_mIpNW8-T;j$YA^1vB$vZ-*nQaFGz7Tv@Dg@+sJ%XL@1@l-9h} z_ulRkN|uE#JG3kPGm>>FYF5>!f216n5(&hSxotC$|HgqgDZF}Se>HGfj6F3otB6pD zlh0)2U)#8O?oj8Cl^>G?b|>Mh(S9>>CWekXdxC6o^a-e?<~j)*tNANRKFcw$_CHA* z!ncnpzMl_rK1;+MebY4788Gje+h_VDGoAwlG1kF(pCu?G(y+uRA^o%oB>9$#K`#<9Y z4(`F^nRHCg@4l95GaPHvskjcs8x5aLmD|jouxD8j&lvGQv51<|hFhelAR+@;Ay-8( zrfj~#CNA2>T_H&{I1rYi%}Wl-S`>_(mi=}nz|Na4oG&*(y+?}Dt@^1x4Mab2YvkLf zlz{lpHTHk;dr28F4al4)znh^tS=@vs@}rkz9iF&>nlT z8ckME)8T8L?xPiZ)AiB?v@YafkjW^FP~1J7ZEVU{d~;-+0JP#FV*BkMQCFV*v0R(q z`n^1Y%tUrPvxi2mFXm*_zSSJnac_c6sG&z|%a}2KjUhY9O8>|u^dECsond8Nw?SQQBKr#+(sLnZs?QR=yI3q* z9SWb%68WVg-2QaDSNFb=yfH-0ti;){M{&N{hORBwITHxPJ2_lGGy>a(VH17PX2`Bw zjCr}P-u?#Afgo8HVWWvO#wb}f0?N#;29h955*;J2JL0ERAu7&0d@T*KwuC?HhZvbH z!~MZc;R<@93oh7|j8jW2aD_$E6MAF`X~0d;GbfGJFtA*3Kb6_cw^L5ue*9ge73`3! zsIK+9j2sgQ>I|2HCw0FE;jPxLw*Z{%^ z?mOpFIGT7lEYSoMAI1UOEfO3E1aF%BHQNVroVw2AV5r}eF+QcEe<3KF=MGvtMjSX8 zU6@slv~sr8HC#@|_~nYDT;UMZG>4&G{Rr4p`Tv$Heh&VZw;xbc>__B1-+fd7Iz! zjCeu+wyhGV8^TWd3wr@1ic5!y^N17qcz{Z4_^FXF1u|`)6Bx^Y1-N-Qdy)p6o$pe2 zzR`9zuZ<)afd0yiCz%ceN8Rw#%I!}AmVD_G56`p(mf*d=4^ZCZ(8MXL!u0Qs*vpWH zW)9@?qzrd@?J~jwKls1iJ}cfaubX169`B-l)_Cmw5U*<%J&BdGZ8R~^gycPgi7?L{ zsD+~tb-Zz^*jYy^4vzdAd9lw|xLx}jf;)*dkpUY-1v`KiBEnTK*v%7iO=xy-Nkp^wi{(; zBcM%CeiChje&)-;!`qJj6ii{j`b933)GoCot4OO{-vBpapnv&jiVo~630M=%`SZt1VM^fCwY=4z?!e|_ z7}WdATz$o3I3-1+OGhS8MFZ3kM^5!yy(~LU;UXuIu@kR&lZC#k91f7%R-ENwnv4T8 z6(xbzO3*VitFC#ObJ1x;Lf$T>3`_>@0I`AFwu&%f zF=J=5&dIr_=mJ2v4p5`ux5m3E_DAi^8jViUcS_O-MB%GQDmG0PhT@KqwerNH#HB<5 zLnwSt)SPS|?EThbMzYL}2J|p1gL>5{MtF|ql-c#>4?-X0_Ybg8-1H7xJ|PWbsn0py z$)EQZE!r>vT|+@YL@>q>GF7ehvLge~q0+7YYE!1x!<Gj~luQ9}g)?2_7C+h~?4rxOZ{8^Hw&NmO5;!On^#9F(_i!L#-Gi3?_wyry=V(?`N zSJaofMb>b+pUa-@eSmIDjKaU$nH58h0-LRR#TN8~5-8n9wVEjWol28OlXpt~mhD5_ z5WAD`F_uCI3U7OOc9*@S{)&2{=w3Ymsvsd2MiZi|QP<$W8vjta^ibsM-Xlkl9Bfzy19)`9CHB zw)*M_UG!^a01vSJ8)IXzH)@N|kUc{!`#SzUOfZ_lC!s3rrsFZO-SnkKFOJ-jc%%t!z%!=d=?l2iyp6;?EM-~nY!0|@~= znd3q2wx;`Oy!)!$U3ziEYXd0qibPx&VR)c44a--T8oM2F9)|}-w9BUiJ?=Da%*i;xhXK7q4!sZ{Nk5$90SwQ-Yp)A zW}dRL{wP=)_Dc6QpgGEUm0Y;lMF8sob#|J;x$6(7#j@ps1Vb^9CLY$Jo# zJh^LAbm=jy@20O~(EQ1T@`?^kA|_Lu_3*$FzRmA7$C&|Eg$xCNdH>PwR5rsCTcmk3 zMc?#8{N}P*D9;d?KCIFrLnCdSGd;$RP{aR(y^R0ql1Ycs`2S|yK!?fNKlzHn z>;9l6790=WG?D4Kr~`%7F>&yKw#e^h5`Vh9%d${&gxG$620Ud)&1du$^)5+oQ@c3#gQIcu_QSnkb^z?f zao{IJb+Yq4Q}N+;c)9>nTrM`yzQ6i4Hc1OR+1Zq{Qo@J0XQ@b)fTVAPA#(&9jruZm ztlf4H^^b|eyLFHLyVyAh6uge-bb2OFO@69>DRby(Kg69V35-vsqgU-FcXIBEKl;tK*$+?- zGK#p~Lx43@u;yV)iB&GB!b`~D1_J%3rOxT2>_6wK~wp_@B-K78_xxdeR#n2Q!Lo zYN@zb|Hxhx|GHIoduo+C9=fZql<8dg-Xvmj&sX`-wr-VzfimMLC(==xQ+>4^M}Xx? zP^I&N!#e4ecGkiX3R1QTC_?BX>$>nH)!H%&Cz5O62p&PdJ0N;El?|0h^? zYA{oOH|`f!TojhHM)2;)`K{sJc2zfssAss{wUW*nmbx|;u_W56L?$10`Ru;2N`17! zsOK3XU*HaD^4S1+(%=}d)U=~*(|v1Ke%Oo4_Yh}DR>b}!R~=r-Nhpo=xUR0TPsqc` z61wE&qTpZE4N`UFs69uRv^-%XLawN4XuUbvWZ#5y#JauPLP(dH_)jYPiGe`(+f03W|wo?48JQc`w%L!6#)Sj520^o zKR#$(xsqeoU*VL=z)KQ>e@uv!5TWus4N;}-lP#^Kc!4&34Nbl%L;uZuDZUH07)(9W zhoXxwQ3 zXSafoAi~_RB*USL-~D@sG=_rinvK;%JHD$?QO3+Cak{ZA#iA3!XH9+JNdD{565+fW zlJA#;_+$t$7EmgafAXDnZ>&QFvUNi8JK^Vk_qASM5wjl&dP}5qtbyRCh>muoVu~im zp)+TKqb0?mBW2zvW6I%)leo3kup)_*=qMy@()+3WT{`PWd04j!f#!y&)t36ZWk-lt z)dvyh#(R~t4ONab0u2WAMG7KzGG0PB#Q5} zMRRt1Y1^vaE_!(Cbn}k>yb; zu*v_4p&_e7IM91zCai>st46>V-oWl{WUC>dJLY|)I_CG()weA4MgnW7Mt}?*vRV6>e{gs(`#=?Zz0%vBn0&|IpF`nhi+L(LsJ=Xf z9uw#Q+e{(I7dkLVAK-0njluzed^_fwqkmwp5;1}I2&aaV(TT38 za!`g4V$c&#j~gA}m$xo>F5R|%tU7+~SVO*?VM`+?4yyME+Qx0BKw&leQY!=6GtHL( zWyb~I58}o z_)*xRhLi^?jG%i%!|G2bXFQZ`MFP8P2C%6?F?6aWK}|~{byR1X^t8rfEBQAx=L~UH z)8+8tcSxyCJaNG%bGznqpJ^ICMJ)S7W_3i|F!`bysdqvEp9NK#Xvf0FUREbR%EV6h z(ZM@J`+&zOZf&de_IKvCwJmxScPirEx6OBfkyIpQZOuojHKLpCql3<}3fSoBtX6Y* zFtce;p*1~fl3Dj95{)99yjRaP67ZMN#+%A9Ph-}$c>vSRroz42^hUu`v5MAMr>JUE zluZ{{CxjlmKO@(PiHli?RxbQ)acqd*sz)7Af%kg&1m(y;EYR@FTZOvx?Y~1XIG`{U_ zh@QT??75!j;_8XjO@j>~=I~tIRPLBnhJ2xD@_G0!5jxEtbVSEQ#_olOqK8Qp5~?CC zT9K$&WtG*U{FMsV%&i~3MGMvhqKB1@FiH)Bc~wGV%~StkJD6j8w7&c}(KW^4JcV+UVy|WY#?@XOqEa{R5GM2`4yWAK`z*ck_ zboiVQ_u0V2nNQ&BdP`l@-b!c~!#eC_s_;!CF_g3K332JuUM_KhW5rJyLGUaC#VW)< z-V`W{DIkU)u=q`SY1%(xLSPL1)?*In`ah(@$z>zvV2Tm_o+=83z#&F4BW~XTL%I?1{ph2h{HiiYY&RYkt z0)@^%tgbKYYSRYyr~Q#%ro}E;cR#?x3*2HSPf46W+*-U4tt4rx7kr;ymZxIg1_L)@ zl)o-;!j-Z1I3@-Lpy;{13e%kR~@vJo&}gCJ3RDY)ST~$%O06iru;D?Rym#@I+qganCa`!1WfjkKb~Fem+@O}O%Q?9pgzv46hV1>c|xIeL8=$)JC_ z&6J;{ke9I`aXFU{<}aBKpJX;&{+*_uYfAA1^2G2?+#d8Td9`Mb0_AjVIg~GNAa>kl zBfxX`NwS78X6jWUuzDdJXFd>0H7RF7=29WXZOr1i8N@({a77va?IN$f3n65G3r`3# zq^aKF4K{stFZHBOv~t*-Q`=s`)S#xVXSHLCfpHEY^nqnG9X+cJ$&DRsdN5yCRY}&C ztfK)gdY4QcuU<=zCJ{p8JC>yw7$R1p=L74bMNeBbc-|%g3mg1L|`~)9Q$Zp ztjwo!TQ=GHuiC$9&X}=Fg6y%L+|jW^mz1J^R6dlWj-!AdjnivheCA@cmmrL#bBPqd zoaQf~JzEAdhco}RU--WMKNeusyBZsdcOk048NKCD>5m5k`|7mFw72NX11==rmKo1v`YYarn(KiO38u?AsnG3qPb%$|l9J!IyV} zA$a@8p{>XEbZ5-*Nt~R4swqx}G?!K-!ds6LTrhD6-_v!)-re(^UFD(wI1dfm^h3RRxiEM- z%iam{d$;OWZ&ds{ANvbSsfw0{nzOssTdxWw|4S+^r(I|C-nyIg(|WNP*pU396~fiM z5i}iPoF~zAAMFG4O{nuJt1iiv7`+J#142{pVJ>?lFt#W0lV(3g)r-OUB2x1 z(>cD*FsICX17Z%Fu3cEzMIZwwLh&M96gon?iKwa#{~xMbNJ#gr{1cA?6YfXU6whr0 zEH;D`Z`Ct{4vRi($DCqH$Jx&yCa~%}tja@+Jwu5Zs-rW)oieUyey;STp7-?_IN}x( zQIFSNZhnjdmYcmMgFK7K3}2+^L(x_F85?q-51%NE^?Wc<{iXrMx?$imd0X;DaWVf44d0jWM!pxs1afV7Oh6)WfF?yDO;gOhC076RV>)Fk{sv+@U4n zY6Jb?`(B2T3}1htl${-=akTViEJbiUyczz@FL1f6%JBJbGJ2LD#55b(Wgr~JIBA`C zR8C8UEt|$KMC_L%oc}gD zzY`XtA5{Cg+aAZbJURvr`BsH#hSwDj|NC*%R=WG)q1PP%KW2)4RuAIa`FV)sZwk$R z{K?g}EBwXo9n4Md!)xtzS!nAy<^#Q~>x1n2g<#7Ay-r>4v)_jB$0l@!d63%{QMhIT)}b4EgZ1Y}mD!{A>^o(&fwr7UY;brLB#YBiV8U!v{p#O|XeCSYrGJxUovp>Q23d0ADJ28wc|ZhlSv>X=J-O)T7rA* z81=e8%hG?|5fz2%7gezNN?qQ5GuiwBLbd;>AklvdTCDasK|bAhB5Jhj;<3lT00UKa z26o@}0W+O@9lV-)ts6_6jvUqJNaOw~v{0)cnR_3PFX-O`KmMC+a2HM5am#5)(h;zB z{t2^0Aaqqn(4PL+0=&{z9-IGGi4@EIVYUINka;~(~Lc&`#%{C zsAoZ`RCAd2dFYK}2$LCI6=3z*#py!m0fmHbdrl}7u;QcQHXYBRQD~5Un-|mrpen5w zv_u73lx-Z;#$-acdLfdveJM-Qd6CZXlLveeP{iAw}6_bpEASpveW0 zzs(f#fm>xDE1E(X>2hFiyzb=#1^%5I1UsjQBBxb_t(pUDB{&TyNH07B;j5w0hcRZ z^vTjTph}^NIOeMViudfW0_TM8Y!G}f9VgzK<|-$XCe}7TJa2BleOz~uIa~+~Cqm>U zcZE;&VhpX+tE)n{jdG#2y?FtZ*z~_0ntNXR?V7RL; zFhpp+;~flnzU=1Du9d}9M&nbl-(21|srBPWTOI8t*BYl2xw!~DS^oD=fxrYbMJey@ z#d7UlXh5&MddbewEi-tKCp=k9uDR0xGt z-!S`(X@qACpiJ&PK}ME>E36l7wy~@a3bK;7xp+Hp)uxcz$f?8#9GWlKhGSFX$_tk* zQ%;Kbuqnhv<0RKCTX$nM8kw@dNuw<5Nim z{dvb#c67tjnl(*vlH*cKodPII4e`$=#tB~FvRlm0tKp`1voW6|=rC6{jR3NmM3;Fh z8Q2-kA%_zUQ=j$|ql`S^nTS92S9h?7poWJgz6qD$Q-NYjgt?kozNQBE`5=4Ho46AM zDC@1s9*P<*qXVf$+23y)4=xMc-IUS77z;uFG+%nnmuOrD<+P{ngLz+l19~cac;WIW zix{e&?^L|3z+iIS0JfZ%>GU0p9Pu}rH92=&umCHpT77;(6h%{2V(R*M9~WrwabJj! z6MtEQM3MJs`!Q@qtt_0c%7>)wmzA{L+0NO=%}4ifdY1$laj43KNGayDB`2Jk`<^q} zH@gb58thP&Bt-@+(lArzz=mClwEX8L-S6G-^fDy~t`{g9-LnI!XSiOkRyjOc=?^HF zsXxGS#^oYZ28Z`Ff&GDSJS0L=Y+%V~vwy5^GuZs0`}nHo^wMzW$Zq%b*QS{M4q>2C z(KbnHPcPyJF(T6|ADkMUu!V*z(SAkM5TH$s-EQ=`VG@5JXAE1C@spzoz+Qm6z5?xUSibhhHWG;^qTUrZOI7D8#XUSNE?SqL&h36g=8NO#G>C~KnZhY zq9XPMKhS$6hDwJG8~{%rkJ{>;6|nlqr<@-N{bc(dYtqg%VLkMO(-nHyVn(_mkb{Sv z*#G4d-$R_7b#6+ySV`leOJ(YiexuivHDL_<6oX{7Xm!h$wmZykg$~id-5~w#|E;aF zb79Dt6}cv|-JuIDRTx&E1Ws+xyBgg4HPYLC?-E>yUj zZhDlN@gEN_Or6TY!u)Qs2a10{HXd z-$%rIwBras{h}(4oh4p2-}^|RPP*h{4|4{!zKl9=)qjbAO*~*MUq{psJ>0u1kg_Aw zxT2Kp%^!X{;u5L%jPJb*9*FG*Wj%bhFVcYf$1O=(pg;z^z!+lR8sTW)$~>U=v7m~~ z+ZFsN3d`6nSt0UIJ+Du3k`qmVtGu&rQ(zHe50_xH8V1oJsPA$@DtBVFctd{8f$Pg! zm|i6|rL+m&)&2wTGnePKhj3+%+E}->6FE1R#B)JL1z@8$P+Y`qLq%qGMS7|pSsh>( z!Ik{6Vf==Lmyt8>)gDX`#-eT<9GNM?Dakw#x}@CYYDFVg4Ke#$N($rTepy9(_{=&# zWkv84neQjfH3M0lcQ*GSY~fVgW-*K) zvRqBMSMY3|Y6~r@V7$o<1F2!?YqT;+u0DG6pt!zN*DsTi)?|seGx{&RQ6kh}%~?UB zRl$A|r{l*!?Gbuork?=&VZbK>m0lrV8|@f;h7bPJ5RJzTC3+Z%dn54l{5W^NO%kN< z8cMbj9B{wDU(FS0Bh;ORsMcA;RDWb_CwO*Dc=pl09h5$-1;O5_MN?tKo|f4y zBBe(KhVFB>yb{iB1YXia6F6+*hIpv5)xg)z#`9whK3e1)Xv3RlE&1weW2ED4p4| zpe!4WxeD!q*qnoYq?#0~Zt9Rpv?O+9LEbP7QvNHFR2rHvNB3J9*p(i_=Wc$H7sN{$ zzER^^GAf`IWx3JWpe31D5IDks z=l5mmye|HA9nQRLRd%I6OkzGp;m7kV#i~YW5_(%z2O)n+sJQ11=fdU-jtb%@gm6bG zB4SD#*NEb8UnYFc=-|e6MH`fRM^=T-f2EvDrnmOGVtzO2x9!+)fy3~j{yAs;=KkZ0vRLytbF_NpsDd7#a5_>)(reGOiobMp5}k)Egv~+dW4b@Ppz5!X*>sp8yw(X^bvrkA$)T4L%mCxLnI>UaH8G_*dt0< z=(ukaP-~k#ug-ta@|kF8?nk+;-{=~wN4FB9QE*!ct6s=zaZ!dVSVY;?l`@oEGjlP@f`dR0_fCOK|& z$g*K5A3OX(@qKQv(Jc~g4}#j%AfmskMiiuX>wrZF-znJm3}wYAk!vhJpW9AY#sVi( zo6=;kad`RAZ7kt{a|?NhC9IlO@_>aTizWUp;j6%22ClY0;{Z-lSk`C`k1A744bb#?(34|>XLGSTK~eh9!2^}-znP%Ow!h^nJcPP ziIUJW-EHfSzCqY7@zb|#Zy1heXYo2JMa%-5=a5qw!IRQjaQ|-qH)`)DDC#Zj{uofdjS`W zmC$?yp7rZFY%JZ-1H!bbthJ%tmE2s}OwIJry2Y-flKx20o+NhNB!B4eSRYN1o5P3t z=Fqd(DABMcQA~SRdOb2r9+=WaBQX^B5RZ#(%Gu4&K1(AGR?}D=I zkRO1Rad*gVk!=bD6yY!{CJ@5*_e!z?S7$*l<-pu)E5<@FZ%i}a-rGnI{_&{+!<_?< z<7tjA#b>*X`|b3z2Fhj2x{qZ)-^sjDu)J)2P0TadNYq(5hjbfC#&G;eWmgw+NCArn zOGG&J2jO&RcF6MfKnWcp;8fU83g&KerX!bkbp`$XmEUhV$mq8_{9^JCZ1^#v6-6<$^_cHXC7hi>sx&R{0?%=eUzF{qJpo8kmQBx z%K)Ja_2Xr@frq^*@Nk(@#egMiNplUhj|Hk`RUmZl;a7hWJ!9OGuB$>_jdeL#2wToB z331QcW(9hEx#0b7+0nmMa&a)K!&8-@O_IF^J=}V1(jG}f5)yV&6q42RZIIJ^0m_Wq ze;MZ;;-6Sze0u`A$UE)feAcbvJJ7~E{Xu7>m=Y*JomN1!%#{3*DjmvK6OEmPx!>C}WcSOPY* z*_SW|8-urJpFJb^(+$l&*pEllVe1P6GY2fd*Fej-CQ3jo-&~SpQ4Jh82HXbm>vs<0 zMm773#m!Ka5#m?~<)HX!N%_g*=a!xI|}4o0s^UFc_X7GuE|dnv-|W`WCWPfU91 z?$b+y`*0lej@M7^`4nh2oKQs_Z%Q+&(3RaZe@a72Ij5=MP^jgF9&l3pbj5gMvXC3H zO-@oF2^K)!*BJub8={D9Zo5!cc6kjAR*Y)?d^><@kC-v1@g$Zv29OW5lv`5n-PvBJ zv4%b;Z$KL#O)w5aKg>wMZy{=|lE9_VuEQ6*NPQj$k04`1=&*D9$t$(G zaL9zW?O*ZW8#s3^ zgNmF#Zz;+X*bm(1%Q_7NypUa#KEIN2x`?CxCj4}yQq1RYo57_EB3#BAkQmul znMg_S3@SI_0Zir^NukT2zyTsCyNA9Vo@Mou>}2yns4K8vMMe*4QP|eHbbFRW5o`W* zdtg(d-)-_T#wj|ziS8_~E(2e}^ST`%%+q>G%Boyne=GkDLbtIG$p9qf-fltk$qdX~ zRyZfRbCycn*JZ~R`Kb}!LMBJvDVzcNM3YO{C1Il7a-(d`tl(u@@-}VK4f((0^n=6^ zq$EteJ7_)H+(6|=?gW0ycrI3txWz!&Q>-O`4V0mQUh6F#n*lzYN%>v4SVW?F?B=G_ zusyv&tV#kJyOtuNwq97vMjjH4^%`Ds4IR5~5VVQ>gt-UcCc;O1H zK6&fQu}2)~(750g7!zmAM{U(7XOuO4Wk~M_d3ALk7E}S5efKZ5sSLOVt?t{zWV96c z->*j2gPthWBjMDv#r( zsfDPM`>DTg;A+YAMqUI-Q#eB8u4}~iAg0}vCRd+!I6P_3&bmqql;+ds#c&gX2zB4Z zE!kEBZfrPI)}HoblqUMOkfZwij@f&t+?vvVR2Y41aM))E>q^d0!5l?thcW3l*ZG9a<$MUk&w7D;&_t39N)qPfGy*%M&CJoV=?xl`Pz>!U)~%O!_}3@x(E zc?v{5?BKbOkubTE=HIcDIb_#| z*Dyu8RKHXdW6A<5nIx=JsFMDid2MJ$R1(tV(D1k=$r) ze#}DRg#Y|YwElG)E7^xSrLLT zT!H=Vbl94q7eoR{eMtlmG5G@)LE)}>x)c7pg1fr~C-`Cs?ry<@yTeW1dslZ= zu(iePZtXDt-_xITw@~9nT{|N&m$Q#;y;rrCx0bNj=iI+SQ3$3?|6o5giPyVi9n4=% zAOue{lA4s;(NeziSWm@B8Zw;3IxZi32@(D)5AZiZeDd*22H8d!*A`Nz2_KwsDSWhI z2U-EGOe{k4DYYW?^&mFf4-c;I5>d3V(uOLx{fI zN@a#PkUvO4h8nE}DE9C)1~IO62NdS!#eUZMk*1p@Cuj}Vn!k=CdbmHKgfSye z?EyM%0o~ihpvC_n^wq-u2cgB0T*tHv5?B4rr#LWot=}}%=6hiKt`x{v-l)t|!c2zE zKBf0uEXTcCd!s1tnOxKf$Z0~H5Xbr6rP3fa49MGOKW0_QEDXKbEw!ot}!IRR)WYNmE-d7k;o78@orb8?z%i?1Vo>>45tcswxNE3(qa8RVW z0H&HbmLeVwwV_Ao1KJID-NL)ldfP!qB42I&>v~o+^L5CYhA}aD<<4E)8bTyR;hc9J zzHTH1W#_Xzi0QuUS_$!6XtBesm45H=;ZXdBZr>h4t?}D9<1xb^(#LtsI*OLezIB9d z(SvK8rmspr|F0LI?j4Y!DY=*8VraS}&nR@Ej#~>}YOT>)P+l&im1fy^J%b&(B-l@- z&le+vS3z(&TDk3EbXRmBUIbC z=XR|BTutm)E?WOft_ex0QAEiE*ffn=jM$0V{3JggoKXRnU;Uq!zqGekzD?d4lG7k{ZIkgAn5-eKRqJvtEl#_ylM|{5OCy2KY-m z5qDQf2pv~Q3e5rmW$69s+uZpR%3Gc$t&iS$^~< z3yjD6I_J;&yx5o>Zp`wRL+UDoxUcy8gi536-Dp{wQBRdpIDsc8wk@Rgi_7hm*; zMrW7}_kLC4dzn9L+y$zkL^9;7(OK%H>Ski5kBM9R-V>&5+|$gCd`L6L@|e#RTfb<4 z)kMwXKb?k0_3DbeK-o^~x@5=Ib8j-1(^3{MzTJ~NKq2Qdi!GK@IX@=mq8a)1rqJkY%x;N*y`IK((X$r8l5D$MVFY>WB zxFd;aL0Hab?`wDkN^8ZWk9NT`FD4EdynmY;S`{$nIdY4)+uO5`jtX`pN)QNiWmFN> zv?#~!dB)+OQg9H-4~r^Hj21f{cs}m(dEELE9d3#Ek7Kape%F%2k*QvF>R7TCQT^L_ zjR@7T_C*n*qR9mi_6?cC{rmpoy0c7le8DgjrUxz-v|Jmq<^0(m6|LYnN%~nLUgST@bJ}Ty= zG-p;Cbp`2^k|02Fl`vCwKiY0Qe~*CoIfqPeIO58wK6$3^jbiXALHSqA=Q|IuD_edj zI(^=oB<%oIlxT%1(+hvxojkZINd1()N$7|8&m>sB|N1_lZ3wVb@5HsV_aLfGGJyU% zN$4Kpn?+7fD?v)^9Qg~$FVQD|qtG~rD-$x^D#Ov z09bojPJx9#`6GaiIb~fd^!r4ip2}nyCvZe~I3xC9`aJ18Qfi1J{HpF_r2$;EEHQCa zOSP{~GOvEk5%Vp8$%xH&cT91|BiOjEXx?DV<$LzRY7Mu?NGTdR!v^#>`Z_n(g#}1p z&SHCxBgmY8#~D>bdp7x3TM51!Lna0$SyRs{b=71KxFh(^x2D^SVx?Ucgy7zuQe*IA ziQF1QAGqeN$?{r=9TtEtwT7tnjl_RM6jOe`@#S3hk0on|v45xL@Vj$5uJIA;Ala26$vo3zTdc-Hoybe9H1hKR z{Tkp@tV|}o-(?d|@6pyhmsG&qX^MTH^)#(7Qbz)E5s;E;3P0YHRHTC2gMkGC0wtH) zM0jEC7`~145b+VMG4Wk>Vcbo<-RkhDb?w%m--~|zZRT5a=bc|f@q#|&FZj*>-}5zI zt1?nWROf!y5i91^&+IjaP;IqiF~6E%arL`HiZ{CAR&Q+@wSolq>|=93IEm|iil?U) zQYGXc{uW4`bBWrY1IAn$v|&B&v5j5wZUD|L zH*a{y@|7=}3(7^XD<$YQQS7doqA=g!(CgAJoV&!y%cXqw& z#E;YFBZ1u`;dRa~`S@wa5xv?J29Tsdbn=!kKoptUGg&1#UmKG^`Hx+{&a)%U=aK<{ z;SO6?sX|J#0bw1HriBrYNXG5ADxD>HbuH07&q{H*2P}v`RyEY}77Q&iu_1?Z^s}LbkDPnjNrKBV>&Wa3bp}QA z!V5W^xYF?8Wgcxc|6IFF$Fo!YyJswto_ab@Y%o0$opyMTS|!qFN<(3W)a$HmSIwqa$Qn09BW zMPg*^Z|~rctCr9+b_JFAZt&zPzDl^hh#qg;(-kSFJin@1e&|nG53$Ts1|$Y21wVwD zxL3OI?tA`VX7Amr3Rit4YQq0GoO|!F{9;3DU++X^um2k#bIU>z5B_IG<_WN75|o$_ z1pTCmo`yOm7gxd%L(!Rp~SPK(uftKVEM%Dz$Iz-gJgN^vmBUyuXxw!&`zrSa-SHmm%u@{oL zLVvxP;X>qme2P53{(|{w#SJl0Ns5( zXw4jGaTOC7$sw5c)_KKPVDo-**ZuNjDuC-C4qr$r^1(VqZ#-M}stjlBiddbOl(MBE zOEzhh48%C$tAIn2krVbbD=!^`n?j!G7p?Q80DkNr3u#LPa@0FVu>9G0YCTNB=K~VX zb+O~85=7cr6qe#+Ba#)riEYdsGPYv5l*ZLqJuco8B8P}r;$7?>(Vo^8w01}C3`*u% zz@yrTRKF`)5bV1=d&OyTME@Rf*t0`YDljBX8d@2{_~EI*Ii__gDX)}K9t~7!ETS1O zw;W;iL=i#?>txeU=)@N@I}dL;fI4dm({ z;s)yuJW7fcF8v!whZ|)rQgdpF=b$_%Q_dFqYCUG$DoAjII2vWWFQ6f|_YZ0w9S*r_ z9O>DlrIXQfpXz-{A^&bBvD$3qN14OyxTf^!DjWzas2MWoE=v z-uUfH;YQT12cNK3Z8>e1HA)2Z4>j&>`>)5dUr1yfTx*5?3Sxk|Qck0wIdkY;$xjjT zLtQ%Tfub^irQzk7o(WCX!BJL~s3vnWsC@b}|MN6^iy+M$0bfmswe54=n=Ca}7G*=4 zuQhyIC!Z_s1}~;#N7icK(r1JQ-D3i`L3ZKmyLtq($=FUWq~ndBp?`dtA4>09qI^`W6Y!u8-dns2X-x1&94$nbyF(`f_FDWz=f!(eO zvz~-_0Mt&Pirx-Do85AJ;%QO$pR)-y$7yW(^Bu3vhp{N~`*%j{Wg;@&Qr4# z?!fdPYccJ;m*H9H?-`tS8t3%@!S~!hBp5eS;clGDT`2b^V4COhVq0ctnh9_z4<9oX z#(yFAedD)Yzvs4no!NMg+O$c~JDP0QXSvWJx!T1tI3W=7>t9)kTl%x+OOjUAUl`dZ z=?~#*uzR`Qn@{CCmaw@8sEeK~b^mHRr_W=bw$i!cegS2V4Sd zmrsDrP|#>MTVJ$#K}d<(K5Orn<#l^(ZOP`T2p(algIylELeDYV`wij=-ya`=uJbM}m~DXD0!f#BCbj zh>q?oPZneUP`8}c>(3fCOwsz!ANxv4$;+e*hmv&|DcW4IUfbxyM+Gl>SWobK-)Wma zPVxm|3=K(xS%)Pu9pV^;SnecaI0!!~gGvA6;XbwV4H7Ak9Sn)EeG8VeTOWKxs5SI^ zxvl5Ngj2um zPN{inSjH40hNf5SR`{%e<@ z@x^5^C>EDAIEbSp=Kex>=%%d`Lz~)3toze$g#`Tc{*ExmhK=BmbZSGg=m?+maySoy z|FtVR0FgU}Z#VOx8R6@F`^C|7D}3S}b6 z*>so3@raYGUF00dTjK=Z-S$Az47n#e;EGRHhO0Y**0j3^_o_KDw0%L!)zR%bqQ~pJ zRAK|9nZJL@{e#v&(zza9<}8~OrL2XMn?N;>9;4HKLZnRKIS>~A0k^>aY-&O5*HHiE zp)AW_SQ$X`)?u2BsA9k8tUe$Xz~vl%LCk4~U0BpS$3-a9BFS2c4gDzk`vgLgApw|0 ze2>)2_KeDse@Goy7h(V=o_cf@QJ!fSe5hG1%xX0(pg3VqEG=!F)SIywz9}*2>ztnK z@45F}v>2U*pjBMCCiFI~{ypBeV6Eawfpx_#f=oaw_qw#YuV26anj5MSFvX{*i8VRR zA#T15n^8=zZZi7;F2o%P@R}=rznx}d*%kMs2@9PTbDsxga0n-;ipe8@&SM0=M!mNb zM?x!(u&jqKr=a9Jk~HNFYcJ|KttZ1{Hn=O?plI=WQ)z2atArD7gz)o#dQGSJVx!)R zDZrwMOVFwI9*9y(*_v#Ux0=qz-DqdgJ^CN?5pdh^gwo$^Ap_|0=G59LhmKm3$9O=*EmiDDggpEJ$K z7IgvcA;j2(WIf%fPI7OHkQZj7pBq+zKN9#lfWakjj&!geLJ7-OVJshY_^G^jKKp^&%jr>CJ{8$ zksg8{?O&J3U6{n}Gv zU0U~F_IWddnhP|0W-wRtUlRRzYz|zNrBbH8(uJ#mkuRzPE?P3t zaEfZrmHy{ z|Mc6nHNLXAgn(Y)61h-G5TFN%ulyJ#0%3iLFNek5SRXZ!^v+r`2?h{ zxOcxUW=(Meq?sMP;O=So%W$aj<^pxfv7W6vEBrZ~&gJegcyOTYn)*!skT2?*2ME)3 zqLk7^tElUXA6##r%L9~@A+CR@QVPAxtc;_i=gXs<^@cYZb%qC-g41-V3~^%w5cdyV zGsCUJN^4ESmY+$v@iPZZ2)Z2HCN6+LxTVRM4XB^#GuA)8+urGZ&<^qHU%Ha5_h1|z zh}?w5EzlJ@%@bH#9~?790V-chmPzo|EHa1QwJC?W&B8UUPY#ajKxJ~?Npbg+^f#Y; z;9TDR(2zuPGeJ7)1*G&3?nnT6Wcm|oo+t8tn%6*+)zh=r1Y9RzCmg?86mi-LCsax?bc5*h2kr+Nq-xBhatTlR)8vU) zQ`gLdO=&igZpE_089$)zQyW;a$FJ*#jtK?;Ray4b{y_hLEfr{hLT(i~F{?aX%Zb8a zxt;7~lQ%$rUGbH;vw{d8da9D2)TSmajU-(t%cu{pmX#)fEr2?VB92cO#3BkL;>zS2 z?yw~ti=9|uOH6%#r=&PMyGuEK0Au=^7YcY>SBM=7)Bq08_v}Fa1+}P_%_^N=qtlqy z>;pi4W8W?`eTKjcb6#L%&A)DD|{B*@gmJ{GFt7n-|*AexiG`-f`r zB2GI>oE3i^daH?v8deRNvp&oW*b%=^q*tcOF7v~*-J}HW9y^Kr?IQM=-k+3-1tzzWLliS+nm3t zSu%>44ElsemxYfGS5-&^LH+U`{XIH1G6R9UxZH)?-)%gJEB?&t-5Mi3Jo_nnx1y5V z>!pIRZh%_ti2IU*9P4Iy@$iPuF71CMm_G10Aqp!TXym?zmOK)7aM@sw#D|{}w0s8h zvc9-qR$h`}SphsSK`DHm`>G;$17=Jt!jNU^1?!7g8)8j`lulOfPTKP1ijgC}H0I*V zF0u^sw*^VKf}50al`CUy8vqo@40M#9vQ!%zSn}--vn_?|Jt4ig+M&`qFVG$<)Lta` zX&{TDcdhkpc7(<>tD@pOROR5SlYuVY6=+Gt1e>%gDk#%Vxc>h61LFJqS>%ogoXm;Y zu8*Q0NrV2ZVNFfKM=qV4xhlcE*K^MF^zc>!eUA<7fwKA%FZ4k>jJM2~Du_<7sF{Sh z3GmlWggP`2&M?4LgTA9zA{IYy@)H%MM7NbHKmLLX^q>9S+r|wX;Oe^Ki1cb9Jt7&e zoP5T)$BH6@I@d%01C?3YSV2Y$ul(gR=45s#>=ZLlD-w<}&`CT5XQ0j!QH6n7Y=ij?Ior{Y2A=E+_2?;n+_U5N#%zuf(uM{t+lXL@ zO|l0Gc@m$VGpy!g_m$%m)%w6Cgj9wz=!D?&oTP5G`By&&stYx&x=IAu;!T9;pcgss zv<6JUJA2n`?)7>(uVAe5iFNy0N?88F;3HZU#^i5`6IunD*m4`1W@9uZVT@6~IwL;t z)?~r2H>=uE{=gv2qx(FGYGXtbhM6HDpvGR)lvNu36|JggnWba?TH-|;&vT+;1)@z# z;dDe(wl_$rm~FB-FYbo;`c*`d)Q)Ss#*7BuNn%RZlE-U^urx&r8DS=blwxRmLHi2`ctLE3 z1h}k0(Zw-EDb`<%#m5P6&Vte6#u1dp=C|ai68xO+WP_~%iNU=E{Mw2aql~ijB*^(T z#B!Wo>PH~oe;KtQU4+mvzTF&yUD;+jKSS2Xt7+IB%E@Lqd-|7$amBcwYU?w6?}xIjSOAE!ryEmRVRc6ti)2t zfvLIfXQ+~yuGFpEK6<2)ZV&w`M4jdqsk0U<;`=Vg&Gn1(RgDuwM}x^jbjQJJt|A(s zmL?TH);$zTy(5@}hrEbt+XWsWeep`iKs`Z!ArTs#VH>y;O9US|H{&TrQsEN^DZBmz zkNAazZ7RcNJLh%1JV#Y!Hv&9y0ehe89y0cZ`q(V6 z68O>Gj)V1>&uj&6-`Shn!hB(V=IA?w%1Gw;E4hL}>2xl>c0k9EK?Z+9S;*WnRfCsr zLAX4}w-bu2&b75z!qmMP?%7<>J(NEzoe0b59>3BRwK|UwuZ^?g1`@vYG*}hDVq3Rx zmV7)s=d#z6z4quk^*29qgWTE;@bVTr{8fP)xiWibg?F2TLn9O;wR57QXfioxLSK4n zQ5^HFmv1DTNUt$?zncx_T6#RFzr_B{ZABpjKLC)m#X56 zYFg+Hnqz)JQdal-GSoAOJN1#cPz(P}IAV_%di;me?kL zrfL~i5$z)IN#ylvwLXL`Vd^!+tOuo(c1*20xZ3TFWOog`-xZtxIF4Yh?nwDf$LmEQ zVbPoT8cNhOoXo<$7h5WWIMd9N&9ER1O{@X)jH;A^rzsZ0Zh4oLe*j5ZVGE< zZD1UCmdiEhN9bMinZezI9hvdom_!j3E>&NQY!^&dT0IIAeJfr+ipN+Q;DT1qr%G#{$XOdrO81s8RRJ?{{i= zFdL4sT}7C{?zd4p#^NLI#(mDK&h20H*{uzHDN)qx&sWd#5SLO(G2jQmp^$1z3HC;w62Cf*qr%za?50-3b{=_{uHeaMzESz#q-rMf-7yhZ_F^ z{+2ubnxb3#hhbRQ2!@oWq+$H;TK}Z996@qyd(Hid&&v{~Y;YpaV zdz9w^iWPVyL4Nx7o$WI==p)zj!IS&_cDJyCWsn0Lrj)y6{J?tIiW*I*Rx&z%3XE{< zn^=*B&-GWhHtnhJXB^scTUI`)=` z*+DBQ-N?*`%8IVEzn4*_Kko}j>}@fR^dD^M3IuX*JwMV;b(K#q$EsO3%~4MTQ81Hy zmn&-Ca@^hNed6kPij8>U*ssd>%ZmpdIjbY z=`kQB68*gY!b*i0*fX`p0ENbuYOL7)@oxw`@P}Wn&;h}CKnlN$havSCzaB1{e9exk zaAc7v(4Q(|>V2w&$u0>2J5Y9FO8#6H?wkZZ0&7%H?q9aDWznxrVaoL#Jx|Y^tP?YA zRVnXxMS6*zHANS;h$}tl3<{~-g3vrg0(hg*=Sa_d=!s)hou|RvOutP1H_r2r_fR(tKDta>jJ;uIIjBCj@AIl!iXh+f&@hN9dM zY4AHP?Cez7awMKNGPb$d+SULTq+?48#UD%N{1XQTnk5k2F#%FD5ypU`|3rrPj;Y&! zSO=p){k?{#EiU#K!&A%mVJ!-rarmT1BkAq28^NK|N@KXW8WHcH%wsub!hNA-)WyjT zMGwnDH={RngkRbG^R4L-YyQIv`@0*BUPap z>RN4_!uB2A-$-hQBspFqf@iRlGimRIkmgBM8V+&@{v3O@%i{IHB4wj>=vWQ&A{mi3 zlt`M*YnNRiv~Y|sA3C6D!c`Xr&a#M(SWU=Z$b8VOq1fTXs9IZYrss-ea`ZliVPDDM z<{O(V1}tqTETwzA)~ffvo$%QgU-eP2}H(%WrTH*D(+iVTF5S*}Og@ zshLQ;!NMoBk>S>s+87!O6mTz_da13j^hvA`+(^XtOJ!`a2pmR+s`!Y1cR`;9H?hr4BI4LmbouE@Wqt{iRF|{B#`ki z1kX&3#}K7Z$C463Qq;lGq?13xO|+r?7c|@r)i__YdDoZ+;$hsdAKj0T51fRJH+_2# zcqgF(i#CzPrqtVM1-wDks{$Xj&kEc-U=*w|v1yEM=3EpR-~g=p2!}z2A$w>{303yP zlSdNu_hGhX0B>Tmk{&9-#PsfV*kaoirb%0rlp_-M7+(sSIX})MyOTgHv!wMmdNdu^ zeq7OEfzixe&cOiJO5d6z3|ORb;+{wF8_e{GLIBn(8RC0X1yR*&aSc_={PY!J+fwu8 z#b2(N5p%R!s&KDmr^+Ezbdy=`%L_X*ZFJq*BGz=)4WbbEDw~gP$J@jM%8K7`*uY5G z4G4;%@?0|29|Ft`ehK}fvl&SDowUQ}6pf2&EN1m*eT1tir2vOD9}M_v z4o@7LhQi|o40JuLw0|h1e7l1;-du&&_DtNGQvWvDag?e#J0WMp5;1()@EA4v-yp4` z$u2JRKY(jR-@7Ym{)%jLl^WlE2_M*yN{q(>otLuI*E=LgyZNDrN#VEx|R9M89LXyX69^Fkc6$>8702i zw$^Jf2v&Siv0cr(W`4%H*#YyodM;&rhG{JYR&`e>o}KU^YAY8lWRC+=mQm#VlA3}m z?egeu%yS|p7Bry`4T*@=*t7jY3XFt`?t5{=)ZuH=w#vL@LXSvBY!n!+ivaV(NFJMb z?IT&e2s8>v#IH%Dht;>oh~R{DHYh+LOoP+>9tpV;#4G1}*JE0kJIIS_e^b|}oI6s7 zuGPgDGPDJx6E{N)bsmbY;s4B$-WBK`Ek17BFYbZ|lC|qw3{gDS2<^aZVSlm}|4J+Y zYXHIS1;?ZuW@=a1=tZ18QnHL>Rd|a97+{SbQVojtx~@MJ*bLc#5oa?`i5+@O>kj{_ zI{)&y{bo!?t*AP{3dq#`LsfqM$jhwW&c})2eO|d*JmGpGLf3E9PeZ&8hdVpN;Fz4> z)`92R3b}DH;LHetp{nVC);bRajprq=h}++O>br6%)19kYaWF2yp|s9(gWDj|Q1dU4 zGTqp5$2=Ti-ui9l2R=O~q(D)}%vcGgsgM4BF(2|ona6w%X9j>QjD`KCmrD(z`nhI; zSYgJbfvHZ=q{^V(;w)w>_`Foj{%~YN$eaV2Maf(SOf?o*#Le!+Jsaz)IDQHt))g}m zu%O6`VU2NfAZw$QC+PykF$W7heoD#FCp@u2=ddytcA}0 z_?efFkG}Pf9ig)BCPoJ@UX2EIjJ-AqOjfw|*f;trYs?H~|8_ttzgd*>t6$E?vVBa& zG1VY!N_r=Ms<57RM5Sj>+5QX+(^X|3(YzKAWw2%I2D!1IkK+gxx^qpDHq)nxJx-$_ zGV&kY`z0C)MHPbGo+_gEeo@XwX-Z9-TsM%XY;Q%3W@K_dBQX~RfU~C!ak|RD$+E;$ zas|34{!|h9cg!R*k^!4ro5+zRC^-|_RrLOotMJ(6G4gVEZCM&#&{M@$2D;GN%eTL9 zJ(aOW6`yMxG-AVan1$N?R}%h9*7?4C=7;9{N7j9wtF1QA2wkQvaBK{LfV!go{U&J( z{wO~DMf_dB13cvRN>IQY{SVGcSt420`VBot6{XZ&E|XHW8QzhK#j~6D#zY-AB!3*r z%MaMiiB_NndOJqbGzxHK^c}P54^3D4g%6~5zqD<4b0xq@CrH%{$&NZ!PP1;W2~YL! zw+9tO?0=r-965n5Q4nsJt{(t%ZOnRN-+0gT3%LD#M4+eaRPnyZL!AQlYXt`our?T4 z%AvOy2x2s!War0CrbVoBPG&+CQGs*$;$JcOp?zzZuY{*)tH z|0QybQihiSOm+i;O&^|o01lsq$4MNfhPx$0BD;&Uvqg#V+E zrF0$va!gQE;dYGg$*f+}8hG-tba82my<$43;#zTRZY!eI{#p7}C+&~J;+A11Dpe=t zqCNeqb0R-NqTaoc?PL~|!s1d(CwXE4S-34bJ@GjSIs)f<*fl<)5zK-QbdWqAp{u~J&}{3un+|47Lzvyq$XdHqXf3C~h&k9fULPZdf2;Cc z#R!Hl^99*EVt!%v1E+SqYVWxKFSe=SLDkev$SRf&*MiX`BHFPN7rG)rFMjd4rnc?? zh!b87-y6`yGwBO?Vrovv2y-9a94DAo8Eiz)T z4b5{yu^-`-MVg4R^3LTOhQYh890WmV^nH{-v8UMwrJcnbf6+7Jq(b5L`NdJeTo=+b zR%lPP`|PLQwBd+xd}*RCPbv8xA8^0d7?rfd#?15h>1aQ)8!Gg} zq1BB!?I$z1y%NzY2B~Xs}XZ3`axtC=GbiW zoGnS_>o&Z)zYa8%*rt@KWzZXwfoug}LtoUm6SWm4`s+7>4k-bJDQT!@6*=(s_yHq6yg7-vtt_ zl&}%ZyInhjY`=Vh1O$Ulv=(q{(a%F1B_%#qB>T%`kPN3u`SAsXF7eKDE0XMgaK@X*(m*Ryve?Gm3#bJht55(p0VYmJiev zSHk8m0++nsM)jl%c)7M1AKhsaBc~0~ra~})@iSk`5vEF+O|QKkrFq1a6WXywAIgyZ z97(DjeRrHkx#}5!_LtN^2@Ba4+<+p+%R5g?&|DIH0Sft!TT~f|SvDtC{c55G&MSGl-Pqfq+sKM}d#7?$ z4I=|BPvxjD_k7djiydzw1zD2`aKSq;@sNLhtK$m-z#(7qNF=J(E=NI>A<@Q!;ps9e zPgBiP9N>!j77OZ;7iV^!;03|&Ow1nf+kGG)+fn&d?4oPu22I|{^ilpLmu z6ZW32n+q#idk!|(G6>f(q&5VOP2sME-lq-;RCN9GIgn&d{pReFo8Yzh>ph~&=IUuI$`+vN{(AN|%)d`_+n*vkV$77>qxE1OOz(bxK z&b;1`LV~=o6g1?NyG#49asntC0EOlm350%TdNX6cG&rnbvY3x4Uv<#671M6yo-LBF z!nAbkon@m9DHqnq;Nz=kA818P1Hh%ef~BIbL!5xG^SfFk zf_QKuh$~Oh{(aFsx>Mq*qG+mFslc?8GY*bn?NGHnI=Dybz8O-m$uX4*7uXv0PPAgx z?oi<#dv#G1c4Q2d??ho`4_gCufg+(y#9^hU%7|CtrBTcmZsgq8N`e6v$M#F05djUb zy^y^;N$(_dO8D_W*A74H^uRg$(yOJR^f= z_pIEv#suG;MQJ)GjhH&c2$p%E&U$RLXF!Ltx5bwH;k%fVd?L^EA{SD z3icN0P`7lB8HN^28HCA-#;q8p{8l$`ejD0km4Ck_c9>fOBGt7A2OpSy#3H(~BZ|#t z8d3YGqfUEpbe9Xb^z~27ekkQDgw^yZlHNCjtI$&%lBsc423)386PFHX*mAvK7vr;S zZLa%!1jSwS-!xBU#NO|U9fO0wf{J}(@Bwg>tDh=vMJh3{b0Yxru=!3?A3GlE1w$+Gow!L8a zfINH*Y?!nzf60BZ_df31D0%Qqp1@6j9a&C_k)UE$6yVPP7{WPf3j_IH;G|DF=LjPP ztl|WxuoF9`a_?}|AhwFNl^Q*w?tUr4^H z2CR_6Gx9CXw8e~y0^G?wmS@2O;g5n$G_ka4)uED7^XdN2C?u!XEkU0xV4%^Uy3!D` zweULBhi2j53!Ibi9|K-(3uj=$Pir8>KMh!q;I$P2xUuyMyAkSs{qY!h#xh6%3ms}a zY2&Esi3uFQPh2?D?P1u{#H{U|(3 zPVkBvU*1`a9mST!AAS%=bnA7cgddoBL0!Vtna(9Hr-l0_Ah#Ha#}OY|Z3)hb0t?G5 zV}y&QZH&@*V14#hOEaaL1>_@J^wY_AGCw(|&UlTpZEhu}5Xbf4X(FMZ`%@v54+wt* zOwKj}>3Kl&#Qw~GSuf%s_ha#Jy*$yFt|A|_9a>`oUzObO!AHRzByNnUZ`fhB;yiIt zq_)gfk7~unDZN4?=#=&`j)eFt2EXl?WaC6x!FQj=O{*5QEBQ4XdXpxr;G5mv4=y2X z5N4pIp`<{#tmqSY(xy2hCymZmTlXecsrwp^G(28$XdMCelk&~A8buCeHcFINyk;(_a3DgpcJu!PNwn1BPb*E5!wZ-udVne?3PGb@H+J)$7MSodJ z7AhbLc$gXl`SYz@K>rSbjFK`+wxUsm8kf{@NJm8O*ebIEK#amQi zwl5*XGQyT>lV>rxUex6oOCrvPJYwCk*0_9qiw+j}l-AKm5Lff+FvH_E6#)pB+q&GJ zS8cyA=-}X{VR^q6BhU>m?OQ(-IFjn;HAy zQA!C}jwlwb4|@UTUxD>MfkWI?&Z<5z!lHqKTQ92#Q)`#3%e$x=sifDz;(zqj9bRE~ z)V@7yaQ+wT+kG!VJoq04uubJMu`hVYkWdA+j7Q2HU||0Gc*gan2!pSF9`U`mqHkQT zk#L`v*aMTG)tJ6Ly-3=gA}T%ResKeBJ0oU;(0sSw5_ZfHB`Zplae=+Qj!GQh#>!0o zN>xc%YnZ~^SR3TVJXd@07-m_uQLhRs-G!*9${ss4tV*!#a&AX?(Qvgru>q~(q5Sm} z#0%AaJcQ1(qcuGXG_Su}(dxqO%A)-w^~Mt+Lm$MMbkn?{{eYkjhoX`8U`v zd=x|u$L=+*%L4cS9XM9wD-8EaMYAMJ(Z2AM7Q|^mxxJeYs$t@}5@jt2=f-+$Mrctw zo1;hz8VX=avDRJRODqaefDgtEiB74oZ&@ze_3Cmp2*S!fn~3{pZO>#nNCsCWOlV#} zPG|vyi!v6$rL(O!m~2Rt;`-ilk&r|}As4UE#)j7lj7C`w(1ifcQFQ>6xBfPP5YqDb z!PPgF3SV9?ekz(T%)>{o|59so^2Lv5dIPOK5Me8Xe(`1Vr~7%soB#5KDA781{S9T| znH!JXjBN}%{JIlS%@WcX_o~9s(sbPmLfB+2#KuOP0%n_anEeYNOu&sHrTN{;&A>sP zZ#cJd*Zivz!-c3G@7diZ@doX0UEn=OgQ=rUs*p~L)@7LKp z_@#U7bIqS+eNvcMUYJ!5h*L;^AE?>QhXoj988TJe@vm&dw=5X+6oPQ@fk(>tYx1W9 zT&YMAs!sS&yfN;wl}Uw!*B|WBD(F<597RqF{NnR*kgXpSY>BlA>qriMB&*KcD!dDJ z)%P1$JI2?NFvQl35H2d_F~vMhL}ndv`tE<+)TdlH1(J@qLN7bfL-zW+iv&&h z(o58lRyD>A{HS-PaPYv|;a3eHJ2+TTD=uUf(0xMYN?p@?-%u%4)$PCE_40%`THUt` zxSd8^;b5Ik**JLVB288habw3ezxbVZlQnm|%P1bbzm`}HwHiM$A!Z#3mGN>L-G@Be zA`Jxnc&PgPcFp%5T-(dpV0v5ZaQ{b|*71m+u!bo1w41Y8mcKma8S-=mnkZlyElTi6a73*`phdlD0h`3L`EIRvr~7} zuKJt#X0tg#<^N&oEra6Rnl@YlB)AjYC1`MW_aGs-YjAgWcL?qTcXxN!;2LyrcZT!q z{qFCaQ#JgcYM7dbwN|h0zOU}C2Ioz72G|7#CH)@@;P26-J5DXC07_$UezqV!&kX~_ zfUXp2>yHfGVcDxNoI;ZL7kwv= zV-OV6gN|Rgh7C!>*3K0O+!)~xfV_CVEsns=mQaYVdDz^_Tca*$$qAiP$#weG3nPkj zwGRuZ&VZOXbYSnq8R=0Q{`eg>y~x)}t|Dj_7(~g)7U%hc?MAvH2=D-5Q57ja7xu#k zND~8p5!aOp{|a z2s2Xv(L%0_b;ET#gr6c0L(hEuEhKw!oYEaYie& z>g@+rnEB)yB@}33{ev`4Qugwe_g&xE#Mmu7YXtuf!l)!dB+lHXo3>Uozjuv=^-amo zaTr}Oh34bi0ksN7 z_18_t+%a1DrpN=B8Hb`OBksIBryuzE$WxCB*#4@g2-Axmtgk`nLAqS&1=eScH#;97 zas_)T)mWSdl0~>W5H8Y)LM`l=A!cb8+_)vQjgv3@?%f#7E*Io*=-M^ zz%?#{T48_0io~KPvyraEmuX`2V;U~Y3UbRVp*(8nbEzm2d{T`s1Z(c8US2@81OI=ro zEw@AOunE6ESw%%Ys*lpPxLOrwmdonh)zJ&}@x=zVFs^k*)|)h5 zPHM#cDjMQ|l)ry?xDEeUb9sF6&-&M<_g&vOrgkRx9m^sBL&nCZr$I)g<6VzlN{uIl z!rpWk!-d&%lE)5K#+eNVpeJRxM;=@Ng%BzAC6$ zDUa8nWnkW`{Dqoo{HEOYY$yzDk^FGxvf&8Ul)ywFgn=xp;|hx)av|}9RsmvSmGkTt zaxsX;8<3c{wF&aer^(;?nsZ0cJ9=@neY{U+pS`W#$9)%vRfjonqTuL}#J>x(daU8$ zbv0e~a?ua!Pu{i5KD4|_r^HD?-DD6T2H1z3Ys_N+D~0fDSQ?GGQmYf0Si zFk_aoHu05_6{HLH+{1Vt+(1dkbF7(i;Q`jN0jW7BEwxxBKB-H?-jv)%E0g1tsR>hH zKDJRg)zmx#2?kv^!^W?|Mt3n_|aCR zR07Yk_r*ormTxYAyA?(H8~lkF=5o8RwR`Oq+}=AtnRr~6N0U*zumo}eO-OWram+Q> z|M&@}nRUcEhva4!#lFQGqikKcKzC@f^FdLt18TDFL%@N~_PP&1XnddUfSbA&5Jna1 zTn-Y<>n2WSRr$@iYo^AVi-TU#LjvF>B%qJ|^VGyDXj0FpTJZh{W^Uv*doB?ko@mc* zxiV!>TDv+5=hO$hSvzVix@LYPu$fi>1mxBWkBF1~X)x|!`9^~V^;5( zT@j1$Cm~@sfmZebbmpfGbVwTF>vj{jJ_d|Ix$nPmr%+x`4<5!YCDvzhg>SD+JJwZ& z9Fx*?ZD@*H`eG__cx>qGV01{RA%i>N&5}jh7sb7}qhyLqvvnu7d=Sn|ty{{5A`HYS zsymQ3@#o&Qio6slJ_Bejg|z>H_R&K77l--FLOc!Fd@seIFRnc=wQv)q~cl;*>P(q`kTke$4WRJ1;E5 zRai-EQL{bXl6@CRFIV2uY;R~^E22#|J1bsOflAqiZirXV`!iGO+;hpGn28X|=@T^3*{sCV5i8#gXNIRaiKh+5Y5O|Yu%@6z zwR^l$!>K0Ju+uVqj1b~0P2PE~H;1CC-vjp?{>w%dSS0@ifv>*6THWa*RC>S>Fp>ci z)H*l=Y!M{xH$g7-xY8UN=H0Qaxv?V`oCPiT z+}>}kQe%X$eG8;${P0b*UKNt6C9b2xus+ly&-^}q26f82B^D*6x5G6jOtUHq=p~4F z`-8sY_FK@L4@SRbemA+z!j1Khdfp>`|JcK;{h!;i6DxL;@{VzzdA(GZ;p%NCha-rI zdzUVfB!))o4~FgC)*^>;g8K=7s%a7jg7b%866oxPu~5_3{K}k!>j}PFP7A||0jYb* zsCxg`#=k|CTxOQbLTr}a+mB$l=k$F6yQwkh*RFej@P|lI z5G&qnykqa}Cx0k0EB7tFH&Mr%9YjU8-4d;LLQKYHYQN$OaFhm$g__#fSJ_&L`X?{C zBYkp&SlgpLcI@(X&}X)R z&O%+m1-hzqG|Owa$t6ScP>dp{+Y%LVJJy}2qFb1x4GQRF`APM3oA`O6flMbIS#dDtI zxTMQy*J_p(WU^eK&PBZU??_ieA)>0iv>683QpP=8C~Iw>a9BY_s3r)LaUR_&&Qv)^!lW zr9fw%6BCEa?AyFTgI4X_pTxE&8?%lF+#Q*wnC#V1Am6q7W{)EEeao2RmEp;pGUPjI zAY2m4`Kp&?d70Hzae&~xSoM>55{^usd)-HkW1mg&w0~=AjvW_np)dcV%;)}2yUWmF zW{5jIY0S{Si&d?0wFFNDKAbJ3t_3k>22i&M-QJ?$pPfPtFm%G}QJWVjW5T^~`n<}D zD&gW(rA4O*KP|7-k$x&lLt==H~fL<0?aGPn5tAFq0Jq35z892r0P z9|fHo-(n&{Prhmx;OqYR?cSZBio2C4@Dmc7XqwrPW|jH)@UvF$cn0hdke16%r6)>q zHYOA8#lG{yz`5CNiSPEkT0!{p_2OC>@hFvpu1e#iT#<)I*PdW;IU-!O5UZ?JXF~6t zu)+tVz~uYJ&BVuw1p>voPg+h2^2Z)MkE?q;p`fDz%^!4L`hWDr8i6(5i;M0i)J@Lq3(doyd2T+y*?aSyJuKCiR_^sYnUQ7G(gXCIWt&!V%< zP97i%*%NX;vkGXV^gEv<4V7jOuY|-;a~anzBw3%0cycwAS^tQ!Yy#U1A}1!rWLdG7 zlhDAID|APxb=?e0S$DYD7;{2E6AV467D6cun6&GW^PLk78*FAVt@fDf)h}kOE6sp1 z&ur_qF7npQGg@q^1{&^kGviKo7s{Hhj;P+DOLfJbSJfs5iHeoIXMefJ-4;vAgaF`^ zj<*d(m(E#gi58T(Cz{piZb)>SLm#1n$cE<0rTuPy{RjNj2R;*`Dal&|09X+4-fSn3 zJiZ3n4?mx%zmKH|F(;+HGchc~ae60f{%HauHq}RGuP=I!A3Wr`3<+M8ai7~9U^%I0^Ez19us zH(iwP#n$;Al{glV&_AA>Z2t1!+xOrQPeoE!8&5Uw)GR62-hf@LUA~WVk~k-!X}bW? zVRdn)``ij@|2zjlv%ePSkEsQTnUjzqgM2{H|Dn-o=j(KA$tG&B14=r3`v?J4>j0if zE%-UdaKBOTNsf6|;X6aOndrKf{Y;}*zmvvXBClB{U%(=<&ax^dTv{lx;o;l6#ZVz9 zMw4>W5SM<-xDw@`1D9d9(BpD%r{m|M71hE()7F2=6!gwA%z&PND|R!VAlpVDkbb?aPSxT;zE_=ANV z!xvA=0|?Y%9sJh#%FBVH6pB)M=0uAen;UrBBwi`71leZf(hQK}F|4}|FPV^6;beKELY@1>Q1E7%`JzUOaIUqfO=lUG zFZ&i9G*3`hX~3&+xYl1|{bP|Sybl`3((ugAF$cM$%!nB92jeb-$YWAhmCQ?s1%-;g zH{Br=5bll};5WG*_Cw7en%vtXf@%FKqV+Ne((?uU)@Oblc_rnip`lqsH?mcv3KR$0<96l$=wg8 z0GJP~FPMr{2Wox2d-#TS)F6vKIdK*!Qne5&>v*wklNrdl zAS-#rDgIJ=D)V7{xUC%~g4F(1dg_#sYE4{=Uu$h@^?XC(Bh{gL(kG{8@@PY}vI??h zWfrt&)r#9umn#vlDpX#})5JL9P@zMSDOv9a{hc&iKDU?nv#z0)vd=FS?U-rJoy ziVCLIe!<6FTo}9r@|(R8aoIXq38XJd@;8UJZ@qLYPM_^u%47YqB4kb3{gTh!tu;5S z62OEuGsK%K(DW$B$uq--3J`M9`I)6;&fK3&{rm)082pG@vbno*SZ{#hV~t*X7t)6k zSfOD7;;p3@TObskQ$f>P#13-g6?Y`cSqT%JcjDunR01+t?DO~>eD%zifv>3}W`*;9 zEC+j*#TtWCyuMJS&OXQU)n#tJh`p`lJSblODaKOY&}RNE2ULC=8x!hi6Jb?cWp~QB zR}O|2CPCF3n3>lAcw#UCm?+xqSV?7j6>A7TLAXH~QAB#6Ym77!$EB-aJ3Y93$!w zihcl^otEh;fpJjV(m6*C(-#Mx+k1Py)HuH_iao|hA&{2^CdQSt^@$Q7&1dKdcOMU8 z0kW4Ff{^_Tx!8IM&71Gp8;L?%^KzVrEDA%T2GXdXSN1F1W)1#RRzA|jy1CP=+6$^T zq#H`;s|~Jy&@|#S|1Xh!pwv=I3{(TZIp|LU_qK~C4w&RX#^YHu3#^WM|L`x=ko>L1 zITDn2x97RzVsp;NI!-5rj=re5+(e_}3Q*7nqHB$oI#SW-IK6?}asz0-!*+<*ylZh8 zpTqpQ_;zqF{e#E>zv+%U%9OpPDj+uW2(72RwKi<&W?Q$CT1i#kI#roU?1t;L2m_Lb zM=&CYy*3fUuHuuA3mAm!bga`7NCwOBNzdYQ*8(ly6{Q$f6&X;FnW=Z7<{z|li+vK5 zcc4RX?+X@XbL5R{v!=eL4*50baXEx7G)wQs$myWB8`lk#{;|I?t$Lsr-SJT`?Xal^ z9Z`1r9@c#_1UPzv?+J&eo_@EeC{nUve+)c4kn~;2&*`sm0~)*7cFZh#r1goIvSV{_*dQeGlObc6YSB&qM!< z+wJC7AjZ0S2bfk$!cXv=eRgK(01e7^yq(KQi)GJc9IgEuGap0eHBwN*I0-kWTkl5& z3M4%%~Dyh!BB}40h{j3zT4(W~IrqoOboQ zQ}W9y=!2@SQH|w5uHcL-P~z%R&bKMxNW$zYqS6Y815^uHXG4bbI)-=VtsV2-1k|u4 z^lD-XJ2F^vJPVr;r?5lkO7oN%^(s24!bt?!4SD#w;X*J-pWV#7b9JeWE($J49p4Gr zZeGliEKBy0mAoDuF&}J1&)JlGZqa_5;_^FRo1X(+5XP=V0YZ0{7z)-~G{WDNW3$r3 zf|wzPsm5T)i?Q4o9{_^5V;(N4&r{Iko|I}jQo;o`?}>o(_PYsD{MetwAf$5n=ZPn! z@bOInkP0=t&o1 zaiHqX#K&TelRNJtJ%)IZ1}8>J>3Z*m8{`a^Hrxp~tPvNe(r{((+4m`!YZ4E3@+waG z`*;x)a{h&-=m5@%RFwn}ip~(^c0x)Mr~g8p!?(91Lr5T-EpwV+8oY#^(gRwaDe`gAs+?IHUKF|E!1?s#$|ES+L<*v$iyM@`}oC|{;XAi#+IvOZ10p(soJ>Od9u%0J1L zesS4DZ|4s-Y1nyqF+WWRUh9_h(ZS8)C{x6W2i{r_i!7lDy@xAT^yj5 z;+EW%ODtEZfr(C^7S}Wd`@>F!=6JDW1)`9MhYEQb2kmex>U3oTInY?m^qI^S7e^_qie_z7SJci;mUcg^;lN-_l= zb5j4T^e}GI3l8+t2R~)&5l<}VLXPi_Nz)5Q*5;RintTgb+Ni=mdUEq=MJhYCz+j@i zF;@NVGIVQjCmNrc=*K@{pr#FqLvi@ip)Yo>w^Wt5HP^}x_$0hVXm(HilwzW?@gptJg4hbj`k2=|U_8wST>VZe3zM#(Dia7fyKb&SjU$g6l=@J{1g*v>LSQHx> zMKr{obEsJq{W;4z@PTW3{8NIf_Oj3&p4+BDX5D7bND5@=IiMuG*unBvt5dac8_y+BM;P85x0jcforvU>DYjfd z$GwnU@wu_Y!{w&`meYKSEZG)yBD>mi+<$WiS}&NVQI(funF5_woW1?uz8ZCtn8+6q zG0n}Wp6yh)TXLRI8*|jU@>;G|jd7m|_io?PQkZTTd@eMcy56d|o@nB{cU>{!u8Xbt zJ3o3zkIP@ChtoVu-+5__r&Ad1akVFB!ovWq>$irF)4dHnTShl>hIP4Jyd`{h3*mSF z#o`{EF|z54v2TbxDe;+V?V>z=5tXJ>ExiwmwFf z1VZu_VZ)HBg()9`UQ!b;K)l$PpYc9GVd< z`m-OI_q3)z#y7Xd7GljHl+b1QDm?PGkEd^ZX-84TDPxr{v}3RDADMk%-8~57rseX< z*Z)>o?|H-)47sY@$lu6&<)uY|_lNBK^=M1f{Kw2mR8Dy;syab&;m<{kZ7vcX>;Q_$ zwx`6p4DK=BpPY`cg^*J8;?$kL)FbrY<+1j)KZh5>{!nR;OW?!)Gg<$q?DK4{f`X$| zB|pLn@$7!6oxwczU#@ko5W!<%Qstskt!r&enR+PUy?FHqMMzCM_@r=w4aQmgwwLC5 z^$reM+@E$rq{{hnX(ZRnj(?nr|BnUes*N4AtcQRI4LrdJe#8HPs6*F^Be5JXYSOw< zAGCKbdUj`LcXDwx{(fD3HAS~IRH@b-h!6PRm*)@N(OD0A;s+bVA}T6QNeoFL0jib3 zr~RVFwqQj0W@1p|&s?CJ1&eJZuDfxm#5eO}e?{&Kw&)FrvcZ&STW=y5ZXru$ZdiRca-U6{SIq6d8x^Ns3c>JH(kVn9_2jDq6O zm?MIEmq6&Aj8#uF%K)1>tFczY^=%Jsn888XRzHT`ld_ETO#o~*_D)6@L~o&vUjZ~T zt1lJ4>6+}Lo`_l9X%p@s;!!v#EmAt#%b3fg?+X;34g$nR(;~+*U%bgO4|{U4M*2cK zZui8&{0MujEdG+-NK&YoQ!?(7kLI+i?bh;ABfm%>9bRrdO#6I>uxm(TC4`Y`XCYtt$%u4NPW4(~ z|7y;e#xaCCrn=VddJ^X|agVlp9Wa6-2E+0N_1J|psz2HYlV~HPuj9(A#u?#HAKG~* zcx$HOXzLkWo9MQKHMKKgsBeCJn=*QX;~>on+rZY7UuDTP>Mb+HP5JL8&Jc5QWuzjl z->Jl>!CjsCi}YZ+%*95@jBCF%A8qnF~_vW3VlUbxY{L6{N&+qgiz z7aLAf%2y0J`7}yj5LY+X#1h7*w5GJRKn`U-f(G2aSMk}kx0Jf#wHLr{oZyyhO3)8EX+fCHIq?3WdwdY#63^XXa zP3cpT32Hz)i-}n^695KjIz}d*_p9cLXfjPRerI%eUBxxLT~eS z`R%mhN~b}h<4G!i>CDV1R9cW_+|lE!JdNip4Pwz3kn#=zmzPL1MACCvLgnSK%pxah@!ppeJCT|odDeznO8a?z z#%;hJIV=Go;WW73cVZuINWh8abQdRJJP=rk*g^CEZ1N~_hF{aawt5!>drBWN_^erp ze^rFWk=XCP2!(MJ2=vgTs{OD-x0s$rt}((2+^=Epj#m!RWU@WswW~#Mrav+Aki299 z`mdQP44bMO4{T#GzrmIbt)iz;{VL=%ZwOA6&^o6ZFc8m+t1y22)PtfK8p7>yXnJ-e zM`XX@A_aw0QDAnnB0-zz_q3qo4b4j??0`4dCQo4$tHFT!J#MB;z4(2*(?b2+aUY-z z>CUwrT-*OjFrla1P-#>2^y560U{($pzX;;po@37YS!hVu5tuMbAF0VhyL~(Rt-)du zJB|REXlDWapvoJL${TBqwk->pM+W<;Q|EN6HS+k1!Q+glFH!*#0)VhqJgY@%0Omwa z_%?{74H{K97CnF*XHDt%SJIbEqHvb7NtwuG{PFwqjvVIw$Y?ocO3D{)$M&iyitlh* zgv^Sy1vtjLEW6Z3$vM`Gnu?l)H3M`zVHyl9Joq99VCMBt+Z>M<*S12vUOWDy|etPb?3SmrJ9(*1M-i?VjV6_$}u)5za{LxK4nHyZ!o&yVSbwr zXY!a=iBj62l?MKU8=Nvi3RdxKKo$o*}SznbhVL_ zmx=G=xIzo`0|Cs2m}y@Tbi*HSCpeCg)02zjo>^{A zMo=)#x}w$Pz9%|ocO)KtihoG1d7B|Zq0SW{&+YI6_6BbEv3H!>X3w0R`o0<45YjQe zeIe*DD#_G1Uy};RP};OmV1HY0A+AVC2h2Ld*l?`e%lz&0O)9r5TnBHE#krru)ut3) z?S65bfG;v3OK^~Mr}`a2lQqu6$LQ}E*|~^~#fFE`?|JjiU&4?2Od4p5sR`C4_w6u_ z*pvh}C7S1j3lby?9N<;Vdq1ZJ5Jb#3%SnnG-nDTQw@Sa@F1b#`FnhciW#{c?3gB;+ zHQLuDHdk2I`xu-eNa*sWUW(dXx4qqkqQ$p5Q%niQ&P#IU@eo`>7b!9lee3YibpnR% zZ29preblw<0XgUESduln+WzGWOTai&HF^zrJ91hr$vW*Lj4Dw25MVF(qr~jb>g_sh zEvERDB5#gi@v4$0A)CxMk8JU&3wftQ*Zi130pNHa+8Fa!YHAHjdiL3r@RM}nNj|l} ztNhu##G?2REN31TqAE9M(~Te_`hlxw-x2h9R500_Br$lp{ed~gQOIF54$9t*+#GlX zp(BJb>WVn+uoNX%ku=>>^wndNNdBZ^*i~@g5)Ehl=4||r|7kER7*n$a@&8)8R!L4J z+RR+Lba7_isJAsiQFcx+*{~#T!7^|CHWy67VU^+WIzW@Ck$UvE`R3><P;_AB-bjR_;ZKEoBUX)=GFLS4Y;yPqzKV=8L4qixSBhCKZXK3uIrV1 zk7E;0YdT`CZ>N(puJwhd?qO?S_F&EIeoHf_H8qHe0|n@-V&@T7m9KMTNW+(m$~Hvt z+q!&{h%9UJQJY-J6RXILAf88>XyjQMhg$=Es5zoCnG?Ob(NIUhRo=bU^#pbD^+Swp zx2a~=>Uv*!;QP-oH4%~+vPNkE$`t+4p6p*HrYq7-Nb38O5qAOzxYm0Cm1cV7&n8CN zFYW|nZUlsUv{F73V@)cy1rFZ>DPB;sJ9ED>de**z1jR^r+|0H?)xLyNGl*Q+3NO19 zKX`Y7T{rptNUl-Ebc-1=U2K3B8gp}L=pxdBVkxkpN5371i>Il!k;ecRUGyXDEalvE zv~?i#n%;zzi;KIfBFCgJ^?tLJZO~&A{O+=IgL}la{bwp(_jRv*7{zq>I(#Z1s&X=E z0Um7QTwh>7m7DYXG%R#6@QFqz0aoL`qgYFM%LRBNB&hP(PPkUueZO#v*@bSS{ti$1 zS)f~;Yw1v+jXc2YYhpleLf?A#f?anJ!=T;QH{Xqvayodb+zqF@C!D(O61YxHn4|#Q z{*}H9;Fym135RM5SX?B1>gm&K38J*$lZ)n2Rda>osg?C>xQh1$I9hZPZrbT~!<8PM zWSc8es9LiFiA=Mdx+pShUIbr>ZE|%O3$g`);n{o;LUv~hys8D>W zWU+eAQ(*yR5oTZGG|u`K1uuRWSwFrzPb#5PP_W@X3Tha{-bh1c^ zS8o+?$pSuD%yu!oF|q!4WvYF7lZDEXDFqje=)Yn zQgJywH)OB(Z;I87K?AMj%k5WC9*8*`Zn6&$sm#C?kS7HRykw_4qJAm(B6S_HL0ETi zb=(LvZGkU-j_EaObIo5vC{|-C9t)<54khlj((s5+ZJyEd=a4}=ktzdmVByP!X(79q zbcX$m1WURO)lSy$+_&@4D=a#Vx18)POp=~FKsev#RgaT z81X>aO%=cBJ6WXKcEp6xZO}HVk26Z7uXX^oPHMVNAc??cZO}hvD3mZ~;{O*EBRT9e z%$pbJj*1f6e+Mf`+`kc%`X=DEXOhUo88c3G-+tq}`Xwmtb;d30aBRj3qoP9NT*$_o zv>CxD4jTQM*Fd2mW~gD*QWrEuInF2%KaCmBhdl_+q8Fh7PKe)#Q=G%hN+@1q^Zkl% z#L9`@hup~m+A)EkLk6gAreC^6NerYe-0}s;2x;hlWzh(12rRJ~Uih@Q)x?c?a@)Cl zTJk!tw(abs=q>rG3#NS%NaQm6^O#kF)}aejG2ffz4jB zAS!Aj3x=o_S!pR7wAofvK2lCf80;!}Wk@A`Sh2pLknbNd&r_V%%RdiW?->BCnyTg_ z&e+k{tx%B{T8I)t`;nrZ&l-5SHh!j#O)4wPXD+Bwf1arwl2~0T^Pxd=C#|C6yl-CS ztMOhRF>%C+TcyvlTC{nvAry%VA~ju)BH;Xf7__mdE*#@94uKjIRCAqH-3vk@^}hOu z83Qd7Nj3c~?fQV;(!ArU)y_GDAxAqr&nutbukQA*AW+)E0%6UENfABqAXh!#5eMKm zQ}Hgf%5z*!*W7CyVi?bO*d(CGpYJkMy5&pq>d}km7kB7ea?8@9$vPF zHUQwyRriU*=PC#6y8gD)-G3kbO*7<9jJu9a98eF`8B*TF)DJMWa}8bHq*Q35Nx=3MZ2I#k}wWj=-N5) z)+*(0@73>woA15v(OT7D$}EpvFv>fktFKp}O$rr7LGm0nU@VGej7>WcpO0Wsc-(f4ZAM?cq?<*dOZt$ zveRQ{Yxe~83nCQX!;Ge_Iw=M#l#`*JHJM|)?ionC8TOMH5 zfP~v3^K7sjT%(AQolkQ~Ry&%2rYD9LeqbzzBW!WQ4PSCpkuoGE6COV5|fyD3lXT$9~|B%OY~F#kD6=6hj&aa)m*om7f%T_A04(ocr5sSS$Zu|SuLpUlG=Ie$L7^w$Z`eOjDeZ;+nn zYR>$TXw2c!dY;7hQ#an&R;oE_f+V0goQh0$U@WJ|5awkKO z>D=YF%KRme5(|Bt_Q2D07h>r4z&eJx)!SbrOjZ=)7f8`NHyDuYG+7dC?)=^ibv6l~ zr!e_n`X&?fxn#w*Y`-YOrhFr{NhuXsEH^}Na|#AHb1oXmiK3N@x?86t1MaUHvLTv< z&__-X`@8UGjGa{x-@gRDx%$Eup8Ju!o0lfZ5ZBq|13`>xhT;;Q!nkw3W0+D5SX?YUg!d!&Q5aG7FN+k;Di9-q~NwQu)C+CIf5I{4$!x8It4<9#fe zqOI^bk}Ea38HlmtJe?f>dVfj_Ft~cYMrD=f)=Tsn!s_GN6sXHw?ZKDs$Ig=AB4nZr zmQ?CY^OUrEF>wp9smy6h>$+Hc@U};E03^?!x>JNzPG<^H{I=lZAvG+5iRutU7t4L!x_@ur=10wo`vf8+%&4qlxTGmB0)q> zzYCDD3Xhp!2x#87ZeMeewu-y;+q8Js`RHvOrvItBTOMC*r-oZ@?~Ih>1b>R28&wnl z5?txQh!k7s>pr+ZBszFXQ-{wfaiFK7Qo{eaYdMpHs)RF0kyf9_c~H@lX#u1W!>ZND z0jx;q!=`XCfA;;pIQBucHyY^Xa2syK?zyjo;5^UHj(BGUA=Q^GdcxaUu4K;=_?Hw? zIH=tr$B!_qL_QunPw2RR0+%d#5y+y%s5mKmhP`gP^~@k^q_34_#acA)-jiExj$EH6 z!JoASSaii4gL=ho+3_n)3By&+qRm|?qE7=kXUq0xtvQt#<-tWR%=I67Y5IWxHEE@1 zk?|d`QWfgVRv{MZkPzmO?Q4hchl2tVT!9LWEm) zQ`eqgk6JiaMG0_jkkEuA+>wiD-eGExmg|eo5v@*(_q969>WECc7lRvQoz0su?naUX zWhKEcRhYs8jMJ{0esJIq+O|&Q*IMo{c`C|+(W@HfWe}?fP4~XTdul&+hA4Zxzsm`6 zk@f2Tq>^%^7bN|E1QcXm0cPQ49v9vOhv5Is#n&5Vlu+;8b zTwt6X(C&9O$-{I-p-%vtg>oTcH5gEWiaH#t=S8^)#mcKlnze*1C_fd`=Wm=UBDZOp z_24G};cVQS{4LMwM+cY-p{JGzucDw^O}Uh*vx6PvF;ty=7t-qY4b8j{vlt?$>+BG# zNC@vq*vP`XLBRHp^L7)VVGTw>%I`><=!!W$a1E{l<_S7IXxS7 zslUmqsSSb!!g^36&VFAuIIx<`8BEJ3%sFSte7eCCl;1G*c%LkQX<}EK=TH~AQtX4_ z$1z>OELh;SDNS>rG(g8hVgNTN2O4L_q?N9BqIzk)YB#l_f6<}iSx(K-RCi`+5T{ABv3;dF zG1&l>ITb~eRf|fSE{G&aJ%}VsQRVY+#znpgUH*pRQK}sld@9q@ik7SW`=9rq&}y)& z%na0OKR>83wTch6d`+bdRqX8B!*SSaJzH};2}j+|5C;<+mCY}obr<$y3A4gXNm6Br z_PlN5Lu5dO?a9eLo&04}9i#YdqQ=iw7mmYrJ--VRTj~ zC}w5i4;IY3o0PIh&bn~+RMd3lQK;4c^4*BD6~>v&k!fHp*KkMW%Wv*ZuXXo}9a!`$ z77`!<`PHc6FXqW>lqOT3aA8JxMq7G)~{gSrtD=pCI{gf*g!XCTcnbU`_x8N;5Havot@u&3j{-h1UI9|J#{6gfe z?W@EAgW=tvt^WSJ-hBMRd2UqjPalNFxl)_4WYx}Sp$Qm>5^VfS$<8(!M2Kj1p99(V zAfkD^waS%Rc%Vx@KI=Vif={M^CsxyjRg}qE4d9}wFp@X(KLxT|S#>_CwY^`s@N%sX z`7oJl8=rT?%=JPM@O!<~USAnVnjG?{e|hPhQ~H(c3&@{bgulI4xO9-8GBc?X_O+aY zlLblBN8KrRa;ZoQHiU7rR3)4F+7WpRmHyRC1KI^&>8!wiU)n$^7R9(un$AwV{6I9> z7~oEv(G{2L#Rk!~ejBWJ2DL{VDy0V|5W8B6?fo}D_2`WF@~P&(Xt4y90vBQWjVPd2 zBTW8{ud34qW-#$hPg)>J;^V{n@O$9IMoz4DRdE?Lp@0~_FW0SYP%t!GNVy8#PL>)N zY4aWY9u5Q4IxfGCK0rVKY9^`~cUhIL6-h0h_)~>d&K{YS z6{)g_Ar0g#C8B_yLLc$ncEfv-CLn$~R@9BlO$PVc6C`J6i&K|w@JUq-#7$%7-7g4~ zmKuUUxC@a`$VuOg5Tz|Bve*web8E{}zBgFGhEk9IMOAq=_^qLt?A7H;S6*PBQax>8 z!BFva?I+d8Vn5SLxI%Z1zDb;fwOAL?-dR(ud)cZ1*mSZzw7O8inR52Bg+IVS2} zG|uEs!tBUgO74Y1Y_``D4{4ghy*eiBFmCtM2b=AQ9F^?cd9DN_7Rx@V{K^QUvc>Y><|t>2J+EQ3E>rX5VpBN7 zS<0D=SXI786@2}d($6ne5)Ad6XAq`s5Fv@yoR~T~T5pRJgA|bUmI`)6cbq2djp za@Bkjo4tx?HXd`eq3cn?^ZfMbzh)N#tBrV-y!EJAkgIn*_dZW*VS3Nn-Ha3=V?l8s zh-d7@n>OZwC?wANZ}+{BBK43n%p<290`l#KH;Ee~LWIJ3Wt~Kte`tw1ui#(fF`=c~ zYf&R6fi8_?nW>?B_ZdDZu5CNfC^qTo%m=Gr`HYODxdN;=6U_H1mPh&&YjzuY9UUPi z9vo3gaSsE+(jPKvHd!t|%?M11Q&U@0MI=Fg@3%Gvrtr7$OH~N0_d~*#M2ezrHNC>b zOv85pYkP+O(m+g^TpYJCvpI9xz{>-fq7%}flAMZM3=`yOWl*E{Wx$f_^KV4@+|Ea9 z?PA>K@uE?10BV=9`~8hQTf=7!z6kB2-3&N$*|`R5DXbS{U>erTEG$FDz=Q|77N<+E zLwlCXa6$-{4kW)S{^yK~cj#D~S6JSQGZ0AsOOEP3Y8srmZ35nyf8|5g!+q_;x#hCg z1$%?#q8x9yq^*}ihJy%t4>!T~i&3zOT_)7dAQhU9J2FIr5ffCqwR3;M{+PyC#(sO{ zv$#)p7~tYuGtt3F-}ix#44%diQoEnIAC2rYJ;4C)*(+=Pe=I*~p=a!GR(fXF#6tp(gXC=5Dij1;52p{2sq2`N$KEWa}#U?KbR7Yk{eEw^ORO zkFtoP-pUEqgI7=T)`<8Jh3ASNe0XMgmb?GnuifT}{Lje&+lPJ=`cIOCga7QngskU; z*9%f<(Y8raxOc*i_3p(9m@g+bXDBO%0R}vCnk|eQrKtQNO24DMetDo_ln}Y+o;@kM z6z?=s)pUD&_7yMQ$hA%WqFSxYz=QKppkxjNO(3_Q!hdPXov)?ZcMhCnlk^b&5gG-= zxjqkE74W?(G5#xEz8xowY?jgn6{O`DfaHZUJPt!$2KeLsM) z5FH1+a6<$*%x2E*@UKEnt!&AYTnzMt3E1do8L;n>=v zfCu#^Z^Nu0Y1Ge=Yx`7>%}~RkyaRVUXm4_)O7qwM!_-?wMHzSN!ypaPD$?B@QqtWa zA&qo*w@SBkceiwdfHX)9Aq+j#(A@+7+w(lX+w|>D?&IP1HoAFvGDp&+# z(@y$b;~XockL>ZH$bLGB67nyBwt9EZ#swlJtLdq%gf)xd%UN|KK*)80h^@)1FpOH7 zI%6XsB7q5Y61I-(hcFNdt|!B%+|a->Z|pKyySzl`?OR&dz-m*vRDBRp=WRT&Ns59s(&-MRwLO4<0ADFaCY{|xq7PCb+ExUJ|nq6q4gff?RyWV z&+l__SD^6vRRYNetYjADhOhudij&}@`PoTZ;#E(K(C$ua?!EPY{AF66M7e0$F|eA% zdF>d`b;(fd&W8{V>;Vs6QlO@wXTw0wNVw{#ov`FjKJVIhQD?*|>G?twd z3(~OBbUu4tFHmnTy`zf-&cWK*P(B)L7MK1D>EVxio*34A9}$S` zSh2j+I)9R>pfK8G>CNPx5J-_V82fRp^?m%YI?;#kE_w42n&q?I2{h2>B_lY{Beafs zFXreuz3f_ixD|1q2yD!<;0_0>Lvuz=USTxO2XT<)1XLF^3BtZf^)Wx8O0BCa@J|j$ zf7`XaP;dX8K_WSuf6X7I^Ry?*tLJf#;fOS=p;l%$EdXJH=|!8QYRLGKQVu4d+lUo8l5=t7Pz|K6}`!&F9yQzo+u5(V*|MH zrbCE$F9wTORQ$~Dg!y4DFzxFnUnQ<3n=DjD9H)WJFex3V-U9pucV5!NX$ z6YFaqacMg^X%cg=aaWQy0Q#4(2R&egSm9+_J_DApg2!O3rFE$#?kYqvj^^Is3H#HvGO~KGNbzor+(68<;RV-E67!v z`Xd3vcNr52W3g5|IUp6xIx14#bBD<=FVy1ngcI(yCJQaM)mt388X$+gCF{QC!=L2r z07Rdoj7cL_3X(j`o6fQRSCGG=15S#`5j_pIA1A!f~>U1XVsHT2Mpcb zw@6B3W5hQUd5oLKr?B3?-S-*{$HSd7R2_&D20dRh%6cN^33|WX1I`B=T7GXb&|aRj zFN`}~&->NnET=(VF;o!M<4+6iEN}JLLey8@Qlx}%igP(bZ!(OjXSPoSBB52iw_K)s zyE8T(GO2GXymATpFkW@6vgJq&9<`#@E0&s?q(%M-lbPL;K?ncsjR8Aqi&%nq_Dj*; z&k$4xE{C7B^PM609wWVPOaYWr)^+sLoOo?xi?t3Q34^FO+tVmA?UuwZE2R4EZ z0HXh3D9OK+M{}13zz246ZXL1zJdU+jLNA&nBxPli++w&<`m;evr-l|3_fjn zy#6pQf={HED2=K@*r*x^U&a26t8M&*{O@b_Fz*{*PlVbmc7>{FQWIykBU;x+{`ed^ z=7fO~R=}E#hkNpstg_4_{gQAVDkT`CXGaC`v1%J5^87ryKNiT)Zr}acK z16iW=87cL@Nr=5(PNtMa*AMYOW1(Q@5+ndk;nTT~bGFPZ>1|#nc1e>Ei9;S$Hu{&% z1D=CHLGKxO`FAdV>Cr#JT5ZPLnfe(;FEa2t6tL?w%>cEDC5tvw&2Kk24{56jh_8fBC?+smRXLG;%yk+ zrfbs5l`TQTe-Q5{&l-4|pZZ3C#8ZXop3KW1j$oQct?%oLTzDjX(cid%g!^Bmo6)19 z{qrYk66_O>?R>OrrSCg30&xf^DzYfV?Oz&CiEQ@O51}ock~A!ekNsi}jra6NEpJ)v zQt7g*2?>=)bUp8n21xwfRNQ_mvrO=(`=h)$98s?j5F#>=-VtCqS$skC`I05qB#!U5gLcos#2r&v4 z=#VIhS?>Fe_pBp>nxF8MVDS2B6S1}Sh4)^H6J()kUEK1J4iF3o9=#GJ7M(AvqeOE_hlYFfNV1V+k{NV1sRC)$Y{>BWt%mM^* zKT`A?@7+eHxBFre^j_6D@9a2jURVVYf3xj^ zXx^mN8$A)CR_Dplco72SRdf`s?Rx6{Vi`aP$c-pdMPcFmf!+w6qK|A$?IbE>I|V#% zSEU_i81uENHW!Rv1a8QB_+}=J;W}I+*ll*EwR`~xkJUyy^@eswY(%>z*JP||7h9n; z58pS_5WB!Qc6^VUmNbP$E|@c~Bu3U{m_=5|E~rhN320Jw3KR=+c|iBZ-F$^DS|z zmN*wb2DOllwg7m7Y%1~nDvFc+zagV2c~zp!t%VQNQ6qRDoAtM&K71*fF+>Bt+TRwF zK=g&ifAsBHBC(1psse4e8*MQ|@2#5t$zBlO4idRhH z9jFvC*Oz;qWUw#OFAOlSVUj$KDjCs5&$>e5dOj>gK2#7NN_&4ZGQInbc34YTB;J?qh;L7-sbq|)+_@iUj} zT>wVko|8+{amPTbHKwu>0J|exYok0R#r+whTx%7aUMKC8J!;U&H^_m(&pFl44`RJe zB3Oj1KCjYyo~X=&-l#aq@eRHmcKNXaZ*ccS9(=k^vrB^IomjPDXk>oNm#_*>*HQQf zSs(p`EOP%J(-t3a*7bE{Metqi3omWLlCvMox|v9g=&cf~FxuxlH(|Sw#6X@Z)(7KM zYc@c>dVHm}(v4|^)2GPgA4%)|-6c8R3r;JP9p~GuqwZSBI~qbjy2u)2j6;KncZoVx zi!kl@yr8H&B2spP*rZz2dQgIFZk$Kv;Ps$MAgkN%*ohJTtM538@lol{+DnX#<4-F# zBc^b7?sV?<9)E1(HNOXmd!R9->yHF=;x+I*_=W#)2i&^MTGDWB-c6v2@G9S#Qe)T* z5s^D}1c(s1W^_iBSoMSe33Vm&;vYUsl&OCMkxO%&$TqG?6wQ4naTdP_nK^bY zCpm?K)0-6huEBVh;&!s5PoPkNh66ySaO z+XoP*!ICsww1mnB5z0x|jUHnQxFsyI+YX6>Ilw}}7I33;r`)Spp$(!a;kB zi0%(9@Jol^KfafwPLrn1lWx_O#x|J{<_xy133bdHrS&kM4^&vfCs}(&>mWVMn%?)= zyg_1ARiR407+76LZi$UG&0cbu7%9$b*5X!JmNO?FAB*|U=ejafujq`=Kih)34rBK;&08EAC-nvqqOEWKyc}0AV(aZCHKdFk@A+S_99QB%KxC9K# zDP>)EP6)@kI(T(42zAtSF72R|{k%FlrO1pE)AIch%$3>9R#>6y-e>j#TU29Tq!fhV zt2ilN%9vpX)wF#)TT}yA{Z#KYJ_YN!#E|$+oTIUiL;r!WQ ze;>cqCV;}{nxS121}G(E_sh7Fh?>T%yAu>?JJ<*rpA41~EZhqz2M}2ulp-#5%8q+?NR&y#+>6hp}q{rn^ zr(37GulbycLGp77Ejmkvg=}D)HT!R7YQ5A1eM6?N1Xsite|NQyA9AhAG?!)Wu17V- zWnSH?$F$tQC4We&{b=NI82=gNG1Fu@=c)qmXlSA{UHIM72g2GnrbO13Hrmgi0`mVWk$WN>l6iiQnptgzD zS-|rlb&1qj-Bb|g7OG?8$%H9Joj=MI;^oNqCIlqzU_2KjT)C(fJ{vl~<*#9cnke=* z4ItayVk)-V!%V-y)mr$1CzLJE3)E zfS>Q*_W@cz-~m{SUeFCLz82>yOr-B_x=UuM^8PRqr|4F=1TnO3xGSQTAUL1twT}dr zvDNShauj6&8Z(?i-J6fiS^AS$%H$5Y2iDeK#5NM?VWWcbI_gQFX|ywmU?q)d3+vtn$jrOa1M#6IH;dSYrG*H?{JybtN`5H%I35BTtuGPwP7#I?) zBp{Apmv*;F9c-cMo65`$am+2o)JbTEEbpNdEX%^!z;yJR)v*r0@ZG7~pQ+&To!de^ ziv)jvP4eZWo+jRT$8`#OU$eXKBIWE0==Ta0{UGMP!s5Dt%*)Fx4kW`e>IX>;Q^mEh z4uNw{^)#JFUj4+L)Ix4#iD1zN7C4IAeL60$z^JDMNl*{9+$(@zTx~+Kytdx%iGAHh z2opvNg7HK3>akExe_f?afu7_Vu>Z*$L(AT&i`0B`vv~|1wBwFonWW@zjLV=mk_gQn8#)NwOzfN1SLe<7wXh*|2flx{&+>2oK9>}ekscvx*1 zOG^v*`$icj1lEH>|2=VG7DE4RgbY|qkknJIg^?_dk81L%BDda#k`$cncfQ>_@~_8 ztqsJ5`=Mj_d%_~t2y1d*7p7M)BIOgW7+;txzigWWy+k|y>m)@?H!L)?ei63%BiQBY z*XG%--PQ57{BnU-;KW7U$06QoH-q8erLiGy77oj*!Zreby z$%sZ+%gJ5@7-VNuEZ}BB;;oK84P^b|jW%N7&+oWs9~SEPj>r^%J1{g9QW@#v$75bh zFaWfsJ5@L|mwd}e;=i{Vd&AF;LWdtn|AR0G2K4v9+y6%gK1`LJ3%4NhGVHy@92B+v zg!JHbuK0rftzFTX|1M#jAjfg!+2q8=S|CkKbpp^(!agpEob%-89Y`Nb)%{?k40`c+ z6X!Kuy$wtcGlw4P%sW5t8+(64gN?5)$$+^cY~!MT2gB@`@0oU?_l{m|Y*@$t^)!0Ue1Cfw?^5`?gxXyZq6mkE2ENfUI8N~Ks1&Bp7Mj8f^}D48fTL5=Ba0HxMgK? zf%o}MEaOjPBK!*}Cj4)u%H|8^jOxk`MnLK`jO>D8BkOmcnu1(7ob;ZH9dMX*RaYyU zCIAZ1u$K^fe6~UZ!^H6ZXl>%PgW`jPe}p}&`PkoXj|j`=Z@y5(Nd>a|3FOQ&zm5(( z!&jE1jN(=c5rgJSq=6GU%YRC51Orqrf!1J&*POS-G#-H z@<&5F7Nn^b`Gy$6L*)y5`xhq7JA8E|cBAi=H)s0@H%$y$XnuIxteVB&P=KC+OMg?>f7YlLK{2x4Jj8^BS~w0?+=*0 zwePov9993FAQ^j+Zvfl&TfkuqqmR*=Pn48og_2KbhKKEGp;s!N;QZwF1Mic!6T> zjk09{Pf8?%*_fANFcc0oiC6(CEZw5nx16%iW=c|Y_`u5BKqj#&-uNE zc$o*i$l98@C3BTs$ANlWp)r}~eSexo)#y2L=fstu+fn_y#e^BDG?S%mfIlL|ci4`W z?|z@*cr0Gj=gBJcA$HREgd!PT%r%-{z?)wkya|{oRQR8Z_2#HgS!yG62-|{r@zkV($l6$T}1V3QZ2)wU9=s z6o`^4Ne#O+hP1hWm(1W&!z?ST;L>$fv2JEyyrV6WaFR}D4aeDJW?5?Bp%&!>R1zya zN88p|TY;d`mP>imSdj(CY#N-N@rkwbj4aQdqoeC%1vh?M z=2gU>6{sgE*-LDeK*%=x*-LR8wbHalOQuj2{1lkLHMe~iYZ&I{e6Eod5p4NC^RWYXqI40O)KTo>~wN0YyMpqMvhp=XoPcTw`i zwWu&Yk|-dX33&W0 z)7j$@M+KC=kviFtG$o+HC~Q*Se=y^XeQHQp;xUVrJ&%#unvXHdNd|wYy*xX4WFT|Y zo9o1=FQMOzEv|oBaiZq>7=3lm4|g1S<7$Z@ToQaV@c6ga?VnaOO1lcn2xl|0nDWt3 zkgi_cu~4gu66hJEMuDtLT0O_)Q!`WzZlgrCsv-u()UT;9uF8AColmi^Sro4uo*1*j z<dtp8* zmUM8lagXgvAp8b ztbot%Q6qrmGw_tmcNL2c&50&9m#EmhYMwV&Xzb8hjT>vZI&f0wOQVZr#3OH$)g`uw>pb6Pa1t5UVZ!2F}SGehDR$V(U6|Ly@gWT`;$tWa%Qi-5oyXS(#{7 z7PZcHu=QkBWX`1xqVsvyE5coTxpL%3d#U^V0u)C>seKU*OsPBdlmaba#E!Ay&h?$U zV42cqoeOVSJi1i3zh*!O$0+lXX%GU*iw~dtm@=b@3O*?4MRHm_%X`7hsZj~i;{ET@L zM+5pC+s~mS&XhgxOWrh*pdyescU;5uEk!%uKF*dy(3jIB9XnXjzXP=8)tx&9(DJ}q2YmEA9Y8?1a z^O$6>24=)nk?^;5sqomb@_VB!dmvRb-%VdheotC#DtRXEFY_CuG|kK%MzL^DVI%3{ zJ)Rk*KK5@{hjPz_Tj+&!ZF~jSiCRMUSC8klz>^dM)(K_X+hJ>V z__J+$UL?oREuyc$6C{Uu+Rs!rtB-0isw%G~i>@+%Cm?b51^8X$kPnX(gStg2qFLeOI6;b_eL3S#X82rw{fzSd`)k1tOdLCoFnWUFcoHv~E^ z@e%PaBUp^!^K+^jSQ_{7`l40%Var(}EaNPXIdE_&r_&{kSpxjRDtBdF$zL7$KAwdk zOTAGPo)S(#hSOBBbr&W&9W6C{#C<%pAPU0xK80CQvZ+#~F%G>+&#N8WQ5lTc%7FZIsojb4DGjB1wp zymoO5VYDGT??(JVyjAu0AJ8Eo9FcBAa?w-ve3u;!JNB;-T2N4{X}K_^?q^xc<4Vv0 zK&?>CrWyB-S@no;kteiA|MSVU-Rb9*iLL`od zk83mM}5!u)95TaEj$6ig{?uwZWDe9FPbHNIs zLZc}qU@Q<}qFDka7(uw>za9ozglW7DYgQ!%^zw~}?i9O{A{w)?+{N+#KIBD4q_m^} zeGFAv=B6yY)W<$Qvs&-V=?y>%jk!^Kr5j}XLFTr=ueGs*OQ~iM%C!SwqAdkuBIV{2 zcdNudv$69}J2E84oOt*p=bm`_x(m0jc6ka@?#tAHB?0~%2z(*68riGq_zpCC3aY@& zwYmq#KnrUFasj?d z)>||DlzvXzK{I!-RhHR26KXRLaKUfP?HUQUxfLrSz-hiEK{4lZW7w;d%Z-+BzBp6$ zVYN|+bKBTBCePO$g=`%6io>qpnyY1YkJp5xK0~+MABo`Mbc-iX@S zfeC4cS~>~u9d25MRlJTU2;2-KV78(3VMD)i!m;Zr#t2C>m)`@ys9^r53zVAHs+UnJ z$J-5{pvTG|jIriGX zm`2I@JhljhsR$tC?SczVu6Au2_DBGyGxTZj=(`vU37~$%fR<|3OciRf5n&Vf<@f-X}zHt&4>IivwSwj=7%}T`puX>v+NsKE$tf!8I=yw zeuA}ajNH>_n`I6b+ElnJ-B+A4&S!?WD9t-s1oZBIDxJ{8{M7Y>LuRq9D|u8T=ITrp~XMovy1LjZnvsq9h>O?J-pcfgy2SOfu#Y}?i zto7l(9M%YvbiYsos|Hc0Shg5GOFwL3oFSU=U|%w)onHY9#w}HgS}q@@LA*}pC8NOA z-px{?GUAoVNB7s2+iuUVwIO*zc$FP$?GEA6mJ-cK{7M?0qK!Y8)Htcjj7r7t=#0)h zMzs^6TWkCU2;~2uI`pMQnD~(Zs&VAa1*CkG#?mzF3O7K?IF*Nf{Jwa@yS_XKXfC{r z{k~4-^+c_lkOJzv^v(-B#3ip%R~p>2PKp~JWmomw8*zED?&5B(US|)z;i1fgne&o; zscPoV*RQWQ{SX?!3vyr}e&t?CURL$AD{m%Y-17Lx^q9H6&Pn>VvOBt^$UmbSk2PMr!yj-aB951^0DQ`?%JQm zT`B4(jxsxmO#6jFRXQ6TF+`o-o;;TV<_}x`OBQn+-ZbzOh-;UpD@~E`D~bID&D_bE zL9}rDJD*VKys9BdOa@E{H8H=r71O~;XMKW}A(lu11^Y4Jlij7gKJ9VrT=ZKrN1;E( z8m(90Fc2&B;Lk`pLcWwE!`t_!153{%TrHN_4f}XFF)Bs=&g9MhScSmWDAY0pAiNM* zjIQhc5&h}%GsPGizxSU+h~=<6USc$%+2U45hh>_Hj~g{Ekm)0v+E~9L_py~~spcVn z`8XH)jfyv_9bqnxOnAX-3Xf#(*S|EO3E`IyG`UY)??f+Uuik%nlNAag{?1^-_sM58 z^zQ^ZoBwk>r5qcqz6uF=V`tUPniH-qp%;y%HFwr6qPEEaVvB1xkJ!vVIBn0DtF=Y2 zuoM&zH7e0b9If}LBX<~h1M6c~`Xn_kbxDLfB4Jr|l3H5kd@37x7eKfY0A;9jBHZvu zyQA?hPf%u~Q#_u9B+k?iqAp{GCeG+P9Uq9$FQQnom8gv*<0w5)b|30)!%Zz7W#(HGMJC}!N# z?HB&Af3*Lh@e_V=ZTIUX@^9N{g`i5vN&NF`g(_YX=Klr}B)#K>cla+Z#T1o+83F;HHwC_ER13CHxxg`8-I&On4-ubH=`&^!+#vGe5} z!tf0Jw4E%FKC=pfwE(cVqGyqFSNKX%R{7_Pk<)cqS@r44G&Oc}N>n`m3OD}MKy249 z=v_3_96KfdEZoo}3&Z0r^eM_-i?wrudwDrpg(gw&1<>C) zy^^EByH(eML-+W6tvf$Sm$h2#9o4j5;5eysqsQGcP*03s-?{nuG2VV+XejP>P;h|^ zY&YH_)WbtEiYJ|rD5oIwC{o#>@&-M$U#qQdg&>mtd^>ngK0m5h`Qrt_46dpbEnddd zrC+WRMM9oz;_D%SM~3(e478Jr`*FtLYYdeKWec;cJh)RK-oppZJGGktAI&2>YrX(TPRt7h1E3K+f zc8{NMSGbW0{3#Nbf1I^v_sNu(veL(0;K@@VXYbAymT6(1POcrU%h#?YhDFy-xkT7x zw(cBb*X1tx)A@`P^-I65i$L1N?W6L{s%96UDc{uPVHz&qzIE~c8R@x-)+!qHdkm53 zp2)TY+0*G6Z)d=e#lV*+A%oHTQ7;(5ar>6+7eUU@Ji9*vYwK&(moCrQ`m3bEIcb>0 zZ`|lH?IR)RVn~~)e8{IgTqPE&<+686LT@hGU!nVH=9vyBxm;?yli}v@`4|W(4l81z zt$JeLu0M%19G?Ee-xU{)#9eu#EE{7jYdp6e-0vZ6ce5YxakG2UKHQmpqI2hl26wrk z_!+$q_kKGwT$oMcvvbZ&7nspHMU|L&Yb2zSy6b7!0Lm|>2JN1ktlTyquothC$M!+} zDhw>f$ns37s(mzG|Fmy*Va1)X_-gcd;5nzY{oeJY;`0x|PUOh~(~F~|GnKor8#j`$ zOwuYJcaGJdy}F4aZO?-2)$fbsGUkqNpLNiIL<6!uDEEU$-52tv+^`21gp#Xwv#mz5 z{2o}2#_tm}t)Do56n52Igv(MjZeJt1bqS@e*glz$ll8tTqmT1F$GL_GMfoAM1(>|K ziLZa0QT^!!8AesD6Fa|ebN?Cflg=WA(9A6RT9+#z8@4xdSiH7hp;Y~6@aQqMF%&=k z8_jYJa^|F7(5DkscB*>*{ze3N8ZJ^PNE@0HOX%5zfD)UL42NK7(duKm$jh58f?Omx zGld9s$Qr-db@};kf=}voF(2wc5iYw^op3=L|AUzPb%1&)cs91){M5 z{+iN|w#eyZ;~?~<3dUYEKmLQyzML>@Hx#Aycd0^JWU5y4Wepl^IQpt72Ey)M_*1kD7lhq6$>u?2amHc`}W( zSQ?f`KeLbLtZVzZW=XjavhFDJW04Uh_IT|8wb-zQnQmO-D&3@0gC<>fwsVeKET>uacKVcff^xO zm;q(-)$a?Yr*qoikR9AM_u8{^2eAoo!;ZQ?+mc9pHtCN73reWH79F@aKEc7uGq1+` z05ZT7hh2p_jNm+`(ze1zd5-zTI*SEO@gf9E{mDh5rwbs^KXu5@uKDs9?Df;@P?^Qxg^5NL(N?Y(x{u-K^1L%exR-2D5nxJ{ zRT=}mR+X$s;?zi{cNd9xf8#P%SZ|l@%%7vy9S8yyYWwh?+#ePPM9l?@9uQaR&w6oT zW68#$UA4zIRcO^J{5V_4gHdAfiAZ_x3Vo^q){mLK3P+)(`JP445WZtx zHJJGWrnFx42ctde$A?mR9p4;anFwz0>-0z)GI@tV z?`GNxD&W#AEk?C**A>2VbQRalJbf4i9~Bi9Tvl&sOux-mCCGikdza_)N~M=LiMdM7 zQ11PyBKM$>QLY04Zl}Yb@sv?d1osq-DEDRebOY+-PkI?IiW1Hj_d8>>AiG%CraP#4 zGoHP0rkq%HJTLWbcZb7CiF)r%YL_KgZcbL^laaSSE|5zCoJ;D$zdj>Yu>)Lqe*O<0@K0^ zdu_Mnf!P5k`lw3#e4?UHV9|k-8on7vP4zFiU*c)5&ogkQbHBa{S9~GLrYj0CVINzH ziu9s8;+~YnCld6roYg7QE2s9L{AO8G(>Uh=8^+*)S5DJ?)$xO^K-Z4C)$rGm9$tbu z&b-7bMG-vgp-$Tt$m1~eWQ|nt#Lumu1=ZVjv-xJzZ>-wF?HN7srsm#zIs5qYcRbQ5 zV6V$SH^KjYjJwPzSo~KOfY8u7<|E=?|5GD8{Y(1~FND3=f+Phm~+kzY#n!3VqaGlWF2SZO@@{Byvf=lWWtfYZInMiN!h5f z8nO>^#tIM7?ndgLgMUbiK{=F_V^Mv7&EZ!+1rr|AXXESXdY2-*k`2M_d~m^H=)L30 ztE4`hMr0t}Zf3DUha2TiqNB^4jsPNkBL32f<9nK`RJiOLN^IcmCL5Od^Lt+`LT|o2 z91w82+2A_MA!pdl1?Azb`g@V;)rA{@pLRrub38G2R@n5K>1fcL{eb0t3Ypf9#(DK` z&lfAAUF_H8^w-Y59OmxI*sP`21mTt_E{DqUfcR|oZU%l#SW zgx`acjb=;t4__WzU&-roeIt?SUo93 z=$V3Lgh4Gz2j5DHp*{HNR~dh@+=Yewt%z%U!BPVnO zm+NHC(>g3Vdd9e9WCx@2DWArR7kQ!ZbW9lJ{RGN*h0h|#)g(viPh{z3qGRx$>XKc` zDwq&|@pV{BsS^jjV0v|t4aa<0`HF2*`{AO32fqc1KQ23+2J=u)hdJLac@SD!(6zvk zs1RZ{9!AHeWuf7cM3?QEnAPS zMd4a|psK8hhx@vPLGeCQ>|nIc^kJ;d^k(_<2AUMGxQxS#(V{Xa^XxAFb&P`vpB)wcU4%irt*BpPdn8N!;A?KzMVAj|AdQjCuHA^2r#` zM4PAA^e7-?tw+%#y2WFVY9Qvni=6)@bUhSIEcHBt(stgxE_?1wkjeX0ByOzpVMs_q zjCk)@Bv|#i*Gsk+8CB)($2v11uw8qB>wKo!G~n0n?cxj%<|B3ks>(yXyT`kE3DRkv zH#g(XjDm#SUVFbNiXh{hAlHkYhT+gv{YQp9CP9nUqxX5j5ZKgRA`Ru`8P0PB5>Eqh zDa35$`$&~~+{_SvnyKc+%|0vAUI;o~KD^qv=}`a6K0tom zPjFqRZ7YV!;5^30^Y});#vq(N{}=HE#p6Dzp3^U#`FLW~L4*+z!S7od8<>@9Fmw_X z*seG~nV2Vpax5I&4@;v#>#GpBD-32gWnKc_gARmn=GQ@U(b_dg;h=BYHL*}P7arS5 z$~E2V!`?7$e@6($plXf5P8u4$oW`iOCS;fq}r z`sZJKk1yNq?uWx83^R{ceNRPN0?(NahLPTQp5`yU6)i!B)2oV8Gey&2M*G*R1}I(r zVIdS`3letB0ZB2LDEcIylzZZG&KQOXZ@ctC?2Uh~&BiotxfL1NzCTn&y%CopkLEY% z??z{oiz1|tp^Wz-DN`z!G}e)>S|i*ll063VpMGTHTP;6Ot&MuXjVBg{o=4p%Hz^AS z`J2pBls4B|Hg)!Wdsw0Svl!L8JF`>>%g~D|&~@nF{Na+lDqdH1d#%@OpN$V>JHQb& z)rMV|kYxeZnxZQ~gDCWH=9s1CkO~o1iLX&@W@Pab4F`oiqAD4GiiX*C@KRvx^Xq`z~R`O!;$PMb%%W_b9}&X03h?M(8 zR4Lu0XA}bI+q9!+TGtWOabF#zE()ML{qkh)s^cER311%wOz(2-y2pL^5d}sQ`I3>s zc_roK$M9HIFPHhY+a}#}978|!D&l6>0z$0V^L>+tX8w>K1zr&;+`k3}waWW|kR)bn zP2V$Qts+OCi;ozbSdf2HIVu?%CZ`8t2lphX#foG7#b;htrAyPc+C7QZUm%(?tD;}3zfu!ek*V?#%=oX>Er`%W^nX=TWn_*{YF2D{ z4}w5rzPS>;K4fl7xM@w&V84r!!?tu4Bq8`nRT=46yIpk_+CAbx@Vd7BQ+ZKh9noQ0 z<6DNx80{i6Jy8#lIEjv!S#czgRayR3-bhqwKQjCzo72LwTuz<@W0Ir*>{sGt$~;A( zTUDt=?gruoG5Hr*Sy1TF1DjqfR!kW;VQPj&_L8fke$azX8Fh+ku@Y!f$hYa|XRh-C z@-n5%0-=VK5_TJ|Oxa>QB9}L`lZm-Pf0AWiCGJEqnLUrPe}QJynVmGW2VCF2|JeRtw!8>a;z*!UK>hEm1g% zRv!efprAg=YCpm_P!y?bf`))CM9uG?M35az#jQ@xPH|`tn#$rxx z&{KZa3?Ln&m#UQSbH#va^4a(S-IHu*BeI;HYR4xaHBP z34D+c7byq#qR>13_J>z^1R~*MebjgTMr@PaFB{G*+Mj>NfVx`dJ-r>qQd#S0)2~OH zUICq%$sRA<7hrHrQOVv zGl4>#zU)AqDDV`25!`L(q263g9hXJQbbs&GciK3Ke|baxbWKitM|Jo&wCQX~eBsvh&hT~PtC^Qn(gqVOMf0=@}H>{#@kpA<2?>IByz-IFoGak@v)O>|<&&yE8ekX{G*yh(bqqd} zML86}UwsXC?~dDOhh{B|nWK%8h)6S~M0hxyMz8iq3nvS$0Ce<~BjpkMik&UVithD| zt}7gv4}=V#qnZXM-+!d{3ixe^Ag9I`WBSh6a*T}JycGp_*w#%~znC4BC3s!TFDJ{N z)mX{$!8TAZr$lc?mmBv0P#7*|=XHx5&85k7J*x!8g*#I@;`n&+xfbMeGf2(?CgUPa zO9{1bKiaDWR-xga%Kw{9ClI0vOYYQ)PBaOp;m`s~(>r<{IpQaJaQjbYIy((Il6F+l z;)gBcEWDZ>Y|;P9_QZ|hsXyf>dcDI}r0 zq8d*DNpYBP!$&!5BHJ^LW5xTjHv|~v5Swq!6R!BVkqSv<1hU3g&t9Rs*!S@nu8>T%q-|#vd`AYa5V!hQ^^ahozsT(hmC!d1Kz4^a z4p0+&y?32Dk56?bT+Od)7A2e02XA1vGnH6v7FI7dDLGk>sffaL$JTlo&drciC}%1g z@nw3YS{voVf@w~5(GD0#E$>4#n?ia!N*2?$`{N-n(?}?~l+6FSl ze@@@FL*ORoK<|aYA93U_^4HY-o07XG zjuFeqS1w8*9!(6|m4{98KE_T?&c=vP=EjlF#Ll5YFgMsn_X-&y+fpRAs`0PTw7_Wn zR(Jll?4Lf94fhQtaBA<}DttwBUp7=MOr>+S`IJ6~jVptyVSm*Z3qKRoCNP38af+vx zw5=cL^kYwmD6I)?l0UCW>4B)g7Yd^smIIQ)T_M@cF6LB0eVeMf4O&vPAWinjrTO9? z3cRk+lW#MNo=#RVHjFxzX)yzXu!f3U?1#lDVBm|Gl=9JBYGDqZM~317p?m)-N22v3iC~?W4=rFaNjW>ut)~DvDq>om&jE| zCNyC5Z$Dn!kzfd2>8L4}j56y`*m8~t8`=O(gGW(iZWl4oAK7{czG&@^}NF0 z_KYw-yl?b^!7}%#w?Urxey!x2{9Y{E4NF|g=t;i$mp_i&LQMT28|(jKuzdR-&t1xjYNH?tN}8k8jV+Z#7y&VIpXs((zMGo1R!BeCaKhtYz( z@#^n}&D@%efc8}geaYczi~Sj&*XYH~9`;nHCLk!`Se0*lX(!AxCcEDxyPl6Ual}iQ zq>G#vvq|(JAYO~?VmZxGqak}+bhXDk$o#-}APT>gsg>A6$p4VH@?OYQ9|&yYtcvMu`aMcPtfca9a7j7u|2%I>w9&iiotJlqFGqE1bRc=5G_o8x zZQN)-0cQ+N8E%y6+Y?YBy z3CzAMRQ!Mq+Y-ju3|Grso*;S^wUo>7GG27 zO=rx%0C7po+tSsQsM}`ZCL$hoXz7_8@?;o%4Gy;>rI1Nf#0zv(VF6Zlv)VB#HG$~Y zRLyNcUH7M%($u}Ng97Wjq?)2!A@USC9Y|WrWdWTJa)!$>gA*eY!qcD&fOC z)Mt1i{%$)H+nXPz0K!e?n=5&8oXGxtIu|`U_ZUZub6My@Sj`IyE0q&(vh1jYAff9D zJz(MmhhI%cq5b&7C_kJk<>-KE->{CZ*g+xJkpq8|nA!u>4mBWfm~~_$dWgbq5Akqn z<;xUb-g<+C2dlQ6Jz@E;4et4tPa-x6@u!0aC`Y!_8xpj=RGf%uddj7FAMsiKMI!eH!J!=@P7}b~Df1a=k)rKI0zFE7ALkTX zK4G@|+01k6w)^)2wH)zf-Z<3|eUf{!Wjo8onaff4U--qxJ(gQPRK=RWSjtHhQ$R?vOlZsi;2U7+NDDjC!75W}vBS z6rMfj6d(5s<-~QVXwkhi_>I}VDMU%U^s6+>1ri#-5XS0!bT-A!y9CvV-cn*wcn43O z2m_Ue$}J-6#QnwEaGf&;&C@I^8jR#b&yksOyb}SD7ZYEJuQpMC#)xo5rpz_pV+oYT z=!R(r9$`ovx+4$C|;H=o6jK<@rfw-0eh zX361D`FZNWT~%L2G+<4?m-#qkcI~NN4p3$-o;)M{m1u6) zZ&bp@#M*#g!0r;;wNEThUF#440QL6JbibcRIYONwNXfN?59}EhX=}L@SDU{cg~c+w z=}@>dr4KC%$?{Z$KU3Gali2E`#C6%+77+e&1Y(5ofUOVyplZ)3Vg%+RA@kyWmidjz z=%$Op;UbKvsw8zUXyjjL-1YzQXG*jlrKB~A7|V~T8~_wwB@NP2f)(2HrJlim%A_}j z#_hJ5zy%f9>q*JeR0IS=(zNfDTWtAKu?odsj64c?U={dS4%rZeUzHZ_PJs~#>plKP z{w8$oxxkF3?Ek8$r-KMBIX{WGZ0>=SFdZ&n%Ib?1a=~=gZEAlSacXdpLt%6?lQP$S zCjb!9KVy9OmO+Kz5s1_(JltR4U5GZFJgtI2wWJx4qv%um!drGQr$M(U z20GO7V?55F^^#4r(P_;H#TN^YSZUixIazIoh9tBgK$W-Wx=^U5sA$P;Nx-Lrg$Mnd zE<)7P5WrYYUK$z5ino)1qQG#vDoUp1`!&g%Wq`zkqQqSfx5dbKkv!8e-BQ1Jb2|>; z1bVL}4=Wm{O6r3e3~)GE-$QfhXAAb&L-Pv2 zhZ(u8{ZIw9t6oRw=J=8|DD)tJMV(1OK3xuozB6NY+vcYk6Ai=|^Fg0&Kl@gq)AUn@ z!#v4ub8CPPC=fG_@u2HCzjsceEe9VmiU+oLfTrp=uq!!KUC1widHJDuIidH_= z68(`##-iI@1<=B!9qIh*_rOXkR_k3>e?mP)%s!!sK0#Oe-umA9Zd~6ykC;8|h7NUL*KwI38@>%n-EiZFJ>6ol!fkf}M92$Xq21LUDaZ_EO z9v!dMiOGK|5arcA$4@*Tf4@-xCFyN+R{kM+z(hAq_x3Lw{NwUxEoPbe?N&LKOKdnrIq0CKFR1a(UKlC=jLF{)h>pAzRkswr za3ck3!ITWv2iP=svi?nxT>gKZ1An?Za^5!FL)&{JPM?q+>wUtPt|=EHcuWDNjK=>= z>ax-8=bwvzG73q|^dHH)$9%CuMGdVbt{b8>$B?4~x*bc#*bXm{tdda^7W14Mnx%kW z^`8q^v{`chQ3u>()rs90o>gy;PzGX!|GTem`tii@t*--H#Q9eoFj;0-lqYxOL zf_7|*_Ip3GL-*N-k^94IRCdo3Qo^#f@VrAaOb>yJ3G9gye1IML$7DBbn=@lCwLUeG1>vA~#2gV9GEy0O>6o!x_e z9@O1=C>Ftc-He6uAIb2(K$z>ZMKnjX)Go1`JnOLocq97Tj+cgC{sB}sDs~z@!#yZ< zc1P51_w?f)UHbTP(a$TlguK=n8(PJw6YzaeLPdXKuptPSrm$(vize0{%SIC$bU&8W z9@ucAeO^Yv!)aiil}`Zc@Id$?<ub$%S((Bae6Zg*TwgC;KT7_ zrXn;ItZEe6l&(t{ZhVE@PMa~G!*#>?epSdt-mDo|!_hxwt82KY`%U%m4*z-@dY2sM z8dro|JDVqG74+bBt6DdAHNU1zg2JYRp-Jc0i~yr!6=uqmAhk{OMc3R%Syq^1;+y=f zR!J9gDT)|@?|05$G6ISfQd7D+c7C%j|6SU)aL@n9z_rj%F&oh)58?D!Fwd_HvypaP z{RCTZW}UEZW1yEhd*hruJ|V)1EFNHnASv(y1aglW|P45FoVRySkh#@4yJwp@<) zYQGkx&GYAoNNUQ1J?P|Xej%FyfWxorA3I?5@`Xc7oz7%+x?Ij7KCAKhFUiWNT^M*L zF87}n8j?B$eJi_bg857t4dMk&2lPSHa(Z%u%wUCG)b+>+r&mE(riVe><-4p3Inc@S zA=Z|MMf>XllMuEN%2k5t}Wra`%b|ZP8m_*ibuM)cz*uDcGZthZxGt z=RE036NE0!O!a#ozK%1)TtCE=GU|YM{2~JsrX=}oU{l8@_Dv;O^`9>Hjh6DtD;?Kb z(jKkeR>HboI4UOOu3ISgJ0{=e|FMr(D!6}PfzbqsIy8fmhV1-ASCHRxKOtTz=uE3J zDrA$vLcF-gcGhZNwEcLGpRPf66EYAJK$A2E4(V${Dk%Aj7i_pbuitmT^n?TJ83HKU zN=L+yvOnG@(PcP;P0fp;ov?nm!$nefm$PtncsqgHSp2>Pw+2tfZ2myCY9XN&-^JyN zLL5YIo)62m7#BNaVCoeTB6ZHzH9)k^!0C%WYLF_2ubNg8aN0~Uo{Qie+aEv&CG-7J z^_6-F9ev!2IcS0c9Ls*%a|91}N#IY?dZ&6tN!fP>b^4IhX6rpA=Tojeo&2QB8Q?EX zEq+(Y@dF^;g5}X1D$*r@F09rsk`W%~I-7f-KxcF)#CxKqWO)w|NBonCsKUB=rh*Dg zt|yPTN}qP}R9%g>;R%(O4|bhz(>@uGYPtT4d{vYDPnlT&>gyp}0uijpJe&UcxP^Kb zSMn_&|Czm~F<`~P=X`#UWSS}gLn6Zp)%9==*mKq}Lud)0(ecyNSh4`u*R#GBz6BQ2 z*Rj002i>Yq{_&(|Vz5Ss8f`AU#bf6yHs;TmHHX}>*C$5XNxorcOPYY3!JPLBJdL06 zb6LAxtk}nz%zx%sOvPKd%RzqlkhdP8!q&9B;s`R3}7}J zjIOX$mZH_?oXBKul~J`5y1wT6O832k?scU6u5oFh5@iJ6Pusd|Z>v01;93^wj00@L zX{LQ^eO)1$7EiOjjS>Dq6jar)3Hy)FqX-Dh(&4zHZD&kTt+JO|--bo+XuH+R3>{${ zbh`!e!;E$rr5c+mSH8F(UDh+&wJ*Hb!ZytG!i znC+2&quMP}jdEi#l~=0p$NcIEI5@Yl@llic|>BuO!PQ(WZ;o9kxk zo@ReJqND3k$TQ|U9tw$T0)f023`|+vuMbHMRfL@Sl71@{|?wWm{3IIJS=%#e< z%vM|FE$*}D|A+EG3(~bZaD-S6?4e# zPjbNk2d<5qV~bF_x}-++)dz9N^VGUEoIxSIxuW6p_Bor$BOcGz4&3o0mo>i2VghRU zNEK(rBm)goCJ=w}t1LBZY93yQC9D6PmA=%rId&X13@UB#>2r0(0Q}lZ+&0vyGwydHy>0P+?KX?K%D=LDF;$RD{}6P9tzT>0E_d1 z$y8|2Uc}wjf0Mf-Dl-1tH>ZlNaF{hc)n0h$a#>*h9-OwfF)PO*Eo2+rUoOo=dkEp!dJ(@PN9s1Xkg-1T{#(&rM8*UE zNjr>)Z=n@(N3YkBWafjpKF2l1iptF5)Ur9g9j2a8VShysK=%cZJ0>=sah0`Q64Vs4 z$bbquj>z)oSx!l3W zXH^0rfxuqStS4@9+E&rJ&$rM5nDKPFRbznjcnL9FAh*OGY7!3!Fcw9;u?!d4lV3@o zE52*8N1q5BdO21~<+DRNDs%zJJ3T;urgtO2k$vlF`&Dudm=Vu&hZWgB6k$iEc;>)= z2k!uM6>tzq=9~6fp8AfSp-~01l#o8L9WAjV(!4&|7gzmZZkj>xQCbS>wVUp{Z!W>t z#<>(DkX`2H`g36(n(h22 z7@mMoC@UAwjBeeTKND3L^^`366>)AgZ23jkXFOX#kBGZ%{UY@JA%~{t2SPFt_#31( zjDQJNOy{5_SI|hZkHjJ}CK`|j%X@*>%tgVqVWP3RZYB8NC_TQu3dHj$61W%Op(L z)~!dU%{4aKC2IqvXNPv}Cf1^DWL-WP;&SOpVy52qP$?KVN=x@=U-?J1%eS+Tm1SUK zms~dplLPWpTrQi){du4khKO1Lb)E|I2@0Ku?Kt=le;) zYa|i+A)_Spa_PG7QFTUV?V0A93ec#=jNYKt`{#IgGLOr56BN|#DdGjw9TT?bux<3O zp_iuag<64aI*gtV z@Nk>k7uycaK6_r2u!9VCK4VBv-g?iLVBR*Jxr@SF$B2du9Z?6c;qv3UCW#sj2!7p$ z*}Q;py+p9?$J*+e@?Xez#l8;lMAv~TCXW6YZ_=pf(tPxp($j3*m_DUT3s)ajfInWx zEc;H}{wG~ye|$JK)jSncgzSmPUllQfL0koS0l(EQZj(H(k=UVmeQ_ho2btBrKyMUV_{cXUr{4q9WrO%GH6Q0d< z2QhiSa-iR--TDQ%cn3MEnQaC+hPc+{WQ>_mlXlAYuOccdxpl^9`pnOhEAote&9jrp zs2f=~eh(SnSqw5G3!hj?!#V@hr!zZ_^YZz!7z}``o(;8AT0n)f&5LE*w-G>GLf?B^ z#3lu$lPJqpa_OGwihy%cDcUCI$KtMKtX6Me8nJPkr#5mF32l^x11|L^=HL4?Z7|F*1R|md5{dW?=vhrv^bJBxSI!&dcJ9{GYzsO6)T9v)`zYRet{}Ty%Spq%8 zZ&LIF4^(h8JwEEw31;5nA9=fD1TJHeSuaV$PlUH-S0w;xU!)TWnb4ACISX?1+s8ue z|FBGfU9{qd`@9ZIp!ph|pNj7rmlWNfzpnyhO#ofxuKbHFmsBUEuiPH}bJfyYWgr+} z-BFN|pEj*km`FNjrXWN;#(aiBu}FWV`O0Z3RMS=%PzMCyh9xGZe3+rPUY`1h-|U7e zA5SnKs5rm&X{<*@Xgs84o;x&7)tt&5rK>?i{vl+}7_JO;^3jPg~RiYutOOv`N7`sm4gY z0*i!c4i-8^FF0Cp2kbG$9&fo(Ba4)Z9UKpHYNC4bFEoFm=+7;&0T38(h7tbssL_CC zXsWbE^}~H3ETELP4pM>7BBvC_XRDGD>L}42F7fQ9_K5vFGGV3O^qX0$MYJ&Bep|Xm zp5*oYX$eCbNe;a{zKLqPLj6LN@zKx%S@qA$SB;^goF_{_NG~+8{Tv^_7B6++3BBo= zL1SmvVDQQmx-|t&c)^BC&V;1|I)lVz9$Rkqm%=0fTAd%X(*GDzg@`rHP}r<~q4XKA zTqrw!`=_+ZnDGNi&x`7SeTGMM$=gukEmfyW>N!gRUUwUM(jZN}#O*XC&o+?(SH(dG zsA~3EuQv26wS4o}$j=PN%hGQ0Z8d-eT9=8Ej~m-=jyKwhki3~-Q>dt{mon3WFy(}8 zV*f*D$h%ZUG(h{5fMUjI0D8_!H6Foek=VxO1Se&?nLA8UX{r0>yX(-s;umWAkKQyw z%$l_7Ac&U>ynwg~5%ON9O4eJ4 zCSv)WjpkxehrGcre+y9ju=${!%z-1c(1;q#~WB1IQgO%IU9a z5}>KiaGrsC4+#)(AIQ8Vux>@XKZtu4$3;rIO}3Et`XeXNcp0HXs%GDH#M}O|_VSBS z>Q0K6)ZlIPh^GX%)8urH{8c$jCCU%%?$K?@%aZQ!@W&i(OH1^BS9|mKC+og{6R2r* zSV^3U#|%BL_<>4>zZ3sd_+D@ywcbBpx?RaIKqQnK-dv~jFM0O83wd>a*l+9QcbS%v z6QzfS^!5B(l>T54-E-xyBynDt0NWPmOaj}U^V5w^qbnmpYWYsE-4)s~wNr-yOd2RL zqcm9NCQVD0dlZtJ2>Q4Ik)x#rX-ZulpM5=<1PA9Q-7OwF;=Yq>R0qI+_4bJ{-Rnh| z5;MtS2wPv&i73Cg4|(ZWEz=4`aaD(r;`zMZxt_q)pVzl-WurH+ezo{pYBGiqqsVLy z@FgpFtOJJiQenahJY`?2Op)>#R6EApm#ma<7Iyl`&a?V7(Vx;N5OLM-NUn!M1d`@1 zZjbcY_#sV;_bJh|Qgb8D23YZZET_vOhU+kr_4{>iGAAjzLEB;A zD~suwT0?~76_4d><3H;$kufb5mTZ%3k~Yp?LQ~c0jdim7P>MOU?X1U{`O6_dmAX43 za0FB95$TfthopCeNV|r^r8EDBKcWh6BhjK3M{}ZBH`m7=2>~mm9NF=TG~nJ_^4%1i zYrUe2Cd!a-UVql9>SGLa1UoZpRcpQ+0lPeD(@uah5Lkebqhj!>m-Dv7@ zfaXfh)a3P5x6-D22u}|nQ~r&7=iQ-x*Abrn$MXkOjfU%K z)!7k?jp5xk^bCEol>vO2xTAcS+eggjV)dL2JVx_2D|0DI3G$n9Kxx>Jjb7xpFmB2V zk@p$kO;Hj+c6I21=zpgKs`d^&+Li5Nn&69Rih9#F^Hwcr=6jMkI_~HHurqJ_CX4FV zF+6`Svc5}xm7{6(_Nv@{d9E=I(9WJOXjMjf*xb@tH7`p(+Ed*4oSVt4x??s2X;QoqHW zC_s#i+Z=qmnD4XbN7F+r4sADkuh>t`nn5#o-UFqS-Zw0<9B<8e1@>y32W@xjM$7lT zE)Dd!IPoz39rE{0H%dl;xxAcq$j#O?zzOzAmGWqHwX2lk5ohIY^eNJ<{XRo^Nx$!U zgbScyk3?F&FWkGf{@ffE5PJO3l0_VCrs_SYw%Zu#Di^F6RCtrjMf}|(ZBBm9;KM$f zRexLKH(uv2+U+<#73^!Q3e3b;dV9VdWvY|-5sSM8FN3T~s58?w)nesLCS4}Y+Fm{_ z9{Z|DT>J`nDX1a(vBfuBXp)fl%n*rr-q@A=tqpkN@9ubeUnI`*7IgF+sr*U}VX*IO3 z>Ox!#l1!3ka~h2tRg+Qn+mE~^FFkPv=bW7qD9Z=nRAuqUs=32Pa93N?*E^AqFqCz0 z1bgUv|L;-zWSNVxCj~;C%WJGa&hlaP60aS(p5mnB2LY3k0R zd0-pYJ3bRo?a1W(mb5<2o>RayUoQr{78v>nB0Vqfw%5Lox*t!*IL)Ox9~uO7yk!vg@z|QTf==2VpVl8meTX6k*#R0TU!=2+v77>yXcaF^G#%#vN}`Cm zDqUEUF0}T|Dp!&@A-CODz~@}fr%}IRv_QqL2*x2i=4?$}@l{C=?ra#XT&o4A-mja2 zfN6CJj9_)tZtg!7>J0L|3!3w}usd7ZtsgJJA3t=VXPF?{q+-WK}=a zN?#W&I%PlbDKI>~{9?uSAMfCb3~u@ykUI-@eYGudF(Lxze3o_9T*{h&NiQU*5E*lb zg0rl|IRsoELZb8gyuQq~mH`c&ef#&hXFz^GxfZT~!45>Ir5GjGzGgFiXw z^ChU2&vrT3VnaG>>f@HY3Qb&v z#%iJ_B^b2`)Ng>L0`3_|lgWs*K~&J$Xmc{&zWf$+&VHk)eGa+c3z@l?Sc?elM|B=rD0Tbr< zmXcC;4L>5aNyB6d?kD*AMp-H_|lg+@?GuNT1I)WgljoU~rXxhL#*%D}6Q#yAG08s=lIY zvc*?0`*7k?72I%oH5PJtH?^s1e+tARX5abF7m^d%*HmNbI}_SMk^;yJSXD<-RIg0P9H3v(AkC;DdNv+4=@6Tc5I}tnC99lBU%BV_hcmF z9S|2;`x!mX5xH^XEyK~0c>T0ksk@&CdzdMI5b$+Sg|x4cJQkbB!G71woV%!y0IPw2 zEmk;D%ZIF04O21bIk4z#3r2L+@hk7XF^eKxZmArQ#LA&SyU;H=nD})==9OPggy2h> zc;we2)Mw`2P2^x3%O=+arlf<P=1H9g9zMn&c_H*2q3lma+5Qp`{0Rc;8 zWIwz(jD3!#W7ds@@*Mz?v{exOxlnC5zhe837o{S-jP)Iq)#s$l_#Q=M2Bx zXRV3(ODn1Sv7C?~c$?px$-G|iCcMEUUYw4rhT%qX_?$1if?;(JK`Ac!eK>kQS06Iu ztD{hO$L*7GMcA2?pkw>O+_2L2uo-@6#mWRpm znPV=zVPc_5D6NB9xP*JXD<}9pv}xZ><)J0{m|i1 zkefWj;>e-$Fv^2CXqcS9S(M7VMXe;o@fS1wQH8l^>0khnX-0p+{Y$nRjnM>Q--+K! z3Ciwggut-7G?u<>ixvbC`3OM%GOKqau6C^<%i4BS-n(YNM2z;2V@IWY&3;qj8~)&uArz@V*Ed!c1W6Tz0Kr?C2GI%B(+y;Ye?uG_v}Zr?oeC5h?!|sd;fCo$;~VkdZ>! z!lz>NyDkIG-lQi>JZxZ?6LKODATJfgi_rm2c#wC(#(qAkQEbUa|COdwD=aglh9Go3kW$>!#@BaZ<2FFBGoUIF}h z^%gbMQe;ry9L*tMn4Ix#v>EtYC0P-GOf8?N<8Rp_V3e(o`6)bG)dUj0ne%Gp>Aw9F zdn>!%mnv|D6Go{ey4$Ko-?|#0jD;>rMOR#1V`rioHk|c5;YdS7{w`-cyr?_z_M2-o zdnfCW_Pi^X2O?t1uPXNR9c9Gl{H3(3H_q-5E;RRbXj7hrf`6^ChI+CHp-o@t3&J>y zwzuPrALFa(_>n??(cR4-TA)f{y|%?|_*UQHK53j?IJ)0tV&MRVF!sLt4d!AWdYWWs zy$~c;x}+F!?|KiI5~!eAlnV=?541WwaznVJTCtu~Us9|y-az3A4tJI35g>`zT6L@W z&aE!m9?ei2@|1{o{{$;EC^Jn*AaERJtdm;eO@d^TM%e3Y=ivnj&`rt_^6Ex~Tl1B~ zUXC@Il3p}i=D1;PG-Bnu)^xgIGaN=GNUJlrT~t)K6>F#n+Ne<8b*)(?0Y$7lHEU#&S8H=Iq{QF4$6Z8;+$lN?7X z#-9JQhcUA#9xNH?rjV;5!t&+TU@3z2sJk!Yi^&syyg()6k|T`S4hYEG-%;TzT%=AZ zs5dD5;<4&}8VAlykQG7tP^cYmxC0wv{yq|Kp_Z^^);z(}N_5{w>RdEclrH5WS7_sS zGR{0o{@3q%d%8L}7gPX}6sk2B-G024PxuG#Z>mz|d{f4g!McAuOVOp-6i;U(%YX49 z2zX|&>d)g{oT35O%=r<&z$|yen&0 zq}1Jso@K2clH3W6hnhg$hq8wDIlc!C5GQ(b5kL3FnXY-teH?I{Y|GWxz-gl@(vl>D zR@OUMl~91Jl7H!yhv}6M>8`HZ8@#U#2jo!kY@!e*{d?hnm?7ndb)QABivS#7$C9UQPTjJJ z33qW$M*@o zw-J{90oc68xh9-7cg$z6-rgzJqp@-$*_q?6h~fW}&%)|^=iAXe7?ap6WONk9TXL}J z`aT?}4Zrlz{lv*BU91L7Pfxy-PB%73txw)l=N4Ob?UAN;ZyrN5hjri&dw)9qohi&P zQvCie@a{PhFkz_(F7$Ly5)>l8Xf69SSMn%6OL2AJY$?Vbw>W|o3B6f|Qw~haD9^Ayj1$`am9Y=LE3a2 zKl;F``=e|7*JAlosG6F~uhHnzl#opK@q)8xQ_{$aq{rY{=c5SHARWRt<3b+Eeer;D zN!oDob!G?^V6aGL6vX*9YsN_%#O18Rb=QO2(SrDnzCp|lsI}K=3;GD&a09Yvu$zP zc1Lu@L<;hdwzMP&+^}DXspdJ)Q@|o=ewMmhf)ZE^TlaZ3jv)kcOxacul>$e#--L^vW1owL^skj76|Tjz?(jz%V!lrOBlk` zyvmAxtCn3t1)PSjng!i&ueHs|C_3IoV$5w38UhE^mU{Zm~rnvJk`Pm_-oZR zSg_B8yNE4oB}!{>ay@B~)GpSE*{4wfYyEeNqUg24w*2h{zWP~kH0Os2MI2DZvw^H) zq}ngf0rkz%(h@J9c@I5xePhSB{<%Wq`VX~^(={ctLce&U{h-G`c(=saox)`}rpkRu zfGnKWC9(42EEQHDjmwt|#!9+yOh*coU^lx>m`^E-%mE>5;^vO1ebN>~DgFN@hg<|A zQ2v!9ed2;sBm=U)Xft{TFOBI8WlQI^*fii;0Yt3Hq(O4#GlJAyne6%Q+i#Davf(kI zf%NUxXIh-a{`6{B1)fgIUW0ES4-P{C8kf>v1MVDet(7{+L2^vF81i;LvOIWcTQ#z^*t?O|FhcKc}{r z+Osq*DUhfc<2De<^C`OLnci(rXZ0qDkt^J&|+0@l`%QXpXpMcbf1&zA`SY1 zjWlDudn%FvgAY`)B1-pu!xZCUTp7k392-QxWlgu~osARd&`k_d`-WK~=HvzX6}G>2 zkQO_2zO+lOn&L!gI+O1;O-Rzq8Ae~@!0Mn_TYaW^Q^hE> zK{1{)Eur6ZG2)o*V-fC-y5#Jncb{YPMJ#yggTkYT0w}aWOJHn2@sq&CLdK}l7gNR~ z3!DB;8-P~>NmHRFnfS=2nQd1|8HMI~XVBf`SFTutMkleVcZk1N7T72`ruVUpeZ+h6 zjt4)8P$q*LM=-7jfbx<}wq(!ETPqOb*h$QXcQK5ai!+NjaQxjCJVgK4*l$Mdlqd$?3=y&|<8$p_(gFJ5>;torS?18tZFF>#(o zCo_>Us!fv&aZ*U6{c%5k?G}d)kswi<#;0=@R1P~BJL@dFKQJrgjt;Uxm)IfnCg`dw zhg8oJXiGHHo%JH8We)K!zL9mkRVT#h$oBbuFVG&Jw4m?ck|S%DENQy0^-rQyT19cO zx`;44D4mw90DJW&|9l~v%m88)@3RHlq>A*MX-SJ?KfOr}5iz{8)l2&UOZ`q_mYkNs zOTW*f{*|O>*LP=Lz=c@+&0i;JxR?*Of54wW-$dlUBxU7AW}h{{CoZX;7h&UxCcYb; zZ!hiL?*-?YuY`|QZV4knkH&^?M_y*cdMCRRMyB-b)0doiV%jl>F}SbbK2M7|QRN)9 z7J=^4sbGbTvb9u-T`TRZz}m)l29@ec=&wR9FhYz+KbDiMyg~cWE6$5;Sz%R;aQLx# zsnU9Z*n2XO`cb6)&bP~UTYm7l+tPov0EOr;Ond#}I4AzxeAwe>5Uod%imMdWnX#OC z`4h?C2fI}f@bI>Ud9FT@!pUKdVqqHHRD_kmzH=H&NP7QyDP?c8+bi-_SSKUjbFyo2 z9(PGxCiP?)(^n&w1|6|tuA2-`J2e>hy>5SqH6}S!7mZjt&_wdf9*ElhO<(KnO|k8i z7c9NfB19Fo%Sa(o62U%{k|6DDTou(l*vOIYd-zK4sdlwvA+KIcM{q=DW76!2psH9d z>fQRlRci=E%boz#ni@U6$aLtf`rzE7xunPBVicmnm{vhz)>WFBrr()C&~)C=Rxj#ER5UzTX6(W)wG$qvV5~OSaNSdG zxEbh{IeIG*nGHOwZ0ko>DTT+WVhV*C-em#CqurB#p5dyYPB)(dYq4Y9|NR@JKXIJj zwR@+MX6uaaj}PxVd2nF;)iv0Qry$J>hfn9R_8mg!2_J^C5m7gjyes{WHz%MVQRUZt zjNakEp!u3_WO}l^I)IH*9xTMYo~Eft_!lK?TT>5Ivk6!qC&$MoSm=alg!t`Y9)T+U`C z124>dO-HfrYUpB^hNnuBt%NJc)G1^qlj70bEL@e)VQ*`xWAvB{*f2xF$vNuJ>eg$0 zr_!fd3ic1?L~<_PRdb2ee3cy5`Mg7zTvY%OCiD1V|A_p_X=r76lYydBF=qWv>CQ!`#S2UO?F;-@>yW>Zhgq1|(eJyi5QXKMT3)20ityN_Zv6pHOW5aHxkJJGe$hKp5UF*+${i3E=zOdtQO|C4n`^ zJ}A6N&qDE%e2BDfIwJpz+k25NthGYQ6R_ zJ?pSPJ+^jU;PXOV^eM$1q3-*({OQ1MGeZAq^$gyAYtsVTUhTNBYyA)}dU3YK93o%O zufPQD>x>-f)Uq`UA1^5jZZ*-=?Q|3L=1qOhDB%92=Z?99rNeqkmcS_uvHU2IzFiLH zm)-fogJ!;wm>v`t&~v=@5MVO|NK0AprYCysHJU8dY^qO>y2dZ1Yy1C{TcjA zk6*9}Yj>O8Vz;3xd!X~NNEJNlIF6_jhQixvB7@{e!2Tc_%^#cK359u&JRH!_)vJRz zR36rZ3E};97#hKA4=mI!+WK@JvgYSf@xLoL#%eO8m<@4&ePvaF`Q_gKy_UpJ&WFIn z8{=L-L#e1jjRXaX;wFqG*jLR4{Ki7B-Wg@lxcf#kDK!N`Y#C+MUm9Z-=sgPgorT%^ zun2zQ($;+L&)O3qVgkN%Mi%6~`OSo#1ZB;LoN~r|6#JR4EkiI{=?cS)%@BRQ{A#{; zdN&?;XGx>-XR>PVnBIq`G-{ObXQ{s4`4-x`+~0Mg7@dB}Q~hR!3k@@TPWwy7!f4dv zA=X{_&z?MLi-QO{iTz{V^0H3bE29uCy(F6$zWl^|P4tNVO^v=_PUMgQpR(nB>a$;n zhE+)iCk!pB=d#liR%EX(raq`@v|iGwv9$(#WhePP#U(y-`g+Y%Kh8*RE;gl+!#<161TR81Y)#u(X|+iq zcO73?FQbCsn|$gQQth+-4|$9uBoJaczc!9KPQC#(Ko=XG*r({)%;fE8y7FpK+RoEqnxC1*q$Q~#aR*Qi}fYVO!<3t8sS@-NJS*&bL9cHr#s zg=A4fq_f5I(0s|=-zOmvt&o+VIM(n|Xo~*OUl$i+wXvKAFpk=L3}MxeO*KEZRTC;a z?pSE5afEOb%v`5p2^47W@`kXZ6O7@#Ml_qsrOUG&Nk{{@bT=!sD^WjWuDVSa29tQ1-6g z@fFhA&7!^5x0+&tRH4Qn8%YTU`7UD7YuCbCLz>QSg=sJdOPp`HE@6n9bv^`RMklru zXNA{^Nl9v3KpaMf*v-~ik{tuve^xY=$cly#a!c?(i(2%>?}0e`^|W$>tGn5EvPz=0 zc35^z&(>A3`jid|)sy>~^QfMA+`~m?*nU|N41~VcR8#i$B6oY-5zW>Ubl)*TMw$is zWIWN3GR@aj`^N?aQ8zuo4!5rlf+A89 z(hOZPG|~*+C5XU~A}!rHph(vc0uJ3EAt2od!qDB_jda)h_1^pb{$kdGHN-H_bI#tM zvrp0k8NbmTI>-G!8|k!t)zHGqK&am-Ddcn`Y$JK+M&|CDz^bLw2|C;CMiQ*>k#ibK8DRha=qO$-J`D!4xxAFW1wfIkGg3V2L3|5a5T+<4u z=vM}Iya(H5hB};(PSur~{h~auL`ZVAO4n3XOXh9F+qTnnS~yewSFTQ{wQn0GUPM`; z?pp^LrRtOkDs0cyrIRB_jYd7dc!OA@9_#abY#oCs%3d%5_UVg^Aj$NkA6o|@d09Ib zB;4KZ#X|#L_@*4>U&l5%Zc-KCl19|WiCUS`Wa(uo1B<+;o2TEP(Fy1?T`uzb;>yDD znLC5r!i{`0@IZSeJ0plOxsRa?;}C%c^*}fMQ2RkR%YI=QM!a&$FwrN z1x`lGO?5B3SMnyO-_0BBbNe?fOGinIANhz=N||?TY7f;Gf=ek>1tLQA63GY4%(LB@ z>Xi=V|HydkikVHNckJfX9(5(P22Mmctj^A5AZ;>kpQhHkW9}7u<-WoB#gsF%W9om1 zUe0HxJ!&OKz)ehg2P92){$4$x3^Yx&<$&%1`PpTdMuF(=pN_UD4M^KHrIez4FA*#W|?zYC`VARboUBent>dhg%Z{LM0x&- z+DN>MO5~+@2r}x8riBZW{WZ#>C|S~66Xk~?&J>;A3L(XSK@1SuAbpM^?pPn8D7!RO z?W5(&jjTCTHPiRnZo4P7T=nw`^-)H1@L4ZeRl4tUcBq8UBZn}uQDHmBEoA4^md7&7 zYg(?<`N`6GZ0{d`IRnwhADpJ=t0@Yl5WM#S8j#y3TI|Q;xBCCB<9+Wc>i+M|s?l(S zN&16Q$+d$Xdn=NKF8lym!>bZnMIIuzZiTcQzq5==mCB)H&@U*Se-(Xh zR_)K9s!f+iCO9J02h!?HG<^g$KYwOT<}cGIXlper}oEW$8Trfle@kn zH<;no1-B9VyudS=dn|VmjG6hJhS9ZM-1@s zGcSv$y-miMoJ^xi3mBA5T}WsZfzfiYXNqbBn`!-q>+`*Hc$_+w)`Va7Ix5n_yykil z^P)uDn@;sggvV#1)bdS}uW<^)Mp6%bBxRfk*n_xoKPVjN<#Ee-#2xG-Kp`iYF4cB$LaIKBi^|k99QuNqr#rA9zf94SQkeEVW}4o7e-7|Z zGG%V2YYp;x{V~rn>vPVrpAh9?Q1!fSMtJY~Y$T-!9G1wynrN{x5rPbh@O*z`!M`An zNpBExp3~YAw&#BiDN=Vo9x-0}GrH40?YDhDwvph%h@Bj=LTxi?o7z$yP_rl1yW{D5 ziQ+TC6f=R!*o0btGw_2`O-taiL#tKL4h;xK2~_o~;c>DTP%+S9r|bo^@8-;GX8}<4DaVc@R&_I#q{*G6?O3t zyZpi7EofgGM_!->v+?~`f%1@B2IUSb1z_|sh;Gn#H)7iJoFt2xJr(8#M7qeHlEQzH zL`6V1k9f;$Be{37@3P7=cD%kvasms4T%Jj|Mo9*wE-5a>-p6129{xSnH5!o8KP7bp zkqxZf$hr^>j8`&Lho)QfSb0B?3|Lnt0*Am;`h@n4jN7ShP6tW#4ceX+UxvOHXJ*8} zp|L+Itfd-K#7wL2bvEZl#L*IEYyGO26NV}w*p;^3@E83T9qsccsXlgCn99;C?FE}4 zW+1TG#5}7&Zs~wex^uF)EW6Ih>F+)Jf6I!8zaJ$f{##xjndl?bb#vAJJPxB=VcW+A#JnP_$>4 zC;bY%)%l#}r#{=vIKW?nvY(P3+eQGsVt?BoV$&pMMY#&2ptH3)sW`i9ARN^=~eQTESLcAYMC1Vq0Q49KWBB9~hGJIHj z9b6vkZlE6n(Nxgbx4J{BZ$~kCx#ieSofWn6Sq0m_V*2-HFEy_fbW8Izv5r{fo;Em~~J4rt4jNkK_ z_IecC_dTQ1viHM4!XYwS>nJhdg7+t^v^qBCIN07CuWNBLlgYY^f@OaH>2adiaADN4 zr=~L={J7&vd!t61N+^irQOE6XpMVTpK3#mn&-rgb#7>3W7Md7y`BWl<|LpnSKc0#f z>}Sar>u!*cQ*$5!17DqYDlpVx0&Tp;p@S-Naw1J&u=zx&Q2UC=7FHX)`&EBi3vcA- zVa`&KlmOTjo`Dkc!7M4O@I`V049FHXP1X9l)^lqtU+fpUySC@pfWx4i!cy|;CC%s9 z@e1FX=Zc9^iK2NON-6Vsj0%sxmMT{_e_Ah5uLZJDXa0Q-4R z=fn3?CxiTi=-wH|@G}GQW2J+e?Fg|IRm^x5g|7RRF~dMeG+U+2R*4E9EgNh|x^_Y0 za+@3Ed#ir5Nc{+Dxuy2Q^S?dx$HVhKLZcM_kyDj`2j|R@cVjY_k{_K5jjk2-O=f2J z#4NPEpdVs7*RMtVvJR|Dd5|Gp{=`=*-dtzL&g#aQxNFA4`h}0Xx5tM@LUfiN;`dO| zXBYGOWy?{V{+O6HPxnZYxVMFd0Tdm?c+Og4PRqulhXK#}4rNJ(xP$2)lJej?^FZMp zc;BA5vz9jLk>-uJlgE${&z}$-v121oP<=fr1(27_1V`kv;$bv#D8Gwhl8#M<-kRy49^ag+CcHNkh zPxaFSvGK~6YYz)Kn4m;-Rk;XVYhkO^H$P$d_`e21sFz3JtzX>T1ZF)7^nMTe_(KvP zYMUJeQU|jfO@7~9%rNnU^EFl~k1Cx2fhH9UuS}QgQ_G3VIUQffsqm%g%ls3&Fa~5f zBR!`k&XwpJ2F>>RYb>i|2DvzQjvKx5z`o?^e!FMZYiBmC&vWX??psS(xPGy9+Znar zY^Z0KyOE)kJD*o7l%>m`|HV7%5WhiddbE7Rb9e9~LBjnAngyOe8NUQ&`d#{rOpnKh zVQwZP-<*=VfD-z15@abGtRVOU4yTE-^#Xerxeu<<1IdrJ6elbXf)Fu;!1Yuu+HNX^ z^y(1L;*MWxtsN$>-$9Z%T>YV#b8W)^Sea||$F>{FTRy5j5(ui;tB1tQB60>rxz@Qq zKK>^Tj%%EcV)l;{{y0gOuk+e%22g-`A4?;#h_SMVc9r?F*@%qJ-A;iD--q{wVLb&0 zA|ddjb!LC6#{bg=9l-V||GVuKv2Vm&_0Om6_}B_oC(VtdzCxBLi6fEbb76E@!F zGF`~i4_8ljAhOzid>_LxnnzS$0vS!u#wcDwJY;|!B9=0TbfH#%28xSOu9|kMPBu4U z-iXv0%X(XrO|@LT|2{*o8v-|}{Zy|1#+5?8?($x|qh}E||M)w;aBzLordt=drGRCXdk@>nEmhnSXJ7-fu}RMIkM8h4@9^kU$6M@ zxaZ$STUhLHcT>Ov*WzhRc2rCPDmSB8@#mDMs7am1_C=v(e5OC_jF#{dh&VBI1@oXP@@hhKJ;M+HADOl?*jOC)G(ZQ9Se~ zA^NGr{550r!oTrjV5oAYsR?M!7URrCtQMhsm(F{>PBNKDjS9NeH#Y|1tMecHmi>sG zd6WI0jf?W;%A-Y|R$?kgbm1x!juCN@VS(3rcnbLR$!W}VtUo4O_|4pu6YW^M%n-NydnbXUB{VTT*@NH^=Sn~BI=WUU%m!=A>Wsi;<3X5!feheB1Gk<9UMp=vd6%RX^tDezVeq zq^NA-ZjYvFP#K$K=zg=lIq{xyUL-m?!oalBpk})=AHT67L85g`exs|_r1q*_m|b&6 zbU!CV@al-dYJWcRx#fh4blfY2UjbTKk*-d!iejZqx0qgg_y^wnHpTWnD3?S4HX*E$ z#4kzua}Kha`?aXBfJP*j$y|?Un_<3*Aa$Hj_#!-18s4IBxX$U)wpKke1+_@s$eH0* zcsH^C{Uc&;TSRT#J%`a^dyggVlrKrO+Xnr+Acs3-i;4un=IPSTN6_l)hdC#3VUbMO zP5How-cZCE^9mDa(1%4oNyjmM8w%N41uVM&i^8`A&$NwiM0aajqrNQs{(I~HCB^^z zFnfuy#^L^D0^TF>~n;5}wC z)%%ja*y=j^XLZVgSE)IO(a-+#_>M0K-7HaEQbS%`cT0yiCgBJTiR6}cdICR&PFl-uNcrW`ZLSjo~pG*7}5KQ z7c5>Kq6GTK7U>Jq1?*&Ynnzi(qR~HdIcR^OhRbsELu8$dv!v~Bv}YGSrt*lHaHp^a zWfg)41-%f`6sG2K5)u;MYY5Kp!OMJB%JCDHX}ML!WHJW>+-oOMb-GDG4s4ey~1X_3N;)0L8h&|pNkkW zt%dp6uvDj*cZE1ddNeEG{+cWC%h>D+F2BsgMY|9io6nP!2^rMx0(4hku^vWaA&?8g>~kq&Of^h>R^fUhoBJZMJbfaKu&$YjL6*!A-syQK0eWNHy&P(u-SJqWMgYVNElLMB72W| z#92xdSFg%9IKQ~OaYg9HI&`znH1*0TzPjrtMx0PYBUox)^LdlYyZJkn3;`(5&9)Ox zf$^e58Cm+&zBZLSp14Hg?*}IQOvBz6KN8#s|@} zZ%=`xjds&OPv5Lf-H`WNWv^Tx=2@Dv?UDOGuTb0oU$Yp^ZmOR z{hmN$h#kouiB4DVxe_5Fk0?50eB@Ag+pVAsm6!d-ousjLv2*dI31wqW*o#UsW$CP&QT;qt@5ahw2)XC@{#sLy!1p>Uo&uI)^HM7k6xJGI; z0x94w5dE15>GICQ96F9M5{j7ojdrExpMM{!tJ9DMeVvF7M`2W_A5FFWtSIM9yegQz z6@0tioV1yUsSojv&ALzC;m6LpW}IwNx-Sw=SSGH8@4ZW;AwCxg8z|nWFg2O; zpB3d*RvU~Du|)_Ni>Z3e8W8C`TIcdQfC!IAn&vIGbdz(LZdcMUFfr3rQ>N?6BYR8H z%y^j^szI5o8V|$D1V=Z?kv1n#K4WU+c%_RJWr5~1z4(~r!C_F&<>O=n4ngb8d~h?&@M)9tb+cz;4}eG1FnJWUkryOXWM)Y z2)jq?d2TV1&WaA1?U|Me`0jwi%JQO5Yzgg)2@LOQ(4`AoZ3hK~QENoPM`xzLg3%di z{BjoT5htlh@s;BUDvzGjb1hQ?zQ5Z}v_+@jKLTNciXNW^{~XVrS*H1IPy)VMg^*N8 z3Cncd8Lw{Z34iZU>zDo;+3q4-s75BUOZR4yhVS1ftJ{I%mH5`Lo2cY~Ysb5d+=qFW z6LA5a-~Lh6MXLF{Q(3$vP4Aks!)%-w*Z~q%|4eR+Xyo#nAo+s*IrHW^bkp6P;(~O> z`Y@MLQfm>NILrTee_Y9v$DO&pb6xW!IrKm9aN65@ zBtFQoo4=XFp%nj#mq9civ~?v75i)>>HKYDO?EVq<8X}NfUOO7Wp>@yLM7avx7`#IW4H)M;3>da7S2^oW77R$ zv4B)AIp2)M;=>=dV&R|k*JmCMxq5T z_($iEj6TgFr~S%pCJ&h+&D+$3m8f0f4yK4{l@od))wR)nuqrJ4yFp?_)U3bU1;Uqj z;AzB#Vr6Y0+xp1wzy?O!g{}mizrKg4pw>&ACV&^}j4FH7=PSNF3h~k^C1AKN z$AHSxO>yz0TLy%s;;EP%zoAjM?(+Pd$`r!B7D}pr!SrIqXp6BI+LCY};@&hY@Wqo) zcwoN5g=BjPR_Mo&g_tEp!&Ul1SdB&nt}SLDqIFR2VuG_0A1`FrysB7q6{#%YSPAe- z26UBIG;>+lmtx8PA>175zTH#(=FW&Exy@?*KXfs880<8 zyk0-ER!Yk+xAuenDIF^tb4d!70n)9NtH*>ShS2C{)ApI8>k3>VOPPPDx4*>~gk0ED zeLTM-AZIq*7cVl|&_X@P$AMy%-DCQz%K+YUmuzs+cxZu%wM6*Y>@ie9o&Mcr!+aeZ7oCN0GdpJ6Zu6|>Q%SLB6R zd;8#vvA-VUD-0FPp9|3;9w}RQ!}M)QC~so`l5OE>5jm&N$2gnZExg_*ix7`YW~U%U zZ&F&^vu{K5S`T55_<#Lx^{Y(t@7|>qM?^FxM0IxjMqTrsA_ zZKKcMD96T&hM79gnDgj@M5But*Fu57M^R=wh=YCQS~O!0lt+iJ3re1}&ik2V$jjHB z^2?xkHo|UtjlE>!qnF)Hr8`7eBFpzh10r(Z6^eo`S!(?WvC@`t!~+Wg9Kz7^A~D^E zszChO=4})ak!sf@R`GPJ2fFOoNFj9&Z$Y^1pQlDfv5=1lS0f*(Hmu46xmqEyzn@3u zWxG9+dGb%gVQFVn^)>ln7H_!qv^V?NC_GP0%x%?Z`f!dmD+JS%naX5cs0Omerep!S zVe7*Bpe-fiw3uvVp7B$0olra=v_ONZDaQj}8!&ygmyQ#cfus;8+#Z@9hWG~`P~WkJ zEAQ!w!N_{%c|7!?8d=Ph3O`eWKIOjkv&TGd-Ykc#Evcu-vln)qao7D%9J`HpirW02 z$B)nH69zlDz-LtXqkAW`j?3>T3djy$ZC}WbNuf ze#KjkS{a?RYOniex-^|Na6voXa5z(tl)G+rZnv&GMtzWtH_4BRnOraL;v1>=ZTO6& zKEa&lZr5sKjlZ8udzjwKi@GDl7-&h_NNNOR_shSTURR#^e%9|X%ANZ@GpOdJuWj!L zULf+zz4#cFjpQ>JKm4*_l-tUJLM;;I3r1Bq`h1?He+NgLJz65t_G*US8jnx3werLClCvxnN4Y;9FCOcPVTdI)Qfssf zNcH`~J`w#^6}q7Iss!J#Z$;B<{-(q=wB|_#L;bCuPOwG>Lc8Ih-xZtxr1e-VDW^)g&1z}2pO;Y7@_xeF11Kr{eia|d1 z*|pZ7+MIiRA(z$j4c@1G7y23y0r(sjFB9O5WNrnkZ=vjoZZqW6i!)pAEpWQ2HV%f)qNA*9^K$VDm!yWN zu=-|y^VJzB3-Tt;^1wTU$l2X88Caqq5eJydqdUdJu2^z%aPwwaS0NFME~j3)-W1R+ z-7oz=5V)a@Q@5+8K%!Op`K)O=cef22e#l^7Z4UAcEo^8m81ydtFrjJ6%dXRTn64%b zLQ;NBEq^n%c6>AlANi>*I3pO|cDaImGwpee#gf_*FnX=rU1HGIb0KePDnI60V(3Y= z$LUM_W$f#x{E@@D?y_KH3OLebSWeg=|Ks82r6oD_|9IZk+y4V~9-o_@?~1&wntAYc z(L0-Eo^HM8aJToRz^HA-Yi#%mKz$>%v^s)Dlcnf2M%V4glWT^5MYZ_#GhYD!BzC%} zR<)A5(y4W|HDHw)kZcZ&QeOkO}TGc|Kb0IIJ_kY5Yk4XZGB(-ghw&iiSm#s^bO?#AS)f0ZWjO$4x_;#Ifap=-9QD zu|`UeSGWCZC7ASGIU<%Of!2DwCgyL2@1J}=Lgr6w8OgeB;oAG&<2kMEJ(AtlE_E)J z9-3@*)jDm>`3E}O|2|wjhPT22Mz_M3#V3+(G>VGE_9bpI%sX9uCU$(-`YeW>p~C<6 zxw2)%Hf43}LU-_-4+yLXqR;8EG>_7NZLiHXx)4>nxHAS#0tU%fcdbX;E*Ymc6m||h z&Yq{trpwEN_~AA}o}~~`z^Ad6K7V2>+DZvaT-XI@gxSmCL)>AZ9lFZY@EY3dnEsR; z-^_F^+if%{{v^C2pBx8L^f zbcbjGK790=P4IS79R9OIk<{V^$>KGRt(hfcu8|#Q4Q`Xp~+1>{L`1~^D-H{U}r`TvRr-H%Rap8rr?x(EEO1t1A) zf3ULbx3c`ps~AG2$d7ehKdlU>-K&GXHmbk8f|RTySeu~$T6h!vht3z z?$6Q9`d2Tu5Vw4iUeBAm;ifYbp zO-U&GLS`*ukWi|5RMO=)pBUrXg6@cwrCQdD|E zyvb$Vd%0->9EtK}8OBm}x99+(AA0j`{gvTh67O`AX4geXf)y@<0Ll}<^j7{PGy)Oe z$C~!@Cy7$JI#XdyktrQ*+ew-%zc+b`sQS`-4zo&rQpWAODr748j3xv7?VOP0^3_}C zXX$s26o_10yO)_C$gDs$8p3HI%~LNfTj%7sO|urNDr(Y^@zjShw>nr%DQ6(C z7CstezP|vGvfw50vmYY!Ib1A7D-4g6wE3*P1U#$8!jmca^Bzp^Ih<~ki$kgoy}rl^ zaZ=A1J>1?cr9!)m%%;@eivwt8@c@<%h9_J)P|>CEmHSygy}gVc*}3Sb&)a(9hr;Oa z;W6`z$}Gz6{SjWDFs!6>3rKx@*+-IC;r}T3Nt)3z^Lxc`p+|+A9gdFx-rH`*idsXg zJ(t>WX7O3fy?OFL^)du`lN|L!n>=fV)Poj>?N$`!>;c4Gd=@_YTESYkr(pRF1_1S& zTu!2%Y+wf@M|~WXX&giTzBesNeVwUcoo%3C`uG=LOIB`8?N!eJ*kG>HnLFxUKcsM} z_~W$}?QYpU1;$9lStD+5-^{j~0>P(*XX#C?5x}&-d$aYaUyksG7<0@JyyBHTX^SzH zot0l$NqwFtYgEAJ1ZQlree=;} zeD0~S-t}f+E++df_ts`F=uI7($7-{hxM;|y;NUIbt1v?EfuhaU_oUH-8 zulBrpEuZvAwO@o61;Jj2Of_6b@d}>q4oPdg+5SN}Y3zv+f@c%+o=VQi1)PBg3S0}S zT6t)uCz|Y7f~&Z=cIfbq)m^!?hH06+`v1k?qwdS$|AG^6K2O_;%HU+K3ZSzqF9{+! z1VHvBybrauRhJ;s$3=|k+im?qJAd>cx8>Vob%H^PII!ukTdcl**Ks^~NtKXfj4bwS z7Xx!A%{BM7gWA{<{+8h6&kx5|c!G%>m(PxW zmZP28SbbyZhw+^w3?G!eByFHXh?<@dq0M+Dzx-?NrG*l(wm|ER54bu_PDWzPwX{%_ zjc~wOSF{WI$2H>3q8E_rBXOG5=*5c!+KHQjk1p+=QG=m3IUzslq$R z2kXzVf-XY;U=1n32IJz-xCePSx-XQTU{_(4h*f?c$z0fQ7K_g1k+(JON+dX_;=lH|f$gZN{Mx_xO15dmUAX@LFZ*xQ1^@sVAgEqZ2%2mI{Y`_(kJsC=ql%nHkk4ZlOtTGn!? zuex_J6&k|-nurvAg^gl~D<{%;p~iV(*;m5b5p-&x2@Tz$?E0nf-K9O;59FBW(eR&p zCe}hr>tUMeo{rZ+Oh_9*%Jm;gM~{W4Iuzg zjZUN}H|4aV?ejJsv+8ngnD7Np5D|I8vlAO=)rH=xR zy9$=8_ulHJyQ%}Z#^D+y08qPrt)m%eK>LhPry3(zOnN_L542q=Fxce70qVOps z!iMJ%zbLsD2QJIVu=D55*Uvs_wW2liUu6eqFX08w`J%wWdNASCH09to4s{<+=+A)W z^c|09EcW&$=H@sv?>MDLT>mZbOvh3kGx@H#txdkMW!%w~5aEa+InMO+Knjb2B{1;1Ix*54FHAW~0;nH=U~--|uZWAmUMJz9^I=uQH@` zK6;BEJ80W@{C&@QsdM^r)KzGpGhX}!p~lfl9O}xu?`lgy>1^^-)8Vf>RQ7ZMb3Ngk z;NsuGQt=v@5_e6qoa-j4^nmNEUM5*p^ZWbb_M z>6Lj$j-AdbSju#rGX}kke15G%;M$ub1Iz4isdFm0G4b(u(^`~>JI~|Mm6iLv>=b}Y zmn`+Tfd{_F1CpK%sIQ-bq=_Z`{5CXKPPKWybk$w&r7?>v%ByZ;pqA#rT zvA1{Va1Z^_RmU`@8zRRzOLJ=8$zEPz5{Y4|s<$cZ=nB7oe#%fP9f!(mDiILq=kb}D z+RujXui4Z36YJd5KEcJ7H!chRahyNmQ>*`ob-eI+t^0 z1TblsJ%UB#q_KK|W~p1vP4_ZHuREFI3lI7Kp*k;@ZoV$bUgnaEWl{V}rA<@)H`h8d z#XlmvEAu#WfEp(RP|Rz<7YO_|IPJEPdS8i@N@s{p|ClNT|D{qDnrQAdx80*wB#MVI zK!9{Dzhxfh&6?;o?vAe^fF*{yMHNerKlE1+u1s1)Wh(08ONwIAtGuhqK7evut13!BoVaA$45{^X-7 z*g~C7_=#Wh?XcbX3I?hHIv^!F?(!RuZCBY!=wwfEAH}dU;bTv=QDGaHRciksQAVS- z5Q>^?!ZvvNfZGjM+#x7MMb|#EgNJb^6CvQO?k$D)TQu5QJOf#fF z!BNfj>;@Om>CGlP?4CW3F;b%Aex6z2w(l^t;!aif`~y^Y`3h+Jzk`-_>`3FVd9zSq zcxgHOJT_$LR2bw843*E!-pfh7`>;z+r2O?6X7eCQc%Ed1n3?uip=eP%i|$d881M~} z*(qj#2L2ZXR15Teg;legRs2W$TcYnEF00Fx9i?$dZYd81w7VuGvWT`KF7O#9A_^c{ zK$%OsAxM!D%a6-wFudkO95cf1qK*bTvkI3>uKqk3PweFUK;*aak!p<3Yw~vAUo)EM zVKS7Ua~%!a%^bNtRbbgZPuq5TA3I_dj8t+4-cLC#iB#12`BF7vl>6hzUFtL7Apd&y ziD{pnnoCUPz`F1S1GNT6?1hShSw*X1NCJ0^(a;ky626O5KhaAT33yt=x#-gAOYnwmkY2K47Tt_u1#(1$wgx zMKdj&TeyuQCEgDy9=Z~NvTw-mHuxs04)OgdBf3nd((R*irxYQ28ws-e<)Nw;nA+|= zXeg%V1>(vw?W3o!0f9(`yAPpeswmzQ>VHpZbbYqvc+J}yjdkez zwCwTbG19|t&HwkD@eQ@p0anJ>tsZ;|HT&K@Ybtk-wgrE0)-bi^5WfP{AvYR|*PfD< z{eYD}rfcCLVVE@7eeer5KwoD``)%jcXa3^48awGdbJ=N~Ucf^7{rOiy<|oi#_UlTy&dB~^6*$H2`36X^b^wf*3-{C-7XWV)HRA_JJE z`j|%&x$^&6fcws&k9+6-!2lzGzoW_GP-XEAF+sd)U43Ib<4xD`R36!Pv>L^H*?!EhZ^nIpPWIJ(_M5K1_-Y$u#PJwz z0n>Bpi~b~~H@{WfP}&(AM2B$pXrcz+R3kkydq$_@KKx4le0Y0A|u){XoRuWn}!{>7~2-KdaCF3+&txhS^$El-}ltmKe(kkG6gbg+~j<>W5NNrBDDpLF-vB=NZ@W% zrklR@Fo2&A(}hYCAzh@PlLPy^AeNq)Wr+M*R6MMLlfJe#=zsh8;Xl0K{9PAywwEL2 z0!pU;A9Yl*l`|v%fLHxW-dV(`_;B zplU_R8S-kp&Srv(aHee(NTU*q#Uc(@;);16*hwY6FK{%@%sTRWJ_4eu18nvQ8o!7+ zSRMIo_6URyiOKORv=0Aa%es4BSz;}07TzBo(RQiP{0OqYA2_ezFW4K>tO`8H1J(`p zJ!?-b2=1I#1-GBQ_mKOOA-;}oP4_*o1_&i^jx>_~mT!;AtZ<=-F$2UZ3SXw@_x~ET zUHqBK_TuzQQV2tcqDVwEqn^Lbciu&sRO#u9E$+2!U*gzJ(fseF;>|cdP5Tvv4Z^>{ z@h1SFHvhO1kNJ=+AAoFD+ZGqTtSN)DNVO})x1ipjRXSI^~xrU)JRBoUaWqubs&;E~OiY{XU;>CE?dW044FCFx2Sva z)Ybq@ucJn9V#Q(s9)FGVEs2*@OHV-(Q*p%yx&0es6mx$;EFezp!?`bJ!tKi5*DoPC zYsAT_6zN+z1}Yt-=x-ZAK*GV>IC5?6N>Z&^E?QHejDVWdz#V1X!GdKXQddVu zx%UN|ib#kx{id#i^lmA0!7wEUx{gh-{MecvbcJ3S)%F~eKa}S1$EeX{*>vY(6O9rB z9i-B(u9`mn`-1{LEeb;xMVx=(9?h`l`j}jTyQ`VAQcQLdMVA_Ot|R1vZU>2CS_Zjkyv`rCy>Pr*ChcYz{t6$}B)>3Xv(5PWtcnpUDxO0- zk*EA}c7$JYA{dhl8N!a9NDgUUaE}>&1E@oZr>xVrc2z4Tj~X~?mY?N{G1w6jCiEd{ z4k$yX72YOfU$)kke;=b$sC~DQO0Eoa<2DVVyh#|*g*16k;!gt1yuOYOz9)nrk=U?+ zO039aFQ__nSIotZzR9oA?PY8h+m_PEc^EKH_sz9^JhR)Guk}YVfwCfDS4N((7sLJt z{U;EJr#%qHPGGUf|-hY8`cuM^P2nYve0Qm=-dR5mA@T#D1V9b z{FU)iBb>SPKOzML^}?n{lDcc1M-IKNPPZG+t3~5wvqMzC(gXrkYK(MokoDGW{TrF& z#01*iRq>*^@T4RPIzL1tEZHER)j|UyFXsU01yiQ`50+$oBPYbgh>D@?8OvlSar2;Q zmvw-Twlkts9HGBD?as3lZUu{bw1p|y1MlkeWh83k240`im}v;5NMFs6^L`WmQk_B9 zfy08#T8|sL%dTB*>-D3YfD;}_>v+8bpfE32>d_cVu$A<^D8-7RnhWmcHLLD79j{+W zt(KZSRIn8Zif~0 zZ2|2KV3(7&Fh6MYx?#MnM%PrP0H$P~QDH2|;aSYS)U+TxV^bx2w=qymA0BmAUghhZ z>iu&b!O*I!-B6*^v2f^1QQg~IVLHM{op(yYwJqGuQJ_(l8n~x!tyJ}hq~6Dcj?1 z+oBh4pfFK68s}}DMv9Z^_B;HesT3U@liC|Xw|s=bTeIR&nn_n2Bpj6Kc4oH8z1M&S zi0DwmWSTV##@oQ_u9Zw+sP1dJNW!SO&@X71DJY}Q6kB$Gk@Uc5ZR~HQt+b0>w(s(W zi2<&->Mas~Movk-b|z(;Q!`{ll&g0LA4w87j{io*j#v31w2PjW59+NZ6M)oMAuOTh zO|&Lxa<<_UM{4-kLMT|pe96OlFz6AarYK26!P%XeB5k7ST!OcJPY09;ou$5f{A49y z+l|S{5D_9!nR3fcN+w1Z5m5|1n}xB&p{u@=;+S^-VCFiFMxv)ApS?v(+q3-)V!MPv zNsWfi6^E&S;!K8RH7I?hre@OJ*J()$^#Xr(Q} zg^hDigCmxgqkoVMP!AjIR%$3c7t454ISIaPaneSOOD=Ck-$}sAFyBpmVA7I^%M?QO zU6NajJio3hJyGwD0 z26u`(6nA%bx8eng1b2!{a0wFR=KX*3-I;r5GRetgCUf$flYMr7va7xH`}@BzVxP(I zO!lvn>}v>)7W433bwqU{1hRjylgzQ(k< zt4J~ku$uNHW(WiOCJF#Vf8mk>$=7&Vr)7AY(ffwe(%672VI6C1 z9rC{F+l(*QcGq`_=PT)ysKBIWQ16=FIr(Eale}_@a=t)p5|fUwjgc_;0HGHj_dC&5 z2ntc#2gpdn*WV2elMP>1;HhGMISx=+0$`Ci3?-*gysf(pw%0e?yPdTxEw!~SG7}RU zpLZ-IrLCavwh5A8asms0<;5yFkA0VZH0W~Qeo$^5CZeC_2NVPH^H|-ZLZ~wPdcXg&VyAndrmmo{1Asg zA_s{3!@Abv@!>rD)Yv8ZSo``rk6NK_+1nF~DQ?^<)$_OFLya2w+(8F8$N;FjMa4%k z!jZH2Cl7gT{?~$LOSy1yE(F;O@W<4lV8lAA+czgd90|$pAMy5U*y$jdhz1ryn=D z^*j8O%)tU^L@xr9iL7_U4s}PL@fq!r#WZ>KDhq+G*k){NH{Qktp9d0v$3HoVJTI|bfW3CDb^=IZvjkSW7st4 z!iPHPpCX064UgA@WYlrC=Xh#}*RHj)<<9q_2cgKm1?{%^)gJ6cQ)eG#N$&Irf( ze|JOF%Fe+UpQ#+~oxOIF3A*=VL)BVvw<9 z^(xI*>R;bC+^>kyIQd4-xmCJWWVnUdy!DJk2@v8{zDjiFNO($Y#3vW|_={lYn^%SE zO#uZ@iWV5DNe~2_=e)M41IrbwS7j=vR9iT(8!YYUvb;{cI7MtV_#3W!erk`Bj%P2j zWXdXwUeA`TA18CPz!`GPvyQyCW%;{&!?G4s0!(z_?Lf$jd9krP7KzJ>SWo$3kckKM zn$yif&wJ!7qhe{9cL3u}$Ps6i z_hM`1vSdkOku_(1Vv&3>d(LGm6|f|nS&!ZQHK_biC{ijg7hJJfUljfmj{<~5%GQTh zqI+o7oZxT4;U<)oOAb~}i~=Q266J7pWh@e3ugHXB?-73y`YRu=J!&;M8@c(xNCR;l z>&(unG?(|I2Nz4j3H9Tn(GgkT?r*LB}a^Op3P9>Hx z|Dfl*?jM3xO*RI;653IA&Sw&~%B;s!VjgTbTg>l^F?amtqee7RT1Pj~(eS9kZ1_lf zb;-LO*CV%vHRHNj^rI={qYJb5bM}?86?~2#!*chVEo~GH%wf#*(?hUTj3%;kguAI! zscMo^;}1%vAI&7$LXdc3;N!;dPF~3gmaWucU*)WWIdX!jwWUXrze0_(!dctt(Z1hG z5+n9}a)df{dGkgptkf3u7EZfdp1p-APZdcn^-F%V^&l;F$4d608gwC5t_gxlJ2^9- zJ4`?GH5N_R=*N}|tBXN5i;W$(Z*$%RYQA?%qyW}1TJhZQN+F&di*&Vh&;;meb9H9e z^5xPoD+o<@z>-sdHu2xh}!U$KF7H!b%_42Gq;nRKvm%uJ(`I9)5rtS z@~&T;IGhyM(rDB5&gIRk2?P?`oi6x(F)ogxZdn%jW3ea-9HrMso^>7Y9$Lv^>Dse3b%5W`Uzo#k&Yd=hW zI8Mt`c7bjybZtChQs1iKvJzOlpugLa|DrV6Gl|jl2-)NyCh)D^^wO~$3vK>7B?d1y zlLQHqgV?_8^>Ch%lv|mt0rXNulBUM_G;s}$Z%Z>pRT}##g-DEam}=Pdv8Ls0x^{u_ z?@E1l9)uxqDa-`KAbP`d_my=Zf7}~Nt%{GJ6yEf+4sbtpY&j0v!2%pGi0Q)D8CVuM%|dc> z;;9lkl@I3i>7721!Slk(XA)2;2OeEj$e%^5cqczAN9|qas?#0W^ejuxV zG9#e1(_t&=&#V#mwJ89)zy2B&*mVu;))vkB+r~(1R}n4`J6x*A7k#amIlWS9$bw@U+$&pj7~nG7?0fx0KPoX#d63`F zeOOpL)O!*l7kXbAtz%`nVRm}VL^8}#HsAVlbdQmQs{7?OK7WdamHS*wlrmb`v#r{q zFaCf!DhybRy=!c}B%1{46f(_38DZ#`2ABLEk&KXneU^43tNgQuu7#hnWmUmM6J>NdrB^@k$^}L()~Ndu_T*;MEDpQHqJj!eLYN1mNK21usomsrXCbjomx77(@)fYJv7d;>?K~;j4G9 zU1Bm?wkG&IQ|OyZS@@2$rYkirJBpB<2Py}wqlZWXND5WBKPFIkRGU*D@6!uwkw{KM zH`9fJfeem5nUQLj$q2JPbeT_DsS5hc%PZ_A7htQp*mmbH^Hk}x+!B0wUlE%a$rJqI zw;fei+fPUzDgvE|q!O>nKYDJhQD!{4DUVni27gx0Be=l<>7O+ejpvBivwTf#);+9A zk~_9^`{6PplNPy$zdjAf8)&pE3qOLdDD(38Wt|_V7kdldJWZ8jZ}$0Vwr}&0o4TUQ zmZ+_aQG;kK5HqCYR~hI8ndp?uJ^@o0TPeUfzik|MzrjRv$G{km0uYRUz>VZcan_5| znk>J$WKZI+JD@C+mn9R+y6o{2b;S*c=OmvSr6sVK`#Rf+#Dp)g&nQ=)>VQY~wUdT& z=Y^qh-kL1`W?Tefxdo94Oy7IRyV^G(yE*BO!)AEBdl0sq^$O-8XfS5mvKTI|e>ci| zZ8j;pe~dl%U2Hwxv*=E9=iRnotZCxAuJ+{an1i-o`?m&82hNUrDdrDQ*)pvedC`sD zgs^PO-Foxs=~rgYY&w%5Po>bQR7&cK87gfX)Gb(E7k6q_0b34%^jrl8Q2gvX3!%Bw5=K z{w?0s(bI#HW86N_Jm2|_k{^|x^kgdSwzq+yhQ=?d6C`!tR89?vB&p3Io>SST;bu?e zj$5$s0O!9}5qGjF`lM})KxZ<)3y#$u=xzxuS|)8nes2A55B-$F$nf%*-uE}~Ise7I z@8;Pkx+_ZS*D;)yvdG&7S@f6u_mlpdw9EHKN-|z>KVMcHmoE+bORm_>AaURWC&k*R_{ET;Kuru*m>OZ||D>3c6Yb{ptjxN^D1TPuQrr5o9CI%>$YI;0dx1B@Q{R#GOTuf@9<;XD3=>&`q zVU)qa%4AARpx+Cj_uiAKLwc^yHfVlL-F!m-4Rm3~ydyzkIr^}2SDkp(j6 z<(79iN-ufq!j~;ltb7>2W$>|yc-@^ZnZdv|fd3Uyd)#c6u<`Z>vR+z7P6A>PzJ$&Q z(!X5HP3invp=@Jc#c5m!QFv93Su%pP1eGY8rWuRm9QIi)%^;O&O2(B^h$qjlCM;x90Filz*$j1a4@L zlwJ~LZ0HrGHC%9FD)9;q+@-C}q?C=9uYBu%bE$lC(;KCcZser$j|a3Vl1#;j>9EF7 zEBnS~Ez{Y-$O-k}Cs*s@C&liEql~&*xT(!Y_NuO&Nt6DWlpqM+|EvJ!#Lo;TX}C>~?W0{0%2)G#OGMV!n!% zHUnN5Y`lr)LHpM8 zRgr?{_ZIWNcA7`bK`RA`m~Ys6hC0y$b^C}u%#>Eud-mSYJEzW|@z^Au%__sG)S>{I z_zejU#ZHFH3tr(*su8|_C;UE)8J*Xga9}HPS&%`vH$XL_A>fEm{PpUeL4>7Gxqpov zs!%-^uW)pw+9o}#4GODUm>hbOZ@)A|F9Ld}2Uy3N+IZC^h+MNN=ANo$PL8GTx8KnD z@QZz;1h{wq3MsW-MmhB$dGjQ(T4Kz=@0#d1YS6;l^Enbz5*%7U(gZvD%yjR!BO&Jt zEIYb3+!jcCa-S60Ou&G-p_|dKp11_7{HUgu???0&*Yqh))7^g-F%^jPJNL~l7 zk6g5CcYIe;M@RurZ52D&ZG@d30(s@>bn>35U)rS*>IcE2J5y{XTRvs3YyD;_Hx4=b zQC1bi{aAXJ#Q#?d@J=_g{lw){i>F8>b^Kd2aOI*L4ibLi z?qp(H?T`Jr#`?2FX}SK(5l!`${t}BJy_h zW@(`zm4qiEUd&3N(>ANfv{`P4Q^(gBsO1e(wnW6@857PI#_TxHZdi$8nso8O3Nq?N zuc(6^&n7krb1@3j?nAunF|0dFUos1r5$@BCNj0wH7<1FnF$R@!JI9p2nX+~2!8%#? zhg#X`m_6#bKfgI&UoXFttMuP{kyE#;1#ifscaLYtt2#h6Njj;{A%?~mG1;m!)i>ZS zaJ>Y7eYL9*Y28Gl`H$4OQY5!NHs>tn4VE?PB%Zg}{* zr&w~O=FM>y?_pdSEW06iR5wZStAuirDQ3Zuo8msUv;B#Fw3|oo2hOm{J+)a*Hx_Cz zCGoNXpuWxadsqR4&11`AEwkja$$o~Of-#MWXZ_;XT4S5-7`1T=FP+Rza3gbTxAClYbM z0<=#(nBxMc=c3k_`4kXj)&5EXqCKgjJCEZVtgB_ugXyUINvp*CS!{-(k{G?=yqQVG6^v;ypJrtwAcJU2Da%z9ARhZT9-1=-V zy9bECop{P>UdRY+Y`O)~-GldkJ8vc&= z$F^Jrb7OU`A25n?;k5r;+d-1Dx!-`HfHh>>)fw{!t~4k``EyHe3-_;e(x8opVz z!lPms2^qU6#g3W$`eI*$5hT)g3zY=F0J)_8RaygRN!M5>3;$^1UQHsF5wTEN+n^Ys zS#y3P^r=V`Wiz=Og`N_eo|5AzawBrtBl))KoM7UIevxmYHTsTy$EsU&Kk>?zs8B;8pNdVw_e44w=fBs5Yg z1_E$F@qvDcTM9Iv@RslC9HO*9PR`F=+j|x$NVyi$TWKM!#MVh(UzzgMeg~Pl{<6`bDa}VKG;E{t!EAFXtOOjVDz|u z?B&>)rrXi<%M<7whZ*G_FtKhmwC?mHk>^>Zri|G)!i&)Qv*Av=W(j-e{&=vjUkydo zH?EZ`j@%E{zZN*3KDa5Qmp-b%Gmo6VtO?5PCVvfvHYfK@pTwZK^ovu2xb3|A2TrUO zJKv1Azhm@69^O!`FW=w~hL$_tH3EbD8vV>60OEO(z=6H(xBiZomgKb_r2CxKr{k$- z{gh|=vs-uB9j(qr)UjUryh(2_62fQhj61EjzM4^?BYmQ}O;lUDHa*VQu07D`z*&O`jDZF!Y-Huq+ zPN{UFow(fh978PV6(e6ey>k?ZL}{XYJ$*jbpT5Mj{SE+3D?q6a%<8DHOO`%Q`Dt#x zKTs#of%S^4H+9GVVQr3gF8?p=_R)_2;+En4b$b`|{;1=9wBA28etXpO zcr1}8^t_ddD5Xr0QOECMDT4?d z))GV<_#?ck`b@Y6_-qlrhtjWkES;?rgg&MRdvSZ2kE!^H>O|(Y14jlUyfkcV_>S6ZES$)QY+^ll6?diTJ3tEZr89t@!3DS*}o>&AF7ehS=ym(7D`mG z`~a5Q%8f%Oy1KySNgI$uAd`81`t=^-g@C>Fu?%rfWB1QI2MRTd{9hIf*SDGwC)>)`@lIvu!Q6Im zyPZ4BIDrI5_J&kc*M znmE%&&LE%7ox2c#X5e_zIraxJ_pcj;Dko&8{D2v6j`TvU)MFIl;#3JNwss*qlLh7aepI zE3W=s5)scR?*bW$g?9fCOuOFgUsD}@ral5zMYB!4_kyKwp#mRP^f9h5bs$CFD>|Vx z#(gjQTbP8Hn%cK0-pJ2Gk-YIhO*pBfU*e54rgCb90`J$HU@1j$5h`t}7NejQA;04I zqvx**k60!>Hpx#L3TuBy=h4LBlj*RQi-od8m8IrWT5_$dW${O7qZOMuVAn;}Ec`?) zE?Y^YKcz2?d~i4DkvxKse`MP%q(pBqXK59&cWveoSEsV`PHy0lN~Ge{y7RQ$F1sK9 zmQ{xSNS^MGKo1|X6FPbExzsEgabzoHvs-I)kM3v_NL)@JNijwRrv7dbml)sMIaXF1%S;9fswY$M8ok&&FYZk4#q@p zK{@p!#S|Zd0rM>^r05THs1TK03Kbj_&opLGr`K;07M58bk7=x&C`uS*28f-F5QSq5 zlu~-tsr}tq_a*N4l&-YFG~|UHhLTndpt8?^N`Y?~@Szea|L&~c+p^0GDqv!a*fRdGHBn8OyKk8^@Y!mdA~Hg3{uS9EB~fe8W=aAS z&y7>xz9+>~a=^lqt_ysVzo$SE@~DOjN+MM*DB&Q78dav5p$4tpK3KE+=ckdcBLJEV zC*;f!9$0^CFFuMk%{6}nov6Z+c|Qtm8}>U`+_z-Zw?9}cdhz9uJ8w3= zg6jGS7(KtGeub|C-)P{oHQUIE>oTbO)_M|U?cpl!d15bbub6-uw68+4VHy#$hjvUB z_|xui)#p5+zP6un=H&LR{{50u#EJEk7dhiVi+9`M#aXMY9Ecah- zv-wq*pkL;5^{>mW%Gx`l#iMPOqyWWPH6rr9%Yu!kpoZ)PZ6d$`>MQvFOw^8w;?9tc0r(00pfq0TtImlZg^gF(^UVF`AS5vcmF#ii!!@ug_;iQ3+36s10V;Ip230jKzJ^ifZzDs!bNUZ^m}gy)>|T) z^C&0`33@ebq>?F~3d6(u4p`-v>~{Ia-nUN?H}rRzhNK*)CUq}2E<}2rFsa?nP#g)y zH&u+x8c+#ht(}xzgiZIkJ0!jM;ll*xqoa{s%yFFaS+ja?HS(!NNt?jX)tUJcIpp&a!tIqjGng28)|1gz>q;ug#==t_O3ZV7pn2n~Jrw&6!2;S2s5t7Ez zNY=n5WZq#MHoa75o>sDFjI7GKo{O#*@6`Y(p|tL~%GNP`m_5-hMQw~1!SIlYbKQTw z(xb#DV0^Y|w)S>0#Ka#*Ds4=|Go-cLhJ@0EnpRnChcrDqLZ79mPsvF|B{k@%@;Mlt zgdjMh$gx!S@a^Qos_H<@k22w|GN>eN@7nESvjZ+l&UK2R@mI@ofMjc0`7&v-JC?QELVqCh?A4pN1hNV98qEp5F5&4=-gqRjRmHN0|=C zw)5s>k)F1_Q--A2dk1mFi{_ITAoEc&eHu2F9bo@XNHGF4AcPc*T^>s{1)L8^p$L;P z{Q=jRvvMK_AiQPl6No|PcEcH5oFRdpQpPm{QG}Xvuof%r;tfn@x28vt>dOyOg_TyA zS81|l+W3epM%HtjWMFBC7OOfDriJIZ@;51F1It9TsHVoGFF10EY!;b+5@_)lix|7s zz5u^v&S?kjd=Ivbe6-C92Ep-8r@Ykk>-r!vPV7GwfFe7>0c%zR>~k*QjX&3P`>}A@ zALZAjpm0-Sds!NI(~EVW>Tr%NX_)(@m^WI@g-{*cXbQ{75*rF*V7X&rjsT)F+N@-6 zfi@FM9&Az!)~_V7n+x?(!8Y>?k!8?ijTaTzoALHTye^G~(7UotNZ6a|IIFmslz z6W$jRn$N#RKNePg4QuYnDqL%Ci{^DiSXFJ*)S5*O{Rgj7q_&q?M z)nT4sr!>6(A{8-_%RXHiVrdtAs>+#}laMh@ZRByGWlQ!j?5frurbY|>A1roLghvS#LTo; z?=~Qb^`Oe-w!13AU#uOKY8k9=jJCP2TU#V9OwKe;c3kE-Vvb1p(2yC$xX16|mwU$d zKKwfDHc>Ir?28i*oak6CYH`Ke)r9j0-ei23?HpXGFCel1CkN~WBVS{OkdFN!` zrzUp>3%9n*Dg;aTT8vf!9O1XzOP9AZ2#;A#?*QLox3h*2?YxiAc+B>zR+&bGc%$O| z8(u~Kjpf$kNxl>Vv6(ZOS|@}$t58FrOX6~$06^S)JCTiT59dL;V6~m=iZb0T__`S= zez1kd>f*iIFmn>IO@395V!$Nbn{i_dSAJP=jGI+hzH($4=uF?eSNSK3*J`f+H{)Uj zagY4vSyu_|@H zYreWSgu{gLv!9^#pH)bIln8;#lPw;)O{>Ufxg^Ddc9KDlV%K-TrwOf|<-%HL`t1cP zsQ3jV=etLJTOiJLS8R|`M2=C!mi!Oh>a~8{#e417iB?RarPkycR^z(<(~VkzRC~5% zC^VL&tomKf5UT`Q0IM^ufEi3oL0jwXP6pc8^sW3)W|_6G2tD9Mlb#!zm>qqv(D*tm zfhWl{e+-L)+nu)1NWmtzaCO5dqVf*{y`1mu=?T!>;(Be>FC=}4u%2N%6!+b9f@j3E zv)_2>K`Zi*s=b-__yCY~=jvB`m>kWY6cIC2^_*u%exlvlbs`|FfQk zAJQdWy_#Pv$-z4h2n^1fA3$#OK=LyFxi3YR)>&dVtii@t>WdND_#54x9czY0m1-78 zKEfl~h$|XiVj0VErlBj1TwBOamNWYmJGW|~=C13gRv4T(RkBwgs~+tTM*{=M`TqS@ ztC5hxWE`+`Oo8Vv?>PZgVTDFhIb=V}b`7q2leJo5s7Rb8N$q(EA8h+4A1sI8pAk)b1!?p|9CE&3_r_i~oTN5Op5cmOt8SxMzd)AIk(+h~a~ zK6ZgC`Rd&|rB6j6p^}0U9~HX9Iq&AUn-5C-i*07@z>TL;;dwJ&$IM^vu&`a5IV3ly zr_}xu?7QrF6LogLxZ;l-2QZ!qPtp=bX_bUiQ7Rq28t}KwvtiobOyK9WKik&HR|(D}%l-I<;3iU*!V?v4OgIDk znoF#5rt)H!_dw@#bRESfa?bp{mq`wH?>Y!Sp_rG7c}8`Bqs86K^`s&v{uQb%>&_%Q z;NVW@6jS=Mgn<7*1H8)KZbR-_f8LB@CVgEP!I6H)cv!s#)o$F`BQV zC*6`&R6ib?a?Gw=n@~&z$HF7ne2mMzzLy`Rxshzfj97;j{s0n{3oFAjXHjVUf*agC z=f$pi!all)Eg$X@Zw3}G6DF|`x*CE}v}zAHv#f>OluX;zWdTc5cqDd^18jrbWQ((; zkrQ8~>mt)5Y$lUZ<94{UyCGbG`shpjN!?{eX0OFt%)j{qU2$*nv97p?>$Z2x6zS<| zz4K9la0=b0ot`8Cd>)eB=9;5Wgn9rCeen_Mp3!>S!>s~0!5&d*Oz+^lwSCTQ)o zGstoG&U+Ma7i1PWzu8|WyMBSD_1gGHzygKK6HmUUf~ccM;(#ZUo!0s{3eUisqo;{} z@GWuAH9eFIhYE`PJSDN=B~6DHt}7Q#W8q11R*~_iXz*m4Iy_s2`G(H(DH)KCpzz&g z!1?sk_!YwkZPU2+dPqCAmHE>tg;5#?RnS%38a;-+Nbkk4*rF$R|_Xm#lk_qhJ zso4*tyPvb9qZ!xV?n25p-sdpRRl0S*eVST0&PSuWOyh+-=Hv)f2X1sX=CrSeA)u^dwisuquY9N1)Ji#3p(U z0+s78Px9G|tEVfLCfcc+i8A-UmCt8JU%36VQWT)5bcivKrK;{lwKK8BHQS5&pccB* zKfUh3`KGxtjwhGAu0IB>yXvgwkc8-wH6Q#&)_HFAbK2E0OAr`xkMBZ#Y8rupU#Qz# zM|UA*q6^0Hv#$JIr9c6q2KRpY-DVvMou*$FQ3C)p`}UulHv|YDJ+`QRd|K!U*JtPT zHu*}Kur0E8)oN6BWIoLTU-TLuLN{(xHu{78o5?s3dIer9#09?~mYMCgdwrK!mZCp} zr9^WS7`yTtt^hH%boOct#!*T`VTB>4=P`d`>xnH;x9uC2q+}#wjg_x#VHVc1{}wJE zRI}{oGXB;}I6n<5mkcP)C@R8CA1-mdZIO93PE{K-6?9we)uD7ynQeCsP2U~k-bNeW zYy=Pu-RX~<3;Gz#xQY*cr9h$#B1ElI&dU|Fn*z-|+t0c3`4lU+18GdgOF!#uqX8M? z#I^^j@MftoU=w+bXT_3Dsi;*qc#A3!Q5;?yg124kTTS1M9ZfM=JC|HuB|{n&PG-xV z_FV={7*mr~nE8B~`(`}{!XAT~7s;AEb>-@DM%kM9B|c1I_R(nnL^ZrFQambADKslQ za$g(k?PLj;$Csq#AO<;>IvuGSEIn!En0hbEF&{&>O-(e8hf_!^=R*ljb=2ZHF-^iz zzCacp#}A>zh?%toG=_q4&iq!LZG$vdIlN?>w-pI(3k$99&;}oheQ8IJz0FVl#eCB9 zi*6%!_|o_YQp#J-W&Z8x>+aq+YB9Uo#v52Z8bSR|;L83!iGCqW-*PLOXB^utnW|6+ zTSAKFkn-&N z4h(F#d9;G@f(Dzl;{?_Bw?Hu2ZF%40-pk<$-1gf!jV7vtILrR(rGLb9%tOa*sz~}$ zE-Ld0S3clr{Nd{LUc}C-)E2%^L`qFlvHE8X!CC)3OT+tUHTsy}BT>KdZL#zAnz5AH zIF5YB^kejw)^6v<_h%IVc)*!WP(&KYS;T5_8t)ty!t8vm;d?+s>qJsy!=CCNG^p*~ zcEZya)Y_&J{TDJjCeidqL`D0qeOjIY>*E*CfXL&#=Z!Anyg6cY?>fIJY^~B8aTWrpe2^*JjQc6^@!6332GNlt!9)2k`%D0i3u# z)|}D@;gtl`LiGnvs+;ZJZ@u%WuSs#Yn=GUy&j0Es<4OW^x2WQlyIv~K(&s?@z2m!& zMia>;CQi}g?jC&(-mCRm$$d~wxS!$;)A-P|tuy(X9X8YhL5b&nRwPvpEN?LSJ_k^Z z;kWzjV{Fap(WpqWnQ#&zoL0$k!mIhn<-v&am?uKFmADS1F+tQ}-uRqAE6t7#bseN4XpK&(`4A81btO@#%??NJ1`z+f z6lwMlm!kMA(MS)ccZOq63zhGmoe!qkTP7eht(dS~8)Y$?J3dGSt~2KA;;Z z=aECboN5_WR7ZX?fwRu2F?P-i#p-w^@DegyfD~Yf@Vvm%R|`f99BP|`_+$$HFH$u> zv%|@qs7C!xyDMuhiuL-u<7MdXb;4-nA#2Qfl|qvbD)S3hFCP$bM+d81)BO`s!U`{A z7H1a)uQ@HKq-=oC01R5Q?UDU1HT;>&olH>KYm%)sHZ*7im;JG6${|fh=HDz^QGxay zFE=0V)7j~VF!cX0fBVn6^nY@c{~f*3-d(;rzyCOgy@LPP``<@*GE_<&E7R$!X1uhz z#JyT7G?YGLWa@#p)yVg8bGY600bw(*m4PAu@ro-32>ZyEZJr6VX;lpM7_h=gRK*p9 z=o}X&Kc24JJ0AB_0G9_3IPpd3X6i)7kW-ej_jdP7$E?f15b*ezVmaz`MS=i9ZSD(K z?I6V*cq}k&cZvK%blI;0rDoc4ODNU0Z1(H?oRPwT9^Dj=5^3>e;<0div z05n6}VtFS+nU+Cz97K8OGAfxrF88XE1YIrY-MQ`U-5NY){|kfQ@$AJU^UJ-$K4d{< z6eXXJEgjDIiSKqhtJPZcAkDlR?it&RsGh423)@_>N1%zxx4QWb0li_bI?*jljK0m$ zpOY#AocV^kN-uo4&T!JaW(h0iR zB3TCv+Jr-U2{Ulo>G+dvSJZE<*M55YH}o|RE~r!)2Yg*Gc1{-8z)AnaI9J^M97pR; z7BjPHsFtLnpEV%;tP_Ce*ZDRE~d!%EfYqZw?QsMBedC|163w<2(2 zuP&sL)(poSJ|t&^(jZ*ApQEfnL-b)6dnD&yWcJKDHV)3_oGllGmPoAF@pzzn`x+6MXU@iOKh%nOZvkd=O##P zbKK)t#->wMga*lF0~h8NB}JKKots7jl;iQR-3L6;I}TyViByIdGAyf&hrfwuksFwc z$OAgE$|7IJiRjevCCI;)dGmc$|0WIiT;(?s4lC31^CI^tW0(p|d4@v$aMq)eqjBgs z?Vt>z0ec!E(WWql$fn}^yusLI&>BmAvA!OeS1tI-)OcB8)B;U|&B!d32Drb-FB3UUJDJiCEUK+izif8OEW0v6N`)kQiWa|0+nA+$Om*;n`tkxy0c} z3Eyi)Dkiw3WDGevYjl|V%Uw?piv*~o`{xHHdb{XCX8Nk%Uv*qp{!?-2-it@;waLRb z5`F%A;{vg7SV2_YsKSF4=BY2YajLdS(it|MAZ2T;ofo`FV#w5?InMoQ2&78qfyOpl zr}eVN?<#YbP&tFw6D&r~!pypMbeIb3W@+spj>)bq?d$+Sj=P$gM$1i8ZkZbnS5ESN z7&sYp>isD_@^;D34~O&1CJxr?D!AF^TK&+t@&EIucf6a4;oesLUuE(ZS#pX?c0WCy zNeHL0x0}q}jn-x(?8JK34s;!9xfo*E76V$`<%Fxzny1=ryzlk@W_aHzFL%~G>=gUF@dePH_A_g;&Y#uN=Ey&h7usJhRPr2}N!|sYc>VPZ zybmOgrzoNwCP2F~3cB)tK2HEZURSp|(gj~%RYokn6PJ7B19bZ+T#g@#o@**9v>|r1)@oxg@fwJbc8KFgUvIP$e5jP&A*c(a8WKsiEvC0!=F zcSF{GH|zb-U-smDTWj)caAz|INpE{`-T^8>t&Vh{>sB_nZuS`4NxVDPmyf0t0~LBB1j zv0;ZU0oZsIBe^Dl1#dTPm})gaZ*h^6Cn?}E2Rzs4`m#lU2{k0`Dd9fIDu8dN+ln*k z2T)Y14b~YeuxuG^lDppv5C{4oM|J4eo8phL$j}! z-CBqeU_S2)(PoF*S{lI7P+oV-USJrYxc|6tE_heI(k=D!)dK3%`5$YJvF2o~s0oLW z+c-&!y=UE?BI5!B!}C?NMtkXoKMy1!W`0>A5ADrDr8+@vT^rD~Yz5`h0kN0QvJxgW zgd1%(+&(D^xNEFGRnMRTQ~B37+$Kh#4=|`oPS_e94R(Sn);xtN#;4ZHU1agAxCRck zWjsRN+4>(!G7)r!csA^puZkcW2{Hrqk^LHe12I1Ph{TzlBgr>OHO2eiWluFqg*NI8 z2fq;`KWr!2-jBr|e1^UzP(xR;RU$ii>8r;N3mH z@X)cRPMh^ru4vmF_+G*8B8KNXJbk7z@h1~(eSnRSTe*j@<7cLuin#05_kN*TGg!A- zi|$#5ZAO3-_0Iv8GT+zvf{pKjBhg$xgiTZF*EeNhJJWLke;~)K!%pyLj#hYO?+sby@6sl05k~$?PP_>w{*7t9`Ddz zHr)6QfPHv%e$B$wnjDpi-GCGbOA(#gn(3aS-emGPH4!`Pr^Iq?M0lMULIJXe(R<>Q$KEY(@NWJbJ2}2TV?76=#wHv62C%n{NHHnP7^flBt@hW zrC%T>kg393o;&&uyXuGHFP7R(_jV)vUFa7S{>eM-FwrLI>Dy|XW-QT5>=r0Dj88q55uXsT7^h)u=ndFu?B#_Si= zEPI-fwEXm)&X}s~jB-(x5T8cG!D^n1mbPx5Vl5hLMS=988tPNpYZSV*_LV$^p{6DL zrZ#q(d8<=0(XH1_Zf>u&=Teo$39GX4r{U_&Mu}bb}uN=N>I|gT#lVU5=B9au=*{Ygw{AU0aiNj%T_#c3KFime2Kx&)b-Wm zJeJZAYOcFKs!8NTaiq8qCvz*~PCAe_eoR?Tp#?a7Q{#RWEfYi?_tOBy8*9GB$QN>q zCYOQc{T8jWTZ@hoLsEv06w{2yXA2d_-=Ep(=_l47(LPP*m)qe=2gFK8*p_Ua-u#IL zHkKE^?x{{<;wB<_*Na68SwU?KcKKqq!p9PnhQ&dxUgc<4V%-+cgET_zt^M`#n=;k1 zo0Sev$s3%v65_S?*BH|3JP`)^H2nBwChC)DsE2=uQII@`2uZ{|-*V5Kn(8(WUJ-x) zQTf*Lb)2GhI7mDnX!1?HmyD`{Mb;`VPJx=5ZVr7Ljx&}Pr$4uP^H~@F2}i8j;(H!L zvEF1iq8%(U6kJqeU2kvRD$P&eV2IXKO(Sh}WSwb6k3t(89&3?jmy_d7!NEjxV3Yn5 zzG1mB^FAy1{ISx4R@>_~K!57ICNZfTF42%zf|K-K@L@ka=&{j zV_zYS^q|<7xbKiq#cqEMtybYCC^ylmsu2u^tG|`_E^11{PF|{2RqFV@SbF%THlx1% zjQgtw=dh~l!{;-s8y-v6l2}v*O243^)W}&TT+V)eyr2r1A7u%^Mle>( z^704!Zo46pmHT6?XM(m3ALQt%$1{a_Z-<9|?-#k>XOM4cxz37IRMu2cE%ok^JM#q8JQcn%SzdOdOZ8jUm;4y zS6F~4l~g{3RGE7#TbHaRU2G}hN;$`l5wjs7--msm+?;pqc+(9oQMIFIV&sX((1G0C z7}4#WGNqtwh{JP2?PI7uS8Hd4e7X{+25Y6r*G#ruJFeXc*xB0t)0wb0fD)M6RSR!I zhUoKy`Y(dTB&&40XT)dllSHoR2rJMif_;`5Z^5r%n477oT0{P|k=D>igwb!P9V+L> zh*`^T&8HgBPb38I-0IPlBKOU&_dS)oc(pg+kUp-`zBN_`_cxUl51d*}$|^@S_8f~h za~|hI-aFk~bCh`}z|`run_#G4jq~lDla-_3zw1B#xQ8g|k4@+Hhsw8A;NRsb+`*EiD&RR zui#n|4pVBz$amUxpf8ai0t*E*L!iTB`wAI6h5dR+rQa8s7OE3U{3liXtQ4^)p?RaUL4NwX(ge z)Jr)}AJ5G4{T^`2Hm9y#sQ3G9JG_SAo%|)vz}EoFxLmyWNYYN)@q34_KN=#&TEcr6 zxLuB)DD=I%Yn`*S7G88_oAfnsN<+e#OVj$ohsUmQtw(>Ke}D=KUU|id+dY~uj6Ut}#^=sc{(ZSVxg=9zr{a?ER-jRSPzHuwvhsfv>`tY#29s$SGk{qd! zG07`1zso8qKnU`wZO|~`Va>f;VDbo1gSF1%kZC!yQb7K%VO#B8zf83gLT^gQzC{Srl5{M`w>CL}9wY=VY`n0D^Z zt@s(V#XmFTk-_qY>!7sU&gV~{aWDSE(+zO%BU|tYcm+eZViaiF>_2ymD%N!zlM%N! zCnP2VpQ3vH;QH$!@nqxnV1{?F-ay>tH>oPTpp9W&{Fo( z4oWI+I9xx)!R;luT!7v3dEe z&$^dNztqhdM_Yb)|FOV2{8e;a$(+J)F>%T4^XP$zRqlIF)zz=;Y2QsgiF_n8$&F6Z z_=FuxPkLaC0TkO#khSlzpfh2-irgt~^?{uWZ~0ZK3%9ORrTS@7kzp9y`W?UGLWT$~ zyDxtY@ktxoe@$EUHsv=bOLND>wbX_!bQiB~V`MOQz(Y+E`yIXieRgP7>RU}@8~Nmq zB3uMI&W}1#B065_ zJOmk=e?41$M4NrpBx8dGkxO3j6lfPyv^jn?Cz&`c8MRd#fp4SO3Z~4?4^Ch8fm#*0 z(MsDWiXkFd3ULBQhi5DuRsl5!ag*owI;jHQ{I%r?a`KGkEA#M?uT9s9ALWzZrAELe zWPY#RK+QlDR=10F==jdUzsOTi7^Q^oBgm$1CTvG_ECR1~57i)dwUANd% zpf#nUvDEbx5B0G*$y&#iKb*Q~JZ%j}GX6rMfeXVcy?Cgd1pcRpEpxV5tjRJ_8JJxs zpbtSRP#8~}VkuUA`OP8VJE%FTXIc3#3|9)X{SkpS)i2c@?7EFpL!F$?rvrzy!Itt1 zFV}v!##{(UHzzqB(a?I;fcJ0Za3k*0r%1WBj%TZJRMF>;KkOW7$_k~Wnxo4*<;f{k zjeE1CYiRIM?U+;)VZI;2W~9oqu%aEG?O{gXTAcXL&uXuNt5nuFKT&<+Yz;=SuKOF! z70rKdmo?^xs>m_CuV6K(VfFC-`*-Yt7#($zbq+cEIwk)qhoR59CbCqIZ+})QK@o4+ z!``EXa*3K*Em?U{9D_hcWXj)Jv{DguA|YtJxu1o`jF)5t4yVRn*+JG%D2;O5`$N@7 zb~qo(eqg6t&vw|{)+-K6(?hpK4f{N}^c2cg!oR&3EwuDVGI~Pv*mUNNlkPzTSGrng3|~SZ-q`$)&SMXHPwr zay1Zyp?|4fz=Bv+ib$3rB_C6SO9@!_5TKLiArAr@%qee&V`bqFwxX9dGQhod0Zkh2n8qfUvI zSiGh(Ry6guTgFMLzAVGE3yw1SXhOn|N!x#SZ(lpt{ktO}xz0t!MJ$YX)nXno!+R_* zDO1;&yAF{|E;q?@LHHRw3|Pxxn=ZDou_+@%A$%-$(KLyC=y^PX$TQc-NxsQMmqST# zp%e$!(~k7KFJFRv;llrlK9Zw2Dx+ynogivz%sR^}s0!s5Y*5d^6XN)p!G@$Qpi|W*2RLCYLGAyta-Z*r{h>XGx_P z<3Yb&T-UP{Zw`FzbjTq2#X=8vakeVqz&Au&cv+L1l zAr3WH*?zbl9+858i1m4&Gf{!}V`48|YkCOeIyX5<4Jqo3@qIZH11Q`gBfVA_pygY4 zqpSBnb<{Zte026bpWk>icIh}Yw99L?*w9P`LoC5Xp1=084BI#VUfsjmo*(VWjsYDZ zQ|sO}d!DS>J9L1TsdC4gfbPTNxl2aE_=`U;FZGpLU!JbSOjTXX!!XGBI5`XSHGw8i z_q7`VT!FBHKBC^cj|>$mX-eh%zF-0RG#0_jlmL&*NDff8FoG4XC`t$#&wp6j~Fm==^a^j8lpwxJb1(8akuke82&O& z!WKfOI3t6I+eqgBfzpK2F}0jFG#N55skOVHYKtBtITnt}+Yw3wyN;qI;Ym<$C`JC0 z)08ZVMZ1r|3Z8AE$H~^G=r&A^@r76{=_SC*8|LvsFSxSn>iBss+uIYQja^Iqza!XX z_ox?POo}t_{$6~KZ#!)%1hUXltL4@I@>F*u-SUeaI1~nj#dg+!G=zOpSAByayCw@+E%P8N{G$M|;sxwc)f(fRjy z+5BB|YoUP8=*YmKBx0-RD?5j*RdD33H{&=GK_K4W1<=z`bD7koicSGWF#%DPd-5e1emb zCd-^UhRW<$l61$EtR}v zWx34yv`Y||DOlXY-gr`)!jh`=727M`!kCVUXM#@`-3#sMHI=q8U0Ra*coqseE70AL zhA0zTcN0pzZB8@*mTa zXof{Eml_|RQ1ikHP&HWR<)o$X8PVSU4N=mUo>U%dR48YAuNdcO8ar%9KmfEm!zDlx zMU5v&lX4$xT-G{A633UjmT9;|%}u4hNwXN5pG{>xkAZ7doa(hecjr8Lyl^BBu?Ohl zBe`<}=x)~_7Q#^uIj|rijj^Gr79$EMD z-Bw3W0wk7DCYsH@X{G*@*$`GvpDh)XyGc);=phZg>M(7!d|zz7r;}zAiu&WMd_~0Z zqxv#Q@0o}kH~WH3l=OdSRpTf{V+YgDVqCVPe!F-(XX&4Ih;lJSZDT^SpM45Tlk}io zZl-I=cct(RlF}6JucT`F*#Yu+GL=`pJ)AB32g0iUB=*I&M=G%u!;!(RU+k(Qwn>ZDAYC5L(RZ0bw%$9ouD2lURK1%?T zFEuiAOihaFnLDT|-QceJojQQAG>6hrMO3N7oX0v9i~)fj*SxW4Q6x&B3~<;GaKF?svU`4)Gf`rf>yTz|tNH;cCbuMbO?CQ^#XG)F_k~Dg5}diYK&5E6x#~ z1*7pLut2^VQ~&HNzUkv~qVQc4a$wN{0`TiRAV1{h6>PVIJF(TVSAw8r$&Ri=WpRD?gI}B*gimYo4o%!>Psn{6|Flrc*-`2I)_WEvB%oI%F`(&o8{mf^Itp;wETDJtnRaN(7VWDjUJpEbx4HXG9wyT0Ivz}ZbBSK(Xxv+E z!1k*Cf5;WrPrpW>pXqyn=^HW6bly_J;OCus zj{V$@)#28;dRf+%z&>^9sX-B7!7)mR%tEJ&TObUC40>Hy6JNu5``<{GiIj-ya z!aYKL*Xf>-C9f^s;CRXSy4PdE+H|z!(E9~pz#wKt3+nw=#tBmEqu=C*pto}th0hqD zlAccJzl9NZ*nFS!VxSteuzMfXjyrIVXZP=t&E%1BLK;&+`jHmOQ&x=|hdivj95tJ{ z>>*yxZb~bFZ@IsTR4Vjd;Q74S@Z1M=#B9e|lg_<*K(M7`dcVn+wa_As5=}$f8=*?` z-S}FxaBI7v)s)@GtwdXAxOgzh!X}Z5^%~3ModUMaMqSN~Ds1-mhP z&@POmx7;PzrXdS7WSWn4mD3Oa*%2`*Ra+}(>~Ruhv&i2kG*2_Cgf~=BV$?N64i<4DK%Yt(-KMJ3CjNW9mH&4_! zb`_H(*B=e%wLBTM?cV3wLiYnV9!1ZB!H9Yt!oFuarweFYtf5 zpR&IQLr$9RB7A!a@1x!o@t;RJ?))c7;Q{aHk%7X}w5gi~o)a!tj*qa@v9Yo9VytH> zpR@Jxe880fWx$;|LYb1*?EO;T6~52|3?@a1LDgk+%?8S12Nb^$F-d15B-kY1a-JS<$?gH6G^yWDtWd}=lG zvC_1$CBtv9o)Si?KGn7FV?15iiVeLH3r^X1F66s9bp;^La0~cbr12TSWv35CMd7)s zJ~zQFJf}PWmF$TiSgz5_Jz$Ruc+ZTN&v5q}c^y1-}h9|8ZQV0 zToZTtoIwqO1m|wK7TbS!_~7}M7~OBfB2`1FjWFyj6`p$ z02VGTS$sVgiRkFu5QqA+zPWYv?ylnik{Tl5Ldi@jxMmMrBmy~~T#s4%>%w?5T|tyN zO5jrfDqL~tq|iQnYO-hh|79q#|5v*xqInmN6V2$u88Ba;>NihWPSuGj zES=y-KTPtbum24V>Jq8y)5(w{>oXFxz2}cwb65zW+>eJ3(Ux+JR5RS{UYXmoueU*W zheb!4X&NTmyL7%K3ku42IuiKU*!<7K+`)7od>JiVIFpNW(VbPeJl!x~{~3@#Ln&Ak zo0%1B@_z+n=Db;C-Vw@H@7S_hTxZFxr$MGiP(TK%agT$E7b_1Syvk~{QSJxV@M|)n z+!HGEKEL+>xmHj%#@otbQp(7dhzOHs>xNr&v#*S|wj)kZTlbDo^0c-4Bq;gzt|b== z3cAw~9bfL(--G3Xwr^^99@GDG2YTX{jS8DXlOLUe_Jg#xU~MEMqbEI*UZC>a9X zih5G_!}~|z`q8A%sv^9{MfU+7y@|hXwqw@>P?N?J0x?;|ZE7GvOR_6ejTd`WsgZ%M zPSo49sT5DHj2WPaA1)L`c2ci}oLhRHsvH1vvX_cKhH%L{&WKf4{gEGCo|$i^x2p#> z`X}F(3b9GoI2J7OC2FXHn9<6rEh^vVj>7=k=(S1KEn=e+%Z011^)2=W&<-SC)O;U& zpNcy$MGHq$M|FBW^RM718Zo`1#ejM4rh$lWi0`L2)VP4P;{uCOO1Z}$4yMfWwagJ} z-`#gO?hvx{cOPGGv6Ip06gUCp3bjWT=O&!~bF-%sL;0^tc(4;KBF z5;jFSjG!toOTd^C3r_O8+;yM~WrEsp*6_scw`9f-xk$lV)cE+gQXGwn)`LFi<~rOq zkoe&@=KsnB;osPcw}@#dqTg@NHd&)C;bz(3lE-38T7~r3wRs0J4yXxBYMs;U5+GDH z^*_j0JcGXI>a6p*g>1N_Nn!S>#?0-IoH*;+LlfjHG-@oF*a!OPZJg%zxNb#OsI4Ep zH6XUnw$wN{JhXfX^1WOZw@$fjbLL>DHJFx5b&RJFTxF@=;Kh4FVtM)7X~@$#{|7Ov zjey8h3=`@Y#fXGyie%MA&<7+MY35PMnbX2raZL#(Zd^KtZ@ll@rHWA+oDBru1|evw zxxQXj;(6jwILgOyldnX5#{%gs?t^R{@^*+h3VuQKQ9g}!JDy}Yb`>HW{-J)%{U@pK zh*3aV)zce9Wum6V8oJK-Ai5YIYE;$$vKdKW{j$vUprD|;%h$u@kXGZ{>b)TSf22(B zagj2(SAc`RBu(5cnG}0qe!Saf1&7N4Yn_VIGJJgZv_7}`xHzTH?^!$aZSXASEEah7zlz0ZgP&)UI>fh<@S%kdMk99b6&#+R%1Z3F9EjCx7!dw+CCB}h1! zS6;jX1P;~PjrPT!;fhMC;PbxDkbVSS&lqJ5ta^k8o^@xt0v?4BEF+_RNx-H1=8;^; zCqV=vJao#%%^g|oAbdSZ$IQy=aebif(se=BT&+=cerEcF%cxSYyPxlBZcZ~aUu(GX zP*`2`xQa$hPQFbgddUGh3(Rox$pWqhQt<(7?}_@m$I#4te3Jf)hBMs$UN4qoV^%9c zCbeMeY}3Ky5HGC%>N<#P_k(;c+vmk}Mj->%6~WN%p9792j}AQ-H~GIFp@BKT{GH+$ zs(qo2_FP3){|o!u3ZmKps@@H7@5>{=?QRk$BcPD6$S>{ia1Xc>0&7C{-`)Cp0(*ni z2zU_<|3f`x=cO!K+gjee4?diJDmYEH)+ZP7$asW4e#kai4k^D>xH$ZX73l91pkHrt z*|2as=+N;Lr}$r5@Y@Una_|U@+$_9&F;>~*-}`_01p@;k&GApaXraLv3nxGKdGpfk zz4V00EjeY#f%z*KbZzt7Y}xva<~`f=3eyKhqkx|ls>{uE^Xc1LZepyftA>T11=y}z|JCP!?w$I zFd(bf4-E9!%VeX=RNz@UC`;B=z2*8<=M67$2u42dm`BKmB2uK}E0RHdxptW{Khz3} zogt|Tvi^IcrvH*aqSETpS;0A3QPe0(RQ}l7RrM~vBHl{4;Y@~^5d#lOHCRiSc+icd zvfj)dYopJI;|JA{1w|tY>{QnFsMm_I$zt(iSs^MXKn4zM%b;5~JWM`OY;Se2iBj_n zluWtRJd5HdNY`LIqD{mxV`RuCmR<_oS%^rn^^q}VdpL|G12tah^o1sDmg(wU;y478 zjV^<%)4Q;+6VvAxUUUc9pug41t0BrF58wR&XWp$m!$FT_L@q-IL-B};PySf=N;wGm znILZ+Z@Ct z_LuGn+6@P(Jvb$Y>JuF&s8(7-AulI9yyW?VRZ+(AjAejR}${S1zR zHvuRtnsS0(U$|ASflaBbE;S*lk~!l;`QHq}f4q&q)FWr2KjT%@9ln*qm6eddlepze8U9EC zSX8Z2Glmt*gfnv%$nz3N;meCpo@{qS{DsB9QCc#ABpgSKfo@6PoTU(&mO5*sjfamw_EPixMhR61uyU(d$A6$?$(PK`V4Kl{%n=Z$2ejg-Fi-SpF zu>R-j_ZzVtf_guJ1>;)|*y##*tMBWt+aWO;pzAYVuuVYuhfe*^ghGV-F2A;pSKay+ zIv=|75b6*+AK&QHQ_zCwe=)RpK(<@Q@yfqNG*>BF2;iox3A7wa0@=@$wvY-9B26~PzI-CbOqZkQ4|$3VWI;r- zj+!&Aotc^d<9d_b+edX>aTZfVWbxZ+>D>x}w^2O@QXYn9pUPBM<0|%dguG~NfQ5Xa z^yEnmt{bJVPSzgT>jQ4S$d{+>W}md2?NK}{X4j;$U+De(r0dyEzBhe|e zQ8=>xX%b{oqcaLov4s+%%CxO1KEKi{H0M)3Dg!$_3qKrKc3l+$`jfa?n=BuF5Hj6; z7wo2f>+A(aC;WUDR`lrCviv`hvD%^gRTrYF;%E#``5g65GE+tpj+fIBzKdl(AiKny zM@yWM8sr1&hv4D74P!jph}WnWE(0--I#2_Z5uxy1v&ZWh?v%Y(hzM!CFqt73W)`S^ z4XN^Q|JEl47bTlh9Coso-JFe!i&vYVG@&NP>JTzDTzUR3ZC^Yct@A!bD$Vf6^|}yz zmps)fXHh(|EZ6xJ0{&6QArTVN*`Am`Om$v7zCm1RPMnMLjn={U^!4&=(QCu`mH${p zc${cF3U}r|D60w=B0{D*P3Yt|rpIsL=*u04vob8Sw|PUAV^3s3tu3bm{Jwopylqli zJi*$Lu3t));)`IdwnYW5lFxz*x_^lv3|GeWfuK3e&jNvVVcWAD3<&yhX@NN6XYJR` zQo+SjHZJM0Ez~Z_O`M_qlZ<=a*y03whmG5A*xpsiJ9Szfcfy`cPDE+onYqt!AzH`> zweFRNo4@bR2y35|<vs)b0$4_(GB@ya2l;emX){&#u`yu?bjxl2nDqRj?aj23xNYaTrEX8$@ znJA8Dd*oG9`+t>b#0xGABTr$H-=7^TwKL63D?i{BiZqIsizSKS_A@Wpnrh5r!$q}> z89A```bDu^1gU)ouck@jkAR4Kj~Km7o3~3*Fdc!`71Z)tpS8|_Lw>?Ua?Zq@s=c{9kEjFO&n zG6B=&r|WUh%KmgQ)9Q!~qrdwfl~tX1bKOXf7=exjp{Y?LV7) zlv{;C&XT3|4M~#%j1)KFmOeo)k|Ony`O*8t0avvjvjvyV2UiUnpx%kg4U4s+UgCQ7 zv3ahGrl&t4ts9}OCnpFG&hu-KUBb&mr{s6nuI^6c9#vWNs6bMm$-c=Q_gpiyp zf(l1jJ2P~9k21R+*8nQTYHp7t6tNPj!BpzLA5dzZE!wjEU*}Muw>+#WQpLmg4ZELU z{)q<8ECu(4s697c4z)lxGrVv6R;52_y35dAt zZb?({pNqGT{50(iZo2P)&su=2kM|A(2yUC+)#M*FiDH*7cNCl_BIML zXJ_<8?z(gkx^{O#d#Azk7#Peo`R>hG<$pr9BY_6l${YAC$9|D|ZurAw2tyhv7w?H&kaw?69MR4*5s9j|08=$_G|cU-t3IB*-b5{PHdD16s-C zYy}=IzepB!U;~8|ONNnNonFCW&=b2kX1>;=z2;cE?peTK-Oh8%%klaUIo z%<;pM{K2`2PRqfsEp2KZM5~q@UkMpeMOnKDB3C%Fv;NiwjZ?vMZ6vuj$RC zKiV#OJj=F<_~NB%<**PbQOE3PF`TN-4AQ+uuwmW-bNA01(LyT8A5$VUAl}zw3m!hv zJo6K37>q6X7Sp6LZk&-i3-XEd!^(uj>w+lU*h?&(!G+{k76lYPVC5o~1*>8ayV*|k zj|kKMFAs2s&^=d=&>JMZXc>ea-)Hz<&iVw4Yq$}s^gBCyk;h7pRZ0(tey`DDCpDrm z-cE|MM! z(P^N^3pzq82r&MNDwmTNraw3N`LjpAY7kR&kDAO-i4zG*T5OVx1vlo$%5vyZ@Gl`iyr|OH`be+8)`-B;hx=nm$dHBT0o2EO`*aZfw zFN9T7Z^sr=A{re52>*=CsCc~mXpVk`xQ@;UI>Y3CbxvsJb-FRLI*#(sN_53I!yku{ zAsLeod3sXwp(JN#cz`-T zu8o;ls5td`22?EInn_AZ${76Gc(h9;rg4cG4-Zdyfq~bBUPx$VUU$KpexoWiS;rt= zvIJp$_&+Z|@$cyTfJ826F#bvl9N~c$Mg{%y58cpJFR~NlEo>HElhDg9v|%H z4)xf+#$Zud_eEdSZLnpJDygb=0x~pLM|#cs_+ygE4adk8S{-XD_Jm*VI$^$sq~z~eOFq*IItT_ zv|ry=EO6jfoGrL0j(OA~#HH>~1T-&NBNFkSN2q!p?e~9n^7$KdxvV$R7V-*BF;m9` z=*ki);de;pA)FgVp#<;3%r=-JEb+RY5?%MhM_IR4M_J8xCMZPC=I7=F+pDCAqb2ys zJ;g+hZ;>zV>5p1Ci_h73ALxC9#1zUxr!YCVA)_&mkXAW<%D;aRy&QN+fo?;T%%0GG4NWSv_-{?J@)$$%iHifwQ;fVc#JU<43_Pwb#M8>`a&oCTD#1cpz$|0)~Be~KNo#%BszG{duN9)dFMK1cTGS^9CyxL1eb zT&rtoqbO=AdY6o_M}9oYk{{rfv)*>@eCupE&aXcdVzbI%#blisS5>OVpkqg3MjuW8 zIkBlFs^gFN=Qw6XlmVErzvORQA^_=~&TR)XZ=B?~j6xfr;ur5O;cw|;1X9Z3xv@`J z`GDqhII6eS>c@8y&*JHdTI_3UBj><2;U9Fle7$UNc(S4*+PnlC1LcqFth!VXw_3z> zCPC~wj}KawrWX!pNNeUn1&${9>#ZvlXa?IY+XLa(`xSiqHMpAUm zwnHiv?adD}f~vP@s?WX$Z0~g^wCl+M9ozZcU~x-PlgBT6ZjMFG!My{je9wu;we3fz zZ1062Qrx6_%C0?Gsj23yAzLy=Zh!oP>Ot{?+{!k#O$GNSYq2GV}xd4iYVcs+bM9>mP=@6l+PpffXC_p3lPVs z+0y59ePk2i1w0Xm8D;BrQoa&2eps*FfRw}+fd|;Sa<;b6>jUP#EOqVauRg3HL{1fi zfQqQ!F;FJcjdEJVtVMmP%5M2}G3a`pmfaJn+jaR_R#rAAXK|Q-t+RlyYwM?TP%YWVpXymVtqH`*u{i1PAeglaq6Lo-dt*wh(H0 zw%%=gTKMnLe+YI;kNY7c=qy-S=J@dp5Xv>NDA5JtYW`pC@+|l^&?w+gQNBzAQQkxJ z_#CzR9&z1^p8O9rkJlNsmA`DiKYAjeAbS%41|l*QVT(cHZTCxeK@)@=@unUZXlyQd zx@^HZSIC>eXMt>Nh`Bn8?t?zOE{ngdv%53?v!)2&ZALgA?Nnylx)~ooXwL~E1^lm5 z{`FypEPEDh_g;{L=hs+ge!NdsFWBCfQzVO^rxAnE#>s#2)CVU5FX(k~B3Ltxeot~) z;NYiHrkhM~A6j&Y7ODW!AM6sl7s-hw8m7lLb_7vo2eYDyj1TnF@V;5c%nEO0_xoMZ z?FhElc9LI&4t8`Bnj$P&!I=#_~qtm#{A##{oWm7j4Z(VxB26spRUgoE%^d z1g*S6SWFNO3cvF?(8}8OX1D0Q-MnQJk&-U}&q0VBYYA+o<|5^mA3dT}`n`xaZn=|{ zC%x*8XTmA5#q&1-4Khu;4tZ^a$VghH6{%rNhmS>_!F?1ya5C~ywhf~sQ`@HL9l}%X zS&+v9sBtfZ4Zt@!Wur(R+gV; zt4hysTaA0TkDKkt<4p}>URSFK4Y8L9hcI`3nq z0Z7G$TLvbVG*(B0>iLm2JbBn`%;hVRGm{o_Z^6=PvbLJ@lNVDc8x!3;M(i+CreK*< z)NmcTLYYdV*!%c@)x^8yNO8!uN=iNu=w|uo5aQ{O%I304==X_X%NEunhW!|F3@a~g zv0m7V5VfR(*IVNYPNQ8+-i@q8S2`bB+S|;)l_BufyBQ3{m1q=bB$%o3za)kjyD7V6`PE>C>`{Xgl zcUOW!Sz~R$o>Qb(yjmW78NOda+NA*J-!sYD9a?rB_y8S=$GhSy{=@6;hS*EB?|jdA zZqXgVH}jCX6)UR#A4y{cp6vgiT6w;@EsOx#~rcamuFKUn3ijJnMQaT+!mazrrw)O1! z-e23+No84!-hvlAhbY7j{C}FvZ^Krg;@bFiLHC(mQ1AL;lX}nX{tqs2=&eepSoflS zyjVr`ZPzVW;P|I)r|HZ1Mi5HqNV?{Ks>6I!VaqPq*A*e;@w)830o;Uy|9Q1w`r^6@ zgSQa8p$hS%DppIudO3YT-1Q2v)Zg&i7cXVrfRR3vqC%7TnrvZVv}^8^ZJ=Bv=6_% z%J21OffV|(ialR+JNAeXqh7WF+7fapC@J@!uE3T70nslvjAt%Kfl~uS7k4|z{Qlcj z!G5+pg@7%8W)>C>o+YOZfu_4Iv{^0UDrS`LQ5$~!8WviAt}D8#&||)Qz6}oLdm5bUg5Ls? z)%g2QPM9~I=K-C!*VDE<07Q)|I2Iy$hGYUi(%niAVrFJ`>jSI}xAnp)+5iaKgUA|q z6M?JanYWf8JqOoRNsa%bz8*Vh@FN`Aq}1)^e1ER_v+ON$1xt1rNiZ&9x`jjHpZ{J& z`PX$m#|wKv))3Z3D3Q_dS9~xtb z4h@2BgBawq7KT|_8kZ7D_sA74di|4{(ry0VB1=MSTrUm4X6uHaHtYI5PUosp|y3~ z0E4)XVTV?>WuPty_ARGNg^wekKG>M2l91G$Otr)Lti3h&55M>5k1j21CW3(Mt;IjN=lf=y4<4BBXFIo*s-J+1f_prwO^D4l2hzjdF^E|fIR5zlB zo(b0ngui;Mvx?>aPI)R-igQ3RQ;i|cXqp2ZZ|cmFSGUpgJDUPItW z<^J9oO#dHSUmX@z-*zkd2#<7kC?JibbO;DYcb7EC(A_9VGe}5>bO=LtNe(?A;LtU| z&@gm!w(s}7=lpZ7i$7pM)JlX>k_bDWR| z+posBJp<^>xT`Fo=s>}qK|Rg0R~%%&+7EQ@j&{`|ggn~Sh`;^L1B9+GAskUGIE3== zPVy+2imfYKXcWJyv$LhxvvuVPj4iEi%8Ow#FNAQ zMv1lsweT+XKgyNx99#ppEj;~_6&`9_@j>=7!3@E6cfm5UBLJESRB%3KXm zBh3b214SdkR*3d}Wtqu1`o#}msV^eAcj%kR>f&N-;6;8Y&HK|q@GC(HT&C8< zsuqB(imfBF-anWc8dtm&xZab(l;KlsB|2;d)*{fgvsgB?Qp<3$wOGuOuerP%z`kLz zr(~}$kJVPUo16!EmWH;r!BTM8 zBu(gsZOj{p@H|;Jmy-7B+hHtgE3EJ)>~Es=AskBDwj;^zBt1Lay|7(d02%@-C)hkkijE+`E&!SQb-E+=HCn_vQH895^^b zQeHRA8-5dyT?jA4;uOK^uk@yIPl zxXG!iW(iN63@SU?W*l^^D-BxYY$}f82P0c4NDRKeZeXNZ_Xn#!-u&t4x^3&CN=Q7> zyL4x@vl?(m`_vqNUm-Xu)#rr$%xH9*KXq@^R8Y3V-eP|I$#{L|Onw~M)sbZq!(Bz5 zdY54dcS@1=sPxho!}xrNMmlS4gJ%36l8gA2D9q4i%bBmL1yosQdj%@J>$%1g-KbEl zG0&K}Ys{2`kMp>WFezSQ!-ecTp;ecIaXDKdLjfBos=OC7GaqK|vtaJCTx~{(>BHis zf6Pa$M3rxcxc;E8vG)ZN&=yRdTOZq7`?4{Al z!cDg;G)3*;KabQB6(+~;&MA(C1x^1w-s#_e7aaUkbOPg}6X??2+pMi?**vi4%MthO z-R^kKdKH9C`MdYy?d#zM39rPSyZBGg)8Mq0#C0`8#PtkKMsY(G&EZIpKgRohv)Qrh z>KcW>b+4<@z6EBh=O&5yo)RFMo=pqh#kt;-7w8 zpgr=3wfXFS?&wmuy?SPb=;*q5bB4l}uWAe07E5GI8Y4+yOz+u$p=|=hjcPCb+Vw;k zW57I7VuB*C?>wv)#0B025W&UC@3nKfz(uJYQNR1dYujS zqjD~8uZ?&wX0vJddUzwgc6?`sCwz0UV0N=fWh%>AdI@~)3hzG5Qc3H1ZP9AX1U@^> zdct`uCCPK!R3@T>6Kw(@ja>P&?wFXi1aM`i!CwQ7^69>Nqgiu~n221U_#krh_dg@? zIt5wUFvoxQb`K$Ys0KTeg%QyNvl_L;-1`A(b!`*TE|PxI{JdV{uLrK8+Kw%%zO5hp znOVHT1`h}1VovJ6^&TwID+YE@^lPoyS*#^xb5_?Z&vG7Oq9VM^#RTym_lL?@U`g^& z9ybv$e=36%JLmfFn-}g>Tfhc*eTgx-)S7Eee!T!tKu2CM>^xscFL&`r7SHy6TJn|> zIXJ$UU7167!UR}oeV8&dtDoZpFK*YDYYNza#5jw@(oo4X1x908FOK0-5*o-9H2oRq zE@_?nwKFSpwc&;y)~v2FP)}pnsbt<7;&fg5;bRK{q-Cn%8y{PG4Yk9J$R>kzhDnT9 zT}OxuJQQxzxh|^LkFCjzqw9w_x#1DeI9x40IzTtjO!_FA9 z7Z)|!qyIdZ&|%RHi_BCqaW3Sw>ob{+uM1S7CA&&#u*M--$m+CHy+4lru%D}Ne5+CN z#UCMa_H)I(fan*nQr7|^c08V^I4B$F{0I(p>g}uH@nHYeL0aEYqL>6sov_S{dq0g4 znhO$(xS(Lai?+On)U`nZ8OhEbhI&Ft^6U`Lk>r2$&nV{o)d$Q$PZb57?KFVhWMv$2 zWS8|TzMo#5XjL{8_$1EvKHyCCc(vO>o-k0`IhMq2HdnyCCFulrZ9FK?cjoh9b?k4S zj8`7UE+Tj4p9xc2#1JmfzzZh38b7{t{$@v4&s8vwy2H!#wr`YvRe&?wyN>4xjl*JC zDA*tQ4f^`U<-Xhe;;b5`*?i$*Vmd;pZ`tfswa0kq*}iln@(dN>bD-|8K6{4Mb${ud z3`+tkL(z>_GQCp!#UcDS^XSeKXuMWd`><4xmAcMWwmsWm-ga>1SM#m9KgAu~jaxmg z?bnvHibN`MVvyGh8atwCyL4^I>DP#^;{c2VHl1?qNA=euye$E&EblK`uR7xsxDvC) zq8ZssTX<{pU41*o2To+?MTfkD>Zx#2U?!_KWL;l|qf)C~_Wx-C<=8krgJE?UU!aUr z=Q0naHE6TbRR3wk1I;WdcLrYiGqVN|16Fi=JA>zJ-cR&fJ~)1Mc^qFYffg z>ptK(rG@SAft!BLVsM%V4=IvwV0XItYHj zqDHpUQ2A0X2gtxMPHi4A_i}6y=6~qdsymw}ozo1@oc&?DJ)4+L_C1+2srmAHS6cBf!Oi)BZ?2-y|<`&knIA28HWFXlc!D;-7<5nj- z+9>N-2N+@^9p?v4$P`kxhb0;+1t_dUa+Dk!R9_WL?Ve3Ax!WbiI+YS@+GB5lSCpt;nW@@zgv zCLWAz^6bXqZD3m#^6%I)pTw)7b=rDf$JQ@)J6|3VB}ojqT>e!DlVs zng-c>>!*_U*L`BxeSgdl@35uYX3Z|7^sJ3xcrKk1&0xWg$hW`_o7as-CdUCOTWqu7 zm`$IArNg;y7}~-);lap#+YTBvTpmtr42z$a#de!rIS&ZX`W??uOA#jiZly<%(Tp%Zl?GKzb7SR^=#7u&H{ESppQr{G@G>P1Ps zE~KG#@@j(A5+8vF_px?|U$S@wRP`bmLBYp8BD!5yG%!i-iE%W4zi%{K-5A;i1DD;W z_k)epf_}M#mm+^mCv^UJiRj;ZYw20PsdyfiS=53FKFDW1`PKS{6aMS8WpCiCxNG@$ zY_pb2*oW_IGfka;=Q+hH0j8^_bmr6Pj#_ZI|Is}Q-Tk&1>MLwTzF^sBd0pX>9VmN$ zLD3&cUxbm+X%n5=oq^#K)$c$#v^9{J*lVn*TqTC+W<4#5;TRFh7Wo7TYpDY}Sk)XQpj;smy4C@CPbKbebIb#3#JE$J>Jq-CNf4aDHgL2}@@gjOlLWa> zMA+3Jc=dWVN*=pRt$Aw*KJO)Met|RPIx^bela2;5XH#zzqp~vtT z7e|V~BAH*HiEXF-(I|Q`C_K7>)5w)2BM{AE@I5wv)kmTe8K1ns_&BFY%2{BMuIlpC za4-+#Z|9rs)E3b&)!RsoEmJVH{oBz4#hDuQ6;o7iZxD#%G3OOF$zP~dXMDl%^VK!C zgjRmbe4+8^suzu$@3XOsoh#b(pc>_i08DwdX3iMJS4ssl)}T)1f_X+Q?ro4K_dxAF z2ZlSVfkcff_kX{8;VJy9W~Z_@KW7b@CyhS867)AZ=}1ZJc}9Ni95e7BKwno}RNXKUrs zpdOjDKOZEQA{a{vw2~=W;vNDc>2uwr)Hw9RUBh*-6po--lamQ7wGQLKVSlwxYW~_J&#Pg46szReP$0V!cM7iZ1u?n2&)vcQ8D7i7Pg3~Aarf;- zzEW@6=Hka?MiYG{kcowuxw1K3mE#eL6&Who|HUDZj)%7DQ5b)5VF$O5=|+LW=JJ$? zw7Nh-y5@Sr_%$2uPI*sS-lTw|hmN@$z1l*(hCeN$A3Hmzcc=yP?Fc%Z>bUOgyi*;& zN%2fW*#^$MIF*VHp<@lcryHc_dL~=EUrfUSl#hc(D#RfW@!+Xr-kxS&n{3@S6L%B# zyt`;__+1vXcmyQqeb4Zm`9p5`q3Ja~X?ysb#hP1MAc&2nIF5`@2okY(jWMsl6DE;_ znX7<`^fk(;R3|#|o_(-*K=>-nr}ht7Ov~@n&99q^d3pMO1T|k=1%17xl88_^Wvit= zC%9CiX20Mgg=0470@EhL@LIb&QbO=&nzs@!a9>!cbNnaVa$iTl_l{{bl zPhI$12!MCQQ|GImWYPc7DpLHuYml5UWO=T9_h4_da9Hy&9cnCb>Rpj_O)Wa2rY?E; zIwO_N0h{#k=L<>##(&nQD?5)d^ze#D5C!!6R&Rt`frs)OAUrA2c!sILob;Ro1op2?|bV& z!AU?w1C^4G1a*UN&=vTF$&$ z)5J4DtTOibzYH5xA<22o>bUrT7bJHj^4rL@1^UmKg3UI9AOqOWhMQbi;K1q7IPt7$ znbx>%^`3ZpEYN1eMG+y$6Jw`cS;%;|8|hZT{!aXjrKK9VyKwnKHj3neHKUNw>@Pwuu9m?MNJ@xZz{7~YcF;3omP8$U4cQE|Be*fax zqT9fag@&PVQuJ!rPxgj?cd$bT%~meZC&q}NP=l6c5@Lpq)#cy#ui54kH)VzP@|ss? z4FeVmJotrhve<0~H)B_=s&Nc-x)*j2>1!?Rv^2~|U8n1WoC8drmDnWxp*>9xbD-_V z+wYgh`#j_5s0UZcYC&g< zEc5Yx2?Z}gFQfP3%;!;(5f-%Tr5oyNt?LK=)xYOD0(-o89`1?dWuP^`BPiI}hSUg| z{D_T=W6~DxbKH3v@7I<8_iO-10yrc{EqgSfzh@=qH4s?{2fcn6ZSMw?WBtON04CgiDp|vnEs{i}w~-Za3Sf4_?Fv6!Tg$sgGF zwA_+TKjC>So(P4@t#J;OYR{tZu)aQv^xe51fuPR5i<5Du$DlTAbmsF<>~Z1;K|W74 z5-+a29l3TTCCsEoK7B|G3+wACqkv=?%muy+^g0c2i$3^HL(Cw5`dctGYwnG_Q(9i< z?{|q`uC--tZk`i?Oy<#9)AV*FlbM~&Hipx`zl=!ru3jLOkO*3mhS{xNvwT;chAwY& zd%H#J*2QS;@oEfftn5_JZ2w5XR_y1m6PG9AK$9Vx)qd*;$0hQQd5rT%iM^KJllkQB7PnrZX{wUMpaV>ksjr0jy(QL z#0_#0Eer?`-3*rK*o~WRYR=3#H`-4fA30xi#pbi{s=}n|#D@Dh`l9oL9wFMF#J5|t zqYXT!uulGLhvWg>ADV&1{fU5=LcyPXfbHnycY3I zOvt$_FrG&7dx0oxXzGak{LY#vt?7vL_rg`~N@RgGe*lzfpKcs0^dSExFe`3pT|3Mb ze63O9hUO(4tHGfeP*@n>S!(q5E%Iqd1{jw_#~326pk<$&@=d-c)?X-G)D8JZv);Qb3yc|sm8za z>(=)+V2>D)_uj{I;>BrEQ>_$mk4wwNfNI3={AZcZR(9tTvNt3WDuJ^$_ms^16!93_9ll_b+7=7L01@hk&EZ4a8Tly`rSe1aFo{pF*cKf)$F#Z3Q zob$?jVzlhP4`&##$}3)V>5zG0_xIe~NAn$Ya1KkI+XZ!p6Y`gs6oGf}A{ZwPa*wD6_o z)U!cEan<@hP+fIKI9?7~oz8mU$!ci4rGeJ~%%?))V9Ee14bC4{g>S5sv*HoTJfSOH zbfl5oUBC);qtR+Fr=;K7pG}$H5i!pdyi6VQ3;C(C%ZI%bpzhz9ShRqxdO5%|?OK06 zZfNOz7r0ToE&u+FB+Ww2;*-23dHslHO9FUSn3KTX658kq%SGQLPwRn+Rg;8GSceNq`cd#Cy#pp_R?VJeCC5$&$ic1}xHi_L4K zR!n;Cm9l4rg??@rvG|^L#f`^0*O>K}5aRjeJS7DV%!?=1kxC=2rnDRu+g~=E1 zp6NAKa{>}^`-s4?AuX64aB zNW9|s>!f{EJmI57V_2Q_p-A#GVm=6+c>?0#SzuV&Mms67Vz1dp?hE=1dD%C34r&0| z+}R`9EAcAdVESEqp#N<9dfHGd?JFaqglTD2>3<+uaQzGxx!GkKXntWi!TMEJhygnK zL}xxte#oWF)j&c!y|iv0SJibKeqP2 zWx7`D5oI?2+56!7zOmVhV2pFUv)`8MkQtmviZslqJYM~JUK&V@edTmF#7D_l#$xcZ)K-gfuszci)pRMeLCI0ThF2iA69Wc~fw-s#E1ha=G$&DFZcT z??BKh+{12+VW~kEw!z_3CC=*(X16zaP>EE3)Iq6t$F1OXH{G3Hz+>jh z`x@=_ZfCKp*gF;F*wcu|`}=@7X27EHPndO~}jTM28O`8GknUo4LF( zlb(92Y|jk|DYl&zx!n}+EKyw?MWwdqC_5dMts#x{=mJBSk8bhzQt5h6sjUp;GysAl z#<-KXl1iGtJ|Z6|(!?rJ$2|)pZI8WN`H3T1ZFcL7G{WMd#4XeoxzF}pc%u#8%S4oO z!trL7A?Y$a)4he(GvX!oe?^SFw!uC87Lb77v&P6S(pxy(n_$jQSLr=}%mwhImmW__ znCx{Kv$*|8`$dR39*ncUQ|*b9-_AF!OBrx26Wnu=WLDtk#qjPE^9HnL3C*~!oXtmt zeV1X&+`kB%LMNkP#ha)soGXADk+~NWxrjtL{z>?}dQO|J4 z`;TmU08eNgZM%%=RKD@x>ZP%wJUfAO%MW{hmtUO+32*Ds&T6cDJ(|XzxCa)6hsK-z zE_33qMoH;$Q!SyrcaO9ty$ySi4fr3ff5K6c;4Q~`q<8SP{OoRi{-KoIR4uD504lJH zP}FC}$&i@3r6mOOd!7j2$Z!2?_Ez1b?up4wB{9a}Eo=OptT1cvt@3-#ON~)_h;aRV z&Ik=0CV#ND(~7UL=bbIZabOkoB`=}jZo6+o1l8^;sSuc`KH$CB%ss(uoJ#KA9xT?#SXk{t$xCab zDbXu|@;MZ1z^{}&Ygw7^7s8V^h4PHM?z_)2gYYcD$hDV`sEfk8$a_TOzE5uTlACd~ zLAJDd;bJ#_-cwFuel@rN*iVwT)6Q*>@ zr{+Q7o3Cc-e)8GUZUGzPeL8!6#?Nn$9!*T|m#TtvkyqZ5*IMnHIZdeJba_Zrms1lI z`FMEBPu2TKw_&(rxQT3uy>6Lc@%O8|6#q|e3n+q>W%W<8{yt1s=xaqh$0dT&Re!p= zApiM#WvP&;K}-U~Om4%L& z8GREGM5;QbF3$B548tfjcQu_+Pq4CAd#t%8G}7~?$3FQplWk&Ev+90OHfFc4W!6S` zoh8KE7*p8k)bvj2(VGyQl~d&BBuLwa+$Z&@%9Nh8N})4B4DOh`Z%mmRD|r(n%y!j& za{Or;bQvREo(CZFS|ysXc6=)U#TXV1|PJi}hyJCLP3`;1S{k zE(vSl67SyEtTs!rFRxvZawWvYPyq)e!jP@_U* zF!IBee{aU= zsb{dgo3e0h`>M-3`^n>2Nn}$I*T3j%&Lj&gwN#=-$_qkHvIWSa_HSDWDBVGwqw`vs zc2mB@3V`~au9*`cCo{6AUrdvi3Cu`gc4C7g{?xNx@zx<^OV3$8D28q5FuoYV*^0sM z0}Dn3rTxeh+NTnK-#yeIk|W=whrrFk!cao~!5y1LYQ@-n4mCB^EemM~^H z<$-e;R?ylZS5PDid;*uCp%WoXZWQ7^^475UZHNty#;;ekLST8YWvn^Zy3Rfk^zo@b zerI(I7ns4fUphH*mINAowLSqxeC;QHZ|s=X8z4t@Om{;tazx)_II32He2-duoIQD$ zTPU3o=}LOZlEog&*JlAG_!Im%s~BdC3nx6ZZ(inp5SkYR#ox9grlpBb0pKmaM~J|d zM3{OZ?tYm9|1mK>Ry7?n4VSAG2-v4P143wcP1FI(RtR(%h|WETx?A-9Wd4NY&A`j` z=Kd>L>;@rcA^0yo=lN&<+7Z}t<~R0BB=+TWfRFqMJ8!{M-k1EjA*6WsP5uIU0vSNC z@qAwRbyQcTx$1iJPT|{ViHNmDj2yHnS|6yEiGSd}WpFQ2;_@0P8mrAvy5w}aeAyWv z7Z-;VO-?vJAb0;C791eXSrVOsQ0$kcUsC?VeC5>ekC9&!yOc`X$Lbb%xj+MxM^e8r z3a2ex)>OQS&X@B>izo^7WC-P82Lk1CI6rQ%*Ei~NpI9?FwX>fH`hsG&%;%TX1OGE<&BPgYQfqnxMOJf_ugC2R!q(Ap zaf~+>mN{Q!0{X@>XMO-XGKlUI4MXL3_4x2Cfiu{AHD*1mB^#~f3z0CiK5VrY5w&rN z)=e8Z3hsyOvOzZG?t5#-;=HEirK8s+y+)ocu!}|=G#m%5lu!gGW>;;L<}7_g6&vjC zNiBnyTJf`g>AWR@T?=l=8ZzBVf^2cCf=x#UB<>C=NiOwZq`@aH%E~LQzz-h zpNEPTg#AX826bv<^-e%KRLSwl_Qs2^L=y@Y8dx`Ryc*}Vi!rBlcQ;Bft@tR})hepp z9(XYMn41r`EYlWfjAhUaq~SWPCYg#nG4NWu>o=x!&Xu;F^VzhNgmRNVYX0;M0v<@r zedF1I!JTbi8X(wZWR;B&yq7q(4ctGh^}N+FCN@6=Idv}15uoVH@TsazU@lhGTa<+* z;vlY=;yP92eyXbfHd;fyEsWT*SrT~x_|l70epyenzSU)ufExx)}_*B zI%#7zzeP<`q6xGE!o0&ilneQkvDSE^OeeG^kv3~01^cxSNv2*62ib_*H%4_6Kx-=% zZxH9!n>G`=Z#CQ32!8i_<8xX+%1sKoH~TCQmy#+TseU0L5n*4RTx4!|1`@12i0uh0 z#IA4B*#>1M9Po1t`)0?r4tbthJ}Ws`2N0`EXKNia{D+XIlPB{H-!d*5dSe!x6^RXq z>)blyzqhdm+M%R3eSu8^@RtJ6%~* zEVp<419c|;LQ{U?g=;ePK(3MN(Yhr9rdfJbN4&-M5JZ#Cp?P$6A=Z0)O^|yHTnrYB zV0{oKO5H9ooxC~-zLyI+lV6c)(KL5=j}bleVNJ0{p}MaBp?f&)m~7s2Zq7Lho}v;C zx)Yi+PMP`6_E(s4TL}!kg2TJkJQo8m9n#XsOJ+c*!Gd^Hj`ySP*(ngg5J8bkj*Nol zt~OK!b0*>eYw~QbrX=rA#cOQp4BT2c;^c@HmT$3mF?MKT<8CkNj7T@a};1 zNOE&A8aid#K6^$-YkwA;UT2QgwzrSwK3Tu5%xSQ}lGNdL^%p zBF3?PB^1Qm?N&V~o?YhNw&WtqPRY=3Vo&a<3pGyphW&XIM_rCZg~}l_Z2|C+qYeKq zq<>m==HFkhTJR0u-TC7Ud5+-KNHWk(@GbqnZla3rwjlnvJNMx-N>WMfNeRFq%+xVL zh3`_?VD(qPf+jbU$rr_3xg~w)=$7L_C7$ z6+?kH5NorUciQ~hq;+lD*%()e*n<{-HIWMu-4M#dg2Mk;pxOp42&_32_ZbH0#tD98 zdM}tP#2ru4D~h~l7Zfm5rlldXpaomw9-N%Lp%)d)6RqR#9!5CG9M2cz>QF8{hx0kZP}zF@d2Ne@Pg7SxTcnNUs@9v7RSxi z)i|bth5!z{L@Ys`bDP)=eJ*z3Z*BgKEX z`1(u}MJN=oA?d%lMj3y+)EES^zfu(bOmGu_-Rm^KcaC!e<&=P^K4=P$8aV7G z7IgGjDEU!Jo)f0Q>(VqT?k;;zq&~pyBchuwh0P*DX2HSGf4;5ZFeE#S7&kC{9G*u$}mLB0atk({2cC)LTgb}RT3KrNuR z%&)TXhK&N$`pN2P2&|+FxmUpuL=-~(VWT6DM&^7P9yE#65zyM z^Ltr;$!X#Jz!d5Jl`5eJ5%9FC-@}NorJ0rAwyk9Sxs=eQdD=Ev$2NbXBg*~p8hQN- zLt?PYXNt;qN6C!xJ|F;;6+tV~%k|h~wkCNOk-MgqdqXUFfspJu7c`b!MF1Nr+3D_9 zAE9aweQGH7t`mm}4!oRXjOK@%J=X6^ck7R*k0%N70m(=Hh)cKLIQY@dWw>BFcqQn_ zzxn)+5#gl;@sh_BE5y`fOa39A4hguYFLPQ;_x78h|GqG1GWLLN6?cDZ;yh@4x0EXHf`XM5U`Ac6SDIJL(7? z+TS0|L(FkSWP3$4EuISez0pn}v;FZtnEc*^<00Dh{uf?*`pP3PQX(UHhP!+|e)-XB zRHomZ(_`~Q=RdDgLw6q)cuR8zl$PEN`b`(n2h!_W12heg6#^Q+f-uFE80K)0H38Yd$2#mhS-7 zC%^RBfnfVdrO*;-e8Amh%ki(Z;AfHw*%xc5IjU4T%e}IQZBGtblR0P5MDl@}l>PsfAKQdDO32=DuMW7= zF6Y#&W3)F{thc}G(PiDF}{p)Qb!%&V5Mlu1#pe zca`zwOFV6xr}|sY2EwpS>LhqMZO2CkFMns z+z4$!PrFfH+W8OuH4+c8E;ifnypz)QTtU906%Yv>w1(krxq2O~E)f}VK=MwR6e9Wh zvIg$SYpEL|0()}5_G4A<(YHO&^1DXHJx8zZz?h@gB)_l-`kZ%VO;Es=Z_sZM8|g>N zGiaf)2gxKYxJtqwb}e)vmv8o`XQPO`3v+mZz)t9~kdTdap$3SobQHy}-_iXhv$E6? z4g?y#ubv7TBSxIE;!p4gzJ=Y95On4z;y2%#*C6yAQNn2Xf$>c-(UMf_648pE;-PeU zcP2s~P!H=|Y`>PhrL;9w*S+VMSOaWu4M*x;5jejYs9Oo5kyE%P(?I6;AUUx#@A*=ov7cJ#oSUsGr9UNI%Ynhn1k=obai#F?^Xgoa|Q0O zFLDyw)B3EUJpi~Mqh#FdW1wTUTEKdeal22#LKmX36gE1Fonn2u8j4rb(J}TFi|i_< z>uPYBx_;pf1yFq>sa3}{@%K2HnMTImO8~(0D>gJTLIRbKKL?2#?2WH&HKa+~JA^Nf zk#)LA=03K;>RJsq8R%M4Pmww64OMNo8BpF`AaJgq1sDSEO4`|>2s+RU4vm0`NjJ0( zkkMTc(%tTL344fPY#wv}_RRhpe6@DhQUdrd#ZY}o6%`eT;WcGLt^_ltExi`V{U#a6^jh*vbA}A$pfJ)-(X}TrR4)BGP(VY{vKnbq6-eU z^mWYOY@4mtRP`JQ(h3CSkUPz;L#oTy767Pt{rO_y=3YRv*dWp;;CAy%yjzdf)Y{9Q zt%r;Ko@)kaCM0`)hkmUHHf9aAHq`iBS2OuE@_5iyR00_1nBsoc=gyjB$F;~U&aDgT zx;u8NY2@!{OZhAs(%-VnBqt$Me1vGUp5GWYaNERoKsKdyncE0D*R=E)M-kq0 zWo7h3<#))2VzX3BCSU7~uOsM&aS<=x0#3??CG&vJ9^hx`<~NFhDOkIKcZy!OCaNuX z8+2$QMlOT0PR*KAxmIoo{=gdnorBv=ByL1BEsn`nB8ZDfsmXPh#Q7cTt_N{$BNEVb zCfq~Y3Q#*|AazC&Bbr?tB1;Y>Da|xV5vhWuB3_+$^E*7EI)HuimwK8Jb?@TgM?pUi zVmhTHyZSZ)Qy;H(auTM!RIhJ!yTAMxW%4ZN{O5^Y6ThT7c#~Lj36|-wQ~yT1MLJMw zw%k3&!cT+Y#%8iYK&#*2m{Ov{>Xtg#$+W$nwlN{9;XDo5rjmB-}rUXjpZj%J|9A=j&)sbk+7H45e z*uFR7*vQKI`JQL5yhmG@YE;lPG9YLz;b)sGV|`5jcH!Ibhko*{0jx>G^@BV$9$KF9 z>R>S>FlmthYe5Cn4{(XOy`9H$L!lml7JnY-on=X;f#0DMnRUkbe+oyMIWQFARzQ~6(|KR0!rbKaeB zJ<=cDXI~z7uK07wgQ;I-E(DHu-ON-?f~I{h+k!*s9;4_sJ%Rq}`|xsyv55iAuPy;9 z9L%pB4!08#5~D_kzEoz{!+Mt{mqGKfOG)!@$3C~%*xI&upnkv0jUnUWl@x?F{3&&( zsV6JgzKTLrR8<}LtL>MfsFQnp2VJS(hI8xhwPZZha|oP5`lcU6{2oD_q8q?Q4w zkaP^|1#w8uJvstv_TGLC{bW<&rI5-F!ZKqlA@HprgxkBbnq= zU$Ri|b#F~C_q0uc5@5@zzX+ z=y!e7IO%`%`}DM6B81N>2KuXlz7PBv&PjU$?z%c}U$tK8jpGXD*-U@BxkH~ycgH&t zzbN0)*gan)Kf5?vShtjCA~-kiv^GbY-a{@A=HxaV)_9j!_-WfW^bIXA_b>qZ9LxA$ zGm*5fy;zUbt!hXh#JLH@jy^Mn4yKoSe6s*zYR=W`6S`gMNV{-jr6O_BgYOX(H)p}H zB@HOGI?UJguxsmNGg8ET5=rSL0YxOBFxFa_U%;?*Q#mXX_jQg7j_a`Ns2fXHd?yeI zp?_s%i^UGVLgR{>+^IgE`;uy${G_WBnq0Y;(6sCRmj=7IF zi(1P>9?z_by~wE09N}CmU(3N15;-dv9WY2NUF#@oy5sx0@00tnd+ifCx?JnX!E`RSONWV z7!`O=n>x`Q_6T*WVvsGR8B!3ThuA=}=x#D&2r`k!t+X7>IC9oX6R?7J_{;; zaaE2Wq3zmdNn`u?|J*(wjn+62eJ?W+(nmPh;&T5ST+sOo{IdF zWmp{d2iiD*8qBM-t`~3KQePv(FVEw3wF0TBior0V#J6{dnz-CH*Jl0|7ssaK%+IsE zaWD?@h+`=6cF(u|as}ux7XH2%I(q5)9P-UO3?;U}9M(rbW&li4+jCD)fq-%9O)!ED zkR^f6qnlNlGqn7W^hR5!mnGJ9zwv1O0^XH{Xv+F=X^KA52E@p;^l zFF#ix5fr5!jSjZ9a5UMNrm12|;`tHm4ViMEP)@Bato3n={uy8Oip;ZoLB&meg!lyg z!OJDJyzm1sk))HrI!5g3-8!oJ9k2wY7xXULa%)*90hBXC_PuuWV#PUrYW<3c^MCufg0Mr!M|C* zSUS@e6ILloll^p|h7&z#O>n;Gyb`JnZpa%ZNbxnhbL%1(b72!SZo&_RV{%UhVWT+6 zJQ&R(_-LFK={SIM5L+GL%2DludGG*D!Eh<2m(zJq7xO&cT;I^OBJ#6}G(R)RWa4pu zK4*S>@444aF2>rd3oZc~=QtpPkhrv6ONa>du|nNRF1W1t$Mw9A=ftzq$-Yg$G8E=G z{6OemJ*0qQ>}NVuy0da%XO; z<1#2&o-Q!CveMD8l9W$t%KuIX+?yUTek}QTCv%4c$O(G0LHAx9t^h-x%@g6`;$m)W z#Ok=3*375x2xvTBJ&mMS?C$*hsQ^64pQrqdaq};rcK{M`VL~|?n?ktdCuhM5SKKHM ze-jUrm8ply3fqj_-cfhX1+E0hjV!{)5@q=1yUcwN*f+Z zTP$QD(oRJ7Qg7(6TQ`P>W05;EQW2MD{D8*&37k4VO*HP!SJYBkAHCCgMMx$D>$(i< zI-PVq>QzC%PotjK7qJQ~VTEe%Ka|7+rv#L(4NI>wC+FImX(t)O_v6zIBXt zP&3S~QO{^pm6-K|qDP4{Bedj)y+?Va6sSi3AJ03x{rv=-jbL%l_m*M#x_|->K_~&{9hbgx~ zbP(yfzKn5s-6X}kl5o344VPMaxwrMHHtf$VW&9;Kj<|_G3F&DPaI%gUwj{btt<5t2 z<3XruFiN%G|2F0{`Wg@Z7F&mgZP{!T#@GKergZJTx~W>S+*|T74|g8gEMAV=gNrA_ zPglRp_y{XmKZ0NAS zrz3o?JFxQAHyEzyw`4BHizwwbd0NlmmGXy&K*ga&Owt?rf{j71+{?0 zw!_x{L)BY=MY*-#!-KShbcaX^NSCD24FV$F-Q6V!h;)M>ji5A0Nq3iYcXu~@dpzg- z{_p2C%yrGk4A0)rz3*6S-FpWlHm$7p4-A}ia{G|W(CRkR3OaGesoHcEJAI(cjOWxqKc|_N_oteLNDmkC|psHHC&u5dXLZ4|)bVA{ae8F;@>V3jk zJ@0`6j&I0N`r)OC1D|g0BR*2;fmjls-gFfjd9-ur!?}3tz1Vhl$KMr6z6wqMZQc8x z?QQe*rupz4c>c?eS~!K<9c%u5;lTykoxzecJf8TFZI1BsC+ma%Z0Rg#ME%wIl<%WH z+w>FmyaS`%J#f7ZPNk!bg=vJ-U(;HuJi*Z(KZ%XX;d%EnGQg_;`JMf^^>FRaq#*hg z&xOs$Y?o`+r=zs_MPu(&!nHDGD;jar58hM~Yid1o()O%LBf2g~G#-wckC&LksKppL z30$#N^S{q&9LZr*HUfAb3b(A|b_xSy+Sgq0UhPQ4Ua3NH9EB#^Fsiiz`8x^uA@Tdw z{57DH_$H2DF=A*?MlxMNOKVbJ#lxh!d`C&}YXi2iPHhzf?G^qRM0wB6b1%M6vp)incD0WXRx>f6Qf0TFj6AQ_Q0d2--EKp- z?YsBK9E2qc*>Rk9bxg&EO5mgxLbTf5EIc%6ztQqx9QehHOy92pt!yYtc@8|98%$qb z2YH}R5-n#SBFJ>BTN|Oe#2`fd(GKQQcqQ8L6+9osSG>3CYO_SJ4?&t3UdTW6(Ft~0 z7)CePo^D&wk5xVF%nuU`OMS!Shn5`wsNZxAK7H#GcUFaHz*FG z$XMlBFO5tJb{jnObb77f`8gPEvXVSaW3J>~ROw26_Suh#8N@UQkTovO>JN!1q3iPu zx(a==)sph`z;L^AT#21))T6#TpX9ATaQ0HUgxFKs2Hhc1siC#E zuVw$Rj9su$`{0ewhU8g_grs|x;-fHI#JTQkNCRmwO^0)Mxws$DLWxg0`)nurV)m6^ zL5p;N%P9fEv}w2cs#@sG*6r}H9&xt3=J5g1ZLh2g(aVXK2I_ulH`B=9yu$^EeLn+kq;7;Gd=Z?Y2HnPs@8qhj{qz{P zx$LfpV_o0nrl=kQD0R`DCwToMdh=#T=(1wYp>JSh(RVx12h*?ML&EiT`hx=H?dz~K z;Il%mH5#A*VxG`BVWCbW_nocn5_B`gd7H$(MCQ|w$jAM(#{WM7T3wZsqI=i7d3X{D zt!Zu~0FIb1+h1-sYpL$NHL7M3+B=68k6o?gxwD(ZX9@NQ-d81MUS`S&$k`ti(|o5~i97WN zvL8y`Cw(gES0@!w;YK}Qq`$LtwvX}0zI7)fr>$T=tUnzjQCeVMd}kRixGH^| z`QDV0K2%nR50h1Y!T!2eOg;CUtCC&?SNE4Y>vmt2IqNvZ?|7IE`pBWqF#;9b_nv#H zFU2I=#e{}b5g6GG)h(?)OMgC^!6^s({Wcf}4{TdwFLDumuZTyI`RrHm=V?KI_*Vz^ zl~~P;@2z29%QX~g=TM7e(Q}2-tHojRrcV(y3uXgnEErZ=&soMbGDq_jRgJ~f!azR* z5q&7idhU4ljUo1l!edXJ>lnqdA|U}~U|IHTL9WGPddCF9KJw^K1Y5bkjyst{49qT}PRB}=4fNWM zg(ZP`nuPY1-9EBV?G2HV_b@hY`_J~`=-gT(2t!|0({tc0dR-e(=k{NzGq8rZ{lL_) zq!Hw;WZTLy%(!=~H7n+kkvp=##KM31;CNe3-Q97~gn{PmlN;7?5gs~q`U2jD#9uA} z@uoTu#j{aqV_kq-%q4@{{`5ZFbVpJt1 z|Ctk~Qt2a7!^|OEF2+mofHf)&7VDINv4rTXJWJvg-{&a?IRt3=Y?GYZzbhuISsRh} zWA!edk@p-Uq`oQ&dRubLhvxm`5@XiKu+!kuS~m4M1I}&~Gwaz$ja+e=Y)l2ATdD-6 zYl!E?p1Do+zZbFcMVJxBOHBHW@5uqf!2XlB7;t|dpPoM^UHVtgC4JIhk&NF&6W2+4 zjYed}R+LFg1AC6kdrwFw)nzkOxu}?8&?pssj<>@A=jlD&2=Dnq)hr#3;jlmG)jKAt zz?4lrbhhGBvI}Yhh)Z#eVA=zLEXAJoAlA|R(!JVdU>Ko zxT;y57MC)LG{k5=jYvJr6`LJQz$}m;^-{coz656)xMxJTN?`~ijg`(W={dydLm!uB zHfK=bJo!x;wfH{9G|g4UuE4r_U*E8?qD~C@oxv@52v`=&zMeLFlO(^dY~qEH!hKm$ z*xKuNx#lqYxk075YKW;~GW3@JWWV5z{E=6@y^&i>UKWWB#*eW>CgK_8o#$g1M1i4~TUb9b-J;a%Cutgk2GNKiNl*k*+t zSn#=YQj`JP?ULhrR?ncFzY> zUsLif%E)PG5CIg?23#Agl#~?2?}M&4F7$U`AiBQyoV?CEpFZfAf3;Lix<)kQR-6qI zENB@Xvxh+H+Nh<_6B*bwm5h(m+Bwv%O8K<>y*qZMU8am*QgxlC7aH$OpJIKboaAQp zZI^FyxRw4$%H2p%zWJh(S=pwSPd`x43p>U*!QoG0W`21>HR@Hm=tiqfVo)!sW3oY|km3QNpog;A(k>p%@145+D4-oJk@xc}$R9~SEwjzaA^JVHXktIMWGv}VVc zGRMt9H*iF1srRkRr@+8Wu-mD>;OB6Auze^hAsZZYN)i~={R!DkGJgHSfkdUHMS!E1 z^w)di!SQg2!?li^2;nU>QHPe3#T_dhp{%Y4TK&oFh~S7O++Wlii+9(j(Xp`sb8}i& zvsGvyvdU-Qva;-6o{cKBS#gQbyzRYIg5JHc@$u!|lBQ1Zb5L|RQ(54u!)`h#TB6e+ znjWC1w?Q5@|Hhj5rVv3yxeMk>Upp>Ic@_+t*#UdE1 z`R^UNEBaB0^9XzVT`mO!4-c=jm;&kq#>TFwcxs)&aN3VoyOy1JGe^eyRBaaO2_eIE zuC|coiXp+!bl(R;lL|uLyJJL%TW;`Xe==;dBU|jVOjd~AT#db2gGVLz%kLv*7+6?O z68qpoJN#9PG+-bxv9Zf`JaC)zTnH&|8htP4U3u(R;3CL{BKpA*$$QhWlMzY2=)th* zJ~uDP+}AK6X*mZc>wU{Eb;NU#AM1Qv>KfFso59h%rwOKmsUhGtL7G1yV|&GHD#_c* zeB^u71O8|>%9K;>D?PfwkrsTH;R-J`{y3H(}8zis5oJ{)rb1U zw$zt2@rxg=QW8BLb?H?s#43CiZ}=+gM!X6&?x|Ia9&IP+@fDR>yQILNVS7slpn zIG(=r47;HC8`DrfXg{g>`SYo>v-7|{!r!+(VCw7Zt5w^O#>B)NfkPWTb^%c62sn9c zwHiB$G~WkzBU97U2~u7sByyiCiiu+FP+;k}z#r6Xrg?hhgjQS61_43AO<0}Fz6SJj zFuRaulZtC9qDWG{jZ=5Cd|FJ0wQfu*Dyruk95{R~dk_fd6^DWR(kL<`sWDvJ+=PXA zobSLV_62fT&n%7oP)0&V{-||u%^Dru*I>8opKqPXS|fRUKUWJj3vyHf~huWhFOE7#YmF=ir=O~!1=Zy zPW>{+=CWM~%gLdtKl>vC*)gtP^ts*7=(I%*+k2J1R;V(qNl~jI7-Co~TNX9P8h}G+ z%35=A>ne-H!(4^KlFn%NygkSJ8cCc>oxXotyRn@a8=C@o_xl-b)EyCV!zJfLJ}v)UwRh4yj%|F zj%bU?4L#~eOxIt|x;7jA?woCn1@!>-*EK(}nr*6ywd-7P??njy+9F&^cekY1^?Ksx z&!3w!MS_nWZVy)rN*bR)=3Hj2A%3?9brV~( zNGl9m!y}{4Y(#QH5OZkZ;@~G7R~S1G%aq$>Wj|3BUf(U>GzZy|+s&SK1lt~XDJ}GC zeY#sO9vQ^mbYBN3_#j!LZR1>7k^nQ+ZU3+30L`KKYOTjwLmBr7f}~nI>(Zu;gU7;F zhD)ZUW9%6FTkUVriOPYO_~e~GndLLy7ud~t+a_+f6iG?#xR4sm{Aztj_c^{TGz{iQ zSO)IZsbNN|D^bzJBgN!Wbe3u)}#*47#&z(6P@MlThvy5I3*V6rUk8iz> z7J~DOtgk}B*-{`2*Yb%Q*nh(UtUx3gpJLIzvV-XbbdiWfEH7i9}Fx6LMai^ z4yKOPuoKmmxKd+ZfUx%iJ{eiW59K_A7JqmGAs>E--bj|%)_4Iv$gu+A;&4jNnA)Z* zOhK5*9NiY(B}kQDr0UIh8vud4eEE`q-6ZT1j%76Q+TE<<3ohjO%h!FR0k2tSe!gcg zGBH`%o34Onh^$sqEa2v4*3=MGm<|PjtAXa3xia{vuN@JjbB`i{bGgDeY54t{h}`Q4 zMm&-X4Z=bcp2T5}^kA>fJ^;qiw(sJ3 zIec}zS_Trv`n!`pmSkC|b9=a2ede@3Gd}CP*ys&>b_-Z`AW>qQUAEKfOL#@V>qG~v z+=z`3WV$#{BR|nr;90#M%Fm}mCF56PA!O!~-<>FO_r^{UY6Hgv!$7#_*P=h9f~$hY zUuY5pj%MH3Z=;zq9oJ*g1AbYp(d)H%1PL;PfZvU!%6fJ~8>Kn+$P{aR;3KONb5b0K zc;L;qHRD(k+anqJj!(OKK3_AFg-Y>e=@$665$rj zO4c@6bDyT=2;4w&qjDd@QTYNp*0K4}rlw&|5i|Fk zKzc`oP_6aV3hdFLri-VGKm}rZ)E^pxhiWsrvrLOZE&C_12-Gh!-xCz7BI4aI!mO<) zWhi#D_z1Jzph~_GtwErsHnDnm^^C9T+xZOA*mt>EJN|nwU0cs@@*$Ur?v24FB=nu0 zq0hj2L|vt&TAg&BzB-Ue1QRPu*g70d zA~J3zrR2eXeCO!KakU+1Zn%WHwRMb+xl->i4Q1-c5J+}9V zD)BWB-^=KF`Xp>RS(}DHLy;P#c`joF4u*0HJl=VL8#c z$>1oeWvbjA#pmwWG=vMsZF?PGQAH)p6`vUfLKiPxf03SOf3fGz=^nM=YH;0tN@=4$)8N-!xU^k#m& zR4diPw5hY^0-_&1w&bIx#{r3nWGhH>&9NaXAU{PVBr?DMM(9#VZC?>=r>zCHh_ zMbou0pjm1$J}GFOm6d(exohjbyWqCUNh08Z%J8As!l}?-?1u`NG>TO_1V%iW<^tY- zJjY3m1y(a~JD)>C13C;^KEfix&4T(3_!tU){yR1g3261-9{*+9>Vn1^<~bErJM&1_ zr39VLx3=XYDK9o5OOTjRQd4)7JjyUPeB!j6fGfnN^LHI1s(5Qhf-2h+f@%1gK^*%geEt8?Umsw{Kce zn4eQq!)sRCoTn{Vqk1*&o_nO%u;)oQIyivB=3w;kXt~Y*q0(l6S;3Tph?Bir|0G5=z-ETNx-w}GIARHyE+{b0{J+L?E?Rl z6<3lh4aooVRp<+Ko5-FCUOmTo3J)HFAQL@&X)oCRP)g4g5oPO8%fIv>;C02~ccZ){ zn{_cH^cWWhvFWbpy-&S$5C%1Jg)TWI6{(hrIz!SOX;hluH`>A5o*{Heh31ETVR9)Q ziV*EgQPsx?WFJ~;nV*b4))#lqZ)2>SmD^~C7-%T_^4<(YhuQ6ceN2=7%NvS=bo3fj&z?`A&ub`O-3fIZ@ zXZY_^RvduqQjoD}^oE;1s{LN`#=*hU?+p9l zv-k)LO1Lt+mKXKc6T2W9u=qTB6N8nEH)g>p_)w$sQLI-Dgwqad*Zxjg@>gv?Mw2C3 zi0luW9*}`So;N)pKt6v7YmKIqI3E8wp8w;A*rkoO{bRjvX3j61ya(QOLxt=Sy`3@5 z;}Hq+)wx;}NsCb;yoyaiP{i2f#l@B(Xnb;Wc^K-t=>4ptLoA8Y63@WEKU7~` z{k8nVIsOgW)^051V6utX<#1s&5j3tKLU^5}yU0B+mvt`(MY_(=-M|X4=b?o4{l>pO zc_ICrfdR#I=v&)b4|WPQj2v`ni>}tvV>MS+rs=k8R9S_L<|(u-+codI+@?C|+3}Eo z>g9Jo*+02*?u*!-JNe6UeR-uP&E>{@c9Yt!#}hs44(Ue9@89D(@sis98Qym>97+?o z0%@b@?vA*-^Fu{idd0qLNu>L-zMh}|s2O&u(VI`B+GbyFju7<$ ztIFWv9Hf^(X95y%;9CAzDDn?#svGB-D0h}{WGe;W9Nl+Pt@?Sn|#I0H=6r>GIXtfva)a@i`)2Ts@B zgXnv41V^GpQ7X)fQVPX;>~lxQ!6@lC?33i*(bBCdF|7C;l2Pe%Nt|8s6q1PKqWP+UL^o*q#!-5L5Lek(1BSQFX*TXh zvFj~qtHcdTH&G;KH?2Nxw6<$K?e9bLIzDojS93J#(#=Pk6#QVphtXs^*!A_juX~d! zozZY$K8uwRam~EV-DUVa9b^96p@rj`&4uC`b0xNae1Ur{Zb2hY2v0T{_Ze%eNrA!y zTTYJn%GEL3)IJkPcRwTzxYRdYDV&k7MGJhO6L>7PnMsN~Y#R6^p6w^760V%r%X-*C zCV99f^;JyF++L(9p)_gVZFO9rRO8#Q1+JTCiy|uF!c!qHPaKYnBxiX7gu+REM%+v^iP)Wl!(>*brRV@__=h@axydLMDEsWMv zcXX&#AK;@BbB(1yOnh97uJ)_L3D}%iJTA5l5+SMu<7#Cqj)x(O%6amhLZ^3gdR^dT zbVbw3EC3I`e*OCGKwW-5!QrcWjC8Mhk_OMq*5IWOA8 zX=3$H)}*FNeF7HW+h=!%wchCZwxuIJ!a=<5Mrhq!dxX=ulniPtyO?CtS<%v&Zc*j) zuvuAI%@zf583b=%(D^12Sk3$*gxK9pA>-iSyx`MsHEMhn*!0-|Rsuk%wNndoZ%2n($b`cq$HvzzoE-5yrW+K2$r zhhv@W-++%R{Pyifg_VhAyNtrZ{@Y67OlT#%WXE%KKB82_lynG|prB8Y#`sq-;B?l^#x1wTV`rxQ% zh~MMGWs}bA<)W|9V446*pfF6O1{!#Ti?7PXJ-sg*TX(qjGGR-u&ok}l#5|ERd$6j@ zmWULWlS2az8Ljy=*fei+yRyp$HmJkBM3K z;8c-b)UEZG`T`#cN(i@S#Tq}}$bM?_auvA?L7u#x7wMzT?01R~Hq-0&`k9d*qE=O8bu2j=q^gV6KS8v&o(YqIPuP;o!Mpi4pqZwe2Hh zX>MhV(^FMO3mfGitW%qSlpk|mI9S(b@I;cYknOY9dPD){ zkZlnGW)kWu{Z0{1CX z6lk3nJyVaPC4!HgeBb2b;^Llja>D!Gm620ZQ=6qHd=c=x%*x4ui^u(=;{@uwx1yqO zCnq~i=_;x!S-*d4DETt^lJS2kYO-xBRA)cB-eibQ*Jbv8Wn6f4WCzl7{f+)@waOcr zL*ELMAyF%<`^7e45fN6$4X66!PD{0$1p}|6Wu;#h<4=EMJRZUW5cc(SZT$loj~&MN zcX~#RGvB1k!&?@YIf8}6(;R4oaNM-1Kfcj)TRG0t|ID(q984~nLgj;t$Leu;5STQD zr&c$3Ik<`8jnvxK>Sds&sv7il=O(9cjNoAU77>KY-%i`8&5k$Kz;^&JH+t`x$aY6M zHen%N=uoKR2P|{*eOB{7aP{XCzGZd~26LxFby2B*&><`yXOdwAuM3j}sGvE#@Y4?+ z$a>9`5{^sFFiybjdB*(1-U)|U&sM=eKv5e!Yg0F%x#`5)a2fM((#K37;K8A!q*RYp z<>d^5CK#&F{TVim+*i1~(U7n()I&7@ZBK;eaX(xS`Fdb?pn5q&O7&WvcpZI|C_ajo zAZwwFC`5vw=)l%w2{{x@hW_~%v%^L5Z+xB)r8TyTf*>rQf`JHXG2u7f9`M=zN$ES7uRGq(OMe1caNi__Qe>di znX0tJcR83t&Q%K89?fersmKKDT-WOu-sbl<&755un*XX=k*dxjuo>~DYunkXfgu}l zaRdOe1s7}A8C)LBcXxM#a(C0ZZvh|8UDfqqZd-2S5fHMU!@}AlNckX;riUAbIBDua zRfaW(*WlD;2yjK4ZMou-S*o9dq|e!CWjkUt!gB1Cn`z7Xf?g?;NR}r>yKaQOH_S=O zjp&QJo^i}A4O|PI&J)Y+mg7E)d$q)%%*fI8M(}foR$+shdaqW^$?6`D-R28`eqr?c zY{UvQrB3a)4n0kTJRypiwJV#R*Mq~`+0nv()O~D~b3!5AnDZuGb0B<}@`j;RNT8q+ z4gbOZ=Xv5Sx|*`}WEg^f zLCdE@AF}fEG34`5A_b0-N*3`#I}UT{gL-?V`R|Taw~`hxNqKYh0nl3GenJK4&e(jw zI&AR~gYKf@`QHY^%`jUd6?~u~J$~>ce=aoSs{n6sG7wv4ziOhA!V_{8dI;g+VeTo@ z4T~ibaV#PPVNSfs=iY8h5dq}o!Qc2?5H^RzwD_4b%09HBr45P2y263EncMd0(hEl_llSLYi0ucOXk3cD9N<6KKDk zR#p%Q%uDm=E%90Fj_w{D1gI5v!W030JT&BQ-iI;!pb-Ylb448j2(rCB1lwK6u!|?k z7ko7on>{o|+wPjw$s5&QsCS3(=jl#^t=O9c+N(wYsyhcxxAx%z=Y8K_BBhqpI0bt9cCn=f_DDF62R<8~jY)77 zIMa@T*G`?^<%>}1veZRyP@mwu zXXnjT|J=*Mk?yk9%L=-Z{6t2ZM5{L-XI4To(ec~l$P*NO7TeSAnODbJNs7gnqu+*@ ze)E!_|9;F7n$sW$HqXD3|RrN?Dh5at-0D*y%Qy-#B4wltJUa5 zUwWo1{SeiXWpr?KpdR|xvTV1s6`jrFu|_xXP>-I@c#A>G`wNg!dx>LBVxf37=B?qt zCq7F>rv)|XN7{5Z1bBG(x3^Cq0-ooheF@^wfajB*JYbUavjCHve6t7zL}EA5noG-< ztVW=E!aum5)cU2lh*zXp-RgghazFF=nlgUos|FPfjYm^L-}>jqD+k)dH=eQ<#BX)` zP1-v<-_pdkfU@!aW^p)Egec8x$G*M&SF>r~2aay0zl2O;VuA3JuW}X^^whq8l_@oa zfaze=_=N=VqA~~X0HfMt`;e8Ou#)ugRqn3gZC0TT-jH^6XTIWs2a}h>fbc3pjNC>n z&c@Ai4tzgdd3B^8t{c+vX6RHey*$_y9X_o1^GAt5lgR#T%O09Sv9iK+MUaU|Ng+$i$WY&+LUw)U z{mKlxG9-q`0Qz2YTKw9d)`VTbG|RKP*lf1y6)Hl20#>o>;V!Gg7!tJ9IypH#UPesU z8~o;)A(wLVsXnf(@&3XSWFSwlY31I4AQ~MvhG5tg-g36B4C5AO`Q^(~d+o%*sJ?YY zI-In2N4h4CdIIjV?Qj6%XT9GQ1-Y2v)lsHh-Ny>kT$u*ftzoiv@1orf8=l!MdOvpd z#upH!-og8&&?>ZU$Z5hUJhxSAg2@&S7d0}X0&(yAoJYmw4QkLER->!aC5jqtCQxr^ z8JVsxwZi*0!Cq4a7VcU7vYf<24haEanSjqF%qjo3;eT3yC6AE(GQAn3GRsXHf)_7X zEH7l~;?pWb0LUnj!c}CyA&b}B+e^$P^*4!PV)#;%AjQmCjcs+7iJ8P>W9C@*4@tO8 z4ZswT0(AloEIK_s637NNTtc3IHrdG2^^wQ}o7+g9Bz%}m_j9ZhV5^i*+>A@E9bA6J zjw-3}#z%^C51rPEKc;t`vz2yd$}nWvsaD^$#%qvzhm-zS2wD@J_uh#)=zULDG`Yh$ z4gSc7|DAb>7@Oj8dO!Dh2aO_maQV)XQEduVW2N5KA}frkjKJweXOykZ9+zygZDd(A zmZl4Tt*06)>*IB&ado27v#~?XMsEVMgO6tUayG=dZ$s~e3K1Y-WV3j{TKTHd0)F&9 zuI+3$^-{#byuxmco}x!JURS+4)20EiA-)Q6bA`>iF&-6FP^PmIT#Pcm)D`UQ(|79c zf-$paoA(i1Y=k1icOA<-H{I{5n1~TC@K^4pEyl*C>>sqyu&~;O3tahQX2h2w8}Oqh zD4wDRgOibBU?DsXH3WcuWo4z1v@rFfP(q3Qf$r(5+nhXl?l3RM>Kb%*79n{U7a>r0 zxdQS(!Ss$wIpHQvTK&zRoOC^#3gQbMy8}F>k3fNRYIjRotv~vGfR2uC&6)v<^1Pr# zO9BON5IV6xh{{>HtYmrerZ3n>F9oOO>b-v1%oDMj$am%RU@NNXeB9f!YVYh=`H`32 zyfeP&rtmF|&-Gwsd+KOl_v0J52A#%w{@nI^ErkYAn=BfC}?$D>{kC z{z+#9ad@{RY=U<=38+;QNSf~MDyAwtnV&v=8o=v4AOS)vi_IMYV^UMMCnr+kXdb)1 z6=9_BoHuO{I;nrfwJ9bpZphvqNy(y;0g_wHc4xw?5s--9)w_IK^pH8u`%scL9Jp2L z*u`W!{~5DQQA;ZP0~mN^rGr^(mY*iWG;hxb7fmZq+((Fn*a0zOU%qZ_A{10zV>ldYK5j|)Z+e)l}^0N6F=l^YXNPn}+F~6`- zL@SldI<~FMM_b;pZc@+2<4E_jG|S3qp00o2%lpRV?{6}rR!7&<^^UWsVW>Zqd@n0T z&~ZPf21SnkG;KOpH3OuW-}fI1rK;w!;;`(5^?_l!_$Qy=zuHOv=S;Z3r^JsjO&PHg z{}q%HQNM3V7mc6c)+!0=u{xEyVfCgI=E#z&NU|f9#Zy=;g!FJ4s?f19t6aqs3ulzo zNWE!%?Vvv-hEz;yXymOFt!>ga=D6-Z?Gm$!#-phb4zz|_qyryw0)Qe=&{YJH*i?L? zuBMk!gPiW+%{|GqC8q2NK9YQbdZA8tM4YMUPQ~+};e{F{^-EhBwVa3g4FJ;`yC)h=A1^|fJ$-&Y13$9 zoNHoS+{}zF!ib~=)N(06a`7Qe2%5sa#jv7-`3odLUyX?VWh=IQW8!~sPrlY;LrE`( z9flnu#^t88;| z?55bP9VXv8AssT4Gm{qIUfCxsFQvQVZcDyLvkPm<| zifiYO9CEKk{-*IQK~x$4nL^D5A)Aq;BCX#wRmSz2doE3@a3y`a*p8TSRIQzHEVINP zIY}iRHUD^YlQw))@t6-^tei{jZJwqFhDV2K!v;H~%RPk1s`KpJ@0bd;hC^M)JSX#KbNR5YP1kg4Dx`H^}NPi-rEZ z88I<)7m2Iw)Rd%*q7LKx~KMYbwE26iTPW#2`3c#;;oVXSt-%Cou$hp6|8FFk}#*5`=- zF$VCglmW-`Puv8Q10~B}EhgG;*lJd9*v!d%xL60Y%C>lP`3UakK;hvt5YLF70A$4r zNp||3E1~gYqq)NNWI$Y`nLs3BLqhb#lTlD=UlFA1xUI*pew0h{CJ%(;y2@SeeeQ{* z?IOnbiG3MfA}~u+$Jjw$=J5|40)75h_XoW};aP(RsM0~I*(z_CV)cP&xySolBVLy+ zrmRhzDb`(K=;^omwHPZLc^$ypVN}Mx-}3yL;91TEuCJnGlQ1;74@gGf4O>Z3%zjgG z-=1;QF><(?2+Ecx?Gp2apk5XCHOq$xx+GmmhOoOnczM1-YE(Nef+uIHo~51cU1(De zjL$E-x=pa+crKfFK^$s6RMk_tNO0AO_DkXH$*nS@;2tMDKkNV9$D040!ggvu2IKy2 zN}2c_W5cj96zPZZeZ&~E4G~$a+OqOLUNL=I$SXM66d9?ur6;XgpNw*0d*o1BBsowz zf;ES9@GpMLMCagrt&6KETMotbe08-}7q~)c{LIlfwszO&#}e@evvig+<69aPleWvk zz}<15eKOBGOs~ovl)}3mM^u7g=BpkEbRV(OlY*f#i}S=JuKNju>Hm{h&WKF^uW&s4 z3@mSL+Cc0at(S)4WVJcHFWgZZ#NiF&(zx9_DwS2#cWKiZfFZ(&#aH@=bb)&h6Wb(g zJtZg;ZOK%KaS<^8o%N_k`q@8@L8sPS@X3G-YNm6vfrQzC(h9=o5>C%oQz!HN3wU2N zMRZW3=tl=4*j*oiG5qC8L$ymu`fFsZrma8qzPX>fPOFTeN8vztq&foF%kjZVuFv@^ zjbF`S$)nM!bLhv%_E+A0sz5#`;j`a(y`kxKI#3O?&69AOn4c*`5cIc7GtJ_+UVEp- zri7L>=>#bIetSAY{-2!{qi_9>wZksa_)fER0m*!NTv?nEDJ*3f!}+IzB=5#s>+7|+ zX@_rJS&UZOLj~A1&5nF^#6*#cT{+y|V6zO}3qE}9P zJHtr7dEa@gW#sg%ussUgtl*;BoJSQS7vJDq68p)Bfic2M`)3=;a66l1RziXtL})+d zXuRq+G;#3oIA_ubfMlR!B)bc+at1)C?KQPy<#sWh7Zs)0q|21|uLlQmBai=e;&3eG z&2tW=aFqLfw6lF;TRxghN^75C^n1)+dIv;np;MU-d_&RoucDxRf4%a&1C*AfaY;wf z1{@su%##WfAsa!GfrzkwuT%}5GMEg>Br-%Gpk=S^dyV1O$kWXs!|M}VAe_YC+1X+0 zAwadQf54mYI(@~)7O@1d3blGSWI)>ec0HV7eE92NfjhC^&itQ=#%@kHHBP*i|L&k) z{jxA$Oe!AU*~PT^!fINFX>K&*BStKxe1z?llq#23Osg4k=5 z^isk~O4MFOTmu#S52a1i8@9b>21paIJpJm{v{g_uAY8BPhLjYT(4`|G(22XBuGXBr0si1G*yeW>C1RbbN zvw!~lN!URBH-&hPlvNwuXEbd2UecQIQwn;Uz(~fe78y20Lp9;@I%9m z-kv~s1M;L7e0;>(znxlY>{spX&nJO?krZfXV1OzG?F`_twc51*jXhcM<$8YQ%)LAj zO&4+0`|flvqw39Fh9E$KeA0m?IeHGt{U)+C=ro~dfFrG*W25KT!Y=XRnsy-&0{RI> zdK{K5PX8V=8-ZE*FC$Cr3T3yh#4pb0NRF-v`@MUVti`v+S(2^m^SZ;|c{H)YcBo5c zCD+lyetUuM!8CQWug^;8_ya5()@Y01hU)3{PC<#p*q6#S;)%tR%N_VS0D&~KasBsl z!N9dnk(U5WUJsO@bWBX0_3o#`1s|9J!QE}d1~6VI5)L4h_7vO35TGS~&dmG_0*EHD z{e*;s6~MenN=dzymhN3o>cvIu@cYMduJ|b9B(Y+RZBWtkP-rU9sNW|boSXJ7AjI_G zQodfGbk#DfJe|?MgY!=$GMP2E*q(nN#V*~Y^38I4f2V@7^{4Nz+TJGK=p z2RWHH>3pu}U_naQ*f2pga8PAxbaXVp;uU|WAfceNIZtW_gWVl)F6SI0xvxdH>puXVC03Xpq+hzY8j3ntsx=(2{Gzg*=)Y-yLK|2Xkgz*Vr; z!3NOetm@{C0+hcZ>PKl^1m4(6YORn*vKy~zVK=Aee^*k7bF1+c;fcu<>e$UYa-AY!Q}R23P?Et8^q&%!{OH) zvff1bKewk~Sg5Cu7PD|NUlG71UdFUWDQvI%8c^bg6#Q%OFk&oCCM(j_U6M;mqEfHa zB_HP}wJbZ&%qys>ZBZQ`-F2I}5=Z|pax)1`7Q%6GkJJIZ3J~FLLjR&H4K`qYY@0ya zQno_6V5u6=Yk~KGKv1GktM-rPWYTB}fH30YJxQ7k75%1Z8|w zVq!1=V>7d|gju-WjCTFI;GY+(_{Xbm#G26{tsKHEn)?D91sd+9P-Y>K#|Lj>BiG)d z>c6jcxvZBQo<1_k{}=XJHogkLkN`z*d%NhNKqV(9=haR@$NC%;l$h?O#s=O zjRu@UObnLQbU8d&Eui}itZ$&>0l( zAUs;9M8e65gBQrc0UMtQif4cyqDA~`tZ%gjSpM`XEz4kF!X00(KR#4vjBr5{1n^^x z?eACjaFr4|I%Ho$L!ruKD1i)A38flEJYc)Ehz!p~`I_ zTn3)hu2u`slm2>I;Db;y(EzM>ySjOR;Irc~s`-I-p%#lugMqJ{YIQEJK*t6**nHBv zW<5bOLy?Z?zXjl5^VNRjJ?;P1Ss-iss8x~7lPntq^cqkR)f8x1YQ8{xM%E4#Y|!Wo zrE<0w8tN|33ILICf4TS!@TH(DKt)xx)uvh`Q&A6y9|$Ii_g&M?9NpoD$_BAx4;Jz_}{Fga`*SukDVfY<{= zfe&t@pkLGi=u`Eg4>6cY2&BEe9ZH#t7pN9N+^~AVbi34T>XhfoB(B`-mPpK2Srh-? zC_x7=VOi7o)X{J-&1BwJpf>p`FtDG0+O?v7x;E2Kw&OBep3BAlz_-eo)bJzQZC4E)_K zxclPSm|Q7x9M_iBv&TUALP<&4#$YXAzak1{GiFKnTu{MR1SmAEtQfS|!D zoVt~@m(M<#k+sI$jbqbNE}i{GGTw3K|a{p@4~|hRdU*K0$cy!Y|sJQTieOe`oRE5A2U+ufhWyv1sTBHgDH17 z*+4Q&?tO*{Abxit(*r~k`Tj3J08~#KqRoU48kM2|K20Xz0f7KvLby~cO(vA-0V^Hg zm5R2yfx^pj=%EzG^1vIYRhXddxzusLn*$A^>1#z=Ou_Pbr`!0rxE+?vNd*6SAbaN) zDoXF2H5(v%#j)vLvl&yjz{pa4bKuZy^W*#_`@Qi~?!5$!?s;^8mXwfwFKN?gz`_qTTW+`IpGKb&4;4h!ZBZIK{%!a=6 z{)3Sc_q19W!8$3e8nqhBCYTnczqrXpRCmf!psA~@Z)9Y7Yx)P@oILo`V&k<|-8|Mt zJM?CKeIvdrZ`67PnufG_e&a{MAa7g41aJ0I#4m(or(9lLy;QDw=fQ=|_MVz?onDJ4 znN+2gN(kG*8s6wBcmI1+J@yYG-|e!q&Tu>`(Jw>tcBWidAylyI$BTEHTeIydh4jH;%-|Q6bWgNl8l>)zbI$wSd%izlFc`3({p@G&6?4rw7m#&;LhaIG zSpJkbY+LXzxv@e9=SB)ubY$e!eKV+f8bRrbijN-!#5k>Yn-S(f+;fH<74@H3iz27s zu!=(_c4Sb&a78w>ZTsCSe1cm#V(4;lg4+sem^mK@;)i03qNXP=<^l_HuZ|3-Vn8F~1T9kJCKC8I#)qX6NP0Pdc!r5a(f;GvwvCL-{0 zPqiqjIzpa9vt?8`4s83&B5~?q#FiczP=6+7pvHK(EMYW0R!rPU5h`~1ZNl_J3q7!h z-3BGZKIjK7#^O%sH2J?7E4wN$MX&m+$D{tcbYSr?l;;OZ`w& zs7tTpzw5GbdN9Ba zA(6P)1q*M01DtLr9%fYh8!WWutKM^2^!OIUuCd74iADS>6)Gjw*g)7QM8z3Mh;3;O z+5C59e2S53O2nax%R~up4;iuWD&EheW=sShqT0v?4ig*QYrZ^~TULHuNYUPyE|^n6 zXj($ZpZj)LV^}0?MU>!msG7sJx{#c~v&H9A{@x)M+|BRn_wvnBhY+Ija0>!-viG`d zOD~gOY>Q^z|HIFO4R3Nf`#n9*y9nf&w3Cxcuk5Hg8C%-or!KKeCWlSAD1rtiS5TUs zHtiAK-6bGby#hTvw*(#RhL>86=KQZx&r&tNFrKrtX(B?{1E`jMSihgg_q5+Sjyg(5 znJS0Rk3rVb;l1D9N*Q@x`$lU*A8`NdLjSnzHM$C^qoNW7R7Xb7kM|%U@jws(<{s!6 zg;E%FfrgJ`>%5;(!o!0L)KK_U_Mn)>dV|Kx~N^&*M8Wi#_T!rxei|IgBJ40M2hOLvui$Ajjn>e?CiiQK< zB0H>YyTVL>RWe%S!jm)8h++}>ZJH)z8L=l{yxStFdnb{YfgCrP8AC@N$56XLLcSPB z@f$G-@rbsXrK)|iw4$D3Xi?)0BN;`W@H=C|<)~tGyB_^QmdOeqN@K7QbQX8Rb&&U> zH|bn28#0FXqSzb8IcEdhoIhgfyVYnV9IA20EI-mA;Umx|#CiNCE!MIA+-*}FNGFS! zKKst641Z5y+dy>u$YDx3{F2fUB?;xNx-OZDC*_PM7Sc-%mW9thQaWy=-r4$z{v`+F zZoNMq56+KuJ8qHt9(>PqV%GQaZP=AC{xy z(+?`TV}O<0Sw^(NY8A%Z~!x=R;spTzJ>iUh<>1Z9n?ZBLza`Py6h?pRf|sKX(& zpdQY3MhW54sE}c32xd+jW&r_^k`lGBj_cnm$ZFbf*VzWXFGZZKX9(*5*7Zg0_es2v z9c*Ctacb@G#$tl3HNJ~uSD!i1~(Bi^NmZLpd*)1g-}8HuwEzOW-9bJ zIQsR9h|MS~Cv>x!t(_MH|K82c?pwQEn`t}2H{wxN5r8iOL>1A5w7-WiD8H1HY}xqL zGe6}Q0!_mCXsO-93^Fb+Y@Rq`zteboXc)Sku;qhF>*d-@g0a&=RnFbspB4u&d3oFu zuzU0OG1K(GE8+_y_FupzBIcnj9Ncp(_V}CQvA^6Rr@0$)5V1|8UvN@3#u z6j}k8^}%zM#FVXx4br>QRAG zbqw8@!Q80J+*lT8&&4Nj*>Xs-;pi#v=lB92Rr~v(sw=1b>#(6ear0XpB(7~57)yFn zGM9rGAFiaLxjKI_wKttcEM!a3EZWFKf3%{Hma$u>dN9n&{k0*Z^a5ked6?(UZpNzT zb|Ge@2kJ2N;Pw|9sb-ckippI{na9GW(~;KyF>tI4>LoQCmqY}~Zis`N{_{wSsD56s z5zo}Mq6U$AW6sO~WG4PD z4TqNAJPc+a)n3prQlv`1=Zzt>I^}aZeaO0P zGc!Hq0!xNiOpxHD1aVzU94B%aqWM@vhubZM`SH0UL@&R}nLU;_NNLpOvYxI6jgfqj zR$p>j`f1%&BRWt>%1x)pTN{2DsJkyGPLf0P>kri`I^tD*(2P4d+M67~*xeI)C_e52 zJr$|-?MuSE6=6D5N;KRqQ^G!{R-vf2NmNQq_#d_XReK*uB&D-@@=#I8#J7J$jlp8N zsU-ch{nG{q5y2B|jw@&uH?f%b{q#?Lc4t+Yr0_5WT8&zhnK8PfY)DZA>Avv57s?ta z&ventRZCZb+dQ^GJRSYv_~LH^xk#CV+=uP3y+*9g)Y0{4i+%4{FpB~^xFdQtHCv)JtSAXtMP%y>RHtBN@r(q)xt=zg^-HX|D4hGn%(Pw3?_JNYu0J62_he`J#nsd(`(6zok0};^8#krnr)RI!@n8aW z2z;gL9it-1Pw>F-Vo%%8?Gvb6p9WlBMk^o)a5{C`JlU}H+=&7B%wy&ugz}0P0j=Y9 zFP6S&JQ*HRKNk!KxfE{wzxuqqz`j0lOnNQnvENI#XSF=Zx`oKUvZ8WwoW>1MpdbN2 zp;k&BCs}kcYSdp12UDj@sur(_(7SojBO<)4!0nqqk=7-3p+us)JqTj!fJ z^hB65KWZhN2`ngDjM0=;L?;l@j|qDW$Ghe~$Iv!>@Ux?233oJ)xn+rjB+lym5W(`N zvW!N~DXF%0R$(>r+uhg9a^Lq@V=(0y2`ChFeS-|CL3parW=29$G=yc7!{!KZXv_ml zkWs`!c2;js!^p`vuUo|J;zFY(kyihNa+9n3HpV8UsWBO!<~z{soPc%aJSNio$X zY)6N2z>+mIH-NAz3w_i~IxZC$+71YVt);O*bf3)jPTm-zH>sR2Y=@rE96{)(Gk5;t zd4%B?B_Fos(yzLR0M$_>%*muX%Db%L$eGA?)p z64pQCik0Y@8!F4t-QCUvCtasQ!e+@h`xk}|OOgr43MMRclm zSYDce_U7sr8*`;0q;L~HbxGOG>@pd5bX}}KK8k-5q&Dc%~FUD(GH);EloD7KYNge62<-~tC6+|l&Vdx*%^Sl`ZbAOz!P0pWj@Jz zLtrVkH$Y<7C+vdJv`RrN1~o)e3VTg`JMdFeX7*vznZV2Y9cF3PUN+yzX8!%QToo!( zzsIAQOWiMo+)3EifRGe%X}^GYb%S)dx};XZk;yrm9jRn$7?%k{$Xy>WZ9H{xw5I#M zvz?E?_qvDR;?m~zpX@qjM~*64A%#z!7A`R%UpZkZ#%Z%eH;I*p%FT0om*O)4q);?dTmR7<%d?n%K3=-qjyAnBB|>W zlau#fX@e@-Zg3e|HkpHM4+CA1d>=#ZD5bjdhyeQ(yUdyIc_oq>% z9ftO8L)*rUh{wmh7^kE11^~SDudfru@ZDsyvayrGb`2)6Vr@Bd9~>NP%&I?+B-0Ox z=0rw1`+^4P@vlDN#^1Ql36Kme$I2B?U2NV@Szd8usc`S^A0IkiRQUXU&8}*dCokJ} zBmv(H;$ddHNz(lX_iv^nChd{OQ#XauvyP*RN}%o3hg|RQ zy+k;gx04*&oti>>zJ@`r&2J9oax%NTIb{2QiNS1hsG{fhgsA7I&)|zPxWuAHH`bpO zgBxLNLr@wcJ-2Ioc3Uk;vDbfyE{|&%?!PJUG?p;)!w6J8tS*988+`&Cd)ra-~IucuBJp z!Yr6y{}>oTWX{^PAqvVk!B5i`I4$nb3fO;KGQLkIfMCZ)AVY(D<>$Y)tYF_&``*=T z6Jg!U$-$1o9&oMzw}n6<(D`PZNx6Q~H<%%^q{Add!=YazlR^VvCBDn?Q~XE(5g^#H zTi#f*;^yb)e**%SjO*qc#ZVw=i3G|90H(Ug`^i(Lvj5-I6t`LHPt7MjU7#zQr85+( zDjNNBa%DzV%>vr7M_g9celT}&CUal?#y1Lnfw?AbD}Y9zbefBad#fyiF&iYIKkrOR zWKZJ{(B02x8@_8bA>`4Ie7&_yt!b3TpTLjvOx}8fSpLAcT*I_jK15`#qO#*u4~?S) zpV^z>8HfF8ri_^KuKopu?(6&sKsV+v67Hy`eNxbAT zBH~(Ycp3Y%J2hSWvmgAN0m7t`Bsiw^XhHp_ATCmQx{?9?>{A($6-?<}x*T7L(IR%H z?=}eTM@`_3Ah^;x;GIsFFtKry*FocJwZXTM_dUB=Qda^deUZ=v8KYSbS7SSP6kD^d z1N$K*8ACmYf{%XMke)a-^NBwcbEmV4sogm>Nze;9&n4eYVwqp_xk=@$0 zEMU+LDw6rZGSuTa6`QBUW_E>{8U$6H#me1G=4kq1{V09{r{3Hdr8kJh46WKgc=Xbo zD%64~d{|S`swIS9pXESv2d}sy$9dJTMw&Sks&1bS?VA()L8MnzBk|^Z#?aRhM?s5_ zP<<9@<|TLKO)oMIaoBeO&K#chSc&nfD#3UPv0OPpeFTJ<4azaUV?#b*#O21S9twwt zVrMcL64a)t=YH`=58-Wu9}=GxAUR)YEDertQiWKUs@=aB(6A2YD{NSPcBu!s)v@mh zd)VNYE}+J#m_79&rlzs+msK}J|#K~ntX!_$;IQFlF-z|)o=Epss29l zs~le{3GOb>T4ybIu*^uv1SvjI5k`qe9tuLEl{Z_Gb8M+0jhe>w?+#DlmSehw^bi<2nR%T{dJpOePd&Z%e_gJbj7oojmdhYT#L@n3D7%FNzQ_~p6{W%QM(iu8F zHq@>yU$L?UoWxEf&V7PZOBwbe=6$~QgUw%yO|_?QAGQK4J`XT3Y?o8|<`E1J4(`TD z_`&)wTJLK6z0gaNfe7{35z?U`BLgpRH!s0oHFjIu)STvZdXIZn;gy2JLgT(I;fKQp z;l1&Vw(6#jAE?pC=71?ftIL?bOOiPIYx$J3paBG=a(F=C?d(e=Jpc z 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 i4d>x3$-HcE47fxj^^b(` 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

o?!=p!bzePLKVD2K zFDBR&a3AEn;7_|S{#g*=@#fyv^(42TJk;pxk*g$Qh4$b70Xn)yNdG7mQz1Dq;m5Lb zVV7+R6`EXK7NezA%S4Ek-AHt(-m^jrT65qRECTpL5-G zxvj^(F_78Cp8DGKDM0X?f}_o=MMA$wLsc_L(%n9P+o=_A%AwMTN&0IRAT0U$iefFKvDunudHWe35@P%uECX`ETO*J>JfB< zaU=ct3q+X^iQDmA#CsRgWW)KndDdp%i=?=T_Ce<3{;$Ky?vC`2Aji0gcKftrY^ftg zJ9{IaXq`@y!;aH(Cvu+sdXRYOLjqCA@}+E{@b5Pn+JD907KpTlLdVnBxt zd4gK-5pK8FuDc6d@Xd9vE;q*@7ZcCJNk1+Ngu8!;rb_^d%N)AQ-uBNJY5xcU)`PpMBSC0V~-onQw2TO z9$&&X8zYXtJ$SQz2-dz3Ign}<(VwnyJD38k>i^}R@rs0&E?z&Nzk^>f%d7vQJCU5= z(JOA|k_ju?W-JXtdd#@vkAx{bQ+KT5m6lIkdzNK={lbypp$VnuyX;zuvuy7lnoyu$cC4X3NPI&J$GHU{nMCZ_+rR4 zcQ>s?!7IJ8%k!f;PvoonAMQFHH}#89Gu)v&RqaXjZ`|V`?R3#psl&DvqGr<5w1MV? z^Ro82*Q1>0Eq}ef;|&b06hI3UBOvk7&-HNHz|ioj&-_Zr_F~G5zVwgxq$b{z^vA_% zuV$^Yes)}Srf=ueAtB(iYjs=o+c~t+P2HrxorM|;i^EyhV|pmkpXEb8!X#gDW)~Kc zLPBT*Ci~KvM+mbH!^-c)tgjbqW(_}@7(~j@s~4YX+(x9{_-Yt-+n#jSg|KC&K``{b zn;@P=P}WDaotC*3q-g2r2U@k({vxUmV;|VqnQ*g1ZOJlp(%C*chlOBcAZtBs-k-d2 z!}+I+rmr`1eL=sfwfb7xztio|aOB6oan1Cx`gWkL}m#OAN_z>P%XQHUxuqMz{PPL9tf+3ihf*&S@u9L=(?+MT-2xj)x-JJ^Fv zac7!_BTnuMy8)J+Oa}{|hSSmF>NlE`IROcQa}(t#4P2D1S+{tGM`d+fyQxe}quG1y z50FDfh%j3&9KaZ=$U-dKnnG24Oo<9&BF>XqP)BE)FM=L}pZG9^=-w26sR4k~8S_H4 z>+HZ~rvoxqoItis9Uz>A2p~uZ};s&4(lgOUL3;gr@tt$ zu4dOjZYgBV9Ivb@O|>xkeHZ0dt-B~%u&``7TQt=zNk1vdkNl208f(#BMSDNgY`m&p z;fpy;0k6>V)zxe6L%`c2NNN84*L9zhc^NH1OH1pRA1vp1B3+N0ITtgppvTY`cvx!l zJKCXgx$SZIDX+_f)d-&6J)bR}_e3Q?X4N@3_yNOLRToWzz@!Ue$gje>pq#N6p|=y%sKxXvbxwcZc~$uMfrqad{4SCySu|xv(^#i zs5g0(oy`ncQ(o1GwH4cHwQ7#fkoQ|qTuit-F8kw4&nGXI9qsTuA{zCyGxzW&0%MkH zBOhhCcN7#!e`j&Er#wcTIO4FIMnhI5F4mQXiPe-ecimRK=~;eP97x2T{%Wk2>!=`c zno+qOfdG20rqi9%TT#Y`775)vSzx1(Wa+2@|OhG_0G(gm^BK=IHV<&3+&s72#d zRCGL+rL5&l%(oSX(AsNp)fq0Zc^cLUDYMR`C$lG+@Azw~xtEcybx|m@2CSN!emrmU z+qrO|w4e^dbbwf(`J(B1Wc_-iNXk#L=Mt2?*TD7JU!ML*AB}LkPU7Tg|S43_RD$4xUVIFltv&%wzrI$w_pEz{1B8i z*b|l=yx1vGMP!m8hnKUft4<@#W~1mA(8ZACj4X5=NT0PI%u8|&S_i_w^;|z^Jerf; zMo44!xY)6n*Q!}}nvivC#HEARr(}0(;KE4NZhep0kS^|5q~cYh{vh+cnZ^kZ3h9yN zai6H;>2}E0^8lhTqSqt8rnUzdOAa@t*A6#5=g{2T6y|-3mRJb>0~KuGCb|usK84J; z`z)Vj1RpG~c8Ls}Z@^J{wBQPR7JV5_7aPIhb2li_5|~6&S-q zz`t92-rd}2fE=ipW)GZ?saBtRc~bAUenoTi?%~^xGUimged0wnNprGJv)-z8O#GWs zTQ2PkVs2^ayAQ|s2T0`>^fNU!u8018?=X4YR8&;%&SMUXS(qCD1wiXSJ)zSU&i0NP z-NKmjeasfcJ9m&IcOG^4i(@^3=I9*s+ORbTN~S5`vZem^=y%j+nOA%6rqoM_f#2KO z4zDo3QgcrV(eU|Z`oFueV~g{uA%iG=h1Vofb#@`%OVeYT^4+SlDKX!H3T{!<4Llr8 z6gyrW7V071Y4P~@+NYL3t+&Mk%dWjwMWaim`%fV>?IwwWS_S0gO&{;q;#{8iqJQ_U z%7&K1NNClWyQ)^Vs2vQjfKX2P?4xfJS!vq`r`)_)qCYO?@KX}+@+#DvSa8z^i%&VUKVVXKUJUna${QRd87*=vhm)*&u2GCy9 z`uqo1L5H8JH2(GD%k#Wf=gF8<-*Yl&KmJw5OzpUIpJ%P+Gy>6@_d0tSPhBESTwyAGn6JbV@`MiXlsFbkEEcW0B>^i_pDY`B zw*=pM|Cm(#l3A1{=5~Owz=iV)Ymiluave@(vRCwF%@RD=w=W-baEh|x>sn@xHL~7) zd1QGDQ|AMUft8JIx&N^0a7Jm=Zo1ZPtE+G*Mt?d2bywtM+~q*{aJP|h-+5=;QL8>! zxxMZH#orlC=N?Y2)$UlBTk_?cNjBu{yT8 z@@=z&=E9vmK7670H1Vkh3VrS7fIgy^sr5r~%cdop6fGq@-|V~MpPVLhg{I~g>n=aJ z2*qqzaN??Kch{%4kD< zi~axljXH0G06TjEHo~y{KZxTEa!Z1yQ}+-+I$!niWRIV)HvWnJ6uSC^q^z9roKUPf z0Rl1I-~+NNJ{PjDM@!64uULLvuCv~sXT12NXX1c*YEa~gpzZ0|*A!t~)}qxNMFm#1 z);J@Z6J6gs_#AH^Ptp*4`$*pa_n!Tn_JkS=Sv#>^J9$ZMhNzK{r~29&0s&Wu7E!rK zIl}&#wg#Ug)jG7%N1m!%j+~oGmeAT&2qP~m7d2MDVahg&T@Q+%7Z_YLDV-sUblw>f z8k}t(vuI^1+r>q2pqw6JNDN0^PmU07m>LX(+40`&;(g!giH%m4#yUcNo(Vo0NG3n* z;Xfkr~)GQxLy(zV%qqhGk_8PSUN_;;@ zH<-4@D5q^s`HIW5kKvVA6Z~td!&D_i2f;a%@3~iW5tvY^-V_VXW!I&%}&0>4M97)juh!VjjqsXI-poM^x)1`X9h{N zQUi(g=FN1W6GmDGN}z9F2j2S zuwyp6qhF6SY|ZzWLju{HF@|a`Stf>HWJQYu1)Q_YS%hJxvIpqcQeX1yB75Dy`tA&Qj3j;9$W;X6iP4w!?Dn%+V4Dzirx%3Z#!T6 zboXf1cqDv1O@`{B!I`b@r26=YJl*_f8Tg~u%e3Et8h$(y;K^ET>ZC)$x7WNkSmo@b zeL!<;b|%_BxwvyLL#y%w_iCi~$?pT+2JP2uxuH0X}}SK!z^9H~B{ zfV5<;QRsHFUkP;*=dN!FVGEucb=qu0beiHX$T&@rlpL&-=QE>xNHxA?B_n_y9%_*m=4p!=*j>*>1#fvQJV;x~A3^WCdhA;XAjhCyR^R#nR<({XH zsgO9apYMKDa=iaeJKW7MyVPfv!m$Te^<-q@iz!Zz=`Au}*UbpjB`&MW zpb}s)Wxg6ycwJ^;cCxAeM7kSMy+=W%<^neRRDdM&)iuu65T-g%-skSnJ?*(GEP#$W z4c24Vo0lLmL9aA_Zj3%UmWj`@J{pg@bg?o^9SZmwsFa-y3Q`{b29a<+EV^tVT=t6x zz<$J1L#)ghe47caCW+bmL2%foRr#L9bx$GES_ucL5c*tnHtohVtc7f>tpS$BXolcN zgnD&n*>c_yAV=z(q9o;UDcGNS%+iJNIUf-Da$^f#31iPX9esJZKi5-dx`B-LBNXg7 zOh@8C`RRLKUy&bST~$5iLSra{xs{cMBIA*JmcO2sykl9x6RWh;lFN7r#~6aHx$Eg73uuBKlq&MHL~Xl`J8~6sXwvz|5-z*zGA-+s3$ia=eeqFFdgT4Y&1ag5B~9cEbt$B9l;!^kso2X#sw+A zQ}+LRLV;*l0x#B|H~#Z|_~9SG>d)_oW&Wgi{Q1Lzm_I?Af4~4JDB%B-AoY)z0GsXd z_TTmR^PKpjGk<`jKMy)M{|BS_^PnA)KM~zO4_c=G{|EGEbuiy|NOlZl{)wIa`L&4N z(J-4ke@C?CoZHA;P3@^Qms{ci-(1Zp6V#a#a&yfKQbZg-2N4?^8$-vLKzbPu?JEhq zNtJ>Ur=z0qQu&)Cpm%mYIo2lf7; zI{fI;4(;wl@q-si<*UGnS`THjxF~d2PtUvMk>Z4egws&JivIed_H9=*_40MY@TubJ zBc`g&sMS~nhRL$U>^evYKi4x_O+4m|s>^ZZC9E=?gyieBjn--HD>aRLI}G9B=?T2N z|2v$UEF0t=abDGT52;JQHu^fvSu*h!7x?a?op)3)#_2sgp%bEZUbK3odBfG)p{?+h zz%vpT0n(mt{iDo_<^Vdoi8nYzjq3(7hSeC~;m5;{7srQtU?44|(qw@CwH-CbK>$ zlnx3f$z7cpBG9n3eE6#^!V|b&vt$ovNT|zGU}VMP4vfPiz}k|FSLZfse^j(A^R}km z8O@du_js;pR_jES^t+l`Wt4N!-?7ZO^%f7dPOZLKbi0cfcql~z*&b5zm2G*M&my~4 z@|R!gppTU(M+ZQ(Cl_&t%ACs9>ZT>~oG^Pn#eUb!4d5ZRp*0%}|a zyP4o2gqw`h%hTBvc{sB%)h=SgnimG73PWKW8r*?K!TrQdcq>5<%eD(hOc-G9|? zE)M&{4Sia9y1z#caFVa5ucXgKhzg*6WX`(5O=yeYxG5!1D;|Hc+M6bSAM^t(;n@zp zgS+gY?vs;m-Bm9kf-QZot0ER~MiRU>FP5qgD=Q{HA|H{^M_CbrizUw~A|pens-^}_ z#oiOa+r$H2>~GD7@z_5Aje(6R4h5br04HmqiVp75sY(}f)FyN`yK`uNkC&JCIZz!d zWvhP#UQ?HLc{VPncLlyWqESf%be?!1n)oBGH(7yIr) zBi>sC2FbvXB4Ipahl7oo)~>!jY(&@t-3tVdetvd|aRe+W7idi@w)@r2)e-ql$0j9V zdr~{x#+=UNM)hqz%g?g`os_k zVrIs8Y6AwVhjzwwhcZaU+FXl}5tC_mb+CypiryHZTDCd%e^o+GQLg#ZBj`Vdet;17@ zE&bK9MP{dI3RF!qeN3ib*YNNs41M!102J|!ST$`NC~s0mB@9h;E$sT*uL#o{zB+?N zK9=o|Z~y_(zwdIm`_0L-Tl-GZcg(h9$Smr^*^JD7ebJx#hRgDv=oBH(+HdbW68>g) zD}~?Zyb8sysuBW6q>J_yupQxP5hf36KFR&b1t>d@nbYt-I!O#&4y8R1oYpYM~@KEQGqNI686@0QEii(LR9NCWu;P-osl5@AMK7?>9gNGj`oQ0IYy+5WwLBQn#caySPP3#^ROPH~Om5#|*y2}GtO3D60hB+{vYLAs!gI~gpcmaUYAh<_m zWo2vgGOpx}G_E|F_A{iA=YVqUa2!9~v57#mwY70>{&^#kG4bJb6g2$&SWnfM?1PY+eOzVS_iIGtqfX76Q_YuGAVw0t#R5@2?V_c~*jxwM# z_iR_xM}ay53b>i|+QQu*S^oNc+Te=j>NFByF7a1m#~5`_-uu<1ma|iEOohXf;gUfy z_%0w0KH&bpHgaRu&5EuTuY4G~>j~(5~1C*AVO8!fyUk^K`cc(cfHC8`;)oVNR zdPHv`SecU2rNr}*WzqJ@V+;)F(+Oexp4bI z(={=H`aSxjKDq^YW5Y#+Qj%X%VZUnTix{M<>UP`>Reu^m{~Hr-w=M|_pK5wabS7RP zj5xq-*3rdPeMQQ|WSyrZlBa>X#`?t- zk0qP(2M-@6q~C>37+Ip!_QG`@_&v~YBI&+PgRpOCaIj&cFID(G?YCzMC{v#$h!}3o zb@_Li0SD_d#UL^-It!n4$&KMz_>*E7!i^`V-mwZ1R@?fkSDEs;cy*;b#`#pLj=DV6!}oyF=Mtf0&n- z7ay`6{ZQZ6WhXyo9t5Nks><0KR8gw!>bU9sY%wvB%5}AZL)5EQR^ff-fX!~NoRPp zznwSq+M-mQfsxURtH0DzAN*w@2?>c$!|2_?ToKiRrnI0-F`50cj-CVuTM?+&oi%Ub zs(bIbx^Nv}0SNlftJe*&%liCoh**6R?e=^RJ(6(5+uK`gTjv^4CoFhSK)?-g|4O3_ zB}0#Qh3T0}MhaI#A|fc#yz%@tF%%F;YKSp-k=L=dkqgy+Wi#qeEh%|k`$ASJgH3N$ zDWWYITu+gz9MwVwq{{r}5oTr8nL`t0br*t_HPfhh9fW=9X=zjSJEEWIc+~w`_=bMg zquHvRmX=2TP|q6{=g1T9p>pk?>sHHT@7iSk;~DnWCg>x zX;moTTaHD4rh@TE|AX%F3j2@Lb}tefcJPqPsu`mz;b9rLz z&KsMl)SVuRIf>ameaOBN^J!L#pJGGHHoC7~%?;-23|G5WfBN*P0G27tk*CKH?P8y(_(-ITPOgf>2ANw|{szIq4wTrAr2bU$qN0H=jo9coI-u!aGZfch-8M1`E6& z$8ZkQXuLXEpvho;)kK6(!^eX>K?Ma}z^7j7$)eW0gQiSsb)j#!9b z$34n0&pri3^~&YBu7r()qe3OWm}bkRvGQUOKk6)Z+{+9^=Y*s3?Kky|$17Cq?d=^F z(o%x_{mox$y7*9)E4PMNcUC!jK$UgYt*2uBq{^4(2XlpwX8C=rMvOg!KTr6SQvW-B z1pc$Wr`Ob3ub5;o$p{?YK=3s_?Fs5b`n-SH*GITsoFv4w@j7DSLBe#R^>DEJma9*GqdJf-T{fga`7rAl_=$%Y~>r~4Y= zbCA8M&w3w>u^o}67b{ja%ySM|J{1$|1i;@KaNRiov3r4V3{FMDxU05y9N)px!!c0e z{za|KBN>K0OX2KU!JoYFr6NL@V^}nVJoi~`Ugw@AI8-G*d58V)8n|7e+9)y{c+*+@ zMu%`>GZFbgIil>aQCUuoxJOAWT}q{%jc(8*Ug=^hfM7=nu7~&TQ0ljZCqdUE z1JEcA5L(*;!+H_gF$98Y<0~}i5|lF#UjtI^`mN<2{S+|cqL3)Q)HRf?nAp9(ln%|I z*LP3w{+sayr;KBHH41WqQxlue;t5)-MX^53e}32c!U#AnRQXyfaHJEe&`U!P7Y>?3 z+(HstS*m#!4xnWUS>ff^VW`!C3j58iS{$0lXEhGV9g~7>s|xALbsj?P-Q99<%1j;@^>Mh=eIUo9<;DDAQ#8anD;d6d95Tq~oGKr65hi9xaWQK9r-2 z1PlT~j`98L?Y*_{aM-}hQ&doBnzsUlqqHzmoP&Y!p&N_TojZ5nYTQ3i^|YRsOGF)+ zWH_J+n)Cug?wT9azGa?uivDxN5$o}_I5j54+{iTb9#-qa-F5PgELCg9JGX+i;5v7< zt)fMJ7~Rvg>w-&bU)=j;Cl$i1k^c7WTQP&@&!4B(dtDaw{w^m(G)PU=10J#2Hyz1o^?Pm8MMXv6-kEClBJJ5*# zKF(-x9)GLHwK~GSYS)w0X~j_aaZrdqoiXln_+een5~)NpK^P-WgolCqYRf2-oA%lH454nKP>%p2>>S03nZDe?hLQJyu7TJ2Jd6;%g2u&AK(dT zlvzD{`7)l}Wb}3qYoW;)SC(p_1PJy1{q03I=Y1<@Fo7Mwf9``hHH|WVx8#i2V^YZz z_9A2Ylx_#Co1UlMxRG<1WWtD<)JtRm4)D6bN=U1~oX&>0I<58`!%jMgjyNMZgvSACW6!s}B5V~_+ko5}7}lGvbAm~)+?5rz&nvYfm;X7$A&V_Kwl)=a=K_jyoIP$Jgpvj#P8SpJ*o z$J`)n>O2VtAYXxmO=K4(70%iPhK5eIHt2aZ@G|!{Y}8FrUjz#zMEUBBeS-GM-#tNQ29SNPoP=#mP##I3*nuwzO6&c3 z5-V_?7BX_G0t~|!x|6&_ysyLob|u`t*puRS4DoA5ets>-ouy}B3W4zJgX@nm{z334 zVTK$Mk_@8b4kM!^aQHccf&rTW^kKsQ zaK!~|_Zo+reZk;TQ z??;PN4&~{3HTcoc>>V%VcPv1rNYEwKeU2-5Ehfb=n~UMeSJPhb(oDx>?MKI;R^jTV zR1~3B{VEc|cldVpoKi+Fmu3%ekxbHsFD_DfqNdY!?(OWoc9?W;Ra8ZGC5mH9h^?i5 zy{Fc}8=7#Qr0UrKa3e0`A`oV`JP4@LD=I3uVz`~QG`LD)PGnBScKf9q`yH>As4X~> zW5!MXL91e&rSd4l(}<`48lxMF61V{AQ)u-Ec+-wo4?X(Ohtgz9(e3uurJiM)i%)ye z+}Vqc1tUlM^(_6!ws7`vwv31hO|QJXQE(ZVkV6|2*kO16tVm7$N5rnFqa-930zq=+)g!ub$0+H7cf7}STzMPK{e@q8>fcaa*mA}uKI)ioZ z?@!;)pL+54rw=4&YX1I2ME`%r2dX*CAoM#}@txP7_`ZECEEI-u~lwAly7YAa-w{w+EPL#i_VmQmDAYo2UIh zeG2c}%>3_3h+dpi6JF|pw;Jihy~wNqY9K{6cxNF8Rs?uEF8ud40cV3wEVFAb`i_qb zH}(W2Zv@{-`{;ak{fBA$NN3h-d( zt>vDWlhLOv)lS%xEdM>V(~WJg?IrGoVWX+<>}5Nueq<~J*wsTr-6N*6k^$=3XCP}e z_?a^q%dz^$kJOdN4m6ePA~(gmM@tubGgZ={ePH|x*=NS96+M!!Cyt+J=Py^^ex@3( z?7AytDc)UTK2tUu%@&Xd*#~d-r*I>(OB*uiBqt!G|Np&b=@j7(-axy zQO^1XJ4>gMl0%;OqE|GMW%#9fmWIT`xoto29dn-W@ICr(*a(y|e$gpA81w#CkFLYv zdIuOHInNR*EV$a5*3EV!;HQd;LlWa7T5lj0Olr~F{IQi#TKmdwc^T)l$Vg|0?Y=C4l{>7q40K3IuOi2W6%s_4#pO1CVGS+I z+1Pyih$<7XnorG!bKc*2#Ii~(-u<&V>s5GG ze8YGZuhjCeJA3|XUsCIF6D3|CaoB7b{*EwLb0pqVyYUW*W zY8lZ7;2 z=?_bd22Rtf;$goFQ20WeqZZ1L!@mBh8J4*70$)c}NTH*^m`k@frX}fSXsrr!a=qU{-=6_#qUh41g+@$0sBmyqr1_noP z3lC^=3v-O#lZ8@@fd}5Qdn=7JEHF$B%Qg(CBdlqf%9JVOc~o}nP@Mc!eBi@Hp)IWw z>$GSWu1kZ*yNw!fQf;%;hr~I?dPM_RE%oxi0EqAI7I|i=QntmvFvcC5CLggFZsais zan@chmK8Y%hmW*|>r)-UL9}BIM*R3xT*5a+cLpL%O_VJ17#}pW1V{B27?%EOQ)A3g zRxQn&ws&^Cfq<9_=EWGHh zJZyhQnB9GvP^>mqQOQUkASkq$cOkN(;#**QJraLmZ&s)_Z@?(DZqkb@I&2Oyb@m=e z3At1&+LZGz>~#B*9`|b+r~Lsm))JVPHr83fs)OuMU-dH{^xSq-mJ; zZQ|qTtc6L_E$bg)YswdxRF*Bov(!Q}Vq+`WUw<{6>kRaST<$-wDfxGq2wx63r28x7 zR`xvXOzL4;sGh%{AS-juZCco7CvHFbuWoa5Xdv$V^9Tgu{}iQu>c!tV{l8$g;PW8} z&c3^F_T4tG&qLyKXWE-NlMR~|3tLxV~WB*2=ts^`8 z=)b*kv#eD@k)+Ci;Rgi*$Ch7`(*Tc`fYY9$L@6K^8UnsXBEU1^-4IUA1lIgr z?*?ucp2r!=#eLu0uc}s$Gt_;?6M`%Ik%Z82Z6c@8*)harJEI63?Lu-kE*ECg*$T(S ztZ|0hVseik-wrDrNjg|z>AC{P}v2m^m^(*IbNXVA3zX%P6Bi-FrMHf-I2grZUwIjY zBAFXM`kGyqes^PRHqfc6=b)7T*iL`%C}4z1>Pt6W_jsmCsf8tBMoY%$MiR9dHMNrk zc4K71Oe=Rx|LA`MbPH#lLzDpY1V~RnVsCG+Lv&lSuD-s}TxT3PpOal;8*5t+wf=Yo zHP{&;8+(b$mW1x37MQF%lpjuWBIctkfW>Irz*2* z50vb^A7eb_l?1rO;n7li(f#X#{F43TD$Fq45Jw< ziSy?JP_E|3PoK(LaAg!lj&A~Gaht@`puGGfPwL@ImOS@!AIP$M51Q>M9MJ)8{K|OL z;92m%Ut2RW*UQuxWqBLiP>A?uuNp??_M{

?j?6`p@zDvQ%!Bt9Ho1#2r^2C0C#D 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 z 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 B-tGVZ literal 475532 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%0DWRmlIoiROOy9IqDNb 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ⅇ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

$la#9%pcoM_LHP%|x9T8sNk-GKXq3kjCy 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�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�(?|TfNwz_(%WI74H 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 YN6H-}t@QW#@?W6#u9xe+zxnI`0E<|z)c^nh diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 7f23452334c..616d7609afb 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,6 +1,6 @@ -From 5e9f6dd73080e121201fd2a26f282b2921053871 Mon Sep 17 00:00:00 2001 +From 9a74ab891ad2f1e2c47ef495767e5b3a25c33fa2 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer -Date: Thu, 13 Apr 2023 16:28:35 +1000 +Date: Sun, 16 Apr 2023 14:21:09 +1000 Subject: [PATCH] Signed-off-by: Andy-Python-Programmer @@ -73,14 +73,14 @@ index 003a162..ab01a7a 100644 constexpr bool eagerBinding = true; diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 0faf386..e6bd277 100644 +index 6eeb980..e6bd277 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp @@ -176,13 +176,6 @@ int sys_kill(int pid, int sig) { return 0; } --pid_t sys_getpgid(pid_t pid, pid_t *pgid) { +-int sys_getpgid(pid_t pid, pid_t *pgid) { - mlibc::infoLogger() << "sys_getpgid() is unimplemented" << frg::endlog; - *pgid = 0; - diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 849977bd4f6..9bd3edb252c 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -62,7 +62,7 @@ impl NetworkDevice { pub fn new(driver: Arc) -> Self { // FIXME(andy): DHCPD should handle static IP assignment. let mut metadata = Metadata::default(); - metadata.ip = Ipv4Addr::new([192, 168, 122, 0]); + metadata.ip = Ipv4Addr::new([192, 168, 100, 0]); Self { driver, diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index ed02424ef25..5b87a0c55d9 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -15,7 +15,6 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -use alloc::boxed::Box; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use spin::Once; @@ -24,52 +23,37 @@ use crate::fs::cache::DirCacheItem; use crate::fs::file_table::FileHandle; use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags}; use crate::fs::{self, FileSystemError}; -use crate::mem::alloc_boxed_buffer; use crate::net::ip::Ipv4Addr; use crate::net::tcp::{self, Tcp, TcpFlags, TcpHandler}; use crate::net::{Packet, PacketHeader, PacketTrait}; -use crate::utils::sync::Mutex; +use crate::utils::sync::{BlockQueue, Mutex}; /// TCP Stream struct Stream { - read_cursor: usize, - write_cursor: usize, - - buffer: Box<[u8]>, + buffer: Vec, } impl Stream { fn write(&mut self, buffer: &[u8]) { - assert!(self.write_cursor < self.buffer.len()); - - self.buffer[self.write_cursor..self.write_cursor + buffer.len()].copy_from_slice(buffer); - self.write_cursor += buffer.len(); + self.buffer.extend_from_slice(buffer); } fn read(&mut self, buffer: &mut [u8]) -> usize { - assert!(self.write_cursor > self.read_cursor); - - let size = buffer.len().min(self.write_cursor - self.read_cursor); - - buffer[..size].copy_from_slice(&self.buffer[self.read_cursor..self.read_cursor + size]); - self.read_cursor += buffer.len(); + let size = buffer.len().min(self.buffer.len()); + let target = self.buffer.drain(..size).collect::>(); + buffer[..size].copy_from_slice(target.as_slice()); size } fn is_empty(&self) -> bool { - self.read_cursor == self.write_cursor + self.buffer.is_empty() } } impl Default for Stream { fn default() -> Self { - Self { - read_cursor: 0, - write_cursor: 0, - - buffer: alloc_boxed_buffer(4096), - } + Self { buffer: Vec::new() } } } @@ -163,14 +147,18 @@ pub struct TcpSocket { sref: Weak, data: Mutex, handle: Once>, + wq: BlockQueue, } impl TcpSocket { + const MAX_MTU: usize = 1460; + pub fn new() -> Arc { Arc::new_cyclic(|sref| Self { handle: Once::new(), sref: sref.clone(), data: Mutex::new(TcpData::default()), + wq: BlockQueue::new(), }) } @@ -215,6 +203,15 @@ impl INodeInterface for TcpSocket { Ok(()) } + fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + let mut data = self + .wq + .block_on(&self.data, |e| e.state == State::Established)?; + + assert!(!data.stream.is_empty()); + Ok(data.stream.read(buffer)) + } + fn recv( &self, message_hdr: &mut aero_syscall::socket::MessageHeader, @@ -233,13 +230,25 @@ impl INodeInterface for TcpSocket { .sum::()) } + fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { + let mut data = self + .wq + .block_on(&self.data, |e| e.state == State::Established)?; + + for chunk in buffer.chunks(Self::MAX_MTU) { + let mut packet = data.make_ack_packet(chunk.len()); + packet.as_slice_mut().copy_from_slice(chunk); + data.send_packet(packet); + } + + Ok(buffer.len()) + } + fn send( &self, message_hdr: &mut aero_syscall::socket::MessageHeader, _flags: aero_syscall::socket::MessageFlags, ) -> fs::Result { - const MAX_MTU: usize = 1460; - let data = message_hdr .iovecs() .iter() @@ -250,7 +259,7 @@ impl INodeInterface for TcpSocket { let mut inner = self.data.lock_irq(); - for chunk in data.chunks(MAX_MTU) { + for chunk in data.chunks(Self::MAX_MTU) { let mut packet = inner.make_ack_packet(chunk.len()); packet.as_slice_mut().copy_from_slice(chunk); inner.send_packet(packet); From b4cbfc2fbf6666051cc7174abbe89fb92079b394 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 18 Apr 2023 16:42:43 +1000 Subject: [PATCH 192/368] readme: add GPLv3 (free as in freedom) image Signed-off-by: Andy-Python-Programmer --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e68fbef5daf..2ed444cf102 100644 --- a/README.md +++ b/README.md @@ -150,6 +150,7 @@ Contributions are absolutely, positively welcome and encouraged! Check out [CONT # License + Aero is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or From 4f33feff30d72188acc54182a61923fc606baeb1 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 18 Apr 2023 16:43:25 +1000 Subject: [PATCH 193/368] misc: add `gpl.png` Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 177 +++++++++++++++++++++++------- misc/gpl.png | Bin 0 -> 35819 bytes patches/glib/glib.patch | 51 +++++++++ src/aero_kernel/src/syscall/fs.rs | 18 +-- 4 files changed, 196 insertions(+), 50 deletions(-) create mode 100644 misc/gpl.png create mode 100644 patches/glib/glib.patch diff --git a/bootstrap.yml b/bootstrap.yml index fb2e86187b3..3cbefd2d4f0 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -80,6 +80,12 @@ sources: tag: 'llvmorg-14.0.1' version: '14.0.1' + - name: glib + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/glib.git' + tag: '2.72.3' + version: '2.72.3' + # --------------------------------------------------------------------------- # Rust patched crates start # --------------------------------------------------------------------------- @@ -219,6 +225,20 @@ sources: NOCONFIGURE: 'yes' tools: + - name: host-glib + exports_aclocal: true + from_source: glib + configure: + - args: + - 'meson' + - '--prefix=@PREFIX@' + - '--libdir=lib' + - '@THIS_SOURCE_DIR@' + compile: + - args: ['ninja'] + install: + - args: ['ninja', 'install'] + - name: host-cmake source: subdir: 'bundled' @@ -1841,62 +1861,134 @@ packages: - args: ['make', '-j@PARALLELISM@'] - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] - - # - name: weston - # labels: [aarch64] - # architecture: '@OPTION:arch@' + # - name: dbus # source: - # subdir: 'ports' - # git: 'https://github.com/wayland-project/weston.git' - # tag: '10.0.0' - # version: '10.0.0' + # subdir: 'bundled' + # git: 'https://gitlab.freedesktop.org/dbus/dbus.git' + # tag: 'dbus-1.12.20' + # version: '1.12.20' + # tools_required: + # - host-autoconf-v2.69 + # - host-automake-v1.16 + # - host-libtool + # - host-autoconf-archive + # regenerate: + # - args: ['./autogen.sh'] + # environ: + # NOCONFIGURE: 'yes' # tools_required: + # - host-gcc # - host-autoconf-v2.69 # - host-automake-v1.16 - # - host-libtool # - host-pkg-config - # - system-gcc - # - wayland-scanner + # - host-python # - virtual: pkgconfig-for-target - # triple: "@OPTION:arch-triple@" - # - virtual: pkgconfig-for-host - # program_name: host-pkg-config + # triple: 'x86_64-aero' # pkgs_required: # - mlibc - # - cairo - # - libinput - # - libxkbcommon - # - mesa - # - wayland - # - wayland-protocols - # - dejavu - # - libxcursor - # - xorg-server - # - pango # - glib - # - libjpeg-turbo + # - libexpat + # configure: + # - args: + # - '@THIS_SOURCE_DIR@/configure' + # - '--host=x86_64-aero' + # - '--prefix=/usr' + # - '--sysconfdir=/etc' + # - '--localstatedir=/var' + # - '--disable-doxygen-docs' + # - '--disable-xml-docs' + # - '--disable-static' + # - '--enable-shared' + # - '--enable-verbose-mode' + # - '--with-systemdsystemunitdir=no' + # - '--with-systemduserunitdir=no' + # - '--docdir=/usr/share/doc/dbus-1.12.20' + # - '--with-console-auth-dir=/run/console' + # - '--with-system-pid-file=/run/dbus/pid' + # - '--with-system-socket=/run/dbus/system_bus_socket' + # - '--disable-selinux' + # - '--disable-apparmor' + # - '--disable-libaudit' + # - '--disable-kqueue' + # - '--disable-launchd' + # - '--disable-systemd' + # - '--disable-tests' + # build: + # - args: ['make', '-j@PARALLELISM@'] + # - args: ['make', 'install'] + # environ: + # DESTDIR: '@THIS_COLLECT_DIR@' + + # - name: libintl + # source: + # subdir: 'bundled' + # url: 'https://ftp.gnu.org/gnu/gettext/gettext-0.21.tar.xz' + # format: 'tar.xz' + # extract_path: 'gettext-0.21' + # version: '0.21' + # tools_required: + # - host-autoconf-v2.69 + # - host-automake-v1.16 + # - host-libtool + # regenerate: + # - args: ['autoreconf', '-fvi'] + # tools_required: + # - host-gcc + # pkgs_required: + # - libiconv + # configure: + # - args: + # - '@THIS_SOURCE_DIR@/configure' + # - '--host=x86_64-aero' + # - '--prefix=/usr' + # - '--without-emacs' + # - '--without-lispdir' + # # Normally this controls nls behavior in general, but the libintl + # # subdir is skipped unless this is explicitly set. + # - '--enable-nls' + # # This magic flag enables libintl. + # - '--with-included-gettext' + # - '--disable-c++' + # - '--disable-libasprintf' + # - '--disable-java' + # - '--enable-shared' + # - '--disable-static' + # - '--enable-threads=posix' + # - '--disable-curses' + # - '--without-git' + # - '--without-cvs' + # - '--without-bzip2' + # - '--without-xz' + # build: + # - args: ['make', '-C', 'gettext-runtime/intl', '-j@PARALLELISM@'] + # - args: ['make', '-C', 'gettext-runtime/intl', 'install'] + # environ: + # DESTDIR: '@THIS_COLLECT_DIR@' + + # - name: glib + # from_source: glib + # tools_required: + # - host-gcc + # - host-libtool + # - host-pkg-config + # - virtual: pkgconfig-for-target + # triple: "x86_64-aero" + # pkgs_required: + # - mlibc + # - pcre + # - libffi + # - zlib + # - libiconv + # - libintl # configure: # - args: # - 'meson' - # - '--native-file' - # - '@SOURCE_ROOT@/scripts/meson.native-file' # - '--cross-file' - # - '@SOURCE_ROOT@/scripts/meson-@OPTION:arch-triple@.cross-file' + # - '@SOURCE_ROOT@/userland/cross-file.ini' # - '--prefix=/usr' # - '--libdir=lib' # - '--buildtype=debugoptimized' - # - '-Dbackend-x11=false' - # - '-Dsimple-clients=damage,im,egl,shm,touch' - # - '-Dimage-jpeg=true' - # - '-Dimage-webp=false' - # - '-Dlauncher-logind=false' - # - '-Dbackend-drm-screencast-vaapi=false' - # - '-Dbackend-rdp=false' - # - '-Dcolor-management-colord=false' - # - '-Dcolor-management-lcms=false' - # - '-Dsystemd=false' - # - '-Dremoting=false' - # - '-Dpipewire=false' + # - '-Dxattr=false' # - '@THIS_SOURCE_DIR@' # environ: # PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' @@ -1906,7 +1998,10 @@ packages: # - args: ['ninja', 'install'] # environ: # DESTDIR: '@THIS_COLLECT_DIR@' - # quiet: true + # scripts: + # post_install: + # - args: ['glib-compile-schemas /usr/share/glib-2.0/schemas'] + # - args: ['gio-querymodules /usr/lib/gio/modules'] tasks: - name: sysroot diff --git a/misc/gpl.png b/misc/gpl.png new file mode 100644 index 0000000000000000000000000000000000000000..24727f3e28f33e8a676e032174b133fdeedcdca1 GIT binary patch literal 35819 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 i{U-u2X?TX*`~M$!aOAiuA2_1`0000 +Date: Sun, 16 Apr 2023 16:50:17 +1000 +Subject: [PATCH] + +--- + gio/gcredentialsprivate.h | 2 +- + glib/glib-init.c | 1 + + glib/gstrfuncs.c | 1 + + 3 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/gio/gcredentialsprivate.h b/gio/gcredentialsprivate.h +index c09f9ec..3942c48 100644 +--- a/gio/gcredentialsprivate.h ++++ b/gio/gcredentialsprivate.h +@@ -102,7 +102,7 @@ + */ + #undef G_CREDENTIALS_HAS_PID + +-#ifdef __linux__ ++#if defined(__linux__) || defined(__aero__) + #define G_CREDENTIALS_SUPPORTED 1 + #define G_CREDENTIALS_USE_LINUX_UCRED 1 + #define G_CREDENTIALS_NATIVE_TYPE G_CREDENTIALS_TYPE_LINUX_UCRED +diff --git a/glib/glib-init.c b/glib/glib-init.c +index e7b4984..2e38538 100644 +--- a/glib/glib-init.c ++++ b/glib/glib-init.c +@@ -27,6 +27,7 @@ + #include "gmem.h" /* for g_mem_gc_friendly */ + + #include ++#include + #include + #include + #include +diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c +index 9273533..2e3b9b2 100644 +--- a/glib/gstrfuncs.c ++++ b/glib/gstrfuncs.c +@@ -33,6 +33,7 @@ + #include + #include + #include ++#include + #include + #include + #include +-- +2.40.0 + diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 4128a709308..721c31c07ce 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -60,15 +60,15 @@ pub fn read(fd: usize, buffer: &mut [u8]) -> Result { .get_handle(fd) .ok_or(SyscallError::EBADFD)?; - if handle - .flags - .read() - .intersects(OpenFlags::O_RDONLY | OpenFlags::O_RDWR) - { - Ok(handle.read(buffer)?) - } else { - Err(SyscallError::EACCES) - } + // if handle + // .flags + // .read() + // .intersects(OpenFlags::O_RDONLY | OpenFlags::O_RDWR) + // { + Ok(handle.read(buffer)?) + // } else { + // Err(SyscallError::EACCES) + // } } #[syscall] From 2211d9a5149a47bed74e897ed6dbd63733b495dc Mon Sep 17 00:00:00 2001 From: Anhad Singh <62820092+Andy-Python-Programmer@users.noreply.github.com> Date: Tue, 18 Apr 2023 16:50:00 +1000 Subject: [PATCH 194/368] misc: fix readme formatting The style option does not work in GitHub. So, `align` was needed to align the image next to the text. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ed444cf102..3f670ddb6de 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,8 @@ Contributions are absolutely, positively welcome and encouraged! Check out [CONT # License - + + Aero is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or From 42c9ff252c4243163839788e8f3d71d9c689c43e Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Tue, 18 Apr 2023 17:36:57 +1000 Subject: [PATCH 195/368] bootstrap: update freetype to `2.13.0` Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bootstrap.yml b/bootstrap.yml index 3cbefd2d4f0..5c97927b5cd 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -1604,8 +1604,8 @@ packages: source: subdir: 'bundled' git: 'https://gitlab.freedesktop.org/freetype/freetype.git' - tag: 'VER-2-12-1' - version: '2.12.1' + tag: 'VER-2-13-0' + version: '2.13.0' tools_required: - host-autoconf-v2.69 - host-automake-v1.16 From 9b0049de4fac5a648cb0188c33b126fa8ef18860 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Wed, 19 Apr 2023 16:28:59 +1000 Subject: [PATCH 196/368] bootstrap: gtk+3 Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 658 ++++++++++++++---- bootstrap/xorg.yml | 340 +++++++++ .../gobject-introspection.patch | 29 + patches/gtk+-3/gtk+-3.patch | 77 ++ tools/deps/deps_linux | 1 + 5 files changed, 964 insertions(+), 141 deletions(-) create mode 100644 patches/gobject-introspection/gobject-introspection.patch create mode 100644 patches/gtk+-3/gtk+-3.patch diff --git a/bootstrap.yml b/bootstrap.yml index 5c97927b5cd..2f33099bfa8 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -83,8 +83,8 @@ sources: - name: glib subdir: 'bundled' git: 'https://gitlab.gnome.org/GNOME/glib.git' - tag: '2.72.3' - version: '2.72.3' + tag: '2.74.7' + version: '2.74.7' # --------------------------------------------------------------------------- # Rust patched crates start @@ -224,6 +224,20 @@ sources: environ: NOCONFIGURE: 'yes' + - name: icu + subdir: 'bundled' + git: 'https://github.com/unicode-org/icu.git' + tag: 'release-70-1' + version: '70.1' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + regenerate: + - args: ['cp', + '@BUILD_ROOT@/tools/host-automake-v1.15/share/automake-1.15/config.sub', + '@THIS_SOURCE_DIR@/icu4c/source'] + tools: - name: host-glib exports_aclocal: true @@ -403,6 +417,17 @@ tools: install: - args: ['make', 'install'] + - name: host-icu + from_source: icu + configure: + - args: + - '@THIS_SOURCE_DIR@/icu4c/source/configure' + - '--prefix=@PREFIX@' + compile: + - args: ['make', '-j@PARALLELISM@'] + install: + - args: ['make', 'install'] + - name: host-binutils from_source: binutils configure: @@ -1821,6 +1846,156 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + # GTK+ & GNOME Accessibility Toolkit + # + # This package provides a set of accessibility interfaces used extensively througout GTK and GNOME. + - name: atk + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/atk.git' + tag: '2.38.0' + version: '2.38.0' + tools_required: + - host-gcc + - host-pkg-config + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - glib + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '--libdir=lib' + - '--buildtype=debugoptimized' + - '-Dintrospection=false' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: cairo + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/cairo/cairo.git' + tag: '1.17.6' + version: '1.17.6' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['./autogen.sh'] + environ: + 'NOCONFIGURE': 'yes' + tools_required: + - host-gcc + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + pkgs_required: + - mlibc + - freetype + - fontconfig + - libpng + - pixman + - libxcb + - libx11 + - libxext + - mesa + - libxrender + - glib + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. + - '--enable-xlib-xcb' + - '--enable-xml' + - '--enable-tee' + - '--enable-gl' + environ: + # freetype-config does not support cross-compilation. + FREETYPE_CONFIG: 'no' + PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' + PKG_CONFIG_LIBDIR: '@BUILD_ROOT@/system-root/usr/lib/pkgconfig:@BUILD_ROOT@/system-root/usr/share/pkgconfig' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: at-spi2-atk + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/at-spi2-atk.git' + tag: 'AT_SPI2_ATK_2_38_0' + version: '2.38.0' + tools_required: + - host-pkg-config + - host-gcc + - virtual: pkgconfig-for-target + triple: 'x86_64-aero' + pkgs_required: + - mlibc + - at-spi2-core + - atk + - dbus + - glib + - libxml + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: at-spi2-core + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/at-spi2-core.git' + tag: 'AT_SPI2_CORE_2_38_0' + version: '2.38.0' + tools_required: + - host-pkg-config + - host-gcc + - virtual: pkgconfig-for-target + triple: 'x86_64-aero' + pkgs_required: + - mlibc + - dbus + - glib + - libxtst + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '-Dsystemd_user_dir=/tmp' + - '-Dintrospection=no' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + - name: pcre source: subdir: 'bundled' @@ -1861,147 +2036,348 @@ packages: - args: ['make', '-j@PARALLELISM@'] - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] - # - name: dbus - # source: - # subdir: 'bundled' - # git: 'https://gitlab.freedesktop.org/dbus/dbus.git' - # tag: 'dbus-1.12.20' - # version: '1.12.20' - # tools_required: - # - host-autoconf-v2.69 - # - host-automake-v1.16 - # - host-libtool - # - host-autoconf-archive - # regenerate: - # - args: ['./autogen.sh'] - # environ: - # NOCONFIGURE: 'yes' - # tools_required: - # - host-gcc - # - host-autoconf-v2.69 - # - host-automake-v1.16 - # - host-pkg-config - # - host-python - # - virtual: pkgconfig-for-target - # triple: 'x86_64-aero' - # pkgs_required: - # - mlibc - # - glib - # - libexpat - # configure: - # - args: - # - '@THIS_SOURCE_DIR@/configure' - # - '--host=x86_64-aero' - # - '--prefix=/usr' - # - '--sysconfdir=/etc' - # - '--localstatedir=/var' - # - '--disable-doxygen-docs' - # - '--disable-xml-docs' - # - '--disable-static' - # - '--enable-shared' - # - '--enable-verbose-mode' - # - '--with-systemdsystemunitdir=no' - # - '--with-systemduserunitdir=no' - # - '--docdir=/usr/share/doc/dbus-1.12.20' - # - '--with-console-auth-dir=/run/console' - # - '--with-system-pid-file=/run/dbus/pid' - # - '--with-system-socket=/run/dbus/system_bus_socket' - # - '--disable-selinux' - # - '--disable-apparmor' - # - '--disable-libaudit' - # - '--disable-kqueue' - # - '--disable-launchd' - # - '--disable-systemd' - # - '--disable-tests' - # build: - # - args: ['make', '-j@PARALLELISM@'] - # - args: ['make', 'install'] - # environ: - # DESTDIR: '@THIS_COLLECT_DIR@' + - name: dbus + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/dbus/dbus.git' + tag: 'dbus-1.12.20' + version: '1.12.20' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-autoconf-archive + regenerate: + - args: ['./autogen.sh'] + environ: + NOCONFIGURE: 'yes' + tools_required: + - host-gcc + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-pkg-config + - host-python + - virtual: pkgconfig-for-target + triple: 'x86_64-aero' + pkgs_required: + - mlibc + - glib + - libexpat + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + - '--disable-doxygen-docs' + - '--disable-xml-docs' + - '--disable-static' + - '--enable-shared' + - '--enable-verbose-mode' + - '--with-systemdsystemunitdir=no' + - '--with-systemduserunitdir=no' + - '--docdir=/usr/share/doc/dbus-1.12.20' + - '--with-console-auth-dir=/run/console' + - '--with-system-pid-file=/run/dbus/pid' + - '--with-system-socket=/run/dbus/system_bus_socket' + - '--disable-selinux' + - '--disable-apparmor' + - '--disable-libaudit' + - '--disable-kqueue' + - '--disable-launchd' + - '--disable-systemd' + - '--disable-tests' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' - # - name: libintl - # source: - # subdir: 'bundled' - # url: 'https://ftp.gnu.org/gnu/gettext/gettext-0.21.tar.xz' - # format: 'tar.xz' - # extract_path: 'gettext-0.21' - # version: '0.21' - # tools_required: - # - host-autoconf-v2.69 - # - host-automake-v1.16 - # - host-libtool - # regenerate: - # - args: ['autoreconf', '-fvi'] - # tools_required: - # - host-gcc - # pkgs_required: - # - libiconv - # configure: - # - args: - # - '@THIS_SOURCE_DIR@/configure' - # - '--host=x86_64-aero' - # - '--prefix=/usr' - # - '--without-emacs' - # - '--without-lispdir' - # # Normally this controls nls behavior in general, but the libintl - # # subdir is skipped unless this is explicitly set. - # - '--enable-nls' - # # This magic flag enables libintl. - # - '--with-included-gettext' - # - '--disable-c++' - # - '--disable-libasprintf' - # - '--disable-java' - # - '--enable-shared' - # - '--disable-static' - # - '--enable-threads=posix' - # - '--disable-curses' - # - '--without-git' - # - '--without-cvs' - # - '--without-bzip2' - # - '--without-xz' - # build: - # - args: ['make', '-C', 'gettext-runtime/intl', '-j@PARALLELISM@'] - # - args: ['make', '-C', 'gettext-runtime/intl', 'install'] - # environ: - # DESTDIR: '@THIS_COLLECT_DIR@' + - name: libintl + source: + subdir: 'bundled' + url: 'https://ftp.gnu.org/gnu/gettext/gettext-0.21.1.tar.xz' + format: 'tar.xz' + extract_path: 'gettext-0.21.1' + version: '0.21.1' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + regenerate: + - args: ['autoreconf', '-fvi'] + tools_required: + - host-gcc + pkgs_required: + - libiconv + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--without-emacs' + - '--without-lispdir' + # Normally this controls nls behavior in general, but the libintl + # subdir is skipped unless this is explicitly set. + - '--enable-nls' + # This magic flag enables libintl. + - '--with-included-gettext' + - '--disable-c++' + - '--disable-libasprintf' + - '--disable-java' + - '--enable-shared' + - '--disable-static' + - '--enable-threads=posix' + - '--disable-curses' + - '--without-git' + - '--without-cvs' + - '--without-bzip2' + - '--without-xz' + build: + - args: ['make', '-C', 'gettext-runtime/intl', '-j@PARALLELISM@'] + - args: ['make', '-C', 'gettext-runtime/intl', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' - # - name: glib - # from_source: glib - # tools_required: - # - host-gcc - # - host-libtool - # - host-pkg-config - # - virtual: pkgconfig-for-target - # triple: "x86_64-aero" - # pkgs_required: - # - mlibc - # - pcre - # - libffi - # - zlib - # - libiconv - # - libintl - # configure: - # - args: - # - 'meson' - # - '--cross-file' - # - '@SOURCE_ROOT@/userland/cross-file.ini' - # - '--prefix=/usr' - # - '--libdir=lib' - # - '--buildtype=debugoptimized' - # - '-Dxattr=false' - # - '@THIS_SOURCE_DIR@' - # environ: - # PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' - # PKG_CONFIG_LIBDIR: '@BUILD_ROOT@/system-root/usr/lib/pkgconfig:@BUILD_ROOT@/system-root/usr/share/pkgconfig' - # build: - # - args: ['ninja'] - # - args: ['ninja', 'install'] - # environ: - # DESTDIR: '@THIS_COLLECT_DIR@' - # scripts: - # post_install: - # - args: ['glib-compile-schemas /usr/share/glib-2.0/schemas'] - # - args: ['gio-querymodules /usr/lib/gio/modules'] + - name: glib + from_source: glib + tools_required: + - host-gcc + - host-libtool + - host-pkg-config + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - pcre + - libffi + - zlib + - libiconv + - libintl + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '--libdir=lib' + - '--buildtype=debugoptimized' + - '-Dxattr=false' + - '@THIS_SOURCE_DIR@' + environ: + PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' + PKG_CONFIG_LIBDIR: '@BUILD_ROOT@/system-root/usr/lib/pkgconfig:@BUILD_ROOT@/system-root/usr/share/pkgconfig' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + scripts: + post_install: + - args: ['glib-compile-schemas /usr/share/glib-2.0/schemas'] + - args: ['gio-querymodules /usr/lib/gio/modules'] + + - name: libjpeg-turbo + source: + subdir: 'bundled' + git: 'https://github.com/libjpeg-turbo/libjpeg-turbo.git' + tag: '2.1.4' + version: '2.1.4' + tools_required: + - host-pkg-config + - host-gcc + - host-cmake + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + configure: + - args: + - 'cmake' + - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.cmake' + - '-DCMAKE_INSTALL_PREFIX=/usr' + - '-DCMAKE_BUILD_TYPE=RELEASE' + - '-DENABLE_STATIC=FALSE' + - '-DCMAKE_INSTALL_DOCDIR=/usr/share/doc/libjpeg-turbo-2.1.4' + - '-DCMAKE_INSTALL_DEFAULT_LIBDIR=lib' + - '-DWITH_JPEG8=ON' + - '-DCMAKE_SYSTEM_PROCESSOR=x86_64' + - '@THIS_SOURCE_DIR@/' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + # A free implementation of the unicode bidirectional algorithm + # + # This package provides a library with an implementation of the Unicode + # Bidirectional Algorithm (BIDI). This is used for supporting Arabic and + # Hebrew alphabets in other packages. + - name: fribidi + source: + subdir: 'bundled' + git: 'https://github.com/fribidi/fribidi.git' + tag: 'v1.0.12' + version: '1.0.12' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['./autogen.sh'] + environ: + 'NOCONFIGURE': 'yes' + - args: 'sed -i s/"SUBDIRS = gen.tab lib bin doc test"/"SUBDIRS = gen.tab lib bin test"/ @THIS_SOURCE_DIR@/Makefile.am' + tools_required: + - host-gcc + - host-autoconf-v2.69 + - host-automake-v1.16 + pkgs_required: + - mlibc + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + # Translation tool for XML documents that uses gettext files and ITS rules + # + # This package contains a program for translating XML with PO files using W3C + # Internationalization Tag Set rules. + - name: itstool + source: + subdir: 'bundled' + git: 'https://github.com/itstool/itstool.git' + tag: '2.0.7' + version: '2.0.7' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['./autogen.sh'] + environ: + 'NOCONFIGURE': 'yes' + tools_required: + - host-gcc + - host-python + pkgs_required: + - mlibc + - libxml + - python + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + environ: + 'PYTHON': '/usr/bin/python3' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: icu + from_source: icu + tools_required: + - host-gcc + - host-icu + pkgs_required: + - mlibc + configure: + - args: ['cp', + '@THIS_SOURCE_DIR@/icu4c/source/config/mh-linux', + '@THIS_SOURCE_DIR@/icu4c/source/config/mh-unknown'] + - args: + - '@THIS_SOURCE_DIR@/icu4c/source/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--with-cross-build=@BUILD_ROOT@/tool-builds/host-icu' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: graphite2 + source: + subdir: 'bundled' + git: 'https://github.com/silnrsi/graphite.git' + tag: '1.3.14' + version: '1.3.14' + tools_required: + - host-gcc + - host-python + - host-cmake + pkgs_required: + - mlibc + - gcc # Actually requires libstdc++.so in the system root, otherwise it links against the host libstdc++.so.6 + configure: + - args: + - 'cmake' + - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.cmake' + - '-DCMAKE_INSTALL_PREFIX=/usr' + - '@THIS_SOURCE_DIR@' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: harfbuzz + source: + subdir: 'bundled' + git: 'https://github.com/harfbuzz/harfbuzz.git' + tag: '3.1.2' + version: '3.1.2' + tools_required: + - host-gcc + - host-pkg-config + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - graphite2 + - glib + - zlib + - freetype + - cairo + - icu + configure: + - args: + - 'meson' + - '--native-file' + - '@SOURCE_ROOT@/userland/native-file.ini' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '--libdir=lib' + - '--buildtype=debugoptimized' + - '-Dgraphite2=enabled' + - '-Dglib=enabled' + - '-Dgobject=disabled' + - '-Dicu=enabled' + - '-Dfreetype=enabled' + - '-Dcairo=enabled' + - '-Dintrospection=disabled' + - '-Ddocs=disabled' + - '-Dtests=disabled' # Disabled due to a linking error + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' tasks: - name: sysroot diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index e43d4f6ac09..d45758b12d8 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -45,7 +45,36 @@ sources: environ: NOCONFIGURE: 'yes' + - name: gobject-introspection + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/gobject-introspection.git' + # New meson versions break old builds, but the fix isn't in a stable release yet + branch: 'main' + commit: '7368d58a2d615e7cade85afd3f88df65256b699f' + tools: + #- name: host-gobject-introspection + # exports_aclocal: true + # from_source: gobject-introspection + # tools_required: + # - host-python + # - host-glib + # - host-pkg-config + # - virtual: pkgconfig-for-host + # program_name: host-pkg-config + # configure: + # - args: + # - 'meson' + # - '--prefix=@PREFIX@' + # - '--native-file' + # - '@SOURCE_ROOT@/userland/native-file.ini' + # - '-Dbuild_introspection_data=false' + # - '@THIS_SOURCE_DIR@' + # compile: + # - args: ['ninja'] + # install: + # - args: ['ninja', 'install'] + - name: host-xorg-macros exports_aclocal: true from_source: xorg-util-macros @@ -2053,3 +2082,314 @@ packages: - args: ['make', 'install-strip'] environ: DESTDIR: '@THIS_COLLECT_DIR@' + + - name: libxtst + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/xorg/lib/libxtst.git' + tag: 'libXtst-1.2.4' + version: '1.2.4' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + - host-autoconf-archive + regenerate: + - args: ['./autogen.sh'] + environ: + 'NOCONFIGURE': 'yes' + tools_required: + - host-gcc + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-pkg-config + pkgs_required: + - mlibc + - xorg-util-macros + - xorg-proto + - libx11 + - libxtrans + - libxext + - libxi + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + - '--disable-static' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + # X Damage Extension library + - name: libxdamage + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/xorg/lib/libxdamage.git' + tag: 'libXdamage-1.1.5' + version: '1.1.5' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + - host-autoconf-archive + regenerate: + - args: ['./autogen.sh'] + environ: + 'NOCONFIGURE': 'yes' + tools_required: + - host-gcc + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-pkg-config + pkgs_required: + - mlibc + - xorg-util-macros + - xorg-proto + - libx11 + - libxtrans + - libxfixes + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + - '--disable-static' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: pango + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/pango.git' + tag: '1.50.11' + version: '1.50.11' + tools_required: + - host-pkg-config + - host-gcc + - host-glib + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - glib + - fontconfig + - freetype + - fribidi + - cairo + - xorg-proto + - libx11 + - libxtrans + - libxext + - harfbuzz + - libxft + revision: 2 + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '--buildtype=release' + - '-Dintrospection=disabled' + - '--wrap-mode=nofallback' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: gdk-pixbuf + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/gdk-pixbuf.git' + tag: '2.40.0' + version: '2.40.0' + tools_required: + - host-gcc + - host-libtool + - host-pkg-config + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - glib + - libjpeg-turbo + - libpng + - shared-mime-info + - libx11 + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '-Dgir=false' + - '-Dman=false' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + scripts: + post_install: + - args: ['gdk-pixbuf-query-loaders', '--update-cache'] + + - name: shared-mime-info + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/xdg/shared-mime-info.git' + tag: 'Release-1-15' + version: '1.15' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['./autogen.sh'] + environ: + 'NOCONFIGURE': 'yes' + tools_required: + - host-gcc + - host-python + pkgs_required: + - mlibc + - glib + - libxml + - itstool + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-update-mimedb' + environ: + 'ITSTOOL': '/usr/bin/itstool' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + scripts: + post_install: + - args: 'echo "Running update-mime-database; this may take a minute or 2..."' + - args: '/usr/bin/update-mime-database /usr/share/mime/' + + # Collection of GSettings schemas for GNOME desktop + # + # This package contains a collection of GSettings schemas for + # settings shared by various components of a GNOME Desktop. + #- name: gsettings-desktop-schemas + # source: + # subdir: 'bundled' + # git: 'https://gitlab.gnome.org/GNOME/gsettings-desktop-schemas.git' + # tag: '42.0' + # version: '42.0' + # tools_required: + # - host-gcc + # - host-gobject-introspection + # - host-libtool + # - host-pkg-config + # - virtual: pkgconfig-for-target + # triple: "x86_64-aero" + # pkgs_required: + # - mlibc + # - glib + # configure: + # - args: | + # sed -i -r 's:"(/system):"/org/gnome\1:g' @THIS_SOURCE_DIR@/schemas/*.in + # - args: + # - 'meson' + # - '--cross-file' + # - '@SOURCE_ROOT@/userland/cross-file.ini' + # - '--prefix=/usr' + # - '-Dintrospection=false' + # - '@THIS_SOURCE_DIR@' + # build: + # - args: ['ninja'] + # - args: ['ninja', 'install'] + # environ: + # DESTDIR: '@THIS_COLLECT_DIR@' + # scripts: + # post_install: + # - args: 'glib-compile-schemas /usr/share/glib-2.0/schemas' + + - name: gtk+-3 + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/gtk.git' + tag: '3.24.23' + version: '3.24.23' + tools_required: + - host-gcc + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + - host-glib + pkgs_required: + - mlibc + - atk + - at-spi2-atk + - cairo + - glib + - gdk-pixbuf + - libx11 + - libxext + - libxcb + - libxrender + - libxrandr + - libxfixes + - libxdamage + - pango + - fribidi + - libepoxy + - libxkbcommon + - fontconfig + - freetype + - libxi + - harfbuzz + - libxcursor + #- gsettings-desktop-schemas + - dbus + configure: + - args: + - 'meson' + - '--native-file' + - '@SOURCE_ROOT@/userland/native-file.ini' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '--libdir=lib' + - '--buildtype=debugoptimized' + - '-Dprint_backends=file' + - '-Dintrospection=false' + - '-Dx11_backend=true' + - '-Dwayland_backend=false' + - '-Dbroadway_backend=true' + - '-Dgtk_doc=false' + - '-Dcolord=no' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + scripts: + post_install: + - args: ['gtk-query-immodules-3.0', '--update-cache'] + - args: ['glib-compile-schemas', '/usr/share/glib-2.0/schemas'] diff --git a/patches/gobject-introspection/gobject-introspection.patch b/patches/gobject-introspection/gobject-introspection.patch new file mode 100644 index 00000000000..77521b645e8 --- /dev/null +++ b/patches/gobject-introspection/gobject-introspection.patch @@ -0,0 +1,29 @@ +From 4e30153d4e58f67d3cb040a75afa37cdc57cba33 Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Fri, 4 Feb 2022 02:24:50 +0100 +Subject: [PATCH] Disable tests as they are broken + +Signed-off-by: Dennis Bonke +--- + meson.build | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/meson.build b/meson.build +index bb4873e0..83931a4a 100644 +--- a/meson.build ++++ b/meson.build +@@ -234,9 +234,9 @@ subdir('docs') + + # The tests will also run, which is not possible if they + # were built for a different architecture. +-if not meson.is_cross_build() +- subdir('tests') +-endif ++#if not meson.is_cross_build() ++# subdir('tests') ++#endif + + install_data('Makefile.introspection', install_dir: join_paths(get_option('datadir'), 'gobject-introspection-1.0')) + install_data('m4/introspection.m4', install_dir: join_paths(get_option('datadir'), 'aclocal')) +-- +2.34.1 diff --git a/patches/gtk+-3/gtk+-3.patch b/patches/gtk+-3/gtk+-3.patch new file mode 100644 index 00000000000..0745b344f97 --- /dev/null +++ b/patches/gtk+-3/gtk+-3.patch @@ -0,0 +1,77 @@ +From ce246ae059f136289ac1e1d65a406f724e5114a6 Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Sun, 3 Apr 2022 22:48:43 +0200 +Subject: [PATCH] Initial Aero support + +Signed-off-by: Dennis Bonke +--- + gdk/wayland/gdkdisplay-wayland.c | 1 - + gtk/a11y/gtkaccessibility.c | 5 +++++ + gtk/gtkmain.c | 5 +++++ + meson.build | 2 +- + 4 files changed, 11 insertions(+), 2 deletions(-) + +diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c +index d4503c2..0e2efc6 100644 +--- a/gdk/wayland/gdkdisplay-wayland.c ++++ b/gdk/wayland/gdkdisplay-wayland.c +@@ -28,7 +28,6 @@ + #endif + + #include +-#include + + #include + #include "gdkwayland.h" +diff --git a/gtk/a11y/gtkaccessibility.c b/gtk/a11y/gtkaccessibility.c +index 7f0e520..543a78e 100644 +--- a/gtk/a11y/gtkaccessibility.c ++++ b/gtk/a11y/gtkaccessibility.c +@@ -974,6 +974,10 @@ do_window_event_initialization (void) + void + _gtk_accessibility_init (void) + { ++// We don't care about a11y at this point in time and dbus isn't working, so let's just not start that. ++#ifdef __aero__ ++ return; ++#else + if (initialized) + return; + +@@ -993,4 +997,5 @@ _gtk_accessibility_init (void) + #endif + + atk_misc_instance = g_object_new (GTK_TYPE_MISC_IMPL, NULL); ++#endif + } +diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c +index f7cbb34..8e035d4 100644 +--- a/gtk/gtkmain.c ++++ b/gtk/gtkmain.c +@@ -357,6 +357,11 @@ static gboolean + check_setugid (void) + { + /* this isn't at all relevant on MS Windows and doesn't compile ... --hb */ ++#ifdef __aero__ ++ /* Aero runs everything as root for the time being, this check is thus useless. */ ++ g_warning("Aero ignores the setugid check!\n"); ++ return TRUE; ++#endif + #ifndef G_OS_WIN32 + uid_t ruid, euid, suid; /* Real, effective and saved user ID's */ + gid_t rgid, egid, sgid; /* Real, effective and saved group ID's */ +diff --git a/meson.build b/meson.build +index a8f1383..32118df 100644 +--- a/meson.build ++++ b/meson.build +@@ -307,7 +307,7 @@ elif cc.get_id() == 'gcc' or cc.get_id() == 'clang' + '-Werror=sequence-point', + '-Werror=return-type', + '-Werror=trigraphs', +- '-Werror=array-bounds', ++ #'-Werror=array-bounds', + '-Werror=write-strings', + '-Werror=address', + '-Werror=int-to-pointer-cast', +-- +2.39.0 diff --git a/tools/deps/deps_linux b/tools/deps/deps_linux index 891b3c316c2..d1d0df06991 100755 --- a/tools/deps/deps_linux +++ b/tools/deps/deps_linux @@ -89,6 +89,7 @@ packages=( "libisoburn" "boost-libs" "cmake" + "itstool" ) function install_package() { pacman -S $1 --noconfirm; } From 244a6d313f4f4c755519ce82bb6cc49762627e3a Mon Sep 17 00:00:00 2001 From: Lynndox <98863980+Lynndox@users.noreply.github.com> Date: Tue, 18 Apr 2023 21:40:42 -0700 Subject: [PATCH 197/368] Improve package manager detection Check for existence of `apt`/`pacman` rather than relying on /etc/os-release, which can be [problematic](https://github.com/Andy-Python-Programmer/aero/issues/101#issuecomment-1514060054) --- tools/deps/deps_linux | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/tools/deps/deps_linux b/tools/deps/deps_linux index d1d0df06991..1241dc87ce5 100755 --- a/tools/deps/deps_linux +++ b/tools/deps/deps_linux @@ -1,10 +1,6 @@ #!/usr/bin/bash -# We are going to use /etc/os-release to identify which -# Linux distribution we are currently running. -. /etc/os-release - -if [[ $ID_LIKE == "debian" ]]; then +if [ -x "$(command -v apt)" ]; then PKGMAN="apt" packages=( @@ -48,7 +44,7 @@ packages=( function install_package() { apt-get install -y $1; } function query_package() { dpkg -l | grep -q $1; } -elif [[ $ID == "arch" ]]; then # if [[ $ID_LIKE == "debian" ]]; then +elif [ -x "$(command -v pacman)" ]; then # if [ -x "$(command -v apt)" ]; then PKGMAN="pacman" packages=( @@ -94,4 +90,4 @@ packages=( function install_package() { pacman -S $1 --noconfirm; } function query_package() { pacman -Q | grep -q $1; } -fi # elif [[ $ID == "arch" ]]; then +fi # elif [ -x "$(command -v pacman)" ]; then From d1fdd6cc0faeeb948f0c223f539f85fd9b2b8221 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 21 Apr 2023 17:44:01 +1000 Subject: [PATCH 198/368] bootstrap: libs for webkitgtk Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 178 ++++++++++++++++++++++ bootstrap/db.yml | 38 +++++ bootstrap/net.yml | 176 +++++++++++++++++++++- bootstrap/xorg.yml | 129 +++++++++++++--- patches/libtasn/libtasn.patch | 25 +++ patches/readline/readline.patch | 48 ++++++ patches/webkitgtk/webkitgtk.patch | 242 ++++++++++++++++++++++++++++++ 7 files changed, 811 insertions(+), 25 deletions(-) create mode 100644 bootstrap/db.yml create mode 100644 patches/libtasn/libtasn.patch create mode 100644 patches/readline/readline.patch create mode 100644 patches/webkitgtk/webkitgtk.patch diff --git a/bootstrap.yml b/bootstrap.yml index 2f33099bfa8..f065b2473e3 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -2,6 +2,7 @@ imports: - file: bootstrap/xorg.yml - file: bootstrap/net.yml - file: bootstrap/vcs.yml + - file: bootstrap/db.yml general: cargo: @@ -2287,6 +2288,183 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: readline + source: + subdir: 'bundled' + git: 'https://git.savannah.gnu.org/git/readline.git' + tag: 'readline-8.1' + version: '8.1' + tools_required: + - host-gcc + pkgs_required: + - mlibc + - ncurses + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-static' + - '--enable-multibyte' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + # General purpose crypto library based on the code used in GnuPG + # + # This package contains a general purpose crypto library based on the code used + # in GnuPG. The library provides a high level interface to cryptographic building + # blocks using an extendable and flexible API. + - name: libgcrypt + source: + subdir: 'bundled' + git: 'https://dev.gnupg.org/source/libgcrypt.git' + tag: 'libgcrypt-1.10.1' + version: '1.10.1' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + regenerate: + - args: ['./autogen.sh'] + - args: ['autoreconf', '-fvi'] + tools_required: + - host-gcc + pkgs_required: + - mlibc + - libgpg-error + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--enable-shared' + - '--disable-static' + - '--prefix=/usr' + - '--disable-nls' + - '--disable-doc' + - '--disable-dev-random' + - '--with-libgpg-error-prefix=@SYSROOT_DIR@/usr' + - '--disable-asm' + environ: + LIBS: '-lgpg-error' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + # A lossy image compression format + # + # This package contains a library and support programs to encode and decode images in WebP format. + - name: libwebp + source: + subdir: 'bundled' + git: 'https://github.com/webmproject/libwebp.git' + tag: 'v1.3.0' + version: '1.3.0' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['./autogen.sh'] + tools_required: + - host-gcc + pkgs_required: + - mlibc + - libjpeg-turbo + - libpng + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--enable-libwebpmux' + - '--enable-libwebpdemux' + - '--enable-libwebpdecoder' + - '--enable-libwebpextras' + - '--enable-swap-16bit-csp' + - '--disable-static' + - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: libtasn + source: + subdir: 'bundled' + git: 'https://gitlab.com/gnutls/libtasn1.git' + tag: 'v4.18.0' + version: '4.18.0' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-pkg-config + - host-libtool + regenerate: + - args: ['./bootstrap'] + - args: ['cp', + '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', + '@THIS_SOURCE_DIR@/build-aux/'] + tools_required: + - host-gcc + pkgs_required: + - mlibc + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-static' + - '--disable-doc' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + # Contains error handling functions used by GnuPG software + # + # This package contains a library that defines common error values for + # all GnuPG components. + - name: libgpg-error + source: + subdir: 'bundled' + git: 'https://dev.gnupg.org/source/libgpg-error.git' + tag: 'libgpg-error-1.45' + version: '1.45' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + regenerate: + - args: ['./autogen.sh'] + - args: ['autoreconf', '-f', '-v', '-i'] + tools_required: + - host-gcc + pkgs_required: + - mlibc + configure: + # libgpg-error does not know about managarm, teach it + - args: ['cp', '-v', '@THIS_SOURCE_DIR@/src/syscfg/lock-obj-pub.x86_64-unknown-linux-gnu.h', + '@THIS_SOURCE_DIR@/src/syscfg/lock-obj-pub.aero.h'] + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-nls' + - '--disable-doc' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + - name: icu from_source: icu tools_required: diff --git a/bootstrap/db.yml b/bootstrap/db.yml new file mode 100644 index 00000000000..b4a932c05c6 --- /dev/null +++ b/bootstrap/db.yml @@ -0,0 +1,38 @@ +packages: + - name: sqlite + source: + subdir: 'bundled' + url: 'https://sqlite.org/2021/sqlite-autoconf-3370000.tar.gz' + format: 'tar.gz' + checksum: blake2b:35e72700f20c35701d26f7b66da126242ea1d253f710f299a9b6f180f0a53d417114af022161a6cd9ebf20b791f0645f7a30290210fac197d5fda3a647067fd0 + extract_path: 'sqlite-autoconf-3370000' + version: '3.37.0' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + regenerate: + - args: ['autoreconf', '-fvi'] + tools_required: + - host-gcc + - host-libtool + - host-autoconf-v2.69 + - host-automake-v1.16 + pkgs_required: + - mlibc + - readline + - zlib + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-static' + - '--enable-readline' + - '--enable-fts5' + - 'CFLAGS=-g -O2 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS4=1 -DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_ENABLE_UNLOCK_NOTIFY=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_SECURE_DELETE=1 -DSQLITE_ENABLE_FTS3_TOKENIZER=1' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/net.yml b/bootstrap/net.yml index cf2aea07890..5960dc8c71e 100644 --- a/bootstrap/net.yml +++ b/bootstrap/net.yml @@ -228,4 +228,178 @@ packages: - args: ['make', '-j@PARALLELISM@'] - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] environ: - DESTDIR: '@THIS_COLLECT_DIR@' \ No newline at end of file + DESTDIR: '@THIS_COLLECT_DIR@' + + # Network-related giomodules for glib + # + # This package contains network related gio modules for GLib. + - name: glib-networking + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/glib-networking.git' + tag: '2.72.2' + version: '2.72.2' + tools_required: + - host-gcc + - host-pkg-config + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - glib + # - gnutls + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '--buildtype=debugoptimized' + - '-Dgnutls=disabled' + - '-Dopenssl=enabled' + - '-Dinstalled_tests=false' + - '-Dstatic_modules=false' + - '-Dlibproxy=disabled' + - '-Dgnome_proxy=disabled' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + scripts: + post_install: + - args: ['gio-querymodules', '/usr/lib/gio/modules'] + + # This package is a HTTP client/server library for GNOME. It uses GObject and the GLib main + # loop to integrate with GNOME applications and it also has an asynchronous API for use in + # threaded applications. + - name: libsoup + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/libsoup.git' + tag: '2.74.2' + version: '2.74.2' + tools_required: + - host-gcc + - host-pkg-config + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - glib + - glib-networking + - zlib + - libxml + - libpsl + - sqlite + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '--buildtype=debugoptimized' + - '-Dintrospection=disabled' + - '-Dinstalled_tests=false' + - '-Dsysprof=disabled' + - '-Dgtk_doc=false' + - '-Dvapi=disabled' + - '-Dgnome=false' + - '-Dtls_check=false' + - '-Dbrotli=disabled' + - '-Dntlm=disabled' + - '-Dgssapi=disabled' + - '-Dtests=false' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + # - name: webkitgtk + # metadata: + # summary: 'An open source web browser engine, with a small example browser' + # description: 'This package provides WebKitGTK, a port of the portable web rendering engine WebKit to the GTK+ 3 and GTK 4 platforms.' + # spdx: 'LGPL-2.0-or-later BSD-2-Clause' + # website: 'https://webkitgtk.org' + # maintainer: "Dennis Bonke " + # categories: ['net-libs'] + # source: + # subdir: 'bundled' + # git: 'https://github.com/WebKit/WebKit.git' + # # I think? Apple is weird with naming + # tag: 'Safari-612.1.27.0.24' + # version: '2.33.3' + # tools_required: + # - host-gcc + # - host-cmake + # pkgs_required: + # - mlibc + # - cairo + # - fontconfig + # - freetype + # - libgcrypt + # - glib + # - harfbuzz + # - icu + # - libjpeg-turbo + # - zlib + # - libpng + # - libxml + # - atk + # - sqlite + # - libwebp + # - gtk+-3 + # - libsoup + # - libxslt + # - at-spi2-core + # - libtasn + # - libx11 + # - libxcomposite + # - libxdamage + # - libxrender + # - libxt + # - mesa + # # - gst-plugins-base + # configure: + # - args: + # - 'cmake' + # - '-GNinja' + # - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.cmake' + # - '-DCMAKE_INSTALL_PREFIX=/usr' + # - '-DCMAKE_SYSTEM_PROCESSOR=x86_64' + # - '-DCMAKE_BUILD_TYPE=Release' + # - '-DCMAKE_SKIP_RPATH=ON' + # - '-DPORT=GTK' + # - '-DLIB_INSTALL_DIR=/usr/lib' + # - '-DUSE_LIBHYPHEN=OFF' + # - '-DENABLE_GAMEPAD=OFF' + # - '-DENABLE_MINIBROWSER=ON' + # - '-DUSE_WOFF2=OFF' + # - '-DUSE_SYSTEMD=OFF' + # - '-DENABLE_BUBBLEWRAP_SANDBOX=OFF' + # - '-Wno-dev -G Ninja' + # - '-DUSE_LIBNOTIFY=OFF' + # - '-DUSE_SYSTEM_MALLOC=ON' + # - '-DENABLE_GEOLOCATION=OFF' + # - '-DENABLE_VIDEO=OFF' + # - '-DENABLE_WEB_AUDIO=OFF' + # - '-DENABLE_INTROSPECTION=OFF' + # - '-DUSE_LIBSECRET=OFF' + # - '-DUSE_OPENJPEG=OFF' + # - '-DENABLE_SPELLCHECK=OFF' + # - '-DENABLE_WAYLAND_TARGET=OFF' + # - '-DENABLE_X11_TARGET=ON' + # - '-DENABLE_WEBGL=ON' + # - '-DUSE_WPE_RENDERER=OFF' + # - '-DENABLE_WEBGL2=OFF' + # - '-DUSE_SOUP2=ON' + # - '-DUSE_LCMS=OFF' + # - '@THIS_SOURCE_DIR@' + # build: + # - args: ['ninja', '-j8'] + # - args: ['ninja', 'install'] + # environ: + # DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index d45758b12d8..3caa6aeaf28 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -48,32 +48,31 @@ sources: - name: gobject-introspection subdir: 'bundled' git: 'https://gitlab.gnome.org/GNOME/gobject-introspection.git' - # New meson versions break old builds, but the fix isn't in a stable release yet - branch: 'main' - commit: '7368d58a2d615e7cade85afd3f88df65256b699f' + tag: '1.76.1' + version: '1.76.1' tools: - #- name: host-gobject-introspection - # exports_aclocal: true - # from_source: gobject-introspection - # tools_required: - # - host-python - # - host-glib - # - host-pkg-config - # - virtual: pkgconfig-for-host - # program_name: host-pkg-config - # configure: - # - args: - # - 'meson' - # - '--prefix=@PREFIX@' - # - '--native-file' - # - '@SOURCE_ROOT@/userland/native-file.ini' - # - '-Dbuild_introspection_data=false' - # - '@THIS_SOURCE_DIR@' - # compile: - # - args: ['ninja'] - # install: - # - args: ['ninja', 'install'] + - name: host-gobject-introspection + exports_aclocal: true + from_source: gobject-introspection + tools_required: + - host-python + - host-glib + - host-pkg-config + - virtual: pkgconfig-for-host + program_name: host-pkg-config + configure: + - args: + - 'meson' + - '--prefix=@PREFIX@' + - '--native-file' + - '@SOURCE_ROOT@/userland/native-file.ini' + - '-Dbuild_introspection_data=false' + - '@THIS_SOURCE_DIR@' + compile: + - args: ['ninja'] + install: + - args: ['ninja', 'install'] - name: host-xorg-macros exports_aclocal: true @@ -2393,3 +2392,85 @@ packages: post_install: - args: ['gtk-query-immodules-3.0', '--update-cache'] - args: ['glib-compile-schemas', '/usr/share/glib-2.0/schemas'] + + # X.Org Xcomposite library + - name: libxcomposite + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/xorg/lib/libxcomposite.git' + tag: 'libXcomposite-0.4.5' + version: '0.4.5' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + - host-autoconf-archive + regenerate: + - args: ['./autogen.sh'] + environ: + 'NOCONFIGURE': 'yes' + tools_required: + - host-gcc + pkgs_required: + - mlibc + - xorg-util-macros + - xorg-proto + - libx11 + - libxfixes + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--localstatedir=/var' + - '--disable-static' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: libxslt + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/libxslt.git' + tag: 'v1.1.34' + version: '1.1.34' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['./autogen.sh'] + environ: + 'NOCONFIGURE': 'yes' + tools_required: + - host-gcc + pkgs_required: + - mlibc + - libxml + configure: + # BLFS increases the recursion limit, apparently some packages need that to build their documentation. + - args: ['sed', '-i', 's/3000/5000/', '@THIS_SOURCE_DIR@/libxslt/transform.c'] + - args: ['sed', '-i', 's/3000/5000/', '@THIS_SOURCE_DIR@/doc/xsltproc.1'] + - args: ['sed', '-i', 's/3000/5000/', '@THIS_SOURCE_DIR@/doc/xsltproc.xml'] + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-static' + - '--without-crypto' + - '--without-debug' + - '--without-debugger' + - '--without-profiler' + - '--without-python' + - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/patches/libtasn/libtasn.patch b/patches/libtasn/libtasn.patch new file mode 100644 index 00000000000..6650d9859cd --- /dev/null +++ b/patches/libtasn/libtasn.patch @@ -0,0 +1,25 @@ +From 006807c2ec4429094c7bc0b1f54a7db462916df1 Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Wed, 14 Jul 2021 02:35:21 +0200 +Subject: [PATCH] Remove test directory as that can't be cross-compiled + +Signed-off-by: Dennis Bonke +--- + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile.am b/Makefile.am +index 86cca65..76b49b1 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -27,7 +27,7 @@ EXTRA_DIST = windows/asn1-parser/asn1-parser.vcproj \ + windows/test-tree/test-tree.vcproj windows/libtasn14win.mk + EXTRA_DIST += cfg.mk maint.mk CONTRIBUTING.md README.md + +-SUBDIRS = lib src fuzz tests ++SUBDIRS = lib src fuzz + + if ENABLE_DOC + SUBDIRS += doc examples +-- +2.32.0 diff --git a/patches/readline/readline.patch b/patches/readline/readline.patch new file mode 100644 index 00000000000..0c24ca877c0 --- /dev/null +++ b/patches/readline/readline.patch @@ -0,0 +1,48 @@ +From 983b779d546a3e7657a46e46ec3946083420c14a Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Tue, 9 Feb 2021 22:36:49 +0100 +Subject: [PATCH] Add Aero support + +Signed-off-by: Dennis Bonke +--- + support/config.sub | 2 +- + support/shlib-install | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/support/config.sub b/support/config.sub +index c874b7a..58e7639 100755 +--- a/support/config.sub ++++ b/support/config.sub +@@ -1720,7 +1720,7 @@ case $os in + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ +- | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*) ++ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | aero*) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) +diff --git a/support/shlib-install b/support/shlib-install +index 661355d..2d554f3 100755 +--- a/support/shlib-install ++++ b/support/shlib-install +@@ -71,7 +71,7 @@ fi + # Cygwin installs both a dll (which must go in $BINDIR) and an implicit + # link library (in $libdir) + case "$host_os" in +-hpux*|darwin*|macosx*|linux*|solaris2*) ++hpux*|darwin*|macosx*|linux*|solaris2*|*aero*) + if [ -z "$uninstall" ]; then + chmod 755 ${INSTALLDIR}/${LIBNAME} + fi ;; +@@ -146,7 +146,7 @@ bsdi4*|*gnu*|darwin*|macosx*|netbsd*|mirbsd*) + fi + ;; + +-solaris2*|aix4.[2-9]*|aix[5-9]*|osf*|irix[56]*|sysv[45]*|dgux*|interix*) ++solaris2*|aix4.[2-9]*|aix[5-9]*|osf*|irix[56]*|sysv[45]*|dgux*|interix*|*aero*) + # libname.so -> libname.so.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then +-- +2.30.0 diff --git a/patches/webkitgtk/webkitgtk.patch b/patches/webkitgtk/webkitgtk.patch new file mode 100644 index 00000000000..dc84db0ae41 --- /dev/null +++ b/patches/webkitgtk/webkitgtk.patch @@ -0,0 +1,242 @@ +From 9c3401a68d96016e19aafc60897ae450db07ead7 Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Sun, 2 Jan 2022 00:19:17 +0100 +Subject: [PATCH] Initial Aero support + +Signed-off-by: Dennis Bonke +--- + Source/JavaScriptCore/heap/BlockDirectory.cpp | 2 +- + Source/JavaScriptCore/runtime/MachineContext.h | 8 ++++---- + Source/JavaScriptCore/runtime/Options.cpp | 1 + + Source/ThirdParty/ANGLE/src/common/platform.h | 2 +- + Source/WTF/wtf/InlineASM.h | 8 +++++--- + Source/WTF/wtf/PlatformHave.h | 4 ++-- + Source/WTF/wtf/PlatformOS.h | 6 ++++++ + Source/WebCore/platform/sql/SQLiteDatabase.cpp | 6 +++--- + Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp | 2 +- + Source/WebKit/Platform/unix/SharedMemoryUnix.cpp | 4 +++- + 10 files changed, 27 insertions(+), 16 deletions(-) + +diff --git a/Source/JavaScriptCore/heap/BlockDirectory.cpp b/Source/JavaScriptCore/heap/BlockDirectory.cpp +index e2a3540f86..d58513333e 100644 +--- a/Source/JavaScriptCore/heap/BlockDirectory.cpp ++++ b/Source/JavaScriptCore/heap/BlockDirectory.cpp +@@ -60,7 +60,7 @@ void BlockDirectory::setSubspace(Subspace* subspace) + void BlockDirectory::updatePercentageOfPagedOutPages(SimpleStats& stats) + { + // FIXME: We should figure out a solution for Windows. +-#if OS(UNIX) ++#if OS(UNIX) && !OS(AERO) + size_t pageSize = WTF::pageSize(); + ASSERT(!(MarkedBlock::blockSize % pageSize)); + auto numberOfPagesInMarkedBlock = MarkedBlock::blockSize / pageSize; +diff --git a/Source/JavaScriptCore/runtime/MachineContext.h b/Source/JavaScriptCore/runtime/MachineContext.h +index 7857bfc167..c14fbb5b6c 100644 +--- a/Source/JavaScriptCore/runtime/MachineContext.h ++++ b/Source/JavaScriptCore/runtime/MachineContext.h +@@ -346,7 +346,7 @@ static inline void*& framePointerImpl(mcontext_t& machineContext) + #error Unknown Architecture + #endif + +-#elif OS(FUCHSIA) || OS(LINUX) ++#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) + + // The following sequence depends on glibc's sys/ucontext.h. + #if CPU(X86) +@@ -497,7 +497,7 @@ static inline void*& instructionPointerImpl(mcontext_t& machineContext) + #error Unknown Architecture + #endif + +-#elif OS(FUCHSIA) || OS(LINUX) ++#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) + + // The following sequence depends on glibc's sys/ucontext.h. + #if CPU(X86) +@@ -655,7 +655,7 @@ inline void*& argumentPointer<1>(mcontext_t& machineContext) + #error Unknown Architecture + #endif + +-#elif OS(FUCHSIA) || OS(LINUX) ++#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) + + // The following sequence depends on glibc's sys/ucontext.h. + #if CPU(X86) +@@ -772,7 +772,7 @@ inline void*& llintInstructionPointer(mcontext_t& machineContext) + #error Unknown Architecture + #endif + +-#elif OS(FUCHSIA) || OS(LINUX) ++#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) + + // The following sequence depends on glibc's sys/ucontext.h. + #if CPU(X86) +diff --git a/Source/JavaScriptCore/runtime/Options.cpp b/Source/JavaScriptCore/runtime/Options.cpp +index e54387ef28..d159806731 100644 +--- a/Source/JavaScriptCore/runtime/Options.cpp ++++ b/Source/JavaScriptCore/runtime/Options.cpp +@@ -35,6 +35,7 @@ + #include + #include + #include ++#include + #include + #include + #include +diff --git a/Source/ThirdParty/ANGLE/src/common/platform.h b/Source/ThirdParty/ANGLE/src/common/platform.h +index 41f3cf4ff7..77c4a91f29 100644 +--- a/Source/ThirdParty/ANGLE/src/common/platform.h ++++ b/Source/ThirdParty/ANGLE/src/common/platform.h +@@ -28,7 +28,7 @@ + # define ANGLE_PLATFORM_POSIX 1 + #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || \ + defined(__DragonFly__) || defined(__sun) || defined(__GLIBC__) || defined(__GNU__) || \ +- defined(__QNX__) || defined(__Fuchsia__) || defined(__HAIKU__) ++ defined(__QNX__) || defined(__Fuchsia__) || defined(__HAIKU__) || defined(__aero__) + # define ANGLE_PLATFORM_POSIX 1 + #else + # error Unsupported platform. +diff --git a/Source/WTF/wtf/InlineASM.h b/Source/WTF/wtf/InlineASM.h +index 8379a69659..8f7493769f 100644 +--- a/Source/WTF/wtf/InlineASM.h ++++ b/Source/WTF/wtf/InlineASM.h +@@ -43,11 +43,11 @@ + #define THUMB_FUNC_PARAM(name) + #endif + +-#if (OS(LINUX) || OS(FREEBSD)) && CPU(X86_64) ++#if (OS(LINUX) || OS(FREEBSD) || OS(AERO)) && CPU(X86_64) + #define GLOBAL_REFERENCE(name) #name "@plt" + #elif CPU(X86) && COMPILER(MINGW) + #define GLOBAL_REFERENCE(name) "@" #name "@4" +-#elif OS(LINUX) && CPU(X86) && defined(__PIC__) ++#elif (OS(LINUX) || OS(AERO)) && CPU(X86) && defined(__PIC__) + #define GLOBAL_REFERENCE(name) SYMBOL_STRING(name) "@plt" + #else + #define GLOBAL_REFERENCE(name) SYMBOL_STRING(name) +@@ -70,7 +70,8 @@ + || OS(FUCHSIA) \ + || OS(OPENBSD) \ + || OS(HPUX) \ +- || OS(NETBSD) ++ || OS(NETBSD) \ ++ || OS(AERO) + // ELF platform + #define HIDE_SYMBOL(name) ".hidden " #name + #else +@@ -88,6 +89,7 @@ + || OS(OPENBSD) \ + || OS(HURD) \ + || OS(NETBSD) \ ++ || OS(AERO) \ + || COMPILER(MINGW) + // GNU as-compatible syntax. + #define LOCAL_LABEL_STRING(name) ".L" #name +diff --git a/Source/WTF/wtf/PlatformHave.h b/Source/WTF/wtf/PlatformHave.h +index 61f13c2b73..de93124ef8 100644 +--- a/Source/WTF/wtf/PlatformHave.h ++++ b/Source/WTF/wtf/PlatformHave.h +@@ -226,7 +226,7 @@ + #define HAVE_HOSTED_CORE_ANIMATION 1 + #endif + +-#if OS(DARWIN) || OS(FUCHSIA) || ((OS(FREEBSD) || OS(LINUX)) && (CPU(X86) || CPU(X86_64) || CPU(ARM) || CPU(ARM64) || CPU(MIPS))) ++#if OS(DARWIN) || OS(FUCHSIA) || OS(AERO) || ((OS(FREEBSD) || OS(LINUX)) && (CPU(X86) || CPU(X86_64) || CPU(ARM) || CPU(ARM64) || CPU(MIPS))) + #define HAVE_MACHINE_CONTEXT 1 + #endif + +@@ -238,7 +238,7 @@ + #define HAVE_BACKTRACE_SYMBOLS 1 + #endif + +-#if OS(DARWIN) || OS(LINUX) ++#if OS(DARWIN) || OS(LINUX) || OS(AERO) + #define HAVE_DLADDR 1 + #endif + +diff --git a/Source/WTF/wtf/PlatformOS.h b/Source/WTF/wtf/PlatformOS.h +index e61715fb72..ed72f251a9 100644 +--- a/Source/WTF/wtf/PlatformOS.h ++++ b/Source/WTF/wtf/PlatformOS.h +@@ -118,6 +118,11 @@ + #define WTF_OS_WINDOWS 1 + #endif + ++/* OS(AERO) - Aero */ ++#if defined(__aero__) ++#define WTF_OS_AERO 1 ++#endif ++ + + /* OS(UNIX) - Any Unix-like system */ + #if OS(AIX) \ +@@ -128,6 +133,7 @@ + || OS(LINUX) \ + || OS(NETBSD) \ + || OS(OPENBSD) \ ++ || OS(AERO) \ + || defined(unix) \ + || defined(__unix) \ + || defined(__unix__) +diff --git a/Source/WebCore/platform/sql/SQLiteDatabase.cpp b/Source/WebCore/platform/sql/SQLiteDatabase.cpp +index 743ef3dc84..3a61bc1dc3 100644 +--- a/Source/WebCore/platform/sql/SQLiteDatabase.cpp ++++ b/Source/WebCore/platform/sql/SQLiteDatabase.cpp +@@ -148,8 +148,8 @@ bool SQLiteDatabase::open(const String& filename, OpenMode openMode) + LOG_ERROR("SQLite database could not set temp_store to memory"); + } + +- if (openMode != OpenMode::ReadOnly) +- useWALJournalMode(); ++ // if (openMode != OpenMode::ReadOnly) ++ // useWALJournalMode(); + + auto shmFileName = makeString(filename, "-shm"_s); + if (FileSystem::fileExists(shmFileName)) { +@@ -727,7 +727,7 @@ Expected SQLiteDatabase::prepareStatement(ASCIILiteral que + { + auto sqlStatement = constructAndPrepareStatement(*this, query.characters(), query.length()); + if (!sqlStatement) { +- RELEASE_LOG_ERROR(SQLDatabase, "SQLiteDatabase::prepareStatement: Failed to prepare statement %{public}s", query.characters()); ++ RELEASE_LOG_ERROR(SQLDatabase, "SQLiteDatabase::prepareStatement: Failed to prepare statement %s" /*%{public}s"*/, query.characters()); + return makeUnexpected(sqlStatement.error()); + } + return SQLiteStatement { *this, sqlStatement.value() }; +diff --git a/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp b/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp +index efcd663f84..11e5467c10 100644 +--- a/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp ++++ b/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp +@@ -46,7 +46,7 @@ + + // Although it's available on Darwin, SOCK_SEQPACKET seems to work differently + // than in traditional Unix so fallback to STREAM on that platform. +-#if defined(SOCK_SEQPACKET) && !OS(DARWIN) ++#if defined(SOCK_SEQPACKET) && !OS(DARWIN) && !OS(AERO) + #define SOCKET_TYPE SOCK_SEQPACKET + #else + #if USE(GLIB) +diff --git a/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp b/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp +index 998a2a7679..a490b3fb5f 100644 +--- a/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp ++++ b/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp +@@ -47,8 +47,10 @@ + + #if HAVE(LINUX_MEMFD_H) + #include ++#if !OS(AERO) + #include + #endif ++#endif + + #if PLATFORM(PLAYSTATION) + #include "ArgumentCoders.h" +@@ -132,7 +134,7 @@ static int createSharedMemory() + static bool isMemFdAvailable = true; + if (isMemFdAvailable) { + do { +- fileDescriptor = syscall(__NR_memfd_create, "WebKitSharedMemory", MFD_CLOEXEC); ++ fileDescriptor = memfd_create("WebKitSharedMemory", MFD_CLOEXEC); + } while (fileDescriptor == -1 && errno == EINTR); + + if (fileDescriptor != -1) +-- +2.40.0 \ No newline at end of file From ebc1aaf29d12bb3c5ae29e04bde984ae8ff0c893 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 21 Apr 2023 18:40:28 +1000 Subject: [PATCH 199/368] kernel: BlockQueue -> WaitQueue Thats what linux kernel calls it :) Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/e1000.rs | 6 +++--- src/aero_kernel/src/drivers/keyboard.rs | 6 +++--- src/aero_kernel/src/drivers/mouse.rs | 6 +++--- src/aero_kernel/src/drivers/pty.rs | 6 +++--- src/aero_kernel/src/drivers/tty.rs | 6 +++--- src/aero_kernel/src/fs/eventfd.rs | 9 +++++---- src/aero_kernel/src/fs/inode.rs | 6 +++--- src/aero_kernel/src/fs/pipe.rs | 10 +++++----- src/aero_kernel/src/socket/tcp.rs | 6 +++--- src/aero_kernel/src/socket/udp.rs | 6 +++--- src/aero_kernel/src/socket/unix.rs | 6 +++--- src/aero_kernel/src/syscall/futex.rs | 10 +++++----- src/aero_kernel/src/syscall/ipc.rs | 6 +++--- .../src/userland/scheduler/round_robin.rs | 6 +++--- src/aero_kernel/src/userland/task/mod.rs | 6 +++--- src/aero_kernel/src/userland/terminal.rs | 8 ++++---- src/aero_kernel/src/utils/sync.rs | 12 ++++++------ 17 files changed, 61 insertions(+), 60 deletions(-) diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index d828655cb4f..2c3dfadc2fe 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -25,7 +25,7 @@ use crate::arch::interrupts::{self, InterruptStack}; use crate::drivers::pci::*; use crate::mem::paging::*; use crate::userland::scheduler; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; use crate::net::{self, ethernet, NetworkDevice}; use crate::net::{MacAddr, NetworkDriver, PacketBaseTrait}; @@ -582,14 +582,14 @@ impl E1000 { struct Device { e1000: Mutex, - wq: BlockQueue, + wq: WaitQueue, } impl Device { fn new(e1000: E1000) -> Self { Self { e1000: Mutex::new(e1000), - wq: BlockQueue::new(), + wq: WaitQueue::new(), } } diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index 0d9124d012f..b319525f376 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -27,7 +27,7 @@ use crate::fs; use crate::arch::{apic, io}; use crate::fs::devfs::{self, Device}; use crate::fs::inode::{INodeInterface, PollFlags}; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; pub trait KeyboardListener: Send + Sync { fn on_key(&self, key: KeyCode, released: bool); @@ -189,7 +189,7 @@ struct KeyboardDevice { marker: usize, buffer: Mutex>, sref: Weak, - wq: BlockQueue, + wq: WaitQueue, } impl KeyboardDevice { @@ -198,7 +198,7 @@ impl KeyboardDevice { marker: devfs::alloc_device_marker(), buffer: Mutex::new(Vec::new()), sref: this.clone(), - wq: BlockQueue::new(), + wq: WaitQueue::new(), }) } } diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs index 6f4af8c3109..d581564a8fa 100644 --- a/src/aero_kernel/src/drivers/mouse.rs +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -25,7 +25,7 @@ use crate::arch::{apic, interrupts, io}; use crate::fs::devfs::Device; use crate::fs::inode::{INodeInterface, PollFlags, PollTable}; use crate::fs::{self, devfs}; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; bitflags::bitflags! { /// Represents the flags currently set for the mouse. @@ -62,7 +62,7 @@ struct Packet { struct Mouse { packet: Mutex<(Packet, usize)>, - wq: BlockQueue, + wq: WaitQueue, marker: usize, } @@ -70,7 +70,7 @@ impl Mouse { fn new() -> Mouse { Self { packet: Mutex::new((Packet::default(), 0)), - wq: BlockQueue::new(), + wq: WaitQueue::new(), marker: devfs::alloc_device_marker(), } } diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 3a6c461491e..e22b6521d85 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -48,8 +48,8 @@ use crate::userland::scheduler::ExitStatus; use crate::userland::task::Task; use crate::userland::terminal::LineDiscipline; use crate::userland::terminal::TerminalDevice; -use crate::utils::sync::BlockQueue; use crate::utils::sync::Mutex; +use crate::utils::sync::WaitQueue; lazy_static::lazy_static! { static ref PTMX: Arc = Arc::new(Ptmx::new()); @@ -60,7 +60,7 @@ static PTY_ID: AtomicU32 = AtomicU32::new(0); struct Master { id: u32, - wq: BlockQueue, + wq: WaitQueue, window_size: Mutex, buffer: Mutex>, termios: Mutex, @@ -105,7 +105,7 @@ impl Master { Self { id: PTY_ID.fetch_add(1, Ordering::SeqCst), - wq: BlockQueue::new(), + wq: WaitQueue::new(), window_size: Mutex::new(WinSize::default()), buffer: Mutex::new(Vec::new()), termios: Mutex::new(termios), diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index ab9bcc0fee6..1c54484c7f8 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -32,7 +32,7 @@ use crate::mem::paging::VirtAddr; use crate::userland::scheduler; use crate::userland::task::Task; use crate::userland::terminal::TerminalDevice; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; #[cfg(target_arch = "x86_64")] use super::keyboard::KeyCode; @@ -203,7 +203,7 @@ struct Tty { sref: Weak, stdin: Mutex, - block_queue: BlockQueue, + block_queue: WaitQueue, connected: AtomicUsize, } @@ -223,7 +223,7 @@ impl Tty { parser: vte::Parser::new(), }), - block_queue: BlockQueue::new(), + block_queue: WaitQueue::new(), stdin: Mutex::new(StdinBuffer::new()), connected: AtomicUsize::new(0), sref: sref.clone(), diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index 507c955aaf3..e6edeafa0c4 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -20,17 +20,17 @@ use alloc::sync::Arc; use super::inode::{INodeInterface, PollFlags, PollTable}; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; pub struct EventFd { - wq: BlockQueue, + wq: WaitQueue, count: Mutex, } impl EventFd { pub fn new() -> Arc { Arc::new(Self { - wq: BlockQueue::new(), + wq: WaitQueue::new(), count: Mutex::new(0), }) } @@ -81,7 +81,8 @@ impl INodeInterface for EventFd { } if *count < (u64::MAX - 1) { - events.insert(PollFlags::OUT); // possible to write a value of at least "1" without blocking. + events.insert(PollFlags::OUT); // possible to write a value of at least "1" without + // blocking. } Ok(events) diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index f9f28367052..fd8c0a037a5 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -34,7 +34,7 @@ use crate::mem::paging::{PhysFrame, VirtAddr}; use crate::socket::unix::UnixSocket; use crate::socket::SocketAddr; use crate::userland::scheduler; -use crate::utils::sync::BlockQueue; +use crate::utils::sync::WaitQueue; use crate::utils::sync::{BMutex, Mutex}; use super::cache; @@ -49,11 +49,11 @@ static DIR_CACHE_MARKER: AtomicUsize = AtomicUsize::new(0x00); #[derive(Default)] pub struct PollTable { - pub queues: Vec>, + pub queues: Vec>, } impl PollTable { - pub fn insert(&mut self, queue: &BlockQueue) { + pub fn insert(&mut self, queue: &WaitQueue) { queue.insert(scheduler::get_scheduler().current_task()); unsafe { self.queues.push(UnsafeRef::from_raw(queue as *const _)) } } diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index 5ceef001ce9..3122f24f92c 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -5,7 +5,7 @@ use alloc::sync::Arc; use spin::Once; use crate::utils::buffer::Buffer; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; use super::cache::DirCacheItem; use super::file_table::FileHandle; @@ -15,8 +15,8 @@ use super::FileSystemError; pub struct Pipe { queue: Mutex, - readers: BlockQueue, - writers: BlockQueue, + readers: WaitQueue, + writers: WaitQueue, /// The number of writers currently connected to the pipe. num_writers: AtomicUsize, @@ -29,8 +29,8 @@ impl Pipe { Arc::new(Self { queue: Mutex::new(Buffer::new()), - readers: BlockQueue::new(), - writers: BlockQueue::new(), + readers: WaitQueue::new(), + writers: WaitQueue::new(), num_writers: AtomicUsize::new(0), diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 5b87a0c55d9..ba52b765b4c 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -26,7 +26,7 @@ use crate::fs::{self, FileSystemError}; use crate::net::ip::Ipv4Addr; use crate::net::tcp::{self, Tcp, TcpFlags, TcpHandler}; use crate::net::{Packet, PacketHeader, PacketTrait}; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; /// TCP Stream struct Stream { @@ -147,7 +147,7 @@ pub struct TcpSocket { sref: Weak, data: Mutex, handle: Once>, - wq: BlockQueue, + wq: WaitQueue, } impl TcpSocket { @@ -158,7 +158,7 @@ impl TcpSocket { handle: Once::new(), sref: sref.clone(), data: Mutex::new(TcpData::default()), - wq: BlockQueue::new(), + wq: WaitQueue::new(), }) } diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index b8cbe570e9d..f54e1fa31a1 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -32,7 +32,7 @@ use crate::mem::paging::VirtAddr; use crate::net::ip::Ipv4Addr; use crate::net::udp::{self, Udp, UdpHandler}; use crate::net::{self, MacAddr, Packet, PacketHeader, PacketTrait}; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; use super::SocketAddr; @@ -54,7 +54,7 @@ struct UdpSocketInner { pub struct UdpSocket { inner: Mutex, - wq: BlockQueue, + wq: WaitQueue, handle: Once>, sref: Weak, @@ -63,7 +63,7 @@ pub struct UdpSocket { impl UdpSocket { pub fn new() -> Arc { Arc::new_cyclic(|sref| Self { - wq: BlockQueue::new(), + wq: WaitQueue::new(), handle: Once::new(), inner: Mutex::new(Default::default()), diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index b8d340aa2d3..e181672b866 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -34,7 +34,7 @@ use crate::fs::inode::*; use crate::fs::{FileSystemError, Path}; use crate::mem::paging::VirtAddr; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; use super::SocketAddr; @@ -192,7 +192,7 @@ struct UnixSocketInner { pub struct UnixSocket { inner: Mutex, buffer: Mutex, - wq: BlockQueue, + wq: WaitQueue, weak: Weak, handle: Once>, } @@ -203,7 +203,7 @@ impl UnixSocket { inner: Mutex::new(UnixSocketInner::default()), buffer: Mutex::new(MessageQueue::default()), - wq: BlockQueue::new(), + wq: WaitQueue::new(), weak: weak.clone(), handle: Once::new(), }) diff --git a/src/aero_kernel/src/syscall/futex.rs b/src/aero_kernel/src/syscall/futex.rs index a54cdf1c4e0..c6054900fb1 100644 --- a/src/aero_kernel/src/syscall/futex.rs +++ b/src/aero_kernel/src/syscall/futex.rs @@ -26,10 +26,10 @@ use spin::Once; use crate::mem::paging::{PhysAddr, Translate, VirtAddr}; use crate::mem::AddressSpace; use crate::userland::scheduler; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; pub struct FutexContainer { - futexes: Mutex>>, + futexes: Mutex>>, } impl FutexContainer { @@ -60,20 +60,20 @@ impl FutexContainer { } /// Returns the futex at the given key; allocating it if it doesn't exist. - fn get_alloc(&self, key: PhysAddr) -> Arc { + fn get_alloc(&self, key: PhysAddr) -> Arc { let mut container = self.futexes.lock(); if let Some(futex) = container.get(&key) { futex.clone() } else { - let futex = Arc::new(BlockQueue::new()); + let futex = Arc::new(WaitQueue::new()); container.insert(key, futex.clone()); futex } } /// Returns the futex at the given key, or None if it doesn't exist. - fn get(&self, key: PhysAddr) -> Option> { + fn get(&self, key: PhysAddr) -> Option> { self.futexes.lock_irq().get(&key).map(|e| e.clone()) } diff --git a/src/aero_kernel/src/syscall/ipc.rs b/src/aero_kernel/src/syscall/ipc.rs index 66e27c0833b..efd2e0c71e8 100644 --- a/src/aero_kernel/src/syscall/ipc.rs +++ b/src/aero_kernel/src/syscall/ipc.rs @@ -20,7 +20,7 @@ use crate::userland::scheduler::get_scheduler; use crate::userland::task::TaskId; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; use aero_syscall::SyscallError; use alloc::{collections::VecDeque, vec::Vec}; @@ -37,14 +37,14 @@ struct Message { pub struct MessageQueue { queue: Mutex>, - blockqueue: BlockQueue, + blockqueue: WaitQueue, } impl MessageQueue { pub fn new() -> MessageQueue { MessageQueue { queue: Mutex::new(VecDeque::new()), - blockqueue: BlockQueue::new(), + blockqueue: WaitQueue::new(), } } } diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 2f7022eadf5..a8a88b5a050 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -25,7 +25,7 @@ use crate::arch; use crate::userland::signals::{SignalError, SignalResult}; use crate::userland::task::{SchedTaskAdapter, Task, TaskState}; -use crate::utils::sync::{BlockQueue, IrqGuard}; +use crate::utils::sync::{IrqGuard, WaitQueue}; use crate::utils::PerCpu; use super::{ExitStatus, SchedulerInterface}; @@ -45,7 +45,7 @@ struct TaskQueue { awaiting: LinkedList, deadline_awaiting: LinkedList, - dead_wq: BlockQueue, + dead_wq: WaitQueue, } impl TaskQueue { @@ -61,7 +61,7 @@ impl TaskQueue { awaiting: LinkedList::new(SchedTaskAdapter::new()), deadline_awaiting: LinkedList::new(SchedTaskAdapter::new()), - dead_wq: BlockQueue::new(), + dead_wq: WaitQueue::new(), } } diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 17fa9c45f03..e97d3d44707 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -34,7 +34,7 @@ use crate::mem::paging::*; use crate::arch::task::ArchTask; use crate::fs::file_table::FileTable; use crate::syscall::{ExecArgs, MessageQueue}; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; use crate::userland::signals::Signals; @@ -110,14 +110,14 @@ impl Cwd { struct Zombies { list: Mutex>, - block: BlockQueue, + block: WaitQueue, } impl Zombies { fn new() -> Self { Self { list: Mutex::new(Default::default()), - block: BlockQueue::new(), + block: WaitQueue::new(), } } diff --git a/src/aero_kernel/src/userland/terminal.rs b/src/aero_kernel/src/userland/terminal.rs index 3c4db887007..a644f826161 100644 --- a/src/aero_kernel/src/userland/terminal.rs +++ b/src/aero_kernel/src/userland/terminal.rs @@ -22,7 +22,7 @@ use alloc::vec::Vec; use spin::RwLock; -use crate::utils::sync::{BlockQueue, Mutex}; +use crate::utils::sync::{Mutex, WaitQueue}; use super::signals::SignalError; use super::task::sessions::{Group, SESSIONS}; @@ -46,7 +46,7 @@ pub trait TerminalDevice: Send + Sync { /// (`Ctrl+C`), the erase character (Backspace or Delete), and the kill character (`Ctrl+U`) on /// input. pub struct LineDiscipline { - wq: BlockQueue, + wq: WaitQueue, buffer: Mutex>, foreground: RwLock>, } @@ -55,7 +55,7 @@ impl LineDiscipline { /// Creates a new line discipline. pub fn new() -> Self { Self { - wq: BlockQueue::new(), + wq: WaitQueue::new(), buffer: Mutex::new(Vec::new()), foreground: RwLock::new(Weak::default()), } @@ -106,7 +106,7 @@ impl LineDiscipline { } /// Returns the line discipline's wait queue. - pub fn wait_queue(&self) -> &BlockQueue { + pub fn wait_queue(&self) -> &WaitQueue { &self.wq } } diff --git a/src/aero_kernel/src/utils/sync.rs b/src/aero_kernel/src/utils/sync.rs index cbdbc2bfd11..0759fef5427 100644 --- a/src/aero_kernel/src/utils/sync.rs +++ b/src/aero_kernel/src/utils/sync.rs @@ -7,11 +7,11 @@ use crate::userland::signals::SignalResult; use crate::userland::task::Task; /// Used to manage and block threads that are waiting for a condition to be true. -pub struct BlockQueue { +pub struct WaitQueue { queue: Mutex>>, } -impl BlockQueue { +impl WaitQueue { /// Creates a new block queue. pub const fn new() -> Self { Self { @@ -119,14 +119,14 @@ impl Drop for IrqGuard { /// A blocking-based lock providing mutually exclusive access to the data. pub struct BMutex { - wq: BlockQueue, + wq: WaitQueue, spin: Mutex, } impl BMutex { pub const fn new(value: T) -> Self { Self { - wq: BlockQueue::new(), + wq: WaitQueue::new(), spin: Mutex::new(value), } } @@ -206,8 +206,8 @@ impl Mutex { /// /// The returned value may be dereferenced for data access and the lock will be dropped and /// interrupts will be re-enabled when the guard falls out of scope. Deadlocks occur if a thread - /// tries to acquire a lock that will never become free. Thus, locking interrupts is useful for volatile - /// operations where we might be interrupted. + /// tries to acquire a lock that will never become free. Thus, locking interrupts is useful for + /// volatile operations where we might be interrupted. pub fn lock_irq(&self) -> MutexGuard { let irq_lock = interrupts::is_enabled(); From c30c3541eed09e815e6236b224f2d00b7436e964 Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 22 Apr 2023 16:43:57 +1000 Subject: [PATCH 200/368] sync::BMutex: on drop only notify one process Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/drivers/e1000.rs | 2 +- src/aero_kernel/src/drivers/keyboard.rs | 2 +- src/aero_kernel/src/drivers/mouse.rs | 2 +- src/aero_kernel/src/drivers/pty.rs | 2 +- src/aero_kernel/src/drivers/tty.rs | 4 ++-- src/aero_kernel/src/fs/eventfd.rs | 4 ++-- src/aero_kernel/src/fs/pipe.rs | 6 +++--- src/aero_kernel/src/socket/udp.rs | 2 +- src/aero_kernel/src/socket/unix.rs | 6 +++--- src/aero_kernel/src/syscall/futex.rs | 2 +- src/aero_kernel/src/syscall/ipc.rs | 2 +- .../src/userland/scheduler/round_robin.rs | 2 +- src/aero_kernel/src/userland/task/mod.rs | 2 +- src/aero_kernel/src/userland/terminal.rs | 2 +- src/aero_kernel/src/utils/sync.rs | 17 +++++++++++++---- 15 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index 2c3dfadc2fe..b45ebd0daaf 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -373,7 +373,7 @@ impl E1000 { if descriptor.status & 0x1 == 0x1 { // we got some packies right here mate. lets notify the boyz - DEVICE.get().unwrap().wq.notify_complete(); + DEVICE.get().unwrap().wq.notify_all(); } } diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index b319525f376..ec4ccc0d840 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -225,7 +225,7 @@ impl KeyboardListener for KeyboardDevice { self.buffer.lock_irq().push(keycode as u8); } - self.wq.notify_complete() + self.wq.notify_all() } } diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs index d581564a8fa..06ab42f1191 100644 --- a/src/aero_kernel/src/drivers/mouse.rs +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -113,7 +113,7 @@ impl Mouse { } PACKETS.lock_irq().push(this.clone()); - self.wq.notify_complete(); + self.wq.notify_all(); } } diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index e22b6521d85..e7c258838ae 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -302,7 +302,7 @@ impl INodeInterface for Slave { pty_buffer.extend_from_slice(buffer); } - self.master.wq.notify_complete(); + self.master.wq.notify_all(); Ok(buffer.len()) } } diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 1c54484c7f8..1a40c89a947 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -479,7 +479,7 @@ impl KeyboardListener for Tty { } self.stdin.lock_irq().cursor = 0; - self.block_queue.notify_complete(); + self.block_queue.notify_all(); return; } @@ -495,7 +495,7 @@ impl KeyboardListener for Tty { rendy::print!("\n"); } - self.block_queue.notify_complete(); + self.block_queue.notify_all(); } KeyCode::KEY_BACKSPACE if !released => backspace(), diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index e6edeafa0c4..7788231ce45 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -49,7 +49,7 @@ impl INodeInterface for EventFd { *value = *count; *count = 0; // reset the counter - self.wq.notify_complete(); + self.wq.notify_all(); Ok(size) } @@ -62,7 +62,7 @@ impl INodeInterface for EventFd { let value = unsafe { *(buffer.as_ptr() as *const u64) }; *self.count.lock_irq() += value; - self.wq.notify_complete(); + self.wq.notify_all(); Ok(size) } diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index 3122f24f92c..0f663befb95 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -66,7 +66,7 @@ impl INodeInterface for Pipe { // There are no active writers and no data to read (reached EOF). if active_writers == 0 { - self.readers.notify_complete(); + self.readers.notify_all(); } } } @@ -92,7 +92,7 @@ impl INodeInterface for Pipe { if read > 0 { // TODO: Notify only the first process - self.writers.notify_complete(); + self.writers.notify_all(); } Ok(read) @@ -100,7 +100,7 @@ impl INodeInterface for Pipe { fn write_at(&self, _offset: usize, buf: &[u8]) -> super::Result { let res = self.queue.lock_irq().write_data(buf); - self.readers.notify_complete(); + self.readers.notify_all(); Ok(res) } diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index f54e1fa31a1..d87ef14f289 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -296,6 +296,6 @@ impl INodeInterface for UdpSocket { impl UdpHandler for UdpSocket { fn recv(&self, packet: Packet) { self.inner.lock_irq().incoming.push(packet); - self.wq.notify_complete(); + self.wq.notify_all(); } } diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index e181672b866..3773068c2e5 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -277,7 +277,7 @@ impl INodeInterface for UnixSocket { }; peer.buffer.lock_irq().write(buffer); - peer.wq.notify_complete(); + peer.wq.notify_all(); Ok(buffer.len()) } @@ -338,7 +338,7 @@ impl INodeInterface for UnixSocket { }; queue.push(self.sref()).unwrap(); - target.wq.notify_complete(); + target.wq.notify_all(); core::mem::drop(itarget); // release the lock let _ = self.wq.block_on(&self.inner, |e| e.state.is_connected())?; @@ -381,7 +381,7 @@ impl INodeInterface for UnixSocket { *length = core::mem::size_of::() as u32; } - peer.wq.notify_complete(); + peer.wq.notify_all(); Ok(sock) } diff --git a/src/aero_kernel/src/syscall/futex.rs b/src/aero_kernel/src/syscall/futex.rs index c6054900fb1..053f04d4c11 100644 --- a/src/aero_kernel/src/syscall/futex.rs +++ b/src/aero_kernel/src/syscall/futex.rs @@ -117,7 +117,7 @@ impl FutexContainer { let key = Self::addr_as_futex_key(uaddr).ok_or(SyscallError::EINVAL)?; let futex = self.get(key).ok_or(SyscallError::EINVAL)?; - futex.notify_complete(); + futex.notify_all(); // todo: early reschedule if the futex is not empty. Ok(()) diff --git a/src/aero_kernel/src/syscall/ipc.rs b/src/aero_kernel/src/syscall/ipc.rs index efd2e0c71e8..6e678294a01 100644 --- a/src/aero_kernel/src/syscall/ipc.rs +++ b/src/aero_kernel/src/syscall/ipc.rs @@ -77,7 +77,7 @@ pub fn send(pid: usize, payload: &[u8]) -> Result { }); // Notify the task that it has a new message if its awaiting for one! - message_queue.blockqueue.notify_complete(); + message_queue.blockqueue.notify_all(); Ok(0) } diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index a8a88b5a050..7be4566b104 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -304,7 +304,7 @@ impl SchedulerInterface for RoundRobin { current_task.exit_status.call_once(|| status); queue.push_dead(current_task.clone()); - queue.dead_wq.notify_complete(); + queue.dead_wq.notify_all(); core::mem::drop(guard); self.preempt(); diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index e97d3d44707..88f4977bb33 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -130,7 +130,7 @@ impl Zombies { log::debug!("making process a zombie: (pid={:?})", zombie.pid()); list.push_back(zombie); - self.block.notify_complete(); + self.block.notify_all(); } fn waitpid( diff --git a/src/aero_kernel/src/userland/terminal.rs b/src/aero_kernel/src/userland/terminal.rs index a644f826161..33924062a56 100644 --- a/src/aero_kernel/src/userland/terminal.rs +++ b/src/aero_kernel/src/userland/terminal.rs @@ -89,7 +89,7 @@ impl LineDiscipline { } drop(buffer); - self.wq.notify_complete(); + self.wq.notify_all(); } pub fn foreground(&self) -> Option> { diff --git a/src/aero_kernel/src/utils/sync.rs b/src/aero_kernel/src/utils/sync.rs index 0759fef5427..332c50dfb19 100644 --- a/src/aero_kernel/src/utils/sync.rs +++ b/src/aero_kernel/src/utils/sync.rs @@ -71,9 +71,8 @@ impl WaitQueue { .map(|i| tasks.remove(i)); } - /// Notify's all of the tasks in the blocker's queue that the future has been - /// completed. - pub fn notify_complete(&self) { + /// Wakes up all of the process in the wait queue. + pub fn notify_all(&self) { let scheduler = scheduler::get_scheduler(); let this = self.queue.lock_irq(); @@ -82,6 +81,16 @@ impl WaitQueue { } } + /// Wakes up only the first process in the wait queue. + pub fn notify(&self) { + let scheduler = scheduler::get_scheduler(); + let this: MutexGuard>> = self.queue.lock_irq(); + + if let Some(task) = this.first() { + scheduler.inner.wake_up(task.clone()); + } + } + pub fn is_empty(&self) -> bool { self.queue.lock_irq().is_empty() } @@ -173,7 +182,7 @@ impl<'a, T: ?Sized> core::ops::DerefMut for BMutexGuard<'a, T> { impl<'a, T: ?Sized> Drop for BMutexGuard<'a, T> { fn drop(&mut self) { - self.mutex.wq.notify_complete(); + self.mutex.wq.notify(); } } From 165c84acc560730bd10b30b0d63b75632102a92a Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Fri, 28 Apr 2023 18:14:14 +1000 Subject: [PATCH 201/368] drivers::lai: make use of `index` in `scan` * Adds the `index` param to the `lookup_entry` function to get the n-th table with the provided signature. * Remove `assert(index == 0)` in `Host::scan` and pass on the provided index to `lookup_entry`. Signed-off-by: Andy-Python-Programmer --- src/aero_kernel/src/acpi/mod.rs | 12 ++++++------ src/aero_kernel/src/acpi/rsdp.rs | 18 ++++++++++++++---- src/aero_kernel/src/drivers/lai.rs | 16 ++++++++-------- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/aero_kernel/src/acpi/mod.rs b/src/aero_kernel/src/acpi/mod.rs index 198b3ea5152..5a03ff691f3 100644 --- a/src/aero_kernel/src/acpi/mod.rs +++ b/src/aero_kernel/src/acpi/mod.rs @@ -72,10 +72,10 @@ impl AcpiTable { } /// Lookup ACPI table entry with the provided signature. - pub fn lookup_entry(&self, signature: &str) -> Option<&'static Sdt> { + pub fn lookup_entry(&self, signature: &str, index: usize) -> Option<&'static Sdt> { match self.header { - AcpiHeader::Rsdt(rsdt) => rsdt.lookup_entry(signature), - AcpiHeader::Xsdt(xsdt) => xsdt.lookup_entry(signature), + AcpiHeader::Rsdt(rsdt) => rsdt.lookup_entry(signature, index), + AcpiHeader::Xsdt(xsdt) => xsdt.lookup_entry(signature, index), } } @@ -112,19 +112,19 @@ pub fn init(rsdp_address: VirtAddr) { let acpi_table = get_acpi_table(); macro init_table($sig:path => $ty:ty) { - if let Some(table) = acpi_table.lookup_entry($sig) { + if let Some(table) = acpi_table.lookup_entry($sig, 0) { <$ty>::new(table); } } - if let Some(header) = acpi_table.lookup_entry(mcfg::SIGNATURE) { + if let Some(header) = acpi_table.lookup_entry(mcfg::SIGNATURE, 0) { unsafe { let mcfg: &'static Mcfg = header.as_ref(); mcfg.init(); } } - if let Some(header) = acpi_table.lookup_entry(madt::SIGNATURE) { + if let Some(header) = acpi_table.lookup_entry(madt::SIGNATURE, 0) { unsafe { // Not a valid MADT table without the local apic address and the flags. if header.data_len() < 8 { diff --git a/src/aero_kernel/src/acpi/rsdp.rs b/src/aero_kernel/src/acpi/rsdp.rs index b5b8d2fadbc..231845eb220 100644 --- a/src/aero_kernel/src/acpi/rsdp.rs +++ b/src/aero_kernel/src/acpi/rsdp.rs @@ -120,7 +120,8 @@ impl Rsdt { (self.header.length as usize - core::mem::size_of::()) / core::mem::size_of::() } - pub fn lookup_entry(&self, signature: &str) -> Option<&'static Sdt> { + pub fn lookup_entry(&self, signature: &str, index: usize) -> Option<&'static Sdt> { + let mut current = 0; let header_data_address = self.header.data_address() as *const u32; for i in 0..self.entries_count() { @@ -131,7 +132,11 @@ impl Rsdt { let item = unsafe { Sdt::from_address(item_addr_virt) }; if item.signature == signature.as_bytes() { - return Some(item); + if current == index { + return Some(item); + } + + current += 1; } } @@ -156,7 +161,8 @@ impl Rsdt { (self.header.length as usize - core::mem::size_of::()) / core::mem::size_of::() } - pub fn lookup_entry(&self, signature: &str) -> Option<&'static Sdt> { + pub fn lookup_entry(&self, signature: &str, index: usize) -> Option<&'static Sdt> { + let mut current = 0; let header_data_address = self.header.data_address() as *const u64; for i in 0..self.entries_count() { @@ -168,7 +174,11 @@ impl Rsdt { let item = unsafe { Sdt::from_address(item_addr_virt) }; if item.signature == signature.as_bytes() { - return Some(item); + if current == index { + return Some(item); + } + + current += 1; } } diff --git a/src/aero_kernel/src/drivers/lai.rs b/src/aero_kernel/src/drivers/lai.rs index 4a9e98a897f..ad7b0839b52 100644 --- a/src/aero_kernel/src/drivers/lai.rs +++ b/src/aero_kernel/src/drivers/lai.rs @@ -34,20 +34,20 @@ struct LaiHost; impl lai::Host for LaiHost { fn scan(&self, signature: &str, index: usize) -> *const u8 { - assert!(index == 0); - if signature == "DSDT" { // The DSDT table is put inside the FADT table, instead of listing it in // another ACPI table. So, we need to extract the DSDT table from the FADT // table. - get_acpi_table().lookup_entry(fadt::SIGNATURE).map(|fadt| { - let fadt: &'static fadt::Fadt = unsafe { fadt.as_ref() }; - let addr = PhysAddr::new(fadt.dsdt as u64).as_hhdm_virt(); - addr.as_ptr::() - }) + get_acpi_table() + .lookup_entry(fadt::SIGNATURE, 0) + .map(|fadt| { + let fadt: &'static fadt::Fadt = unsafe { fadt.as_ref() }; + let addr = PhysAddr::new(fadt.dsdt as u64).as_hhdm_virt(); + addr.as_ptr::() + }) } else { get_acpi_table() - .lookup_entry(signature) + .lookup_entry(signature, index) .map(|table| table as *const _ as *const u8) } .unwrap_or(core::ptr::null()) From c50c18bd27c23bac8e54ac06ee8bd95cde91380c Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sat, 6 May 2023 18:17:20 +1000 Subject: [PATCH 202/368] kernel::rendy: make use of `vte` ANSI * The main goal is to remove our ANSI performer from TTY and switch to making use of `vte` ANSI performer which *should* be in the next stable `vte` release and also have it on rendy instead of TTY. * Write boot logs to screen :) * I know I am Auzzie but the crate spells colour as color so I do the same. * New wallpaper :^) Signed-off-by: Andy-Python-Programmer --- bootstrap.yml | 20 +- src/.cargo/WALLPAPER-CREDIT | 8 + src/.cargo/term_background.bmp | Bin 915978 -> 6220938 bytes src/Cargo.lock | 11 +- src/aero_kernel/Cargo.toml | 5 +- src/aero_kernel/src/arch/x86_64/mod.rs | 2 +- src/aero_kernel/src/logger.rs | 24 +- src/aero_kernel/src/rendy.rs | 300 ++++++++++++++++++------- 8 files changed, 261 insertions(+), 109 deletions(-) create mode 100644 src/.cargo/WALLPAPER-CREDIT diff --git a/bootstrap.yml b/bootstrap.yml index f065b2473e3..7d1e86f97b1 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -664,7 +664,6 @@ packages: tag: 'v0.10.1' version: '0.10.1' tools_required: - # - host-cargo - host-rust - host-gcc sources_required: @@ -676,7 +675,6 @@ packages: - libx11 configure: - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] - # - args: ['cargo', 'update', '--manifest-path', '@THIS_SOURCE_DIR@/Cargo.toml'] build: - args: ['install', '-D', '@THIS_SOURCE_DIR@/alacritty.yml', '@THIS_COLLECT_DIR@/root/.alacritty.yml'] - args: @@ -768,29 +766,29 @@ packages: # source: # subdir: 'bundled' # git: 'https://github.com/sharkdp/bat' - # branch: master - # commit: '7334ab45422882686212ed31df2d95c02e7585f1' + # tag: 'v0.23.0' + # version: '0.23.0' # tools_required: - # - host-cargo + # - host-rust + # - host-gcc # sources_required: # - rust-patched-libs # pkgs_required: # - mlibc # configure: - # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] # build: - # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', './Cargo.toml'] # - args: # - 'cargo' # - 'install' # - '--locked' - # - '--path' - # - '.' # - '--root' # - '@THIS_COLLECT_DIR@/usr' # - '-j@PARALLELISM@' - # - '--no-default-features' - # - '--features=regex-fancy,wild,clap,atty,dirs-next,paging' + # - '--target-dir' + # - '@THIS_BUILD_DIR@' + # - '--path' + # - '@THIS_SOURCE_DIR@' - name: quickjs source: diff --git a/src/.cargo/WALLPAPER-CREDIT b/src/.cargo/WALLPAPER-CREDIT new file mode 100644 index 00000000000..c02f705b2ea --- /dev/null +++ b/src/.cargo/WALLPAPER-CREDIT @@ -0,0 +1,8 @@ +URL: https://hdqwalls.com/mountains-moon-lake-birds-4k-wallpaper +Author: undefined + +======================================================================= +If you are the creator of the wallpaper and want it taken down, please +create an issue or send me an email at andypython@protonmail.com, and +I will promptly remove it. +======================================================================= diff --git a/src/.cargo/term_background.bmp b/src/.cargo/term_background.bmp index e457200a2b92c2ed460e9044a3c8815c553c3771..a4877f9f2fcd942480785c324d5374dafd23fa60 100644 GIT binary patch literal 6220938 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

EnaBSz9tV%820YDbJ*6Cir5s+IYcc1fHO`( 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

U0on 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�{p6KnRz${sQ)BqD1) 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

KRH&ne0H*g5}N|$vw_k(w$Cco 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

6xx6y!wcV?F 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%0D72FqgPxzWHGBT1l3dojqhQwNe=cQgD6 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�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�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%0A68a@#hpuV3;%H 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�im)IWc@@SB&jzu%vQ#>4s~ipE5GZ_$;j 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 jD=y9W(G3Njg+cXnhcwgQrc@4&JG!1GnHXWv? z(qK5}gpn{M$KZX;)c5Hj?p|7^3mV~$V$~@$c})*7Pju4LABE#-9!x!t=gWX-e~Ia7 z<+-*Yac^^UH0uw$J^Pw|VoHvFU!L^8I$6Tp>C2O8K-pOrwwYD1n|=z~40(1HG)vUZ zkYrELX5`9d;|yLd!IL4?o~RIV=?eTAvkT#65C7-YK+w2A2X-9d&my$$2)$MQ^;Y1# zA%%0~zhMr~Z}pPcFM~-z!MGf|I9b))1seb7wH$OBJ`6%9gA(}7wJ9t$=ne@qOKdTI zyHO$iZnNqj`k$XvKi)z7TxA%juUP`34S*A#FM%dj{u_vp38;syG0qdsUJ8sjoU(#y z9m6_k6;+mThglXIg4TFU3vDhO_;qAC8=M>|wDpsRP(G9N!f&6W`3FxLnXTE;?Zy}; z5<88_{h867nc=lEKRHL<@4bG|#QHn&7T2AKflK3WL7RI?Jc@CjFmNhfO0%e-(J3J( zes693dVzS0*=H*RNXp>XA#QB)W(}!Nm?Y4;1lSy4lo4&l#)J<)`K)+hln~*Vo?#Lq zq;KH}1){^ii>@eU)#0!*R!3T8v0S-E8-Es&W=AVA3l72O4A+I0`K@I9S-#L57cw@i zu%FaWgQsxe;Ftb(odAEsM9k4RA=~(AFhZl;*lzHzJ8&41%&#`i!?P|{%qc9j4_d>U z^)Xb?P;^w#4D}g;6XVZ;1lsm;3jMrOdIn(zV$)7n!3P;ItK3vV&`kG`f%&7AT1vgu zNxh5KdY<`$5!r5-^YhlUj5SzQi7YtCNBlXliSilpOyEMCH|kSVUMWwuF@Mhda-;ah z{w&5LZ_G{pa+VL?v%e%L{7>=cpxjJ0BIZ0D!e@TU86^(zwQ)Ql;t;+`|19E^zTswf zJ2D4}crS1>iF;$_8@KZ}P2EOtx6pKewGGVPuJ%*A|9>eD;jN7`*b%G;8J0gY=FFk* zG!+6|9CK_oLKxU<1b)$W5*!%b!iM1Mj8w#T_;b{31REVH!ZR0AMy-DyREFcf)mONS zw;3PI&zwN-H(J^NjKPLo#779K6|MD6VRv^LkDBt#ovqPooIg85jy8Elw>l}tU4wEf zi7NZP-Wr8B^`r5Jh4I~~=GR5Xa{EC17^!flJidFBkMrl7Qy1=gGnjA;Khr+B zx!I6Bqi}OQGZ_g=L%(IWzi{~MOXx8uwVO|2pn*k052}orMv<@YNBi}OtKLJt*5QvG zF&AK)%`_pa5=-ULPFYSJ+P5-}O-HwqhCI&~QlM8dqR^&-2FyB@g^(b7?i6HPjGVZg z9fgP2vO~B8fDMI4ab{Q&uH?IKVPv-#1|6F%25=auGs$suAX?T(_uwNzB-2Gp`RqDp z@UoF=Z8aP%+I+rLVR^k;6LXe2njP!U)(99~e70KU(|cl#5!kC)7@ICkAS#YR_yL;0 zJ1mvTu;ru_$f%AhTJ_}A-5Ih($e}3*xEPgkkV;Z71BXel_nG1tT$)&BBnRD5O~LAN zV%7jPo2YD3XZ0%vUIZd(8Hk*#$(f2k^inD9K%0H*xnZUowr3@K#>Rwc>wxE5Fh@y| zEoh+QWf(HmOjb&uF{R_KEDk{TI(wLt^ol~wkYo&>jW7#7vlZ0r%-NQ-3F4NgZZELx z)++y$QjVQPZ&DH8j2K^a^4H511gMMUVPf-Dm_sQ%S||;np`As~pL+w5Fv{o6x%8VG z{9}pnO9IZ!zHWu#jliFo6QP`cjnsw7o~b}zbPD#g=!%-V(c{A*%Z>xT4#gJ1$Af>g zc)kMuY*7ed!UELhAWcn>DS%h3enAf-2GQ_s967Yw*5?VT&`EZyL&fBSvYzE3{G7#~ zCm+>$p~*tzjTYrBlSEM*DJ0}B!fZbOwO%Za0+W#k%X|Z%O*BKiDcUmk0H=d(kLQWu zf^3-SgVa$cgVi%#OYKaAL_9zim7xVlI0Tzx;Tu4VJJzO$>7tYzspm#y{gDo>HVhGa zgh5egd^WNPcj4fPCPnh*$Z8|fJX2E3j$z+n!s$_fHW4{_KOljw4 za^_(Yc_;e$Mt$~yOZ2#XT)_O%1tAxNK({E<$`D6{NjVcfOWV=diL9^N@ zXPJsp0yUR%*m1B4F3swErO+vrwW*qEK!CGTE6oyN1TSFVe50|E2bjZ|X&mD1R?k-h zMXWQ?bsalsBG!SU@esaPEw*dG=lo1r*m<^+cCwA>G>KI=c9yY5!HqZspMl|C0qg#m z9FG{&RVfLfHEWQr=MtIh*!JSs`Nl8S=Z6s>{pp~EH3XPcA@KJ3z#KDS1>RyQ-m(h_ znuEQNAjV32H4I$=%Tn%{c#lGaso*B~v*7a+QDslS3a!GZjarN0m}F5hLMaI$IZ99$ zN7-n4rKzUD?FLH(hmL4iQbA-1iLYsWO@ZkuV#LXdriyFqqGezg@@DyIn3?m-<7wHCD0taTqCR{> z?U?pe0NI7gFj8ow0dqM{8<`ZGbcw8aTsSARK^i|&COdk#!d~9 zs`D{HErV}5aD!=nyb;R+h>?6?;>M;BHV&_HB{Kx@Jls;a(j=DvSeGS7q*sU-P>i&d zWZn*eyw=pVBAmve9XnH5^^xG7FL2--1*Zrm{NlLIfQ1Ur<`pK7@PDU$lIlY>jdHWJ z$c7z-WMJg><_P=)-zs@vWOwsOj+>t1b6SBp42|sn_y|9kqjfa^Jhog6(k!`gG0JjMp z9qb7=On{ob_lO4TA$6+E+rWaTa^ZYt!Ev#7?ZfbPG-iLj9Elr$f5A5+W^|8>4pMEp z*1VqF?>P#Z;!H9&YKll}s>lJmTRqG2og?B5@G5{glcxn5M7#dU$-=MKtNi1~|C0bu za4s6xUq2y&o?`j^b`!yH6{&OJ=d7@U5<A27;hvvO&p8 z68`+o8VGs{SPgT2cOYvH@GSWcR@4-$@2yL}O*BBq%XDhWXLH6t4!zk#4lN?RSp`0u zH+7NSg$j{XBL!b82*~5W+{+l$)pvYwMPk##5&@fgb4e_qFBXy~GgJIedx#y}LK5-z z$D4Uh;76Oqk2dqa;k2xl0kE)QA{)N7meJDOMMTsCg>#^Y<`~61Lst#wt0sz;cG~sN z?&iVL%r0<;RubF}xwI%Q7jc6WUvEskxB5@d7l(Ie zl9ww9Vo(A|g|Fe*koMIi6qhlGz@xb4=TCR|WG;dC_1kNs4DW;WiKo5tTLW2bi~15T zW4Q=dm-^b2+tHFydE#`@EJ75*BkCLi$wA7vA}=QtJ<#OMg2n`S#92B9mW?x;{u#gy zxDJKTTpdo1WY1pNHPyXw_%`Z`DY zf`Az1es@VGAtszwphJ?h&7CB4dZ#tHMGVJjQD06YHzd`7&m@k*yfs*r?FQQBXPw;B zZeAcdij!!{XD@N_GkMw<#D=|dzb$5%MA&O5HtR$C%_Np71WbgMyAcOIDl&y`BxSw< zZASLo9AkB(hW>d1d+I^u5ona(WsZ(rkPP)D;2`)VO2KM~qi@F|)Q>p*j=K$xLO3ko zW*je&D|_V|uxzC6mGBu*<^zafw77`+2IblA8beU?9{r1&3K|S6M8oh5yF1(i6jKuG z_klypcu73(l_SJQ#wnjKqtj@(*cHwpe-1%(d|%54AliGmw>4-#fY|2OL7rj6i8RbP zz|JOq)~G^;8PDjD<2q+s^^yD8h%fK%7@o0sd6Z|zD6dR-T7b0oj|lH^AniZw>n_Ok zHp7mh-RUmMN10oNp-|bk-Wq4DH7^h9MB@)>d2kdKc`&Hyr`me=p;8{*OFmN*AI~fM zy;Dg2n-aT-l=yUpG8WbGrb4_j`EblZCOj?oudlao2h2vR&VI#mO@|z1?(pZRzGrwR zICl1zL%^a_L)u+%_;r$RqS-qykf_{y43;5(W;G(u+7!`m8=h7z1=T=IF-(1v4}m#- z-Lzo%of4|?-s9Z}n`)+B#~8ny9A2*t%VDEC#>e=`p3jIs*iI1a04pu@kk|Ol&dFr8 znM}-N9?az)p?rqr!k>Z9?(^)}Ia-GNS+Zwvam1zXAZSo0noO{#0A_v^LE~mU@$TB> z+k;7>stuaspeF!Sw>(C~0g+^s)pBxHM$zudk_02l1;Z+l$Nf06;E?BrB*dM{Xs0v+ z+^*#(8tJh;z@Q?~$?zFS<=7CaiJ7zcX_VyZyi6*vDyxk?=FBpD21he*PNJMuD->{k zMe3K4J!1ro)R_>3WTbpvVK$t0>Q61yAT7T$DB}hIQbYFXY?-BtjkW6J*_I-}uj0?n zrFGOX^9|QL`_kDmdFRi;D&`v%p=QzM(9GE@P!sH|%VEN4+c99>Cd0=4Rm^#T*k=eM zQAAhJKg*k%_+qffUTp%P$N51FYy##fmnCCa022n^X%%M-*D9N#u9Ih$Y(0SoTBt_> ze{pUyEa#sk>CxF3%2S+Z++UdeC4S z#m#`h1*jMJPi#tnb2bVJNXLIBbUKWBj{){^Ms9!qh zSt0QUaq3tt(;z+`;Ant0x3t~^>$%;2dU-mD>>0>>Imkkr5jJ117OvKc#I^(Hk|;rV zEc=Vq3h7|E0qlkS9`k;HIS;BRqOS+FgO%FSOdgwMVhdvU%*>PwH_GY2>KRv!5J5}o zOoT!CLZ_`T*RCn-pzv=g`FNpvKB%7z@`$c^l`#x>IQnP!Gd>%1EzG_m>`dV)TzZga z(^JrDHaV<1}5)$95H!Es0FJg_)MZ2apk0D3_!Q)hjpAlG7`oE z2omYShXK$Ehg4n?Xdf6P%Bivlm_1 z8)sHXL?vP)ViJN~trVCT#>x%D6Rgasa=@0&*@Ha9CKy1B1ky`H1-(;03Y8yO#5d!9 z5&dI?99^*LCkOa!0%mn5)`a#|PzWBYWQbVha@#OHp?~cjvS~fab`!&(%HrmLg@c~+WY&nK1=x?qrYWei~>x!%Sqs>>8OwE4E2AW zt^uE&IkS}A^ttRckUazUSVF&P#1k!(C~+hX&IMwVC}bBOunr%q2eY=OM?XtE5q>jA z*O7DUH-K(4n;+2y;!>J0o6!ac+74gc$vr~~Ql3*9Q;fZOhd0WLNtieS3oR9u>2urK^vhh}d) zS`$L&tra8B+<{uPqXt2vO#bmH5dar4eFGX}0W8Iqn>ZX_Epg`i-* zDWDMwNz~MBbJS*>e|*yT^Dgk;0*q3Jm)_~@_xjdDb!c1^*SpY17QvInO%-%)OrBM! zxL`P^ix(7)pAa2Ycag?vuN3YCwP{$GBhuLuOJ8D6foi;azdaOl=5Ckyj5Y=OZM|1H z1e@66M&f$W3pbn1>FCP~x}z!e?s>5G*&?AHgL2+foZi!g|NW#4xqWw~2;+5V{NZC0 zKW|B^jGqRH4CL9YHcAM6!OP^$-kC6e0el8ZQ~tpKGh~F*h@6YSXL06DNv5&I&?XB+ z$f_jM=!7>4SX)Ts+)L8Cyq%%VaOUO2J1Y>~B&ajw(iVBp+&191feKo(WVtj$KFI)| zNxqfFfB#rE)C?ZAGyK^TD(K&B$csac9OBOv8>*nXWYvN27!L~hFoU=Oo?@QX{@aG5 z`N4RM@)=XRcItROL&PFf(7SVx$;^lAc>(#2!ar~1ez(PH6;v)AH545x4lO6dp(W?f zChNVy&Jqt>a{f%eVM!2t5a1lqX7X@pUwR>}3B@mELB9O^{kS>~aouk6!C+#4Cb{06 z95jZG+atdj{DKfm+ZOXk)Yk~MGNxDtz3PzRM^amTM43Utv=yQ9)SgPntvLH#Zu4}1>!GmVHs zlgyoiCHiOAS1Zrfu6R2LTDs^iKGn&!rpHW7N%P!FFjO)cv+1Hk1U-S3H}R@=Td6_) zjSeJ@$bjba3?=jA0S6;$dMgvwi7Fem5?c;<5ll%O*gY{EO@|_C?dzLDTMuKrQB(1b zoR0-1w^8sbQCryZs{!?W3U{Xw#^5E+2JdX;aNy5&P%#pC2lUyhb~gg47D9d=Kdz7% zgO?>pCV5HFuhGKTre6gk2`fjN0)80m9$H32BSWC=Ao?zUHhOvI=z=kahvTdN4`=WB z9mjR9d#<@N786pV13KpbG(rRDMj}8WkVFPZib|Gk$&zfJbkDM_Y|BZ<=bo7l^KJg& z`91GjwYvaPw(nVMuUfly?b@lTi{P)GdS2R(`ihBVG{U$Vjd;oH<)M8Jg?yBWacG#x zIAav|huTb*-{{dBj5`X|yt}YV=Jk@-kKP)spXJrS;|$f8{Wd?38|QSV!2yyd`{k$$ z{zJdFx_jfUSH5+KLin>E`rqKsHqNL)yAwPgmDo{!yl+eq&NUTrgo2&)nnQ*2TR+jC z1HfCViSXEyAshk+sj?Ac=g-ORymE5;dS70WWXPcfsjuTvC98GPcRLw{SPf@!G|IbR zJE?y*7i&cx6tj|>2dGMsSn(f7-#=V@fF8&RA=Ft5pyF(_7{S#YF{MUz)@{|&F>0%noqY6{IWl3l>^LVcoH zn10-t{pnWf)pnXUk1O>l)QDC(9SfisJ{R_AC$N?@zt{Mq|jDP;yt z>?tN`jhKd@?5EiO!ZtUua77@My9BEQbLOGc&PbX8%Wje3VA+EVk~c*zbh<7OZT#6Q z7+W5LXg^)d+1hdbY&9#Ki2H<`H#RyiH%t6=cw$JFLqc;nfHm^U(V=tE#tq<|=sLfl65-;Bgs0Zf7bAy}2_;VBr(1A05<^>$>CBF5-}5XL!vQ0O!7_if0-yQDkkE&t_GBb`PEY8!KR4CL-s`1# z2v6{fCT!w-KE->bR^e_nGg-lfqxt}Q4NV83@<8plm|5l?Bs1KQLkJ1y=QSm_eRh)# zVQ1>B=AW%(2-L{-cy*Fz1rVDy_ZKJdFsWx|FkR`DM7;SFLe3kI;o?+;jv>tExv@~v zyA?RIz_KCeTktu6Xfk5Xct@9~`D_7*-JYAqfd{h=PNZdo)4VBY79P|x6a9SZpr3j^ znr2{_rAVwkRB%8ha=ZpV&x4oGH{_cEg_hdcEH!X`mhHxnGrtVvKbkwm^cG)xJ z*;L1kOI(+?u;yr-j5=qVz3ZJexLYv+A9asL6|i%sQdwvNle2u^0a#vW7F<_MKEP+` zoPpBq0^k>$4#g#G=6lUFUns1$^H0~>&mR#xwe)P5!*D}B8#@G56myQopiD#9d9%T= z!RD~>V@b`$nEqK~P^y#w&YgU&TP!jR$n!!u zL%dY^`4>~2a)HkfKGzgXmh?ms^j!Ug2Y^8p6Mf7Ri8p3pgCe*rp12PkDS z7_bjC2K|w7yzC6w^YB12lt|2sb%wKtW`nM92B3t4FO~SNn^Ble2ZcZh@hbzi?2?IgX~dFRket#|Xf19T z2xIy>sIr_c03gnpEgzM*ycyzwxYWhWt}=BH9r!a#9p!y&)`f;=NrQ(^8p5T-V2j~j z(+0y}#oyv6W>jX;gvA7A<-x0&GEEpDe$hsl;W>~N;U;55!aErM8b9Q8FB~H&aIV1_ zK_LT@R^L8;H{1sc(kZc;+Q;d9Nx;gJ^JgdCUef>+l{FHZrl^;j4;vx(yjNffniSXi zg!@f*1rzia8D#usqfp4v5VU|By+{Hom_`?#qP%Im86mrln*AtwXOG?~8fHK!oRFjB z!MTCx!b?HBB%x_bUfE^OKtGr&h72HRQB8@K2`PyGvmz40jip{TV`m^3!{E{&HP@v% z(@P4$?dt)D{`0xKJ~+jBHQd$E>p(mhSuP(d=J%C`q4xqPOEqy08LX4*H3Sl-$E+hHE+Y}SLxcM?3t|ge@+-m}OOFPb z^-H7|@*q}luB=qJY9{wZJMEJ)X?J8dO`gHCu)eA+2=z5QfG3|qJY8V@C9lP2#<;z1 zUHG;cv(W69N8PWEnu5=eTl;*&wbK~R|L(Mm5eMQ}77*;LD^3Q#V$n#EXQ(Df6Md`( z|Ew>+7k}e+j5xXNPe1+E+=M*ApZz-yZaL|n;m;R}d`Gj8XZ)EdVLEijlKS1{x8fgp zF90+)@Xl!A&tD$)zB!CGlq-*GQo8DE|G$66N0jpU+o; zz);iwczY88HZB~z8bJ9>ce>9nU7 z(z2Rj{k1H5E-_B;+6$Scu957Zv3-_nioZT!7(BGUm!(hl%V*tR9n^mc7Tzv@hCjx` zGG5RSW8}fmV^8EsCT6a26n!trLkfbLEi_@35_9dSVRHeXCJ(s&6H?x~zTyP&^KwBHdLd&$38l^c#jXrYe*Uod>Ek@h_2EO%x_lTIFjM|O z&eDR$PLhR}v2l)lHnf{a;=qQWovDUh>NvjkcGxmVN*FLN5g0rm9gm0uoS(Z>NTB%w z@o;gLAa{@21O(51xHa*?);;1Yoh-<9n<~+CpB+Z_9aUcZUQ43Fdvjp+ET$;um`sE;x?=*_;>y?tIvY9*! zEF*z7{j>9DO~?52+iR7OVAMKgFlR>7c~<_tHMwx_^kzs;x^q~jVErNCI{euJ5fW-p z?i`qJFp*aNa3QtZo*LvP5If}aMm3{;gONqtLTK|=CduOL zkav;X-XNK`PEYQJu6IQhj zb@6swRvjw*#HhYqanC1P2nHGf>P8v#z~LK*SOqPw_(vP-xmnW+$_b*g8s!5~--$XCjQ zvVzZ>MZ}7NnFI&K&l#iUQA^TgiIxSHL7iASUz_sTHPTkD5AemMy&4dSQ{YIO&6itU z&ttpc{23%An!14=ph3_vi0DoyO*Af64;svvZ`wFVYUco%$#`O#p2Du_qNO1>Ry+pL zH0$YaluH85qTyT8RI|}CHt>~=8nkmoyfKm`5d;n51b>D?6B|*nAnO^vtY7WSf#%-X zfUf6RUeF&hT1>4aS2j2dWY!vP7=M<0)J-<9&lOvi>=}LOy35O}Xr6)3idU#q4HTMP zhtHhuhm^64hy)tuEW>9g^jZ$JGchGk)^Whl-@sh!?e;9vcQ7X063=s@XLbt@7Rgla z*7ES@)Zr4*uJy$h#F(%b1V`g<4--)vIyR{@7}dD z&UaoIUtqz()Bw@t^!?4&lw2~_rdbfIb@;l05#pYKjM)b!<}AD{qAvex94dx#+c;S% z;$`9DXAm?4JAqxV3SXbEpur}hUuM+89OG^?J=2?;>DM02m$ClfDKRThT$Yhe;K}au ztgXr;!EotJyPm%wL~#yfQs(O27L9F-mRy5QOQ zGqCq`yK%PNp%Cry1v+Fth}fQg`LO+PxzcZ7@|;7)yxcBfqXBJRX_l9pvf3aaKMwpE zOs#T$s`c_pi^}?wuOq=kp=_8R}j$8Fu4hqeWtn zkZ=uVqlSgZ?qa4@E%8o@*o7v6HuDX0{D{=fwY-GQrhK+-5zTWXel8b@b%+(`NWkH*_Qjt)S$Y5KeW7FOOGj;f&NM|{$ud?sV#~sbMx-gEBhyan z(C-fV-|njsZ;E~epUsX#XxA{B(5tIqrLhFwni|u%H2KIA0Ly3-d@@<;D;f1=%eicQ z*O$VvE!%Oq;b^)uk}RFGiJ$e=HlWNWs<=Eucn3(EtuShYC6b9fIgu3mR<#K0}ZIJ_1%oiq!bA!hXrmIp)t^K?ulHlo>B(dR_-y@BKcdQZF1sLKb50i4mYVwch`~Vo=!m>Z zER-GtbKs^H@XDYXMBNq3eAi(28*3Go%ddj2lw6m!>Oup1k_bO%cf=E6At>pF6@<^r*F zek~-Ry^wn_+F%k?mJ=zYcO=T(5Bf#Rn_c$ch=-9PYXEZO(EAABbNm~@prcAe)IXhf z{UV~ire)xyRO^I3yxQbCS_w8FlH&@Jn^RC^7Gy3%j<|j4bO+iiIkw2Nzc^~5g8s9K ztGU5&_8?D8Kqu1NRJ2KAE?WPy>N3h)^f^f$*# zaOUqW2ET(gpGycWEi{F=K=ZZ2`O?>CD_`>rzmU5H5efeQ?tVUGiT->6gzv#x{f6f% z`0r6SKkr`*ytCC>J?rs%A+Mhdj>;xQ_MazfLOJz)*MG3w8-9C$oj>32{PqC3xLCK5 zXBlWHc`xQ5&D?c^C4TjsPJK#*f~{Zbko>pL0Ql8265rM7)*u-Q`JjWw{VLNA9wz^B zx&d$3rCKjC7}I`poiJZh+EoBb zEyv~7>YXoqaoqmZ<0iBg#WF@2AMO?r20MRt?949knFNk@^2`=S4U2Za4q0|Q7Lmq_ z1ETAW9Il#%Kfkk%qjDOBDroVYjf|_BQR)Jd*@ZR}TaZNF81?MC8?!Lam%|yvx7hQ- zrG=*5ro&`?^-&5Y1&YdWTRmh2fD5a9EE=NFH= zO8XsT(p2Lt8Uz=ke*q_1la<3;xj>CmC0TN)Z?E6M(gCn6 zmOGTM2m@oQ>9fw*6mJk{k4~Aah0oiVLhg&D_OA|0zc?rpED~+i+gli<(0kTL;-j*O zxM{Ou8nS4t9{OYh#re~PS;iyajB$sIrqfJcMix}tK*}yhk#TYf@py3@M<)<879u09 zNubc+VmW&d;13Utb=iBKfZu!aSe6R9Eo)^y(%kFdkDa<&GCUr~B2**%Z(U;+g6992 zH1cEqqqj7T3G?G#{;)Oks4HpoI|E$7Q}Aup1Y?%BSEE3LL=|-4EOO3Uj3407)Nu(k z@L7{xD-z@p7_!;R@Q&bV$336ZxPOokLO*Irxov6g@xs(rZE^)cFQ&wRN*HqNPV8{c zdFc=GXY+Z8;A+CBB9sLD6?BZyp>ULpt3Z<_NzpE>$B#uJ?zH<+w>Ye=`&!H)ZypF*=6L3eS3ajXwtzOeSi<70&VL&UFQx;}T_V#`{Y? zE;#x_eYtem+X*l^G#ia1>9%3O8O|)!?8rLzR;Z@d68zbNBr-6tGg3(fDdSU)%-wQo za;-AKr~Q}x$@69DpZVwedMQIR;ghA=mn%iA0M;v0*t!zoYpHY>+vh*tS@7B1Ga~EPV7?K<=ZHUVx8c<~#Vk0) zqT$$^<(J!1MZQ?AthZAQH01S6zhzL}_%kzw^umE5?Fup0l&&(+X7F!d&J;Qjro^Ff zk~SMOHmuzM%a18^QV31Cohw~5{F!Zl&tC2b+KXdXqV*kj6t+o7Jp_7YL+v`Q1Sr&m_(s^ILM=RhSNeXm+_4$y@ls9 zuTfU3lMB`RwcK3<=a5PHv8)qEFNaOX^U*9{^Wh)jco{b9*qN<^We#!M_^!iS@13K5 ziUVqxvoJ5pXY+_=t7MS}^>@@j%4biCNEqkIaP)X_MqkFs14lRQem{e;bMe95PHqxE z4U9F~SqYxIg?p|1eHEIGJo7@!T}e&0Gn0Hc#w;w(;Oy~|K=iXg?ug*viaA)2_?fYp z+XhoG!wrUq0kV8H5RiyJucr||Gk$#;v4U9~7IrBX>R@GhxqiQuN#VLYUu8+B7IHFt z#={(RtV}_gXOMDm)gX^=vq5Q5>GEvMoJFSr&Lk=mtdK2+9(^txTIdQTd?@jt zK6j4{Z>-L@X3s~mC3&`<;x^Fxf>B=B*^shWD-Ih>3X_dhlEGwbG=?J2)Ir`%f<=>r zn$39w{%j>4g0SNJSsZ(mKQ~!EPXKz5o-|)QYV%TwuDRdHJQ=}$%SfPM z&X`>o^;O_MX!FHZ=X9$roiAu8W5o zd`240sN}+Nv7=M2Hd@yYkwcd{)l#paFs4#61EL#pd!{?@7vStlY?D2ULQ94X8?P4U ziIZ5)3qDu)3MRK!&8?Iff4W(op3R}*ul)6T0kDA2^ItGtem3~a@#WD3auZdJ>=ZaBN|Leyc5;Z~M@J3_WBHp6nQuaza3V(n^F<{XlLWUi8#d6&} zBjV5IEnu=|sITK?--?(S8H@O{L+Mx-%{q`meXWVr2c`)uKVtwrH{uXgixISX$3Ei3 zh_o42Q<)Np0}V&RpQAPnJ42+sf(pH+mzXviNJ62v8I1=J%`nWXgcabBV=-Nw#Ona^ zJ}Hip0nq?$SSz>_P(@ft_+=GT1(Ts=P>ke`jL^Qgr*eQr@EOpMgH2%^1IU6%rgikz zKsW4a{1&M3`_px`Z%NqAkhQLqj9zuisXK$r990E-FW~5j7JQ~!a9wx!v%(HWMk`0W zl8Dsxx(N-x>$b$d#lEulQL$xU;#3B>gs@^QWwMZRei5Ej$Lg~i;bn8)fb@bcMK3YX zuz-VzW~sxP=tP6ha^4W>6`H0HP76SGhAb3(J#>WY8F(Fw%#`U4>dR2MZ`uB@x77kX z88E9B%#uPbABMr<&j^yeoI@ItdXX^*r`TCCI;Kt5)5iu6ry3Qg>6czNuq~z(OEeI3TEn(prS!7oo1NUf$X0?^gyL`EI#jSk`qu&Lp zW)*fY$6%To+r`R%UJe*1&H4)4&884|{JM2-ANS3nq9@4Axu>=#w3W`^`qbB=fOv!Hs`^D&EVC_z|H)hCgG$frkT^gZ4?Nqk+$qfRw*G zG3hT*`ecO@G2Bov)?>Ull>h3uN03t}=(ooMZO@jm;D~IWjY3NZeJcKp3kNMQozD+@ zzdh<=0HV2EqD#m0c%Ey-u1t>wV-*Hb(>ESYIoDS|5EdC)i*VX#v+|~b)+{`4I% z2O5jOA*0a$an57e-qD~i=gu*c6GA;Q9qN4kq(xv^nQRuSg*qKR3xq;bO~dTam{CRMArBdI z4Yji;;cH4rLkt|ZEv{I^c5SQa06EDwn5mpSfB zT}--M%E}0OEr)cR(1)IW_Neg5BO(%F-%(>!w15hl#K`$CgOXV{GiEw+{%p)y{M-{Y z-Tav?mAx97P)=|k*+GNKaTQ)8JYor%F;J96!`~R8EZF&=H6?V}n?CI2p7tiTJ2Th) z{Es(&bh3!&utJ;@{oLSoUOXQdF0HblG-G~yXb>L!jzzQSia*|+`=|Z#FOI4o?3M+P zwf-pEqq+Dj#t7Q@Fz}hdK%rGWEI*sq_s-B}2s~rvs_}jS4U9@Gh#}Vw94#Vk%MxZC z4KntEwo9xqj${lSOZiM|Y7oB^6PYsw{wwiherm5h1$Jf~Fx~_~qk`URrr6~_K@7~s zK-5CTngm}n7##m#*9suGTHtQvKT3~#b4Q(-U3@&|b9iXKT!C_9Br*kj#`zgi{d~0$ z__GwwrhFD>4lW!hp9j)QQ)rYsM+dr(aQjW{!d66nrGlMP)jnuI0>AZp7S5kKdW*g!9RT$oE3nQ7>;Q{y=CXy z$+Mh&X`AHFF%k8efuzMJzD|a3^XIsxMmX-mntdbpd#x~_>}2K!e}28?TOIw~3UPfc zQ8LBzy6PKwM?l00~uem zc${ItiS-{3;I+p8kwf&$CG!-<;3xjjZYcjpG6<)srUt`mBo{4+kYD4^-gvm3Xu(Uy zz8rCb-o>rKym9V-x6Z8!zMEW)f27#}a>>Yj!jcLDe7211kR9Gec>~K45RTzto zfzNYyXbRVzZtkt>6wjr}XG;@&wRE;XNV2JCgNgIyS;7Zj^mCW}G)B;y)%*2~zN5$U z8Hk7cQc?dfUXC@!LGbKs`39Gc>rfc;XCY{V&siLURo+NLUG^4J=W9P2H6L^ea|9Gy zs@z8xO-)lW%UhTa%&~V^EvGP}5L`twOhTk*wiTkd7GIAHr}&U`2ovKVtao=#U);kqVLW z5+l#l(a~A(YGc>J*OsSTW*ro&smhBTc}hd`;OE%7LVe*g0A6Fi=#8Toe-4~symEGp z5ww%%u%$BjaMVtTFtRuJ`qp`}R?m7g!;KqsnnT{Ew-&0cHlblkoU&Rk0Nk)NnXjd~ z<=J5)cf3+W_W5cHzitcpw*iH&qB1?-0HT^4bVJ-YRxAe(jYvAq8X8!Z_?dMUST@@Y zUv^u63~W&~y9!#=I;vwJnyUbU)*FQ2xe*JMxx`46iCJ0AKB(p&bjuG`iuaa_Kf?AI zp1DxrX1fE$-E1k0AX*N#a-Ucgc_tqbWB1K4d9x#KC(MG+7E9501D$pv?VQ;K&w|f1 zVg?sp4)t{e?fe<@=g9xr`LmdChCg`t%NhQByfOn$-)_z{(swE;{+^kvXYbT;dj`Pf zCLy|DXWmoy3jF0W36XB+C#tg(z-J^D{DEgb>h#gl4DxB-CDAON9tfUsmi7#RASHnY zIMeSscGGzR4od&Lnj`M4ixaOIy zjuNa8*Ox6t8{|ZU(`2~c4%aeE?a5|oc59JPgI!E@aGNTM;{Ac3d0%s~+2H7_-PVh})@Z)mEYCrb2OX5mS+vKi-7?sD32k#*2s-d* zD-@9yf9~WZfo^77C4P_DgEeH#Jq;Bj5wty9Ji*$+&Re|sQaa!4fV+X=;^AA(Q|w2y zD=01J=k+SDmb$GHPfIc;eg+^D+)y^}aApv6;Lox1#@GVdRnUV{u~VL1GXH0u742fW zkV{=GRsP@WE@De)%=d><;UXUU%aeg4KK>&Q^fS3B88I;ukWc{mv9!w2PUFntOOpQq zf8_IE(FtP&O=Z(R3k?PS{O!RqCrUNFFDsA0p9PSChle;nQ(64ks%e*+s%*U4^J3uE zCM}0V3rHOGmA&y^Fc)kjO6EkN@&s-6nNlLo7MH6q@aMQZ)TElPjMw*a>U)pkFtXqf za0`VF+!zedEUIQmnG)y<9D@dLwdqh={wJ|6+Dp85)i*p#3*lTcU>~jpU5Ld&^}(=u z9T2S#VAhkaDefGSuM0r~a~PpxB8>+TDKO_8r(BZ_6Gx0XST_TfjXw)d8OR-%xS2p) zPJMW?BONsulWmw1yJAf-g4R)En~){O&naXysX#$dryD`?X|iR(8MbW~e|MxilXnny zm&yu;WH+IiFxcA=T?JlA#5_%7HV7u9W^CCfC0b>YRJN4((NN+U)iJ&*Q(5zsr5tMK z{MkJ^bfP)g!nmN&RDf!trxl$>u56ARfMUeSY$MsQb8Hhx>sr8Oaj4)PM%sD;vKwM1 zEFm=3A6FwKgV^kX)ZmJtO$W{#CHS2gcgVGaP8kndV7Q>4y>SpWho9Ra7Dq(XTqbnG zoaily+=kH%1BC6~@Y}<$nlBF1$A!afs2K^^mYLEK?J!do1kC%pr?@n?nM?Fr0G|?E zj}rT7@T-LA>aw0Jks%2Y8;EB70_m1~dGRpuW!*n5+=BIiLdZI@fCxD>3CSac%KFb1H{2Au#2wK4bqur%HDAM0LjG9H} zw}V)kJZ&-ywS3(F`ego_Qw%ryUn9YVKkMGW^&)b9hDFN}`UIJ-wkV<*7-H!!o-X|6 zpv?-4tisqYac)r*PQ5vfwy0o;wpURU{j#g>}7-_U9ELW-w> zKX7=G7%S%1;!(g2qtV9n*q<28j;p4JgS~9xA*s0-Ocqaej*Y^cc#Af8wsgn+Mt$Ae zdIZ^ZVLf^J*~cLMOQ$BM^GM{|4SV+?JT6n{^U?RGL)6#*icj)k{nMk`ubwnv$k1Z} zg2=KI8l>3+TP(M>s!Q`sq&Xqn(Px+veVkYFa$gEFj?9h^s-Y z>U|qy4sQpnBb`6{03GkFd6`Q_k$%vDxV{ zTN-qx%GUFmQJf4xqmdpbujVIuxtoMU{2Afyx_L5hA|d9iStPXt&fD)!;KBjA6vM>L zcwv%2gfCa`y+68pGM~Z|!(1!`+hxv-7J5zg8qj7ILCS5}gCK`Sww-wwnfg}clY;{4 z?qBWm0-^?VeKo4lUF29|qxDHygOQk7WY|RA{J;2}9UMz$=oj>@6A4E+O4BvGmzCEQ zleO(12 z+-|TwGw9-?R}2_I8-hmI41%`rQgO+cM(;!;FPEo*!wbHn-@%fauSb`1yO?bB&}`2ke&&)f+WlV2J)d`5 zlS|pR+L`}LOc?Wxx&N_8-g%mMcF!CEy0yRf96D5*Q$NX6u!kAf^gjfhJ zv?&&9P|h0(=qywS<)N1(Nu$tZ$wB$-yYBcg?(Q}096AbYFj;c5Fv6$tNN&*7fbzoW zw=z_?Rr251rIA>GJ#Ni$>y4qZn1zTuLrNpgTo9CYaO(Uy1)qYKBpXcTZydczeP6GZY@9q5yo3G zF>vTcp8%k;Znz-J$W>z<&dYwLa^HgwPK5$d!!8$de0)nMlZy z!}v2};OJr{g>&p;d1A9$gbv{f1(uscloW4;aKr>U8M{6s~Xd%5?1ao)> zDI@cC2{d3?0!R}%2j&cf4|zkx5=)aj&(>tjkvm6R7>S=9COd)-V43>fi&a+50Hv)d zm2jot&m=Mo7*+PLHOHOMDo%`g1zfD(-NdgT%bx@?zF03_l*b|T@lbmm5w&7ebIKXTr1{;abMQ~Oy$&

5l+~tub_ncb7;o*} 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�PBEG=};WMW+s>z}wnDB5NO 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%0ATx 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�bjh@z&h&as?HVKX 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

!#$?(JE|>A>0evkAf*X>2!KC5~zKofhPLbY}LQ z_{@#v0?S4H1oCDQ3(IYDC=e}mG0JB&y=>1Kle~{eP50@h0PSW5a`EfMnZ9O13Sn?D!e%~I12xN=eQ_L9HSy;K+7G@{u*X&u`e=bSL=!w> zz-NTee8M0_F)!SK;bhQeqZ!7Gnh?p1xs%#1P2%UAC2n9waXdlIyzJodiTE>_z=&gZ zs1h5j%?x6@L4{IGVri^4im~fBgskO;_7*1L+Xst-y9<5$RVU9 zbYjJ~lE094wE|;jNvUM44O#IM2ng$T0hh42T%bGvpaV=7n5}tq?Ju7@4W{MWo1O zWX}TH%Q+k{4g{YIl$@-V&sPigSBsmAN#YWgvQyQ$805K8N(pFVzM)2v(m5M{j<7SR znE@cWM(teA&L{w4K3>etmNPM$;sF6QBYQqs$)BzkM4|Dn>6AdtbRC#)$aI=f6^Jc( zuTw#L4*=im191N^H5;ZzDSwYLBth9v)hoAf#gY9%PN zw9Q7Lzgd>?h0B=9ppgz_(uS!WM60qTc1cj~K=y3xn)W%7E%=v#iLxTd4AHS<#wK`n zXe?}N2Gnl*?0KZlu67P~37H4rg`i?3v6PCMaw6@!Z2c^%Y1r0mP{G0udgMVz&E70W z1;(MTfMSQ+=6!)8T8S8cmk~608H^0Y_2ftybQ$eN6(YY2=g**E(O{-vAqXS*98q70 zD-_YOs-Z}sV{vB21glte;k7_7JB$l5Eg)nEc7Yw}=L%>6fd zD6~UqIXTPBA(A&svkFUuD5A*a5XsSW#GkFQ+%`bXy};QSTF9TJl)m81#=U*l;Wl}x zphG~-@Vry_vw2WBQpRdE9ie7T*3dMwbDs*IBkO4s=cvn`L*cZEsC5X&YepPegsr@w zG0&PK=v`!}ismNTjG2agzi(3m$%H7Ps|5Cb19TB=Gg z3|=r*Ej&{^cCW%LJb|4Vu#mVYoLSUjEMPODoYo-2@MlFiv>1piuj#87i3SL5hCGXD z2ud%4!F{NpU2AC5j1uj)Wk3MOEkK2vw_x1Do=(UnWMUZ zpvpu72L_x^nt)Sp5Z((>q$w^p%i?I7$^w;UtielCq`xF^w8DY$gc?8hmjY0C03hSn zv$;P{J0L`7%ZO0{iH{=wY;YJ>85nV(p$*A18DVM>>Ea`aY~__9*AWo3VPv)-N7fk$ zv{D%U@5!2sf=Oc6RzJj^q2fC1U0oP?R^ukqeS?~sLR(?=z^ZU#jD_Do%4Hoea^d3oz3P0JyUROrD$5pk2t2*T#${VA&<(DaqFAD0L21?j zHyGUvvS`)^2o8#M?F=}pBa>Tmh{PKiuBkGi$#d{f8^@;bi!~l7tt8XobrLnBXG-Q9 zywE}R9Ez)-t?^Q3fkz(d%c~i%u%yn!5X2(G%tQ3nz?9G0C0HRY)?6%e7XjA;ekr#b zK<`c1RUwmQ;!?8}=S7!|6KHH3gbMMy%Hs?l`lY>y!jqG(?ptsT^ID3GjS7mhh z?)#nbpU&nW+dteY^0UdKt=~^MJXg_IlgM1oSNO?=MgMSI#gkt@zlT+5?d!XXsHu00 z6Zz?zo#fy~@*3nE-wZe~0SfQ6hVN8|FxFs5rh*;?vnxsVtZ;-8h2~BGJ`;`ccz#qy z9I7)+n8@|K2R9UUmNGmIREIf_pmqj6gP?n1^Q0CZzD6@oH2HtAO3T9;;+Xw=0YsOA5Uu-K@)-y{!IG*xbycv zbs6MfAMB_PA|x(!nLh`d_JR*PZ4S2Z$sPp#mco#c1|||wYY~VuB6`hftsk{RBCFs~ zuhvs8&dF|c`fp_%kgBo~Wt4=P00;-6$LH5<-F zllq_b{#$+hR)bgSd$mie=PPEk*(>`+R~@~V32tCN#rbm~G!^mserI~i{}MY>p_e@O z?)tfYG~&-egC>54KgR~Im!|ks4F6%H zcoS8j;E%rOpLYH%{qtf1=6nQvt}5K>VO8R1oLU9S%veJ)^^zk(ujw(Ms1okA$lC++Bm@nujSm$QL)$f8@{R)84%JRd)7#t5!=`JGmu#>BI58V z6w86Ixs|2-c9(E_plL-I1VmpXiJ!%v12)Sc(?UD!6>a8_@#kaI)bfs&M~4=zo`e#^ z%BavS&sG!?G1i@%Y8AMA!)CXl7Y*+7jPnMGmBIR$m0T($_dD5J%gKYL)U6~pb_P5; z*_N?JD|HA!HURE}5m=7gKSKUYO+249LZg=st7!xXZq9A{WzuLvVN~UgEz(AJeD}KFl{H#hMh5dHu&rxEbw5O z3R=QobKambW036z*tsgtXN`)dfPpQJ-|Z+u-`dm%Q}sN0`vel@#W_^RvtZ|1LCR;jF&itEVmY5M!{^DZCIndF z1@~HUe3;3ft%~}}f1{JXvp#pemS0_nx$GG=bs6T2;Rb@|Tx=f0XCu!v+bCw0wTtNzWbGtg>E!na*?+U)2UZXEIFm)n?ZR7pQ>FUW!;Oc8>P zD*L%eks-$9L$Dn1XVXrLZ+l`F{43S5Og0p4P`(_fqxsO@tcI2MLX$&NU-WyEaD;eA zms|zy&=@caxg{@p3@oM@`VWbGZ`n+U}5LaUP7URU$J5+_gXH}KRe@vxEfp)Qw5g7 zYz>^6dYK@DCdPKSs=ka%J5P>U?g7qX%j^ng8HRNkFp!f%5+k7t+9x@u*?$&}k&5u5J}5gWlNSIYc!_&6F6021hGndBJC8Lb)}W2tGTL zcm7N@z^t7p=uKieE`cT^_)PphQ$gDVC5_f1nA@E@2o;>qO0B>oK2v?LJi$t!z(7ALBMudG`o)1Z&XFA9JQ z?dy~EG>Ah&<@K^GI2I=_whGrQ)=KsCeBoCSIIv_AI)*v@zT zFe@6_%(A?Ks3@_`g;lCl?1k}jHvbJ>XgPH-FU^QTW(WPI4%QR!N#G${*(Tqri*^F^ z`10EHrNXl?;gCNwP9Fm>4G>2X5L+od)}ujyLR@O4(}pUGExVtIDX}5p2ApL{O@?7G z80rAYF=|FE2O@TY3TvfP+Ce7zY^{RRwN`I^9_+?dK;De_nOKAu%zga+4^V!&T0W~YE+K0b(JFr7uru`t40iK^NYdN`Qe}`dbzHd zf~mpIlE|)RpsbAWQDna1{8^3-f%;b&!_o9^Ojt5t@nj0Yutp{w$v*7n`Ds$8yXC+K z!;CM!+pDuUj&tG9obLQtfYhY3Y&}Dp91N$cf+N#P=`%xqPSt~V5v zi)dM(*va#vKs3ZSR4Gz}7Q66%7r_qXT>UkxOgb&Uk@YMS#7Xr=H#53X82ii8 z%umPpzn(6`N7|Z`e#X?Ns$*cI4eTLkSh-wXrky#I6BfiJC}~& zvu8q5eM#!<9E`>f50Lc|v(Z)cloHWVaZVCUXK%lGi-kUcv4)hxW^ za{Cu;M%cMGbAh1MsdwQMkJk3`$Qh?*%`^ed+$X+(Yh zkw3a8Jmr{jObz^@GkfE3zVBe}#$NH-V*1A7UVaoHt~KfK(Nm z1!TH2u5gxAG6*UsCuDuaj}?Pyp@Xd)l4ZaPzGekD@u)cjAk8L;OFLdgv7E**M1B!+ zPDsd1LsDdcajc$)DAyp(#28AJ>i+ z5ZidWWZ`ODRvYMt<>?{U=)Put8uM6avnyTAnt1w78#+20DV&+9`;9nHhC<^XD`~Vu z(Go&?EJ7`gQ|LGNGqBgpEAj}Qo%aIJRM;sHbI^puBD(I#v0KYF3yQ5)pBrlxab+2h z$T>gKDi9%YqLG~Bw!wLW8O`Uo69x!AxLwO)w|l&t#Akz~2A3pxMXoGo=8jyTxj=LQ za&-ReB4-~A>S*eSNE3|?CW+E}DFcO89>{F|8_^*hwV861_PGJT_2*5jgVQ)#-)qkD z`CB$Vl${ywWMk0vyUWzU(PGMw{v?DSdlLd=NN3)d;Xb(o)~-#V&reO=;8u~b3>GoC zc1Q4;*EET7`6?%PnIiHG2L?Wurf+T(W`N$@sQy04EuAH4ZeTqzvp>(1sP7bH*nWjS zgO@Ft`3CZ1y-R{ZgP`pZ7()on3lu(NAZ!PgJB67sz&OmAQ3;G=00L)D3OfUzd-*eU zNON&HnPVpoc`i*~ClocF()@=C+6;Nd>X|S8c-e#nhXoBBax-V&%5x*M)PO&eXLgRD zfzQsL6?xF;G!>N03mOr);IrN$;lJ%p?1}wGoL3Sqcy^~35VXT*zk;aZ4?DAGOVeA0 ziDYb|f+urvihzT7T+|DRT45HIa=nltfuMoImGq3@aBilO9PiA{?zQt6Twu6?@>#CS z%X4Oef%$Xpu&FqP^i?ma*+!XLdIm{zDK&}6nU<@W*@bi*uuRJ!?s_rhINISebecpS zQVq4PWM_+snbzFw0m|oY0dJX;m82tX?43`S=g~i_yj?h2s^I*5h7C358(oQ_@uC5Y z?{@PaZPb3+tG(Wy|8cGOdJ~h4>I+201TqW53p#m@`16lj^RJ9QBZ0>36#g98K^tL4 z+wA=gL#h7(N)l}Xd};& zT$x?+&WhQ3%icJ<7;89i1~QX@KRc{;)H)!#X2Ahyb>2(H$urG*asup# z*b#Jqiw!uFCpmd`1ns2S2{YT^#L$t0#=U)3K#LIRp8>_8E;>3_r&9-KhOnCN_O^iV zSZ2!?`e)d((w8fW=m%kj{W@)i2|H(|(95GtRF1+Hwkb-CuA32>t25m>?1i{G2<_QY zBHIno@6ZVZPj0LF)z3OZhWZkM(1Q}%sH8f! zbV>gVne-GM^*UnCAhJmREFcM^Gt?ZO@)rI~r@e%kHmU3_dusqRD){2aXaZfj#M=>1 zmY)Me3#`Z1MYa%HFN`>|O3{tRa}Cu%95O$*K2C5FLZ zd_10a&TL%N;WOKSKl}9Af^a>FPMggs+!DYA-2%bEW;J+5zD|U}5+g?licndUV~axB zRxlUwTLjETFX5I*pgECKgmx_nfo|z^=na(8>(gMQf5uwjsqnQ3Eg8wDvFuRPNOK7W zL_3)zWA72T1QI`EiH!1jzbupIeGOQc8ploxx95=A@hn>}7jz|W`deq43`XuB(tpZ- zfCOoOw#qPMPyj0i$3exxp@^K(JfpIPMO$8W%9voVg-b9JfHQ_0Br-5wdeNw?NBYvl zvC-a;Hkg*-ZxCJ9mi3qI#(v?|;T$mye?3|J>skBPliE)QQo}wacA?fm6rGL$$Yi_= z+VowYqw{&e+ih8$IK}mOaX~@%x~5{z8rAdthKN1$66CM30thuFQC>^om7#cW>t?$F z3R_lOKS##^SeF4m=wvyCb{K%&RN~L@QaYtU&(N%iT~!DsrM`J$;Kh+6vFvsea+WZ) ztDQMl2?aG4(-J&uvXrm_pl0R*66B&ohFNfK5_8xPME$&5_QnGm41o;zv*fs*_rY6b zi)Uy28TqR-Ol2fwofD&8$@-FVGe96Ey53m?KQe5{XT&_cFCeFgs4J@t{EAM8zR=X? zXn?G}oL-y{>qNOv6B&@+U5Kk`0)fLAh+HqmAP{ZJXYwp2R}f}PUYAm4ECR?R?oxk8 z0E3OXP_t(HtRXqAHQQ=K-@KLpM#Wil zii{bO%rH<>Yha47S^lKSjg;dCv+L_l9lFZaCZ_8`)|?fbvZ;45%-v03MD>*dRkQPF z#xJF@puI?bbQLIPdAY1UWu^m&COLl&mO}3fq;ltU=f>3Ma{IZI<3{pir2;c2F%l3o z>&Y|1%Q!tdJ2gTOGPQ5Fn%sMw`>;0mi6Lm%^(XZd2>MAo3xy_rBB2R+C-P*gK*Bu( zDeqraWr9HVJBB>?DesJS^6=*e8~Td_3uuI_ z{8ya+Ek9WA|ByfZi0vYKXX%`w!H%GNz_MZyvWv*s715Aqhs-8&)*+GuXUcm4wHS3n z$xq>sD$8Oz2)!rxY>I2@z`z;U?dCA*UxF&$Z}$_C9NfB{zlqSdlkZ#2_w$eG_eYgy zdl_t*f&XlAZ03iZFE741tUyY?KdL|5tvuc@$dG3@j>q8H{0N$G(dL}&j=QOM*3;Jo zax;A!DTVgK%=4?=_>ah*u_`((d{0b-<9R8Z72P#}&){VjLL+-7>>z!~BN{u7qtf$Z zfoOhtzBw-ZbiVM{+vUCTNNK!pBaH=zoH1}?rgvf>ZWjkn7p71(Gds4DH{@x0SeuMV=Ftb zB#ktx>9O_P&`xC>-T2>bFZ_Hr|MED0z7XH9%z&UpxvTPvMpM0%z4?A?^z}&%=Z(Le z)nA@>UY=JGKfgR}{&=$dxA&Kc_J|{EYV?o!(Q9w=XZPZOSvkBC#U<=um_np{i9!P{ z!$^Mt!;GqN$P?{&GV*rGeoWg)Yhm8lT*R$Jm zVo%G?e*fG2`7(UIAk~*GN5Zjr*9=LS2-VWHBWNE3c~MZq(NP`G_~Q4r7F@oI3)C~a ze+QI~+Sh=8BSqs0Dj55X3je#AE4_e-uapE!5za0;dZnXa>7vt3?d+BPDpP^RubdU^ z_EhE+=g)p_AXgp^!Ueu{w^#ohsGZ-eKPoGDQr7wN$h(>0Yb0(V;-v})&EGsKUtgTP zSsDL5KMwR>l=;TB^w7I=lYLtS$)5R<6e8x+{?G+l@Cq*u@#h)YaV#V-t0($uDSiXT zT6h%XSqkLLgzP5bL!jfW658n$B4>1rQfxwvFq>_Tf`Vb8XDy=sO}*b8TP+UcW(S*@ z!KLf~#v09>+5ytG^V7{#OtI&Hy5MLIo&(GR|33^=$ zaXj3851TW%+G6KhNMiMjfSFK z;Mk0HhN_KeF@fz`2Swb|G=a=HIYK*&)~*-2h+5QojK-U+On!7ece9l4RV0hrN`@U>T4LB{mo6^-=P6M+3ptS=WISgj;(w~JJhkwtfkR~1C$WMPpy zv)Xzwu{e2FBWh;?-pg%(wFPfRWQs0ha9w5B66@I^Ql}-c-`Shc>0E4}93R}ROy8}| z@_!Yq%MWUk3IpoV1{D=lvS)<>jh;|P&mc75Be#-3W7)wt z5e8#)Q<%V9+QWuUU;|Q%PcRJFa%Fa!*n$i339;z7oVSAk$43_9BiM8lW(Km8H@MsP z7A3bhs>(`wXJO!=E~|~h`C)cJ&`y{mRkIsD`&RO1)Xv~&XtT+lUHL59Tpf{92ZCp} z=D-&k%Mo}!cXET5J~OzlqkJZr9zF;(>HL{@5HMlC2e{nFt+|sc7vuBU8E`b7Fs#7(Lh5L_g#7qWhR-HNUMij}&zTzru`e@6 zZRz~yGgFo9M6+a}20_ZaI>{$x=uwz8TaT0|cRo(2K}@8@pN%;?f)3zwA<@hy%em=F zW_n{mF**-A$vxhxD7aw`wKIen=1kZ4exSJCYZ6Sei1L}ED59yb)lMF^fX}7>z288? zgT3=B+(b7Pep&|?mjS|#k-^R$Rj`*oBY}oOqdktq&!Wf1fdRi>NDDt~mxz<)jM`Po zoFc_?STpi)kfkv87e<2v_G=~&7tGnLp#`h45iq4R)qub*nf8pBGa<$->BP{NgJ!|b zUv?#mR{hX+Bg(*~A;VFFGJ-ba3+huyQzFAgwxjN@@MkB<0c2j17l+THx7cUaE3Mq z{F%HHX0~4}%k$YevvcX_kke_lUX86OkV9W+=(m|&IEx08Iu3=18ZtFeaSwlHB(PIw z(LO3y^RjhI3bs#{)1Eh^tnM5;v+KZ_F33Dt7OV!qI(?-Cs!0M}qIZ>^c@qqkCF2~} z(R2ueMVLtrmi>^kW%B$zOErhdY`sp1poNq}3N2~0wKEs#oTEdYp|UTColcLO?*1gm z7qt|gG;)GMLRQJF%XvTm7K96g@5w-z<)tjx9`I*h@L&rXwWQYsykd~4vS#53nk~xb z5GD&jdkVC;M70YXHY##76>U~BMjff6$*6@W8SE0y68qZ1wHWQI_%j$*sCL6Hhs-zT zG_{QkMh#?yoee%;4bLP`Q?vlsq?+)WdvS#P896kG#&w}tiVc0m??w=u z=uA?m(-h8BW5LCxiEy_gVKCsA!9!C;n9<*w&j$7V6iz1t5N1oB3bf;NQLuCebSB^o z78Y%`fw|xlu*OoTe4X%Wi(g#K2I4HrNQ9-{rDE@LX|LaK`74+YZt3)&W60=j?kWHv8u#t8IPoT#H z6NH?g+>;NsoJlBw0n!DNQl7~|Yj==sw-I9pJbbTCO{Nc4rG)w#_F)T>`8fdxWecol zO#%Lvl5&B@w;9~Gn$%H1^m6LSO6l|Ec{jU2>8jziZGB7r!mW_8AF_;0r?L zOY^4Ymf&W9k=i=5t%IPMyH-Hc6q`lUOY-sf))}lL=ucV+>OWmY8SGenyW`L1W5IBM)17O$S7eO9_@2c5#`AkTODUTVWQNI)Rgh;e7|xS_HgV z+=RqL)OItN;R%9s%){lyEuc+?L*6F!84NcbcQr;FdH@5%bIH6}A36d%e@qf{&PWbj zPd#WV!Jj##JDm3;YdIvlQ0PB5Ljf>`$u-p zq{4?AapIpso*!?-5I+;g5KAJo%>)=aU!1{+LslL&d1yeA&-p)gbq4wLmpc&e+-I0n zY#_j%eZM<ddpS%9;MiS=y^vtF@k>1=OlbrA|nnt8ik%4fgJ~|`vokT zpoE-qf;;rwi^F*k^sCd#FQ>)hg@J|X0pK&Zcq>1=1v<`L>!$iJa6T-L-(H0JA|?mp z8-iB+L8+j5AE5|7Rb5bt()qh-ejFp{+f|G>Mh+^&5`-hGP7jex1$~J>M_Onk&>Pu- zmDI>eYHTYrh=9DE9z;#_%h}wox2wOL7hfC}4j1EG0<1ayR3F_hp_IOf5PH2d#2e&a zZa4mVTPkR|aGcd&oOgaaU;6pZ`qSOT&Ej}`?A_GhJH7lFY8uIs!M30zj38h~4w?jY zgLDZ#Q}a0 zMPEJz+g`5U!=DN67J$ug0KPKTk($z_>6JZ`e-l23g>Upl3zxfQ7RG7ICd7@z&&=_+ z_;a+XZ)qyLj&C0N_m%{AOW55%+5I2)`%l{Bkeaot)?4k(zI4=<_o7-4QVv?^E$O*B z!6`jQFB%~f;F~1*jgl+;S;A%uG8nOFc9l2yjOT_jqwi*huBV3jHq%4L)&7I>wY>#C z6&Yy9ZtA(4?5j*)t4?0a$R=8L(9Ogkq0O*qf(Svb4i{$Swo!#>nZ}a5zV45m&L?j- z;*E^N&-3Y<4vO)Ps3xXrsp;j?G#|W!;7)_)D5e)gqlZ)L+9{WQsRVn?@(^-vVcuu8m5LS35-6*HWy~k zmvbHh4+$=Q#b-oDhK@F5WPKZSW*!j$YGlJC5H#eO_=6HTOZF_~vsBR16{D99RKYz6 zT2kjL{8&X?OZjgo6r;iCPUb!>*JG=5yet^V;oguMS;NQzpYYZUt9lQP4H9q7i0a#| z0_6ACG`PF)Uk&AlOmbl|i5vDk|n_%k?{1cF|O4b9Dr<)#Lxu)ly!$`l9} zw5zYT>bij$1{nOHs;81SDSY0A9f!Pe{0jvLvns>_Qf=57$u!YVxD9kj;(y{_Ofzg^ zCD)RDh3Ok;n~`4Q(2k`>ZB`C2#IiKhJY1WN0iP9WFitqp2@o{nl)L-vaDG8!lSrsmHV#hP*dF=PlI2ME#q{&CFo- zQY}u9*CSb+!Cu24a7@t#Go;yiZnl!2!NVCwjpxQ8(qbCyrV!qX058u$p^+K$j)PEu z785YjEG2n1Tg6EN2*R#WIMYroBl5hMkJYpBdIlCfT}iR3$f{%BsUc{T&x(5}+l_RL z3ObaVS?8;YZXRq7^xo&TL~ad#wuIoBD2J42B<<|MQUN*i-Id(wQenH5yT4NSWxqvK z!Iylvy*>Y8xB7B-0aOKQ{&}~GBZre`K(w=Hc2%;yfc_c&3{nO)gO@##cNw$q!iq`o zX9`7(jV%XW8S9uiTU0^nAZ#{=4R^hu999g8B{@}g(yP1$ymJ)nhiF!fLzy% zrVU=EQ&Pa04a}-#v*YkX!FIg}eWh!f6*>k}hqM`%8x5=%K2uI*wlv5oK3Yo1JZq<6 z-B<9k`$EH+pLJ5?BmPYN2tg|oT1La41)|OK*@F*)mq`@jsv+`h>1lWNNhkKKo1|P) zWKIdg9YT_o5Ke@n@JT}Zo0v#pet^tAuu7X&p<_MZP z07-Zws0w&X7kupR2)c(q2l8fyWDNNNEQ2Tw6bCZtu)>9UIU>~tkc+fwEkxEF0e@!J zj-7o=9ZLevU{B9GvL+86_ql^loj=2Gl`#a(M1s7{3(zMhy{zbdP-tHh$Ij$g87&Ak z-2&QNIILQhk%%yF^Erbg+zbN^Erq~mfmutCXHT-QQ2Z>f85wj0nP_UX<4pkr9T|zb z5c_Gpj5ttm7)|U-kpasYn6a5kQ_R`4%7$=DnjP~+`RwHwajd6AlBI2ytA@C=n{OED zrQB8qnKa7h;6%Z$t@6{&ECd_o23Yn90$>pzQpj|`&fr0CfrH9G*Nt4w7zN-0BrAMm zq4xl`ObSxRE{Rh}+7;N;C-wr)M!-bQH*jeNh{x;djT^J1%!tNaWBJua{prR$YDw;#R|gdk^y^!tUykZn zK)*U({NG2lpN|&4+|@AX9nWWxXQE;ql+oZhHx_m_XBA`44M?&?n+HvjgI~jyHRfoA z5>caH)gpj}rG<7ZU!(Bby(-?bT;C^4Wv<$1t1+M)87!c&N|tySR|G)idhv;(7S0iN z4bNLHpY9XPayO)OwN8bLDHJtz-nc<|lR^+BI_ghRS+D9o;mP7&*~v5FZRxk$46JN8T1GVVB^P2Kv%Lml`joJSx~rvs7JsHtOKoy` zwkV3f+imdpV4M<7O-2(vx?jjMyi}muGK>&}%Px@CI~CbB>h3=Ruwn}0~RZsWs9%( z0u(;(HxJ7Q5AWt5baH5+ zg`m+wH`2go(nq!UU+S^HG~*AtY2@^ub!YF_W^vx&o8No<35F25J4Ng~)X`sTCLgY+ zo^B@zR`}kMoCzOw6HhnN9D1@j`^8TA@wVROeYs!!(^3|CiE{W(eHJ4QT$JxOq-Q>^ z4!+llL$E*J&VIV4prv1K=N_%&lSynoTp*^98KZoDu=ei#)+naXcNZry2^4uYiwp^s zjW$!00G?gLz&! zez9A6vX^CLaJ~3bZEU}cK8Xg37&7w1ErBb>-T)W#;-9+kqYsGR-Jhe^pB^7muJQ2$K`|hf!b^z zxEMDK!VzM~yjkd9%ijQcZxtmMXSvMJgpBj&8OSq|B=P5kY5sP@g@eEEgr*m`xKtkB zE?~PcM4UlfL?m@ikGkerdE{iQk0m;7XZu;P4Pdnb7Y=k&LtD8~ez#vA!SF*CL=I_em`N6**RdC*Tc~X9H+In?Xdv&t(BL>$;tN-|5@6YX6 zYUG{V@OAieZuk!*qruWVJ8MN6UBb9^>Sl4g57q>3#VMNPM~xc?6dJ}`7{AuTpMyG3 zwFv(@>g=f#)VB&(!DiTnaJ1*i^oo$3KXXWiAx7R@e;aH~uq{T{I{;B`gwXG*jwzWL zl6FJ--P;c5UU6*pYCa3GS#;x}Q2C-TqKn~Z)non{TE|Bim0tNXTyqqy6E zSSEm|OgUVK-jOtvRZns%_u? z%ozl&LK3R${mqrw|5ZnrA&Emg-hIvYYXLwF-s-24gC*icfRh$`s(tv1F z0*?@@PUai3SqAoEa4|_a#uw$8QP|*ib^5NT@-V24gxp$!XFQ)3Ixu#t8GtPG&n9M$ z1N6|lf)mMjL^F^k%vp}mc+BFz(dFZPWY6&fc^we4FnMojY_WJ9mI$V+Wd=#2-)W{` zaRyz9ZJrwpUWgcaoY4ebvrXRg&zc=}6IdT>nkiJWa^A4H2sk5PM$*h2<-B3B2;sDq zf(%I-$*E>)%GZZFG~1MW_AsFaE2(~>_<`W=t)>ZDajS{uT)^DL&zcuxRW8S(%8r-K z>RB$$AZX*vY!!X)lIGc+H(FVP)iOzT#w((WGcC3NoxEbAEft`?NQkjD3s81Dk45%c z8Jp{ga&EF+#OoU$l_B^u@@9n{WLe}%f@Q%dqEk?3yD+iSNQ2r=yJ@G3x;kLMmAJTE zC&pG1=q}eN3!?@dqq3Hgc_}N_jYF@aX2a3P<_#jjGa3FbC+7`B&eF$_lPjFG<=SeirBmrmMF3pZtNiiw3LFK&Kz8*C;Aw&x{C zwii{3uZ@ky?)-@GG6p{INS#2OrCZ1rkkPsg>zh#iGj52aF$e3Zs<;LIqH_qhYRa%0AG zgF74%GWQQA>2({ z2_xYUDm&2TlmKFTyu#HK zAX?RoQR|d2j-h9sqJ@SDn{P8P*&wqUQz)dJAZ=HjQo$3IeGD#&<`hK5$d4IS1fN~` z%+@o`v7LEpYY19?7p8*7N16n1{$`y_iA1?V`yoXZONVuv^Rsy!M?9H!1f0zSIV8`4 zFxYpIK-<6&3}3?0@LROX-VPHa!MK2vOabNdS6ev2296xYekDaVl8m>8A`cpdErV`g zvrGXXOft$U^9|}y=qEa`jkqhjoF25WQYjrNwmxa?Qts9*s*&Zf(5_0@D$h4gviT5;HGj*ExA^nCQW@N*=vr(oiO*{mjNH(c)2$F{Ne>K+ zVvvknX<1T61dX_4;81FI&4S4!$H*eg=Km~Tj*U5H#4ex}!1!z{#V(D26l~&USoG7) zBq!>0^1OH0n8VK#5bdhSpk>y9m~=Y@C_2*tvrFf^SNd*Gnrah&%Ewsl!N3G!3u1|k zQqIhTIVzPe`1i0%3ux!4AQo+I!;~WohStJ7A*C=k18&lJY5*IEPGutibEaI{Z|s`! z<=|P^t3WC|@E>^>JkuIfgoGUW)o~mDXYt`%b-IQX0}L4n)RzjZr&OcX-4`n?&is?L z1uitR!+hiAe&OXo?)C8k@u7Y>ZvA}Jr2O->h0oR(vHWF5#LR*fzt}JTbbtu3u92AE z2#v#*nTx16gHfD8&D~igxYD>~&3L=Qz=3dCE0%(<*L4GkC<^wXJV)gG7`qr0``mA< znNQbJpRJ$@E`GX_07Q%UEoUFCCJhXxs9@x?Ax39HWs}7!o}H45W_Qe0!+c#>OuUgj z>3&!@%V@61j%3?T#Wf2Ay?biV+vE^~Bylr*x*DhO`|TR<0=SuZpdPJckfDO6g(cCl zF3axtQOiWpQa%UCai#B)XZ)IiiIe@1Q&~|;h^0jv1gNsw{zULB7z9SRI}fWwDC-PU zWZoj~(TM0}$h4!38aH0bS+WbZBxGs|ZEpll`y>G4C6Ffaa@oJ&TEoq6@&35a zyAIh|y+E{C$Jpvg%>T`H12W958(>%y_sSmGBJ_csB`0pnd4m#@{z@86f~l%g`Mv1Q zXR^kkb@Ow3pjg(Uv8iiH@Jaz>IH!r3d0x2aoXD1=IGl@1>yart^0g6)TGO(aA&%3# zfuQ=^h+~_}4gKm31uhw#l*Gwh@IH`P!6JPO@;!y-F}T?RCO! zP{^9A@z9ZjykAhRDT#JS)ZuC}VD2>TMmI=l{#Af6{6PTYQBH@EN zY+vGS-cXnpI`K&({+Gp>kLoiI+lhzW*n38d?{^e!kO+MbR;OjPu{A@)K#Vw^?96<$ zl+&M??eRY^#rVOLrN&O~$qq+(-;sZ?HpO3U{O|p4Yh0>h#Kz|AcTX-Hlh3vj)Fg1> zgSGtQt<2L+eKLvupoeqsA8 z>kOAG8(TKoZ0hA2e$hB=OazK(sB&Gt90sUGp_Ky4J$<(UT*Z2tuR+I+RI9S;*9TF= zSs+6Gs_NfJ4gp=OshfZ5%)UG2m75Fke*B-&DkI)rP7Z*e zm$UDpPu?qy*?dPZ>vsMOZI+HGwBztR%sD{!9Kx}%JiL<~Sk8)^Z>I3y=wZ&8p%qUS zf^Ze5j^qFdB8_UA-dA%2Tcy$OkBT^K{Bo!C|J_Z#-%9P22+=rr-WX(^*Hbrebet~^ zeB2%W<*fSZZj+jlK%dusy0!A->Be{GtB3jVnX&5tCD%VAVk9XL;jmNXKR}ZXvp2S4 ze;gYcOpm=&8U4R=<1%{fCC^dbVQjR$0(A|JnLv6}*cn(&3M&V+%`F1p$#P~6nXqR# z9k1qI!WN02RT$#dAaA=24B!@Nx$RtIupo4A+$|$4&rwjGvvI3=LHuwXiN@*BFY3<7 z`4v7KPVw})7U&Dz{e z+l-)H2@37v=PQb6-@UAhrc*=r7t7*96t#dDe?#)M|B6G2Ty_YN;tpn0>wZ+y%zUcp*E{%85pzrX~ZQL=!7GDMyY8WSQ_8)BVb5f>VIK?d*u`DUwrA zO=QoN`0&m`0;5-bq2C%4xWh;U&8NQESIj{$>>)wfu;Xaz6aG`2gwZ^k!?Q${jRa#0 z2`zTP(pU;pHxzg5RvUYPnLCXn!G)W7gU_>yc-Y8e!67>Z6r?^QfS#3@=d--2jiMue zb=kH_psAo;Qp)J7;uVsaGVClmO(Tw}s%gRMq+B>;n=I#zNen=M zifeOmFzjhJhOAVoS5Tys&oF1mb3Bl9OUx{BZ;&K-Hl!SgoRL6#QaKb_P#P7qs<~1c z4Y|VnL48T!Wn|BCqwVD3-W<}pwP%r@0(Dm_Gqv2*d=~Z|>*i;q(9Vxylnuy5F0Nto z#vwC4pB^Puv*Y+$2&`eFAqFnOOaf?2@2V>z*I&~u%XULzW;1*yo}l_g6e=rVSv`|z zL}1w>3DO8dH8vgqYVs6{F4|<_*k^>OYx4gD!&zTMN^$@ltxMkhnQNJGfp* z9M+SZsC%P6&B9_}!VLo&Wnm%Jlt}s9NFa*7)0sldEIXQrKkE+Rp5X?D^p4CY72~f> zN)J^NH|JtEfz=!HF<2`X&OLBou<})|L6|L+A+J9O1B$R;C9^o;AlH|$S(fa0Zm5te zPKKKw*)vy-Tblo`^3lOTZA{H};#<{WqHhqp6&2i0%o_-fIlw;?#)z?78(x?f+w2n z8Bw%rq+Jfp1fkZzX8=2MBqL01@RfV`T4i7jS9DI)-!6IWHD$E9RU8K}Y;q2s$(4z0j|ia}Hg! zA{$Z%G%Y#}!KM+pcEl>V^d>J0mg77EvYj#W4QMlo8(V8}KY?kLnByxs4v+KUij-8!0dj*5f3n--nIdsUVA*Tj8+zXFJLxQ2$OeZFA)jhz>wbO8=}_K>_ypEST~2% z1-2V&h;PB6W*Ke%9w2C^(B1+yT@Fp556>&$-Qk0zcM_bLt|R`;m`PsZ6_7ELoIleb z8Oj;3TVzBe+2WZSLE3Q&%UMHGhk=V3iZs{C*362nS{^A z<4%HIN6HtF8Rat?)G(MJ5SVkl1$4;djYtQ+98d92SP>|Wl6T~-k*6F8OdY{zt_U?v z2rbSGqO{nB9?;NOwD>ddS#Hd%o(Z7^y+iv5N5`~g4F+ve=;c&{vI?upaYCIsg(gD@ zWR*iyAP;d3>X?3*Lywoz9Ce{G>{P^t-hF!)6#xXesd_F>*>|7J=y3 zl+s@Ay9`*2%Rb}>KAVL(Ew`K zJlneiNV1Ei(M5~2qmDNAE)>6(MCs?dn3oDZZ zHVe3!l38kAa}1`AgGzRlOyum~PHc9s0^|hfu@$66lMEBykqrf?jbSrc&DT5u*uvsG zIWdMrQOKxR98PhQ4cM=|FG9Cxngs|$MJT67STxuQWML#+pcod-i~_RfP9tk#(Ws!o zjEJ9K9WK5;to(8d{d4=(S^d}Z#lN4`U+ph^y1Dq-s)U!wn8iSZT*^P*5_l0*$6&;Q z9?}sj0H}O^&~z=d24EE0FKEb_@#|<(u61M4jQ6q{B&aV}0bdJ5n_LLV-IpXY)`zClXmUImPzDwnarV`#nBCK<|KZU?RUGlsRSx$ zb!r%vUOcED&B`yLsUD%wsKGts7#!g=1lZpiFlAbk50AX2Wz=lfS8`~uvq1C~FI-f} zdl`F8BQ&i9NtRcSUSRQy!6Kmd=4#^Ht82QuAgT`}H@|3F21mOc2TgGnp96>kqY2j) zlvG>E3^angGkhcJ#?@7UUW^;-HjwPu1m0F2U}{6qx?Z|QR-a1%f@bUd*%!*&dAtlc zS5w^c;CK6F;BKsgyg%KDf4P^zujAo5Qfl7rWj|V(=Fb+Y5%mxI-}C11hn=ze z#G@gYU`uffoj*GzMznmPh?Z|NXj;Jp*#^30yfQ2hq06NGs0=hBm~0iSL^WLnP2)7H zmLvaX5VQ%Z#i;8evWx~n*N9hs^Q3+qK`+dfZ7W4E!NKo#vd<5)UmTQpf%wgSo@jvj z6}>h8<)IYI`sup`j$V{5{UH6-L5iR}#8N-64xct~rN9!okF=7ywwl7(qrVfszLdTJ zs)a>=yb=59G|wyM7e^&5HDKD`9TlG+l)mTRh2ttet)_e2j+$dN{Bhe)?EL7am*|@Mi6_Wc9!g!MeE_uTqDIO3~V}( zxZ_)bVn?3XsG7G6{n%oIpreEY+KDuCWIAjGpQ&K{nVEv1|I&^Ba=Xk3U%o&0xA)Vx z%1Ml%?=?r>YYm^z%QCte8zAD+^WDVXZ+8jH_~UWu`Q643cdI|0w0=76zSvu<&x|Ao zuS1YTeU%777$iJhr-p_eum0ig{5#`=W2w;_g`qzzj{c5nAsoI0qI&^pm=B0qi1LI$ zo$+4b&ko1JX2t!Ye3bDzZ{Hfs3?QUKPJ?yOw#)oktn7lL_S96fJ^VT1nLZMmPDuYC zy@n{+I)8Q%bvWfqoc7A#Ep(%tMj|Tc72YOk69kt2aJ+Fxve`b3zfN(GYRyAhp`G3iuqb_`I{BIW>oI=qtkyY z6Y=NX6FncDa%H!-Jj(ZGeygdAc6<%PX}a*fw*}?xCg&8-N4r5ucl>abbP0kP9*iw0NA<4VW0htoyK(E+qjJNaS2znc->A>3= zz8WxF$)2T)HbyNqBa&e8OsR#zzlg5EV#Vah-r_W5n~oU9aeG3#P?GUy4bSN75#^X~ z5P1;K4dc)7Ly>2EHgG})Z;Djohs;;@`mUc?a&qlxN&bD_#XK1<*FTp==X^t&XXtl! z2#6=<3};SGxw`@b)2?|k2P9cFP3LTE*-n(xHF#6%U&qnrXpNd$r<20^WW=ADa(0yX zjPj{K0S>~=$@&9JVZ4;V@3gjGN7bCcnSuYVAkF29h%=i7H1Jsh-K8Yv5}KePWx%rO zoCDg-tPMm9GMgM)0S7H1dlsN}F6{zi@n>QSLY~d`+1oK_Oid|`w;H@Vm?|gqdIG#A z5qoYFWGBY13pdVNhE7KOxtv#Fr!c);$7ol?7>0}mirJnBfP;vgc#An(%t44W0ovft zDsShFKc^f;Mqu3eGa%6!wfM8O%qa{{{F!r`h`s0R5U3N9nPGA6HFPs~3KPZIF(lbC zRLP8NFS>L*0Tg9#{k&&E z3qiS_GM-k+{$pTgeX3BK;gbXsP2F$B*B15KqB4U`x`g!H!-Ng36DZRho+AVeh*o4z zB+yJhHipj(#^XdJr1Ivxegrf~6xt}gYsj-z zb1tMg?FD@J>OQpjl zd@zbQw-E1d7a!)OY^R*SF9>Q4+4lCK%@Kd5{UBlbk(Jt63Fw_o)(J#t8foCOxHs_- z^HX?(EaYb9(uob$b}0^R-sPQ9H^Yr>2GoUHOLKI+zg)z8i@;Il#pMuKN~ZWv@{OaApyUxBkY^Y# ziM*p-@?@ffL^(S8gZV-`zoigDD-CdH#Nmt=$+0{=HZXQZFD-qtw@gRQemT(_q{Mr1 z=Lg8AA99^DY?+LgP)&JDv=-rLKguqNQTa9+p3X8<9>8Z9b;O@hXd8%T{0@z&6A^U> z(Nu7v3;TT%+HsKgY9UG-r{Z!QK>G;4=)9f#GlC+WOn{6!mJ+MN+O`pLeSo$@n=zGD}jD18J$)PKE?x`4o+X0Lka9!ZpW<> zLW@6NKx2_xaMp%^^Y;jYaj3u&*_boKM)~Yv`y#e%{8^SAkXYMZaOtQH*pqxuFH!vq zEwqzodM8mCI4mCngUsU0feJcMJA-ODBz|k+X9Lk_jHPgcTEm|u{|4uxmk!-IU~~wH zpRSb5O}a#7&ZRG4EXjJ82;A7Lw5GyV<`_VUupUZRLxRp5IV3h1L=X#Tp;s^rEA9v8 zGVUZ_Rv4pfnN0{S{)`>Rx?u$%H9lAYdxOEYbiX zDgf&<1+FqLCL+}Ag~+5WYMUA%gQ>+HP67}%5nvJk4G89_8Bq3>`A9G-21BBp1);vU zu0@y7Z!mMOmC@vLL{-sPgg%tLpMk zhZP{e>(lnnr|o~7cm8(5C*k=|H{=)11b;X{1i1M1{=(~9(qu9KEpLLl%N| z7Y^BLNCh4E1CwVwoI(ke8M7}b^|{+n=Tr& z+?50(VQx!+A+H+*BxM(@TTAy6x8IH&gMBgW?lR%4nKsB{St{QGTRLJ%so+=BSSuQ1 zg}tLGT{R6)lofOdv?Q;apN@7>!Z$&e+##~yz>>F_LWzn^bOalXTS`D1vS=g5W)uvG zRSMP71|Fqq20TI(0gs4~9Rf2E`l4TMEqq#F_-sM7QtDz8LA*l9ytft_FAH6opRl7& zZ(K+-gwM{O{ivZ%fzWUaVzx|&W?5Bk68hDGgb%Eif+uuORw~ir*fV9Z0xh&33#EJ5 zOhUZbM@{i_GVqn>N^uGKeay3bMpoJ+_Z z>Y1G_YdRsum%h4$EK!_K^Q!F zehv6};n8^5z^z3$-ovK!1UgT$2*A+mSV&cM6!jNmmfy-%ujX|RZwyF_7@+or}@wJ`*7?|>|Q5v zzm4PZ7#|m(EDj-={%Svq1@x1x1TSTt%D5wmB?aG3-mCMU^Kt%v{+Fe(kJ|ioFv?jF zY*#*;m{~$)=g+8=dkHfL+9))m4Sb%xK7<*7jID&gwQ*^xh45M73!^0UucZKVnb~aD6E=L}WeC>%#2yk2aF`Latf7J4p&f_F^AYh1=ZTHT_Qf$8>4hIps;}=fz}Ljg z>clXwzP_Fx-O7%y<T>zAozYTol=B^fKq( z{96%pZ~dO}T;b2+r9F@tH0mxWWUi!3{5b@wzr6@r5MQgPPVdseir<)KVA2wu7}fvp zW}+UW%zv?kH|s|wQO29{-7C#f=*xRiZp$c>?Qk`MRSoa$-qx;kadAp?t{gBzdyP>4 z93f>fXDjp)A?49`3-~;Tsh3fcr<}(>K6DKWj?Azg^R4`ilj`7k^~O>82DVX{WAHi8 zW^uSOdXw9)Hg>%--d7y_J@qTG0oH1 zumr$_?K5mEek+G$c~DRXxh(2p3Zc^;gHOWX?07djJeL{-rtMaz5J2)TII}ybOKwe) z&N);&OBD%Z?x=)}*d|FXzQ&vtZcoMwIwZ$qXH47K_d*j3dbmNkrypBq(t}%_1lQ zBW4}4C{eUQOh0lXbIIXuVHy{L^W_8}^iD&s%R!NjnuD3*B_gY5$(UvSY@%Ps#l8jE zF>5TKL-_1294Mt#a%V|I8p=mB#3cx5Qzi~)JZ(Sok!FKva! z9(9UFf(-~Kc7!ECb|fK0^WPvtqK-l4Ag`mwu5ZJxvE685Ak2#f!DpoMx2nifCxly5 zvOZ?0d%Si*8{Zb#SCGLrFkc#SsJ;bi>2+Jyka{3x=L=({Ah^k>z2@6A^2=jEDb*AoIkV0szu`G zc4~+JcsDW#?^nvx#1O0&rfbExT$d3Z_jqD}peb=f44hSX#jsR~@3r#>sE#|XZBa8CkC-{{F8m<3iaE%$!RJ5-jsJ6ipyAKd1VLMJ{|z{EZvy#} zyu`^cdFQljJ;7|FJh0apFBzo`5n})^h2T~=Ef&fotSS^Y&=kn`VXS3r_O+S}@ z$#X7TmkgZK`6sX%@~O~x#*jHGZSw}c9~a5}sJ%qzT21H75pAZ>+b83RU0QSaEb|S- zz3#k$9vF*eW6_!dE+WRRVbSQ8dqv&QU`M->B8PhB3q(wqKSRncZx$sElW4QqXgD|a zMmSL%+l0+zA_UFRh!6WwYEnYdt~q#MF)dB9*=`6vLj^;5GdP#z_1St~&Um53u1WST zd~2F#Ek2c9@GRyWB4~)TGioYu)W~xXgO46bkXYLEP907AHY@>92Y%6hF7%ZQ6xuSb z%GNHkV0f@)>I0}T%D@~0{!GSkbPog;kw*UrmRUa|oZ+8q^fR3{O^IJ_|S~7L9uYLP0RHd2w*mv8}^o!DlO> zkmb@+NFOfAvD+zwykIz@Udy!LQe;U_BWxbwXen&*s)a)D!lULSaE0JmBsj1w%3&&i zP+%z}=U1YCA>e{I2^?91$C6=d+#8I8Q3k!shy%Rrvty88b0#Rrj7i0M?#V_*G}45E zgd>y`9GNSCdMhV`4vSQ%{3d}51!EyFoJA6;_CSO{d*sKOdl8u>TYMp;TLwEvDdf*g zLD1FsGlLgFMbL{EhxtXb6wWZ2qbTu#`xpeq(eP)ut4=|UY0kIW8iHnPI!`3oQe_LW z!HSJPGd0?zDYfQOY8+0i#P!dhW*v3xY#GR~yfR=K2PP?B6Ic9pQ!WJfZ?MAj!ezzC z8VNM&yI%-yb-VHFdFSuv&A*=3{&t2-$^6Glx@5#a#EDb_Y!rY-zYTPYJUdnPYihHW zh+P!gFgw#U7TplOHaiQ$!f<$eIk?cW=cT??t1)-@GjNzhEICupDjXq_bv!q?6DTyN zi!2Nl;qikd1qVcTO}}7m?lA#IDWXO7iG<61Xu)tO@s{X@aOOMv749&FhVIGHlT=%%J?%x(RI#-86(o@a8eT4 zkQn!XN9WJrM@&duhb-kS58d~;o#0<>??D(F2^BY>^2tiYA4y?P^tzrzutiWwlsnUo z@{T&GsR4v_{HRyPf7{tL6{NqlHDuNdfaG^6&#&%JTU$TGmgUl#+uM_X18-IhK}!XV z)>m^k%5B6|gTxk_5+wsgdOV{IH(9w;20iG4)bhQ#-8HY{v6)XpR5vljzEO+e?F^Df6y8EWNCyy$$^lrY7SAe zj5u7Vj70|d5KTuCXjITL{c!kfBw1YA$g|=ShU7U=K1<(gM$pQH$@w$8e){E8MsL>` zR z$s#@&-yh`Bb?;V2Z!Zj@^(7wPYW_Mjdjn_b)D7b9VNbD=>4(rF_}MIu^2y1MhjR*X zcxz4{st{)owKJc$2r`@hhH0Lm(2?@_r2*&X#|EYO6y<1ve^N<5ot2;M=4`b2*bp0!_%mGaR97toG3P{2(Nm zkb>JeWt1|*A%8{@jYsqwLTGq32HLD%;^uK}(tiU>_|E zp4M)zXK!?oJf&|SjQ_`-;;ZBCD_)r1tzrR9P{Nm|%Z+qmcI1D#?M87}2-*e1@Mp+U zGxP3GhkyKX=|3iKOcGWsJMw>_j{g5?dk^Nwt!zv8#>`W9ODaR}$t2TfGMV1fd+$ps zd8wq9cO|Kuq*iyU`_A;8cz^nRYi|HdvP!x$_r*kJ!{EbX6i@tv7#u(^PvS;JZ5rTHe%-r+i#6t{1BKCr4ub`41 zC`!I}`ks#}M2C7yJRco;VJ52oU&!2O@b_Dw^7G?)zT`%m(OFUBl-$7kzI0donRN@3 zxAwwbD2)1w8uyI&vmxkS)XeklJh`{f`EvxHqm0*Kn;iNR798<`SIOswUSfA){EwUS zh@S_JOCz}S?-qw}ZzjlBD?UgF!qVug#le^J{eP^C53XlspJ80H0Bz+e$2;*pygfa6tClhwq80{KzXoGx&3AXR1u3-P|qYK+E# zSJ-Y~_`KgD!k}ogCwJQ*FH7gPM3r!6sI1hIrh*PidiXO(b*=@H+rvVHiBw0Sk-7L_ zC*N01-hs2mf)=n$9q}-|%Q_`X+X2utbGdpz~p@n@!{3!^``Y*-zS|)GqLLD<0 zJ0CWC_;V-Yv{`r=9L=?3I*YQ@fHV8-$loB(>_)TW6r0^F6BIUY;;aIhpG7wdy2R}n zK`d8|5SfR7{brnmrLd5G&#H>;OFxgscpMmezm)`;&d-dX#^+oKjM3^Fe0IzWu_eCCK*0s`wV$Tz;7`G5kCj~nR3i1;N$@3D%=(PJ16+e zU5bZ!U4apKB=IWO`=I6!rXrV%sU7otF3%2ClX{@&T@M$A8}TUw-oW;djmzrU#wlQq zr%gWApPT7hoS#H!E!Q%vp6f#lPgJ>L7R}WOjni1P1kaUm#T+aJ@L46*F|lad0;^@p zQMJ=4!Iz^XcMkqM7H{WmktLQ9R}(%x(4Ei@e4Y`sJ9%d7&KqpW>kgDPG%t_lDe2CS z72}X+teB_pTb9f?Jwr@D5&;1r!!pFk&fwczNXYVKy`DT?1~um}u5k--ygSevk(AD+6jap|bceSbjB$DB4S?gUf_iv5A&Z zFXJiQ3!j721-hZlvV)G2Bjqn4&ntn-nr5YoHk%9Qy{<#1eMaT=88i6^5pxKQF}vc) z#+84Ba^>2OX2l7urSFIvSi} z!fA)kE`)|QL!mjUQ$#ogrPX%5jTBOzmXwt*>!)Vv0AVY3lW7K=9i?C_Q? z%o!!HSMZGIfioPX1o#a30q24`r7@OeE_!2q=Wg)1$d;O5C<#I3`w@(mJSW1O0k8mD zm>yexA0F-TRep`iQklvE0_CJ&qfzJpsyJG)@e4b1$hYt!joFC0dw>{xmKd9)=y+z( zO{hL_6NCi*3^A6<*VsF_GGNY>Ac0;@Xm%dyZzCraw2^0)j%r>Lc`))qN6>I8GWb8B zsfIRycJ&E1_8MqnkvDGx(k1YA;Oy#X%0=Bx2kwNH`c#t|d0%vzYLHlofpK=-ZDIsX z-hmt4Ia2d2BM}-kSAif(8Y~)DYVHlps3ZOio+3D)Vduz>Ll|6c)xyH)lj)iYgeF9` z3T+e06F;mF+)(}oC`C6|mW96@7eO399LT-%pZ7ZdJZ}g=pO=3;%0E~|09k#!*QG&C z1m&|uITSFVaaq(}d6Ib7&YzhbRM`QhI5Pu~bXNH*fa5>bW=rEzvBpec?{#{Id07>H~VyDHq+-7d%D$vbjAoee#Z=*^<}21V-j&HVjS$O87w_A|W>h13;tBT_o+g1kchxle`5^ z_rzHO(K7krBIbplyEF2FZktIpW8=kvw8~OGJA%GiK!e7tvtjliK%ui}FVSk-I`|?) zOW~;5FA!UHqeC>VVKh@bsyxE12|rx=pL11+cTHzlP8W#i}k&T{gro%Gk+g)a<2f4)^lHvC3s z)*YBdJ8NU_uk^jvnnC|;=ootqk!Mc?4YsNsF9wWRB?We5`FPF+Q-2-LwJ)4gtXFaU*w^kIhd?*lzfujX8W~_q04po{Pv9 z{(OmbNoC>~zwY|z8;zlzg+aVBHdBJnP-TbDYv~c-v-4+lksQQ=!xJ+#^>|-*?sg}6 z7blkg@kW)QK0GP^>#b>Sxy9TV{D;Q*{=J#%BVHk2-M+cn_qU6}Pp9>#=cR`y%^%L1 z|2XS(Vq@cXULkgvd|U^me|94d@D%a&4s$P^RR$iE|DV!OUuyVnZtNxaReCf~BRiW7 zw=d?;q0hz@Qj3_FWh9>T7QEc@K}p!Mx{J<=D#Pd^Ob36CI)ZJA$J!}09-SCvIIEXG z8y42!X(Vbes!XQ0_pn^#84KkI5j)+bksFoSjo|YOGtL9UX0L!DB{sq5CD7OE(0&A; ze~UlUg|*fbWYCfFb#3!CKppYt>+m_6rcr1$tMT_}upKN%{FyLw&YvlXkg3-Xc0*?S zTkGKEJ_TQ;-jd$DAANos)%h=EZnXA0E%c79_bfl9x8(W!jb^V^uppRMOBXGduV+Y@ zf2$YDy|o)%{0@JPz_O#}-|^p2g^?f}A^y*p^UM#u6d%Ol`K4svOU?Mpd*vxnpkg1! zP#DZ&TVzk!t<=CPsgc`!_wjmVdb<)ktMgI3^v_CW0WGLy+DnAca;QLq+5rhlU@Y?r z|56@b3&e^Iap2SLB=)Uvxx?1jSyz(Li`LX~VH6=H(72NoWR~@WId4F2VarlATf{wZ ztAkkxp5^7UA?%C`v>XgZ1!nQ1;8UHs{!(HT)ONn8z+`9bAzJo0HsI`HW{xs1g;@+ZGvoKXrWs9{AdF0t)8XwINuaOzvrSpN9gTEq z$h6{G0r^6tCw6M+mgfk2he-(7S>%~e7hTlONoIsbm!v}JpVJqe+&SlW^27znT>g>7N+ zLDa~M%s0BG+{O$90es*bqNy(+*?ZSmlUwCkV4@+0Anx32i$5S zLeS2ixzLsL0HFp8(?c5zqoU2#;1dJF?fFX|h%Ss51C290Nm^rupk?^%ZqMS(n0w>= zT*ZAFoXg#-k>EbzdTj1_ZV3j4rh)+6M1RKd29uUrVnA<9%mfDDjL8Pi6dLb{KbL0* z88a1#iiqWPcB-!uYZp*6{F(c94^=ka=1cSMuSk3-`nsX` zea|*3zw9=jY*k@pPxi_`ZOuR1nE!FV0$z4`vr}BavhO-oj&@$5AyOUOS#?;;$SEr-N%jn=9r*3C;&jqRB4^+>pS|0_Xj2)y6nccp z>{7vyuawg8XV*DvB@O$tjE?ku*Cgmcm_kR#9)^#tXXI>b-WpDufzqFda+|Q(9HAXS zQ-=&&4v}HBkY3MwIa^Xh(K+g5*io=;g@Sn&B5MvIVnQXFS%-6GuN;AEN6-}Z@@E?H zcCd)#EUy!ZjX9TOtp(&6<|gdsVb}1Tu-Jl7i3N4BY8iMti=2;nw#t2_^4XPg!o&`SJm*dogR)K~*1%>AM zEM6p{1z{6SijvjAkU@fNgs%>tgVC<$&@h|SSq>76pE_t$#AF7N8KoyFRZLB-ED=GrJ@>7}ONCoA`s1XLA=}rc4m}DjICm zU0d_b5c{=4Ap!yd9<=0&Y`z%)d6LfBZ7RunLfln-nFTJi*_jx?O}IETss%^;kXT80 zDTzin_wkVg$zsmt??H(OFb2^mpDlrTImF=MgpztZ2KW5#=CV#sQ^PpWl6Gd>XWAsbjctgnczo!HiVkdJd>71!;~<{CCuMqlBZbU z6iB-)zzAyv%{hP8y@!Ve95Q&*p$YoE$309JY{g)^^ACtzzzZ*PHR0On^}&`j#w5m| zL<{g|L(t#vbkydK)aji5&89)=oeCHnR1T|zOj>9^;bmDj5FgMev;$tJi;f%xS|ibN zC|ySRj4+$6>y~L&gY2Z~j&*aHE;4M!K#BY}jOe;!u;6F7%ZWPIU~kYJG4Ei}j-3(i zM)cc&CzO~&)TCecf6!S=c}VzY+$3;j0CdRm&KOU976CSP-4X_M4-Ji;dKKy zFc(gIUVaps7cFaGhSou{l*{JgDy0Fx9Hk4cpx(c@Rv9}Q7h`jK=w(*mw&9mj@4_Su z7Jt@>4A_28$nz*c(cL43!B9ajT#PyEsDX4cO6I-}vZftjb2ROpxEXqfJUJx!jM-T< z)YlO-C7xvL9Id?JXi7+0UL@t74>`P_!h%GZ-aLzjG8|~kDls-5CFUqHZx+zJ%L6+j zf#&FghCsBKb0ZFdHuxL}q2H}0-l@djuO{D9u)-8!3g4{Fk*I?k^T(^O<+;x{6BaZu z{>f_WolfkcG0UIO_gYh*@GZ$E<~C@glOGWQVSDbAwb`@AB>yp&ZE|G-R(Y~8C~n!D zyx*2m`ire3s%a?nXFL30WJ! zHPYhm4wATAf4iUidN-$6jfa(Q4;Q}JUHBGae7NwHZ>?`ke<3F93p~u7%#0wg>YzP_|aJ3gcd*1mo zTYicau#fFY6--S;LUtdWmw!Gl(t9O_%k)Th&ZNj$Q(PwoF@ioU-#ICc!klG%U6ao< z%$Z$5Y1gRlM$e>N=H zt8f;lB}GV0yfn~AI~h}DFL72z9*K2StvBOv*h^^8@T~AMkl9gf)Da{$>d`7(btn`zq-w49mph`Sg5K&)4yisOF7bFQ+i7@LQRv zWh%J&vuYZA4!liXG{UIm7xqgFz0LOS2K+g6;doxv42ACH&(UsFGsk4*sDQyR%>GJFW~KRfn)$-I*V4#RmBS86Uh=n7GToJAAuwUW?mD^m5*i zmn>pS;4@$rqARvMiyZWTe<<72=bdS!l{gZdw1=S32hCBEAXwl9Z59yishvjrjg{HW zg`xCxA7rmdJV88@6N1msRFYs9LD}4QLQq;Zxg_&^Htd|T0EMYB$QYtckS3zv;@n^< zF%GAKzMi#4@ypc!@B~2oiG(s_&cfp)(?Sa}n*`do2AOf1mGg!a!tiJOW?NGTFOgy* z+lJ_#cP96%1H@cgm>X{7@8VevzALB1jg{bdL~u*p1u(*&*%dGsEl0N9L#M5Ta!t)D zc%EHVBSxVZb-Z}XxCM57= zOr-BG5$iD4$&cdpTux4)(}wWFW_Qc87j|Rpb3e2u2}j7TFC*=k^RtxCJQOVQ#bOGS z$_+`7KCY48m5AbU$9fn__ur87hAfv8$ev}KvQy#>_!M8#A@|+m%?{=j&56Sbe}&F) z2b%Ln9PgI{9F=P_mlklwuj6Czw2h3h31ffMmggNtAVe-tIo#M=$h3VV8H{at0eGMOvsk07V zI%9|BN%-?_N#941-26G(D)L}y!UGPfLQRh(lOiASXIQk7PM_4f9(z=I7)73&(^4|? zR;UA8))yB1+JK$8&q+AUz=z4epSdx37r<6;DEJlwTa0>~r>2mIp?T&GY!ngz=c>VH zX_CpC*@Y}$5?H~E?{F`zEXe7CUf|fkXMWjQS(1Qrcm8Ctcm#s(6wpGSE|t!glLsv< zpy!WPviG_Lbo&cgwJGKdK+Xw1(~GviWEVeMSVNgS8;I7HN5Gi#jjilK2#lDVDWs-0 z>hX(Zje&`Cd&9#omkJ-Q6dtWFJY6k(kIHvNe!Ne2OOLk~o~##slohsU9 zw{%8_Op?7ukGF=?W}t4wnJICq%=XDnk@ScFXBz^)UJj&hxHo zdR3MbS|Zs9O9;&tA`P|$lVsuIm4s3#fkyjE5>Q=A=yQI=u^}EO)61U~`%K=^l093>M$-h& zGX)qX_zQ0A99Wz=&_atp6Q&kB)@MoSvE5Q$o`%(6oS?K-?Bi9eCIZ zqrsyfy$*YkBGWH0T-ezH0s@3Zo{3H@^FxHd$+9D2cq!+UR=$~pUdB1{+snW zTIf$UOFti!e>o{3c>eLY_}8=cKh9eias2E4;y*6yI9GhJt?+`64(m@2YTwb(0bo}0 zS0+d=j6on8`mL~B;JnD4TsQ+OZUV9@sJqB3ygU+O zfagaH&qy!BbCT>3QUf+1$!>2Fn_a?{nn0Q2v@l7kaiUG1=h~biq%Jmx3Su>`7qN+! zgnI=Qv2k5%ki2)tiQb61V*&Z_!8kJm@I?!%fu`xvs43@CQ}7u|3^FwY{qZuAdqeT| zq;n$$>ujq^K3ZF4%&?mJdWXV$6V{)#!pVV`1*}ORx|aV2nrBdRup07zRsclx+s)xu z%y^ifu&@cLgRO(&aO)V^s_AuuQV5nkqu(Dw`0>aexUd@ATR#R zHy3NR@_2U>P;ybG%8rQ1xW|R>I)Cm((5RjH@${qQg`>G2?20g>XxA5+YCd1D@5}CO zvK00rK!SGj)<`lc?n(c7|AALIdsvHLyODmkA?Ihwo=yBr#uJ4k*FP)Yq?)wQZ&hRO zR^iXdck46nwql>G#evLh|GYB$>3R%eEO<*?mFCDhoz&-BGyGJ3ww3;DBQHk1nZhHQ zk8t6=IAjuWkN>T|-kvmx^3;c`@=2yO_%mJ{UvFm-SHF%iW^)qBG(nwSYma}pIz(k$ zmqEKxctLvf6!Kv)v?O>qifxtBjXg0^z?PGT0G#IEZj zXZ3;0THk)T52K0o^sS}j*y{WM{>e9AA?^ zM5tURj@~Dma|b2;Z=E@!4Ch1d#S~5TVa2?fyo;kUM$p2!@w+W7GUEOCpFBIR@*)oj z^b@?D`MHKL_a-FJ2%%4^3OjhxAh{if!RPAJ^P0S)PpbS}Gl0iuc@%xsSl@PHWGQ1t z9JxV^IF@Jo_X>B8%6E?DM^6=RF<{Ovgbpk?B!M2{ox&yY+{@TOQ)l2%g7CoqIWXS{ z_0K&jXd!6zV&>1R9yZiiju2$8I^jq=})JHMP2pPViHueVnChdVJO1dZngJQMf~ZYqwyQk#6aK5?rs z`G@ArE4A_4+2PwbEx?@?MxXcJ@SuLz$aBb|ufey7mkO^bU2)p*keUkf0XOzt>PO|_ z>E1%rNR+wOIA?`}38EhcryGCvVL0{mJe3hh2O4REcp>YKCaCtk*&9^$`mPTn*i!!n z4-AHJjZZoyzR91Tt9dn3Uz6u5T1SPMiPbLqWf`Rxsz@q;kiK?+@+BcAM;2sroZpFPjEw=$1O2HOpOJ&-^TzXFafjr}(v z=#iJokV*g;v5&YW}wib^EJSkyMm z+hK9yurq}lz?q@WLkyprld|1Ff{W_1X+Ew^SfT{3_m^YKrSYw zFi72;IpP`+YbPe5f50(QM^84B)3wBu+ioCP#7`JZ4XTAQ!P97MtCr@grGv&@3~5iL zzMh~*&>XWk0?gFZ9*c+@8fPU31$;?<)IinmX@JT(+mTiUWn20bp-A zO~AoE;{D;d!3QivYQw6!nVMo2?qk51tC?HyJtgDMqRLl9TBZjObqYC3x#+qXK3`P> zL5mHJ*0X)h+#mv4R>Sqf!iMOglcP(pckp0hc(sI=2&@$%is$VhEDqT-?C!LYBuT7` zz85XAWfW}?bBTb#3i&$VHNq^PX93j+K^s-JUCP}7LmtbZFfnIh_PHms_%pErvwO|d z+QJN%61WO;Zs#;?Nr*F(kY_a8&9tnZ(L7hPqlLuy@&Z>OpuxhA@Ww8(?GaPTmH z>BLdjRIiH?Cu`WaQn#STNw#oik>o`#Sq}Wjg+q*rqxB_qMAsE3(fKp=IUQuJ7TS4^ zqFa`%8XpohmF6r&%bN>xW<4=XU`G%-Bj;Wvk|W|s-TY>AK= z_G`=Y`;{2vc7Co;ZxaFob1`0-$q4PDG*&`0587Rb-6pspbH9Y0DxBXax?&{6hd8L? zK|!28@(6$pFJs4{L%2HgVyK5dn~GRwI5Ge+;LLc;3*G5mSy4SUQ#A&mzzDz^Q{VD^DRx=^C$iBzMSQG|yud4}{I~)Frju^?+=M)*XUiEpmSd&# zRBmoaX6epjd~W39L?Hw(!=DjCJ8Bkf#@^W}v}v9x574w_1go<%rPO38 zG3~TGo1W^H2_Bk0z@&XCkMBB)Yoa2)*`34P_lM>5H>=67H`70?m*C8}IulzE$oy=l z{^MTt5%M|AG`7l=Jl(DVrO7~X9VSQHh)7f7!ecU!XK1zqVGuMW@J3IdS~A{_^Jli4 z=u%kUQs2eTYzfup{8{jJF@yM-t%F%7w4$}fpS_yErdfZ`h4;v$Fy+8w1S|{%1-47` zOjIU7Vh?|YMjClmA>%q8jWw(_+GjdGW=GIe1{Z_$y)T2Vv>;9{ zdfZI{pMlu&&_JjhT0L_JH8ROju-BKsdnr$zX-1A24tpc!?D}Uv(J?hOspBeWEG9y7 zEB&)X(OnsFkcd=h2s+~knsY(NpL7!>Y6=%`px0es1pvYxfwCtb-c;$M5QkrUH z#H-O}8|8NX?D?RYRi=b4SPj>ie@n=}Fi!^1t&XHQPkg(UVv)H(FkZ$0!4@%wftweH z@^mD)DvT)!v@B#9Gu|2zXLkDz31VTAUnOJZtafl#XPAeeO7Mb3t! z)w@ZQ)_N&-N=CH=GEZgFY2 z866pw&C?ybP#18D>zsYc;nuHWv;+nTebwEjEK?OPE zU%?7Pbea+&UuZTjStQ8=FAI8$;33cBa;%{>t$e#F)a>H{_dUb~8tJBtH6(KOa<5?L zDz=&(QiCK;vC5**z#?!ra}*L6e@3b;OAs(PWC;MpNSseHV6kpEvn!d2R|qXf@QgRe zYL#o@l%8wH8wBLg+9DU%uEdtXC;tjx$Qs((s*4KrkE2xPa=<4a?&(8#kf}_SVW(Rd zXjH%1&DgNz;Yp!`S!dDW%y8Nr8AQwWS@PQ2_uDNki}7c9BO?qBRh8=!mnrLpU)b9IdA^^y`}&4dh_r1N*^(jy~?57o!S0yAhrxS1SZRzIZ!*-!Om0wFH^w<#*g+;ze{HeeEwz|XA+jE zp~czNvh%`->rUd41Ut+6pgTvNkZSCrg%-X8Y<6cvO8JfkWw&<2xP z0Tz(^3VtgWXoxFz_liYW;NpI_BO_?8FV#4UQL!Ztj+WqAFAIdwnHP86=j*tdGv*S$ z!88Ik1Q?3k!hXAfKAH9d&b*XnwE8Ik^I9FM2``7-_|MDuT^l8qjMluMIl7DvT&@&! zO=3n2#?k#pOU#-IyiO`OUJe*9N^EPEjsgn~W6mH@9voo17R?+X*lMV@btuZ#mD0fT z4^59v7d&eYmRT9ycxDGpNs#Ql5>G1&&h=u1=9Mi_&(g7O+`2w6v2jc4%PgkZI&n1^ z>j+xx9f(RDnhLIE*_O=_9 z4>~yOy}BgOUV$xR!+8VQGYQD-6#AX|+y}K3+qY}8XrZa5Ol9_db?QNj;GS{7GR{S^ zgWj5bXL;r=vD#xo@u| z_znDSKmFw{G5d1g>}QCw_x^I~vNL>Mot9*}Iribw`29tb;DUb}qwrzJ!cLWq2`hRa zg)Yiv3s2^#mq1EAMj`OoQ!jZo_&g5vb8wxeplLViSY9tJlo}M=O4VMHO)9L-fqm%Lvrxg+Glj4)(g&)tlKb#c_ zBMAFliI1+v2Ti3sxE#N|mFz!U7&xio1wDFF=86Qi8v@R50bL!(e*^L?U37IA@wUQs zRR_27ve#fWv?kbk;QVa<8wjCE5uJuVliVhHhdS9??bItPncL6K^FO~P!;rt6RsQwf z>_=U>s_gYVnn}0tp{LcrAU#%q)!=u8!#a?bqzEYccxiR%8TwCJry#U$T57fVm&B3yo0;iAufhmX3 zIBG=j*=ND9QOsWF&%umrgfi~9n(T-{-O*b&=I#?@`&*nas^BB(p~S(WMHRw~lklsN zgykk+Hx7w~6j zc{p*;ME$ZG<$E(x{jkt)o51I}7bANfw`Wf`4n^eoMh4o<&xJgqhi{2XkG?7!9Nr&| zy%bj@)4QAbk<-pyERrr;5>-NLH*&-4Y31R@&>=}2QDD|*_DV4-uJyy<*)bb+@Y&TdIOsW|zvghO!6KQ8hLpDe<(V>fO(pAttMW$p>mU#FXbkLwdJ8Lc{8t6Bp`3e3Y+B>c?M{=68Bhq954h4 z=i#yC*Z}SprPNR@kfDdy64>Z);amY5} ze01G7Z1Beh(JHwvy5-R7$K`^;fPJ*kW-Q0K$Ix%j&kl633u{PX!LI?9?`JiPKBQr0 zFtVqHE%QTBmMaLJ)nxWc^r#Teyus)3-)%@HP0;5fpma&FnrX_iqdXyl5#CjyYSye{ z$DP>&df|fwjM+`hEE{J&Mi60+qfQrp?xKH|^D`>t%SCK4(mPT|C(M~7zSl`_RpRr> z;VRJvbFq4MhM0hCWwxA(VFV4}2l#@v4F5y z+U8E4B<1sB5lywWxILTk%V9fru#`Vs;@w991ijtPVwX|MD*j+2jiGd`lo5HxmqQT` z(M9KCq<}w%`e$d~iM&^$dp6(o}B-9?|4o4J)FHl6g%>ssBYc{sWG?>teP5Ugyt*9ds%S zd3IDQRqcxO&midU*OWXEp@V3)H16c{d;Z@S>Q~8lLTc+Mm5fnGH{%t4bYU%k6w3~J zfr|=_hN5VO3O@DZ?SH)@+DuIf*#c%mq%5~&k>OD4438yIhvXCK<;+wjA@i1phA~*@ z#%w{v-jtWnCVUkDE86UhLy3E=p~bol4ttwA*IYXUu?^>b+D(zX7aAAHHQFq@iFF7w zhRKTAr>#dP#NA?zxNmOGEID)-n$QWbh%|$t4*fcX_5si`j>o>3BKgvp2kYs1EwWpq z*n0t5CK*0We!4XG*>W5Zt!WwtM~zJ4C<&FXm%GRr$PDI^^w(fD43-RFO0?PS9avIN z3fL!|F!gCiB-0Xn((et%&sm~s;=@85kO$6%VaoGiJqvB-6ai#o%alV$9Xpfpyrh_B zq^z2>>|9#pP*~f~b+!!o6lt;U$dkaT8b8EoNor?C>qOedEc;M~MBWwAAZ3`0vYC@rX8LcMOLVfjm7R4rKak{oN1(kw<1LQYy5BG@(hL42V9lH^~eaVjgPHMV_X275rzY(r*ikQ3q!O zkRavX>=5^=jKxRLCPL@~RJ-LTM-2+OdC0@V5lG7g8ZK>YT%=tt994mO=)JDK;34VL z_0p5w%1@`orw66K9anz6SN-X<%Qw`&oR%?yetM`I@5#aP_xs%+j=-=LGnZ}xlOG>R z+pPKG2rYM!hAE{R9AaL=wkCTv^9?yFYc*Uej-@R#GG7H2!PkNJ1x)$d4PkR`9y1EY z4kG?wDUK*tK?z~eT?{S~0-KUUrzIZ7K?sbj0Cv3lkjJ%1DXY4nwKaDL>nMB=!aCqW zjC}#b&lLVSGwa5k!=5#h@`gh~!cDX`bNQ@Bhi%=QX{QwS(DTk?xg`nk2%)2mEQ^tHVG{L0>(`L&d@GxFyYc@|6+!480?G98hZmgz1Z6FrK%YvzUGW znMw5GiM(L-a*>ulTud=|r1;z|ys*%-;7VhAHeKW_&TOi6*2FL6H=uGjKUV=^|5gzJ z?Z?R1`Gr|QRt@k+d@iSJTBdhPhQ#G)5tMw;7G2j3FRUHDB;qMH_ZYPtCVKaz-u2o` zNdq%N&T^?HX4FdybcfFjZ3Yi@I0cTvrIidpi=y*6z>*Z&EFFop0vE%3oe%2@TDewR zAlek&t-wh`@fKN3BmA_`%a*+nD-n727Z$YEoBY*)#PdznadQ%b-Wevs4PX;2f3w4F zmV6u3T$cq0;SpuW(L(baf4egCZf(|Bv?#Q!p%FYw_KYvI1kz;Qv66RcQy+k!*JZ)+ zXH?K@6Q6FOD^6ZkCeTy8wL00~NICtCe?cvu9lY?A44#Q^CNsw9`|FuAMN`8W~y;ln#8M1KBey z+7pd<7v~sIH13?&`Zja@iwLw5ceV=yKklTyIVgO)S9r9S!(K-4nIF;hwr!hm$OKq?<^-?UC-Rbp<*dHu#y-?A-tKq%m3Cv z-#?vZIq~UX?WdE;QXR_LWKmTx8g@k{9RD66|L0$ah zw8VIRIBswhPid?|kl&Q2;NGLF$-b@hARf-0L_dDZXA6V(Yj-hWK3o_=ge(eO9>Z`$ zYmP@Zo+@EnLKi}_ASb21#dQB_=I##m&dHH(dU!dBa(iek88~ma|38ClAzI~syxqmdgt7hYwfTR&UVLXUiyb0@qQixWlhOz-*^T%h|1saK4m>-U`|G{R zU(cJrzFFeWs?=ovZ2ukLXL;-ox$)b%@mrnAKP|@oSe?98pZZgM>J>5^B|;y-7QTc< z#&a$i5jPGPm&0KPxgq|#M#&8SD&U|Wb+#;cg*fwu#WbB_sWBqmb<~vA7yfnlNjbEw zmmhkARzDb0See~xBZ=yS)cS=Lf>Rt3dsDxahpQXDzA|=zF*^75t~oJkflN<3;lKj& zd1K@{DySHu$Z#URH(=`cvh-kNC+e?aIYQS9qgPbfN7B2+=GvXEdkg(6fVLA(rl3p@ zdG@^VXW?j+^SXjQsh+J@i?)m~oKd(AcBQWY(A!8A4T1bDzru*DktP&v*CSDK|&hTOm6AX6E|Ma5c`J2{Hy%~8+#`*?ft{n>%+M_o@L6YJ*0%sEMwEnu z_M|?pucLe(TP+fsZ={@hrN+N0@lgmETn^*~QzePY8hjScRaiO&r-P3nK$YN`?VR|S zWW#gg#cV$iI4=k3iSyRDgv!kk0uGAKVS$TBE@lV{SZ11MGss2k3W@|W!!uDt3w#lz z4=9aJxNB$~6)WHi6)uudBZ^u91?(H!$luD&4nmt5Ir!B1vyT}CsnB9-z;vw>P&+6w z3Q~8a)=Z&%MyFLS#{&SnChNOFp)qIjoE0QaF-#4Ju4K>;k1nMr5Xu4u73(lHT$lqA zj^SK^5ckBQ4Vpk#*2J2TNr*LN@n?k^bUO~Pt-!K{+hZF_omJ={+L^8L9XaR<+Zx)1 z0Yd-S+SMn-o5=QQLl(-%oeVCu%LVY-s8DkTx9161E`}Sd6)JJ5pk=!;K@7NBc7hiN zV&>4`ZW8RgU)5D`w#<-pby{)s)k=(z+f2G{V6ynLZZ<)3DVA-_;?F^04~y0`{S=$8 zPr>V3Q_@0vlqSckob8{P9xl<<`ANHD?Dht+Tey_WwJcLE&8N|8r-)$7l=B$ zP5p3fEld}9vhvf;pGBL~V$NuiLD0qIG=LYw9B#tZdir3wL^!|w=G;E48|5?n842{F zm@~=wvw>)QISPBNJTA~GU(6$WJ_biG6^@ow4P=ci^I|FC{JE8l)#vAGxw!LZC(l>> zIfTy=KO35M6*Ry(&_bI*2k;r4c3B{Le5E{nwt~ZXdasKmNdB|+xgXXrtVp6Y{dU=b zZBg8KL!kpnj%{WBYZjlSw;&cK9qk^9CULia+bDP4Q=?t>RC6O~SW* z(M~^H&OP4AJjUMH>@sMOb79NE(d&{)b0Rz(VvJhY@OTDHO$C(Cj8^cugW%Rx!Qfow z5f#IqfzQ+@sb$$a914q^Vp zyhoTgM_sOLyjK+3&qDnCDW=d^97B?wMVk*ZBhiqc$049b5$$4NdZAgz(ewrB1?PIA z9mnzjYFB{6kRi#T8-}#d=(t!b*BA%1Jd6*>F3FE_ibiE78*0kXeMF(vOHT=l?3aMk zX<0p*3kMkzvS&GOfR~LwgET_~tuTlNZ1E{Y04x+q64+GyKGWO^=c4KBnQYZ+zQ?rnwI`~i!bh_yrodd&@PC~6CDZg zn&z2P=+3mel0Y+T2=ga$Zx(Qlk{8;p4uwcrF3`v$p;Zz|!kOh|5$GzZOgqMVWyAr! zG$<|pOrddR;Xa_Bqd!yCN@VNFM@Sx$EH4P~oua(C96B(3_Bv6`UjA%(O~)>Z#%c65 zCvI%P7P%sn0H(l4Bu2>iLC0_;nTM?MG9vH~VPJG20E;Zv0};{)m%}cxUl$H>E+kW& zioBm|nq>GJ$QLCu6Yt%)4*+0jjIMCXUUJ75N5of;kt|sE-e&%SfvnUG6?#~ zp~T4$X($Smo>fvWAnr986o@N|+gHBYU3hj-{pGMkM6F*=YJat!7l{nv}y zlY{EhllIeN0ui^Kg)kM`T-m3GbdLq;5OiY94Z^5T#&IP(Qm;@ttxrGo14 z4ZA6OwMApRU1D}@A00Myw`{8p3j&^%rq{&45wN`it)}lqCk$}~v1$Q$_=p3qiXg9fBtBB z9#qS@OrH_5IJy(?V8P8Bmuw6o7S$>DyuU(HkB*>2eKjamJ=%Ea&Q@4o4Y-2`n3s&V zuN5{M5UqB1oCd=F%*E4d)=}#hy&-Cfh5j1&{-?toMNZRGbw$CCQCi`>5 zmZ6fk=b1hWr4pJl=In=jE|mN8?iokHFlV?fTW8MEu4V9E=BO;JjVFssyXHCK&wehI zdy<6BIBc*rb{!m|W{?n{ldMfDST(7g8Jn$qgZFE4c3MtJ%=} zU~1ShSop!p;2Rxc%1pe`8hNdblzK#7#Ep@Aplp*R_i$q|XUUQ|F?4kf1@n0gs6 z=#}Ix*z9s@P>#^4A?!G?;3&`DeXBF}*YncTBg{7n-yh|FI4(sl9B7^a&hTdu>9aaX z`e(Gzr?qDnkms6dq2&nu=(K?;^rQVE`Oo&t{C}r9eFxJFyru~wxRSer0SI=@Q1Lfw zgT(KHLJL8c%oG|BU7aLd@n-|kdMQvDIxOMsJcPXl9Gj*TlrS;EEUuAf4@77#&=vr3 z0I@d-QS`Hu`G33tKd=6HS^mrY2LF!Sug^lr&&yN#ShY0Np1spf++NF%ozzEALI2~m z(qB&N|9Y#<K|z57J^PpE+k~o+Dc8d@ZT^wF$52xW;;EcP4=Uq#a;vL zD0pzcF#vXU1Z`qeL202ab0i3Gw1pj{P~_0JfdvO4)nIz&4vi2R`wp7IwLp#{!%Mk4 z>FFVyF64S)Ce^65Wuc(3gHkff$TvweH=6=>){HYTfmenU&W4($ZB7TSzh1(Y`qY$P z2lbsl3vP=)JH+M?<*nSPw9uC5x08VxV$9p$$ipfvLZ1da9t3%8qSQ71%*c)9vK4o2 zahX7-rfQ~K;rxu~it(az)~?Hg$%y)*Z^xm+43;U8p@)F8Y&QVZVdEJU*7|vYTI> zpCCwIF)npFcZ;;dyqJLTYBdy969V5LhuKQpipAKI>C$34rRjxw*P@(dE=5^_6^ z9|cGm(K19DA+%_-nXWr#dRFwhgol&|7Qr)vghd0i@nfe!8ez%@bwvAv zIeUS^7YBNUks8)>H#aV~=k%E1b8NgGQ|>7_(JHy9rm5Pnph;`o7*xxw!MW*QTC z^%#O4K4zTQgEYob4&Va4SDGX~DQ^>2u!~6y!Md}t5!}_l)I9sUmEnWN_-=J{x5T6- zWk_zGJlq4oXP!Rk-m!g#Ka=Q`YXoG*gN2NRn+%;dPy%O+MQ3(VFWc=(eHvLU#1>-X z*on7_;9q$!yAKAKS4!h-teBd@lzXu_d$2f<;Rae_1u+zS&Y*mD_#DZejXX;Neb}Cd z`of`A&8^X4$^Qd+~$4VASQ1WIY z%u+;em=qZ_y;UZ8wMRIGZi-j4OU)oz9dy)yYqx!tv4$zARRML}YUa~citgagKbZNm zcf?UilqrEfoACwwnQFx2qXi(jgw05f;m_!Ak@#W|Dngrq!IBUUyRR~8WDv9@(AFAr z379q?8k@H>coUN8jt8(!$EuE+$&;`hAUy=HApyl47>*J0XGgCgY7UgZ&|^wm4()m0 zjlgnL2>2C17D_eq3d74zr#U3T?8$`6t`^qT3Kc!jyr2QpQQnF1$L$2%7>rDcC^Yan z5($H9P5&(4j4K>139%eAfX}q!y&!>B9{9|6<=r@q_-KQg&XCbXW5jKuXy?zq%PK|u znF(^Doh8=`^|Hd6Q$e;E&Yy$D3=uS!z}+@*{BY*XGK%(_1&6PgpAHyToAw`ec(PQ@ z0Y;X>8Gx+BEX?Eq$O)rxNK2s~f;@*5S7eEr5CEvGm@S|QDLB5+=Geg2!KUw0%}+#W z?8q1X2|5<0He3uJdm)0>Q5QM)xNuMiRfA!Qm-03QU9riA)h507@MmZ+CE?hv__GaI zT-rt@q|C@s>oGPNYcNRSl$m3IlUtY-Q0puBBwoQL29Ef%5VQemJT5@QLbAXymp7Zj znX!e#lO)^gMA+F-vqa7$I~r)7y&bknreh45wpcgBTkOT$cY(>2=yHSuBcp^i*!Z(! zEArZv%2!EjT&Blj^;{`h;PrtwEBPZ4arp%ArZ3**w(s5NamM>Qr{7DfjA?#oys z;?I!~nk(fA5bgY#j8&^cRw)sWH6$A_*dX+tXfvH^kmhL&+!J#%CAP1>G>~oz&Cehb zXf-SFizb;Zox*ixxN*>McW4C3?g*`6;CBJ3Gpht(CZ4xYI|{O$8>!4Zs~`QSFM{hY&nKF_{3U8pZWIsLH_*(yl~&|%t2on6|1LrC6Y{whqL%>J)_IvQf;%U z#*2fcd#?+)PCwoeV*PM=4#6&xm5EVlHjLe%P z3XKX{37hLq8t)WFt}$!}?iSp!=)gZ9+@XbKL?ur9(B^1~yi>t#bN`?MQ5~5M?Qm1^ znA0)?5F6)lmMykex34zkBGQWmXfQQ-55fwNw4MgxF^3Uq-YViBt~>(%jS_<-Q3!kn z+T&aP)us%_KV8qEe`cCoL|+iQWG)UzAMODV^Wbi}GikINjNo&krnp$WNe_r6f+R*= z>rKjdop`GG2UE6Gj+_fW+G`n!x@wHKCiKx9Joz6WYU9`m2kZN@GI%M|X zdP#)RSWf0;e*F+Oztf1lS4jh+$)kLJAH$7?^6+PL&aQuU?A)t@mKM5}hE$`Me$YV$ zO)SC`sQJPAh-@vZbFk(2R%gH3j02WG+DhTV@zrkS>wW!CcuMB*+JbGH4zHANiq2h(SJ0`%_ zuQlBf`pV21XlyAm&A5_41Et}{E`IjBF>2|Y4Ppm1(M3a{CGHI(9tuQzGCCa`rGzMo zC%{-hcYXM>dH1w_cRM5B<7T{{a8$n>6+qBG9OS;*&q{cFC_aoVSPGN09dx@@6O zR`A*V1>o>EdwGaDpJXZ!VQc7qd-SM=pxTU}(|6XgVzYQzfOF9#xA{MH@-9Bx_#Qty zEdrm_{$cUa5nEoviEPsgsy{1 z0Xwf|`thKqyUpUjJGH^r>wVa3oK^3hmo0Q-Y3g2O8qKo;6dHN<(1gm@#$KxruIKt& z@xhJs9rW9aiP3F==;0UgXMi&y7tvia$Ia}WTI@Df*#Ep={qdYtsy)7F|MN|~**qzy z_)i%EA+Y~`ez2Rm%W5pmkMWCz3lON{j2Fj?OPX`MZ}-U_pSqZUpgxnvJTtSSv@r+qUNY*@Na9I|5Nev z)w$0tmreOKS!NDcNU}dn*W8ZX4-S%Uf4po8dn2*t|Yoiey7e04!y9u-z+r# z9Chv0d^bA9b~PA>;V@*!%RpmsW9acnkRttaRN@)RqjYr$+YQ9e1Fs|p{zy`5v^;XV zH2m`9@GE0OFRzsDzD8g&@DbwSHa^LMSJG0pWHn&B$ey8O07DC7XRZ#CKs$fNu)+`! zB~maVh&2lZJb~eL5JK3Ij4zh(!GIwf!p%s#E3%sIlmD{-EPk^Viw(mHLw0B~9nUu6 z6AL&hC&%PCkr{`KAp_=gAScS_PG;()GkDy_2OxIZ973xs*)t%nP;L- z*2?@L5kKofL}v($sIZTumaHm3qjnVnsw^`NE*}zTGt(d+!Dmwr%kbF&FYwmh9k|9= z`e)fMgPOynU9hvYV-W!7aX-Kom_f?wIX{X?2y*mxcB+$|>}JNg=}Ea*(w~XDgmdu9C&Lq^!@@ktoIjF{!k#z=OnPG#DjW7e5fyoG!4LEC@5pZTko_GGN z21TkBS}`yZ!E*y=3~LH^4l>-C_g5FN4Z*4!#cz3TtdpCT!-<6VvQpWq&7MkYEs?Y2 z#2{;=#ZmM|L(sB1AxNbp#{&Dy`N=};E(&my$4}TDZn}5f+e)a8xroJhUv{bwCXXQo zK@3sQ39y;NQ9z*()2M*sIIDa;^a}R%3ltW!{gwtSZMFRB~Mv6O0BWRw_ z>%!MS{=M2XitB~h0fxl=gYyP19Az~5bJ&%SRcFT;7>BB{F=?~0O`h$;yn1n-sHMtAnA4~T%7 z2Vtc!nVT8G?4mUvYs}B#!;G$&BtzzTgv1j?zM;rYZMAa58N@Z3rhF^-yh!`=BxlaS zRwC!Xf&&DN;f9xE2kjXgp`p{e?d(oF4S(LP!JKE|$s`5FZ`@=T8;pt0KAC_h{)ez&>+ZKi_EH=xQGHLNJ1bA~@Vf;KrZf?ip0csUeWHO(Ib zCd_!8X0vrf49SFlf=|Jr5%UC`lAJT6cLh7M4Kkr9+9UBr)YNSv*m_^UQg1}<^oXMA zltf9$W2J?*VFwx4Ija!Y4oePu#cY?eB>7sP)J4Z@aM<}XD3uZ~6nr-K41~}iXx~OM zW=F&TTPMRZWo64io^OFU>W%ok7(a=;J7CZt`2eIVuL)8}a&fXB zvbl(RTSgRG4BYT_lwsNZTKMIV-77@b2sT^tBr5nYn2sdbt8&tCF*D5BM($MBd5GYQ zq{8TgR~39pazQ>qXT?_VM~xd{mQ z4b&;CjVOW0;KuI1A(INi4%$%)Jw-LOYf@+6nCo@Pkl?66V%F+fu$M%k7s!5 z5%@m~K~sS_e$-A_ULtLdI^Sav&}y;;!btF}Fn^LpLtZI4Wh?Qa zlJ~Pf=p+fYEvX#FYy6p?GH+8HTe@f=ERK53V9G|JDVMquf$q)%0$SM=6QvGPYA~58 zM6?;mEPNW8im)20CJHT!2`8?UNC3PCxR#}`^D&OnKFkyR#j27Q@iS33l+5Wm))}xh zm>ab4vo&S$m588tF(;;0}xXR>GJ_1OwstH6tf zk5?DI-Oc~FSN!p~{P*+9-!HoVxNISTX8X%|6{FFgPU}w(>kO4o(Ge$S!`F@&ID*MM=8ShMAx*V6>>=VuTGzO=wFIGvi@jogzW zw?Gn(Kk}nDBXF_Q1*dP`mP!~$yO>(hZ8BRyOM5cuf zEI7hLl0$Q!)1yDy+`4)+Y?n;LpVimql?BJc?Ix=v`n|=#B#`E&;+GSO%Zf#f&<;-) zNg4fYD(|9bO0*6Z-qDdVDq=LopkUatZ37z(KrtYiLsT##eT`akE``)V$?TeEcCA`q z+z}n(D5#k?fHW@PERL-@lv^WsfFyY8xpg1!Ek53>eX*H%zYzyMzt>DSeu5}IR{)=Z%pY$K%dMgozpSF*8vkTHhNbhT+vu5- zAM^XLlYFC<0rL`q5PwLJFOpjPqA}Arsb|05Nq>8odAK|K`A+idz4TZ68BC$yU7p2! zLyWgPeAXHKY-8YFi^xrb5b2A?1pFBxG#EL8!=5pc42}*|&{XJw#s;O`k)tuiAraza(WaB-Adg#EB4*554>I- zIp{ks02cy}oywf06vp3(|6m>Pc}f94Qq9d~Oq z-fQsc?A>~z@8Ncmcb9*=Y(6`yJ-Mv@>y7sJ$F*HT*z-!FqW^mW!!ac35KaqeeQolm z!`MGxul#)3e7l=o7#)}yxK*5fr8D%Ggoe-acs`H3>Ph)1u42ezodiZr^>%H|_VQ=teI(Hsdh1)Bd0m?ku+*KFd+{T6 zwA;f`qqCy9(2?`!aPGZe`D#JJ`cbFXszv;{7cx7J?%nntwE>G)_okr2jj6q8Hz2Fw z={oVbYC)a<5{16e+HW;=quPshgGb;+hpz6i8%KYuyKCiUrV)v&qZYi5??&~bqhu(& z0?5XnuXaNU{d`FTpFI;)F!-Drlxe&haR^5by_y<(r84>QdVXTJG|8tue2jC_l-w5z zv1WS#U<9ETicmh*m6dGFzSwM3LK_*)ynxJXigXPu!#n=5ZP}3IF}WM*_j{f z&X2V+BVbjjh%+-xjaLT9iR)=yFKFjl5hE0o*cd5H9d)O*;LSMXS(F&&%&x{JBNsTi zw91%%m{qkD$Z~k5&>|0-0GqSCM0aLOKEQTV*ts_a{JE34*Uh;vG+i)^`O z(6PBXs~2@-gxR*D&1j)#KM`Zp`w~tUb!fje!RzuuOkOvV?qjTx z9w=vItIjQ|cPOdB^7L?dW|Vh2c!m^b1{nEfiD!goStjs~i1!IaN~}Q4QiwLlyK)dT zUu>b-=DRQ`cWrWQVGPxDZl-Txx(@+7w=Txfwb}md;?Plb2n&uqe8ynx0Br>Zwa*QB z45f3P_MaLa$p}9Cix1szGR*OqgXZ~+;RcH34sR~f#6{)TiBAAdmJ>^b$@$oLB{xOD zLCK!+dU3#gifltbDaz-P#_g&m}Vshtb( zXA;1fay7y!Dw*Hwi!#SVa`xi2)6Q=P8(i^l=f7{GCJ^o z?&Z%x9rI6i*)vTcNCrL!{5g~jJNR|}{Kb;^FqqUO%3{%wnE>su2@Cq$mjLfN>qpf~*1!5vhVQ-Y=}h8z3tDum4P9|;| z)%;hT)v%>R3A+rwq_*$qrIFU`I7=1~oNK#?s6+m2cFOD;vSz*(dC&|Epr(eb)s#0* z3)0z|`LNSw-v(^Chd)!^i=!PfQ_b7=40%71j5O5()FQe7UQOR^t8KEHFP6?ribBXx z84P(}1nq_sBoE|t2+txoWcHD>P!6UP?@aE{LeOwamMb8)fLSRs(Hz2XB-OSgA`PiC zVkRnXL|TV@wA8m#1PRHowF;3hhpbt_K^$UI4&E6Cq=;x@qQQot07}8wLbnY{7#P5c z)u2I|Wfia2IXxgIGMdaBTmryhB4vfNSf@q=TnasSZidRUmNK=rCRbtv;{?AMY z;OvlDoY}qYag7mXiJY6K+&Cdfl$zpBO$gq=xb=tX*L z*=xuM8k=j)5mvt^7A;UO0?cR?ZSecuHscX(b{rj%VX=B4Xd!w#U5jSbxb9ACA-$vr zm@3PgBJfO>Zgx5M!D0%S{0SdQYzJoP&Yz*R-jT+m5Qj*eW$qyf@nTl|xgCcqa`SVg z=#fL>=Q0n${~3jOQ@1zQ5#_K6s@dhu1@{%io?&3P&AC#{F2Q)kIiaioXSFQQD%9-q zY4c@jZikASY2BP zLgh7v#D|1#bSmy1)OaXuD4rcJWo!lJi9zXuWH1m;8YBbwl~*(RTLFKW^XTU1hB5KH z@UknPL;mc*SuC2>lk!>q8((kNA{LDiG;;){GCUWGGwk4khKQcYLY@(&i@lo=`U4C) zmUwL!#2@6rR6b0w<(>qB4sD!yi^P`;#>qj@PV9MF{g;75{^A1;?}sQM@gRs=_b8(I zp)(FFAnYC&+$2t+jS>e886`7?90Dd=3S6D3WA!;*H6zp<74gZ5BPVn{Pmv->%JJ5N$3Tf%$Vto&}=a z2wLnKM~=n}>CY>({IY$!H;0Mw8zzC~@9lfb(_inVzSzv*1^vlp?#rG0hb!p|g4R{W z`3e}51o-4@-Ps4rc>2wLxH|LjDEZayoWo~A7Jjpr{cI;rq^C0?+?7Z8Zt=7Ap|_VN zaejsvBe5nB;cGQT42<}*lV>n8z?l@00$BVQBmOt4;By` zKLa}-mSn$g7SM`6h|`fi4=Fu7%wcnVSQ$L6+(Bq}QR%za99+%y)n|!9cy~RGewa)@ z{vPYII70Vz=5DVQ27lPi{)mmUM9$^Mrwh)XWpD&!J}p7H9X?9}ZR%@B&Ab=g z+mN5nyZ`Uo9gLnf7H0VHmU|5Hzcb(0oVdGM=-;mqHY@q}%h~^UyYur&wm8#2HF~Eq z^#?pRAkXF4OKgG9;?L8s7AIuOY!LHg z^EIu7fImkNILus|a@4r<-e_0Nj{aeO^d+{!xjiJ->27b$-aJ!tLx%8_=&C6bP5Fg$ z>^UkQX*C$|=Ar~;Yi@$!FK;@CMkB-HGZX(^~j6@Sooq0mU66Mg@E z_V&Mx4E)<_{PqWn!+g1;n0=cY@ORDw`vR9a0EFNbh+a0qyXzDDLn=a)ft|@_YuvVo-nvI6m1^^l*Vz0KU`!92-6GB~b<8W3?EbPJHq&&)5#Z6u{kr&+fJXjD=7! z9%bahAxjX!=P=QN=~_iTspd=%aVCmlJh6dwV&>U_TDlMGX>_e_qyTZ%6bv1+h2Vi< zsROu^VmT`oE&mPJtn|;)(^7{No#OEM27i_Z0@&7=GZXYgBk;^lYLI_Ba&vu)MVUg} z!yXyAX?L1S1BwJc3YOZ{k6hIxzJob zyb zXkWefZO@Hl3(gHjhB}aZCRk3WDFRL6S;0jN?t}y;(smDUC^gJ2RGt~!DaBq}OyID= zKlf3R-{~{~X=4JhoF} zyo4{r%A+3RwFTimE1A1o7v2c)9O)h-oFzAEO3LR3b}=jkBJczn=|1kay=II*bom;B zxPh3r^Ni3Jo*Q^v6N?iN4T2^l3a%P}XsoJts^bKjRP^MzK5lX#Hug9y2v#K9d0q^S zpR~9EhUD{1h{h(C@^ktyL5>;Ih~aVD&{mpf`F_KbW&13%@w8C0`8;bE|L1m^z?6iE zq>gK(DM1yyI6pCu&vtIAIX?}&MdU1-@yxVB0m5(7SiVecHnT@dCFJ^;JR^9vX60pp zd>Z~tNI|eOsM#YA3NoAjv%_cjGe@02yGIB7S&<6O1sbMJqCPV0*8Ch`8Rw18LZV%W zONO1pLnF>M0L#XfrF?ea971UgJFKHjE>YK*o~Ok{d@O$&&f;_ zK}ugo+{n0j^X7G#Ss7R?;j>iA zk~$kJjs(v{oQLcYPtYKz6HX8)h*jL!j$vLW53(mD> zy*_~2GDx7MFb^8BxP%Ot;UTDYy>ve-4%EVif1N`2^Jj>(F-AdGfly1(V*+L&gm#)5 zZKd_aqQu0^K;wQ>4kk;2$AV93-&DZ@-43E@4L0kNT1r6BUf+esZ0Uk#nK*bk0?xjM zVJ~Xm`Lk7XM-H9E>9kDOBo6r{2(|(54IC91o0mI)bui26S`f3F5RsO>vq&tM#X${> z(Wxwq#o?;y&_E>wF?5Z0AGfy!v<4N|4^j=wm4=q@wcCQ#APxu#d;^X_Yr(R+u#jtH z{FyCy*;UP;OA-SXPd4QWk=Iu&S8?NvZnwSvuny&KV4E)Sx@V=0+V74UjtxGfUQxv9^16dj-8zz zGc`x_4nN_I;)ewCGqx;{1#|*68|F2fn2FoKz78v9n;6ynI_i`V0(j>f*KV2!vAvuiM z=gjs#_PID0@jek1uD$Z$*3x?!{-AjHJiVr|xP)Teb^IbwkV52udk|y0xH97K_Xsqi z0b_YV>_Q%DGeu$Uj;0}jP}cXlnNOFC-)_s8_rsQKnR#j;$u9I2Mz$o;FGA%|_H2yT zESJr(Sx=?C5epD>s0wyc%~?zeG|d(S{cu-K7rtoRlhQU@%c_PPS{@*ZZ|GyNh>c0% zXqK)O|DY99ghvHuH2%zO0GM50BFZ7>0=mJ`bSms@;%8n-kif#U=})?&=1AwvE^gRj zzpi<-)|93)4?#+E(Lhcmc3U#@Q@fmyU8XtqwC?cBhWBjC)EQaiPl3v{HECL$r`9?0oA z7ZVl!it)(t{7$3zhF>FUgb&CFMu3xpIT)aKV)^FqEzh#NC^o3XcR z(|pbhdH#?OV;j?t_GSq_7$9ig)9vM-+)Tc^JbSA#d$%@*!NPm(vHL5Nf}D*p*$y{H z+z2}2!_JWVv2z5X;i8oLt|8^g+x2PV&mdEIYxr4IFzl@Dz4q+g7Cs>|;)uHFYsXpi zI0#hyxjDj+K#fcoD zza`%5;nLIn0%p#iZp{;A@3eeF7SrWn%r1^AGN$Op2fOJv5fU$Fht`wVLA5wD@8)il z=dRtXCVsiO_|plV8>pQZ;Lq~bz=8v^eOy9u?ff~AJ)f8aTA>N?L_#uM{^6|p-DyP{ z?6am+)5rXDx4zoWz`b$a*q9$&nIFVdq@KC4Ul_Yv9=pST1{(vwcKJLr>)Mnq3RlGW zvms~?O2~g0?^SN>k^&KzQnGKj|D8jW}I25P9s`?}(g(f5#-ePW6%njDyptX(OudFF^zLHj-pcU*xSRRk@0a-B?sj2% zJ^t3x#GCc$E9Ka0#v%M|3L$!l6Rg$XGw!4J%wIng68Z(jj_@fTSOa z`t?JOshw0)A%dtJeX%K>Yfv;gByf6pzyXqtaI05{hT)m$L_ZodV({6>FmU*_OZ?eS zu|YDa%lz3(`djPI+tFaCLAgyt{MiJqQDyCNsEyPI_YuJ7`_~587!k=$BTP_ec5gXT$9P9h~jfDZEiPh9~kTODIAQ-q$DrgkK za>oTnTU0(nwGc~*pB2uJQzlB#yyO%DU?Y19kp|{P0?m)GWVG#BY(0*Mzt)`IuaEK# zzMMDAivR>INw9Hp0Ibj!MzRi{*jkL9zUh@q9+`jQ0rgZvd<=mP1+)u1{H& zLpu(qtUAjmE~pu?B{fNU6Cr{vE%ZSnwOLA3(!T-AE{y;=e@YO`Vh3Hedaj3R7qW^Mr3xly^Rxh|cg9zDM&*(Fnq4}zcx!pLhQeJRkK z5@*H@gC|8U=+itMyZX=oe+=L=T4)*6K%P6f;Uaz=i4h(aZu=_w{KNpWrjX|vRR&Kb zQ9f~vKB~rLvQeL4(X@aVj2L+~=1hq~4dUv2Aoy%#7;SSaL5Wdl;b_WHJ_|nUw?)1> zr@chGFwILMtX-;w88~e_FXs(dv>|BR$fr7sb4Zj=R*N8F44;)cIl>MiVCH3tiJ7%^ z_}q`6ok+9gL{~n$O$S@i>7LFy>@3n01beTQ-K@`b7UIM=#044<-Cme$EMol;hd&3j z*{nGj}TP3c5K*6?RsIEd=F(}|z>6RPaP0v>5~qRmKnl=t{HCu+%_mCHsr?*FEFUo0-2! zFP&H9L4(g&G(TBKw_K2)#%ks%&Kp~{m7fL<)i@Q$F8DJ>9186x^9{Bnr_j!Lr7K=Z zL$LW|8%tr*<4xH(ILtJ`E%65}upor6Pi+e_mGYUiQeZ114hPq!bB3>S7RlkWQ)|zw zaVm$2#bhLm*|2jEl+Z#G1{9j5Ai=TO(y5lkfbhk(k3U19BmFaZr;83kk?E2ktInU< zLZrQdmCLw;bK$5$tfa6bGH_#hhf6Dnp*)iV5RJgtM8yG%c9F1CXydf9dLScYEvF7S zY?%02ZXq@ofo^Yvqfw9I#>SkDKg;_YxArJ$$ zX&_he`#4L)`sfgik0)tZXg4FCQct{#~2iI)Hs12uZ z6uM|z(M2pNFs2Z1w{OW|P>ew{0!m{EqE`|iXjy6~WA+-NuWqst5?yMFKNHT+LK8AO zv0q2B#&S6%6vij;CcPF~H{r2{4db$b1zSx-ULxQx@Q&eV^vM?%90*?}gbt}J%Lw-a zkkYai1aP{pVKWB7VLUgW=!T%RwWL{SB1~B~p06|F+lYBG5~sU?^M=(Ii51J$Of^|f z_jXMD%$oRJp%VeoD67%OIz$CE8yYq8EbXovYk(+)E`hFQ7p#oI=YIO?bXq9PBFb?H zQL(_L!7;|8HFvy^`r2MA;Mk091yj(%;@-Sb#R3Am3C)(pp295i{=-{jl-!YGyl9OZ>O}jc|?jMw)7Q2uek})t&u7W>j&rdlAkOG2%5(EAreQmW_=jk!`zU%0eEJ4-LqR`%V0Q)fe8Z!K7ZUT ze9%s@!tMgiIH@4+Ewc+HmQD)iEp1szmckMAS6ij8x66=cZSjA$j9FonFoI?nK88@_ zEN1SjM8BRmgcr06p}D49Q1Cc}nNAt7C+y1gE=K5E06gN)Rt@!ag$(?ej|F&NYMu;DBdA6`4RgLQ^x!O_1X2i~#^6Qq3S0Tl+Y6t#`WhKLMjQm_+~>7X67e$( z83e6u9ULw3vpaIICI5D5_MP(F2Wrrmb2U!zL822<{{!=g21m;gx-o|r%@@ltY-GUK zZ#NV7>a*{(W(g+v_4dM7TlvrVm(2F;do3wXICNf{F-7szUzcOwtWO@5)1Ry-9v>zi z?IeKMob}Cij?BmFvAc~qlNpbml*d0^8GaWbQypjK@!L&#KJ(ubYe$IKmCul5sc`#% zvy*2B%XTQRfCfQ>mz_NOSs{N$2rZ?wpVBX}Hdrl`t*)h=rlT=Acr?an4FC&>#y8`z zG}?-ft}hIJvy(7zstt@254;`fulrU+y%YomTlf@~^w)cUsAf!sNSnl~l&hTcg-+1D5$9 zmycne?#BPuhvnaHmG8GFc9K_?Ca*VUuQX$CI)83VgP`A7ngrp#ksDDk!T$6jPqU-W zp946Ca5_>iW4l4}l72T2Z>PUy7Y_$p>$JZwYTB-3x>33K^Vpjt(40e5V{`(5-f~n^ z8RMn>?MJ+>ukxF@%WycDlmWfSp(4Q4{oP%VXNi+v^R6SrT9{zuV#wZ(17}wwhlK%Q z_G*mHT2M#*Q@*GSzkL~h7TpcGy0y?xEMLx_eHK0>-@b678nKZJ4hJK&_4INh&jD~Y zW005gXRvdWbU7|@T4v-G{$Tumy~35bm{(N((#+*v{scrv8~aiUE2z9bA6+cUU&PCl0Fy73UoLqbK7*i>b`~mVVh-kqUTMz0 zxw9~EP#8Eb5AS5Jx8|-xnNZTglmw8AaoGsh=g&HPxsPu{Ud|h0n8<5WL>`3csiXz8 zOoQW~eB!sJc{XZ?P}Ue@BYx1ELx_9co?k1ym7fJB50=w|9hZhC26=PG=l{4FSJKxY ztB5c~WyQy!xRaioKO>puXcYvV8t!DpwJ6`O&7!15NO@QrMo78e8pD4>5d(1~Fjgjp z42werZ7v)lU3{<)SYvofnB}6koag&}xo}`RY+lyzJ&xigy<5IknIF$3uNP2jr$?HY z;!2h*&u28f;=`b0IcXpz9VXvM%(6>O3>JJABC+t;BqVtQbRNu(6?TSe7ELV+=dlX|PY$|ThF2==pZkRQ< z-WLeoO1=w3HDDXSXI)K!Xqk1;j`3&lTQYbrpcBUDSuZ0HKU<7} zt=vQ-uS_#*Xlv^Ewt^1r8F7R-q(e)`jpIK+wt#c3bGFwaW%KR|!nTH4)5biw$ z-e6~LOPN%o$>#>n3>4=_3Ou3d*>wVKw`X`21^V7^Ps%L~$J{@*#sP&CIWR*{*r! z?&3+rPXlw~qqfL10(+b>q;n?nU?&BUK5Uv6nm~av%|HMw=M8>&x{G6&_7r)t7G{WR z+0IQ1?Pe0qr5IXh#Lugh3?j1Wbl1lOhC7#!CVO z?VcN5iKTD03kTgSVF%G63rF`BNc+pFwPG6mb15@R^gu$R;yYc*#VY9-7+E&dmM-A4 zgJ?(4nfaAYqp&+q}o2NZvH)ckaF0rB&*ogBu?4y7T|@Mpx&AZQCdn1-1zM#^Ay#vjq{8V6!Bhj#@R) z*~+{EqYp#SX|^KRXwd~oQ=c!3KXbY{atL~}s}d*1(m%UQH_%Z#!)M}L0v6Dfv4Bl7 zhM;An>}(ds2n7ZCMkt$Mh_{CVV5iWo1cv_r3g834SfGtya#wa7Br;BJK>=TMml&IH zx_EMcvQ0${FxQFH2R@UG)5`hTX@fN`B{pMoJnn4Vk*xDoS3dhuN}SLFpGo9lO~TH` z!PqK^T?;;gN=WcAB84fLxR(s_NL?mG&Nc-`2uDIeCuy`U4X9Rj7GEGDZD*O3Q<8*|kc{6-g{6SC*j7W2lE*g6fX}MWs-3-q8xA6fM(*_tq zHQ6!%$eYt$TLCp_H;=$Iy@;q=*!NT^2f~6Ks-EP91HKT1=ZFr&!l7O@6 zW+AlRDb)m-jmJ8PHO~qudtI4~jM-O)`Dy^HzX^lovTIJZtRx*lkGUu|LP0j14QSsT zoFJ|gLjZC%ko0)uOSmEqns9+pIFv&)1n<@$YB7 z-_L8monypN|NE`(@8>n;UM$3L*O$MTJZ--a^X0vkpk%L3TH##(B|M0*i3De z1j#jQlVpoOZx`qh`LvlfS9y&ht}dqzwBic5_GGjE-A?`cgC@5Jlu{a61FAq#QC!Jr z#iGHLz~uLu3BV~440*U7Y~Wp-=f-o5J$(C{UF>sfkMyPhZ^ak_Xc__4c$7qrgBD+8`6q#L9ywn!AXJIML+>5OLiuvJOOJr0e^jRP@g) z`Hy=163U1JY|EM>K@Td6(8^(hkvN5h?n0zlQuy;%i1W9#$gJ&yEkx!O)b&WFc`5MO zT3Qrc%=seJU@%`3Z9ZDwZ(T9y4;^VHt2s7CyB^Is91~Y1;)sJAeMNt*>n0(hP}TS0bO{ zy@M$F!63c{wXDP9Rbnf)nz%mVDZfw|j!qnQ-nE-b?@%Cnk!!FcZnJ^D( zi&WSc$2tQ&FwppR86V>@BE{crPyTd}|L(Xz6hinj`ebl4Ud<%TmY*IjK0RE(d;|(vT)o>Iye_N*us46D zp1t;HJB5RXRLz)a9G6fv1Du28@Yzta`l4L==LR*!pHHfE3geYR`)u*sv)Yd*t?y5J zgd@DyN)%@XyQztd*wA+JMl*hOIXg&r#CxUTv+}hgViB6{vjPqhg|IYnQsT0X`0AY$ z$8VL!(M8{>j2{*U_$+!kKD?P34f(Sa(LplcjMjQJdkyl8^4UTbLcHH9&R^$Og%E`L zt8rfW`&r}H^W|S|xBhXvc)FBD(T6ski-TBXnlFb5sEB$k1g#kA78HGm!myC$0Q#q<&8MQ;3?pxA-I_268 zd-t<02&c(tm!1QaBGTbZm9f5*p?yC++D1szC&e^1Q{&R~7zv&)`16F;A?ujhw%}#t z%~CkK1iEkH>c#6!zC;)8V{pFu;(Vj>C==E9%uBaX<%>*&oyX1CBwWU*!li|!{G~0w zwD6BAUtFE%u8UfB{%o!JHF`;RJ~r>MKObEz4qf8RzAG~g^M4k0em*E6}KO9mb1+a7NliOdeo*V6<+QU&6tqq=49&eZ_yXi8HNCp78`g`m6B^LGu+q z`cKf-)Nuy|Y1}l=&^(Bo$RU2z&`#B9Px384U=5aw7MfE)YDb-sy~?%481@>{8%v3u z88S+&(YpRQ;K=}IL1}z$NAUgyKZ-nOhB>Q|oFVxxXW8jvsvzMv>>7s(Lfs)rMJJ53 zTPzxo+s+$;HgGLZlGF?|yF#qS^w4^N%i%V^@_dlU91v<2*1%O4>*BegOJ~mhcCY5%&hxy{utuaPRv^E?(L(xX`eMtFAkQQ+ zUI+&!<0TYg-R#&|Xxa|>DYv^Bo!FM)b13;%%tVsiy=ob`IENsd+m!@xvYwsn=4U|Y z+>P?1NKcmHaQ-Q%CKw+>W{j6LNK^ZBx^r@~q~@My3U0+bPuHj26gMrnl`Cr(7mM#n zG{)Q>+z;H+#9qYOqLjLh_@Cg0xZK>S^Ku6d3dGOy+#rcI8#m?|RE$4iXA3DPs}KpB zF_z(`rEB-uAOnBatuB)d8E9)%^%#~NvW&*E14VQjck89Ya-xvJEu7&6?jqd1JW3j^ zUi8Q`rj#AX#)cN+!@WhkYmlSQAx_qV)5hsqPm{gr5P3%JEcjd*2OU$mU7JKSo}C$i zUBlHY=A~0kUaKbu$~e^|hYPV$f&lU_;r%MQZVgqO+})n#UILevEewKZzs>O905YF+ zbG)!n*g+_CAbUGpeaPdCQ8+c`OBv*FkERu}!*}@KD%Hi1>8IkLL;c&XSbspZ@rmX%;DI~MW2T1qsqp**`1tmr8avIDWWBcHZSOxZei4r zXHT3`$ztmfTS`qY=BHQ+J&$y~GJm+7KNI*(JzmY=gW)=7L(npICYa!NTa~}<)V|xP zJ>4un*(g2Rswlb1bLhVTdBzc1)i`8C+9|Y~b#U}aSO{H&c7i=cl`&Ob&EW0q=Fc!{ z5=v<-DbOuryFnc&Hv(qJFk4j9U&(nR_HZQ*E&rmO!HI%GIXsvO8vV1h(2(AZMS5gQ z9@YL%Vo2UaSQ!(Kz`_ElFy_p}2mEF=smh9DD9q><&_cULkI69i&)Qk{H10#t zin14!11R(#XPC3tor|J%RESlP`^5d06=%?aFnm}5nM)(j4b#@*(jb^ARdAHl^>ay$ zd!mk$>Zl9a}X5H$Z= z7lXBALluwp#L5JDL(L!ppbZ@fY&yABIU-?!N6Mi(V!3u!G<{!Khe(W27s6Dy-m*^Y z(i&)Y5xOhv!`laLxiB1|sH`QU(72M?*YQSil_yE98UzkA$Sl8tfYTaBq7HZsz#DK^ zixj5muP$+MwP<3q^sXR-tSSTcaRPFIQCe8DhGt7mb|G41gj=Dz`jQ>3tW?kreqlH= zY5?G@mJk`@xQmijAFv~=l{A+Liu?0$j5QFlV%;BE#GA9A+62154O%jv1nA zt5u+xacMa@!^$K)-a~_J(rY8VPPPHU5-Q6PTAmoRuPB7@{B^&wi&BSf$dw}G(o3JO zEq%6D0EQ3>ihx!GAN=L4_Uo-WDrh1}DSz5V9sT1;gE>n7eAM~&u>It)3DkXj(0FoC z!3UU0Jv(U0RD^{x^lr;ECyhUeE}Da|3e)&1;3rd*#rmXlIm zvhe%NBmD7d>f_}E<=mMFj6Z6L?!s(s+o#92!7vP@$Sj3yG~}BhP75do)v}&Ug!KeI zYim9yj6{gLC;AQF=H`?YHkKneGvE&s0%vG5*Imt;Jp0RyQjoY^>B2P0+;#W6^UNKj z%tWBj%uD0!rnqDdpDA&5G`n0Bxj;+Vo&()W^K5|yxnt=?y{{K>kCB0lb>|(4dv90K zNV`s6N7t(e`w{tb3cn9%@MlJ4%5<41~)Y;X}cyVx+*+g>|xclRJ z=A&lPeWa;Fp6&ZITbuo?m-=cm!5<(l`e)l&Oq<`W#ouX6->Wn6>AQ`@mutz-R^lM& zhdVKBpC9k1AMG!qnkEF{(}Vo|)f7Y*w+(3Xy+-`uj>O4QJJ&~Xy0}Mx!a4+U;vIz0 zKx3i}D!Ad)+x5W7SumM6gWzHd9Vq^6pqMsc&OyRtgI##9A`;3_+SJs67l-9t^Q@SL zPOy!#O8*=HZ3cr8M`eU)iO7TR@ZbEx)mGx#Mq%jTehRm3ehkqke}B9riww!3%hEiX zJ{jThll?{PGJZIg{RPr!G|UgSlDkEWvN1Lsyp6}j(&S0)`a$UmY?e>LiMZFv3}TYJ zohDshPF-!suk2Qap6m&6lYTuaKRqr8FQbSy!YmhP!_hyUHc9jahz`OLhAf&2fNKe) z&#FJ)YX5TDeSB0pEKRj%M)?$deSUZ?d!?1SvAZ;Ur#y70Dq|4EA}pH@obW)Ve-@uN zFAhQJ5(*_0(Ktm9Z|ARflGtku^irc6$$_=x5Sea5YUdC{qmCX~PY+-=vKk*E=wUB? zwK;ojZ*k(gqvo$5=-aK|Zg+pX)B5ea_m6isemHAOh1eY9|El*oBX`~P{6AOt92=ivf0wK3|t!-a}FzxK4!t!Xk^mI z|B~(V@cFrE_VY&Xl*UP(*U`RyxhNvu)@d-p0H0c6pTn>neXb)){L+x=2b=6(^de^4 zpI+ks?1cGZK^We1ix8@#Z3?WX*Y_>R+6H#9?LU`%|Iz+K{pFtTKgwW&UYMGBgCHQk zJi@3>NTg}!Qjh&D_vicj^74Ow>*q$dU)0newcx{MI>P&QoB3Ohm-6QbK09X?VGhF) zI(&YSKkEl!_;qULhyRip`H$@QmE`cXG(QnTa+}%856W^D4KNT4GS)IFtSk{+2Wv=E z64`!e8Ng>pmsm6ijx{qU_0(BIT3p;AcB}KZTCu&#^~LniQf#u5k}+~6K8+Qv3^$}< zmIX90))EvKa5s*86oLnQCPAS|2nYd&LWS9pVr*NboKLU&d6;6+|)1Ci(UsmPKm^tqBQD>lj?m9xPs4j4M=PGdI-8 zDcqsO{*xhwY(N0x8W`+u5bP$QvUxR=$Me~A(bL)@e+Bw+N@7~f*&E47B5NXN94d&) zH;n9=DN_P`mVa_)tdpAt?J9U5xPC#=7?D8lm2O3(YpgKE?8T;%CyCql{X(|;b;`m_;}PaxMb|qW1Z|w zH8F;j1j=E6t>O%3(L9fU$_3I*1zkLoTWgPr^YCJbi)NzPI*O2({cgGTZVj4u;~0Zj9Zj{oNBmtwW`uZr#kujd#o61v7<~Ak!u>g^XU)j7)Xp`8 z2a+z6_W5@O7TMi-@`n{}a_Po-y<)FOWb$kXT6e5xK*XS3?gwrF-Sd*gDrV@NW?{b> z6C1~FIy1ym!#!4sbN9;0oEy)cwXrh%8B37V*hXdkq?bYOy;ni-Ji~Q|aLT2*fzw3{ zB5e}r85chvG^cSdDb0;8%?}Y%vWzo~OlgP{D&uP&ZC=V0<2>MVd-X|>yF8!uRL=T+ zs}B&Qflu3{5)wSO5_=W=a8kf$-U0xhA<_n_JC} z^ERrKnZzL(s||2>tAN?XY^xZr7v?BgtEBf@g2oaycZ7(|c4GkqeY00kiFt8|KcjO7 zBLkUT2;G+K87QrCqtoQcs3~iWYC_Y-t|{MdrnhQ|-B#*oW#Mo+bG)40Y)m7JM+jZd zPm4JdjxaC%v#4@L2->C2o{#vm%1!)SPR|B~<`FGlj?6qI#pE=pQ<^((C3X?LAcJpZ zc9*4J0(b&@rC|>A&vJnd^1GF9cgjyOL*^M{ojl$hk102gyeMjRLB8|<2` zhwMB0lVfcb6Pzv;G)~bgX@~0K&o%%XLvWUrxC@62F}~={f7P28g*If(7FBRCp5+Dj za7ciKZ39LsI|wBRGnSGOf+p`;Xd};{67gqGQX{(~hdF7uhFR7b!pl%QF<#@Dfz2|V zN=J&=Ptt3h3y)Qa7_~CqyLaR*i)MRQk(_%j0l zy^`RKP7xhMTZw^CW3$jp7y>N-3d9NwL90#6xY}8SC;A*-vlh>!(2ugK)id~vV%#Sc zl{m%qI(DMSHXRv%mXsRVs?$+8b2!2Pm5V%+;I4wt8naVb?HYgP5D-$ytr(0yb4ViL zP-AS1pa$Wk6tXNNX3YS+YafGO2u+-Xi-j3kaL6YPn+0{kZv)vg%-J=@4$8toe z-fk4yD>$}|5VTK$VE`LJzHFHS8)Do-8kfxOs9{3N8fo##uKLf{N*VxtYOj;~!^T$TJ9ib z;_v4uqPv)&(ieE)+ryTofZg=X+S9`-nJ3m43|W$IgxUL5Y@(Svqw=fi{22sIV%Dq` zTP=$&Q^oVTVa${R8x4Phpo@rvd%I#JQ`A?a)PfSS6>qdKcCyp}4EDrn<>KPTHD){_ zUkFd8DtD5J`qyZu+$VS{q7}E@G^2e zFB^K>^6~P#yK`{5;H`1yFe6_J=h)s0!w^Q^Dma4XUXqd-#qyRwF>fC}Xr)QOXArdG z-{?fftec;^kzXV?c1DeCcp2m?3AFKNTBA_OM0=p@5)B{TOe!(b7-3-N6dJQ<%23axiuF+iaaV1Knyqma9r z=a(mlORO(k_}wrGG@~^$7TJk7i`JFh)U(M0&hv%5nX&oWaup!SMxoI~OBziHiC=rL zuz%b11!g2%Mv_Wk{w4qAxjWO3uLa$V-w9O&Y$JQ0fMf|ox=|~tcFE< zdbc!jzct1C6c+rGwe&mn8I;l=cf_|pL@doG16{pyfh~W&7K1rI+0T8moBC!a{ctqVeB2Dq_?Of5s)_yPH+Yc}WL1zSErD zUbu><^l=HSJ$$-!1XgpD& z&UMQDJbaE=Xh3&Egd0|Vj>%sPDP*U#|L6Q!{XUA6dfTq#c7*e;CoM+a+GI2iQ!$h;R!I~tH@&x82-5Oe@7 zoj-#pVIbmx4RaDka$F^NU*fnvQcRBKVnZ0uf}QK}sYU`@h6w@=%1hZilSOn9WXdL2 zs9Ew+XS@JdLf0jMw5X$LVHAJY{M^(|Y3x>K7WBu&rO3xGxE1O~;Q6<|^P8RrUB z&Q8|zXjUgy3ku-K2xW?|Z{md}R0K46!tMoCy6_)!Qo z_siEWcIWX|p-lv+0B161&CI=?=pVzVamffHm}i_*8b8<>(3%?MZxF!;5j>VLFlW|^!ILpb zzeM1Yg4;Ul&cX1ZmUw$P2QuZ>CCVPxPV_Z7g`k~l#}(9@i;P}gkT0Z%784T(CH*6i zP$0nAn%L{OdY^&?G?!R+vXaS$ASb*;*m<^vXgvVaBr0lHx>>X znU#*d+D55s{u{D!{$a2Bw_Uk#kc5scIeezX33H@vb_xw@M*Qr-2P5(fb5^Dz*)EzMmQNbyIpz`Q{ECs9>$7WQx?*IJ!Runqm z%)wb=<{|XPAz17fS;?IV4cLDs3%5 z&orel+n`5>u{21AquzMfMF6^;JhL@?4fU1VM$ol!U`|xa(y{Y?K}4M%`^d9Ll!LX( zaRQLYs6e1zK`LT6-g-$G)+P%*{#pWBb8HCtvvX!>gC~6*Z^Gb+7;qMewW5)LKckKg zrPL}ks2jBqfosn=uVxE379#ejf}w?Vz@OziA%-k|3*fSvR2GFc9jqg0-__Q?qX!2W zb9OpyjhosNcLijwChZ2fXgbnzi;4qO0nW_P`Lh5!CFTGC&N78C{s1V_37fbGTb82O z-V2Z?(dOsN3R?zz{$iyFAc9wOmWh^qwe?1T(F)mFbVBFP&X$>)m$T(Rq3mj2$bF4b z2mF~sd&a9bYqDrSthidzkOKaUoJgnF_3=OJ}7?h6!)ipr9n^ zH}hi3tO=+19N8t2_g%_aNv}q^yh_Xw`m1HuwrrF#4|xV}$|wW(p`H47drdGYSAlh4 zUYet@DpKCic>~01@L8bMe4E)7uLc)i=$}~!S*d_nu`K9+#Q<;%v75BJzVa|MVQ^!% z(BKF@!+y!bfze&Vy+LY^#i-%Zl0eh4;XB#n>LTK5Lb7)XVtVUKpYY0Wr~LbA=kKR2 zjG%wH4R&t+z5l;qn2{#x5@!F-ki!i?;ht>Ckx zSLiEV6Rq3_o%~;0fYt>mT6wJOqR@qdN?<9-kwZXHCJRdC_Olk`k^$YNK39R)3fy@9 zBvQdpEsn<(;4=zpXy>Ed*5m!=(*ul-3s_qS0!!p9CMo=D(Ad$Xm#Yg?Xv3eC;K^pS z5uPHgGSF2@X32mBX6>goIY}v;daoULMVg@1)5Pz)z?Ct3; zWwcyksj{-_!I2*h2DecGD;1UTR1 zR*B>8@?QCc2Nr_RY?gt;nB+g&U3hj_bP@8? z1L6-VZXkzXtsv+JySd}?=xI@Q7N_+g^xpJ^x%66ga5eGPdg>}}%mnP~#c_cK>MCX* zq88!;Twj4obmpbFofdw=~+K*Dm?vLkX81E0qSa7gy zlK*699w6LI46Y=HfyUj$)kb#U!|E_b97>fTs5=X*<*H2K2#r#mjIGSrIilz?&;|+m z$nnyEbkwP<%SjnQ6Gc%|z?TCGoe0QtFL@3AjHw798ve|rsxt$(s}sMTmXSdJblU#$ zxclqf7GBW*yw~}^->ZGNR^BVm-?I>qAGQWpG6N{J-fc~8Ee*~Lj_l_~|9&#@f8M$N z-)_D3b?cSp!tD6@ZZRe{U3{nfyXX1y`sLMe%PQc95Mi>5rU2wGKWHnE8I%C zZ#~nWk50Lial+=b(+_!xZ`F7>7_}yoif}L&0Qs_ca(@dUQPl9lbkTw+w9VH!9u>qP zL$=wkO7$7RONC6mLPRW`yI!-SyA? zv*^$F&zgMyp+C#_jf(bPGPb@2e6focOZxljKkDWEB`?iiI^Ea2zwo8`s42$p3l&~0 zIdzl%h(AX-`j7atW9I-qkG=(M#-OtLkg~jnv>PJc&C+d;s{PGt2k;x0<-} z=CFE3f9TK>78jsPOb-G>1BcQAm{9_bA(%7_i1K!3w=uofOx|rwpp`AehAVuMpBVr+ zH_e6u_$+nN~#9=X%vwDO~v17Jqx8|1-*2v)(K7*G^uCYOuTSRc!+x;bHXvN1&o z1RcY#+GsUp%q#L~#uP$c(r}7Gdpty-oLO^7+bM)gxomPV&UGJv>D`5)rP;Bi)BwU` zn7J6T@iark0d^K=mTX(_nNcw|iC za4z1t2)xHT3xdxuUU@jACpXG4I&k{bS$F&7lT5{ye>40KLCWRumSbSRuLLx}QnT@GVVh^H;D5T&x znql54bhA^;4)R<|;=3Ei;DUw4YC{&{kmrsopT)+xJ;EEtc(}E1*g4QJQi1QBgQGn^AY5{IL8IzlCjR6Jlbq1wD>Sq`W5l~Z%TXWPm(+Nm}5QA7jP5m7It zrn2#=t1&>Q!y^JL#r;x%m-*|Q|sUJ{*dDrjl59aaOVnd4V02^V;4 znn9R9`DQ?L;jzwgeH#dmfv8}FJ{OJ%M^osm*b%WqV`rxTJ)_wda2V2S99R+GOzkWi z5D`uwp`m7PEuzhyiMAXy=xrepvG|a7S`Cs>JEmB63JoXpmIDZEu-5>iI49kacl~q7 zpB1wY{%qw=r!Ddt_PNOT-Ic=pLj+?@y2k(LMQATEWLC-K;t_V%0H|YHXa~`hTx0;V z)(C?aq{Vp^v|^qf%$l)ru0U&mpb@n)HqlFmZ%{A(`zdv9$ebOA_Cql8BpUH{qKpbT z-Gs8TQ`nGg1<8lOylf&YqvX&Gk8wJGrUZKsU@}++hvdofc#WUk8sRwCQ-XQnTP${@L3>Se16f(D%GYBFowgNb4WT}RIbf;Le! zvt#0rXUMSdEQNb@k!mnC+|_nDO0&V8u*nUqiwGq{u?#eJT{I;IPQ~9I?=;!MkhyaV zFI((Cg(EcDd{Bcw!%LAsOOvb+fl^=76sL%0(t-|eRa2L<_T*{Kin+;^Q=we zLHTc-b$>an|9sYhJj;dSr1sNMKMPp6*KvP2Qx}O%F{-r+(=* zeL#J<>nL8=9Syvx;!PTD!5r~_21IYm7a9pPu-fl@QD_sBLk^t^I;REkIpqUEV+STr2l zptO9XEyXa7MkD=ULxBzrO2poqYj z;D*Czt#J&N-)<0&aAY%co$!2XCJ%1S8`MqQ073I<=gs2egY_hLGO}uZSARY4@YYZ1 zjL%Pmnmv6_P`~p!iLSxUBF~hZ)%i7M%TKhR^sS0W_;LB$)1`M?+3MUd=FIqJ;F!^h z4X@^IyjvSSE)5-5Zb+Uj+h?TClP9=9%iLQ*2^lK-ZN(zQi$e*2=IdC9tOCzd$eu@q z%>|r?AkwaUX1ANTuK0r~DW&n^XeX~X($^7<^C}b14WbGB^KSPaciTUmt^Dh5^Z)s4 z_MK*ayEOlHeF%yBdHo7e3pcaZwu)~Y6sG>ad#^v({L6OyFZsDw*3)lgCtd?aEe^e! z8+tu6e06c`N@n!GM1boOe~vJz3!$Se^$p3snH#&39d#^ha#kyMS{t-!#LU@p{}xkO z-;KKN&p_eWm78?Go5%C~InpqLO#9D`^0eU(%ncAOZ;<%|{;WoPZC}`4ZsCOrFF(<) zkzXmc*lut+qFv8;%hBom9oZ5+zYbx)ep&mjnr;bfw=cDJso7{Z%0%5=Dv5SI(_hW= zblso&`SYc`tDt%0W%3-^L5DKwe*R3J%Gx4(9{vxWKCm;}^w3+4_#0=9DZ=LByec*b zx@-dRG9o9&h=Q#}8-!#k1&1P*Xqk?EP%ryjc?F=y!}b{)rF3knB@5+2KJ%}}Wj3pT zee=@*F}YHhF$L%n4A@M~!k?kdFlQ*VG>x7xMphaoI9hjc>Ye2&WSIxm3Es(WHv!JG z$87?%(Ibw~rqV>T34a!+HN1=j+H}$IXEC~_#Ls-Oj_roZL26Zi7<4*`mB-%VTgWL< zS<5UpH$Z^4T4sQ*g_Px`z&IrzB~b!y! zQ$>& z9TjJ0kZ@oT?C`c^IyNIIy%{hFTC-E*NbcvkrU2Mm%Nat~;Sgf(#FHqK30grIM`^YL zoIZx`mlk+Q0e97a4d&CGST|-etdCY$Bd6qM6*ahgKep=f87?MoaMh%WN3NehxIU$K zCG(SnU!?tNa(Homq@BSiBQTWa#Rtj(L zfVRD(5!2?Sk{P-46ckfatJsV*XXI~#qczW+B7O$^*)Ja@2gsot_?+a=dj;pr_-`PA zCNYbn&~t;=VZdh$RruJ|WNN>>SBm zprQKQd)0;6ZH$JvC|E%A#;`*?vgE^F0SPfWWMFcC0w%lo8S)&YKEsWurmC64bHD!v zM;$)9aR+q*gJmo-NXrXi&Rq+uXYyD0Ga>(|9HCk{Zy5C=2q0)05(|9(TK*eJM8XhS z6w&CP%_o^~d$KQ%__L8-!C`Q&(6rQ1;04}g&YU2M{g*5A z5NYP_Mj8G5Ibgr~3OMA_ZVz!hg4w~Kz?kx64)oX#v^8-*VlRA5SAGu9I-WqV` zuv}kZYu7RFasjXa<=}MI$EhhTJ4OTaktBGQ*fQ`vcJK%r;gDBjzyfY2hZfj;fj>LA zQ)S#aOz91iaiXHh8afthH8#$`JTXlcmaPpHfQ*bC6Cux_OQV-MQPeI((9(|bDS@e=qY*+@g%bgZ_RON*^m(y$C9q(uNv4^L(_PJd zQ*rlvHC(vvju~8B?Jnbt!8?eet{?^-tJuPDt%cvemWz9Vk$9Ulu90j4drd>TS&1am zPMd*IOpO!SYWm?)uqz_%!3VJm){UoYhdvyYEX^`Jhwa!G;{^>)P~M*IwUezaeIcGP@!BuD6{H?f{>(yzR) zP4ewxY@7`w`QDSyhHqIPEs-3sWyHZMX>m{&Zz*7+(`jAA@b!dln?S>?h=i~~2q6p; zJosTVDf&t%z+Osb$n7*!lQjfh5cme8g_h~D78CM}$FBfBWYX3_$hws?1f5iTMxIbJ zn&4{cg@QRwa5{5@ufl0vY71F~b23ecuA6M=SqOZL#V5hSAYV`_iee#X;v{xVqTJ4F zw~s$F3n^yJngh}+;4A^NQh=Zh)fxp=s6nosJstAIrm~o`wMIK8fmYYHIO5L?K(jMd zGgcu;XStV{j)7b`b(0ZQHZNtIE;LS)9D{s$xB^%zevW@g4g?+X=ST$|FlRL97K;$- zOQI>ZG|O_aWmi`UX3GzIxKPZ_+Yg9zB#nkSn|PQN5IMK4zbxan=c?(#S>w*1(K#~( zL(LX;5Y)U~)r{~tH(j(QNM0uDg^w&4B9FHHEa*pu2TISBIg0qm^|)>5{hDsDV8FT@ zjLKa&DAz?d+YN{3k~f?FnaczmR^D$0i(2SNS*-;GJ8)LvT$NZ{Lh`g9GnsfvW zeD=Hxp#`xm0iP)cI0w>evyY~u4{P%uHH>3p7F|n!+{meBjr<(HjgPmpUvI^^A$fMt z2_u32pf~q+%N|Bv6mIbi5uYe3Lf>t9I13R2pV^+)Mj^@W@C*}n3l6s8!;Kl4Lf{So zaF!{txfYwq*#yj}okgBK`B4Ydlo+y>_}N9yWV{;CmE@;GiNUbPm0|S2x2n^?=ab?f z3>*ag;Y#uc;t!hsnSg^&4hqDDYEa6RYqZ_}5LKsCcDrf__H#Xx#i}7pkbYtIb>kZ4p zJ=s-95sO0$ftqfx2m(X z*!7jv2&@ zJx|C5I>{`Ci5@7~b4ql&hfTB?_3%b|1peHezfp=`M!0`5{&~Ls z%iZ4pb+`WC?i4W)yZvrw;8t-eH+OYy;mVi2*E`uaVprZ;ntWq^>}qoOYI^KH z7RTPojl7Z>eI-43H9KPE{pcER{$;rw>9aLK|_RBr3=L_9KMk{JPyrHe>Ie}mzx3V3EHcty#8_fe+LfF<9t}nz#is`{> zb`U24?50hDJR}olw|BM(iEw5Rx|}o=M)1OaLo6D>Gh>FO=ZBF`W8jSP8CMEdM?1t8 ze>S&`fIkzhFEfd5RwOew0m>^U2B6;<3m^eSTP_rv>su#E$K=;4_gffzMcQn3FRVgrn;s;n=6kQiF0A z@XLiml76kHD6X!ZfO9Q|5}21Mc1z=)k>zc9`dghf6^}iQvim9SC`1 znwWq<S8#v-rCS|8xwWH4hmx1Q=>8S4uauHfZdL5R>mvwLEN4>msMq^x(#xp zxX0-E#Uv*=j=c#!%)F{tBy4n%pA+<-sJn%gKb{Mnf^ z2%0?bnb!wcJwu)?@qvRPLNedgrK!c_JYo2F+{)R>8eDe){j<4nWM_-%iEb&5xAU2a zli|tWVmK`^1Vw9+L(_N|NzmbQ$deUh5b`XxtU8NiK+yf9n$}2^W9zYxj@qLTE*C_t zLxD6?s~VAM4nxkmqWEw(D*r<+S&a#MR!&JCbN8nL0@}#m8sk4A|4-s8&s?gh4 z7Z+R!l!pz*2K1EUqakMMP7%OHK-ls9K%__H1* zetFF50kElN2^wf>WOy$N3w`pL3cB(fA?fr`hJO3mmO9R#VYA}f^48Xi4CYH0G$OZZ z>%v_)}Cdf!hTwR(^ zu-+%Dix2lIzu#*94(K?k{dU&*>7@1d^A`Razn}MrLWm3WueZ8?zth9^nJK_>WdwcH zetOV-vfp`nvxWRy+T(4F!2r0dupjR$aG{fDx3d6#GIDg(V&)ckkedM}kMy1EE`E*@ zULGT|)aD`@ewTomP639jgOF@H5he7fnAU#WP9WOE9Dr$JyZ~2(A=4Kpau!?ZpEqj{ z*2SMGhob^rk^YL`5~7ZqmUkB1Hugfn`7@jo!LxfB%luhP8^GQIZ+^2|MjQMA(GP*E zX4(MzWneTV&I|z#A*vsR35(@IFAbi9H_1?6B^J97r0j*Fk;0Y4tqa7%V0PxkMTe_% zEAmR>^L6CPa#sdH+gX7k+6Iu7EeZS?oh<;<;x;l<7_u)#1aes-vEofh>jA|K*d0zB zgEKs}57Q>1BBtme%y;%Hz-y{wF<$dtmg_|rh|r-fTPkzY(g?HTj1RLcA#3tXkWx>(7I@~M{17-m4@%^GQbwE%h<j`8R)2RinIr-w_O;m<yE; zSpCDT)=$UF7$|*zoLS3{7w4|8rw3PZ*S1nuy7?P2-zX2mpBWMoaa)k-^V*EOP@3bC zKv!m1%)7Nw29ML}+x6k2(f~mW8_A*d)G+)R5WPZ!afHy2XRM)zFyD~SIz1xCX{@bd zL@m6|_vv436#nb29^)ab?Qd_d{Of%A*R$Sl_g4S=Un|d!ODm;WnE!{Z@q5jogN4z2 zd}MFwwQ_9iR!NAvGnL5~*ireV3|&Vh5m=+dcx+(!>=ihA0iSJzPTr!kE@e3DMgHt{ zz}gUa@#j#V99eB#YUH_H7jk>ZJjh}Hu6ak;m;<5+;iOH*@LUVxjhFayP#+6lpN?&X z*?qFn93vpv-%EevFQt^xSwZHqL9}?I4e5e@Tbltt_x24YE9{`_pF{tRzNm`^s3Ydw zpLvl#`$#Tk5%TBYtQSx)_4}t8-RJEQ004Qu2B|e$wMB3S}6>hgOJH?Ug z+(=0w>IR5?h8C3X^wG@%pZPq$kudm-t8>VoMX?CRhfzRg*5NbG0AjgrlAJ_MN>oJs z9b9jWV@5&zK~XZ2j0^B^o;b!!77&fkbB)Ml(r`l6q;PhTvsWg-BCrlEr9iGCsi}S= zPH?of?2Y^!O3_h59M;oU;EEttl+U;d_{h;DLli5SA*qzHy-kc^y8$T1#zD$w^A$n) z3|^KrRBU$I$hqLBU^PMCID`>2N3DWDr3{~^(d7bi$tzS`l6Zwf>q`^2R#KRXpi76e zpSC1>hDHKH;cu=@70{Cj19r!Va>bu@$Q&&s*+ov=%yG!eoddJAI^wi;eJ?KG1+{M4 ziJdI!O1T6l$2tW9_VMmu81gLsY^Yo=$0pbYxvv$`VPl)d-T%El{gMU8oC9|L!@R==BVDMD%2GzdBG?Y48qUA+;->FYE^Ss)a z#qF83_16T5pWA3qQ)9$=+^b>!J2?YE%yF4Uxs$mcxVSC@hQV@syX`aOz}WSrIUGFBTC-=hxg!aH=fSZ20o!u^v=jUgNso8FB z7O8VJn{4Ff2|GxbKj*aF#d);H*l1uMEsShY0%guD=Z)M!Gb^ofZ_#(X0$WHjM-hZe z@Z1$oCbQqj9Ck9Y<1mdhAlg|p?HgW}BZoB7<^p}X5?FSqmu_~ik&+Q~O9JVWmE1-J zSLZ3h5u!h@q$g26JA5W1@iRWpVG?{cn`m+AkURsfmrL;-Y`SGko#y9ytCrlV&K`6U zAM{fEe-?Vi|17|;V#~&#ojgO5F=u8QF=QvnY{Ajr?+{WDW}7z;=S7e;v{_EhIHsCY z2i5#Ub}5v!80>5a+Rc9P`~4cjUPGxUpGndolMMelr;S)HpcTlhw2JsyZX3kud$f@v zJRf-^!HRar|BnpnMk-<&VO~n0DksTSL1Y`g(M_Zd5LL zv$5!)M+45z%u#YOcqejwCivwzE>ufge9@)GgTV(odx&?`_bN5)t;Lg*CQ z@6S645(^?txKU`(uBAYk>_FAp0_~B+iX){o|Fae=HaILE>k?=bzjEXN z2~y%D*%-1gHC@ocCr!+vfz?u0dkfaASzGx3)`gvQC=x>ZIMsq9Q)^26R@mA2gCyKi zP@D2uE*9uTl}xHCo)9L{Ldy$a8ifY8dWo27pW_D{Qmi;2^MQc|R91zCVP#kmGVq|p z*sSutN)9cJ~nW)0&5adHb)LB__^$gN#fGr z>|Ojhr~{K>vb5<(;kTNR#Ls%e0y<_GjNj)NVCNwIpp>rQL?zQgM_Y(4!I(5zt{M(D zR6qs2B^=Eaw;L=2d}evo?^+OiPy<+%F^Gm_{t~P+0{{-AyAGn=?Nr5nLq}-F##z1& zOwAWxARYE=a%jJQBo*fM)~ZC~%!NQ^G9KZB3tJO|rKM-PmG2K^0nKPp^QzFmskSEc z#diX@s=PaIn9$ej078RPa0}VdvM_9@DTEEyD$utnl`_m(8ugVTbb`b#M+NlO7crUu z7*Ybrb+k((QD5+0ptM787ed2M3D}16?xEr>0!}{;>8N(WA~f zzn`^#ztchv{o8rtAGdqBa8M3{W(x^1$B&w9Hx4Q?`XCCSDXu}&V&FS?ZnVe%v>)!( zK+PP5MH`)#sj`Uuo&x-7YjzwGKU-8gt0v91=y3?29b5wy-Rc32?t9I|2W_EI(b3)_ zgb+xJ^X>c1IZ&s=Nr%rcXXCE2un>Ahz`SG7a;Ns$nv6Rjge2}Ft%LQ;C6EP5=ym)B zNOQZ)ShaRi*nu;zl&VPe+>(wr#1YJmvJ zSaOlD6zsImPY}eFzSz<)KQ9rERye}mqKrXIz3=duE_8kEqIfTEKrKgWqv8rvsFx0U z%b*DY?QNHl@IdJ|gcn;f12@4o>nXF28gCY8O+skn&;F)>5qk2M3*09Nq4{|aR)(vF z>^Z0-zOCt4A^cf39lFZ4h9PXH#H$5!6l@Q=Fj6fhPsW+E|0(gmCTwwa=0{tB1<^K} zKL%1{ICCU&h7yC69Xqon!J=InEw&tD=l2_#_v&d%AjzB?@n`BIes*u_KrG!z0;vCg z*53O$jw{>NoOsbr5*@q;3gsQDP$=)<9RZMVBt?m2%X>>v-nDse?wz?4F+a>-Jm1TGtNPM|!?RQK^O+T)b))60%YU=Uw0#|Vte{VJZPA7qF2oU?d z)%j0WE6;ZLFJGPw$4iGh_^`G3dVAr1eg3#2RE}=YbT!KUj+dIoL_b`)Z_%jC4UXJY9m~+iS zAEK8=0xeSxC^Qu~njOdTFXyEXcgwYT;4s!1qy6}eetKeOY3LmOTpgAKx+VlI{j;1m zWNC7?G9%j!Vlr08j;bSfDuUIo)vs?Y4RuntHt-BV|BU!KHM9nE#sxZgOG0Rlsp|?s zm>lO4HHogc9J_U}H2=e)tep7A;vZ+dA5S~aPTT)DYyNc7|9>CW-`UMLUI;pWgrl$U!9{*E2{+E;HSU>*f zrMW)=HUUsjEW*QyaJF*DN1<>eM|=Sc#Qd2Qcsqy$l3-a#oT32ZkG z>Qh(&9Cv15vtoDQksl4A-ZVZ5QcDOyqk<0Em$^gh$NpTRH!WF~9kQtHW^QB`hN>xr z7y$ngWiRll#%d!Y&g_C`&?Rh5<{Jr_W`JZ#*#C+^N)0O-8E|GK&@vBEv_9Y`sF~$c zL6Q4NIaA3Rb5`&{S#3;#?C784?n>;eOGLKmlg*Vn|SS>1?oY*_@1k>ZK z%qTaJID@Se{8>g8EDfnPg6-S26r2{*6`Um`-0g}6pQ(Q-iZubu#Ee2SiUDw;W9Q6d zJdB`*4hwB!15<)bVh-$n)B}2Z>iZHH4$kSLV8o%x7v{M~GIcQkiy$SEeJtNICMk|o# z1nPZRb^~eIDD=7y)^Z?a89ukiWrJKbLu^Fs3S=xfv>w;myn}lG42qw(p|a+^Y&4j; zF&~MadCpsUwplgz6kV~rsXIL0nxy2x?c`n~!J~!g$1-=#$TLqDC6d->urwzU;!JO4 zaj&IMF5}9(!(#%<14QC#f2ZR-Tt8%JC-$l`jVUZn6q6InDM|PJl@NhAvHPy1ES4yS z9`RYsJ-AwqPZwkJhaF%(X4G=+kV4zTgCfs1b8@y61bqnU#i|;sANJNMbSGuXXN4ei z_HhYsfPRRkJ{o8$tK-4vOK= zUd{2ZF<2>J0aK7_lFT;|70zW{uvzoUN51Le2S_T0AT@M_L!Kr=)_~}N`VcvjO2R@B<$}d90pMrvqR`Ht z10l4jrhRqlR&rK%lL(BCeHDVzYf894qmE|6G%=qCk!sQh_+uD<9zf7iK8KW5vR-Gx zlsJ)=C$lM{1O9Ao$)-$JEB=%w2?a|Ctr8v#$TK_7Db--eCQlW7)+nKfno%w&w8^*p zuX1(RO$p4JNkxR91EOnkYlcwj=Fq^aTg_QE7d{Q=@Pf~zkT!dUqcX@xJ>#Yp8;Stv zM3)U@yPTy9wA#9C=3=UzM7(X1utz7il<-%-Cs?I$v9FFj3}LL*RJ=cS0Cd19bEXMI zo&8~|5rPJRI#qUDOgRIwCm>MDnJ1IKR41(OtvDLg6{5tnRtQ>jw@wpA;Ybgd2?)|6 z4DQR)nfdcmZb4(i%UTF%-OP|-Zr~ti%YYGP>o}LABWSp;dH@3B>_MNh4z?JD!rJnY zc6iHYIY7`x*O{bNXK@t)vp8>%0IeWpX`4aB$X|hw@OFDmfbf+iSW=8XDbrHS^|^QbI1n-;Vy2*N;X>s*JBg-#QB#DA2--9vFE%)j*O^{qKRz<4jvYG zF((*nY?(`B5O}j#uG-r1O!igF!GoG4dM5Gmh}c^if`ypJ^_M%C7&lC~E0brJCBuhF z!~x_~0%?L6qED8-w*tf_kpW^0czQrIdj`0J%;7yt28z8xN$v+m$>7qz$)9EGVcc6d z+88g48X+PH{0Ls7H?X}H56@QlhvVKq?{^SF!(o0s>%gMH8YrJp zL1PUKf<^-U(^>o5L-~rZ9G8CsoF#`oz?Y)|RmKbiMf8^kEr2c98LI4nS{h?C((ZBL zrrDBA84vFe+h(q9d_!ukjcNP<{G zBZVu0&!9yE`><1+NnIq_kRvl^4UT8KXkY|Z;*%`rVdf2T=Si86Uk-=wU&ZYO+ zI{b$>q3bok5&YS?v6EH#`kG6FDP}ELo3Jxb7bA;AKqK+!kn4hZXn-p_MqI(j&YwA& zw}u$9-sSP_SA-0|fi`$mHwd6g;%Sd0(Dcl3h_PYR?1}uGG5zR^Kfl>7usKhx5H5{M z*<8Pv>60rT8&+RRf# z#%G08o)5m>bnNQmrg<8LrW3vi`5?0iJX)-RdGatQY9UH#b`>biF9it78N4_UeuqUn zf7ZlsR>2d)ZXe~`R{hgvj@GP#45z?nj`}yQ7chM4TN7u|LePV!dJ-&A$kRxkuQ>3v z{;_Ujxh&!>HFY~7AvCJ{R?Mh!+_cbg!*G)g3Y|H-=9yFBV^(NCHw;v@5liXg3g#Lz;2jUzp8pmtVxx?bxn;zGl_@=w|+exZhk`I~Dg zl*y3KyR~ubpk>X0lSU24jDRFx;m>{wD|UIaOQ1QLuo-Rhg*Ar}Y(ngrj|UyfdIITh z#HjI_9y1xwr0K3>C(9#`*OEV-RldGk{PK40*_|aK1Acc`9!Fo_ZNP^~D4!LA@Sx;* zK=cnsl0b9%x6|?){n+g?vHV7lE8};|lc%&mro!n4sakw2H+05O9<$`c=bzk=gOJ28Qc2I9c;%Endg(! zQOd9IXD^S?u_I_F%+V2;432aD%<;EjZwR01N)^T=C$`Qn*r0a^e1pYBT+Tt?CA=A- z#gG}=tOC6;4F#pcG&nKxm%0r}sk2{i;xIFytf4zJqdTWnonV2Eo$>6ISGH4S%U=u; zjpcjj$HAJuD4*fKSuG_b<9d#%EYowUUcK-!Q$PyL}t5_$ez{5inO z(Jcrwz7`D^?rJbrSRtHnG}WsaztLXJ^Ex_wrqA%+4J<*BT;*4nX7D^5cd*;2lfjHv z2=4pjOEQ$Uwu5!Zd*Saqx|{T1^rEvuilzWC*J&QTxtugi& z5|ZXLX3n7nv}0%YJKP-;D)J?zgp!?ExewcV?05?1n21(y5+%|y5OjROJe3GvbwznYO^tA!)6-^#U-WNP z6}JvlTg!77CTt19ttf|0-#djvHOpZY+vON);d@_&hW;5# z$hR#(+AV^16H@%Cbpar9W`T<;5Q3}MFkbzt;aBvm*BZ;3T-Bg(7L6Mo;1(I z7OcARS)m4%+Ick3$GwdCZ{Vw(fY$P@g7O(a4Pb}Kb1&|$X4We6m|F8q!XwJN4>&E} z$QV9jbW_a7%6yZgW)GVA^ELQz8rNkEH=H~JgdH7obeJ4bXy~zXV``H3qf=$mLL)W~ zcs299(*!S--^rel~3f0mf4Vfeq9gk&(08`8JnL@f< z6Pjj3!DkQoXZmN>!c|%+8I#vCP2tRufjAX3HZmM}g8&K1Ly|dqeFw{C86l-;l-P5x zz|lJat)uJ(K|64E!b~-ib7n-{6msgA+AEtF7+T9;zA{)gEDSN0Zw7zE0*52U>v?fk z!^NVh_6M&($AAjjQ7V7%8o(6Bq#s#Q7`Y7u&*q^4E*5&F0`%2;Gwn2a{)pCJ;?^yo z+htu|)BnVlPAqhUj%FB;VKHZL0Y)oJA9RX7Tc^j`4SQAb$r?8+u-b6?O1W*FK(3Ii zJD*7E88|`%6#=kfv&edd&E-B3WK70PiO_)o1cTC=0|R1xchI29&ED=yFwv1pEJ-myA4Q9&ZK@^wyq@f}(SUOaFn=N=2B`|quj1dO&+)6dA z2z?R{Z=q(C&uU2OWL}D9m`6_Z(v}G&7HeHgvsl3pP?9Ms1>hOd$_7A*=vWvY=8cU@cl zY=iHR+EXZ{DZsV5EdXzWuM{C)+bCA#5@<3^l|?x*mN5wa8|XqeKu<(!%duU+VcAXd zakj4@0^8}7w`0g|c?Se-Gmgy?)Cpopforxx$Ov4fJHpa{+iUWhl~NQJSr8%34WoATA;6dP+j1IO4fhQFxfSNiQ!VD|qbU~lD&Ah@?$FNp$*ZpODFpxdd zIrx-T+|#IAl+OTFUSv3tBlG>;CYtA8PU`>j)y_Ze_i-Hk`CjXndtKR`Qh9`k#dT;EN zI&}92Bc)=<1k~GH2I_)mUu&fvci^`fK26*{eZF>8|0DSGPW?kN+uC`<{#A&jV7P2O zDj-KVBx+>FHLi#f8y{wgT7ke|ZBN3&ZG|HgB{rffdg;vB0Hza2dJDAE@YvNn^8q7! z7(rGFk){MeKKPW|$DokvH#)I5x(Udh4@$QNdr?FKpS3d}Xflsm=|`>PTl}lXH%91_ z?0drI_*Urk#8w4J&c?dxnC7%1J?W$$ck-CDz-$?s+d&h5JD}!J=uIJ9jwCMu=dw}c zrPyDm&p4~oI|3+cSH#uk89Gt4^_oxrUg-BYOYgOdEC=dK{dYM<2yL+uc|pMF{`^M@ zXCKsG7BCiHgLZ55_CYTi?31ET4HMgty))C`!Jre8IJrLKW$v#Y2?Ob@i%*I+oal{w zu}hw<*97l&N@SQkpcocyQ!3~mh0rd8as$gQ>K0>XMb56tlUOpR7c|?9R`>=cxjzXq ze*ag7e;Faq^vqF48K$O2pDY&Lia)8%|Fu5v*gg= zVu_-kRMRBNAFjZ$W0X?}g+|y6ReoHFlOB;V`wnb3aPttLu1ZZ!p@k{5V1;;qm<_et zcR-?HZZWCN|T8*A7lX`x*&EfFt%8Uy-g%rrpFR5RLq;nZRJXD`QpV}?@< zKp5^`6Elh#WY|yov7b+>Zn*L7arv9W5*8eiKp&MM&u+VcH3x}uzw`~h9CvDRhrSEA zExJ2G_B-F- zX?=IU`ThOw59i&#J?#B>w*KvD_y2mW`pc{BgIe~q!nUK-ntsq2-pGxBG0S6ruFTx3 z%>G%X$D=Pnbd8Q$RI)MbUgi8uGF}=1XHKL1rHpZ7l{jjSkSS=F%}A$XS}urKlg9yoYEUB+mf~4wrU`42v5FTIFcHnnQpn!_Dzo(L;2} z^K8)oxHfb<>5c#JwHWBmteXOOG`XJQUsP9b)V_%oRoil4a@$dALBhvUi=+EcXi zK|jycjGFvrW{}wq=A(N@E6TYeSNd1w!I_8SdMC6B?~As@pK6~#P~q||@KLzrb)wU# zH_!aH9Qo+^Kt4l1I()`4!|`$inFHDLbNrbK&Y!(P#Gj$inaMvcnfSRl^Ox+%D~aKk z*5V`g`U$Wb01A<?>ay9I-sHsWZW51U1PL=UfnNQ=+Z zr?A@vrFIHK#6Ck53apb7I4cV6Bo-tKj)r0d&apT==jI^Ke(IhT1la1PV)erG@*?F^ zN9{=f9sF5T7N2Kq2b!}-ttsFh4B1Q!a1YQa42`3iZ^Y3;AJ&9q&zcEB7Vb4;=w0c7 zw&+o*zgZfqERL3A6JTd)vs1&8G@I#!^JjtOlz1ZqPe(a#OjeVaZy@I$qNeoEXuRE6 zLsr$$W}u$}DdOD$2xZAmr$O%cR}jCCg;%pe*6rkMJ3rCQ;v{^l7#m$*nm=1zIPS67 z@nh&B3g_0mn54mH&%hxKRK{HHD>N$VoAx`!sVC>p0sA$1vzNnKscfVg}49BdVIxHiq@u{s9jAgRss)22bw8Zy%3f;)edHyN4oiTa2J`R}4NUwW} zQA0Ng%H~nzx#gV*cbUfkXA<@b;OS2Y#GWBmOY?YiFe^B-9F@`i@`(CPgfLThaW`XN zUJ~=S$?)kDb|&%kG8x@gV(=k*)=LMyZomu~HjD8BQgd88Fu2yGR(7+Flfx{51z9Nu zFS3gQv_J{v9k>98+VoeNfrXN0Z*m?lTh00|T!e>*; zXMDv0wwN^R61H;`(modM1gEr$tW zEM6_A=s@s{=LQL9Y3w@$wCSg%7@Z`6^nU)%YT*dqkA9xs4m(S?QAc-pwO63$U3MM= z>P{Yyl&$(gue?COMBJXC(2Y#0R+z8mXK~xWj-#BMZRL|Y?3=r7*yrUzH~nNa_a=YX z@{`_;!aE!MG&?7BV?NA;9h9yZ7HzTrP&>n5`9bA3d#IpgvO$T+vrM7OAZ1Zy{aD`A z#T#(rta!D#TY#gb5;VhS7bOZrn}nFZJLI;3dbyhhz2d*Ya4=!1p!=f14tpIwdn@^4 z7=LCg5oUTYhYi{iiBG5*e62`)WC{+S2l+Go3qczU$1j>5=#a@XIte*6iK}AEret== z>{tC5VP`f;R}P`E*%z+|Xp~mo19gN|1H%o4 z|8u3c73$QlMmRdsfm809;iv-G*$tMZ9bFTA_9PaqbYZL!mJ69WK6L|Uv0}r;g0Tjc zsUSlPjsQ{v&M;@g&gg`tC5GJr5ctzlNf<#tOm?2&J@bdNC#rcGsI0$6BU5PRF9dB& zo6$e&l|ayf*v#C}F~Cr46B(OXPk<-^xhiq<3KKj#e-8H0sD-0Z$B$4`=D?gaip`t_ z`eNb6TC&NTy~N>jRPL>qJgb9M25M(^<`Tz-R~y;xXZU1EH*306Ww7IL7!I3tQ)0>W z@k`pvyP(=#uA{>={gvql_E$l0WZz24S9wDP#7;6=>1rr!qKu{uwbfbwLp z0FMRh;i_TYBZ7ODP|recIf74V!nCR2B`lne4{P`P$R6rB2e%qz=G3R5qg2o)QAW_a zDpkAz;lO|zi2bETkz!ec!t-&^H3>BQS;QV~uz_?6St*6unT?zvo4gJr7^Z)XtMH4e z!>q)g(ew%E2bS+d9VZG|RqWTnl^|9sgl&}(f|d=183M3C9uIRl z2rW2dGvdrmd<`a;b^htDB1!#p+~O4G{L@Jn|lkq!6 zLzzFDSXw}pd0KouW+JZ!gV>tb_OeT4`S@S}0zWibDA-7E0fKI!SxpNp6ZEhXcs|q0 z`7^}Wi8QBt+yd;Wf1QbT7sN4qqm@UbOrZbaLeG&a9!Z@qjnrr3#Al)M#F68 z&r~MS7XC~L2pTQ)yS$U)!8R1{T4>=`d#+fHwrHy&={5Gtt3{dv=ilgM;m>e>dY}$B z)awghhn~-p$^yjCH< zXg-GQKYI>#_IbWbI7sD#7X;cLn-$ZuwaBHJ5)*ifJUcPw9}BM#EHgCX@IqUfWYW&1 zZ6N(C$v-aeXCN)D!kXGB{|A&yz~{%+Sx3h(VNa-$C3OyMH@GTdY)WQ>(o#*oZfqI6 z{Mz#3!{vFvwOv|-Fo&Gkl+R%+DtLJ`1TyIWLG!fZ8f^yAj;|e*g@_43NF97LAi$p;E-`^)=x$Xi=#%9sB)&+F ziA4yTB}m_PdSoj%w2>TNP22=QH|DUmnEqrp|HVP+{jJ%{E50H z$zuYg|Ngl2k5`M|9_O%jL;}5?y#@D%9^Wb5 zd{7^iL&(a_)7qFe97AmLeD>W7CFK)@Afy8RB=_qt?-p)h1ihZVv5_7Ub~Ynu+(O({XIuVd0z7Z>xKN;0P+Ryvw<$)c2xhx>y#j#G;==(1WdBkPqo@H2UCsiVk%1N#=V`j`Bf9(-d5yCNU8{mt^IFq)W`M5q5<8OP4iF%mxy@@MiM9yE|Z z4~U;5{;W%$oKcUylArnmk8XD455<{3<)>dt+_;t*A3;kjx`pK|O33DdM5pZ>j7a>s zkv9lNAU5G>@v%A_YzaI?efb7-Qg;y3VkS^W8lA+N9zd5%jJLDbF|vSJfh$EUQ?ugF zZZ`ps#Tfv90DLEM2#n#h0e^Nz4cvqMc44!H1=%mB(!1>u+@68YgdGHt$+Q;uTw^lk zC|g4IT_ub%C@D9BAe72i;bsBN6p^J&9KauN!t7sdnB%3Sti; zKWY+g$rAcXLn{J5rTaouMCv0|6&Ia5LHP`S)=W?!^PFUOeq61}17m`D*(sAiyOJnd z#u&JpIR_pZ%+^yxo_%Sw60Q_8hn!pVJwUM`ci{PP9hr3Qd^NWxSjwH6!B*GoCI|&M zgJ8Q`m;nwG&yn5Ut6-TcLu|HD^5%AmcPJoS>|&&^rt^S5OYqN#Y!?-zf9|9j`T5eK z1n|`ap57B=c+Po@Tioju9_F(3;6VbABD1&mBXewv0$)O~!#4>0C(XkS3iC<@t^HSk zKjY5=&hET{+8O(0?vCytTj%c-q(;_b(3r)A23HD_tWG-dPI;yjpX41%r!YfWLAswF zZ6#*98GXu#Scf6=S_wNBQ;hRQqs>Z_ERc<*&k#gIp(ptr1i%w|+$&A;770I%a+co$ zNbroRoR>sc5ZAKvp7`X-ek8eA&)`u!QA~_ilCw~2M9a8>@cH6HdYh>#uxSFy?SnF| zoKHGpwj4ptFlWfK@n<1igU?c%3rh1vB+0a_MS!<(b&@psc|t2`q2tfm@ zfyqVa@m>?pYDj(&!LusEoO?MEDrkuMS-*6`Z$O%bLl|{8f6^`PcMGKR)$+Z*a5QXu zzrE01(puO_5PH2h&x%TmiZDn?t2DP+&>I6rd6MHg2TmFwXsKSUT8Kl5YnEeHBrG_B!VCB;VRML-ojhMT z$`o2DbmTB7EfKO$iN(79nH_kKAdF@@5on<=qW+0O8-EsICh_Mpe+lv@Bsyo{Gx_&A zkXRG_qVE#K&Qr)A)PjB%n~zD-gM5-5QyW+oRd)Uy0%z};wg6lHc2)&T^hqKwQr%KG zLQg>QNL|dJ4t_OBqukI@5nz16Va~3PHU8|U&_x8mVz$nE-91}ka#eQzNgl@NRMs;- zlV~hhwBzU~qtU~}(3G>NOIM9Qd!JGlTOFO6&>H1)FrSb=iy_OHLKYKHUkQnArBWJm zADutjU+exiyMtvXs0PyY#)m)cQTkEAen&6&VDbP})Vu^D)ExRrb>5YxS9qDYfoAoL z2+$MgV-P`WZw;9176)MprHl5;E*R$7<|=E{gbiY|Ocu!8n6_r<2wIwLlaiX66!?I; z+m)pP&gS}y^9IP2t)L-m3EJ8_1qr0h*8*HG+Po%{89{ZzH5!5@qe7GNik%uv7OFM1 zxnW^P&=vTzX_ejFqXFL*v6pd&d^V6hvqjtmo*al4zXunBRzxk`GHs*muN5EA_;Vmd zX0{}Dn{~m-G2)Ph*<3Y*piP7fTbA`Pnq&wq40ew&i$v(F0fz(7YBZkuv}Lb8-qn0W zP0jy-waD&ZXGw4vPk;gVObG}Mjt6H`;-@R9yM=!(qQw#Zy>i0EPRHV73QcT21kc8q0mxPK&tPN{CCF1X8AH&_1eq}~nI~3SXs#ORbvdqT?leT0q1NEv z9dxQh+>;?TJ44cL@YwG*KisapvsQL5Xh)_{R#ywZUS9;{s-~&O`G5cwBOoba$$lD{ z1UdRq5{wq$=*va^b-A!;Ey~vti~8j+&);1_c`j zj!K@i5G|*jGgBDxXWXRULDJk05VTj&x-6cc#LV!|E}qp(@2m#)%Y3M5jyv>Y^ACZ& z1KyEX`?w4ZJx2d5j%{-2C+!?e6@&|V6=k&~ii@SQnX!ndo0yqxgzXDocXP7uU~@Xz zM+kAdIe!|duMM>N7pU2&uRp80YI0&SG(pbItN^V*+5pKK<#sTO*9Ti6PTrCMvJiB; z2=cYc!qLunm7x%Xj_HRnbB;VGdS>ha^JmN-Bu&5`Y17zCjjuY}72dZ0wYkVl^by!F zKND*D^RQX_aHFchljY>5ZoIXQ`S^!z=_X(Q-8@$h;DhZrMO| zRN@+G__LE_N6=K})G0Kf48h1GN7ksOoo2iE*;{d>(3!KBIP`XFXy?*_NEoyBm}JP$uTJ!T42u@=W=+3EBI+OiaviVCVKXQe3Quk*j9>(l$;g_cAqljx z=nKzh>ff*F)GJ3#oHKKZz85KSB#I8IVLH)30xcOZ8O1pM&E=Wp*U z!Ji#FyBjk{_kX64JV2QA^hjtL(~Pf)NN6_EA8ck%%M*92LuZva+&}RBxVt=Z+8Ekj zzSfNmZzXO4Z?{sTJE`II%*bkDsya7xSf2l4zxecUiLdUj?lf_(APS+mZB#+ZB=pa~ zXJ^jXagf3AS(;}II^@)0KT)~QTf!#RNqB|;c>n83<*l{F>cVI*j_w-k>Fb-BVfZta zAmC*SL^vthZwdJ~Q)Mfl@xD>$xA%q6M<3Mw1T$}Cu7jYrQ#TZRFde3pC^S&oSTqBT z5<_q^bG>6%pqJ+#1rmyeioXmwub!*M#Ge|A=^qdI(^ zqlTk!HEQl)*^gn*fygBPzZe)K}StqoOy1B(auMciS{bW zM3??WCaQcTGuR}$L}8ToOmyR}mS5~-xb4<9>NaQ|R*RZnsX)1xL=}FsWbo?m$3D~fn-+^VLA z0nX;XVdxUz90ukyZSaiQIB>+I0-t1=2AG^usI!@z>lNmk`B5SjZq=s{W}h@C@b>^l z85I;pmLIardy!eriYEj22tn8sp=CMpd?r9)9f~!B2f{%$dDxck0niU2F4i2~!f1I> zJ{t{U#l~+T^aUx)seqtzv8mePv{cZ5=;X*sVnlWv_)%bYjHFinx3EXZvm722f(=;m7FE>uBnowLLnXdE;tXQAAwLu2&)OM}IVez{e6U(P z>MnAZkrrc74&3G~15YecXJ|Y@{RqX#aBy$P;a*KK^2}Ic^00w@ih#d-V0fG0u_OH^ z>LFC{L4PB_C}#a(?;7+NOX=mjys+l*wRNy(ePO`U0DYmolf~z;sJFaJa6IzrF-|i&)lR&%PX+s$|9q z9*Qrqljl}`9^Y(uFMza~o=4}*V_fBF&&;zw#l&k}dPU7B6HBenOPd;c5Lg| zIpWWbogG0#amA}wvkV87Wh^ouA^z;;nHAjF#m^V~+2Av1S`EYG{Mkj$gx;gMxCRGX&`6F19eo5Kg6iuyqZ%o-h>Xllc^XSlvs-89c(=Us|{Y+xTu>sXi(c#HWr$sxfxI9s9SG=2qnEXV+!Ci zU70Al_SIes`awAxNGq)?S})z20|w>quZwaskW4vX^4t_*%z)PkTyu$A#%luO&tL2W zrq--W*co#Phrl~nA1nXSj>5M=p~-uqp&JM=8SNM@wYxcx7d)A6!C!Ja;fdYFF+;W+ z!hj3EM2V2$mw*it_P#ZoN8W-6!Kzn!jQz$g#nFxSp00IfeWPo401V9@D zhjm1r3>pl<&~*6jy2P=xLPw3V4iz-G;P3Z@5q<=ToHTzrUH#krRa`yg5q%fW=jP}5 zJRf$S-syjKyZwm>a}BGFFAtmI&-;zf4jL3XAv7E<%V;#-0CQ~u4k5r^oO>-E97j+y zFfgFLp}Ljj^LXnC7mk*6nVPc2z)E5Z*Wxq+X6WeS7K~IvUyv!T5v-1#^!)@u(}ZrJ z&>F>haBzxn7X%HYb&)Vy-*>Tb*pYFB{7)d0vXT&U7TAQ`imcYy`Hy!S?^&O~Rph&T zjxgy35=N-m;j^=G=i6e!tt2Ftxdnu|hcp^%4lr^iV$LD5#(Ws&jAXY+daJ!eSC3lx z#~|gtG{8LYsCj8i;9&ZUl9OjPf%I0V=9@P~?}CwM zCh7Yl@iVis{bzGv(ZbR4FhK^4cXR+?8Q^TUoT#w9UH9yldv$m^WGYuov!oI{N)fvy>DfQUtp4L-x4-B^P{D6|QriK91p zzJlx-k+Y)yMHP%K3qE@q3&w^`M69-K|=nKK+OJZB3#=_0j#MoN$ z)@E|3y)c4ocq@6m6&pQoE_`!T;GdF@Zm)cEQv3C+3vdQIqkNXi`n3Af{U&Z3j-x5W z5Q*QUK%Sw{ycyK%LgDE8uO}_lJgM^i{Et`jcWR?63&U%vF`#!ZHGW(kKC9ota|3xc zJB;%)QghPD%9Q3wPJcfv`?{GME*ZMNkTlf+`#HL3~JwaYAE* zt&E5w@!i_4cSQl4K|OnCCAp8`YG-=A2t}E0U zZRm&mSyR)Ne|_@YQO z@v~quAUZx)li92S2qI&)j1aVFvmH@B1D^r2tXC8|NyenYiCOV#oUXCpNX$BThgd>K zfpv||cL-WBg2Imdq;XrBjO0E~$+t{%Qk{@)JP~LKuoR7=y?@y^Z!BD{|Q#3&YmAl~_IN-3N~-_mpHA$f_HC=mmjD zHDZ1g(Y8^Vj3wb{%W#Ru7@W)Ld3*6*KhrPIW#(@c6JvX|%ua2Qw+4`B-i#3X5b_KV z&M!=?mvOg-UE{V9gM|v}Vt-*$WPmW@XYZdu*?bHl__$S5Bg=diGE*cR+FK@j2Kkcs zv>N*rf5sz1;q%hdXy(y=FC}I-rJXj!-Lh9F9ZguVKHFFyFL<0mfGsJI9Ls9M;B&74 ze+E0lU74XWR3rXiE9ij|9!m^)P+2$gL_Cz)2;Ux1XvD*n>;f_SR+p2qT<)Y$J|A_n zK;{GdnOAXX&f>Yjhzi?hp#ve$V#vLs+i|$s8QHVgwXtX~@vEAuCBQZGn1r?&a7`!s zyoT$QVap81-DhYc?RvT%tYQ(9dDM@;wVEdc((9YWon~sMouTHPMurEnTbwPYr!Wku z=Hf`}drNb>)g*##CQtOwx7TH(@!47is4JZ+w!l5b=9BA1CkuAQ?fGM3$&v2|9N0y| z5rY0wZppIR5Pt?lD;A+*2#O~oY{qs2l8omwF3L!qfzSLB-%KrnOX~${J|lMFZpB*( zI0IeRn?+R{Qh z4xvH|X2+c63*E+>F~!b!Kb~j9KQx)E>ztkRnqM?>Ukr_b&p8LkTyk6tWewP@siVb& zLuTv57@8_<%Q5uypa=eB_NyHA=d+nx4)*K_noDZyI%k8-bi(PS(QN{Z%QQIpGFhp> zqdRh3)<3g>0=8DDI+CMflOpWNsm~Tjt5Iy`j76en(O{p6se(OEA!ej-8>bBvGH23Y z4-{%!=m9iAyhT~IO41B0B|$!cjZD?;9Vi#hWdaMRAEqQdy9eS0t7RPF-D$ zg4*nqQOR-@!WO}8q_c>4nS-NR_R1iMWY3TjxQFO;m?Ygak+b{oXr+3gqseGi2A`Rm zcf}K^3B!L@70ipoY-vKFlV{D@l+S*22rN!+wA^tkc-c$17Z4!|B?Gn}Xw!)|0UGlQ zZum3%pzT7{kKlP#ca0G}F{tkwjPZk2@nMJ@yUjjpbTiyA_-s=$!MTREO#?%zvYHrA zMti*Bw?Ir=ov15GuMN|QKU+=Reb+)e&%`}LDsG&7NQ}rrEbyOa;K1N4an}P(j|qWS zg9DSC35!S@9Oh_3UsRXH_cpWdZe*Anqi9{A<_!eE5<+sA4uzvP__GEzbumZ0FPuNWvmTh=(g}TX1Q@Cl7;Ik&M`+M4{d|A7`wP0Yv;Hqc zA-vnbj)Qnolz={vL;vlh^Xq93IW(aLKV^YOz0YnpKiR88o0$gu844}Y>FxT5I~8=o z9}^Oet7b{fR%i((>L$bF;e>LN-mSrtDVJsy{j({Jo%(_b#YpX{n%K0NIZNXRe0~U6 zYv(}FuQ$@N)WC?NodVa}P73A&Eg1-E>S&YZBcxyyaQ*ED1|oX66+aa6fU z_)ItjN6T4aV}(SY)PYHw@K~V$9kd1v*-bEjsDNCQu3d!)Bq1>NQ<$^!YPGV;I9-rL zq|pOYpVTR;godr$>nyO9eXW@R3$qEldZ6Z$ZW1!=IG0Xf#cYKqnuIC;q-6<=+0U^$ z9%=s;a{lbw!sgR0d7c5D1jePGH+xJV%ZTif6y|(4V)$dc*IV(BQ{NLkupy$jfqS-C zJ=NGER?2Hla4SoLIuZ*H9`2qS&Y#&motp4iP`X)g=FGoGp7{DTc$?+U0*ytRccq0E zKvvL6bE4*sSma8+Tl8X1-;Ihk$Q-E5V)=mcHON;7%h!`;Nf6s2PBL?KwTsP&44)-h z?uiD2h>Z!mC5ZSl|D5UHwIF7q433OTUtnkZ*44{O2ho12e?-_ugU|jCiVUuaGJv&+ z%3ThvK!iTJw`DipXvo$BjlKUH`lvQ9-di ztd5(_JRWIRG8KLY+u=9hu89}3k#!$L3^XX0s@+|m#vi#F|6R=FQK^ZK%toiz?td6 zpGnHd7aAw(3K3(mkH)40BaVMOto(4ESmW=V*w9*PbTvPDRG3hx!N%~t>JpeRJ0Oj|Z#2-d`hpz~Aq8P(gopw)!6r+y8t}*{mdQFVEh? zhrBbpzw}CcWGFWVXO{Sx$b%#l%W`}TOr9?(kVRrc{WDZ5BFQ146}lWK3<&D;{Mp6T zAu$#czQWwR!?4>6v=~;?Kn`ZDPNao)cB=aDw}{1styKQ+dcHJPG=V4+bw!EiqYfi( z=^4k)+Q9F)PB-MW+`W^564kHbi85pwFoDOa0Ti9tLgi z#Rf)5*${f*{~RIc|6Tqp|L4gdLZ2@o+=q*$dCA2BLzqmtPwY2u?u%M^KZ8x8p1sMH zqppT#&c9hRDkS4=BmNwfQ0~>dLewN0D=Ham5?y^hGg$xm{PXp%f@R~(6b3qHL(ma_ z9;|$YKlA-S=h}8|-1IAaKdk1aVS2byU>X2`g82wO<2+y)@Ul4)NTlkDR+$XL09*53 z83{DtSB9>wseXQ}keun}hMPGVDR(pD!ho(smAwWsU>uJT0MEgeg_qMY$tev!1GP|5 z;+ZUQX$k||5rn2InQN_-=qteaw5=F?$DJAZ<(k4794DD2I8?|k=6XwMo-I-vM?my# z{HTTR6r+%&OlxYVj8^t~EjHHAPBjuYAk47k<@l|ROh3#5+LX`O9m`}RH7p|zXtV4! zSPlW*#ubCl1kW0Z~!e?z9VQRPZAxKQ+I%N9UDruZbX{9=JYZ;0yaUl zBE#~Jl`!(;f^8^3=dK!+0yDvAWgYsF+9B(DKeY4$yY`3cx#SghA^pY(#=V9Sf z%_Oq&5dB`XSb+h51{yn&W-L+VjwZ$=gS;!HeM)wfa);F%^{}~dhfD4;i^lW04Tz=( zBk=G^d=;AMR$&hQ$!iPL+L}E49BF!r(2xo^$X!4c3{#aGv&r=x)N2}`>@HwdN_Zk^ z(zEktEHB{Oic6@eCV0&u4Safp{<-_SIKZhJy|F*oj8aLC78fSE1+?o)Ogwl+g3UOS z#Ppco1-KUageaNv-w<||X}JWw&Yzui>sE3@5%ZI5i%h9*dT%z(pKvbmK85EQvi;g> z4hoHDOMLDI;SSHbg|mKktvJVrjyFEM?x7Ira%FLPb4A`bJRW)}(@h^hWqEQ~m(1IR zyAP|(M*#u(2=7&ig*OgbhdE1W%p;MR>E#zXd3|i%o?V~QPy&tlb2q=puDLJ>j zJkPViHtH2mhp>i{RZ9WRcL?fbVjU7YueaoqV<)=8yvCog+OWuj(nX_!X3lct;D|7r z`S;Uk@=-olhzg2>O?Dc!Gv?2oe4*)I9vmAyPhjo*6P#6&kO0?KDRc<{P+qD36T>&G`i3wn0eN9zXp^ zW6u1>dIlr7kG4`Dt;IiBo&S6@^=yBM-zUO&-`Xzkuje-O)+4u3n{O7!SMpOt8*CL4 zc!nrCA)uZ=QCIbg^3S*8pYhZ3ZUTh~+E+>>686-|ebULJdH$>mkd)4rBT0-@p#Y_S zhPz(y=dC5VKyPCK&EF1Xd20}K4;X98XSpa7qz`|L^&I6w&8Ukv3*@QE>DPNJ90T|q z`XR$<`3I4XyLWjn5OJasz!Rv>|fM5%^ znlM{{j@W7}2PXlueV`M^@@yAdq`i^{i)nX_A-nR~IkO>OOgRLiMK5JHA>`|LHb4PZ zBG3wIHn7a!#rk_({8@$-URj17fMqN9KiI`=Lw63R(DWabkf$x(a#TL#&*YWt?|pjq zI*?ob!X-Id7J?4>vv{xHG6T87m|>!hS7VoiTO;`F@Z2@e(z9t@T8^u}1#CrJ<**Sd zv8ezM5N96fXRr>JV3-Wed<3E`P9Hqk$q!VPd!*$Ue-_y`mg~#$qcdj!8l5=Z1+HG; zXdo^883PAfRMfLvI9AI>wlz2A%q}@|W?f_$(US`0&LJOoWqiE>W6vQ+k1DeeCFzaj zip&ypn{2`yS)Ht&-Q?LkpB(~&nvpsSyl+;8m$9nYuInv;IbaLkngG}vI($|&3R#rn zdgR9jz@0y9Gx_bj@pEIya%T2$fn?-jVf>k{yl0JQ9vAE$C6HlP2(zUyAMs>YJ}VBR z5VX)e!_lV^X)4I6BgD=u9F_&lbe^f+Z~&0gHE*~qh#ugVMG@}MfGUQ@k|IN8ZQMcT zj0V_G3D1XJGaL-6CgWdzw6YYKv?bwO{nMFjpE2TqIg^}qpnU%M zxbw?N_s8ST*LU!LUin~0XI2U3ZlP^4M-Glm&lw=x zQsx_m0X63kSwjMGMbPq%TC+^*8?hIe=adOUN1@QrT3{(E=qEi`bQ%*0Zl&F5?IcON zK*9wqlh1-MBLU&z~ZK3NFTo2C&*YujJ1L5tw&>fZ8J^3VeC9I7| zvh!q4Q6@Va7JoKhXurg%b7|m-@H;B(i!paqt3!^po{Pq9Ykj9i=t zM(Er5v-xZQoJG-FSr>!{EZX5SM|$XHa4%uiTBAMKe3pH6;_YU3%~g0Z@fqpFCLj`y z_SjgoVi9r+sOhboKl?4Fl@PSyXtOA(`iqjcF_i8qkRQ_nJCi`rBxWw?YBFFW&pIXS zpb`d9#%7}+u=Y|6D-6MWo(BzNa%-Lek_fXUK9csq6m5>^x*ju2wBoDJ2ym81g40Mr zO`gPZWFE4!B&joVSQUci%RyS@NT_W8$)FJUuap{e^6xZmnc`wZA#! z!M8fGWidqBZXkr_AM3XoDgHCSe?na5jfUab?c%G=>BHg#lIB-y({B^bV~<}t6bWJZ zxD!8HmSqG%1MjzI&KeWP)lm?%J93yQhk@nGMjYs(p{ah=LA0I9U)r6Yg|(^EoFa}P z0QSSpnSaUzt2<{t@QfP2LFjb7tfMJ{y8| z7ifgmgjQTjVgx<3ym;fijod%aI?qn4ytw@P!`|NrXnWTC`-3&?IDS6u{nz8p$47}? zY4(A6dT*v~m8Wj#_w@kh(LXwT#^yqf8UKzy8+VQTpM|Mug7Y)z(h;YzfInZEb~wYUckN0wPQ9jB=m3Ym(){^WUNTti`I6{r)Z9y=(<@D)@)tFvJZchE zj!FivKHtNY`oHru>c=yeka7s0ukdH7pf6uaj{ZgJ=z&6X)O<^zbuZx^J$WrR{qmja z3@S|=299wd=;-(OU=WmwcM#K}5^Mtw4JwewMnG*n%eE4m>x6(`C5f z4!}@oP`UX$5KEDoKy_JFC_~i3>^MFKR$rzK4x-T&E81XYq!b_DC@r4#h1T)4zSmwj z1+YVOJBwiFlPaoFaHY_tSrY?G#e1dx6;T(h_4}ebBKT|=)AYucxBF$}*|{$8`Ccc7 zwAjVNxIJ@cw^k(Rg)U-G0l(FRGZVOiaBLSeVRmD!0NYQW^b$h)wOJkmn60+mw7a6U z9o}4s)}kfm62tlQsNgd}U@V#OfUuc`=oB9AkCv3u0a2$!s2rwet{vgz?b$POj_))9 z_*P5OnG;qILhdHj_P)bZ_c<U>h=zaWp@m z;LC(1FpvN;PTIUIKv&$A2?p@i;j=QL&GJl^a+siy7JrZuhtH>-JWnZ=*DCXT8^~=t zH&x^HO@3a%2h;QIVzORbzy_qfl-O-1@AgtGbFY;;>;sB(SZ8R^R?gfuECit`oB_+Q zXl5e+jee0+rlFd^aE1=U5qe&z*}OYA(jlP?S%tLIu=H;3VL$t%pMI;GaIr3&`Pp9i z*>2(Ujr5lr>1W%yFSc_}chX;MW}dF)o^57{sP)=Ld952?$;J4cNONg+tDeA)1NU-X z2Jx(Zw3qw*cII=)+iK#oZW%mF5{R?te%LH4xEo>J`tsR8jr=J*Q+d?Lz~>T2;B#Pt z;r<&2pG^pj9dsEt720S;KSV5~!0Re(ed@MjRT;mzc`orIf9p!FqbjTR}-c&r4* zw53C*wKjw(E(tXbry=jvSeADow2m}!{OfI%Ujyc&E!V8P(DT702T-$Chbiu61t{&4 zr@lk%s9WpAyV8;RUg9$e`v*;HVj2Q{^?=0M$_1`%6-?C_wTYh{*#QQDb-+FLmJ+rF zR{wT0&UQJ7b_7kioHWepIUv1l05T9*{MmRfUeH3#oKk4{z#N16qQ?fG9oVXxLEVsP zD&*QZJ*_Xp*?Y!>^f(TPLfS3jL6M?VJ%=w0xxjYRn3e`20R;N4BK)_ zeaF-yR*9@;4=9a>CKj(3MkWTB&yE5otFu!BO-4x)`ei&2M!*^sh}mNQa2JAX#}%yNLw zt)fG9oS!9@mM2ERCD5!?lK6FTUDZMjBu(YQ!NCmWn$ndK3LhLQ>#9G8)`{-yw#?NTf|`0a$Cqcnq+~*6z8eh@ zyBu0ym452~az&>Rh}LXFt7omEofp|QrVV{1c}<7U_Qfk-4(iZQp)Jja#E0^{gpT3+BEeZG77D*l=Pse6LYB);VNr<{Gzf8lVgX%PS-`|V!k zo1-f4aro-vjUM(L$fr4ef874+u+EpWI~4reWHcPJ?0J*+@J+$bWYz{tRS>KLd5$1sa9(S4Slhkq6O2BTJ?Na2O&@MqV7Z z(JePEQ+#$(e$<_puDCi0#ieK5Eo6C7x&~(^ir+@!R&VioCw8;FIED)cAi5eGTF*>; zyqEg&FvmOPr?^QIPtaU7utFl#AjwaG%#q;+jGBbtnFNc5OXI(R1ezFyd_{w-|MNi> zSsMP&L_gffjhxm;9$>7oJc1z!o5RF3H<>@rK;W%JekONUMid{AD192W>WJ={%=po`|}T6%mZIm&Wsi5qK$sh{qYzPa0ac3S)AgZ8iYdw)Oc{B&>i zANN}X5nwt0^{DrFHL+eA!X^8tGS`^Bl^MOB9{-a^9t1>3{F%%Ebam7`D2I;VGnoti z93kikL=WO<3aLPH3LWw1L3B1S=mnQXUpiRla^5-Z;PGEnzMz71GD!A(i09cRG&MrX zJ~tYY3HWp9`5ZB4uN)k0XQ&L)SBafQlh-MvI>f3WqK_ueilV$SgR}je`2oH3;Qn0A zhv-`hWY61VE=FfK`Lwu&$b}1sP_w&ma14dezs;Yc?fT7`UsnPO$Ia14|JvEMe`Y~7InyD{5$!x%b~q8@Y&NKe_ovU zBeom0sXt&GogBNiGJn09{WBUx0+~U~U|%kN=11aEB(|~yEIV!#0dxX)C`A#eA`n$g zp)If^^2M{x{Lb=BAvRgd-Dsxa&+{XPOz7%WZ>2%cNnMFgv6Tp-U4S5(S{ z1G=Tae3A{DmKC@(US6D8Elu28ow?VZP{hMl>{VGnlR=(}K2}m#<9G|0GoTqJ79n$! z9duoWA?Tdpr3dZ#Q)q2_TsXQlySX&HJU;@<;`_G7&rAq72whBxRbq(IOw7wwV{rj9 z4d#shGjeF@oH2O@77>6?s%9BJE21KR8rR?SEtZBfTA(sHBg16qbXsUs;%9+qdd5`5 z%2Cfs+C3r4mzvtIVBrg1o+P3ojtwlqy&8y52gei7#AQNK^9zRrN6oqyW>4Yp79h!b zy-=XoB+%@SZkC;Tp_p((iTg-EJ*ePnehLQwZc{&}AcL$CzRK!YCa_Vy3c1<+8elo2 zJ*+L9wF6Z!BL?;?+=WJ**o9C~%{IW}Y27aoX`T%|C(H!ejDQ&cjza}xl@hyZ{Mmx; zNs!DF)#hmYIY85aoEy=*UOgx!_NsB_iCaiDHwpg~3g+#GP21;>k4ihec)Ot&C^SKk z%mbt6c2&Sx6EkBFmsrbfrY&W%D)8C@P>k@nlf?{SB|f~A9s#|gSI0Gl2fLc)-9e1U zqgounIlK{H+^eKcdb|gbExA}LY?)7!9#`(&!m$iDQoPWie^27u+)!H!NL&|}E+Nmo%a_t00jW4D_zUK6;Jk8VV7=|F;H zd0D`6ksm9W7YDA$@MjZ3%X|ap4Ou1g)O89l-tB6v93RDbg9lPSk;uW7!`(!is`D*;>dhB!jmN&{+E`N?%axMD_z8M?*r@bH+ zy$)Ed9w=`t#f6ANC4gZYDnH0Aw;B z^}xJnjLpv(w+%Djz-bxR3rmtfd)}}!72XriA3pP?c)x`)hzkun6>&46m*{dN*6j!2jUG&49H zIBys~6p{tu!mG_FL;U%Jc7|4-6lJdk2*u7Z&fhOeeK{Kg*deP9X6Yf2QsY)FvZo0c zkuJl%fyq=bAgOU(`RwSDJXfV2mtHzB%HZz6+nr`p?vr#lOrOq>1<5TSpc7*u=ygie zl_O=(b7Us8^@iRFZ9T&=N)dTx!fJxHxgU8%Ynk4JYBX05=Jp_9Xxd=ttF+KG44HX= z>rD%7lTjE!nQ8dXid}5X-^d|_evg1qZOM|kab!#yEiP^OP?>DdIKbBuDtm}S>7R)( zNKy%`)u=MnoIi6EzP3dEt!9$skqR{#Qi1GZ`Uqqu-3!BhX}EX`;1<2wF;G z)6Z)UwQ2%iT6Drd#EyWUR}$3-LCa{uP&P+Nngfxr5P^%(9C+$U3r(sS+LNTk#-H8D z!l{BFIqyM$x_VK5asNAXqT&tyoxE*c`SgEUf~#Dw|toTtJbU9*nCAr>@1PwXWI(c$CPj|0OYcJB$h)6LTpIA5YZi;%#0!;Jz#>t@=0QtYbYe8C=CZmOp#K!nIx#n5S z(3I8e-n*Lx96ZP{5Su_b{eQHLB)bi-CX(O}=Uw!5KcBS!X0{u$<2Y-JZ=ALNey{hB z2OGbhuYYyi{p?WsXXnpQzK`}W0BL=`k1t0%l0YN7l@Z55gPD*VK|3mhIYayq6$^^u zj^Z8;+Y(VbqW5a7g$!4DeZWHn*c2n()Gq=c{M^b%^#r68pX4|Ch;{SmnJHAy_EfNq zutyS`CMar7&g}ntIBBb}3~PO@5tj-Yn9QC)WsQw%J}~gjDr5QdbV*(uH6+l|LL*0C zE#lTI6|2V_qI=9na~{dHS=LlNbC-Q`de|g1b1ko(bqX8EDULG*htXH#)H=D+xjb z3NnXA&=BTFmE^;f*sC&vmM`>c<$ym6GFOtSV6B`#gNR=GyUs^1irB;5pD562um@|KJCy#l>NkwG)xHfgCJbqe1usuvT zzh+{n7a!h=4{xOLteC)p122wsXh3XeBRl%#e(KAEEZ?8sU_*Thc?K^FKGUb<&3YB6 z-=uH}FOHw@w|PJKv+SU|0@0X1pDzD!*8BCm^&L3+&dUF~xANtk_}22+R(51h4$or` zYc~jwc)UDwUK>$_M1$nQ@6w8!8hl0SXb|+-%Gh~j8W#?m`73ve@aJ2rkY`V3!J#OM z_-~}gH~D3E@@6kLx}F}xDY~1uUS1e}doA_-QT@}y9ti!Pr_FEA)_*0Mz!_c~y&uo} z|M6<`pXar$61u7BSDT|NvqS08>rO`vK8rttqoq%_aDN7W z!WI6kQ`0jG6o*3S2&G;?=BUn;NWPal!1q3LQ|gCtHQe~iJ}9S``SYbY`)s3QG|%6e z@rIX|a}_)L=7;b(aF!n6&(se#Bp5W%Hb*Yd7yLPd&s_R%aGc|PNny?n5t zmke(8V9mjPo^Lf+@}gGs5LFxOP5CRkVKuMTvBy5@;YFFK)r%@n9(|f3{tQXJqGwKy z{y9L?BMLQ`9e;(yhcPu`iK{M(9=nF}nYNjUm&=p?BR?g7o~7yQd~}oMkyOyl zI26eA%qh_uege<$)?39pu&gGgtTN~Tg28#HgFF>a1Gp3X3Zvr+vDnf>C{bJaQ5YY!yq8XmG zCxBXa`#1*7og>BuaMgi|3B|ud1uayF+IiuiC5v4U`e7$fy28Qafl$|XqbOf%Y@>K< zIW}ENDV`udX_3@f^5!w|VQ0(9iFPt>`LSAD%FlXcsFA+`f)?JyDH=SUn}9|_l?g{E zowMnm0k$Zj0lC0)DoE^2h0N3n66oYqD}i)YuDsUIj0~SM;|De9-^^)y3}LnmH_X)9 zuq2Mbv+ztIXj48LX$Mq__M2eX0tia;oRSv`$$+zfCp1__94QDYe2ff;Rc{Kqfesly zEY)#4w_T3OK?3ZbW5VOz{1}?&ZgvKvVOMGtBm%Cv4VVODDJdJ^O zG@@uTWLr~GG8i5(WLG##&#WZJW|=liOE2>5s%Z(T$%9+XWWyk~6x3qHjnsK70sTI~ znY@$SufKxcEwX-Vd4)Vstu9`+#uXSX^p=oQj_L0Q5nWq;jo7^f*W@1AG z_r$9KtB0fd3^!%J`u{Wcp3QMw*_v+5%$e>!Es3H?Sb}hc@(w8P3mybO0)!c%1@+6} zOFU1i=NB4@3=3 z&yqs}ip_rm^9?DS0mxrs;JhW-GvxX6jS7+b+(v^#&}LjU$N*!N2;?W+Cy?uCmo2Yb zQV4o=TB~Uex^^71;VAaI4@dP~Ew-)we?qrSob(=%t0AokGL;-JAghFVb;Sj4N~_ z*Fq9#5ODy!9)b`TXi9?SIX2&L3hhE@|79&fvg2hnqPyB@wiL^;K}S1dl68UQm^lkU zyRg}+$sk(1TCX;HGSD4Z^r-ZjE;MXQfN?E?Ysi7Ux)seiSw1Q-OqnpN#Ok;dSu_}6 z7}+~W_si`RQDt_$L|db*0<&;+lQfGhi^i87AXCQ?G<1}pU?eBlPgYf*qycO~p=D?c zg9Vr2fvK+7WHX{A8j3&DtgC!g0XZTF+M*3=>jFPBk#HYlI4#uxtxzLgIVXu7F-_A> zb63zf2%5W2$?R6NR>+=*%kT}+a+5|g5%N$h4FJ+&PN$4VRN1Df3J__Wq8X$tk!c~q z^)3=NT{P>1mJ(I zSR7C;jjMbxAk0M;6V$J+>CPdrA!z!QC#?yg(L+L$1c%p(NN`c0 zhfoQfZOFvH#j(1|Tn@C3V$RAdvw_A~@9Dp{n&FV)N1T%Zwo;$QozfI|8N^NdWMIFJ zzZe4$SR7b|4u_Q&A0t5FZs+s8uGGS2Iw2kJR#iliYh;{LFxJ$$Ob`r++F4c`n-xZa zXj$=0|={#u-4~n7Ed%P>L zwStER+!%8B`P~LU1MK|EA-Xk%yF$J8)5(B$sEI1|%h@X1zaA5Uu<_9zT5AHmwLiYo z`s`l&>28}{C2Xkov~`OHOgShdZvyNh)9lSbYC{2|jN(ps9?F4;nO8m36w5y(XfTpqlFu5ESb3)AiMtC>|MseS*C6e5jR!tF z$gw7VU2G9TP)PE=s<^UzuvMp*_cu)oy(OO$9tv=e+1NBwYg3F@%Vk@}?8Ej9TSiX5 zwn};g!?}_!V@zSEaLK^nx>exD_H07;l0CNI-r!1+_(caEOa@J@trW@pX}z;6{=;L0koK5n?(@z8{Nisz`DFI8vJ zda__)9H~$5-mIhS&;`Bd+gNr$ev0zOr4b3!g+JZUV-D_<#@y=_sIt5`0KborH%kSb zW>@gpQmk_pIyPtwABIKCH^YJw3OHBAnVlHZj%%a=&Z=q2!Ln$!C4|s4j>wthm8nJ@ zwcyShn0rH>%^QTi-mEW@_%p}TKtjzDr}ayO&^rzO?a?0>4>r+CzuidipAQc%gG`!g zAZr2_^1RYi(@<#sd^{j})XFp%`M5EGf%B}!fU70wnO+Bbj5IRax{~8JcNc_R>(iol$n^5J`mceH!oPRP9E!r#uO$fpc`Jc`PKc5XS z=hw?ACmrDPPbXmB#*e3XU)26~T7P?OiP;@D|9EF*0zZuh?b)+Bs$-bE0cYd(S{5YG zX0pwa+8RzMZX+t_+8D7E;nln4>;23NYw2r!jG&jsHZnJ0(IDv6>@`8@l)>lh*jo1b zAoVi7BE<8OOZL6?mj|uCpSAzx!Riku{qN4&@aMlh=>2?u{oh{eKD(dZDCF)|raQAY z&_9bjPySPC@}D5j`LTZ{VGNrZ`~9c{+VQN&YS8o&;Or01kS~jw)lM~BqcNPTlZo`^k=H6)mD;H69>;zGqPjQBIRI+wCC ziDmbHOy9f)bp(Rpm@58^hjSD7tmHTds)KM5C=@wzESShs;>;t94hB@ja{w;H3;50K zD;PMqF@+?lIm`-V^6UwI705Gh@dKYh(AmXKLGjBvxde2&v~&Z#B|1##F4ES1aelui zW9rl1JkA?{IHQO*0F=x!pkOOGE5r{wXxJCj3l;7;ui>`{@+E6%B)fZf?Y0O(h@0_v zYHqxuIIw7#$3V~ypP|sspJA9#Wo-!~i1YK(6d<~hxh}(J^xHs44#`quoDoVOotp%8 z3Oj?`(LCFfCGD0LS6W$GtIgk{9PEsBgSyM!LUBFF&Ed2lUWbcydkWv|Fa>uP5sjSH zm}UFS>|FjT1uQFI%ocDefwwJ4D6w5hWWk%RmGwHlL_ki7U0Z45nsJE-MR{&;f%-YH zD$d5Y6bTWHH;XU*^KDe7+jTvLz%=8iA1q>Qy%}zRpic)v)25e(oXgLFmg$9>D2-WOgz>C4u^2i9 zttapqHw@OCa>yjKf1^Y&&5Yw*#_1yoD;Ds(rr?8Q4K}Nx-=+k7$(75;9y^77bK3tpDDLp8E&Y)CCkf> zgN|U`kY^CIRM2Ll0fMG+64?0*(?XM>CXgJ=EAg--no9U8LzVIRqY&I`>`SN+JP1-Y zDl7ReCFJ>W;f01(MQgn^(?G63P~pr@YpHV>M3q$`GX#C=T4%OhTZPlmK$IM5dSKXOSWCAfM*)86tKOvg|LY z4~wRK7biRTr3C}aV$KYPEob>csb&PLjTj3xQ#r~9RkP|CUJm@(VK`!DPXgmgnv`*7 zP0*6{E2Vdsou*?o0kE2H)!`>AV_Im_6&r#UMmEn4C(O{%82|bq@lu1sL4<62WF^D!HbWl4xe-0GdnX^YHw0x|NjtAhK0>Fc2m@Y_0x#=DL?2~mM&+KrR z^rR9Pqu_iwTv@Zlc24VCz$S@0;7xbfAQSUv2xmy9xON214`)vt@|x1N0SbW67SRuS z;Jm_>)q#Oa)oftgcsL`ZU(S-Y4V-RGQNsA4wGMK{$xY`BIOW&33O8jA3^g@OEg>j; z)e$SWjB_QOH8bQG6#E24nC<;>6Ab4Wr>HV~!=bKW_PCIY7S@ojS93ru4s2%8?9z)m zGQVhm33-Mjq#TiRjmO^W7feQBsNFDNBhQK&X5+`OLQvX4x^ZJC>cJ($yJl*xe7@k% zAmU+R6a~Z3IO;Fvk9HB~O==swDZp01WXO{1V{KQS1`d{u2=RtKaJwL;Ev&6q{yooG zPlhX~j+H^79hq#vzQj?bz{DCt*x6OPltkqUO6US<$T0Q6#X``sHI@LF-US0U6c-P& z>f{+72n_UHV}@eUQa;O41M*n`>j5xP?NTBEXOMuJwT10^@5n)g0SA&&dq)hOvnYhq zl0uJCV%Jb*1LDy2!I^(LY!iqO^Ji?I@r4F==rwA?AjBdBk`P*v%JScUT_c|cr!%Pt zK9g}A4Hfi^`++c1ADDAyhV6+$DQrz<>qawX?8i+PuB-?C?gJdEKAJ?kdHjK z3ilFM+3$S6RTv&4(T!w2AzWYS-Z$k1%}0;>pQiLw!XET+DZ|y=s8h{u4D+brrGsG} z&I~9PD>ltD{gUA-Yt3!h8H^wDEvLlH*|D<=xg8)o`t~+e)7obuN){#7{W=7kd&1HD zbs!VY#lgcFFdRUZw*JyCXimB+zm8*S9#>hmE>#nH0jl9(jhZj zhs=(Yz0h^elmMI`md(~9a`q6oHs&n1jX11fO+ssu4mFm5&kB`TnR}~|;13G$`J204 zw)~gKpY?ZJ{Etz1kGG$iOC(;3fiv@OA>`RJZ2!F1HYnZx_OQ*%efP_^6sfQ?dDfmr z#Crx_HYW{~%obaaxP()}%RuG}EwqfFtpw8v)yJ7Rc7a9?eXuhA>2~hNvliaV=$|px zfSm$<gbaO+GFT6Tv~$UlP1>C)MSethisw`>KNvKe_s21KMzCj5QIcd zq*D~pXo)v7F9V$WOD_YW;m=A-H#f4^yQ%A#TGZ#S->csG?tTKV555CGKdb=5e?Dn^ zV~qoriRec!ZoA>{p(rLS5@=a)Gyv2gfuN6@nD*m(@%=#+CU9r@=A-Hj**t>ZTT>@h z>A*>%(1c&aj>8gz^l}Xt{tSz55QUI5cE9=(%(>m2-D*hmrx@oujqsp zpb)=kQhnj&H&^ov?At?;`ClIPaN+pneE8FY?oYUIob|pvUj5&1;~%xyTVAToP2?wD zD2&6L{~#9*i$VyFPK6MJ0lh|Aqh_Bkp}t|{fa9oO-HmoZeuO_8)&nd%t&O{b{gOa`aY@J+Vzp)iul6y-TUCoN ztY_jwT0jHNUNX|Mh8Oc*%Be=gH-_YZQG=NtftjQ2+frQc-iT7h)42kfI2C}cs0OKnYw?;qh78y{7Z+g5*YSKt04(yHo{!FOGlbAArmEYysY z6y@hBZObKt0Cp)$ zBFqY&D2k4o0X!4UV^15cI( zLktBLbk`0UU(gZTvt9vD3C0X*>=fsuAI?n+inWALI|MRpL9#bSQaNzd&!Q)ffu-?GuBaZ7GUl9tNa zh1N3qFby_TyoJe3LSYjTayN3Pox*N&9(!=Y+mYz5l{feAlyH5kG$WaDa*}1d-^0{p z0XT228oKMa18E8z4V3n-8H4UmY45qFBiB(9=)j-3xKs!=<)=*xAZYGw;b<0|&)slY zkt@+BZ+44kgEB7y0H4qL3#T2f<3xebnW@D_b^#gi=@9X7V!uuF!zCy#A5|r2ws!5l zY9v9>d!0moc^<}2YUFQMGP9&sVX;?SYA+`s&$aw4%$Wp#MgrZ)CmN`ubG*o~$hJ|s zT>)7y-P-TSsD!6c1RRumPcKd4>jK+nwleS;NbMYGv$0>#Q|LrmfZ7DcKx|x~*~&Ad z&1(+jopz#Mn6oz{^vPA&!PFG5Nbu+i7F|x>YUYzWyb&-I*+$x}$7DTY+U74Uo@_?V zE`$a_LzSsXFC>TF#;EheB6LiRf|@myj@s;?31SEp7p6v24Vvy{3G%qx$&uiYpReW! zpZCcig_ckJ8GbvIqXl3Y6*N8@ZpRT!Env|QT?EEBE%X&L4le2xTCU5Y(}gd$iX_)R zJ9DOjGIHC<1Dqku$eTHle7x%{nl0jIgU^6y^Ma0gWH92-(mw}oEF6j_#sx+WxY#+T z!DsASWg0+Dk8@{8nE+%eWJ@_%m06JC2MAlu$RM!OS8p8oG_(*U^9LRCRj{)F&M-`A zYc2H8drd(|x48yKLq6I1?ngc3zAUv{BIjvJLTIGRHh#MMY_0mIb>iSK7{OlX<zpO`wU!+|lh=<>$Ic`0nfOGc zQG*U@(ii-h*O1ACE@+B)Vdf3OB7})w=FhBvD72Q^rp!@RmFY)GM=kN|7}g3g4haEp zfX^6B$ZLY5g0V)JMQ-h=_;bwdL!pd2c!wG~3f-kXE&J>3@GDt=AiWkLufV0%EI+{U z65&D^f@UyqW;s_NZ zK!-t(G$G8W_Th$f#hMYCZ3Yb0!Hk00nJ=`>RP0)HkVYHzh1nYDM#Wtr0w5%o%2e>d ze9W55j9QTjZQ>}pU9Bwy9gQ}WFj}wXO9ZS2M7tcCnoQQFAQklU{MoQ@AjVKBcEz8~ zDj8xQV`uM?-9S5|H}nBhwiLX}FEd!j%g&={4Ppjc6S36nRFia(x9+IsZ}A84B`XPo z@a6^Wifcb4WiQ}srzPwxjkLUrfzRwxP92A?VHjK^@Srha$9L=kjm3&rmxYT353BF5 z*I=h0zITR-NC<6%1kwWYqJ0vJ;Jt^5-;wYb(JZIX2#GdHnxjdnoj;@L1t)&8gP2)r zQsNBa!urEuN0LA2$8lF-r2Osg(?0a$Z%~Ef?w|InU}qHFnxlC^2j#OHZro`=1wY&o zD;AnI6|@hS5t2mzwlxI-XEI`j(&#cURokwTVixV>Q_R`as=S-8I#@>URH5rmbRA}r zhxY=&(SB>uKn7~HCI1bHb+@ZewpN_A;!yF}=&leePZLb}96ulcbpl;&0D{lr zmYWUSJYcP?XOO~nlct4+Hs?UKa8w^sz`qbn5U$xNt3u?fY@AuBnNyTFq@aP)9y1rt z#R0=0t(3!*zt+q?u2Y_Z-!ey~mdm8k;<|`hr*jJDl4#Azvk!xX;${fT8wjmdJCv9T zngwTxSSS#*jhTKg5-Taj%ZJDk8LQ7SQnJE{+@e|*DD;}{PwuX0j!csk(6YGl8N&R| z0H+Z^cUTY>?Qv6!VDLHkau}r-i1yP#vT};HHy~Ji?iOwUwj^#dPa4w2YXT;Ow#NtX zYDdbzWPOBre?*Gz@HBy4KOIWUQIdaWdcWe{d_N4hKuN|BlV?Z7zDpf;c^m*n_N38T zU$jPsmK{N}<+kB03TZP&&3cN_(F--QsxUhj-CdU44*JdZ!sFWPtChJ&wdq%@w?V#= zJ=Ydx!Qpb{$~;~io~UM+T2TlElc@}LuBRW@lH{pxCBZ|(>2VCDA<5)**0N4_<}7@T zK?k1C2%b^nW7%POuk1LQLzsk+aI5w$f7AI(hYQn}cdBG4_doRf2g3gb{AK4qK>mmP zVy8j{C^R({xNy7v)qd~0y%we%{GmB*+&-vI!gbGDx1p(kW$?0zpUoEv>*h&Tc?fn{22-zZg{`P*Aa(w{`O4k9= zlvC|H| zjG$Q-htKe5N6@ICISbYFz2)n?{XI-yL*%?l2%+p4j?iei#h;BiOAc*$?51(#SkK@3 z?y&a#{ra&xG?_5{LL3K zH!{#=}XQPr#v{v6}nt9^~OZ~4G`pQD#Hk4=Sdh_k;}b^< zxqM9gQi+ey_;XwypZotO+d_$1dVhS>})K0PDt6b%@iWPY!}Ac z$$6$J{|x{;1|!Ma;?MAQDPw1(i-r)A$DJcHCvKUUVb&<05$Mt;x>@KMMoBC(nqKhu zLH!mu9U-eE%0y9Y04=5EcG)xJS@0Q73oH$>`6PJOtPwc}ljmUd90O`>H*6_XP6irG zc$D11!?~w(S@VzxMjefvMc}>A-N2uzGYX=~8~9bBP_Wha) z6sut@FG$_IOc*F6WFD7*<>gvzuHZQg!A254cif(fG{zGB>VX9cYB+gYUL_0<+-;eR z%%}}Yb5}#5_o|7NrSVFBx?PkeTzX(VQh|6+vuLPrySat^Rvv*d7ZKD9f3~Z(B={`; zuMmww&E|+=RM{l@(z?s!S=d=?tBV+AG(vzgw4dbInG#*oeum(5mCOXf<87{NFMrZU zX^fa(ZY`&s#qG*`F+H87hmct_h*fN^o{eGHwh<2rb&zMO2z*5|MeA2OiMnYUj zjAQuBlL#4o=N4OqRJW7@LBpKgbE8>IcpkFd$|pEPO)Qt|B^+#s`M8MFGQEJEnfsyH zFY}GTC)eMV5KK1sEb1FcpkdDUIwH?FU9iP!g9H;+%|ZUCTjonfmeJ-8&7&v`pJlkg zAX7Zdnr7JCz&y_?B&KWG1-LOMVnu@UGtd|;EG4sfdbpU`yLRGz(HGsB?S{BF<1qkE zI}C~Xh@ZVCXq`lx{xEL0D@SN}^(Mb1hbi2iKgB6xumFMJKO)=XjIaPKKXH||G zG<gN3fl}xqZNSlB%Vp0_8ow$T*#X10^4`Y%X&KFb=2>Llw2gM8AD)) z$!x7AFVzN_v?FNe&oP1~;}vufokd6DXEEx?5!w;7ew>ata_Fe|b3o7@xykXbC^Q#B zm(ScbkPX8>*);<1vu5kq*)voKl?~Vm(y|C3S@X@1bUE_hFy*kkkz?%adA9PkFslm3 z(P-5ulqy*9s>DtOW~CO66w64UxuZn><&wc!@Lu?HxHl}&p39_tr~p`Jwm@A{K&coP zn3fpA8PRF5XRtWt5KtFd>r5DOtC5&_DZp88l!McOv}9JLf>yvg=g%>4mc@jVb~#{h zIuu=^X!G3g8Br+SySjo*^aDw7)9+w5!jf8aKcmV5%aSIpOM*y=56nmIq*|5DbryK; zDdx}5w%drJpKghJGk9GZQDSup{DByw-KAy6>4L))Qf(M?!k9~-cE%RNJMt~VKr0SQ zg#CITJP;hJSJ^3>o3!I=2fyGlGQe1%C3Fj?0@$xZV92DfZRl}@Mc_n4%O7uJmLk9F z(d#0C`YtlsWvQL-bVO*)oLTB3;3gU3qtquzHR= zrC$ikBhMfgtfyOA7JE>RODFO(>#=*`M;@#m$8U8HB?y~2I zSHqumZj^+ets_b}Q3)ds*e~}y;62vT8<`KwDj`wu?&;yxye22=+buMHON)fHP1iTJCH$-~CYQU2^J<16O;+4+3DW$+Jb)8~yBH*zmG zQ`a$HCE6hTc{MW*h{k+l)E62A&AbM=>zG=<*-yg5zdUSyepKU;<=+WGh-=fsp6ocz zhJ>&EZ?A6sa9nIBZYL&Q%#6MGJb#8cgQFd&y2A#5%ebgursu;^L(sry=g*FyeV1(v z*+w#I!IjbmhlLHjsVm!&Qv#BGzUF8h&pU#%q0+LC*0<`&2mkz8UJ{)Z#`CMyfP@%# za42TN@mUx3V?Jz9lyYpJb<~YJe7@%XVdsWH#tnwXBmV3{Xh89$!N*qBtL45e8$^v0=wt*MO?QWI1n;d5%A;a5OnW7g_c4xT$}fv3~tx{ll$4FBk>3 ze%5Ho|4IHzUsq1K(q>%QtHrxy;uA*;#h?9Ue|pM{l{=D?oaq7W0F!>FV20l?^WyR~3cR$K6+jGdc`duU)5-E7tkpBc6Yp389+ z>JAqXRKD4>&OFx22d(1K;MQjOW_d~O8KC1@>RKl?*2$uImN`Z%H3z^Hc7{J2h?bc% zn&;vxM$Vz)%;-Aa8UoIY*6e33gMNFwTbSx(7Qm8{Kr4`9s0JLju?Jx z0Re@+r8%dBAcJZ1k-#=tEgL|_j>B-S57qcHg0-IHl~hQMvOGP9oNokp;?Uo);ii z#{wN?vf*w%K|EPlt<0^YMW(%!7i@R&%JY4GZV)vfiyw9oQ*gK!juY-M&=No6Ry@{j-gX z+%s@vUR#1^em;;$SY#NF)?S(*gV;WQxv}CD`Wb$z@Mm*o7Nd3yEB-7>2^p3ydQW4w?aA2f?oZz@wAon0W$TQHVDCQ8FBImK)d6=|n0tgeypB(qiY& zwgrR=LYg&k5aI$MHPdbp$uu0*3^4@2A;9i>;RAD{X5nI_*LX6E&7xA4kefpi(8|x* zd<<68&}OPZ)Faumj5r{Na8Aq((55;?6!ydtVThJnJ`ZG&>5@<^KV4lBW*nA4lvLA+ zKzmc$Qs|Y1sSV@%n$TmM7<^2y0hpma4Mt#}n%<7aY>7IaV4E7D4bn<*sP-0&KYKMB z8|8*!%M1@z97AUJGjSF@QW!isD2XvLnK*G>;=D4Zf{rE7g2`t1?3`JRj7XzL`7=LD zfzNL@6qJy1uciQn(14!%RLfVB6pu|8A`&zEMbs|*)`&DE%+#SSfLGVfz`Kqbe>OLX zqKls$L35Rj4@>IoDr+t=8Lf$PV?adYx#5tOU72YZ@}*8lrh*0t3$ePT25j7nK?Ht> z3NIyy%_otUBe=LWU|vQhK{7#_z}t^D^1#^Owqg8PjMt>m+M3ygAzZ;{NVO}6VZ~0N zLAZ>HJQx{xB6KYC3PEEsK6r_oO|vZn(qR%bO~&~%c@jt88>9lnwl~LNu#qHK@2A5~ z<&ePZ`~uMoJMd>fF&xhcIa`O!)D+xf*DPDv%3l|X4wc31ce^#ppS7fs8wRuocrMX0 zqF;ND9!@AO4PyuU8x3|DFyzoz%eipt*MR=)@b34i4erU}nX{A2cRxzO}&T5&o>MA-Kj6kEzXcfcnqea<~xvTgV^4<*sNSW z0J#;);dQ`a@#ozJZ1zugTZr!DxpBXRL{Jdsxc9@+0MXrd_uJnb)W1KH`{>vAYf$Bn zwp);ACxL8X%ktmwwBJM{{Q)HKPW_X;4rbBx5+4naa3^?Nh$2FFrF;g2N>wY`DSRzc z2=W5*ro3elo*k2`7Vd*T%8h+yMJf@uRZd%H}V!pJ6p zes2hM%s*iZZN1{p5I2xtX;w`dS%i0T!Js8EIw;|}H+fd;?c z^o-QY5r8!^992-^1%EbxY=>wQ{;Z}<`D|2HO$kl6(|~T6t)otrwA47|QG(y9Db9KW zD2f)EV1oT30^`^C?iDL`DR|H=+k#7NE;KC!U4I{UYs^X3%iMA{yo^N4TH!QXU(e`5 zgvTPjGQK!$^}K_}Hyg{Z_p&6PyC|;gpmn88BCc}UWNTnnZq;6stpi(T@lGEBe+lt6 zU6b)$=g$yh?r<&*TapinhYQ@pdiG(`Xnoj?Kl{zVqY5yuylV_E`^U|Axl_BL!l*vR%Me(^LPac{YGmZ@$;j~3?LfbE9EmU zL7QcCElD}Mr1&VO$Bn?8<3#(CSg**w!x1#1Xot*_Kx07dyOCa+LvJ-Rj-zRWh=lw> z$BW~&>g~513;ew!oB@AK^;f>Z(Ij>p@3s>B$A$hG3XL5!{28-orL7juMPFf?zg_3w z3A{%jr4OsOVW;Sd?^h<|xzW0PBxSFdvyo@1onsJf*jbSWQ9DDVse|a3vmVxFp6w%S zM(|ui;Y`56Zx0*tc0RyQqarA+hi*Fh&0&RPfVzSYhQj}ycYx2tD$# zFMYkWIF4GI$b%s0wbUg18Q@HUJS(4ig?SA#FQMGq$W1eH7UavL&Ns&`oS*;gy!Y2f zy#g+P{4ObTL|NcIBGHAW#`Wq=FgG-`4WHD*rHK|6Gu?(6^QD) zaeXqrXrm=@{{II4{2RjyJ#ElmVH*W&aPJ6R^?OFUT z5Dx>9aA9Sum-ih$_mcQ3>-~L;DTdsU*Xj`~-l@zlr{>zl>;3%AN(LuhLE3H>S7a;; zZizoDww(xJJGam+VO6n+;Rd!Fa^WZh)iDZTcIBU37)Od(PE2joXQ59ka` zh>8o-Bw=mHbLRG-a0}RrsmMxVV!JH=hr`z75zz+W&lYWv7;w1ziV_>ow0RjpH3N!K z@*MGJNuZ+f<#0SGk{s|l(FOAY zc-g{%MV`%{*=#Np+AoNfJ4M0gcHwZag6bQoGd<$+!AFTF4t#j+Q#sD~QNkneJ{hL; zYKCGR=62e}O_rU;2WByCNLkD|a&=b5gx2a#8tg!)eLTL6%bh=S?RGj6JTs${f#Mso zyH~?OG$SH3OnkPQfr!F92|*|~3?L`Wwx0w(WBUw+hCIuB!{BqwpPfkpOM%Z6N}o)~ zLZSg~mA=>xAR3GbgB5f&Ol{~=c-i?gbebgoOs7U%!LTuW<`iee;AJ?lqhRk8E~>(f z3VIdSCv%oz+n{iEG))B!09m!sRJJ5qpefGsrpP;L7Q`MDQ8LpG?ekm1D6!BhyWS&` zW)hqba>%^U%0fi3;DBm+P&|u>C#9|@)rUXh(qR72Eo3alhtN>$XsK$rA4yVM()brFNIaL-zc44yta249{=u3%!cWYc7 zA!zsU@cQx=hV2_Ur<&TgJUGHe%Bt+Lavx|gN7zvly*9b%q99NL9#qO z;IXcDMkXrStaytRmq0se1}{IKpt8=KIrQ;{jC?u8>m%Pqdg_eV9GJzKg__l!-e-5g zux6we{Lu!>0-DpMSPo7UggC@v8c%6?mDn1}?1J`1xe*4#Fafy)<{M_-8b}lhzm+!9 zGLSBa6G=hhIBJ~AWA-sw1|S%2ujl(91)0svSzTBPM0(fa9vW}gWFtEcjtV}5VO5A- ztvn*oT04Jsj>lG<+3Ygj9+ux`sHD}R65{RkJo-|gF}u`+p84P*Yy!@^btiI;f^o(G zK~ow23>ZYgYwd_vbE42IaBo-!$^L1-`{~{GC%f9hka5-c=0NXslR(XGfBM5wQp012u*ZCRzoog8=`_+k{Jsj?nsi# zAT`ddVDe!6*+}Vj(P(q!$&M&AFd40&17xV_)4e8a^AXz1W?C4ztH^iaipH@WnNp2a zr6cAp*tiq=G9Tayr@Y$AJZvrj8|5wR#vmrF_4SOXxOh0}{mnWOXyw? z*VglaLT8x^H381fpUEf?A$|3;#%TrZ(J<@&vFSK})*I@@NAxVl zEUW?7eB?PqcRoDpS7A@Nqx2@iAef5ii(&|N4p-J8KVu`q6zp>AssWjO@IEyTY2vtQ zm|oh&&uoRM5j;o08Ri_rXO5E84l;PoZ6{u@FUp9cdRy+zkYU3AH86Hgz1CQQJfng( z+4BWqHqU3to+*!Uv?FNOMH`WpKsqMa9?%f+GmzO@lXg0mPs5qxyu<2I5KRdPnmQEX z!tr`_p7ch2?(OE%TfCc~;DbrCfF|@XuePyG@&DKtyH(=Y617kg=o#hD*;fzKEpft^Xbd-CH^hh4BU3I0qH06!Io{^exA zbpGXh`SrELL1p2zI(68Pv9t4M&zMA9F&T|ND@3CwbIFzq2T=$QS8m>4nS9iEX}9>t zT5=53jBN<|XDBr0&#rlfJjaPSuI8>+7GHU_odi4o`Jnstp~(5aJsAFcKK%KC{(^jW zIQaf-@DXEe-H|5+B$WB*Ko9(!`Q>M+^C*A@O86<+XX0H)U=1Lx#i zLz>TX;JD-}Qua>a;epm(=5I0YjWaQkiwDD@=lFBbopLCyAGa`C7#}4=IeafF@d0ah zr0@?IM0h6cke}jB&>BYO%>&>Z`rmkJr+>&_lPkh&?r z-F@PMAw=v7IEzBVpF8fwA&+SBv|f6rks$cjFn6<4ydi*@xeZ%3--&5>9imOJp=8go z?K8F;*%`bG1QLPL@LP7VfPn91=DNiRPN^ivHmeeC;xK^b7A^-sJCqzZ4_ihideoFv zf@}(iNe7_?Hkv!cNh=2rJZa(uo!o8BBIG{o+*&P7lozFy?PhKOlZoAibp{~?gY9#g z;Dct@42D%ggKgSckY;*TypfW^r1&|m$aqua$2tX2m}J|EeP)7Z0JY0;1)tsT8vYEU zMqG_98nH3{8`+84(&Tmx3u_+f&hS_Dpn2Od?_r&2kGJn*aIKL;AQ!|oHK`C04_rxk zj8B=nrNEy>r-RP}B|&ow#YIPr2>gD-Y&tr*txA%?0Pz^4bk1_L#<_X|BF&oPXaVL0 z&B=4abk|^E8j&B1JS&9v>4;I`O+g;CYr`|~aNx-r6-S}F_&=i*jp4JA=P+iNvvX$W z&z=_q#;JoXvsREn^@x0TtvuUG>MH0#hFO|m?9BL~<=rF*eV&`Gl10isbFUHR4ihHy zq%AB6nkh(z?M$2D(Tg`O4X}AH1Hg^9n>hx!yS4;j_U^d2JP?s537Xp?hAJ4g+}^Dd zWe;8PJVQO}BD-~~XH$kVW*&$*hLuVjwK>Y?jGSt?fn{1^Zw>JIa{g?)F@NU9b_uj! zYfj&9rch!dzQq&*xVpz9m|haz%jx@#1z`K?$}DE)!*b$ijiUvv?H~)1JsTEJFhJ(I z^v$vxaW&AjRlpQlrq*eZXP_=Hxst|DBZY?saR%Yf?NX|qUqb&3c7{Kbz|o34SeR=N zs~73v?+oJ&X;7jZ zH)h2Iq{5(tjfV8bFyVe-w^7>f=lR|sENQ(szLFsT=uEFfXvHx_KTMACvE{4>gfHnP ziJHnP;gYe_%G_xZ=rAS3ZR%xhtw%@D4xD4oOooy$9;?QQ&YuG|=Mu{ldikJFN23s5lPXYww7ezum!)%lsl#f$l~XN)w8=t7=7xi2(Z8F9d? zdFR^1nGjvEU(n@1rV8w`MP&`RmX6v?q#X{sz*Ur3Sklaj4HpB40ka_)8pW{|h75lO zAVbc9%+8se9>bqWj=Mwek)W5R)S3{e>^m&rU=UPOpTr>>Og^qjhF&O_r3MmcL$&0c zKfiA#56++6hatwHU}y1X&KgL{3ov9}-V{=28l+{3PLZMFPm3(pV$zXuGARxjycz(} zY3k#@C-L)I1{Y|?4~1s#2&8qcaa}SbMrcqssGaGT1ju!kEB;L0u%|O&$fx69wj3G- zp&G*#8M9STP2+lDF_h2|6nnSsG-0BHM5IGxdj>)s6!g&7*IGdM+abuS*3&SeRmOMH<18pXW zuR@s3^3;z4t3{iw5zZpxwAQzBqS(Uc*)27~I3SS1tElJoZb=yf#~Bd;RyY8@1IZCemouUwzce?;mLFjf5xRbX3=*L z9?K@0EqKuQvrIyS2PH_Blf!!$HJd~ks;OiWXt`TpPU03K2wAb?*e?4iu6%Z|EabRZ zW6UIuBDFoMCLT2avl9Js?WpknRw?R2mGOnv1vMSD*eS*l+Y&`TS(8c}6*NX1?+$e9 zG7Aw-^8<;r!Qr~->d=&Fv&p};D#r`}qxdsOSs2;jutVlF9vYx#h_Pt1QQRmWB+Z7P z-T&DY(b^ir3{qhuz$k>pa%Ihd*4mO|X93<&KMiDd;|?KcxqlQ{7XBeo1_X`sFfli` z>fAzC_%josL<^#+anH!2gxkhQtk#nW$}WSialU6Fzm7QLcdV}r>&8P3?o3)^RYBHT z97DCDui#dr*_3FZBo%gDvAR$-^sX3&n0}iIj;8%At004Gro-jajUix;pdBQxryE>Z zzvXo4jgW_d@tMMEgZs@S&<=b3!%jH^rZsoAVRl?cIt4WwaMrTZF9=#R8#f#Cqo%}% z#Fi4qX=BrjJWshYc4K(WaEd9M{Z62qM_S0s17t>bz9Y7Wd)x z$^uWNjg;l(++VK6t&Ppjl9mU&dTk>%I(wo z?8C;aD|n^pZOHlA$g{N2X3a5)SqByzgfF~b9{baN@yFBZ_s1)|*@4m+rwhH-anzFS z#&Hdjj3}DKS0CSUsG5Iy*d@sjk~)K8?h|h_0MdzN)487#{Eg6<(d?ru8)&Mp{tV!r%x*{t>&-wlQ#%HsIY_C2`Kb1 zJth|poHranCsB7_$7ZCH)Ev=-L&AA{`RuU!FX!E#AFltG)AheTSpDT>>zAXA|NZWr z4_4=A$F48ke9^5opwMJ8X8w$r8FcI%GUm_hlGpCkAFd?Me6fTvI))~!@j`p|nqh~#z z_jAk7jg9ir%2&D=J>>aI6>RQ)?Y#W?`f-V0i1_rl{P_%ZE(%>=ZBH&}0jV>z`ND0( zbj}yMKxT^{Dv`4Zq~*Cm@&`}mzmc7IfkxJ|*S1&2HWDva7H^%bCU<%>=iLPu4%iAU zcxOHW6^*?L2?CpV({9ImbiK%m6@hphc{b zjV^*N7Xh}oa7amu{cL;wZhh_)UfQA4+fd(T{svY9aA1Y2Q^?mDxVJzSUb0zi7RG?F zxHr^MSIXGI`Li+zwh?24=IS8mBAH3^p`8(nE||1i2wjqCxHN{eNOR@F0fHuFnLF)k z7wZpNzEi^yVjf{O0S7_Q`;Ga-I-FU-;O^FNR4~D_Y=jqJuxN3m%Z0?EIyO=YL^Y7> z&Km}V#c5@&0P}R53xR~Pl8m@6(*Aj`0OQ@RESQV6t_xP%jH;I<7Nnp$uEN+FtX4qH z^7OX80NV3vmMh*spNuhu{3Tdkz%qCl{%@Whm~v#XO$O@HBfS7}$y4X7hp<@+XNJL$ z;!#;Oh$z*9{@F7cJk2s4FndEN7{0BcW(@MnCma+!!?5MOkRB&vk2Y=*0dQEJahzoRH>|^k!YMwcNsr3C8*zNM*?gLnF~)o`VEJ%Z z2BC{BTR1;QzAk=t_)H#{Oi~6f==RFpei5UdmEr-0Bn_ucn@D5Q8l9NpIH7b!KZX;da2hLOrB81ih6!C+?y^OH{T{kDFFIO>E*}`kD8Ie1H)x zv*08Ra-;ImT1Fygq{7I9hfrCwo*-75A!3yy;a*$PNY?A3&Fe{L(TJsW1=sW50`k7iSBKzoz`TeTo>Rtu5b+A{$@ zi{1yC9SEw?R0ej@xGL~;AV{D;9+(jatzB4iSR=4&W9IR|*hM-2elLX?g;+Fsvu<{V z3}=p3K2T*x(5`1@>wK8PP;(?+A^h1BV&)6fY&hCMG=*e9%}$#E&H~Zx#JioPw>wMD zqP=(TgTH#CFBoA<{0& zg{Hp0CdD$06vT?%F{~Bvf?C+9at7MWT;3VTXq5bub-62xD#JrKr5G?kwb=jY>pOLPW4R$>fM)#gs6xwX&Chm!q``kpXGk8F)a@bcfs#{inC%;&4OI zl7FL{^-z67z4%XemK2nb)d(=$jG!^Wet)&XQTP>v8D(`uo()H1XJMcfX(d8mfb%ms zBv+_L6hd~{vWvrm02(B1Tb>)@&lne&rW9NZyF=)GI6z#ylCPwv(~+N*!KE2%SQxx!g`=Iyc; z!7Mo7fn-#{#LqxZ=Y*R6R>2VQ3al765BW3SQS3sXBEXOeKu&@Na+E?$JSeBW$`P;P z7l8{0D0^F~Y1RS$Oq@PUk68_BI)7GE=GaVwD$$ZwpX^lL+g$N#%$gy+(JwtR77Bt! z7cIVRy=#zWxE=4pHqF7K!h-AU4bIAy?2xSDV5Qn0yFiAHzcC6}< zSv1mQ&s0+#V6tWGs6e#%GZxUz{Hv&%(GTOpfDX2qlr1o3(IVTfxy=gOcCl_2ZC2tR z5)(qd)>d99c#yLQj7&}Uo&d5l|1F$YY*pn}LI1X#RRVHuH6>!#uXhuy<@MAsl?r>|`J$k2{Y&9Ju2D*(<)EDoCOfp!JbHD)y4 zoGW(=Um`MZcgt@QoUx}n-#;Dp2*WRy9$SpUXYLv1$Y+qxDOZ`#g}?ZKfLY&-e0#vj zjX!HEinR#s_DTNMjw=SWb~mgXV*N#pK*%rNcqgQR%KlRbpG(?xd+u-=gYGX zmKV;;^JgUyW5>wi%rR1SYiQeoj)PP53K=8M4xej^TIkIAQEfgXyrU!j?9H+@;Eaj% z1=FTMnuS6OI4gtWhh^kJJ^$JYsCf|zP5#l!9LCWw?Kf%*uUF>Ys4N(N&b-qkrT8xn z3AC%Aq0pc2Ha_3!5RT-lExe$c{LMvE{a$_ktyc0$EB#3)#Xr^9cbwH04r|l*YcnCH zUTq5I3{5r9jTuRi8R@^7_1@wS=ZznZ%ikZB{(Qd#fByP##R3ijYyrzF zU)@{z`kulLhBrP=LAx!SpMlSiXTj(DL@lg?qXEv4VH}EnK5slbZvO4G{=;GEwcgy} z%ItYl2p9i~-JB8H+)iJ~!Tm4u*2)+%x-(coFnv&O^`5e$LV%P+JuFY@De1Ld<^tnu6!heFGa zBdfTI!{pcijdb$mjm%3cGrv1;&i}7BhCH?W^xi7NgFOG2$E$yTy#B9e{U1(x|Mjhd zFZPOy6W3BVUMRexD1<`F7Jtw&6oksLs(`aOIdjzWzY3qJY^q}qTp0K>ClZS`W$sZGBugI=Hi;?X#9?#sb7>;^6xYeovYPQ%V0@s#5?75Z`McRyBBk@ zHgyV_QSfMaA4V9hkJ+}-ur*Vkb<|)yor^`V-YHj!Hx;jd3c~<`^G0mA;o|4#B+!u& zN7U4nkv~6FO1$gQ0gRUXcK%lzjNA01zum%UzgPIP?^3~T-HY{!JH66!Tz-+U3m5NR zsUPp=%p)47j`)Jchn~;S+QkiHS0}o}dPv0QHwMn0fi}Ct2B_I}&Z(QK1Iu<_@ zkQ57!@fVwOf81W40DGRT63a}{`s7^Eg^VerAP@=OMMl(1Ca9>Lu`I^fHND>erV)PY zHlkU@3N)VzI5Ut?YG>0tyO9Mptt23)g1F(fkyErm2$HyTW}%l|?B&4G7(SyGp4E%? zsqyu~{Lygnc({amnNitzMCu@NvMhka%KsK)kOhz(<2jI?R;U^7M<6!1<-K}VAi6m- zD2x?T6Hw(IM#qX$hr`Ag)(uKT2~4AKo{)4|9t%>pO45vzvw$;Z8d%-VHB7uMZ8Jt3 zB(tYxIsi${D~loUEi0G7HJ}WR?PwI;tQlM|>nRMMfxSGbggg_!K#K0>EPxkxWhBaw zPwf(x&J@lPGmC|Sa}!W#sk=Li$4w;1BFw-^Qed`bRxEPcS=1?#5KHJQfN6SZfa-%m zj^!dWB>0_q4GXtdvzk7k5_?4^JK2EW7H94%E+H@(0}wbru^kf<;+lVQ5Mx`vPH`0< z5OZmfXF+2ds*`7NW+=2LBhLgM)R+aRxo}b@%kbIS5oo2pIXs)SHQhDwF6QY*64JYz zgV(cm(jio;;_ZckT^a83vAoV9Z(MDJKOYE#98RPP zwGtoF1YaF6bIi9($%$(E795x!)$bt9`UrIQ)Q%%%LGLcgYCyC~*cD9fh%F!X$``4- ze1KyKiy1D$Qhh2s&Sf38lAN5nfTktR7 zH<&Q@GavSn*lv6QfE^Z}$y;OjGh@OIa)H1uEr!+ta!HV9Pq7f%ouWCUI-;6@M1#!0 zTS=h7#VD5L$;{UCzH22IETm;aZH=QhcI-?$&PzeTvVGpH5`r9uXKR7TiIPAE9@ARmVh^k=(t)PB@WoOGyq-l^u9Xh3Js^Pq06@v2y1E4z^bp9+Hx(aR1e%Q%; z)RiNInQXwB@fptZi-WBhahUV7%%8Ojb^M4}fpXOVN2h6!E=1$k@-Rk;VCBDId=gkB z9IeLz3>ZRgV73N@{&b5LWZ=w}${%i|O;B2Vx?KQT(y~r5eKMkAsyU=}5bb?2cuq0v zW~i^*UtC~bPI1`Fmb^%*QBbxTq1G_)XDY;ns$;M^P*da2s$g<%R?nHXu~yG}*I@vo zeX%~e?zY0-f)7I@iJFyfFxt*Y;VeuF=`~&|9F4tmbjbNLuhYh8I)=k~d@$nk>?iUQ z63)!;N9mjqHg}eIl~{PWo0O??RR6+xqn!|fjzrNar;b@bL$eu`>66iHr@1*aMd1u~7WWXdwYYU} z_ESLsjDQwn2SdAp()}bPMA&)NNHrNVK~)8d#0SiT-WV@MMk}idm@Nh%dZEB{+PWJ9 za~32gg#nKYn|W#E$Ym|D>m^RDWxN3L1u{#UouOY5W^5?1LPfKUnwMEf_bW}`_1jz&nq}p!#DZF9@{2kZi)j7EN|3VC@ecbF~&<}?jdT*iIF3; zvv-|~DtK)LmJ8HECk(09QxzK_mF;v%YCUnuLdk}PP2#FOYVo`bh$@$JFG`g31#9S@ zEsgNqE0#_KL%1}vYv)9pF@ko8%@WZFqw1iDE;@65tDCfxW>+O`Idwpxxvw77=Fh8h zr|{?M!h>q!ydnUY5zu4`3x!3*b-tf=&2A^#;-mE2XjegS1KIt#vCjCx5!+(tL_b@_V zIH?ew@RroPCVqaDZ;?Jo~%KR&=@qx{W%l+0z^Hekpea}ZVY zm-otWW_&ijN7am;`J@h!mPf~dViA&H)FeAgCkjDh&2fSwbcaBMJgR%LmWJ6L)o);7 zabCTS{uwYkO#g8``Eoz?f>gxj!a)?mZsJ9@{Urhsib8i2*ZYZAscvj(ym&bnyn}0lM{0;r{aZh#}_(Eg;Y}gq^w9GfKhQ_ty0RalzKR;~! z{jB@|ZnLroe!tfqhc*+A5H^k}2ks>g+!I^w*|%}hW|ctGvgT+^Xwe!sj_PQkr*RQE zUU_*t|MDPnt)F?tTsTm13qh~vZjuDmGdHmrX{WAlre0)T%kwu_G??>OciV`xv84Xx zVejt`yWbrTe>q^E7KA)Te~L%2U6iH4q$mAZMCT znnof7{p(F}iet=+#(h-2AjsCe20bv$v;Tsd*{+$%Llcli{I)*NNgR~n4Zip%4YOBtWV^u^_Nm>-{Y(cN?Nr5zuS zSH9Hj~n`8LwYUco%BMXk$se{ZYmtK11ciE{I*D{lP_36Xjt%Kg2Vv|7~ z<*_W_?1{W6nHXj;#U`eNPf^!cE$*GfZi@!61?wmy+> zAYzyMN}L>eH^*i(YL6` zAS!wDQRfrxRB&XNQ^W3g@ATv&eNAyP4fu|4bk}RXUg5JG^0g$I( z$Qpd{Hm(eAjbYw5X0YHq8(bUGj?o<1N5eZjeg==I10lua+b zINXz1J@aAl1Va`XHq^|PdsV3=R}ISjnT~?=0i4@Q_-TZPEGFEAJbQ8xuiT7z^n!ucXKEcCO{oFweKk$!;ly z!r2`*l<|cA8QTrx&lqu#&`5X7u;_UVI>>>Xo+p+4Xk$Y>+`f`$WFMb077SPkKqmzigqe zAZWr4emqEH0sU;PpvZ$8D+r!JuO#TM_^tT>t7HH;ElWkbzU&6kfj`?WC8ECIN)b!h zbi@dn6TK<6X6K7_hFEl{;H27-IOrHaXDtXz%79`SBIn9yx>lj!HhNB=vCySew$?24 z9_&s4(^{Z?emGE#z6>wRg@Z`dH2+Px?ZKJr?&xm zvqNbLsX+Z$9W6#}{29|o*FRI@?3z=6y$nzM*$^&U@m^OE>sHq?I)C=-qBWEUIOZx9 zl5TbG4e9^6W0gd$@lVD~!4Y61dm(wzR|CtGxCbdDM41s2RIfvcFfUNlAT7*OT-2n< zAZUHKcy~jZZ7G}?GXu7fhrATRW=7$tnXSVdVM)i)HX}}v9vFuW8BOQ-rZw6uqhm&> z0h|6g4BPoI(r%MLGcX8}_p5gB@{P6DHW&(J0|E=(T&A7Sn*29R0UoV}77e>^o0_Jq zk(fmW6UTyMAUU+4v~5)Z8)`x^G7$sa4q63Q&4L3TW)l4QvwfIz-HwXWezvEmeBdvz zmGClw1$q4+z%F|P(Po3s!FGeyb`VW{4!IVZYT{||XSeCVN_xwvzQJDg?lSBhXtVU9 zg4OVCA#UW;Wkl3|I)|WhcxX6l{oqa&hma5V+Mg1OkZ6PG0PnZ{a$jKwc@vz3#18mO z^4&k*Z-Lg`H$&ukuleyl09^40&6fi$u|sBQQz@~I#Gf5RQ^>Fd54Vftog@oBD^{SC z#!eAwIj*S^l+uQg9aD!ExUB2tla+->jjSN5`vY@3Z6odtieHy5+b$)NMmv9|KI;Ip z#RwWS3b%(sOEPUTZ0k$L$aG}W5w;b#v=Tby0y$d-kYbUcgkiEdZ;X;>^0w>Y1;w99 zPNdD?A_e{CpAEtniePt_9=Gzif>8KcyPzbi4H0bWa3a{5I$&o<(8`3Ahd;m8%R-(( z(2qMbk_SO!(E4h3k^72CIk06eJ_Y7NUXvQ}c6JcW?D#m)ouIL~i*T2+bp8;5Ojs5~ zdmf+7q&<2oY!4bJ_IDZz4HdhVw z(vnP5!Ljr5EF2gbjFpE{UJ0=a z-@w6RW$Dd&M(!fbByRwHeYf%Lz1G+JN?+}^zS{4>pV{(C5%$siYr%hgJoSFJm3+U& z+i+?Ai{Otej?kx-X%OpKa~5h!0zsqlJ+I9mkUmGmRl3e?|Ce)K=qP`4^8d2--p_R$ z*|uiP-0s$;NKqt65FiMDJdOi!yn~|y4M=!WE$<~tt#;~`T575N>-(lB;>C;i!~DDR zt-Z4n1(4ExcVZ$kGP1I=(p8;9@T+y!UV=ZvjUmZMogv9cpk=A?c;(xp4#Hy+(FVUc zY!ht|5RJ*RE0AgIVrf4lHz?iU+wTv&q&vX5sL0T}&C7eMmyes5?i7eNI0ktp;NS=g zj?9=Wpc4cg%P`x~A_)58?fm7H8|V0~_ZQp6KkgS{+Fu%UBD{?Fc>}veJH*Qx zN0GI~%k`PD2dk6+@wEBv&fr%&J@nWBbABoF{qcxN{_E{+BqEcqURWGEUmSmBdGaTP zt3NGYc_}yMCKzJE&Wg!F!G@HDj=dbovlpJ{&#@i^ov3hyg1t}ix98|tsJU+ZSxj5J zj((P|%SaizYx-(k2xlXA%6+<@K%2cmaw;`$YS5Decpo=LeDJ0D4+N< z(<3FLNc`+I4xgoVwnPITi$dhjFNDv2VOVuSUpZt-Tzh&^r|2;={1N`_(DFI{%!*ER z5)TtbomxICbyln;v&^&UwEj8lgYQNE{MOH^XMfi${0bNTM-#Dn(Kqu$KD)-+%l6IbKUiaD50;!A^~ zh!bS2mEUR0_+nU`K!w=G_Ss^lDYKhzOgJBDV`yWqOM&z?>Hr&4cx71O#DRYqU9J2AZ67``5W>fso%ibf_Q}pVkJ>-$#&yW zXJ)5~pT^vy#wTEwK}utdx!ImB-i1BF`*jP@4p{@Kd#6Yt#2O1J7E7|Yfgq6JQZxIiN;wA-7*%s zZZ^l&*S0PpaSm<0qWYjqY+f*$t}NadR;OH_&%SY^(X{hOV8w8-R-z?OnkO+&Ky=Vr z)1kaLcrsy_;-YA7Wn81550IQc^ML|BEAL9Li!R!v(W2A$JH!@T1a4E-DK3#JSV?7U zCCvXB3JTN}q3srKw{kc|JX%91ENf`${X$4A9>q9O&=vO)!wn{eKS@1*eYrF*wKKwI zOWjIdw$Dq_IeYRN3^yc=E~9pqI+`4zb+3}`))!he_9y#rttc^bkAQ=D6xSr?xihNl zu2mUb$;dfV@`?GJwGiAbdRhW4!RDY~fHU=|l*ze}pHxu8DZXmh`Q_{+uX1=w`5M9D zXSp!5l$%C?4Oi#kx!;>3OezaJ8kKPBxCd&+^aBr;LE-5j|MNli^x*4$J(1?F}?J_P-L*W_c0hAju#07Cz}OJ{v85K3aT6VVK3?`QzaN|8qGU zE<>vMOntPm_-t(sZuaqD7S8ONVZbZ|m@)|pjsE%b^(8!pI}ZA1MC;rx0RURS z!7yPHS4-I4-e0nnj4^-Mj?=4$k*A=T<(=%(~Yby+Ax@+?XHk?RsIx%D} zJmJss+)$+p7)LOWsUfG2HVh;m_K3lDSO4{pc_WI~Wmkia#6K zj)Yl*#*`jfw=ytryWLtT6xzwNi=V}ojX!(A%Mw4+ERiwCHjzI^1Px@46x#W-W9I;+ z`H8WCXlOG=mkyu(64ekO%!JSpj|==7A0~%?A~Qw>EeX1LL6|67vHVB|s41w8VbZ!? z63m(LyKn^k;V=hA#$h9d;iH*`Fkk4C%9QzrHI}d$7R~!98qFq!L_WUX}^w5#}Y^xy(Q+)OjQ&*kXyM@7{W!&T$a-^gcj7CxN~qA_%r<{{FyNt*3A-Bxj7Z{V#`5Gd zq0D5MgJU8p!_W!+1|h-{(Xzs01)oiEO^t@w5Z`79-v<^LS7&`D9ki*$&@TIg?$DkJ}*VuMaxEeJtP%b^K_%j>cQ2(04l|ShQ0?1JUNHAw{&1GAS0EWHNIm0F;J2 zvox5Y>P@cf?IVBotz%K4aJz;n2U`JYL^usggg=hDaXWw*-{kLuvRcHa%l9-&WZuQ zFHYvC;RF(>2!2$Kh8bK*47t;m>G^A+&D9p=Rd7 z!BtF;#G_){66D;>oVBx)tkhDdr$&`LW1G@TV~8PiY*ryaZ=NE*DaNZ!K5hKj_0J#O zZeeorj#*^T(kB4br{EwOY-@zsd_qk5jDFas`ewiS?x3zOBJi?(Be~&**YF|rLp}56 zKf^Q3Jni*_Zct46WEo5Mhg=KU5NszgCG^RB>iI;t+?qb$<#!F-P=9BaL_G9KI(XMN zr!05)X#;PO#Gn0pm2Y@`Vd~pM-$MSK$tAo{Am@-%F$pa5Wnv`Rwa|j?0QT+@+*|EU z?JS6mQrcwCsHO#_`6@PF4mOY&l)z{7&*VodbL3t?$$VJ9aZsNFM;|WFQy|Bn1MD1; zvLk3el(rdBG;SWopZ(BzGCF4+rjop%2~(&f6?9q%ZSYy5XbN8M=$k_vs%0PDl+iSm zz-L7;T*;-(y<{ zMA$C9)6Mg?8vguVJA{Ye-_xJB=8hWE`%qT1HAV~lXnB0EJGr|u2}j+p-}vSIA|(0u zd-bm$*WFItH_2QufB57c=gcu^C)*2;EXpiHmYaVYw3 zbNoQ=C1Ve&mmtq_fky2Nd@f$w!~&WX5tlFrf*zxOh{p)l){A4+xmSL3zwqA=dtdDI zf3w^B$CLHH%Cj0L?ZLm^yiI_H*|7@?S1-Vt%H#ir^K*Ip9O%hlX^=fTE;i;Y1nP%? z-xGLi;$HZ(A!x90;IuT5U&jPjose5E)5-JtPZ2i5bot4j3IdOxTe|)e_-z#sJ^54d zXB)^toI|$fd-k*B&r5{^_fGLTAJJ!0v7y1g=~2A5RLu#n^$GY@G*g=te2(OqLhQtc z^GkjxPxEJOLL#MxI(k3<-*ShRak~(2C*|k6J#({yq*lA+@H3!P@n@UfPn|`-NCN!= z3jIU#k66_k#KW+|&(YfF`#HHJ1!>dGUf6)jbemXyzHvMi3(vQCzDA9ogU>G<^!aPO zCJsm8$J_Wb>3Q1!Il|{3Du_H^JD0=wef(v<3L<~ztKiPc_)d2k+YJx!=lofuC}^G& zL}rRasMp;-UiVet&#-(AUFfiSrBk@3uw^E7hSV9ql^z)8+^^07j(S*aRH)DJ`+X?% zU}*vJjAaKBXka7p<2aP@MPUN?jCU)t(!C+tUHmk}!11}oS{6&&$MT~Vf0p#rdr1sdELJjwzWWm!}j_ksx#yPtaBhGhgUgoJ2WV%U5L50_06g1P+w8tB9Be z^cz(~DfienUQl+YfThI6d(fK3b^~fEuVeWYOGfL285j#PHS#Rm3R4IhbC%mfF7jsq zPeayR$R&cS1i4dhczOs&vrD(@nPx^-61}Af3{Qak=zE8i8}-~(_M9Mkgm-+Hx8=LEx;;-+r*97SXn?n?C^P)0E->O;U?Y| z9@oshbMa?JF@?FPzUaCw4bu<#bx2jtwJ7=VIl+o#r7$zBOlzZR==1e9VI_A1&kY%L zAY8}g7~>A`GHbD9f_(LgmzjN8i?jB;%Diffzkt6 ztc%COV9f?u!sdiO!+Z6qOl&Jc*_gAS>snRHVfZb9^UNxT4s9|^w_1zK`K#D&AZa$R zjHN~%{v5G01w_u&P~WQ-2Gs(n8P{b#s(N$8N4S#Lhqpe91bS4@JQ#_hV@6Fv`3yQH z0cIiLow+QFUQCb7i%7ty9s< zELorwuay_3`n5$q``o^x-U4J8<7NKW0O#R9Ec^`*AQCn07cq|ee31KvoMZF6g(tZm zg?jePRv*FA$ z^vuR-9rn_IZap!IT#+{`7&~Lm?Ccjf34;X)!(h3@K`scFf&*c%3Au&;b8ZZ3roHiP zEl~W~TsY{51e~Oqv0p?ZZZ{ziO^u*5$pZFKc6tnUX1Fjq;$#IMbeJr_>vB_V6ql=8 z>3$uqLM$C+BX1@-uXg1#{F!Ocj}6MWLfIrhv=1tGj`bSAnZ*1#CD}GGvnTTnmIGma zug#&zv%_a{G|z(1y$VV2Sq9WdTjjpXqNHxU2|QN~r#@S2h)8b*3l2y-uu;5`pB`@( zKHkWR`XX1x?HP}5NZ?jhT@4X)77b|{#9lWa5Ao!>gt8K^);^{TRD>TI^Za-dFW8#Pz(2pH5Nr%R#`SS^3PR_<=8u}!q5VwG~ zrxb<8dg4d;v!4pNd35Oih6tf80ivZ=a)q<(EEGd9Erg~Fxs~8qF3`~_T8!ES&kn0S zr^YMc&(_$q(Bi$)Dr>i8`|O0dCX-~}F}-nUIEA(wsvF0hLf;;EsncnDD*Oiy&Yy*y zjWats#wtXR*&I1|()<*hnJ0nvI*h_;$Q51?q)quY01af+z|X^x9rEO?Np0&c8J5ed zS!~((vrBdz;fmkNc|$DMFDIv^!RlrCSD3_Cm%wigK~rW>Jeea?1*b${tDt+MyeO_A zQ;}Pf6Y~uwBx3at6(=wVeGUEyo=6br(fZ8zf(B}{wj7f2XS(uf*o2v9%_oLnn|UfF zt`v@-BYft^?9QLTv*8qqQ-0d-NIZaFn6pftUzm*fcmoMFnOoR8+@!553_T#gKvDTW zh(EW;Ii-z)$F9lI8nW%A-3F5F28Z;fdNFVf%|O({og#n!WOJ4IGol;Jnh~_3*D2jy z{_I`|GRV3RJTn2CgPb=2o+Lq9+$wG>`Wp_$BQljW>7ck4~gGzFD>Y(64Xx|MmIC5py%iNfc!(K0VSqRbG9ui*akXay| zQ(X1zZXeW%R9IC1rsU!xsGCbV>q2W`Nu2^gQ-gi<2d0ljyZgb-=9|OH({}zTQBY;+ zAQ?8U(cV(v+5$vs4#_n9?l3L|s4o{jX)ii)g+JpR0YFakXQ_O#ae*!qU_sJ@hj|%BY$#*#LKgoh{&?uC>PGBpTC$9F@(ZgU#XY zvv6OIUV>z@Ks zP2F5sL&w{#WkQ}4hY(guG*2_8#;!!3*qWH(`eb5KdYjx@^_=A+X`f2_4T24dSqHaU zZ;OZlim5fC1wN|ApZS!L)S+pcEjPcBBsw9m8b4>uG=!8Tu2zIc%v+pPNB)co8jZBR za}x5b*ApGtworK5T!cUG*QQAkMB~eGh#y6Ljs$sj1Pz5o0_`L@ik$s02&c__gBoMY zBFtjQtsFdA$xSwrK!mXk1x^Vm8;|=_xvF2F8xI^9@ zignn;mt*$z#{ApudH%v7DB-VeH-C9c`LFp#ViQ_LeiDTc`rVGAf$)0z{Z5`hA^e%) zZ*|}5WuCNVVa|_NWFK+Aapkyq4d>^#HwqXvBYXbM&dPUtO}?_+cEb@gx!^NjV!H%g z<*ZAi8#vy>pYeQlnY4JX!Dk8)N2|PtxddL#{05}Hvpl|2zi`xkb+>WxR$&a=3OOX_ zEhkzZq54QbY2(iuIfD9KBtf2G(ZJ`e;-#DU^C0M69u;){&wDF>*pUXCxe*E$^9=;g z7;yx*4SNarr{j?l*m<9Dv3vfsXX(7d83gtFA0kRrNq^+6ryjf)$lD`=h-SFvzKb{rYW zp$$P_9OkbQTJcuyQhn}Kp!ffE*y1NMzuq1F>8ShH*Lr{1-T3}s>tAo(#CUD~>dP~i z&tnyfl?0v}B+9r(kdwg9o+5*F>jvY`LeP#eIrL_JnAkhWsUzW>!L=hEI#shCP60q* zCbDPHE4a8Z`)`%Wm*CI&34!Pc;^Jgdy+vxO-av4ED)w(s?tE$Df}Ki@2-r-e*t0{t zIO3UtDY^q!_DFPvS} zb4(R(33HD3rE=mWlG=)JRoqDxxFl>vLV$%pHF@{kP=1C##~Q2GGSf-xeQtWxM6&8< z?F-YBvvjCW4#1HL!IB81{1jOkr3HbqDlQTs-Pq z;MO_7HKO9Z*0pASzLL8-EaGJ(V`oIOz1%#08jhV|-4ZjSr!@m=Y(NB}ElQvi(fLd_ zH!lQD1Uig6iqp)N9Cr@m&m!$eaKYwc)Jqcqxx=Di*Tn_EJ3{LrIC^QamX*86-eBZqp%gvNXo>ZI*j8 z1{Czbjv=PqTAA+W7oc+wKffEu2kgy+NC zS@s&z5}zoaZA1&YXWZ2fg_ON zs9w2W!;-|$x^a;F$}~?G-rd|v>bIMVvR-M=K3JVq=tjUhTZenIradd2wlQZ;k+i+G z!)!QnV=_*~DN~>lz)pFy3X@li$gMi!=d8@h^Ro`AmcXU>5?Cz@v# zMKg!bd{R&~!-S!%)Fk{_K>$4k{_GUm{GTnJW@5B%kk(PHa6WhnFN0(f4pAD;n{sQc1JZ&@Mq@f zXxbMgku&1wL0#~f_ew76=A8oHJj43UMjq>LzE$)lf?pq0=jz3A0uHX#3I{E{Qy`qy z7i;-X2PIJR=frs#F5%(uVJG)dH;?zl$Nk&~z3lsaqV@}*@qIsA@tNaY(R_rpm zi_dx)05u^3Kka8f>Swrw^ieNMKja@$7D+DJ&j97L{9bSV{o(wlgUqvTmd-g#Z*H|g zGv~k*IK{Pyhk?)TXki7Xva$o%f_+IY}vHdj<|g}xN~R~rq(8BU7E1rXs?7nOZ;r8Ih0-e zY`SRapN&5=2j|a%;qd1TF=t7jp~_o}Oj}+Y=&o;R6`!nmytX{VSZo$bc}wzF-3XSs zQJ@D{G(CKJQ-W136ISU~8|y_-yxbLFmVLF+DK#sZ+WdRwClkGY`% zL5~WKodM1cjk)QRxm@*%N&_ z)l4&I;B(~9CTzASfr%G~%s1q}Av*}aHcb};OXRFU#WXTi8H{|Z$}+V&-rblk*MM`v zs70Z*)z$#qt?-2mq)iq(U43h&=YJ3(T@_^cH7AL7iLwX7bPix8k=9f`+)l zgn`3|naLvuCd46z7(&6lvI@qBog2HfSo|3YwCkMtxmI6J&Tote{3ni0y&!F`q6>k{ zovJfo@n@&m#-EwFlIgAip@OJ`s`?}%po#U=AQta-KH7doXlaftK=j`;c?|c;wNfn9JzBjo6s@$iD6BP zaso_j!C}SLSZ2eUYq1MPj6 z3_)v)Gyz)|Q}qv*4$&~k2`79Pv0gqVY!`}gJ|NPK)A_o7ngP(JG2cRbg{n_iZYNeD z_AXB*-k$WuBE+r4y>Lx9w;mR)uQDUgz-JCg4xE!V0c8WCG2d_mjRe{gcF_2895pgn z&>XHV9yha&py9xz!`ifqpP|rRPY!~PJ{#VQ98YPIqvJr8jV%M5X)NrV^5}3t9k1ok zFX3{pj0l>?K`KW@eJ)s7v z#9;&54a}e6$#`qPpFQzK$GbKvQ8=5(`GiZ;18tl?b2-i6!(Tnti@6VPmLJw+m<)g3 zuDr6D7qAtcExa1U&(5E-SHzzUL8E_0{EQcL&xFu~@Vi|WqsEBiR^{3k_w#>v)c9_% z_x*A2k4LRP?e+eCw9fY}U&VM?_>WM?;m`7dKI;A%=M5c7Z;T7{H;2Rj@s#h+694N5 zCd(hY$+leEH;0Yj!Xeo+1|67Y&zKNe2pYjNHXXocc8?@G4vVOGv;68td7O!D3&_ZZrRX9NzkV@6KNi*FV|F zE-zfZapeL+<-ngU{viB0l4lA=o6QG9@J(3KYrO1-Y5r_ygI`B%@1y%O5cwBp-0;DxEd4@kz={Op14IeZN zeR^Uqs60J7{rvCoXWz7t8+=A7eQNC-YPQeu=cEQxYbA%$&m-utEzkFvfLR~z1g;vs zetr(m*PL8pU7cxg=Ijd()0e~s=}OA6{y!~*3zHiWZ}FK6U)cZuFZ>x*bJ}g=3~){# zI(Ck9+W9l$XS_Jp3KK|+1@s1Tiv?cEXCnzd7~wN4np0*cJHNGZt(Jk!0-3S4fHoto z#P^sOf}Tv_EXd4n_6xr6=^Jo6qryt^bJYd?E9%2{g_j z2%aI;W_d0BGakidw9|G9vxw3ph`XM4ZJnk><^{0qA2qu;D22y8qzdgb@=FFm* zh=kG!Q)B#DDri^dLPycuI=@98EI@66^Bkgri`gG8R5ITT3^aCHcuHVvAo(sfBkVIW zb=HL$2(o85|4Q!qT21O`km(M zBF~9NWdF#~D?r*4_-u#3TRM06OqtK7;H?=xYZT+vu9pVh(o9Ne z+>g6OqJLJi6D^!HP&*@ju3+O#F8C~0=W3SZAi7h{kh~sKXfSo;&piCy8gAz^>-FN! zT6qr>5(4(EWr5Ff1!29We2xg(D0CH{4Jh=ZHSuR=2xNBt{BWQe)+npzL7Btg`D_%L zGR^SM!OEslnQ2#eeUlrMvjj}6!5{~Sh6&^IfHMH(ibK(9bj~JhR^FH0975a>4$mU@Ie+G_TuZof;PtwI z9fw4@y#nkSPgl&JLC|1u@n@Mo%l}ydZ1cfz7)$PnO5igL782{m7l7G_f?beoT=x`z z=31xC-oJxom@_UJG3gI-L({-#gvaKLA-yz24rVLFzP(LCstsAE%r|WQ2Fx)bvHwlT)xl^p z7913uKc`)wSz`c^P*UrU&gCJIt#Jc|K4Om`y`wkftcKDuK@x^&gT^Vv|Gr20B|- z*#WYhqJL`QDKC(F8&GP(pXDYI5UX9TQ-+sq{we-!XX!J-XLF@6=$f>TrzmKkRO5I` zBH?uzuy8w^Cr8wb^eDxjgG}1&8ADt`N6@tQ|1Bm8XT>5!`JD3K2-w+~v!iJma}{DI zOHw{7;R{Xp!l0Lyc3Q&Y#0`VbBirbEbt=bZ9EH5S9dK(7%37CfI!y45h}XVpmgyw$+`!6`SYW7Qa-=B)VhCfr;6SuqFA zGa1fI0sahSHI8~han&FOx!Wl5MGDe{>VQ+ojc3Z+0S+uCGZc(fSNuNRBHxiiT8#h5 z^aI_p&D?d`g20ZK&oF0+kg--^+U|y7rW~e-mN*%Cu=D3+bWwCh)X>2MBdo$JjRPwp zm?r=ZEg2CsME|aN_6Y>`dq)an2rc-LwF9?(m)Mzfio*psANqIhEg>`wNDiOj&ngg# z@lKsVp~~XV2A>&}L*O$@21Jv9&w^KXMA|j6JMx0SkQo)O;P9<7E*XyX0AIcdP%qa% z8wxX14m;)KjmCZ>RFJS)>Q<+|6hxIRwjlhOQ?ja%qk>$f73&a?uB+t2K}(o0eiYg_ z;s%nIe2>;%cQ8NutLF*Ke0nI~0lrNFydRe)ks9cCYx!omEpdSDur=)$A zpUDzygg27IMX85OvW*nz+y)hq20r6_q6y%wO-n9Eg+8hROF@x{d+k(Bv(hu8%Y6uy zJ@lb*+7E9L1F=o)KM*vGm&-+fP3NqFF<}@i7Sp22px^`%$FtOkDtBd=Orj+Q&aX?f zTviOhfTnSK5TW&E&}qPR?8>>ckA>%R(v?Z0gYJ6C`7^lHIjS>!&z(Xm$H|2I=m;8M zyU7~_iNkr!;Lo67J``*YkDvC|_965@*hk~frnY+q$G11WQtfz^8TfMjBzZxxw8^Rq9Ejt8>5ri~{q!Fom;3&LrA4eU6u<{&|;zkIYz4P{RK;h^!&K|>zV z`)!ocZ}c+{D&vO@;twKtzToy6(gqhU6JAi}8wr1wD4Iia=P*ZTvw+T?NB>MvLd-hu z7B8>P(!~3?6m=vOoOG-uib>dVj)H*$khBosC6f!SR=4j5xZG=kJb& ze}3Bf>;A@fPdfiR>izAg@vt*}w|NC8jpNph$Ey?W{EQukT%gS^J4&EEbmO6b^K}q3 zDrgb~E;(Mky0dzTXoC>)?J5YJD1?`9m0lfWulCIjTK*e_i~a1_M(%ujVQf^H_{SlR z+3jEN48GjyXr4!RzS&v-*Bcw_)#=HxSMpc?t%UjW_&I2&XzIkzoF_+;91(P2ttVC( zV$nq;(;=#$2(YyY{F$?-`LNh#s*{MR1KBH0y;Pq7HJ>ZrczGlDZ|&Ki!NCBw(h_S> zZy$;1^So4Kn3l<)u_c9c<5ay7!lZvLOr1)VqY^lhc>(%o9^(; z*~p)11D167?7+G514Q}-s5v#sFjm4m1-k95nCFS+`Q=nOY_ht0nQ~|uFL{1LQm4)|jxysj^?rC}pp#ksaEE95 z@y8%t>3u$5^L+ga=a9ZIUG~Q^=I-j8hRiDSqlVM^XPC3nH5o()+4EK2M!iBgbNOfF zYnAcfxdG8a%Gl4r%>;!yITB=y1Z|U6)|@f!HKs}nQ;jU<$=5ndiv!GZL3X0bveA$P zTCN%k{`-COlhQvgEl9_RuZ0-(ocJ?^5{z`VR~-j1Zd4YabGxG=;%B#aCWneMsF<@N z)5&uKTuE74Uy^}nz#wW;(DWhXihy^$tH@}Vve#RMtHX?O;DX`?0-4E)JSbLNm_ync zP&2?8yNn_eL&l6lvZ5vS@(cX}!2CM)8UoAa5v_Vl%-pH9x{^WhtkG%3UhEfH{*=&q zb-Y2W*yPxK-Hy{_rZU0|#Ym&jR(vQL=(cP9;IOTiGdwds|T;DdPzTw*L;Zw(N8 zOQFq@`^CG>95({b4Q>HSUF668!W2nj-O+id*p(wNbWXC$1pA!$S1Nt2KuX$lW-9uW)yD2FDK>ck=-7xR$0HnJXL18CWY` z#9Ar9*}Nv$tNj7i%I2OSm>e|EQa6iJo4WxpnPsF;mV$Syk6TG@p}Y$O>g(JE_=4h%0tx4 zCV@`ng3lxGY+YJaa ze_B)H9N2*~2$u$t)>7$*kZK^Cb7m*W9FjywlZb3OYjN4=)5$ZJQ&t;nIudVT**+)a zna(Mj1X@yIdIm_6d*}2f=4t%-1dW=-htHPz(*yrUP(NEMzq-|6p73YUb#0xb*S-YL zZDLi|KfB zoFSH!Da4)e4GecD@!~kUd(MYrp0It*nSC=BO|Ipf0B2EC=g(B?o_dm%w}sM^+qMOT zbiK68fQ>e%ajW{YORTWshveGKR9AHF^xMfiXL)!cQq~72euz$+Lc0VyVrs|Ez+^+p zLD=jJnNF1K@~C;XQvq2!xHb@-eY3R)f`&h%B7Ud(CcE(^3Vvt8Iui#6f~Y(N6(DB*^MkDD&AOe zwKI8y&$^cOn{uw8y}{=YtuIQTp{x!|ow7PI711?fX^bWO*jyUFt-9AZ;iL?Hp$8Bv zHDDHTOG|=3ravTyaEdBB567+g1T3pea`tGsAYOtWgK!b511w^t?wbMHqEG#>UGCHJ z!Ep5L;FnyJH>3l%L697Oqz{n>3NeZg>I~djG`vVu$`GRGHi}f%)`=v|?2q3v7dhLe ziCa1WX6;fl4yx|LVan$fbB>i4v>S1Nnk54^{*1i_DX{3f4JHQrVr~&rgREhvkWVFC zM>dz<#3_XbDN&YE0C_3dhC@Ut3!HA%4T}i_!n=gL&}SN#<`g>_0WSq`t5Y%!VR}wx zPFe8q_9}!B9}ljg88-z(jL+^YOT)Yk+U>l9g!_I2=IqWJa)I_=tOH^AdH7!ckH<*w z)+UDrjuy z`Byaw(#Pm*kv}%xo4TU0wTFkpY>_|{MS=^3c_GFoS_ZCi2o?rWD)r5OBh8-^K<)fl z4Ny?`@@S+*p*<160;EibW|#~(HO?$Vse#PX!$%a=#H+y|t=E9TB_xJt4s|(+DFI-` z{LS6vq+kkg+uN4Qh7p7#W(Fn$*tth+2>mDlPC>HPNl;1y`B54hc6RctOK!sdSKk^z zXiZ~mRvR$qw}*8{%06?Sq0qWXovncW`9uPJ!k^ts1SxnTisqEsJB211shPKg`y$P= z@nY>y@`R^br$77K_$*CbynWc;mqHz-Nue zhMz6)dE~3ZzO~%4L*JHkrEaZr-+aC(^kal|$*R4EtHQ4;fXo(!@ZCNjS|->u=35SR zw3BCt&(tG<#)ZR}v!W0>Y6dK0xIq$F#s%8Qv-@l~g?92R91WUYU6fMVRM5_@$)mPe zxEKvHXxbn%d31_ad1Wp_X$hOvSnZY0@@IFAHvXJ6kVYEAjYcr&kSR32A8yK#ltIu> zYI6ih#Q9l&*lfvi4gUOYcR_Yo#-I6n{sUOO{@7L!3e3LvYaDR}fAW2_QT*+LI-vN= z-O5)FB!NcxtT2LmQa;0J7jLSC`bN`?FLCK+S76GPy3_qj@y5AE^VgJ|N43Vm-osK znp2NgCIQQ4xPk44B+Ul|BEHD%_{X2c;c4w*umSbE~Hbrru3>U0%9`uL$nYm4#Q{>dpN1$?)sl5&w4lZm;pD z!_7bK-~JzOu5T<&UcPW%>=ZtE_1_6W=qZJW1NDXdnikpsb;6$=2$MU1CI_QMP#n)b z&wdRNpO9WbSMghg8iYSX!&YX`Z4`epT6}3~{1q1r$8Md}S+3z?GWZ5B6%s!^Vj8QS z*c5P~FO%h;nNPY;@5;r%k?*DPGW?lDO?m3Xd?PeSO)rjh>Xfl!2Z?F^%#!0_EYOSz z#JRn&poQ2@vYG!y{+!+=l^wbJD9Q5AYYxEY$$ukNuKy&Y)8PnzME~q}S$PWKGK3$d zSCnoL%WB|sJ=xfJDqTqT6FW~g@Uk{489H5XD1D}rAL%E3?V0kKt74z&X0bBe*ehc* zJzzh)WKP8=(+lwDsAmq$dHmmVIO>=MNA@aZF=s!-`I)Grqykp(6t14njOi4fx_4F= zh~ag=KSS&@BW8eHqWe{LOzrFx`axR}0AZfE7S}U#E5#eF(gbG0a&Iopdk*6jm_-{b zJup5GN>J$jQWlQn@R?uq3qI?Tg|&(lr*e?4%t7#uhD9;ekyN02Ls+zFbVtzUG5}C6 z5dESdO^I?570cM6mpSZL4n|o5?a39nKLsc&FJ5nFuQv;q5j@MiK}ZwktQdUl!YmdX zBG1H?BVeK?Z2r%3uEu{uWpZI#5pryzZ>UDsB7ugn&kRblgQC`}Zp(BsFZfJ{7Ix72 z^J;l)IXAJjoMS~;)C!iOTW0co?5QQV1;9dU4|~~%jX9*nz)~lo=H9F_ZG_q7Q9Mr| zLK;ZHYqDO0*n-bW(9{8L*ybbA(GB7~0`Qq>u=ZgM6Ju;ZQ&rF7b0bVh4&N_c~jWoS+ zkCc!EcQJV`+3EzVS-WF%{4r?28;zUwS#A(}iz*(|5*fKDOymTWxUwKZ)++;oMV78_ zEYI;Y9t;YMf@wBu-yLRnVFASj*F&D&JsVccS~OzEo(JRMR0`?CklXVl?VD8Px)EyM z&Nhn7VG{Fa0JuPO{yNHGs3{xE4)cisAWQ2@w=9ZCm-uGL(pkXSU~;6;0XsWzrh#3H zo?KA~dBRDo!Y+Y7>#Tja^3pJy$p#dc^ce1KW)wlvOu#<0#QpLffOlZ>X0*_QC0aUg z=5opk{|BQskjn>(ClD7AX`bu3PA%K5WjTZ`cPd5fH9`o&T2An}RscJDI6}eaT5%u> zZ7~P+;mxcRXGhEPaAvgG2%dM=i-bEwV!gYujMWBeXHGEzH{Vcr!O;>FnnQ=rsu@bu z&Gg(`<3S&*YLi3r(Kcx`_1hiJVj+U<^GqXuty`O>FsNjf3s^uCQFNJ5gM5NshpEDW z2PN@mnKK)0?kx%k_a#&oa5hjz8_AL}}gCS?H@@=>1RwJXHOtB2H^%a*UDT zx3F0%B_U41Va|Hu6nHc8XXnF)MwbHcG#u^x*@iB`ff-2d90n)J1vcpr!LXS&W18`+ z+sktNFocWBS3VW8QxzG1II4vU%-N8Cr zD*g=jHs@#YXUs07o)v#qZ)n2VTWvC1EmLs{Y?O9VF9M*-(kD}+l#pjl$+X8-ujql+ zQZ$tqv=Y^wi+9eylwxs7)e%WJg;lE2%b?dGfz$4gwXPQ7C&!rNIe~bpph9r zyV+8uQEN5kT1#{#=`}+T193yP$wDY76+!f7-An=8kswxcTLrMdN%-}*{lp$xf*RKG zZ=f#xuACo_TkJwwN^O|%XK%ov!%s-8JTy>fGciNZVOE41G!AJHQi?%8B#%JPAsDxb z5QHD&yNgCqtlPp4V)T*Ni8yxlCD;$!MWKa;MnceT2_kNT_LXf(96#W_Bp=klBRPkR zV$4?j$G1qh+hUE$>Uo`S2AnIFwIRWQ8Fs{NYLK&7k_sEE)DW5w^vx>(fHVBrbI7wy zIquZu4!tb{YA`0M;HZ(NMvV0K@>}amObLpG{u$3wR>TsR9((0fnN4O6)c96Ik6*{4 zVUXn#PH|Io2YGv9DqkoZuw8m)33?^sMH1}s2i<~$hk@RZ90MEWmcUDg4bAzJ`!YsG z@A@e^ZS!r$MCIv5^UM1UY&VoJ+&JoecieY+gU}9fZGWR)WWyLz*%V|&yhcSbVAMo^q8k4$D0jPO3NABpAf%sTtdP7`AB8?LLgUm z>ug^sPZ0(1BaIQ01GIIQg;fn5n^7|x>xYgI;fFk{dg~!mj%5#JNY99w;k0xJNT*LO zVg3S}_Wr^rW$({*KXhgk-y@q~CVGXL3DLA8cOwCo!pCg5)#=G)UE6Yh{jLc%1h=*RO(>GAsYs>h+oV@ayd=7RNY` zjq2|YYxwZQELlmh#a~;17TL+LW^A(LKd!yKP#C!8vZPXY>e8lGk6)@az^s$ z6vXDxA+ze2!PME;o2Z?0u7yTr?Uf?WtMjin7T#RVU=5862Q_p{1Gw}XtGPFbRM^VA z*`C+m8~nA<&+yMH|N8TXI)88I4*+}ZtADRY`XQuz@cIf?`0MQ=p3h(IEr0c>_1(ep z?-g56NLdo-$2e?sfywT(A;I%*1IGK^k^G#+nFXBX4lT9wew%MRzV|pJ>31J;gjO>u zf4N=RsmU<;sPXEp;#o3+tKlE}veW8Ao9J#huK5JXuk!!#&`$_%k^H2mgH7!E?hT(4+4UN64gk zMfm6A-rtYcFy%lL{r4wByf6Om*H)ekX6`ka+cog= z#wL2VHHGIh*4gF=O@Knd>c@?7Ogvuijl-YUOB46&SD9)r%c3CXA**#fwnr z_2R`=W(*^aKks&#(k~x1fAM&gz=(f7+WMbwt!>xmE}g$1A+F4yrDPUNzKYB^aAx4A zV`L}Hv0j{0{8oZwlIx`%P#Y)O(jbQ+T~VjRmy_c?3YDgGQ`BL(NrUPEJcfHE!|mFp}j!R85&^yR1L z#+G{WO0G@sM$|uRuMz;8G&t2V_8Iqq_AlVifany0PVwh3jX0l^LNab@0w>!Zryb9F zA?zxfmaP3ugU~EF`$PTEEPaD$_Iy8ah#%?X`Kx}s#=GK~N$alD1Nr4=YG~|_S*$-Z z3ia`+_JZ?g7_z5;pwr@KGkB*Sku%IWbLo6#>;i@xL?g|PUs$~K)7JbXTHFWS891B7 zt}rpoSHVQCvFwQmNdeo-;EaLl@=kjWw%IJ8E+#^pTzREo##kr++*1U+Q>a0L-f&}C3Rk4;iIKRYlB95 zdMKbhvs}5_$xhsD2#_*EX0Et(SX*Ei(w78UHpLz3nT3>93673RU7=>-Q?^M}t`D-+{9Pz$VW=Bo?8x+)K;{?XD&{3VOas0+2Tdys&u~Y0bH>i`F>gR93pQ)5tN@Ys)p63(m z5;{TQY?^279^n!Fd5}ek_KhLL_CdtPx;d-SZJ(95WF#WhvH5cFU~^wayk+4265*~q z*DUfXWFGykEH&r^!wuP?+vj57F$7_}S*e}%loDi6NEv4g$Hl_GmIQ>229vu!nR>$N zslAMDWH}=E+?Mj0%K^(o=+h9M1g(oUQ0p|_tUtS!8@*RTr_0=upnNP%S zm-e--R$;k#W4SOhsFz^Q?yBKzIYt}wL$})S9PBLeTra?)fz`cw4n~bxN2j(>FU@Y$ zGPq;_lka(uLDoB{?5{8HZQ;Tp627}33hfNs&7Vc@*Xs_bDRT(Iop5H!mX&iJ8e&kL(%5Evt2$FRw>yQ={46`*&GWC)%i%Zi6zvYcO zLx4l!!z5pwWX6eH8SKefA!xAkhAE##M5TXLva5kJE}EvTQ7TL3H* zGx8}U&bVAI7R{h2q7j*xeYAM;#wr~mKL*$WLN!lnK(C4T*{AC5J^rA|=D*OW<7HuZbj299Y4oo@Bm!q$JW>F%glDjB**u>8^&6h)A=7J}Nf(aV+RqQs} zgYPz$;FHg`+OTLrLiEhIaKJ6sgl9$aHwrLGI3xuCGGj^k%#_$zOg2E@CX?n+yjm9) z*%lFIht+EkY^;f85X~fgbaz+Qp}}XhPbjoqWzyxug(F@?=Z2lJr(PxL;fZY7B+BU6 zxhckojE7DWX~ec-MqpKnN5e+PzE@=1llhr zR}?2GG$`BNIx&zdmNCaLJ8tb8Hxz6u!SIGWlfky&Tqv%}H&;+c6P=L6#?n}Hmndu& zE6_1AAXj|YWz14I>;Ji;&=^@@!Le2ZK~s*pTrs_b?gAO$qHg9Hz_rkHQRJDZg_eNH z>U?bp(K64WV`K`R{7_)oro=*m`LnogQ*z=h5U5By53o#+VQ4f)_Guvqsg%D5Q?eO4 zk+vC1E$s8;lyK{s1i-)+kPCRkd9`TgrhZrc=0Lw?mUpz-N58dB977pC3#7OU^icE? zFr`X_-$tH4yjcP0!C06oMjY5<%3Zg$5qdCyWtH#E9@oASX1KLF2+%uc+^q zRzweQBqvb;Hnst|!D|8<>~JSrZVHHn(THQ#9ieLgpd61%>Gr*sB5H8}t0|4nE9bhkfDd z%Hr{f(V63fXsw|+n*fhW5T)}hv2P@%3Zhh-yUpJ|?ub9{51`GWG)E%Oq(2@EN#E`f zk+A>OZvWR0dY|3`$MrtH+an0$2X|MAV@NbZZmXeV_8j|>V8o%jU`8C=eaa-?4d&ws z3l7beAb@v>188g+Zw=XKpvbkv+_VIhp{C&Uz@>3oP~vt=*R3bbM6j+_eUJWcE{nC^ z;w&;l0JVRja6mzXI8tk}>rHNfOhHu*FN*R{dw+;q;=yxvuk;|IRV zMw_`%1;q_C7_QM}0ii|pN{Fig?7(3jRMzX*mPNUMnR*HW$eT`{#gpIPpk)VFXAHyn zlrcI?m4`q1un-W_BK?^QG(ETlG&x9L65q&gwAGlxnKu39w}y3FdzH&6K%{x*=>bx$*H7kp;cpN`#U)X;CmjC`f7Qh;=HcY2 zyNy>2uMAfBi0M0RU5J>EKc6!DOi9}9J<}&O+O%Z1HJn+mvt9nsY9LGc>fpmW(vL)F z&sFLq_!qHP`r@L7`$D2;eN^%2=$UYOfWt=7XtRIUsUF!gxx;7s#;eMOgImmdjkaL5 zAhbx(*)ocXO5N48u(6#Bk>J5?~;;2~gNDU9_SN zY6wZGmluy$Ty#Av)wJmMEcH5txLRO2Xq%;!7ECr3w8@?&oHmF}J)HS9YiWSmq8T#E z@&ffPil)q|2)DTwn`r(Xkg$Xgru~s17Ohm`&ytV^rO)rw6dkx%{QOSlw~vYh@B72S zii|i6GDD9+$AD!EFW4ktALJQ#4tKeChiAni++T%J(@eBk(O31=2bccl5Xp2;?GIW= zj^7?GK3u+d*uHYF`s&cUodu8;eDJC)pb6C{5Uny=XiPTne^#X#aSSrAf@+7^3!8;k zNob)d4+u(_c@?_5GIzC88vFgj!halhzkSsBe!unY{!j|%BgKLJ_Hd1`gM=phyE$^m zh2t2f3$ueh>YFZl^v|cgZ+40g8Z(btH;&s^c3U@&mZzS!uj9X=WC&V6%ltDC+ z3eA^8IcSB0;8x2w{-6x*=USf+5Y@E3&z zJk#>bpd|^2~MEa8F>(ggrS5)#Kks^hDf&MuSpUsOyvS;A)m4DA(K9?JNC3pE} znaeL{ufD>y3zuF(>Is*7*qsAQia#TJHdUu{Gh*1GfCW0;11h!)h-QJAO_Ag&oS!@B zoaICzkua9I!%7bNYW#K%_$l~|1xIBb@`>{XWUpIX7!lE|GC!=&te5jpM?9I=YYVdb zfOZ1<2olFMfk%&bV6n5^JSw!~*{27{>!n_8b#e0pW zx>y=a>ORI81-ny+RLa^k*=2}emq}>X*OsSP1^izgzx9P?b*hO$cj@}g)tp?5I|bTv zueI9)Bh2O_0e?o>O9ISVTJ-36w)rO>8t_;V=8j;vcsPdxX{RZ~1alUMHiHf!Yd202 ze8$aNX5BlOT{IS3OAeC;>TxnwVL{p7wD{6gWg6&14P-vXOy8>y?VM^cmf?@&vK%cz_uf$@=|{yfQF; z!S>mnOevg!#(FQKc!Cm;8!-kNJAXc5&JjL~IU9nG{25>iL8UADQ30d%mW!g7AkVN_ zav(MZN6j$@K1cq{ClO^eu$p%?+hXGq52GB0?ox(Yuh%og8En=TAjznm;m=BD^-SI= zhZJi9d^XPwmqvH%i&XZirFL~5cD+)X94_aX45L7~5jH>Gs6JY+Fwed98U>XpNb0P} zgHiJgWHxEEnQy?NakOT2=4*YwPgl%2h`QMj)wHpdUg0egw$H7~obE^gihg~x!i}h* zmOsS3kl*|akX4Q~u|WHHiE(Mko=GNwR(r2h=LGmu|B^;? z2rq?{QX>_#nSRh%D0Q^NpTu0HHYpy?A@#zxAV)*N07j@IsFRvA@EIEHEZQZ|0Nx0t zWolu5yavN%ZQ%t0UUSS~2tckwX5|S_W;o!aQ%xtI@MmPSD4!*JHs5J-O%L%fIM*O& zpqEzubOfCi>=kQWs}h==_Rls-$ex)Vd=d)ERe(^{Fi(xB$wc@}dsd|7V99HN3nhNG zjbatPUAE5^G|!M{S3C1Ri1#|h_d6)hF(O70jj-Iyrsy_?uQ}5#e1H)}n>7=|!s5Ve zf;LTBWyI1e{4f)Z=w}-p$RPz#B=pbGD{z%Icz0-vHdlGNK3cPtI5W$xS&92% z3&ANxsF_<2q;*AfC|h(q-vl9OXq$sv7akk(6?rzF4QJ5+XJKcPTA_2sWW&$8D%cUI zG;C(?$stLaVZ_fPX`7+J?{Y{8LIUKi)gyv-nk{1un}D8D7c)Cm#^YsEa$@;En<83J z7ojEuRl3|7iGnD!QD2vF5?K$htoa+TJweSjE8w#Pz3wsrnijSdM+KFDZ5^mmFoY{l zV-`pfV+YPi!dHRSKvYPgJ&1ncEdWv@KU4y6!Na?N9*ni1YaTeK|rs7Q&24lEh%m1seXWX$1W(oO2cCNz#0b zN-+~h&5$c*XwXusV=*FALIR+?Pb$Tu%siGFR>3IgHk_gjJ;0VfyVv{dJ|bj|_4$MD zXBKb}qAN)-kq3PaGLew17bBS#T%Xu!AU&YLQTbQS&x=n<{w$i=kFCTWn%Vz#; z4ygP50=%EtsW2b>B7je*ZnR&RHua5iKI z&ZX@0WM~I^CpjW#(=bb6>p=-On+DPiK^uJbu7Jr-o}DLiD5{LUomU1z(Dv-ni9>1g z*?=C4k#1Gh1`^9mZg;_w+61TWx0>*0_%IKWwsF&_xOrAMuyx|Cflldun{VMD-L@cr z=IV?D8szJ&Sg2WCT3Tozu;XZIc-TZN-Cx2yE&}j0@~N{xW7AZ_q6KVCFibx*qbu)U zxnW^(Y*f=ouVa#MS|RQHl$(3Ngynn!o;4w~9vic6hCIWcg^oef0?~X}+8=JQIX%0T zO-9#jZ4?kLk0tP#&jL@BnChlnJA|w)(Lc99{24E6xVNp2l}359mcu7ENyeXL&=LB_ z`$E5N5MkyjlC_t2w9)CHsn#jmM!t@;A|g@heT3O`-_q+Iy*Mx^t-EPY0tM!*w`?Ot zS>_>+#XU-mHcCh3x_y!U3zB8n-dF; zR6$^wLy>AVICB{6psl^=G!4>590JG|b5OXrA=7Db=9LUOYN2L=60WKTD+oS&LgDP{ zX!Os0y1fW81j24{`}x?4}<}{3J>K0 zHfu_RY~YU~{L=_W$h&O*KK$L|>bFM?D72Wf89M`SMm^lARQ+r0dE<=S3-?BU9Veqro!W$fF8GvYACe7+V6h8)BMwJ|4+y5ht*|-jwl}IFT-H}53%LT@>n>- zpYb;)0XYMIPVg@^mj289*?FlUYXMs@AQTbk%Fw{HxvBGaN-q;yaacUJGBuVRJD&`6 z0&l%04d`MUx)r~bDD;G&atJ?9wND81X~38?2xlFwpQ5ixdktqO-sjH}{Lt4TSQ=Yi zKNr=}f~BTs_OlKQDT^iACO8qLbH~))*tdmBHA^M$g!(v^Umo*x*?en^E z7VdkP?4)g=%~SU)^5>NJ*@e(i0__FpdYaPvCd3JxJxnc7ZEQH$wN&~MK_~oKlTRvD zNcQ|p;bg3&^Yn#h&T=YUlkO_k$I4hk!7F3U3){rA=|XJzpZ4&=mQ+Ua?B)L*{v7R~ zLC_d(WUsuO8GAK*^`-o^pDkX#h)Q{XB>s#JcIR|_G&mc)3rh#+?oJ1%*%^Yw;r2{K zFyyu9Ma`bVqV?hYT*+Ya3|j^=6OItKjbQs+nI(!DS1Ghv`37oXLW!+c3TrDj8ikor zd46ZOcu0J=E+};owk#4(I6O&Y3s@@v3GtT@LPjtGe}_zBB%qu_FAc%vm$+%VhHB5Gmu z&om>VqFkWi(&kw~XhQre;L@OGSgzF0rD=4hMa{%O{LxKW!Va6#k?Tc z>(&6pciYqJH3ZMHELf{83~KY5PwqM_`u2%uG9Dlc$ey*&{b1Z7h%GA#$#LlitgROT z_)8=f(2`7J83DExSkB8KL=afm*e3&a^jYOePMNRio62xPM`!6Dk_DCNEP;H`?`CUa2sjtrgyVl>MpO9|4f{ ziO{x~+8Mz!T-vE}P%Hyf6Tx#N&)&fK^GT)HwVa=6Z`K@Afa|vg2Am^*7JN3_4KAc` zrp)0178bl{z=8um5K~s0#fL%`Zg9@ zRJN-bDDHhA!LYQuUfCIzl-9~1XffxFDrNa&uT>F03xJ#Xvw1-SqEDQk z;mp!P8+j&20*(0DE6JT~KN!^Z2FnNyD@7>u10@@!_#;$!yrD!HI>f~+YxUUtH4hk|Kda8k-)s4?RR zI5R^diuO)mt(<+YC;2p8nNm8jk~YdJ5{qOPifh_n{&MCIW8}@|yn$vFAY6k6JEV0i z?BqERX*0Eu!-F7aumo|y%eA7}!8bz@10~`${tTsr9Ey%6LR{yTpKodCU*B2r5y=tF zVjSW8IW2j07K&_GjMRp3$gBx(m5o1(c8Wh6_WWYAq50S(nI7F*7(`)q8at_00VW*y zGun0AX9>t5z2eVqyFreIR^?vhqkc8|Z|G2xX=#a_#5z`G$;@AN8SDmgfaVdw&5WA) zfxP6(n+5y2N45`H5s6{4XxRxCWFt0S#2~0 z(n&^iA^(U6 zHI^=s9%zNQb>I|$7B{u^tG>IKPxZ362cKgd=A(Lz8cgqgA@0X`+rwrtQ-jHnCLeMP7HqiZ_gO`ZfSmZ>&j_^+65CRKg$KcOCDC8L$?1m4NO%WaD z05oGQ+EqhRjO$=Z7)oknC2Gh;lZJxZG-l4^UavN8OJXendhqAZA9SAGHvzWMW+{qs zw=& zEc*)}JQLr*Og-B7KO8tI=o>pSBv)}r)AiDk`kxAVo0M9$yscfNkyg(`qzKp*@v z9TyJrZw^M^?63dfVDR;!Y?YE=?(4jo{6i2l|6Z7sno%Sh9#*(8z*Un*(;LrBoJmv*zqcXSPKV%M5VVxfI6oVw z6&xm+rkVmIRwf&ks0?ie@{SfX?#VJ5NwXVk2r|>YqnyO$d;ob!1hEq+?Euz$_GaEv zoKwVGiK{5Xz>@?Q<&~CUdG=E}VWjC0c=`l%mh1*BlKXC)Ku+DOrRUZIBxAm&b1sfGkJGVN9PP@_V;M~ zBf?G8F6kB934cZi4RfZMQm^{9Jfh3+=iSQGZcR=au-^nA2Nq2YKF^?Ops}l?Rg;7u zq<}96_}Zaya!Oig7eBlCGv!!#0#8N)jriI0&){ep(@*Syf{*3U*vsP8Fly@-A{{w% znk{?Tuaf53RM4Kg9S5hl5H3w6zR*x;*s}jI&tKgNBhKIF=E22Zdi*Jl3p9V5z16I~ zgPvi1;mZfB=$s+UzkjsyyPahR(d0tP2c54TuO|Fi!3WKhqbVG%-+J`;xd&&dq%n5) zNT9zzSmlfEZ?6qMT%WmLzWTUz>2Bp^M9T!}b78ZvGcgBE{|tYo;4C`LpCQch<&Zl1 z67bpiv-HoI^KWmQ|HZv?4+^iY-ndYheR)_J|L(Bxw`KWuH{J1%N)SNn4Md3_@L1fPp zsGzCeZ%pCBp~PWBifBK()4Yl=$AiZBo1JkYEw*!)FdNw}UmGo4Li3FNd9;YZ_4r!p z${=@veOSv}T$;V`XnF3R*l0h(NxSif-Od+}R{q!9?cdy=%3T?oy)1^D8#`aP`cip3 z=%1mlGS)EiEZhozHXX8;(>c^DefXlX`nM!ZXAPu?R>3K*`ag%%d2Z}wmhiC7JA#+` zg$u3OS4&eNWFZ#{uh~qv&<|togWBQC&`vMJ5jjjXpr14RnZv*jQ>S8^^x4oX_7-O1 z{Q2~({1j|3)w$Sag2z=K&-%L3El-zUM!%hgmXy6gn1COqVJzhKG)j$!exV;)Su0KW z^U3BoeIfNtpasK?DaAO@bIUnm2r8Hz zFm_a%RXjmJG}u}88d(S)IoO$ca5O&8B+k-?U(f@1scge+i<$M6*_GneQ8^1xWprW8 z9v-LUl&a&FTgStG27#rEM)Y^(dI87UuLqn&n<_0;D=>*k1 z>>xr}fz#{oF*+GQw)4W6EnszSUP^3MgyBYKh9t4B_@}vWV7uWF`rO_*SQCpd8_oqg zpH3+)u@hkNXIVz5y>LBc!a?@uZa1cH)fR89kg^*q_*%??+}Fy}Ook1_xcG5jR9|{* z*uKGMkyRti^sKV+XVHF3^h|wBRMLP)!fO&d&bsD6yFPgekX~cyCPl_zgi|D0i{y3( zx!bE5$bUP3T`<2mBj%4!i;2(4C3`M%Bj!Z-m!@#%&{%k7H0K>|i*lRb*e$Hh8Td>+@Yx$sR!Y1$=!7i=IO`HK^uSzQSlcwufMrL}-d@<* z3^$zFa!7JC&6^i_SwMHO?C2Y#2LG;AZ#A>4rRi#UzP(aJ`8=xT2_V?6r@(SKb7HLjND{F%h&NXOzgh(o*`0M312zWg`1O%Q3s&x$_N6`ht3hR&9l55qBTvLeT= zg3mB#LJi_F;XIlA18B2soR{%-#s=ZTjV!9ykA|4&vUMv&B!ou7mUZpO5Hvp6Am#q5 z@UllLMDH{zLndkI99}z&OSU+_*_*)p6aK8d^4>I=fS`2?oHGN-ahAr~mqLPwBW#C$iBbsA|;t%?T@hUo`>`G?oeoYDQ{5iIR$Ns&}qTavYN@10JzFf&{gc%Sm1RY^=AkX-6m^DWP(N3Pd zak>nkW-M<8e^%<|J%OO#!Y|sQ`x!Kb8yArlo9DBxH(Hpyi>oIu?K+X|$RI7MRswbNsABaa2-;%aA$@eT0`r0Vs2_9luvy7@ z*ubxT0uM-(j#q}mCK|k({B%7LA=5x;$XT=_BjLovpIPq8;xm9~F>|{$f-?qol*4Lh z0|Q4)XupmJg)u8YtFcW%Z|JLJy`q{j;&9MvXIEfTEKLGqRPL~42|?>DQw3p0{fM4X zDCjJ98ODSuJC9O*kQ0k`+6GE^$v|>M!P>=!Q)s{Kru!kwj^kb%Je#<1pwtyZjsv+{ ztoJWOtPp|PUdB>lX^dzS0BZ3Fu_vzL<`hg7)<;Ver4si+Pl1e>0L!%sUIcrv8XQ82m6GUbqN*_dz{I}TGL zo5OQgCePx`*g>1B8BVK9z|mZ5>R&o^Lk}5lbc+&NTZBP(@E{L8n9`U}rFuy5XKEPt zjR68?%s^zy0Y&$f zJJ16+XiRQ?8hptZG6esEFTTM z|8gG>`@w>qWP1~&J1%CfXZwBL3*1b8bbtz4Up4ZnerGfM)*yVE?3<7e9bblQyN{wF zj5#y9e_Mu6rM<_|SF!oGFc3rVO`>?0Tex21H=?%;Y(8Hdbj2N4hl$?^lh;=YUtIRq zjC$UzQAvBs6nwF|cf4*mo!)56g@b?fUTbCKu(3RIuxiTWRZuVmbAdLKXRJ9$?wcX$ zvRPy}f;QV{nLh_V4Wq=-g+ngTi5;|;IpsY+!H8oOE%g6O+j~C8ai!^=JtITWf`lXC zO%=*J6j0v4(~1TJK_gLyvQ0@XwbV1yMy8Fr$MwwK8#nIWi2bM;#;3c4D0ud?}p;g9+!|bE+nqF2(eNkZ`c=6pMA|VJm#dC=L3@XR3*bqYV>J}Sq z-u(I#+OKX^;Ktt*H*jC^2XTRxfcZfSE{&M^cLz%7qLDy5f|djtw`bvKsh!!yQJF-Y z-`!i|joaVd%-#k*uZ`bcz0gWy{tRc9v4$rT15YS#M$jA*l(rOAFj(ysFt5OWLvrHO z+0N4GPWr;fy$j#p8aY@y)0-bD%#7|<$N%_X=1&i?eO~?jgEd|P{&=wU=fjO3?+*X? zc-!^QYz3kp_I`NS{o%0x`@`Xn4|{)kF#OlIt2{4(pdYN7_<2p7nG_s0;Lk{)4_mT; zcK8f`Hg)u64#@?2ZSvmw!~<2BcvwHzOpSLl<4@K{Z{(rnmwM@mVfG5v(3`o@Zt8q* znOU4C6=%o3xSILneJvNx+h5*Z`=@vJ4yr5DBcn?bXIDl}7sg(}{-PxF4QQ?NVMD|* z@^$F?U*9HhnFwbrqm9fuC{a`JXSJ`8XZefg=BCemf9J|)dkeMn^w#p(#==-;R7aDY zhGr=Y`H&GcjoUPse1z$|5o#K&OL$5g;b@K1laE%d89)x_hK^2TUOJc)b=XxqvHf+# zP80OfDjet1u?U$_CCMcDlZ^*98)xKS@iGMJCt3?f^L>#&hjrjkaYAnpd?|d`KLwvD zPx5E0_7g_XFHYfji3V?Tal?&h*gm^ZGoI|p)ksYI#Y0iaPb2!5EN|Rna!I2h*&$bG zGvMU8$;u)BljE^=LbcFNC^>OrC{My?@`BHCN?JgZcPPy^GT#_Ih3#`{{A~Ktne5mb znX$7gW9JH!XS=B};3UBZU*ylik}at;?`@=a)|culDfE!|@d9$4;u?}obxK5zn?Y}k z&RL-b%X467DKLu*sBkG!wc_#sfi&vM8WrT)!S1cTOcHLl=cG6#h~6-*Xm@CR;o+^E zU^pt=?h;NB97Vi(ubI2Ij?@!3fJF{zw^@K(-S1<9vAim;jLW?Wy5;Ofd3mD*aE5r# ziZjdY*#hw8fZB zcI`gTl#ndOqU6U;p4r-a0coKn;_amgAV}Q6>+30E4qjVd>7g#p&oxUkJL{tNyfu)$ za}Ss7MQF1bK5JE7*((PRJRB07nY=E#p=P$OeAd>CBk0<>G?zg0>MZi&fVqHq87HG< zrh>he?&HiX_*~%az>RilP@ct30l_ot3103Ocq1UIXMn%oP8^~HY`#&QXTGcwks0L| zjUPDH8Ag@a+G5%}h=EvFzE&v*YMNH7^8R%QVW1D4&rx-`fyx zXOJLh6FGZGK`^+Iyf|e041AUaM-V@s;Li+_Mi@3G9?U|Cl|;o2d2ZpTlLs~955uPw z+vi4M_F5zTXtRdR2sbUC4pfL=@G#lQ!ni)^uVBIqaCZI-I*#eFTryz7&W$6yYSR(6 z-smcaF@Lsla54THm~Yqs)SdHWwvbhNG(X{pKMO%K=1qXJ%#%5!NPjye*tJeHSWOAc z^Gk5FgwSz-MU4%SupwxZVIRR~xpPRv>{o%U+)E^fKE|H`(J^f{@{9z!BlxUBf;>WH z6Z&Uo(c+>a&rnt{V*w99RzSLCn6s>#YXpl#nf!dC{qc~fZ3;w49TO_A2~%&Z$V_9S z{uxA?NN~J6z<)zr7aIimIm4gj|Lh8L--0*Y=fuR)TmoH%*#FsKvW6O2YM9PB@aI_e zoJ7rZ7vMAKm~%-1CM$3r$xgJR$M`enYE2;9aRomy#@7*rW_`f#Y@If}B{GsHE8R_LUF>4ZT$4L0M;ba)t~>j@8Z?!RMFpXA?XJjkI*s zp#{$6%an{bO#ICD?bgcEhFCNRI`C({b;|ex`vT$#5+uv=k<&82wa0n|7YmC>2xo>- zi}zZ&+%Q-`i}xp{H-sKX7*@d6Z75={i!brJ7>B|w&3VIh!cJ=)EC+r|q1AEY2%xm@ zM*P{xYNWn~KSRzLkACluB{eYI9gMM`bq4@b-h$vj9}q|ZkjO(=h}$L5?$|5}EuFSv z5o++(DSgonCEAUxDj*^7mgq;~4m0uP=tpupH3C#0WF)dR&kX}IiryszWD;mjrx5Z3 zV}WV{pM`nNGXdOZ#83QLBvvX!X>nD-1iFzJ*c^b#dwsTm9Yd@vyHvZZM&Qpv(8kOe zxn|)QifRLaS$2KPQClKKmotW`;D96>n4mPP$4Y{BLA9JBwv6itF4K6J0Fewafoi=M zno_l`3W8Ni90hCEF@J{UAq`bEW1ciC5jd)K86Au3#{3yyXeIcwyHBtn42G^F01o}O zU-4@f&b$#JHNQaW*9e>DXl5N;Ak^$s_Hn}cAmk3o#dR$)O;!N@4A<4*w+blL1*=W} z%us2KQy7VpYU9uD&n%>-YjkZLQTMNI_k^Gy^?v)%%r_4EzkSe!Ka=Fbfkf~@3;OZZ zz1Al;dY@ctqj@HMa;^T^Uh8AVV4lyAZCz-4>A(tT*Ww8xzI8@TO%Qab#?9d6rjCXl z%UT3jE%+=qX~Ada0#Sr3(g@pR;;0j2&%g->hPbi_&ZPmWqSNL?0kCD) z8_|8j2hHzlkJ*Rx*J=u44~cWvra|!RTiui)XsMc=M#lJ8zR=Er;m?m@&d8n(GCO&O zTPnpA8kw;fcL1yNk6P)6&D5hN%IAWWODRpV7VwdXoQmnr697|5@?hap-byeRPw;0) z(A?@Irr=4oB*xxZ4W@6aA&gI6XkC8MinK^MY*|Pdh^o(y)+bt)EiIkWrVup7(VQz} zJzSNr+2E?nfFtHm)BvM0#fbYi4~(?QDO??1OK=5zyzcCnsw4!biqF zIIK1wM*b$SdaMS0Y5L~!!5zZ2cK+;R6Hm6&)rC~hV(-9bKD;j2j+TWBWXxIJ+3SOF zDWT9PrQdGmo;34sH{j1wM59SoB*9g;Vg})&XBLZAghA{$YRe>J#fF+qpX~fuTdzh? zLi{xFk;cbE;Rugxq9M;XbX9Lb=0WHJl^}w9T1E_5mrwbw&Hc=Y?{y_&H z4@`&t?oR1(W9+awcc(tyTRJ_=qj1K+`I56`ZCA|m*?_Z`hbV+zC*WukNM8g~Zy18c zf}_1Ku{txdTR8XW?zvBfXKth}rKT@lFP;9&!_<#hZ5*tB%l1+CPxrguKbG2=WQNbm zXALwu+-0>B)YU=!zHmne*GJ z3zdbDL3xt+iNC$w`1O9}@9s8!c(U=upjw(6pS`G1W%P!Sv1>urorSW4^Q)Iif=f1HZ^jlx;*_q-)jDk_xr$**3!gq`Al|v1g`)a zQse^7DGuU77bm$KYUIgNh_`7L9Cw82j7wA5d0jXwjLk=w+!}=z>Gi(+lmG@p3uIi? zoUEp!ri)HiBTpU5BSVRpYN`c+ZozrlkI?btnet`Hk9~wkNlkYsp9QQ(H!xoQ}rqiF1>A zZ!NKs-e9QnQ|%u$7+OnYUV2t&(=(x?a6vV%cqAt(huxR99124<&xG=jIZ+|(Qo(PD z0G~aRM9|Kklki#m8RzHGQ-#S_Qy0!HUKr_RCy?f1AZ%pvNdF9JghN6d@3%|P;LSQO zi59WR1rPy~2PH9B6AVlFtiWw}DY*FtuvchT{u>dqHUDQt^vf?}%>k-yl&%ab%a}aB z*-T5mD<@tB!o$^B_O_ieyV8hu(nM#w-Hco~@ZW%w-*4p)`WY-cRKHcg@b++!->5E> z@_0T^cPo==c*=S*4Drh?KTt*|WtQq^477jvCaJ=Gl{97gh#L>Ja|TW)TYxSTPiOSh?KD zU*4+Y-mDVSw9m0<5@RFi?JTPim~#)S=PZo~Ya4BL&9m=P5)yzKBujGWt;%43!a=%i z2;R<^qG*spyM}*dFe3ik%8vYVlXz|bqBmG%t`7d; z7JTq(eNhA$DK+GorYzKu7QF%(2ZtVF^-N?#Xy-70tDBW#9LQ`&&D@X@EfX}bTNXIQ0J&Fl{_GG{ z(Ad?^CU|zfN{JhBn0#7LT4-8pYqlFSGBh(}&%9u}K_f}>Or8?;GALt}46yaxtBqWz zvPiVSRbKR9yHUl~27sJv^7aP`jmX*fGc5W=;2iO1!_m;`z@PDpZr0{dKHuG}N$?Cj zH$3h-XTUNc1x?j#g6GKmSys=gCL`#`_L&lri=QQUW(6=Ii7CBS1OD6*eD=9)RF?@x z*{#e1s~-+a2R(U=WBsiks>}WtAS|h~K}!VBvTG(ee0J9hhsl9IizElZvrw})V!`a( zvDRRQqh1DXRpr z7G)2?FcM|JtTAWg#}Tk~{tVHjf+f&&4N&Y@m5emToNN9Y0Xu6vvGO@0pNiin^9`5g z^2lxUGP2;H&>J-6vw|DaFNyJBBm!jiqjJwPSic~0?x+(q) zh!)))u6{PC%PHC&IZ#dGu(4eLw^I4zjjVXJAhVpJ{VZ!%G~Ta5h(G8YIPm8fM++L0 z;-dzoBNiP2=jf`L8kxK$JIjRA(oUQ5*|$!T4P2`!KkALsi^FHO)~V#p)KBu~6T1eb zqqA7s2tk_!+EyUq&ssE-QqvJj4KdaytG5D$1`+ce5CIYh8YOe!&!FaK-Sn{(TSHSP zDQU)11D?#*CD6{F-R+s07%5}EL4~KyG>K{vj&5f4W7~e21b;@sE2%St+>JFr&_fG1 ziNOW$5iEtHt~#cWzccz%6QgM~&saCZY@q~fg=F0inG6E9*c+K2O}pk0&~^OF zS$-mQq;^y6yr{%0OT21=WU#Q*+U5c+)JzP)O_a|vk#MT)JkwOf0;ghz3^;bK0E3uJ zT8t5>!WbApV9sRd&OA4w0XVu5J2e@t5gz%JN@Q!3WvGa^{Y092x4&XXF>b9uXqCvA zuc`B4!5l&Dqk)2Xk4M~BZM=K(=Gjnq+dqXp@3h}khm(H^1lV90D{ zs*(8lNDQg*a8V3KaSDk!l4wEP8%^(?_%mB}k0<$5u%4`&ud2;UMgjE8`mjni0F@Y< z!Yfw7TF}|^yssW+EE1?KfemWVp>{INv54VGaeEm z?ayy^pI`4F9cS>e)VSXMhkI@K^Y0!Fet6uK`SZcnw+EZwJ?gn48jlY6^WX1xKEKue z=xPHa4z`*sM%=7}ErKry6PFy?ym^g6L%Eeya-VQc#OLLpwc@2L&5Ar4hYfP)%$ZynDP$3#uWV(1v8i_C*Rj*YIGW1} zNv3@eG=C-di{X5gv4!LxUbYMOa^^5e48Y@ z4`%|xV<{sUy_Fgrp-`gH{4K0F3_?6v+|eRZA0aW_=7JXXi1>)g6^b<<#)O;H?lr= z;qK}ipY2|Fw{F*y8|F_4D$Gyetyj)nF!ieKRWBx&Nj%b7MXH!12#S0p#v*>hE`Ai`p2oLe-z<;AY z%IOcAQ%@Qrx5}fLCB}2+aP@32J>E`T*ei?-GLuq(uYlsuZ>BD^v**i8BOh)q{N-U+ z4k!24@YDXkzSzFgEL=Q&E;aE=;nJzv#HrjUJ{y5QAHin`o5R)rbo(;??B|L?C&;#T zV_tLFC9ge+J62 zOEqoHh&XV(MCM2a9C&OZa|}L*2I+#lZ@mlO^vB4IZkyryG}_h?@6ZkV-aLWL9M?7ny?lq54JPV~DdS%EyW z@U5m3k3=PjUQV781L_m)`|gR#>>jr+j|Q*Ul!t? zcE<2|@n&mTzx3~};LVHa2LzR*aD+Wz^@_%cOuAnHOu-vL(?BiJ!p3YhHHY^_yNri0 zF4Hp`g&BUuPwxmRWu_rvtz4R=bS1W+h_tzaU>;(5(5OIk0c#Or5z06k_$=A8`*L_7 z#ghE4NfK{E*JZ>p2RN0v2X5Fab2ryga97zBw?MMaoGntGERiMRmFBr6o-Dy|Wcw_G z2qEYrB5guwrU~N(_L|8Ci$g{w5Ny*bLueI7uz>{!5$LdMP6L+V&&2hE=CP#KES)Oi zo;){NDVaa?3^;SHf)64?Ma(Qd%pxOECPAUu4X9ZeYMLE1?W+Yz)6IgzLLc%90J<(# zYzE7^n(bvSE7+MUMdLRbX{a*m&z%G5Me5v>)%G+9n#5g%TeWsE<<4COQzM1Nx`cL! z706b&UclLyw()1Jm5iMs`5pj~)l+Oi)zqQLbUK3e4RLIcwMHn%Y%M7|H$D4Z}-N6mm!XTmN&rVy2~gv#cy!6ApJNA-IJ5Uayy zeV{rex)yW=VxxRE&9nTI`+0%rxG4wPYTSUc_jm-Kkq~!__=LC$`f4-3j!$xF3BzX+ zsClqn?A7y-WGpzulPfCp1Z`GC!dUYh;b_-FC*;tQOqUn1@7Uj2#pIb;WA1T#!w~dF z1)paRHOSU89(*uH%_7pCCqp`d&lrYS1Vi73;EY->~A$1ntdAyY29+K|k*)={%>MY-ED zu=PeP#?^@N=OpNc34@cHg&PgB_OK?bqxdJ9vop|$)17CodAudW)A#`$?iwjM~JnUReF{|bHu znHQM#PK{)Ku~q*C@zfN+F7k6`m7w%mJ%t)%F_EK-+xzN$i0uZLnkZ>l4P(tgzFU6Q z&NDAqE-MoObI6;OAYlccf`6&$bB8~JngOIJV8PBrbHjoI9V`HrFD8Ixfk)zwxy*QD z4W`P8FjWqje0mLr34EqR4j#B_B#bqT@k&0;;%L$IW6X`jy*jLI16+q5VZKSBWPyodEX6r+l5gpaZO2% zp!HV5PNA1jSyOWgjd~o3AbKz%Wr?4;YL1`-e+D4G*Io{qXKE^jU`U;;V`sT)9Jkk? z1uCnZPKp*ds`!Io=h*+5MmX!8W|p5Mf6x=-6)46F+LX__^p+I+kIRbHGrD5j{cuMlHu5HSrxi32f)SCC?6D<*kNCT*~n%A95V7UWwY8P1KYFenFKI7k5% zB1m@rtl@DFZ%3@m*rPZzTof^_CnzFp)06XCp+y*-G8;VYg1aGsjv2W4vy{&Q>@?0+D-VCOVW`~AK$H<) zrXAG9>d}`M3k&&O%Y}m;$vbW}d}qQ@Sg{OJ1gjbC^Bc&CjbKZJEI9o2oh|}AM1bEO zbiaGhEApVRWlB8#TmorqI%LgZ<{JWo z)N!4&P$4iGN(@DhZXpE<#Iyv~C$zXH%12UbGHen31A96_75{W0vdZH#J}h(6K!$V>lhR5^#Y zJazN|w6`-tySxnIEIw{}ITi6|U^OMS%ioRYV)C3%vOYz{i2!xh`~} zzca>-o%&MFX!$%kf=*&{S*Az7bgxU6J8Z zRQV6i4`jO16<`PbYh0kQ(KsZms(`Z-W=GJ*oJFLOJyVXCGJorSchLI!Hh(SCj~g?0 z%47TM6Zh6fF+kqPjbio8@5iNT&Q7?{PJ4n8u2Bu;8>kLP@3|D3x@;ed+Tz0jo6 zAFYqxs!hPFVbPD86Ud2`Yb zcl)bAegx;ge6ae*`yYFO)hO@^5E_3MVgFH1a^3!v&2?lCw}#NxB>Fo|t~9lPnK~WRm5c zPagGrvd+n)cH@P?P}3^}yXKSi;|j?(U(COF)`>cy0(XetFd_3&{tSx-L6d^`8P1%# z_y!3CjqOI3{DeXfl3yM@hriI99RlPn-fH6=u`Ikvd^9wQ3jZfN+^g#;qQwCZ2^(js z;5n#Wt27Url^I1@%od%qq{8JnEH$unCJ+0CLW@Y7xq$@I#f3p_8t>nYQu<&+Mh%7p z!HjcY=WCr577h6B9`v!=fOA%4dN4=;1}VdhI~9yI7F$Idwu9(0)4`g$hE%vrSAN+@3xD;92*>#|-1V6}m=x1)vfMSwq3u0w5B#%zQ;3LQvI z3OVaGd>9+;PWD!Bo)-%8$I!yATfaqWD!T zLIxlTP2&c5^*Vraap%U_LnEALng*hoy9Hb9WN$Vy!}21R8(VBGS`n}8sR0oiS=GD( zBf9Jv+ZN>LtnJkXf_9+>fXxDE_!mS!z~BuSCl}RW{3=9 zks(GZg6i;DVA&j--M!h-v~yI*YCzD|h@FO`X7^JwvCS?we)wU~Rcxo^Mo_Q9Hw#2elkYRJoRItY#Y3G^lx4kr#*Caj08J&}Cept-OltnL;$u zGUAZ(85d|dMVn=ZoI0ZEu#z@GwtSX(-^8r1H!|EO{ngZ){i?kt;B&O}sK>Vwyfx$! zjI{ETcIJ62^$8}=z}{XO-7G0a%~C;I2tpLm1g(>F85-=|Sim`!G*cK`)J9GnCVmz= zrZUw4p<#wh_0iQwH_<_Kyf3eG8qyAzu(M2tT~CWCv=M1X#PDY(CF*O)_j7i))_}}zy8+jAZw>hKCqwC( z!H;||25^18)j;|D@peuw2g549F7Qbt&=6+nnF$@ZiPnAn(+yy?JRF3P5liE$fp>>R zDl``kUmdWesA4X`Y2GjAODX}Kw!?bQR9Rfn88GYh$Jm_S-l3%QppIe&IN zu(ZLZmx~yz9FGkcO4uC57KAgK&RM&jk#PhHI`e`K`e!i~gS|i%I3d_Mq!^gUlY!*C z6qpI_Fy$xA5NRv!z9P4gsuOg!1#%Jd>?@m@#JWPI2TpN(?@48_c; z;DFR?#`T4Zk$n5WaE&05H%!E`%L9a@@f(lT0E~zGs8|XNnQcMD^MTLe&xT=zUb)0z za7>2xv|<|Po&{JOW?3SE%I%6@Wh&Dwz0j0a+m@HrfKfAdcozvRD6{reWi?<^-aFWh zR|BG^*ChicPl5)!^D|rWTvIAY0BK&+f?aZEmWGonF33ztBm&2so4Fv`6mW|c983p- z^O3;eH{^rujrax9y9uMU$dBc9Y}2tW{Ib&Bs=Np+h$NTHCD1I6({h<+@22(eKN{|fkvzdzi z2@5+3+-@5?wMJy>V$xh|2l(uWl@rC`O}7lGHgqW&uvcbCAMC8dd!f)2vddPTy0{v} zFC5ZDu)?#OZ5$_P>XY3T4iex*t^#ZmhYew8S39GKHZN#r!suF+j84-F%vndVhHl9n zT7d|WF-xOs#vS-Ds3r|6prNUw33MnU4nbz>M}@N2fI`Rq9zxl42W^JvqT@9R?coUd zDDf$dP_u3Z!|ZmOX?=XkwuV|FVOv>nh()u@t!T5ze`Gcnj-a(=mA2O39jaMX#uJ+u zvb>4Y`;@wUiv9B&{RxHBLRJl}XN)68?+esB-uU|SBF!@wns+OFvZT#63l}aT)wCuA1njfy3Kgy~Q z;EXt#lmyOBssl83fix8;58(yfi^CAKYnY+j%6KAgejSms2ZcHv&g`}ut10-fRgiJC zcy+u>O-fw+jK2qvSt@Ar;)ohI&k#{=BhT^xiT$WWt>p-fceJdnt-emD&btkMc%=Zu zKkt?Kg79px!av{7uQfj7k37G0BSbh{+CGo0Eyh-#UoHLWX5riY$`AJ?9!4{a!v@Ux zhX*Y(xO4peU>(Da-|e@**g<(dFEQ}?`3j_fj(4*h-IdR>n4SNynqSKJ-7nA%qh()MCgxlG3yZH;f^cjT25b4#~^R?x(&w79J&EC1~ z{KA8N`d=TGG2;04;rgEr)_=G+)c8fAhZH)3hCl!LQ6B{T=fll^I$ZtJgT^1;%sm~X z-)b*C>!m*6E7dTAO9@N#c4rCa=l#ZIjI5nMqlI?o4O2v$|8ryV@!I9P^|8Cn$v0Oo z->Hwm-rre2Ur&#&r7t~Q|JkG3nbz_cw$;FAH@;@%gWNf$Szj8bi|?Ma?SDk`ANE_D znaso(sP>io*r~jN5556^CIO0p&(5E7ldq8iUsWbyf&qUf<*uB9-v&1O(u^}Lzk9I#e>`3P`u57g%%byW2Id$U;ukWae{ph52ZAF5 zVs*_Y9YyeY@>J!rD*qIJ7JT;fG6e07C%0ai_>3ek_w{idEG4W!gbL}@&~)ogbX7jPqol&k}$uNKPNkiE7JmA+0ig)&=&ml($uRj zaOQ9=#GE~qrzj*J4n>);N@287NerBicBkz07~X2RsFPeY8n>g#LX9&{p*)nlw0`oG zP&1rM2C(dG*$aJAx~bycJrnU~wCnKzPGpj8zL-BzIk|hHa`KRaXuoG%{G7XTj%0bg zap0qu;a-I>kG~=P^QF^EW2aUwy$*Jk5PI|snatR$^P?BGi?aaI+wED*8KgTkj0p*Z zbnW-cTdRuPCnsddR%J#ZBrDV7MIdt|7&dZ?&oi+F!O^`kw#mZL#(QO+EDB9Yb*Ya7 zb9w1jcLm5SkA?2S&2|>wY3Z(8;-BKKtt_?@a8CS$@1n|9O@5w_6K@IxElDa?!|ejP z%7=Rp>E&i>rky^lOH+_=iId^XQaDdx?+i3%NG`_K6e_byR!0sY#W@ftXAw)0 zF*D9?A;sz9=ay7XD8r&Ew6crTq^Ut+d8;J7cLSQ8o4ejvyw{t(+nmMo887QQojLP` zu+Vz|XEA5_NGL%{(b*CO4`Y)q2F@s@tuPY$%GOx?8J%;S^di7qn&qd_#d3t0gQCZv zSJq9$7)*^Fho9A5p@OY#S`uqx*M2&h(AcQpN%Wgb*;!;FfOq&a?O*`X%+5Dfu5?S2eUlmEvw`lNZ6`b1&d#%pD3BXj z+_vX%t_HN{$^RM8+Eiyr>MY zZ8mB*I;DOs4JdBca8p-=K|*ahWJc=jz}a`Dg05sc)!+!7ZdKAQhwj%hJ;cw|OtZFv zYlm!~*9z;!<=yqHf*YEdhQVaXm?NpPNt(%rWO8WPagbd0%vSt)2)iz_W!LA+R;~4m zV%m6L^CF|4W!L50tHnio0iosM62PS&BCZ=|K9<`Cf@HVdkj~jO$&uLD;j@w9jF~V) zfFaT=AmYeL!-UYFU>Q4@v4-U(heqd2QlZ5tblENCo~#N=bmq%0OK1Z^#t>={Wj^(ECdV2-vK z1-OW}jT2rP1hmxr0;dbuuf-4)qPIoUn+0Aa^vhf$^VUv7GC%B~k=E+~iD^+jBd>)& z3rFV|4{d5Sh8R|3<19ThQfCVrhw2sjU6;05U9W#MklQWLPrklR7kBJS3b+;jXG}RL zC#)XP1Gf}RP!xJt7b0dC@951s-H9`!eBR0{IRO^k)yg>aWh==vy~KFd%efFomkApd zL*=?U${Yb_KP#L|v&rNgsi_z#lX2m(wop?f<(M4e6B3z42hJQJXy?_AlwTyzUSj8l z6ZOh~+m9_rtuHb*D%Q$KwF*u6jja81WbHUY+hjlPRa^_LpTz1Vjv^1bfY|{uGG@_Z zrIhQRg^mp=JAwu#M?5)3%~V6V7(1Z}PtkrsLj^NqaTI1nZelVof$Hi~kJ#+d zjYh(vK@%i^t*D48Z@JUJO(ca-c`8FOhNP%m_%>-f}|s@JI^<%JK6Jj)l?gU!KeWb!ODx*-KDc}}4VjUU2n zxtSRj@f4HPU2B9P*RS9bp>mO*wVz)XJhyUr zGLsw#Gc~x72(7_JQ)R8ySW;L3)kE z3Uo67S|%g(4bOyI8jxhy)&wRmzRkS6DNaYqNNZq5#;+w6eAcxF2CC*}o)RC75Ha=b zDl-`8qEaBsG6ExLv1oZvm@HWc8hP-pd>)uJEzqnbziJ|BQjLlVq98qD&fG$DB(nl@ z9WnmKz%))>OS&n5=WjON*=f8_ zJ9|A^5Yv_;bem{~pWbL=!yEBu3*4qf*lhtV>4LtCcB4~#Mwmq?ce~&e`q6rZuJMHDFF(N9 zKi5W{i%%IqOrf7Nc^^^0J^S5m4MPvc%(Z^Fp2k4q!CDHQ?5G)x3{sAO^Xfc+nsN$5 z;!uFkUM+0hlR3a=7_Vv~d#=fm!;>-O$XVJ!bRf^}%MnBD2v$=+QB7{u5MzhW9_Y}) zvhifMp^nTwaO!xny72be5?hx{`|zOC$f0RdX*IQ5qOUlpUwN}S zes_HeNPDn0`Br1hXj)5F}kR_0u7`P_c-?9X>6pAKeGt^C_z7hj7X z9}NHTNgLGshX<`651Rn<@9wUDduQ#pZ?1lKyZ+71)-SK|^S$QB!=`jEeB;=56XKpp7_SZ4uFfWeAG$q(XKdR5(Z(g|von9ShDegBW$s>f`Z;U;y zkK`65{C>Cb#{K#!oS%t5*w2jjvKKaS8p%xV=FW7o7wgNHzP($+l<5zL>;L$uwO36~ zj*O-!UIRdtCr_=6pJJPtd@VcqH|5FK)03~3CSJ>3Ih!68goJiFh?bXyDSm;0#cArF zPF?w1$Qy`E$ZPzy?9`FW*aXjLsy)=;Q8|?(hDIY(Z!ArmK5Q=hulF~8d~56LyBj~= z@Bh#D)-iWoyfm^rdKNR=!o=&DE3Z|iUZrcH?8~RB6R%~jAQk>wXRVcqvkZo&a#PZ5 zi@A-TFHfAVUHMza;2>0kx$>HlxqkpxnUp8S<51UeYbd9?!1^@ih<~0TQk#^eVzbAf zXmp~*8Kg41s&G6xDvY~}#LT`M`XUoUU?Ifga5!p^I<)Vtc^8m;5_#jsC;B~ZvT^xb z%$B{HAhV}rU!IS*r@7*+WDJ%KM8_<;F!g#N&L``*7e`?dM-FMBNi0i9(Xee{wYG8M zjfV9V*NpF$qxx3DuCG`)(KBHgy?)sKRC#D83`~PbT(xkbGVvfa!gv75O!A&dmj4I& z(3jTh1ow*iFg&K+|BxIKQ{+_med*Mj3qLRS6i`J5H4W{@w<>8giYBp8+bNnh?4BgL!zG@&v^LpEile29XwmMqZ2HS@G=p zDOqq3xXpynf`lN%L6M_(2DJyn6`XtPk~)v!v%z41$@DAqOJSd+H0t=cihga~{gqqcw zF=x6H(B?#)C47wpTEP%ecQ4;*K!72=>FdoE&~7_-1=|x__Ju(KKNbQ$PWLd%&g$g_ zYm1_OJu|&iTcQP~&pOC}MUYu>2H9olVD)z~)-Z1kN*p`0HO06ajOg6NF3M+}OJXr2 z@pGqOQh80}V32N<7I>es*H}T^doU;T!f7Bw%4poN;b6$d4V zFh(6X*6l4(a3+xr|jmqN+5ll8X z3~+8mPR@dy#-H6-L*!YzrcXu`-OUH)91g+F61rS|Pu;o&ueIS-=C|DK^s%ENV@n=ht zA0N3lA5myd@kAqWGD8egXmjm!`Cj19am{ebOENKk7EBHd*_g0-VlYDE&o*WU&PN#8 z*m6Xn{S>FoFWpihQCp&$w8t5=`hGOzM%>8 zwGg1NA92H=%_OwXfgm&W6?~7HtM~T9`1M<%vS(<*mhi#Q>Zh2Qr`# zE*_$;WZ2O!^cfh_^yK3~qze8e*^s2fhC-Xx_sE}_zUY+2zK36Xk5RqC?LKYt_rG^Bf7XLT$W`m?tR)*VbQ}S#wKtJZCHy1k$Qt+IK(2;k+ z))2Sk)>LD7*kVA#ly0C{mOL944K6k&-1_o1R;Yb!pMQ7Q`SyMX=M5qf{^qbp;qM;w zrG-9hk^lR9T~PD0-6rYdt6X1UZAqX__RJyYfvkXD0bra9IyS^DTyFwtw(w`gYP{Bl z2^(`3NCfeb9Qv^`LeS!((%F&(OQFHS!U};0CgrGhV><{tq(Vc54yA=vS*5rI=h7t ztMFE{^cGw2axe3wYaY?YqK#3@_F1}U4;?5jT2wWKAk4>@I^z;qr_feYuo^mTtWu`~ zpJQ+>$_?&DBh4VWNus4QCyl^tk7XqG2JG`$FugRIX9PI7H&_027ZAtllof zdt0@4%+lHFV2{i&vV3g0KUr06^_Mepl2M5%oEeqh)!d>KlKfWpyw@S`M4Cg?_fx!C zO8ixV-%bowWO$EPDpKJ4?Z@zFM?Xlhzl1iC$jOJl?LIHV&QTOXf!}WY!pn#>^Q95L zC*!T|8It$HeXFV2e+u46I(82584yhZGV__$r+`;BgDTg>urvB+nNE}E%CaR-JBre% ztzJLz`rzT(%D$OzB&jmAS=f11=FjfPkv!^vnmQCx%@3(sMS%q&x}at#w4+_bR_$j1PlqPO2GzSN203 zjgonBc;zSc)cegm@4i16C@=(%6QAu>pI)CWrA=FwX`*IPWhK6k#gNL;^> z<{YsIM_LQ#yGxgL3e)_2nBRJTwUz(*PX4{C>0jT>|N3V2>+9%D)_FYpVz-VA!z2?5 z5B-bX20u&uVrTvHofg0N`?QO!BKrkKeEs4V2o>~|q44>j_|-=F7kYSBNECG4Z#JjV zct2=N?l&gUKR;Z*40UH0&kcET;5t$#79mH+K+yNsMjx$>>dT#b**tN_Nt@Uy$hm1~)`Lh=$w*eKBq1<=Fxi6y2Bo>bIC&03H z!vNyGe1ylKdVG3v@Z?X$G?;B#1+k~QVMYmt37 zM!Wx?_;Z2@$Fn_`M6D$^-*~f4;6DXN z1AL+B6?Cm!i7~RwC|pGxfmztH$&A?=f)<^2KrM<}o<-VH~Wh?Y~a{% z3$JN3w;h@N-ZqZv*g4|QSUnSh5bO+jL;u`ex!M=!+!a}pt85RxSE?^ z7jvG#e?xHtasNPoU7Uw8O12H^tjuc6B?Qk4@&-YnZG(iL6GBnu!})o(=$Qqd<)_hnVRaJL~r?-74i zg=M$bi1@1Mc*(n|2;>#KF_@j_Y(Ji>k4G&&rX;<&u2u$Sa#(Rd8Vcxa)QkvGBP^u z19EFr1}p<(ox}oTVY3ElozPY&=M)k(vFU)2OAHKo?&ZO`2g51`Ae*&RqqHo-jLGvV zs^&~*HQgnVF`tdFJ>t&^&*vlfj9$7_=&fZ?K6gu*)>^KnyE=OZ0k#4NYDgGs>~D)R zyV_a9Ga+<>JV(lBhtH5_OPZig->kX$v!BI$rF^zEVN$nywOeh3+~sz4X}HF#0bgxC z_$!B<+|#~XUX2oiog=~=Bi{%<@{ADL%{QRaPM)PPHrX@e*<$=j#;m3`^59~Uc8NAPkiywT&VG~%X6ay- z#aK^!7(w%n22j&@@S2v7^q?RY4(K;qi>&9QI`C(nX}{WC6QD*Z5sRN0o7lMRI)w&V zljw`-GYlo;&nRz^VM9%6p9*NOQ5s7l&HBXpXQlv%20l|F3l3SGMDQ7ODgKO^Fq#(Q z&roIfCxc7R#O;MC&Z8 z^AhHqEDucBAh4KoNSd!{uzdjJS&C3UnekJSB`@Yf9qV0JjS{L^vw9Pu3UK}-z^;); zuQo*QqhOA#Fv=nzvws0pxWEV|n{S4TpW)1=VRqo0tRQ=5KV%wdFf|EqeY{+x+7rN8 zE*u@1bqGo$FI-=KtC>cAj1ZciD)W8c_0N&)*&-6^?E~fp&UQDZ;!fW4D_gB zOZg13EV&?7gi|KQ(U0O)!IF=eQ)tsq)ZAkgG$l?!p;BNLfzSw_7Vxb0S-8`MFk>Wp zR#3uZqMCzQhrnzd7gKI?6l8|+vUPS!r`q*pk3qB*3Sn6_L(no$t|5lxkhN+3n(YRL z8=qd2KQrZ?Y+==%+A(VppD(*)jN3;B*ESfTFe}tc2S(-BLUWgg25$tcYYCX;o#KLL z0cY$i5EZ*38U$_XU%)KowBTxaUqIh_7x)`Qqf+Dg={+(?$QzAog7!v(%On}FsXztO z#O}~kYa~!OSCxObTgCAhEjMeT6!AUrZGpiJ`ENhJzK(mdX|okZ5Tr&S8RfZ3-8q(J1d|e z{23Dx!`cofxiLiJjX8@DNN|_GH(6JyhBPT(LqrB`~)RY523jIQ` zN-TorVjNowV!M=B3x=r;uChy^)f78bzp%uu&ZoOwb^(%ABUR;!g(|KCKcw>unAS;R<;yM7%`C zGBHmkLj^HvvpNSa^LNH?ezqL4RW+0yms5d}_-MIg+*gd58Iia{*!4myHwSzBtHmk& z5!34%OZ<7)TSdv9?N2>K+Cl-w99UG@UOVd72Q(YsSGpT%AJ9#*du&aA8(AMdv$%P5 zO9-KnLqF@`ORO!8&?YO)t;?AC`{Vs;O|a=eHLbXf6<#!uc$+|Fb`fK96bbab+8jD( z$H-7+*E6$AI+m|3?OO_3Xs;7af$n;8x*PJb^4Y@?nul{Bz+}ucBUJWXZ4qW$$U^T< zeIdP$ZK9ngJ35YFa;%iLI#Nn|IcVDbp9QzgfZ8*FZto@Z^{B3A0KEanP^Gm(h6g{E z8q^GYM*qxjsdzrYc#Y=)?do#m6}6B!$W28_=1upL`s}^N;{C?r!`AX)WBzXS%6=UN zJ9D>wxwU+*xiGT6aIv|3skJoHp1;^xxYSv^*h*c(?zoj2Re4I8sAPGJ428|5(Z)7>B6>h$wV^W*1n0s$Js!{N;2Q8h!7S0+xcU>I`wRQbv)G)N{t73rMiN^J^f z3ZdfSuG43#Q>TnSTffFR%?8A{x{Wpo{gQbHfL=mAd5C^b>{1dHI!ZlWKXAh18KGT2 z@kRa|_bwD{0QuMeXeT*8{E{Wh zlMTK!9~yk=(f^>(PYe}8JIV6+YDQD=%I^Q{TPl=iM@lmnj?(l@& zF+(V>@GQ2^AVe&YO>At~c2T5Py6AbSUd3$Z4LQoSql3Y6cIj#>eb`?XN^Q-87H^=W z?WAtUmc=kY;Zr;xA{{R*ZUv?a5e0i5^vlA|fW83^y@i9V0(7*MPc_S!Y+PX^!-|}! ziGe7oc6I@ihhF(IBPYBdcv*zmN6z4t(JWLUw*+|}R_2CP7-?EbRvS`2L#jhf1ig0p z!mylX#fBj0(qgli#bx3U)GQN>**l$S42oqI0XW6U8UJVF&nR*|wxIZPWK$dop24J! zosYq10IxYbgN~uQk}gA-O%@JD_5_y4g2SM(@nG<3~%@xiD;{89+}h-Wny3u@iu>f}JIm?z-&Ol(RBGmFFJ;OgVH z(ay~XJ{M$cLXbyAd(6*mmKSM9AsV^yT3AWjiZzWwyMWo?v&eItoIf9j&oU~p^1z>? zlBim@KqN#tR}6A6^YzjUI$MA+H#~x8_%n$WU@=K}aX5T-Xbd0~D~@@xV`p|Tjv()l z*}1fDDM=Pm%}H{A&p28*d_Qh=dDCgobts$WnCK952LaNAy@!V*Z zQ|)>dqYQ)3*=pU= z6DV^~PjB*0VVI}TU#4K6!dEan%7D5qGj>MJs8c zh%G4PGkLe~aLGEWjci?wQG&Dp5pnaf4g#K4*Z#~buL{#wsnjg zIdaIC12Gc(If0;8fX|4Oeu_Uk!G<|wzTqsItrCXPe9gCn@QESueN$i72rp>B+08K^ zz#O6w!t8MX`EjmGquG`721mE5Y&`*8g#qy$B?KW~UHb-~&7J~cpcE5kn50A62;mxk zCLhSH*st+tFM%^VeD*DT28?VZ8DaC0N3k=~uyrnKTvre^rnQ379MWK=LonrRu)uk&He&iJ#t!ZLVTbHz10 zoP-!SmP2c)Juw|>GCQWmGLn3&{{MDWIvppOb+MjZI6 z0bzE{NTPc2XA&h=PF`wW%A+Bf>4)V_;)^i|mLOMKtQ8=U%B(Hz<1gU@fINGm1=6#v zCR4_XgE3S8QPYIVk|N_c5#e7~HAi}8$)tlgnT#+a($*w@roz*1+0ijp(wuHcSqf)& zhejg%q`Tx6A9hsjywxr~X-J$*0@70MJsQN005ydiVrtx+GXK%b4!<#YhoU5+oLMgx|6tT1*4`_?Ez*Dbbp2u0Cc8gNpIzx|s7Y|Lz7Q0?ypz+};dB zFxiMSkeLiqpoG)8v88IZQ@DG%$w_odq5?=(e~?YXY=4J^!Tm21D;7Ys!*II|qL&L? zAcm(?{1qYFz6*@Smi2m0;5V|}@Lgxll=J6>tqq&;=&qn;TBFU7{BGnB6~v8goD5Zo zPzC*(^Jh1dR@cO#;DfLy6*Rjf=g)KvaMmrMyC}=MiKlHh;wT}lKUiD5kI%;1A{Nlc z+%_P(l;F-GE%fq1oqU?))d0eQJcFspW94zLyda^n3#yG31AAQ#ZN3}|G8mE$RhJGb zi$cwC?{XAvkP;`)WYl1J0TU0IHb+L#5m?Tv7HfZoWk>5EP&@xI77bA~W0Sqwy4 zlh=ngOUpIcjIjH7ooEqxRL}|`(JOzlE4K}3Gle`xl6b&SNndoAXFuc(=%S&}IOOpA zDSs+p7ySbXp#3(fmwwnNEKi?BUA%(d#rSK% z7aEob(Jfzky)?b_zur0Ze||pRUb#4Zek3z7nwmUS$^sb_%rYgI=VW8;lSyN z#LRCn9_VHHGFAhxr65aw=Tu!i>cBnw*61Y-m`WTSZQD>yb%R@DX ze%dwpx0f5I6$f^P9PwwX6Ha_F<2cb7Zve}*&zfj^lYu$Y zK6%b%W!NT855U<}G52E^J(PQcVb?R>W-|ZMUS4|EOKZNgkkgapFKz8ap`ViE z&*W?K=WBBpstY5e%KQcL+MPXLnz~e)JA(@cZ*63lGje9>B68^0;m>m67(2_yf3q~B z;A`!)G_>tJz82^bZ#1*8MC8Ps(kP}DVAugJ7Jy~ZX6LtyMCF6}N;52z3d^uHUu9~- zdxdt(bHkGCqk)i{we62Zg@Nmt(=U5VQcYNpO7% zpy_VjxHRfq_t`KNH;&d+fHRXcuhIfjK-SCY%y&@E>{bES)Aej>r;>RzSh&|)xYwP3 zvo(WvF&-u`X9;(k0NZI9ZWw%a{_Nss*XX+W2JAE@sLH^2Uq~2|nBX~HAHjK3L>o+2 zaKPKHg64E5&$w;KB12XZM?Bdy)zqYfax!dLX8gTE%b!VKeJIGpJzqEf*B71urawpjY(Tf}`u{D_nx>ElpGGx`kqV z=>YXIw_jUAXk^bU9X=kso?y{P9P;%H3*`)7H9b(H*>|8J4@-)nhde#xA1?oD+*%%N zX0e;@)KUj{ZVdAe1|rW?&=OhfKWH;76zWR`*ei9eLFNcMn;WxpW=aBoPBLfDbI1X; zViX$C2DgG|@lwXo!r8K6=YX1pXH6|EpJZpzk^H!ag$0Hic?qG1RqQERm8I5d2E&bE z1G|hBa4`T`_8R8A0d01{Gw``r&$D&@3~Fvy($1gVb|c!FDMzoGhi0#pm$8oqKHuJy z)Aij=QD~9pjS@*}=j|H&nSllV9N;tjnUQ;9rj%37X5{4A{h!MY*kSCl=D@`o_}t0u zHB-CIwCr^H*&AKcsCRRZx+@lQF#S<`>4WwXSP}^A95{ez?Fs@52$P&hJCx=SNZG~D zAZ6IH@G>nxkL@hy&!A2N&Uq@+f>#4Rd&YZ2L@hzJxlfxNhiX1+#v$`MIYmDd$Cl4+ zj8d&x4LBmJ0979Oz|LRpmH2TVF!?KaFINmWuS+&;@%#9#9Ap?QOrlU08OERSHwF{~ zhe;>+vkRMfhD5h1^txGrwaS8HqofRk(Dc$&peA{6G%Z7wi4sU6`XNuPWO(KjJTy#A zFXZik7GF3?nj_~8=&=c&*}|V)`D{keWi0Y2fu+Nr1(xB@gRC^zJQ&l3g;4bE5r4*c zqqjn0(Kv*`JGX}pI>hN<*wvcKb_^HNL=vC$$0PQ?$75K9ZpW)2b3mH#Z zD1*{j0ilzpO1!NC&t)0vhUE~9Vwdx+8gI|Eu-;UuOAxW)}n+#stc=wv>5O! zSy5|=7b1Zune?A_L5CpBlxPl0_gX>n#`SaWBDMfS{=LX4dq zGW)2!4q(&JCF4{z$E0!IJWB;jb3(^LqoTN;XP3$*c-Bw9;Tt|qwyI!4X#FhRLho5k zfp-I&0?}kR#8!uFI;PZ>1lr>Z$836EqOg%fJ{juvZQn#>pKxJL+W1fGLR!rAhYL zv4vIobQlsTngVtKrh^p^1icQmupD}4D{uT+1B+7?+g{gCGD2Fj#x)p5JGN6_`cO{G=^|XeY+xb*_0nt1>9kq7527Hl8^s zVBg`0(tSD9iz};RPw6NOqQxR~l+D&=B+Cm|2){Nd7VBW`b8+Pp{NS00i6`IDUv ziIqXvj79d_gmQ=%kc?hc@M^%!khxc>0D`6tjTjuRL=-yyF$H(8K0ZKT(>a5qN$gsi zPjTK`YQ9Dy!I`Ln|+$+X#AFSuCb>5;oj_lDgq_NpR!cc5|l$JX#Qn3sgf zhJW^y|MqDG!$%qT8&F1LiWD+(9sm_b8omg4872)+kJ3|3XD_#3k;a^iUIfx zf|d$;ptz;bW}2d={uFH1eE<%<8HV0H3Ax+vQ}~b5C9G{-fV!7^*i0dT20=e+tiYB5 z%TA%?%YnUyrNEz|&~b_Qb4Z-EUs(hcvvmp$l#Wrefba?aOihrlPAM;lLR$zzv1`*j zL!K$u)~b24^d%K^taDB(oP*Sv9s`%wkP?#VBic+0){AfNSAoyWI*q!UJY1R>g?jg` z=Y-OydlmktBO3-mJ5rY5S#DYdh$}dnLUtvPjs@z9W7q}r@;I&7g-~BTBq$+!P&gHy zt7YQBKNM`oc*@%FXJ)y~@i0sx;>njg>oU7jkQ9IXUga!3lMnQi&eN=ZZAXSDTmR)? zUk@tpwRw;hJ^tm@HNG0ymxVeZEdb^i5`MUmB{I&JJn;8ORciY03iT8{K%P*Mz@ ze{Nky1r3FUJU^^YA2zNWv?fqNV@`5^{SxV|wXuF`sRJ2T*~=?fPS8++8V0G~aR1*!H=hqO`MFE*=Mn^R3d0TDGtLyQ z{0+g>&}Q$Xe^$P75ruPQ=4T*E0ngF1D5d2DG7XV_EjNC;HuuI};kBKG^ZBWBOPA%> z0q#a1ZS5TSZ!iqeV<@-9TYQoAd5J^908uHF==3sD;Yf#k1fO3pT#=YClkxNt z3yxU-{F+w|=l<9EbF|w3|MTY)%j>(*75~pz_lxHydGi0;{E60*V@MwI@+5*@UARD6 zTe?W9FI=oIj(DofT`Vu02Snq=QJL2-0+ueEMgpB85TWciPT{hSGY{a71kVI!-fY#b zH!@&DuruOks9nE01&_sj!uhkDG>|<5dkNA9e-@z?k=D_e?hXnm=&q}vp}`$~R3f^S zy5Cy9*~KJz8LEkT_I^7H@rHYw&N(m9Z!3#hRXl1?#ChNzVb^-K{bByz2JE^hlY~KL zzgs`-m$p}DF?m4z3}N1c4_8rdE_6!sI62GlLptr*o}{+3(r+Vy7NhpUc?Qf-rS8@t zMB2-a%}wK-W>Oo~)J8coEUjoprCC5UZX2A=A+UU}I#f5a% z)ktt%f<+3X%X35b%B4SbgJ zISw5NhLzlRBQmK7{FzM5X#um+LVF$fvz-!!9Ry;NuC)q~^CtG`)s=od*ItJ$r+ceX zFAF~7o?*bbUCT$nIVR76KXW4P97<;U%$5`V^!{q9QCVq~Gcf0aZG+?hXKXi2j${sxY-2eXByy+ZrT!dXEOV6S-1@ ze80L{gZ+v;lk|YC=V~5+-FXAz>ex2$XC%sWL>)bB4}i>R60ln9W^o(QIh)j3z?l+V zGDS1z+kw6ske3SwkImSRpkd~jnV%B^fdS4alO>9lX*059GCbb16d%iWW0?}17WA0C zm4Z1lD!4Ql_KWQXr|XLVk?D-v^94b}#$MZk?lEz#`L+TSsu3g4);?Wm7tS1~Bc5z1 zSmiNfb`TwHt-j}JApxHQg^n{=SV)y^6j$KapfQE+BLPR{`;Mk;$+4<$sqBSX2TMWH z%&a}BWo$+eSs6xV%PCY=NAX!?m`l`k%%4?1ahBI->lyFJceV8?0MN`&0}3q{XfSe| zBy~2(e2hO6i?9{5WhczZt;wW;)#BBZ1D`Fu)69~2+Q^c~M?z?0(R9JLHokcB)skR* zP-SiglCx#OXRtGt%aoV|TD#QYr}~7gG+isOj^uf^FiFS71`6`;3|B;$je$_kFUlP( zM0I3s>cBZKE11FOm&AWOi68_$-C3B*eyJMG+03Mx53v3qjk7 zLe|Rf$PXDb>U5MYj*|V@oL!{ROzK036Z8XxEnmRRZh}0c6~c{N8pM8&PIpTRTM(AT z`LjXVAe)4=D6jT6^FC~;juT+n3z?23X>Kiv4>KL5mXwxfdcXP8(# zq}aEan`GnvVeL(uBe~8jO_iA3b5E?9iG2wK5ZDoch(K&u63B(Q0EtW{$y~Va5=*LS zi6X_SR!b_0TB=p5t}ZLHvFRDJwz2s>e{i1j9`}n#kYZJLkJ&Z1>({T}Ej$8_$B&;^ zMghT)g`xYHq zaeRCoVjR1YD3|~G);j!|@KQ2@ezo@VyO=^Z|Mp%RIrPsC8vonv+E4b^zu4dSkM}yC zy&@w55cGSy>lktT;Cci94byDFWI1Lif*asY2pSY`1!Ssl?1zGL}xWZ*8x&6$%&wBizG@Ht`>k~f~EO)~L8mmsBrrE>hxiJ)nvI_}dmXs{8= z+6hDgV_g`Txd*4aCYKW{tXbq{+Q%|lWTjQsmf5AmG_`a=m{B-`;#o#X#93{o9~7EX zSmf6mbN4C*;4>cqed!8pzRu*=N<`{H&=VcVB-xG>MP{} zW^0Ur>d_QX7yZ1zFNu-UDHi}A98+M|INFm^FY(AJg0V_$tRHjPTx6(Ozw?a+C-Sk> z915{?Jh;)M;<}}MCwj?owEN`?z6^r43R=v(fyg=2IlFx^XKqWRLYLu*-r$HgAUJCN zY=Z6H!;D()&^&I~$Lbke9Pn9y*RIa++feGF(It_m4k_(sM{_JJ7Ttx5q0rVv<0Bmw z9GUW2s5$h^3Vpad0sDnQXEo_A7e51s-I|oifwiT7c1%M$iZ<;jZEZ7Kgw2ve=Z4ZI z)$C^a=UnPc7qn^mo#!WlLaU?uOOuQcSp7P;1oi3nIxC;-mHBfIWEN+JITJpZOiNrE zn=FNOAZj6R*x|>;qYA>2aKpgUb1pF63y8?q{@($A8&yWncXtljCVIyxb6Qz zhqp5I-->V7B?76fX}DH>zieQHb$12%2z&?diVujI2oJhcAEi%F4gK zG4=N1=}UbVCeOZH=skhLdA{ewME~~+gWn%J`^;=l-{-sM?=JL=oj=QK`#@;}WPxY^ zHFg|5&+d+2Tpc-8o}2rp*S7zU&sP5UWNQB6`HLq{DG;IRt6E9|ytb$4eGdLitV0kq zB{VocboLi_xBm3#+HW3p2toMk*Eav|!Pc)|+xq#v^4e7I=vjqFBZ^wc!h`xxUK8>4~$aY{5|we|}-K=k&F; z5iAIZ^e6H2#^SY&DG(z52_QT8GZb1{R_U1`%tFn!dbZQW#scLE=ZCuj3CwGObZc%> zmeKP=>oX(eLhoj25-57RF-D*|EEhnguqNOkvS)RQ1Xn6tXtNZy2(Sg5VS@-z6^v{# zyl{(mS_Sy?L3Me*J#%Aia%E0@yMn`TX=1B1wy``~!{wt0bCz`mY`Hc!2y+IFqQ4ak zHy(F}z=)WKL{LQ&W==stEf5_zy)`!tGS!sjA`;He3&U7&&{}(OWO-_&!8<|CF)-}4 z8kWvXD(sOPW3W(MpbsijV$OtF3_)*DRw3vk{WGS-@XruG1K&WVqPzA|4wGl$Vx-6+ zho&49jK_soF?k{zhWCYuv1qd$OY)F{EE+Tw{WBz)nw%nTpC``hPFY70ln_{*c(oe0 zvRa1Eg3?%^2=D^K*QbcCNT<7HFg}DIye#V#7M!J)?K2-uaaf7fCe4hl&kUd*M^ulN z`<2QNcv&mP`cxEf5ZN;;!=mk%Cqp-mnMQaxm!*8R3Yx2>JK@)nG3toe=*85^NRQ2E z1=X1~YUjh|L~D6sZ=-mxjbV5J?{O6MTz*_sBs9<0*NJYa{3{zwc`o7Qgqjmf{?j>H3+KALi_^N$&dK7>$e!)LaoAeH7rW-yR0z-qvC#{0++Hy}7Dd2NeVrH>oV_}#ulh`9 z$48+tHH9cKkOaR~)~qQMcNKr8mlZWdv(Vg_=g8z#nnNCx|hf;U(DM%1bHJTOthvj0$%p0$S8q9n)KX*=3HdYNQNF0o+ zMp$bw8!BQ=&4n(Hn$!n?NY~9-v<&cJveXa${1k;YkT;ZOM$vNO&%&nxU|FkTx6&Bc zYdp?YI$NwBq>GmAL-!#f)+vP!Jmb$WVFK!bb~~Ud8Bi!S1#I8mF2RJMSfa1NZ=p$K z%#f)px)?%VwxA)=)KIo};rc8294ZIPrsP)t~Hd$b#c;8Pp7L#*_o{j3WAryUj1}c7Ar)`q_T#^V^jl z--b4qaqV~;K(~t=8XPSxalk-{z@ry2Y88qe#?wdIGvv({hs&>!cQ(gyjQ7ZrMLXG|rbx7oqul7r^)B!Imq8t-hF?9$IT!11y_72U5;(H?2YMad&}2 zQ`5X!)yRh!8$GtKA_5dD)o1Umq5hRA1Rxr;n-SyX2{UIOf;`_|7$%uNn@DG8J&mBD z$|O-`NH4?~bLo|%$b*tG2YHsI#>x~)csU$AIHXf@*)wPwEWE!USuzR!OidDPs*%t( zTlt*y&+unq>S)B|`RI^Xclc}sBqyJ>mU~UB*~KvpiOl>6Mi~#vV_@WuuB>9K

dzdh|#EG4R8O2cBEYZj5$A<0U-q(MJ%>C6LVFi3*hFP8~?XBn74ElPH;~ zaX74jFz4P5&H(Iw{$=@6Yd0BdSWD6u4k5-p1=TN$;dP%s^wW?O6E)$lr3M~lwo z&JRnv&J8gEpou=GONb*+OLpV$Z0@AVA9c%Bw8~pS_ z0ms@$50CKq=J^u~PplR0E>w;;?e00Sr%+aAGS}Ps4%~uga{r-S`b^`VCuS8+oVmf!fv>YG1Zd-LZi zy!FA_+do@=>*q^v{%qyVpRK<2^YwRrNttddZ~bKD%^zF(+2Wslu<$28B^`d_Uyr=| ztEIpBx3RxFH}t*#x%lOOSUvvWV$)dpNzCM%yNUWY z)y>DU>~y!@Nqz>Q%~)Yr>gEpzW_r4(yE~`4I-tiRjTu00SJfc`q4KZNQ%43LoGCm! zr|(~nE%F6$`st0?)9W)Y9$z4A!Dyzwr?zDzBfp?Q_;YjJKx0F(sZpZnrbcwpR2J)N z$J$zFvpo~-o#SmCm{b!$R-PNI1$=I9CgHz9X9Y17zLrO{oSy;C{7r#rwzbu+ux-1A zE^6S+Gu>GdJ)!8bo6cl3TMJ*5^v4K1rq#jz&i%XhTz>g&S6>1a-gWim`>(ou-!&iI zcfCwD_I&aqh1Qniqw_}xa@99|5{RfncqaCK?uSP0iSZOmQIY?oS5;8c#&l;uqgRZcNy=GW?5llSpTca}(VY0BmFH-8Bc z-GsF|aTRF2{?bYl{eoM)L*TJDUQ8c4xc!B5U0*BYwr9;?ei}ZZFAb_?T2iQV$edCU zhnekWjbNLBhCuPf8fzF?)8hOrp#5=?XE(u4Ceg+WS<{-Vg6uiWBM%mgL2kTkKds1{ zrIfy0>h2ppiuBrb)Qs|J$ytTv4t?fgt*F)Qu5D(@NVQ8FFgTxW+($zB><+i+JfU!= zZHCdMbidGAll5Y`j1W}p7q)ER+SJYmxb)b9y|_s?SCR+k=hi9^v0QmA!SO)NT#9)b zf2Jl>3MNbK40)zckq~(84Y}rOWQ@hC7`x~{^5k&-zGl`o{h=SHxz zCrPin>ZWt@d9;NubnHGPSc`(xEqlJG2Rv0kELvHh0W$8E}Zw2zgE` zndyeSIp19`#d3Em`Ct#K<|f3?*j6Y6p=`7pWcb|G=u8_rJ>1hK!{}*+hIVQ)^T$)oyVAQU29)&;mVB%r==iW9p!&}jV0=!$~Ir3+)`F09z9A2LrNbX_{ zS9ebmJ2Y=n4L8-^*opGFt!}Eb4){EVQ;NPa5NgmrG=w}pI6XwOmqGaqc6R3t1`f6A zRWG*fA8k7@*hXy4nvuE^e+B?5)L?a)G|yGRb|X?~N6PT$k`Z)*paq{3;JmYthR?J* ze1;o)&)D#0@1@o^Lx*=#(znbj!-E zr&zRUp{a@D=cs=Uz&Vjadp*!N@Mk2`C}RtqFpyJ&EzfV{;LrSx_Djc$FCQB`LlCQ_ zEWroi&!>+RZ!dO8lPu|S!k--@Q{#o-Id?*J-cb<}3SqIF@lrTddI7Z?RzUN-1?eY_9B!sj8fzd9V5J(vwkn@*!Z>6bhV{!Zgn_<| z9R!$eJ7c>ezR7L<)frxAtNR0De&2(}`gz)sIueIJLs_&=jG4L=1TqQ1!|2?{ZVpEcvpJTekb(*Z0)T=c6) z26+Z4yWeuIjc)VgcU7Y*|m%-VM!ZGY4dCGjD^> z0XUzJKZCEChr4k8tb)m#^)e&Nx5Uz1x}Mp~YAx^s*zNUBo5h)JlN^G!nk27u{w%`G zHoC=}x9Oi%pW@F>o;`OK4eKT`8$TdR`F05EBMU>%Zh}>dz-RoQG2eK86~H+1)W+c1 z&BCb>fvou+%tl(_&mL_M+${tRek( z&Yw>X=fKe*Xe7}0O^x8ff%68Q8-yK{BeX>%qrAAIE@II~dG+=wEPQd>03Kq&fgQ9b=g)4+A?~_Xcxt78uCH^pvwfvU92M1{bLJ?44yf5x z%@%*qYj*NyPJ<@3n$Lzo$PVdm!Nn+qah4`}psSQq))_QuQCI3F0~z8t+J`%HrjkpN zgIsbZq*BSE_=&z6fHm`2uu0oocPspdznvd%uHnnwGmCv+oEyZ86=nEy8&gkiOd@iA zdVTWQqchKJP9ui~L7zE3j~xg6`MIMrXE$e`+L%6jeD1N8@nfR}B)d>b^v~*bJnUvSDGBft=KP4VS4TeCD+O;)d|fJG#bEM=#@zML*C#j|3FH&LU>Jp>yDw(VVDwEHKrh`A;-6BD9lM5U40d<;as`fy(ppXCvMvN9bg42}MsKXotyB z{0x6Cl@**(#{z$L3l7g!3HPqrJ5*7gtvb+lVE1Tk#d@I^hmDnBt)&&;*(`1pQOWD{uUK>5ZQ+zx&TiZ~tQH^`9Pn%<22L5eA;XjvYM^`-2iPdv%I@>qfnMFD5a%f@O zZhmCCfWshY`15ERKvNZO$}OW^}!Chr3K3l zj5w%)T1yVy+{_Ga{_Ol2w-Eo4bQLr|p%7*QKJxb+&YvOG#5%--nkb4$uhDfYZZBV^ zdb-e5=j$pPZ@Y2VRTuBR@?s>=Kt)h(+0`Gz4jNQG)7gLf*jU@H&mfb&^{R`-pRc#8f50Wyh|G=gV9rOY>y1QBH|ny7(8 zVk=Dz_R(O;gnWh=h3QK#!(f?>O*)!(a_f*b=4wiqvql+_W}x$Dz%m`uX&Zm`OP{&o zI?-vLIj+T6=g(oq1Pen}>7(ULFdT`oi-dhA8t9}q)rV1>fZw26lRjQU?o*Kqyr-9Q zQL(VLF<#9~!J`W5#+lZW_Lef};MjFLiDyXI5}mQIF3qp0;>_m4@$rhA5ecwWzSI@tbk>#(fX6)Fe6X0QaPcSnjfBrLxzjnPtRkxx zd=LcJ-Bh8}d@$Q|5XhXv-We0))(VHu++AI%HOaLBa@P0gaG57aW^G$1Y}OwnXjhgn2uEW@#tV z46zivqsIxnXkiEQT~5pE`@8G2iQBW^i1X*PbBNG1??XbN{RFs8p?kE@v|3qtTWwdS zVW_o!xc$IbSJ_lYC2x)t&fzPA;Ipyl@Oec#=j5FSQ*$XJaX!IxXcT7Ad|tunh3J+O zZ54QH1Y&Fv2F>t!H-tGzoz3~#5p)F0vFW^;=Pf+hl+r-OZIw=v1B;Hj=&j;sN5|gN z^1z>WBIwvB(q;-Gt7e@MD;+z#1qb>0z-&_a;RrgmCS*7Q>Ma=A#LsHlN`}+xIw;=O zA*tLIW=qu0fhu2^Kl{vS_)K}*`DCDoj2rq5%{xdiJRpDog>Vj5VTT?KZCW2KPWA|g&>p!8vZN`jswIx zJTXuWyS^PmX^SK%d2{0Y9Bb|z>;M$6gSZFe>P$V@SsN34_DeT^He8JUx!6G~6y1f~ zZtv{+XWyO>v_Wa|wcZA9)BCWBWXZ5=6IXK@;>@Oh7H2MW9xJvJF;DdaK04F7JMgbq7v!~l)>otHmzlAC>9 zCH|aR;=EhZu59U;J7bKO+eT?i2Clt>h+M*-L344G7c_ZMifitXGBf+P1Jx&{9O_x* zWF#nc)CNJ_2A>0kPLpRZn^T1Jz!ogecMi1VeGsUW=Ys+xE_BwzX7S%}N*vg)yKtoW zbJQm%{u==%Z)3=Yqf0QEONY-N%AW(cj!ZkzIZM6l{MmBI^F(6>xx~+j1vG2HpNH|Z zZ#jsQ0Ni!8w`Hxjl>|psx7tIKNw`Cfjzfk&3m}`5v+$;QI{=nB5DAYR^G5z`@YxwP z=O$TlP7s?JI7vU%oq717GXx#+tkYK>fmZL6$A!eqJxzK*eP~S;2~nIm%ARcxzM?7< zC{1|_e}?fUkJWF=UkQiX;dac9BO+)ipDo22FHk8{jue0PUn%;TN?zvhN*jOnH+p zEpz};ksrTswD`h$@yyx~fe7Kx&#jL>yFUKR#_-vrBM;2<$|?a{V2o;wKWk}o-dO0) z;Q350@@&}I`LkW}nE>OOwD>ucA+BIIShVwJ5cG+mUidSn!PMM4Ieh=@$i1^eN;AXv zObp#UH4Jt}|9s!v_}x>ZPp(gW^PZV++_QlB#;d2MU;X?X792l#fmrh}R{o;mf^yJug$a|Wz|eigahQ_I6d z+>`ahGUDgq1VqaS`mvQkwBq;9^-i{RKp1AlLc8!mb&Tu?TGC}>yqIsmgh{$gP_tjU z=LY>9O#_o7G4_IYgV~098_p#L3k-3Aw71feKGd^{mnqQXdk{!WOeA2ZY=b7XrYgah z=!7kJSv!1~%^+4Mh*+Vu`Tp@X?7_b@H^^z6IX;d45cvGq@&x=D`26(7_%oaGg2oXV z{!AdkrggQTxc&#sQ1ULD7r077Syb#OYc=zml!e}*fvA%%lRc`abxGtoC8Yc z$c@3#2AOH~1LUsJOFKYLLuQ6>sj+6YA&Gu~e^Q|N^m%U{z^U?Y0KinLiUHS5V zpZcp`PyFq17hd}N znW5IDy`P$>xoNSbX0p9ux;`_~!e7Vh6Ukg(cDl27vacUzyO8VW{Q)}zpSh`kpu5|U zK%-I~Y0YG-D~L|}{PKwZ@dbaD!Y?2G&O%?lR%f3$GKmEGD<{V%+Zx-dv2T;jsPD5ucyXD<)dGqxFl^iWgFSS#*8 z!sZx9^TMa)(EO2tRM0eKbH<;owX=P+xfUaiQ7lAc`oZsKA|CR`CIcs@Mzi~O-}328 z_FZ)e#2Ab$@$)qwJ9yKTa~(ay^_j!HeS8J3`Rp}Fn&qc)onj7xj!D30B+zA7Uo2OR zt1jO4sY?nCO>4b5!X56p@{{G)Tp>!Vo?GBEHK?YW_Iws5dGOlHkxw6jLSLu&hTv!b zxcdzI5;lWqbA+O?MvxgPZz5feJX!eH__H%oa40n-3W%A#l~L*bRK|H?!8xj5dS|QI zBA@n|WTfgzDF8-I3;?7;^GlQpf3pe24zdIshUxOV!ytI;hr$aPP_M6wblEZuB@On%6kN8<`&&HqIY7kBrG6(Pm z>F=l>@7h1xym$6sIUIPr`c|bR&Y%c$^{vjCX{8XGM4<^d7{d`JvS(`4^r4{!1BKqo znIk>^y$X>kZyg1rRtl~7d%!c5ZnGpPJzuvM5FIh>1q%@}e@NlO`SVs8bHu{iRt)t9 ztKEeocG!9;n~|N9?5v61;yker1+PrknE8hJZ@`}$%F#b#zA@8SuFg%;KX3Gclru7a zwlI8=KL^xoisHbZ3jzOP3XO)@mCvAExNbnu#-Aa^fatl#{fahd{2B2xX|hfh-}8-? zCkN_}_g5dy%G2Xyu_N;2NS+hC+=lrEvmrmGk0;7bs=4$X0*yVvsHt(nEToKKGR_+* zJkBPmC*NShIB!^)OJ~9`=aYk`bH>>qFTF9jk!QI&>k=c5qEZk%gG0?A!sX48KX1GA z`hbpYPSu#j0nq7=q0HH%dFRh~Zor(+t_?ykuz+^{47W`4XJ?z+u<-xlC3^2|GdTHi zzX;_?2h}IO)86Ml&f#EN`7<~OrX;+%4HqX6xWt*0<1HO{f}pnn)$?2$Nsf@#JH*R$ zK~1*w7Do$MZcJO_3~rmMw6s}XaBJt~&#K(YpU*qLZ!A5hfUtpLCyg|vH?MNsXTqOd zo*MbHF3lvtF`aNUVA=Sy#v16B=oCf0J(SJCF7M#{8PK;`l(PY+BxGl7*>fk%LGzrZ z&KEpr;MSs1cAX;ao2_9pz`@d{$^eX`Z7ghr4jlIm92# z^5F)ai9Ll9g%vctxz1yQBF}e>^vQq2`17gJ{GH>)`{ySxf);$99>S61uE`bt6hO^Pi&|Ko8#zgWF^=F;D+(=&Gdq7KcW({Hq@b#psBw_1 z)h)grH6&xRa%q^u2N-mT4~BVkAnoScM1O0`bbHyNy6 zboQ~?*1_7_TFT4%_siPX1+E0|%kJNWcMVSs{iKPXG2hll4JLTV{ToTj-H~{*s||B|rbf2U7J^V?^8+wv z&78{ts}J}0!JnyF8y*~OZRy$jS)4aeclVYdOE!>eF$Z1$T!PYuh=qU$IN+P=MQv_3f!($$530ITpfEnCw|S{bUmO?3Zc&Obv+|I*(Ky9IWC?@%}>f zo{^SHPJXi=N0e^;F3nagWiDN+x`^MUcf9;xC;r>Hp}#*j{TKf>`|dCB&{%)-Cvw$z z9iNR~7=M<|S$gKTezN>#i9dsvoiMu!+VfcHn3_r$HAw~?@BDb>t$)&`%sM_;d*{c; z-}}ktAOB+gtzS;P|F7f!?Ofk~{T@9O=&C=GukkdR&)hvxDapD4fX6Xl=2boZz6*0^HtmC{1z8*5ICj2G(~=DPDI$ESNM zcO!n@ef1@Kue}KPDVgha7;9WYXZW-GbsV_nlcSloBi+5znU+J>UyEc~b`95ECb{x8 z7X|S%7SPvSMsUM?)1mG|dsy_))z~J3pf8e{!?l-r+6JE?-jU5l{tOugV;;QT;ut0r zI;j+-b;wEX^q3|nH}zb4H=4Ng6l>xrk>ndLiha_fRGEl`w-uy(POL2`9JooiRq}5Q zF?F}Ft!a#n--^v59`&x|Ijfc}S^oKCJ^)wp;K414qPDVW0pfr6-JlTZJ91c8Ls2RaCt$by;>5_w= z5s}t}$fxn;a9*8~K;sMH@HzM%w^xp~R}*|tmkF1{7g`3pRP&0U$sDj3s;m^=!)mVr<3WIG8_&h7xpjmtXy%o4HQ%NX85G(Al z*oyMG0u%|smg?ACLD*_2Btq!K_(H)4U5A{~KbvB?M2{tQb?h8-P;*EwmfotDwv&-$ znm!yl!7hoGg@0klUCjocRlqila~8kts4*eD+F*&)87+wpI0-fwQZfq0NYv zq0OEgM8{lTB@(OZG=FCEir9!xI3_Kog66pR_5olYZmsNV-;WoHJ`kW=?yMN-(j)c< zN+Fhcj;geeFS6Z`7TOXlx&^;Lp{!Iztv-PM3`~ zmzZ;ng&<7GGeb&ETlurkmd=Hs6aE}R8TxEBw|PCdICe-E5|ZpZS$VoODM$VcaNf;Y z$tdyXz+)3pbi}h!y?R2UBLI~RV^Z8m`x}2UcBHvP_4Wy@YX3NVlzJSW6Q>lN% z-8%|Cx%W($(_?qmTaBAP2mZ`v()@X*arb<~E%+Os$TtFGQ4YKE*}1L*UaLV4t;mD1 zo=TZ-B(i4;p=|uwRnUl^xn=j?!0+1l^KRa{g{GPl12xBTHJd#dnR^&CX02`TnM+pD zRJmptb!ln%^I#{f)c9^Af0kC+B+c9l@OiVZ1^5hVR@vm)6iC#Nl|BdI@`d?Tpys#<-9sK#ljlstki-ONFbl^ZnQ<;rJWWup^huPMgBWG#xDln+tX0 zDQ~q?7V@>fuNQsYIxrC6!LIZSPHuHaQMt{N+Lnwzb0cAfgd5|zkxtH&p~qhEIm!K0 z!`Qebg$UGe->su#Fe8wS8K_h_#h*)H8U9?9*9T*{LHF7Xcj0t8q0r3f{8`=1dL<%g zu~Wy!&`KaSd}6lS4sC{5J6OR5`_;#fO!|pB)Hu$uat=QizY38p=^5%q1^? z6IUu3>zyT~4s!-ejX<^&Cu&-q)(Sp@oy~^A%VN>J&02jc>E)993OL>D!P9Kn%aK3t zY@&u%4+Y31oPd#MoI?`x5L-@*@;%PXH}IW+Ka+=@@LpM<#%&uDe>S^jzayQ7`ADnM zj-4BHD-7ez7LL&2^ZEGmP6X}zS;w2}C05i^OGPBm@aHodMT|I3uZ=*V&#sO=wLJR5 zX5aCl9{Ee)UC^EJXoIeQMilMLIpNPOkY`gww;s+aSRsDM0Pv+A{>hN$8BUAZQ%2Be zeS7(kmjycmpRwIIH8NoS8^z;;{rAj_Ch!>v^yuBwBj9L2G+f%#W%pZfA$%Wph!^1CnI_nlWCCJ^C|{?oJYXRI~^oL~JCv>8$KU;a^uO9+34 zNWXRF?(dlk$6GJlD?8}t?t1f?Qy}P8^~qaEJzrAsc*7=g>bAHLzl*%6UzyWnz)%jK%_*zrsvJm67!m**;Im12DT8g9)4*)Ih$S}2*(?-P zk2~8w(V59NH}En2>9s!oS$}M<_|(Sm%UC@hpNBSsoe@7HgeJkIN$8)?9GiWX$_=@2 zyl`~lrOlZ;CWkR7-W)&NhlmRRX9DTr-gV;UHcAz7L_W>0IdY? z>p!#)`{+3gW^qmL& zO(U%hbI2(vwYnh@SHfXfZqi_C*fI%ywJ!&P);3_&c|4yB)H4I!m`WQ!hCR@?J~A{~ zUy&`lMS|yj@L}0*h@&F*7A`iz>?&xZ$6)HfpRGy!S^dpb!_Y1r93}^(984+_y|G<7 znojfNNPSf(@n>P=*pvpv>GD7YB4;6Je?Z2c1+J}6$q_ov6Xz5{H}&#X#dX-K?%lP` z6}wCP*>H3eJX4@sI#E-s+LtdcAF4jsUwMF}&rJRK*<8;$zyJHLKVJ8-W6fpjkG!?? zSO2>H_vdE5^Q)P6KOlzSs(|y4=idG?Lgfv~mH#QSW#IEFa%e-)E_;qmkvv0{oi>w4 z{tU7vE&S<^m;dain{WS&N$~Mlc}EBuD2)*M@Y_FMdHbJ_z5T)T_kTI|59hkS^Z(2q zyYpz-CG&?a=f9LDTHB|x{CPzdMX_1s_rsqBZ%gJIoq*igY&Wja1#C1Ln)(~+2kPs- zIGsOzWRT#4kmpAZ4`M;juNV9`oI|zctrlSQ9B7V2@ zF@)VZc?LlPmWgSo+-8GL!t}Xdd1*O%W8}?9n$39w3N5kpwU;BbuG@8O+rG~oy7m(QXW%nrSQOeV zg_+qMHZGilVUq-Zj;REe!Nm?a$?56g4yCd-<#TM}(%G+f3v@TIYw>4LsxY$g;dHBG z;SwTtfPBLxSZxUK5{Qs>ld;+=SXclyh=F4PPD@$y8`Sk7@=Q+nvsx3{9N}K{jHByfnDDuQ)p@gsBL>biX6`D<{Q#HTLM0lFucVq0`g2;LJXqGVZx%p zE&B(W4?>{@qAl8>3zeNbNBuMK*~xRrji5%3D%^?%u?#e12Mt1$E>|k(DvvhE5-d$B zVDF5H2kTl~IS3^ESqtSbhR>rt;?JUp0*TT>M z4>vODV|7sQOb)6W+APBjr_hwgyPF+%dlU5lOvrPtk;sX1kPtHMYy_VQL2ng5JAd}v z5j6K3`LoHwCH!{yEE%xP;HNs+RWE4V(>MY>?q~o+Lw$+&hrP2nHvHe5H;nYw7kgT` z!~ug=+@2@;I!1aM2fOPuwzp|8D+=wxW+%zS5RBM47S79`V=DvQ^VvZ(WfajY*V9%- zNJNomk#J|ulC?+R3=;QEdaHk!;2b>py>J4;=|mfBsc{7D@LBvB+RXQh_By#ecO58p zSC6$;fuO^Kvq$ew-#=KWKK=;UCkY|wwkmKmD`Ge^*H*dIdT_brAkG-$h?%Qzov6A+ zz!?;5RN48nQ{|8&hxQJJiz!oI>TJ9^Kw$IJNHgbHcK!1bBEVt~Hx`aj7Di0}g-B|O#SV$&x_A9jOqUf#D8f`9v$8Jrc(AziW z6UKTkm@b;h{f-=cll%R$Vl0H!lU-T8ViAV;gQmgu;nF|Lh2yq`<^xb%3^CID*|~1e z8=Dsguoo{5hrr}?-prcevvFPL&yJwo2zsrj4)P3t<{qc&4L;ZInykBJqVm?omb#<; z)f?G5QloEh3o0q+ZHxJ-;VB!?DZmg7O_$tC4bZ}>Ep zfshV?y${+*jm4C;U&QIIk+!p&eJ`%}qneZL#(MGP&5@Unjhx-c!=Ler46IoG&z2IN zyp17mN1e8)uN#}T4cT_detfH5&tV#0&FbWNpcA$TV?Ede*Vnn;ls{~LFHD6{8=)z`fo2|-mUI4W-5BmeAZ%=vcL1I&yllW3${J9!DR>>|37_ud&&Ch6F<`jqTIG=3 zP!205QJ82t6nXNNLiF57;IPAFhNuuLy^w~uF}_cXyXl4jtu zgw6D?+b0lh3g^MvU5nk-{JOx1L+6=mBMKp{(~Spx2=~azaDYy618p{~ui$f5O*{fW zJx9c@f(}~f#1vY5m@r9(pgB^Wmme(8C?+s0td(a?4Fz%sv*dJk88ef3feF3f8zXlj z9k_Jj2g0RTG$9E4j6d@=!Az9{^2JBmJw1|lBZ{9Xc#7mXULr6iIe!+QMm3FtbT5uW z^0k0J$0hvMct3qP=g*Fy{q7=v7L>*l!^Wz!m*x5*<+Jl=RT_WRO{FE!34C@k4E06) z?D}Wv_DwhqbJpaRG@Bwk3I(GyyLUWy_W0P@_2K6?hF(}3#CZe${QMgHc^C`m`zEqr zFGj!wsCD zzxU+_-h1i3H($6L74*B$-~G;+JKs2c^6U36o;fjr%J-?Y37mTgIQZaP?vcd;Ao|Hw zTsVfGSd%;SBS(slE)ASn&OfW*duk>`Y~Z&*IOnj#flG z37+W#e~ume6317~X3}L}2uSNh+Ay-jyeZQovuN_zjWP&Pxl-WI@N;H>5rI90 zK$(rt1U;?eoo&UI%v~d`XV(>okkdGW!WrhgA;V`R&>(0TZh(e1W}e}4ZS2{N1^!H) z%BR;R&TdRRy*jx*jEpvq1e!YqhaMdrJ~~|B27yi}mcgEYP;iYU3q%NlHbF9Em{!V+ zVq?}V@MJd6CRLCA89NA$&LOh{XVWAzFx)Kg)S&FTILaFzu}zA}+OCl4q@Aq-v|F0@VnxJ#@p_ie%UF@ z;I~tlGr#cxiaBU<=p%pj z&s*p;Q3wrOW4nP7G#=47cr3p8|7t4AHgN6De_DAf_++m3(obcVH~j(O=cHlpp3dKzPqsOY zD$DDeA%3$u7Q8svo*8ijWSx>dNB%6UTf@#Cb`7RF+*X5FH(P%Y!80k>bkNB&IhQbD z^v?icPp*H)3p$c#3h-g)&k($zf=-cACx>bNEV3&2Tq7Upri0{o_8Nb#C}wK%nHq?q zFf5{9_xo+D9mF=Ft74?1!Ljqse5|vc1aMBhA?{?Hi3*;%ys zbGDURW*btllXq0Xhk@`QXcan|$RmHI3{0l8C&%nM96OC*GlEc@^F+U$sYM0N_X}Dv z9_RZ-w)FsN=aIIm(e}#WuFAoVgCpHllbN7+*RxB6(CN<#@e_>V56Xz6dazS}0FY`8~{-)Za$g|{5isB=g;fedI~FDHLiTdb7P`*_ayL{ z)bQDfL%SDS8#el?Hi%K!+j@JxlQ4hKW5>wkr-nL66yVbAK}zOXnPIw{AVtKmj|ipoPX?+G=N>8#%CZiz8y! zIR~oDWsH;!jm8>Xn<7UJAE_}ejV527GwPT>3rISnW`OZ$aML5j*7NJV@aJ;?=k?s{ z>-}$R6!{VNnWY|#IG&r#Ff!u6SMcW&;oPFLwaX+0O_Jm*V+YF)io=>hkuie)!^yKR za`ig!=Qv%OLtWL*pJSe^=jJ7DDUG~Zi;imTBFV;zJ@~jfIk+@NpKt8B!6L?BBNCh7 z&(8X&p|W6G=g-OGahUK7Va|Mf6i3kL$-M=J7IApNL%t^wf95b+Gl-dE{wz>$IRX7n zOJ}xoI&)4QSci1pn6TZ@0He);KSwRuG%Kv&t7mm`Dz+2O-tyc9b*02zABjW|&UEQ6Z4BOTZn zyCdj`Kifu*pd%1%`f7S1&w)StjX;&foMFr6{sBX<%e2$x=nO`i#e_E(_^?p6JU1f# zyx7~}H^ou8YgZ#jLTJpH&6XKB?C{xZ_hEMbjU<2O2_W2MHT22s3v)id+JA1X9}12C z#;eN%m~Xfj^vOAdm+YH@8zX_nYD3P?=DeZHcB}*B|LpvEvQ46B%%ZJEg)Z?kg}KC7 z{=%QhJtw%@)3MRti}Ulrd^i00*kBI+e0VT_WFY(aMDdBSLEtmy&q$yj9V?1Ij}JXD zHGFia|H;XbH=kL!_{`#)&rJN_nc4G4X1@Q}!XKNY8DouiFFXx=hC=`8_g=(~PMp{F1 zFXF%P>{QS5vl*1n$e!_ke$mTv|EV<$qKA$zW)X*a8R?8WBVXGS|ut_*;nk;lKhG9vg)jRgmsc}bUW zS6bv)vV)cGS*S@MnX`=D!j1XNaq4ygPC@ zH;#F=!D>mVH}mI6U(MoD9n?vaOA5aPm~W6%T0H1bMzP<}1;+XIEdje8LgN9>C~d-;Q|)rza9SfzwdhczYX#Iy!%r#%?(Rwvi0@w^9SJb zSZCL0M;Zt$>}*14bAhH8F5QX$Gbp&@0OHK%({lqSX9_P&7LLyjJUf+rVRrD<^@*1$ z8?&!2&GJ)=?>#uci@BzXeHbGT)YdwGb_5+LGzc1F4JffInFWoZ(CwZ1`o>&cL!q`l z-_#6$F4Wd$8yex#w6NNEIyKzZ0Uvh$j20UB?AV#5Joz9kYV7D@%vihZIIxeF`$t_3 z&>Lwqe;KB`GGr!g#*O)FH{O54wfA2C1qQ6-2IzvxPp1pn+J@nlj*a|KPvsuc6hf!B ze^r8Kk=0v1kL@!^8CCO+8@|w9UIn=3RO1*&SMT3`qg>#7p^XIg-(^qSqYcy9?r$MCuGwrh|m#}wL$bX1F!n&Czy zMYc;r%4$!NXCIkt3H;glZD7j;v_zL~rV&$UZ-m5hk2ni$3t_);M- z_#D`>&t*X`-p=AYt1w0znKL$xKz^a)z@NGF5-XE!mQ!U{Vwae+aItPjy|zW@a$fx< zIXT~9$eQ)#o^b;sg^tlVgQGX`XC9Flwb5zyD!A=>yf`ZF`J5)&9T};XO-CrWZQxg+ zB2BMk&k*3w1G_qF_oV77q9lXhWh=e)dwLu8_S9EV2m*yBaO{j08U`pCvl~qqi*}JS z_!MRcKBY*rY7*8=>wc8Xg3tIl!?c@rhlGYuXy9{S!~WiSx00^UDs7)E7htCXys~jt zxe`9B7d{*(A9PBLAp;5K95^RAB(cQLuA{z!Kl4~jT#e601go7_`mF!O1h}0*M(WV2h)&jb}R*{Fcc%h!J#qU7@R~-^`f@`Oms` z#mqN&8maod>BhZ0D85d71GCM0 zioBcXz|4Fv9?oPN%y&fm*+2d0J7BWsd|L(I3O;4GfCfJE${>$azO{P1dG~DNuF1x# zk@~8IhKjlB9fSLJ0G1sxi!fuRQ6)bO1quEf;Pd!CGvA1*azM}+M33&jH(J4nwDV_> zvIn6qQRpi~&i`Ndb7F4Ng##RIMjWnlt}*d*ta%Rnc@u?>;ccL}R}Gl5wLQS+EeQG# zTQICvI!ui`pVb~OC{pb$f7qHr%C$QZ{vIW-4~eVAw_X1nfpLe=NU50uf`&gYw6`41 z)?wz1`9?s^&Y#7c<+%~@XS_0uNW-F`(~U@`-PFRdGe#MHxtbDxo^RXh&dRBnfOulDR;=>!os9qmKq(s(6*rUiYnlW_OM@U10{#)~7@CaH6FllU1BEs1g; z))uCA?rD_&hNbO8i@4ZTw}e!?PY9YK{@hoOUu)pcVB}bKD;cxHXPYhyXoS!}MWCp* zFh)(_Fxe(Xyfnb)5`vCdw5ChhtC8SJ=g*+I$A;T4Z1lmOQO8}_$X{6Re|>%M%u?p` zV)q;CgYai^nSryI?)v8v+XQ7NQRgSdkYt&7#5{RRAVO$m6Fc=CO%zT0RSUDO+J2Qr zXqc&9y-UE>o7JvzJwMQS<%Z@@BA=N!%$;?L{Zw5HQ*?bhW7i1;&OoGyYBoiu&|e+EJ8 zOJcg*XkWvmWF7=NUGo{Mp_`qZ0%vS z(o!}+z&SBRklCfw%u2L-%t>?@^L!329QbLVYL@J|cDE?B!DnhsIZ#%t*)iW)$G07Y z)k070SVQILfy(i^N=DL)3kUZOt3(g!3|2TgPSofRmM5lSl-1S0j28-qK$^vbF3ms# zjBFoqta6X_&;Ejg2hK?QV!(=<{bLoawYL&M{7jZTiWUt1(qLip;_zK)j}CxTI90C$ zBh?0#XIgatd$}MAEg7%|%%}Kb$XqB=HKzr-DM|h;3hgNlL8)f2ERC_bOzSd*1&8@F zo4#6$8*N_h>7?k(3`m#oxO1g9MJ*Ey26&^BXGSIvbdoS~c!iiC%B+Y?8o7!2}86h+XTD2*nLC~|ny>ugV8s?1tnd1C;u2()D2zn{t z&E-t`V4(;8j0Fe$`EY;cNU;EgerP!V2)rSDlm(M)((-#k3JbCCx&n%r;ABHWTSjgl2Oi}Vd?4Xwh zAd1IHN4S!Cd7=NMg^3r|bNH6Lv{=9hdbGVsv=)2e1b_BR$Rvf{EhX^h2oal-7M>Xq z*WMJF@<1!}f{THi7;bm~nZ)0iSo9e9=~?rvW=DvwFT!}2Ow%af9804;M$XDnNuJ0s zcS~0CK|DG#s!3Njhr+f?KZ+miXj|%N%Ct0%wbY%O>3M!74;12QNaedaioO>jbb1X_ z*0Iy;<7W@ah~uS|A~Bf?Pc97e+j%Z|L;d*l2pn~>J9n&DcxHCw(a9lhjlH-F)X41R zl-Pl=Zp|devme z!S3T7WLoTDN4DcqyRaJe9cD%?S{r{TV0pS+PRuz4d+qr!hO*R~T>wP$kh?QTJ)a)S z^RGrOE~H`v%dd@{J~Vyq(CmdHb4T-y;))ezxvJfTeHC~?!(CHl_jl~PccK;Vnl@aZ zXNG6bb;Z9< zvgd_tJ}d=Z_5xd$IMc>BuV&&xE`#|7{Mq3%W9ahOPcqTlwV3P4RhISaysx|Le$Z<- z9vU$g<~F<0LYE5{ix_+U!H7Rg^c(myK;8kYi=wHW(?)`4W5r=S>)UGL#-V_Dqg^)h zXDtPnb~tS7Fp^mjZ6?{D4~P-5Rt`oVHs0r29UDQ%Q?#S-a=eM8 z@$}^n@MNBP_x&kE$nU%lOrCk~ugO0+_x6V_W_Go+gXIV{U;e<;5sE@z{#(ei7h;CZ zy^YWF`&fCnWd~i8mp_<(S6wKmm59)k)x^`6{$}}|-^{)9J{BCS@BYo)FaB=v7ay%% z{@u#Ozfb+U-`D(ye_UIc+PLdei_MKIojDNnM7kUPOqodcfNdeVaTda!sZPBiLhRk& z+|bof*Hu^l;&|W7bGhdybBLe$K>;uR@ZW$xpWc{%b#395<=NK`ja^txb?vS1*w>6| z8s_ZA8kl%suK`ttJVUcF;&5o}3>o-5)|nn^ZHF`CsN7#iF2Y7AG%@Py{>GNcF6FbZd5ojs&%kHhh(z6;#g?XQ?Ey{#=;n?l(|z+@y%XIXP22AL z+UGx2zx{sx(aoka6CHi}jYD@|p*dBoO*RF#< z3qIfc1zzsV_ZIu>n+Ka)M_N0_o0|^YclXYlZ-6!fsBz&ayGiKqp|#GR5jMNF8SI?k&k=S89a9*~Aw1a*ge4gRPdIF|oCIz8_J22V63)*zx4!!+^)b!r)NBRWv%76506UxVS#hG^F9G)p z@R=Z}prvg#6A9IC zn!sn)r-t-WiXDQ_a{S=G1j#~}!rgiw&q{LTwi*tPMpu5z#(wdj5P5djYjZXhaV4Oo zS$-6dSlKeS2_4f8dZpI0LhjqVKi#ZeNNf)Kk#udbtA?b9#Z+~%tB!&N2MpGfz{x<{27!t{F(x^rveFx@*jKgUo|+d&YLdoi_|PD;;6r z&mKdtvG~~R0v)9zWO|T5a|?pT+>vZI>Y?9$n}In8{j-mu#)3nrnYR*Xq)qwk4?*uQ z{Oi%+!}FXsnoNteDup4gZb6mI<6WBWA`FdbnDq z94f|>Exu=D-#t#J$M$U>-nY&35^Av9LE8#ia4)vfa+V(6f4`T&p9x@(6bWBV3mu3w zT}+8Ct4$M|s1t-)wi|xz&5aRx_AG>SnZy^$8WItjakOo^2|h<@3S*Cs&6j};mx5|( zl}nca5yzl-Q8q#EB-iWiND;V_#@*rouE-91sja}A1)oh3-Q+C>qUC^L-pfrJJ#|=ZB#YZV z1D3Id=DVlwz=8WlYwnL+NBE3t^sQTLZ(Qy;z_5e8oe$=uB~}W;e7lM%pN|$g4rf{@ z><$SBMB~W}aAtsvpv`SVEqTn7+c=Dr(%@)wW`+PGbw<)mG4V4-rY?R4XvleEBTE{= zh(hD=41!((N9XXw06WVW!w55|xp_4sbu=vWV6MYxbCYvXUCJ||#GHklxir)qwMTKO zT}-lM(9sM+6#eLF`uceDxwXD?E4>%iv#%d4yuMzP5%fye`L*o%g9A^FrB}M*e0DZH zuuZL&K%IX`yahXl%TJ!`#MsAp{BNtlr%V)$jOEG#unv<^kHhm_y&N|N%K8a`Pxl3{ z945X>NucRy3vV}=jHWkC6d*NnYsk**k?lxffCt`di$`aUgwp|-o4i?X4X#?k?fboh zmt&`8){NrV_ah?DvH7#^lxG#6DvW2=dLgoa<}L({aejtI+KU4{c|*{4=FQUX;Kh-V zwwZq{{$7B6OET%*6SZ@^o0F6JE1jMa(MFgeTY1h zg=%qZmI_+rnKK}4X2GlKpCeEl%b~*<3_#onT3Tz%Kc_EIT%1XP%X> zAjPshH`hzE4kc0)+on3I8*#+qXLrT`1tVSs7h{Ei_k~ZCn%a{X8V1J=W38)gIomPc z(Rye&_l=F>Y4PWwGwX$yNkq8HU-i+~R)@~6WuF@EE~dNJds>k$k9XFMbvDknH_fy+ zlNyg*C{CW`|7@4j9W7?Tp-a4@nI+A07nZ!u(>-_@rI)+WjFA$@9{J^YfH-Z{@M4AlWp)9ugibK%P+q16fPXN zK)-eB=%v#S!k^zc`_NBMZoGAJ?d=ygzWvDDX#hhAQH7ic8Vk^crz`s6~-i%YrV zOT|-*lhDQEOWiLl=T^FVP`-iq#=E=5@EhrFgE=EChp&18Z#r%bmjvGE3==FI4RD8E zyF|N7ySf0OZl+=C+`y<2MKjCCcxFA1RT~;5V89fa3f(3erfMV;&f^T00Zy}>>#~u$ z-0#9wxbWfTw$YZRonTP_Q5~0>VyVVNfs(*&wZ{#|4>%h;I!3qvWJ#l~7=m`B9Ovx|I)J(YK-ckNn8)gKzT zZDs$bu%=wO@Sn#1_uo(a>K`WF``z?A^4V}=>{J=qGiCnL2eNC9lLj&%40D}xH0<5K z^?+U%KL_~i0liMALp^ipeMmJHA1<60mo^6v;b=4NaQhD0m)|2bp#b&bTYo?C%YW?p zum3#$*mLuDePN}h3K%<+?wwBcz@PaCJJr)YnwARM(e8Lx?{puG8W)a6C^T6J`Cgr# zD?B@q13qJa^!#l9%ZrozYdX0xb!L6)rGxYQv-<8M6NmDhO?#`m>zc4%2K)k?GxcO4 zY{Xsz98I>tfu;sta!qt*Mml8l0s5Y8O`(F$)RXbBrN0sVb2B3;cy2hsmIOM*Uz^N8 zL(61GmrAM!)C@uwKR4wwRv18LfoPLJ2d56WH^(S8^ADN7B)v?eK(?#zz6&1@{#A0z z{52bE=O-IEw&<&_VFm0sGBpSA+}Qr*YuhR+QBXH*yBX`|d%pC!^1JR>$_=j$jG!Cu z-gf~0%+~FDc9!3E{R4mWg^x=H%?ijYoJHC3C!>uOBTHtA&MsjX5(OV9OXly&SW>5&rBx(smh>YLj6@iIF!O z-xf)}{d#$2-2Me_*=e&aYlNIdSd)+7wl9_&n&zc|W90qloB_ypd{%QY-?&pNms?^% z-6K{frMm;X>)CQb1IxOMC_3w-okj?K`xo|p?OKYHXRiUg;9oa+md~>pZuF7<54UId zb6sVUGfVuOz|PL1MUPGM9P?*1sQZEi2P`zi0A#o0pcZ+ygmEaVnGRUS)&tKCWX}L+ zrhss>jr)*5gBJ1oHR`xeVq@dL)L?UJ@Tmx@@!=47yRl+=Yl61fWzUfV0|e4+oc+>k z7dc0oXG=@x{v@&`i3__xo`K8)&av{@K`xE-@`xarkX~*OT`u$$bS&&_{FxY(8u+s* zflZv;QpasVTwNzD`Uzuhn{2a!xSFyL1+K&xV z=1#5D8GnuppI!4D_%lS>;>c~o=Q@A(C#DBtRxQ$XgQ*+$@}0!Y1o1NlG8k^;T6gpD zL7NBLuxHs1aE3x7W{y63UNj(sH{~-e5NQlIhWJLc?(1pUlS%FEZ?71t+kxyE^6dP1 zHs;Te-a$D(iz=gD4zyX^*pd>uFSPh`Nej*3C{3YAa@-Z+<-nh{Ld>6SwP=80Y8DUt zIoVE37i8NJbY#l_f;L|5sM#C;aQ>XM;E3YbcB6!#Hv{J_Q{l-8k>*DNFDARm_P5?=q0sZ$$SI6>AI=<-P}mbpE>8wQRB}vE_F66cT_Wst&e2| zew{x%TXqW$;4==-o)1xY887H;D<$yfAemN|6&ECfe`EMuztoMq8Nv*UZX^aZBYTEF zIvNaVH*NE#1$|$`!V%V% zDm%qUzA#!m@#q{i>!_RgGwoaWGqXUB-d?I5cRTCGD7Y62%4-+F>e3ju?7*XgV)+Vv zm}{Qlt6Q*hxD5Q60J0t3qwU4w9C)I2uk_ExoE;H|SS0zX95@WVTA*2*+np*0w!Gys z+BD|U(cC{^U(Y$1+zS>Bf_91yg6^;31z*K%hq4Xw-Nu?DS9Ko)#v7|f&1PhzagPvm zx&bN+Vs*|;03Zd@LP3Rm4GTMA=Cc!m2FWrQ@iQRTw9sk^6=;xPVf@LA5x&Yuw*gP=JfCy|K<_}aA4ws;y%@=}Ul5Ogl4Qw!NHoHx#`7tgH} z&u(BHkbh-m@bq%=-0Hx&^}_M#-ifX>n}U(2c|DN=K8rt3#_-v9^i3T>qmHIX?TqOJ zUK5_uuB&CCPulPKR2#GnzPgs_I$Y>Gm{S%)0{oxx-=N?E?c!&W55k|3JwG}kQ;vtm z2GB^KTp7Le{LBx&zIgfhrSCm4fBwO#*AGp+d1B?47oH%WAev_q4kCg6<8M9x$KU!o zmp^~~DKZaY{_Jw-_bxn6dH3w27(wH|K_D;aGY|gwg{8NSuf6%)>g&gpJnqC&0rLE^ zw5$Un&$56XI7Mo?#R39gW#3yFJU-WpDfIJ8*|AhFPXp5Hej5BPV@ew4HsGg_snOH` zpB)RsgjH;SYP$rJddwKa$*x=|=g`%KF9*Z)0Ap{BBy-k8 zAg~pKz+Is?w6hLGdODMx&-Z?Prg(n6$fG#1P{aiLEVyiA`s|^pZ$CVbmVRLW&c3Ru z{(XB2)l~!4d*HNPySKORxHr46oGg=*%5f&IZ$1U(HRGEDM(*iTZSEOPm;t}GwMa6> zd*?GbFfzj;Rv&qB2ruKOfs9#bokxT_bT%Vi4Lm24ph=x=fbccN>^0=h!D>FzR*>eI z7BOe@?(mand?rV7NrJ_EmYb3bN6e4`twOKHlN|zki^J!DpdHVaE)6C-+NFzj*sPDC zF2P}g(#~=>ao{lB;I`(*{CU${rh9S7yybE;c`ohFnpRw8t#(JvcBg)r5`T^tDNT=C zqLJlgAn07hwsiTnbj9|8iU;x)_jXs_pWS)iO#PilQ`aq5e0pjA*vy~)kI}#Q=dt(x zVd9;Srhw0vlqhiK?GGprV*zJ3(|B94qhJCb;A23|V$qjBfF#Ry!^V4K)McHJ_DWEdXHmy@q(4voEBEE<$L5EOiJjwGG~&rcUHgd22K@!;`TODm2s;TKHW8%*EbXJ@2InUTSs~2 zQelvPcik0b_g(ktyRQ38e{1J*eq^?%f2u1}Z0_iz2=z z-Tc|Io4!Q3_lD1;s>&C-x>Dsk5JH#VejRuj&bb%JNh(7Cufb~P&rAeyy9Gytpd(jj zQDULalK;kLZVbD=?KAZ5g@4}pmFjzL*mdi5nqvGpV!0yK*8oeEC(#AW)jtne&@(NTwq(E(y@a9B1>6rjdT zV{>vwTG$0FtTV(I-1p^@XNz3f`Liu(%4);lPMG5<=%uAUr#P3c`r7prHS(cEGHKav zAf<+`^ID<&)<0sdQ*@q&?--8Cy`Z=jSQhIRaAua^^X*?OcfXF?xANz7Z8;_QJi|@_ z!d&*&Q^cQ1oag2n)ZQBqG?XgsF?vkLUBT9YE<^RlZNAKfHUOTCDww^z9xpx zjr*j9Zj^Jf*kkklT#FLq!GVE_gPr^PjU_sHj`_3Hyv~QItw;&d z#N=5bYKShp7x>IEB2}}2YqAaEw!w`^M4hgWZJ)_A=)+1<=YW*20-udYZ^F^$_B`0# ziY}Tv?c!U}dLYLW=#UIM(@`HQpXDNAAFEKjVQ1Bf?XJ~j&#?4B9ID&Hae&`ZSHaT; zybC_#n9+#^$4=Zf_#B-u6G--q!+E=jpIf6Wgka}^mP!nwt?Vl_??W`6N$t0KlH?=}i;Nd_ZyybTp}(ee^Hd=`riLTC>n z_zb%?5p^tq4oF!X8~yXu_;ZAyeM($AXCB$V-HO!Fn+hO0QCNAi_!&`jN&gH(cK!1f zm>gYhLC~MbpOYLo8E@ghPItk%9&G9L%RqpWy~(tLSZ$2&m*K_~LE@0f>B+fQjlt2h zhw}u&9CjxNjavgust@cMsYNn<-+aqnLES#{)5z4pnG^gufM^d;L3@eDZ1mRSvr#JD z4YJ@!H?F1{uz((~*~J+W{Fy9-$iMF;@8MFa9{x-Xe?9`oHs59!KS%m!QVQBh40=Z< z8<6KDe|8nLqiNzu6y4X1E*iZwI%mMLw9OHDCZQF-h2;m-k6vodHABU6aVi&LHFH?rr~ zG5}}%H^@9F7wC-~@tL*$M~6~C6_nLs@gy0J*k+PHZ(-EQF5;`oag)G#%K)41&^XDT zlV^}oz{j|7I4Sk%Vy9kWMJ~Mo-oogTvffgA%#F2FQupi1;kdqXytfD`+X@6BrX|UH zLoAAGz}Z{2TtYH>B+QU4yivf}nKN5>oK4G}qYsX!EQC?H zLiy|nI?11D(V1hdHO?LgszH)Kg^@{#Kf6hV z0csa82mTCzwOvZI8OjZD4e*(Ovr)W7=-bRU1c8mpatmgxQ5X0#i#vkWER#1wn?Iqj zoqCPH>kEc@Iq+w;KwW)EsHZkv(flJe_CA9kHpy zXUs0*A~muXP_TsASc^#T-v)f9ERg%Jn`I?P#)4xWPY+U$b+x}ZlZ8L?2ON1SMjZG* zQ@Dhrkz{r$E9tCUp!@g_`R19o9o2rB4)B+%xpysU-kCF~nLv)v2A|DTVOWmP%Xw7L z(nZe~PA=q6AIdyE+dbF{Z*LJeMRtp>xVz0EFm)&;_G?&JD(JwUjh%u?HQ3bA$eSa` zY!Yan>#SI@DWW|MTmZBO7 zUTAB^BK6c{3(D{l%R_P|Ss6XMI{Dh#IB6LX{hnGMdv$FL#jixaYsx<;BE3BPB3{`` z`LlR*92*|%?nnJjhCU?Ir`HE?=U5)h47SMrVh+m6$=N^G|>}5qHoWnQ-b^^@Ppb(qY zM#;>XM$SoXJXy9ITr!=J6uV>{Xfu*#cs@ewE-sx&J7Kno5R|GH{ac1*&mMqy|GF}|A<1l@)4{#{$?X);dE=@O?bQ0mB9QG*@ z#Wma=abTm((F!qt7H2m7v-4+`ipaCIhebBwXh5;dI--sIKxQ>w{D9(0<|JYE!5WED`U?J>9I3e`fz~hs z*UqIC8@r}GLeQ~aG|-zC8BjJ))t)qB4@+gvr$ znFR$8wD*j43z=)@7>eaxEPTU0GDeGu?&p z_6)?BzcwhJT>=eu4n-2^`bH2mm{;7mjk=FtYEWb$f^CR|(2)^`;CYHhsiPs)=EBj% zvV8|?STfnlxOfJc;@wFDs09!yt%z_;6U|V zx0c=dCCISk$}Z?N{wy`GfmZnQo|`4F1)sv7WvpR|1q~4kI767PK+xjG;9pVYo3Cx$ zcK2laKzh%P?bv|a_8IuIBV3TFLuTjCg4-sX_C~J(s-nIIpIxR)OEe(zOqSa-0~{j@ zI~#3Q9rI^VS#C|tS=c#QSllmt1zX&CP(am_QQ)xNRXIq+wIv#@YXq;+Zf zXXnf@NfsXWI9fq|9p-<+#M{2aivZwr`RyuxNzF(;6n!qYUC&1*gKLm7UL3k#F>pU8 z4@dU`3D=$aEt|i$F?q3TdqfOI*6xqg>m+#&U>VdL_;V6LJAZa=3^7(BLNAS#N)ZS# z_H=gdULHZ+;9=H z(`MLd@)F}^7bMe8VK6O}C@}u)LTG9a#FkA09gH}fJOiksu2^Di3r4bM6FEzU4U5Lv z1Nba|kIoug9k?%esat0NfkCM-SgCW(bHm|t;Lm<35Dk1bOA6Sm2g1&z=R*ukAY0=D z^3CX|LusrOhgKlZpx1nB4OpHUk7x?m*73DiuB<$?4tWMK$}oCdKV;bk3p|;WJU4VN z>00F3X&x65)4?w)EWqacLl(hW4kpG^Yo zYG=pALwg^wrPfSqgz@KH%v6Varoa?kXTy6;tY-3IHM&4@Nkp#lTN%k9~UC$vHvESqX zkK$V|6HYIc8!AzaQUbk6x33R9(N}D1&SU@+!pG*2@6Fkp ztGAEVz@o`Qc;{5Z9?0`jXZ3QrZlkXi{(K0}4N?jgI*#_YQ$Wyu28=a)N5{)jK6}A` z17>b69PnoXrXYcK7A>UQQxAWpxDXoUvz59P44?aI*7|Ds|5ps7Foh!VGcClnChcgU zp~{B~DfqKPV*>ayu@h!t>PnoCaF%?bHr$RU3ca)Dn|t@7)5Z!wMdh)=A9LYT((p zCCQ(oMw1PTwOZK|%L$=sH2kal(ll)mW7p6nz0HDIali`Fh ze~v(Oi9Z9kvz;6ILPoGU%nC4BfdS{}Ln#q&(QJzQJUbHxOA1aJe-(u)oggKm~3<`Wrf+B-n4)un^YQqa=e8wZ@FY{ zvZWN)@&h8dPiyg@e~#I5a>ockZ$4oJpOHYye@Uw0VD>FX)u4O0JAtJ&!uZ! z7|$Uot}B+>`4h>r+b;`ugQ;bXtyGL)ZMgBOnLL~D*pv+hcX+9?>#p2_K8C%ndSEU?dSdk+WbAT5FSSY{pa65 zK?~*^&Z2+$t!J>{`1u=8QUju85dHd77;(J$;yMWW&F5Es^z7nmN5^2!r&b0HL>DlE zR%X4G;_*d<&;zHI^CuRw*g+$cKDn5EbustG(cXu~`ubZtknfInbqf0NpklTR=m>EX znEP?y&prSStlqfG_0q6nSu{g~jVd$1A+tl{fQ}`X1>u@|24e^yq7IqW2xK5Y*WRttQo zij7h)%O0dVGmggI+%~|Q>`ojCXxeqrw0jpnMF&Cid^FwE(Zt-B+d+HYK)<7K%LI5e zOFqpv-&i-$m7A4P+Q2o_S%gah#yI_EJBPQl5IB0}p#h(#db^f#nUzd_Dc?Vv%dQL* zUS1kHci32&ETG3kpF1sGBea5$)u{c-svV>mE1=$JYt%(C5}*hmSXojKFX z$}~cfgTmP{HG_QxN6?J%6}Sum@u+>Hc+N`$`9jS;B+yQSO90l?#eNx>v-4Z$vDEPA z9=J4WXO~QyL5Fa3403&BfVas&V`2*qE$b3!C%rL|4%>a~Ixc~BT%3$u#T^|3MYp?H z%Z|g(<|pwuYT10|B*)&o`}Ur)U8(B(yDIJ*D&JKozjv_e*5S&}uI&5tBO{Zem;SH( zfBb#_&;R?(#otX|{1Dp>0Po6sA4%K%(_cG(4kBmZFq9Z{>@CipleG_s>UTSmU7H*_aOsFV$6g$yBV2gvL$VfP5WV*HN0aY<)c#lhGJgEK zhwl5_VpH{WDsL*{0@!(~H#?H*oahmM2G5Rn_e}QofnKrT=&f(yJ=EEy;g@Cyo|`E= zKU;Wib`ZCDa(bRVJau+u`sCUy@4wC*o_TG#BVFCvxnG*+Tup=9XdrE3nE}pT=<;G- z)}qR^8?8P)YOxMbuHLdGoHnrKRe&1cCPE<>WD2Hhz{V_8^fg|VkftyI!4fH!IHws zumfjfvzURvW25zN6@4XU>#(>l>xXgv?BZeebqX!6D^F>8eF$hf^)>aiV`pmb1^+sc zR(s5!X)N*QIF8O~{Mj9(Y0uYUT`1!ks@y=j33w zUynyL&%rj0#NoOr^Tek1hZ*=YUL1&=vD$F*>McP{Wol|2y+CbEq$R=WmaQWK+RWP zCc8W?!Dk1~)W)2{$mAt)fYUIQ$EI4X*kJaqj=teMH14)KIJ8gFM>%ck5pF_I>@Gnwf^KZQZ{p9)r3ggFELvFG3Iy-eeCPRf zk`MNPpkdC)o?lzddoDr<#zTW?fJsD>;}y7c0xX^x$7*pKYTG56^8XuuPOcwlaFRcB z9>&lmI=vZdhhYH@|4#=l3^umR7Q(PGXWkUpFoEc+_8NZ{b`AxhZ?IyHVd+({b3oQM z-lik&EqOr)&P)*CGeLN0;fZlDz6nYG3@vn+tiW$Gu0gnZnC|ak?=Kh-#%q=lZ1F}b z>NV`lF+6bc?C=@>?5bwqWK^=EoqQ)HqxJlQJ|?MuzLGy1f_BJ!1&fZ7PSUFbgo9<% zAW--@ne3eUia%TaLBU@BXN!z}0Aa(zN&LGd)|iCnhF@O2uB{MQHl%!&0oXFv#|Zip z`SX?o_+$6@X~;(m-ZVEuP6dIszUD z02T=`pB?{dAkx5RRLWpy%#f8wl`$mpi>;v*TSh|X&n5B6i3tH(ug$p z8mb)eXR`!}AhQ`wi$9y)hu1nDh}c>P=q>SQnKPq*hLP4PN1+Tf%;nys#ah$ms!p|f zaUz|JwXz0~yAUUTKrx0SkyhD_I08~82ra_Pn|0C2VOwHmg^AXcQcF)e2Xh7v3O4&? z@n=WSBmoSC41ms`eU|RAw_^eFj0(4_jckCZ77rD=Fi8-9UK_r!Hi&`k862V42hXmI z^0x80nG89bFw;OOO;$nks+IT|$Q)^&v4f^W`e*THHv>TeEenqBP8j2KS`N~{XRN2u zMN3WH)3uWA!Ufv>H_$>Ofu^_%$HVwP4;7HW;l*Kg9D|RH79XD&IXsBCbQ1pj=5q@_ zeRlr)PmjHJc=?oi|ar9`to<5ntx?|5Cr}5Dux?!-gsqgnE2$X_%mq-Us@@= zKt{qPr6vS6f?LlW8d@vzd+kqX1Rd>#;N(j3-csu9C`iV)Tu*bn6mP@yb6o9qSSjE6ZlThc!GR| z2gyY^dEw~Tq47a<@88-OKfPgz3s(kT*%)3g=7(B3LDN$`op@+F@^uRB;MZxh+M5SOPju2E-1Z3A~6@gPPO5+?1`{HQd(X^cA?uEjy+be~uA10ecy<74)WX zFb(eOCG()>_6c_{XEMmqN!7R5pL=F<@Z8~P(fEyNZWFrzzM|)jOul|(=8XsEkI!Vg z_LLX)?;EJD>fc{c*uNWHZddueZQH+w5yxal8z00_YqQBOap5TGpV^Du*>@I(3}NOB zSYcq@9A9!yC&mopgwCjm&7&jILVF|d+0@RF=Z5oSt-M+4>_nPIL2R=D2}GKJURI+Q zemI9fx>qu3q|{yIJIJ7i|8o+|h8U#macFU7t9DZkCqZtA!<1ypRbw??$)61fheZg& zT!NA>N32!es)Y{ia-WV2sKW|j*)6o(2Y7E7Y}?6@TXydb%r|iJ$d}!h*?nWr z{hu1R_lCuXe>m}%|2*)ke;$7OA0W?Dm}b27K6wVQwxCR3e1Gz%e+?Oi`XY695Y45- zX9vjC45P){9Yhm*kqX+nLW>XZMnPuyb8In9C*dk9Pl`|1$H~@x$9bz1X&Ys=I$U#Y-O$YwsAj2xI;{*^`;g<@v_K zpR-NPnZ~9UriNZ!8hn1bA2*xl7x-VOS=?-1Jven{W#ZM1S+VGYGv9o8_@P{D)4tYR zqquRd&WxaqKSPq?z(SZ5Y=40%Q=4T8?s%m3N=GgDl{ z44|Iw$zZ$;9EKZ%pk2c(1kJJ2yudQ%+<^*O0%=B43_(M-qM&o-g()CLYwIm>D*LGDrkI2V9wLM`RSg%neHss*|WWQq3K@zokSE3xE^Y5FTeTv zZC|+#1Wh7B`16jhes$k>@NqRqG2V}U}OcACbh9S0AC&rF0B z3q+${#zup5gi2+oTiC*%8OGCKB>Y*N*(K9Po^^?RhsA+BhrszW2pZ;`g&`wU21nPG zBTkkIx~@|EIR?}s&z^rU#?F!c8CKj<<;7csk*y^fV6#dfx*5I=e>THs_%pW8F{5@0 ztz?L?aR)3Kmgt5XqP{}PQZ)mgN&FXxv?FK-&d!{J&e_Rxtaetu#ge?)OgZGa(YjCL zm9?-MO)NEAM5x&UB^fjVOfcA9$4Mw4afTtj6$dtJh)BCDyW_fSTSKnB5$=lr2DKL_ z&ml&%tQ3uA#DQFyoO+IqiJ{8m6NHWejp5!h`XF^+XG4E`9YCG}jHNI#%GQVC8j)}; z7-oxst`__>NGS-aRjNciHa3&6DI@wNR2|lMAxjUCG z=Qt#)(Fh&q_Wx*&y?cx#r4=+K4{~yzI<50B3kF{5e9eC{vUZ#c zmqzED?1jzxrKjO5G3wZzLoG?!vw3AWe-4~Em}!I-0&j#82mDLmc-dQg-vFGWz;HBi zIAn4~(6bOCdp1zafMflg z#IAV;DLZ_IKbr+~J%pJqj5Rj$$}{NLISh`Wu}HEORKh`UF(8^Vn3pd!)x^vJI|mSL z2-fwy;z%GZUudyPz$4C zcM9APw{-Y?1zV=eS+v*DNW;#7cB*SL0gf)OP%>{CW&oK*9F~UFgmZ0TXd$2_LZdc5 zIpE6OeZi|U;j4n;WMd3t1Dn-(yfGf;Y+p58ny$G0D!~>BG^Q3tgCha3^U|0$mm1?1 zN4_O|9p@ipQ*f(O=;R{}57VE3PR`k4;_dX<;WM?s^5&C=S>pM2%MoXW4_k>)dBD6e ze|Gpx9r&{&XbfY$B>6KA5BPF`po8az7LQ@|dbXRn@MI~Uy~O%wHO8?A=EQK6?-vYtfA5^pp|}c|89(+=Vc9~RDH7J zfG2nB!}W(o`$Tg!WSI8?BnkvRQ+VuwLK~X4Bz>`-Ig&TKCYeS{%okoUlt8p2Xt1r3 zY9O}waH>(n+pL}?UEWNd19OJcdhBKt0>4O+Js}`d1eqJOR2N?oX|0`aU!6Zg7loRI zqeU9cV43yBr8`RpaAF+lEj+n&87r|vi*sov(&E#-3ta346 zxh_aGG?GP_<%D^n4WDP(ZiF2tI-15!3vDe3q+8_w+|>cHW=HMS-433W`$vx`D`*0}hdf*GJYF0W6wy%Vi>DvFboODy z&u^c7@SXFIz@I5^y?o@&6B`#_I{f43*T47V>>H0v%IbNsACHI=3z9&?pMkC@esLv5 z8cpWG7Z!>q7DrxM%@e$`oIAIkTj~cUV394^Dt8xQPnYHzd=Ah!0@2pxOqjuZ5MF2r zu^6(+l^NjT-sBj112qi;w6*z8QwO%JS;n!ok@ISU&kXiUZx4IXxPU2ZcQ^jbb7=&M zX(%*l`wAFA7urZZ2$Sb&V8`*w!3lg>q0KO7;4^_2$g>k^#=N*Za&}{myo9ekGQKuA z^z=yn8xPOEwl+cIHy)Y(=93dghK681V`K_bjxZ5sN%I;7e;mxK7)YNRR@7@2k&fzPbQExUX3LRR*(ba`Qbvt@X)3SGS!__JR|WBRhRGZFLW z`D`B9Dw4~^Om2Cgzt~WN1X>7pkK9Fq;f7OR=g&zV8_09;tk}|Pc>^QxOP6EbB-c&G z3}9nf7`Elo+c|s~A4US7`OveRr@Sm* zzH_+p&TRP~4c_^w!tPz;7yfGWKmR`S?mvuO{(Hp6lb1f6zx->wEXFT=fVBm(WWX{2 z*?Dhp;SeQ`9ibf^GtBXFV9Q~Q>zuFbW$`e0OK<7Ya~-}b)9ECCc4W1FO z(7f)yHiepIse3K09z?e(1!);Hl+V8QQE&o!a2#&J_R3URj%cvuJ`rU zwaW#%5%=aAB_gbAzz7-$+`X^5*xvTNBLj~NSPRKI|dZ4M* zShQ5rxHp52na*D%jH%(wBW-EK&w)Qnzm1i2%%5@I05Z!R8Y7NQ4A>#bB&F>@Pz`@3 z21@ff$q}?mpaIC5Zi8_hL493pA}24|Jmo{e6JQarGZRI;yLey5-z)5+$r+mQqr$5j z?!Wi`8?N2{)h|47Gt0h;`1$jdw_I0w z#|?XLzXAR%U+7zfpuxrEw~%m9<{K0z!-Ai(ZkCEznA+sf-b+o=Ltredd$=WgcxYj~ zz1Uf?r}DNNF{9qY7M9#l;%8ZZ$R7i0N=-`=IEOfJVDVua>@-+3HRjJwjBP;d_AK)3 zHWXi|jPfKJa4zklgoeHgfy3BnFUQN)>n*+`yZC82hSO%p^$v{#f2Pq7#$$vA3kaK1 z+5+++Mujm+{>;kzZ!?ZPq65~oSid+nypCHY%Uy9N1GSN?nwFU{23x0`)@dE4ua<- zf2Prgxkj2U4K|Im50mn_sjA159ulx@eO0!3Pqs-G99>Xu68XvY+0w?LUro3=LsKEB z&YuHz_CPGU9Xc)BXQ-nT&atJ2oPj<4oKa{OKl=blpbc6wfB?2^MV!`^&n|uzwr#Ir zafi=XJwQa=Z9|R|q!Gk+1G|jQM&NU%Rs0!}?7*4Y`LoyXRpDaHDB!eK6r0-ykQrhu za|{FB#*OPh-xzUVcgz?Svv+1wiVQAd^JErxfUG)I7Zo!k;qb$0B;3+e+kMG=13>Ks z3G|haIkXT2)a*E#%g{nEXX8}tj{gR?EY&wHEj6@2<0&9K@Y~p7@=3u*F z@Yy+b308A=jr+SAJZpeAVX>$mi^g^l`=}?;5;WKp9_-Z*dzRl6}efP!A&)e7{fZ{9o z^Hr^$w{mG?&RZM9np=5w%(Mfx-4ei%F}{vSb%d#5yyCY$()n|6_7J8H2s)vccEap5 z+iP*-Et=;TKJ#z_h>mcyjU={BbpT3Yj5O6&qJt$cas;$PZ=x%r&{u6S+APAnxdix3 zuydkT=FhlKPuA~0oNGATR|Do1WHvQ&;LK{df<-%;hCdTHe-8f7X1)>e=b7dTW6nFU z_@Drv(OLt&N2~9dZL5VpFL&t&+CXOK$qtrLBSV#s4Rm-QI$e9^x-B7ohEWSsYnE}vjRMB44X2kH{)f;zhK@g+oKj^p#q^-0_S9lGwPTm!;^iwu&2{h+gH>yG0Vqziv!Yd zjBq5j4lovWsucoRy@DsJD>Q~-9)$KpU|2Pl3diFk1RaZn{W5IIWfZ&eIi96`gTr%7 zaRp8t5r>w*pM!8ZUdNw61czhQF}Li+dsTbdK^F83fMLOyBuD%?aht5kEHA*}2;>^n zb@;3)zD|5jX_(_FaUh=!FG;E#3878@jJ9?;BirH9fS5lsQ6n*PAm3bXYymCiEJxgr z;m=B(2Z7XMbf`|<$0A*<27g8?D@Y5xJzxcdYx-w_T*uDI`V*OOgrgZ>ukx`t+O^Oo zw+>UHz}Nqu;m?kpojgbM z91*jryIzQd$3Dq0WXYASh&iW`H;Wa!2AFn@G&>8?U6U)rpMlr_WX1^m8kc5qSvvbt zvG_SKXOZX57SUb2I}AZ{sa;HE%@&T1qZ++&?7R`7@A%T3C?L8j$uT;Hjqw2Fi)J`3 z9gtgV0V%iPIgHZSd@xE7IM86uh7kv_7ZEZg;?Kg)Z783)eRiP{L^+;L;j#I~`XJ(G zc|LFS^T!!;g#&JUL!`bgY2*`N^^2C&v3X z28N%RAHDd(>YL9j{N(A`A3m}0jYsERe{lMz&&_=QnZ=(RUw;P+Xc7*7|0F30fB9`u zXb`kZph3{Y?_PKk*)tUS?K2N47vcHGD5N0#$%!?l|K!C(-+yWj3H0fMLnkDDMgm=w z>>0NW;PYbf#Jn7#$vk*+2|MVa7Z&@DFZR8(lsmnWeQAAYysu}htqo>ql5ge9&*Coo_^ch}iA)KdTScoytTCc&4N246Zf^%^W_9aHF`msfF|7;_Nq z{23N~Zf)wNgCj33jN#h)t)t_|4^FNP=U-i$Jb!rhjbjUMJhbrLM;E{K$kd@?p}(0w z)WX8fp9#D;fDITHZMlnq>4gJFkEL5V^=NndXfUZmV;@6IDcvJ57Hy$AQIk!?BLlFF zTR^z@U5I8UOK6F>E;!dql0O@Q_5op276~$DGsj5s=LmG$lw>T!jjI+v5?$SUc2L4) zSYh*-wTSDVvz6uf9lHiA?#S%EE_chPifx6(U%fy2U;Zik=I=%>0(gIm?eplR58%)8 zTYme)`AbS52t9VpyI^k5QzmAH8Iyu#Ks6IlqM z%I?t-C^Un8F2|d`^jii1$vNcWJHK9h@53XPKI;1Af8X=(|B2t)9NlrlWVV04dvvrT zGv0^FH^bkV$!@Y|X8BGchvs$0P-}Z{T@%a}Z+ZU6yfBZO`q1<9yy3z+9{xO!7srY9 z@skH<-#9$~orh=nkF1u;+U}Z$?16e^0IX}s*5b&~l&z^t*ER6c@W;mn_`8v96x^Qd zEI9iG?G84##r(M$+h?X=h(R$f-4G2D9&YQ%*EPep`8UN}Eh5)n#OW%20f%P}BZ(>T`F zm)^7Ifg8Sb|Bcsxg3E5a4#(h~H+^aE-S>>Q_rjkkfbl)I-V83LtNf-fRNQ=R^*uMW zY`Y!QDQ)eo*X%Urj4ubAmP?A0UV0Ho(;M^WP3|1(z3DUi@492Adt|wHYN@cc)SKIL z+gEqpe0|x?*O}H@%4+ztE25q2UX?#bK-jFCL8gJPI??q@Ci)5*eCsCuEIG8<9n(c% zsJtY54)B@YAO_YV5xbVgn0DV+xY+nDffshy)4;LW1kY~7K^Ki8;mk!$Ze4y_x`5A| z&=9oEP3WH)<0c*qW8z+``5-7-5Ngeh+;Oc8qHopst0Qk`zXTMEHb-1q z0NK&8i=Sn-U|HuNkgj=#EqmZJGVteOrx^%i*MJb(*s}BIK%N~wOB4-!Zm${cXn=fT z6@nHQ_>3+W5i$@M&2tGj6Sp7BtR6gA_(A~@-{h7!}1cU3&x~?{` z`PKQexV`C|UFz(&)7>m15h3X2+Eo4CuKK+=U2|WB4r!YQnvty6@p0!Hw`XeaD%9OK zTKm9I-Hu|-&O-I}Y~2pT&+zA5>mI42+xPS3;iLC-gmhu}JlwQ

a195$rtMu$xqa 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�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 >tU%0vx8OTu7lYb&Iw*N9nP$DSa3gkmyEo z)^Lf>2ItsIy$cmRlQje%j*@vkJz+|>-+>GU2v~ww~$EflRa$SB+FN{u0uL4~A^~ ziaW%u!WcNiW|d1b3pGXXOaQCFsvucdw6a`A$gQAh7e14-k|Mk05PvcgPS1CYPPGjo ze#VPqrZY1T=~?LMKfgo%<9vPJ)(iWv-B`S|e;NLa!3ajs$97Jh+`D*g_tMn^Th8rW z-qJgQWe5M1Q=7BNS5TBFuSEYGE2#)YYHq+DH_JqTZa5$pD5 zM~q`^N4RZmq)3XCL=7du-?`_#Td%4BiZK&$v~#y`F0@f@91u@BzXlyr;C-IqTAF-je!0 z)rHjPo0R>@=tb=*yOy)uA(a$pa&e(?)$m@|Zm3DS8;8Waf7wk>=|kz}%vx!a_ClK1 zLp|$_b)n|DNsOS0<+Bt=qZ=Rci8^rOqv3Zx9)9Peo=ZRPds}{2(tq`no_9WL|Jy%= z{+rvQ=l|vGboz3-?9^1>iRt0PGt)aJuuh*!g$~7vjYeE z67&S)i;m{n@X`6P6LVv4%uUdL@X*Y}p^0(2>mC?RHk5URE5sPNt)@9v8EdU>Mdb@9 z1~@ks)Hao1hTMn^1&8ROl_$ea8NgVnuWL7>t<@Ddvy~1yd92eDA)EkKLE~@cp^peGm|he}!UL;l{>VnLwbfVY!^*&|+H~sO;GuYM_`` z_Ax`jGW6IUdN}Z+j@l+|y>e-@rz3~Xd`$SWy__sDM$q;qol|6@7C|d{wx^UiGvm2oV(CuEqsgmL zktq*oq}|4rd80a(0F61+=7ZMu*^xbC`wa8r z5ua<|#G*f6!k<;@40+Z-EjXmlV0liIzhg;eYccJ9GFuBaz?>sF*gK2Kv$}04e+D=! zbM|6qRX8u_&+5EkoHVpRrOw)U(Di?Q)*K3dmYOW-)2GFejZd{?t)qJ&ND#~`!ejiO z=@_VX8O9t#m~)9^lmUDeo@@rO5N2$dO$$N|0MY5n{QjzfzKTr(rSaczO*S0yGv3j< zgZe^qAv=KH`5O>CD||K-dOe&|ni!UBaQO35@w1mdE~$kcf-q?r%Ye)CG(en)$-?7A+)Q1w!GTQjY)bB?-nab z<}CHZcPm?_e^$0E#U3s#TUoYzr=V>UZ84=Y=CU%;P8aa)z|%wix`}Wpw0SmMH}1jC z3ZjkjS%lCQM|<;f))+pE1&6ps3l}8=M+Ir>04AfK=auJSRrxG$EAA(6b-JFiV%0w@ zOlF2WlYv4jTV|G1!P*I2BaEt9GbFu3;WIP$0EPvSQa033y{D(~%w*sc@OdI=1FcI$lO#t ziQ_RMPrn>0eD?BZFtu=Lp37flUc;hvuw?&G@W^!h=xmg>iTipQcro$K5Qk?>uvMyU zW_c-$m|2w1>azh1H{{usF^kxk!Scx{?fJwA8uHAcSpv0IIxVz$8GjZ8?UGwX&1956 zt2THUe^&U+=IZhR8w4hUu;9`Y;Shjvyt#?%&c^(}!!P2`E1@)mc?ExV?hW8_ z{|yAmD2=I+&3&SO?h8f^jP+jFJ#_K8(Q5~0ufDwH`oY;NFHK)PG%vK7;HBB?hvsh_ zT7XD1uD&>N;rUVI&=@0#^Yf1W<6F|FHm8qmPGN{~WU~9@mX5i2b8}4-Ub|rDHZE%T zbG#PA=LRIuFlSIR{25G5Ah9pd(G_Jo3iex&JWsqd&Ca2z}$zL;v!}_U*@VGykH#wzli#|6%eU z|2X;HXFZocmabd3K4u{jXvI6qX^86Y7Tb(Hv`Z-CtU@GRP7Q;k zB~IkYP$LM)fS_d=4)qec17%u3F@dfkW_Yi~3u^~2Y3ExX4qg2e$PdAj;w!(zkt1>K z^X_+VPu%>EM_xR5Wj1g&W0&|>z@ITm zKDC=Rh2jVehz3W$`TWA>WD?H2V|Z*^dSD(9o$Lca&nE|lqw!Q@bAPyFqCGv>+>IXv zHX3kd3zL;6W4K`g0nTt~CCSKryMuyQwOBx|!LzVghWUNHX+Tyd1|3=hi*CnVxv_OP zni`6w1|tcKpvPmqV{HTdkpwQa7oVF)%YAz14E*`r-dTmuWR7o}eq;9(m>m-m9u_Ct zW1DAB?U{l+m#^R0l)ovmsa#y3H{~IIrY~WnxU^p@Gtp2V9dkf@d4RpBdE|Sqx#(u86u~T}EZbI=T&(uKWI`r@q^i zQ#sb&-`||>@y8R9+EmFy-Fa*JUi|Ok|Ni%#Z-3Tx`TfqzKkvNp5w^^UOaB_b{1ePK z5?6lGdsXPM!dTEQ?<4yz)AtmoG|+dAzWcOZGj=AaYuSh2AlOx!=ajA@&)`rq#O$C8 zDexZZ&U#8~bO(Ls5(}(079Y5LP@u~tdD;0EOzU+YEg)mBMMmH91SGwAdr@7hXIIX; z(7OpSzY5_qfsYG51Nk_GKl4)*+=`foZ~j)=!ruIO|J(c^<&zkkt(XSu!GIWY2I{7%Z**LS@2o zn=7L*WEDSypyf~yF4g^62gMMTXo zs^(TGH~g8iEMaHwV69$@xwXElrLMD;f<`(RhB4d_3SHu7IU`sS2$cp6e3qt!Xu0Vv z7;j9*8@gq#kH;FiVhu^27uoa0{kzWYT)6(?uA`IF^_858hfCnYQ0qD#Tv`wo*EJSY zgQIJ6D`VB|UE#3~;Bj$V*3-{C^_PF1^WeQ}aozwv(}?haKNl4=UeFJH75Kd2;XmK- z;MZg2Exj$HZNA=kus0Fx>k9YAeX07KI`q$p&|o~!7x(uFnhy5$wN6FLgRAcQ%GwA2 zBKz_C3;*id*^fPt@yPvIPdt$E*tcQM%6kPA!=JThpYmtJZ^>95t7irOdIo6M7I^bE zxpI{k_O4vAl0SPg4j6a%vsdSA%tOQu+B6gNZcD8EdD%=}Z!+V%(wflTunn}apml-f zkhrl#{41PcS`8Y*4MU#GG8H~UJ4Ns;-VPa++%_EeEI!h%5r=SQ!OnIdex?lNGyEClv%fqK=`#G;5j?xt8Rjfz8Z~mt zw9+fGZX3>_Ict-UXSD%QtgTMYUaMzda%)|Yb#k@{8ZON##nH%~!xh}QkZSn3l4mtD z;gykR7k>lLVGC-!ZU%4$j(G{uUmft$#sLWxMcSGIv4HXms_|m*LNMB+_?f%dS)O zm*>w8cK#Cl*$b$ZKQDvN6vXq_wB|k8wrPVv$WYN(qb3b5V%27wRtZXBRjtd}h|c% z`eX}@rCp!^YQvM6@qA`B5@v z8zUA~vxiaJGV*CZ_wUDBSQXK#g7$)COPH4h`kE{zg8_-dJ`i-GvPe|HM)bP~W1+Gx zkG1^P36?_UMc%t2uYA}$JCN4umJ74Z|Dq6g3vZdkhVcqpc404pEI0hwTP!tyia$Go zZI^iKW9n5FA6cJQuIP+q%vo5pQt_p?B+~1`+_s`TX83cgC^uS|2ZH7gHxvmWa@Jv4 zv>al-;dTim51Ixh1AzrEd*HLWVTkhCxMy(IsWE|`IpfKH~@tUJi)Qh7Nm{K>4$-vhbO*#Tu7C8~7|c z!=JHM_QGdk< zZP#DjeD(0$tydSWA%{LVbNS^NOrgQiR}Rk5=I_kz^yzH_r?&T=+1h_<`vCqMho(}e z=Mx9V+p#8ySNl6^>e{QhbUgvy8qAhID|uG84du^@qf@>hr{WEb@aOTCw$bJmZ9$0b zGveowSjSWwBGMTA8C~?rtpjIw4xGpQdCxfVSA3q&?j92sy?^rJ4`(j!n?12-#Usx_XMjYAbr36J1(*myHS`s=9t^qb`Y*b#{kHe&f7<=R8#^!j&;5UMJALcJ)(h|R z<9&W&KlhKf$1nYFwVgc~1*?X4ot^r--*F+R5#+h^;!l;^=;bWKA>b-XX^25UN`7oc z128zJ*os49B|pR#^5{+4Jg3O8#1bbh*3C(>mCBpdA(lPuZp5tBo6&7`H}bZOojIjt zR1zpt8oKiH?i;^IvBRYg(>LD-D~-JKS@+G408KqNKka$%cKVp!t=_}Kgq<{PJW&!38>>J85J@98za#!ng9+WMQ-h70A}&rP-5I#OVdE1%|Kc~$D(8oAr&SN z+YMu>VN}qL&jv}!*Q1cc)0Ng^&5}_ZZEQM(&^F1bq_1tTxo5b!8!wKbP-3cMurJ)b zr8{+Y*F5kU;Edo9T{jIDX{2~=*TTsiv*O6H6N3@HLqQF`<>=9C5Ut7(0Y(X;EMh2k3V-+&&2j&XQa1TCl;&kg0z z#yUg2oyE@?y|i(7W|h%78!jywG2HM_XpuncKn1NFTjuo{bQ>&Q^=$T&Kd3LN>T4b7 z38%UP$y6vfRCs@1SzY_t|Eu+%Znt0i&!Fbm`JX4>`f1|wPg9paOkVk@^TIFE7eDI0 z_OtlKf8`&xzVDcM7ch9^@b=+-M8*zH>THwxX5>)bVwZlIy81B&%OLLfTfl7x>cV3g zY|ER7dYw7cOXz!$9qcJGI&^b;2`;TQx&uoR7mdZVyQi(>ly_V2=EQnky&roa8!Wr1 zy`o-J&w7iAc>&qYdx{JnvvLXZb)HI~hi<)}66N!+$8PX5lV9{-{;2ouUyi+lHS}*I zKf0a$Z*LEs{O`}rwOtq}zce>=a`ViK4M?(S%-PVw3=X>(fwr%}G*Ph>VcK5CeySD%6#huAmf2g{nxjgDCFgofI z!=FtzM))%l=%!MBFw!^JGS(HE%zE;%rylqUQfFb#hCe$l91njLT{Qk1>mK;C+$SIF z2~2c_(;ZC%ogvXV^C8d~==bOIJz!UNWVlPrp9fRH!QRMNfAd01WxGJ^2fqz-&VBqF zxsN}Z{lr6=kKd2}dE=vhVd*ZiXIL?V!17x;bjM1PtZ3H)Tf53;2z1Y-rxsx^c`dfL z;aRJ)Bw}Yn%LP800xyMD7icn`i!QowG~%SeFxXjH zv^Ul!gF35Ou|jF|%ur21qrm4@)^;u4mnkosRQ8bBIq29Ak-H^k*ve0 z9lv5uQ6K_oh7E{8#Mo~5%X9GDQ0X%8S=^q@a7;F;OI75&l0R#iv3i!ag9b+zD0~+2 zbB#1Zgl{W+W(Ff09PP9bRN8ESv$P;o&a9}Jr%-aPOE^>!xIDfYoYg?dys~9#B=N=YapsO|orR`%b*qH%; z<_?=nvoPFfE?6584kqN87~NDXZ+-Ko)vcS>F_b?8knMm#D!ODA8fjY)a%gOU1yp)Y z8S;z^2k=?=b2NJuBVq`umRbG@d3$xXN|oi`OC)EQ`%+D3ZL!k ze^>a-U(=vz{d3Fg@qbp@ta#ayXK!*T1iq^-`oDlbyPD@!dI`&xmtWDyr0rR6KxJn> ztsbB1DleMGb|X@X^Tw2#Z$#=`{_Ge*TmG!d=au?rGU%UaC#QUPGF%S?hLOT=A-d_h zV#u?;5hA(Lf{-^|DEn#tF%S4*)Fl)cS+CPZkXR3uKSP+=3PNj1FR}7xhfaHh&;ow_ zwKUEaLf%w8+Z;GK8+mg!dUmc8+vk(xt?=iAJ&nC}IM7y(`AWGxxk+___E!jh#?itk ziY19Fg|Eh{o%IGd1U^p$8wjW*$wj#(t#r_|Z6*j0H=1Vw&Mtx$2{a4ML&>vvWX$@c zB-wK+QZf`RJUAXbu_bYQw&mz#%Xp{+UlAZMTM4KKGB>G(vK1{WLnbNoSPh>EpvrU@ z1UL&}4kM5T;5P`zc4@P)Tw|J{vjA$>%R>0D0lccFHcO;wps?r_{2AM4idhbPo{0EB z%?5M}e?Hh-i-u}*I?-2GD&KU3L*v2FFpp!F*vm;^$@9`+DTB3C+1zSC@$w>4_Mlp= zw5RMsn^_XTOD$#fY$7$w^M<}Iy(?!caIWT=m*Cu$o4A!0HA`U3G?XeY=B*UjrM?zB zLwYr~0f)riLtCIp6-9$>^%?KLpFLRHxd(Ft4!Ab*W6e7ka{05pkbr1(&enp%kJGO> zKP!cXKLei?K`WCKSRH6w1k0|%d1Z#{+N5cXC#rAwbHBgFNT9Lckgk6+TuHFHPcZ*U z1P#kw38KA}STQoFR)T`8s6oNNXLQR9LAx#-b^_(kOL?#IXTyh`R)7>Me`c%YH{j7f zTmG!L+Y6TM!%AS}&{{0pdVDsVIL|n8c=)sWen6hNHwOGUT96HbZZ62}sxFtmGF=G6 zK^d-SSqZbVmFW+dGF|_KX$P9p zA((B@f?~U;DxdBC97^nRW+BN28Y@XA=5A#e_}teNCe}SQ(0YZ>s&GcD?A=Xc+0*c6 zh0m&gwiX=Ld;|WB{{~*rmOrcIGEjG-qwDZ=-=*hAFC7@W@zUn2uWWzkm4zEewg8_& z&;-tSbwOD4E3?9)U!KEn8EX!t#qj4d+f!$E3}4tY_WDfU!Kt2OGszR1lOxTM&YGt7 z+6I`j4#dx}X!U%sLS0!i2q^ z8)EzHcIyMu0!##?+z=aQHc4Lp#mJlgaqO-CyZ`3r16MvyTzx-rP4)y{MYzg4zn=K_ zzaP2qFI_tijbHy?hHiesspQ3Xd;>BNZMI|;C{#a-OM^Zqf8D;@BE|<2+#o&tE z8w0|lyHRf`vF^tGGqgZYQK^H4_N>M{FEz@GG_af4Z8^)ULGLg!tm29?Oryr60nxoT zMA?X-kvzQ`dC@@7Kxtf1dawT`dh3sg_deTq;vbJKj9eJ$JG*%hHVbn;x_$KZ9pgu_ z;Mgk-3g5s#dFL3w8SE?)=>5{U@A$3}?7rXn;pSsIW@Z!J_;1Yj^lnWJ(~)pn-{|)A z*yirR$#~yrYxh`3@35IMeT6L>_}n76*r=BUEL(34!=7KAfA z5rAF1ulFuodT~3{{q)w^s|UBww#Q1JU0a`%-IP}v%FhQr(}hq*UO}+1q-53F;vcLA zL_=#e=b>YvzVLA-@IsnM1lmW$XX@Ii|o&`P|hD<>!n2=_ISdLI2 ztpnlJ6pNEBM4F`HXgy1YLw06ROj0*D@Hv^{ilV-z`Cu~9#ML`f!R{`9M{jc~R_QBz z>RBwHx#!X~#>jfjYOFSlo_Vd9KNGK!*@&M}N*ilvfy@Y)1wK~-s5vx_&`O?7!@*1u zIlJZ?#Cll0K9fM#HJ@8is%l$puq^j{OW;!?fMP^&ocNo&)Y|1eW&QViI_JF zGl$HSIcMK;Y%#p2I4k>H{blD;bj%K1ommUy&|HzXl4f*IVhwbrMlWh-h&RK#MBk^> zv!|AMchJ~gcjc*N8Qpo=ZP*95fnJm{J|AS5r{D#5@-Bkru>Z#U-Pb=IxcVV-=;612 z-GB3!-8bY5EZqC!w?41_hucl>eelBG=l^=B^89=fZS%3&*_Ss@y^hcG*7+mb=U<)} zeu+MV^Su+zU7PaST7%uR`#d%`iuuNoxyi%R0_EAD8nYmL>nL4Z}gOwiicp#x&fXv3M=(BqbdcFn+w z4K6n5Sb#G@2MAgu&<*VrcLv0tIb0C|BXdQC(&(JoiUDv|{j-qg`YzV8ZLBuVAdeVZ zSBZ5-vFM+{&PtwD3ypOKPt@U0wEFmU4c#LqI+ z1={du5cKNrd?oAYRjKH7moJ6>xiygL^mWT)(pR}O>Mw3e1&0&ikyyfK{&53y}B z(2MiNhDX1Z@x*sFJ^r1X#~#`E!~+|jcrfp;9>{w9+Yb0OUdjeFf9+1h_+F*c79+!K zRfNp!g|}K@Gi_+<3L8dC- zRmy6ZY7R@l$i#qXh7tN2BjW0;Q02y8MTUr+g(v3*DzdqHQ@QvOBO8`Y${gjh2#INs zCw>vqzEFoD&uF2Amx^i^jd5KG^cbEDM#etE45M~N{9Iis!?o8?&9is5{F$}Z^SPz= z4*c0wK?90cHnbMO+Et(t>jsGHHRQ&h0FwaDceJNRb8(V^LmQ-Szaaed@jRS zV_l$>mVz0aRr3vI#Lo_YHssmMsEO5oLzn2^NMhi#8D{^*n-SK{y{QTs>}+6ukk`LL zURB}G#Ym)9H>1e}H5aaHDa?o#tdHRTY}yW5<+B$-JHQzl=^@Mxx6Cq~2VMUST%8q7 zgPIXMTmFn4M>I<)G^+ro)WAQbGFy_#vK*)3ps`<;4uJWhPXQ&YT%oz0TP zLlrrz9fvjLFpksWJIz^=nerEuzzpI$!)HUDfzN-EKMQcS)*NckVJ$d3E*V0GUBUC0 z3bcON4(5={u>&w!T{RHi%Z4lLH7sq`%L%f!!`O7h3!ZGv{6Sws&2+SshJ)~Dn60p7 z!=DXg7XC~i!e&n|LUT$CiiPnSX*2=sTH!NbRs!rD{8dAZ6^NPpYYTW6D1wGRqkN8L zuMcEC$#)`yfl914`f7_D@GC%7`T#QEt5)HxR2I?;n01C>&JbXe_ zpCvHV*NUGdiQR`$Wy=z&tP?2h21=^o&!A?9KN|#%9f!ha2WYzpn*HU90$s(id9t}U z9m;)SEO=_6^Z0b+webkAB(4{{M6yFrFgxA-RNm~8@d~b zG}{s$_DfSa?sIo{@#)$4sm;lqJ$>DEzVS%K1hQvjtL9pIxx2w<%W?@kOxPjGBth0T zZ<#6?6HA#V>8!H#%L3)kdPQU3;UHzt4#G$sBpYbbO7AAha_z0^p)(u5XnV@L%GuDc zWn!hcUob01roh3!>@2O~mMpZVmgPBAUteaPi?QS;jdg~1iM=;1wvP{CwrXekCn`W5 zpc|n36vL*sATKEyZbtdD-WBj!5j27FXGE~XBj}lRxcnJ=4H==J4uCVmmYGAp7>q>x z6R|*7MIjPsAhW}tT?8#8)`))Z#-EiQTXYNo)(o@KU``n_ENoVWVZtQg&klkvpmA`v zGUUa56di98Sgi|%TIXjg>@_>XdmZE}HAY9xCd(1DOU0M)XO|wcvuta)x4>tYKeLI{ z%UXfSc!n@y`4s0kC|(!3w}kmdYsn_avx=VuJ{RVYi52E0Yb*N#4ZvrWKtrCj^B_#J z57~1_RM2RZ)t7@mB@$&guySSOV|mcz5%SU@AaR``ri_VxMR z6Waz)?ixA&!opk6PrSJ=a$|Gl>0NvKZ~kla?{6pH`Kq=ikuQ0W^V@O$xaAv)hZp$IXnxUS3y`QTL`zcA|IYafnY z$K>Rb9el~z;H5XNZ0Wi<*K%a*IF20WcMcreHF0*^)UoYIopFH% zK2Mz6C#d!evl)EpaB}C^8ga_=PO z8={NeF^Tf|L%M`2(=O1JD1(=Q$#~D2yn)89wizNVNx$fpp~_%n9*5@w z7qf&xK!M4K&KcCqE0zef^BMxNLD{+k`JPY$fwbAG3)kzOu!yBo{zOl>w=>w)+r*Fe zd(+YGP+?i&lTVhfU5y0?jR*nJ!jp}>S-~>C*5GLAHn={ce66%2gdyuG#LR$Ykw6>m zv_fX}+)(&z#m~;6T6wI^D0ueq($(t*T6+6h274MKeU(2*Wqz%F@L1#@Znys3?_!sJ z*~a_v>d!jqIe6t~d=4Zof5g9AV*bq|9_D)@`R0g!;n=ocrEqgKj8Nf^dEHIQ07B`eCL%9+TQ$$CCn@*hDghs$o=txy_UWQ?L}>% z7v+$9VAe8u1X%jzpL72@$lD!siJe)cvA)yo&Kl?{TTDQPO8c>3Pw777wMMVV%uB)G zBZ2}w)Ji@O_$1-A9lY|1ej4+sGR%jwn9sk@hX&3?gYSIEM|$tA-{Pv&@b5m~`r6;T zI}v(wDtKgO`;l!kN9Si=-Msnm!t81?j)h*n4Zr499kH5hT=MA2Lk5|&#Y zfec4$TUr`Bn~e@x@v_op2y+z9tmN5%XgzCZBVF!*Ia_y*NKFi18eL)}(5)C>0DBQa zQzrbmA)z!|D74SuXw=JwKXbOFwhKu!vTeb|z~>^F6+Sx%y0|G+5<KzPxYu)r0#}QT~s0OSmHHFZ8hk;98W`#SNHvz@KZg zN-?ZXv~3I5wmfy;SJr>~tIynb@A?P7YWXt=nn6dx4G-P(?6<#?w2_alXQVgTHWMljulvq7GQayRuy+1q521hF@YsDB zk3O9L{YT)>8y@|dfLs+73)FS^vvA|bzvk$Z4V@+<*x8j6gL4)3DhF0F%vpuTnq+2` zE^)SU3#8t?D2^OikHep}&!7Npy9t3V*Zs}54kgwaHj$o#k9}j^BaU95EJdaH6+_h(6z_JW9t zD}c-nc2+gAVrQ}4a5!^5{F&imXW+Brvtc2#qjMHC?Lg^JRgwB~5V-uAQ*Wls-f|^}}6!ME#G@55| z-Y`60__HyBmahPc*2Rj}f}JscZYiKaPlgzAX#YWD`0TaaK>sY1(j5XD-JwYiodEJo zOTjGX&~@HW{j*4*RRt~j&#Wg6m|fqRE0C7|(+VHP`5BK3l*Wph1wqpguyCz31Ti(b--Rh)6sg-IU8pTot;D197Dv<;d+V(ebwpu zGL+0cRr%&;1$fasi@&;BKnF9QiC5%~H$uV9WgAL_^c8&RlLR#;v z2zptDdh#Uc%{S@C8oF_yvG&kF_`>GU+1XZXpHEJOPmH&p7?0A|ua{qxHDLN%tG+;B&tiJf)-kiZL$H^!jKKthEy8_ zT``82HFhH0o{>E}EZT2OIV?ywaCO1{}~4isIP03VPJK= zaATuq#x6q!tHRhs*Mp{20!<*mxha52?`X72TsRa^t2)}$Bd#_V#nstA)l|17-Za(L z!b{!XRJ9{sePp)%jfs{M3!Qt02h$A=@~uZxWFis(Z-TGE;80KjiC9>>s$ikJ#*)Hd z-sR@Zt`&wNaJ^@j--)@L zx0qFS6T8F8jNG$_HtQvp?c=?!x7fzQip@TYl`f0ctuzmCh5##eURiCF4`!Qn_` zG!~@|qA=k+kw7yX7;6F!1?nmgR&uM-Wdms)+N^BZGb=6@GVCUuj9Dva*AQb>BXh_V zmnD@XtFCz2S_8L*W-q&nJtR?hSA`srMY}Q#%=bQqQa#%IjdBNH4+69pb#v zQk<*U8QC+~Sw>NAOL1N}KPO&UDu4Y*ljFi+Y@dZZhfzU?7Wu7V#qeYhG(cE~MbLU^ z<;s>(BXUMi?UG*l^x=s?J3QH(omHG{;j@;(dlL=y&}O?i@Hs&*LOeZu4N8@@(lBT7 zUQP*-4tC?fEL7R?-;iyg(|#GMix&NJAWS7?KxUf+9eaQ?99ul19a4?|hObeE>jK?X z*8p>7VE&B$83YY{R&YHP@4}{lW@pzAOrmGT?fK^G+kf=N-s?xUzI|*byf2ASTFkY_P}j)?MkDB3pM62q5c zv?bmfXie6J4os!cUE}$DbQg{4MvrYD!LI-*DHa^(clTc09l9{z{_?AD5B%sq$KL%z z;)ZZkSg6d`@D!Dnf{%SpA3a<%k1w;#`hMb@uHY#Ws zbz0Wr=bgP}L3R_vYYhlF$`qihxL z*W-JhJ2%ySX0G?lw((QDM{%n-xo_;mj`_3u7EbP&I=O4^)ZTFv(YPq%nT-Di@tOUz zmtS5uwQuu6Z+faDxwUU-b8={=vu{h!(ALx_!EjqL9qSfPjFuEV0f$>ssX&K#Zq!FR z{eqXpgQ7kr3|Sy^t58;vHxq~l1xS`dLz^XI3y6Wbv=RelGjt!+(F6mr6do7A>i$^w zR9k;{bN@(l?`!j8v>kkF-~6dPb67wFoX_mudK9#7>Fi8 z!SE|+upnZ;G!_I4bE~jop4YJAE=A3$aDoR!rOXn5xdWn2u_l=nL~H9b%cZF|8+L)a z(K+kO!mDJ2&}@z_nx2O7RH#Rn8zbmMB9Kl-QZ-q*g-?GESB;W2>rpa`rL!YxmZtzO zW8hrA4oUL{>_?!`+JcaP46_C{wz6k}@(mfKYeXQ8MRw)dY(~}E?80ZCEPdvg&QRZI z$3UvNez4>_Bbncg?D^-|Ki_Wt@n^BiA9TF=6W+P1b8a`>n1Ar`3qRF=_B!*gUEd(g z-n@M~@K2q*(q`6j$k0Q52T{p8f*DT_?<#8INU1N$yNtmpU2ETEWXN+!UKiTsTCbJ5 zig%ONb4oAgD40T(QEY}_EKK6=iF2nu0 zO1E_m`J6Prt&m4E%4aPW@@zi+bX)nDHJ`@Jd`gVI{V{zB`Srx`<iedUgeg~SDoz~@+F zM{`3vI5$$)3UCH5H`jxsb%-*VeW24YYQQr2XkDD41>)OWmtauF4ydMuW`nY^<`A$P z50-^|h4owus@&o0rXK7}0fG2tG$z5$LY~>D9vf!?)HEW*4@8Nvx^O_78w-8n!ch_k zmj=V-Vk?b9wQSXxX!Ccs`jV}_uBOVCg~6F?FFpU}&TS{Q?E33h_wSpW2~_oRC%&?1 zus9ekZ302Viv0!k@aM+7qQ>Ip&gL2Z2YAMP_pJKXpRKv?UK}$vJaF%-2kv?H{y*FJ z;MX%A__H++eg#vGwcq+mMNR;PbG!-vjb27)FpULAGT7f0=?_-5c7^)k&+U!r&Zfac zc&IZv=qrkZi$*s-^GxPLf4=GQhqE5NKkxAeGQay!&UYWif@A%|U(0&zUMMsS76^>* zv?`Vzx(g*X!*XB?lPyn{j4L^Y1EZAIvEdQH+Q4DEp>Abo?^YVyQ(qA1jd8;p9{UTu zE?4mmxiP)&6W?6_gf>{bcO6XoyNito6+tVPHh$D!&wPR>_2{3UxF=a&lB_I=R}{6C z7q(Uwwp0`}mu-rc=Apk06l3+gQN+*XIq+wc()Gona|T+1ow4HpU}6&y0a2Pj;jZD=H*abRQE{8Io0J19fA$h!d7+HGGcTR<61lh->}-dUXKKj!3q|=1f>!Ko$g}uw zz@N=5EP631WZU@@5b#&iL+(&-!};s*H#LSE;<=$s2`gL+j?&C%@%onHbuecOpYh)S zkp%^()3SQ0zBg2PLI}3kS3l8DW*?2O`D9!9B%IYeX zGRv-&KXa)3ncdh^u(R-IbBV%C#Luv3ETDxyHct+BIJ zEIR<%6*F4|E&2Zn{_GHGv%^ZZ>}0+ie?}d>$e))2XD@t~*cCb7El~b!$+PH_y`b3A z<1ZhWdnV@0wekDi{=*3-23R4sHUb5&Pm{&-XAKx47W zq!rsLe^&joUPWoMvSnq?cjV7nz@>41o?^ydB2fR@SnS+f6~4OKu<@lQsijn9T6Twf*B7XqyOS?@=#WhBiUI#<_Df5w*su{U{P(V8SM3T<7h z{8_Oxo*Qb!v8aVM-3G@4ayhwq^^~?6Z#IlpjzseDe?GCf``B#j{*a*Yg?if@W>0k&{1(>I&yeCaeTVt#MYiY z=`_rLBqHQ+q8XH0GZJH4zCNJY8S2)>PId}xl|KWVZ681v}!2`}ijvZCSUAg?nzXIK9m9EgM&P+|*;p}toCY!S3Ku>4ue0LU!S z<Wwn@76k<{gORz}SX)`mYPj0-d>XbhhjN}=J;3}QvlV=W!yZ5{CETj-fz zo&hOedv)RFtJ|4xp?^NMlK|&u;4@n2o3AZgdu5)Oj22&haT@Q7v-mCV96!HZbjUAF zbsd`MK04iZVm>v~)!I=LK=2%|ZHU)2GSiNbVJtYL1>th|Y_!l&>u!ITS)p_~B(~4P z(Ka>T7-?=Z`sbEZAc{Nm(S^a&d&b0kW9#tAy`v{~jM9RT{(~nMBG>1N-`ce>dhvgc z{q606cYo7+?N?owKOKJW1Na7j)WT;71_O+21HsXTZxBGC$#W>2*`QZFM5&1EnN2t) zbQ<`4^H%~=F1?R-ni?UfMqsQv2&29#(3K&;+2Cb1qz3dVz{g}1!YHV*0LLCuZxU^nNh2kn1EG|1@>ucU|w@Zu#3!x1RfNVX(L6 zH$ao?>nMlth28KI&z|J%xWDLc67=2N2Xgg|N;4{Qnj5X?LCaC0DDKyyG z5jh(iO;Uif@@K`-9NLU!*X)DzcepJLh3-QO-P$+QI*3E^zLBxF_ROB5ui~yb44(x) z@0zs(I}WAL(sgmqW}HSYKEM0Y!Cn04rg+U-z_LHD$e))lBe$?_V{T(^ez>@_Y+Xjt zGpq69fXbGvT9g0OGr{7TzG!zG-7>z-SZ##j!k=j}D8yJyszJmI)Xt8cxuF$A3`17T z&TNFxI7JI=xAYjK%#$(;Nj8I1N~i5i0Cu*k68MuL1w~_20Js%O}?Nj@HTj z@vgBM-9cy0+CcA$t;lGxzALpru5#&Th`RNZCUqvm;1c%G-Yq*gtqjel2L<{8Vk=ol zvF0Tm5AWG_V<7+3T<`HMBd<(Oo!GkY`i{95CP&X~A3ZVKUtiW;+mJZF zcjEN6(Sx(oN4HMCws{go^r4ygv%BYBnoL%gbu^WB!IR^)!gZm?2%*8qxNtO;`Wpbk zB|hcPSY$wP0n6xwfzMPb2L=T{p0!eG>l6{-~xw(D-kN z!rAa=NHY6JDuf$HD>kXFasD?j~Hi5mj?rpfre8H8;tCJTDm~emp%Ql~I6p zYh!my1Mpe+bFhjgzk`>b-~ZPBJ!f|Ay7j`IQ+sz~)EuhnqPrs4S#~QyJ00-li~hNB zQ+aiMH7y9C<@t|%``K^b^VGNR$$IeKHTQoF{)`HG!~OScd{9~tuKM;@=pNYC*bjeh z_xH8?Q;MLO(LyJi2YF4n4O$SwpSuD>7(vIwgG2FMsmN^J6W`2w;+~xEeLLr|hYFr} zBIEH#^1l1pmLO=ZQSJxnTM%An?(5~$>DA+;1M)|CIW-lLx_eydp1cm^! ziZU3l7I>FvtjyWYD+|6LBRt$dZ!dY)m@5iicHN%s{>q%~A%VNU2RnNZbfT=dyP`Bv zUc~n($*SV+>Jnxe({xo8w;2`4ouf26R4UFAk#fiPSO6@36vj4L;j`h-oD~o)@ELn&h0-p01_(Rm%m{Qbe6B25 zf|n}`K+u*#D}2@ha5UZ;3Y;D0>|$p*RaK~c_mpodb_OHsSjnGN0&SqQa#&2rRFX%b!8bV1EXLSvAj+0rdm?i!*$M>n(it@@E9kOR%%x zXffs13)xx4>KyV%vG<@XTJF<$Zm1SrV`jcth!w4GEnF*_XEQM3Q2q>pMg^_r&uaU; zXu)B;GOX0ul4l^Nms_eAgc3-F&uTm1ctp4j?^-i61Y+ks6;h_sS1%JqtNvMQEVcF!>^mdqFXYeq=hMGVYtAz*xn_JJe{MrjY=-jZWrs_k^iuIN zrvS*79_!(vnE8uwwBqHJHD3ZdtL=tf2>CJmnM}tf^xjYRR+R`i4VOUQ0 z6*)Ty+Lc2?gYN*Jtq|JqXGi>O`U652MgQDb(N&g1PftbA^!kkCtj2{SoVA*dWgM9C zf2Iat3#()%#*qWp4v`rf{j;K7&N7q$ubk~!Q6^IvY8dp@EwnY9nrS&b6FoT-Jv$u( zL7$sxex*N{uCM5606UjLo)tdBpM`}s-Gx7MW9q+Q>@~Q$+^une7W~Uu0J1TuCa?FV z>S*Q9lT8g1NS*!l1e(#iod_a|UIL%hx`dk%R}koQbJa+!;J_IE&wX#qc5LgYMHwz8 z1NAeVoMgk3g7M?5v=MAyWQ2vZ9vqjd%=z}hVKA^OA6-0+D z%>fO9W|lx4r$x^!O$ODj8Q%;6(T*>)B4{l(+G#%-;PX(lf^QS}E6jFw_SDsl`Z8Z1 z3%@p-JTcjRY^?S5`S?snB8B)oS_l3ekA&g9qY?iw_SBe!7-h0y&Q5GH%Te zdnT~xb&)@d`qz45I1U@O?2f@Q-n$5#`3BZiL`y(NKV-({qQr|^E$uU?oZO;ggQlg} z%b(dq^wQEd*@euWXVJ>V{XM6aC0AC;O&b18fKA5|_-qg~5@;EPc@Bb(hKHl@VTiG? zVx_?r8UucX6&wAt%A1uudyO(If3`B|Zoe;$)HxjL!v_NdZ39n+62tR4DoF?>Sa+iH-(MzS-J|!T5LDS7?KQIww#$j4{64y{8`Df*hDvlCF4SA z3!j$-f}k7yT@Ce}(uk0Dgu&kE8G1?z{=a z_@wv7rx-5}U;d3aW*EW@8CC%^w3Aptv7AD9Y#I)dfg3|SRL~0~;gn=9f50i>*al52 zEafcNgtNMptaU++?#3wsRr~^f7%ZX85)}?v!mLzEA&e#!yb#+ORuO}A2so>3$1c&N zo#n<1x?u@PiWwT~Cc0cR6caFO4Y5iPZC=aRP`NZ^?5Rm+%fa+TJ(lqup5d%}?9jx!wQX$2-pa+c$S?zBJ$Q*1{<5CgHKi zcjG-i&7U4$=+nC~dnmtQfsU!(AkoPYBS{im+)6k^^5 z_RXcmAZs+wnx}xlS_QwlO83!OmvELt%Jh&W1Uj^gQ+fj=$xyG`5|iN#C9|nv);A^@ zYAE2)7PC+b^!9Xft+W@_q@8tV-lz5k2uM=EjB$`|s2NSNxvugq(N*O2(po^QdA+)B z#kH1Qj=T>2P-Pyt{_*hjPx*N7q4>rJJvTofGja2?@H>C3{M+B{Jowtpkk zUsB;Pw3)yT&BI+|^}?S;0u6bFW@F z6AHK43LYLb=FgTt6L9mwkc;Hb1EnDrf`UQNZN47%3`5#$dX6t_zxe#Vb9;AQ*t7G> z3;VZ?%m*qHEj7`G;>Ow{AA2?xHgPjpaMb2k*X5PP{5`Sy@hX0x0B8QoudTiBtIvMt z>uc_ZKYu;rJ73%I;MWlT)km+>Gv};9)D={qhHVZ-ou-ocw*CIk7fVWBiKP_J@n1>58Vrb2G6d4 z^qaIk1STtRzT50#Tgz|Vz#?dab}fIV-ojp+;hg++A4$i%wJ&l0g@ps4i`u$dv^QFMlS_P%ZQw;j?_Qv8puXmZJ-)MZ%_pXsPt8J}TTV^J-kOiS*bSa4Px*vDTk$j4cA!z34~~T@ zto~W9>q2j6vjS(C;m`hBVZ}k=$#Mg*V)`xmYxR%}+*Ow_tL<>m_ftMHemitg>gb zk33+w3VuEutYD1B%0^l?9hhuBzR-PQbH{9R1vd%il``SajhG&Tpkc^BW?2QjH(G8{ zL6gUzLr$SXHoXGj+O<+^l+~C{I7HV1Ufn?tSH_>Lz`jFo*{zgaF~qFdP=m={(93K(6LZfw5$9%mbVC>mC8a~bvWJk z+(VMfuRp} z`LmssKMPn^R}JVfeFhC)cHpxQd@V|5W@?l(Qy|FNoKog&v9o&^u^VEW%vw7*)C~MN z(cm-k<9f@VANcrJfKV!jx z|1&R?Kj{xz@+`o)F#>ZYU}&C0h%|@2O%ZH2r0rm|i`@o7Z6nb*9SKKU+7^1^&kZKI z?z!y~=kWyIK6-vf_|k0ki7gX@Xa7U$&!;Y ztk4+UGTfM$K@4*S#wvn#fwL&0Ii-h`QK0pTZ8f75m*q&HxkNIQ!1N=H3r8sR;@F_r zKI0;?dmf$hnZ2`b{%{MBnMcEa1Nh7gnihfgwrMas`8W5^Z|fVZ%PVYvJm(YuoCBMR z@q%v5-c+|S2M}GCosa$*e`5u zTaCT@6YE-Ly*EA7m|3r4myprHR(3aC>&g;B$*IyhNtf*+Ot!i(h|6pxvu&ymo*#;mDRz#!aQ9l~s67fR@=i+M- zD38FO@m^L}4Ja`XSot&X8QTreuE?R0_%Y-_fXxlurLuvmoCj3y&pX6A;Qu&p*p^vp17 zATaP*_;X`-v@uy<(zPo+4R)pr;pv?_F6`ZLdjI}pbRbyS<}VA@72~|&2Ve8l?1mJ) zKC{eU-qIS{=d0|>`QFzs+4#W&_dNZbudciQo;82@)y(_u0Yt-}*Z;+z<*v@?X`XFq z9Hhe_J{!1jFaw!80>jdCFwh^a?x5|ULDN#hsf4e;J3N&R4P`#~oymPj} z`+N5zrC$HNZ*F+>p6o~N-SF@?aJ0yN^y}DVSe$DD+@ZxFn&H}0tVFfTGp1Nn(<`8^ zBc)b}vS_V6?E;r5s8;~t#oY|1#^Qs`N!lTJ*(jowKMT+{L$Nclmp^j@?&H|!S{`&& zmV%%=%Zk9xsp>NLGeT(5LYEe)HAh!@5lw1P-}NAkt}H?t-BB(c9pTbEm?|Kep-h!o zb-#M(aAQxeJ*Bcn+YF%v#sZ}UL5ssPWkweb-;S2$Fk%&XF@vBv)m$lPmn8(T%ED-Q zK7$}uDY|6^$js4dIrI)op0!3OG`$Eth8wa3-7=of&|~BFEc$AX=Z3m!K#~oA78efi zGLPwzMtcD@%4ZQgQ$U%az7p$8!K|+g1q4gtvMeu5me@2I6rT-a!~uU+<+I444SWVT z`-|67$?z4eWymVXv(jd>N+>jksH0ItyK-oS&xSb*BquQUV`zDGzV+V#LGuWfKcjhG z%AZ$>{uyp;ETC2Ytd1EvTg|iO%tDy4-N=1L+uJE{c2Ki56Sjdd=m7e)=dO)ptZm)& zba?GE9avrzWQ)f|i2!Hsu&h|&GnClqmL2Ib4F?f38~(ge`7`8MY@hLwHbfegvLa~U zGpv|)gdXz^Va}{ILt=xPMeVHQ+1^HHQC6Z5(Y1ha;m;zj-XIMP8D+W1o}K=KRnmD7 z(4DR*=*ScPYz53Qn6N!Gfih%UBNTe$GcsH`^b$voC2aX=cGGe9nrH2)<*3zNI56J;I9sp`?Ns1w;j;!_1ntDG1qT2Yv zjQjDiiRjtc@QLY`ld~<#pJ_z6v!gLtRoUmO7?A5$b7|l+L+%0OYliS-fH2JsUH;4= z+?ZJz@`$g-!es75%FGfc2?{n(q@Ej#`xw+L{8@Vx8u&~PJ~J9*A4JrFDgrD-h63dy z(Xzp4&WjVxug`VDpT|Qb^b;J9plX(`hys~0a7MR`Te6W%i)vaZw44$;ZTK@nWmP_N zR{1lt7e2Ft8b@0v4Zt!O*(jNf5wwV(4Sa?_i`R!~M=1RYea;e-=W@csgD9CLuRRBc zLggcYvaNCdj&z#;;Qp|?{KQ=P#BAimLd(f%ek~q8GSfGT&<=;^NaIMepZjMAA+8?( zjTH!b5gl8G3>GFNGtkhgNyah;$ID%Iqbuy+8K^7vCw1P z(=JhXyYfPwt-LDV<^0){QLro@P@S+!m%RYliCtF>ry%6>N}VOS6gw;I)#MVkY(&wH zM%pZa48t3j)C9%&LP?|D))tUqi9S9rCf(~e)U$G`Nh}&f2yMz#5e<#!P;21NKu!yp zxsVQvpgD!-GjP()M25mqV%ikOOA8hy(3|-D$rSN0B-Zo+^a5LjuFT4x?ID4;?2fS% zd)3GaknhN!&2GB6l^^S&@Ml*Ytryk2XI|`1c-PzTKxS&}T4E71n}M)dw9Ovp4R57g z;&^VT?71)x+YP1A8bGHx3~kD8uPo;eG!O})f`$x3o(H25W(I!|B+&XNM&4{C&;@@Rp&(jg z(HPeY_=P!R!9k#LTU8AX9*Cc3yLxc9cx_?i#!KSAfdu->Vd2j=U*GxTQ~Q9=AZW{< zF@;78jS+`RpwB)x^5%2Wi15O5lPFQo>>fF@edy$t!B?kyUzzMWG}6OI>()Mi752Ge z=FB~`Rn>OZ`T)!DXQj;uq#44W%^*oJod;#q`L(96DF${P3Uv&`T4>w`iyjC>##=il z;~hKGz32AKqYFK~tL@sB+VflD&mF!pbn}zWfA~ZHd%x`$Iozjx*M2>4(j2D0`l-PB9R_e>FR0OCZ@Y9fL5C>F*3|TK$Gz&!->6%)w%ElDvS~4J6 zML;a1UQcnBQ!KHtMK4N{0(REHS?{*CSo6BX&M+BPv7DiNhEv{3U9RvB?_O}lS3udT0;T11i|AF<+)yqn1C`}#UZQ6*rBfj zGp`j*3GwAfT>h~4(yxXteuRn2z^y;@{`mKkw|;W)=-<7$XYZBG@$*{;kM5g3wQuAN zOvv{Fa;Hx1pM%rl2M&uq0ifPL3xd9IVC$At-(akNu4jCEdKd~lmK;F{JsR&HX_ukq z7>JW)M0!LBZMy7X;|y>HFYACR6X5X7FbZKK1~zukE`kza{We}4JP2B7h9vjSpV&T!NA&q0ZaE>w zBU{h!+nx%w)~+w|=adHWOPcbF>N9hFIR&DE21@4@Rjl2J+!qpy1qTx7-0wdVuMG^g zruCk=CBU*cVE8(f9%IW4F6N#kA5M`}m9i?Fl^(|%Iyj_KPc188iKv}H&_?0RSsh8g zkZ0YHj6!KC4t7gHD3$bg^#;0<0h*2t^|tgkAT zbLS82IkRW?*3zosA<%nQ`zRMzEIS8w)pN9Xt{ZT#*x z)_r{i&Ku8s?Y@k!ePPWb_icFee)uzv&}+ZEB6mY!SN&8|XaxOpOK?E=vw_U1;9yIL zKYtiX)^=dc0f?rc6(}7ZP9?T=*3VY0dG?uatXTc6uW$O^mykVg`u5j~zWLScXP(Ml z^_`7hzi;znU)l7;gB!oK0{>@AbPaiS__JZTO9-ule--oE)-zqHb(&5)1lVwC(LcNV z8Lte3j>XT}Q9--(c*(N*sQ%J+NE2OL)^X=*j~ykUNA=I9Q#_xS+CF>yH{j2}X9Bfz zcXb(mj7dUtRg~h(fg&0qbX!?|S9xJ~MG?_kUffez(p6bPO;c%JswB6eY)d1ar3MWzMixm%$2lray#s+Td&Wb7T3Irm~!tvYgiPT$XAq%ftGksWMNau`*AM zsZn1yRf#J|gArrX34gAyEOHUFU}Si*L!ph6vpeKSpws>vHDdTIq*}|2=QG$@FEmvC z3}IGzvny;C_^dFQAw|$$I!!0Q7OxU{rAD@G=&o3lP^=Rny*wJ;EBx6yZ=hIKk}M3_ zxMx_MvkIHVPs12-2$wd@nHK)6qlQI`{#iM*w8pYS__JW=jlgFKqk`7f#m?p!@~oPG805;Ijai3?rA^41n(Ho#o!Q;XpJC%11O7}U z{JFDqqr;z3K^y+ej=*R3>MG6W7D6uU6Siz%vLttb5>4~MN`SbZRkhvlIS<9SlV*2mRrKz!;*^?-L{@WBP-RhEn{Xhrh0or^%b(@`LCl|5@x>gpb3BOnxmx&h!Y}Zd*4!`%WL6hw z@TvA7E!IHcEQvA4Q1UET7$Xk1KnQB63bC%5Y4F_&AFkNum9$XkL=O7rl_;Y7{AGqe z7XzyWK7)cW-|&^u5{htHip6c{7Sid4Ma1c$XmwwpdalubZno*{WbD*b`8G1{+Mx zYv=F;R?iqUiw&}oa8tuv;l`L_1aYV~X3?Npx$h5h3%{+U9~_N-n0zE&F%ZppX}s~+ zYzO|&Be629m{AnNpGET=7BdQHEprt?%M=rsZ_qD5nBbN`bMv5JXNsZ6>h^55GmrE* zq0CtyEld{k4dcQg`e&&Wyey{Bcl$p(+l3KJ%LRg4q0k{N6Xc#m-*~uW&tPkRw0=Im z>EdF~>thXEr+9oOb!x2f?0ox+L;d_f_{spB3$!%CnnK)z>UHOXG`Y;zSV zGtucWGG_QQTz5GcwmpiVc~tyslVvn`2^{u5dfBo-V~8Aa_fp=PyYRK@qEYjDcDze_ ztgHR?7LcnH+FEV=&3a3Z)s#cnwMQwfIW;0qcBRM;e-4L1$^?%Bij7j5dVL}6tF{|< zHOQnyD4_kcDxcPgdQL&mM&Zm}OZYR7behq)vttA~G-8q1NIcqEQ)Zy9TtVoDDxdE` zl@+~y9)Df}Y?T0e#l!bN&|XJqLx$PH!d_v*9_=yv>YCJ86J`?IY02>N9y_E71rB5` za75koYmc|Jv+RO+YZ$pTpj%8fEP{qPTmB4rZY;{cu7bnRuw+Epit$|dTF3_d)76jHSpOYXca2UV>nJLAUY5NJ9EVz z#>=p1h0n^L#hKZVY7&BCMa|3=1Ra8J$5jr^qpNUsaP*Q#nPOnIT60+byj=fG4-~qs zE&y}J^+Mq@Ekqg}az|Yd{yf>z!SBP@=0eZ;#g=TbLO*`+xQPo4*YH^pBmle$#XF_YmWe+n<7qhu;2Z z+~ubr-NTUIvgg(*6VV$Df3*Y$0gKI$l~n6jEm@Q$v} zUf$J|0?}%jT}S3x0B&4ZZ6(w7*wj!@ZdcYGT6*Ybl;9=v^RcruVN`=kJrAwsx`_Tf z`2lv{`Xv&_u6KUbe&_x68=s(W%WQK{BzgszYP8G!<}c|h0tD~X}UVob82y( z+b7TNpE<<^g?lGXKR0`3|CF%YeWHTCcyRj4bGvp8Y#nLro$cH@)iwltCPV_A>cbWT z1g+-G_%nludtPjd_%N+PW5vGzY3%UWd}QS z1qIiP%68$-wvYp;?V2sYuFm9Ocf)YirY-qTudL3<06}B^41BH<182eMhBkwm#a_dP zcG}kVSL5KZer@fBEZ>IAx@VpYuX?DX^vTggZQG9jko?JCl0W{e`O5E`u7A{a>4WAA z|2LO-BBs^PrhHVdeIQ?*xZ-DkEkpVl;p3n=k9?*Cv~!_ zth0FAldv+aP9Y)m<0i>FS0?sU`88oel zN}9>*I^oX%VIp3xzgh8w(DB&+ZnwAnVlEcHrX? zE%;&`Ai1PQMzilTxJ7uVGk)YRmZCrZ0JV{_F7Rja@L;JUAVVb#~~hd-}- z^nvw{u2}!gFRuC8{m(wUqN*_38QTU`ZVC+Gxgjnb8o|M~$cVUY1bZ8NT}BHn`e*Uw z2#mGWZ;w``R)6dM%x^!u`MY1+^5o-NzWw#w$G@@pdykc_{(kloatoo_K4Zjz5ZYzP z3ZJ=}P?gN^Wa&}mu;zMkq1G$uwYlZM+E43Yzm6JN5V6ag^*%x2&n`fg#C^2O+EIFJ zu89I?S|refI&WxhhrDOth5Qx%3};5?j0C#VAZ3Nmv~6WY(pj-Iy2^`)?h1!OBbn~1 zF2OY#QFOD?Qo6aRd<)pQtt_{-G_Rvn7HKIj zaH1lwg^=E}nMD*QlXBjMfvYI9qn@@FN|1A`rBYXVa?TGiB<$ zVOcZ@YG)H7dxk$7{j=a@rRa*9d31Hr+(js8+CW_)y0MBZ7eULpK5Zc1$a7mhk^P&tY zM}xgd{5tds!U|Dq$4WNV7p_Yctbso#a@ULb2Ic@cB7R01YT+|l%_ZSDLMusDuxxUN zKfB(}j>(4S{y{*fbQ<_fo7%j-G4HAHy4Av&<<7w@RL3A_A-(y|t%5ED-hewa1qKxB zy@3vVh6&SY6wZ$ShUL$Solz#swSZ;0S_6L;FKF@Q(0Y+iYZ%Jy$e}HHCJ`uIkcl^l zVsMHf&s}AiET#U>R{z{xo`?9kyR4wQBnJo#woPn$I+^(c1<@8be{KSB##_V1$mI6% zt~}H5=S{1n(vWIN^wFK`^k+TG8U8kZPK%$Zmnnq8XU$D}4=!y1wUTF-MSJ0Mnog$~ zvd5Rh@@MbpJv*HOum6S%lNC6p`LhMiTh^sCY!8W<)nKk5)V!~*a%-pr7YI-@mk&`bePLRyQRZ9g1XU@Q#QFBlffVnqIyKl4FT{+ue< zI1sGZ>MI-$l~RoN#S-{z`7>Ks{>;j{zV1$|{FzQYmDo*0t9xrJ_H~6X&9~tBe0C-U ze?B$Y1cE-XwSFj2(_L4wHCWp3uk1%f9H)K7xEz zPOJc#^T^8yRszyT{N*5MT~^Ksd^X%zOf$qHLkuw>z%G9lf=xd?7-B$oM-$ck(cBlt z8&5CxzA_Tp8m|!Q8!Q$5vr$dMpM?_B8kn4Res=vgy!=@X2|W&(?G!{C`wo^8C9}GD zxFFhDljErcH00TepQ(X7>s^G}xdcRuC5T*NC{R5vcFM4QT%h@@)q&8KQ=@^CvqQ(H zABvmmDwtZ)vcky z`bhiN8M1fuA1c=4*y2@9g^=OJwD->i=xnEQz{d+><{; zZoQRD5HycAY^6}&dkKRfW*NT%(1q#%Eb;%M4ZhH++w602hd2wI7;SZ%m!=l-Y=W&-9c=r}Ac86=942ck(~!bY)dG{)7s z6ik~t{v-mt--JIaE7lc6*bH-y!p!5spIujHlD=@FKa!9&9nCW!THa2Ioo&l32Sgjg zjpdK@fS{2;BRmE;gP@f{i~j~L95r?LZ%nmzA}xMtYT))ub2na{z4iL+m6vDVK7#GW zzFSA|-`Gn6dgcw1;Iok( zwTb>Wr@IF0Qz)4s%uwjYs@lft8sh~W=20j#{k0Jd$^EgmKwOZu0ntshVFA&;cxR|# zDBe7rXc>+-55=0c*0&AD8^w4$+1MhvppJRi1 z@P8hB5817t*N(S7>ALkH(rCaYWQi7}tmFiy0cuuaOiRF>v<8|1CKdR6Q?L@25#%5j zTBb16VIYY@4<-Ukm`KP(*TI7_Ho_kjH)9Hz&W>^<_Yd1;9h1|^ET!M%7PgR3L(6oK z%W^EE+(xmC*6{LCHWCaG4C!jlsNp%%Z-~ z_HoDck2~J_P1`$v>bv#9uG2p`_x!#a3+?B&4_-h&ynF1#?vZl`7tb6JweX4EGf1FM z?VQH80!QWfuKuA^|7hFbRLj8DRPSJ8H(@RWbX+)~(D3KJco$k_D70S52Y+^rHPYH< ziT7Kev@0u?#3-2+Tkv zfd6w_xCi|+OuIeQ-CaN47H%zClU4A{O6YOb#tj%jtE5@A%{I53nZ&~9s*PD1be3mi z)vn*<-}r3J>TlG2@4lA8EnV|Bf^Yr5;eYq1`nUhkbros-FPbm?k}oynGYe|ICOT(= zgn&P{U-~(JG(ivVf8N9TxgeK|L~ly5zK!)Wq8|i)SI|!nWjc|BkEHw(Fuz;aOFu-s z)wM=HM6~*`WfszF#MmOG=9iCwy0VBX6=qW@HcZ$aiG%`OnM4mDtxLJ7_Xb0{vQE+U zm#j&FZbZMX&)MkF1CZ!vmPB8vu1Tu}T5MM)(e=Fv#kz=g($YiNN86+Q-d6P6tohcj zpv@h(L9+ID3wetrMQoAaY5w~M(= zZ*psY^R^2wEa13)^3cNZopZ0w&Ad20{>JRqmv>I%!qMN*<*)8e*7YJnj@Psbh(^_n zuDH4-Se67ki!(+^xHdlkD+VklYFh}=LL2xDe-;E?CzcwP5A*0CVyjiIGdBR58o03_ zXn!Z&!*9(U&>D46d>THzB;NK_VOZpIZ#21HHUdbFWpg5f+;BK=r%k$ zz|mEu2&cQNONh?u!nUdcbj!GBs7pq?G?#>y5X+9@E%D+lSV^OH7Qu6APHPz&RNymt z9!4Lq=+?4)Ny_qVE*>D_N?n98NK0uRLr`cCbW2rHLuFCD+HSZ?W;io=8D+BI=<56= ziR;Tjf)NMT5rUwjRe9=oOpPFD?l;8$*$rjRv@mnEeO3)K0FkXb*o@;}p}1|Av5ZqmGtimuH5`vIu!amOtlZz@J6@ zj4kcm{CNp^mIB;sH?LW0#Gx$u?pA3t01zt=6V62C&nTZ^fQbz&8*?%+$`IgOyq?Pk z+Y2^{(*64WBZu+paQHKez`6n8O1!NF2Me|oWzZ>L-1u)WR~EK2~ab06*$WfIS6_Qe^w}M z;4|p>@8!>%6+YuEEhqQJ-*kkwAlf8qAHC98aHJ*BUc&r$<|?GWtJvkwDuhlmXO~4w zztUz4pGiy)U#UovyShGSmGyt72a)jBK;cBRb~0Xz1bQMCm~;6v@L4s_uw3QO(!=e9 zv48}OS|!ki`YL%|!k+=K!~W_aUuAzyS#x0)pCEDG*s_*D2p!w}ES-a)O87JW8y47l z#m^#&HkT6O225DsOrla}ZM7eZ2`*2>KLq|f9p3$i*==2)!N#?XW`EVF9V$A>cEhHG#nU<1Py=2+5$x}L|Q1cyq0)iBw5uH-Ev?w zab|b#zV6bYNV)Q75nU#kC1Qcjz1 zd=7usO1ZeuDx58UHqI3W1*b9Z-_M`b<^lz>#@z@y&6c&_yNgSb9b4wRQ0nLNXV3bw zxPx9vAkP|Zr!M&4u+_Z;;ksLR6Z*Z(T+0+YD+Ct&8+NET@@5Swiv zlt4%{&$(1f?C#?5V2+fQTe}w#>eirUG|#kh$f#To2QZZLgnTKq zyZMIVT3=9$7`FMrkooo-)?E}}>o{tQ?a1nuF^kLKzcTPySuq6+L7UYDTCOAXh48pQrL0yMmJd7l zS`9ZMaplh{W;Rl1P&4p3p|WQ=e^B@{Hpt48LCU%m>{{_P6q+7y*czRJ-?A}Y_CcOi z1ksm!6vhL0>$C2k$ui`Q(m)qjSBlPYxWJY=3#O|Mc9zbZ1A0FWg=m z0WaeMt^B#UI^^(YgP_%d1MCcZhCIWZErJFzZ|E&)PZ+$ZS&aXwWduLqm(Md6h z=K7P7O4HAfCVDE6zLseLIVbFWOPo6RA@F1Dh3DV;4KD;0GD2OWUBOYiqw z`mpWRAG&UQ*7o)v`~K;Zy=Q-RbN|HY`QEd8CeH0&z`p`)dt%?5sGxU?qcV2T;M~JI zW~aLQN1KPH+DFG*ME^XL>Jk5E6X03=H?Zj-ls|XJ#2#5KIE?v5qXUzD%@AhCg#+SR z*MPl-5^43INYyl=0S5Cnp_C4_=&08BC3^d!{k_Q!j5t~&Z3B(nC${5XJ$-m~{M4?w z^9Qzrpp`#c2{fkG$9IpO*}s50G&UoLcTC(kG<)H-L-Rd-{;Z;!jkyS(0nylT1h*7N z@=!q+lY^jffyRP^w(!}tdCzXZ_XEFWz%K{GhFYO9@L7B?FvN&6JFx-5Tm{5BIeO zd$<{}E7aT9Jl0T`%=y8}(zUD0GS-%72t~&Wx{_-I*E_Oj1p#s29t-+RCBxcR&K%fD>6@6e6l99l2@GaE5cKTVp*7JOlJ^;cl(mdj#2&F=@@MG-UwETyY)05N7apE5n0?x=^c zJtXQV!nZ;yQKn2f4NfQ5dJ=nsb<2>m*RR)YdM*-IZu zx~|G=;Zbsfnr-gwVWN)ebRDAQQG0rCpnU#NekbsS<8@q>KH-PP?+4&BzoYo}s{8gw zY#9`{cj*|Gf!66lwApEz;&P8TUuA%9jU<(qalR7Ms-)h*PN{GOa{cFStZc^;t&WLjjlR8i^+3s ztDs;6$)ZVic=A&ItomeS(Jp@$Ol|bfB&>jgM{Qw@6`BG)=&M6z(NK{OF*8DI${^d^ zZ>WYI4MsjKdby}K{$+j;fHLl`wj%iFkrusSyqDT)M&eYjHl za;rel;rzN(WM85n{OltuR&oWQQ9iGE_yIsPIC|xmS7fdFUUOiiIndu&$2V?6je&tC zgP?)WxIjasjsCeGBCXCF^kc-4N{*)LI?GmmKX3Ju>%RGw%*Vg7?y)az{?3=P9)C39 z8}Jo0Z+P@kIP{+Diy-KG@@EU5Eq`{gEplkbikU<)FRe0O!MrX*1{Z^uvDz@+ z%Yv*u1XxxO_-q(;8VOjZ;&R2Qi&vs@JDVrP&t zU>P(m;WBEun$TEAlK`KUKkJQqaAws!D^*t6GdNmIIYj524g;b^2u&qH;*eXpClOC< z(LXD!W{6y*&hDLqN_wToguvvYjcV+yvS(E|3zSZqY#3t=1EtfD+1xg$@L4N^#cS0L zniUMAmOBT<{MksRg>{R?G~OMX^gMb_%u*QQ3}Q50BF-T)r97K}KQmfimf27Qc3y=h z6T=O}&z3f;_?dn}@-6F$q(%-r*@K|ns|E!Xn)?Us4TBhTXeBGeGFOr(vH{U+<5{cf zH?M2T&5UQRrXM*m+_Era%Cac9k!QlLJKWd6JiQoEO#BU0^!~>=xCvvkU-}P+@_v= zG4Y^Y%r`37Ld-pSD)S^N@`XH?6!cdV0MBuI7VMn)6#8eO&4v~K4eb0k0kvD;FlSfo z?0{(ZQE;>y4em9O>OO5X>K00i+OdNO*5Yf?@2lvm zDQ+sjd^JPA;=y?%n)`!L*6OCB?2$mpuwO1HMEne=1wL!2`38o}YG@2@)c`LOhQ0!6 z9b01qY~_kQd$ZmkNI6t zpjdEJ3j4(n1EY*6cFI*lVXT;qU|6`TIAf^JS#IkK)=h-{+$yLNXfrAlmy-+!g(r{t z%bp*KzrJm_KUg&2FB%P0kH*SWeoQ+a3W@$1B5mNafxwP}npeRwxOs3i>E{m>wGl%8gKsYmGo0CABDHx1YBaNmVGzdBkrJ>Dn zF}P5{v+`v4EswIM0m!D90^@_hnkueVyzJ6u2Q_=d(pqLroB21Axw?zWryDlHplP$*J{8 z^7X*mG;01wJ9T9YE0p*0XeH3Yv5<{_a9M{`gK#ZYbrM6B6~+opby@4uvSmz|DNY!t z3t_)D?9j4=Wz!SQVZ4vzih{kn3-vXjqe6y_>e$^bDqz{10i$N2z6L3~qjD;5Cpn?A z=X8zPmz9-8cL%uqQN-0U(Ht`UV=+G>eWX=uXetMzacTMK$@(!YYB7K4i-tSO%aXaq zTG{2#a96{P(*j@%a_^Z~Lc45K#K1brkQ#T;YMFP7B`YX=rd8ytz*#iL#_~eJFD)oo z@vpXaSyrP*AH4<2nYG6V48BML&jOGE(MX-~%1}=X{3uke z43~yQGb*S#!i9H9(LYD!azKI1;W*@(pmQkRFc=Z7GBpFydT22B6~dp}YJIFGo*t%> z7G1QRuKZb-f-NgvHq2QT2Rmz}U~NN~!OI+2k+PC!NGu^f(oTqXw3k0i9*k))5&jH$ z=HfpM957PVb;oxaK~gfGLN=ifbXK>eRZ@O%tA=p7{Q zp4>}&=cuTl-#W5D@zob+2>3Jk={;MIFAksHx%Kpp(Kn}hj!bqRnd~_>H~8FGdwq37 zuP+2xZmbG5Rr~9!@T2yFppCsov>n3iPqg_H!khz<7Js587?r>^+GwFknuF2SaI~Q| zFqmu_ZRws3SM=nq+SW8MfA;_A{OM;MKl)?)?O$`xAh=SM%y1#3&cc3`5*tdx5MkMc zq8sHHUv1EJ8POKCz5X%VdLI(Sg8 z#WG|#EfaN$-HVM_O7|sqpwrC{;O9JQu}-ID6!Jr&>##UA-lc4%b~^2i_u*GiED?3z z`Iw&=dQNHG!*Bp0LRa4hl!1aREMjpYO_{EJh^sbqodPyuijK05R?_N`^c881{sivV@1f%Y}^ZSk;{<-(<_xHVVk-xIPwAhEfQT&q+ zP95Gmjj6?ngW{-sX7}v*gL8*>Pi|}OA50C6v<;3m4Nf)nB zTJS8P-pD9^5$iVBH4$n$k*aIrZZa+igRG+XB}jy_A|!_5f^AJ;n@rFHiPbV3kNa4> zeyFd$zrV4MYqs_c4|Bud$sJQi=4RjAF?(vywsZSu&Oav-Zmga!9a_9_U;$C|#pf0; zzp(SvzS(0tr%vucqqyhf{++$amby(v{>;K~PMMfL=awOU#)ZS5RgfsG1WFe?n^C+r zqhx&sL^o3G?}8CTV>Z&Q znJA06H7+bH8H%|r@xajn!HwPm6P3zF!9Hm8T&cFLyapMZY_ zC(JKTt*4mvmxTOszWI?j|8vhN2>Ry7-FJRh`mg@j^45QSYiH}7x$xnc{-fJx`6{X_ zKDs!z>&lC}ELD+9eF$Nc)-Bh%qH-nN=Vt*e@S zMe&w!FL|&O33Mn?SsyJ;%3jqdvDG)j*hee4W=$i07WiC^CAHX1VN|b4qSV2|D_k6<08TnyBBZ0 zuz&yfj#zb1xI9vq7xm|fgLF90UyzU zWW|O@9$NL#itIIOS`%Y9Z#4S)XjKBO`scI}htWdQY2dTbNC$?S{QVux+dJ!@E6>bY z^XLk08(jVP{p%llICq_|zxB}OXA3gEd0)n3crV|V^*9n}WY0*T9sRRM0{syE@aL>2 zVbm&(7Fey!)>2%7!zKhl8>CDkx$D27D4SU@VPVl;$o!;NmMrX=`w*Q1?+_gOTMvo; znYoVoT8%-LPL~xN)a>AHJq#FJgA?9keY2M+pMlS~J>&UoFtYMwawX4-lgE9}ZZ9u@9!pYD$el{uV5k9G20qhDfkDv9pXt$rex2(mpAE`(7E~y0 zMA5Ki__LKd!=L%20itno7XEAzG``SA=Zpo1!e?R2>bzkz&&&C2u6kctxFs+E64gOV(obGq|v-W#iujhujd2ns07)I?} zM<^Uy7Z>wq0o~we*~o>@bUGn|XGd;r=r@nz7tMh!e@>Qe!ha)?yHen@2>=}wy3qv4 z&cJ6bB3uhDw)`30CIU{vRY9*xZg#?wXLu&48P1%*fFgTkY!d}*=rOS}k+r6A%SPJh z#+7hgI5Pmby=;qIK}c?7&m>;{tiV~Bvu!DG(X=R&4OJE)G@<^_kYNm&l|O51i1cPE zWk)DZg)O^@ZzT@~5nvW2;J5Q#O;8<;=$R^E$0 zyXg2X1ieh&eAnpmDO&Gpp25z_ng0fV&RXr*L4(9UPY!J?IFvt|)>v>@{;Y{hp>f-Q z{VwOvjthrNiSMfMbS~$~f2{`ueXqG7Xjxxe$|aCA6Yyub1k>p4J>+?v=DfX`MKNz| z-sH`>8T>T(!w}%}NVp8N+t)o11h&+qMjX{@uirVt;J(P+8M71IpgSTHE!XK@Y@DYB@M zjSGjg@}m<8H0z8dYfujN1hZb4s6VyXJ(bL+lQWC8G7ikfgjuxBkmqR4a{esEhChp* z*%d{@tHHv-O%>9LcT%LE-44v4fcWCu!XfuYl41g$z}TDyYjfp}{uH->3TXg!2H zQr+vX+T9sA)YpANqkXeTF%TgotSPtGu!*>L=UzJ!?9YZuj-kX^Jg)0 zcCQZn2RZQH#id!?;m<0&b^V_$d?xt^_jUNQ7xsD?uao~H{8^`@5v~iL74UjD^5)F4 zkIo7%qxMd8&f`LFxUM2!LBwd4LCQMh-Ui5Atw8|`2i8;Rf=gP%ioFFfDK`8WQ8fHn za}sBwx=eepygdwO@bG7IM`2uUA%s5*nKaz8*H?`MTClJYCnv=SS}mZRRzdDxZ@n9GWMRAz-6f3IfM2b#3wjefoy1~f?X-^y zpCQIeDYWN0LM@hwuJZ=Pn(L{S9Ly=p%Y{Fa%L@TS7ZvbtHyBTfF-1_m3mA?EUmWW> zzc6!ZVfg4m*K7-aJRU^}4-MeBd$glE#@0)0WDuQ2on}5wJ!jFZm$*p4MouOC{-3!Gxi;{;?_(&ERIr@xG?pFm0zL4VM~6QHv^BT5vP#RJ z_YU>kcy3zxGsezuy|(?GV`96({e$nF+DDMw6m@Z$Kcg!) z7YKqNl%miwDkR6nr}QWrA+ZEQc_xn}+ArwCy-AQBFfwbhj$I9xY5IXGT1l%DS)5#% z3^|LCvoe+B)G$gv^oCrA7$s+vA##G8piEbzpI`<1NCM}fQirtFx#YSLHCmu8og{3e zdoij7I*S)bLQi@Z!`XBfrsyIR=w4`*!A+WLC+q8L)C1`G$(d`*=+w}ywT4`G=Vw9> zKWCtpZpR})NtqHqd4~FoN?iY$=;4~ej+>vh-THOM%|EyQ^9)Zt1Dvnm#OisTJk;_of7$!$L`|1aV z8-_Ro?h`X@1F-RPd*_cW&K=t^i^BQ*{`s>9wjbX;g(C-^8y60VOD%F}F^JwfM;uw0 zWa#R_J+IErHq<4mHWY-ji+tIokmtH=ZXuKiZ7B`sS5$4xEnKxe@7dLPD_50o$Q8Sc zNSC#7MyL$?C7OJqb2jD}9UPcPCB{bW3`Q2kvLa=As8`Oc^q5wmG>P_5K%&^0-12P_ z9_^?MMfiK<8Y& zDH{Y`nz6ZjV-8l&^bqA6zE}C|7t6o5A{FZ&xbuGFzlA*iCUW_gEmuEnz4vTH3{aF3;pMXKmeCxyZTk^Lp!*Bh1;P&qd|LMBb_cJ{H=Ld2YpIFt zTgT?c7O%aw8*`iEd*;tQzXRvzmnSEmAKi9jJKtVS?Ck9>+R|BF(vhrbk5r}NRjqMf zTfDj>TGx^V&3S(!MidVO>z8FNSm4~~IF3U*>)&Yap7CLU# zFlT>ZG*B3aLWfJD>L21Ojv2t-4L@%V_QvXZ>dISR8Q*^AmFLeK+<)=Fo|C)wUOu$< z{DJ3M6N91B#+tlnFgF@34%8I{YYMCDvV(ywwSm$$xODbY-(U6U7tudMp4UCHV*SGp zaTnpr2Uk>XDQ}EUG}Z}!20nZFvruRpIYjU*q5N5Enj_Evz)^i4Yq~P@Mi~c+r`}k z_}o)f4pqhlTG+COCo6MS{;X`7Q7e|#QD}2-O}R2>8C@0@UsLZ$rj3KNKxS?>ToOQL zgQIDwClFw}&Kp9i?WiopXu0FRp`IJqZh)8J&ka==GCQ{i8utt_;t>9fn7KM1u#EB< z`0VA+sG#-QL50jJidIt&qlgyU4T4eS&$OZzE_LM1_EC*E6iR!Q#@bJh!e@s$8|Mwh z#bTXNgw=*PHp{4c5uuknYwqFC>jQ;r38Q=#{;Y{J7YglyZb8s)m{Z9mhO7g=CNa!e zj6pC7!SGo`(aOvbau;vF`56-on3zhP0dxwVX+d_z1={fEEo&VKwDI4t1_Ej$V4Q4M zL)GG0&qA1mOJ|GJnZRKHoo9IC%Eab%F&?v5M>egBWl2FKLsZcCD#MV$!fmC9kn?zy z5W@{e`3xvl$ZUID*|T_MXbyZ<-7-j7;IM=veg+P!IkPIFl}IapR#L6}*%)gG#5U_V zz8}h;*+nRHK_>heBMx#VqJPGAgI4*obL}8@AL25d-&a)#S4VH0$oc`c8yW^IBZSs) zjX0L`XO}RiLGx)KHjv>_Y3Yt zftEkpWH~6dLz*lv(2FeZYVSpx?=jIab#V~1@@HDa&n}d9u(Jixe3OFN3y-{SdCxcH ztWRWb=<}7Je^&l1vS;|Sxp`1nv?0=(kUIitUks=xoo=c3hYd{(NRCG0z`yRb#tR4sb>$4I~$Zu%L3$Ka0@^&KnWA zu+K1US(AMY85XiFxr(9%AUjZ6AT3ZAAdK+^Xf#}LY^DqDeR4K=e6Dv}eJv&=B55|$ zkxY+;{Gxw`HirWcX=i;{u36J;EqDCkfxNZ8x<9h<;ArgRLie_)@Ml!SBEt^f&7Y0c zhCpUhK#h`TUK*kN8S<=QSTtbS(I-2QIg$p>=H;064PIut!QGtG;mQ1jl`t!RmU@>w ziyw7NZx3`X`=iJ5Y5>t>to-@@hNBZ5TnZ@`9CJ-4rrLx*&$Xe2zPPJ*M`u&FuNu>4 zkz`}k9CKWt)66;MTnP9NLg2p(KI@taX}uWMxG@J6ewqsb6)8Km7&^-UYVHbj@oY?Y zOgm}lvfjmYL20AHPD$*h=^;<29hF2aFI@60Sl9)^-i^H5F-soJlyvdkkFu<*)3)c) z!{~IS(Bv}8jxHj04y?N6WouIDyhig%&F;YGXkW;YLtFmL?#iF_2Lfca$FO^mIJsF3 z?mZkA&u0U`(L%?STMmW&&Bb{NkZG6OID2ufz+sO|#_}PB$@grR6vJ}8J%X2A6|v1N zGR=ztIfOHY z_&=*%Grtx9(X^_XCQ+~q8J2%XB9ee1%d%W98Bg}(FKxun4o`OIFEt}@iGDX zHHo-D8))p1XOTA>OJ@f)!>%!THo#fs&Du(jU~M7N-q5Aetug3e1qr>K(B;pL3OW!4 zI}?bXMSF}7Mpf-VtO5NqrpmkeJFgy?xbgbD_&L8kee;b4!=J_c`MpyIj0LphcyS

C=34TDOO>4bBV z>ku>pLIT`SU_wr)dRY_j2n!Cs{Tn(dBL~zFJn|RcjFJ$n!wR(YFi{~1trwe6prcx# z=hRkL_V(DEDY_0lGL(UIGhsf;;wv!(HXVM;Ku_=|h4v7Yx{38l{mVYeyqkB}50;SD$ zV^V`~{n{tJSAX05qt9A@^68$}FJ7JRxwtsaU1R5W&f#eB=7H&BySIUGkL?(_d}#i; z>4~0X>u_plw0U&6v46Z}aIn6&H__E!FXCr~&$I;a8SG35xiyLMWKbJ(e69Y#3-y^z=mfkIYYB*f)24`^@2aE*YG_GvwTX zogirO64@)~$Crcr^q$$1*ohq6b@919mk%r+o1Z$jcgNms)BfT>Wk!B9w;c10+N{Fb ztOC5C#eyTJlqgw~nfJ_^+-FyA{=uq5MWiR%1M(FFZLF9T9Rr*ZMT_1$-U}9nHq!!- z2~e{FWRNob+C!_fSvj*z3Cpr=0+1c;v{GwS&CL{puQBd0(GKoL8Xf5cJ9kD0IwJj; zZ(zXzd6v##Pg|(3uW7VwQ(^uORwIE1L34j%*?O^bHiTK=vruR*CCtdG-jH3nc0)y0 zc1^~*+VvZ2*L|(z+xPp{X0+}5S^xj^mxiDIso~N`$@4#NzWnpnYri0rC-a`+%?2rz zH>z=3rbqlY3^eu{R?x#cTt64ihsZcN)6ctCKLYwm(Yf@nln&9d1&_R+$+dtUXJ1yp zW!jZMljufNcB#Z#iMQdsbn+RbMi(ccN7vL=KRCJ?H9YEP)*ePbr#ev!^ySc_o%*P) z?!~eBVCt)*Wg|OEu3P9wwfW*dYYzoZ4aMe%Od0FbY1h#j+tP1C=W4NbYMCwYCQDY} zMGFDszSplh7kb8M|hKrfKVIx(KO+MdR#I+btn#XW`N$5My$tXivPl zr6xbZQrr@lsBXk-8tRM12SmEj-z_fCZYZ+W706i)$L9LFZps3s^_Vk@VMs|7wKMu> z_%kjXD7Pc!3HUQ`TUM*>iTip}fu6dO*0I*nAHMS98L%@J&<75kJ+SA!!>=q3&jl*G zK+u7_7{cjbelV0@Q=3y2$SJ8p0*z&6WODNlzW?;YD>gp-;5z&_9=UH7*3A#CC@zY& zMQ0lWIByK$ypakH(rS!!S^3s_w}bk1(8jUugLn=ed`~;Kl_OFq~eH)*= zU&6hM(BfZu%+-X(OvA{Ml>=*m$pvCBrNr=F1Bx9fve89LjnZRp>yqK6{Ml-u?*`7! z3hpdNjO{9)tpwUDu~sCmEzBAItP*I=^-=M%^5isphE8j-(LXZ^dA9Ib6I)C|4|JL` zh0nlbLa#4`JPTVcEodzf5UsgQv=YdyiHy1$Y2?$`cPPrHZ7MHptSG=_Lxjy$MSy7d zb7Kw4=R6Z4fu=`&Ig~t$^0_+KAWfzK*tb|l2YpB)4Z zvn4m2*|FWQ{Mi&cm7*~=SXgbJX+@lj3y0y)O9->-leJTcu}Ym)?F?aCFZHzcz%P61ORFSycLRhlFsHWE`eCAR4vwJb37;!i!FU^YOXT)>Yr1I8bM<5E) zyDbZVb=oQVXUWBO!-}7kJX;V=0$Vm}=hd)f;m@0e@&Va|OK)Bi-Lx*AEyC%@#EVF2D){(yOT1NR*wM0X4VenMC0*3DJT0+4yEy{tRapTMXm8 zp{@3)RvBn4v$%h-bQ50CEUv<4%b(R~nk~#OqIu@(L$=@!L~;>P8{232b65Fh!t&>i zvfR$Hg5HXvro4?y_;X@YnnjZfUbgi3A5R1?-#rUQjwO(J$s;h?+hZRsg%-mQ4}!Kz z>E--+301a_4kcF845M4NLtg%DJEh(hdlK2v+-s=|s-F3;wMP7G5ww>-^OcI_&qAJa zGH~9&Nv59neAe2=+`OSsQNOPc#|eisD}Ofj8Umu-MDuMi5lCyN_-~ji2yLr9D4*$Z z`LigBl|T2^mWaho?i#KgG&c{fN^E&Lv}qL%`Ck64%4aCF!e@C5REW42xvwF&4ySeb zGaD(`1czdkOpp+C4hCuuk2YT4)p&k;>dc&&Z(Nvd0(c%9kBs`t(I*cCO910W23$K3 z5(VepXUH$&k+xsWuh4?Uw1vCO_ z(KE{m!hS=3F?lwenHD*>@MlAwg;z_69W-IcvnrnzFH6fhdUz{%R{pH(TRJVLHT)U8 zY=a*9)BencLNDXb;An-?zO9K!N3CynOEFUCQ!^bWr&`X>ww;)7ImHiZt_2qk9HEcT z_rMYjHV@+htwzwOpbdY0U zi#yErbNI8OS1)~ama?4L1D`Eb77%S2`0~V^YY4C!R@|#yLY3WDt#DY3nvD^Mvxq6? zw9e}?TW}1~Gkd7G<0e&#)+2-e*Zf=n`X#d`SpFzUeyw@1oiCa|W}B+b+{B>ms&w6w7YeU31-YN~bL_iABxnBtNgA zARpQ+$Mf=Mqv($2W~a(aw@So; ztEaRPExS@@JTyWwm!$+Ue-3}P8!1?(-V3NTcgQpFIcT)s21E;a4#3Ql1WBurKsy#3 zu;@DML84=+HtzD<+1GJ--}qaHw{x-Jl@}+ky*i7?`A26Cy$gKC0-9S0Pwodq8|Mv# z(EAyMKfm?H9I|Ir&;~)z(_Yv&E-uh}#*fbRzdq5;ACkO0)^lp1Z$~dOtwcwiSZy@b z1yi+wmYPUIRY0#7RQ?QkR{q=>j5P;SEdhK^#B-x5lxVL@cGZ@(3j zZ##bayY^eZ<@&jSJ0D_&p@LX#p^*Y4jYJt%33E`esZ@l19d#Mz$2nE;umJIi1skVqn0s6mr}ICqk-~PdWw`O1j<^1leD_bY7k_qTd(Y*aBNzAXIDtjX-q}<8r(atfI<;r~%%SZUpPxUt zZM?s}b1*f$wPk2)st^ASXtUf%*f5~j8SyhhXj-f)@Jt5JVwG%k!s3JsWTwUa7`EIT zYJ)8|_?p1Wt&t8Mg)@iRG!#KAe1<$jt&{#{Y^6u)2SysU_BQtMXXcB&Tk+pGwm5Ng z`?fb1#!u{;JAGish39r+!GSmv*){==#sXS~_HKtipV#$X~f8>#1idvkDDo?uR6crE|y;C-Vp{M&V4t^@#9f zu3c;NwE&8t#~RS%j#v*onNC8%vYKY_h;*6N2$GafRwkMQo#a;AEb``X5B(j{KJHd) z3U))%z|P8_LD1mn)`)mPch__Mbz}asYk|zg>x}Kjx=lE5lxA!w+pw{8Lngi)V$HFB zbMc1t{CU3EL}xthfBM0S?>y)a_jld;j~)O1v&7rKNnQIeby+j(D{_0F zB50J%DrVM1nXtZN_1(xPLWwkQU3!)Tw-YKo){mY7TPii2kBRw==v!S2&_atBhgq=8 zSlp=Xvwr$?cX&7_%ew)YUX+RHyK0gC3pE zf$3yxKFIX2zJ8)9us;O-U{c1AU0F}dBZuc_4)Yg3ZI_c%%x_&iq+N$cdl;K98Rc>L zEbUp|axmaC{rp#8>kawFs`b`KctH=o_3Oy3-?3{mXZtkVonXCI|UZ3i#DC?~#7FUf_ZFjV$4gO4s zXL3zzsG=cMo`63?ak0Dr|0-&>nq+~@KJF0g!unX@Gr$?M3uMU-d^V3_e_`A+1S9)! z!@!fdCxL+3-yNxJsws%3g5AiTMRJ_yk5x4C**oXOgz#q^q-)qn)&Wxo zO68F7=SW$7s3bv%a0~#+Sr`LoOeD z}v{6W<0!N z(_{CqdwfOq6A#wq`I`cZWtlabpODAQ#~;Z0#+Nod@t}mqe?wWcCC{2im0HC5eNJk_)MtUS@Ck3Kig{u zNlYkqcHncBctm5(VL}AYF2&7uAuTvvavm&>nJV)6wEm)XV!^@&YjqDLfgNPx+N}fT% zuw`=CvgOY%BHq$d=@>Obk6Dl!ETGLsneb=Mp!`{OG#4Ezf2N;At}JvfBDDOOb+CXo zAr>4267H_@LR_H5t|W6+B2%s%bOZjJj{l$h*$bbQMgI-KvnzGB2wM5Gh0l^03y!DD;}RQTW4w>+@G* zKi*LW#>^k|m*O}f{MiGaz2sT@EqS(OmON{+gh;E2gu|Z$HSlM-;xo;kS8}xppN01F zJoxiapbY;F32y7daKrFtM+hCn=-B1YKxWro!zh!@RfAw#SMzKsG-evuQ(s!_xV)p` z;*REX3mq5dJI+rxot{p;F%s&nDjo0(f2M3C2#l@m7Z5FO(w09%gW1b&=kQ?{5j&vR zXqDl>0-u8baGg4%b1U4SyEr4Oxv& zgLZ}Sn#Zlep9AC3(5U!ttl!@4Ke@ecy1qpDvm7<#2$&sKY;Fuhs0@DwrxU`TjroT1 zXGO%UPcQ{tC^~IIk`Ur;i=z$DHf3@cdn!#_ysZ3rDDJ4Btwn}SP%o2P>9QuYbaDgT zc%BfZvAUqn2Dt~sx&rA3-==dK{HB+pv z&YoEgd|nQ0L8+D!dq?j%coHJV{tV7HS39dftuuEU#cNw9*` zV_h}86Fp~0?`2Nq?BeDY6x$QpBiSvyY?)1&0tBW^er~RNv%qB6Nh7_ci;E33PU_Wx z@{NNr?y&rsMc51YJd%tnf@X1ho^%p5x^c563z}VA{c|LNBE7Y|7*?Ee@B0&gyo^69 zOxD&iXK!K)Y^V0XpS=j0(X1;q@aKG$K(lWmH;2#z$VK)EZV&HREDBcxJ+UN`<;JR(K7(t5*G?(|GL&l1EIN3DT*n$5B z{2A;Fe@4=L^_3Y=^N-Iy_ulD)8k#GAzH<~8Xe>DPB9n$cQ;+!hI@cGzx^VgV>9f1H zV!?4@`_L=fx?Y>?eQl!u_-yxcqv*KmG2amWTpJebToXyvMH*^Cv>l-&0e{A40|cE4 zB7SZ*Aibd@)XYE1Ky_Y6-rB)|7iNF_e(%5gW5bbdiA$BlpSLS|?KoIyb} z{R$;uAg~B>5@4?oiCZ7Tjd|2gr7Oy%#n{;ZAHf$!#>|2&MW>eO6h?s|v~+4q0bE5F zCjqw5PbWbo=!QghXH@4>Ks}+4TB)+GAJdU~H|OLa@!Nphr(@SL0D@C}7l1p@1Gn?WUCJnz|z`qguc$iuJ(s zkn3Eg@UKjd{QP0yH^f;5{tT4nZ|(bU0`7#E4ZiiewjY1C?b`o%VW#u!?(P$dbEo%A z9^N;3YR@!(Vt;(cB#s;x4=nB;8Ri~9@q$i`^fwIj*2`Ul@Mp!&P-v3gSTDd9HjAuR z39YDt!~B_iE5I2Ftza1nP0|u>R~AhxWsqBgrnLr&3#Ua#T_0|P`ATUKl^JWBTO2?WYfJKYd^ZW#*{^3+E0lUVMHR{23fgE<}322%*oy zpZ6`kv~9XI+Fg-XRh6+Nlvkc8s)`j@{~4)`#)m~k+2XfrKB<*xWZOQfg1wuyco<(1YoYYi=b@=r8{x|+k?$TDdO>G5^4 z8p}eMoBSQ1W`cyrj>G^pI;B0{&*F4qFVGg{wMzns20kN%hDA5w$idZwu^~Wo?y3#N z85@e%Z>qv%L-{i}di}$978{@eQh{qhuq~?f8|3cao^<+ny>#0R?l76MC~m6*}!MMfzr_T8}A$lDxX;%^=(h0Z)}n! z!3wNQy@vgm@JOY;WA#1E3iQ}zF@k0zT^0l_e}G^cgW`WZ!n}`emThBO7IsG+zT-J&L^?A zep~sY&n`W;@S~YECk`!MeB;HlF9M$rU3h8#`4x!Zxv6hPqdm96S$^+Hyugosqc;OIN5F&ntKNCMb z{PIZmxUZ}wT-xl*kJjeLYV)fra)NbR!qqudJT^p!a#rT9e(1gpU;D!PFWvX_m+oKv z)fKD1^iZI@BbC@z&;N87{>)W|N}d}+gQ@UV_Yp2V+#KH86dECs2#hpDCYys}sTkKj zBsYEYfxPcNn)%p6$f|us!~Llf)muVh>5Q=XiTja2tNxih|qi>0kP+H*}I&KshCh8W*N0*z~jF^d-dY(1av&X+>zCuJRnKkJ%*FMob` z~W^i=Dx@i8|gqmz@7M-&RM=7fO*-~hgkEZ!^mY6?V<}BFR z<XmAdFvXei=(m=`hK?L*_*_2R@dib zq~O4Lt74ni_19JnhjW0v0A%Q~CCmz+$5A*NB5nCIk96v&(B`;Eo$aG0!lI*oxtb8Z z8mb)$REz#OP}5ge-jKUNJ{^2Ua#rzW4f<#NH##cvheLAt;9#&E{ygj}!zbCga3Fq$ zU@zg%Xp%J?K5UfFqK-BR*IjY*U2kp0T%-T?{+{#msdICU7Z%zsF0`GVYQzHig}zW{ z1vw&^~a~`PfoXw$Eys@#@VCJPJ|(IQ=yBXMM$i0n3n^o9!qcr-)KW^ zuRm+PEpnhgF_9_(CUb02eH-1f=!&Bp+X$Oow`a?r2f|gLbwISjXKjJcqLD@sZTYit z-ca$gp24>8XNATtKu#;4T?ur$Kx~=a0PwoRSSYvJXaJvwqBW!O@IWv+oh&{%*L-5G z=hR#q$+@|fQ?u>IXIoFsb)24T0oqSDH+Kd2Mj*mmR#+x`PK%a}GX|Of!6rPB;i!%XCc&oY&>j zY5FOkek4&(i@aF~v!Tbb3uU?{e!}LGK}HGkbhy~rZe$ir81b`w3{^Bc5|4IPmm7YY zRiB?F{?GYYUjA&svQ50O_pjxKV_W`grz`tSW8o!$*L@UGv@v|v_TJiKmp?PgNzhlT ziL@f<C`g> zf94WHv4eKQA-m7H=OBpN;oU9s2Q^=ifUk!6VrD?PL4y9NR;C z`{?dlM|MK0(M#jJaqT5_;g~zOe;ogf^Lw|wKHY=<`PFTGN2hyVpX%)hH#XOB&tSaS z7jLeOrmDlu{#dFu+E^254J6w`4RYJoACq|D4D~vs6RFhTk%U%xi`|Py?O{}Ti`FYkA-4!cb5^iD zwuT|?w>6g1Xpenl3YF|mSPG;I(og78`ik@?Ll2emGcgoP%V?=#h<;jKu=#>8I%d(y znwn@2k0iPdbM+W@JL(Dh$S7;-3am`OuFncOQ46Tiu=O3Ti-^p<@!{Z|PdaY>yyx1- z{ntKfz4Pm>*M8A|^^=Bw_2=m;|MS(^&a-|4Pi6?Mz#?88Z%mJ0II#cH!M(eNCK^KBr5kd~*5<^Dsso#gB(jVBSw$E@ zH-6P7a*({nUVs4dn9Hzrqr3~&Y)Lxv&7 zDNvO`$F!`bJtR7++GcVfGa_dahIEu1fJSF$Vu+SXdbEZ%g%Nb5t2+*W>e{k;Q^EQT zC2Ke0|BU|zo*O8iOENMG*JaTngf7ciTej}Wil@F(@c2Uw(W#-^AGG`oXZSxfT=-S; z>VM&#)_(r|)+=&#UHkQaZn^%;{!71rLc^cs{drm5>iS0I{l*)NRw=Gc7$w(tEN@P& z*B*Vlk`oMR*h*cE={k!V-H5j+q;6km!)M)R0i7 zp`*6P*632UjKtQEv%a0K2|e}@#TP=b6_S25MU<7Opz3WDCSI&5+zHHo$mCVd;5l&AGd1$->UgBGc{GW zuiHVEQ(t$tyE)I=@AqvSf|RV8samybowe8A=X~G+Y(04KZu_N`<^7xm@a+#P{`|K+ zZ~pxK9jW*C#BUznclFSLt4DWVJGSTQ;a4sm*m>>v4jegNn??V;h2scs9h!c9dbF`> zw7#5k0O7{CF2jn4a8h(^xi3=L+EkvZD~_RsHjLabXj13;Ud*EDgy^zL;X$;xF`Ez$ z5oZL<)Zx#9#_(s{lF8`-Cf5}v;M=%NBU*++!@av=qYgov5ZWSvg-Pc~bb$I`c1N$+8KEG$r zyQdDGnBCD--4n0u16kLvjD(Bo8;k233+ft*>S|V0CPQmmns+Y$>gN`H;ZrYsVZpcl z;ECL?Jkhi&nv8Bj(%b@14o`rW0nW&tP5&HS+nw6f9$(``(G#7qbzSlGGzdX=Mb@@9 zO*BWxTVw0fP3xOVQ%j%w(sNHNSoy7--sHi7*q(+}E%`4lTKLQpE1&vz{*YItZf0pBY7f1)>ou&&SR{=8U1pK+SOrTieXGZCkgV>oI@~j}I0Y>fn)hW(wYUkRr{+d!of#{+7iorUg*3jd5 z06EBOMq|!p%W&9$Fe{{a&X8y4 z!l7CCGyRCPrF@>Je}+H968Q${D_@Pa)_8K3KRe~~95fE1=8wrACC{oPb6!j>dx?d~ zWiR;Uk1}VEmwkfgb2|4S7mm59tU%h^Zg?&YK$a-_QIc#G{Fdi&=8xsig3o@5XVFwL zxkJ$N_;Ub0n;T3v9G%WL{%qlloq4wid7C^u4u_0ub@0 zL)_ACNL@wC>RkKoaHi;qRnNnp z<0}{TRTpspA}AR6JQ6Bh>y*!r4NuwuBO`oK`){_Z~K{M>SV zri-|^x&8WL1r@*G2>-!A?8e*bvhH~EOX9Way}qBXA37n_P{xq zFeT7!2%0<`NCB9<=I}$x^dw+xnUf1%x4^n z1rPfZb`ENuKh|p^%YlV+A02~S_t9CaWU+0KbCS<%wo0}$lVkz%{JProVDpwZ^)mf_ zH{CRNySYkcZDMZ!?9+<(+9(_6NA5DWMCa1$5w4!AH&$^hDauGz{pd{XQSXpXI_~>gd818Jz39l*uh1 zz**#*A-yUF>^tbuCUY1$yTq^ci5`Q|S1kD`{+!*%(Po^S&0Zr_v|8{vJDS@wQ>h}e zfY!FgqO+gEmdG}wI6qdf8hXqTfvpYULqqYKyEmVj?mx4+_xzTji_;^QwvX)|?eDFx z@5NO(jA?TWJLs;uhW@6gofydIq|4Z4;PVXl9f`FHIEz0EI8z@>wvNWzY)lv*h6$^a z-LTzYTf&K-(LY<5&e_pyn!(F5XAUZyRS%M9f#tzy3*jMiF!x20zG$=8JS%~~8^2XF z#bC~y07ziMjQ)8f(Z0E>AO3vz;3WL{-tn3D&hB90MPq)-Y+ab@6MYlJkV9p@u?r<~wxi=K=4L5hkQXQ3fZOe0q$Ih<*!7tkX z&F|V#JKyn6bbFXNJX14>hZK(Mb^?lXn#g3e8tqGx;m+_oKPo4X4Onl zJ-(kr4J4ZN8|t5c`lCS)_677aMb4*SB+N(U-fu>4{i2`u>O#(IaS{ zfzSPk%qe?)u_2->)W>0YNPI<-8O?gaIZ+se4s`>ikqVPYFpLwj94ZV=H+9*RQw1|p z0r0jqbazL)24eV5k9EXHH}_1O+p`@BG!7f5c5FGbed^@aO^7h@qy<5r-8sdha(E)T zXcF8xE*;!;?eLymeVu!T2Cuxb^UB^mn|n7V>N?66Yn+*oZrN6aQC9-K zGIeq_s18*o$dzcJfHNZxKy*b%7<=NJJ~l*ybw*7f4VuP7VD-X$WY557fOE;>Wo23Z z41BIyx~zK1^A#^XRsPJUD;F(G@B8b#pYtQ4=lah&?)k9SN@%Mb&xbnAIw^(Lj-r1`IJWKSppK z=Jd?lhO(s}W|kh75d2n)S?$R&h&&RjsH?)LO>}GR%t%ltbUVHLJR6A*J(BLFh1!Y= zJ-P*T<=RtA$o*Opw$(y9S<6S@lDfXvNHTYHKc@I25$d!N_Nm=0wj1{Aq3jPR_Sc>) zB&Sn%q`?PM^!Q5}2o*E83w%;l=6!rFc@l!(PSU{FS>k8-GcM4*Z+|%c*009y@ms2& zkKO-=>Tf?-fA#>1 z-Z?nDzI&vml>bCCPYe$JgY+ir2Jop!H4LO0`yw^%RfW;UvZQm&7;0}C#tMTR>J=iZ~yP>ALGc|GV z$g6jb9=vs6KZyR){(V;u@4Itk-(c&SX!THIc}q=xtf?T@P~2Fzy1qWYk)JuSvcab4 zMB&%J_QD^1_M2b&%!{90P`o6!uWe69dMo_7HM|!7EdPyWKAq#worw+bXXDbbb=~oe zU9k=A;kBL7^)%xG-5p*Bqi&B+G)Fd5U;VAGFMaCI_%+i=$Np4Bd(BFYjTq1Svv1{o z`SVM^_9^jak!MDP(80)ghEoVFBs|W0#)Qz)LMwSJe4bYfvS<&DgXaTE0xic3Yml(n zj{$S(xmnr*VJ05B%&z)q{tSzL$ay30*)I@c#n5BK%m$yU3>44PFmpMa4I|9%6had} zyCve!s)L#V&cJ8!=YcGa9;_}M#17iodWa!w1T`CNE-w;x4x(mBpfTcL)mvniiV1&tSn*>M=@B_PirXhw2~G>Helz+vdIBf!o& zBXg3V@n;93Ggccx3ax&z<$0r{&|Vas0n45|i%|!rb=aMcqZ%Xyo*BmS3qsU^CySG9U~k7955u8|)Py zb{c7imt~y+G+v%L8L$|Xy&U^!PB0AWpJj_-DrHBWJ%7dy8r`xT6j)|w6f&|E$hy0D zRc}cKLGxg;<6tVNe?}&4n(C^2cHlYT&kmU9J54pRYCb|C-yQI0@nM6*dCwj(T^f%F=S)Txi4qnbMDJp8*KKd`LPLP_#smcXVZ}>u6)7x zv%*to$Di5CL*`%tWS)1~mj80=>X#ImsTG;`Er6X3HD|H&9Dg?Pa~3;$oii`6htEC% zKBrga(4ShptRsIZXJvL&6hVF0MT*vj>nBrDL(r+Phs=V{j0(@6Nix7W)sR8Z&IOv~ zICzLZqkIOmZp1qRsc^)Mkw+VA_#Geo8DDhipW`dPh5rVAAcJ+K@MmJAseA}0>ad+T zXtvJ?p%F!M9AU=)+3+%`*>uj?u-rjurpPy>GVpl=^4g}lGn?A)Y-_(X-FJJY^Xhc_ zmFW&twKpa^w>LNT)S1u5T28o&)`&mr6hdUr;?M4UL*vip`RoMGk0NOBtUZrYESu;$ z72{00iFkZ{s_e?H;Y-_Fi3?M)E7Nhi`_8^i>2kg->rxr%vV97K)8fydW=DO+ehvI) z_;bz1bmM5eaw1s*gJ_nQQ|yK^LL{MnuBCkky0 z(;fepx%E5_JnvF$GXpJ!d>TWJO}<+Oj}c74g!{tR5pkaWy;d zUUN&b{i-l#?~>uqp6kwkhQKYdOCIO;oF%%CJ}UQ;GTA@O+%2*^IrG(E69fJ z*l?V1|7!LMBP{+yxEo;JH39&(L_KNDIWYy-@C1TDp~r@qi*c|Ox4a+}c) zXXVGj#p2JFJK)^ntd;#H4<%VyvX+Pm&yAio2dp+kuo>stvhbOT=g+`rh2XPe(FUIr z1#@-!%?rB7964ItEog|-Q@lEgIJ~rYZ9Lu^ZQsybe|_87%D)>Yqv?FJHPJU7~F6Y%GrNE-os?h2>+63so~&_MAE{dKXS zlmE-uzk4wBz2A0YxN-Y~9y@Ffo8rIkzWWpV%k+D{9D4ItQaktGF#$8g5|Yd)h#?l? zF(z08E+Ic>Ac@cf&1|L4 zV1=SbF@i0+sXh_+BB4hQKm*NO`p-zNStYuQaz8~;3mNU!Z~YAMr{9pGU*#W?q8>v_ z`~%ZK&fR$oc$A0sBux1aLayK$Nc<)w{yEj}@1lM+WWEB9kW&vX(IpMCFTn7b;4ka> zP_)^Xg@2v<{6qiP{(bNMvhVE=y6*mn6A8Qjr+?ma>HVu4+OO{32)w;~X!pgvyU*>~ zd}im?*JmaXLZ9BbeWJB*G&wfjymq*i6R*tun1DZHhD?B+@he6G4T3gX32ZAIa0V%x zyctUh;bq67jWau`v(aYPsR|?FVaO_0uH7NCR_4#xn?tRG>G9Fzn(nxXu3y_edwK8H zGqaOC+v#mvIF#_U?UU#C&c3l{=8fI6R}b#Fc4#k&Kr{yw-Z-@P#MGwAmc&$R%h}nf z!y7lR>DkrQ*jD($a%gj`s5*)xM{Wsds9||oc$HmNEnSuKCoeRXH1(y{pml7E;#O@u z8So1M76euz{w$HR0J2E32s0JK)Jeo|0xuUVUIB9^Fx;?lac&iT1&!0W*NyzSgy6f9r$X{ z&o>&gJd9sUkNR!a{cVUwHPFc=KT+A-Jg#q*#cA$d3vS;&!ZEL~}YeJQ4k`28U_5G>(;Y96VynY}Z z8csC!@mIF>WyXX}x7;wuyKQ1-Je=zXjU+>foyi6jYcNSOM+9d0Fb#lWv0|*?vCA-0 z?a;BURWuESaN($IP1Up`U4})+syf;tqb*G%g3l0Lg(x&*ikm{P8^`Er2@T_14Yd|| z4i#q-c|l_e-B=WhR(4{2(}mwfY&_C9P*>Ia+VqaQM-SdSu;=!%BR7v8y>#HvyJue6 zzhNtXyxZJ3+E|!~7Ka-O;&sKLnxatc^5WXnEu8TlDr#8vwFQ6rpEf^j8TWykhDeCbw}5=#`zhw2^`&?*w`7L z=}AqtG;iqW+}WL+Y+N0~`lF?Gv|@Sb^Iuu8naTAXbE+XqeZ6$ zrTfbZam}T|rK~xi%>>>ZJT}|1%8n+iDQ&4NOjj2*Ru^Ez(OO#sd5$@?bF&>FXvYpp z`ON6av%%`>BBRYIcjR>CE;SE(aYe#p;9x@ zP%w+0S*{wa5;RtYDSE7-WC>o)@lqtsc4>QZ3&YFHLd7|uqNU-&C9$H#$>Jq(7c@tU za|rI(#B9kDG|#Eh#i?S$&ivs&V{-u~ugwXbAI8phO5j|qGV23(u%Pi|B+W2nuXdi7 z==?#)pE-*#v|S&gqn4$jYBT?{lPBvdx2TWM$))Jy~LIjeup z*g}2(Rfc2tRm&N}M#wN>{unO0t5(9gv#>g|AsF0& zXuAYH^N{l2pePEhgw62@VL2na4b&8x>={M0Gk@kRIlj3%(RVF-3BU^$20jZxKSY}a zkRKjF#2K*c*z!aDX5umD*YQ!gICBszf0F#M%=z)ffI)QjutMjy;mI?J7e5D+Y=fLM zTC02*|BIZftCfwcvJlZ`e*!~9T+1_OaCzB;9~oX*ghwt8{&zHMDtLh@!(kN)g41uK;JVh zm!{KKwx+Mmat310WW0p`+XUHmOgrk_o8jknFG4gpGh(TskDP2+o2Vb>z`;cAnpC~9 zYbT#(*3`=m>cVD;(I}ACd^ScS^&`;+0{$$`GgNsbTsInSz!}33bi|xD>TVj%935!#R}4L(O?jUJ`9sT?lKVuT?RwVb0Bx#R#|N8p{qD2Om$wx^G~06JUh2}b~oSiQHhvs zaN)e$=~4|I@Uk1ZOfZ7Qhwc)O4u8aFq|I-uoj<<9>~K8B8FP4C%-w?h?LBnACU7v> zJxPKQhP(!=4JV>T@N7AT8@z<+Xa+btGmSZu4RCbUi$f1)pDr36a?aAWVc<+dJ?dx- z4xb^?fM~OBh$VPD{>9v&NKsa~Z!lYX>7A7;3(?d-nS58eE{yY#z9*65hBjyTvvX`V^|B8cWjG%U$g_!`!O_kFnh}D{CK~0% zp)_8E+jL^n*u|~m zI|sY?PiB5 zdC-0TSM6`1TKo~P0>U7+Ak;w4UsA&*m@?Yn7zGKlj1W-~U~_D!Z3^Dy>xmH`0cBj9|__ z>`YzzYl@->y!v%7rnn?X*cQsfEwoS-?L)JQYPNo7o2*#?no*;yzEREWM&cjCKLcyI zh3=wG?Ma1ZSv2>(`ExUBc8FNpGG>zOmriThRy%8C6A#T)LBGwD@DHaintv*m554`X z!MA>iF*OeW3gaX2%K~>u<*$-Ie6aWArF)xN%msS)R!;gmzHQB`J2qV0y5-XLsq05) z4o`0COY{z<*Yq_H52Q^64SeoTpo<>CskkrR-@}o4(ZTM}Kxb$Gk788N2$-`0Snh5y zyo{?x50IHZ(r3i8f(9gujO6BA;fgM|{#1QCBeQ+!G59v{XYcsr<$cqbZ=9Z;LhyWc z*DP+;C$_J@xEI;8VKGbg?|5VX*7G}OFK^p+Y47$62X`HrT)!q1-aXKHe0s}xY^1+u zYkyN;^~(hfD=QlFN<(?&p_SFq{5nn~tX)ymu&S(l(UP)-dFZYI!s)OHn+bBEW~j1w zGBj8unORjp$|P#D3i#SFWV5afnT@kL)$GwUa!Qbzk4|WFgnOZ#M)1rn*xa0KN$8}~ z86M?}+#6rp5*sRBT3-Ibs?ue+J!1sDvKaE5n^U_uulS`GOP~96;WJ-~Ph9Bx>jxe0 z|2EAzgSX9ULvJIm4H9U*|Ngtc-qklVJ{7!9bV5z_O6yJ2T1JY#!k$to17@l7rZL4< z+608?W0R(N&G&R-~9=}k1TR_)?MrYu#67)PBW$NR=*ql z+KP(SGV<`c1w}T|jWla}x+QvkjTF_dDJ|g{^cX7g>DZPH`8MRc+xJjmD)?n#ic8v< z(gTolBRv4kN~mZP68b4}seAcRkEgZj2~Me>xHJw~imab>`63SNGxqee2}@JEsqv-nQe!_UW^`CU5TBx_flI zyktCHHPTf#2%b$g_O#TG#_ETgYhb)X@%k=YI1)8oX|qrsM;(n#G!WQS&5l2lNdN3F zLCtMh@|>Z~4Wq3MqjcJ;CcZCB|Lg->>4uVIyt+M7+1yZ^Xe>_A09!`eoNnreFmr3W zbRe39h3SS7j{HkCjA6WtOd6{Ybk3X}2)+)NHxtpaX5`Rj0bLfWD@}AZ_BHeWm+MA3 z4Y0bnZ*q9kcTXR`vH#H3BZsdaK6>@QEAPB|@Zu|byAqo)b8f0=Wvf_WB2*l%$&WM^ z)?fq;YVK^AE`I*y+%JA9T-=gQ%<$K-XsVl=OyrE18RiVMZ;g)Yk_s-+6amiU3bfE5 zXp=_A)=_VduJ4Rv)3K=|zNITU4bW~5ud6FeMe|dwRfCO1Rg3@d$%SA0bl$TI7Jcor z%Q(^Rsn4(clLaWEbDsKxoTnF<3i_E(EqwOL=fAWdxq5YXW0_ztAUgNy&n|aI7Se+w zG;KN0eJ04Cz2Mm}wIk0^Ycr94&P2;V?B&lI&Hg=+HHZc&^LVWCwD}={^w%E}LNk>` z*+!m&{Fxm7y!4qr06}}~tb{sL8GtN54d63LrXrt>nsQNPMgX#;(O_q6q76Pfr)cBP zwYEw{A?R@7B38vpmng_B ziZSAF1{#iR(@D_D&XIzJv4VwWrct=qM*?r>f+dNWpec@@;Ux&78wSR z#l3~NSqOj5EYE75gAbsbr#1czYOXd44SXJ~EwW1#(KUqw)%=#E5IJjSex58cj6XjT z^Xc)!6k6is`8}TiKC|SL(B{YXJf1dtM~+|;K+uSyGql<9WEpono<9SY#heADKbk*h zmG<)tpS|Guq2#grnWEm|NBOg+n6>YMf;>Df)`!bSnyMk9@MQS25VYgW##+4`I!mN8 z{CQKFS#u{=&*o%U@Y#$z1$kBNC zwpnw))d|sQ@U`d96W(?s>%1|KJbNM?WYI$9BT#Nr!-j{GF`&~_Thr^4EtjSSuTJ&i zl6`Kf^Tt%mx!Lr&EkoBQ+xS!c*&bY=5a~KY9x)K76xJ z)bH=8FDaba{VK#vo5@i%567?sj}L|1Uk4z5M(rGr!=ELGrY*>yP5+z?e;grq4BpG% z(Lafj?58kAG{LJS{tP4^Y-}{p%0YpJS^YCE(2ujup!g_-_S$B@xzT`eX0q_wh;aUMl)Kl88UUlO2D~m~42w?32fm zXDvw;7A6Y{oI2VzNfZ@e!9lcES0NsrZHrysx#8-zu`AoxoSz=QFgq5A1D>X3h!(2s{2P!t6OS(q#eUAVapIv)AC~hR8Fc4--5) zWNk^rm~*fqRWr2Nhp&i2`#PxE+%{r1iac9|2)8K-!e=AWp;ks5Ff#nPCd_Go@aK)~ z{Rh{L-#I+{_K9f@6TE*0W9QviK;!d_`Sbgi4t@s-G|FdOIIbPWe8XHgE+72%g;(Br zWAFQnXLlifMmPK6(dLf*Y*GNzl{FHZ~N~4s^_i0AGnRE^*3S> zLJfis0uHK+W56`H6b3QQ>DUFAB-H6AAI8VSAsw}ega}ixgd%OCAA%SZgJi>YaF)^9 zkWqJ}2T-FsYSffA(GtHiiSDQyX@B}v_EPMQ^C6&BT^2*R8cm6`K7* z9-f>EZ9J`}Xx1v5a)+R)pIIpz+1w~`034AMG+0mIE2f9hNS#@7`vTtmke!VQgP`3) zHe_?{OdEHkQ}#;o7P_3Ig9V>RNpvm7{e`VhSI|WiILt|pCM?+pRptE zjSSg=eW8JlrhWpFj4K6}$iQS0p=RObAZLaxt5f{haC8<;YYB9kV4s2JH2~Pr^x!2- zLUvEVpD*m5J-K}vE%fW#x18NEeHCktoilF$oOeud;NY1(+h5;1eQwXTGdpL_@815( z$iVjI)RDo#spgit6;(Zn-mZq`#OjKsRi$;S%EGIw8dg*Rh$1VhBg^aRmlqYkn3F6` z4W=eqvep@b#?mc|FnbNNreMqPXQ(oDM#wXwWdaIq&^S6`f=~Q!A<0=TZK~$zNKay% zkH)OYtzB@*62WJUg3mM?f~Glwb;(3`dPCW&s-l;2%NDP!T2fHFXhl`t%IK06MLEys zKE0si8!xmU{*S}|>38k-f87FnzV)-tH$ULdC3wB<&ADrwllMU{iGSxQ>YdRmM_mM! zL<`lxs7u;9Z`g)xMTOVWZ^)(ISjJ#KG}UkA6CqZ;)%272&?eek?>WuPLZ0~)YF3Yy z^S#6E$knV-L|V-(*8?+U`?w#BdH^1t8&UUDndR==O`UuPd8*7Tx$ecNM4PBiu3NB{ z3Y+U2P#=d`f+<2bQm!RDr0V|T_=iy&qwYvu5nS$z!9)#IxUcGh&y2(T#l+h`9eMj# zeeZs-=B;0>fA7Px?>`v4{a^p$MEkpkw{ZC2o#TftojP>$%01ZtEH>^W0l?ET04IbjvB8WZmC0BjM%sr|BY~YE2?I+!RF3U*XJED zOx`U1ELF3(Gk?gP@%$hw*2$(3n(s1RWZVRJ4JPqg5@~Xn>#-HT+_0%*ZpF zqp5cM+0@Q10NpMbOE-?E8qIGR4K~ZsEhD8SVMGp%7TN^WW%2rwI6~-j2toBY%?*_U zgRSH5oj$=Sgcq@ZK6LQX!2@@W9KLt_$cBNvQC^lmX75W?;BLG&v#u3}l8m1DrDfb53mNzz#aPUI@B9 zx}hb!u{E-(Ejiv38VVPN8w#Th#htP0{^j5NdfrzS;5)sX0|&qIshmIlbndeYa-RCU z9ZLAjf@M!V310rz7Z&6`^+&f~KXZI$<4d1k@bc47qL+pwGi5?(on!d*xq}OX6k2)C zb2^34nyo*Ji+>M%c69pVIdf(^UQTcA96&p*@I(GXR7QRkIQ= zfp(X3{5jCZw}ugEJ9BekZ297@io$i#@-?Bd(fTT{YDWL;P;*B4ydgcOe9j_ho67QM zv!~dU#`icv5fuDb{;cx{#h>-?d|P?`%!!01d&YkQ<+HQhK>VEH&rLNl-+&AY_DX&{ zk3SoN2IOLtk>nZR&kc-24Go7!TW{^`yfJOg8<(a#E>D`I77LC;{Fh99%~+%w=V#MD zO6k$27)#U z{fGoQ%a&JW*>c8(!^3AK0@Q}G^Mel3*8EA}Go)8;74l3r0xbVzcX%J?_jx9q;l}uH zIHzS9dIa4$JXj7U=$3<*AD`=9&R8R3yCKf}Q3x8OOnBw9k_>!is<4oVj*}#7wH)Hq= z5bJ4d7uazd z)=ztG8|zkcuuVOBW^!#JB;vt{7ILXX%|6$jj7q>bbg~bls1$YWOrkv*RaAvh37^is zVh+hN`b#CjwW7q-eUV&up~AB<@+4IJ7u@gWcV;&D(WEWcmzp|>&)JPtY^6Fm6>Uh5 ze+=D=S?$cIPMWm?6~gB%WH~(qIj@S;k3G0U-~Msyy?^Zg!N2T1arO0y*0WnSytZxX z{PxYKXEs54&rEN+uy^Xz&YAI+(cz@=XWX8#-55v?_C$wKJL9?04KIzFtwbhdiEL&X zePYXk&vHwqVr>z_)Rw!XCDcnaH}yyzouSr^{J}m4nf3H0$GW5A0Nzv6vo{XzIE(S@ z>=yCoQ`@J`Y@4~Vd)I|mc413gtA-g++_-D`nIf0; zC{b=Ex30&Q;KJeBNLs^veb_hh2JRr>XQ{q zD+aIq*Pj3I&uw>q-Es3LguW|zO9^|6?q-zp_A-!T2kl-hM!jr8tp1(RH=3sC;d@OK zmlsSgq~I!T0=ZhKekvra(&qjaG^>pUa=n?%YD3?wDQ(4+zlHWxB{<7IT=NUpFf&-2{eBk!SMkYLHE7$;mEyTjlcbq?)$$keec1U*Wdl?qit^< zf93MA!?%tfx^?E@^;ZvFKC$*DwjFV-B`ZYWF+jilMJWkb`>b3-^9@w2=&Ak4;!9g9}( z>zPZZizY`wjc8e>8F1rRMW<2aMpHifk%S_$XV0I}D#M@K!V@?u$Ev!-pYh@#LZ#@R z(@3B>g%Bg?`r-(j90H6uIo329t?j+^$}8`mIDBFMKF6OAUpsW2W)5@F`&wUM8jo{gg zpr8JOC13sQ;-^jFY^rG>HdDxeV2S`ctC>yc6o1BZ0|bp; zx~*sx{F%DJZ8PXFQw|VxcXbIu=;msZG^2kObBR8JeL}0t}A-Ep=42`bL2oZ4TWwjT!`Q~jzAhyEDHOuA9==ihK6$?Sjs~I9KS7%VOIJ5JA)**v) zTIHTn^MZC;Ihl0jY7j9L+9)wn=Pc9q{CTjlSo|65X++oTZ1x?QQx0t(znhA%Xx&}> znQf(ZW<%3FJO2%dpY3*4g&Zf>wlXKfpL1Rme>N8Fa5M;d4nE`2;hdQt;?DuFEOb2A z&y?rSKFRifBxlYuCy>WPfIl-EWXSU_H3c7@>&Ysg=PFr^bdW!b9y11ubNNaWIcLKG z=aq~75|SWx_I2LF$0O(fYUb6o9%ys0xcX&7(D_TC+|gxAh8ik2#?AF&ysp}tX=D>q zJ{whT1}~F)+YKvjZjNRv**0g>VJzAmK4{`+67zp`y!o-w#Ej|<12J$9Z;oc>uiH5U$CGO$6W zn2JHa*Q6ptiRkn|;=+#pH)dK*|2*4y#aT(*+}3k>x@R(3j%?UHXCrGJe-5pSMIC<@ ze4azl4p19>p5xCBK07mKp0){?jOVjqWOBpE2A_>Q$LbYaT0|NNbBB&bOcCuC+DOI8 zr?p(8nBb-$#_TW@ zHhPSh8823j65HMrJGHjw?1t3UnZDOI^(1>r9rP3ArPyaxY49><>r zY}wqBEM%TT@egnHmZq0$CFI0O<`PQqJdVifVFn62CCkUWwq`n(#&p9dqc zp(yg&XnSdCYV~sQ=Tt$C`18XI8G{bP$S__dLdsC(Y(SWqGJ&*T=%BPUs2ScXT>L2b z73{SU)SUH9)@24kJ9V_$w2xoHrRUEcLAMsICg}0^a=sY_nY9jUdruF)t!A}EMW=iY z@aMupl+4YH-h9J>Wx?l1M<6p{v>EZU>m*TyBK_g~!boumM?jw2JaB3I#@E)hA79^o zmP7HT#;(qcT;92Uw!golw!tWLH~}%1SF@n888|l~q;Hi_S*Uq5)=r2vGb)$@DSL@B z33V!*ribM+J2Q$u>sUb7iQBXBX9c+~!O;rU#hmAl4l=7aN1IVT2Sajbm~*I=1O6Dj zG`hPXf%!&1a_IWhc)Dxf_~?y8ThTw?c23UsPw&Ei1OAM>8PARHUOOuN^ZQp1{qXkj z?_WCtd?o2y`Bt)a2A5E;fd`ZiwM@Ynx1@PprVzV(Z)w}07n|Hr-eel&Xj!{N7o zibX0&L6C&R$=J-d*)+6S;HfhNp%A{!Ctwh9PG-poHc=-d#6uO~6yMBpX6d9tLXh|( zv{t~@DD+#u9KQc+B))7#1N&%|F1fXcjV@_mmf%utet%u+k^HEHDJ|6IeiLR1T`H$j z%@nzXij3sCBeOms*OV=}_Y3sN!A{!P#D8k|5_jk0(5%NG;iEC?BlvCoo>XYyl3)o8 zP&uP^X05M~=+Zi~=vx&oH5Hf=qJ@DH7>toI5wv3+Hxe1TubF&-I?U;Uj`}QlZY<*?@R^VqZwi}6Y42t{A2zs;^ z33Ox#{@fKe0WfeCC9sKso%mU(HbZNj4Kg5?%Xz_ZegtA;0@}tc$*tr$>%vprTw{1PQcNPSFVej7Sd$wKJz5DeYGnZ#JzOgZV zdUp8Su}iPaoSvH4wROYsHR~@%`wvFiwxlas!{1y{_tXoag)8a`%EASuk^GYCyfTZW zh2=RV9q~S(w_vh4X}Ev}6Od%lV@9|!0hr?N{W~HClbyFMpAj34jFScpozXEwo2~)t zW{@&w8Z=uEs9Bdn(Cpy$wA0hHgYG34j@Ia4OZ^C{$iDV1I0NK;?}fZdKh8Rdd;|0@N%j_bw({GQLa(%FiV2X+EY{Z zz*$)}J;6?P@T;_~Z_t!x8G~E#O~EV=th%PS?+8;N@KS^RU#ADeG{ z_0y~dKVny+pWEDsRXl_CXE*Lb_*?r+673(HBG;3s=yQ^f3f=3`S*ySGD=e7C`5%#Y zKEwrj;QlYx-~FKJJHKmx`+xl4)Z}}wPTYO<@XgnbTt9j6#)%_$PQG&K=-xZ8?Y;fl zffKuT9-o}#Ai{SJ4?t533Q_R(w<5i%u~P_*{Wgr@S;2vWjU_GNvJRj$2paDTjU@Ca z9GcF!J)>>**jd1t5y%`w&{R-UyB*9-gDFlwM7kU+Z!st5vUaGo8odO0O$2NTjS@zL*bmpfzY>I>2=jFcxrm5HW`M5rj%5gO@FZ^3h;GrXoF zvi`7d~Y&<7Ymz{FzVZJ^iUXl+Vw88rr<#na_IWti)eJp8ZLM zg3mh2P@}ih@HpC6<|XD3GLKF_mO?)}=fC09&bVzTICk(0%bxw>JpPOdT1sh-2pq+C zw4qvLSn_5Gq2ba7kh3<+mkNrpmm5Mf0zGU?8;{MMoson=tIaw-sPRL~}b2B%k-bXOL& zRbl(QI$rCXpPf;&_%mGE+@7-$12Q`~H1HXujBPSV8PT%fGpHH4GJ(jM5Q4U`Y(=cp zWY0#P%a^s6FKa8yX)jxduSIj|!p0RZk5~WM!Ssu5b;Wfh%NxsAHCC*sDOp@svM5}+ zw5f7wV>#yxnkh8C9Q74T8!MJX%a)prbJimo3hm*u`E`^oLMg3cQ^_J{BJJ!u3K!w9 z0d|hAK=5q5PF4oZ%U?i=%4u#oJnLNxi|W#(+2P)_+F)mpFf7T^@*g!EZ9F9NZ$(#`? zgP@&Pvk_zT&+z9OH2JFr%2#oipi$+l(MOOx&)uRFd+N+B=wuV|XTj$Tf3D6dtDU~O zW%-ha__N@1&SU6thCc_va+W89ojo+pAZX8==OvF@qP3n6`>p1ZkLJ&Q)yE{l$nzRJ zTLu@Sf%nju#7`*+PR->j9*V&_9!G zNmb){Yi7}ipN&6rvSD;xH1Sye3aKC>BPB63byjBpKfWLjD`LF4JS? z8(}AAw!}GdWb3eHEoUuSVnPXQ*^ESt;fIXzx>3Lx@v8W|JwDO0Z=maq4M}9ruW#8R2e_ zi~8KVLj>-XLBaGqd`HzEqO6`OXYV-wUhMA!7;AxDb3k+*xUYS7e@7*O3U(Ir^v^o= z&z@=yO=q;$JVp$oW&pC0WJj27IUqW0cNvP{$`^+@Z)iz7*>lnvLC0|9KnP8PzMk|W zlLkTa&cLqS!7=?kTdJcr^$cVmK70Nw7Y=mDSYfbvZzG2uwrv~ihd;l2Y8L+u#LVz#RL$RhV=rtO zpXc{3A3_36ko@r0iSOMwdjG<{cP<)##)1P2=zFKO>-<3^&~kykx_|Q0-i;UcY{Y-# z)TWWs)5E7{M*GuUZFP8nba#h4Fx&u}C+gE}9BZEU$6e(OeQ*44977AW zp^8Ex>ep7V6dI^As)s~Vpjxmq%+}n7-QTCfVYDX=A}U;xP}h>+KGtyS$2`CPT$=AfEqBM( zbj8NI5{Pn#dvK75ax53X*}}l7QwxhZ8-MnqXh)unEj!Mv^Y{d!IZzMaoNmAlx`#T^ zY-2wMmYHXTgVH^5Zaq5KGID;`3@*?oI2dteGvxW)?w#lMfTP!)nAvRp8+&$~*|p=` z{>dvdLzg!8A31n#)7}4l-Jk#S_+S36?+5=l`on)7_}+uDzk0CdZ~k@TUwk-v@^4cu zI~rHimOT5XtG|(p7e~CfCc3&Tyt1rnG5;Z-9&BFM6&V8p!-oZjLBT@M;AnwjW)WTr zBLl>oZh1&90gfJ9g&-Gy)|A`O>LSn3XstA(CFL)zC|sCZ^88Z;fAs0v&I6nO{e!{3`fc*&Pui~heXBDn2N4tebI--CAMw+J z7q$2H9Dlag=1vBdlJlPEMdDQyDdmzKSVcv-y`|Uxd-shW`EMmPXqKFWm!E`Azlt3Q zifYiCOs+RsQ!45i)TTWdDf)_*%oW|Qy40!L={rS8S#69=u>(^)Hb0BF)IN-a7Sg7D z^kDi1SA~TXc}_01KO?yoGNlbkV9{#uMfPVQM-Zy6CHncGRjO-e?Wt!YC-j6GgB4c! zg~1-J)fA&Xg_?sS_3pPY%KpXZTR+8rqvxHUK%x1{47~FXWk3Aa!{`6YzdaJZdwl2B zQzx$+-+T4+i92TwlUzQ|9|Y~caB%Oj*=;9gw!L*^`q-w4ijtA0I{Q^ov}Pd2QG<=+ z{P9k6<2qhoj__+JX@fr#m~!wMLtnEL+9b-bVg+y*m@Hki5$r5IHV}k#Hp~w7YCsx@G^2K|(p)ifhbX&*{^|L8wyTK~$ApT4ae-?t~KT>H%JX~LBCm157 zZbJNA*21V03Hf!8I}~*s{@j*W8>wB_lN!By;NbP6`>!3`ck|$ZO9%H~-M|06a|aJh zZj07$9%$JXuk6C-8B35@O*&Q$*>2`o#=e#<%^dL^S=$kr?7_(yO-IAHv1O-%1}Td| z3on}@I)I~TQ)Cp;&X)u6Gw_+{NNk2||dR2iq} zr$3kf_0Oz)_6bO}c|pUgo#xq({(wUC(s)D@NTxk`Cg)_sc?fzQaGrNb^SsLAFSGm^ zZF7J>D>wd3J?OmQ`SW01<#0naV~`$8-t6fyte9DFG`7#;&jzTSv9q+$jNo4?!A+=W>=`sx+^qJlDu`>5_ECvX;`N$&%dGlAI(G^Or?Si*Sd=VmwsF?Q-JfcIKctX_SMz?N~sJH3*Il zj1?~;5=D!W1r}I3%hfr)`sJ9ZonMfzMTYnxRn2>;#aSOwLDYS>vp5ne3>ZM%V;olAzuw)Dw{pkc^%Mxg~uJb%vY3EVDS*;Q&>8fmoO zS(nDHtMak(FgFk9|ICJ%Z)kIp-irJb=PjaqUTWsg(m$hHrt%o|vXSJ458>rUU~*kSO&R(Q=%PJIrs(rel;mY}(Vj5#PU?;I+*nDlVcyhZ zFQtFxHPfu#Hyc;IG~e4f2%lY^X$#a5Kl8m{#us@nca#>I*KxEI-n*U?^s>O&^JFEE zRi@?@-KF>C$T)RSbeo7^XNa`1;%I{%_GkKM=l|^ftib*vz`jJrpF2xdm^DWe7SQl# zb9=_GV?0zxIQ?@CYeB>wI~x;DnD572g}cPU_*%eq^}zfje`Pp*cW2+#nKt{- zxAxzh?R#xaGklxF_<+v@JDZJ01V;YVA2(*ZV9}eCwdg#he`cZW6OBE} zpEHEn%rRU%#GmIJGmJSqduKnwitVsJ7vysdoc-tEv-Hp6(!giLsIXifiRLV4HmWSh zEanVq_Mrpgbm@AGCxaHj$O6kSK;wj2zvWEP(Pm8v5{^d`ELjt^W9i0I29pPx(lecP z2Sx^GI%3ziG~d`hcz&|={B-Zdt%LmYU7c#ayrXxty>~2Z*fYbQPvH@Y^2&9c`p_$+mFb`*bR6n`d3mH=A{>z5bzR2E#`zUJceS}dS1&8&H2YWURp zK8$zXm>t{P(bZYkI1)2&3P3U9XYpsTXyIayh(AeU6gpy<8UqbUpfz&bUSA0QY?vCb zjFZMdw1XIobux-1tD;N6WKWoTqwNZ)@}osR#q6UY6*M54Jvoc8yU`dp4?}&rr{~)K z>H8-#{Q2H%JMN#^`QG_`=%2rL^$6q{2{ZwJCQw1+!U2DN`}|%&v>9<=0eyVyEnJ{a z&Vrz^;JA5s>l-`Qp5L|pwW-mQn?_Df4ZSftGTPRctZBjLxi8*1nCOASbB=l2@;_VK zIy3y(kbThmDo_{HCg1Oh|QujRp=A{UzwU1_%^QAULcR+YdPJ>oy z33+fUKg$kG`Tez!qC$7n2LzF66+L{}nbO@UQsI&y(Lxe!%dA#$NupVDE#Yg$=G6K3 zRVSAem8-w=-p_{K{LSEg?>ron?+p+%a zw#jq5HXogu?2h*#;lo(9EyAIA1CVF*&qkX~-fS)thG#*|*dUup#Q+$Y#H7*gcs}FL zPU@Vl?-qPU^DO?Hs_%wBQv^PvV`L#RW6msN3C#{`k0e8VkS-+9ug-2pn2iMb^zND0 zwoabgy5)`CyHDvGdx0fi`1p-TKZyw7va5y1)C|j`x0*xc@=- zyC1gS|9R)Pe>3vu|GM^XAFO}>|4gsD5MEMK^UMpeMJq!qt0MW;bvdhRSC{p-ZRVsu zAaHkl0_5Hr9>Go)FWGhj!a!!j&cI$%K|L1D_=Etfolr9)U^bC6Q}A=XZUW1~ zUv`Nu+HK3&78zxKb<&0*fFbC}C{x^&(K;jRdqZPrCOeWFJDYlopI=eEc*W}Hznu4l zCnF>0$N%<0-+RAnyZ+;r8$TJn{ULuS!EZNA?VKgXeBT-8ylwB2UMictlR>GOSHcN^ z^}f+&->o;TpJ1(6Zf339mQ{LVDKg7TsAj#5%z|O{0DO0ALwkm-3YrQFY11lh7rZ3b zh9tr7BbuqRieO6HO24i9s_1hr=?w0`C9|q4(L++VkL)DS>S2~dLBHQw3Agqir~SG~ z!Rcg*d+9roS#?rZvlHZSy?eQ$p- za`)H0Z~vtCUHggA^Y#Z5Z~c7jy$_@B{$uUi559eJ&-Y(#y>;^FwPSm3o;rN(^u8OX z4qQF4@5bR>*N*OcegEE9x9&c-YtK7})~x9mD=AuUhx&yFqm3h-^%KeZ(R7^=<9JP9 zxS}i7G@Pg(#u_?NXZ)GmKy=eEzQ+U=I{6k5c9vFIP+GvbwaIKN)T3D&@ni-gyMb|o!Nv#49OXB za>kbfDBV=tf~dPCx-QLsUxqe@ss~QbzH;~Y!5atn-9B>Q>aqRTjvTvx`tbFmyW3)0 zyOZ0x6QhxmR+x6Ox{YWkZ^s0?E4i_!dAcREwl%t;ExD;Vj>35ZRGDYs0pQO(50@m2 z85fQSc}4|Ioqo+S0;0vA?FhouG(R&NizDIkSVL)|rYONPbam|NOzvc>p7@@11NZ84 z8eabLg4{2E3jU1$#^NtO@r}#F*p$628=v>7?H7cG-0C}P%O zXxgFUIn?azIDEgai%4rNImu9c1q@k+9sp!;v6^w%kk5wo)PSHZBzVS5L%dqeAXA=f@)l`|JDaa`20;E?ib$l9MRUNtP|)j6!g9 zeQ{o*co`z<7)JyaEQ#eWj;~%6Lm|BCB{*$tMaEiL@=-hD4UdB5OInsM5)2f?n zFVks7cYvS)=T%D#++}ez3540S&<;KWoHb=01=&2<9GrzetBnz2CeCb$bJg&pJq(gg zLgpKw>4*7qJa;kfAIP42EAl#umS&tc;KpT!e{t225Ay)0_*I$t^B{K07OT0$rP)VJ>q^eVT+FZJ)<&ykxr{}IRLxn2oN?7K|Ba*>J1c@cRBSdorQ}gk zZIn3LU_9CJ=h6B~{xBi6VkxHRd@Di1V|jnlUABsb(WXiR)Q&&X?D@0hS^ms!=5*mg z{FzGyvS*SF?rDLppx|?xJ8tgixHgM)w(IJ&c`sj|>Ak&u;K*=lxS73 zyj5qY98_v%3UD`Qt zX}0sy*7h4a`mW$(Jkxc1M=y`DDNzG=WoOPDG<##FL@Wm?|qWJUP1+MB2!+V0Ct(iJu*Oh9^J5pE)YdtTsG?rU9Y|sfH8MZ@}5f zk28c>{5d0kH3U6Jo*gBIFk3iaE0L;=nlgNyB8DUN2S-v9t$o{C>fYJigGlo1<^j%a zyg1c+X|m(m_U@fyef%{&66hg!s@>dOg7j5mg^bx#hJ&Sv;P*Ukt~0v4gSo+{`&f4{t97d%r}y&a>>mRdQJrm zRd$>?fAu5$IXe}w=Ah@X{8|1OMtU88mb%!BjV&o&rOSCd*;8Umyn99#VzXheVUA0? zGYTDiW?RF^j|&6NEYY+1hw)C%S~8C$KlajivV+g&t&wHU!Gs1bkv&_di&zQf9;HpI ztFZe!z9xNj+val{*WB2-=KAgpSGKRex_v##@l6x`P0^luUZ*5n6bdc>4fwO+=x`cb z9K_Cp@peK!%*K%6%&r1PCWfLN1bo;?a;&Wd`)opb-2Kj{O*;;sq; z9U?PSn9`owja-0&!~+d_C<li_1DMCmz>mNWni|3G2_qjIL&Wv{X=FgW%+L=xWKEtBXFvF9Dnhic@`LpSqC4`pk zhBVL4TG{hwmh)%(w1K9RHC^1Lsk&!oWb*R9?Z>xn;$T7k>i_iY);IRsKl9B{Zc%JiRn?-E9ihIFwk>er4&&{kK~^m63@#QQ zHf{`>cJ8upW(68f0J0R$hMFV%jsFD|*y#Vo;# zq#~vegf9Kdrq@jGzxr9LSC>@;muhB~I+wv)=%%*GZERkCMyOxSj5H|h-OE0SZlqDS z&>b0lGyBk>QAPh4yx0U&s+0Ija&4uDXNgvEsfW?S>q)ebeiHvkY^5dowxS>8&W&_a zE!XW>LgFi2lCu>*a`_RbO|&yPvwAQRcB4+{*6dFMTWN~Xrku5o{o`hTEv4q*!eE|R z75ELvP#eY-9l+B11%*WvBEk8R#Ow}11wZ3C6723HpL zB?4XHnw~`UV5GJ$R@DP-1~o@&Iw8yeXE`((VuwH1369poDBjVvT}q4@20^1YR$~n&rga)~qvJED2+^|Uu{Ys4a?KkA@q=(K30AH`q# zA#60@&x@L|h8F((_=C&7`oO=JKR@pHZ-_b?1Z`B%*gj+a?8>44kfgVXFZAPI>Zq#3 z>a(l5To5$!W8~22oJ~V`ECS}rG8!3y!&R%;mx`p)U}ei_p>bo@Sedg@Wn!(=Q;MB& z^8i7Mdf9+zh@5g}&C6k#sFy*?E@YN11qDI7I~a0l4yjCIrCU+hZ6wgC!kmV}oK!(> zV-efNi3>-kZcvCv$4UXzxNx9$j#cGZ^Jm#Kup|>1GqPu)&4`&1HX9a=3YrXOF?J>i zmzHMuvp7PRWYCf;Ga5<+GSeg|20=?p6}`}CcxglNG8~oJg)oqt*|IX@aC7nT&ay+z z1&3Nn4z`pXX{kKjRdb@fw5KK)=)I~SqarV>DnFwdA@r(c@uF`9v!4xMLc8J_S}0SR z$c(d|31>eWQCV`PsG2dV1?YjGBQJal1P$F)Hb?+N17wkmEPo2ZsYV=Ztfmw$k^QtF zXoxh}IeQr`Ni&+~1)hx8fkD%Vr7fD)vlc<4srJ?je}*t;J!{Fc9NOmL&#*@Yp@P~d z$jE3aeW9rc+4FKEffh$);B#APj#^&mZh*L9SpE!)1|8ElrTkg=utC-q6gz>T#41i! zvkryHAmX0tJcFR~MXPL_F(A(!RfW=w1qU-Q#DeRE3BlSW*~*`lPNS(-{wyXQ75QCN zg^HjFWabL_CPjtNDK@DzQfDR44uv)r9I?-$%H$1Lc98P&rxz+So``9)V=aRA7<4F1 z)@Lr@*CT9R5_@^F_mnrU{8`U>^LGR1B^fVs=KcKd!Ol8%5qVY$Z7gVjw}~91f_Cw; z!<==;Orzdk!k>{$^WjSIgM!TGjqe1O7Zqraam-j33$Blc6e(MbjFy-@2wF4BpPd@9 zxd`f6%cv>42b5-4yShr;Ex4AKKXYI8xlhBN*`d`Kbd{MD*|CJ7~m4>LJ! z0XTbNNkWOS`#^^ruI&v3HaEqu?`)skmI6Ktf8K%+y6xK5mg#LBd)vZd%ETo?vh85M zuU6+5D~t#(AL6+I7Pc2MlM8%y5wu`uZ3>EUe&*Lrz*Xos8(r|L#S1%oE^KcX=jYMX z)Q%pm=4o|6p$v*|1n@bVn1bBV~Jf z8k&P`FSV?EZBO@En8~`vt)%A-V$C8A!wSS)NHG+!YS7whs6+Oqka(9Ota6xH)7_z9!(^ zVqOTb%it^|8Q*V+abFbYjhLa+F=FMpec4{F35_S#+(Zt8cQj( z@Mp%#6M#ZH`sYQY8o4suSc$RlWTS<)3|R@Yb7)+hZLuaTa3=7cl7Yo}xOw=C3#&7; zH%Cj(ZyPwjap=qfd^(pRt36Ma%w!(#QDh3sp9p z+0teL7;;;vfhPRf)i6VkyF*QFe(}nn2HXmNrYV1JtPaDUb*v(2dJ{CY1)BiK(u~eo z^TZJ2_HdJjKPS^zXSiBu8!%jEaPy#MU@wh8=LA7(EE5_BX}Ef-Dmf5KUfeTsV{FUy zBb%lUZ$!!b^68!M=bI;YzHYGdD;HjZLccXN_WG4WH_z|84T!$D|CLJzZcV&6e|FF9 z^ZRa`+BtW8bas5poY6mDKZ=hoy3L_;JBG(b`q||1+Sb7}&FOeeoc#wI$}1ze8O=56 z!O8zR{EwfeZp-$9kP4V{dhR2F?zx|J&wnh;dH%hQn?j*GQ470B0g?c4a5#gztDv40 z$UyzA54vAj(7q~p5XrPkj$I25I}cOg53Dl?@o?3HXnw*;anOE5vehE!OVKgtcutsDX_Oj0eP*o1q2i*($S>Wqle_sJ6tR2bsjy`0y2yu zqe)^}7~~mK+?n?Dj_ifjL>_V!5U>Ft|NY}t5Z)5c?4H;!%Dd~nOUV_Vi99^H0ybKkMf zx*emZ(r^B{^}D}mzW$;7Sb*0KI~trQZoJ}k!ek~v-?=2?QPl2w1Ue7WKl^p7DVm-8ht@qBU#kvOXN*Kkon$a0-&k(f$ z(%aP8baLwT6aimU$y4RMXAm@HH2LVMxsb6#v7-p|idx1Y0h18W7^MZe22IKfs@CrA zjXQbw#+iYPPDsyKd#IK6lm>hpI@nNPUjE8;-~6EOmia3*|MB45&*QKCYvo(NnK=CN zTZhy0Cw5GZ@1H$>aPs)r_2Y-nAK7*3=&tFb`%dlJcXadU#7kRVAM5W8#U_d$6`VR##jSZcA|(Tra8139PQ&@5Byfu;m<%|#l=!n-75-e!aQxs?!)$s*K0D%Qf!i~>=(<4}ST_iiW+1K_g3A3= zcA$C2!9yrC7SN?hc1~nFKlpQXNvtYA!W|`o>*D@_@{+-}#=$pE9iBS$(zzoCrjHz% zJamZum2*cxw$p9rPbeGUD6P)ZcbISV3-qK*%Gd5>1-NJ$49xM@bKU;O>Ctd z{=62jobZ{=2N6XF#cn#`ABHd+<+Bk*`-jm^lM&D7@H&D7isrgU@{NzGol)+{DST@6O$x zzjF4q3#VV5x%B4DWLLa;*_ZEo=HdH?6TMBfjZc1wjR@JY@S$hFa{qIWJb-HlE#uJ# zG9P&WU39jQMgyNSzVi9!ANl-qk3RJLpFg}5K^uc;A=H<^trwE45@@8$l|^bw zfQ^O-p26MXydhh{VNjrqT8rrwWuug4D!r)SaW+FV{2AplyUa8c;su?<59gbU3)rR* z2{bHP=3!I9(tHqfxI$FW>@cX#8(2L9pF^d~>I$Eg4FnBg7JKL7%wQ3^Wwr~%Evn@H>UVdWj9o1uS*mkZC^Rj zkzb#aQJ3+oFY~!z?$gMgBU#VGhXX5~N*JWc=dw93*PJ7_(ty@2TQY@G)~4~Q|1HzW;8 ztPT1tK-D9C5KCZGZqu3{d; zl>?zw_(-s&pxIT>4@`EzviZ){@?-)E=(P!RHkB4WFVRRlifClRxFQ>v4Cd{vDdm%> z-!!RyJFx5t{&wL+t(>_(PzH8({5Sl_v#ZRha(pTV!@yw?Ij=@jy%;`oxGo-&JmO>| zyS0IR-SsnjQZt*yb@}4vGzj|grZ)Dl!;52UeNCsYO7zcywQJ=P5O|y}0u{3JV6;Y> z@!xQ?%@NF>g)NKbITTzI5%*>zfkp-G<8tJ&sHI^*osRm}btW(F=(@V2?d;Y@w7XNI zEmt=;VgoWW+Hztr)*ls1XCtB(w`zv7p`J9?epxxQs*#2L8p2GH8jbtH)?Opf2V@q* zXCFyeF~AunY;dvYnK@xB_y6ZcSL!zxS+{nxHIu$=R+z#15DHGWRQl)~rM_rY$+Nc_&!>Ot=?N zvuO$DhZf3J+*=b09bw-$QxkOb&+?rGuM2rp?gm8nvf5C*KUyy$=dk>IfLE$NmKaVX z^;-{;{qfj9yq+XDx-SqO3=6MziFZKIx^dg!Z6G8(1f}%L6LW8qfNN3H8T8{S%=2vb z*9qV?v^fHH&R>?mf5TXCKxJ)1BdzqqmAlVaCB}?%rwVo8M(6C?&8l5 z?~N2LfMVTN5 z-G|;vjY9>3uXP^caA5&`Fh4I+R2V2Mh?eC0a|+Ytd6z*bom#Te@RyETgFsPv*phox}6vqjN_$&m0|{J~9GH#{3xz=v!y^AbWoG%8@sxj=gsE zFzt=Warm<&FCBR0;yw(b;m_AkY@aziI&*C6+^Nx9yzxg~^6 zn!%)+q0*uTCZUl*L=6R^K(PY>lWQdf%nvCNvOOoe8PZGAfMsf|6NQ=Qz&$?P-=aiu(dI{x7x*kO?TBA>ZUeOZ|0fwWCj1|I4~wTzxdMuO|Y)2N}h zSJAUNge30`y^6d6W|awY#F|>WoRT83l>y|i^C07 zv4)yhvbL$o*PZrv1Eo^|+%{V3>(T<5{hfkmYr0~!Z3(|@ESRWBCo4PZt2@}CELGE) zKpHKOxl@c@tLfQ)ur*#M*qJ;~8uIM)zV=u}8+IR5LT`?2*mi#Vmfaf$53d^;+q&_< zrVR%-Za6gBd#We3XWLB68=oX^|69}admwk=% zu;*_+?fJW3Bu1`Oesg*CH=ZthI-{py?NIZ^#<=|Vu&Hh!WxQCEVKH+CI5&j`A;Ump zrNnS!0#!k)B3kJ*F*S;ml`~txvtVQcnaR+a!$ZtTG0%-rsZb9NCrLIOtQlzXql&~$ zn*Yh|ZmH_24-Ulx;mkjOqG8MY`hU99a^vIF^n2Wk+|=xkfs?#9Xexg8zAJbS=qY_; zKz;GY5c152$PCc}&hqxwcL)JVGCGe;>%O%#sb%zyRDz)0cO9d6Uy&!!A+}O8OvMZ` zIT+l0idnfXo{RF4`K)n*GF&5>aBWxEXJpb)Yu}(b)k{sxP+~wa&{%P_ zP-XGl5Z`9-GW?ceCNYG$x2~iC{WH2{WY}yU#E`JRn~xio$V>%x7V>P&pH0u&lviIph3XoM4`6c1|pAAOJ`EiW9+=&3p{wzSaJ6)Jek^5571*w*T6ZL)VP{ zdG`4Dty5#S#t)|=qxJqx?TyCe6s91xFhfXhhMC2uN~QfS?--^BVF2 zlErCuGc=nR0&pm6E-MV;dr+2x<~h77kDUiW&Ax&c*lIA!zJ#SK5IKw5xi~YqDyOL| zuX$B2-qB5~vKv=s(VAA~kfAk#po=qr&oly+JwuymAm~Q0bI}TFno7l)0YNM^;eutp zyo`elMJGBdPPX}uwU!)iuNm*C8|w(1>aIH5TQkw)o9L{$*y+367q~Q7cfP;!cxOq? z^5t~^u@z4Sz`|KCh#qpqGU2+0`#BgHAu9wJ_>4f>&_xv+N0)y~d80C3iI;s-SfcTQ zrUyP-q`WA=|JIc>+x*?dDu>oe?OA|rELGO28P^3`E^1aTYr{n(X>miD^_l-d3yDK z#`zg`&2Wc5yV!Xte>QkoMtLka>{N^R^UBP&Re3TSU$0aZS_!mbZ6we%zIG9vxr&+Z zve8%qnPaY`S@RZ6d$F*_w$cVmYZO6$27iucnzzRi$ebZ^dfS$eWDb|`XZsT0U1>Aa zXmiKHpJg7K|2>1dMhS2h_`FyG{rmH0RYxP44lR3zZ_oxqZ0%Pj{5e=IB-!F+qiPmm zv+>qgqI|Xp+TqV03yuXe?J?zmY%6~TL8D>rW0!)({5iP%oBZv9{fZR^O)NpG@QbEi z$g|)`aYtHDCiWv!!jUTYLt9$>QuGCeney zP)NvgM2woXiTK%AF)M<$dCDx57PgFcfzdg8kurHKGPDdRt^9e>D33L?AnUNN8_#Od zW5cKgN27VBaj5)Rz_P1(2C+g2g*F@DEWMEs3*d!IyZm_xUe^4QSsGdsZ15o}}8BuCl;;WVn+c(N;;K&9CoiUXWQ*A4bGESgJW za}EA&4~ab3a$rHV1{c#SBVEY26jw4Xe|DIvS(1~#i!;kqy4oeD%!MqqUbvilA-R2b zh{nIAH$rHa&vQ9*Qx|=;PdbmE0eFtwaV&Jn3hd;AOW4^&CgP`&I3pmPW!=DvF>qF4IJ}bkh1Kqr@qU`b( zOcoaK|53P^#S2ylc{cDlnwRN-Usq=ACC?gr3q%WT;PV15&dssR*#>Z95B^oZWhbKq zSW&R@=la528v11BG~#6M*gP*W_RJ|YI*IL$+5^rZlft_K_Exs6yfTn`y_JC7{B{KExp=PkK zvSmFaSlQY5@aj#I`XHje3hcbrO022xWR9 zFbIKM+P$KH9q=8#(~wo@)|_C>mYW~6U>SN74ek3~*FWr-6BA>m(mC~_iZvL{{JI`R z986AuE?bA#QE(m|MGXUOnatpTL<4FJDxt>Wqb0L(=$)BE%`k+#jRo?ULjoFk3iN4k zX<~W~X_U$B8#HGNIMf=QkQrDHJ)>v@oaK}b)M8C)0T~YI?IE!?$W&5S?uirP{-8Y_$u1Cw)kQ`)YHlqb0sXdAPAAg=a-mT_>&8-`S2py0*Qk z7Ki6{)XVjOc0hE@*D8J;fv!YdhtOsmIq-;Px52u$h)>KqfX_$};nMh5u;UnLI#JmL zwv7jY+r7TB_BHLpr#5dsxNhX7^}~BNtUIv*=Z)U+&fwM;C)?ltwC(mU_+3Ejv?zP^ ziRsPKbC3Fnc$nO&zDzLN)Z|YZuVJL{&&la`+F$)u$M-+&y7(V!mgnVv>FdG#)KGeB zQ+y3SkmtwpjlTZ+KyS0JUs1DSXK=AnXydQ}jus*fOjZwDVwzUc>!Gq}Va{kcjh{9% zFkC4#HT*U|5g1I>_F+U23HC+<9gzUuCWCPAc%TopWHJ&h&GB^~_>Wuv=}y~?j~b@< z0*DXhN8A*Ro8?Xk_?+^xa>(0N4$X_sbKsByZNy^FLcROe(&6N_Ob>M|J)>-%sW{8b zn&FfjdfxnY5?zKeViTKi%Ys z^>TV$y(wK7Q|a;uxG0snY+J(+niR9CA{^e_uU=7SAf~{6(V(-@E5X)E+v{xfT;-mz zp5iQxCE1|om3IeU`DNED|C;ssua2E~^X(%IGsj<=Iko@V2_(=j0-~=Red+4h-pQl; zE+0H_Y}f7+JNLYLWOz;MhUEqQ;_zIvI#i1nw2)yX$p$hDf+m0r1Dq8sYXN-K9D9x{v((udffi$2rJ)m0vGAx>ZLRF^AbHc)(Wv{~_Mu{H?7SJ{Pe!)wg z4bYb1BnNedP*r<%u{duCf-Y%5M2(enU}dA)aa85UFqE$MuMJhLu3kB~Z^QQ2&mNr} zKYHcJ{>h_9rpAuW9y|Qn*<+(?b_J@|b+>G54XySSCgYV|cvJJs4qs^sY~IuQP`8^R-r(0YnlYHMg)Tf?4?<`e0L6Uddb9)I93|LhBY`M`aJ-+c6q+3A~8^HZlE*-zUchlSD%f9xlKYj42uRP3-gurBh&!$=aj8jL! zpWXMZuV(#4cz6G+n+DjKgqZ_^`vD*~-vx=1wTLh^xhpLwpI)LRSHn zMSTi?R`M)X8^!~~nNUHrvE!hC#u~uXdX{38HjrmrIO=n=;yD@WDJ`@daE%M}%KT(m z0X}Cwi;TN~a8ZkY&H?I{GbG=@OrMCWPvvtncwLOYNd{;bV)ht{)_bTeYdk-bb0 z^{mRCRktZJY?m<->!Emk00uLks%J~J<;Sk@gwQ-vJU7Jixjc(z(6Q*ByDP;ATH&+h&kCHE^cEUB{8`l0i~OH0c~-?T zVrB;~tH{~(I;S(0%^M*!oSY$@Re8LPl|MTaTHn|xt1HEVL%uICKFn&SAuM{iqkLY% znaOL@dLEiK%Y^S4Fyx;3&l=9VLiNwyQ9_Ijf41n@8)zjHDhIy1_ZHh&%Pe7Da%l6v zGq9KQRLV;9{pNWGx;Wa^Ie!+8<`bd(IiCF_`e)&~!E%Q`2PzN`D}NRhbUdU@d9pFJ z5OuU3NFRcXnLcl)5&`#(%Bn(LZl)g+E{2)_HM# z)3CoB{w&jq?Q?Cv;m>$(fXBsrLzT}WQ5Kc5>x`iwnhh2)c@`Wk{5crFh#3CNA>xl&5kJG9(O`@9$JUO6?a?93Y~jyXOd|_tcrXHj2AiW#_VQ;J zK|A{cicr~X6sXLZ-sR6Ca+Wwq0d~7;z9Bma+9n_xQ)uz!aFPa1OOkrvvnrg8a9a4Y zxt0)h(X1+M_E=RoJlTQI)~do08!zF^zvm&;(Guy-c$8Neyu7+0magqa?{uiWW`29) z%+8*(>-#20TJYA!rlZ#%!rK8->hfnt{A}4NxY9O=rJ&C6@1oF43JhOGbBiP!ye#5d zF@=bsp-tBYu`KS3CDaxGR@NU)4#pbjmKKVq23DF|a))z*f(? zNj+4idXM#+;)NOxJ-49rm9qrOpE;|~K~LSYcV@d6kyfZ{FTrpvw(EyHYeNwYe-;pp z%QP271&t^=8aIatV!*PzH)4X9S=%6xIT{C6v;W|5JUWnw(>NS7Zw$5LfM9buX2yJj zyMQD+kXa2k++LR_r_7UgdX~Yr0}&PwZ740~|D&MC3AV8?@EP+B_0|yZYgEt_EaA^y z_`EcBrOwc1CC?h5SiYP6IvKo?U2dExDu6$$rH1lnvB;3Nls_*a%vQIoR?K=<44ExY zc4x2y37oU8)LFQ(*8f)c3_ZTPd7-p&W-EC1B4~}JxTH8zR1zvE=GL|(s?V(MzPPoY zZ3i!m^q$?^cXm_%rIDV=-RrjZ_BU2Vl{RD43^WGJO7rp2i>n(3JlXJP^v@!Jwy~RE z$bgO!Fw=xZ2kMzk;j{MGF9V+){%pvz0%!O$13|}nDE!%_&G!r(_#9|%GcE0R9X!;> z!_zy;XEM~7Is4*mwC38z=9>7aO})2I?V26ijDg1Wv8}UXTj9^>pYe89^9_{GuUO_*DXGw64w*q4npl7al!H^$z@Hh;@A^}7KkB&tPWRl$-8X(J z!(n~1A2#x1e^g z1kUSD5b0B3b7&N2^;Lr&=(5$oH4vt;D1&E}6{ zqH^OW?YBPQttgOi^8J?SkCSu1sDJsBwzuwde(%%%@BM1v)t|Iq_?RCAaHQmj%T}^czDPOu7?CkHvxT7`L zgQ^+w90RNJ6Z@*Z=GqQ1@u(34SQ;Q29F1!yGCx#mKzBt?Z#=j-zKJ1?Spz-Aoan(?@Gxx~5SCpu{E*@CQW2bS~^v0azhmAMh zX`XzqW$HcN%st<`)A8DWD=%#bJn?KtaIhz_sX4qFCylVL9T05@vvOwHb5N-=JpdUs zCcp02Cdy1dR2hx*kb-3e&h-Jo(b|wciiXpaDSsByju&pAr^U#vBd$UcT_`pMINPz4 zW4OGsGB?$I_CF8(r{6SP|0pr@V<>vs;9R{aUUw1hnj7RE^*unKuQD&R2J}?YGfI-? z4G9a?Lo)jABIBJw$LcBa`sQ(FFcWf0$7&@t8qgC{NrS2KGX%TJ3sor+TpSN{jkhqL;j&^dJ;T>~EtE!IOVTb!XzS@Hjj%Wm*X=?4H=rwNe%OGNT3S)bqG4DqCy~bh{G?g-s z>jJHZWVFd&Y&W(67uBU|hM22pa!F5Kn>+!Gn_hl*{rrd7uimMh{@I)3LpP2MzkKX4 z{CWEHzS&a;uO2;c@zCCj2lre!u=n(fyAN#LHviI&YkT|4D_5^t)gSeXzL$THfrVY> zjL4a9RR&!CEaGQxQ_k#U5KbEjG>4L}6O8P{{z25j#v56jlN|{$yxK5ib=9aXPF3cG zgQcwsmId>Q=Z1r6Bi zRuvAfPLIBI@!0&aL)XR*V*WfmJ~ne~{Edr8&%C%VShv0{v8lIlG*;Ogt!Rr^w#O=4 zkWXWU-P5!k{!C*YNU}Du)WFGE%%8>E*)%oW7y?j3o3)Gp{WHDrXa8E^&w;h@XWz=! zikx6=L1@*AP^6~6F*FkOtw#cehO0F+(wTa(zx8;^zmI+KDl#8?-RtN_~W@R{bS<5KRy4oFK0dW@bh2$V#Zeu_PzRi#3YQ8Jg~@&WoT#g~Al zfpgXvK7*8nFq>@(nTHt|qU723WT=sRSuwyF@(hBOR*;>{&!SffjS&YFnvDpPrTNK~ zc@3-bQ{{Q+oZ}@cqJ=ABMOh6+*+66Q{ZQIjlHFL0l?Ud-xnNI3t)j{{#?+L7ph3+v zKs0@_Aj8HfiL)5!< zx_Y9g=2EZ!Qcvi7kAG%u_5NgDZAJ#p8+dUdwBnG}&=Bz#&s(Gf5FaH*7 zQ@CHoGeQxUlX+U%Cd^Q1@CpY(t9lu9Ec{tFD7+VfUc#S2&<=SvWKX!CS(pMqU7?rt z$x@9yNFw8@Q05a{ofRgs#8V=i@j`3qa`tV6KeJIF%4dPk7;aepj0pzT7KTL&-Bt6A z${et>wcvn4!=D)lyH43&A53OIl4k)E30lT%ViSN3dAVGP-5-Xi-XJQb@6$2 z7QlXptWZrkEPN(V{|%#mUc#T5S*>P76kS=woZ`rx`Awn0#uI}>X~ubjqy{mUJZoUj z$|$#aaq;hr?I;3ou>*%){|)EVJ>}56ofbFCfi+-eZ$^tXL#%;^7%w(|HZp#BW4K>l zED0EHGxjQ);n0$2`wsNJ{q7l4Y4espV+K;6vm6x6fAISK<)Z!#RAHN}^q5{)wxfT(0)O7pxwi#E9z)5j`e$Lzfv`|$B+wy2*^+UaMa>GIEq_+pOi$i9 zCGgqEp6|tw?(=vmKykJIF=fcF`8$u!dXeO3wvb}lUZQA z9O_xE{GaN*{8{2q0#oS0coh4EbfC4NJi4>Ne|1x6a~7be_OxOPg`t5c3W8D0B@s?oFFr<7F## zR@$sC85SMGdu_ZB0H584C9+#1%o$T?*B4q0H5<$C8Ia z2U6@L*j!iNe%`&who+Q1HltJ1VN8)zdpVN3uyQ=dk$j$41b0;qk?|*+8Dr@fDA6s zw=TRy14qxD-G1%J_G^c>P9E5L zb01=QAph`ZD<~R77ZLKjPy&d7;sT|GWRw_aUVEh_$_*?}P}D%Ld3x0|Q=p@~^*RG2 zgtGt*Wg4nC#$kg>9U^0I$i{`ub3Z~v3gv5`7nv?zyXluda*Rn0>(FH|iaD7_b-W5y zxR$O#Xtr4l^K(VTH5%(0sB~s9IEblq8T1zs_T8SaJHd0l4S8JhdJZ|7wg*iHVZ zYv%p7Xc07l?%SVqy#8tWjZeDX{MGPxelhgQ&$_4nx%I?E+tZr)%3yyTcC;JTIya96-=L)<# z>N->YE+o*g>dq)$vbF7!uS+9q441X;8`^Yc>y|?sHyqi}KHeSLzjLnrwO@C<@~f8F z5BLVBW18=4#4?@R#A^@ud^+-Ar)DJ4}i#(eM1mtkwY66tr}+eX@9U^1eT_OsbONoaCHLqEYm}$*xd?^ zJT*ekjKi%~g1^vwB7ufoW4qBH#pA~_um1j>#O(Wt%Rhvl z3te~LpWG(*)ilYrgU)-NLtbBcy>WTpx}OD`;Vel`=>yT2vl{3O9BRGxRKjDuNsZ~5 zN2k(jQAwbACY0Hx-vz7clF0CPLksL|Qg+?>8ptM@N0+Aq>9y%gOqnq4>30!Vlb31D zXIW?FkTUYhjb)(w5VSx)KIFLs9}T=UsN@u*$S_szN4&qT>qc}x3!qzav_f( zoZ*}zqibVk=4TQDdpVtxL+4t2xnNY#(kpp3e}wgqtxDWA&&+yV4SsvC56$-a*T5d? zUu-t$z8|DYNRB{$^byZQUIxh}+=2Ws)6wb^HXBK45uL;Z^e+v|v zIq|XpK_ix~?x-mi%`<&f0oxI#stOad+R}R8s(Ktbm?0Th=PO;;8r%BHnL{x7>EmN_ z#}3V&I8M8L?%<8_@xHcQso+6rNdhGL0 z{bfepr61%!_d@lbK9u#<2eba%@#s+g%$9{TNB?Ys&qB~jl`Uk}zN(F?N=jQw8UU!hd&!Y%~=j<1k9=Y8EZX%Q!5l29c+d*Yi>$o_!&B#}Dnc5)zS0go$lNy4A8 z?|?tkBrrN^>LJVwwAfh@G~~HHe>qL&G~UHPRMkZ{^K;bP6~VlMqp8yQHPH**k%`{G z`N7(={WTN)fpY^PY5l%)1GVP|>L&X9XZylfXK<4S#{rxZ zxvn)d%IC%UXG^V>;0g4@ZNp$dh}jYbsI*Y|C;U0O;)!5}!Q)vHr1B9qFK;f9od@C1 z(u#RS#Bf8AuhSRj%4;F~Ij^fyB+vq)r5Q(Pb`LDeT>#exK3i(d47{cekv2MNJ;mGL zv-q=8Xv?2<4c-Zt>Y~lGT!QyWS9Ly|xw~4LlIQNKVjIA&m+)tYLJNO>LZ6ZsL2Io3 z&w6%Auf&+wT3&9CU4|2zH-H_YuLU&NRubzLmWqp=-o??2l8fOpr*t;&>+8)diI>o0 zdnkd0&!5eo7u9Etm9KWBD^~Fnm`9eeLm;ir!eLZ}mO+vkRFm zZ6;6^G{6~7tF-yI_fqNVpZk5He`b3@ul_lT7<5R@*ZxAJ z&e{|{OKS$y`EI3dXT%QWf?r6t(LsiFRq0Q)@jTN(+Z-hfajEzoM_Oz(48r$4@ZCCfz?HyNlb zoEhz8C6I7dvZKK_91rtMXtC$wv9?cy72u z9G$beYM3Mo4k>(g__IOK%9)q&XGim_%4f45oWkVK!pkO)(09R#*$bbou-TiuJGN!a z!+vuJUwcEz?x=5dq_Hc|9ILA5J#er$aA71pzkA@Np6=#4k!J%l7evmV0Ui}UE^t~) zCOrgIIIZW<8^b(%Ldm`$(%E2JDAw)^o><#JU-lZdE4N%-5aj%SbK4F@cfqkOI!Lb z?cA`Yu_IL#Qs7JvD^~tYjEvbd6wVHRRs^lUSva$C&#?U2A;X3$6FUwV>;UMixA56A zVS+`R*@&6jgDsK|vh%3~OWWPLXtxH=3}mK>)Om4Z5;86R#wK49{yb3M(G%@vd1Gt3 zuI(S0IkNfs_^4^ZpV@y9|BV}GcC*hQs2TmU>^XShC1Txt5HyVo^v!d7*@f`cGY95Q z?U^3iHg|Z>)cB5z``2E7apdG^*QvFYXS>29NB_F}`*+&D^Rx8)Pla1vf6wTRvB>zy z0cg0Py71YO0fmj0GmzJqKu;;YAgPCTpsggY0ECO`{G5Vdkk_e*nS@yVAJ~yfCy@;8 zCT<%aHQ#)%6UsF8!}_Tow9kCN_K1Dg&6Z~_Z-HQ-r{zKnvEIS}8Lpy~hB@_$x-gww zm!UX?HBg|jRw@Y6n7pn^?}eo1^@@uY>|z<6iVLv-JKP4!e{>!u(RnClD&=thY}3o{HqXD`edB|k z85pnZ+=oF&^YjO)xnH!+|1$mZFVnC8Tl-tT>G{r`;kP~=1zz;tPIy~>Yn_U-nZ{0XMUWV`U$ITzb@|t+qhY|U-Qj~-W{jN(DM-V z^|i&C(L=4_xslXKwCAiCJG*jdorhDvXDGKG(ld}onSxUSYU~y5oCFjrf3{NrQ7Pt7 zo5p?F-G!$n^zl8-sU!l__RU2I}%e7C!kyPU%NgFQjYJ3GI?d zGM1jEcf?|JJ>;2zSSM#@{Zx|C^^>PDxh`1e)T#6oF_&W?0U3IG7j~(PvcxXVY8ro|3-+@}(hPDSp&@YkpeioX1k!5BN()bvA=ErM2_ zEXf5gXjIUS3$)T{>J>hV{=ZJZvW^lQ4TZ+2*%)!CSX#)l*?Ev+__H=DWB%b_Wx6si zT36P>)iF^=S{w_=7ehJ_nX#H(aHttLFtir+6ZN$#n`%oMXw`*DOfyhZBZ>xS*ObQT z`9lQd4pyxRRil#@M0P&Y#$|W>2(cLvQoGbmQh|RY$zC zEm75xsOt8YrlHFHt-Hj31Kn2jpk5cS%pnw7IJ1A4`B@crCpu@g8Z@w)8Z83}NL;rr z5m;Xz-he>5JS$X_7h08BU0d8P{F&K&>%%?~S2rcMwKs21C%4Ca`wwk9_twPWBf}k6 z$By2(a(epI(dlD{XHOgjK2IGx$hML*Ck|gff8yl>gPUt}^LPLK)Bo^E{+4eSe)Z91 zU;bRimmgaGHGMb65i6%>P@fg})MT$k1PS&(&QMQdpZ8Klb;P)~uXpoK73 zV4Wd88;jH zap6$@Op*WzGz1%R&TLI3xv3(A&{@fX721d!iitC5NTWqGs}kIzoVMcS$&wc$`72Uo znbX6;$u+5~L(vQUp$h}SiT>dEfzZTY`0PLc^9{K4g}%tC0pG=;$mCGn?7H&dn&+ys za>epu#q!vS7iiJU=YY&AeuiFJ6*RH1O~lWc&(&uN3JS4N9_Ae8| z2SK1&FSM0p;F2xkXWe#C5wrowUjEE$B#tP?fSsi=8#5Zz{+zG#LH!f&^M# zxW)Qs4lOj+QwtfRnr4VJqlM;4@KH1 zJdX!8>rw2C{&|5v8!`-k1{90!2J&OIdbZ5jvS@5EqLKB{KzD8J*iiHJ-K}$5TCR?^ zPHst0ZS90VU!iSopW4xRq&Lw~#pMKR3jsElfW{mCjQ+XSUc&lpV1-Z-Lu=eP(e@bNTbB&SLb+i zFr2YCc<2n^>$~~0OOh>EHX3Fz&~W%Ob|0ui#pD67ECwLr0mANqC`iST!?_Kv$7e(AHH0v$E?Vq3RQYVT7Zjrj(;QQ1y_}`W&egp> z9>x&Eoo7Ku-4hGBoOVR<11C-ZB86SBfMLU)0V) z$a9JeqhQhUibTR<=nW5##d%`9D^|yn^thc!Z)`)TgjdTBh6bDC!Xb#;DBDE^ZMJ1p z?C)8vF(lDPfeze!1<+DiDI(`W44hZMpE2TCilB{?b0jZ^W;yd`1(pokK>0JhZt7?A zjv(0>Um#$H?h1c4@L4gn_SkXI$b03@AZR^H;GkwR50ltK2N#>X<-7@eQ?`3W9XOz#xoD$~jqGl%1!-aV~{P`XTdI^7a;j>m+?5x0tG^{3Y?eQ3v9`fvS8u$VOCMd+GqGdM)WOZOV~C$eZyeu=nKN2w_8+`{YA0=e z;zgr*K6>NaUidSf&oub6w(Dp1zH$E0?8zPTM|Vsf-*)-%$ke_K7k9PKkA#n{TibT^ zza{?mPT#BV_ucro`MNj;bk92*|MlMbnZgtB0!#onpuGmf$`%xN&~pg2AYhc9rPoH1 zW)F3s9$G-5hmZ{dt=Cu%b<@Ln2W7)RP{Ve<@=?#r@8ee>g!#=+n!o!g5G--^UvL1h zGs_Id%z+vvk=WhqkW1+Nx@>w~wvN>su{E01LryV}rYk3a&(L$043#>emf6|#P={y@ zLkMh7fgP?F;uMX%PQq1etn+Y4(>tQlE>9PrHQFoG(#z>6t+!)2#q+U4^olxUNfy`KRD61Uw_BEjv~(QoBarv z6)-Opnpd0}MDHk~duKjWoQV9mW#+@w^hZr|KW};Ym#w#d+5N_E`rrD^n(utF=FLxr zZvL!)`iGro|F8O&zE{6>HrjtS-n=haza_zcVJaGeMS(~`t-mlFTA7GcrsC{QXtv}_ z)O28)8ms8U`Z!$KL#wLn?QZVpd*@UA9XrSWrv1%dG|qm|KL2sct)BwS`N;t9L;H$w zN8B$x4;gx<_pZ0hopNX&vRFXRd@Q#-{R3dTe7!RHPW|`=BXURt+<~f@OMOGQF~8$=CGBZ~Tok8pupj`6U_W5GH2!P}7-ZBev?k zM77w`;(vzrJGL?w$SseypX__}gW>PoNzJ^UoO}oN*m6S*A1sHocjS;*_amdX%=-b9 zO0##(ld+G8q&^ce%xUv{38iK9)G&#jk{Tq|fNt{zhfR{V!wxh|D@X`3g*gdFN6 zmW<^T8O~~f_RK?4Pw7Q9mSq^L3Igwh+&hQ%mWj1MYlvl_A=_m5;L!9b={G*aTt#c_ zB6S9PUA6LHIB=U&%%BgGm_QfFS(+|GZ_3`9ork4rffh5+){wDR*9qmm-0d2@m(a1^ zo@HnwX#*RRVZr*8ND^>JQvUeQ%YRn-Zi@3#^Q~V5Z-08=-0i;`>z*FlJ9YffwNpoC z&K#XSd1!Kc|FxrgrjNWdb?Bv2FYY_BYxf&R2R62^%`6%URri34*=q>eEC^cl%=~N5 z5M~iPo5m?v>w^B-HwZumG8_KPKL>{uK^u9q;m?Aar74ca=p#_ot8u7?qznNg^TUDa zk_IeD#ap9BKrWS*HmlxP#L{l#DyXzD)?j$BLL|^io~w$J)g`H#QjtSfm&8nKU>@8p z%8CY$Y~J_wA{;s%|(|j)7q>M$o}B zjG%i4TXx~Xfq*$w$=?m(-XguOTP+K){Mo3!1xE+h8PiR%+8{vxtQo_fM-q{Z+-b#% zU}aWqMQ$YNUtb^EC@7l^lti93)D+&*l^X4gY)OQ7oY^xze`@@V%hzsAUYI>QHhpSr z=EOMd%JIWzMDcj{Q0pj=q`i~f);n^FW?1D12T73RCZTY z!%5JeQKf|q3{I|+cyB%4a}8cT9P%EGIS<{4PcSp?6bd(+Ukn-^5wDYtW>^`=LlXLaASC{(q_XUIn+$Z z@MkN51~cBxpJRYZW3a#wk)B%qob{~HKZ^uf1<#g0vt=GOAoW=f*|RbeZh=NK@?3C>^WN*!eoZ)jvbCc^&xzqDMCh zH0B%3qYVU2z)NqhD|4D}6LdCj&r&&LLgmk*e6B2&-pHPrr>APAWXxeh?hCvq20n}Z zh^5K|DstAOH@_(3h0iX3wiH^avYFr5ba;z1pMujmufk&fEN>DQI16D`{%pP=u(!k_i(mOK+I;>N!VEPIP>tSs6&H1FOpk1PAReqU`* zt(b2BpJBg)exbYTB6T2Wps~uE`A-OqSRu2bY1{u6^6Yp=yPFtV{yb1ugAsJEubfYo ze2(~~L-teQ6;C7zmJ0;-i|qyu%;LYHOgL02<`}^W0mT6^obvK#M*^+38#r%7gX^Lp zd@#8B^k~=gj;5JW(Hl=~ZJXTEA@JGo=jrWj`#PfS)z!VeO5ig#8eBpzx;BEux_UTP zt^C>XdB)orPmE98m1R9vl3$PiIw3pW-rYzeSpWXg=}*}njyap7>CHx~G_ON?cd zf#D##{^2bwH1fAJFKDG~$)Ozx5w%R!O*)hnT`sC!)ndup!6U*P1M=*^ z=Z-*FZ`QmVsn{ynj?#nBcoYv6Ug zu>4t*)&#@R8(S-8qi|k=pgCNSC8K%vHkUaoD_+8%4O{k%HK03MP-L6s&zgZkGena* zA(YswXV&<$5VRLQtJ+!g&mQHo!e^MXZQ=alKygW3R_6AGn!^L>Q^V~ScC5L)V?Cds zOWTGnZdr{5$LURjK;Trh^5=#Y<%Gn`fgEj;-yCk;^}vjd`S6LZa2FPGDMlPWzmZebf~4xHWxB$<-Plm;AKu3+Dy=@4gRbF&O&X$G>2W0 zwt@Q2?r1v*{n+}!bKBM;fxa%z8>8w1O>pzfZU{5_=bPvEVY{IXw+#aN`3cN7aDhI2 z>-@pViG5d3Y`c79)1mL)+3@;%ZL>dUyZy`L^^clv|BAD^4C-kRKN>}+zPO&`lT0@@2D~BN_X^D_tg`~HJvG(pL*7=!%%aPZqTBn4ekzrcB zI}W*VEdU4EH2{<}<`gxYq9?YMOv2SkvMT574S8Mk($1sva3>vZuf-vadhPX@=pvax z15GNV;<|#M-BX&>yWo_rgg|eNGS<%|njs)hOrVzoW$Oa$8g#)eH-3zfh1Ac(nSTV= z6^DTt%r}rjzXOz(?-Z_ol%DxOW|)7kY4(GLY0;*tW)eL-Tsl4Tq4cxw<4)Xq~TTIfrx ztdCbmt-?w4w+5gh?`kkcNnvIR&kZOy<`T7T4FUv-^F!Q6PYyaH)>QC9$ zFg@{Ko9l*?MPYm}n*FO`#TeVt;LiYLLCyN3ej|Za6||_M#cx(fwd$p>kwjwb0LNhGgfbt zv$jB!+G~;;M(K5#S(iZpF}=QFbOvfjQtzEs>&Z||tcP03Sd#i#V^xf0RRo-+j8gPr1q4_g0X-$Lu`#6dV6NjMv}67pW<(V`yUsIS-JBx z=HKh%HGSp%)?4BNz4GNdZCBrYZDRYk&+d5b(uwIa$F7__2!FSNCqcx??y{J5*HI4b)Zstaw>=19bVbik#`KC|dnD1PGgb;Gxi9WN5I^W_WL% z{EJXIv+`$)psh681j1dzHN!}t{nfGs79Uk6f!P9$(JRSR*mtP$vi#fHnUjk$FyRO1 zu2l&%{2AGEWpTWsu)eCO5fwE0XZUjk66orVSYT~M$(k*lFaGu9iTP6p=T08KdFI^B zv&3iKxOV2%%SVS=cEtRfdzyE5Bu0`otDAg-&4FP)+Kqu>e4*F0zu1x7f>8!w95FM? zV3D!_G2j%`%)hg_1^2Gy-Z@(zTAxJl99mx=+`v*3fsy*?2%gdvS^lEu%Y3D6spw{Y z9v$(m0YNteHsH>|{4L4Rrr7rShRu9&aDDvX+_7^vPM@OT{CsT;^N=G#p~nx+op_18 zlHWcWnYz4l)mxut&VJJT4|jUjy;S-~Us>^uhoAqW`xQZFe%Z^PKcD-^=gU9;P}n~b z|35wr{C}Th4IRt|!-2`hRRhK-#=K=kX=Kt! zrt@>e!2{QhRq#wf%@nki<$|e2IE@6lRFE~KngR?uls`kB1wI$&h$6ZmyAj{%BC#xn zKg*7ICD}=_kH~Dz$CWxSmc9IFy5jms;@WWF(s1y?VBPrv-}!;y`ThtEJC2D#AHn6p z(7C=E(Dd~+H5dCU8%mz9&wC!at7=aLbdCr%dzGpBJFCl4oO2E%NM@*&SuZ zdBf$;U}x6m@aIatnvu;1;s45?^(9ayOm8`}24pm8xwL(`7XnkGmGt-E&&$81#SU&Y z5@p^1TB&+wV);tK_3p6zS>7k+g|ofI!Z!1}0tY_FvyetRDrk_ekYt_%Uw^pf8v>t= zeqMpFl{)L8UPZ4iLl*OAt@-WRX05Tk0A9}|ykogKA0Ix~gLVF{TFf`f2SL7dm8(O3 z{;LCgR{pGP*-~i!`$R_m+hhI{r3jjg4Yb~(=?#f65Lgt{QL&O<;LpNoeSLKmmOn?b zFyDA0Rg#6gxi26voUf<{_-b~6Ki7&cG{({XT3Jt6^v}3$ELdH+N5p1X}p>)vfKKf8Lhf+ZOJuspDF}XXY_m5LWY}skPDSHSC=n zm;DFH3x5uWXb77D#eIG;+yFSQj)mx9&d8o&(O5V4)K#yIMu_3hJ@w(fRMpv?ZI^d- zUD?r$|MT3gPWZFxpC{I~tPfTh0kcme&^T}SBmIF`Umz@q+r`Kf*x2xAacL$Hm@FpG z64T3`Za6uc-2-9BOhOZ>a}?hLku>*31A>uNsO*Y_%_wV_Y#cLO5UsWwN~eik+8o6O zfk_r?o1@qxi0W7-H z*EXeZ?H#&0D&pshqdk|l_0lfy=(#%DGrN0eX7BpLL%rRB1Usp90z&zE0?zDdfK~;+ zzqMbag4Rk4ikAcmhv~I>&zgaY=&`wX=QiyE?i#Xqh3fq5GJLs;8lDK2haRI3PjbJ^ z26b=uhuZx?5Hw#Oh}4-IXZJ>fg?Wb5^im(G7plxVCsIEUZSINlDklcRDOm;^1saFv z0fEv!9m;+u@lkt=v7#ZxgD#2miGWJ1g~aCZ2-C(E6fh( zv9U!C;%6+N)de~#uFkp9ygZ<;CCtB1pmJp|e73Pt=mmgmfH3oiEmAJZjTYg&;V7J) zU@>GCy|k@&kg}tER%pDWhbO!ETF7&(u-G${6Pj%a#c& ze}+8Y4WB896_f;4miV%>)&+_W4|W{uZ#lnp=<2SGSGEtyc7&UT`8H>2&+4JZ-o~1Q z(LXQZ&#-8~veITRh$bcpe_lY)?tX%5!J!;jkh0N5L!RN!Tmlp3wor4c*=kUbwM&e> z@R=A^yuhCU(F+I~#dZ4b27HzlXcf-vHp&3bniTzWptYs0nFaU7I(lLqUD5Q(jcX>h zt-rK)J^JUFvCT6_x6B>eA^pi6>_2$>;(qkc(B_-x_usmB__ZrzuU&zbseLnN_D&t%GJRmp{I0~*ru2(v{yP1=Pt$My8j6U&Zs+Y^bkBd>G2=?k zu(oh1D98xBASeJkXqPAg5Qvp*KoW>G12j;)z$v8%${8r2=_xONwr3d#(9jxsJC6q7 zM4b&(0!8e({mY(Le-4U_Ui+8-pSJe^uJbz6G$mVZw`bZN9NSYn+v9eUEan6POd#@2 zxX3x@$RLscm~#YkCXpklY)k6y@pyK6cc*7}Yj(G4YisiC)K2JjTRG6OY)dls`Of>_ zgG-RI-7~#ar%rwUIo}EYe=k7dx$k{X{R?xAmwve9>)%+DR@U=pA2q%F%i7U@X@{UW zt5T-2ojCC`HA`qhYKkxjwQuCEiAiH)0y_*>ns4{X1nOcH?U`goiAwR!dX3dQOsIiA zuy%8<4nPpFNb_h;JsDzV6MR++d!v!5DCE;f0=SIVhzW(TtZVvR#K06;6Zn0S!wkt= zViI~`p$uU*O|F@_^b1*zdn~jlrq-6IS+{ifN468!sNt-lP0~vt_W7EY2`RP#_*jB# zk)s__!!5zH#+Ka+YOmuI_x@uOJOg;KRvx!|;hj)6{#MDzn^nVaR*k#?)t6xl!!aK& z8wFW|uiq&feS>rTunMmleVxEs#@{O)$LZp|nwg*1-TAQQ?l0=U_hI9o{-XQEpEZp9 zhti`zDDE99s62>fGL#mNtj!IlL~Al*&z)$y+F4e(t|YH!uyN==G`;d+Yz&K-H!G)b zdw$35@U5oVx4C6FxxIC#f+uG1+!Z|~{DCRl6;tn2JpXay=zlCI+)*1Pv+|Ge1O=yeDbYwQ*@(0|8dpq zk88)wKUuFGFCzEIjp!AZ69rv(HR!#{i*C1>z?&p1rY2V50hWyXHBXF7VqR9?%d~v- zz>kk!YxdxddbEMOwfMOsa{+LsMVp~!!%V1T+9`};Z>FD@0@?l2Ba=H5gN50TF9sHh_nISntpQCq8w_5sF!^0kYC*zuGxIdJDhwCQ5Q9r z8m?FgKF44BfHeEZ2wMKY*Jt?ju>Q`Q)wAz4PQKZ8=k?NO-_3e)?##tMdFfKuvsaG~ zBbq&b4Bv*y3#W$893DM)Z2bJu;nPPh>_2dM&%Qe+p6YAwUX#+9m(Bq@j`})#XW%n( zU#PNY%jS3CptQ_4fX^17*->%)8RneCpA8p7p4|-Q$iWPSe7n~%YJjaF>uft85YbkC zxE<+octb5b7P`yiHa5@BMkLb}@n@T}Fl5^4c<$DMT+nW3B%>CqXApGO`r?e#lB~3f zO=}7<-^fUfL8Lb`ZBADxeMf8IzV8p6=7E?6^!bZ3m(EUIx_IZp1rYS%zTKgWU06ML z*X}Nl_Etr@>*8B$3bs_odm++Wn~rqU9^e$h%7X3X`CFmQ*k#y>fdPC*>WmiJxU`+N z#Qx#r&}m1W`J-R_IUY9tjM@IiC$rWs%8ci1p(UETC7f-R9cZDWk=}y5?UkjwOQJh# zOLmQ3JT`lFAD=)}cChb-lf{!)E)~BtmoxRt!r70? zW-yumx8ZaDXvOdT?&H7nDExWx7asHcdF7WMqojQKkrjXUi-ouUMaKU%SNHP2&Hlny z)_mvlPkiOG%T50rNTBWPLTCGI;%8SD|KX>9Eq{hNfA=e&5rt0X&z?(r_-ug(&cuKC zS@`n;1dU6E+&19P6i1i=zXqI9L~|)cbX#r?jn(Vd!GxQ$%plr&v4hUC0|(*8GR*-0 z+NA@_Le0eD&(u;r8)U}h+3{y;h6pKJqdS_=%b~4((|QoJnQv@d2ZaVZlP~hDfm#KD zG$tE1|E4soHt>IrEqfBpGeKF(Dv&Z>&_%0pGb zWe{d?q6wbe;e!NNaG=Pg02?h%xNsPJUSqOnsi4K8g`f?7u3J{k4mYf*T)nhBZ4naa z$~7x)bcV;b#;XAau)=OuFrYP}X#JGnBiFZySSXtR{h$u;e~JxunDYFaZVfVR_Owq%>@>{Bv8->8 zZGZzKMaFjm3f&b6+rJrw;cfbivoH*8rWkfc5giXp()?geSJ3N>JD9;RwS&*7k$Ym+ z3x75P4LqFlGVPqcoDBsl7e$vmf%9{0rM(AA(pK_sxf3C0c7{v{ZM(8#2hDcFNux6X z*Z#D@tua$&n|e7v3<~a!#(HA;=(jtgoQ58|wWIOw-m0lxwVe9Lv4f+1wWy$R;TY?$ zySBZ4Y)5rpX|ypfhsir)nV@F)Ha;X>v8?XG&FG(dB5{MyD)95TA!r~orvzfM0VVD# z2)mOi%n{oDe-q)P!f*0LJegWX8K{4)IJ;&zv$rZDH~L+n)JsL`xi|Mh;y=Odx74cqaB7+eHL5T-0QpXXI8DGoj_kF8qf%8KYpV)NgS zBAQxu(C}NM$9OL%95xI!r>yY6*#{!Vy0kb!o)cu)S#aQn;lMI!3gVb=P@GGK)}r>8 znnah{hH^9~wGtj$Gm7GJ%n-vDc(R=v=x}jzZ3!GKn2eDVKF<*}(n&KYCR57iYAJt8;jCbU2H2p)z)yMw_$kquA4i1ZVj|v?eDnqRP)%rtp_@~ z%Cd`UvQa)4RYuCN%iwsv(yT(Mmyrt3>z|$HhGfsw;9O8MMF81@VlL@bF~}S$13_yx z<l z)X)@fYRIoYx2^rw!5vrjbj_aMclY9f>9eSy2Vl{+k8i`<8MkL_H$c#6p`X5SX!`om znQObWxN;FJ`|c2c3Dl{O&!hp6mLq)(rj2&Oe_k|HpGXfAF)l%h&$V=RdXKk3N+b z&nU^*9N%%P>!mr6BjAxC!QM>Q9k3}D(oQr#H7#0>d|-}N*M4Xr0ZvFGQz_FP)SbXS z+9z9@V?Inyz(9&vkftJ&z%NHHEhJOa<2}hX6UxWHuuRAOf zh~%LY`3%%NBrt?ay>@h&beTyU^;M%^T02p`Hcx&qTN1$|f$iyDlJ^;G&-F5=F10i( z(n2yt!~I%XT{XSrQ*&wO*(E-h&>O=V-De-nEG|c;_#5qPSOb;DJhV{bO8~~?fIK@3 z&w1F|3+g_hfX~|*d1Q{hUNX${1o*#IbmxQG=RWLwWe#b5(+fYX8~;zWC;#X2p7Ff8 zQ=Kil&m6wC{lY&n#Qowg8=w0{@%X$su6%hU|)k{9OYEQF~Izr;%C# zIRw{NxmZF@NXqNr25W-xT-N`rnj7Xz5$?7P{ZRZ>MATLffEYGbo z)%TicXjwFxyR<|Im)H_KP1CPrU{f=Dye-1+ll@nYu5Y07W;V{nO5)AXYnF8ptL0 znEXJLulF$RdhJwmY0oq9SO{pRFgaaXju(_)M@+(_R=XA@)>;J0)Ih&a+Lcc)Lzs{* z^-}Z306{Z^UJ8?QzvNK-Lc|QDSM3UvObcT*AvqK-m9HhVD`L&SC4m|VG$Az!G^!|* zI{8gSOd5;o<Z10=&p->)a>*oi04_&)&b-GFgq3$*>%DU?>$#uz-hTg2 zF0@Xa-#T&e-0-E-qnA&NUp#dC%&{9Mj^1`&(6^5tJ+*Jo@R7b}PB#^WJ2s|t;ksO$ z-fhBT{1J^jQ@RT58wC8>H(%h=cu*LB_Qwdi*j@5R9>5uT42d=JOyIyQUd;xUHG~$l zQC9fF)D@^Q=F%HeiZD_}X`IM33a!FltBLO!C&ng*^Rt<`t_pmeo@V?xXF~-gV?7e+ zQn+-+>Np=fMRRt=atCgmKJv<~!SOR^XRZ!ToE@AvfAaQ;!RK$D9yxn7l)bg4WcQAq z!;MATi?cgx^S9K*dZEw_h1?Xm_X?hyE1!M8?(Q$jXFtgQr*lQk zXHq}&$alW>*(ZMIGs`~zIZh!=`QoQn{NAHW|L{|02mRSkXB?bZ{};bp_tM9)>;JCx z>~pI!HZS}9BUp2+`r>0xe&tclC|vnPBgxnC(#=sZqJT9E9Nqw&;aL697Kp&$0kZ0tk|^5=}kCAXK`ww z89RGxJ;Y>0!;)be%?@N&B0YsP|?HJjAY z#1z42Yr!}=eVvy;gQE*qEtUB*Jeh(f83c_G8fCH|p^!3o8DJ=T4QdE83sIQL9aEU# z&(3qhw9q(stXnN3XktmA-C2arb0fuM&t~G0xf*Y;5*V^N^JEGS*qu1K=Fy*+_QG_-0aCc;=JG7^0 zb$H3*>UEE!?v5;aLijGU=vzhToE^rThm(#ld;O}gvvNFwmLeLz4n~Oy3onD3i$Kk* zp2$!5Kf~*2w1Pp$^2bY8Jqe>0B$RNJ*mT#<2EnkigNoE3LD_T|MO^YN7BXXy1bjx` z?D=zLO5mj|)C_F~LDLA420@ELiy@2mHgD$GK{MijKYMy?xOn4Ai5LXPZ#$TK3V&wZqZ8g#!Kzg2n?t%sa!kU4*VhjrNG@*v`&yEF7sL()OPn0&lWF>@GSgeb>*3EL zy%;aUpL+_jy`)(fS^SwsjwVbd&yqI>klFL+0#iq;2udgOXY+IBu)n-)&!6Gp@fF{Q zt}s6q@n@K`5VRR_gfd!;LK}a^s2Kz;_$)y+HJ4aDvk?D3012VdwvBF3{lUoel8krwa4n&&=GGXNLf`Mm9C)YydcSL^67dviKOASPKE7 zJEM8*8CKlEA!ra|xjo~>K|3zccxXf|HUo`lUUNYn{=nPn!rPSX!4C<1jVU zxvhDHjXCi~G{Au!$AkPinfF@nuifNtknrHc`9%Jlm`x;n{xQ0p*d=cygw00Lkt-`e zbsR1+EF3Dez&$H>k0o$>j$-5)lGzk0Z!U;Yw?xa#*d&Zb8sW4(iq-%o25Ckxndm>k-@UVv`kvn#YSe;oik6e~$fGnl+)Sw4p* z2d4_6d{zNOn*=(ta%FJ9->Ow!0*%gDyjNY)HhbXw&_Gm~TF`g_8CK&wqjs2@MwJE0 zx=ijBaQ-CtykHXPmV-J$mFF9sOY?(Nd0`7g8XM;%{+vvk7l@w)pT(b<#|=!&PgxgB zU7NRhV`%yEgB78{_If1HH+Oa4=(i&X@#4URV{~87>1{oDBco5od80h94CiNXafNel z1{!;}XRmf95O4+~CkLK6`$i=obqOAWur@62R{@fUExU{o-^hp2peLXPesWW?K&h4d)pXwVv`4o^D z^9_T~H;zD|r!F48d->4RwS!|94~-7)yLD>EjT76)&+ZsMyLbA+j;Y;c7Z09kdiss3 zm*(o8yNBU(%hT`Kp?(e~H$MF?T!O#%lle1$`wNUvD^>t~)g?>-G5{;!k|JD?oGBbZ z3pqAoZxBt_7{YQ_- zo_r*C^>+)(iwa6YRSiem#^0#F^AkuTdQoQ9x>`;*NX+D587-s)?HR_U&CsPl^oATR z$pPTlsM&cIM1p$#grw0zVHJTR)eNMCb`n&S<6B4|*3!wblC>YrpqUkuNfF{BlSZ}M zdD}+suxesgYj4J=!VknR$eu;gjG*3Qq>DGPPa0 zn}RX&fd#5#5Onp>tC(QaOuSPuaj$arqnhXD8oxK!@V$@QU;1U|%OAGC@^RJkA6CBb zQTfyFV9{JUVj5H)9fjqH*#o=Me*CToScna)*Y?H(afM{v$b6UEwtp08s;iyBa>1yH zz3ZR(dFP+~B7ggE-m;8XYE4;QPjQxWoy}`6hcM@~m*zE6v#LUYWzX zq-^Llv)6`d>H`Aziu1tvxz=O%_wH|>fTDZUZ7QZwua55}&@HQrT7f;Q1de7bg&#w` zg~;cr>J`*0OQuHAMeIMDU}H+7o!I9vn-D6#e zZ7>xv3CV>77Gh?7@I|e3VfOmyaL=O5G2Per%SbKMa8Q9R7%sL8bu2M`^R&Mxbcpa z=IOU_feyX!@%gJ`ubi#n1J?12XKtQ5J#+Qs5InG(?E1UH5r z3nl|&6;P8CAZYRDyk6_gZQGn$k&#we6mcFGE{EYx{A?0vM`-mWV?)q3gZXb5#}0Eg z-MY%Gjpg!x&f8R#xt_QLQFP{-g3$UJ#KyVVJC1BW@baxee3d6Ip2Py0vk32Az4FTV zwHI!lYeHrfAK2A)xTj$spD|U2xbsvR~768K3B!JVU!{M?67kW z6k7Z_A60X%IdTZ9&j)$iio#Eo=5JlUB)oA^Cc5$B$hM-;_IS2QxZ%%aaytci+sYz4 zN@Kf@_aB+Qczoo|oihv44^K%v{y< zPfKThRx|T{)w3V9y!4a0Xm>%heEA>!?zeyEk;T9J2>#E@|KPD@Uw#Bt^O7%qZvF3l zYUSG8+?ReDdF7WIUzscXi+9(2^}pZn)ki?bSaXoJ^h=L`puh9w#}@s)Pk;BTpTY}T zcF<60*z$M3@|en^KZF|tmID_K7;-}M{2+qnbacH z_t9w#q7zfWma*WVm%?lmW@b2rKwPj0>m#_Waj>4fW#iPBko1GyL^sTP=&Gy(>SNsMDx+8Y8Ek4>&c(bG6 zYDWP%W4)Q3S<6Bz7gw!b99#Zf!_Ig?FZ<)7MUO9F%V?n`sWp)36}Cw#Xa<}``*N)uO?tzLxY*~8~R|LhdbCUSP?4;p_)qD*7zN-Q``4((*;!oOf% z^WSjNWq7ag=k&DtO{tXHP0p`_f$LV=_MGe)WwOW4l_peP?TRVbfzQeO*`&*k8;eC7 z&_@59V9sE0(eDRqreaqlGek20pQV2me`bem+3R`2Kt%}fLh-Zvyg+1l0drn}ivwPr z0M0%+IgM8{`SMrCLc#Vv`CBS1=cfv&^0IFw9}y^qthb*B$O`7`gqYdWW)GHq%Wo0{ z8%QG0T7vgK`e$Y^>lnwM*)v~}z)QI`v=MJRkS_%g-Hp*iEDPu=F*AhOWXy@P2;tAY zNSYzc_m_Y(J34Jcu-%Y{6qeC6#-ku;0&uSQa~mH*V`P!No}ajYKjZ(r=S)2Gj3JxSZfzFtnLdfJOw^`BPGp7XF z;ef`UJ0kg%`G!qpAUcpeJN|4eS_s&CZ?N zSvtJ8=UQJQrUAEhHD5;vy}JbpjS^b1f0B7XQ4=WinsQDp{p$8<>w75pY&Uw}1&sK-3;Lk0EE!^+L9bF@b`>yZp9XYmh^3(w5 z56+(3J&6Q*aQF1Z19z@C=Z)(}$1m&|zq}7ej^{6*8b7~(;@r-e!M(%h2c|FfKYh0T z>0?c2uD{U!;`{Z_e$e{#PxLis;4{)PlR#4vW}Cnb5VT~C#1v5i#nb`_1dsu{#KzW< z8Dfd z{r9WmrCW|)>%IFQx4-n!_CJ}ccwvrX=>UnQ5Kh9Re%b|%+KE=zqJB#Zp@mBY>eao| zs7q=;GhMW^VR#X-U=b~9XI(!Pgoj?*HNR%_Q_;?xHUKQacaum==z$MAVnu^J_ z4L%xBCcUCqx}+wVRs2}pqvoNJ8MGV|G8LD)O%0@rzzcWjA}x8hem1Q_FD-uB1-<0Z zrA&2EQy5h``eUZ0umN(|2{C~Z{9Q1XWZE?kF)e7|{5H3uJFR7|~H%7kNY)Q!AZJN#z(@awdc%)C?e>`yCa-^TU<_YafB@+3KZ&uyvc z>3i%@n_&-nAOu>M8W>0~?Zg^FppDsxLWwEGh5B+on97Ff`)K+^r}UhQJTj3fl6bn+BJ`28oAVLidl<*JyR#oL2~joH>IvD;zyEX8fjrja-m)GP}`i0GIgQIBK3VR$*Ow>Y|;r?LF;%-qyMzB7$Fx-fTpepaA=1|D!b z`JrtEIonGkyKbI1K6C!W&ErRIAJ~86=#iPT7pK_gnG>TNo;bMuhleWn-TG%MU;e0c z=A+6xzi6KNpqd}IXMa-l+|R3i_;KE~f3fVh|IU)%`s}hl_|(!r_^qX1{v78IF8bPI zEB@e9n>Tm<{Z%a$*Z-HwAI{}}|NZPEe-Tfw+4QY1Klyhbfmbj6%5N?G{YMvn)luj# zf5ww%TsW}cu#!N~NsiF-c-bN72l=xYwY58HZKQgE5E}k0N9ZTN@>vQj8nz5fhBhk@ zh&H^OX)RnfWoFfFN~aiz-ptq14M9^ZA$@%{G#HYMFZ4#U<^U#(Dno-QFl0p0&|~;8 z`S^9ft7{xRZphq-Q8RIKHYj_8FfxHjsiD~k`0ODwU1*Xinpw3epPd~Ct24x)^k!Sv z1kCH!V!i=$E?l{Ug8msCO~H$U7>P1?+0HR^l4j$U>8S>#@pfL9VkXZUQb5pE96#rL zHsH*(s0c@67EKYXwvDB&#yi>-gU^Pe(~LzEgJ;2#wHuaIr8@2O+EqqY*Dpr`9a^*G zO6|tyc9h)ij*o1M5BJ7ycgB%D-|WmEYA?9iS$w@S|3*jXR%h&bI}|!P-kW{BZGHLr z6*Rv4US=w!*vfCSX|GtL_n zr*;N7gPn_3EGk{Slsn>f4Cf}`b07vzNP-1vxmj+R0*)?SvzSu6>PcdH5u6*#b$D6K znc9kL0X3W9bAmP-c}`nyvS)_ z4?>}vGg498iWtj}!oO0$Pfv*-ij;lt-#AE+Z86~ohkI6>6d;85H3)gSX*;!uv z^!|pafpXw8e#@LfII;uyTxZ7-_Sb=+Z}-(*?JjN0-Dqacn1RGHoANf-XQcy~x8_H> zBc=dv4+s1iB27C8nzIE(n>(XeF64Xi%p``O@ojb%9PsCs{5&i;_IDIr>Z`flSB(C7 zWN#h(d8EG*{yf^({8SuEGLt%^e|8dRhoI%N;Z)G{ia&dv?D%tVfM7CzZVYk4U<`oV zfcb_5($YxB;Bt11pkZexY@P?svAiITit6(+e{nAnMRsCe)lhU{vCTSnzmF;Vj7PYC8nb zB?oEh!au|cYb7kEjT<9!*6I!&GZ3^6g@!-V?)h_Lw4^>mC}d(5 zU5{8gQpr0Vwue4`s{r(q6C@59dG>O^`gqtTQA?mKE~@hRpMzIFaVDvvnmbH5AMzCj`=J zNrucmhrqW7Y3BcI#Y{F*(qe1ZQQM`taL@w%UMDCWPFt6?m@~^$FLqWRYpOZdQ8l)I z+m*hpS9Y{rvu_i$kM8g6scy^PTv!|8(7;MG&z0HczajqY>@_%QP%ybl&d(Ay1C{~K z;?J(d((0qNDs|CXios;m&XG#sGYDGz84jFGm=^%&{AB;6okC~`dh}G^)CDBaM>uM5>gwT% zEBmJ|AG~v&vwIGYp4mNfcHr5;fu{#Mo;lOIZ{q(f`LnsI7vFE;{I#if@uzK?e$O40 zW`bu0X1?JJkQKmK_}d>4A%2n^s|B8*UT}e0#0`WX4AHoA1{wHZ0*z|dwEj|H$0G<$ zWwd& z1hcuN{feR}bP>?#b2Oa$qMe#s!0ZCpi1?Y9q67jG1c;QZcFm)j94)6zY6Z0Gxv7O5 zT9}IByO@DqUHUoI!lm#Um&`+i)2lRk353Pe=x1gWT@=4bCMU-i+PMq!-*7m~?^AnVI0@>~JPag9oQ+s% zT28fZoL>>&fJwXAWID%e<_~~7^ysSxxwu#tf2B(Y2OPixBj1w7e1{2{#@y^ zA6L!(tYYl#(y=!yrrtFSIQ>TXjPXhB5DrYhec2`_UN5})p9#2AZb}KNb-(kECGlpX zSB(Td)(o12fyuKGlTQMVg_wYMmu9dQ%s1Q%N;_Mk-9AuoPg0|lNeiR=4%NsIwJ?u% zLQSkp_tG-{N3)kVx$iW&*@ zVkt8@)((~I>jlHfCyiPGl6x-s#mhfTjWciI!qGbQc6jz)@zmVV)l09OYXi5AT^k&_ za(3p*smUv6Zk#?da^}d*Gj=H9(5d4m1`bT0eCqoC&Q0rjHf?Oh&VmnO^7*c6wrP)n z&n9e6^54)UMB3!XLeLzdm(x>(8#4l6K(yn`>IyisOA|>Bh8VRr@~i@(H8YA(PsaLc zNV2Vqlp3%c2&CsJv=Fo?wD2#~7qey9HG*gOb9zdlA?Wp0+3U-(;K)iV%ub1Cq*cJ5 zD`I=E9Xj~jm7{kq4RVm*)WvgSrw2LO@41^NY3Xb@)m?RPOY6ZcO$Qp|eYMf;O(l*( zm-Ic=d90`TKvnV1%Ay^>=cdX%)g`-t#^$+^x1DVeunq3TysTYOi|aCG4zI?`VePVf zc7^FC$?@E6_;Q$qH6GD6RZlE$Yb0Z5b7?=uATt+F-8z13mA-#}l^$J;2 zn=X1ofUHR)2McIgaN$7e3~e^}oU%ej&>(0O(L&I;XMmvL$x=IW31O~>JUh*^mrFlfZ`Q(L0d~9&rXb*3OIk)Cyat0s#8RBZ^_wkh*M~|t2$qD9+ zuM@@b=Y$J~An<}(qo~cf!v2-IPycNG&v_;`Hvf&Rb@|J`>-5jxgg^7$gsP1xNRcfk zQRMk-jpn}rh|WfkEH`OeH{bYkuTv@a6vnp1^Si#7ZvN3(UBVONarZsiI- zOY;nT<}5;(GrrSEpqYeA{sy3+i-tb~b@{sEk>2vlJFBnlEWW*`c6@I={CT*qVth}{ zji+k5qMPkZz=YKX2%6Xnp2dD;uOW{M`E2OKKo`q@BhWKT!wi20ICJzNh1k`^rfpV& zF=tPPr7?D00g5!Kv-9h4=L07Avl(t^6fK@V&(AY&zbq7t@vmo_3#sz2=t|(wd{C%1dxOd$Sjq%>?!5nxiCZ3q9X3zx?>g-F!Jqpg<*y1L8i>vIZP zLPfQC%$c+?L2pl?lNflgABUjt+ow-Xx)D&Vn6ogl;s@_nM3*{=JmZ@&58D|MYOGt;(FQ6?-zxDHr`Hlut_*gmh2+cTCLkyR_KIQT67yZ}3U7X48EJWrvW z?Adc;L1XdfWQLp!lWF&WT2xszIRPJjK)oDUZH5@hy~%v|A+g8Q35ByTvdwURi`cSn zdGgNnM+}GCj0v#nJlsnU1DYO=Uy0Q{COTJCtRJq&e;V9oDDUbrG_Kb z?y^2sR~M-R0t+w0pUZR5RGS1^Rv4ZwD`)<4fdzEPNV36XSv@OG0B4)r^Jmuxc~((- zWvE)EDqIbJZYpSOEp2DF=%2@q4#1ypAKngso;Wpt`3C%%GJJg3INlnU4|CceM-5J3 z`+RQi$i+Pb;}?$bJ=VLYT5g=Zux;`$i(mSv=FYu_r|)sjAj;L|yYFJE+Sg|8Mcoe?g*I3G&8Wmv`=aU?2TT&v0jT^iGw_vnPfJp`N`Cx3Lfkdt6?g}Y7))w zFBwiRMVV^XY%HNm-I^An=29(;BGYe1GpLtXH^n76%%e=&HMvI7OF$t(1F0FPwX`eE z1AIoD?6)ewrO8S5YcZ9&m{8l(%$ks;DU8y7Xe3ALYG!I?@W}*RY90nEhZc&a^2v0O z%r?};rS_&v&11S{9#;aTYAjtg5X)a)Q;vq5HK8xOx119OC*Ez~K){jL>&DGznBJ<< zzcy#)$=CU*p=hkXL3;?}^NgJdf%e`GTFHJ_ya_2ZlBU9N?cXwy+K&A-Z||m=cbZKO z`Wn6;SYcF5zEk(|+>U48D{Z+PSzBD3TF&?MD0(1QC1sH z9mQGo(e$#cwfUP@#4=LK?X0oJt2GDzr`qd()%NU%W_kVM&oElg=Ojel5AOMJBW%^S zG4dLMaCWE{j)3i1m-~%DAl9l|pi!@pf3fs3siv2JS^;Azv}ke~HHlC5?Ha|*v}ia1 z&&obH;K!Mlo*&Z0M>*E+KBlpDw;#1=AZZGyN#g@1dNnh163|EvF@=Ca3q>n(v&6t& zMrm?oYEFi0EiFwZfeJBG`IvwfUv#M@7OYDSE!0{D!5UD{{#m^z%g;mwt#= zQ46sjNE&X>x+DK)rk5Pv^BV3)X(!qe37S(mx?GS+m!6?dUJ&R~o2OQQ53v37G;O~& z`3DRB%r|$sChu*2X0Gqr|NZ9|Tc$7V8@h1r_N8OfS1#TiI(Pg0nW2*>hA$o)J9h#X zj!Q=lo!xcx^ajty~`b(~)zBcb#mgJn&S*stx>azG#;Y=XBZ9ppM06x1*_%nKD+IcK&HImhyx}un0HD&z$O;?T;*fj~}-C-6S zb{1hId*|WpM`kV$vZdiuCx=g;xPJK1)gwp8&K{pRd+K|GolhS-6npNcq3JpPyHYXB zzxeOhO}xX$UbXzcW$GRlK&9h9P3`-K%NkF9=bLFMUwm}!mwt!i1($u<4jEkW$fN74 zc4YneT-n{9*U$W{=L zx3f(Gy&e{gHMBWALyv*O;?G8m(@j@w44H(i^r{VLj8joi1GmA>CY;X1yJI~7nVbjV zvt|>27Hy_wL4oDMy*Z$eLMCazXIj_{5@_*fNH3*$)$*d1%L-R5hCj=i13t|5K+vX! z-LMArBTCvN!fehP$Y>pHo)2`1M+e0tXtsgq8U)RXY=9#8Obw2vE?c)85^Gix8&{X7 zq0vn(Pg`EHHYI)4lBV31(_6!{PvwtxMTfRTZ}*t(2Ab!gPJE&BZ*=FYzSf<8ySsog zyCd&lVQS`+PjXgZY~`ZZcfV7x_zBOPjV<3Vf%YxQ?O0?`Jd`sR4(x?F?`+j~K+u(` zi#Q(;3JoU@K(W&ji?aIK0IzdbcFcKI&~A!xQx{YG(*w-Haw%|N37$;^p3po?;S3x` zd`{uyL0Z7hcxVegizElNbHhMsEZs8h86G}2nU@P@;HG>|P9_fcvt!5se|FX!$^2O& zYSqlCfCScpGutN!PI?_MXJ-TcAb$=v<4in^x+lcX?YWz|aSn^b`8k>WDh4l8{Aq)_ z3>w|*k{mxc{2?vL@HxSsJ!e*sJc<^7`M1KKA5Me4DB7u!dDkWLWdCkl5QrEjbK?hN zK=gwv%3CIRiR7v5M`r005k9ZM9)zETWly$8IofZd(coM=5U?$p4rulK*$}iVh>FdQ z!{D=VX=_jLXT=Nnv%d^RCGlsxngPq0euzKg(1P7feEA{{MvS0;Uh*w|F?J;JXOUrv zpT(bzkaLuwbMs)KZSg3exHq1^r7(u*x;MYDF*9##Nx{sax~aYOQ@fj{ch^l1G~%`~ zwx@wh`19>u)nmKr#`iX!Y$$5T+R&Wqv?IAW1nqetehSX_)?MD-1dVTvXLaYJsm72b z1bmkH2KLTSV)(O}X5h#n=V#(rs40|>1yWp+589 zINw>?7TMes&kO7|puWy|W1c@F-Q;XF=j|;1jKUd{4IwpRcrrE`qRK9YHhaz-ZeRn^ zTm#X}0B{z6R-DYAU6+T_Bx|h%d6q}?Jb$*SM6Hu2QHyf`2JWdO&|fl4{lohK{mkL6*~7iNn_CUT zM&PI=VAA`xm$Y24;p7&>#epfug4+r7$%$SNE`=Nm9IEv^{g#(#k&cW*8cx@hCD4&f#O9D-1OMX>NP7(6&&cbGM z=P-BcN^)2Z>W50)|_0>S*`Qq{Toq zF?C&T#MmjQd3A8wpoh=%{Mk`xb9hGE?253nJ4A0a^@4Uo#9jrR5IHa4#vV04G%)zQ z*0jyZ`g+@3%a7FZ8ikGpq)#)RN&9j zJOi1Ni)(Zz9y&#|NuX0w^HS0`En2!Yf798nmJ^MYmwQ`p?cQ>0p!3>}wyWFQNB4A` z@81d*F3B(p4k$7FxhxwC=py_#s&dQf^J{>~fvVXMw27P>Xo=N{ErW9x&}OyNN9zqi zJ3kHFm?7It9*Ccz%C22(Ihi3ZX!)ee>PRh|nOenT=LMHZ{JEwguc|J;p{=y5CR%&$ zsgChuyKn5gfHISJkvjUdGE6~ zkG^oO?fIjXr_Ya6KXb3*`MIvy_xKC0ZtB(AXHAdC7nu=~HO;=;a`zrJf8Fz^y=Vh} z@&f_%hre3H1O!_I5JVNoAplDFAq0M)jRL8S2UDp_Q~8CG8x?DQC3sj-0r8uCjZy)q z8G8-=cEj*nMZ>QlPvtnmvI$_|Tjdk4a)hD-gT`mH5ViKB$!#-EXllL+*jBqQ>;uV_ zPY$;uO2a@1jE1X`m|amkY*D^F0f%~Mr)VL@QkYh^z$ns`NrIN6kvV;=cI6YRi%S&^ zSF&CRxUMGD#)!3H0#Adr1PK&vj3)p> ztRH1-;djA1Wb#dnm#fBq1o(x0@gq|@@n+fhk5S;)@EDN<22rpLq_f zs0YYYEJV%Hti=I>c#<=UONyRY(B%#*WDgYGi)|zEoI(Alj?0E$MF`4fY5<JlDHUiSH3`h1C&uN2h2aeGs}N`*GSzM~pnM*C zL+@=pI{zw=ucCRV8Lm}`8LLTXQ3A=DnKVCyfC=d$S)+)t!6#E9aFXfL&HAbQa9YSG z$In0)g%;jCx_50u?Ml`tVqMau-IA$fYUNXt%%wewgw4J-!#k69O+`!cO=$@Enul7M zem30{jpX=bpHG^)Xz@jpJhWXoO7Qu<(YI(UOH_g|fZ&yws%Qp|M!ik?Q{nNSpe>0bo zUHboQ5}e>NBUXLIR? z{!z-`dxXpe4W zbVF8VL-uAcG6-7m88{4c7Llf}oiXAl#uOrD1?{kC+&Q#Ek~KdyEn?A_KPRNl0f_cA z6$D+!5Qm^uvn~jl0)I{}5NVZ?v{gumnUI4BnHet*5}7mxMEXSe5cq_4_b_T8eTPe#x! zFIwdJGoaEyqQj5yw`7H_Z>Mnq;uEQ(4lnw8@#^nZuUi6zu2^db+6*@k`a0?hZT4U} zFt|v9%+>;=HTLV&#qf5gB)1{!RseFb7vRJ|k!Klez?sbxg9HT6F6Oc#ft`6`%n3dA z6dFHm#Lu>$b*6vD(IPlN(D`pP;`icAGi;Q@%aUZ<5{W|$0~?J59#7`aV$K4{hO#+B z6AHcAfHo_F;?4NlEzSJ*6(@w|Hu>-(7@nEN&5A#RpbdOufzF0>=pJ; z2F?p&B|KPb2A}LF41(mB{x{&y$;1Ea`16DK_gA$f+%O&rhZnp#lcDiL^DQAs2pz;u zP0e%DY{`=lWBv?w#`)O=--tZB;dJ5w3=j{c#U6K68obcK1>hGUyncUMjxu=dYwYO=! zzhP{kX=Yy=;%5l(M1KSN=YtjT#+;1CoKSN(hf@f<`6B6SU&&ula}#4x`NAKGXR__w)u{n`GSD}B{hcNE<; z>9y&uhx=^o;gTuduFpKy- zFqN<~W9Rwv0;=pUeU5KQY`{#Itt9L<76$WP89^ot(@Fxm&Ibu*8zkI+DUKTOPj%r7 z5iUVki`Ew(iNefM-UhS#Yp)Nq-t21|+1ow2rvn6iV_*C5f$q`$y`u-Z#}9Uo9qODs z)XBkWv&VX0JhSEMuAVIwEv=z4^E$?KBH|A03k4R_Ea%sK=&pYAM$e5GPN?UQbh9GZ zGSDE|Ib-0<;U1cU*y@^J+C2wgGRDqkwGk>Z>m%~_3F3z96;Y-)SeoQ%1_`ENkT^}1WTJED;x z2F6A8ohyhEoQ~Rr&^A0$P`o}JTnt{0u394VXD@sHM2C&lh?9-?dITL_y^5mCWGtK< zFCfMbCC_TKQP5pSn3Lx;V*EgvUjm~HXRM*xGGWMTKAAr!6J}@8Y{{52C*mMTPD|kB z05Ypf_RjZnX45v~u;C!H=g(Z`r>>8!ThA&qhMfg;boGYN+I8uR?F)K?9d)PL8aRk> zcz4guf!=GoIxauedaJ+d=ANxx#ZhHq%8TH8K3TKH5l4i>a3*l@4xKT24Y2Z8JDYGc|S@K2{)O4aFWc*F@_m$(-58 z1nQ~^)j^)Q6ql~dtF@NA+L}m1Q*lRatbTA?8~W$l2e;omxOMbc-{j!F>2n9DLC|9- zciler)Y#x2`19=b6XVwokDcE;d-3@5mwR74*L3X0Ka4#yS2FX{*1Pb5d;HnnJo|3b z)K4&~t+?|J1_Jy=4}7KoK>Q#3#2^c`_(stHfCB-*WWIgk4S)cbKm%%l6avlQ;j?E8 z%#gemnUnxBB;X7!A{%6~7Tg2fDFN)OZuE_c={Hbon-UK`HuVlnuWI^7oTUgBLnviO zQ%%joUd_xr1U4=1zE0e$X^CxhXA(jJw?HPGkeCh7t2B_nR_%Hk znn$;zG-^$v*=+R${Lw9QsX`Z-%&$%A76gZQ$CR|0Oc1TpOtHBwW|x7oeK!DWIda>+x0--2z`rCn(=%*a8U(HTqSn3JR(W0AOT!X0npXqwuGxD9S9JfWXrTuwO4h-8%I~C0;t;o7?i@ zy~<;Ml3ji%meFLuc|&Q@rjl4%EH5=bGqu1DFU#nOmK`tLcBkUp|IzXETll57zw}Y{ ziyxFty;nZ@R{7Xpad&)u0Qg)v@z*VPxx2Sa?LYg5;7|4V+c;6%LvXJP`?otyyeR%n zrJJIir$i>V@6)){t?5B=sfVC62I>{@X&R^rsTrl^l)zKfqIBuABwk-)ik9X*Nu~x; z+giL{)AnPUHh0`;^Z8LLtGiIc5Z}#4U@wr8BU>>LZE>PlutX2v@j22MaVUfb`@sRgyfK^ z;np=3#J-(?!puyoSd(iA`?QZQaZ`8qNP^~9CbdSG<&x&Qh<`N3e%=(ST5*Dj1*JUM)cg9rz2ojW{w`qcQ@ zlf!3Da~R*{qbJYw9eMHGw!OXE(^mInXX5SL6VAe#1}kH{9!>uoSa3Lc4EXi>WT$zS zJ9L+w$`|T{%9@@T66*@ASj^dGaKnvSCyE+r4^+(%>74FR247OJc`VHnS^_t-&g^q? zYXiSXh;5(dXwj1kQ(RYu$A$6dl=AF#mD#DKh@v;9M6*^GgfqHJ^Y>mkbozU@PEVab zi!I6YrSsDlE(4-p96NRA%BiO6eNAP1wl^Q&+H#vbOK;+4J;OBhNREpP;^d>hus697m7fD)#-ORoh1XJmq_HB~yG> zey?)+Uc=1m)w8d2P%OVN>t|oBnR&Hg@?PcWTjf9esB-`F%Rl}5-~IcaU-p&XGOGN! zM^=8$;B#)vrMj0tEFPOHA9=TC_9uMLtNxjv#$KAs`2MTmC;vMv45X zz+p+C0maoD%#H)aGBu4RU0%Nq1l^dC34#_n2J^z48=WHuLz*(vQ6L+Fb|Pd$$C>LJ zv+Za?BgrOswi@z`vYMDVkw7DdCZF>Mg`h>SLC^$N9D=r~j8vO1G>lr85My93E1Kxq z4k$DUG>v3Zh+)x&px38XtV=;}EZYqbbVZt38RNxKxMF#H*j*(Df=7JP<68}W8>Yc@cEMRN&)E?&I~hzepwOk1;INmIIMeJiDsB*%k0jYC<-Dq57?$Gmqaq%~S)yCxzqsn{(@v|#jG8Hih zx^n%JigkQnVPP$P>$ofYTm_F2pet%;bl~tO8~Nrkzu(__+x;w z*Df_FxZE&OSMv~PlrM(`IC3OFHxJDh!Q=oer>^8B^ZdCvVV$A#1X<3~oK*-DO7Lv8 zy9@li9X+;fFW}G6V{ox68$i$m;?GP~yI}?8KJ4t~5o70#LDvHQ9GE|6Z9x3Y197ho z;^(g$AT<@VfoNa+YnL1l`-F!EB&a06zVjbCcna-^ce2QNKL37mk0gz>ETDfQ|K|r$ z^8z5eFd^~&)VtKzqQw64!C(PKp1(}!pFMo0%Z4v?!hU`Vl2)XP9~_fCFMXUtHVc=3 z6aI|XG5onbwxKmA8~+WcZ*yqFL-{i*Xwb3vvp068MIbt$!H!V_oYe>!4*0XQ({jlu zh>Ab^gZx@D(~xB6FMCq_89a`EK07fnw)1>O`HcSt!?BK7;q<=dXZP1l?r)shS2MAv4%9rmr)i?Ebz*lLUeF^0HPd^Vhx_XK z3!^BOoAV;3TaHEQbFx6#Q;*HEpw zH;W0|B#{^r+ys0!&2tb#q{Bw}7I0%5Xy&@}(AdR^G|#;gfwA$2_;UE+^HVKg%L^{G zVsc|Zo_`&GmIyXEd7hmnaaS4_ve~3w_^L*+4F!mJDR!D($WG0xj+PXyFBvG!efmVp zjh*e+`x|cW>x4p&_jhpe;P}Cw(Su#12Rjsu9crIB+B1Em`bX(CaDxEXE52s*N6RWt<$ zW>Z8{l2Nb+!V4N7ilCV`C`m9m3X4t%o<9jeoBY^h$-(LpC*!xQU}25$*a?_TAk8^| z4`OFep+A{FOI+>o@~;gHd+yJrm~-PG391DTH^Vb+bQdw?Ei9VNlK+ zueJh*!MW3~wcUN2zvAHra0wU%Uc1;VH{N{@m;krr&wT#y7tII~5&(gAdTE3nkW3*E zonRpJfCMI_@Mj}kWU7%s(~34Ea|YVU)Xc=p#--921#rfJwr=7_j+r|Fs^gO^4Tvil z|8f1y>$P{^tQ`3<76&w9n*bLAoiUY)-3Tx(!O7_oHDYq@Tsve@Zh;!ErQOnQqulrU zY2i}&HlbrdY5|t=gvkWya2I51IBB%d&YZdngn)wM+6%PNXbPA68<2v9o?}~{xn(rVteY;}f z9v|ocfA~p3{>{%I8@77^w>moxzeDYrS5Vvb3|W`d{zcU7=*99k%c8^-GU@WMo~N(< zv`nH{>uP?zZTK#OCfD1E1TNKL$jN+FJvr#ky zKR9}yd;Y9#ESN;|=)Tw+KNQql>NkL5hS*1JdT+R1?ahy6MJ-35m`mkTQ@Eti#e_Cn zf>hI@P12~_)K0i0pcg)`c^Ig9)UFBDMXh2Vg}B07!rm1V_Mj;0^?}d#y$YzA*5c_m zw65Cusi6=v&{m&%y?N?gzU0Cy$maQ1z&vp7zS%zePTus#yg8r0d|>iw|K!zEQy0#U zTpgUab#~(B`H@p6_$YSz;^3`I$41W{AKZIl`0)Pc&$gCEdsnCQ#>^MJH!G`yQw2qv z0mXQ30E(@+!}Z|3g2oO_2Tso69MdgJq6~2*ptuC*;E}-229{MYf@TT0GyyXcXCW%? zz=DGWTiT8nv=jZTU}urHP5fE56-J)1us~^?WxY(2xvnxjr6@C%lLyPQQsK|#8`l-4 zr-XXU-CDYnQwZD226nU^>gzn(UcI}vxSxXvae=Nc??VEOq!}f%$*|=*0$a}BYQ?d4 zwnr}|oPlo%*m+wdD^N$1t{gjZ=feJ*#}1C1JUe#g)X<4j z!^e+~pKSd{M>Ze1{HKdvnk$|C5UXc?zH08iQ!)JxpDgovA0M&tpBC(Z_~k=fJN;pO z_sgYycULW4^2DQ``tBDVS@xyRt$*Z^WocdOemEDM`mkd59!Ev+wyC`HM)k}G(N{jK zDBKtQ!Xr<9?NiG+vhepGed70j>q*4V3I4p~YmX(JKlqs^zWixQf;I<75dIDLvjfh^ zp6x6`XZ~!;=db*o#b5oql0Y|PWmRw5Sh+FHxoTjjad^`^BoMtwnW87-M% z$aBSpRFuyo0H_f{n-)6TNHPh{IT;P<*||iwGZg1%XO-P$^=r^(siOgz$7GhEKk+@QH|IR5PHI99O`=v%lFRvCz^*R3s0!FPIX z!K#)0v9!B8qqlbyqkkUljos=k80slR|2*7_^G1AVOEJ=Dxb*EU@#|eh&pefKuyk40 z%4LwW_@c+-i*RrFw!uReK-h@G3B1YKY7`KhEI8zY4SQVu?}fSVPhnXgk5o*`W6t-VAk{)_{4T#Joe$7$aJ?_X$SR z>y{ZYMz<{66L*fG387gupV*4eF+t#6Fea z*h=Ry!jR_7jjcHwTCy$RvlTw2BQ99+oyd}Zz>^35`;P;J{i*E*axaJH$pmVde~l6^ zmc3+dh#&rtz`gYIkU0UOc>_FzPTNaw*3i5wsC`**8MM21(LB!emKyHkjQMuYdtCxp znAw8jyB-$UTX&h+k}oWazhm#uB;#nsR@3hE&+|)QCz8mtd9-w5&S1#$ZxjNbSN?Hq z*&hR=`U< zTIhs6S?x-rMmr6EHt}=Fj`QPCKip%?e`DF={FUDdFZ*V6>62|ao7o1ZBFcHgDW7vl zb_hBb|7RIuNS}fO$jy=tjyPGElnvg(G z?n4n>J9VJt#+G_?%XN7f&3Vzza13p8b!PU#y3&b*jiYK9%V~^o&`ZYI{^~2ctFP`Vn;dAI=x;&) zJie!Cq`$R2yt=V4t3AKSALPfJMxiBs=EOjAV2*NbpmFAe_&JDa@m3qgoXtbP0cXR` z6iXw4*3SFqj+5Y%6&Un(t1RHp?h;}NH>Mz*p)tPrj7iF`cUP08qaqVXlxOT?H23LQRB0`%~i_KQ&7T3q37(wT) z&%f9mfBDSzYdgCq`nx9fbzI-qjfX9Q=i!500O!fWy%R@z#}9W+9O<4q-ZOQqd-hn* zv!}P;*t2U(c}-((Nn5PEF6uaKo_R+!<`r>SJWY%&~J0+Ag3vc=d;ZTpr!z~Ij@jj5Oiyt zmi+o~lvPNk#SprEN@8kfi%G_~BS}eaUA&P37mj(UJTuhfhK<>-UKU0Iy=J)utCogW zE{8}<)l9pfu1hln9VXww;rVt4oFT*csrQMHJ#Z$|#};_VoGe;SZcK_jIu?Zv`11lR z?B>ya1eQHsp4T%c)x|vwIoaSvqzTHQd@qKT8Z6kvY7)IkkiGzxX3w2CXfI#NP+~IbIv44WPq`=W!bXJ z@6Ak2)p%-Z-h6l;X698*ji2of>fCC%t;G4Q{Xb{p0%W(Oc~iA(*E(yjz4kumUVyy6 z`^VZeq|1a&%Y! z-pyC`ZoIm0bN~L$SC4kzJg^(t^No|JpnLC}>AQY>XaCVH1E+R8e`58`GsiaE`^VCk z9yE`C$fq{`b`^G{#)o$rAMW_n4|#@_0i5aO$KWr@!70K8!k9i@C;%G3T!!$ANYER# zaM*!S42=>GC8J?LF9j2@*$H;VsGZ;jI;a|akH4y}8G5a7;B~}Kb%XEL4!*$$Pa^9_ zUbhOg&L*=ZblVp62J*;*lZ4s~hHSPZkL3x~-PnxMYZM!U-I5#>qcA)WA#9q^jdJ>l z7zXW!Z6RXF#&pfa&}RIiWTTM>KZa825|8+gGSJJgwBsBwXDV4rUW3+Q??pFX<3zl& z!FNGkrNjIM`s=9KTgTsS9{Qkg@HIB0n`Hwe*FrpbtxiHRvzGkW1QUtDy=!Bd1@qCR zZiE2elwX(JEIHYaGUFs(`3cjdo+>tm1-s=G&o;QEDG!%~u>m~|MKa{4FpC%h2%~8_ zmkPk3X^GS@#=-Xd<(DuTw+g|)l>kGfGd;Z^Q zZhyqj6se4{hsVr;4JoT@@Nn>_GWg-*=Ty&){hQ%x0_!>W`(=p6CH`RB;d{pJ+P!M* zlToG8Ylp2%rs(-_si!B8@+VHgLqhT>gI+a-DT8c3QEx5nDlv>Cif0I0mt@1x3qdgJ z;_<6%MMZiihDCA~s?^}F9J+3k2gnl4(nP|v4KgrG6A8cwevbG-a1vtT6C;VyR>|P^ zfGwxb!w@^C=M9O|PhmOou%t0hjvR$2vXOHB8di5_g<*e9)>e&mDHd%rn#?d2bxYaKd!kU|rK zmyeBJIW>Ig#L&5;6yg{@bF}}&p}{jpZ=5`Iy651XW1IUr)-7AUJ~efNRoKW|g}4`k zvk098+Gw!Jp^X^3A{Y+3y2=}dof&nMIH;!q77kRx1m~+TX{>w#!mKZz*&vWSfz^%Q0Uw=SA}DFaq{APYH_42EX`hC27gXl z5{E@+r?=M?_HgenUpdAZf8*y*-M(~s^uno;OBeoX5k5}{X5qkUfZ~*u5xo*_0E>^p6a4ab(LGG=ghiLaZX^gedcsVvki&U z#KyhBkYvwn)!AKz?%wk=w{dIPDQk-&n?}wYxpr*N)e{G99zA~b(9s+F_wzrQ=X=vQ zGBWA@gN*TCAa3Vh{MIq|g*gAya9?oK>)%`qelJzd`gP^-&+LB}6ILypb6P7Ve$lk)PQ~(tv;Xw*IbVH@QwZmL z?Q=7~@>xzHob_jq&;9ymXFu`S%&&cZ#y39q?AN|%ClWsS*bkog>@#2e+_QiF1+>s} zzV?M@p7_EuUwecoI#frSYFcXNncuJj2i45}#uuLRmz+Q7RM4C%hyM%5i{bs+OT@UV+q^V+tEGDb0~tjTkt22})_x zKWC)3WTrun0k*AK>5ycAFg=x-ae|1UbD&+gZcsiN1nmlONaRc}g8<;L>hXdZHASiD z4KllG8}e%wPH;DXnpIei5*#Iq(eWE7M=yS}?r1bhs;aWo_}b^~L>NCH))9FRzZ=+z`9EzU*38$<2;9XnJ^K^hRfD zL;8Z;d2@>AJq>~@dd`@e9VrO9gl9fC!?4?PKQPA%A`}e0Ka< zTM~$7hhny#MNb;j_;Uz#c}G2>xjfUf(1~Q&-mwo&e58}GPvp-IHTzYj(dOXN{VZrL z+kivX@Mo09xwF4rzGU$#YBo{gm_G;N{6Qx+Mq`}FpB;rp0BkJUigKWBcKq24Cw>-K z_K?|}RKxK6IZ+Yqif<5L^`9MoZqLnGlb6$+nN&D;W_-@9{Q2LH%=un?-fZ4HD4$IN z?al;LrH(}YOeqX#b3maHLKnol42fI)XLQkPqJ`%-G~V6U41c!D8#|lEdRoSIwGQuS zrVZ_Cp(qE6X!!H_j(W}=Ys|@j7=x5svtmH_OPd-g&J3gOYp{aMt75rq(pEI`oKNu$ zia!$!q@~CPI%gV`xCIq-G(uwt{WJKqDIRIyVOC_F*jA1H`Eqv!;^(36Ce+t3@GBde z+agPw3eZazwa1ESZ80>T1!{n3$D&PsZ1n-GL_k2H9gj89@|5NXupwfAGYB!1IvZi8 z*?EGKhX&$taM<-miQ#oqS`Zv7^jive^(RV~nVv|PeYQmB?`MlY2W;8#XW;V`{tPh= z4-mAl5Fme|;m*Z-Ex)hYmuUJ523-aKlL7rqP34!}~Xk9O%Sv2>QVK@xxrMd*N8u_~Gu|t5-D@pdU8; z3t_f`74f3hVBMms+@dztay6D2^^)x0@fIY0PUO#sgn1F+y*y-UfC%|E=ax~BnPAdt zN|4`V-cB!V`=Q{oDU&VCZO?$SH6DT;FQ|r$8E(u0i*@k%Xk|mRqApSfrAPnV60fsh zo?EQGHJ=i`6ooEsi2#{P?C?Plv{m5{f-bY82`QAFU%^WW9=G!ZW2LU3v^{hGWrXe1 z-jkN$kuSPM>Mh~kUG{oK;)awL%!@2sV9Mu3bFD3$Pw@@UpC6V$Plw44M~e)Dpk+*n zaRGrRfh`*)mauuM(*tS`pUrT^H%MZ}RQ}8*QzXyUTx?5Dn5(LhsBnfqM;9*j@L4E0 zF~ASWcqB&t6z8WSXhx~RK_f$S(J~34^O9Dk%v#R>Fi);&INsKBvZJNHr}Ns5t_wTX zUEA3?w0r&8Z5^d~HFoS^c12}&1!bSBbIYo-t-+rSFNY-AE1WT=@aHg~F~3o4+0VkD z=>S1Hg3tkN2cJ#nTpuM~O<_#}%hP&~oz2K=(xt_y1hk{pkHF3jN27eM%Bi>J5Oh_3 z)3J@6@aG%*wp{M(y3)4={ycVk=k=rA0|$2uo($wxLmh|!?Urf_!D(LUKFU}W$G&G^HpF+&V4MW+=ns(>E|03X2V z{lW$GjM9jNMHo78l4B1I6vk%k3`7LXRF@q!(hKe=8+ots0RsCD`18z?YI z(lBhCQ$)fz1`<$Ld;{k++@V#pG(BmBL@wu<%V}NN%1o~q_25BjUDk|$&~W>GlZ-1(ktL>1Q-nHFg_lu4GxHQV33~G^(eF}^}Jn4$Pkem=Qjg*N53K< z&*YSx)jxdQAWN`SIq@*jKU+)aUM%fR&q}=?Vxnv!6|7YBMACHWZGw4?w6q^p2K5Z# z$JQk|y-ljb%S4+PM%g(|rqiq8my>(+@!FE|6Ku~sM91c&B9MD0>*dp;V0OZz0@(h0-K6m`m{zI2~w~z1JR8rVA zXX)C~9L^tH1t|@fGuYWFpF_xO1tkQBjTlqI+3{ya9fozaG7|VRqAh8m88s<&W>|~E zacolI_W{VNt&~TYKUmR8ph2~UwG&zZcpZOsXtyI{c{LK~tQD>Vv`L`L(w3K6jUCP+ zOl>O7>OQ{n@JrW@O`JN$F@GTFiA(2iUA^?`&GRpfoY=5xUu)&Qo{j^Z?S1Q8ds~Wj zmgjfZSM1!@w6ACVz75TN?X^2wDs~}+ZmZeBDTI|pTU=EQ2gx0Oj^za9HP~1HoD&S3 z>_0EtigFN{pXhYV<(*KdH=Qj>tE>0xOU)Z#=Qq=6Th$n zi$_1Gyk$RtcH)D319<3m(bWf8*_)pIV~Rf;g`WRsU*I4@!_HrS zZ1$i3yQHP*i=KS)`(OLqvw!hLs&hb_(JIe);VFf-)O_33HwXFG*3BfTbd1+_RJ%phfK7%~MkP%>NPXGm;nYAr=M(lg-F zTq1s^dImg1wWEooKnFtv*x7{{Nv+vg41s?E&cJ67G|FchhAZ4*=M{p8v1!;xE!YueKT+9?!F(*Rhe7Qy zE*-v}5t;P^8rjO1JO_QPPF_Iy2t&{g+k#$U%Z8VcF&mMlHxB@xTMNM~hBg0G@e_c~ zoQlolv}{x(acX4J0&fMM@%#E4;?F|U)^psUTByW^>!MyZ`0V(zxG{QT{I>1o^VzmX z&1_X5+Ij5z0@!#%n#re40`1NUB!gNae@0@>cLeC4Y0L_5aGJ4%z42JTGF#y^OD#Y$KfIwRCjIl;LIci- zpF^dwQ$9OgG&nkuKYM!$d`1HO5P!yluvz@MEn>RjrY!1j%#6*R8J+vxoY_wm%zv&e zCmsHb1lsXu>S;*)oXvUOP-yCJOyke%3gR0%-k`9cqbPq}UVLL!$*o=OW4%pd6yMm@ zFuJRGe0MAS8TLE0qme?;2BLR1P4u=OZYrzE%0skFVU4!@{Q9)KJ$3PkUIH3#Zm-!^ zm4|bEEP_ZI_{?d8@Mk-DP^SdO3q8~oe+EIDbeR$st|SGuFY5EMx@z-IY_2-Lt>Ws= zDoFU?&f1&Xss_8;u5W4EP?XVDNcDpPHK11DZvBH&T{`O|r_A!r!#R4)CAQ^b}fSXCc@ zM8^g_UY^dML%H&!0b?SOhBQKJW3bS$Mzk}2M_M~A3_2PjR)N-_XNk(3(#CAl5~B@n zh}5JkDyhxLx!+rUqj$@--P;EDbq?%XKh)PTa%9WM;m+~Hn??_B8auLi^yrp}V_Qd$ zbPXTcFb0A?*zw|t4KJP9c5U~TuF6JomgU%rwYg=8pLuT})}_jHb)*<%3j1~YA;6m7 zYJ$_Y7eMkbK;+r??A$6^c$p#jk}aCd!983zv1S_*1R^GwN(yi&43o?*@; z!3o3;4ka`#G*39rS}2_H>wX>UwnGU`x$TNkn`9bAw3R4#2RpiVLhy#+u3b@R_r|cd zN5Qg{xeH9~{4jq8N{d2!@w2$D=fjgmNSHk(4u*t_RkwL6G@hL6;IkNVqH{WA4l6<% zf}Wbn<}L~v&{%|-Ubc)xsyxl(5wr{+8J;INeHoDk~LR(w1 z0$cn!wsd8FQgZgZ)W~y74mH-CUbAX{Ytz*o9XEDwy0W{IesFhZ|LzS9#m%Kzi0Ugq z#GDlff(AZQh{H|{bjoLFvu|R{pk|Mt-B43wesfd2g|g2=$`}quH{!Hn&UrNzIhE*{ z5i`5e&{T(ZE!vC`5N6nNUK3hnnsH{=0LZZA#DMC&rfSM-L>nouQRxKF8b$ETB@NW< z8^M*i4HY@{wEB1({JC%S>fs|hZ|vVp@r`Tywq4!3b?{{0*zw-}Lt8kD@cNM*H;--^ zIkoA|zP7`s$7^5sMb+(JQDmcL_=BdA_W@JQR(Zqtvw`1`Kl8C&E%+cG!el<(GX)}n zUno^!A_Lg^_^)08o+P2={r+a&`(t+@T(h97?nFfY0F zR{7Y^>IdJ2SAgUABkPKR*Q%*=>*$B!GRN7NF7P71-;&m)*FwZ#v!a4EO0Y(QoKC7r z3{E_PFxUhGVVKAeel_lw=?p>Vh~biWhBOz0TT=$my{0IYW+iTbQEd+=OAw$-;%zfS zZ-ELc2LGvU;O(|s9~O@OeBG^&H{AH&8;}0YsP3WnlAPpG zHov+u6Qj%+v}s|wWFniVX`jlbObx_zBRq?Z%xDTB)>o zO`HgzfR}r3#1k4>86=Z?&l@?%`NBY001s*u98R4+amDZAc5P3rl*|NF%-fSDEK~en(K*(?Y6alvJQl#=>&GsOPdu54a77tS^+Ksyx zm$wb~YfFs2qi>_QWJsg7N=P-a6=~aWO)=UGqcly#AV7KK)Tp;LMFEq~+3iP>+N53- z<@7xPOwq2m9sCL=n-cn^HC=a#6N3Pzdk;1qzZq<0#!yp$md4}Pl82mrh*1U8)8tn# zj{@*$8yNVta~ayUAN7}-j-SRI$W;9D|omfS{29Uq5~T@;q?*h?RyueDLhvefLjoKeTc4lBCYe^p5hnQtBwdk-E4vZFzC(vXbJL7D{lx7vCx*@*A3k?t^xWC;OQ-K&IP=$cPao~=t*zX*v-R+%mi?RBcJJ%jzM*M* zd1PyA#qQl*hqkTSx4LFmYjt;9^{%z`JI(caS*cq$N-M@dw-M+NjeQOHtevoqiLFL%bO8L@x z?2YO%z6XD!ZukTLa!dTo`$xZHt4BWMFQm%vz8gF9e=Pjwm*;)vv4vF!3xDz;e(R(1 z@eeEcn=kj}wN2-rX|&U~KaLFlBJY)7Wk0<<=REQGXa4jvMvR|$oI)H1nbAu>`RKaPjzydPSuEPudWR%Y^XUCuC zsSpRY2(w4crgL2Bp(h6t7GzPEI=0nE8Bn+2EE6G|&C(i>`DO-0Up4)=^3!j_aMpH#U}D z+fYO~=)v`|;f-nS8FO;xJqs(&n+ zS>cqY0ot-l7tIoVb?RS}G1CNZ?Lj%6Gw|6NL2+yaI8#38+nRDtFk zMyg>Xg$W(s7HSqZHsVcbj-NJ?fJGy9HpuM04)`SaEDG(hvx28_V}JSSqdx4n7!Gt# zTTm8WuD|E3b=4f+KB9OUuSe;-54d0Ov*wiyqx=*ev)>@x^+j2aBCLLU_2 zq0n(_-ir1}dTVZ)=g&^z9PsCLg)!eGfp&6eJCqQmu{BX>CwLZlmhzdh%&NjcKp>5F zifBgd@03FR+@2SKB*UNM&pi{J^-N^WQ`xh=!|x?K2{9M(vo*nID}Mobj%Kw}g(H&N z5zl8oCV|e6IWnBz8K<&GAx99l=fwA~u6~)5-FBPo8Tbr&p4iIaW+EjgRbLr(>m4n;s2X|HvcGqwkUH{hh&81O_ z;=+pI)igI(C70bPgvOSQ7$@*&E1qoXW#rA%bjza30>zRyJC6u6I&Dw08>NwUl{Y+~ z7J~MWS^QbOa|RgsxA0_Rk^y0sdij&$rx4~uAZ)yP3Lk#>Qsnbt{}hjOtu7V7S^8Ug zEBFwjs)JPyRAm)yEl+DHu1T6x z-&v6Px5pZ0QsC@5LAfLDLR*OdRgI zcWl#Np5A`{_^!TnYs#~W%2JBZdDg`$IC-rx$3S##w3G$}rlJVF^^j4 zHxFRelV=%t;Lkjw)@W6Oor780mR|*b2LE!xAXD(r1etAmsEBs{^5#edLsZ^ih~RK7 zGXTq^watK?P0MWz*@{0q{#+L;tBI7?!E(k$lL`dQ zs9r>J+M5BVTY>-pvN7sdnW1khzF}ON7uqUOBb7H~ZAUshYGEk~sd1)LFJJ8GWSG*&}H2VUL#|Y5dlh=>cG82b^KfN=WhN zyhSUmxgp}Ci<2{ECv{iE&u?fy*xq(^TgQ!ETd($PzP_uge@Ev?Z|BCQ)uq{$O*s{n zdF5qU6~JeTZ%~V)I=2ei41)IXS=gCNYCF@1blONV{Fyd|Eyr6Z*W3Vqjy9rI=2$@Z zbA5g@PHWL--=u0z#LlA7>H)~`WW&x6HF0M7&CYAE=J+$Sj6CNxmgUx$=G2vB*VY!a z)x=x3G`8J5(A~dp)AhYuukY)=*t_M%@xFnxd#)YZIe2u(&EtDUj;_0Npkwd#zb|~@ zLH*cAEu$Ybj#13n{(^q>_|G_}$;h*7d}gP?9AxlGAHyr3`Fw{5%B0ai4()(|W+6|~ zM?xV2O_xVgu;rvzHjVmO7$)*Wm^AWk`Pl0fV{ew0Gdj8uZg|$A%~)m!OmxW)LsH|2fz|NU3L^u@pcV16 zoL2OEW?gNY7(b*f$)jux!Q1I^;?WesxSZy}NdRdvY?j-M3})d}QxbtMHc5a+l@ObT zlct14k1DCv-kV84isYSUYfDF7|)ZCyc8((>dc@kiT zQ#IRb>dHPdR}eDT9?l_q1uZS*qmfS!S#=9E#=vlxb4mZd(1W9yMSkuYgSGq)$z!Xy zU6BEUW_xp0sV6Vp10gdQx!l2Iy>Ho%nr11UliHvzEJq%p8)C5W^VJ5gCfgvA$3m|# zO{CZJ#~@y#1kkugnhz!ewth^QLNE=F^59V_JetC7(v;I@CdO}`DT$F}+9zSeXlXoJH*qaI zdJbBeAzfk+uSj}ExqLXMhLoQejKqoZYv-Cy&({rskXv{}GeQe^r>{tO>h!*9)%m4GCh8rhYhAQ*u(gq9}4Os`7LhM@Tb z>1sjS6bGdP&g_`;G}=7vlC@~WJAW7anQ9my?wplPAn3eQM6VU8i^|YKr!KFAKS!38 zN0Pg$Vtruemo8KP`PA5@ljG;kj$Sx<_tM25O`IIPa%gSi@lC6awAJtL-FompymaOK%C^>sK+qhxzYK!>teM#(&;)?O!vC*JKoS)!cm$zxNRY zyJ+-Xezd98U(Sye-*NMYLi~2({~LEcuDSWkc=fe;OBO%hJr%`jX^_hjoP_%$$XU0C5z{vg0{Ap ziqMOx&S7T}CM{$qG@I)Tb`ls4i7T_uPnfoWCzwLfY&Ve}yea++h-PW{vxqcRpdqm+ zx=sI_>^8|0W2-Bdpz*F;nFfMB*OYc|N73NMvdinsVb1*<3Whq1Zfq#HxuN)KSHX?0 zGPpF=p~p96oNTl@jTEq@TCCOFFm>n*Fe8dqgUqw7YOXm^+lHK(Q4Qh8o*W9N#AY$k z5OnUdb{ruH8s)IbfLAPr0GnJ{nrBz|T1PQLbX~Jz$h7csQvYlZVfkWi(+XT6*7r;mQh#Bj)yXC%t_i!%Zs{XD9 zigh$HC69tu(dx9ULoHRedfNwfl#lFgxV*81;v{W_ajI22_zZTovKy;WO2_hOuBe6K z;=ss{O8*RzZY`jaKq(ZuF`lz?bE?HRSqe1P*TINGxd;N@eL<1cBI!ZwQ*?+4x3_J-yVyRpCKfpw2(6cdtI>Q z3}!KetpGVg+rYA?%87d=n9zdZb7v`(HY@>mUyvsI|$D(Ld(~ z9GFPTJFBq)E2a^n&PF+e+-Pvb;B#G!0}9J)qqNdmKr{jFP(mvQ?J%`1lvhPCmu<+Q z^KB3G#-9P>@p9^T5W|qe<|WPfwkwt(t($ALIK-dbE9)-Zw-4?%-P_fbj5a8pZ=-}+ zA1#b5w8G9D2$;_?g6{l5@n=<3P82_T3Oxya!_pa{@_F*ezlUQcJs~bOkGDeuN(_H~ zG_QtByXFzJg@qGkOheGR^!+rEvs)`Th0xHn^vPlWFn{&|erOtP=F)~h&0zyRd;Uzl z=*XgFk%cRA7q5gl(=-%MTAn^{1^%>b47At8eVscx~6Fi`{E4ZP_rkr|ZDR zwPjhgwbXphE3e3|fjnCwj@&Br&p>8F(2f{mB=To$S4pFeQ3!KDmGc{@*c=pXcI7fC zyxfrAs*)NU4rnYote7DKPoQUZ+!&Z#6K$p!M#fHr%!vrPD%w(=XOVsiMrG6**ttB? zK$9WuSk9iit$+Kg+8eL84!l!IjcCf4IK8fJO_`NPY3aG7 z=|(gJ@YDvh2YN7ILs!+1Lin9-uo6PLNrP@*`%=y-BEe6I8Pqd)FZO&`+Ch zf5;TAPR|lNC7Nx(y{mCzC>1u1R5W5Vgb^fnFPtLvnli+tpMvevY8DTNXQe!P4vLqJ z-#2ZBg$Pg{GWex=R$5CFwL_&+yq2K%88G~GIeCDZs9-sH1Ndixp$zmipIHkria}02 zE}uk(;?-+iJqo6isM(8RBVU*jtfT86*5-hr|tIGo7Cc=JG>C zk4+>c)A`3jKR!yURTPl8E*=GF|B08f)%$(=OFY=zTH-{F>V9R@vkk@I=h9E~b1@Xd zDF3uIjlHvK?5(De4W-P*HuVvnH)iAhYw1hEW=Bbg`lNUHr#43IpDF1 zv_twrk+8QxvXpct*toQ-O+k!CF=YE-d3^5~ua6Yqr93s+a*`WTmXv3$sK{PklWPaT zRb?zI%~@O#Nn4Yfw&mE4!>`^rJaYW_#O31?7tT_Go~FAkr6W&BJ}_klHahga7e zJ=S;VZ(g|i!oca52acWEb!<)f;T;?Hb*|deT+`E5x6Al*Rc~X>wwki;@UACskS)b> zHmFf#gXZm6HahJM!1)|^OkrWHb7}JWHMMK^Zrc>i*mSn%+`Tisw+^QLRd=kh{~wn= z|Dbs2y_(zaG!A{h!3R{_qO1!4J>Uy;y*+$y?-Q!=55L(ZVM_ zhpKu0lb@UY?LS=b7k@ne>8IxY`Jc>w>YEGa&7SwIFF*a|&ph*u&q1f*&rg5-aqGd+ zU-vCIlu)wg&_9JgtKf#`&mKX;pH=x8sWakdN^qcXmi`$J6q?fst>#8%3YX<87Bz6x zV0xMzHJG`wYQ++y(G=OB3J0|~+H$g~{LJBlU}uU&H)o}yi>^&GO)t1u;%Czdr*Sk} zh9P2Ca6<+G&|1+y;4@Ad6NPp~p(S!AlJ}PQGw~2YdOWaYQEm(LDy6`!mE5sFXvJ5b+s&IHiDriRG>Y}ndN$xbU;Q{BG z1Uk*CZC5Nao~#1_Jz)+@JqNVeYo28YAY0Cri#hEP{@jqB6!7N^JJFK21eY|*eT4iO z?5yJvP5k^Ye@3g!+l+|;d`{rccp%%3s2hHF@Hrsu*xZg@Yj%RcD~Mj&72mM3&ubzX zmCI*K^K61=cgUlaMsXN9=x0xs-QYD!bWY*S`tIQ2KIG3HME_of-X4BRUdW$)ISz4V zc9KYRiGKut{v9B*Q)r7zzBDYA492wZnuor-wwT}ftBVR&<>$bh5kEt5X{+Kf;Bzabo;h|fZs!9|! zt6sJhOY`V(;Da zyI{^QUfK8jr9SazF0t>N+c|o|3UrJe-8gz|)19MRUp>3~-npH-+uF)gV-@K|;#)29h z*kk}lql>0qG!vWRwjW3}^`hyU@~c48?7y|30)Xu5KikQSS~_?G=w?;)!<}Y`AN~w; z7HTG;VQTnutjG>_%;SfVW5idO1bXqJfIo-zpMO98EMhD^975?y;Osq9S@AS<>@S6j zC#Snvjuj_GDfLV?udj9mH-dPld3Iq|G=nhteeZS70fi1Zv!}{p#s1QhWba8dG#cP# zn6oR*K>!BAW;LYFzTq+W?D#VX8vSzue_oL>KeaM>>Di9@6KmQi0exfFhO0druI%i* zw5@B9TF^afQ7KoZ^W{rLWlk;RS>k8-v%zP0vLnnC)(Ai}I%i64IC-;G+whWRVQP07 z5NRiJHvWu&Ioeo}iwZg@ospXBJ=a8ApwI@QW6i?L>fz7ULZ=LX zvp296DG79WUVUABO-@jtRFelyYbfl zRs8&e=FyLu#^0@-_=r#CFlX>W%dPkA47&*f#e8g62@cs@dV`PrG+oN(gC3vnh@r>E zkPWJB9RCm}j6xagBcTh%N%PZjVtf8fFqew4RH#NdYH*B?neWxS^y{jordeP4?Chs! z&i&@MnlAn4mjCfr#KikiM}N?K>!bRi_oOEEOOTum_;tyw{8~bOqcI3RolqI}!Vs4< zMT*97JK%JBMnzrdc@AU{wI+;3g+Y{rA)iP0OG1X!#4zy_M$>+X$B>6$41&EAL-(Q` z1{)Z7v+~AU@aLMb*Xjn|;Rv}%Ywyf2JwE@5@6}%Vht^jfRQ3O~f+cRfT|4lz5{_$3 zpkdk`y>_lW@G)GsspW9eSWD27T@kEXV0+q+zYF}@yoPkC48+j%NVOt<1>nb{FbsAG z@YIXKr3^;>T%4?nN6$wSwJt+y%z_6J=Hat4Xd47;GrXoW3v;}VxeWOvIJHAwXyPp) zH8H}<7$w*KN%4d+%0vv-Ws0)lBmi4EHRMON3YRo8bIX1@@i;+$^gc83TqY)zEhn!U zmn@;BF#v|-1luZ1LyQvd!$=NN)^eK2CC{0cfJ;VsdTPYj0}Q`hAg3BJ+M#-85$T=S zG$Q5E5^^fu2VhLgFl{1ao;y;EZo#MJQqz@RYvJKi9=%nF=aL7-kdmucm~7n?wqJ<3 z*f!BQF<1@{er)YQv*?wC2k31DD;qt2X6X`xMzH*v>z7srMPmC#LaoaNX!0|QJiJT! zU8IfaCB{#~1#lW99gzaa^?_>O>7L{K%sS+nLgkO31bC{}$H(U6F9p1p>ALWie*nj2z%jawF zo;x#o<hcWUa>k~1uA2M|84i?0NO^ljs@4@f^nu{l~;bbEG z8K>jVCbUjVs!U&2nZ2Sq2e_D2m9e5CXK`gtdUHndx~_)4zZ^a}apu&W%g63sK6m%( zm0Q=(zchO3$9Jw=JAPz+^O2_dGe`Cu`}-HJyfAS7)`g=#8a>>%0JX12qb2sw1*Z{N{8_t}c(?#zMVuDL2+s@182*P#QSshE0 z*X-N8eQn+5qy=lwAK3TunX(smW^6t4KPZuAA3I)9bjuZEZ&i-J-8958 z#P&Z8-+1YLqf7@yHkv0mp_n)PyQKp^Z5;b)34eIvzLKjPeXD%EAg94xXi!aan z{&$zm_|6Z%_J?5S=f3fIB+yjhKp+ij#t2b!P;lcD`SUmI6hh#$3T|L~{)_=qZqCUt z%`=A#T2&3Jzk!p}2CGw-HDqxLVKRKCEjv=ZGO0Er2^){K>}BRjO+ujud9F=a)|Q=P z2N7l@!Kev9{A?vS(ka%F3O!a84h-2aYDl$CCloq{#{vMc4L+w@Aq8t`rikWJP?}zp zPiR_j+eozwpr-+uMR)O=?FwZuk^Im?8Y*0hV4!wZ{f+V^3w=XySTKJ!pxEHB)3s`f zE$Wy#KpPvUwn5KYvSE)HH0D}!xSLCsBcXbNIfxJjjzJQpRHrPmdrSfQCxNel&+z=F zwDf|NR{3FQZN}YgMK{-%3~ngAyumcjD4!8R1Eq&HmG^fQ-RvyAy)|~GEwgO-9D`|y zmS@j|KO^jfKf?)O%W9r6VsQT8P9rH&Kk}6l9xqkT)VPU6;UYN+A zDYD@-(wtWq_zfv93uVy&SlBD2L;g%yXK|d$(uw?;!pk)&3#EUCKO;Wp z>mgqp)ywJl+w@Z_3Q?ZLGN8*M`jaP7lgw zchnE=Y8dHj=&LJe&dpt2 zkiVuNVwE>y1*`K5=~uav3K2p>o}Fmfw8~bC!|9)Kw#N%8=4`cdWAVm<^aGp9PHe0_ zv!(1tPtCx#hQS>z)cqLSwVDDTdm0LxDZVkup9?7(9I|K=8*{{)@nKhO!$D?8j5%SD zDjW%Ik|B#xKSY&7jvY+*@@co0@N&>g*o@y90oit8CK>hQIT0Nje|7~8GyA6bxda1Rg#@pQcJNuu(@>!kCx@4l6dD$qh+e^ov_ucKobo#;8cK5$kSx&h z(^}#x36W0uj09TEgwUqlg$z@cHm9;SS{2W#%3M)%eeL}Jvp>FXV^1v7b#rI!tNq=# z&+fi;de_}cea~Oo^YXQQFJ0XacBb7uznk{T^@Gn}=@~n{ZTQ%hi6a|1uzTXj=G(_M zKYwn^%l(_rZ{1RpUS7653VEx_Evw9f#9ASaN8WqzC=&LZc$=O-`^Si}p{%7L3ql)j z%`dCZt*!zT=f{O@!xw@#c9|)ektjO?9DZM5G#L4J4JQohu|u0fgU1pq&BJuM@#+X< zyRsp_8Wl8Xx-Pe(Hc|~+W|ih>bz`&|?v2!$5*+Ynrh}%9IY&X+~q z_?qGyFltvR8mAtMZ50;nzL;=TI7*?-3|ZZ2Bhn5>$I94kW4x>^Jz~2GUI>jbNr~|S#`F1%grM_*LG8dW838e+i&jg>_6NwzQ6hM;Zq&={-yl> zuWJTAXuAD=Bgc*1dK>uGJpA68TXz0V)2+8!Mg!Cwlz`^^KKBtG?BES-e+h61KH!H= zJQ{^&>+>L=1R(>2F=Pg+%Mc4N;8EISDZy7z?O}Ju}251|ChPssn~rF$(0=gG#7WKpQeM#nT(+V(STD z&=MoHggn?vr75gZGx%=pP2l_+rGsqvpG_4u_Iks>f3EErD6ZSwcK<=y*aziTsl4${ z9kmoj-%#CSRw#^2xX&CHE6R~N=Je>;E@0kGY zJTZ(>1;}8Cwba|9?&V_$o2JZ+8l-hJl_6#G$$hqm{dgpV_TMis%a)^lGR)S&WNz8- zMDGOMtc8WRo+R)(o*s%~oean$+s{liqZbWNomXgS?<#@t;YeS4ZYWt$+r)UBRFh6(U z-VbKDFI@D@{fnaQX_Q_~G1w#_fTmP>`DD}M*F-Wa4-@rFFnH8FMuwD=OWs}BOyn;e zG+h~FD+wOm8kbs~Dc*@8zk+R*5LFSzC8_8crD>viO{CWpoXVqF*!cZ)WzdlP1ZW|p zWfex*9;4g~ePU+)#K}n*L)sO#rsI(z50Ok!^N&IgA#tKMAiw`vAOH`IKT*Nv;ggeu z{9?h$DvIQV!}d-BxTImwlv(?fpIP4T4KmXRlObDkl}C|2OitYbVLnENCd$vfYpxHT z67SA5UO)mer&rRi-6X zWG}Ad{JQMaH8rtrP9D5><>c6zBX$bm#dG6V&ptnJ>6MX7xBAcR?l{}hc=&MN{+~=- zd~y8L__Z_lub#R^Rjot5+63habSiFR=ctrW;jr6 zXw-pFs$n2|c9l0MzF`dnUAkyK&a$Nosl|b4xdBX?Z08;(a#Rv>N0ujfxmFZs{-hr1 zH2~Zg`0~Z%1X=>0D=5U_$hWP6hri;Q^MUP{tu;bVI?!mXaHt z6(e1R96M;_c|+;Q=9>W)9RW%E_bGAeJZ%1S9&@U-eY^R&gBt)Kl}4v6$D+J8Y{hI@g6 zmnI~@dVvywv!62g+7bMz*x8Q)Y!hwIZ>`ohn{-JM`7`e#k9ns|4E6Iq!zUU4Et+TL zB*V1io@09>2=JWQ8v@k23~l4jb7nG^2VS!*nKK7hMKe)8uXg0wo%F|FA946@Oa(U# zKD!hB@Zgu)*?N@51#yOc3x9^|Is_d|lt7wl9{C8Hvnb|_{@KnSjOKCBXKWV5b7n^8 zJr$eB*A_GQTG04&G>(yYRux#l=v{&vn!y1N0%5Ok;ZT>sH-eHPQ_`pU~~$vcFS3H+{v2HcIqF^j;IR| zbRs}DV3@$488QUzP;+7!F_Zi`jMtHH5}?ALQH)zL-k=_@VP{jxT4m#)MudPWAW<#A zn;~-+WHu3O0x>qs=*l}7ibT^JmWIIaF!qs7KWc^&P6fFkc{cuB7qM(G)#_+TbzTui z=~d+wgNWlP^*Nc<*Vd){*YWK0dwLp5HjekL{?V0#_W;hT! z(v<@*TcR2j+lCLXzjJ)kz~PNUN4MWQyyM=H?pH2$j~&~#s;E4BQATNYF-Q1O zNO=l>)+Q64fGULe+cBkap7D0>S_oPx^C~pv)z-1| z7}a{KYeB(4d#eInO@V93HdwnkUIUu0k62}9O9&|DL_#6xIPjT?rBwC+9osvB($kEx z!&s$Bsi`QE$C-w}ZO576)uQG0wsA!^B%-#QR$SWiXM2a(W(o`xFIgO4VkMwy2%)2{ zMHVfjCDLXOoV^oJ>~XR9^AzmtaP-5>naa$GZCXHlQ4-BNjX5t`MiX9ky|HK-OFQ_y zA|9e+P_O}Hr)@Sn6ghiFo$s9ql`(=@VUj5b+EvMz;t9jzoF3?FJFDP^+m*!6NS$Q} zK1=y5<}6R{g5_$FrN*Dr<}Tb;5;?zq&GB^|l-;eM78GL|VPoc7|6w{)~XR zHb$)sW6soMmY7-mxhjIlxv4U*nFesK&TpZKJXfWEMI%jur=BfIJ^96sG~=e?R2AGA-r z-#GTO+KIQQ)qp6d>F(QcxNV zy7f`<^S|8ocW+b_EM5Gy&y=n|-0<=n4R$8cJDfCRpEuo~mb3cgLR7L1ArDT!VYUid z(OqDGTo_VsA6*@SV^=tt#T`+{KzRgbwC7;deUcTx(G$RLEXA=J*?iQsdmOhSlPYwe zY}%*53z;#%LG)zP>LesmYzLbmd2GtaYsQKP-YUJpOZg@`u2TN8`1uF5fBTzg%F2@R zp7Q_jpyJL)r33%9X5@W<9&{H(Pd0%*yDz7Nq_>-Ll^n!owKtsF5&_x(y}wQEifsgj zd&sscw?n3=85VGFBrX-KYzp()SO~^QGk!b#rZtzxuZzJ#_6!~Qrxzb1xpqsu@-u`J zo8;PqPlD5KK{YGfYpVBZ;CBelPto%+_&oSJP?x=_ZU)a>O?SjxHqRcklUiQl1X`$P z$f6cDXy0^TXv5khL&iW**Yh<8AllW?W)^;XCJs}x2TfFFjq0xkuqhKw&t`~0^UPM& z+?~G0q73m4XH+O#sTifPlSXQ5fFcK9uN(d;KX-r~<<~b6I=NCCCZ1HfQ{60=H1F4_ zg4t^DK*Dz~9^Jb)6z`MB&rc1%E4T&jh0G+;8-p<3OZKxfXnEAk8NLB9aB`>g*m`@A zf%_$lwD`4o3}v?DVLc7|3V^S=++$Y;f;DPOxKVnm0e<5(JT!udhX74N8XN3eB3njVC3rI+h^C`ID2~F;;Es_ zCkHMa9l3lQ1Pytn{`2+I$Hz_|8@Y1q`r$)Y4)5WgRH`wjCU+Pq&Fv6vhCG|{IeR^1 z)l|?NO`qAJsuu=<-9do{U0vx3Fs!&MJyS@62Zb=bZ$u`tWp85?MK+RChWwyi4E3VW z^3wyH3$g<2oSTjkdm}g+S#oMp_0lhZd|hAfgXOC@a zIl8I+z}kjBu=DE1-gS+8*R|}W3bdXHcghXY&^BX>KYQ7;;4`-z$=DQ$tk27^LeOa| z+lzA79Nu|m#o~>b^Q(SzIB)RCtwk^YYVrM#ThTC&zs0Xs_;d5coE!FwQRgKspAyjeC#spmHYnVSdSDI0yQa^!V>-BIPfmYPU|Z}US< zeJVT7c=&w)b<6MvrQ;u$jr}Tn+xW__{K>K}KDOkWpI!Ow$J6G1GkMXoPe1hyP8gi~ z-S4klnzL}$f?41D&NE;8(#)^^AqW~SJ>!Ybm==1n{>CJKHb5N?P26U=L(Sw*1>(VBvYz4G?9vOC*~hSnEc=_noASayA5>6OlcfsMuR z=PR44Z*D5NvpIHgb#~E`d65NR=Q)LQzZWscNk!;N^->HIC+dxmD{^c#h$=(ZFZd>{U=>)Z0!$O@KVpgTp+Y4}XebFgbj!KPAi$ z35n}nAt(03KzI`Wit+m1bKpb*>_+26Ml zIp=>D#$GgcM*f_crSt3?nO2VWqquQis-5T;vBUmWN3z>|cedTy(K_5+b8}Di zcwh64&5iB(k%q!}dtnw!pns+}<{YsD2d$iPG}?~f*-jx;>E@si2M8L^DyzSd4@zw< zNj=h8b8ubF+3gMeyK9GcHVyQ^#v5*QxAu28_BKYTK5fG3Xg(;rB~pO?c~SyxpwG%R z85`0;|VVZblNd$!;C?5lIF=v@0S7JHqohNi&og(6~$NOTQ!o_{NgswWJHnf zKr}qCHEIXjS;++o0_RY%fqD*Q)j6iE24}57~R))eb=Gp()P-%^xC{gZB|orZe?w}u&ubIxuCu=hf)>!hMnE%es(^f ztI|xN45Qi6N`SKg{}Au{hlxQ+=iu1ED9jw$GetQnFr;eMR{g~0f=X8=+F*5aey!ke zbG#Z=HY#QNR)P)0YOGGRfoM2+wX0d}>Py?1iA7Ebjbs|(bhT}RccZJ_f!}r*v#QZn zINI4<^4xehwhC4ky9YQbdDW7%H7 zEF-ZOVOE&$nVSfo<%cc%!Wy!@)LDLinYSo8ve1HQQQG2^>_w@`vsO0ertzEk)cV%T zo7Y+O<6T>?_inkid)vT)E^2XRazN4S(2R z?TL_RlU6KuAQ0;^QH!z=>`pL;9w$$pUVMyHnoG~kl1&eR>Db~wJWMWa#X%<>bmfJ~ zXg^ZF4s5L9CzA&n($tKgte z3C6l?MpO!e7{Mj&M;o)v2(7yflY~(TD#NgKS&S91sP8mu|PYlh^f`f@unZ7ra z_$r28?;i!ztFbGFNXsQXmpo+Ks*|i+u)9Ytc{A|D81)lv)ZK#i;4hgjKlg}D(-hsZ zf`i*1cEHw2g`pyZS;=KbGO?Mc$HUItR!OcQ`#!?$Sqo`V4Z&b>DhYEnL{B_D zX$kWNk>K&-Yp)4GqkpDmFFkK&Wg}it7biJ&3ry#c>Wz(4Kks@z;#HJ^PA$lcY2*W4jQk$p8Nh+quPz=2c zP2`&?E;UP2h^OK4OXyM)Nk~&9G4_3>s}N2wmqaqeJB{DN7&K*5FAsUxKOSvEG1{jB ze6MVzB~ptf=E2rx6ee3aWphqz`S3e6xA?Y^e~EscH1_Mg*Z=yZGtDS|5%i8+JqVewn4chF!CNuafgEt<{zgx`U*iiRR zIeqYLru#yZcLnbv-jg(bHZ{fmnQ*Ocm~VdHuN``?cI=~)+aDGE)q}$G|7qc}{ER>U z?BXB%cgfE^l{9K%$r<9wDzDL;gVH#qGI@S$PI^OXnw>?Mypk#$U}pj#v303SAb1F*O*k!4 zG=4yL4%MMCK!uipO3~2i`s5T4pJU5btOJ-V_zZcbk&RR$%q^KHr8BUFpb1vv(gFk? z)2(=d(PoFKA;vT=$%ElF$$(G;&P$=q3$1tj8L){2x_Hq%gvyk{00jd}1sFY8e%LVb z>~>-|?l84_mXl$5l8r?}p;^}ms%s!n@{2!H3&K>;PT29E-eOk=OjkHDWn%D`tD z24ATdE$0-`c|T;U@Mr$;gv_RYb^*qpqj?rj31}qKXp#{>7h28dwQ&l16m=CBt%(=a zW<|Evm*3gDdSqwQSWgRLV=7(1pC|Tk{$Shij%GW25dHJ+*3o@yhj*^t7|UH#SX!SG z>#406>s>XtxqiH-VW77bK74w06;K9F>RK6lN5bw#C3lh3#>;XrwM<$twP#OiyabSV}SZmPo`X zbbfJtej(%#>JC2TtU8mtM#^e(t5D}cAf1$#LJ+PTM1E;)ytFcAMS#_`+#`D*^WSJd zP1VQ)&ZTfM6uK&h%FJcRiA&N8>hr7DH?*y;>^!ul^}jz;{^IqXlY6(0p5FPF*Z042 zeLsR{^v^F{qZUWs{fqmJNMGIg(zOFGTr z?I1s7$ptmXyJ|R{^TOVpZN+WX$t$ZPv6|eP#z@hc@|?c*?#BFPj?ZX~Ro3J-p*M#1 z^SuD<7acOn;nsr6M$Qv-RWjUzHR3(_{3Eb#L*+1ML-bUKb`+WbOBFRX?i)@#4v#xA zv)N9ujA%KZd$AJ|!O=p>_AQ3XU`so+&T}BAYlfh051|s?@;DF;$4(^Dj#pR0x+~Jt zsIx)Y4G^@E=OxlVTTy7QbDkzwp1ceJHIdWEGnb;rqRNRj9x^;kn-e`It9EkYPwyRn zHntov8p~tP*kifX z-IB+WI;q)grfz0}$iRDe$T{Z>MgSy8Fz1{zK@d4HH=7+SwQSkraqaAuH+X7itGqii zJ6>CosZQ*q)Pegu_y6AI14t^2t8U#o-?`_8?|vUZzTZ3e-wRvT4(?n%v}0{U!Lp(t zFJAb3K!l)4fwuf-q@G=#^ZoqUJQ#znni>RMoL+5MIHLjJ?D6sg z;j^4!+UzK_#*Fp|K1X*Kh$iQmV&g|jUTRrgUPDdp@?|Bh=l56)Q^%o^iks_bMhGtbOz<1=rcP807^VcB!o}* za&jpEqDX2k`B=xNx%$f=afyLPL+P`gM+95GDOsR6NZQoFyF{U@+${op&@6F*pU z`F8QpyXZIOjJ{Jac&Gl&yA@Y&SMNEsynWA({=aFMAl1$2A1h%Ty363M$^Ip+y0{-= z!+DGEaHk~~epu1>e#z*M>)>xAKdu>gH+13cg5i&vCVpN+a@62ktP|n~_$3PzoJcKt ztT7p1_p4d3xnG>x7S>?FL+@E%$B6LIDkjNCU{uc4`tfxcgWQ<|-a~Kj+5JtB<{$IQuIFW$o3Mep<(;_=rjaeYI59X3)%KB>Dlx znz&?k7AZgR6g;#tDSq7-1{+09lU9pOA;uT=)un6&fSwp!qp4MW4cWQ;XW%n_b)oi= zS{u`;yXMt8iNWBeC>DldbD!l@_T?Y z)A!YY3d5;ZR>c~07p#_6tsg`8LhUEQNiSV8n(j{1sUtN74^0#`vEdlRtGh-}D}HMl z;{45b_=ZTAYSMssh{wY+qCK*83oMvR1^DGDfSQ6+equ1Fxn=zDXSSLz;K0t&7 z^6SB1%~}$}`ju!3`~={nW@KGzWYt=g{Js@KU5LTplD<>AA?6KbH;JKW$ATcTxuL*7Uu7{p|L!Gu^|dPW1O29O*gMclOAo^M}XJ9UVA%aPatv zepH}O92`A;r1$W_!QER<>}U@pEl-YJm6p;HNLpbD&ne5(l9qE~Ai2A+Q<8p_hYWm% zHj6*QjUy!aUj8%0bqaqLPi7FIW534%|D!-v2k&*BlhXX6Q23n^WXZ{)4%@cvyc6oc~5?0 z@vIjY&Ybz;(|Wl#HRJIwD*svh*%Ub*q6Hm|prge%JbcD5wT;9?P9Efw zR3*vJhNI)0GII)2&!{ET1`;ekIR#1QI5L^*5@Em4=7or6!1pZ6G$FPrkX(_7052!C z#R5!-gdS5213Iw|0cSVzQiHlC)WegFn4*OpGg! zPs)f{x~(MT)~3SI?t+0;g#+zHeI13p?Kyp`b4NOg`d1g6U7d4jZSIMtK<50Jq33~w z&*#qmrll)G3z2jXcJ?GN0_&i5lbY^RW|+jEg$HMt5Huxc&U3{JXCVX)GmkE!(A|w?95;WGng*{8>L+_0_ zyCVL~*AP~mBDAf6Zvi+t(T%_$LeN~=$&ZozXM!KdpXKC^qVL7q+=U7cm%BqRr71O@ z0tF>k++*V+R=~pnGGYEfGl+3u_b9{N zAKuY=MQF3Pt=E(#MMluD53M8fJ~Utof4=YXfrJ?+-?o64sa1ft(S-m@Cnj+k@;vjo z(5z>&=03+7a^^glHsjgS*u|VPX!;u{6QH$&5@QG{1{(GM^j&W)5`P!X_FNxq2VoUqw6b&HdKvmsU6%}iv;x6iae5v8?!Qi!+>QF zH2NMWZy><|Z3Y(`XNE{;W|F#W3D4OuThrgbBOKk7onMLIZ)MJ|ro#QJa!+okxv;f% zU}Np@rkbG*l|!3bhr63Ll!nOWZ48-$H2Kew%;#_tvgI&K64_-zPs)V`JNt}im(}dZ zu(&ilIUA^}tY%;`8O7qs9&TF`Vj50Q!z8Ao3Xvo^Q#@*(q@*!PmU%L5cE`_=7HbL& zzqB~ySXdu2lH3}~ZOABUNscX#l%$3o!+o`Mt$mnnhc(l zEvY#@m-UdU3OOtZSmr9&6QyFZSOJp8Hj!>{vvWD6Oj*^G*5B|_EH`=z^MGCf!jNaw zBq#==Q?px&DpyyucGk46saerh+Ay}Q==I+97Y}u#@O<<9_E&p%p~7*aXV=RYcigzJ z3H#>Ry{}x@ee0qjXv!-+yRIJJGkSu#;+m&7lxiyuHU>V1^m8X(mW?@=3PE?>tUFIp{AuSm)Oe=ZOPB){>X>=68&%^9G zBL@miF$C@20prXLLAzmHR<=uqm*3K!U3$E|Mb4(y$mOX)STXRKf)IzX=mql)CS!ZN z9Hp4yDe(g-w490&bH2a!BSeRJXP8v~8t^%s;d~!k7Gbt=<}Jqd>B{mytiDIEg`Iuv z$Dbd|p@Ec)c}pph*RWobnX_nfG==v3Ino5ICI#B^pXrPKbH;-B)R&S;gx*(Id9q{G z$@XPKJJ=Cp(NwA*eWJ-BvBLQSATYmC=$OL> zf=B+Tc;an7Uhy&9bPhRut?%86i94m2e$3&0`1vRYmmuvH+CUL}R;^F>@{2|2qdhhs z;?z;CLIl(ldZ|@T!hk0@1ufM?FMmmxz=#Hi8ykuoc^e^)meJdFBPbZSl< zw@a`7qVUzvYOj#O{h#Uv|0}(04Nk{{S!`s^4RjwZ5&vWmV}0a5_n~<3Bf`o??8rqR zb3xzRrNbYu8vXyajr^yI{(poN(H&r=zx20NjeY>;6>kAwD_x2Yt$2tefO}y&7QiJn zsME*jHo3G9x$e_0Hco76jX+;oxl|E~!N#xwoh%8nSd7ESG%<_%s*9!uL9<;Xbr)WI zKmWDQT8IDFP+p*{zPYyVzc-BkL|m6hEm$B+Q!tArwdox8;ZlZ=R}+5CXxrkxt?-wM zq^1yzU%|R0-fxkbq9ZjpSU^d?z9YR9CJ$kFD4JB`(4@kKQ2eF%^Q22h2Vv6cKx0GJW}tVmkvYuyKLqa{*!@dp$pwYSbaCTea( zw(eSMVDZFI(-hrG49id?2Eo*X$xsuvRz;XLflCTYB7o8S6a>iDu-L@#YAHso>Lr^1 z@5EqCYI#_#Uyq+cZyh7(M(FNiFevIvt$UP{T9>*DzZeB;!9EhF{CJp%F2t+o-f6{8 zFD-^=K_uLa+V{ntq-7yNG-#+5{X}ziqxora?#!aXr3#~IK)PrUe~(&x^u5qUx8s|*Bw)(OK87&5Xhzw( z)C#?SN)wc_YT^#+3bjLTbLwvH@cW_R&rkMVe)&xE*y%$CJbrNO#NqS1ca5D~-BzUS4i!MS61hd_6ES z2-@pBgP_Ct&(hh52?DL<6jzx)OE5_GQWl*#4=p!Ae4zp-EiGlGFZwx$AG$wU+ zs2yRD1US?DvXrG2s6ZzyE)T}GWW=sKvSs({BZmi%?C(8#_;TNgm&bdq44%E#clvv; z^&H-PtfS%Zt;=U#89N1kzA=90>Tu616KCGI*1K=>;pV!nZM8d^DmFA$?|?#cSzWR* zJ&|p33qaU8N_zz0tmJ1}DcNL_!|jth1EJMyW+-D-Q}wRwxSXWv>BWct&$8F=W{$pJ zFm9SrJUf09D%<%Ue|9f}-nyx^_;ci)^sRc4eC_@APxIirwFB>054~SJ%s0PxDn~!8 znYe>qS;oyzWB&KMadGK$zw*euC%>}r+23FI+}Gzk`}oXnePzM48F4Spo%ifh&;8-Q zob^?uK!0J*6JMJC_!j}uFFf`I_;XYWv~)R4DcWgqIPvGltw!+KBWSR*Plq<_j5tPW zic#p4II^8l-e?S@HU)x4cVW&X;wG7B29g?JWCS|uQsc;Q1||cLQR=9K!6q*xV-SH3 zV6r7YJ1uA;Nr$$B2oo&B8Fo#!GfiYlGa!bPI^fJ)+GuoSE)aA|0)@fpB?R4&l4uyv z@n@sTz-JcV&tT**d?pi~;|P%`cN)|- zR3vqoxip>lvqUq9jONd}RPr-^ma4T)sr716^Gq2Z^1Lh~DSz(tl;^&24?a7j?0N4b z{v1W2eE^1H!X8JkA4Yw{$LXwiM6AMT`>$sHdW76qU6I(eWS-Q}NegOsNf z#EwdewyIy+26{Y^^KGlo~sF@v}UBZlLu3p5#K=9 zB9uZwl*96h-MM}cV-lVr$(HwP{MneZ@n=(h&Ve(l5D;zqOALxf(2VBeO@AYbKl3Y; zLs2tlP6t7go{a=Y8b5I}pU3a{vnfBj{AY=Z(d9UR?U3;w;dtL4nfx@8&Zg-ZjwTkEdxY(ZPTZ)4fWmYSh$ z^+R1%?FE_jxp_!%AkIu8bok^!;4>P_Bqt-6Vc414^fz4cbGF2vafUOZv-2x5Qo3pi zb~hF8UXgZkV|CBghM~>1BtNr&0ko+%wsAIaO|~&r!Dr8(QOpR7W@IA0YZ4qvf%XPm z+VN*6yFuEsNU|~KY-@@XVP{_}z1iS1>CHxxi!e-)BT`IHBUE5|7tT;_^ORc2%urwQ zONH;OemHP8mKYTYZ=_UZBS3Aa5ZR5U)J3I-Eo?ul=HB^u78c ze_Px>kYBvICRorEA6pkQn_syNWSD2<)TCvyLii_8x-3*!OyaRg3WI+Qb*hMAPO1Gm zr}%%vOTp&{)Gq(oGM_2rBp0XVmIbp{msPJSsp%-I>!_;ls$03btmDM;vMWbd+&I7Y zwSnE=89nsf(WAG9_PsHD;JYISIehTdo*l3E?YVhj$IafbM)a$_dv2cDK6bF{DrXVy z@1lUC2ljRj?&)~>(3asvdPHZ+iP?lC)lvZ3GC}S~>HXFQEBDA|rTXty{ z8XEbHnYLH?$r%Ny!Ag6_3ahir@`5EbfusxVjpw?%PIuN{+`4k#$}N>iITeAl%8at2 z#Dq_tm5=NWmnV+SM2%n#(x(S#Xj>?w3;-aS=k z^SeU>r_@Sjp5o-v=MrN~mU>{v90 zNHVpUvq?Q8{yfQVf*Wdewee>mXgM?I#bqo=O_~$Cu{irw=W0@*2e-BN@7#m{GW@xB z)2i|P>-Vnhf)A6B-3y#D4- zipG9~<_7tACIqP>dT4zl-{WY%V=d(C2!6%*QFhz^6Gp zU}|b?dMS(#cNiiA)Y!VD7G7WkeG>Go(eZMEXvl-&sCvjG;v3bZG7i7Z;X!;tEC5Fj z|A^yYa?Ko0Y+{(SxA|99K@zi#OHJ5Dts;~LDuIII(++MUmZ%|}!Q6iKcb`_S^Jozem~ z!i?On)=Z?$?tr9GXtx;kCBQ!OlB?{Fy;CH?gxOH;^D^<=i0%ast+ojc0cj|fL`MyU zhoX+gDu;dyU_=ZP*q+}1R`u0ST3`KH>50LTUEi;~{2`(Q5J(DL7=dxYic}a*c%9{r^7TZYVQmJ)Y2!Pj zY*g9pxuIrP_!5K{7?#5GqRC$7!Q1wC2i{Rqg|APlaFAkP42 zW~U~@7Fwuz8L*(2m)!6*wF%4g|EQ?%hhS%F8Q2=17z1>Xci8VOH>i7LA1HoXxItp5 zRcO)%>c+K!)cCbyYGu>#5Tjas8B;?k(#I1_6Te9`rZyZKCpP!UAQ&3N534Y0#-XT{ zT8qK(kr)g@48eXVtsDZK7BLn{Uzt$|(|7Q@>-2%d=I{d5}2&q6EnsxLp+8dJeI z^%QVoGZB$=)TA1L8o#;|<_j?@K1{t7=|`Yd8?Gs+HJ~OUSRVD#{`g^K_!utzP@0s5 zQ8X7#JU%@^`RPcLBC$1&#>9!C>HOWv>AUDs9aXEz`_+*q{5}BNW*_BWihn8|xy|qP zs^Jegg)nLO?z#(q|JwPsOJ}x^pFB5wdVgQfzQGH}hI{8t-+YpZRP7;8#yq3b}#(-%7s&}T)Ob`#D(j_7hb(_W~}GbnwCSzZoG2o^yR@* z*G5lW8#{Yt_{1BRd&V!GS>CX-sd9Hq)ux8ZEeJuk)@^R8-o}E{62n_z%sH|x9zM&+ zO{&3#3XJTg0Cja@VKlm;9^X$iwfd0bl$NvTJIb0t5 zQiMPM%jdrut;K;BwByfCc|-i!BWUqwKy-C7#|S1@po0N|PDn;`qb4bpWM*T|fh5Dr z@iB&o9dK?)3F7Ax>WdJxsX(LM0Zxo}q?h#RWP{I;VRCm#oF<_fI?XtZLDH%bTYxQF z+Osq|NQ5?e48%^cFbAv2phl6ya;<^SOk}+z1kE~a1c$zp5@FXW%*7xSbuj==3?(6! zG-Ifs6gdn;yG&^qI65KaOJl6Wm?j1Vu$eb^76`foh2h1fzu_q~iORHsOc_BWQ(c6Y zWk=UQW+nog<0QtIb0mY>^Jfg2Jc7o6Y6?4RBG!ziF^BY-_;%vbmc;nHrSX{y7oTp- zywqJd(2>*Mkvr5`40-NfTQaz|1iP=j==#Q-o`!_D*)xMLaC9Jlzi)Y-+K6Y{J}3>Yc09!2w~SI5oe#61`?8W$cxTdK1o z&;Gu```}cv*#Yejn71K7uJYvL{34)O{22tTq8*Fo_Cm@`q^E2-%uf7S2%4<}9n)&v zJ%4sU8;=9s2%cD9qs`*aNtTigc2+T4YUGh`G4AKjx-VWfCTa;LqD&Ha?i)r9oj!(b zFZO*!O!$}3W4eU-a1`>pn^II8KMCu#)$i1k44#Z2z_(6ESF%e^-$>a~gP z_0P2LL&}Duqv12Q_;WaN*3$@9SP6scNEY;r=YY@Ve_=X@X=c2L3iPzfB~N9&@Qu*S z8BX;g8UAeP#A(SWTA%`Lg}*+^%A_b=*`elah;(y$I`r85xyE}vaE>KWh;2XA{#1rJ=C^XXdw%__IOvS^WLNvnkI##jin>IxPR$i9bvEIZVh6fWx0{ zsans9EK_D)QCJCZhCg52Xd=(!TUxk8^1_ZC1U_%#IKoEoFY+3fcdj_PysCUrd{=29 zOmBEi)o6Fc;FbpQ=ic@TB(Ll8@>{Zkb~s=rQqQ?yXBAj+U0OKp846A2v$Z0iVL}|1 z{OpKyR&!24b#~(V`hxwf728^qPHm~Xu&rribMwfCdd@@a>u&5{-`W(4tINqIkJ<#8 zk!4QHH4P2uu_MW5WI_eAJa#6l*$U~(5VKzw(oOD#M zOJimnTEpnh>Q;Q@l6?}13 zYwV1sVvt}IR$0ec{;FZ%F>GVk~-3u^W!pru9X2a zD@wBxOS;O^hIe=LY+iF_b=CRJ)rYz_HD;9Yb$Mm5wjhwUw=v=1s-2`*7bFD?|DuM$ zseeH`-jS^a8f$;-(s5u2vvQtAo4F)|+7~occuc~=dT<7rGfEkROJK6)IXfaPG;PE< zvx?gRK9dV=#Mt67O7*U4UOU_nY3N8gw7mnojYgYoa0;!CLc45gE@A0pVl!{3ly40( z7A_6VosR^Ea-J>u*&Q7i=FgLppYP|-N?kVo?3lA%MrAL1+H6jp(+6aZoGNIvIpX{! zMl@db(ize51dvFqBERhDj@a}KheeW^JyH&6u&$(`Rv+N$J>|pZ(0R^?%%cH!uHO- zEu9nlH=NzRu_~*nE~~L2uNB%%7IbA+J%yxb%ZtuzkhU|BIhsE^>})JLf}kCj&TNDm zmuEDS9xPjz2&@JyD^prTI!vKMjUeT+%x2G=x%34mw7D=? z2Y)U~t1r)Lq2S30RFr1bwbyo+W>sxz%ssN>RN0M>^RNA)b>u_D44bcizO46e8aDK` zT>ZH9&AYW%-!Jd`hrA1KwY++F_2vI3d&6MU#7~x8`8jeEKm%c9Xsu2m#N+7!wm#is z_(Cf-oB?nFK;RNPnhDSvJpv#4@K6KL2-AREMt_`CJawu22+3kBZ1CNhp*u*0K$SVp zo)d+thCb%*3P3b)>A?>SQ#&eU2oA0S;&2P5FC9zA-UG?jBLv!iJNLrvqT!!cy!r_V zqG{)DmtFnEn(@C|H~2S={XfbZ{s>G>A}h1AJno3KF(Wk|k!P?o6q@xITaIKkTdSaV z1X9`E(dv+kHiThyr!wfGOVu`-gD094o4cTbNe#O8l8G%S*v>pO{tL!Pg z2*#sfqnk9HJQ_hUdWb$!eHB2>q=aGMX9Vp4HXe27j<^(}WS@x%zYh@{3Vl_p#w5V6 zM4sr{&#s%*;L&SfC`l_AId|V6us>`syjNV8-KK~e%Me>8fO9`#&QN7N7u#4T$1U1i z(Dy_2B>?y=C*zpYZ9X%yS7M%EPs@UKoSE4b#(=Cr%$Z(V6}1c-GqOnI&rUFzk+mCa z0){4%&An4}?=)#=FmNgWj|!I<8b=RBwGZa0DbjoVB?jF!FJUTb#pw;rNUinwC!&sA z@?2=8&_zyc4DZxCpaJDntAe$7b*E-P*~HUC!SJoJxl|-0;L$zGCZ6g1%M;y^NX5`f z7&Zli-=fs~f+7GTx|QyDG>E3w2&(ZbfEa$XHK4kyNgiyR)Li=AlQah_$B&c2{k(Ya zb4jh)?T*}+mFliw!Y~+=awl}$~IZUMgxJhHj;bNLu`*QLgMSREb7(RFs4 z{BTYDm^18J#^28#_@rRy)8T;=H&1sCpFKWu{`m046GJ_RN6#O=eD3)8$$b}(@0~b( zWcbv<{$oa=`;P1wI<&ngdv)w0OX$r?SshGX0fM#z{#+`r0Ixu+KU@#P6JViZg^3Ef#MRkxD@RW5xjA^C_sG8SQ^#)%pCtwQ`slfazTlRe5P^_-|G2tZA9$$EyGGv;3hC3y1C7WHhok5w&XUhx{YXCB?ptys@Djb02cn%6QsSWfu8d6hg5;#E6&@qb8;AqZ*FN=+> zOj(4}G&fQcAtB^Wla}0ICl4Ze5D%=TwJdH4WE*K{Q;h}}CkHSXr#vQ(6lg|>|^Db_vgDZh)Z0pUqfcr`>rzEYu7=1~yWRJw|{kHXbExgP?_2 ziN_yi*DetkzgGwmc@|dH6d+TAsmXsXkBhB|jpZ;qG$mMnSwdVxdctT|(dhc3zRof_8MykR!RE4sRMHbZ8nU zw)h@~c&Rxf{8<6_E`icB>^MRS>An?9=OPDfiqKAugHseee-@tAcG-?O@=Q`UdE-D} zTHQf}q^yS#aWvpHybLIIndH=5vR4#gXCh@Vtbnr;n2jfsPVXc*FxXEEbNrc8Q5g_c z?D;c&iD3<4=A4{Bvb|wv60=hi8dHFT=Bsy#^=)e*8gE6 zf{UkSI~z2;7e18e+w+LL^v#}R}q)ugI*{vbydMhLmh#Q}xc z=@{f@uS7*T5L#DN@$#o4tGcBr+w zE+Mvm%QEz$N4x6=IC*eG-PrcV;q48GKi48YoSVlfha^86Rd#95;?KZmijthEE&18C zVu(VwaLGJyS=e*YZEK!@2(x#P&c@-b!Sa}eOgj|c2->| zL-4sa==iWB$qqr^OMW)m3_x~Z8LBK0Esx>oX#UKljSwynW<$`3br^rPoM%@e#|TES zGvpb_?W+pZXABU>GDr&Uc1};y}Pw& zUQ5iZs>EPTdKRbDnes!h%u;H}uMS$~tt(+AkpE%+Jc-{rmMgLv_D6Z-CmCCqw=`&3 z*`z?1rsOWmuUuVPxxBExtEz2nW#ifI^?mzx9^0|&cz5^t?lohFyT3cK@2_v1`HRcv z-WWdq#`v*U#||LM@tvW4uUy>m@`Y`$_U$%N=rh}H_U=KZj>ewu#`BwYw-mOaiv^@DOikY196Gge ze@9sp!revupTu4O6JCZzJD6-~&mKP8bD3OVykKVvClXRzu5wsaL(h)x6!=tYuTKRq?F)d~Gi)20vJ7+Ff#JPcj&rs#)V%#_iN2|#bW{ha^9G&eP4WHq|zb1AT zNuI)x{be+N_V8J<7}Vm!(Nx(1f}O*ca*8~M7R0NhId1GIbU4g$ z=B3oZ`Qaju2hRBErArw`p51_1^Aoccr-l|KSEnYPU%TQ=SNp~8Rm1zXjO^daYuUeT z-Prz(g9kRYl(f}mG&U71Qwp?4%??4=L8m=!1`(@(ot335nC$(=jp5H3&0(1AL^G@v ztqg~ki-YxQCG#1hBC{o$Ia@w+sF8v}69KwZE!3>UW{;gA%qna@CLbzS_!x1wQd$De*u@$#qqdaNAzCqyJ#u6?-nuRgEs*qt^jCVktj+BZL`|Fh56 z{%?1e9skRx{&@PAzW9ZtK;E{OP2ZT0W_6c71bu*frDB0C2q2zdpZ+2Uf?!<=mGA+d zOM>}W2Xl~3us-E+Nx`NUwJwD|=js&W!o71x9(>tWL?kun$O!f! zH}WxAH>d%zeNlk+gweFC3S$Z`Wh;ytr)=Bvk+=DiVL+m-ioDrjgOe45KSFw?@*>&b z#xt$eA!vrur0UMs0TfNg$_X=u8A-4thV|Q}%hXkvJp~7Kxm18(42Eo9%M*R6F19U^ zyTH~Z11g?N7Ae2)OT6!*RxN;<&8KE7FzAKaGlo)yVbMjsmKMvU-cJHFkp`spms4iv zk}d?$1w&yN6fMBmZ)DBvJX;6a75?QC-pixGW9S$bJ@R(G%R?4_=1UggVwwo1R*JIX zX#y0BKZBsTq$o^8I*g{dWfs6mhz>6+jGEEp5p$N!$W{h#L$(=8#c#6Sb}qR!?E~)v zHn%Si27WeyqFxw&_x$E)yQo$0vt4wgix2iqJ`CbYr2pyD$h6W+JFiH_!BDFoP+>TE z=$cFG*J{;8-BoMx^80wYzma$@T@Ky(wmxTHI+*epyx+Ps8} zL($?f2%shskA~$^Q{zz>mvZ`EcqqDLB1IB|!9*CcHGA~J2=J>C<aK=t9a}-zv^p--d{5D*_QtQ9v?Y(Vzl=t2zvC~vGd3F zfSreq?e96h3ss7NWBach-@U1QBPq~i5hJn@OkNpEY?DnLX3i1B3g!j3iU5oKM%Q7m z?2?&9Wr57*jCic0$g`^zPaW=fAE~yEBG^t{8C#KIXC!MH{;XByq^-#db>^n8w1eOl zRgkV6TH3jMETck#^0-lNBFP4rwJKLd8YK6K^^ zXnOd}YnRVl8#~?6x~slq+sgV~@Mk1Ame*~oDc!&hq@}E~>BtX{D1opZU)&9LW(3yc zry36rWi{u%xFkJ&W5%sdGcW&~l=Y&qck;(?*AAO-R^{MF{85jd=5NZM^|I;p@b*;0 z9isqzt{%L@7tl3Bw>c7mzo-IzW8{wfqVU$I`JKn+KmJHkN^{nKxcgjZ&x^nJ$l~c= zU-PlY;euRBW&_O3ntHlR_m+7m+4imz;(K2k~{mMA)(+>x88h z$qVaJf^cSVE_r%j;mTN3fd&GDuMHQck_(;4**%7Z6O+Kj8PNdklz31u7};=N zN~-v?FmgEg*#T#yIe^Si<>Wh{Ci2o8PJJ5Q2=)Zw0tsDaGFl4cCmVvc zylbZd4JhUmLNuSLOJf#F1sV!XF0|62VVDded`d9mOexmn_^QI9Yj8A8YNeMFq!mxr zHzR|%(U)LY$TJ0`$*QPp#G=GLUHwF?( z+PA#@Kq}v=2tj-P?C*sUD0b=I2Od-Ii_>(}BYV!Ch#`wD``UxtutyRcku+)FiecRy za5nxd;OzM`#;<{(SwnQu!F#6b5^YD1ImNyY8b|Vw?}N$rMNUP~Qvw8*@2{tX zMJ~hhX3ludeeE)hABWJ4=h9wyrZ(=$l?mU7d+r5(OSFapmQ?I;F3Hb;Xl%Po3&L{I zItCO2kc}ie0<1J+Win3&%a(_%vI1$2T+2y*IDZZ&E$dW4__M+1bW)&`GG{%Hc)L4- z(2h#v=Pq^H(|ikts;m?)=%_8$wW##2BT(Ysc;O5R{V_WJ* zx3mmwLTaN8{tWW<2pWS!2}icpkM3ycS--4r%d#tbR}FTf{7k7uonw4^>+rUwoi#w( zjE0=-mh8-C2cOAs1~P}mH$tY>jLl(xmhJ5PRy$p2>Xz*M2FIf7a^iNaDn*idO?6Vw zu9m^A&FF7j+*pP9M(^4tluxWnrpYhYr&<29 zW+gDokY`G5{Q15T?iDJ4JVS}2)0+jNl}hT#E!kz!QzMFu`~hwq`6_T z8*UJCP#d%It5ZXzi<9aOe81t(@0MNuX#;;fcloDPSIFtQQ*-@&FhbR(534SHj7}Hd zR@V-HP&M{p$+b@k-}tQL&+k^>__T8SUzP!#;+BvR-Nauf1u{v8W?QP#a;rj>ku^-s zbB?St+W*jGW^Tb#(}#iFXum_grY`{i=lnsEpNmrRij#6$b1Ti)IE2iK16U3u%snuBXs7bFy9 zEeus5rfn43?t+}>aB(cU8s+D-!m>b7Q7TFu`OR4w+nP$w>}cQ9-rX2zC|sJBo0!uQ zNbcWOJ+ytx*{&wEpwF#uyts2yXMG!|e3qr=*9MdKugt%=eecPQo7dGeavWhX4-an|Y1rb=py2c}Y@jqS+3>Ra`oQ=zrv%b!hfb0L zZC@@JH#RnDo^rA zL&N1H8!Prw%+9dLhz_$S$wqyh_=fj@ptBalQNsK=Vz_`wkXfkt{(1_020;UmRR~rq z20Zy5ZNASA%nkGBz)Nvy^Adt{<1rX2V{t*(oPId*8< z=%F3`dp8d5TtBpD%~6QxLS^Gt3zS{!9Qi6godxR~~BYNYAg#YHhswR>hT1YseZx5M$!Ub>sX==?^O> zK3emqKQC%-nE91Qf-#9XyIxuO@?XV0|KvCS)g#aSyWc4(U9tKqdCNZms0xq3S|Pd! zP>=A<`&Z|36g?-$p&M^77s6 zv7ZzUytn+X?(Tf!zd!xt{5dHNYhM4+_VNFz>%@QL>r0L`1X1!AxCkkPXLt9m0d2It z+l-HahkM6n{r+a@qDTx{3A4pGkqtb$eGQ9EtM-8!r-sF_S)7200`M>OHBUDm6_#O<_PCy%c8(B;C5CTapyo@bGskGbhy*OP6`3;sj;CZhW zSau^A$BtrCS`RB{c^V3j)JY8aR))tkyK>xuZChe_Khvo zR%?@~LB2TIe84Yu*^oU5{OE63?Iobyp3|hFE(~ZS*&S9WUQIj!(SuhfzqU4#=+ncL%WSl;gM0}(d=sSYoJNp84V}F6nWHypDx~3 zlWGm3Cf&FOp~mTV#s^@i3jvJ4C2t+m`Ax%6M`~hp8NFbF8A0P?t0{Uh*t#T!LV(6$ zC|%NBQ!@p>Hxx{*R>tHP0=4PiyIYst=z`lCp-#Cun zZ5a6=F!ou+&`&O1*nRWd`mu8-F7_N6Id^KP_jupAgF|PJ_MJS4`18n#gM+8{4<0{2 z89%=J+}_^~R+D)0z0p!vk=PtPLbT2J#8U&tHJ1#es#&42@stj*Ff!2`XbAf)$XJ^b z+}u{Z^=j|ImwPScd-VLt>mxk?XZZ7#k<+&>_g)@6cWv3>rjP=|cy?_()d~@{t zcV9Vu_UN&i!p#k3TR4AkSTLG;W{ez;L+N64qFC!6yJQ%$PcR6!Oe z2Ip6E>RbS!@P{FMs2uvZYW$P3Tc5RFc(>}+UxfabPv$L2jCt&lm!A5{+-IJA@!7A< z{FC1nf1dfo7iT^Je+EQbnfX<-!~FTNFCoF(ZOSbQMVn6>*k6 z&4GqEEiE}IzA82jQjOEnsuN?;>mcpfQkRpGfj`Em-N}YXe1M?AeIRRPK`V_pnk3tF zjzasiXYYYLE895?pAD6pB8MSsC)rUEw}doi&K87Y8}Kw5O!Dp0(#1g$oRH++C%l+{ct7+f(HkPssTY6yDK zdV7lPJ+#0X0JZ0AN!u5{`do{*2K8Qb) zy>H^=5ORMbwiv(2rHgr{93GeU{I^JH1{br{*kZPxJj)0>-A04JEeA! ze*8&B_N?cPKhJm}eGV{xMrhiz&4E8z9`m)u)8=xn-?H>nOFt&B81kGJY)dovY$YuS zOunB#1EncmNdwzsXEj9-bgs)rey~7?Vj#v$t@8vC-+({!y&gZa=_G8=oMyKl(cj3O zJG(WM&Y6RxNsB+5UPmCnjN;E^VjJ$x%3YOPR2iF)@a(ih?UmQJwQ#l|na}-(nvFk` z`E1yEb0fy+*5=V|O+a80q=$F3jPF^_C7K%p8!Gy`Dkrwpk8N2tw6$?lMUkaCXOr8U z1%F1Lxgm-_oA?F@n!^Fpo$_-=j_9;ggwD3)=geF~)1l1z?AQbADt5J1bX28W+_QXq zM+=C%&v^KZ+ndwrGj57faP-8HZ1`*1}20N4L{6PL}S<<=00uA0qj^Q&|42K_qkP$qXQ?htgaofS>KjY8Fe^xpEUJdDa*X}f4z0-8%eNy$f zY?%0%n$k3G@VR>YBU9!a`>1^U!@65PB_q20^}A)K|L?-;%}6%YEu6zY8u&G*{|pY49jjDiO3-b>)m$+;!Txho25yK39E z)-FH0q4VtauA`luy<6MIj&_e9Kh$@8f6v|>=XPv9ySZ!lz=m7Bd%iny{QK8>q0r<) zzuLe5wTlix_iVe_v+d>cTQ8s8#JPkwFYF&XwCVD`_M1oBCk}Uv9O#}n+$EBm| zt{z+e+VSpzZJll8m@m$b?0iXi$dZl2#W*m<9!f=eX=$*sB&Do6HD_g3+R^rsvpd&! zS9Ipb7H7oduPcqev~TUX_1$N>>d&mHIJc%@Xm{7HmbH~hxp4Ir`GKSB>n?8Jeri+K zq4g`aw{$JfZ7fgDs7&E206SqYynAk5HzSkgxe^uz0U8@O<~s`qgki#lh10@<80;ah z96}ic5N5g1nI+0zu0eJqtFke>juQ!)ix^j2#x)tvrnzB*K$y8f?j81y&D(1)Fxk$o zXec*zxy{QO2p}Ijqr4)$#_B+J>a3SSFQMVQC^Xm9o9_YVNLI6);?met%7d}97vhk} z288)xY8!&j^OpMb=6ik3;j86CeAFLjNzPNCFgJ^ zvx|pU+odDVs-yX{N7m}DjyOqy#shyw6goGvsc1=ZL;lLPn?Ejpd)7k%d)|1bF<+r}@M}P20(&9O-o5q3jg?)DXQ0d5>@{7i1>8`^E&G3|| z-)>E0Mk}=SxC6ylylx-Aikg%l4MH>|7-6TzKqBA;n{{e8sOhCbfZalbwQ4s6ZL|iE zk=CX#H4)D&K%pWV6F!Lm@{el9ZX;0w9jzELyF!wWy7_kdBPMH1rS8aYCLa7ORojB!-?D)Q2BwPG-sD?Hus9Uz|Y9epvF zj$NYW-i3VG2RsxmZ3J44PP6~vomZD=KJ1?kaG1^46VaYai-SS*L`bD31_aF@j3Ay& zlg7kQ$?N?`Jkd{0y)>Fl;eOn>W&Pm*9=6f%0L$i*7&-Cl_Sp*gwQ1D&@hCp}QXV=| z7>E5-7(0fCRt?1i;?j>0o~0iR8JkE&LutW`qrMmvocun~8W=~9%ny!1Q7e(W9u^?{ z?gr-)rxw6m(c?^7qzm@zq?Z=M;QZ3y@K&0%Fa{~S2>G{LW;Au7rdV)f9IXncW@kW6 ztu^>w41!19eP6}MFQ;rDET>k;$ht@NlbzSRER`7Dg*@0YSO&Ig85)gss*9Yu9re;J z;NenBWhiVG!0%^l0w@~OoRLSb?hK2En!eOhn2C03WZjPZipN&*mkekD?)wzpEB@8s zAlkw)QtRKU8ROrScdIYG6}ozNZ_jJrJ<~GYb718BX_B7@Pahq*aAM@b;fd47E}l3r zdg`E^LU?+gsc@XyGj?KoQ%z^gqSe8Km4MSUXmes4b$ZfrpstGJy&Zs7G&-<7Muray z1@PKDkG6r zB~*9jrFZ3IY|aaH_w3vLouNa$#}4$JJj(fl;AM0+E{&YNIdba8#OWKuT%Nu$a^}X^ zxf`fJkDt0ac>X(A&%E~Xg|20X%JREV-XIHlMeXKgja$kJ){+0Leb606-@dJZq;ZZ! z3@#&#JeKt7Nrk8Xq4+y@v-wkzk$3p4S2@U!=biF#`-2f4CI1c38|C4%bg}%Sf0)55 z5nb%9nC!932!Ade;aBT>d~aLAA6O0Eaf0FKS-r={$>K}zmtFn5;`&{*tzs6>e(}*q z=KRU;FL>tZdDFh}($oJ6&OH0E-=6uz7g632eD*c`nM7#H{rp)f(BjWCp7=6F${SLI zwzTI&lWVR_POJ^4!a0j#Vk(o8EH64au`)5GWT_!&0`LH+LDOVDV*o(#)FcMN!X0EC zrx?nH`XUoeX0k~=Cnb{AY&2VZ+vzsrG$QRXmPL%IJwO&@HaabU>C+^sBIx0|7}Ivi(oCTOpe~PHETjw-H~49i4#;khY@7f&!~+dBwi&w^ z&J2GBN)t~Z`B^wRfBuUY#=0Yd8xg{cC)SQNGz@MD(&l&PFy0Gx5*$qA$+I`W(MCrj zDZU_0z$P?R6q=M;3~G6xp!u;eTM9F-Zmt|$lRXS`MuKB))o54Q*t)vmHE2Os-q@Je zoxddJnQ2f^1P2^;HZADTEX#t16@!kEzy&O$&cP{!#t$XIG3#5IGwf7B3Y1dC^Jj5p zx?_+;3W)X@(V^#`4o-g(#baumh4W@v3N#ct(S%3DoDJI=x3}HXy}L`>E_s@Qd|7~k zie-Z<60mHH*NJb4Ia}JZB(+_tIX012TyDA3@rV_CX1k!u;UhA6yND-!9r&z$c2XYL z29V>H@Jc|Q)lvMJKZloSIZ5~=>f4tlXw-ns<4rKcR5&;=(XnX122#G+H;?>Z3f+yS&{LWwT}B@}I4g{@Cj~s5JWrZ*GN#t^)i}RmB~JI-gK>QUF{z%MTpf*z z|M|9QHAlYt&}d@L`Zh$ZoG+E-b5`J@P%)1%j?pgEMN3w!mOCq zi~#tzB`wsFmI~c%#R#Q1v};hBbYh2>O<@C=+?*M3;?FtCYF?3(Zx}gO3DQ3E*-itD z6zfPL^yD;Y@66#eLqp%LpsGQFaaB@W+VkIrKid!KZ0^ERpwV(qo%RgBTAM?e>LLVP z$Ko?{C~X|umz#>*bbD^micnUo97%x)Kbt79FIeE~?Gg;7E;LJ@V zKdXSC2RNf}Tf_J^lY{QLP?M3L3L>(RL=W+2ozGasbW^p>P2~ z*K!15mg#aRz=(8Oc5`Mv`OGBuHfLv72Q!)r0*5-vx|@quS7(s_e0gW{;O6R)EzA45 zmmz9e!wASSr!!Ozvdog;Fa#}443eMIIfW33=0b`3J}{2NgR8j^eXSBQSXqls57#yByREhgZLPZ2j22&6}E9GU5tLVza8!D{_N{g(0-5i%L^1S)Ci4RMN`If~7@CMWu$H6g~_dCa%sMMWfc40=0t1~JM8at#+(sFHfg(WIyl`91rb>&Bh0Lz zrg+qB<5)3|cVf^toc8PlI)t6A7NCY^8=$VJ$*jpw%ub#?FEoE%+Dr4$$4IvW^;{w} zTF~?FBz|B$EAmsrf)4R?OoS-YF)>`zD*MccZ?p|)Vpu<#a$b& zo!WMG$97P2W9c$dpjVcxX)I_ZRoEnybNB`!ET$nM4U{$zZ6X_%T5KuDPFTb0NHH`W z(apdKb2iOq6geWg&EWudKA-{QP`KC#F2)h&dTMd$2LfkUbXf-49nB?lcXYZSqrNPC zSxH740~Tg9=LhPU7o#vHJ~y$d_VN!aU%v~jsvSiP`2)}~jLW2wjkG5CJ@*avOj z`LzD}+bsj%={))RhAaOSB3<{!-NuOzQMw@W$HW=LpCg(W;tAkiKDA-%vl|AShg#CX zeA36@62mhGKGPASFnSr$A`jE?2Myu}q>Fe0wM9lajD}Lp;IuM6-~ta}8iWD4RCoIn z>55wUlxkT_WN{C_yJ6_Rly`Mj78bRZC(nKA%a1PxB4NRRel$M?hL{G6@nnWb?vXXn%DgmDD@-fICPwSmP+GrYX!6Ck(nKMQ z61JUs1FVc~qzE>OYN{q%42@HXZ`kce&@qO|9rypppn4>wR!ovhhT@|=MZ=0}(rTm> zX6^zQ6F(lrA_PJSkb$2;v;Yh(&-yy-DG>>5%`3wua`#1TJLY<^_(*ZQ)KPctf@L!Z zF-*s$x@c$Y9wV;`X+!6yPtvo4$>7`3N82)i!(@N2p z)HLN?_yLm6N+f1C_-2Ha>wfLhefuCoe(g42oe;@aBwXfR_y-b_89`e|Fx%)m;>4!L z$wL7e7rJi;2rKQgoN9n}_W8euLbF%I_@dF6l)nxr8Q|E#fAk&<{K$Z4+3c{kmwn(% z6Yfiwx=rmNw%%2?$N**pPSPq)s9mCt?nM{BV>GE46?EPC355izi|KywTO#t~!z`9D z>;5XiKMS=opbg85#NI||EqBDFtt!GW2@_mpg}NQBUsLPHR!`qg%I`4-WM}l!`gw8c zE_{uLG394iB57hAisr)L7O?Zq{{yYWsL8i-DJO%-_DwRv^wr&|Cc;m_X4#sK+C1+2 z2zi*4!hjSaDa@iee0T0kA33!ZbmWrSzTI;_1@x6cjh`=B7(uhsghz$%n^>ea8ILCQ zH6At57n|4G$lXm|m7KH;vI7WRG_)Kd%} zh96tl8G39a*`-4}_}rBpT#Jkb0l86J+GFR*2DF(hXq9`y7g{Ryz2Kyk#rf;9f?HSC zZF!^r@THyuy@&RUT|9Yx^z4n%3s*-@UKu)lb;!h@Igt?fd~5VPLLAtyOq}63!au!s zer(`yb{EII<`Y&gH)lMgL6dDlyFOcIqHtK16ey49P{M@jB-4ckBSS(U&nR+$o$FK6 zIIr5CXwn?M)sV6)*3s!mlLd_dTZSqZ&VR{hq|3Obmy>`F!)NmYGvi}Oc!oR+ zJJUrhI;_GGYYHBUq;`eV1`Ui;py-0q9({*7Gx^L;cEe+5jC)NE(i&@Z`LqyDfU}hZ zOP02djz449B_-O4gmE#)TC%ThsTl4o9$H)0-(EW0RX*5RKHgo{-&J#cL++`TwB#3F z2u%Mb*jc=e8a@nv2HAlS?NCC<^XzXM!E+eX5VXUIT#7t%i5|@=OtnHn=+d z8Q?RuoYW*je0l6V2(9>YMO;{do9)s*P|L;;L*^bq&>(AqBe0qSBBR8gogD_w z5$3E*W5RKZ4Irn+DUBK1kaDVtu~2yWq>i(_;?KUeJ?HP%lM_sEBO>@r{u- zgReQ38gq72vra9tY>5$a9!=g$&l_-t@XvS>3T^P;k!O#B1$%w1ZT}T@bhh)uY4emp zG{rq9U~4mWw) z9D&bH*g2dg9X*lnXhzn|X+hrh7p8?~Oym75dg+<1S>G&~H$8Jv3jEm)^-Bw(!eRUw z7VY>mD$q{n8Pu%wX5-I>h%*p;4)bS0<`sD+5WONd8as65P?-Mw z%sF5Cld{yg*Y-4B+FaAOx&G3|wu!B+;~U%H&m8$T{GB!YJL+=RH5T;lYMMY?dP_s!#^%!z$3Ki!7P_0knN08l#n?Y5ZQ#bP+@gyOkrwy-PqsP zz4}SzIOkS>P=ng@*zJZ(KdX1*&%(}AYVuF2CqAeh|EO+^bFM$MTkqEtuB8QNrnIH5s|pK@;nSsDp*8QcD_u$w9;H+(@a@f{@He zanONicgr-{`q2soo;ySZR62RYa!3Q zn>Y0ATF<#@J)1W6>|8T(WbdU@hlY;s?cKlQ!mdpNyEhIU+;nbNXaDw{Gc zzkKnH{)4ae?0NO#-YXaPymDbT($KKz>*sgg=sS4z+#XaoE+1+iKd@@-(3;`>>&Fjn zxN@X>QVbq~J4s|TcO)Sn{oKum+34moKsmgr52cH4I@OGo_!P2roSy5_LQEEw1 zLa3uSv!k)OFtx5WcFD=k(9qV67rR?8Zd`eOV_V;v=80X)_pR?PP0Y<%61%=8cy8~m z-p!j%udhGV-EewS%c(8P4|J|yRoGdT$hR=5r8)T(oFN#hD9YfB!fM_Gq%Djyhst>+ z>>G+effBRDio?*DL}fu^B}Kc8$L&xC^XG7LenbjUI z%Q>Z0m*Ub@naFWefuQSis&nFkNwZ%{o4X)ut`TFO2#v=WG6(#*wC8Brj3@fi?8*Gu zUy3txDSZs@HzSh#Y@HwL141D(d*#qa${6vZ&WoO*0BfW?O zJ_i>hst7pC1|vro$C;-fXhY3W{5cGw#h>#Lfr-t`i_c73lG&MGaIw4n?B;dw=c`Be zTspRG@Zh$--5V#4Z0_B&t+i}bOKJ0}inYs2JK8FjRpmA#)Lam#tjt(}3P(8SS*HrR z9A@~l)GZ7wN651bgVGUc7*f6Ua0`NRi_g3Ry{ULV-8 z`Dn)PPd>Zh!LLv83J_Spw%@uA!(tOpFot6MheR$@MqAJ8j+$}Gq?#9oLo4)>>9j3`QS6_XNQ$@?W@~UeMn`PoF(^cev0!Tuwo#x4 zkEZ4lC#~uwAjw7F1O<&FPm23x6Ld#*?}K4|X3()wWq5l;g@Y~Sc`=kWlS_L#NJG2s zen0IAIzN3$a@O8bv-t%s=NX$NL7p*Wwc@Sx6$)zWc^mbjy4!p8-ics zGli|e)f!W)^;2UouaDP6@=()Ci5|*#Cz7Hu6-F(muW9wWO-BugA-{$q7(=#}flV*n z7e6)p_}EX7i_vs6)r`K&9|u(qa|-P*GOqsY@SeZ=UhlGN7Y}m~;qZl1V|{iU;YiQ1 z(ep=#&KwedMhm+CZU`-hJoD9BvBWZ|k%U?s{DX>lu3l1&j>P*-WaV#|0iR0CRN z>k^Wz7?3PQ92h4>9@+9|1stb!L>l<)E-km&cT`w(&EN_kSlu<9YSy5lFzR4jTS>wC zysUM3sq6a=@47X*|H7dIs9}Ser2-9zM(x=hK6nNjX^zXor{K@mNr4_d{raWzx2~Ss zz2$Ii$xg(dm(}iWtliMou(2q6O(?OQQyMeUSLCLwEeNa)rLE>NJGDIzJKfG(%ndXq z&s<#4IMVdzpBIe0Z-QE5_SKt}$d9Bq{JZgM8vIJ3D43`JOA0aktVIV{FV1Ulg$3}Z zWaVQYRbRYadh2d+-I=sM`2D$${@%AAdt~0XA6@doQwyH_+T3scn-{+R<(cSjJoaVI zB7E_WerLv4zA)#BFU|Yf?@j;OBeNd+-8oPzj!c3%!bx%p5ra-Fc6)wtQb`%;=%)ADi z9at8Z4);nxUBU3L5HvP1HhZMIPk{yw0~?{rkYrf2B3U6s(P3nR$>N!cK^X%r4jn`& z_zaiE0GSG(suuv<7Jv>3hc?DX_$v9&%D#4-S+p5SNttRp)Ewrt4v>OLxfFj^ut2o# z2z}$irAwPbF{A6MFKs9{E$GflD0E*(;lP^0-pjUG{AIA$2mc@~QX;)ymJg^tK^FraS*K?k0H3R+mQWG?y4Fk9*x z#9IX69ar}o=r5X^frXvJk1u|S$!LfnJDA)UOrnTC zQyXgbav2d2ZA3bjb2bw|-ymo!h(A023>L#l-5gA54hC>~{*1xG+|!SRKl4mWm&}(A zHs~Ix8wSy6YdpO8ZT}TU1VQ_u?vGc~{r<4WjW7ilKQuU+KLeSa=n6H@SH*pu;q+Vd zwM7I(KZq@h1K$spe@&0a$oJwS2-;GkUGW+n1p6@G(HVRNGv^ud{L^Ml3(WX-UHnt~ z3!mUisFLKI7Q{Ewg3ZA+_;X_#@Hvgc2SLH&&rszEe>O2^4hK|5w1hR(1b-%MWnNx% z@cjwTlRd_(=?;AM{24K4gl9`)mIR(7g+81DtshV7l;@txed$GJhd(!_r&H>J!K(DE z)p<5fO;%=WZhlvB0qMr35XeEITa{_^*$0)C%*{qp)ilY*ib`|Ia=Yo~i^mj+vI9%^1Z)N*Za zMQdJ8B)h04Ba3_v5N6}gL3fH@dQS8RLL!zeGC3dAYzdqlosLF6=M*9|XXS=7()U&t z9&IexS(SI7seEdKBhS$q5N+oSDz`>7 z{`p=CZ3eE0OM{dRWh?&Kg*q$R8U7p}_H0c;QXPMG+&G4v9X)nbxyWa1UJ(Nv)w_`3 zc=$}Z1Df}9+DaxO9vJ4FL-GfhR)tguI zt8qmrm#wY}W`#2{E7Ef85(0%5pc}Nr!Yq%20&7Dh;ec^b5+(ytm=G4fr!Z)Uly)|>{)ys#-{Cw-o9wMI?kMCVNzKl@^A-3VCFi84pajcY0iG9Eq}F7oU3u(vX!EN9J&$6Et4$4*`7-G8~Kb-cUz!rs=Y1I<^5T8BD&Bbjxj zNh#s1Yzu@Am6n7GOF~)T=x};9+?xl(qM*|%iFqa-+wMplF-C?4gQL+?(~JfxlOn?f zKU?-@N1-EGmGEb?iCM}|yfUaw_u^Gn1Zq zG4$L98lASd=;pF?;+c&wd!Z=QP)yi!MpIF!sW8}B zoZd{#Go>uh2!*Ce!CP^tIw!R#e@AZ3<^Qezox7#u?-c?q$zjNQ_x1Pd_|uQskI9p4 zp*uG}h%DJ_xFt8{ke$g7>ZUn9@9&Fee^|HlS3Exu0ZxljFLYQU$X-MO1N928$qyP>3TB`NWCRsidgp3V-(S2RbunD|L&!jq zJM~`f{3p3Leo=h;ZrwX~>+bxr=JkKz?`jKNDq74Ss|EA#l`MS(w`Vx6v=~+{Hi9>l z@=O;6*<%xJ3&yhH5|FXMK-cb_AmECzx;ii*C{lAVis6bh7Ch008-{h*nYVJ;vu}(- z=9XcJ%qW_mMLft%dTN^Djnr6D&}bk?(}Poarq`Uis9MGXCuOf*2BJh(tuAV5)Jqq| zWa5?=-q#d7X+<*}fCz=Q+GU@xTpxZ2f@JnbtEI^@q5-;Y^ZoW3D{v$VVkRY5%|LCk zG;FW#0!jsNqPP4TlTl=f-uB9&EifIf&|qU`&J_Y4DBLUwzE@3ZEV+t!TyIz5u8XU1 z?AMNcWQ(+8>?g*C{hh`PT;wxKiph=)GXz1~$elH%OB@YnW-J8*##-%0F_5OfGRDk; zECZU-V60oi)O4wUqcPS*x@z`K&$b?Q)hM}kWVQ=|PdC}mkfot!tYj>`5*a;aJjM+1 z9|vf&l~~L$2I9st)+p|XmcexBspD@Dk+%%NgP%(mWf0pP`svrB;h0g7DJ+IscM#a_ z^Ah_Zvh<$S)Ebbb*R^}+ek;%*Yr7bN%ybO#&iz1?m{HI$N>{DtnWp!nUQMbsurmm{ zcI~0JVU#>*0W|$;HLu@Nn(~H$3U2wBFi=fRAW6~;a;{c7I#PF%7*hh8t2%~+tIWsul;l0k@v3c z@A>n&q1o}XuZ*3anLfWbadGbIxjFdrrPI^rPt9C7J#p?B{CV!esaGdX>}&7cw5}~J zwIeNYCy6*xlbfR1Bw``Zz6shD>4gT1{R;Vlj@1-x_UKr>Y6>+&k6pmC(PmeSC#R>v zpRHsBIyt{DlZa@?rDHbBSvcZ7`vrJGy)+ZHHgFtaWqD6^!r_XiJcc>KTF_T5J|{PFKR{jD#o`Q~q~ee|m@KKf-&Azb_DSJr;(cb@*n zL+igmMvgB%^RIu?`12n`vp^%jqQ##<(2hdKWr23#&}7)4K${7820mM;b4m&vxH>hp zDk)gDJ&9Z#ye5ODjUlH52+}LtYSG9RIK9JSp)0qgps!6K3VJ&X84aizSPDjl&62o) zAW{-;hzSFV=^~)iNVNmb)Sf>h6Vhy1pgEc_$z-4|0}WXxr+NO22gkId)EYERN)S5_ zamRMjbTAjSa)wBV<_~c;ig*+E-c!6}# zBF_+MvO_B!2gDKsXf_4lY%$LSKf9FItX6sgZpEL)obRv6`2a7q91##{hoDIr0Z;|K zmTj@5#L!yHxv^ub##$gZX-^W9Y7-JFgUNXtUm7aOeswT1+f}fzH%#V@g`TqM?&8IL z;mN&~ulD7gtV!Iw`dLyCgN3u!JPkIC=g$rx>x4mLiBMDcqyVFb&mcfoQ-5UI4N!h71Uf9GfUpOXDtdkkyOu{#Gk3TOcj_g0@o`r50e`krI0^E9?(yJrPo_TeSbOlXlSSVwSVvH3KC~JBTo(vXi$8M~q4+bv8A>eR zOiktupfniSVQ0lQTb#2ZnXyDrUJjw=XpRnd5aGS>Spn4+S?&3=oje#a{#>|mL+TUX z<#S{oC70-iJ?C@8r;p%miT8vLAQkW;CQ{)#POFE-GzF4<$eT7{fRJ z(PMkU!FP_dz0%+C%1Gm>+Q^==qE|**;mpux$DbQLe>Mbt&`>bhHVAv3++RJ_OK@`Q z^}#y$^VL07WY37?6x7A|Ghxr5W~ef>84{vm@Y(Tank3wy%fgcbYqKGZ{nLNy-Yv$ZT6I4hF;RBxG z%r1JFSmN9W#5)c|JG})qJO2Ej!vtNlvl+yl6=(s^7V~T=HHZgRNHfiqz22i|VBxmF{2Qn6U8r%_Un_k(s{|;GdOU z&pLy7l`#KMUTGi~9L-ikq)C)PIJAZ1a)B;RyE21J9nf-vpA^eh5rfYU7Q~+emf(WJ z2eBdZ2K>3LsHQ0|yf<8ZY2Tj7;hqbF`!65tnHcK5Hq<>aa_GtsEc(FBvxjeAJTZ6f zpWi?3p{-M}+5v;qDW?9TSIpUcY?goyim5UpV#7?5S5rM{Zpn;uOL+#txAS z`t9ixH?AI@J-vVK$nKjbJ8z%gzi_&1>D2z)XZz=mb&vP7E(|wJAMFlj)Mji-uT0~j zs<<5ZvkJW3;Ire;gg{$ZczSVpDw#1#N|Vc~Qpoob?r&~8)DphBw`HcMeRO~Qg#*nq z2lrg%_|CybD0*FPOVLYDUg%629U8vav-4W_-m!yimkzXE?y9*uSa<2r!LG`k6)7PS z+LUF439)vwlvHFCm!h#$C&1@u+Kpw-tfU!6gUe%N*phPaj8Qv8T<)`Q7>kAyXTgn$ zsWt-#t_>r*vF@lrg-<)6?R+Xg+TgP=P9 zp~;)EZfju8Mh@~@hQ_fVXVK|+{R5eEaNVW{=ws2&ig}K&JyP}pYw&VRSU&qNrr9R) zOp=Wi*jcnWK7ct2lQ$TAri3;ogP=Vt_G}rY(6rYWeD=jr=;)|*oIaBTQnq@1!mr@Z zFD9hAlD#dMpO{{d$O)eLxe2A@QNOgSW^Cxd#F6eBXNRw!8<{;jIDc}8L>x;OhE8=4 zw3l>rMs~KA?d+)7(@@+-@`_0Q&TwHf@EHUxEKE9OiqNq%P~~WWJgc}+XATymz>|Hf zGDz97G{^F0n1MShP#W=PY7H#OY=kXCn1RWqnU+<<%QOXBA|q#=&hfcmojP(0rZZhfxP7*P-G@cyy@+a zrZeWQlx>zWXH1c4zqrS`q2GnID z0|u$>b=wtKBAAiXm)r>K1q|teXBu*J;e0gd@`d3P>SOn}C>Vo&gFV z4g)l*v6PHJuh%oRJ;1TtCR~UvLHCip;##y7ba8jsEB3)db@mV&t`T|+SZ0)6vWsU% zFpbOO;Q=*w1SLhD4IsPW%Kwbg;I@l1$BB7%ZpF0C*cGh=nT26bkummGVgajMnl9FF zFPo+Ip=f7SnMebVRq zB|qL?!{tG>x~Ns;hgz3o3!ArpA}Qt5f17ptAJcCCti0?d0YA5|A6*=M844Zc&sWb) zUpftmoxgm};-Al-m^^o4>B^C@bH_M;aL3l2!Q|b+q|QK6i;pOVJgaz(N6HdF#86+a zlq_!S4P+z2>{4wk$3H`xJ#a<@hmIDg&h=fCk=B!7P94<1_m@WX4?n|0%Cj)%_~OE$1)pR583esdp$TucQ0IiCvc%-d6tZntEHuoSaOmokAkA=cvH@yx zL?;p7OGb{=qOF^Wi^e9BmWGYlC#K?ux-ubwEF9o#XfTwR25^f}?DJ~ih6d<#P!>%df%qS_)X5|C%2%262 zYHEVFX_ju?QtbFM2pXOYMh2A=IBk*4E^7yx{PmnUXvv=ipW)9W;!rp=3=<%{jGBSo z35ixLOE$sbR^ZQEyA`-GyOFdb8paHHPTC==OysTcXP0L~N_ZxalXzONElDKQTMe3a zxSO>_m?d=wA<&guHcoa`kO+EqPx0K|(uJOinV!lUJ(c6TtFLz#U+>P%-n2IP336@_ zBWmXZLW2?D!-PYdz!_(D%$YSEG>#HQqmC~BGXew^f~~PoXor-e4#mgBv8@&~bEl^{ zP-&DBfwA~kAT;Eb%YoKf=8Elxqm3SWfSkCEJqN{uph=^_ae)pjZ>JW5Hs%~x7>+Tu z39%sadLA%Y`3!uLC4e-ErYucpawFFKV$zu{!9ooH;W;F zbZ!tALN04u@e4xki>oc(8%nHb=U8TJn(U!!(OT_oJmL5H|E~p2>g!)~I{340w7aML z^bq~cLcrO3`)vMv4?2!BiwDb+e`USwipN#uUWYPR>4%4$!v{mptODUOYJbk^BL#n4 zygmhVX*WF-ggi(2b2?Gbff#?bz-A~hg+v(y9#dkF*^}oeOvchfW=EtAP&+7XTv}aD z&_GMp0n>K*H!?uVb)gWYDJv^?-HW7p4sxbv9DmlQFXhSa^5YsO0CJXJO(+9;Nh;=s ztN=i`DL=Qfs4(-{=Mw+qyQz==@wO+wb7pVFJBK5$kF;NI%q!SlRaaPfYq*7!8jFKa z-zKBY{SAvlcK#p&sh;Ns8t1L6j)3R!?g(b&;^2tDtDV)B?HPugnZrbcK-a;6U8)U( z%)-tVW9&e*rM!spX9ATye62A*@0+e#W}lN&C8iIVyJmp zy5x;DBzNN9@lZA_x;%||;0&^D zRHc=MQ%FN$X@^yougmdgHL1OU364CgCU&|wwE+HHn_b>sTEDZjzP-4%IlpS8xoxDa z?OgYs*<(Z3M*6SzcY~m>9_r)dL1^>X;J(FEhi_atw|M#7{JE2pM+UDB^^6}rIDhu& z=t$qo2RpAE+H=;#Hm-W9VajJ?aPC&jSk+KIQrVyaneCwKehMf znSJEnc;!^j(y8vb(|bpUc1|8_zE0xtBl{cD>vOkd7X=Cm17QQd4m%^Ll-gC76$MM- z!)Tzg>_#M1U7i#n>H69I;q%>l#`ZK$^fgWNwO#IOo9JzuIM90SK-=iCfu@RG)!QDw z+?6#sJaBp6t}Fd@(pC~bDc*vklF&Ym;J<7GmcWvQgi$X*lG6StfWc5YCRb1c-^!kay6 zF3W1887=9{EV>}8u`JZa@=9}B$i-2xB~aXXv-X|4Wj8*7Vi`l8`+LsoX_))8WcmZ% zl`Oj~ui^6_gIU6}9}){4o_(*1KF@f?@`USz=*%>IO@KO|SS zhHEaSqbWbwp!5t!UGyUO1=B>vo+3Z0J){MF7^1|LBa_HPx6%s_g#K~MAc}&D;+7Z~ zrHnyKY@nSQ;<2Gz(KN2I^r6rqG8!ovg}^K*>5Ug)-8?zo16{T}2cL}?L!@JXTFy0= znjyB}7+)1V_8RGRA@YDXIm9PZh}p6#KLr2iH9Im>*s}5Oc)K_oo9S+)C8`BMOJ*~9 z>hxfUr%9%lE{4#AC#%U*$7g|igc4(glF9=H-v4sEw0qv@l23V)j1xTQLbzVm9K9TV zN^rcL^;3vLRxh<(ESX6h7B*Q|H~(W%Wwr~YF=1{TAsV%no~Ib@APY;1)Bx$g7JCQ$Uivjc20wH|dYoI;bW zLn9@dgMfyj?NzUu;{5t3;Yv!m#h9`B$RMj1SI8`zjl~QDc|&GuWDUWXrdhI*1-sX} zzcjIA@v_92f(EzLD4CABaP03b%WLdwjV>JG!IHj`eLC)Y4A1n+iLTu@>C%NWRufU{ zD)6A`(C{Bo>1~nD8#S&_vKUQ`Jp~O-6&ZWI++skH6ZzLfEQ3pyD_toz8ls)o5XLgE zrp6d08f}O!L_Ss1g_2rRNQtabIPpvJqtwL^H1tyY;S5A(F7?VMHcX)fc>fwgElaJO zUJ5cpG%weSfqLbfS^_>*XzCK=T;DU60(#DV=1czGFY=H5b!XDeB3} zokF-cc41-k!t}*6Gndbhg=6}{$*Hr)rZ1l0Zwwp5o$J?hgi<v&mv7Bq zB24;wH!fVCIa41VZm8_vS$7x&y|b~ux}=-AI5ROfb#G2+PeB@&&}kvi>ASMG7pJ~h z8ou^_mVN(jVD{a@*&p(u<6mL&qUa9#TF-#5z5a6qJtwN~H;eC;{Q3NuZ(aUlz+X`n z@jNfSTR8pG=C^*CyMFD{Pd>Tk`R^qD@mIG$^W7J|{oBtz{LuPue({+{e|yc>zxvdp zUtITZ9(v;U{^Q)i&@&Hz_1QqHyTGB z4S^POhBJHSjG#gnTv|0S2mV~L3DO%qaFDYIbsQn7evx2`7COh;%>E?u|o(eqe{-WQJ zXIP?x&_11IsFMX!UCINew-7 zP}-ok^Z+ypfzV)ESg{3l#}M=i{>+Aepdq?V=|tLFu(3j;+!#s~g@za_@;Ms+%-MwwgIoUR)IFjCr^9YBEu;T&qgmlny}(?!jk`g?DC-43-|Nq6`ULc1wSv}V!NTs5ZJpC zqmJ+TRq{$ieD4&$vX?b@8+#^W&3Jv(fJfbaZF%n5;ImJ|pYvaMa{`*?AUIota62KNHW)(R;|*FRV>_+Te415r0m4{M+;r{7k@eBxv!^2&8>($tl`Z zm|MDiW72n@2t57Nwr~GY^5)fx{pEjovf|~2^zwv~!jz(>!tl*gJB>dNHFEeM1@eq6 z1dVJb62hE^8YlLL$M#hNsL92F{z6AJyHt~v-|pvLY^h_G?s-xwN*fP zyWTYJU0H5oWkV=wyuWbnSnot%`}lz-5_V2yYyZh3<$oNp(`Gb8ex%DOFG|MRA^gufTGEh|+G!R`Gs)RpB z3kMVuEl*f-2*_-l8M!JwY{emHN1n?8&Q4IMbGhI%8Jp3^lVmRgw<);tf+x=syd}(; zQX8`5&sEvg;jHRNMvaxMNM%mAEHy9T*_RSmuQSfK7EkufS%MrskUztjLoWV# zC2$shj#21nFM!&`KWA-9ElkQOPA)7?wrKpUZACq$Wm5yaQ%Cuj4BfnP;?>DBuTPxe zXP4X84!<#V@mO#FzUsEuCocc_tK*}mPE_Z$6eKlO!kiV)oV84zD|1>XBE~E0bkhq# zlQAQjG$R)CjGpjj48YDp&}bmZif0y5_EF7%=opK(C}{OYqn$J0% z8Vd=Q4z*O|)MannR@6Av@fUYXZ+%ic#c4{PI`;Tu_$r*4Bpa3snzOxTKH!Uv??93p z+qp}#79|Lmu0=z<@1%rhZg1_hCM8lJ!g(jq$_dQ3)3XM8cthGc_Z|@l!L9Az(?!hWrS3 zfcw~aaase9F$`;X%>^FQE93}!1l6MV#%MsApi4Qyp*%1|V}Xa*qlYp2SumDTxDvgF zOF(8Uo+%6zlhk6&zr&=wcgqaDTuJb=;|k}DML@|w1Qz2bqR9|a^>Rh{WG=x~SsEI3 zh?^_LOxHq}E=NA~82FpcEzk~AN6~=;T)-&Lppe00>ea2`excDll_hn-*xzD9C_6R? zemFDAQXVuBy$tahJ$S62%hzsDbJc_*b49w3+5}w`*Fuw!Z)y@X#}i|AhCR`?(90dP zcxFKKjJcwy$q}4$3F2wBv zm+T*D@l19PjU{b%$=)$Qqdh@p57{)Deh($HOZrgjj-bSe_Fp?mQ}-7q^y>3M7ftjC zXyl4odb(B!IK&T&w+9b1zFuNqDGbLr-d-BH^{#CA3f?>O0eMW5@R$F zX%D4wsDcf}4m9L2!R_0q`Ad2Dw#Uv0C{;`*`kI<_&54O1XcBP{0u5D0F4*uAb@7Ic z78JeJ&L~7r@U!*0qF88!LtCV@3v%}S*;8nnLdl;Uk=C*m1#N-QJ~6fHg+)^U(L^{K zeNEay1TQQa`VAVz4`H_`RT$1C)Dq@R*6ze@Wn0%@+f{kzaP885(mt0@bd}6>RW5af zXZF={`q*?=R^jG#!Dl#m@QJMFS7onx22y9Cl`&R~K-1&mSWIa&+p{Onz-K$JFq$uV zIsZn~57^m-QkyqR7hrT6SJVauiHNqN4?z%EpwgdGpY}iFd z-w%HOUuw87pYLHA6f0M=Pw9Lw0AInMV^G(VUW9uBjF;Uyht7VPPRER68ct)34fl`P zgQi%XF8cf|qh{-3tTx$?jpNVDW7VsP_({c{&*z^?UG+remZy%EJTp+dnV4G+#Ut%A zxi2UjK?sE=9dvEbl0QS6;lm1kCJ~2@2yD#Ac1bymNPFN6NfxFSeD27L20R;W&dC>Z z#=yhp)|`AwOLiX7&KAs^nOSH2IWv-OAUfmu=K`zlfzS49j{TtX1Sz0Xo_?IaG+`OQ z=Ne8+%*<%W%IYA;a#~`-6W>l>^-R|DkG=4R|5d^Et?!&}`O}`fnm}1@pfa40+g%m8 zb+Y5;P}B86%lS;Sv*5Gpnf|(I!l8$oZ;dp~_C_XqYT?hA%?#8WZzzpq<<`L1-Fbqw zS-Ew=d?2$iXQG{hu10`7TON#i_%k8RQT|Mvd2YtBT@{BLD;f$jPIcAK4((n#+Cm8Q zcu)P#+#F(?Ytsv>19{cKVqs_H+z^X)an1!X{%o<(1T#m{i|_N5W7)3qiXGRmG`#v-|n8AC7;ED^4%r-;0d2oLc_7_|DJC zm{GCt57jq6sk&)LJAqKjuD@S<{R2y~A=-Rjjg1e1=Ks>m{Q2ewWZtM=_({#pPa3Y1 zh2v9Rcq2DHj?DeU?B@ygv!omqul=I*jb9eOdAH`RyY;X9Gec^w{V;s=-{-eo&B<%2 z+>u?iX>IYwXG;<`hSLL;ft+w!VO5~0GA*CQuVC`a7aIqk75of&CjOai;g~!!Z?qKE zko+0`ytAa?Xxq*+d-opi+&9$RdcLb|_W0o|hepN@?VlR%8yz|Tj=pfP`|?2d(wPx* zK`)#?J$L5F()kkvKVKf|xjK9RI?Xw2qr(S}b?)t{4G*_ej}7f6;Q8%|lW$L+dF|TC zH^&aYK6&)^KW`f76`1)D+yIot7n zLCc1r@M8;mwo+BW5rlR`V?{}Tbj=mDX<@PfWNoYF2hExO{JD`XnDaz$`_;Zy@@$On z-!*@5=jEQ3>BHS8yL$VZGOit{yLONqBkfmF4(ys3=(yIkd%Uad(m?IS;oied`|C1_ zic$iVS$XVaX$lFSD@b)B9v(x`6)q!(@n_pi@#j#rN6;u8izY_e5=6(cWQ2u|V_nOM zHEaq8pAoz)Ght^Y3a0~{mrHd<6#%>{ql#kj&zUs@LL=AYM3^yk?KTj!1ueg5q07R^ z9zJ`9{JFxm&^k(dRI{kEDOF;$S@8Mum^1tt=Dd73;EJ;XUDHP_-w&USNIT#hPn)Fy z3#0VCqQuK)F3*NMW8?K2<&p9|f)99(=g%?O$3JImN-Ipvw;w@*mXSL@A>5i9p6uJl zFETeS9=vD2=Myn7swHPuQuk=(o8q7>ob9$?lD3P|@&I)@*05U7{ zMp3XC8^LD;@n>@df3}nz4Y`{FfzlJT@BEjln?EUEe6M=;Q&3^i{Ci|6RC&sYpC!LCGnMbOv__$L-44QH6=Y#j^1Et&fv-=9XCXAE2;Q1e$O z6usHOBKRKGyF4{b+0d(|UJ~)?Ul_dx8~+N4U{TO<@0j8zq87OFvv@yxPt*cX(v-1W z@oosmrlu*TfhB%0V-^eKo_jYk^eMSadoB52`%(0ijKd;srBz z(*E$@uFg5Z4^HF?y_QXvWLZ-C^%%r+JQ)&*AhL?go(n=k0s&?GSRf=w7Xrn8J^)d= z*kg>*&?Q>PKzGYb$ynoTGaMB79>2`Wv%DeG#f%!r?2MwOi3bU2Xu=_Jg%WznjEq8# zcLKMBcw-|nsjJZPu$M!IP#9|%)&=X*WR?dO8PkPBh6vJ%ufkO2A3dI#6ffj!qP07+^8b?f7m$hwKxd-8@W3ha*HUi3U{nCUKyydk5(Mok3Fa88qg;0x;q z^Rim5j+JW@*bTvC-Mi?8I2%5g6q1mT4I6s~QezBZwj1H%pWXia9X9Z1In-VuYoD>t zoBTU_P6YpBQP3E8!i*5lpLG+p^Ek;J`)dQ>mJ7xG2H`wtcH3CTf3yjHE7)Y)2k5ce z4fMW?-C&coMc8=RT)AzGj*THu>~+iVz~=LxGz5%MYKUaa)RZwzoU5Rh6I+s#nMk*Q zrbbcY7Bj7ZreB6^{7*=-p;rbPWfM)?huU9`9whV_;8SjGUbg@&C1`~-wKi%!Me6ly z&_H?-yfL1o(O8DitAd7tr3T`YUTF{{`%!AjM$2Yk-soR*$#mg?WoQ(&E=Oy?m|kS` zlBxZ?ni_kG{7~!Tqahe*4e>QL6b$H<2jA;Q$p*c@3x0@pOarNz+PjhxO9slPUznc= zK^KCcVm9ux!#80K7rXRsWcK}>+y7iS^Ea)bw*57Ag!SH-yVhCDL7pAV_0rY zQmTkFK1(@9&;q25%2L42I2U}@jM7Lc1TBKi6ifu%=FBe;Gv z6$DLaw1dyLwHI}S{t=m?-aRW@%a%D&JbpWDmXSk@kB_s=4SD;RGK_8Ls)a@3Ti_vVx_+8h@qZLWaN zQT`ld$kC_nUbY;YWhF+A*E^(aziz~NVA2NMn)=s(*b`5ID7bPn3vxmcq+0;2b~FFHs+kofrBop*+FLE zXf)QFliiY=tvF{PXaQ<8BF}BP1qgVH@#ic~_amtVvCYJ3d;V-c8@bO5HJ{(Ws>gRc z_HB~zlYhe?d1iWJMu1}n+cGkfAOCjpvrpwb`)vBEZ$16>KWffO{vXaYpDZuVNv&+j zsjNvZKG+y}=VZr?!N#TjD1Qbo6W(l5(1T4g2kU1Co0f)K#h=OlOlD>hL{Ile2E)1G z%-rhiyk?hJqdGH(fakhUv4uUm$mb}F=0rjTLOTQvokm}uSqxRCCKpF@PS%<3$iYZa zeO~BXZ_~n&Zi{~&svGOBCkY8)7SxQ}ssKZ*7=LzIph=Z%#|1)(Ig~J1Y{kVq`*Q<1 zJ zjzv4K5d83})G}Lt+ScL?+iTDNul0ZW%gXCNDWChe`o{Y;H$UPJ#_Ml>O6W33nF4}_ zlSIqXM?^BKD7}Wzw0gy&;nk7FpElk2pnmBC{scSB(K(Bs)-3#lRMMPR2%R9cSJ~XB z)Qkm0m(Kn)_r^bz-}+hQ>%R=&`DOK+zpVPRyOHnxykqv=$^)e`0 zy(c?&o$Tr!Zrk=Ge?Im_4g4+-CG+u(i*wY)4Xu{0J%8cm^}ODgIPrp8Xk`oDE zJ>R=@a?iqvE>19<=x-eDZyr0)G1c3)IMOzE>R=?dDQ9brBYRclf%4K+k!MT0QEKtt z<-q6C6w8Uh0fiO8aCNY%GE|$ny|yGZ?Miq4(n$B^p3cdG?K49y*M{21`r2`RZE)B0 zq3+TBU6;FSW)JSX*4KLZK>L;MwsE4b`vKIQS9;sVdfF}x?R@#b!M)`>ixbFsk{QV? zWi9}?=g&gHF7nypkjX0!ekA=xRj4`~tb!i%pu+iykp?L{dTccrGc5Ur1xQ=mvV+W) zphMBl$}f!)OZB>eCTpVTbm`TciddBaVUAQ}gi%7FBMv(g1et@&B}8OZFjZDg!ZwDQspQ?5&h zhtE1IPzjt>dqf;1$#JIyDu6ltrDTc+$Oy6&N%pe%u$10dz0_#Z)+eP}k_{{OU}qoa z9OKV+1Ys;Sw70~6$_qOv!3`<7TXQ%Hle<8E@4}>->QLpCJ?*n6`d_(r{ME_Rx5m!C zHhucm#F1N9PkwLV+>MLlr}}oixp3y~`IrCg^_PF}##C=>PjG8#VOlM*%0An(4jCjD zhthG}&!5dWhMh&5b%3B~voLa$B*#)Wn=+%VIMhM`DHo-;79#k#Xa}X$1#PB_f{n}y zg3W|I7iF}R6FZa<$=j5eo6}eS=FiJ-{}Z`2hqj>+~ot+mzVPTrQ z(VK?69F9?Y4a-1pFZgZ4IfFBAr$Up!Cba9jbz5Jj=_FeL(snM$#b9V4q z{8>}@Nond@xMTyW^TwhPAQ*&R6Z_32uvf%F}8q9xhlT@!B% zr`T#8)P-*dEs8ygj3G9GnOR={h(}0%WG@zqQsfgGQB8dE)G0h$ zJeisy7~oc(0Sjb4p`esE3Ahqg<))y=7(HkmOI^F&7q`9Cp5vhuTZ=vevEL)OBbcG& zeo5d4VT_(zrftVR1&!b{W-9Tn75(&Y%2i!E*+h2RD#UJs%2oz#eAz0o3m4+U;~dKDIGx$|j(v=;3FG zG}<~TCCi~cJNin|D0<~VpKF>}QY7FI89y@C$I!c_*B*O!yQ%fCVaY65VivzVWL(ju z^DFgJ9af=@* zwFYVm2CNXhUj`bAY$Q|TM9V|aH@v!NN{}n<1GNOYq*tvbL+GXUgGJKALm@cw-zq-?mD>c`F7D}pYu5$`C7V+SlF|N(imWj-ot0oWk8i< zDA=7U7~{zba<x-?(v=LWYf37S6j6Xk=1wj4e!GdF}e>omt1CuV1vJ z97~tKfAh*f_pxwMe`oV>Ywb{5OMi7~Z*JPYtWZaO#?Jh}zWh+QY<+5a&2;AX?&d6h zQZ)ZD|A)z)|9d`V+$sBMnEw*Q?mKrazDOUh`88!de!hO-C_Q+-OU7ze@{bpvAifj$ z56=uaA%9$a%3CmW`w zD)9v|%ywj9aymyADi5;-Hm3wIW(czw!A=TBR4*$hC_4p|GpnoK6-gv8RV zTcrmti#+QTLgKnX!7xd9BiI(?YfXdL9B!DRu@;HFV>_G~(yN$fF=z0y3duKI3XYc$ zFff~Ko5+ko9B)2>)1>Kek=1yECxe#_JI4waNbyZuiAw~H1_4q^vIuIBrtxPN6dmRB zjjc{Fw|P2q1KFJCOMq z<_zlO(yWL@yL$QZW6k@Ma(I4=K(AuXm$&`i5apG)*c~i*k23DAMfvc(G0*PS2qRla z_B~_cnvOq5xi0sY;_s;!T;Q<>&JQr~mhs-=lrA0nVN@tpM;Aq77Z?QHPb74mP8z8?MzG&BGSfL9 zP-&c99Zlm*RI}JJLPuU61<2e&ZfC~k zM{xD(v{kDh&-R%DJ`)SQ`pLAX_|fNywAD`}KKY%@7oUebS8>2AIYY9uyNXIPo_cKi zcb^EYTb;S;nZ#9pwCUTAU1}@5y_W>DB~^K4dvl7acjO=4)%3>E7Bb(?57fh)=UwJ! z1Ts8R2#3CYsKtc-y4k+Exjs9NaPmMS^4_AtNLDc^I9f7tn=*^S!CbO5LzO9Z2w)(O zdinUjAX{2w@HxGZ(vVR~cqjQcs)AV^CHbd!m3LR<)#qiBpLFq9_xz#y#i6S6osIQr zmNmL2-4YI40u81J;kFP|YcbDGFy@?|Z}2w8pJT+>abp+iEUN6;vggcbWb8RGLA>$9 zeOd``0O->hf?gAa(gMz*D5EA@f=IQ@Ja#T2&vRNCoR-x_g5|}*a+lG-LbWN!>Y)(HT-j5k;%b@g?3D2 zFt7S}N2f>odkL1lGBR|0@1BE=&6LA!O=r8B$By;fx^m>L=`(j`&b&5t z21fVFg@ISk?q59CK0eTLwZCJuuYG#3eX758b_6cnR~o9XOv;D-a;J!ME>A0inU{os z>Lh2jYoSP{rsSuUmj&xGw%3=Zgs%3cUq9A0+P7!=;GT)$J+lWor~5m|wlUsUKhfVj zzJLFfzQ(bGE!TS6$qqe!kW3w&$izsG9@vF2+6S!eIo8?Tm=`Hd&bLDzGfKl*gg|q! zpi7Yv1RxtsCOq4OU{zJn_%rd(U~24bNFZ!P+K6$uI;)Dz8_N7_DBDFl8`ch1kZT(F zY$cZ8!}Z2RJG*QfC>^-QiAT^D`D{2kHiM2i?9b{Kw^0ak7G!ovdAaE^^5+P__1h^jki4Q^POouaz_W!kyCVWs3o@rY zD9+hq24N5mMmKFH$E4)}g+XWv{rb#wgOrIGIM zT|fWY{Fyt87ysS&C*Qs~zO%ZE!!hfNTEigaU`tu3*-~d@Midckb!M{?We6+-nF)1v z@ytGxvz-q}(q^Bx8A~(@Y<8AW8HQY((I%>lAL5*0&T#4StPW~8GX;Z!jMn0ecJb$u zjHbLmTS)*M-ByxUpSv~0@jd)1SNZCHDOr5Ka_S?35}`)C6Y1rempERXcs=L4OVEHW zlzf}%P29{JH)a$zd^aMLO}>k4XNtL~S8VvHjxWRL`eUox zan+DF3UO>{QubT*^G$uIW zYG~KNL&&XU{9E2jW?3{;4h-babMRn55=$4xjBLT`3sHuQvV87c-C_Y=yE@qKoUu)! zqv@q-p51Vk$^y(F#)lBg-;fYhF-r6G+MJ}qz1xcPmw*w$k_N5YPgM>`VnhjXRyS^ zuNFZ-m~R`pkTJ$Bn2YaolbttKqI)5GZZ4lq9tH}J6G{q}+&FH!rl3Z{K<)^&WrPq zmXBUO#u0mS6X%!4FW#6Kogck)`RtLUOJ`uwQ0VEir{f!&tlBCwl~X6!YK6O32KR$^VTV#GT;We*5CKez`rUS8Z=mOGri zqyO54{jbjqUOj#G^_i=8ZcM#?fA{KUm0 z)kT9X6-Qbc20EGsI_d|r(>s{GB(%36r@3&;ru_6hDc66QaqFLo=ilcRl#z48{b2}? zx7{`OcTBo{{+7|y?e-c8{z+J&U(wWq;cIzYVe>1S%S+;~w-!Gso&Tih^O>g#YqxYH8n^NB-p5$NuQC-~Gbs-~Fu@9{I}F-+t(&%{vnQ@@`^g)3aZAXzin4 zef}H2@x;SleD0Coc>Wu|{oL2TyozvWl5hNh1wTLg=$FaD;SVB220l~D$#jvN8ec%o zHEAJoK|`St3O8-de(@zs`0TJVtk?i=isg>B5Gj%{gOT}T(!^Avqp>G<2k^Ne=rTgP z{1^lnmv7$=Rfa8-Alk((yUfoVEXY91^t4**_HR4E1#|*&?X% zDFh9d7I`KYhwp`W3pJa-)QN-^69)^twfJYCCC3gD$t<=^+GmruZYa$I9oEdR48biA41Ga7IxHMCg>S~9suWK0SUh&O-~ z1g%@BHHPsv#Kg7LTKR{?&> zf=ezArOxoN(DBe11S$$DG%6^H2FeQYvqT)Lt@yE?veFwPe$nvM#ySBx`o*jSIPWlU9Av^#q$B3~9(aSb;#WCSuDKCdQ#|1pcM=5(? zD}l9r)?A;(e*Gd%SPpW&hx)FVCD!~5n5;+QL3}$lFwVI%Uh#~{%n&ra_xh0~zY$OZ zPd%Oc;`2vJH;lHV@5{}sNXrp_rgrHy#GftmGrwGr>ec=GI-Gifv^E*9GG za+~ANkY`_3@MmnSD>t_}JDcEVVQ2B@hO8WZI}1GXOxh~axjfDfI^xgN{N+OGQ{PQ~ z`nx3A2tNM|U%7nQ;%9G3N!I%3lfU~|=34${VKqMwZT$OAJd=E5ut~MB^ZY>b(oi$GIN;B72kVJ^o;}z+P3f)KRge#V zChbO3W^Q9fA(Yrk$kH-X1fPYYX@aAjKF?yLiG0o|BKVms&=tXq&Whq=Ev20$xz#zr z%R_AoNB2$*H7p*gJJwWF%i)6==BheSX0$nAGR5F?z`~wQKo5d`5Pt?QyD;X$c;I|L zi>7xOCKJ0GhoJA#$A$Gq^)43L^Jg6u=WDM=@cg-$EY@koP-x7Gh^&Ss!oUON#etm4 zEvw7gueJW!KiA&+S^4#kBb+#V{ezYKIfjdWEd=e2KT9BRI@ZPi)uTlS+OZcjmHcro zZz6LamCg|t{Yll-rvzqKzx|7vKf7E1)-P%=|L-M@XG((M@YaOLOV5Wly~w}#^_khV znR#WQLaw?bt$++Fga?xznaE7;Be?~KSIRa0>_nKwF18{11F2dZmN zbao!u)p@M7<4kAg@xA*FwYQz@Xud`kj>ChO4|QK2?1C_J9O3v#KX`WXQ1{a5BR4Lb z21L)kd~E*Wv6(YRFAoiz8|*!ASqKhZJ2FH@V|RUKRdGs2QA!?c*Xmd?=9fd3$lyD}Aplj=L8%&v3%d!)n+YowTbJm8f*&B9P3XT^II6LgD zNM;LWj)gRfMT3;R5XH+YDD(=>{8`Nh@@Jvuc>e4)ro1oDMm%>w zvw&w8|7`Vr!Ot3wKAtwqGG60kBB+x<&^cSPO8KG-Rn=!y*XA`=XSW<}Z6SL9wehoW z%$~hHb&B%V!udC6FTFl{@~x#Scjhj9|CP&c-Qc*K(I32a^}l^<_S&iQJHvZg%6GL_ zc17}A3(_Ls<-$;1aYh4?&zAf-tEDuGpe;p4Wmdb8GPO9fnxfP3GK5(X(W>bZQWk>t z@R@LEMLw5g8gm9g=Z6em7lb+h(S;f9WTMUsHI?PI7Hm&T*xFD#|1QVhC|J3wq8GZ-`bb$g8=<)+K9BKp^U?5Ftynv-Q#)F(- zNx_>prs-FOj2T@rpos?=$Q7%S4NYV$y$!F%hJDx{hcsbg0(X!fduw(~l^P0!nXw?D zR5*{5Wq{IHqN|~ZG}&s!(8{54=2!$ZLvV$E?Bx^UWYEb?C%2-YPN@K61K<`Q?P6<@ z{YvBwKL~=22uwwxHKFh%YznAlfnwA z0ih`EapL4h2TSpzz-fBv(k9q?ViCnQ&=E`S2=`8eN_U5v;%_B_zwZcuHEy47B4)bj zvZ0A9?yQvfL@!GjNT#OvA)q;AM(Mh=T9&O#=5lnI=#ja(cGp}iv|^a)<+|836%5d; z3k^+b?JBZ8B#tqnlo_*7@C-)AK!q*|D1pfo3@~FXw;0)0V%Ygz&T7Qc-&28T>{*iT zMegYTMU1p2wWYefRm~;qQ=q2*P}u*DVx&}C&8|wR4Wt)=QS|zvE^3OPE2CsX%}3R{ zqN&@BQa4BrE!)z$^Jflm-ysZ9N#YeqNgNYW@5tQ=`}%{O}-AYq(ZLuO3&vTll4bn?kJ=2^i4SO;InS-(O03 zFkB*zve}RF@BCBd=>J@s)G*wz^VQj_^Vg2gPF&=Cz4>eBM$ey}ym)cu{MqqKN5;;b znmvE=#^i~H`mS|rTSRx$Q##TU+p|-5gOmfw9q?yLeAqK)mQ};0;P4nZ7Sil;You7L zvXHg-vqQv|+nFW^np$}?WTP4cZ9v;{bXd5xiXZL;--RG2F^!A3PTm8r&Pm-%3h1JO z&T!em?4*PHTK2s$cVz7B$+=5s@7$bt{l>M|mqsn~^WvzoaEL$Oa#=XUpV7Q^{qie| z7xuLri4^s>)*foD8|Z93QdQEEl+sk5x2GnUnY}rjG5%rh?YkCHyb%5C8$Hifb8GJ7 z&;EW%@VEQd7kCDIxqlR0_bcz$_+{`u2!E!OE&i;2>E}g5Zxv7dZOL1|D1GHW1;+lD z$Nu#>!E}%emQUWuh#tC-HmB=JAUH}kALGUYrg)aXTSNItG@ol)enF1 z`EL>+{iRjk_<|yzm4(Ce=Vu=MGUS<3nvej6u7EA4q=`aXo(-}wgO_2>0O8bN$<`fd z&#fumx)sQbrXp#(yaeRv02-&IV@WRq;UoxXfY=~nQY#ZP46qeLHmsdu zq0Z1|g+OC$5!5a(G}swEUUx35NBlX~c?iu?MIfl?aWwKd2JSp?j>nQd zB9~qdpFM(x_!)Y2JedR?lzR~6Y6lO+7~^WdAVV0Ky>=Cc41%D=b=g%eP!~%L9CnGI zxy$6uaCx)YD|j`;-sLk<3^UD|B(h-`jwYJAj^Oar6ewbCAlb-sx(kF3h6rh18Q-IQ$1V3k>VW~VV3}LB6r2+;C=hhA^^JkY; zdj)yEANGn28&!@WXk?Vj%@zFFo2?LHjC#e+uV}7dvoyVdW~Awbcw=w2QgE3)yrp2T zZ~hAeJs9_*<9mk3e(ccW>K|PRvW)WQI9E~l{M^&ol;@vFc>L*#%^S`~HeYKiXiLv7 zbNrc<7Zhl7Bj@^A6m+yG`7@N5C}sFFVbb7YMMR^t2xmv0<7>~HR|@V3LL<)(K9ey6 zgQlDum-#uXE0VObE0^LGv32CH0xdQ&v5e@c4K53MHC)XF+lH z^UrO0{M*6j$i8k#bwJiHeCrPzf}7^|R#YVy@b~haq3rrlemJjW=0G#apXU#?aLAz1 z=D`-q^`X`qhuR!@Zl#7u1D^?go;yGwbj$2O>qK`I8AagFq=0VBw5Vo>nwR;rD0F-+ zbc{w&x*@BC6wqbq!R|=K;rf!cqMYi2(8SS>g=2eWhuc_8Pg!woAPE&#v%tFf-!+B6KLtO-XVBZ;ZuU5!zAvQ|1>iFaq;v= z1-JjP^3U%^{`_vmou5=6{ttOIr}9!uiZ^X7dg1Z#`tR0le~CZ9i4d~x&YcXWWS69o zqr=XNEDz-u1@eK?@aLU{^}9hzySqj@_Z;8Z ze4?}M%E-Xz;XzBpF?ay-Oqm+$gXm5V_ue=={Mx0XH_r_$o$kB!^6>3T#}`f=njG#K z>jNq8Cu;iAz}{1xZKvAWPj>7++}b+S*f`Q$e`;sbmA=mTGsA?2zCCu@h9BQY9_A~( ztz-SWz{2CbEi*^j_SJV3>?kJk8KMhCFHJY73#YYWG0&B*xNv9!q*F=6QB$4~DGFAl zC$yF(=T8shl4yGT!2X$`j;TX?rUrLU5B6Rg=$antghh{&beht)(}JH#$6*;cc3R5QQ_%ov(h??QdY3sM&UyLWmW!?~H_F>QWV`p%2XhVwU$%4u83|W*|detD}s1T2o zh+>AMbhf>Z#YK&l3L(e|{7Gyl~;p{L62@a`i9o%>LO0KX+ zreLhG-lt~49=%+}n~8yFh&-rQ{&BA9G*$)>3yf(zJ(MI|U8Ju83a&+ylVPEtoQ{OD{E}qPN?z=;%R&Zig}8s?Dvl zQD8HVkj>>-J;NDG5w%8OxXh$S)*7(H735hzG|R- zb&LI2hM<=pEG1CmP)m|bO|Rxck3iFp#lHq>sj4xWOMnz*a+&l4ZeXlech?$z2h^90&@hPR8tBYD&jZ&7<#~Y)$ z=izbxL^3-Y=?%bT?{K18ZbCYA2 zXD?jQ)}v$-GnG-C3j{f8QRSW>^2rnEOd&+B>&&6 zy$5t$S9<3ucdOf;otd@U?rwYSJ!dp{kHWRiUa-Kp|%kU;-1EMTwL| zF@gy>F^Z(3+a8a1&&+ss*7od<*PizA_}K2;YDp9oTHTVczwdspE*?Nh?w*}4S~<_?NIKfd?cXrx_#MQA%ANkzPYrpzrwqH^4#G| z14m>R!tpamKwlm{Jw1E^_^d@!pviyM0)j>e`UblbUOD~zp~F?hI~uEYBf-($c(6XT zle3h2tCGtLi;n)c&?_GnjJ%2Dmn1)%Z&KKZL2vYD)OxQ8(A)j1)#ewd?V?YP`*7X^ zW}EIdbcP^kUJ|2IZ&!@JADx_uO?*%|{l5SIoLN!cuLr;Njo>0{PDizxo9XK(wO*ts4>kFZUY$jPkSa zXNuv^dGKce$ay(vJ42PpYUU6pn-UhTSm9f;q+*TuW7!*I=Rp8(9vc^mbO!tx_$fnCkGlApO) zY)~_NxXza&+*nuD?9#}}ut_C}>jI(y@@Dr&5Htmj4Sz;SgGAOkBsEMC>1I(^5W1+r zj3x@(x|^Y4`;zL6=7wfIhXgfi0X{<@;m?v28w#Qa!oB9M6+E`Y^PrRS%vA_&R{afk zZDcpxE9r*$f|?CFmUV;uW-zil{+F_Kkj(9{w@<;W9?rqJ8PcmwHr{05KEF6&HdMYFFs z?hmuyAMlxa9)Bj)S;@0XWC(u_1e7@=+N{NrXJE40^RaWGh&<1h419(^QyL44**dV6 zB+?+#69p+GIKqX|)oc6lo-sH~ z1uC7UjGl&4XrvP2K~xJW=CNfCr73@Q_dpFG8~GDZvjx$HIUBLuh$YXG+lnxLN!9ulRpI*7t+!)0KCB#mD>d;>Wa3WE_?s1z{IlU3 zWI;O!`cvrfETDGfGrO^~VB}BhYy2=AMbI+T_-*3Rh~|X|XPO0W-=*bE zS+LK$?D>@(yj?x{UhL`z%`eZyU-_u|^3USW{av_oyr8%}u_2#t535!@RQnl zj@>_aaP!6eJ(EYajvVS4KF~Y1w{`sBmippES*{VR2KMGxp&X+8*)ZFL@@HYu&}mPS zM*^{q>ijey+P}W3)E6GuQF!g>uG8Ck2lsT1?du)dvvFuA2)%P)PbXIa@jkz!^Q`da zcK9=T9cOlQpV{6Eh(?9u{MN2>ecfb4pXh5lvuER}UAqo;_H@T;d4PG4NG5l_<3Ml& zZX8Nfi59ex(GUt|LU~N2<#vn$BbV*})l_&R+H3%{z2OV0vKD;v9`@~wfaVD|ZBs?$8 zB0$LV-Ni_42z*|erAQfitiTy3Vhf6Cau+v?wlOl)C&K4t5NV?nZE&=q)8=q_cJA`^k^-Gwn#fPH z=Hx#&mbLG!>$q@m^OaLi-57rEg^_2kTs#7KhCjbJb?TLCXJ5N={>4jYZe2R{;^b*O zFHRnN_3FULiBktR?d_@CSYOfFmEP8p*aSL8a#;Z~NEu-bWzjI%TGSseq;mLC)odMBgJC_C;3BWL6tsrO-*$B0xxl!b4m0bu!4a@=fT<9$-$f`{Z z{C&$G&#)hBeDsHWF7e+PiQ%8Hp`PaB@wo(lreN@v1T0mm!;7}OYn!)qnjp`-gDc|T z^-BF5s)vqvsObW8P+ZAJB8T>^UxVdz20d{WJiPD26ZDJ>i-$q<^^LxIB6U*JQBQ;) zL;X4v4%I_1{BEZXLMsNX6b;rxW{aUngpTT@rZ6j=1GWyXXVjtWDKth$(2mr!Qi$Y} zpVUN_8Uv;WW>j$r_&m5z`Ju3SgQf`pBq~i+9!srsmyBOPABRpy$gt6H00S}(PWr+L zA;4f{kTUclt; zvmyWkCrye>wN)pHpTgPIU?^umh3W>1!bR~DKQ+MdMnjqgS9&yDLC~OW2j9l1sg_3tueNX^Qaj3EZ;2X z){Pnc4cCRRq~B-dxeak7tH#J#75wKdYcLeF?^PrkBB(detlxhW^a5 zEUYa>ej-e*>*lOa=7)ttT~+$(g5y!AM$$`%b&rNe{Wv+Dj*nAMjiIC$gE8d+Gq;H_ zJQ}73etQ;LIb>M^0(NK#jqvhk6y*8qA>@cqrN`(=&cNYU?=E z_|?{6wdW0jlQH#4#?}#t;k!kt&C=nd30SQk{$d-{tdmh&$D!6~*cb+(=mb~_f+_YY zXwr^&h~ad){@4_n@Yu7s2ggZaDCUM?$IF{`qX_sXunTiEp6*8GaA=bxPzIgJX( zrSqpo&z?Si{P4MBPmLTuHhAXQbI%^V@Z6IVrw-J_HmzCK=Fi%Mqz3#}K(r`tY$OF5 z{tR>#&YUZ3+2kk7p`SxJeh=Khc=t;7BVY*4x#^SggBHu z7y36D{%muhXVak-KF{OQICa8IDVV#_pV!XBL`Y5Hdcm^=%1o*F%IZS>^jk&~JNt+~)n3baw=Anb+dQ_~~QG$jtyRP1U??{7>U=&Idc zR#08KB)4qKpGN<9rfBqSq{EO?cHpy7+0r{AHNUpZ9iLb8z^F$bo?oHP{JOEfcRsBz z56QgZj--i0=Ace_oS6BPJe-m)!G(Rm)1M{@sV6TOWmP zewelM0?vp2#XXC@^m%q6ggGz%oi9A}l`pa#A<56mpA|tnDjdJ}`Ne;5FIx@5pREc9 zHZ&Lltoss@!we9tfyd*0%j4Sa@XE7=xfE`JsT4fM_hhRarov?_m|gP=|KS-;`W8c8-U3Afn9 zvy~qD5^H~ubL75S{>hRM z+H-JjhB?o3&g~_#D)Rz95BU_kEm?g~0mephZ)|eMYj=g8$ zH*+6evb%WIKui8{glN5NK3D*GwgtkhTF~e`OGb1!%uS~Vqedn=5KzuM4?aVlTjp|R z-CNK&OR+PD4v1FxOii}4Q81Y0&#>r<6)O=5L7v_6XYa!My^HQ6?V03f;B(IXU*}Lf z3%;5Az&H4*$y$JYUvSA{*3%E5e&jyBUuzDOH5HaNhD#d@N)kDt-emg4=h`msX>s#s z$g{#{`18b`cK9>-&qLeNV><;tkM_60pHFrsPzb3Gp}ouwiA8J(m=09d_yEg-pdrlZ zAlg0^aAxG1jYswk)F$=I7KFjl>Vn|TrqrS4WGd`!PnHkw>zdf#K5?k)nT{I1UKH{i zC;)3CwSk6kDiFZ{HB$?DhC-XnXR}M7Y-Xq08Va8w$x4`&Eq`KdX|uG-E^HC)V*QRW zH{1E2h0ow<%bx{MI~(v-sLfiH`O7#FM7=&gRvlPZxuH0I_HS$cc&1|Fjr!?#$w}bP z-P&o%?n7A8A;X^mklmTjnK1r9bu(un%wunTYBBs-VoV~mbTngf2w|Yec3o^!IQCY0 z{N4J=_miXKX7le?GGP7KyQ!gfYuLTZ znG-_;&mBE~2D~7iR&-Uh>Z1Wsz@*im|eyXkJ>5k^ZZH-U0weD|j z-<)V{F0bu~)^zk@P#TWaFM-J^gvwic>{x&k7NA_%lMW5N# zMWXe&-5tno2yI4@V|Vx2oxQRn;kK56ZM|$$2zfrUqm?Fdp(P!f;5|J9d$vE{w_{Ip zPg{996@+z*7zo=V!jL7~SrN44Hm9P2Dg;9;RW@492_e;)bZAxWptk%u6YKzIhcjmq zo>gr_>p03A`8CR)lc98~pq?_zpGE(r#GYHzZB8TEQEq`7n z$o&4;KX2K-K$ZnwjEE>_i zl_CTkSQX@6*Mw@DD_T2Z-CGjvr*>_;e)j2GqsMQI9+Uj%$>Tugm#>^dbK}O?scU1; z-<&@A+Vu;sUORtd>cqc&Y4Fy>#eKb7_jK;qQoFq=($$&X)DZ0{_0^Yp8_Il*&|~%l zR2EGwMp%-TZ89^q7L|8am<&nQd}h-m!WwozVGWRIq`%!G3IriU=Dd@-E#Nk>^5k%G7qF>$uIwGrXUyJc`~=%peVp{xgP}B-Lpz8L zj^92fbk`B^=!pm>jOTB!hZ%4XNjO^p3DZx}+QuV~hPE(j_HEyHjf+o}z@1A4Y6lb9YBpUWcW| z@9vAOcZ4(Q9BeCwo{lcIqm9wKslj%9mPp5;i|tDcPWyP^w>C{gQdH?$&!{61qfHoe zQCm-kjiHyR9%>zvCc3j442TC?KUx_9TSwOJ>QS3WK8}FTKvZ2x9Z*lLry!ooq^3xG zCUIKh83%*$38rSb2v9>$gh$80&}?cwH8DDrw&KJ?O`#)BF4Ni=IxK!{YK_sp)Y=!r zPETX-TZ4{zh+$`?9%>3sdm?_PxZ^c|lgb?*pZyKO>5#7Cb)$Mj6oG06`SiQZFHN$b zy;E-%SL{5IDxDrb!Y+Fg7fuYFJvlOPq(C3p*PpkxHE-=U ze{PExu(_i{qs%M_+N2q4&0)y9DL=1=67=+PCdlV87%gOUU_6Wt~HhZG*TX=Pjmv}mY zg(*0p#Hc_UbSyc{pl0Mdf{!jOcw$B26RV=@b5tW*`qD8YB~4#Wr_ft+uuTCw6HKj# zN}eUTn$%^xBVmpwx^@Fu(9{lphDjQk4!en=2zLM;jXH(`r#OOqI<9 z!K&bK;i#F^Xd9#C84OE-KiB(m>U_EAOVnd~bJPAj3WIcnyi>ayuI@_1pGUT(hI-@U z+bA`cwpF(T{Skysve%L%nYZw3&??DfUh<%W>@rde%1GxjNfT*uo-KJMpIN%k#h&vH z6;5jYGr`JcfwWresX@>b4hblHY;k1Oau76yO zG!aJfGs-h$3rDk;9geNO*j@2dx-9J}N+W1&@Ujr*e93TD1Py;q!==MvqmL1+HG32i z;7)k9S2B$Xkf! zhA2Oi{45gC4}61#r4^h`o%i532nZ}%;8`f*8*D`AdH8Ep>wO)im5l|F`fzz;usG!{ z?W?Q4^-SBPJ*{JVTSoeu$bYsu<j=_X~d>+1UtxHo4GkBfDD%cQ-xPnt;+*2P;$X zVFVWZ6%Bz1LK!t?&p`;Y@@GZOU}r!vw)$zJD1WXg2<+`hA8e^k__BNJA|v~|FFn~k zez1FIbu6A8tO-^^u99(7NJ5RNxjyFV~YY05s;5|}b`BYw|d}d=iQ-I0t0(>U(nWFqzQk_Y7<}h4~^0RD8 zXt*>Wy0);XCRCp+s3%7^yf%Ns!>fGkIcQLG!O}d*XP%SWEQ%TP$}E4L3!lNupUs~w zZJv*mKM_7dl0Th4Th6Qq8YZlsxola~Gcp1iv-CI<1FW{iNs3msZ2S;rCDLvj?MO!F zEz70kF3rh#B0Fbk76o`Ndl4@6kc3}bP~TeK-WA)}o9upebMN&FN7#1og^}kj4?Tq@ zA+-6W%LA`mI{(U*i!WXp07sJxedF?(n^y)%hko_y;J{Odc6V&)Z`s?M+R~No>8jh> z7~RAMf@OX|(1sWr@{FE_zeyxDgdscF*#KuD$<}FXhd-0gjE1ve(SocAHVMydr2?p1 z%R;U2=VE^|hqi(a_$ElIq>B}Ef zPYDg+?MXh|jQ$2TuSmQfX~D)LZ|D%?!JqJ1$i*qBH}8FvtUiRt>--eGNUp(3x;(-{1(tri*shU_9DgCuzI8I}+n=#byxJK|5k- zFo(=vXq8zI4)q#2q{!(E9aXw$PfB-PQoU-rQ+O|i6$1?Qt(h+3F{~9o6pI*Y^~-B% z2HO(GI5a8i)1icfm;l0{jwC9x;h@G4pBU%GoS`_Wkms0D!{88GQff^eEFBXQLVD$l z6R(#IevgcI_%nt~j5B8DK!BN;pk~gCP0=Z-LA=h2LnbNR&2@3;Oj0wYO-?TWR!^#} z@_1zMG9KFn13$%j^o$mSGP3e{Mk5BBr;8W@xG&r$ZU@v$5t-f*YHl<|4Z`#p(3{1f zy{+`s$A+hZ7~7=d&`PA*Is!EXkB!GBMxGXP@AN`gQf?L;m_^W=&T?@fb`h97@p46G zt3i^VF?7Xn(ihtv63HMq!vp_V#HNIXY;$v24P9Ys1;WHoEH2hHq^4*j(|{pUQ*f#+ zXEZSiz%^K7v`HSMOcyXUVVnXd*RBh~y0KOiU1~kl#nc}+_3Mw4`t=rQ?QYcp@nhhp z=n8Y2^mcHg-Ax48pLg3AkK;5yecF*${h?MMtWS=fLIAYrxlM*218fOnVWvFWLT>&91v8qcZq8ugG?PC=yh zmC^VaF%mR*cx)&$x;iZT#-h=%O>B#%~LUI$`=^;FqiB<1zCot?|?ZQ0p{wdK!aYy11S$JbHGVIxP3v z`P4NlFLUON1M)d2TONQz;rZ1Q{OG+Iou2WGy-^a8muYa!to{v7b4fYB2IEc-;s*~x0o$Ym%xo(0H+ z0jO1fLjiS0i^Bk6CuQ27*P)PEYr070vmx8FhJT|9M9+oKaBR`puoPMkZ4Gm_avzdw z?de6oS_DJ#+T)eIA>Xd@;I^UTJJBaQ|ID*DCNEr_Iu3unGIH$d*eMm?nAPGypkrd- z=ET`+Qzu^@KmXFT3qu#4Nk{i@tU1!%(AO6$YpmT_dHti(OEZy)H;Tu9P&4|rcFEZ5 z)nh-7Ox{LLoMa?l?_})we=fK=Q#5g>V&X&U=(Uf0UjNd6dCvo1x%c7UyqDzX1;2am zlCS(4%z4RIfX~986+XkCQQlzlLGqu`+<-qrl__L6D|{AhXUMR}18}yw9Q=bV9#l9e z2tkv~EXm0xSz6PWu@xW#pT#g58dX`ceIZHI@aNK%Y+|^gXxSc* zRnFR|RV#uP@oLT8HObf_R-ETS@L7a4K&d43y67~mIH?&NZEBht^75dd?621dS@rwi zt6~TIWMV(vSb6h6%jF%Z(Y_k;pU3;Ehqu;V>#ymL=9jF_YxHa=Tk(YV!38L0ka=s_ zrqV(;y##WS2%Qm&u!0+sA4^ftM`o`ZnHt*(Fkzz3k%6TTfCt_1S(z<_5QEXkf|ecP z*voIx{beg2hapRXH;KyG>ygw@N(_Hi^=4K;62HwF3a&>Mn+$NXdeTIKbY7NF`apoE zqS44cgPozrjrlO-APc4A(-%W{wfWXSlbRkQSStU%h^fUW={+ z)8^`IaTdpTGMDeH%y8>p%*K<8=(yiU+&Df0NM$mLr z_{^ilhMU2~k8~6+KU$ZIH2R)IdD2q~?^VJKTehVp5J>s`@Mi};=jX$pYx2e8Cd`&U zt6|YJhVh`hp~dQNI3CiHMSP>6M0Xx!4v=RGDjcxr;>Vv*{v22$vd_YwDK7rZlcpuG zc!BD2C zo8iyn{cV$bJE-Bzh!0F2=osD8GD80I_WG%P?Ib^=cyMu7<5LZBw2M=rXgW{`f36Kw z*85?_fant0VK89$bHJuROQLdJD3T%10PraK8>C5B7kKvdH1;=CR|oQTwWr3P?78$* z&(Q9!_QC@2culBWIJU3S$Ua9Cz9^76?l(IRn#~6_^O+q3P4cso|Lo9agO?p!$+Nq* ztr@4~&zcB54>+Th@rk9%A6361Xbv6VoB`1sS}09gY{Xlc41+5xWTApZsQ1U3&O~0B ziBG;Kn;>5jsg3m1o5|5Tk%`v<(E@~B*jaJ0+oSxM_g1H5;4|+a3Ze<17vnhPE(A^F zY-=VAiB6oPJ(F7~#Q9?yN-3m5g4tl3oJX%7`O z2l5ZrL{D_op6-YYw1$qh1fFV&9NfNdp}Zt7Ri4LPPR9Jz zq_wmCAF|2NT1_Fg@Y%t+u;_e~9qo%n{HZE`8h?2xFw1Gj)|IZuqRW<ljP^X<5@m*j17X$K;|4Z6fAp|BJ3_yF)w3^O zKmX#DbFW-Fdvog4jcWt1y*T*F)$@P!(#R{b7;&Y(|Kqwz4}` z&;o)k^*399jA#bZ92wNCip>su7U>M5xna>XhvkMpQ9eMPMB6kz(cK(7;Y}1ehssyBcASh?LuQR zd8+z3PZN>wH@z-ug*Hkju;DPo$jBL*;r$klOZd+D%r#G?-ezPU1{LxVq}{1?<`_DH`t3M+$cYG(5i-9u z@KB@|Gcg}Z@{#MB75tg}Rk=FzL?sX%;--wgjjCSg!c2A3iR(vdUK-glHgIfg;3N_p z7fu`+dG;wJkWHW z8g{Qh^rF3;N}*|0TOhVcfd(DZq$$vD{;cGg^l1#S9U%@Ch<0+GEoWwsPejnlpXJnK zKIbAF-5tzn_j=mB*&UIh&a%QCdFwXs@9VodxbO7ShbGURd|~SJWpbWJpT9hU3baUY zXb~2TfBXzt(AOqTa(I36?A6Q1w{JYuRkO1#Qpf*Q7hZgWJqP(MRx&I%x?=1H{8NwK zoq74snhVV>vp4Z>TRs2XwLWR{>bpmq4dA0S^L%31NRsEPF8(-j@$IU?JJoE#FoBTE zyS(vL+?px4^kHoDy~ya>6;p4O4}VyAX(m*E`ibBAjr+dzIrKLk{>r`I_%d4%eqqs9 zfBnHPe__d2@3rF3%AY~d@aMQk__Hc(i1IUA5awnhzG0lXF@&87$d#=LYyEy&E79x7 zLeF`Ff61do%a;R($!#Vcg$D(>3ZI213r1#xynLiHz{s_}{E`)`!;ddRf&(p%;+1RJ z>rj!h3}SMp>8rs4oDIZAN?O#U(cd7UT7b4tYkDz$%IB%}ib14EZ6GL}od zl?^IRR8+_~IPo|Ha*0S)FrfFr`-+!70>&q`8$At?bY@9&)`OIh$UqCaI%gg5xej8V zmn#g}$dWkxnPn9Iyn!0jT<;Hpi$Thg2ptM4e=!4Rb_ zT+mb)ZYh953w-8~{Ri2Bj>D42m*^GgB{<}Hk(1-?9A=WA?P6;7IESp55@ua7%_4Ra zd)>`YBaPqk=Q)PGFYXv;F#);kNoQ!Sb8`)+)s>%(na6wQ@#lH1=5Rg`&fs4?m%FwT zus8kF`rbXCPwrwahwmvUoQPgFOh=eAK2PQ&50d;0fA&1EpmN#TzS1X-wG~Zmj%}-| zK%@MTGfKHF!kqWC zPwefY1~rfG?EpaooZ-);Ku_=Q(B$W#JxvE|;m;*C;aFXMk@Dv{Uj-h4&-rC&L8tR0 z6hJq!8|)Yef36S3IHcf*KZB#;)roM{-rlAyHSyYT@IY_l*i##)4sRUT+?Mucr%~q! z7NvvbDYhLn5*(7@3@-MULC#5mCJ|a}lkNOj{5eCI6)Zb=Ig{jUo%8s!n?eJSKM_7# zXCfc1T{I1ZQ5ytpHmB1q>N2$g>XbiL84@_3492R~E-5Z-OTO@N*Gay&WBWuYB_7 zG!HR@6`_@muI3kKZ>!>StBHl`{A*#qfuVizu|r!=@9r7dyJ={z;m^A_U)bF%S( z%Ijiz@rb9QGOtopIP$A0F_W$=cp1Tse0C>H2~>wadlM84H-E-f1TA&Y;m=B;rS{jv z1GOrz;V|b=T9Tg;e>Q3xRl#&+eu^_nYP4xe7Bol}bU|ZHVMBdsOIdbV){?c}$Jdhx zt^C=jH#=Zi_%r(nlG|+4o59Yu%;nF}W=(Ro*m>4iW&}6xg3R-Cp)&z)&g{0`+-cq;i$=1H{Q~Pd>KYxAn*o~>9e{yr=#p!c5E}wYug)=vlDl?0u zMyRE-pxMozahhyrNoqhn;q|e|@$WRe_AxT}m80(=LC;Hc`N$8+a|SVyDJ1{II^?|3^ESu-Vyo*ph5?Rnz1)3&ebU!IxtjwpGeDEelZzILe3qA!rVv8^Y7uJJ3$Y-EA z3*GfZbg}G3-!aM4<6lK+rO5^pPb-Ivz=ZW&I5|7DdbGQaEb)kej0?cAC&Cba1_7zf zn0g}RZ1my-oJ(W!cql*&4)H5x70_XzhrkUm1;2V6=?pNPBq3{<@<0OUNX;#vrU{P6 zXfpnwlPRrKnJ_t5CVP;%={PzQz6g*2resK<4n=?-axNw#^B)9Oa~3H^1=?YfQE=|i zPYTZb*Ye@-mYsXOX6l2giJ!!$z$|Yutl~$;G}kMe3C2eZay0rIOn?Ag1U(Bi9^z@j zrZ5OaTXk+si7Qq9%(c_RY^j}@vyB(`g@@2|&zxFFJM+{BQiD09u*fV3&k2Rwho>B+ z3-cJjv7zX+;?ySuL+`9U4}{SRrv_+ElR7b+)0y+?!+^&+^+Y<9o<#?zCPr(<9 z1l}5`u4&KM&T7DE2fv5B2Kd6!;xTM6wuW&c zy68=0aC>M!8SoIyAz@q;HATa0JfBE-AgeU#=`a|d(@_(KQ=3?J3J*MI)M1Iy(bUkN z1=f%s1U6k5l1~VFWoN@3|lo-?9j!BcQ03P>L3D$FID}!@I+8vu88K%Uq30f)I zQBIV>xp?#}I&9tL_uPlHGL(LvP&1T{!%1~0PC-0poh&8NNGQ*)R3c2$0X5;Mf7^c(zqRr7&7bekU#{;woG`gY;? z&$7;c*!=XLP7Q3kc{X`tVAI5zgJ+ICIdt@?3(p?D@br;WNB5mM+<*D_?uLe4>y~cu zdwL4;JHWYxfwm$KiOuXqIKPDbodtm|trbUe7z&Un&BlM-1^#X@H88o*FPjMhkQq%< zsbSHXoM%m+*8FD_JdpAT`!^9oCNuHMnJsXJFjEv|BSWoz%c8YaQlOEoHk=#;?e%ne zvU(!nj#zZNFQ(L({^Q3h3!+Qzxp(RBd~xxY?pgBNzrN_VzWC^uzp(iC z??D3E&7T!PoBU_lTaW?`Hio7{lM(F{WH(5ArUpb)gi(8Z)CJ3zdzLIITDejal9AvL z-3$T{(*X0L`3zo$LVHBU8AhG*prPRpJ+UJ6*fKyg2s*kx8=g#E;}u2?2UeX8oRUxt zRR#+~kB$BY17aJF9VFNR*D^6lmWC&%y@47Ms@IdlytZw^#f2Os;=Ov4b6yJKU?41XKj%07x z5e?ot)O5AKdU9(V1Wo?){NpdAMrD&SqsCp%P6d zCsMBcp$BCVmdF|kv$YUjg-T5Rvt2h`AE%>b!Y)?q?(Xz*wYtZVQ~!$PlNs-)=ONF5 zz?M!c{nlA!xbbYHj+RmF&;^l;n%jLg{!{#1TKLfg;fEe#OTPR^zg7Iu!tkTm59BO* zd{c1c!HV_gyW>M!QeBng2A9}Z?X*Gyvb z$e#A${!8iSa*=%w$jAzr;mqVkle$b@7mTt?U~MQ;onKlTjMfLM$bU}wed$u){*I=OXuPI4 z|73sb*ppr3PxtJpkHvG5+AgXORiKuP_y(xi$ZnLg=O6{_tmN6Hydhf(Qa&O18K)aT zYm9o_TM!~HP4UMBahn(?r8y9TKa+Y*lMrS$bTh&WS_2qOHmoDX5b?)geX{8rOj2YS z;uV2tC2GKmrt>3Jp|WaEqShZtX0I(+nV%T@Vf5t>Nk8DvX8zRVPf*x0NySo3*0E+U zD{zLg>Y>1A5Njqc+Cpg)b_aYt*CW9)xE42jcH8Eke>KL9tYIe13cosaRGAioyGVEEy2!+4Zc^m$=c)H1S3fShF;nu=Oy$cnksBXIFMrT9{@u3Wf9SgS_nm|P z*gW>*Cn-9iBY-Zd%G63M=E3$=kJ;?xZij1D6&wJ@sCC zTH@)&K8dxH@7GPd3sXvrzZ1Xov-k@iRo$AYd~v4YrJ1I|AJy&sl~(3O(aL}uOOkV-O6JVwfPvadZ%w7InmIGigilzs5NTq##!MnKPC9C~ zv*piDB6Oe@V;+A7F9VsALDAxnvt)KBL>(GWZBZja(6ZrXQ4@*fS&yvCeSA&+$_;r> zuz{e*`$Qg)nS^IS%}aBgVz9G!X*OjREZ>EorAx*+tGVHlcV<^XEt#z2Ts>44ZJim6 zOqQ~g42AZfTx}UL28Y(;wk>3yg~?7Xv|wb4*MMkkb=P#%042<1I9ulIS>~nKLmNO0 zU8vVTyurT`ndXk(n$275`!>~V9Xhn-#qsC)U(r`Cqx^i9tp;x)wQ=?AjZ3Gg)utvL zTFTXdTUSs0(M!Ys=Hb2cf>P-yftB;h&OLKd{nsEut6tHPb-f%cNZ z&T@VOuL%U!SEnxiZ4=)XP2A?~Sl*ZnLgdAVk09Qod7)ODv}6pR1b$xIDe|tJN%^BA z!8OzJy&iAe@=<0aIQU#5hW9Cr#DEer0z>gZ$H%5b8l`A>HCbWsPhJoC&y=!@KMh|b z5B5EF5rPj$3fbU~ONQ7T&u|`tVmK)ugN&>=NNwKQ^jr!M^iW^uh^L8yAu};UsRvsR zg&|l-azOwE08R4NOh;sqpz(BJN?gA7;#!zChg=smSc6rvgs&8Vfj~kI@e3PKUTy9LgX5$Nts0=1NW<{Zq$4v)42C6MBef<) znc14V{3G_>MTNucLMY2#IS%O}{zv6Q-%Ctl{C!~ezpcG=J8}7EA+G4#9~X3t{^sx9 zA3pV;d%yjQvXkGbIQI`C+yV1cmMC9U$n@--t*w{9AqDmVURHRn@KfXUsnAF+ikUNi z%Is+7m7K?b+b82FDb-~(kePd`x0U;%%OVpn$_YG&+A4ibVa_@fehj(kqi+C3vF#uj zJX(0@P5_7cYC+ z&cae-*O9#=jIHQf;uDp9t zMry{S7X}0BBst`y9MVO4@xYq})F+ceb=tlh5>GFN(q1}(?T(WGTIr&v&=IgTo>uj9 zE4fY7l7KOB+e%W~Fh*c-y6d&$SC3ABOVcr_?W_pU?sj^to(AYN7?4A*4ueQ+9g}$e zbmxBQy?^^_Ecj9m#8}}4!Xw6#HR_sX^%{EnhP2eQn?fsK?Re|KSEqmXK0%R-d{zHYRm6)Xq*UBF~KexK-j5Q8*_+#EeSHGT5(jhKS`SPj7Nq0?(Cd(Rh$%&YDc9u$QP=lQT(FQx~HigoJMu%|;@VR zCe_)HX9q#M;4^4clA@J7*LuAaT9r9Nk5zv|4qeO{+g+4JQ^TJ*9Ze{22zd_V1D}Oj z`@GbN?A2$wt8N`=06UZaJl2;U-I~6-w`On5U$QVihV{D9WJ-_AXgO zl4o%7!pfD)$byzjQy}lnX$W{Ix`&`TxgrNa=gN9gh{q{8;lX@aoIpNV&;~&}AX)+t zm)3lB__IlRC%CPpaGSA?WXFU#rMlQqQ&#d!o ztFDG!L)YTSQe@W6F3Y@*b7BZKNLgd%H)W8o9qLyyEb_Iz9MAs`{%psbH8T8J$n!5T zGEeDjUl)tcf7pDJf~d>G_dc8q4oGw@l95#MMY-_}+}nZ{ z2mE<(d-LYXh>Bwfb`GM#;Ye*Le75`<`0SMY2>cmzoFe}@MAmeSb&h#_O%;XxE%hzs zk=kPax&0jzhkNv;cTi1Z_G(CP|cykr0alFk}*N4TUBf z7J>)#gYN;NQL&EsHbkFzxa#14toruHRnu>(*oFLc>f+DJdzI)Kuq^utTCl7(@wV6| zYbeLoab$2Ut}eE(HYo#_KT{FbV8cODpk2W_4z068nE~zT+=lJQ-@{s%u)8oCxzja6 zZ>I)tBjOsLd?$M8y|PR17hRhvxi$lHF1z_*#m%2buYHi1elIn8Cp!H;5+%tAp~}^! zV36%R2R=igCvT^x-maUzLz)VucKRJDQ}4}|X+hJ~<9ARvsUCYLH7*0fsFN@LqUyz& z_=_|2syqB2D$`FF`Qnu;vy&^AS1(^$yLL5STvoBo1mB(%kn0|mr-H0tPYvnKs2pPh zW+VRUYF{;9IzV?-*8=@#m4N2)K#n6?P@B89vAMW-@?f>VXLcdn+k0W(CTb)&F6`?$ zzgNUGkcO5F=UrVOXlmJ-a65##OEC4Wo(p?6BiVsQ^qHNK_DnI(zVo}cf~HA_KHJxO zx{t^$XLfBJ*xUDfU*C?#t{QgV&Z(^QGWlxwdD2^#$WK>=YJ@YB)NRl-J108)*5EeGks?Rv}vgzYn-`HlfbCkNPS5QXRKV=Wbp;qX-)NwVQ*~!lJL7yLD~g=G8N=y>R}u zYiC}%bpH7MBk8iv#>&pNXm6^xtH{?WoY~*T*C-YF9X96~?2MSR@MKb*HQPCp#%v+8 z8t`WfpfrX>(?#LNs{GEP{C0AxOAFdd{B7hNh4LGVmU)VDyOYyDYgz*{+8HPW@U@M32BnEHy zT>EKm$H0b?t?f7NbpFLm*Nwmb+8^Badtdy*H`YD6u4-$+@$c{}hKmwNn4w_|s1wsO zGOVruhstF15Y8#*GPA|6^Tc2Q?Sz3yI>>CT@AbToYm-?7x$w-F5f}=Q^lmbgJ}2sT zb1?hN=v4fx ztdd?`8L2Z`7F-~0-TLjhAfEjmtOp?sCf_n zfL3MHPGn}wNc<8hY0TfHm^G0^)siF8<=P5(!7Yb&r z`Inn1we|T})pI_Tcn>eJE6(#_Kq5vFK#-I>@trL*Q41?7H@e@O>0XQk@ z(bM6_z{w!gdWgry>to3wy)=d}{Wefzv^#fAmtAUe7CI77D;@D*IFYQIxfXjm8-Sr< z7}lvH=pkKnVKq`Qug(e&tBp+n6XREgeu;q1OmOlCGY=BqhG6iJ$fM<279B)u&Zvf- zj+zN`UEC4tCq_=BUyhi3W}0;J7>ulg=wz51PU&kt(BuKmd^oG0cx&iM`7_?3qvJn} zjQ)@>C6goX1%_vQ7eA^$cl()g2oKqUq)o(7|G8R<@;O+{Pg9?6W2#iU!OR0ee9Wkf3f5E z!J**vM+MXGmX66cR{Cp2SD0T)6xe!2k0 z$#VuZOEKxPLZMAsH3p*4iipv3R`{$^8}MiJJt!EA3BT3MXZSO)T5Frw3~ILIS!Fl0 z293J-vm`<*UWOsFr=EkLO=7e9!K7N|9Wpp)2Y1)Op92B%pV2fXRT#NrGNKXdZZGiM zI@Ec2cM27bi5>OhI~s28YaHAXi)}zAWkbC;Q19_Z)-3ld5ClyDGAs9kVM6xcpXyX7 ztymQT=}=Ikl0l5NYVd4)hQSh#0K)8089#$)_OBSOR9G3Dkux|E3azarOCL#jvbj>O z7phDWGO%5CUChgtoeB+?*8FpY&p>`wl66k|*mf`|qRm10v*Z@+qM~{u0j-(OZtSe^88lrJ2qMeOVRJD#%;05})X=>JWs^Y)c-c*x-L{fvTWkI^ zIv%3-?3AKZzDPi$2#rX7-l9dypW(@5HEaH}kY^Wmb~2xhG&I`|a_FQsq`J4k*8L6ZorWsF>C5r1wT+u1n0tA#@} zI^fU4d)v=$ZR#qOo&JoTb9oKP&wj)-%C#tb)`VwdH?*Vzk(zuMvVqm1s+s_tKLXHe zjgYk_M`E47CV&n}8SI+0XOM5)8>#YCB8_6QphW`Ojh*Mi zXLq)9CePVPX(r*BBxFfQmZG*(Yi_gINpN;QK`ZZ!jI%$=rgDC zo2{vXWDlC69(OJNv9|!r6lgH{jj{2!V`Fzn1t-x<$obeCq!`8dAJWNp5>xL2sL5M4 z3D58H4nlD>H{6-eBtM%1g0_XEM_b_1Ql=P(l<9X+2+^5KV)^JD4lAbKuekPM&1*A> ze=}2g_TuQ0wgJHBj1V&!VSm`?eN8p2iSAmlb7LL6{re|023 z9`n^gq4{D0;9Tj8miprrp+se%DuT>1@)yJe)7}lKwt~Ra;g$=Bwx8O83P-0<=>2_z zdo~a6+c>bd?cAO|!O^liVdvSM9p`p#JioISux!*hdd}`f^SR^n&UR{%>DbwOZr7H9 zotsbZ>^`-lD9+E$9XiG(Ri=SSU2v%TQ?GGYlE{99WtAiTv5J<$0~_8#u?aG}lI|Vaam_DFdI; z#JC$l-|cjyGc0qSX8@BOF1_66U+(iQ^HLDdP(z_HpqR{O;m5MEcUbBZ=Ocv@TtB%=MFzNaq78) z+jo_sQnsN!Qeeb1@>^zsvtiD9Sc+nXfzQgBEo4?>{vo0qWIp>hqU=#o&|Vaj%?HVX zF7i|tJ(d+K-&_5{8;RFu5P6oQL_vQ)LT>>+32V}~as@v6dd_DT1|B|?^xfQP1#uYG zieF#-tlz%$@dD1b{;NOu*T447 zFaNLcr~jnog^$ZG{Dj{itPHGwh3{2K7*L7NM!8N%4Xnfh=_jJZ0VA1;KIVg3q@g$bYko_ge> z4AIr4)0&HAl{9IY1;J(ner(MTuYA{FgIOreaAs|pJT>vGxq-kCW@j;RQc&&SymTjk znGlTVG%ZFyzscF@sOX{>545+s4qT|>aLjyRM#^{}59KB7}sgWFNfW3+OMA=(R7=5V~ zgklg+P0^v$AVzNrljp+aAva$l$m7A!iwnJC>wtO+9u)@E?u)ze7{Sg~&n}eM%!Fw( zPq|r{$DWBX8i(}KVf9ciR-JO0<|h|JZSBRWDR}6j)0U6Z%ojZ}8S@EdS6BzJ)6=1} zFB8Df`8)p1=cmqG`^wzR&m&{%onivokr8wdx?>P;=O#_2mp-Dz6XR~hBTlyH9r`gU z3P>xYM&ai_Dj$2JWbCIUV|RjMGl9{W$oRWWI(hMe0d!Xv;_j~zCfGL+d+0T z>K|x;Ak8705|ZHzSoTW(vpWS^4+A+W(?M#qs6eCC0e>zIbjPCG{2TUm*KE5wy8Xg) zPhLE6^w#7#l%Ewr8~%J6{(NQJl(Ey7Cr*QCjjZXJlF>K$ z1ug%`V7}YcpOiVZS$w?()Or&&KyKVGSMV}w)*;d!*m2I6h%kaqZUbI4B$v{Q^Uhw5)wRc)@3HAg@LbPQDnCX4>F*+5XVH3ELo=rH^l z1kHoWBMqHKDVjaesOi#)G+|)@PFQqjX$g9v20j~I>raBuI#sRpGW9~lLvlD*3K})C z8xDdtt4*s77Q>MLIUch_{~aD(Ra@H;@L1a#8fFhMY{&nRh6`Ei{dMXki{>1<__N!u z*m+*T5r~!%7KI*1`T73BM<3fCU4NiB>v&rQ;u|M7)^!!f8VXAh!7%)} zK*_UH2g0af)C9ve{~3cY__LMQusr#nF$&A)1QeFTpCt>r5N!%k-bjZ4(aN6-;m_r( z*XKO=AlcfUMGuhMEEe`7v;UhqJ!DXI>gv(W5ONG|k)-&p_6ZxpV{fMfuB_M?Pu3L_^(IRY zf4+2dYkxzkY8}ekh!Ibl>dsOP0Ui|oeT%-QWxJq>}+8U7rMy5X~=vzj6S zqTy_Imy^tAHlB+k?MphVNd5-mNk3`KQJoA~(<=WfXxbOCg+nr{4VT7W7WG!ffPMkF zoU}i$Zuukex+CeAK8j!Yc}x(i?5M>%KE6E!VS*Ia00S=pDyI|182B_iiXLcvdWJ=?)oY}Ujhnes%)ml7O*@}n*GHjAsJjuV)LXi3~(l11UJSV;H=o0T2EvT-9~!)Eh#2JS|Uw$ zboJDoIRBG4C8rixG5$89uMH#oYyX|ntG__8t@hQKhF51=Zhp`*_Jf+k|3_)_^F`rw z`MN;isx^`2E7I$7`OYO8ibsMXz#n!L1i|caQ}=uxHc7eVZ=q?FBdwAg{4QggD55 zW_LnKhen8_ul3Z9Hu9h0&(P*`ySJX}-#pOYb()Om9X%juptQ+?ZacGm6x2DS&QDbYFscVAK>hX)y3P8E&dAX-O6}k(g}|^t$|2d2CAP zc|4oUWXXtDJq?@QoXKqlAWJ6mT>ssNZvJfHvjNV+lVQjTjTI(406C-5Yz`GoJMdY% z%p=cEFN2*S&kCR24B6Tk4t6$T8h87()zqnAPLaJ+p^ErEAP!KUj^?C3GWTP0Ra-GyoCn{(1=vDq?J~&GqDY#&&Hxdan4|8%e>*rfJ<8*kL8tQicYO6D_BwL0;i2d6Biw+E518b*>;e($F>U} z*Y>}b>iS7-7u%e@w6+^qu(>EX9{k|Iu+_}dkKGS;&0$?tsghHriKH=@m}m;BW))0f8DUifs~ z^Z(fP&~rSzv&pF*A?*#*8WL;mfEAV!>anC#&e94$-W7)kW~?MD);}_9&ZNmxvTpoee*gQoOs((wzZYE^ zBM_Y{WxL2Z6iHtUiP@oOFer57$Be?E7tVSP$spa39581mL~iplI%|G76QPl86R-GyG6ba};$dd(0RxqM_=PbqWu6_S_^) z2SK6If}b6UQY)Kv*K3w!yVnMW0ri9m>k4v~nc6bC9Nji4BftiSxjzDQ6DzM1Z+bMS~IHXc{ zI|dwLX=~!ZCT6@9*urM8Dm9$qkmfqYSw!y-x`LEm!Hg#1JAp%Ff{mO|DP!FORQh31 zPo?@*bG;l`0YK1W0mejN)x7!2NZg=om<_aacGrdv+ivK zpBf=%nwQQpNNPAmUnne#dZ7%)?{ev=Eu|FNYLM8gk{X(8j`B>sDjAGwOvwx^7>0YN z@^0x=Q^qX{1K<=T^|}YVPijEla)Pls;;bJ42CNM4it3$H7|R}GM8>K?#~wc%n(p2( z$4Bed)|$JO_0(9) z$xmBPeA02^!}ie++6UfgIrehnBmYm$wjUQP?q5*#U`}jJZdPYxPF;L_14_je{rp4=MzjU+u}rF*1zJBY!ot?!N99 zZtoc@>i(I1T5(zX-m)LH-Rp~M%985JUZ>>7aJQ(;u>2L0`S1em()Wm;sGp!uYJqi5P;; zi4;wp33;}S2wfC3fz5DZWtKMnOnPU_9c?uhca1lQaWw9-c~~aubkt#OLZI=So6T9A z(-1+ic;hsMmK+cbhOD6tV zAljEWgfp|qtSvLbt$6@evo9e@Ct}Ik+!%26^p^GuyIKb~whwJ-8`{(~vTfnu))ts; z<$`$@IzB%ay?V}!_>@V&VaO+x*!bs!yv>S*CPsQ3LNUY9@P>MHpk#Ge`J1PS+|)%G>sQZ@eYe~5Aw zKn{&6T+bB`Bohej0J1Ugu-OFi><`BgH2nFtTMKbQnEIW!6yAAj-j8lt6q&oHa`uDu zgmiz}Ca zmnFsJUZ*}RR?k@{2A`cc{>*lMCe4W=i+@fQcc#jUr_IWm^dsZR4n7-p7Hamv&+ah$ zCh_Mf>Wv=!DaDQsBi`19J zLZHKv$+*tn|(PhG=a|w2rJJHqKb8HfvV%%xS5`huY7N)tvgI%H_Cd9VYh7 zV$2ZnXN&$NiJT+4o&!%%boSbkuweT8{iAeecQQ@(rc)OUkA%D4#y3F_+Bnm4wH; z>=wmw~Sk!J3(idd6jUg`^4BXjCk)uc}CUwL@@Jx^|3*0+1j z@tyZ{?OxxrXA=ne=#Et&=q@%Wvx4a zdW(hLW--rCZCZ~3@zoapyls_>lwN;)`=+kF+mG$rwr9nrjnh4!2o!i+$e5h^pMsI+KjO52@~{2ON0-c+=> zsbpzG;iBe}MeK)|dsh}=&jyXBr%W8iXgM&&micKOpE4B zjbu-YE&x7H&z*NiR^hx-l5gDGv1vo|nx4nDy?EC6^V6e;;m>epF=xV_LC}hYrUr$Y zXHNH!g5%QDPh2{4Slr0F=(|M2rC4xb-5*#G#hi@lE>y6=&q{1qih5^gyDOsF#m z+UL{AuD%sIni?#m3HVj4{vTdr6wHK43G@-wetSU<)a_BUHEABoEg7=!wuj0H#bbX>Bhvu zr{X*Rw0z0N@{-!lhyJ|z?9Xbu3~%5D?gd0aLH}t#g&4zysFRM9tjb~o5Tuq#k;TZ)2 z9Km&o9qoIyanRC!S|Snh3ET8}{Ip0&Z1BM9;SEu^sn{dGAz}bvG=S_@SoRpBAWYEf z)|b0vT5YZ%HRxvM7^4MX54^#}q8BVJ+}%AUV_?^=_dO!gsWA{_yyfMF-k0mUUMVDx zCEEv#@-gvR+ws3xaq_i>vp*+6G~^R#X`Z`ZVJXN_;vV(5?S_YQ#C$r@uvr{c z(h5pRNj-vFE1x+Ds%f$ zudq^1p#y|5FdEL#XP?CFu3j~1G_-&4^M?qH(HB*bq>()Mx z!7mrs>nsL@*)wbWAavwh8G`oImr5LZ=FB4SO95fhs3vQeN$PS@qfeu_gxAli+`TKR@tIE-nf5xSZ2UWd8_x-?d17$)|7Z^4fm>Z+mBT-OU@6l&z$pVC_dr)a|ElQE^t z)R9{06gq+~u^3Ad&1m&MeZ z0}4)f_s}#oYYyqfx^w>Ni$k^LOCxSEqeQTwp0!U^N$UK3`R)5?!Cpm&)B;Vir#i;!qoID46YanqOtkaQx_c4inI9FsI)#d zc$X){4BT`yBW$pzChW&-dfp;BRINB`X6~A*UzST_3#RX&C9N1OHH@5+_snn%IitnE zms$sPs`22EUNmOvO?Pi@Hay{OChp!Sc>iQ;fMyc!^Hbw6S@L*WwjU#EyNHn{k@Y*} z?&YQ&3)S847WKSU*84h`n$K(SBe^^9ZvoZaZ`K@lzo~J#MK4K^POd8abQ5v?wvv|c zF4WNdwxquMojOuC^uEWxBZ*OAxAFAoFB(sL+%$Tn<&@Fs_NT{MFMQfI`peeiZ`AGk z>*B>jvBE9M`E7->YLYX`i|3_N`E4owwodNo=+c7d@_7F8XzsEwfA%RjP#kSu8P67i zUXjQ%a2?HBR$92ayli7Z_Vx$2Zn`kA@5zVnA9(7~GlP$^y&&Y-3-DR|nY7O&Iy*6P z=ub}W{FCEP7WDl**8OP(dt$m@hwTP-OC2n@eJ%$d=o3!ab@8V>e0CQ_mvUn1-rR69 zF22>ZiZkQpxsH4ef98dQa8q3?6Gx)%*cFwsK-}^f8&mibq;m^PKb+SOCT*aSBm%%=Op>)t* zcSPFQFPq$fpaH*NOsFz&xN5-y_9Bemc307~X(V1YAe@sA__aXgoGc|+CQAnYXUBPM zc0P$9>gMH?Or23SeU@!Rc=z;*+4G1`hBiZ|5lDDbG|9l|-71M~hAPJr@Mjc@d3NG* zfEa0Xit%dB8m7*Rl5hh!ObY0#xdcCF1CT4{&7rhh)5_gJP`4w`g3rqAVF{v<%x;EY zOi(keEVSF@-w=NWLBpTH(Uv~iPFegjl}4U3d|R9uRxJJuCHDMTx<7^DjXBj3jR{1% zQ0;tSXG`_$!l5Z$b3@Ps?y|PDwGe3K;)urJsH|H}cJ9`?)N}inj&55xy0vw1b8Gj; zwzK=%9$QpeJZFA-E{RPHq{CpVW>1IU86Z`zU{@*ug2&6i=P-X3QV#Ry2@%eCi{A2s z=*^k1XF+U-qs44J{Pc&wMui7^1dT$a4GjM5&NgJtB|e!6k`|*Qm28XJZj2<~AoGS# zpbfoeL0D2Q1fk9#=*3A_T2^OE>`V>ykbmXt<`T1vE|NS3e^&ktf}fWbC0ADz-&ZWGxp7_b{F%t-_-(hO_z8m) z;&)9>OrFACgj=c>JkSt5wz{roZD;@1#g8p*;y?B9=gy)c?LR2a3~GiyL!Kq*)L=mJ zXM&T-&%7vA22W;dKg0uPDbQof?ObR(3`!OkS4u#*CaN#2!Ukiov+?IdDbk!MZA+E5 zCreUy&d8Z$sW!x)vps(XGG}z)vx$*s!k%w}KW97sY^`qj0rl0{@nt1dtwr^Vi_;yX zhR7@3w6OV^2iKq64O?Cbd=`Hef~JH#vm>D)=xv=Of*#zpW@zWi{@qK4_N_j=wzIXM zxG`1Rny7|9lhWBhalAtOSz*r;_;XW%@nNu>AVDjLM17?Tk}%& zIWhZBQ1;xG*|#;%zN;}STD9>)^RrhfM?PXZ1~N`m555Wi>>PYwq~bdKIg`Rd23M7t zkYm1D`+7YHP*Nk^p9+*rD+AiZEoT7rgeDq^eQ9?Af!0N+mkB=2PsS~$tZhd4Vr*ZJ zuMtsSj4jUD36{X>j*)jk(|~0efQW-k8X1gCJ>JBh=|yH=TnadQhaNi{zIFoEZW(-& zXlg>N*&xP9*U;tW5q=c7TsvaVca6{w%VTCwI!&j3*>L{K;^(e(UizeC=(W0yr%MZ0 zmCq=yo|fAMbD0Vj_uvlyJv0pu6vH{Tt)md{22i(1E?_|uvszBaAw4UoJqd1jRa;-i*i+1#*al`LoEg5cCB83}=Qsi$B*Fv^5lT5(1qr zTHIK;sI7cSB^knQClPe6+lVm7DD-vXoTuj+dCpL1&!q{L4($D@afNLJ0|~=qAIu!C zG<|w>;;B%C^SE)SQvBIt z82p(Mg9UfxfT^?Zin6UFS)f;^*B#n(&$FY4FPuEgGtqPBEan*mP0TaQS^U`}Xu_VK zIdj~CqR$;A5y!LVx}Sf#=hWcA)5jmVbmHJ>_d~;n4qO_1=;0j?6lAX`i3HKhKCy;R z>0FXnhKMtRnmujyHEcDgO3LE+;_Ad&_;Ycjs$^=iq-|xr{r2c>cm4Z6sDJ!Ix}ziahhNSA(Z4M$>1glz zyM|MrrjNg4*&*D+W7w6PQ`$S^$a|FbK*wf(8P<)0&`_4a<7b8)+551YHT4iqOS{qa z8oSJw6Jo^PVSSg&``9+#P)wZ5j z8~R>@(`GjQGuS9-Lqmw1$TJP)&?!ciaLDku94L@IS}}Lmiy^6CE)JMb$uMZBdK)CD z)_53N$Qz_-YCUtM`s^4# z5b&EtS^vw1M*Cj}Xwy-}(Vr-a&)ANO7}Uy}a~GhCH%7>K5Dd^c<#pX298!rGVRro4 z;4{t1{wh-Et`ue%n2kFHs}bsPBR2{sw54HS%)>jChi06Jju-PdZ*=1SLq0QR;%D|*daYPrl=ErVe z$gRO!XuoK)rq7bXpDj}dKVC3Rg7DoAfVzd~UClKNO6as*GB-$0sTUz)Dm5=>W=Pr9 zyj*tlCyqH=*fR(kV}_9#l}!ZQA97Zm(i~l$DLGV)jN#9SCXRDPg=ZStN^*Vuo$Ri) zziPTP*yysN@M;b2DDgdq`^-ZI45H{-tF0g*I>ISD;2cpC&U$;kfpC^X34ahnkueIV zQQDxuIy${&?BsHouw=R@desIEXCHTRHl9ddWC^S>- zIcuZUFJipbGOHJMt2tt3OW|Imng|`CFl(AyFK#7KbgTI8Fw^w$iNe4rH89oC5VsOD zaLm~pX5OjB&vJ7*_^)*nUZy!SrC}iMM-zId6(hlqb?10BYp6kLMvTOk+MSY(&T2hX zqY*L%6dZbQG^BSbdH2v0REv$PunYSo9x1KN9g}H4-(Uqy( zRRuZA3Ue2QnR8edf6gS|SRTt>N{y9~6*U$2Byx7G>ezU0Xm{VihmJk+0I|(yhMusr z8$!@7`Gz6rezI^pc6#{Ovx9s8`o!){{r{QF8`T5vkyOy`6Zig!Vn6n|&l<1jkX1!6 zFeUR90-Xg9#C=|jANqPJ&Zk^iIpOStL%r%JAm}h&{(@82Gn>#OACVdUe3`3kduP}^ z^Ipk?&x(8gF7o}~{J~dm_~CEfaMQp0*Hga#&B?$2b>g2rf3_?fjz5zHx;a(=>=o|~ z0-=NS%b6%>h;&|{!+5K6bD+?Md~>r2!L?x8hy^MaPM^uHf+aI%RLvvm*b+X2XDvBK zPL8E$cKME;+VyDQ1%hG3eb)4GL+_R~DcuU8~ z_J*eqblg)>S~(}LIg-N)5dDj*nz=J$nM52$QymEPSk>6_NDc#H{b6o}>&m6SxZ8h-}WPMK6YZx$iSE;(~yN0Rll zFlO;*5VS<_nXAdNh(Bu&K|-Jv5lv~79(K*0Kt_}pnOkffmKGPmw+%s;maMOh%F% zTW#mT#BH}mZ<^e);I4i3a~@q()w{Xn*!s57t;-%*m?nJJauFB8ehZB=XT-y2DeMnO zA`Zf#+Y3v9#$adBW6@@hno&G|7KILjXfqRkF05Jve@<0mEb^?fDPCeEHc}9qa+h&t zmv)0FXe6M`LBO*k&kjDrnaR|F^KZPVCOf&fsJg8vy|AdEJyp|? zU$T2y`^5*=oZK70XZW*%pDE$bWPt`jca!;f`@)gEE5x6Nb}t>;w-Wx`7%xnx>MYxa zODhrZ=R|dTL9Gb01wWJUIRRVFh~?a3VWOHzmu+2hvtp)|kpUvTH3MZug=_ zI61o+0-VF50At8-T7=o<(`X>38gb+~T!tyMsIm`u4l4n6CPlLe@yu1V(Mob?xY%av z$OaH8Z;TW-MvEG9l8s1KykUN{ZfWgCyCx21j{~pGTg(B?e(#y{jfXHp>b^%Im>* z+D6`QhlI1ym`e{*JA4_PddpBfY~LiwW@g(ucUe$$NwX$f^(heQC!Nm3htO z)3d8)*2Hn%o7Do{*4k+Uc?#m7IEP@6p|x zpWM8J$mjmu>yGYT*S*K`Zv^7Pp`p+m9^J791pVaZRhH+OJR3wuJAo?0qRF#y*kYtD z{+V>pPi-YGdVSY!b|GAIn26}@>$`T{+qL7K9+>vddwTY+A9`T(k)4~@H!UUqb8&Wk zX?|Trw6QYQgm@6G{2PQlo48Zr&tY8%x)z?CYDWOe#+IF4Q_xbIA~lEATf&V(f}cCn zg=T|7{4+{jvb8=%QjWIvilxO_r8##l$h$i$F*D!uXQ(o?8Rk4e0;D`Ol!zk(nKQIG zh?LG88iF3D$5*A=$iy=%E;EUN6Gv5#{`QML_l;A5D>=r}qf?)kIo<;r7f0cQ`E z!-v>o9GrqbOTrXdPjU?$eRlNFxzR(< zpFRG<#a?JLgqh^eh$qiFB>%<>m%1*UK1LKYAQ}oyEHpNxF&yc>|NO~=gHP={d1T*- zp8ab&x8%)kD~*yaV`W95WzQhInNVke07JkdCUYP68YG+zEZ^`N8huEk?J zg2L-sI`y)_4Ex~8&b3v#3Cy4e_PA#V#ZpYm##O#SZVI}yeu1TDuT*b58_AoSlY4jT zqRpEgJ=W3xO8QSf<8Lf2kNk%vgMYv9`76z5e$g;s$&+hFh)E+V8}w=p=>`89p+I5*=VqL!Cm0 z+G(jV^GmIfbIQ+1vzDdzAW#X808Vm>zBolk=#=z=!un_cWPavmAO!~@vUZlR=dRaE zdVgBhZM*VSAAhyH&j@5$&l?1L6V6R@;%T9vAQ1)z8S}1C5Df-O%yTg#!KZcYgw;l; z-=J%!_$H769_?jdBXr=);ED62!BYu_!nrXAHyxS?q!`6=cO&)YUu4pCCrf=mqhqfW zB1{k+pOk^(Zgnj_PRuw{LnY& z{bFX8?)vKLdmhdue;h)>M8b~KU56=MjN$dTA! zoZWU;z-PDv}9tZSti;gd>E`4Qq@t04oLLth1KnJIn{IngPa>&+G$8lrm} z4U!U{wAIQ4xK$W-q`QdbbfgQR%jz$#P0b;3T^9}+01a`1H!Y(z z_h~vb48y! z(d+ro5hS_i9e&ZP@3P-D#E|V%VCeM*A~g7Q0JGyRW%SVHwo!8T5&!&ldEdJvk%nE< zmQZH`p7{h%lbD5==Yh-i+0=g-vEb)EOY~tEWzZBGs(YIyfEK}dW8eEkfDjtZKNE?k z1wPmGeNff=p{+3c|8`rF;o6apYR+G&e%exhq`NLxu79pLwKX-jISz=0p*DfFo8WhFOr z5C5ror>4tpV17;De&Cmd^5@2qZM*;IE5Chf-s;Ie{P#Jxe1F!Y|9R54Z)*a%V*3+%4W=<1VNJv8sJPvZVy2#83yo~N=68R zrfc#-!=Duh-3Zf;S`4s@d5%JQ83r(x-3-ZrOc#J6<%vW*(`%`P1@>5B>7tjLPD#BwfdOP|=;adunh$hO9T%}pnEwx8d%WKl9wIy=G= z*?j3PmRG-EcKp^G^CtZvn+6&Vy*jM-y8Kyqc>))ut$4K|SwULoO^2R8dmKI}YfNqzWKSPz?_%koQ=?9g}n#MB(VpKPM;O5xMEs4JES<)X%toapjS9 z&0U+@&Td`4tEr)*ptilVq9a)@&de`0LeNUS;qq@3QIe%uH35H4RSGX(OPj;MIgFsg zI#?Jn1YKATa0WiN+SYre>1Yvp?Sfd|O}DY<;C1-3@@x?5oC$vR{5dk|rtF((}9EgKYKgP3uw zmXyojJAq>1elX-)z&ScoIM9oeh&x&oXC9FDD*BEW2 zUx%IZ`7=(#oc!W>1?7?Is`BO4&3mhscU5hErtZN1(ZFsRkN=mZga3duJpK=LkN)TS z$No$D;D1Fr4*g^LiGON(@|BL`?=dcwN5jAk^^1SoKmUrPx^)@BmXq^o>_%1Dgz>4k`tf zU306k*xq zENmsaGMOuCA_N%MSHvxa1!B>~)WjPKBkk-N_t>(=(+9U7+PR^B+lp?sAl$vKXU~SN z-D`=0KDKl9u^nr`%g1-G?b^GR1RZ2@KDu-D5esZyPUN#)h+Xi86^v4=m`Ws+K%wS1fA+&vqBCV(2Ezg zR&+*Y=H=WqkErHECjJ=^?ErFsp!22!qS41C3W64ep2(la!=8npzW_d8g{Fyr&LC(H zpHVC>+SLm_djuVZ&%`hOI3;fte3&ksLwruY7VBL|wQH{{PHtY~Rv(aMS<%k8XC z=W9#Iv!oE!RmUF|H3ec?*c>7Roys!x1SePOKN%qJ!N z?*rK?hhE_cnuLd%7xQzpE z5*p28HF5H_11}R+$KntwPg|VBZ|%v~9)8_K+!)Xq1_pM$sCUfShQZZwQEFD1K|?sv z$Qc7oZ2S%}xuvj6$#{6aMrfi58qX1JhJf*S&Pd2?Op0a)2{F^vWP)}T9I~UKxylTT z=IAys(s5)cw3<_|Mb=={BV$A4LF1$sNUSVe()hA{|QYa;&~stZoZGxi!bDL5S8w#aIxhE6>L z)|6?*Ex`@1OAwU3miSjohcUWd5%%T5-7qju-56%(D3IMVA?AaDoysJ6_Quq618ceb z0GJp3+N+Pe6WnjE3!2auPIRjnWp(_P8jLkHdGI6W&|GCkPQ5$D)v-T2@KRz%*l1oT zYOebPT{ERQ9Z_;KGX|DdW_S*oxEF}l!Iwl?04FtO2F&j@IALLFu1-zQM1b3BxOWeR zhfj2^fE4rTUeS~^=M)NNtdA`b<8cORqEYd?3~x>$kA!yo#^^<8(@qFI%NPh zHOHTEi0GFc-=julPBMrOV`fCx2rI+)Mr!oVfEitAoaiVT6(xOf%KQk1_q}bIE8Lrp z4TGua=FxkRyCT-yhgfIcujG~{UgT5ta&D*GO{hiV6-td6;ElKX9!B^MKf>}M$d8`9 z2`~}xsWN6Lk1;l2Ve)L4t09JGYsFHKodZj@FQg%FFLpNb2FtBwACd0YMl3y#HQhe= zu(U<6L-(tMqH*la+1=#!8?;+byRv+U^uKS5%$o_z;s!&?jv79TN3K+y9;-X?apS}P zsib~?&g`1}>6L7tOe{2z8TcG^qFm4gIj%Cpp9}I=+x~;_=g6}B1VvW#DaYjm!%t(dzF{2dh>s&Yb^x$C~jh9;kHraRp3rE5iRQ`gqJ zf4+Eo-WKem)(NvCg*Yi$OzaM~9|-uQt~vQZ(}BNgIQvG{flE`q^R3%{^^D@z0(=-~Rhw2k?4P6twYY$9}=T0fGknDz!z_5_Gss7ZKodLtYk9(6ByB(~*-; z8ja-L(~4%yA{LsEW+*iHw>HaiK3m2NSaH8 zgqGN8m};8;HD|$)3;Dk@!+>4a<|e_y7ONahV%8eBWX=X)qsDJRsR(E~pwocsNCH2I z4Qw7MpckZtQyqymQ-VnmnFW^l2Eb`TB_jTeB_awP)&a-{ zU?JG?D8B_Pj3*W)k{!vymcmqZR@U}(`cEHOKC*q;@Xm$3JJJJNnosX-8r_m^UXZ9< zkk=4reX`plxq#gI+y$_^$W1>GKsKQ20BI1t?4qCzv8pn|U@Zzd6yM8P&!s(v^)*=f z$}l)J50kIMMFSf$D%@sU78+e79rWZ$6|-g%(hM$MSd=2(+pfM{K3i~$WX`jF9=UK_ zi1t`=VbaoWEOwcnQ6x}k>{&OOAmkY5{v`j#%96s4cpj)Tf6^amsLGfTly0WM6t3pa zg3m$e!Fy({Y=RjXUjdin+SmWHl`tiqptD>`rE*o7iDw=+W@o_A=77GQ=H|iKo9+`e ze@?m#_^?8e!=Tvfpl=fws5}mntuhFKmJ$R!(=VtzW2{r&)pZqyM}6$hn~UzaHD}V~ zim7)VXqfqMbMdiNE!}H6`Zsrs?(Dd?rnaph-BDObN{tBt&z?V%^SPy<5dNHw7IYMp zwkOKq#z<#D1p&;`RZcjx%1jCl6o9h~Oer?$EUE%NlW@a=pNX%Imo&u-+oDw!v-5H% z-Ac|4BpmsyY#Wq{h_+LcOf3F+(k+x(H{BE=`1$5ZS%geax}_mv{JE{PksKprY$js) z;Jr)E?O$S1qZDRW=pWK-gRe zwCyJdF>XuMw@b&v8q;A^6;!OgASRte!CDXa)H?nv+$QyCYe=q#`l6Z}ZUJ z?Uphq4$!tt(T!1ZL_?k>mRke7Oxg|0yg?MSz%q)9uU2=I4T(CV&;_;iNo=Ya6(P`7 ziCVJDD&Yo+5g^Pak!q#XsE<|Hcp~Kud8KWUWNS_&J%47+{5z`V%_y3mEUDbkux_;G zk-uy1d9&%{$Lz9EdjXO>)^z@}4)&)zKh}EAw$C6b8Pen=eR{0%GWsm zQy-^CKO*3nuTmgom)^m?7#o5HtGc*f4y`7WwgN>pD%}^efGUUU(fz4Faco)jd@GyK zTsEpyU(&yzxy3SLHRPW6i`x zvsqy*zr7--?5PclPdu`_3v|3|L)V^l-Fs2iL7R_|2%6N;d)6G;zPe}cMk;~HmPTXO z2GVp`@{KL46$|Z4l5ZT{VM(Fk&$PlA+6-!@vU|_HJ^MFz?cHcy?AhQPZlH4Hp`Anb z?>M}9bw|bG%G~<$Yzx?~w6xDH5N0+{BnsMxJ%f~O7eyDpEd*U1Z!<|Y*A_O_6}1xZ zEEWxRu1$8-6?9s7b7~<9{MiH??SM1P86p1$WlPzLy2O%()KXG;N_X9o|S>VEk6quWXoD-sLZ`9o`Id~tD- z5a^XeL02SJmZg>&UM^S#YA#JJD@`qRbb3{ZZ8f;8q;NU)Rq-X&rHfMe^~EzQYub;t zjK1CQ$74L6R~<3p!HdhDdyq4yPhN-L&{=mDAgVSd4_e#AIyW1?bitvM&ul0!?3{H;Wr3XYCQ4o zn&EfIo>VgWQQe_eli;{P7x2^l)52~7H7}R<+H*QM7sy5`WvNXl? zPH1s$-%r;L{%v~TwJM^^9K(TouoObgwmAJ3(2MYU90r_q7s3t^;X7u8*tN(!Q_F@! ze%%8j2>J4uj2V?+E<6MJs0p{?lpbuQhzVoK_z`!F%pRd%mWV}Da~mX^RN~noQ$bOj z@aS!i*lu2&Wfq)5=$Er*;6M+86sr{-_tbc#<({Cl4$xMG}?e9CCz>LQr3qliSYDrGcg5*lIvNCc2lV`Echk4!i> zm4Sy$Mhj}VE{Gz% z-RdrD3T-t_DU=#83cYJEtN?;TD)DCg-%SKdD#3l!yDrALv8IEW;ZRHU93WyM-ZAEo z0no2nncEEarjkWd*LI=1Yz){7L9+s-P~|=&=LoZ=#6Sa}Ay`}RITHn)A+Zhx>k86^ zrp(d-!31!CV=z6#N0}&S+#;%Bnx<#&4QvqoHbFx!C1#?O=r(tEBiZ;tm)z~{S1Rgx zC&3AKi`_68=7TGZ!2(Jh5VkR7XstSBs2a1@99;%rK>M>v=Cz>SIZF*=U;x~B#sj(M zT^zpr;{;30f(C(gqg~@d1Hf1cQ0WqQ5RIo5=E|5BOANz8H0P%U>Ll;GZGXm znF#)6MiUghz?m`%!Zkv;$5=Fb)v%GGShQ=aUSvsWt=vfD3QH7scLfvSkV<;-myfY= zsKIL(=qQ>67eYTRX{ek+)CD$n!-OsbHfrU1*C&zPCw4b7D%XqeLQd2dPB>)2v1GK^ za43i>+2EA>Q7M4r?k2&T%&_#+lut@OLizFI=aeplYGki5P$QrIkfBne zF{s3?H$!KUIh@d`x~5W=C|);w?Y|o^3*yZA{e{r$uJ`y&wsz=)x{G7=7k*js(0@$S z9>|_vl|Q4VFlQ-I(1b%LB8!bh=dMoVttpPIjO4FKL<~(M76_fc90XmEw=_RzMPX`P zJa^-&_DyF84h$SVF!1C9Cwm?{J$P_*;E8kHheieu@f~TXj~xl0;K%wO_wL@?^OrM+ zuQYVOSJD423(&|J)gPs|KAk%V$u7Cm6?y8FRAci)cXS^ z_o~G1ALrIWpnEJ5-aba{s=dMg+RFcOtl-HPXZ^e1`rg;S^26``+Rfkj8t{3_w||Wk z&?3(+7xY(e{hpS(lXvS~->}34tcV13}J&2fK6}QRQkbn>{~q z=d|J(bINAUN!>LKs%)G05hP583if&#M4_H8rw#A;j2nauQA)$uZ&@BPn#OH4y_x8?B9I;4=eu!Mz5n zU7lx{HoFiakY@wM8CI+)S^U5%tt6(}rQo0oyiqCs4B<4k>=3jMc$Q+NAeTEr^08Ls#6 z(<^XA4E!Nm0T$hP2NBCKUk9gJ8z65^`&+GpW-LJ{7P=uEi{Cqvm{CUmA zpRX!EpFCfe35P2K_#C9;Fjg$NE`NqX`}))!lM#Q2;@f&fnKw9emXq^tp0Y51&J&&a zT`L>=HZDB6rjz{VLpwUxme;ft)-5V2Yc05nKaa!bxa~sd(6r;v$#Np4C(vde%p7LX z<9bnrBA-=bVb3Ks;?Et0mGEbiL^+u^5aMrJB4w$&=4AcorktB?|3QPy3U&6`He4lJ z4cb|kdBfmyhCh>h1AFmjqN(A}ttDyrGvJpHWpc)zy>I2|{cG7$aCk3a&z6W|WZzog zv%;Z`JnvnBPy>IKPX3KYS1j`U8IIi=H~tKHCabf8pD97Xq_7ZtMu9vFKC6-~2ob~A z$(riC_==jc(FgZFv}#$!{2VH2HGx07DCH_rWWbh#*k(mCJ1A{jI-x`yz-Pyn9bqP! zb1fSSI`T{mHraPc=}a`cpQiBMw%9$8~Ib&3Aq${4S61J1>WP3$kYcCwzIf z2M4}oxvw95Ddj7c``4n7OQYcS}*X9DvOowX?F3~ELR%tC2B{9wHE z2?_?@1I@!UTb2_%_(OH)+xn5%7zRijZGq7GHG#C%)bI#KPCS;P_1s6zm#(y)ztZy1 zf2=59TRJmhIa?wX&BQ{-n~U>miGr?|6n7h7UuA*@e*dBHUvv+66EhmqsyzT}GAJe~`Q!>@Y|ywB_P(@EO#MkcESM9jXzs z1~_-`V+%q!wmI+JySZ=wW-5F4Z5q6P+sK2vh9BLtbLEBxK0I^MC0TWK`OWq5wyLB9 z(Jt*X`JDa!g8`b3G*^*VgnbE9&4!v2opo`GdFJbyOk>=Hhsh(DW>TFCx`jm1kE z3Kyq~tRxq7H5+~0Y1uZ2f{x9|gFI6@@~nIs<5A6F1U(TuD;8SV*&%3S%M)^LWa62D z&z>`1PcfM6cyh2ypo7mbYT&)VWbiUV!wjPyhtK)bNakz;C>Bx{e5SmLFgq44MtyC4 z{`90O#h=Fw1f`vG__KMQm1H}@dACOkvq;Ll`0)MP{^Wf3#S>5Rk5Q;HsF}ph9x|hF z_{SG}$-%93k}3s+Y`rxUB|QtPXVmz3s|SLQCR+xJ)X7e7gl zd{Q-dxwQXPVsUE+Y#TD7h6rtfED442=BY<2d(sTT4vmF6u}4vRNO#ZvdZ+bIb~J|; zRu8_+4}bh4xP0KP$`L|y-vA5iLCM~hdFUoww&x9t6SlO*A%+m-wgqqz4E9p>$h$3U z8rx^+wYvKyBIMCh*pPqHx^LpIC7H>wAKZ0}Z)Glcj2f!9kwVUR8k*)lIkeQe`* z#M|(Ku#%qQ8Is0t3Q3#$?N886Y~<8s$hv;$_2RCVI!=Au^yvTg{onfS?|tQlKe!{m z;@;lQga2pak-utu{DpO=|8eO_!#=!^H4YINX`9FKzQpvKhTr1pkDdE~(sWTe{7UKZ zpO$q0q~XNJWrIJ@?fanq_-o4t|E9_QD{V9K%Ls@=Y%viRA?#0aUC`-^H9@z;OF5CwU}y-+)(cHODe0Xu+y%~Y z$Sm;8teFTmIZ@Nt;6&5JfK%#MgX97M^tjTS(kJ*TMAQbRSV)S9a;y1zOo zSYksH5nZ|Bdm~>YsAoD><9G;<`ngTtFvXwIX&Aspm+gVCnp{&lW$u*z zrH5N;D5<2Rp6O8ID^;&UO0HD+ezqoT5$Nt`+Uf?N($<8zxW7Vh$doBHTCNB_5mi#E zxelq9nd;RF&nPCD-v?O)ZbA-O1kTEvFKs=Ayj+y51&zBo+M9P0q(lMYdl?b|KA)S(eQDUi%FyN5I zXUbU0m>#98YitmWlNv&Oxx@6kT}#oU(~H_Kr_6H&o(85KNn`Ni{-C@JQwG#ASgO7cUdZX33@Vj zX0 zq1y*&NO-w12D?c-f9CZCf2QQcGVpp!&*hSnW91M2MS0O3w|)PcQ-1q5ZuyL(IKZG)lhV3v**u26g14) z@n;MI1kE(_oHqiS9a089146w|uizG)!P7f~7c$jZP6cOO8W16Ck!QfEMEqGLVbz^c z_Fjw<(hPrI1b0mqlH|5FH@d7i`uu@q7xydzL7&>$KC-Q&Yh(Sz{WbmTS}Swsm(IzB zR1-K2!KO!WZaRBj!R?d5u(>z>ucFZKNg$*TW40U=emA`-lMF9svQLbM0cQfC#cX|B zk6}HX_BB#S@*GaBU})5Z;97JmfzaZgw@HwI`DbW(FoR3v?|hC8q$+ zi->x&sRLz{(v73GXdxt+WnDH@ZChNy+%9rNPzSV@8ewo8C z8MdDQoP;a6F5$y3(8n>dTSFGpi%$8r!TP)4XWz<`UX<%rh7GQ(8&V#J&oJbP7}*o% zAOt#upmi$ac4AvUVD=v@x@~g)lw0y|xphlL&QpsM+~gzMmv`T@VsQK7!L18dl+?Eu z*RVNYqwW1ygb;zO5=CP5z~NXi(w?g5EFk8Y)ESmN!z1OzMKvL@+#1H2GX`O00)Mv1 z=a}u{*Ay#nN)(ZKn7?@BPrfs2QUIT?<U12t89r`m@)hrfgTG%lYE2B8<1pxa}%dh_00u!VImD-Hc8f2<|P-ES3a?I^V0H4 zw)Ufjm}lkOu-MV4g)19XcA1|ow%O;>4JvFRGP9b*-)FH(lQ>9WP^Um z{!tfez!eeK>39KeeU?~bHorEO)Rru*X?d_}-KpALe_r?K-;kxb<-{+W&yBTR7;8QI zi}dJ+Rl`5yzu2~AMxS9uW0E76iH?Jl5Lt&9ICa^~D0SFkd4t~~4lQke8@GR)N%Z}S z?@=ID_%nybpN9e{O}!ASzG!jQSqAu5ZNsI`dSid;i(AR9@92x0hh0hk@+Dn_jm3NQ zoa^e1GduBS_B}aMX{S7$763W?nEO6x9QY6%-E{J!#*1Sem&Q6C{fnZK6(!T+6?0;Bxol0?(iCrm z>ym|oxZ<*CT}?p;;lxEb^^Jw4{Rd#eJIT*X&JFM~(zkb$q2|5oLD0ZtvTz_ALZ>Ye z#|~xHSdYC+zOfpxjEFzOoH2kxqd=P_z-L3ydp33N-F$raMufxOefRe4y$2RObpMu< zkMHQYZ|l}YtJ2A~VkmTOV|jjCO`!!mS4LZ5%jJLgyeCcdzxcv)#~ba~1wSjcS+USwN4Xw+4nmrJ0P}VEv*L}RzRt|xv-q=9 z5)f%xL7ufmAkY{E3LWOpIaG$Cpgn({K&K}hs#WfcqyPmmQ>y{drHM5~$>k-* zD+!Q>HW!zyDM+oTPOK?St!0nG;(|p5xecjl6_srV(}SCooR|&paOyze=Tl7j-=blnG9SlVZ>fe+eg0kn9}5 zVF%y%pK1H(2iB>@V!c_`3!O8X0nm1Ii$5d3E6V4Fhkr-ciDw>wga?@`#2@IL6`-VR zJTNfZTM*{i4~2NOtoJ1rib%-D^J69VJoJMbe(eu`?^~1q==-y7pH>*ZV_r^nb>qgB zk6c_k{NG7iWaAlmljv?z)-&d&fmhlF-|aa0NjV>9$9`IIgfzJ?r4Il1MbCb+bnyRb zKKh@Q{CI5d$-iBF-7}f-I3%$x#vU#@CpFiCZWcP%>0(bjYbNpy1)uo=M%M zu{CiZMaIsp{+%5xyXrBsxjP~uof5YhcmhIUY-S*wC`;$f1}WhXS|w`A7-){j52y6V zEIO@9Zy;|RVus$(^OnVp^P33W_1n&a*q3#`R?_uS$XAzGMm=z$-% z{U16Gb@{My6R}8UdZ$Dj@--}s4F+Z(zA-+QheBtCPK&XbKgq# zGA77boLP`r_UNj_iN@oG!S;ymeM6xI?t1Bc$qnAZn+^ZE*8)pKC0%gH`;veAq7q$K zLF5wyz20SSOVnd@mqRU`j9DwIVUgW^g^u9L6fT7O5dl|-yE=BQWy2Uy=puM~blD`- zqXx;cV1v-LnyaBNgG$#6l{P|m=b*d3@Nf5wd(qi-XQ|bx46w&c<54}OH&DF{!oBkj z!@T@_c@?|9>?Na@m4=~)e&lisYo%*Of?&WZQO{!fzPJG}ka%2gxk@sOSA7NE+>4Yh zIEx2!<*owGHDDQ2a*9eyGt0d2>4h53Qi&5CQtFTzHP@l8i?5Wzd^Ip^ys-waLrQr@ z!A9ModmAY@QKi579HMix(F7X~rQl>jTXjvPPGRP~QG?(|r*NVg4Fg@BPB>JhI+eX| zs7ik*x2p7~bXHDOa?1B*X8c$~My5X70Flo=em7*}Led^KT==B+nJbMC{qLozjj<`U z#d8*>@|Gs@mnNet^Kw>3<#&GV?(cla3FKcNN@m zd*$rerMJNxj; z&ffK%T^ko}NjF-K4x)?m2z8D%#v#~IyAtwt5WAl;QoPzEOL0j?-$a4ln zGaiG_cyl>74EzdUMuHG!fUugwvDM0^;3&Gy!X}cBc>YW;SQ=Oc9mfl3ODO~mg_ce! z14`+bA!5!{N@R=XczjYz$pr78|HhNFGH9n_s?!0zV4Y-vgxi<&6osUK<~Oyh8>dVR zes*~_lx-vH#v7#s$u|`I?8@vLZ_dB@<{%@-&9}BB$`_Y3wz~Y!P~wGU^@Dp>pT2M9 z=-$;9=e&oU8>=DDl!zU=fM>9?;-5*rfpX%$H76g~a9~keO{9VdXG6`F0=k;4&JI3< zl#M?FpMCsuBWSuH4Sa4&)`~wH4R+DdDk~$Y##H&zD%f=iHWuNWUl-(j7JQD^d;aWF zJ=c**L)h7ub*UO9+#oN9RVEq;dq!FdYQf-^>N!zgmngIAn3JlS8-a0EFMP0O|BDSr zf07>lMa}84%ClqaUeR*;v$nHiEoXn3KB)}>`F`~#KV-ugEqjLBH^i9a@LNdZh{$Dy&*~4nSWvjE z>~6M}NO3n3FiigE`e;)_w6(ghy*y?hI=P^3O-1>+N4E6r*}+DH-MiOIhNe z{{bsO)BStz>D|3<_@Rxb9^Z9r?~aX~D{B&s1@miD^Voc_t-7G4GSO6(04#TwM_q!B zL|a9o%>tp>Y|&C}EUZm+Ru#5_n#G?zf>tcFX!AIBCi8~jXm%l7LKcq35<}DJ)bf_n zRn6s#qqAd?soC)v7VS*jGSS84RW{xBBD8E9R_U^EPzK_Fb7X2h5+vNn)OZA~+!`u@ z&x&LgXI2cei+>*H&mI?hMd8QcL+PYnMriK*m^T=URa3DlMj~qX+W8;?Eq7Cg0 zo9YWUlq6xxmg>1Ixi%Ryg-r&F3ds(=y1KyjAFL`^T9Rxjom*5kzrAwP^K99fKJ!r} zp|(U3TR^fsxi_($J-Y}2Z3Y7v!mCoxmArlhrZ`KD!;d_>@gQu3L2q$9#EDJ-pT&N8 zlzr<4US(&)rf0|Kjt%ViPbkl%7~69b2`>6y2k-));RZOtn}6t&&I3Nww~mCp zJ+D|c2A(U~^T>jMjd76^o{orcwg=21%gDjJDj>!u-me;ZgNzNW1Mk-Kztqax!e9nQ z!3XqY>ZX7zMndn1=E7>!_PokOh#ewr2+eDtpghU)Z~gxFN=|&TcF#k6No#xJ&sLuM zrzN9rw2l6h-2)p(K4>|0nY<-TjjSUE68m4R?|X%0Ann7iuRs2`iywTBe{D2f9IHEj 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 D%)H4J<)k&clXJ? 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%0A^ah8USC(Rr>78E*h=;*>}b2x(V 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πU%F&A`WxR44zD3p5lo- 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�H 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 oInOwkiY>0iMNNz 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 N)I1I1U~%^R{9k$BBliFR literal 915978 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

s#`=Zk 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%0AWsrxbx-Lv~?ZY?;+VFIjqpoQO zT#DVTKGY1Um~Bu31_)F;Fj4R{?dA-n{isr-D&MY^BM@!JVrBdkjJC%Os+0G7Zan0^ z@qM}WAk|6jLVjprPQ>1%@HIm`?{!w0#-lma5RL{`l<5OpujvNFW)(iq^k988zrK7m zl%TBIu_Uc1+dzY&Y%)sJwq!SyBztRwlnRx4g}=0k@mt6=E~guOy0hbzp(K5~)W@+@ zE*>Swassks=1~J9Cx3W^PHBKXViE$RSEP`34y z0&JIK^>cChi5NK?r7SNGk>Z$W97iyUuhS%r-CbdxerB3>EJuz_xedWba^!fn9L@A? zi4LV2yMAQo;vQ(r$ij9?WM)M-HyrHctz}(Tr6*IIp)?_(3Xne`j+qqjM}fYU61UV;v1YP_?=@)$akP36z+<;?-!W%1QFB-L6rEcC@@ihuQNGkLYOyx3SsN59ib7Iw1U zZl=B5KwfVyZ?@82ZEpODiB#lhc?`sp9` zQ{-pxcX2QMoi^5^b&PC}*3b4Iq}vz#Rp4vmuT8(I9RCIupWyW{cwG&wpTQ>t=HCi` z1CI(!SP293ubBkDpTII6eEv6lp1VE7dH%pB4Su=chy0(OR{|a9E)e`b^`U|<+TG^P zYdJ4{x7Yoy@i$QI4Se&R$?XfGDQOP=5iFCAj@0y)B7+P`_sM_YtlG)5azM!Xq2A4- zTwBLjo1^5bXw?Nw+PNTE_Gif6Oex5eBUvnKN)v!_JWEbwD-=G0H9TCbG|fp(qgYGu z3ksjeG|)>VDUDJkoSE|(HTOmPmvoTlBNP{C9pX{Ro-6rog(i6_*9XfKF7Ds(m#_=b zAu@`9FX!OU2lUtsXJ}f~A~~q=cbf9`tC((H%+w1;8=o|ny?FR0`w+TRCJqp~GBI~k zC=6c+;S2KE*RnMSWPx2Ae1Kgwh_Z>Jb9BZH<~a7Io1~x_REo<}lyUI&bQ}!zvLy55 zNQJ)z_Be`bA<1XRLbM&hWsTKO&|^DDjtrBcc%wAQDn-f|H79hfDLpGKFAs%aVCXo~ zAEcm(=%*^cCFW%U{({2F4#}oqIrz(Q4x+kD6Es0F1Mo!`Lg_*)UM|!iB}h^>%eXq% zb@KtM;z12P4b{~<&nlngDVl7NzSuZI)(n)bQ3@~0NNeNxU<-Yqfv8rR?wo5^-`Fok2K_DNNpjm;_Wm+XC<>u8j+ zMJS9Thu}FuGL{HBT4{_QwF{=Syzvf+97)0)Cl5o7V~P+6AI&!pPLV^|lz`2BN&XGP zjg2GSi@Pbs=0&uecb4VdO>*ojJIMO(xA7NENPabZBGe|iuy(gEonLMS!SBU8b z0m@uzGSX1TDVki!)3J`Cfvb3moSWj=KR*1O4)Ss*N+E$pE5MqX;f z-2FyN*PozZ-6u@Y=x|&Hji#gTDxFEVgse4*tI1Q$@<}L&O>^@7orHi+Y%Z z&+|Nj+DSXC1|2H}Zf#3ni$GYdEvk+8jw?^4^)Rr6f=YpTrE|FZ&G9$zSm)USckR{g z4mX?-c-_Fnc{72>1|~c{F#j)1Dm{PT?tkH_{>dLw^+JEwZ@B8kbl$_=UiW_=e<3N_ zUnlSvQ|vG?T4=@~kpz(kyz9(3yrhX||FGP%yy53MZIz&5+iz~8|F+hfmztns&fr^sCXr!E67m_^} zQVjC6gy$;$%?5wnDg@@DMMLLSqRL>dW4piyq@1lHTm&DOQ;2kk&^8N;&(2SY&KSS} zm&<`*5P^9K>?2zynk;k$?tutr*;-+wQi103S^naw9)3ssHetKjY+ltzgP0il9=6+p z51KAY#V69jParr41Ng$xat6f$m53&jpNExzYSspJiRGP&FsTMI29CA~ z3fpB9-KqnN(&{+U6#|s?q9is^OMY-D9eEsAM*O6();VE#I5N|Ze z=Rks5N;R{ShQj%Rw(?0AS=v$g(X#{GIs`Vdb$P1tt!7hE#Fve2jGa=rPJ`G?OYy7- zcu6&L+4B|na*=7;BAHC(w>V$UPgh6iygQs&?d9h3bX)5$U9119k-T=F3oWV5Bb8t# z!reeNCXYNhZp$|w@E1?lPLL;`V!vkxe<#bC9JQ52bK_{HS&*S`Pf%?L2gVskCPXg0 zPoIOMy-18EBSfOn{z7=9hCI^3_I~@W9<~`#g6${~wIM>YHW{=Y!aLR5j)8fxif+d&Rg% z3?#5diA?p$kL&s#uA@H~E|1c@(9v8mDD11)8haBW_QYAc*ovbznW|C$J(RAIIy*>( zm$t-oIY7EB!(h?a4@^VdOlASm>01PU50FeFFFnz-e~f>9S9$Lqd8wunz@LAwXKA<4 z&xhisXPlp`Ay7%d7mdnb{G}ZUM5e;)j4K3&x2v3Xu*^f~Kh1}!rM!K?UnWE``*4Qs z2+PGyPZRuJ#Tv?_5Uj9|z>}^SBqNA_RS0a`6au@KsQjiXLKpEb`0K>KH#6n>Bozx^ zB@nht#!M(2p=hjRQIZvWdaFBqMBr`=``d|3GKqoO52UYVCcS%0m z10Vn+zye6)MWA7>MtDVq{Tyna6o?^I!%5?EA#Y{7V5pqxOvEA}`6wbBxl>y@TM>$A zrNML1#$OM*DBDI0;Cmz$xfNwZiySd#KxMfmNeL(TRVipLHA(3lli*#k;JARK5pqlh z6GXOE#z3ieDv}!rOZ!z3O+$#DMeF;9%h?p2dMlP35Zy~B8R)CrzG7G{Pq5gooQReJ zuIFel-9Y>q|A=F;NMAyJ_7o=S=hEGDu^~1NZJ4)Ll<7XqmlH>)M5Wb?qR6SK#>sr+ z^mHlAR|VD`ak74hVCl82i)X>T+FQ+47J7LX?Xy0vb-m;ZY6s~Q&@J8)8@6Hy-gcgu zIF~4xnh5wypAqG98<#c2CqdiuR7ptw=WF=?GH6PIUUha-y%!qGZ(CT8v~C3c+F3<=jl9uamW(i0jnEYS4wbb)@G!%Pf5Bh4SdP@y2feg+y2|TaiZfxF+9e-(_j&UFZ+g94X@ zBY-a@U|N7{>tG5qUw@3n6Ad5Nv;DEwcX=|0josOv{GzD2AVUmPYT7*;r&MPCd`ml+9&r# zF6vZgS&v$)`sxQJcuJ@Ev6xrQFT}i4b*f`3|7>SFxdlVf%3Cf5)3DzjQau*18@K+fGXX@ZDv@1t$ z%gH}e8de4347r}6&=zo44i4EG;LCB2@IVOFG!!4lMQF5sI>vo6%7mbMI@UZrRy#@0 z5!MD1^mA~o;*GQ8^g@DSpuxspT1pA(`9um;ryH<&@jC{8)lv`Vir!v4{^qKLJRg%S z2d6P^%pw+Vt9f(CbYcXyb9VFm_#$safpWmIdb5iT-V@{2^YREh^jFn^)2b;=9v0+GMTo z!_4gCFC7q8!PmoIEaK7b{O_7zN+m_Y5n(72RHxXKru}e?{a!2C*+H(P+B}7+OS?6~ zq5&4}p%j1B3k~>Uhq_wRfG<=ov_2G()6~et)W!G(e?LwpC-3+K!XM4%%o|@PT;9gC{5VjO~v4x3!yY??@0E}OiP=;6wm?A$# zaXn(nQ-V6%d)gXEO-{AHP>-~s!EV>uRj{6HV#BgT!T$0nSb!Jy8WoNx7t80pG{U$* zh8N18X@W(JIgHN3b=cz?^~MA5AOQ-{0MIOT;BKj=7KR&^-3-y1zXXeC1OYO%&N2tu z`}$B>j~W?>GC5>tW2 zAii0b+PKcV8s^+;vb;L}{=i$XoH?B>S%RuTlE$n+`L8oCsVCCFWX){gwrXRyk1#PC8jq zNvPN&7`udhnMqK7Ms-q6;p~!XAaZ{8uQywIQ>%xq^g%!$H|gsPc9*yFFU4Pfh7X5e z`u@1zxyQNP-~Zk_-Ua#B9p68bh|l=7oBj*GS?B-S=knj^9FLph2uh>Wg$0nGld) zmNe!N9c~lc+$HASUh#YS#_#VRySIN3S@>Q3RIGzsi9@s}hZpwQ)IDP@R?hhq#1Ct(@`ub)7Nb{qR>X475#1)72EJ0lcQ(UgYkdmUo) zpwP)Ka-_Xv^$<8hP^zvZ*w=>!iCSXrpJ1=sPEkcYpVGmdC>#t}-?74#(X$Op$dR)dr>$~gStEG3(iCqT)NGCFuu z5i{fwC+&wL12t@TpFL`PG9%_NboV|g^!hC<1b&O^6ti(?iZo2LgMT)3RnFpx?z7dD)x%YrbZ|XF9FJpDjr3i z+E`sk~qd08g_H!L>fY28Fd+9~$H7#^nqXq3koG14mMV5YMRf^JaCK zSIwMP%bs0DmQ)6Rt!>Q>;@t#}Z%?$<1x-}}qa+zqde46`VA<_*XOJ667m* z2yR>eH}VCFY~sC13!X|W^7Dc+y{s{WkA%RFEpYfIL|&@bltI;drC2jVkG^dd@4g<&6dc^ZBnOH1F)WYVs!Qkb$91 zy{z?JNCXxP;jO)#HJxQ$CuLz_{1W_K-a53nWh`vW=c+irDsDUxC!;OtE>cH?vI`(A za7oOUMhI9FfH8oXFI;!DH`RpCiaGnV*buMgsWCm)oFfR*q)Bc5XO9_RL)FZ4(J zi{OuVoxH{)cDwh@@DJkk^S>JRe&m0TJ-_t}9&uUxU-du6wM-Ze6!$KnWTzplU`rWB zeJ9i+I<84vff~UeAj_QvD92cqR@0_Bq3fWIGK@GwE#e9;>9HmGNPF^}xI+msAM`Ro-d#Nlu5Kh78_SN)QJXs!o?S17 z0zHq}@|~dku&_KHl-YIBt1NhBq(!C-h45~Shtr|~O=emx`i235T}%fv#LczANW=_b zVk8Fy5V?&rnZz8oBGMOAsVO6w6sR3)+#HM5=1S-j^BrpurUcFaalEp4q2X>RBicIsL1ee1*6t{Ql=anE3;(m`5vQ8hhr$R_V~wWlpn(K=t&^nN zVDl#0$T$$M1UN1xD%a@72!}Z4MF407;HxVE>|YuXb_QE-gh`$Y;a9D21RDw~*j2kC zw9P&rx(g57n~0MDJ>U*aS1A)LFcCwN04Ul@q{M1Van233P7N}t>YmltKHWc*)i-pg zI}(eMH3+Jbfz=7h1G_|WkunBTK7H8y>T&C<$DOYpi@G*8u&uou8dPk1CwY(5-NBkK zhD@;*Yo;Ow)vUOTV=XLS%--vSeX)GWU7BPe%FQ+8;}DVeYtjvu_Y^WOsRC{I#`xgHbhU!B5I7xUlZXT}f#66MrMNQei{mY<$jlV$-LA5x3Ct_w z6>?zfn54umt7WXIYiw;Qh*O;%Vcwc#b3yn;u__?F_wSE6Up{JnHpB4D-cKGvcH6*i zz2PVGH`G}>7Nvp!O`+~<5J(F>TVM=GdcFcSc`=vu**8< z4)*VKRy)?sDQZMtooZd5?p&HE=iNXsr%FNR!zprbm~tJn#>mMr4jMSC+Xa7CNG1mq zf13inhBUH_#$qw1*N}j1C z%enb73=QPJ^iDs)c@C!h9rFl5Od3 zS}hDAQKGmSziQzEx=OopDbOtU!`J-(n0EfT=g)f)ot${#jr{YgzkbU{nTSsK@xzZ2 zJ|5nWI6Z$e{I%hIb_n0}`W!Il;60A`@0eHTYmXEDalF2FO>&NZ?VL5{)XI}3kdc!J%|)@ z-xU<|0Wqr^(oA$QJj{`)vGSwh^7{(%*Xr_81DV~zp5MYmN_utILQ6WtzTVV)rIGb= zZRe%Rva%tpo+4YjlzghRJQ0wemv)}1TjJ#wWvKh`W^+Nv7ju;fkiaGO#q|sg1mix% z5@Cu~2O!oiTwnJQZVdRVDii1-Fk9juCNam&zJaPrWb+tW{eZ<-2O}C2SP_A8z+;t* zm5skHp<3}b)j-FR2_FV8jrm_Qi(P^i0Zs51Q#$#a*1m=IS7y;9>S6U$}xr~7QIrbDcgafDGhB#B*bwt5cZ``9~T_Z zA8TXtf_H!~ifR`}Yr@WX%HvX@I6>2Pup+Zah)cE3j&#nX87I?_jl!-Byx-kk*VJ6m zAV@yW!n)SNItKW=zJa}^xqQ$WzPF|LJC*anF|HaWRDk;85#zHN8XqSdOo0y#-NKuq zP1gDsxNC62<9{HH_Y4)gAW)?uwNdQx80j65DRl~cuZ%2e?Ho^yzJ$rlcMSy{hxT;2 zMb(CfjSr{W*QQuE9tzO#LZcaiSh?j;{uPC2>#Noh4f5m>S0;0*0ElxNeQIDtf~h3&wr^T zb6W+LbctHjDQaFTYe7rv%~mE!MvDmhwhb(99h%!L1bO>M4+vDNk(Rz)Gcl`*^?(>8 z9O<-hcTVu}m!&;_p0|z1yOU1j|KAu*A`g_ub_DGDo8faQegD-FV}VjO6-`5y$jDPClK8m;9$~=5uAjpSrKh5{|$Bcp)~gscvT;v20nq zVgkp)qcEhLX%-fRW5AbXEuLo@XzSlx9{%#kAbMFqa6#8n##4<&%#ye+6_gz57?j>Y z85S?;@iMNkOfF%i7m>sm862ax@Pt@-sg}K^Q;}tjgHM-{r>n}W_N5o}s*{FA>IGr0V%%ZiD7e6cVK#>0GtTfx(cU8#F%uxv7tcHd3oy6{k3t59Pz3%$ zg+&IFkfrCuRu{Aj!Qd|qAZC(R*3duWuVQqD;jy!TVAa|hZ9vCTLzqIhcga@}u|6AR zQ_X=&MsTW8bq0U&IbR@gm5Mxr1qePxR<9Pz)2g-L?>P!pp#2N}B9)9uh#MR_nQQ-2 z``}V))aA5Tl2gbDCG1E%k>D@Lt45{fL@Nc$+nJBa`hj#*?0Nv}##j?)JLISf$@Ych z=uApube992WnTx`+eUUalXu}4Rg-mPWi2X9)#d%>a;&F)VQ2t4(v~_ZmGa@Zded-zd1$=RN-pI1&z(il0f4E5VPGS5LwB1 z_3=V0TMV~0_BER>DGPyUBsXu3us_d;`)p#t>#1=E-7~zHjPdKRvif|g4gTV_0Ls;) z&NoiQE4Nf76$(&GzM5=M|Cg{bvW*z~NL8rVCSn(3HB|>727k{1vUqEW0;9AB_~M`* z6FfW8KAB4VRH$5VY`DD>FKc62*(mt>gR-EOg*L^as$@EwTU!`Auz&C3uSVf1!A!LU zM7AFm4}WjLSe|U)f@ZmbPlk4Vyh18LTZCn>QbBxpUuTkImN$%^W=UU1CRB_6K{;v` z1W%+#Uz#A7Az2YLnPy-_1HpH&rXNM1Ec(`CF*hC#U6=&ystcV{Ju*_DT_H7jD9KGF zNDl4n6HSHRpB9qG<7INZofdBniyj~~nm1@q+O7fZ}1sl(ngMtn2xu(il!Q=`zzj^A~1WIRlHfkpCY_~ujh7FH(MTmIYGo5$z%8X9`*q@ zuTJ=+nos|J-#Aw^E8RYv1&L{|-4Xi}!=cIqr?z z?lJh$#TcAb{2l3va*Q;!gN5rlKVb`lyb8W!6@MXOfxnn< zUuIZ1pK(Ex;)DzO%Q1mZM_Qkx*=jzgT3ErjoynBBMj$vTm__^-b*8~;|KfR8$7!Ov zPw}Q+hGngSU0UXtlLt@9x4NDle;`sQ%B~i&rMZAq8HpVvWH{ zjh4wZ3jd^{IlB=>i((1#;%deP{n0f0(-}6*XYluv$74TzGXA6gDsb~V(HExbX=AOU zEO(d%!)PNb)y^D(@`eGqVnZ9_<;sHN=vSqkpOlIEVcFpK%h}&8Z9Q4ad8|ZmNr3d#?PS-&Y^KV2sDY^AtAR}5nLK3CrQTbUprJ}pKj#><2lnGll6 zA(<8>Q-U(ymPyf)8WajEfa7&V9>hgv8c4*`Sa@f+{I7x&Gxu z5N{;coxj0gUh`)-9Ot!9`1t+4HJ>8qOE_T8!Td*ZULO~D|M8G>hg?U(-zEHWh4;hv z`A_SIUkCdB&m&^o-~0yG$A@6AL-02ne+ktf)(W_~cT2#MpeaF1!Pjyeao{ns!qq4J z#jWRD;vBfGfN3BY$qpXbffzA+dq2ORX>pSlF-!>6rCjH>Mw3k`>{um((G^98#LDk# z7J9aV`C1KYMehm=x|e*RY4C-*GN-mRuZFB_iqF%z1VPu0rm0<%rVSvzk)e{gOm~oe zbsBVC(8S=Fw-tZE0<2mbhSNz5QA#cLFZc^yU@Ku=dK4@m*u!7y+R*WYi+S`qq|ZP| zM$iMWQ?Len!3A8Y*vKei;Y7t2X48|#qV#RLiBcAnT|A{wi@{%t#%4!;2b&)LV*FAp z9uz*yVt~LUX7X@q$17c#B>``t_?rP^7P^#qeRLGgSUjT zgN-xzq&R*_kii8_43zrIXOf-FzQ*28va6NsZmDXGyBo{y`m(E@?5St&t!MA9W9_W% zyj{!MP({{OkB%r+u)FeEUQ8MAa+8R)oD-jsq^CO>Az0Z2_dlId=#$BD z#N{_PlE^9z#_dN!pZr&W zkN&&R^~a;nPd87GSGKc;s?+7@Xw9-eKE%oFAKKo*m{(KaR8vanPi3vA%9u};GoGoa zw(1|t+rKU2K)CwF1NIL~haM?zjw_(LSd)YDP(U6FD8+&tDAZ+tSi<~W`Iz67h#65@SnCBaY6i_N5r_ldB4|(d&K)wFeTQ@hUb5F3zgU&{<`Eve9^!$&)?ls zY5)9j9}xofR=oZ##$i21Rdm$BuFvAg?TJ#d8Z6H+J#pc%3Mo zuO9VEi}*j(l0Q_F=aJ~CV!n>zR&Ak1`K6KZS4V1sDnUIg9U7W`$RzT3iHPkK^Ooxa zgfc{&4$mhL%yg}AMikN|4}-thzo#M4CMm<`3Z6^?izs-c6P+~FcS;9AW4CaChrjS= zz+5#*?;2kUj(5QqkX7(SdfJ6xvW&k#84~=(K!a1{<`iE~HXu2l>V@32oIotGxB8#K zUoutCQ^f|FRZlE z)G>F}Hn&xmbrocFdD&1^-f1AaTR_z|DGr5@)U~t%H^!DalUinD`?%j1mOmDj<&9!j zHL~7nCHv6u92Rv6S~ba203sKVRe`Hb;o~nkIBG4r2BV62Jd6pf6f&IWpG^wh%s}PX zzM2vB(X_%)r;ZI&amx*q_Z=4ebXq)oC%#AY7*VlcQGq!Ot(~uxPYtwT{2~&<_o!jt zF$R3Io8;+$eJ%v6uC=R!0j>dvC|95*MerBpjf<0P(vB`2{`{u-ehrd)cQsZ}q5dZ!BVGRoCWgn+-e`$q|I+uXK*IRRyTA5*ZYL)m6E?rt6DuTU^Zq7!tHu>tv6N%Jpt zqkdjqepgXmuHiiYfIL@1r<4Wt;7!F{86K;OzAglV!c1Art{5Fi1AREvgfdEF`qDTW z`5+`+LTllvaq`78NfXSF1;;_r3RdtJQ?j9grrj8IMB2BA!91g9Avjy3^A z@E0^xuyZX_b@?*$!^?6j9#ZQNauG!j(f6QK(3jZSxTfLsVwAahk_0Hv_9Fyro#`t_ zy2{Buatt`8M*L8PtqbIG{ijs~p2g$zf>Q&C{XdG*A9B*wLZz0E<(u`wG zoD#F1^+9=;KyXcc+)-EdwYCm+i8?j3?5PnoHg+lXbOq}XL#wne zYZAM>?Qfawz~Y-rA9G%k;|)j#~ONl8Iq7v?jMpUg1$ zu^|^pbe=2E50bJ<=kSE%_n->cFgZGy0$#?c!~#2e7JRC*Bm`BNs&{euX~*(^sTp{s zqSn+tMcFUcR0n@K8gb-nlM&`JZ#_}?_V2n*O^t@BH{PNYVuM|d9{xHTJ6va zHG|Jo3;v|6JXTa4%ju@1TaxD3y$!3n7_5g2i4-suf4O-vZ@INuJQG?988*HwHnpA+ zQv`Oed++O<;L7E(GWXnHjPS>UuCv{QN8Qd1jP7d&`_^~%=UA`fA3tK;-}HC5$4;&v znWNp~%l+Nli>D9avvIC{Z_iwxVvuM3WBQ$l&+d=sy0ic6zjw#~#`C&3-{9l>_)CXB zg?|EueL2Qr*n}%R+r~%1%6*ho+@JevWWbm0Mnp( zIw2m1>iIO|@@NY$H0H*ovFf{Hf<^9tSxbd>Nyfww=Fv3q1itMTY`0~HIk*~eL`VgaLg zv`RRVtwSk5tp>>C4}S@MGE8h$Ayyt5Ilsg@2_WhP!8t#cqI+^`1SvKK>ADBHOJ+A@ zFzr(v&65;kYAMvxJ<-fK+DH!8lfAWNM^)KYLEf$?yK99G)Q$b1nz`u#*;G#1SsQD~ zj&?=g?Na{5DnW9=ri%Qvf-GwqwYo7`ImW>rnjS^i8rrjxweX4~07c~2gI9qeMf%>*NGJG-^{Jp8rr-x7fZe5qnU!z=~SxGdPep79I*k^+2g zyn(3H*$h=iMfqxPe=@4f-M!5nT>}eiVEH;Pm6TT=ki}JlORAYG>lquG33@W;QKF`> z#S8=I^OuhzS7orMfG(wry=nGGQ=Oae^T(-k2EsF(b26ik4K-L%9PZ|1_AIiZan!>> z=_S(9mK4m=9u;4#=gh7pyO8G^V_cqKA#%mi@#7ile7-i-L>}|jlf^#%!2?&HD12c? zbk;=kIH79n-&Esha$tY&ApVDCHRa_}@@y%Uu6m`KHLJG0u)ednp}DxBETT2C7B>wn zZ5mkKoDzhgMa=_Cn>ow$F?vC>=$Vb9o~s{xre^3D<;)pzlB!CTMsvf)z3dskagZ(D zH91Bu%W#x5+@{NOojaH*biFQ^2E?ZTWkp^$IfCW4J4JXn@DJv*x2>y=EI_OZy(s^m84;im`GwKud2An$*A1Utfk8Tfit1=&nRlk(E!21%GQ1Z7SbPI-##}maGWyniO#WpTA=4FX|trv zq?()$UP^qGyd8~YfLeBL>I&jiYF&=DKc5`>`}7dZXODaZ_AWn$!g#>6nh5M}DCK}YIJII-Ka=MiqX)H$?$>Ao(p1QKLuK89Kp?y%x*P2UNpz3T!)Sbs4{QP^hFHJ0Spr5t9 zJ;maU~M(0#h@2J~@dC=j~@V;;dfq^ijvQ^M6~;{x_3D=2D1PqhGC)U82Y z9sy!}(f9;74mB5mU<_W^Q22Y%bp(G;rOAWPILwWG6%{rkp)LV5aG<(;_? z+A~Ybq8hTkne3vn@TdSLHh}y0M*~Vkf5hQT;5qXfqjCK&@Nv=zR@!HW((Oxkq8)K6YYyckg@SGekZ!_=&4cH zA1`|Qze`{LZt-)|VopyCQpNb_aN}4CLhJVSj!?z)RA*L{*U_!2B(rM=5U!bD-(FD9 zoL5&s_LF*P9D1ZFh>g09){`o|_(LX-M|Ew2r*#Fqgysm%v1@XU&oE?9+ zoKJZp{to$c?%o}qJIS?vT^rcLUv5ATe?7GI@1Tf||8w{!{AI~ZbM0$jU2j(KR}95p zA%iL4xSTI+Zsm7@%OYh(5(>(nS`=QDQg&l{*|q7F-{@KDzY)zV9z8~6swq#El~t|H zU487M3D)^hQB-p~$8-lyG1;Q{=h?z;eE|Z0%*OC!sI|vDj4KlIlA;4aIwFA7ZX1Gy zVnHiHF9LWa%nIrOzKA5>9vdXys%&2Msb*_k0(S77Xt1zATku!mm8?~D4(o`5?_K=sr@vA zq*|!USqXY>AC6P~B`DlHeljUY^phlCZBTt&H4+zysnTwdEOXSA<s(${xx~E5%e801-rJhcG#f$YFD195aIx+MiU))rr zEub`Kf6=@J$v!~g&2cuyukryP1Kh=5)?FU{W<#)>TC4iW<6SB;;>i@p;9Yke?B?4(#s}Lmv9f^72M`bM}Kl@b|S+GOv=Xs4s7Kr0S3w>|pNaGb|*Up&9Tq zBiyX+Zr;V^T3@6@!brq9H8UF4^gHdS-4M62R@Ceg#_vM%JyV{DkDlPjZ_&5x6u+Qj zXjvyYG|E0tJbJPX1)7hB^BEt`1&;i1?3G6gTzS0E`A6f=OpiJdBnyZmVI=#O++eoKs7^&GYJ6^Xi#6pXbz(c{F^{Aaz4|y`ju$AoCl_LS#l- z$l{i=xGBXJtvQtgKPzS@I#R`r`6~FjIlTUAoC$=9f+aPpyf?z;%Co-uvFzu?cG2E&i-PfdAEw*IU9j{kB-{J!7G^*H{s|HF=V4!IsA z{Db@t`?((fKX5SDuQK9G_kR^RJN^~R`II-}?-0@PFp)?8{JVoYMaMnRbaB&r7303C zOUFarh#!E4c-+P~JA|*Cz4deUZRoD6xx4XGu};o*Yg_8uim?sI9#t)wQYAR2Z|N=R zr8kc)v1wA(7rGaI6bYtTL&A6JMSc~3)5$iC0)?@TNl*d=)egn@ zMS{s~Fr&1og{yLike@#rr^?2@6--(ykzbh4Dkh0tmZJ0$8Jr}ZbNsF!W(00zpvqcsuIapA-FUy2@m@W9Q*C=w)0m|VWPNMnZIXyN zY>N5Gq>yS;Q*?mKOH^8oQ!SSC_eTucmk(>emrcC2lqXO{GRRA=LKF)mf}R(r#D4r_ zh1-u+I+hamPDiygS2mOR^<+&el3Ph2ioG*6`qmT-PjxKcaPb|G(l(JV)V?vn0sbyQ zhUaTSE^LYlPvHcB{QTiWrDLgO3YNic!ZVyih8N%{)*obvVy#ju5i80&VHF3CaO4%nr1vT~kX6PtHeD!!}oab=8kF3o0T zcr3xn>|=k>&UmY_tf?KCRmy%UM!sjsW2SsJD36Eam3ro~uAzAyWML;cF(G(ynsu4X z^a&=e8yq;~0>g+tGs(R0Nbu^D@fV(mJ~_oYKF&Bk+CoSD-LA5>nJlS~Xojv;7S*$9 z^J*Bg$(pY&b8DG%>KL=?DEI=w?6ab=xuTi5u!S+dg)F4LnA;XK6$%(FX=*L4<-AbV zel$)~lZxT9Br4?U+W8Qy5vlCvEvGF_QdH)Z>D|TQ^AE_YaVD?1@D&ch^mCo`ys73J zKZc(G{fOiElU2lc#H+l`hv z&W``uoKJZp{tn@tZ1BB{uzC~Sz1<@4H+xSOw=Ur-9DIGijp*=+vhml_RO0OBQ6de+ zafN$qY8=iq_cpa{rC=2ZsLDr!p!}e5+?wR_+cHXS$tb=et;}ovO28ML9F*@rAagoD zuy$z4ZOMhU_A%e-B_9ls%wYz~`A7(oWyuT-0|ySU=Zpn&0bFKCregYFu{T?Szwoav zrJ84`XE(wEwg|9liVemugc%;wz_lP4hfN9^BJQC)A0X8wL;=Boucjb*_zMK%lt$mf zmCwQu#st=ChU5^9BC4ybB+NtT!FYfVcasYV&e;U(2>j;Q=Cy?o#ADrdcxUcEo)1o4{*aJ!n)S6IX_seJs!ip0wb1M0%0(B)|b&yO#7EG4+VuO4<=XKPgpS<_P9?@}f$wL9njh$wENT45J9d8hF#mNl#D(4wL@MJwKXiMW+M3sSQ5Dnwk z!(Y@UPs0qSL4F=9C)4HlNFy`J1nc+pF%I;L+1l1#NKmz$pu#b)a_EJk@_JdpDZRBV zeDdg9lS7=q-yaWR0`rSvMaS=r^%8DyzMV6a+N8)xKlz}O?CD_b=@7rEae)_0TTj?B zPUP`Yv5!9x^WB2xj|$71ErVP7$F1yPtROBwDR_R0adCoi6}`~$%4$&h^hEOnXE@Eg z^h7lHn>E!wmSG+mZtNatt!^R!U%YS^OFwYa{sv_W8TJ!^hVWJ54@4UAuH0JIwg zUe(-K-P&B%&R*I+xU!A2qJ_Dnxh!lZOIz9$ADmS=@XNxIYHQsh2v-oLyg7kK;F6pF zF8I0~&z%)!1+!21{PR!vYqPd?=_2krUytU!-0gfT58-d^^$AAjJhBH~;o~`9$Vm7O zIr}~W=6vdZJ`#RD{?Yt*{AQi-m~VLBKmLDshpU?N3Pk)2!oQb@zW>^Yaevd_A-v;) z>_6_Qufbo}9OgVdv)6lMGaPnv{xyC}V#68U+a8qd73G5(Y7y_M zBOlZ^H&mDP^)w%LM^{kBpb#+nTKL1^U@J2U?hrWpux91>;QN^izR<3S2z#Vx9*N`< zCPtp|>ST?3swPI7aX#H55$V)$cu=yvi)?Kt?{rfB_Vr0Iw;zhTJ~i;^W3fm=ef)5c z^jPrsnnrbrmRgv)IDw(zDFFbeb;$tm@iYk+fX1SnY|>!_clUY5Cs}8ab0nPy@Fo5` zQV6OZ8Roz!-r2)?yHjvOtH8`kLR(xr9wOEY#br)Kr9hud3Xy_z8&daU%EIDz#m@=+ z#VK)#3XibODJg=^NoTUX%=elHme;Ua;v29_^UnTzVlvWCXe#>UbnrdqYl&E?IFl`Vs9E)be|W&29FWd}R2>46>XlLea|1?qomYm(yV6HDBCI#K=PpyRfNcEr z{m=h^VE1KAN9>#pzV3X&6!dNV`E#A$@$*FTc?*B%@J>Ga^HlgOm;avM;Mwrgpzj|c z{7t_>KOA$z`~LC&!#iBkoL3R4cH z>H`}`7Tua&azpxq>(Z*MOnPw5u!?Jkmfet2azje=#$;#H(BS%k#_C?Osh8{+VC)-g zoJex6q(@&IslvZksc3^PB_7C0cp$ZT_zO=7{6(ol?O#k4h)*LdmwT*HTGz>J-xxzh z2CDfG7q)aR*G2}>^iX{*z&F9VGRVgGJUYYgaRSJ0@*SIn>-d*2*~3#y->1KG9H))w2)OFu>pKmE^r@n8U`t2C}E2`F;Zn zndmijWgBU~Jq^-|5%JnakA!_aQZ$}hj9&#% zt&r51@yRa!J{*7N(YV`>M&FzsxH-+bHO<1& ztwt`ZtZ8cD;$a4SDLHf*2DoQdqj2RCJ z=2kW4RWoK+R;jM}wPZnES<*n3G!h_qSyO9yb8}ToYh4?2eLHh?J7akpS=>q%Hivm7 zaNAb47Bz%hhF+>}KUq-qKoFy&*jYU3MY=l9=3#nho9)HIqva8xT?pphcNgJa$rioi zx!HYpv_kM*%=Ts^Z%)XbPrQw9?=gJR3-9Op4&gh5pIgMvd_aH1pXl=M`1{{iC;#)w z{~hyxHXL)q`}cKv|HeCW^>ThXzK-z0oZpT=;_v2fl){dgElAp~2BIN%LC@D|( zDz-AM%-T`KH;*p0c0`#KNhQ~hDzjm9nPmwDmQfRJSj@KJv1^l})((wcH!$Q@DYXd) z@8}`NhXhV0S(np8S27%OfmQVv`6D!yqkwnrcMY7pWp; zTSeU-A4^2_)`ZZVNg?PxpzxiE!P^r8Afu9#-ArN1$`kXYDG^KMu#k&1$u(;z`|;T5>mzM^$l&kM-a@;OWW&5tUo>UwNj^$4iT|oH(kKJt9SEjgEyk}G;k`Iq zjoI_?qEk(FV32ehI9D`Q3z%J`9nl!SjN5#;LG$VnoOX*lTo`O#8y2`RG)TGOBXF5I z$))~LXL858G7bqgVs5OCVU?(H;tu z4(ui+fxkeQI*PTXyrIEUH;wn>NzSKJVKr;W{^P06hvOYe(vuy0ah!8`O5o0S3Lt}w zBn4nfkQeNODy-CK;;B6L{8m;xuh3SFbMxP(#kY-bi)iMIhQosY3BJU zf(d+jyyEY1L?}Z~o^SvQB&tdsA7mZuY3%J{?`|8QYVh9*%dd+X&$MbhcXGzkzx-zPtUs)K z{^36+)t+2T{@Nfgr%P~2FWEWFIWr;l990n~nyeO}XJesb{Icpeo@^f&WWL|We7C2y zt+TPZ1?H_Rtt*RbWjDxIi|fh)e9m<=3Jm_fS>Fu@*O$fhjU^4t<&DghO^vn9%}s5c zjcx2TE!7;Rt)P-ZYgs`J!6x=!D#-XK>7dj{BTAc_D)>*gtve&|a5qJfyV#vSbTO?4 zF#%(DmhdMHI!r`Bu-E8&rZMCEc{7aL{gxjhWPbEn*)Z)EM{s_tJ?t&OL5^ z?fH1ext9}&*e4uw!}}4t`J4B6!v8kA@xgO`7QT+~!JOZYKjQD^k3@9*9U?pKt>jt3 z-c$aq5rMzii$=JNv|Sd&qH zeR_#aV@j@1D^1%nw)DDDMOP&kSeY1FH`rM{z}%1$yFR7hx*_o!2F0%H9krsptZuDU z!r!C7Zh~=oxN{nlb2L`4?Xk1S2f;rHLCXsbW3s8Ya2QTtgB=zKiJ{Cs@$ zSCa~UHa_mgC8T016a)mq&}RUD)gR6r4tvT4BgIn?8Mial z2GHfZ)r6 z90Wj)c9lJpJ!-4<7v5{6I#(!SWpxc6YAc6YxGw0%a=3wcu)e*ojsgDSm(J=C%xq@#F0tUMlZ`fNa*v2Vh|ERpBdeZ4%i>V@)`;-56H8H<&`q9nB>^7nCnx5w@GJyT)ucrzI-f5w#-3NqdNAu zF`rgT7S*L#wy~;#0T*t0Q-h2xvVE5{R{K}I(Dl_Fy$CJqhQ`W9#`1=;vazgcE^FFY z>)P40wXMt*EvyCgg9u>_cC>gm8qQ?%s?-&U`C<4A*lP3s?m{s4zI)e`-~k}Z}y?SjsNnRKkvS+{vZB6;p1K(XElG}`_R|V9CO3_5r@6s&Ad+UevjjSiu--x|EvA|51zA=^OX2>IS223 zgde52>K3 zY)mh8XtVxPnH8^VZKxfThXY=s*bxAR+2gj})5WBj6)aqW& z$}SW~lMU@$UQky#+}}Qv5`8{3NJ!3QF3Cj~*Ho_(mMm3)C{Z^y0CNfXi*v35q$hu& zq~h^GAo#-x(NwNM%LthGcxu$`i9t{seF>Mv{^^XIC)f>Trl&yoFFriDG;ghnkc% zJd4WKV4?2eraFF(JfZ%r<%dVDkw6m4jL5_5klO3Fs@SMEM!pv+P*wMsVTSqpul->QJcXgwXpK&_bI0xuMZzB~5-!k+n*VI+D4Ucd|wvpTU z>QM*FSIJj1Y(?G-1D-H+GS)xjMxo#VZR}cF@YcA{tqkkq2^0%PX~foYOH*xZVPf~1 zQJX3^rbJyrzHD0X&SNpxrduTNo+pBgEj(2+kIC8F;6gy}4U(Sx1M2*;gydOApA? z1?BnDLJ^St38CwgL!Uls{QW!f6%hQ0g~J>t{OLsJcyIe)XT7kyS_f8^xBqO)A8h$$ zocyF%XmTO>MWdo(2{8jAGUb265RMy16nF(^1x`bHeIK49BnXli810fI zz1u(6$M9R;+rghz{QbQV58ZgoIbV4r-frHk0zmlFi{A;~!5j47E4-7}@$Ydw{7|{} z{qylU;aC>l_jk+nAo&mar<(I}c`x)2?sxpRX2kD@cleud>{|^3H z<-gnio@f0Jp0ktlB>8kX2fx{ff1&(N_&u0wpF1%p{@%shYzRj73NJKiz^tW<+EPO# zrHs7VxA?l$;_F8j-Z-x4+Kf`PP3grpk1V_)rSQ6;acdGos|GvxpH~hJEa@Lu+&8ei ze{l7H;JSX+`d+fGldNy6sTu2K z86Cv51RS9apG#DY3y8{8-1~f5fjbl8ZjO(^cdc5ElaL&Y{&-5XR|`*xMu_C!Eqs7V z)om@@ph>}~Kx;ugw>kr2(O*o7B9E91U(GX0uut|kFo93@HIMd?eeGp0kT*aj8qTGt z2~7Q571dN4lAIo)Y%2wBD9r?aF`vmiLQ2}Ta6d#X(-o`+f<0?j`P-vROnC4Y9V#IB z5}|D(%MiE7S{fwhsj{SSY{7^o^bF)3?q%<3XY6bt2Z7z5)`@O%qN|bB(LT}MKGIqa zHh1Y*&E$A9Wn>+0q15ONwPbZ2I8nyleo_1Tz(jILF(%QK;unNp5y!x=^=w`qfnZEv zPxFdLMktu;)+`8oI4N*xj72Sb2xE8vj`Wp-J>_VB_1|6{6~O8z5I``UGKCZfre2lS zbS9rDLkkF=!9_pbzWs0<_E7v z{H3_cIqn`1xG^ybOaF_9<*O&;&NTgb@bzW(k^LRzKnLSc=g_uB&a3hA2a!LL_3A&5UJD1YNRK zplx%}45LP}q@l6AnXRp*y{wh9qPc@Q$IB1OZ%WAcXz6ZCWkcdr+X~MxS^27s;~B6% zm_~HM?|1L1yk?c0)08*jLyY%Ae^!a;_=gQ2_Xoo}5pU$2A3SF# z=jr{=ud{zl|3dkl@Ov=Vem?l?!mgG}@$r|tzND=TkWthg?Ne;+@S^L}ifoxs3gdTe zddW?riftKHWXs6no01E!O^jJF$XPPbe6znS>}xLVZ>}6&cJXUrqo%mjM6-KAWx2vGsBS! z)=VPezmUWKOZK#v{q5yg59>@n=S&~-bZ_%?H}eDp>GqP@R*tsE9JaDxZK0IaRz7GdYbcFG zns9sP{jTPre%48d+{1(CQyqNu1ZrL7Nz+rFRGl%jC9z%~vUx-|3k7+huYafs#YmYs=vo{{R0^;Al;E{# zHpqMZA@k-#4zXRI+pPR0GJN4V(>(A+=Zd&$hH*N>IEmV%TR8~Y6`8--!tey}EntT4 z=_6#cz17=f2}h-^B^aC4jaMq0FI2FfD;M~4@!&IsWlkm8-QBu5CR#N=S!_It=`Fay z&yLV&KG$<^Tj#yz(F-cb(^2xrko>KXJXg$krF8HwC9S6)3_VjN`lm7Sn?gd!b$OeZ z!$V4+99A@IXzayNMUD)JQoFl@v8km-nMp5N+d?+BcQ$l%Hg>i*_prD0ba-6bMOL<# zJ%o;MguDP_a4b(1fVxp%(_B07cOIxT3ysU}2qOrBEX=rV;nAOc< zmo$!>Stt6p<((M?WQZf}MHjtA$jW!~`f*Reuu_th`m8+8MlO%x_j~^M>rWv5eB}e8 zKjQC`Psg8j^4iBgn%D8)C886to4=XYVf}Ic1n#lpzwo{~{`rJ|3a_8*adMta1O(^Y z!5hi-X!kzopXa^5B-cIt)64bQ|BnW_AUV&LPnUD>n~nGv%I}2VgSqx|#oxP_tH|pF zY`2-gfF>Z9a-@MNV=Bn2JqoW%DzZMU*ro{&Y@AST&FB)~FX>2|(~7T4DZF+_?DD~Z zhMdzoEF~5%edSx|Uei|h|wB&cO zGPkl&OMO>ob5A$f+fDGJ?jhvYQ{Y5ls9u3;O9celD3@1E9*`R~M)C;bSM6W7*br41 z)a@LGzeHp42CFTcp_KwK22p~7HBEk#NvP3x-mFTQb*7h#RF zBi+)pZbjO2sS3)R5;UqSDHil;8u$yg(h!us=@yKjRFh}_LdU{pM7)b)^o-!3W)*QA z(M#$J4^%6dr3F=nIT{8yCg+KP=KdbCtDPL`Vr2ETk>ontU(QkGY|EaeLW--=Rkr6<-IsKV9jfJ zWC?U@5|w;yF455>Ig%u&kQ5tlq83H&(zPiTPG&WD!C9BQ1b<0&p26P<29KKO>$Nee zu}sJ127gdO! zRmOR?xcoL&wlox}AVv`?8M#%-@IgV((17l@hrix* z;mtYWnBv2tKa=M=gZYzH_;LKf@J{$~==;Zy=tS%meuVt{{=9dOo&1mXwa@zJ>7Bo~ z$*cTM#1X>JDjb5t$HV&(FTdYS|Mc$ng%SJvrxY>%|J^1RB2eN!vl0J7MRamS zUT-je{JjglK(OL3Qtib|sc*{Ya`HmwxW$9wmZlV3Il9=2w2~`E6y1a^oL+1lA>h=) z>qit`ogBM4HO_4Xwu~saDJ2dFUOm`c-q%>wD{5XV^VK@?d{t_($?Mgf*Qx}bDsDVM zc{P#$3dpNfWnHVl_Kvt2Wp7`E_l<*z#({y_KRiI~FEWo%p2QKY3@BgS(Uo>2YOK|W zTnGkgwNfFLuNQ|U6ibJyf37AWWF(@NScUkv5qSoGQNB9T!#LX0%gaX)h&{Eet-pE z>tY`{O5$*LBdbT~{pPX_fsPI;sJOeEiz1`HDS5BTTphbvYMs>NGy{JlHVOeWF8BB5VOh8_a zlQ)XWD<$Nm;xfCmEG#bz%gC(a@5qiJkbd|v!~5a8`LDf~PQ<+TwVU^H%>4HW zKh>Q5h}TA(j}O5S;gHZG^CiX-+f;?G)J z$4&52K`OFtT?r0FUa#H7Uyv7Q1}xOjBVI`wtQMrR$z8&+>B&w4yEIIs107{gJHZ4d z1qqcZ}2fegs&L#vm7Cgj47?)YvLrQ;XR;`1ioBPMH6~CunXIb zrm0nU)RUnW%dVcP@kp921i7OF1BZH#QW>RB|*D8M}I`F4j&eIVPLbZn!W$2q_D-M$ZZ+fPNBr$+7mCi7`B8rJD-7 zBjq%0lzD2Tb8?ikf2bfNm6`7B8Eyh+8#*AT33m}xc(i47 zP>^T*Z5f&07~xar;>c)t^0*!Fx@)EwzKbE|KDY<LtJP6*>BRI36{Isz%;yK(rSJ6tzS#ffapSUv$Ln>}`5z8~#-O`0Gy;;d2p_ zRX8T*+V|%3ye2Duw)c1NN4!q1$7Imo&3~bHhW=(=o$wEGFa5lZlmB@5k-a_r6Q;w6 zzZr3y@E3Z04}x=!dm|Aqzu!&&H1g`);{pBCyT|?iukGfaSVSkU6Y##Bh-Z0i#KYf99bAyG>QMa>@&J*QvvoW5~y_9^sgbLTHrv-F@5Rew(eir=*)$F@({Aq|`*5EQvoeRu;UqzL;RMN>LyY6-Hv&dO0Wur$ zNl$qiffVq<|FFrC!+?PlQVJfzc#VB`N;iNOpi=`q- zRx-ySSEq+grU$Y{J10jPStE=S!);w?B?b2n4V)Mry?20Y?Ix=`DyY5H!+ft_kxf0z z{;68b#q` ze`_0#>pE`X-MY@gM#04mgY&D(lFIg+VluCoyb>?37dFA)Hwwt>g=A(CdA*p-E-4E@ z;j-53a@HH=t=SdLxm7GAHRjcj1+_JMNb$Fc5}Q?xv$d>mFPl3WTRO{IUG?PO>K0ho z+W1>DnLDV&rU}*7XOvw(w$$pR60=*x|Dc2n64jF=rvS7qDNTYM3uqwSQGYepW=Ddyomu zrfSTN&Q!WlPv*&F>k#GnU^)%6P!8OWJG75#We~T;53H_WP%mA@DuGu_V45d?;XQhe zRvs~p5%i!0k2*_T6ZrNNEMmo9e9i~Eny{VW=iu`FptbC1qwdzsKIW-`)|mwRLQ2%B zVWA^~t;_+=(f%>0H@wqa-fu%-G;~5qV(JxFXSiF8353;bBNePx2!``aT$uU}KrlAD zhOGf#_8$uP8aGqyE5i)1RTHc<&B}xZcDRQL`|Iu2va_Qauos4bp$fkEsILyO&h(KJ zJ%u!-bAzn2gN$?i)F?hbNTn>n+4D&@DN$r>5i>nXIx`YpgEXd0Ml&S{F@Y~8YavAd zmn+5vK_L@KWHvc}E+b^K1AR4ijQe^gn2S%ouXC`6xu>&WS?}p;?Cc~TbQUs;$;>*& z;)DWKqileiXgEwQBK4bF%F;TrglK6)Yfep^8%jgk+!YC_(Ba|E$u#>+nssuxI;g3q zkeOm(hRW{2<~swN4Sk&ry^Z$=J8yBcF7p1M;K9@)2T~tc-L=3|Rb@;- z`WmjC7?9S5q+i*FHFHV*5H*5VGznmguWWANf2L{PZcAfbTVn$Rtxnd~E(Rx$%?=i? zXm7sK!F+RA@wcW|**?Aewn-&73@!an|^WS?U{5ph#uh;i7f4wXuT+B4`kHFl2ZU*?v zv{2BH#vvJ5&iGyHsMmYP&K(rDD5>zWA@P9hrsUANBx6;wxq5hDO^UN>h_yB;xGp7j zSyJqx-Pc^;%W?ujTBgO3I7n;kBBm z_`cg-C-Z%PW1>k!^4JjT#8CSscGaJ;-L zMC$|tv^|Xp+*b=Xz?aq$m&65k3yKk1C1`np^|%Pw)cO&FwTiK(Huu*)u5w(^TqV{X ze0odyK;6en!(4q~0WQH9e3UZyie~VQQG_yg5ZjZAvgl-I(sWIn#A% zii$cNEfusgi`J&n)(X$=Ng<7O&ZZi1VS3=z**#C!1{^H)EKN|q>!E3q>fDa15O+7t6Lc@JA;NI}_M#OWtVK|J z!CSQ_S>Ki;*(9_`sZp@{od^%c4(1Kg?<-ROhlTG{P_PqGh z!EN6QKmByb@tHkVj}Lezgef(8fJ_6*D&W?4oQf*j#cy`^kn=)?p zPsLxaWza-e6D0w=UVrGv0BfzrBGc8f?=`Kp={4T21zT@fgFnamZ|&yMC0HXnoyxbR2El?;fK?UvJ5r;`QR2l^zqREdTPB9oPYvBs>xY61ho1PZ}yM2(oC zw05|@q@VI$B(3bv_}e&6HfM@6MG}rkSfN2Oe65Dtbp-Z6Mz|C>hmko8B8%zTgXt;+ zgeb!u2^5A#48A5Pq$Xpe$yEh>LDdG(HRD}qssCjJ?xHmOe?Q|wTFOOW3Sc*l@$P6c z9UBWlGU8;@X=K{wip$yJd@8l4i?#$hG?QqX71=o;$zf?s1tA;gU1qi#5@CzVq`*LP8h~vZN~1% zkiuJN48CAugbNtw1B?AUVfugJMu*WJSLXg?fyCh}mF_DO0#4-$ZaG{b_f(c>$)IE7 zk+LnCbL7c9(F$`xfpW1>YcF(OEOZ|SUt%0{N}!G&h!(fStJ}wDo8y!%W8}6ZWy2U+ z7t8Hnwm4a&wB*w9Y^GspDKH$n24FQ;st3y*4dw2Gv-%u=s^8I>fv0ErpPk}4GcoYk zgy1zP`p?2?hDx*iv^tNwF4QwCD&U!Zp6^BLKk6a=Etr1jqMy3x*8#L_q-SeKpFAWzH-OT11fNG-9U5!d)sN!uxtqH;A zS_Ir==w#+9{s$D+q|yG`?EH8j#*UwLWwYZi(DqaD_p{FL1ruKx{&sbq);j4m!0NXI zOY^mQyacZqu!#@rHOAVsVAm3?w>q82x6|zLx}KeGcD1j)A3NGNO&O=;+xhq&>r;3M zkKgO>|6Q+-V{KZ`%wConYk-$v+{^rQjpn8Qn)qu&Va8wFg8>Q+RH?KV{VLJDxF~2t zbx8e`utyHVDs@|}W9LLyJ>10Ao>f`2 za1<>AQ{QOXin6D89mRY>n?~!ahpNj4aB0*XW8}URu=^4g>eJ!3*HCkiFNGO#6xLN9-=W<*Suo#LV=rUlTg)J8x z(f{`uRF>DlBi&v^t?6_miJDNYKG}F3D_TNF^@%#F!ZR|fbZ-N~%`fJCG@26;77lVE~IYSK*3V*XDA zk{S4mxLm+1TZ~bWVWJ8L^quk^%?aYbNT%TU(=;dE{m+^5->1XjOCKZbszxIC3eng2 zL;zVN5d(r@e+D9B2I#yWz|RXz*a?!C|rg2p4Atb6NBA323=@IG(+o8R}ZJE%*&K24yTEedCpV$e#ghV_9Gg3 zFs+2+wIBNqP)%>k7}|;yn`D94tx0$l$Tb7_u8*Vr87dNXko3JHo?8RVwpnx_mkt%s z$tqV%ji;%`@5uDf=9$6grnxUocU_$5I99B!OVyw2L$ft@m`-syt8}$omz8c&<)#Tv zn&6;GPMS*eT^Icr*}D<6sIPdZ7cGsV#n4^{(RKiFoB_ls?hP^e>wV~D1SAhrmk$%* zj$RW@t0QS$q_VD;SQbKy!}znT!lR&pxvRoyLoeDGO&efHA4=O{T8GaUXbujmWZFIM z5&mX;g1?RVjK5HU;r~5Z%pYwV@VD08J}>g(%!p&vJ>N^vp9*IGbvVlSO7`U9W(4@6 zxujugHqwi*78y4+zmIzqS}}&`z;w*X~~@m_8CmM(_!eeVAo5)TfUQ67rfKA ztn1d5;JcS^Pp60I^kjVZ{ol~j<@fl=X7vT}7dN>be+`)nF@TBMtx#{BGQz}nM?2og z@?TjVylqmC?URDH*SdDpu)@2gT5PDGjg_>eM%K^pZ3~3RcO<0x7HTRC2CvEnP08 zJC(=_*8jh6NfaxD;}R9vo3VBmyFqvPllASPXDOmjh%!xO^J5lRCp zy!W7{NNVmaTl%X&;p0Q8X*iupMHa9FIwl|wsxCagusr`iNb*G>7U0;Rql6&9f9MIQ_Lr_Cu{|K;fI6j_=`oaPxYfO$PEU3Dm zjE1TUs0EBdoo784x-GyL-q>0uglQZ=RVi2uP)ov4 zfgjRYBX|rno3|&qVL*nW2P$I#4KpQzXaZzqfZY^zZz8;(Fu*bZ9e~kwoP3o$0(-r(CF&=W3igG9@(MIz0FZ)F4n1A&fTGh!aNeQZ9m@ zom8#SYzO^onEvx1`h76X52v?!(30M8Z3tAlhp!f=iif(LN!o(`^s`|475JiK-AhI( zIOmnUX=OC6=_A&G*e!xT&gubT-2n8^s=oZXxex6aBzBEfb|J zrc4C_!mbV&_{+}{*~a5UK1V^r>wUbC_GZ!M3Cy6~|mXGDMr|aJOE~^|Mo)?W)sS!%bK;G1q!E zJ3C#gKhq*?9mNt%ST{GVslI~s-)mj94s8lv?{;U?Ylf~iy{58I82!GxJm!L17w|EH zeZp=IGk59qWbCv3?~%Q}FKg5HKC&*IHO4NOPtLyjZ>RVRwmaajrc$UziJ{6K<22fKxbrd`9*Qg+KMu-%2)&GLe7v+WxA}rG)4gBT2B+w(z z;sK1OQxFBM{AH$w(A*E|BqEmakbpGXi@6fPT}V5H{rM&$i0as1{3l>EJ~*t+Q^lVV zcnpFLDDu#M5kNJabzb;_A53CO5C+yM>c7v>8EO%4Hk-q%Fzf+_LCZE?QI8l^i8+B6 zCHdG2%|ML$O&`s0U$6GxHj>^5q<4|-I@GAt0|#y#SIvXb73F(2nnm0p7hR`5$~0{EtJ+mXV`FG|dB0#(I$WhX+j(#7T^v3wZ4*O%TO0QTd6 zT^Wx04BCxK2YGZ7Ul9Dl)8+NK+Lh_*g(Zfx#D9z<31^o4RoKm0#TWSPgua zh{yC`ytPDInyIDvS}6I&7hdZqreMvCO>1)V{H@LI2==wkE_b!BeT*r4jr1MxsXbmZ zbhT-p=Tq_5>vDajP5TKvW=H!lQ^pzkcK+||v42^1+4okmE}eatC3l6tUdpfG1vc1b z9f-;zr=;P5%AC=GFXu%rFOOJT8M7yJ*fMc<#{x;w?My_DdKJe^M{w}%{)8)fPxBnKgTs8HN4 z*X~ZxZdIx`%Qe_?FBK|h(wGG4KWC`Sfbk?^keuyB8aR_T^`R}OBs-WF+kFWfLH$-iW&<{t+qy4FQI316dZRrxnLQW9ZGeV#; z0;_<(kLV~l+ZV=OY{Kk3Q{olMEWEU=qQWLTO$YTf*om)}b1c*4Vkb1;odfAywt9Dx z4s$X1J^q67h=yMqPap`#LL@UMVWATUJA)o@s1;{I!Tf#)z>4%_Obb^yGK|1OHJ1w$ z-@`C~?@UHvfG?AJalvBb@Us0GDE#L+@T9vhR`{V<-ogl4hPr+uX>+^)U*dMKCbF4= zwiyjY@eb!X8?znt$?D3Xv>=LJ>qT!w(SiZA2w&n@W!rcaN^5WSjQL<0H7rD@vvX`$=VwC{va zmc|6g!6f`uM}V%oRSM8VU$-;Kr8`z8JKjoiFG>%4H%=^zr41+!2;F>)L_=T|BFFF$xO1$!KS_hKUk|QG zCWn;!lew`GAXV&3W`h8VTpY=eN3+DSYW26LwS-lUpz(l0bSw!acHUnr5505#5x;Vu=!Ms4umx`+=6ow252VY;8*Sd z304>6lbwPx?s}{SzDvYodaTveTBt1)HU+ca8rGFyEjV6+eY|xD2!Ct*^*Rk}(*!c-j!jrHj%E(U5KalWV)Ke$c`jjLRzN4RV{S0);^6@%Xjey}UO$Kq$HQPAh`cAHIsf-O73wok@&R&% zpg2!gKANn2I7K3L_oLZ72~v$vr}%E2dK*Owrr@$LXV=Gb)eq;8*+2`4%0yrhd4LG3 z8FUZ3nD+eX49W%&GZx>Osv}+qoKCBT(uR1)hB&!(thy^z?gFz!hCG;~9>|n?$0NR1 z953-Sj0JHSEr?+7eW?e%6iy3<$kj>i)yc}%3~fiYvNMMoa>UL|+MYqXa_DfWzAsL~E_%%w)&OYC1bvX_+7zOZ;9NL{lUssuZm| zovPw+>H#iiprl@sVq98*pPb^Re+f}uiuSx6sV|BYtob6G4;6S*#J((bPlkm0i3b1_ zYuJ~r?ay@WOxM3@@a6CS**n^Ls z22M5*fC#*@cbkrcJK2{`;7U>9n#ueC8;NCFa z{o81&QE8L}nX}>{CevVVFAx@pYN{7Tw6g)e58)NJuxXb@Cr4hf73$&Z-x`0-b;Ddk zy23~Ff9iVJ)%xSLqjiX{7k>eNUMK8zo?h>EXVYs2uTAS3np1s)zh2kpf6C^Uh`%=E zH4~9I{|F(Pc*PnR2HpcdnifsJ7_GmS>VAGK&ChYXU*^ATLh$<9p4+EJHq46NGdlw8 z&_|x?(KILE=p6s185;PXk4$nl6wsPjf-(a9tsgCRp*mZl0{<_nxMJmm+OjK2ZOl-h z|DHh>%tQkD#;qv=+!uGI%3GjkG=i+|f|(F+q194*8K z^jii7iHd=%GNN7#? zN$P)@rU8OKhKU%MJCo5C;0xr1_6qcbvlzIEXs8EM6!?5Q^4MDbL9O%S$w7EXKt^gy z3a~iv;~6@_w&67f{=!NO{6*~p7y-=sP{_9e{vz-U(cs9*x;t5ZFiQYrVH|*7|KV)j z1oEPx6PhoC59i7IvjiBGQG6NoBXA{e!?%t{8ZH4TZ`J9z@@t0Csu3tHq_2x7pcU|I z_jo9DYD>A_@nRQ<7E$YGUxst}5cw+jE`nk2WySM1q4ZK8T9N2p1xxREu^qURO$~We zpF;rRJ%x0zSnkVHc8-_JhO^1~?VgO?NJHD7<33vEI6c|_)I_~)lIzT5zve1BUFSSp zqF}0Dhf|G0gN)L*P!*vM`YTF5T~G9L6$LnFg~%WDlD~~s=J%FM5Htn1H5kQ{xURvW zd{<+x3)O|TB+(Y5_R!u`1uRtn;+-j6s0gV;oVT0A9L^|$fKH?l0dO$@!ORFbJDN^S zSpxCQ`|)|x`4zM@}bSLc0W&jRX8+#c1{18|Xg<-Zw5d6^XiyP5E;ja>Z zu?AZB=p|UoV|S3qKE~S76s&3g*7$1yTvvkqBq4j9r`Nl_o4yF{JBfWx^Mji`7-^lA zeT-eUE|iyGA7hujhFO~!W673azxYcl?N4d}n-S5v3awXxg$&56INA9Gw^X1a`bs9kst%>^4Ah<*<9Z_}@co)z%cn%F zofffqX4KxG6F8vRC<06QW$si00?Ef!ab1S-8=%2Q6K&~X$!2Vw63I+}>gStlqT|6gW8hSKLa zkrnj1ixfh6ThX~^B$;JbAJ*CzU%DAsnu3JnW+qI2s&+7L?hVYEM7?hd1!!L&1s z4)moHL&fQl;(Ux~A0sa%YiHuv}wdG zKfw(?To|GeV}@We*azSoM_$sOr#tv^L1msTq41g-E=GPdSAhHC9)S1>?SnZA0^4q& zO%>M=SYC&c!CaaawurTHv@TKGm?QySyI^Q7pw51PsT!Hm9h&vgMuvF0^r^Og&UWT=zK-fT&>ihD-r|DwwR_>7%|L zO)p>XN9*indJFUmU1H3feb9X3;YGc#xVrX zm(i(mYO4}wYQ^bEqODf6R*BY1t+~_>%o}@(#i{8%Pu2BVn&5gOfFs8uB_WOxgd1@F z;&w({m6c0Mp`>hoTg72a23zXNposPH9X36G`UYlOCb+u_; zD+|=HX~|xKInsQ!X2U`4{dUphZ&_E& ze9J!OZ;HRDzo4V+w@wJb@~CRCkbQ`fz(f>8KOEtCHLJ(cnm((iMz5b4xqV*r{wMn$ zexmo0c@f7@mvB~S^PHZ|vx1=fwoG;(2NC5M4z;RJkbA)(6fY1>x+hfuOT&A8kOju%=KKbh;gT^018*7INr zyOlet{6GV8ARa2Sa%c$cji5a}x$WyE8p5c)2knifBZH`AxM&?or$^D*7ug$m`>|+*re%WtioS`BA$N>>PidtizxCrzez;=5V0| z4q8K)v=M*x0U&rL*H45+nzi8B+O3&dd#yZMs==p;xb$_SX)TJ_j$uWz0hZW&@KCAE zrH;mY$M!VG`UKa)!RoJrXs$w21qxWSkKq70k>8ZZ~;Wh4bdV5>3|TVQS`9YG9su4LK3;^R3=bFPX)!^d(2+`CAd zLP%9}w$hR7Pzee!4r@_MJ?6bSVob=Y_UIAHr2XM&xt%TA!_~zZHgZy zNa`ucsWJoue>td`lXw(7?sgY{A1(2|i^JE_W35Q0(EW43c;CTZvss%M+39%u0_Zy% zdd#b3LhYj~_v!!Jr|N37HKwZpUG-Z#e(i#Fc`e}^{I$Lme0`Q|3D$)&d+cMrApYX^ zH+5da{q!&+*wlX?zB*uw7P=<GkZ483T}BKO`b5Tx^Fk6!;c*rb@W& z)}dbcSZadtxsuu^vhoXBLKL%O9gQ=8x#T_I1`rJJ1t&8couK330<|!}BE!gNP%X`R zMwjwA3hP1!wT-2gL^_q?Iy{C`eZj7b>IrNLMpgHz`mPxHb^y2|FgN?OGydcD1;3hxlS4i zLts20n*+4a>e$+RZ4DQ`@6zBk(O$NuW~18E{rAyI~r3Iv@F!O7`FQ{D9IzGC%QXG5-juv9%< zA&yN@j!vMa3W8jp#kS~O`Lu2vy*rRz?nSRfp-8=F&-{f<9ZH~48Jy&vn^o9Y16?q_}siMVCpFVtSxnE|O_iEKhcx)6AqbL9cU z)r%kmOvRK|nR0)I*pKk+3^qF>EghO~3(U^22^3OWk!&ke+RC)na(T3jj#g4j6}45W zr%Kf$NT929otqQhHmCRYyx?E;rc&K-{sMm$a!Uyn*u0$`QUMl&H_{HlUFyG&mUU}Q z_<99vMY4o$o)5zMF!5lE=v1oXu<4VS|5tZh-HR@uDe%5Z?klYdvyX;<=6tScA@2E0-rL0N-n{Gf$L+tK=0U5bG=`l+);Z8g*nj&ZaqF+HFmxt0l;g z1+RsQ2&FqSJiBAH_kxjN!kkx^ap&cDgCq^nQBk1HPIvuBCNmJXveqm>PDPViK0igRoo>sb?{E*&Ws3>AOuM?VUq*)EzO zDAy<)5KCeR!8k1Xb8--s==3jOy@+@0%61;Ea2~Bvk5y|&szhTs9W147*|a@}c4X7$ zG+I7d1^B+vm)0f(Egl^B+aUVBoBk<)z7<42MOCbL9dTSsN4tIzDRUhJOG^;S6KFEt zEerict%LqKgnmCjzBNLC$OS(e#4YbiR1i#sn5(7?&)$@PcL(a<_9L(>kC!wnlwKX} z+MDh^YGw%`5-bgmf1I?7j3EYJ@QoM^`Y(VO$}b}D0nHe&H=VWVJ;>h8WPpbM7yS^L zQCk78K-fHSuEc$|+zEyENGTnyfEKK^RydmrwBv=2*4oh4S<$0;U7Vug8 z#Y3t|r22B?m6V8W=Jt<*zgVNJ_3AM~r^BpHYoW6Quc^9&FV+}4{(8-0ZCZo91Z#ko z;57`JpGnL1n(d2k`ks&3^O%{fYikML;IDPLaP=(N608el_SnaKKKum=+aUN8E-X_Q z{_9tSi11p05G>uHp}BM!q*6aa{h1O>&yIF1D-7E{HGKE%p1bGt0RF-YeB#N_V~D?+ z9(-_0#Ih96&w}Xr9=yWu9;bmm2r9{8EOa0ZP8FO2jDR1IQ03C;N+h9(_DR$M>I~$| z%#g5@a+}UtFt8Zli*PK^UfrnSW@^5SYgHhlaNH^v7g0kn3!zrp?NZm(JheSTo*OG# z<2e5LLN=gKxmWABH_dTta?p+;Vlh&BhtrW*I+H{f)8zGh*R7I(Yx$ltAfk++GYD@^ zR4>G}GF#U5N z&2dqcWKaW+q$o;~5TgYWazzvhQwjnEXDjqf5WR&Qu5q%lSZ}J(j#TT1tCW4Ev>O~y z*;Jn=VVd5Rp|6j3yxyB$?MDmaJwNNEOjSXw!M@S)8qJ9ouf};6jdm>@J$Eqa@G5!8$ZwOgMn3zoa}5 z{c?z2pXzDJ)Q%cz6BQ_xs2|8u5j?*w&ABN%V0l)+A7k}r zdQiR*MTQhA;H;TXga=(S=Lnm|LvQE$uepl)zFKR-*DF{nl9%wQXNB>;W9*&w35{oe z@8RY(@$P-JZC$bMfG>8k#(N2m=JWpFYnTbX_G5Vs@ZI#D@hji9Utv@J27j$D0pFJ; zTY`1P%pUug&yBw}2!0&?LJ?+l*mzLKX&`qI4cQZ6f`&*+kyPQN9}b}R3xf8{iaz{A z)S-EJ?bY&RaMMgr*fInZ_|xa$%3GM-~f506)oObQi-?az7C zRxZy~Ge(>T=Q9#&koG$hQCJds94x2?^TtEu1q6eF5}Gd{7@!7dgXRkWf&zH6M14@@ zf4AK4lEL15HBGxXPMl4qv*Q_>QO)NZ?1y>khG<&mPlrcnM}|}LFoHApOrp4$rd=4P zoJ*qfV30-*>H&9~Dra2(MtQf^vFqns%W~Me6aEVW@!M`go=v z2&ouLwJSF8Hq)}-;dCc-aA*I6ITWd9V3@y)*a+kKob^pw8|=32VX zxM+$(HTY&xNPuq-0sF9sHr}1B%T%MXdW!iVK!!_<8pmEEzB~% zdbZlxTB<`$MuzX8rKcjO z#-B0;jp9-ZibJ4~2}dyFKKjSTUn~*Us@18`=>U5tWb+T8V8?|{XY=i}@Xo?S-!b+c zYrH8~cxoSGm+j-N!Pc?t@7gEy?YGbQ70Zt<@F)M)njjg?={L^N{wk-DgI^_DP&u>4|$DFO%JU|L-m z(ljIb7{^})AAiChrGfWNk6N4GN^fJVLO5DbRB#a#|~hn+)zIfjaNN+&i@b$+LI`_#y!Z<>tX+fy#Xd zenybOg)_vbZpg(~-`n3Xn#^7u=dAxAmqCA=EP34Km4Q=(dAc z$vrWGPRG!>G1QSnSI5cgDH__9WaZL0MzciYAYKsm;rO{5EHbSaxI=g}3TY|zaK8XEYxaPnZQMuRdA{6(37y<-qj7VyC| zClZuU(1C5pvlI|(7*8PlicoMwRegxEw#Z1DYc$ldM>$=X>ub3(AmY1F9Ps{Zy7wgA ze?r`vEpE+VoAc%A^1@Vcda81EPT-kY5xa{6=MSQP^U!xR`nF0x4iNtqD8KI~=jk+A za#47|VuC^QIEG{l(P*MrQbv=4dbLOh8UnMkkSO01X!vKLrNRX~OQ+w3(UJkQb_A^& zi6Ac8GEUt#PTe$Cf){IRnz}1ptxr`EUk&YbX`*;J&Qa;6IKkC#f#ZW5N>+gUr(X1n zzWPjmDmLoTXQ^tfzw7Bx*Rzr8>;2^018I4@vLRL9n9K>hh`HK1M%x_A!5J{MB6KMAJ1LnIK@u17ocQ zUM&1Tx%Mc?e4-T*OH}Hl=Z34$c2CTWJchKRIqpWVK+ovCD8v6Jq4ZoZZHRU4Oi&Q> z40?oyY!$CaIBH5)z`OzetF7@!w3Ns46s&A0zHp|3&X;rRsNgtffG^Ti(eBiVdy^Ei z0m5#A@EHTjm}C;+Rktf0@ZkdNI$(tc^F{{Jf$35zT}u;}(xKbZg%k-zxNRJo+Bihn z5l(F}?i0i4>_~BOw0e4kauRY3b%3lRMY*1;+)CB(dO2BuX9FM(Gxce-vC63g707#J z7{M0ZGKQMRFa)1Sq!aPf980b71PiwLdNG|kvZ){0pw4r`G8K^iY>xX_DXd`3VTQjm;y zQH|nq8C|NR`-qEX{FQg-Ko=IbXNv2yM8{0V-_{v{M<<1^9Ut(U2zpYXX+(8I(={y(4>SFcc|2XwgZhGpb7d%kiaW?@Z1#%j57!ok=#1RNzaGN_xs7k{pj6j zS~P%GqSjT61nJ7^Sf;#K9Z&0%;P$0WsoK_@fLG$3xf%_Z?BT^vC{k0$dbBD(R2ZZj zjgs*UAgIczJ`<$$h!x-31+-pWS-|nmbIDn?=tS{q)5w8X0 z1!a^=)gi+-J;g)6>*qjvRDG(Bcq)Kzqrn)-*+vHbf0es;FK2c09uukVAcwX6?qQBLTo=_=^D9&*8g5)YvP^3h#qUs=p zs~nliuR?x8_+djZmzC+(vAKa5h#7|-`{%WmeqEc^iqzH8-PMUq}JwFc@EZP`K$*u zcl^}7tPkZSeCm$f9Kg5sUpI3{ug_&|b|N6PkZJI^0x6oM1sejXPF_UV3N2Nb(V$%D zFhZjoIEsQR*i&;06-zNRrYZjPi~iJ58Qd~648hL_W(V$=7XC)6{An+Gf3#y~q66gx zo1l6i8zoyoLMS|ONZ16|ALxad0vhCg*}U$-rUwWH1vH4T?oL(jOi`c(bGA_pdw$vH zYY5mx{1u|0k^Bn^N8s9(QhB9B0TIWA9MCBzl46bnuKlp8A49!*mrs(IlW^hAfxVec}HqlR0 zZgH(-`Qcpk9>SYv(FaUKsR5(m2);Ul&P~@^>jE0`0vC=@{}8SHBEs+6{%RRfCNbW{ z8|G!GxBU>`E@+@aLsS}Sm~&y@fC`KONrJ{oN>(_VCecBe!BpH+R)x`Yn5>=jMn7%s zD9?t`j^%^t{Xqz9hPz*YN(=bAVJvM(qjl-DCY`nyxOV0SJU5WCRaRG_9{LmGRDVT6 zXG~JqoRXwbnV&K*So=x1c&Q(~H-bSN`D^g5ZclW8yK==yKRBs>6+}DqcL{YLpyVQx7lnzDMg%u5mlQaj|cQIviLf?Ljw>r&zt<&r3Sk?e9!5Z(?Z{g+_6uhRjHm&1+U4nH1eTA>` zls@+bF?akbPqouyd4VrB%|GAMvp%V}V8h?P246g*8|3e>pqco~5G)-i8V(57m_3iV zY)SVg0Xrmo!IS;zl~{F45sc3fN1u$|JGbw<8Om?_(aHo3h09UZ4zVjoQ7I-{fD?EZ z3gsYqB%Z++`fmg1h4YnD<@&h^ifMmF@j;YY0Hy$cQD=ec|Dp;o>JP%^Y{XxgnZF2x zzFH|Sm(b-BVYX`}2xeCJwMbshrjAUylu6fflv_EDtK%gYtKi{1m#CkK*V28tR#n$?rO-Cz5cq1rD;xqctx`NL5Cx2SzE zLfbgTy*b{wdIT*WK`UdCO)NJgNaPf60`o0=aaOvN=vg!RUATtIzh5-}a|k<)H^ToF@TE zj2X_vkxpn}ngX&TgBX6~Vk9m_(!vlNxTclE~Pfmui=X;a5p5n;P{@b&=_K#YCMvfS}j1~{M&Qovi3AHR7%9Q~gb*x1@DN&(ypm6VU}(X&3-z1X8ltM;-o2PiSAe00j8LmfiQKLj z4d8n-gCY15RNZ8{oPv=A$i9NC-dr6Jd~PgV&CoArIL;=pN4O=9j>XWCQFM4DHO0_z zn4=SfX^uXVE<3Wdj(oK}Ux4ijCkFhzTdUyt;a(l`gPcfrI+ZC;jMtje9Y@j>B*+}g z(NC3oF4X#8tZ^bg2t}Yk?0g+j-&5HSj*pK|eY=)j-e^#$I}p}|EMsJ8%@BBnFBmb; zaQm|5*$5hkb`1QzR;QmX_n_?Ze1H0*q!(0r-c7#`q+bT3eh^!aCrX+?RISofmwdvb z{d0i&lOB#=h3mhG(w>Ww&xOnp~er>vL#5Vxfzi_1OWx>c=>A78Yk1T}T9} za+q7IiwO9BgzHyPju)floBe3f5Ly+($i6Yovto$z)d=;60W?vkG^3mW3@?E~0@UDP zMTH>4mdiFAw&yU-vgT1Wq{~66Ptj;@F#V>tKz`Gv1lOLlfTo+xFH-elCsi~NnO1L&6fEbQow3ZSs>Zx_;o#X<4v-yJ2Yt zQ=Cyu5O!t{^j{?IA>hiuTl6zD3;wW-zfg+t^lCiAT1${!@V!sXJKeYc@jZ{9(|2Fr z_2gj>%(GUr8QjbnycTocRlPgQyEVoVJ`?`>ewNSLW4~5^Yx%RD+m|)oy0#FkuL*+L z|79Je`}0`W*=ra3dD>-bn7O01`E?1t_lx~ZIz4my0G2y3J2Ub!9W-)(RSno{;I9G4 zoHW7u1s>y}aliARQxjaDaDyTkiOVq< zR#_BfK=9I?NecL{0KTY&1QpoAU-*Ji2pB|IprX1}rd}@;*K+Af7PY6)nFP9k*eaAm zG8AD}Y*9lYRbCw@t|im;6uOl~cXGw8Y`T_#F?7Xfm(%Hbmbjg#UCj~~QwiSWtC?zh zifBuqvtyOEBn4{k@pw8KPsheQY$sr^PL<~})bm;LJp9qQbg_t|q|9isTeSjbduR+b zjH1Q_&%wliO#^A&04{sCJK1qK$8#*tb*9L9WrDLEq+Ydj6%Ql^(-((NgLni~9))zV zfX?R9c^I@Ou@@LP3u85&Tc9c5GAc44?e|ulxKgd2F47tj#PVo*-9fKvG~X$~{q<@9 zy%b6adwwod`AMMoo{RoTqwhKBm;U1UQ1$KJ?)UmRmke~gKS-do5L~*;1|zmgY#Hm^ zo}wMdR*>u3nx`H?o-Bxz!Pp7oFj$up2=vjb5@_idT0VyHm&2vf3HZA)mo@=^3-oQ{ z{eBX~k7_WRAf%6fPxwWV2zRsO)zJC`QxX8t8l}TK{>NHV-Pf z;C-W^Zz|+c!5G7c2Jl5=;Khsvr~!YOWJ;s3IfL`NdkTx#q~ zx?Q#wBEAk?{8?ix!JNU`v;<6Gm+kXe>$#U;AM+U5+Uqf6KGR#)gkHjDn&e9yY+W}9 z_Akiy5atQ{_J6rO)@AXU)_$IL*&6oMoSt>Ku7t$D>7B}b=!iWaZM`Ynmq)+dTxX&Sih>pAk7 z8pgA!dG9!aJNVEz6^vNBlU1m|$cWjV$N{JbI=x({f&UqR!mu)()jBj(4PdV*SfN0u z2zfH_SA|9i{g;uq+=u~27_boudJe zw1?^~0<>7|O{1IR8GP>*h`R;iPM*A-D{kh>>)DLm*K_67Y`RsTK{!8-E&-Rbw6;WQ ziKQ0!d=p`Ire>56#%nU2Ockfn6_9?krg3Y_pwn4&1|JOt7PA>NJ4(b!KvI8tFNBu# zQdUNLmWAu@2Gd*q^iD7>>P0L2P{T;IIo0n>p$n$zOXV&UOl&VO?AWCQ)gJQ2d^!iF zFW@iC0#JBytvD77!O|SH1$`Oe&{xXUlepl>HtI?91L-wC@tRwC-A{ePUwJD`E{K$G zN6WYSsBiREUkn$|1`+6;pY^BT1=7nsXnt>cZ!iqYv;^c-poShRwx-GYGzIh&N3!T- zK7X7R&{?2T!#KfZ{!nlbfSbr8S0;(oNn*n|Wj)H^rqgDWL&_D~a%oqdzGa;22Vv|} zhJ6^03>aoT3PmBa*yFD48T3q;_S2s7x8ceQ5z4DQl|O`tpZkk{_Q;6{aFXmDhO0M- zxF9BWL?|F9$HCfc_(|;e%j&QZpa6p*bWQkV!v$-pLybqoOr%!nRO_VKeuTuOe+{8u z_o5f0>Fxe<=}-kEBrq%=O7pa2d787eGX;8kvHL=a8?bvQ!+~h(?FsJp`wN78&(zs^ zA5Fr;=fXjW=KY8pft4`{nynl_A|B(XVL!F=ac_V z7WU6~@}Ihw*X6Rl9j_g&pN&`lm%jPA5A=8PHQDb4Q?@RV*QGXpoW7k5oqydPg6~88 zeW?F_g1>A!<3-Q#aPbp9p5@Jz$AsXXB!>{?s5A$Qc?7MBl{-^F!Y}t`Nx0rX^NU(D z_29ryMy)r;9+YDkCDtRrbto5aMHJSFLV2myfhxe@pM*7)8=wSiP6m%L0)tU&z%0FY zt4hGB3Q}bhLTZQq*C?cW2{g-yWhy3Sy(rbL7N8;$7bQd}6he`26+7-0J8$Q!P;YN! z(M_19Gw9lQx{=A6FE;NL7_Cs=FH-InDYpy6jRG!jgjd+H@0MzJiuLm;29D>ch~t6_ z7|~Xz$05I1IXzxMauX^Wp37CyAaJge(PJX-sVr)Ps}Wd?=$!(6%Sd_&EO%M zfjpz@z~7nT{%jcS*&U4FE`(d3%~AFvXSO%J8AxvgiPwX)mp$S|2fgA)^F!5lBK4&M z^kswe<%68d2D=swaK6=Bd8H>kA40F8uwZ{$K2mH*)KFVtYr2Bkf(s{EO9+_F;l$s9grH=xBbiVNVeMF2jcDgYu^~llNHxGWOYADtb`&bx^Yk?dIykR@ zzk!JCL&TIqp{f|>(hCDTGebO21ZqzQif01oDL)RcnyF9~v4IylZ*L>9*9k2X@CL2f z@Qj%FYuKL+O_P;gF4cz~2Oyel()?Tu%Z+$TM!L)j00DABT|XD(UQi zX87g1gVkW8!U8q{xJDIU!(0TI67W#7;hpi9ZMvQRnRl@me3WLnky2{&39?)Y8UH+`0ir8)lI=VdN;@a!wmDfboS5nS${M3 zeLt&g9qaS$_*wV*(#QMWFZM&&FS6Nh?|CS91-^y~49hbb5E-i*2V0?V8k#}fdIBcaxD6<~NXQAZvbH;CyqDgiN}F=DZRI|!35VU_R#IG>Br zqo83E!N#Dvx?QSW%a=&MHNm$XCgo!7W|orF(^R z7xjD#=x!n1DT3FSk@qGh1iwcv-7c1ZU})3emb?TQ9ZR6PLh+-sDayrc$Aw%Cy6u^K zI$xxmFBS-CMr<=0P!jC|xG@XpT$$cl%mF;7C+PdL0$z`xeSOO zK-{QNE*2<95Z>0CmW0q-q4Zja@=BO^F_>Nopcnn<6@U3!pj;U3c)yRfw7<5ZzrJ#y zzH*SZbdX#+Sb(p4)hG!@=pD%#m@e@6gskm7nOu(m_{(P40+fK1r}K1_r{83hv)`S9 zni{k68jQ9Uet@^RE)vt0E2ozeC_1kj(JCvZ{-Q zVt)wNcWMrYrr{A0mK)e_&>-Voe*?;qqXZvxPq18)h+t3_{fKZlFpVS%%5+erhrP!C z5=PI4(yt*P_DrV|Noj&@&iIA*5QOuA?u)=H{QgaYGX&ggI2$}9;FNHW!0l_CAuyDE z)2#fmvJCX?Li@!ijqVuh#ko;qfEQcYTlec>J|bYppH7P5sfIg}-}}YBqwf{A_dJw86aKP)jT=@DyxDVp@_ag27F`5Gv_$sD ztWfb@QXt}2QQREW-%t+@S-{(3<;GF0?XDlrhStU5v^bJh4HD~yh;>702OO!{biPtv zsYOf?^G+a@<^gKTgN6~gHV8lh`7@BWoL>RBh-7#93XV~*F2n46qfk8$ zzio~J&G$@-k&6U|XK0Q&oFIHPhd!uK{xrewc7bv&o1o`DC=qvy0LpYHpKj&R?R;)G zAp?;?Z2>c{fxtvGf{v5~EFC3&>Y^WO^qe2P;9|8G;JYkHT@j)$36O6Cjve$S z)M1U51kkqrbabrNmZ?Llg&q4svDRLpU#QeBRx4+#2-IO6lNE$Iqp;wOI{i|)vw57@ z+Lu7HIp0OE1=Ak^yTLR+TrP-E-v|{i8Ap5-m3+hKou2eg7#HV7O@!4W^sR{j;DTNk ztF4Pcbx7Kb*s27vJz3cWJ4TAqfcj8e=}(@@(~oDPcBI4u75u;Zv-E@6TsRo1z8h0$ z(>U5Vj=^_lKJ6`54%K+-tKFN++)Kx5Px%w_h=YX2Njiw!b80bxo=iV2-5@oEY788N zxfld5L5c`e6x1xh>J5z&zcj!ZN^-ebvBM(Txk{A}o-ZmXZF0_-B})q4q*2 zMN%+WFAO~tkO(U<;-pvuF1l&7zA;9wkEH{-+7T3*DM8w=07(V%Xg=n8 zKoXW`1Rx<1>BTu-;xG0lp|tj3UKXtGFR~3LgYL*K4%%73$du;$k(m z*U6I;^xfI|qM_UJj$zB2l837NJDKP<734WnHWT5lTyk(7V04 zQuC_eNb+SY-j}L1WoU=eL8wAIQbBr5+fXAoSKXhd*QX110gs_gi44Ka|6D|<3%s{P zZY!gW#mb5V0hlT0OzkSh3gBZSgZDCqQ86hEWk=L97eKSlfq0k!za znHnV!4GqdK8v4;#R=B_r)MR6fIZ`st8X)*^Un79uHUNVkMsNYL5eeob!GR6zp=Jdc zBwaW+G^pWWY&M6tmuWN}0xMgaxji~D7R>W8UvVJxpn3h7dwF$!?#)N{rT72lQ9gOK z!>A=c`Usy4v-Oy#-h2e9Z1&`&;&_ zDVP)A3y{}r=Bi?U#RAC7mxRKiK?i{rlZ{yD-f~f#-||7M=OWx_c?7M9l#6@PvM3Js zMG6wstMv$)1#h9z*2L4kVs~Su<9LMvI?8r1Y}7K#@duLyiU)yw16&+nr|hT}muo@I zp&$$CUM+oCr{As7ua>|Kv}yf{I$gIyE-ljv+U9Vyb+#%jOO z>17YCh<0!6?_SYEE^^CvT=F%YUVuB;Nw2yDfOvt2-V2}=VYDHV72%yjXwN7*ltic} zwI_kLj-p*-=x~NSQ=%Ttq8(tJLd0?uEsqv>eJ_&Uh>~#Zz7-l0}UjL#r{2KbiIfnsVbR~xF7EydchIBm9@OK4#^_EQ*t zLll9=x-j%dJiHlz3(U1Q;P1m9X?(Ged0@4FCLJzgU_-LwXK37rl`r+rvgW9?iMg zlGgX@`_?x-U*rmycZ%-}_OHW~%>~5jH+RAJ@)-QZF0jJE#0S)NsY)-n$s|qmqaTN< z&jr$3J!nw`y%$akd(q-Pv|@Yhg&CA^$Bp;uO^sGQrH&%C}U;d(qvKb5VY1vrjp`l(Cs z+m>q&YMgh$y^K1!WpuAbn)r))4dBRv7JRo%et;rM)pQ@pxfOH|)@%cRp#?+vyf-*&;%M=1IHA22L9g|q zm%$+Fp&x=TTF|!@`YEEb`p}XgM&Za*+MU5=7ZBXOADP`n`rcf*Ih8h~aM;z3e6hDo z?k^Yni|9~=)>!S{TI7Cvgmbc!@fQzi0g4u+s>u9BT}%964DIz3*flLM)@!GTX5rlz z6s%vhT>#YD!S}Cl`H@21)p0vLTi^Tc%j&TfOfSJczt>yVrhSYTl48^Rvj%r6m}Bhw znh@-z0<$7)=)cyg0^!jSKKbANu3i3QMAwpiyj|{U5BnI%T@ADPy~g`)S|k5H1$=$x ziP_KG_f)NK+4rq)dcMdN=n8**=QI}p z+UJB{nH6+pvJT8bsiVsisH2KHz#_$lXmMkL0`F>jxzbV~kQcKRdBmv*^l}}~)DU=# zLco_ml>olw3gzwu^#;;};l?ee`xE6yb=tjZaTA=7C3Lr3d{8a_JV}0BCqAeV530mn zXu$^l-iAlGRNSkO*NtpqPAD!HnC*J8;Cj1x0wo?UWhw31%DD_Wg;XO1T7&Hhkx}K^ zxpI_fC%Ae~p*%z-!RCyoi0d`t_Cy8bnV_z^GEqHW9k6qp=UD{YI_X#7#PFk+Tx@Ng zud=~;QLy@c2)!T5Hsn>|Vq=ut6eTyH(oin~5U)aK1Z@~VTSqEfj6P1;F-GD6We4>Sd(pHon#r8sM1iCz?GK^qcXgTpmQkYbhtey9ltpmgC(`aLxjz?iS+o}w z?Lnkms_!pQwr0@AG}@X?dy19)Wy-;F(NIA9%hZFF{%bSc&koSaG;l{t#83sOYJesY zu!o|SX4Jijwx+?^LS9qo6w!QtgrBd+`c-=gb_nhc{$h9E6R}wxjT_WrALhwB+>+<@(^-a$gxdNsE%DTLk;5(}g zgk26{F$gU|2nrlz0Y=&g019eyDMVxxN&xNP^UwNkA^{2xxO?Luz0lqLtUqHgIfxpZ=2}f`RlL4Xz9DJ$u zS$=zRgAV2TqqyxUqu?Mg_s#@yzgkBFa|J@S5Ig;#jy{^A1BFpG7wuj(eK1J?eC_yq z3o%!PWZ*9}VtEJEdy(H%!mszLgNET#>yd%6+_e|0|B zuY4c4+*g0UzXpJQr;qwhANTLV9N%&>(c&yO{iMIXAknijP2Ze>d|mem;lFgqWrRO$<8Pl?=HpuF@H?14fOE3@Q)#iu zzVNM{XQw&N19M@>twNLVpTeDr04Hd{K;*VEalF)ZxHO=#q{qR+Fz`nm8LuGywj-C} z5{By!ChBNhG6~g`YPt6A2X!i}(05UX7jQg@KAcP+)zOFOucZgobgzYKW%KyK;@9?vuIP$Lv@4XG$RhGyS$RIM3Ed&UZb6TaR};P1Y`Uc;QQzW^u%SsAFqm^zBXQc13K_|C>DE2ZJSiHZd{-5U0hgV_7KFr zMd*K+7t@F9=%4%1w}#X_FudVc!|Q%ItN?iZFNC+cJV1o2UtWpM=inFbEBsm$8*f*XU5QT6KPvhX;(|#`uV}SdBs0Xs{O_gni|s;nAa5Y8Y0Y@N6XiQ zSHn`>Q}~;R!e^@etC(vOXAAx&e!s+vpHBVR^+0Fv7aF0;!CxDK&1$f=$yau!YKqMi zIt?Z?i9`4rvN=Aoi@c*&FSE7j-E!qMVOJ9{OtMIGtlU-m(}=FN^IX-RhQI#v%5Qkz z|N4SJ*uV2ZqlOgxMNNfEykcH!5mQZpdWUpH%wc<5YUpd1AtqAe?l}VvG&LgN^Zo^e zV=H@^k+nt zM!-hU^ZCHs>A$wp-k6x{3K25v$szOv z<|ki5PhS~4e?#%Pk>Q#V82RPRq_Ds3j_J{}6KcOZBx*7n93aLc;&LPC6Plce+_5PGZxx+Hz@IPa2&^r=2#Be0R#gHpwo{v2s@*p}oAg|GU%Xb1AQ`#$QyD zsDiMLg9+d-=3`;8Wesm4+-Qb_QH{6M(Wfz!_9~!oY1ho!y|d$kE%mz>*X~);xNp_q zt;+_kZSA-3Ggln?!mz`i8+!P&mmK@dh5MG(9Kv1$^CI*%pKPKNX!Zis7SZtqbhL>M z&gLyy56>wbm|3@LLc9|rzmtPE<`mvrSbDEH;$|8oh<@LfFvjl19RC;cF{KNM}i)wgB4Bj1sg8mc?H5>RM+|z`Bw~1d7adZ1) zMY=ntj~D6VF?}SWRRJvxX(2WYGHYGYUjcc*#(zgxT(euof7HP(2_rY*79DyV@+DvE^+#L&>>xD-C~be~MeA0ujFN z0d*`0Znl`VFngG1Kew%as?6Aw0jHKGu)^6Ppg)96mp_ zw01_kX-;uROYhCC1D7QTgrPG~O!h%sJ_hA{B=RkX_IViTf} zV{6O~j?5qgX52rS5QXFL3_6UF-??;b9vbO9@{8kDUINV1u`nqb?e`ZKVQ9FtbxN^T- za|`QdmH@$jnnIhfEAHap(DDLa*4FtU02;wJ*3K<%X>HiDq6YZ8cGiG@8bnthW)x;S zW1SH&7XVx;0DrN?2jIAlK{&bnD~(@0qr7Fee{CF;R8VcSpVn!kV&xK2;Qh0$$Nr}L zFQ~d4J1@{$TPj~ULMY!MPFtX4I+MjtSIkjop|Jg24g}*;|7KXL`KS#Ox4ec_N#CAt_N_Y8A+#2Pumtx3(N;qO zjnN1O3Zq&@B^%V$Q7!gcM>KoiKg4Y*w6pokB%*5y_2SwzFly5JH z|I%DQ;}`q=VcHcA1nyA$eXljZEG%Bov^d1FVjF+|j+{t9b*6rU22WPvAgncTRY81|2|0^i(=9op+VR-tI@5f}``o6WF1tDTEB7 zW4$n!XOZ#VMhmeVxMuInM#Q+lmIqij^zfw|ndFbx&=ZKpc~gjh*w`Ej!@JM&`Yc*I zB3w5z0`jgO6>bSVQ^V)6o_Aibc|NZ#!X#%L8)ng_*|YPzUr(r8z6xONs{!-X}FY;D-K zqHg=LzE4kR{PX}CW->)=jk-cyQ{*TOgmPi<7pqgc4u65d|2X)I3e&+^2QbrW)SURM z`c)Q?E~2~XnB_N_V`#Oe6Uk%bWAk0S+f=w0k(SQCdesBmk!!snPm zi0?PMNT0hT{NeS*-;Ruaa|8YOYWnt7^xf;|{?Ua$OzXXC`6b(1`fot@GSI3eIJuaP zn{H>cf+eUFRv}>)GzVM8Mhvs*MH74Koh60$mc;0J#;`BF*)taLa7e0hQv_!uB=X=?)ic`tmk-b|Zrj<(zqVc#eO^TY;@I5yuwTd;L9 z8o%S>?c?Ju6XR#c)&KB{VlxKZ5yXk(a`RR}94gU3FlMJqgk*+V4i-x2qktG1$cXq< zgM9(OG58CCnxI%0#DMAd6{z{b;(Z_J|34G^{Ap6OZaUWU($0cr(XeGv@5e^he6*2#Y%^Nnhbzj z56ePZM(GTN`V@8rf|^A6AXE5PA#8$+^Tw6V^t> zuPrFNjOk&s>F7*Mbq@B;pqv-BWo_0(Ow@)f;nN(aozTsQLN^{U?MFd6OAb__7V*E90w}HR1|4!Q$Jlr*b@p%Kj z2seSoGA7MMEQ4sqrfC`hoi7e(S_6GyNa3MTwNH;LY@AWpHaFbd#K;T$eQpjtKZmv~ zpk0e;S2OKcNL%OA_J!frMaADwqV)@FceXZep5N~mH`c7ErQrc@-P=1RtUN-8GyZt* zAp8ix@Gk~~&7X~ELZ<dK_r@#R*j3n zNRr=jQ6=)WTA|P5uXx7)rqtDrw^2dikNsvHGJ`@UQD`gJ)^OTe#&$1U_ahR1j2&80 z$#a7Xd&QWYTM_=KPgopi!bDGqXk}me>g6@}4DY?_g3=vk?;DIxVzSo!UUX+Yee*KH z>ZGGhg=34N!wbxES`*#zwMC&!iatIUp&faqF?ytdzi+pOZ=i!3L&IhVA^}Bi=GUHFRCjbd#s=tQ-ZehhHGy_apluUr z>jc^|iMCFrZOChKxP40LnQ^`TZD?@{Hk~(n>>`>mrlWHQwCRPwTR@9g4%vbhQ`8|~ zM(KII7z6>96vn zCIx{-jO_}c=S1|>yFQ^X>ff?CDwal|JS!yGWn0R;tx9O&r=8{Nv(IUg74vN)6KScF z6K{d356gsyzpyGTVIm*$S`|Cm9C<|w;p^jTa)(fX9!NNk<~)%YoG1fkwH`pd#^a#I!yjB%7XG5T#&;{V8Qja&K0|Pb zVMMbvjM?_ow8&7$Vh3S#dtycq0(4-%;FdnLbWmwrLjePq7exU!pusJyowZ!rH>9tQ!9`Kc+HRFj# zrTfMqreI;R6^A1%6)=^GHz0~IW0q&l!V)=rbaOZ;W)4R$)9_RUgh&&!3h*gNlG;Pg z^5HnzaGCulU!Q%>maputZ>P=4raQ!6n3SO*5k^ssAeB6|{Y17N8zyWSQwb%UY?&TK z+YgmUi?xZjz^vl4_*p=?G9@G1vwqep>=U-It;C_*v6ugA?wS^AmHr1I{I4MK!QsY4 z`~?=9H3YnfUj85n4f2A_$II<3Q+*liHQk=Li@DG;3M@;5kpwj@Z#NS}SfhF==HCW1 zx|gSMyK=}t@P(r^wtV`dnIou3<8&b# zMT`z=9Hwa;0B12-8Z)J_-7paO?*@O-Qhs}B@LEfV&HnbzrcHpn*|ev*anr1Uzq~g5 zMnC#CLR()`{Nt!zTgUg_J-+vzvAuWR+OYNJ`t_q~*56XI>GrzqV|r~JU9;_$+O4vP;bZSZ4Clh?8wyy=i{N0}#?sDlJg~cUY+#0W4fsx^eG?db z_f8CU4-c$k?;iZ@0saEcD&Q|(4-eDxFD34pz+1qt zBrpJjXa(cl;SVil?CHla9rK<*NP;2zK@?qqrNj}B7ksjRbk7Ch_lID}zUB|N)jc~g z-Z(SbG>6vBrnR#%E*xx_!#f{6gCXEah;ml=^{9pq_UEyN%di74dcun_n!N^oF)!K7 z5R1&H1SSl$qxX7hd8M&6uX zqOT+mr`^m`zfa^BMfMq~PJ7;@_OIk_>(_U|$=m-#Adjh#QEebJiBpq1mnznC2>U6N zZubZOS7rv0_BhVt>t&j}@a>Eoj$Eo95WXrqxkKB+wi1VKM+yFqB%(yq;!^2<5F+PS z4>xAxuiXW$jx~kM!(V2gZs)#Do{q({uz048?4MpN)Pj#Nm57mbc^II}6!WrrVZ0K5 z5vN2O8LeQn=Ds%!?Yq8+FR>4EmKIA1WVU6dZ!tGaRwrrRl{g3 zzq_1e(DQs~USZRe=&3Qme~*bD9oP7S>+3&SNArnVLi$iIy1SOXeldLy?ZivNA6`iJ z4dC6|zuJ!w=jxk%=sz0hhy8i`gCAf+-g>%!F#Yc8`1hE8HVnJ|(UaHHvp1t}Io^Tw zyy$So!0vcLZ!-=wd-qS`gYnlu@Scg$-bwM^$q`T(5WIC_fPEex7#_^8}Y>_}_o$l-?(cP|V63LrE7n!ae%sJM+GS>9w9`_|%ha8GoEZJqm4G}tUt zLO_q{i0n;tcOBh(2_dlL|J+{s)71LsrWDKst-{7xB^(HD_VoDZvC+kE4=?-o;FIFJc6awVMYk-3yN{9`+O4}F*TI>Am&(^6l{O{ct@HwYJQu}Q?U)wgD z@6$aWfAM^$o;M%<;_=(P(lP#O{p>hLH3(nD(g-JcPq@@aP{Pz=r=9dx8j<$AY5ZzE zc$z(`Uj+0rjp%AS)AH?VzWS%DGZOvkMyIu_zh^|uu6cwOJN0L_Udmlyx@eF-ZK1L2 z4M4Vm*S`c9XRO2e7u5W~YZzfhjV}mkbU$l;Vv#1}9MS{?{)*`q(~&+qq*aLG*oVH{NMDNS8#P$)8~$=g@bLTS zk!uM1-T!GcZ5$Jz=Xu9i#^0R)-08u=Y2ks%bZ9ai0PIeo12bt4Ryu9h;qSWzPvIUxTP-+9!5)38=HV>_W%}~!=N*F zVxx78eQ$ZOQoxOC^hggS!fI|j+QJ&b+M@3aEB@-nUXPEgd-CR*)wk9?Kem3;gu1m8 zdOtL>?h^y(j*u7s_QS6)>`{+-@h0X5R)u5dBi^$zD3%QV`i08pXaOttbFdN6PwQml z3n&L=6SN}_t5l$e5b^mz%!QLA?QtA2|1vG1!$(4ggG)GBD;$T=3QAstpY}{~ zd=HexIa6kLn6ErVhhp}7vFQ#I_HY4xiQQwTx-PBQiy2P+gG;R#9YQ3b77BGh88n)~ zz+dT|W-Ku4h0z*9OAR3!fWK&w^^XW$&>yU&hpwsJI<@w2Q}n{Z2vHmlE({Me2S*mu z5yavE{x0P1Xb{{By_m2KJt9@2QT)cT;Ps{S>Joarh2Fxns}=3|yNceqlYqZ(-AQk* zq&LvEZJ(V5@C9DKgD@SK>dXVm+-vb`V}|pdacJApezT4k3yJ~0N2djcr}MI6%=N;u;@t?eH5su!qTLhF z3tiedwXkMP@jr*gaMY-PF624PKwJ*<2>iv&H%xKD>j41C7;7oSpaAcY0Wmpj{8gq+ zKp5TEW*i^g)ZC1Q24FFU4@Lwu5dkWTbY~5Htd2h4m+rZkzB?@Z)wP8OuC4j%(87WS z?h?N!;K-BQ3O5}gc>5Oq#%TP)Hos8$94%etehy{fFY-(e^I^I5UjP0 z5@~)=0f+GArAqPn!a;KXmQ)u`6(pCUEnBCrup2mzAIiP#1`8|8LLQ{DwC6x7eUIJt zEOrTZXtlwqe{iW4qeF-!^rYc$TgRh?zW`;K%2jWs@=lKEOBd4W+iMQZtvS|QJhYe& zwgmfeHW3{GyEtAzMCiqY`B6Yj1YX9Ztk+wE*IIeA`WL3TvB30WtgFQ|GXUbvjm5F0S1*q4?N9fi zBl@EFq00#Cf7gtrO=b=6_B*1TW5Rvd$6-qN!nEKRrcY1cZs%h&3&&=c4$cbpWBKsB zU^~_~&E#GGHllZWM$N9tb-%uvKGl~dpqYum-x%=9BdYirgN87A6>4~4uL(^S#{7c^ zKYPqC9~)s6hAZ(j$x>~mB z`>K{gM^Bo2^;sNwx%BHRtr#6bB%#g0UsSw60dDn}hL5y=(NY713I1Z@E(9eALsTO*%nGl-eL`#STL5#mGJR=KRGrYEhUd7Nb1X}3j zR(c)n+*S03>3`NfXMi#q$ZsqSfxl?sqIVkL`|eVJZv^Ch1LMUj8PMNbQTO7){*R0- zexwiGY}&Jp0q=2)XcG8^0E6*!A;1DF9zx~dQJDJ#l4!Ox@gWtjUT-*{J%q^ z`>v|_*5&bk45sf6qMuzt4-ca!M-W0?nQrH3+ik)2+h`B^mM0^Kba-SM9WW!mg1-l_ zpcpYd=F-j?v;)zlrqcR}w0=_k6C(>>=}$9?bd`x4i2zg5oJ8L~7Vy?_mjc@6rmMl= zFS_^H`P>lYBN1>DnZR7ZU#uzP;40<-90OR9X`eU*^bZXAHwi}b5jz?`R50v|{sBa@ z#7`0UhkvETA%{c*1fw(BOa%ZFhhL%+Ia<0Bi)98=1~>IVkg^>0C&&+N$@ zef$g}+y1nKnureR(k?1<4O9WpqEtLr`!cpFxmySam*zNGLJ59Covi)h(DkIOO zmuZCa_uLnB(3^02Ug&m?~V$aj!9n zi3e4CN0{_WchmqmmBHnVB8^5>E+V*w6ZA*P8(00sr zHYDae+!AEuJF(8`uM+}@CTuw%=|RPCAx~a! z2m*`(f3krdy`i{eMrqGH+K*URSbv1c&&>gYufgBr25o_xn3RQa;g`|=T}H1grJ-zbhDjUt4bOE~Qs6t9dECv^;oeDR)G_xhz7*HHM4<rhpeFsX^%S9PXo4>DB&drJPNatB^$9`8JNWfk@6fCj{FOQe!gho9c>;NaKI7evu$l=Is(G>R zsmKf{6);#zNX~P`_-mI>pU#uJq=L2mGY_gHSiobsyQ@$;#=#VAs-JZk;g z3?6X5BM1SyOrdqv^?>k#I;^w4$DkFTH~4W;{s(QmE~p1!RJ{9SiD z$C*UHs~uxwtUua0g?3Hh`B#{B1)K%`B3?8iYoXhD-)xRAeRz6sWK!YzQHAebLaS^Ce`7EgTY3&A8l|CJ(fKgw3?cy z99AqN2Ix-_+a8o;;|;6v3+E((NX5BVC82(>4&f+w?&8uB==`PBerb9VbM&hVtvy6r zw$8M?x|HvGGLe&JL!xj7GfhvqeA}Nkt$M@;y*yh8`&n$dT>JGEl$$W8yy|!S?BK6x zgG?T^c6}u@JfL4t+wWKod}JmqVY05N+_}{jV&Q7r6lipoG6zkzFh)eIvBa~mo*q-$ zJuTRS-HzsmFDxzrg#o@e(B@_QZ3)c5W5HB#I}8^+ZA`kET-M?c+6F2XK;=vKxbkELSHa}>z8!BIKZdiFFXv#>pN0J6N2&4JMjAO-ccm* z$K`~>R5AoZKeXY@FV6lc5j zs`cAIU15J9=kZtH1iyFlr<`m8vc7;{U1;rrTl(iGJcFFJ$8P^ubxTBX)zzvq9U?m; z#~55@%Xj}>eVp#kx+*!IR=u>>y*V|@+mWggb(hrV=!eulILCmmsh82JLKp@KzrgJv zKDc>hX4qnqEeMPxUQe{Ffe`s{*OUk=VX?2lfkiPoq5;0IEDK&*79Ph2Ntpb+G=2?7 zONd!j=vzkbG;sMC4zzZc)A3c@&ONq*=@Tn>To@z57$82;ifLNG@kQ|q3u^Yy>AikJ z<3raKzR;hVOEk)~d=F~0*zk=HI5p>6QKco7og|4K3X`i^tsDw z@4LL_r|*mZ>&CjDT|qy%m~ejh+R~#VN`Dv?J##Cq8%yiQBH(k|u^zh`O{5)IAk4wYXgV3V z^=d|Md7PTXaBUuYajeq_=V=RQc{9d^;sy;j0afW0jwn zT!n?u>H>s10fZ{4j8IjH$<;82NEGf)rsLRZWi8(D&)NDNV{n-*-~D&>iMl`Qs^nNf z4Ws$W+mYH*D)6?-y!|`Em|q+InvPB2FVF!H3}OD`*|1!D^9&;N_XZ&*8()t73Tx=+ z*N5n#Ju)MFX>svLYvJIM@TC>utINZeTO)ukTEQ3#eg(TEG;>f&-Yj@Y_~NqoAp~bg-3%> z;N)n}*aE^={_4sC;&@CC*}Oq84-GV)cipx=7gosu!$25^w&5?_+lGn!L*le%onGRt zDXoNInhl*5f<-Uh6(hX#X`gm({|#^&khOuDLbHhn&WpV>?Mc)xWz0Xf+vWbZC7pZv zse+JO5XQ4B1gjrF$X^9thvd?(Aoai6X-lYKHuKEViFU#y;j3-xTjdCmm|TUGPzV+d z(t>bQ;Zn6F625$*5?`!GaU92*Gzg)^55r!m;kw!rEKn zwWA9lwv35+|Ak4kc?vHw+BPNLGo^O-#QN>G)vg&?_rptq&ot6x;-x)<5H~C=phXG% zl?Jb1nSdf32;11hmV23rqa(bN_abL`k4R{acGQ;NOPHo^cG)m9uGtUb3V1_iN8`5> zPnkBtr@*&;Ru~kbB-ka#FI`fW@}GST!ogG64+R>3ToldOluA=F4IkM#!Xj^Oo;umz z$SH0LC0V50JjK>0J;mygRGOW_SCbvbDnBi`$_pX*o9#MPl|g8}XD{J6wwoVBeJlAo z#^AD>?ddQ(El3?o_Dli0Zn5b!YwcQ8-j3q0Q}wlJFc54Sk6fh-{&GX89e)AAXl&M+ z1-6(1jj)FwAo{ z`C)S!lAhiW*0&}Aq?c_!nT)VNs-S9nwz!X*3#ZIN2cL2>1L;eO->J!dIp` zRyjhXCC6P&;t-AoM~}?F_sGEPcWte z8?<6cBz%Ron7kdWx(ECt`~M3Knx0u|DISDA8DZj*b52G+vNeqd3hq%k_gc$u|^3ovJN)I2j|oroL;|g zV(rd5YIfbxYvZlGo_v4ZgV&Vqy)?SJ56v&|cH#z@42ifLjCTuwQ_HcSztV@$K$hd)-t={B)6ggQZa;cpNb#Y|OTQjc`sszyzxSoj)>8}Y3~3m; z#L+O1ibaf_GVt;b7VNETz}Fg_HMVh=zB%~H*eq@@7k}|W<^4hp9={D(4UHQT+JgU^ zUIB$yagr7TpmX~$F*}b73D0OVKNomQh^j%b6hG(el)w!9)h9JBtlCK`gsQ1K(~8u+ zjv>NVW?D6<$sKt=VVVX=+Dd%n6^<>V%6lN8kLeISFt9-Iw+$Llp9@&zyvpt&0MU8poG{L zGXlEj(&Fz%^nQADVe_PL_uSy%BHF)@5RUQ~`kYrrFD)+|Z!R8LP&zcfZrhCFnz8iQ z2k4>e=tsi{t98CHh_@p8QXl$cJuNNr5Goe$U=(!-h5gZ-G`*n$2rvO5ozdHjHAh&` zS~U2}0Al)f@%RS9xYWUBv$UrTf92T$G(cpaIf6eUOeH`QF_1?hJfqo57jwGM(4I;( zC!{$5%x=o|6k9iT4HD#l@c2mpLx z58S9I!!Jmhz0&eE-e%Y{gt4EI)Ia2{*?e&DC-0ZlnpFIo#1Qhl45a*1fFW2=xQ#I8 zL4$y=!Cy&X&OBSK{jk_wK_(VL{YdS8PWwsad8=}kyi}ED?GP#;gu24vpYh8y!-TKq z>C-7k2u-epBY;ay3qn(=m?jh=5B@?@lcy1mTD?q@uNL2aSesV;Vu@aM8zK3sdnI4T z7+iLnJvlQ{ALf+rX<{~>`m}GYEhBG7YH~SCT`fbvpz#O!cKkJMAcG62)e%1mYmP(! zlG4;d8xvdPU=}p+Ygv7G&)~vOE~7O!hdXD)d*=uHo9Q5y0HZH@S@_E0`0$LvwmXW? zeW2zy!{cvWKp(HCg$0^`t&|M*0mT4?z+B862B4#r3bg=POd&?=6@$HKzO|zXkQFUU z9@a#!DFB5*k8ux;T+=Y;O8^Wv0NWsj;l>n21Ih@8g@s7yj_$|tpt#)%L`HTv5Y!8} zJd_CY%C0ay-j`vF+w5ontA?4jGj>M4I^?@(m;=X=7VYugaS8D)0l+W^f9y)Oj`y!O z?qcsr&#?SdkoN*tn;#C0(VQd+dF36!ej)5LUg#<8ZtuaCpGMrDY@XV@=r;U?uME`l zEk4+>I1rVKt!Tqs{%BbY4u=atNU`anvoWu2hL}8>_(8r?!Cx#`#(*}DY0JIzv+W#P zTY8E%G*JPqAACY(K&UrtW>28g3=_Uus86RHAvC#7I5L_Rgr)*vCsEpb4GAX|P{PT@ zxl}QSaKx&9X+Nw@Yer&^UUnNH`Ko6nU&k0+cAGspGg2Ssl<#R`Qg5f7eQRw=c{^I; zNd+a~i!(0qCsiDe67uv{uEB9;{KXO#4wA%wI2-)sPEbouiw5!jR%^0?O#y4Z+2;m;LEd!4U$RY5^w^rVC;Z_ioXUdxMRExe;H5kCs+fU`PIXA6F&rq zgU114qB-0PJ=M6;-sOr}T|j3Xu*&puGZLX6)(oM-PBs-XunI_5(-x2f@huDZsek|% zm;tHEFM!-nx!3{w2%*KWpw8G@^XzhbO^Znuj6!%h{zyV6OvJp_Nb__Y6t**Lc| zddmMa!-TI^^0#3Alp};Dw+TlEm+h%Lz+a$)t;ePlZ}}N1M}fv6RG^Cp6heJio9LqK z@~ahRsyEUSssISv|7r47=Oa_msowLmP#OQ$+0KE}PaW;>n*C6y*a5GmGG{@-0=p&` z8fR3Pc&$K$K5>lQcF=Sk6VUPo`to4XMMm~rF%{=i!tJ!) zatJNGc9$%eD7vRTS~-{U22+x=8_mJ`^ZZFMbIi_jDL?t-?8xg=gK%zj&!rlW=7H`p zqx*Alo>vV}hbTt~N50}q(QoS%1j$zD7-L^bLYq?-oru3>Y3L$hc`k+5v|LocabTK! z)%nO*bf%RY+*O&X=YGZ&o&sNBWe)uH5kWY1EiK3;=e9PN+2){+={mkSqFE)nvyMKF z3C6W_cZpgfnqfAD2S5*`5baGI2#0tY%n8VvsksVjOaQsskJIyI@bdp`JM+-U;xu6G z=<+n%JZpXLsSW1a7JRE+w3gH}SGE{FO3kpY?f#uq$NeRySPQuI`5H zdQKM3D^|nc5T%uHggbL-zi!cUX7N`GfD-!DXO>VWi+|FLQ86LX#JY};d_{SN168K$ z%s5k;PvNft-^5miZ<`Mde)TSBXqu%wHwyi+=*vY1GKNsmw!JE#>v13$ML<^~@I}BO zDf)(lzGdEk5B;cIHruAvZ#FZ7_TPnav;ZrCTdKcH z3Fj+LygZM;`likS!hXdWk7J8fg|_n&g*^&?ZS&4JZ96>8m^?CRX{*AA0iwsQwH(bV z08S*Hm* zd^>F-?YutK-=&1}6(?Sv$KS;Fb&MqCpWk{9Nn zU)oG9mRZ5TO@?N4Q%iq!`&?gJXPP}W=GyXNm7mI%$wT`ZvN;Z1;xhYBi+#3O{=3fW z%kzx3jM|fvkhFP(&*N|Ymw47mYUSw@@+^5uh%KYIkU`k;*>r|KC1Hj@_ANZGF94lB zvuAQ__u4+}Hfz;aT5|lXRmQ({wsX1^f6=!r!7l*AK%!zHs41Y)Yl2dl1+xHRS$@mI z#MqS9Y&EM8X5&JlpBddun;K{55G8&pTW22H*O1Lo5H939QEg!vN_SEQht1s5`}%Svyo%hZ+8E) zeo8qXDjA+kEGe_q4&yJkfH*K!8w9t7g+w$e19eg)lJ%Sk`~_6Ot~7h{@N>GZEHV9X zoHCjAzB&Y4N5IyfhZaBNd4$T)(=MNtX~?!so)I!|U>g47uJ4L$wOw@AHbb)jQ_u&5 zn2Jl4RI$p4JbJY3`GjVwdX!MaOe9n+C!rp2U-K zZ&ISLFLpL^?E0-U_$$xuqY_*v9gp@)Zv))+nEwc)gkES9Mx$+wkFUpp3B9z{rqT9$ zQO&ABhz|KGP%dHT-g(-7Mq682(RCiP!%JI#9$LI%TardshMso$tV~0iJ;KK`3Ly>z z1Un$&Bv+p}{O-Bb+|_IlieGvc9HoV**gVyft-*1cUm8`9O{nEQVTu+#GwRyj{Ol9e>eltc~3E*#0^qX`&aJ zWk_v9z-A?H8oH$chZc+s!uGuCPgCgdRlZ`v&b{-r{g~O>MACVj4lix}d1!G(%%Ct48Pi$uQ(3-Up$QQJNm++lS6$Vj(otnJEwCb+3T2!o6h1rBY zg+pYgvhQ|iaH0S-`20ksFV^!pwts|9v)Px-mQT}@#)mflR$9qP6!w#!jU2mv>pcF7 z2NbFpe=*(J90=l%8CJZ!$Q;026FvCUKrjG0(a)kS4LGD!WS`X@5c-#$MDN;ZJ40)} zog~yS5E-geEX{9ed`*~>5T9gNqPHqTPrH0pra=wJARO#)F71Ts7Ms}(wB{>#q?aHR zp@ivN+L9I6smYzR!grXsOshgwQWbV7q1ly7z$!mUBGVV^$(%%Qqo}0WoG4#KKP0M3 zD?Ew9X_lW|e7k<@68x1#zcH^v;w8ZC5bWTu^ho3EdrxZkG`#TTg=3c=8#h(n7Vv2m zv(t8lR)w7;Y*W)z*)nN7&0hyf%`CeVf#$!qz3>=|rSYpMfY%|z#3JaQwE!p~ zX?;oIs2B(vH&xyi0PR#+DpoFG=jGGoYV+l7v;Di^*aD!{!#N2jd54$sjER;w%={(C zPT1A>>y&m}+PN$3`$2DY4Sej=QuVrP=Jr>t&jJx%@R7?=11?g|PE{hc>(LXrfuYY__#V+E?nU^2|a=8(Tjezk7LN2B1w$I2& z-+N91Nl-2Oe|~a-7++F2DleDngbw93p+lr4>>j=vla`$dI7FI!PQGf(Dc_-39)&6c zB2A&nI0E{jW$}?-I$~vAsuB=oCA5Xr;A}$cUOR0CbXqPIsOn4-b)BumwhesyQfR>l z#}%T=)^qOB`uOUT4xdpag-DZEvGe$w=Ax?bwZLZ(oykbhR`C}QoPoc%mG-CQ!6EXu zi3I4g_1kx=_5D^$k8N9rw0bE`QUx3$O+F`IwdIuWP)rnNi)p4H(j?RLXtDnX$KN!+ zbu(XIho7(g2JJU4v<(xI_KbXYzS&*M(PvkObeNq=3XvwSniGH9q@_B~FV_QF;4_GF zbvp9;qV=oW`2(C()_8aA}K!4@UsdyL??4sZJpGk$wi@FrV$~BQHDkG|ezvbqh=qNB%k0YS`?jiIm zOUq6L93o9VCttPYl&?TcOOcaSvUZpmm(B~SF8(6lG&?g)!Yy^65>f~1r9+%E6{GVy z{7c_&jw|%impoTF^2k~SaM|ILs+WXFlUL1B{4|R+`SbkBJm8mepHrD;O{FhdG=mS0 z-t8oD9)A-ZC_c~dvkEvwqPF}@)s{a=S&~lSEGw-o?C8N|C-GMv+|HshS{*2aQ~No0 zad~c3j2*rX6>z-jI|Lj@<{ZA1$Ja8D=h+>PWjM!?%%eO*+xc6G9?*iFK_n*3&y@EF zdC3Aq6<=kw@E5lEPn2P2n!9Wzwv5g123mZcVSl+c*w13qj-IOLYwNf3RoWKFNo!i0 zs0#je-r?#%5DLC_1#1h4jBs*3druRyUxCo_B5?L^f#chMRzJS~IAw9<+3n)dVRA{L z=WKZu1CcFx{%&O+NG#+Ivog(+it!OO2@b$+6ya#&n0d>Bp7y!iyd-U&RN3>dtK7=Ohx7i1&OA zc`6M_rT$DKeC3sKD$}1>JbVKZo#Tt;;UuaOfBMFt_V$_C9If!3w6<-wuWWu-&~{$= z>CRgsUh=(>rde%E6X+yA?X7iEZPk;j9~`3U8Hqy8PY{sQ8pUp{3B2M!Yg6}iaIF4;;VrPV(SSox=5}o6V<>4f%5`X%} zI2h^+_#7W`M8>vF-bnYn7dx-~v~6u=w0cGyqL*pfy2l%7x%V7?+B@nB3+=rA(eT%P zcAM@BKlcQk`T;sbqHSKDTAk{H%PZJm6AqDUo5n z%H$*xRY|74C7r=vN1JUPY|uZO-xaiGR2I>BOZ4&2<8N8cOnXgbDaj-3WON>X#UXiI zcQ(rC_n1iJe3CEXIj-Nzt3@t4C#MbNqCifyDt5Nuuj4)cQlBWBDA%9m%BSV7rClu-NnH9# zAnY?M<0Pt*Ow|%4D!^Y&tAuZ-JiB_p7pNk~&MQCd8=#MqlMoHIu&*TpU5>-j2I6Hrx$6tK}n~-O>Jz(FhE^X(PpU!WC<1xJy4SETpGM)KT zotMnx0jCW3$Sa)gDV%u>J}*-h57=K~23?iBI-}%V!rwfVUb%Q$u6)|NNc+GOZH91~ zo^tt#sw7jtSauSB(`=JxPxC-ps>=9wUis<#dHGHgj%cv&=G18?0i83|d9j=xaLT}W z{LSgNo+jpeCVJ_-U%ga;Y~qYRW*YwLgD7F|KPXH!9+yhzBodQ|uY3*JKD6&@TAOLp z<>G0Yyu?EB&uV}}I3ClxuuW+t5}l)W%OVn0Nv5`2gg%eI9s1UHns79sbE*6^!cmwe QRxV%4n}04>Pgl$Te~bk*lK=n! diff --git a/src/Cargo.lock b/src/Cargo.lock index d3a912bde5c..c7eebb6bb5b 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -483,8 +483,8 @@ checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] name = "utf8parse" -version = "0.2.0" -source = "git+https://github.com/Andy-Python-Programmer/vte#a9d8bf899d7f7a07ddfd22d08491ac9131eebda2" +version = "0.2.1" +source = "git+https://github.com/aero-os/vte#401bd5ab59f903c48c78b179a93390428ceb2215" [[package]] name = "version_check" @@ -494,10 +494,11 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vte" -version = "0.10.1" -source = "git+https://github.com/Andy-Python-Programmer/vte#a9d8bf899d7f7a07ddfd22d08491ac9131eebda2" +version = "0.11.0" +source = "git+https://github.com/aero-os/vte#401bd5ab59f903c48c78b179a93390428ceb2215" dependencies = [ "arrayvec", + "log", "utf8parse", "vte_generate_state_changes", ] @@ -505,7 +506,7 @@ dependencies = [ [[package]] name = "vte_generate_state_changes" version = "0.1.1" -source = "git+https://github.com/Andy-Python-Programmer/vte#a9d8bf899d7f7a07ddfd22d08491ac9131eebda2" +source = "git+https://github.com/aero-os/vte#401bd5ab59f903c48c78b179a93390428ceb2215" dependencies = [ "proc-macro2", "quote", diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index 7b4448d75a5..feefa1a53fd 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -53,8 +53,9 @@ num-traits = { version = "0.2", default-features = false } raw-cpuid = "10.0.0" [dependencies.vte] -git = "https://github.com/Andy-Python-Programmer/vte" -features = ["no_std"] +git = "https://github.com/aero-os/vte" +default-features = false +features = ["no_std", "ansi"] [dependencies.lazy_static] version = "1.4.0" diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index 372fdbe067c..49b79a8f815 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -171,7 +171,7 @@ extern "C" fn arch_aero_main() -> ! { .expect("limine: no framebuffer found!"); rendy::init(&*framebuffer, &command_line); - logger::set_rendy_debug(command_line.rendy_debug); + logger::set_rendy_debug(true); interrupts::init(); log::info!("loaded IDT"); diff --git a/src/aero_kernel/src/logger.rs b/src/aero_kernel/src/logger.rs index a59f12af93f..1b769681d38 100644 --- a/src/aero_kernel/src/logger.rs +++ b/src/aero_kernel/src/logger.rs @@ -53,9 +53,13 @@ impl log::Log for AeroLogger { let level = record.level(); let rendy_dbg = RENDY_DEBUG.load(Ordering::Relaxed); - macro log_ln($($arg:tt)*) { - serial_println!("{}", format_args!($($arg)*)); - if rendy_dbg { $crate::rendy::println!("{}", format_args!($($arg)*)); } + macro generic_log($($arg:tt)*) { + { + serial_print!("{}", format_args!($($arg)*)); + if rendy_dbg { + $crate::rendy::print!("{}", format_args!($($arg)*)); + } + } } // Append the log message to the log ring buffer. @@ -80,15 +84,15 @@ impl log::Log for AeroLogger { } match record.level() { - Level::Info => serial_print!("\x1b[32;1minfo "), // green info - Level::Warn => serial_print!("\x1b[33;1mwarn "), // yellow warn - Level::Error => serial_print!("\x1b[32;1merror "), // red error - Level::Debug => serial_print!("\x1b[35;1mdebug "), // gray debug - Level::Trace => serial_print!("\x1b[34;1mtrace "), // blue trace + Level::Info => generic_log!("\x1b[32;1minfo "), // green info + Level::Warn => generic_log!("\x1b[33;1mwarn "), // yellow warn + Level::Error => generic_log!("\x1b[32;1merror "), // red error + Level::Debug => generic_log!("\x1b[35;1mdebug "), // gray debug + Level::Trace => generic_log!("\x1b[34;1mtrace "), // blue trace } - serial_print!("\x1b[0m"); - log_ln!("{}", record.args()); + generic_log!("\x1b[0m"); + generic_log!("{}\n", record.args()); } } diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index f5b7ca00752..73b7da89c27 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -20,12 +20,16 @@ use core::fmt::Write; use core::fmt; +use core::ops::Index; +use core::ops::IndexMut; use core::u8; use alloc::boxed::Box; use limine::Framebuffer; use spin::Once; +use vte::ansi::NamedColor; +use vte::ansi::SyncHandler; use crate::cmdline::CommandLine; use crate::mem; @@ -33,6 +37,8 @@ use crate::mem::paging::align_up; use crate::utils::sync::Mutex; +use vte::ansi::{Attr, Processor}; + static FONT: &[[u8; FONT_HEIGHT]; FONT_GLYPHS] = unsafe { &core::mem::transmute(*include_bytes!("../../font.bin")) }; @@ -200,9 +206,69 @@ fn parse_bmp_image(data: &[u8]) -> Image { } } -pub struct DebugRendy<'this> { - /// The raw framebuffer pointer queried from the BIOS or UEFI firmware represented - /// as a [u8] slice. +#[derive(Default)] +struct RendySync; + +impl SyncHandler for RendySync { + fn update_timeout(&mut self, _: Option) { + unreachable!() + } + + fn pending_timeout(&self) -> bool { + false + } +} + +const COLOR_COUNT: usize = 269; + +struct ColorList([u32; COLOR_COUNT]); + +impl ColorList { + fn new() -> Self { + let mut list = Self([0; COLOR_COUNT]); + + // The color values are based from the default alacritty colors. + // + // Normal colors: + list[NamedColor::Black] = 0x1d1f21; + list[NamedColor::Red] = 0xcc6666; + list[NamedColor::Green] = 0xb5bd68; + list[NamedColor::Yellow] = 0xf0c674; + list[NamedColor::Blue] = 0x81a2be; + list[NamedColor::Magenta] = 0xb294bb; + list[NamedColor::Cyan] = 0x8abeb7; + list[NamedColor::White] = 0xc5c8c6; + // Bright colors: + list[NamedColor::BrightBlack] = 0x666666; + list[NamedColor::BrightRed] = 0xd54e53; + list[NamedColor::BrightGreen] = 0xb9ca4a; + list[NamedColor::BrightYellow] = 0xe7c547; + list[NamedColor::BrightBlue] = 0x7aa6da; + list[NamedColor::BrightMagenta] = 0xc397d8; + list[NamedColor::BrightCyan] = 0x70c0b1; + list[NamedColor::BrightWhite] = 0xeaeaea; + + list + } +} + +impl Index for ColorList { + type Output = u32; + + #[inline] + fn index(&self, idx: NamedColor) -> &Self::Output { + &self.0[idx as usize] + } +} + +impl IndexMut for ColorList { + #[inline] + fn index_mut(&mut self, idx: NamedColor) -> &mut Self::Output { + &mut self.0[idx as usize] + } +} + +pub struct Inner<'this> { buffer: &'this mut [u32], info: RendyInfo, @@ -230,72 +296,11 @@ pub struct DebugRendy<'this> { cursor_visibility: bool, auto_flush: bool, -} - -impl<'this> DebugRendy<'this> { - /// Create a new debug renderer with the default foreground color set to white and - /// background color set to black. - pub fn new(buffer: &'this mut [u32], info: RendyInfo, cmdline: &CommandLine) -> Self { - let width = info.horizontal_resolution; - let height = info.vertical_resolution; - - let offset_x = DEFAULT_MARGIN + ((width - DEFAULT_MARGIN * 2) % FONT_WIDTH) / 2; - let offset_y = DEFAULT_MARGIN + ((height - DEFAULT_MARGIN * 2) % FONT_HEIGHT) / 2; - - let cols = (width - DEFAULT_MARGIN * 2) / FONT_WIDTH; - let rows = (height - DEFAULT_MARGIN * 2) / FONT_HEIGHT; - - let grid_size = rows * cols * core::mem::size_of::(); - let grid = mem::alloc_boxed_buffer::(grid_size); - let queue_size = rows * cols * core::mem::size_of::(); - let queue = mem::alloc_boxed_buffer::(queue_size); - - let map_size = rows * cols * core::mem::size_of::>(); - let map = mem::alloc_boxed_buffer::>(map_size); - - let bg_canvas_size = width * height * core::mem::size_of::(); - let bg_canvas = mem::alloc_boxed_buffer::(bg_canvas_size); - - let mut this = Self { - buffer, - info, - - x_pos: 0, - y_pos: 0, - - old_x_pos: 0, - old_y_pos: 0, - - rows, - cols, - - theme_background: cmdline.theme_background, - color: ColorCode::new(DEFAULT_TEXT_FOREGROUND, DEFAULT_TEXT_BACKGROUND), - - queue, - grid, - map, - bg_canvas, - - queue_cursor: 0, - - offset_x, - offset_y, - - cursor_visibility: true, - auto_flush: true, - }; - - let image = cmdline.term_background.map(|a| parse_bmp_image(a)); - - this.generate_canvas(image); - this.clear(true); - this.double_buffer_flush(); - - this - } + color_list: ColorList, +} +impl<'a> Inner<'a> { fn genloop( &mut self, image: &Image, @@ -373,7 +378,7 @@ impl<'this> DebugRendy<'this> { } } - pub fn get_framebuffer<'a>(&'a mut self) -> &'a mut [u32] { + pub fn get_framebuffer<'b>(&'b mut self) -> &'b mut [u32] { self.buffer } @@ -513,16 +518,6 @@ impl<'this> DebugRendy<'this> { self.auto_flush = yes; } - fn write_string(&mut self, string: &str) { - for char in string.chars() { - self.write_character(char) - } - - if self.auto_flush { - self.double_buffer_flush(); - } - } - fn draw_cursor(&mut self) { let i = self.x_pos + self.y_pos * self.cols; let mut char; @@ -740,14 +735,159 @@ impl<'this> DebugRendy<'this> { } } +pub struct DebugRendy<'a> { + inner: Inner<'a>, + performer: Processor, +} + +impl<'this> DebugRendy<'this> { + /// Create a new debug renderer with the default foreground color set to white and + /// background color set to black. + pub fn new(buffer: &'this mut [u32], info: RendyInfo, cmdline: &CommandLine) -> Self { + let width = info.horizontal_resolution; + let height = info.vertical_resolution; + + let offset_x = DEFAULT_MARGIN + ((width - DEFAULT_MARGIN * 2) % FONT_WIDTH) / 2; + let offset_y = DEFAULT_MARGIN + ((height - DEFAULT_MARGIN * 2) % FONT_HEIGHT) / 2; + + let cols = (width - DEFAULT_MARGIN * 2) / FONT_WIDTH; + let rows = (height - DEFAULT_MARGIN * 2) / FONT_HEIGHT; + + let grid_size = rows * cols * core::mem::size_of::(); + let grid = mem::alloc_boxed_buffer::(grid_size); + + let queue_size = rows * cols * core::mem::size_of::(); + let queue = mem::alloc_boxed_buffer::(queue_size); + + let map_size = rows * cols * core::mem::size_of::>(); + let map = mem::alloc_boxed_buffer::>(map_size); + + let bg_canvas_size = width * height * core::mem::size_of::(); + let bg_canvas = mem::alloc_boxed_buffer::(bg_canvas_size); + + let mut this = Self { + inner: Inner { + buffer, + info, + + x_pos: 0, + y_pos: 0, + + old_x_pos: 0, + old_y_pos: 0, + + rows, + cols, + + theme_background: cmdline.theme_background, + color: ColorCode::new(DEFAULT_TEXT_FOREGROUND, DEFAULT_TEXT_BACKGROUND), + + queue, + grid, + map, + bg_canvas, + + queue_cursor: 0, + + offset_x, + offset_y, + + cursor_visibility: true, + auto_flush: true, + + color_list: ColorList::new(), + }, + performer: Processor::new(), + }; + + let image = cmdline.term_background.map(|a| parse_bmp_image(a)); + + this.generate_canvas(image); + this.clear(true); + this.double_buffer_flush(); + + this + } +} + +impl<'a> core::ops::Deref for DebugRendy<'a> { + type Target = Inner<'a>; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl<'a> core::ops::DerefMut for DebugRendy<'a> { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} + impl<'this> fmt::Write for DebugRendy<'this> { fn write_str(&mut self, string: &str) -> fmt::Result { - self.write_string(string); - + for b in string.bytes() { + self.performer.advance(&mut self.inner, b); + } Ok(()) } } +impl<'a> vte::ansi::Handler for Inner<'a> { + fn input(&mut self, c: char) { + self.write_character(c); + + if self.auto_flush { + self.double_buffer_flush(); + } + } + + fn linefeed(&mut self) { + self.input('\n'); + } + + fn terminal_attribute(&mut self, attr: Attr) { + match attr { + Attr::Reset => { + self.color = ColorCode::new(DEFAULT_TEXT_FOREGROUND, DEFAULT_TEXT_BACKGROUND) + } + + // Attr::Bold => todo!(), + // Attr::Dim => todo!(), + // Attr::Italic => todo!(), + // Attr::Underline => todo!(), + // Attr::DoubleUnderline => todo!(), + // Attr::Undercurl => todo!(), + // Attr::DottedUnderline => todo!(), + // Attr::DashedUnderline => todo!(), + // Attr::BlinkSlow => todo!(), + // Attr::BlinkFast => todo!(), + // Attr::Reverse => todo!(), + // Attr::Hidden => todo!(), + // Attr::Strike => todo!(), + // Attr::CancelBold => todo!(), + // Attr::CancelBoldDim => todo!(), + // Attr::CancelItalic => todo!(), + // Attr::CancelUnderline => todo!(), + // Attr::CancelBlink => todo!(), + // Attr::CancelReverse => todo!(), + // Attr::CancelHidden => todo!(), + // Attr::CancelStrike => todo!(), + Attr::Foreground(color) => { + let code = match color { + vte::ansi::Color::Named(c) => self.color_list[c], + _ => unimplemented!(), + }; + + self.color.0 = code; + } + // Attr::Background(_) => todo!(), + // Attr::UnderlineColor(_) => todo!(), + _ => {} + } + } +} + unsafe impl<'this> Send for DebugRendy<'this> {} unsafe impl<'this> Sync for DebugRendy<'this> {} From 4e014fa0fc02596b3ce535bfcb21187075649bb4 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 18 May 2023 16:53:36 +1000 Subject: [PATCH 203/368] kernel: update to upstream vte Signed-off-by: Anhad Singh --- src/Cargo.lock | 6 +++--- src/aero_kernel/Cargo.toml | 6 +----- src/aero_kernel/src/rendy.rs | 12 ++++++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index c7eebb6bb5b..d0aae938a0a 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -484,7 +484,7 @@ checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] name = "utf8parse" version = "0.2.1" -source = "git+https://github.com/aero-os/vte#401bd5ab59f903c48c78b179a93390428ceb2215" +source = "git+https://github.com/alacritty/vte#d5036ab2c20dfb0853cb1c7b9bc41a58c24c5bf2" [[package]] name = "version_check" @@ -495,7 +495,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vte" version = "0.11.0" -source = "git+https://github.com/aero-os/vte#401bd5ab59f903c48c78b179a93390428ceb2215" +source = "git+https://github.com/alacritty/vte#d5036ab2c20dfb0853cb1c7b9bc41a58c24c5bf2" dependencies = [ "arrayvec", "log", @@ -506,7 +506,7 @@ dependencies = [ [[package]] name = "vte_generate_state_changes" version = "0.1.1" -source = "git+https://github.com/aero-os/vte#401bd5ab59f903c48c78b179a93390428ceb2215" +source = "git+https://github.com/alacritty/vte#d5036ab2c20dfb0853cb1c7b9bc41a58c24c5bf2" dependencies = [ "proc-macro2", "quote", diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index feefa1a53fd..032d795f106 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -47,16 +47,12 @@ byteorder = { version = "*", default-features = false } limine = { git = "https://github.com/limine-bootloader/limine-rs" } cfg-if = "1.0" num-traits = { version = "0.2", default-features = false } +vte = { git = "https://github.com/alacritty/vte", features = ["ansi"] } # X86_64 specific dependencies: [target.'cfg(target_arch = "x86_64")'.dependencies] raw-cpuid = "10.0.0" -[dependencies.vte] -git = "https://github.com/aero-os/vte" -default-features = false -features = ["no_std", "ansi"] - [dependencies.lazy_static] version = "1.4.0" features = ["spin_no_std"] diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 73b7da89c27..1a2c418b5fb 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -29,7 +29,7 @@ use alloc::boxed::Box; use limine::Framebuffer; use spin::Once; use vte::ansi::NamedColor; -use vte::ansi::SyncHandler; +use vte::ansi::Timeout; use crate::cmdline::CommandLine; use crate::mem; @@ -209,9 +209,13 @@ fn parse_bmp_image(data: &[u8]) -> Image { #[derive(Default)] struct RendySync; -impl SyncHandler for RendySync { - fn update_timeout(&mut self, _: Option) { - unreachable!() +impl Timeout for RendySync { + fn set_timeout(&mut self, duration: core::time::Duration) { + unimplemented!() + } + + fn clear_timeout(&mut self) { + unimplemented!() } fn pending_timeout(&self) -> bool { From 486e3ae1c51f6bb11c2b7446f7375c873e2e27b6 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 18 May 2023 16:58:13 +1000 Subject: [PATCH 204/368] kernel: remove calls to `drop` with a reference This was discovered with the new rustc warning in place. Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/block/ahci.rs | 4 ---- src/aero_kernel/src/drivers/e1000.rs | 1 - src/aero_kernel/src/fs/ext2/mod.rs | 3 --- src/aero_kernel/src/rendy.rs | 3 ++- 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/aero_kernel/src/drivers/block/ahci.rs b/src/aero_kernel/src/drivers/block/ahci.rs index 565bffeb2d3..76be775f096 100644 --- a/src/aero_kernel/src/drivers/block/ahci.rs +++ b/src/aero_kernel/src/drivers/block/ahci.rs @@ -872,10 +872,6 @@ impl AhciProtected { if port.probe(offset_table, i)? { // Get the address of the HBA port. let address = VirtAddr::new(port as *const _ as _); - - drop(port); // Drop the reference to the port. - drop(hba); // Drop the reference to the HBA. - let port = Arc::new(AhciPort::new(address)); // Add the port to the ports array. diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index b45ebd0daaf..d73ca88ceaf 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -386,7 +386,6 @@ impl E1000 { ring[cur].cmd = 0b1011; ring[cur].status = TStatus::empty(); - drop(ring); self.tx_cur = (self.tx_cur + 1) % TX_DESC_NUM as usize; self.write(Register::TxDescTail, self.tx_cur as u32); diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 8f71f3f0b98..91b26f3a480 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -187,13 +187,10 @@ impl INode { let entries_per_block = fs.superblock.entries_per_block(); let new_block = fs.bgdt.alloc_block_ptr()?; - let data_ptrs = self.inode.read().data_ptr; let mut next_block_num = self.inode.read().size().ceil_div(block_size); if next_block_num < 12 { - drop(data_ptrs); - let mut inode = self.inode.write(); assert_eq!(inode.data_ptr[next_block_num], 0); diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 1a2c418b5fb..811daafb332 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -22,6 +22,7 @@ use core::fmt::Write; use core::fmt; use core::ops::Index; use core::ops::IndexMut; +use core::time::Duration; use core::u8; use alloc::boxed::Box; @@ -210,7 +211,7 @@ fn parse_bmp_image(data: &[u8]) -> Image { struct RendySync; impl Timeout for RendySync { - fn set_timeout(&mut self, duration: core::time::Duration) { + fn set_timeout(&mut self, _duration: Duration) { unimplemented!() } From 139cd597bf63423aa697cbd18360c9881b69585a Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 18 May 2023 17:06:16 +1000 Subject: [PATCH 205/368] aero.py: add `--fmt` which formats the whole workspace * Add the `--fmt` command * Format the whole workspace Signed-off-by: Anhad Singh --- aero.py | 11 ++++- src/aero_kernel/src/acpi/fadt.rs | 3 +- src/aero_kernel/src/arch/x86_64/gdt.rs | 3 +- src/aero_kernel/src/arch/x86_64/task.rs | 5 +- src/aero_kernel/src/drivers/drm/mod.rs | 3 +- src/aero_kernel/src/fs/epoll.rs | 8 ++-- src/aero_kernel/src/fs/ext2/group_desc.rs | 8 ++-- src/aero_kernel/src/fs/ramfs.rs | 3 +- src/aero_kernel/src/mem/paging/mapper.rs | 57 ++++++++++++----------- src/aero_kernel/src/userland/vm.rs | 12 +++-- 10 files changed, 64 insertions(+), 49 deletions(-) diff --git a/aero.py b/aero.py index 80197dd627e..383e4d52764 100755 --- a/aero.py +++ b/aero.py @@ -179,6 +179,11 @@ def parse_args(): default='9800M', help='amount of memory to allocate to QEMU') + parser.add_argument('--fmt', + default=False, + action='store_true', + help='format the source code') + return parser.parse_args() @@ -587,9 +592,13 @@ def is_kvm_supported() -> bool: def main(): - t0 = time.time() args = parse_args() + if args.fmt: + run_command(['cargo', 'fmt'], cwd="src") + return + + t0 = time.time() # arch-aero_os target_arch = args.target.split('-')[0] build_info = BuildInfo(target_arch, args) diff --git a/src/aero_kernel/src/acpi/fadt.rs b/src/aero_kernel/src/acpi/fadt.rs index 7b202f90049..636ee5dfc40 100644 --- a/src/aero_kernel/src/acpi/fadt.rs +++ b/src/aero_kernel/src/acpi/fadt.rs @@ -17,7 +17,8 @@ * along with Aero. If not, see . */ -//! The FADT ACPI table contains information about fixed register blocks pertaining to power management. +//! The FADT ACPI table contains information about fixed register blocks pertaining to power +//! management. //! //! **Notes**: diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index a7e0bc2ffbd..c50a8bebc3a 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -294,7 +294,8 @@ pub struct Kpcr { /// Initialize the bootstrap GDT which is required to initialize TLS (Thread Local Storage) /// support so, after the kernel heap we will map the TLS section and initialize the *actual* GDT -/// and then each CPU will have it's own GDT but we only will have to define it once as a `#[thread_local]`. +/// and then each CPU will have it's own GDT but we only will have to define it once as a +/// `#[thread_local]`. pub fn init_boot() { unsafe { let gdt_descriptor = GdtDescriptor::new( diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 39edcf71195..4dc380340be 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -89,8 +89,9 @@ pub enum AuxvType { /// being mapped at the maximum canonical address. /// /// * On AMD CPUs in the Ryzen family, there's a nasty bug in which the CPUs malfunction if they -/// execute code from the highest canonical page. They'll speculate right off the end of the canonical -/// space and bad things happen. This is worked around in the same way as the Intel problem. +/// execute code from the highest canonical page. They'll speculate right off the end of the +/// canonical space and bad things happen. This is worked around in the same way as the Intel +/// problem. pub fn userland_last_address() -> VirtAddr { // Reference: https://elixir.bootlin.com/linux/latest/source/arch/x86/include/asm/page_64.h#L61 static CACHED: spin::Once = spin::Once::new(); diff --git a/src/aero_kernel/src/drivers/drm/mod.rs b/src/aero_kernel/src/drivers/drm/mod.rs index 38591f88cb1..18ba1bebf3f 100644 --- a/src/aero_kernel/src/drivers/drm/mod.rs +++ b/src/aero_kernel/src/drivers/drm/mod.rs @@ -114,8 +114,7 @@ impl BufferObject { // - has the display mode and params. // // Encoders: -// - takes the raw data from the CRTCs and converts it into a -// specific format. +// - takes the raw data from the CRTCs and converts it into a specific format. // // Connectors: // - outputs the encoded data to an external display. diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index d01990b6c8b..24a1209c68b 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -100,13 +100,13 @@ impl EPoll { /// ## Arguments /// /// * `events`: Used to return information from the ready list about file descriptors in the - /// interest list that have some events available. + /// interest list that have some events available. /// /// * `max_events`: Maximum number of events. /// - /// * `timeout`: specifies the minimum number of milliseconds that epoll wait will block. Specifying - /// a timeout of `-1` will block indefinitely. While specifying a timeout of `0` will return - /// immediately even if there are available no events. + /// * `timeout`: specifies the minimum number of milliseconds that epoll wait will block. + /// Specifying a timeout of `-1` will block indefinitely. While specifying a timeout of `0` + /// will return immediately even if there are available no events. /// /// /// ## Blocking diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index 13a3e7a6230..bf42100896d 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -39,10 +39,10 @@ impl GroupDescriptors { /// /// ## Arguments /// - /// * `ext2` - Weak pointer to the EXT2 filesystem. This function does not call `upgrade` on - /// the pointer so, it is valid to pass a semi-constructed `Arc` pointer (e.g - /// through `Arc::new_cyclic`) though invoking other functions on the group descriptors - /// require the pointer to be fully constructed). + /// * `ext2` - Weak pointer to the EXT2 filesystem. This function does not call `upgrade` on the + /// pointer so, it is valid to pass a semi-constructed `Arc` pointer (e.g through + /// `Arc::new_cyclic`) though invoking other functions on the group descriptors require the + /// pointer to be fully constructed). /// /// * `superblock` - Reference to the EXT2 superblock. /// diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index caf9c933585..16c4e172f17 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -328,7 +328,8 @@ impl INodeInterface for LockedRamINode { id: this.id, file_type: this.file_type, size: match &this.contents { - FileContents::Content(bytes) => bytes.lock().len(), // Temporary value dropped and lock is unlocked! + FileContents::Content(bytes) => bytes.lock().len(), /* Temporary value dropped */ + // and lock is unlocked! FileContents::StaticContent(bytes) => bytes.len(), _ => 0x00, }, diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index f69b4094b13..88ecde179fe 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -137,12 +137,13 @@ pub trait Mapper { /// This function might need additional physical frames to create new page tables. These /// frames are allocated from the `allocator` argument. At most three frames are required. /// - /// Parent page table entries are automatically updated with `PRESENT | WRITABLE | USER_ACCESSIBLE` - /// if present in the `PageTableFlags`. Depending on the used mapper implementation - /// the `PRESENT` and `WRITABLE` flags might be set for parent tables, + /// Parent page table entries are automatically updated with `PRESENT | WRITABLE | + /// USER_ACCESSIBLE` if present in the `PageTableFlags`. Depending on the used mapper + /// implementation the `PRESENT` and `WRITABLE` flags might be set for parent tables, /// even if they are not set in `PageTableFlags`. /// - /// The `map_to_with_table_flags` method gives explicit control over the parent page table flags. + /// The `map_to_with_table_flags` method gives explicit control over the parent page table + /// flags. /// /// ## Safety /// @@ -156,16 +157,16 @@ pub trait Mapper { /// violations can occur through the new mapping. Among other things, the /// caller must prevent the following: /// - /// - Aliasing of `&mut` references, i.e. two `&mut` references that point to - /// the same physical address. This is undefined behavior in Rust. - /// - This can be ensured by mapping each page to an individual physical - /// frame that is not mapped anywhere else. - /// - Creating uninitialized or invalid values: Rust requires that all values - /// have a correct memory layout. For example, a `bool` must be either a 0 - /// or a 1 in memory, but not a 3 or 4. An exception is the `MaybeUninit` - /// wrapper type, which abstracts over possibly uninitialized memory. - /// - This is only a problem when re-mapping pages to different physical - /// frames. Mapping a page that is not in use yet is fine. + /// - Aliasing of `&mut` references, i.e. two `&mut` references that point to the same physical + /// address. This is undefined behavior in Rust. + /// - This can be ensured by mapping each page to an individual physical frame that is not + /// mapped anywhere else. + /// - Creating uninitialized or invalid values: Rust requires that all values have a correct + /// memory layout. For example, a `bool` must be either a 0 or a 1 in memory, but not a 3 or + /// 4. An exception is the `MaybeUninit` wrapper type, which abstracts over possibly + /// uninitialized memory. + /// - This is only a problem when re-mapping pages to different physical frames. Mapping a + /// page that is not in use yet is fine. /// /// Special care must be taken when sharing pages with other address spaces, /// e.g. by setting the `GLOBAL` flag. For example, a global mapping must be @@ -210,16 +211,16 @@ pub trait Mapper { /// violations can occur through the new mapping. Among other things, the /// caller must prevent the following: /// - /// - Aliasing of `&mut` references, i.e. two `&mut` references that point to - /// the same physical address. This is undefined behavior in Rust. - /// - This can be ensured by mapping each page to an individual physical - /// frame that is not mapped anywhere else. - /// - Creating uninitialized or invalid values: Rust requires that all values - /// have a correct memory layout. For example, a `bool` must be either a 0 - /// or a 1 in memory, but not a 3 or 4. An exception is the `MaybeUninit` - /// wrapper type, which abstracts over possibly uninitialized memory. - /// - This is only a problem when re-mapping pages to different physical - /// frames. Mapping a page that is not in use yet is fine. + /// - Aliasing of `&mut` references, i.e. two `&mut` references that point to the same physical + /// address. This is undefined behavior in Rust. + /// - This can be ensured by mapping each page to an individual physical frame that is not + /// mapped anywhere else. + /// - Creating uninitialized or invalid values: Rust requires that all values have a correct + /// memory layout. For example, a `bool` must be either a 0 or a 1 in memory, but not a 3 or + /// 4. An exception is the `MaybeUninit` wrapper type, which abstracts over possibly + /// uninitialized memory. + /// - This is only a problem when re-mapping pages to different physical frames. Mapping a + /// page that is not in use yet is fine. /// /// Special care must be taken when sharing pages with other address spaces, /// e.g. by setting the `GLOBAL` flag. For example, a global mapping must be @@ -390,10 +391,10 @@ impl<'a, P: PageTableFrameMapping> MappedPageTable<'a, P> { /// /// ## Safety /// - /// This function is unsafe because the caller must guarantee that the passed `page_table_frame_mapping` - /// closure is correct. Also, the passed `page_table` must point to the level 4 page table - /// of a valid page table hierarchy. Otherwise this function might break memory safety, e.g. - /// by writing to an illegal memory location. + /// This function is unsafe because the caller must guarantee that the passed + /// `page_table_frame_mapping` closure is correct. Also, the passed `page_table` must point + /// to the level 4 page table of a valid page table hierarchy. Otherwise this function might + /// break memory safety, e.g. by writing to an illegal memory location. #[inline] pub unsafe fn new(page_table: &'a mut PageTable, page_table_frame_mapping: P) -> Self { Self { diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 70aa0f2a637..9f2dd803b37 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -391,7 +391,8 @@ impl Mapping { } unsafe { - // The page is present but most likely the flags need to be updated after mprotect(2). + // The page is present but most likely the flags need to be updated after + // mprotect(2). let page: Page = Page::containing_address(address); offset_table .update_flags( @@ -502,10 +503,10 @@ impl Mapping { Ok(()) } - /// Handler routine for a COW (Copy-On-Write) pages. A COW page is shared between multiple processes - /// until a write occurs after which a private copy is made for the writing process. A COW page - /// is recognised because the VMA for the region is marked writable even though the individual page - /// table entry is not. + /// Handler routine for a COW (Copy-On-Write) pages. A COW page is shared between multiple + /// processes until a write occurs after which a private copy is made for the writing + /// process. A COW page is recognised because the VMA for the region is marked writable even + /// though the individual page table entry is not. /// /// ## Panics /// * The provided `address` is not aligned to a page boundary. @@ -961,6 +962,7 @@ impl VmProtected { prot.insert(MMapProt::PROT_EXEC); } + #[rustfmt::skip] /* * The last non-bss frame of the segment consists partly of data and partly of bss * memory, which must be zeroed. Unfortunately, the file representation might have From e51e50705c3fbe8c35cf2e56db3c505359d7490b Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 18 May 2023 17:28:14 +1000 Subject: [PATCH 206/368] all: stricter rustfmt Signed-off-by: Anhad Singh --- .rustfmt.toml | 13 ++ src/aero_kernel/build.rs | 36 +++--- src/aero_kernel/src/acpi/fadt.rs | 34 +++--- src/aero_kernel/src/acpi/hpet.rs | 34 +++--- src/aero_kernel/src/acpi/madt.rs | 34 +++--- src/aero_kernel/src/acpi/mcfg.rs | 34 +++--- src/aero_kernel/src/acpi/mod.rs | 45 ++++--- src/aero_kernel/src/acpi/rsdp.rs | 34 +++--- src/aero_kernel/src/acpi/sdt.rs | 34 +++--- src/aero_kernel/src/arch/aarch64/mod.rs | 34 +++--- src/aero_kernel/src/arch/aarch64/task.rs | 34 +++--- src/aero_kernel/src/arch/aarch64/time.rs | 34 +++--- src/aero_kernel/src/arch/aarch64/tls.rs | 34 +++--- src/aero_kernel/src/arch/mod.rs | 34 +++--- src/aero_kernel/src/arch/x86_64/apic.rs | 34 +++--- .../src/arch/x86_64/controlregs.rs | 34 +++--- src/aero_kernel/src/arch/x86_64/gdt.rs | 56 ++++----- .../src/arch/x86_64/interrupts/exceptions.rs | 34 +++--- .../src/arch/x86_64/interrupts/idt.rs | 47 ++++---- .../src/arch/x86_64/interrupts/mod.rs | 34 +++--- src/aero_kernel/src/arch/x86_64/io.rs | 34 +++--- src/aero_kernel/src/arch/x86_64/mod.rs | 41 +++---- src/aero_kernel/src/arch/x86_64/signals.rs | 34 +++--- src/aero_kernel/src/arch/x86_64/syscall.rs | 20 ++- src/aero_kernel/src/arch/x86_64/task.rs | 37 +++--- src/aero_kernel/src/arch/x86_64/time.rs | 34 +++--- src/aero_kernel/src/arch/x86_64/tls.rs | 34 +++--- src/aero_kernel/src/drivers/block/ahci.rs | 43 +++---- .../src/drivers/block/ide/channel.rs | 34 +++--- src/aero_kernel/src/drivers/block/ide/mod.rs | 34 +++--- .../src/drivers/block/ide/registers.rs | 34 +++--- .../src/drivers/block/nvme/command.rs | 34 +++--- src/aero_kernel/src/drivers/block/nvme/mod.rs | 34 +++--- .../src/drivers/block/nvme/queue.rs | 6 +- src/aero_kernel/src/drivers/drm/mod.rs | 37 +++--- src/aero_kernel/src/drivers/drm/rawfb.rs | 37 +++--- src/aero_kernel/src/drivers/e1000.rs | 37 +++--- src/aero_kernel/src/drivers/keyboard.rs | 34 +++--- src/aero_kernel/src/drivers/lai.rs | 38 +++--- src/aero_kernel/src/drivers/mod.rs | 34 +++--- src/aero_kernel/src/drivers/mouse.rs | 34 +++--- src/aero_kernel/src/drivers/pci.rs | 114 ++++++------------ src/aero_kernel/src/drivers/pty.rs | 57 ++++----- src/aero_kernel/src/drivers/tty.rs | 41 +++---- src/aero_kernel/src/drivers/uart_16550.rs | 34 +++--- src/aero_kernel/src/drivers/uart_pl011.rs | 34 +++--- src/aero_kernel/src/fs/block/gpt.rs | 34 +++--- src/aero_kernel/src/fs/block/mod.rs | 34 +++--- src/aero_kernel/src/fs/cache.rs | 40 +++--- src/aero_kernel/src/fs/devfs.rs | 43 +++---- src/aero_kernel/src/fs/epoll.rs | 34 +++--- src/aero_kernel/src/fs/eventfd.rs | 34 +++--- src/aero_kernel/src/fs/ext2/disk.rs | 34 +++--- src/aero_kernel/src/fs/ext2/group_desc.rs | 34 +++--- src/aero_kernel/src/fs/ext2/mod.rs | 34 +++--- src/aero_kernel/src/fs/file_table.rs | 34 +++--- src/aero_kernel/src/fs/inode.rs | 61 ++++------ src/aero_kernel/src/fs/mod.rs | 37 +++--- src/aero_kernel/src/fs/ramfs.rs | 46 +++---- src/aero_kernel/src/logger.rs | 34 +++--- src/aero_kernel/src/main.rs | 34 +++--- src/aero_kernel/src/mem/alloc.rs | 34 +++--- src/aero_kernel/src/mem/mod.rs | 34 +++--- src/aero_kernel/src/mem/paging/addr.rs | 44 ++++--- src/aero_kernel/src/mem/paging/frame.rs | 34 +++--- src/aero_kernel/src/mem/paging/mapper.rs | 45 +++---- src/aero_kernel/src/mem/paging/mod.rs | 40 +++--- src/aero_kernel/src/mem/paging/page.rs | 40 +++--- src/aero_kernel/src/mem/paging/page_table.rs | 34 +++--- src/aero_kernel/src/mem/pti.rs | 34 +++--- src/aero_kernel/src/mem/slab.rs | 34 +++--- src/aero_kernel/src/mem/vmalloc.rs | 34 +++--- src/aero_kernel/src/modules.rs | 34 +++--- src/aero_kernel/src/net/arp.rs | 34 +++--- src/aero_kernel/src/net/ethernet.rs | 34 +++--- src/aero_kernel/src/net/ip.rs | 34 +++--- src/aero_kernel/src/net/mod.rs | 44 ++++--- src/aero_kernel/src/net/udp.rs | 34 +++--- src/aero_kernel/src/rendy.rs | 43 +++---- src/aero_kernel/src/socket/mod.rs | 37 +++--- src/aero_kernel/src/socket/udp.rs | 34 +++--- src/aero_kernel/src/socket/unix.rs | 34 +++--- src/aero_kernel/src/syscall/fs.rs | 40 +++--- src/aero_kernel/src/syscall/futex.rs | 34 +++--- src/aero_kernel/src/syscall/ipc.rs | 37 +++--- src/aero_kernel/src/syscall/mod.rs | 34 +++--- src/aero_kernel/src/syscall/net.rs | 3 +- src/aero_kernel/src/syscall/process.rs | 34 +++--- src/aero_kernel/src/syscall/time.rs | 34 +++--- src/aero_kernel/src/tests.rs | 34 +++--- src/aero_kernel/src/unwind.rs | 37 +++--- src/aero_kernel/src/userland/mod.rs | 34 +++--- src/aero_kernel/src/userland/scheduler/mod.rs | 37 +++--- .../src/userland/scheduler/round_robin.rs | 34 +++--- src/aero_kernel/src/userland/signals.rs | 34 +++--- src/aero_kernel/src/userland/task/mod.rs | 34 +++--- src/aero_kernel/src/userland/vm.rs | 91 +++++++------- src/aero_kernel/src/utils/buffer.rs | 34 +++--- src/aero_kernel/src/utils/dma.rs | 42 +++---- src/aero_kernel/src/utils/mod.rs | 45 +++---- src/aero_proc/src/lib.rs | 34 +++--- src/aero_proc/src/syscall.rs | 34 +++--- src/aero_proc/src/test.rs | 34 +++--- src/aero_syscall/src/consts.rs | 34 +++--- src/aero_syscall/src/lib.rs | 34 +++--- src/aero_syscall/src/signal.rs | 34 +++--- src/aero_syscall/src/syscall.rs | 34 +++--- src/aero_syscall/src/time.rs | 34 +++--- src/uapi/src/drm.rs | 50 ++++---- src/uapi/src/ioctl.rs | 22 ++-- 110 files changed, 1889 insertions(+), 2154 deletions(-) diff --git a/.rustfmt.toml b/.rustfmt.toml index a313d021dcd..b6beaf6d696 100644 --- a/.rustfmt.toml +++ b/.rustfmt.toml @@ -1,5 +1,18 @@ edition = "2021" newline_style = "Unix" +# maximum length of comments. comment_width = 100 +# break comments to fit on the line wrap_comments = true +# convert `/* */` comments to `//` comments where possible +normalize_comments = true +# format code snippet included in doc comments. +format_code_in_doc_comments = true + +# merge imports from the same module into a single use +# statement. Conversely, imports from different modules +# are split into separate statements. +imports_granularity = "Module" +# `type` and `const` are put first, then macros and methods. +reorder_impl_items = true diff --git a/src/aero_kernel/build.rs b/src/aero_kernel/build.rs index 88fb7081a64..f71b6288bcf 100644 --- a/src/aero_kernel/build.rs +++ b/src/aero_kernel/build.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use std::fs; @@ -24,7 +22,7 @@ use std::ffi::OsString; use std::fs::DirEntry; use std::path::Path; -//this is all magic, yes dont ever let anyone see this shit +// this is all magic, yes dont ever let anyone see this shit /// Helper function of walking the provided `dir`, only visiting files and calling /// `cb` on each file. diff --git a/src/aero_kernel/src/acpi/fadt.rs b/src/aero_kernel/src/acpi/fadt.rs index 636ee5dfc40..96205d77a3e 100644 --- a/src/aero_kernel/src/acpi/fadt.rs +++ b/src/aero_kernel/src/acpi/fadt.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! The FADT ACPI table contains information about fixed register blocks pertaining to power //! management. diff --git a/src/aero_kernel/src/acpi/hpet.rs b/src/aero_kernel/src/acpi/hpet.rs index 2525786f09a..b0d5de7599f 100644 --- a/src/aero_kernel/src/acpi/hpet.rs +++ b/src/aero_kernel/src/acpi/hpet.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::ptr; diff --git a/src/aero_kernel/src/acpi/madt.rs b/src/aero_kernel/src/acpi/madt.rs index 02c9768fa40..dfaada3a4fd 100644 --- a/src/aero_kernel/src/acpi/madt.rs +++ b/src/aero_kernel/src/acpi/madt.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::mem; diff --git a/src/aero_kernel/src/acpi/mcfg.rs b/src/aero_kernel/src/acpi/mcfg.rs index a7f220817dc..72202a0c50c 100644 --- a/src/aero_kernel/src/acpi/mcfg.rs +++ b/src/aero_kernel/src/acpi/mcfg.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::mem; diff --git a/src/aero_kernel/src/acpi/mod.rs b/src/aero_kernel/src/acpi/mod.rs index 5a03ff691f3..9199dd68e1f 100644 --- a/src/aero_kernel/src/acpi/mod.rs +++ b/src/aero_kernel/src/acpi/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! The ACPI (Advanced Configuration and Power Interface) tables help to gather the //! CPU, interrupt, and timer information. @@ -24,12 +22,13 @@ use spin::Once; -use crate::{ - mem::paging::VirtAddr, - utils::sync::{Mutex, MutexGuard}, -}; +use crate::mem::paging::VirtAddr; +use crate::utils::sync::{Mutex, MutexGuard}; -use self::{hpet::Hpet, madt::Madt, mcfg::Mcfg, sdt::Sdt}; +use self::hpet::Hpet; +use self::madt::Madt; +use self::mcfg::Mcfg; +use self::sdt::Sdt; pub mod aml; pub mod fadt; diff --git a/src/aero_kernel/src/acpi/rsdp.rs b/src/aero_kernel/src/acpi/rsdp.rs index 231845eb220..9268c70aa51 100644 --- a/src/aero_kernel/src/acpi/rsdp.rs +++ b/src/aero_kernel/src/acpi/rsdp.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::marker::PhantomData; diff --git a/src/aero_kernel/src/acpi/sdt.rs b/src/aero_kernel/src/acpi/sdt.rs index bee1de457e0..3933d698754 100644 --- a/src/aero_kernel/src/acpi/sdt.rs +++ b/src/aero_kernel/src/acpi/sdt.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::mem; diff --git a/src/aero_kernel/src/arch/aarch64/mod.rs b/src/aero_kernel/src/arch/aarch64/mod.rs index 858844f6923..2fa8cc4fa95 100644 --- a/src/aero_kernel/src/arch/aarch64/mod.rs +++ b/src/aero_kernel/src/arch/aarch64/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . pub mod dtb; pub mod interrupts; diff --git a/src/aero_kernel/src/arch/aarch64/task.rs b/src/aero_kernel/src/arch/aarch64/task.rs index 16e3d6ef4ad..2189ff28bb9 100644 --- a/src/aero_kernel/src/arch/aarch64/task.rs +++ b/src/aero_kernel/src/arch/aarch64/task.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use crate::fs::cache::DirCacheItem; use crate::mem::paging::*; diff --git a/src/aero_kernel/src/arch/aarch64/time.rs b/src/aero_kernel/src/arch/aarch64/time.rs index 29135290a88..989ca06e0f3 100644 --- a/src/aero_kernel/src/arch/aarch64/time.rs +++ b/src/aero_kernel/src/arch/aarch64/time.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use aero_syscall::TimeSpec; diff --git a/src/aero_kernel/src/arch/aarch64/tls.rs b/src/aero_kernel/src/arch/aarch64/tls.rs index 048465dc04e..b6fb352f528 100644 --- a/src/aero_kernel/src/arch/aarch64/tls.rs +++ b/src/aero_kernel/src/arch/aarch64/tls.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . pub fn get_cpuid() -> usize { unimplemented!() diff --git a/src/aero_kernel/src/arch/mod.rs b/src/aero_kernel/src/arch/mod.rs index d860434f609..3c761a2b177 100644 --- a/src/aero_kernel/src/arch/mod.rs +++ b/src/aero_kernel/src/arch/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . #[cfg(target_arch = "x86_64")] mod x86_64; diff --git a/src/aero_kernel/src/arch/x86_64/apic.rs b/src/aero_kernel/src/arch/x86_64/apic.rs index dbc9c2fbab6..bfc416fbe15 100644 --- a/src/aero_kernel/src/arch/x86_64/apic.rs +++ b/src/aero_kernel/src/arch/x86_64/apic.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::ptr; use core::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering}; diff --git a/src/aero_kernel/src/arch/x86_64/controlregs.rs b/src/aero_kernel/src/arch/x86_64/controlregs.rs index 2d875074f02..690f09ffa61 100644 --- a/src/aero_kernel/src/arch/x86_64/controlregs.rs +++ b/src/aero_kernel/src/arch/x86_64/controlregs.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use crate::mem::paging::{PhysAddr, PhysFrame, VirtAddr}; diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index c50a8bebc3a..3fd61a9f58a 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! The GDT contains entries telling the CPU about memory segments. //! @@ -169,13 +167,13 @@ static GDT: [GdtEntry; GDT_ENTRY_COUNT] = [ struct GdtAccessFlags; impl GdtAccessFlags { + const EXECUTABLE: u8 = 1 << 3; const NULL: u8 = 0; const PRESENT: u8 = 1 << 7; + const PRIVILEGE: u8 = 1 << 1; const RING_0: u8 = 0 << 5; const RING_3: u8 = 3 << 5; const SYSTEM: u8 = 1 << 4; - const EXECUTABLE: u8 = 1 << 3; - const PRIVILEGE: u8 = 1 << 1; const TSS_AVAIL: u8 = 9; } @@ -380,16 +378,14 @@ pub fn init() { #[inline(always)] unsafe fn load_cs(selector: SegmentSelector) { - /* - * NOTE: We cannot directly move into CS since x86 requires the IP - * and CS set at the same time. To do this, we need push the new segment - * selector and return value onto the stack and far return to reload CS and - * continue execution. - * - * We also cannot use a far call or a far jump since we would only be - * able to jump to 32-bit instruction pointers. Only Intel supports for - * 64-bit far calls/jumps in long-mode, AMD does not. - */ + // NOTE: We cannot directly move into CS since x86 requires the IP + // and CS set at the same time. To do this, we need push the new segment + // selector and return value onto the stack and far return to reload CS and + // continue execution. + // + // We also cannot use a far call or a far jump since we would only be + // able to jump to 32-bit instruction pointers. Only Intel supports for + // 64-bit far calls/jumps in long-mode, AMD does not. asm!( "push {selector}", "lea {tmp}, [1f + rip]", diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs index 0a003f8785a..6274c8124d7 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use super::{io, InterruptErrorStack}; diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs index 4cd78e7e557..02040402eeb 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! The IDT is similar to the Global Descriptor Table in structure. //! @@ -27,7 +25,8 @@ pub(super) static mut IDT: [IdtEntry; IDT_ENTRIES] = [IdtEntry::NULL; IDT_ENTRIE use core::mem::size_of; -use crate::{arch::gdt::SegmentSelector, utils::sync::Mutex}; +use crate::arch::gdt::SegmentSelector; +use crate::utils::sync::Mutex; bitflags::bitflags! { pub struct IDTFlags: u8 { @@ -222,12 +221,10 @@ pub fn init() { load_idt(&idt_descriptor); - /* - * Since lazy statics are initialized on the their first dereference, we have to - * manually initialize the static as the first dereference happen in an IRQ interrupt. - * This means that the controller will never be initialized as an IRQ interrupt requires - * the controller to be initialized. - */ + // Since lazy statics are initialized on the their first dereference, we have to + // manually initialize the static as the first dereference happen in an IRQ interrupt. + // This means that the controller will never be initialized as an IRQ interrupt requires + // the controller to be initialized. lazy_static::initialize(&super::INTERRUPT_CONTROLLER); lazy_static::initialize(&super::PIC_CONTROLLER); lazy_static::initialize(&super::APIC_CONTROLLER); diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs index 421c39fb0f4..785d32db291 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . mod exceptions; mod idt; diff --git a/src/aero_kernel/src/arch/x86_64/io.rs b/src/aero_kernel/src/arch/x86_64/io.rs index 52db0846d3b..d69e0519b9c 100644 --- a/src/aero_kernel/src/arch/x86_64/io.rs +++ b/src/aero_kernel/src/arch/x86_64/io.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! Wrapper functions for the hardware IO using respective assembly instructions. diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index 49b79a8f815..2dffcee57e4 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . pub mod apic; pub mod controlregs; @@ -30,17 +28,14 @@ pub mod tls; use core::sync::atomic::Ordering; -use crate::acpi; use crate::acpi::aml; -use crate::cmdline; +use crate::{acpi, cmdline}; use crate::mem; use crate::mem::paging; use crate::mem::paging::VirtAddr; -use crate::drivers; -use crate::logger; -use crate::rendy; +use crate::{drivers, logger, rendy}; use raw_cpuid::CpuId; diff --git a/src/aero_kernel/src/arch/x86_64/signals.rs b/src/aero_kernel/src/arch/x86_64/signals.rs index be5e414bbee..a6819abd49b 100644 --- a/src/aero_kernel/src/arch/x86_64/signals.rs +++ b/src/aero_kernel/src/arch/x86_64/signals.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use aero_syscall::signal::{SigProcMask, SignalFlags}; use aero_syscall::SyscallError; diff --git a/src/aero_kernel/src/arch/x86_64/syscall.rs b/src/aero_kernel/src/arch/x86_64/syscall.rs index 002219f37ab..5cd9d9a7ac6 100644 --- a/src/aero_kernel/src/arch/x86_64/syscall.rs +++ b/src/aero_kernel/src/arch/x86_64/syscall.rs @@ -127,10 +127,8 @@ pub(super) fn init() { assert!(has_syscall); unsafe { - /* - * Enable support for `syscall` and `sysret` instructions if the current - * CPU supports them and the target pointer width is 64. - */ + // Enable support for `syscall` and `sysret` instructions if the current + // CPU supports them and the target pointer width is 64. let syscall_base = GdtEntryType::KERNEL_CODE << 3; let sysret_base = (GdtEntryType::KERNEL_TLS << 3) | 3; @@ -147,14 +145,12 @@ pub(super) fn init() { io::wrmsr(io::IA32_EFER, efer | 1); } - /* - * Enable support for the `sysenter` instruction for system calls. - * - * This instruction is only supported on AMD processors in Legacy mode, - * not in Long mode (Compatibility or 64-bit modes), so still report support - * for it via `cpuid`. In this case the #UD exception is caught to handle the - * system call. - */ + // Enable support for the `sysenter` instruction for system calls. + // + // This instruction is only supported on AMD processors in Legacy mode, + // not in Long mode (Compatibility or 64-bit modes), so still report support + // for it via `cpuid`. In this case the #UD exception is caught to handle the + // system call. let has_sysenter = cpuid .get_feature_info() .map_or(false, |i| i.has_sysenter_sysexit()); diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 4dc380340be..b8cd1bd5169 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! ## How does `x86_64` context switching work? //! @@ -43,12 +41,13 @@ use core::alloc::Layout; use core::ptr::Unique; use crate::arch::controlregs::MxCsr; +use crate::arch::interrupts::InterruptErrorStack; use crate::fs::cache::DirCacheItem; +use crate::mem::alloc_boxed_buffer; use crate::mem::paging::*; use crate::syscall::ExecArgs; use crate::userland::vm::Vm; use crate::utils::StackHelper; -use crate::{arch::interrupts::InterruptErrorStack, mem::alloc_boxed_buffer}; use super::{controlregs, io}; diff --git a/src/aero_kernel/src/arch/x86_64/time.rs b/src/aero_kernel/src/arch/x86_64/time.rs index db358b0fdd5..f9a6c86c8e5 100644 --- a/src/aero_kernel/src/arch/x86_64/time.rs +++ b/src/aero_kernel/src/arch/x86_64/time.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! The PIT (Programmable Interval Timer) chip basically consists of an oscillator, //! a prescaler and 3 independent frequency dividers and it is used to create time intervals diff --git a/src/aero_kernel/src/arch/x86_64/tls.rs b/src/aero_kernel/src/arch/x86_64/tls.rs index 19c1c0b323e..b3cf59248d2 100644 --- a/src/aero_kernel/src/arch/x86_64/tls.rs +++ b/src/aero_kernel/src/arch/x86_64/tls.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! Thread Local Storage (TLS) are per-thread global variables. On 64-bit each CPU core's //! `fs` GDT segment points to the thread local memory area where the thread local static's diff --git a/src/aero_kernel/src/drivers/block/ahci.rs b/src/aero_kernel/src/drivers/block/ahci.rs index 76be775f096..4ee7b72044e 100644 --- a/src/aero_kernel/src/drivers/block/ahci.rs +++ b/src/aero_kernel/src/drivers/block/ahci.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::sync::Arc; @@ -23,7 +21,8 @@ use alloc::vec::Vec; use bit_field::BitField; use spin::Once; -use crate::mem::{paging::*, AddressSpace}; +use crate::mem::paging::*; +use crate::mem::AddressSpace; use crate::utils::sync::Mutex; use crate::utils::{CeilDiv, VolatileCell}; @@ -564,10 +563,8 @@ impl HbaPort { fn start(&mut self, offset_table: &mut OffsetPageTable) -> Result<(), MapToError> { self.stop_cmd(); // Stop the command engine before starting the port - /* - * size = sizeof(CTB) * 32 == 4KiB * 2 (so we need to allocate - * two 4KiB size frames). - */ + // size = sizeof(CTB) * 32 == 4KiB * 2 (so we need to allocate + // two 4KiB size frames). let frame_addr = pmm_alloc(BuddyOrdering::Size8KiB); let page_addr = crate::IO_VIRTUAL_BASE + frame_addr.as_u64(); diff --git a/src/aero_kernel/src/drivers/block/ide/channel.rs b/src/aero_kernel/src/drivers/block/ide/channel.rs index c0552d37aba..e22044ed66f 100644 --- a/src/aero_kernel/src/drivers/block/ide/channel.rs +++ b/src/aero_kernel/src/drivers/block/ide/channel.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::sync::Arc; use bit_field::BitField; diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index 5bcd4c82ded..538a7127b60 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . mod channel; mod registers; diff --git a/src/aero_kernel/src/drivers/block/ide/registers.rs b/src/aero_kernel/src/drivers/block/ide/registers.rs index fe8aefff697..080ad60c905 100644 --- a/src/aero_kernel/src/drivers/block/ide/registers.rs +++ b/src/aero_kernel/src/drivers/block/ide/registers.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use bit_field::BitField; diff --git a/src/aero_kernel/src/drivers/block/nvme/command.rs b/src/aero_kernel/src/drivers/block/nvme/command.rs index 56b25a43b23..ba53854ae76 100644 --- a/src/aero_kernel/src/drivers/block/nvme/command.rs +++ b/src/aero_kernel/src/drivers/block/nvme/command.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . #[repr(u8)] #[derive(Default, Copy, Clone)] diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 662b4d7e78a..240f29f39d2 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . mod command; mod queue; diff --git a/src/aero_kernel/src/drivers/block/nvme/queue.rs b/src/aero_kernel/src/drivers/block/nvme/queue.rs index 9e2b3e47976..c51de1e915c 100644 --- a/src/aero_kernel/src/drivers/block/nvme/queue.rs +++ b/src/aero_kernel/src/drivers/block/nvme/queue.rs @@ -20,13 +20,15 @@ pub trait QueueType { } impl QueueType for Completion { - const DOORBELL_OFFSET: usize = 1; type Type = CompletionEntry; + + const DOORBELL_OFFSET: usize = 1; } impl QueueType for Submission { - const DOORBELL_OFFSET: usize = 0; type Type = Command; + + const DOORBELL_OFFSET: usize = 0; } #[repr(C)] diff --git a/src/aero_kernel/src/drivers/drm/mod.rs b/src/aero_kernel/src/drivers/drm/mod.rs index 18ba1bebf3f..62b5497821b 100644 --- a/src/aero_kernel/src/drivers/drm/mod.rs +++ b/src/aero_kernel/src/drivers/drm/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . mod rawfb; @@ -27,9 +25,8 @@ use bit_field::BitField; use hashbrown::HashMap; use crate::fs; -use crate::fs::devfs; use crate::fs::inode::INodeInterface; -use crate::fs::FileSystemError; +use crate::fs::{devfs, FileSystemError}; use crate::mem::paging::*; use crate::utils::sync::Mutex; diff --git a/src/aero_kernel/src/drivers/drm/rawfb.rs b/src/aero_kernel/src/drivers/drm/rawfb.rs index 013f9c7ce0f..d1dbe98ec34 100644 --- a/src/aero_kernel/src/drivers/drm/rawfb.rs +++ b/src/aero_kernel/src/drivers/drm/rawfb.rs @@ -1,26 +1,23 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::sync::Arc; -use crate::fs::devfs; -use crate::fs::FileSystem; +use crate::fs::{devfs, FileSystem}; use crate::mem::paging::*; diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index d73ca88ceaf..a1b4a62a46d 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::sync::Arc; use spin::Once; @@ -27,8 +25,7 @@ use crate::mem::paging::*; use crate::userland::scheduler; use crate::utils::sync::{Mutex, WaitQueue}; -use crate::net::{self, ethernet, NetworkDevice}; -use crate::net::{MacAddr, NetworkDriver, PacketBaseTrait}; +use crate::net::{self, ethernet, MacAddr, NetworkDevice, NetworkDriver, PacketBaseTrait}; const TX_DESC_NUM: u32 = 32; const TX_DESC_SIZE: u32 = TX_DESC_NUM * core::mem::size_of::() as u32; diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index ec4ccc0d840..316e1fb4be9 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; diff --git a/src/aero_kernel/src/drivers/lai.rs b/src/aero_kernel/src/drivers/lai.rs index ad7b0839b52..02542e86b18 100644 --- a/src/aero_kernel/src/drivers/lai.rs +++ b/src/aero_kernel/src/drivers/lai.rs @@ -1,27 +1,23 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::sync::Arc; -use crate::acpi::aml; -use crate::acpi::fadt; -use crate::acpi::get_acpi_table; +use crate::acpi::{aml, fadt, get_acpi_table}; use crate::mem::paging::PhysAddr; diff --git a/src/aero_kernel/src/drivers/mod.rs b/src/aero_kernel/src/drivers/mod.rs index ba761134561..de2dff01226 100644 --- a/src/aero_kernel/src/drivers/mod.rs +++ b/src/aero_kernel/src/drivers/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . #[cfg(target_arch = "x86_64")] pub mod block; diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs index 06ab42f1191..a02c27d575c 100644 --- a/src/aero_kernel/src/drivers/mouse.rs +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2022 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::sync::Arc; use alloc::vec::Vec; diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index bd7f72f18d1..db84fac5e02 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::alloc::Global; use alloc::sync::Arc; @@ -234,15 +232,11 @@ pub enum Bar { pub enum DeviceType { Unknown, - /* - * Base Class 0x00 - Devices that predate Class Codes - */ + // Base Class 0x00 - Devices that predate Class Codes LegacyVgaCompatible, LegacyNotVgaCompatible, - /* - * Base Class 0x01 - Mass Storage Controllers - */ + // Base Class 0x01 - Mass Storage Controllers ScsiBusController, IdeController, FloppyController, @@ -254,9 +248,7 @@ pub enum DeviceType { NvmeController, OtherMassStorageController, - /* - * Base Class 0x02 - Network Controllers - */ + // Base Class 0x02 - Network Controllers EthernetController, TokenRingController, FddiController, @@ -265,32 +257,24 @@ pub enum DeviceType { PicmgController, OtherNetworkController, - /* - * Base Class 0x03 - Display Controllers - */ + // Base Class 0x03 - Display Controllers VgaCompatibleController, XgaController, ThreeDController, OtherDisplayController, - /* - * Base Class 0x04 - Multimedia Devices - */ + // Base Class 0x04 - Multimedia Devices VideoDevice, AudioDevice, TelephonyDevice, OtherMultimediaDevice, - /* - * Base Class 0x05 - Memory Controllers - */ + // Base Class 0x05 - Memory Controllers RamController, FlashController, OtherMemoryController, - /* - * Base Class 0x06 - Bridge Devices - */ + // Base Class 0x06 - Bridge Devices HostBridge, IsaBridge, EisaBridge, @@ -304,9 +288,7 @@ pub enum DeviceType { InfinibandPciHostBridge, OtherBridgeDevice, - /* - * Base Class 0x07 - Simple Communications Controllers - */ + // Base Class 0x07 - Simple Communications Controllers SerialController, ParallelPort, MultiportSerialController, @@ -315,9 +297,7 @@ pub enum DeviceType { SmartCard, OtherCommunicationsDevice, - /* - * Base Class 0x08 - Generic System Peripherals - */ + // Base Class 0x08 - Generic System Peripherals InterruptController, DmaController, SystemTimer, @@ -326,9 +306,7 @@ pub enum DeviceType { SdHostController, OtherSystemPeripheral, - /* - * Base Class 0x09 - Input Devices - */ + // Base Class 0x09 - Input Devices KeyboardController, Digitizer, MouseController, @@ -336,15 +314,11 @@ pub enum DeviceType { GameportController, OtherInputController, - /* - * Base Class 0x0a - Docking Stations - */ + // Base Class 0x0a - Docking Stations GenericDockingStation, OtherDockingStation, - /* - * Base Class 0x0b - Processors - */ + // Base Class 0x0b - Processors Processor386, Processor486, ProcessorPentium, @@ -353,9 +327,7 @@ pub enum DeviceType { ProcessorMips, CoProcessor, - /* - * Base Class 0x0c - Serial Bus Controllers - */ + // Base Class 0x0c - Serial Bus Controllers FirewireController, AccessBusController, SsaBusController, @@ -367,9 +339,7 @@ pub enum DeviceType { SercosController, CanBusController, - /* - * Base Class 0x0d - Wireless Controllers - */ + // Base Class 0x0d - Wireless Controllers IrdaController, ConsumerIrController, RfController, @@ -379,29 +349,21 @@ pub enum DeviceType { Ethernet24GHzController, OtherWirelessController, - /* - * Base Class 0x0e - Intelligent IO Controllers - */ + // Base Class 0x0e - Intelligent IO Controllers IntelligentIoController, - /* - * Base Class 0x0f - Satellite Communications Controllers - */ + // Base Class 0x0f - Satellite Communications Controllers TvSatelliteCommunicationsController, AudioSatelliteCommunicationsController, VoiceSatelliteCommunicationsController, DataSatelliteCommunicationsController, - /* - * Base Class 0x10 - Encryption and Decryption Controllers - */ + // Base Class 0x10 - Encryption and Decryption Controllers NetworkCryptionController, EntertainmentCryptionController, OtherCryptionController, - /* - * Base Class 0x11 - Data Acquisition and Signal Processing Controllers - */ + // Base Class 0x11 - Data Acquisition and Signal Processing Controllers DpioModule, PerformanceCounter, CommunicationsSynchronizationController, @@ -838,11 +800,9 @@ pub fn init(offset_table: &mut OffsetPageTable) { let _entry_count = mcfg_table.entry_count(); } - /* - * Use the brute force method to go through each possible bus, - * device, function ID and check if we have a driver for it. If a driver - * for the PCI device is found then initialize it. - */ + // Use the brute force method to go through each possible bus, + // device, function ID and check if we have a driver for it. If a driver + // for the PCI device is found then initialize it. for bus in 0..255 { for device in 0..32 { let function_count = if PciHeader::new(bus, device, 0x00).has_multiple_functions() { diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index e7c258838ae..3d09ea0382e 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -1,55 +1,42 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::sync::atomic::{AtomicU32, Ordering}; -use aero_syscall::Termios; -use aero_syscall::WinSize; +use aero_syscall::{Termios, WinSize}; use alloc::collections::BTreeMap; use alloc::string::ToString; -use alloc::sync::Arc; -use alloc::sync::Weak; +use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use spin::{Once, RwLock}; use uapi::pty::*; -use crate::fs::cache; use crate::fs::cache::*; -use crate::fs::devfs; use crate::fs::devfs::DEV_FILESYSTEM; -use crate::fs::inode::FileType; -use crate::fs::inode::PollFlags; -use crate::fs::inode::{DirEntry, INodeInterface}; -use crate::fs::FileSystem; -use crate::fs::Path; -use crate::fs::MOUNT_MANAGER; -use crate::fs::{self, FileSystemError}; +use crate::fs::inode::{DirEntry, FileType, INodeInterface, PollFlags}; +use crate::fs::{self, cache, devfs, FileSystem, FileSystemError, Path, MOUNT_MANAGER}; use crate::mem::paging::VirtAddr; use crate::userland::scheduler; use crate::userland::scheduler::ExitStatus; use crate::userland::task::Task; -use crate::userland::terminal::LineDiscipline; -use crate::userland::terminal::TerminalDevice; -use crate::utils::sync::Mutex; -use crate::utils::sync::WaitQueue; +use crate::userland::terminal::{LineDiscipline, TerminalDevice}; +use crate::utils::sync::{Mutex, WaitQueue}; lazy_static::lazy_static! { static ref PTMX: Arc = Arc::new(Ptmx::new()); diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 1a40c89a947..7772a1055d6 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -1,31 +1,28 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::sync::atomic::{AtomicUsize, Ordering}; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; -use crate::fs; use crate::fs::devfs; use crate::fs::inode::{self, PollFlags, PollTable}; -use crate::rendy; +use crate::{fs, rendy}; use crate::fs::inode::INodeInterface; use crate::mem::paging::VirtAddr; @@ -377,11 +374,11 @@ impl devfs::Device for Tty { impl TerminalDevice for Tty { fn attach(&self, _task: Arc) { - /* FIXME: We should handle foreground groups in TTY aswell */ + // FIXME: We should handle foreground groups in TTY aswell } fn detach(&self, _task: Arc) { - /* FIXME: TTY handle */ + // FIXME: TTY handle } } diff --git a/src/aero_kernel/src/drivers/uart_16550.rs b/src/aero_kernel/src/drivers/uart_16550.rs index 3190fd3ae45..8954d361389 100644 --- a/src/aero_kernel/src/drivers/uart_16550.rs +++ b/src/aero_kernel/src/drivers/uart_16550.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::fmt; use core::fmt::Write; diff --git a/src/aero_kernel/src/drivers/uart_pl011.rs b/src/aero_kernel/src/drivers/uart_pl011.rs index 1838a5b4402..e5604826bd6 100644 --- a/src/aero_kernel/src/drivers/uart_pl011.rs +++ b/src/aero_kernel/src/drivers/uart_pl011.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . // REFERENCE: PrimeCell UART (PL011) Technical Reference Manual diff --git a/src/aero_kernel/src/fs/block/gpt.rs b/src/aero_kernel/src/fs/block/gpt.rs index 2d0cf5b16fb..796f4ef574a 100644 --- a/src/aero_kernel/src/fs/block/gpt.rs +++ b/src/aero_kernel/src/fs/block/gpt.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use crate::fs::block::BlockDeviceInterface; diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index a475f1b66ae..0eddf83d23a 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . mod gpt; diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index a1956910586..29a1d8a705b 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! General implementation for file system caching. Stuff like inode needs to be cached //! to improve performance and in this case looking up inode data from an IO device such @@ -30,11 +28,9 @@ use core::fmt::Debug; use core::hash::Hash; use core::num::NonZeroUsize; use core::ops; -use core::sync::atomic::AtomicBool; -use core::sync::atomic::Ordering; +use core::sync::atomic::{AtomicBool, Ordering}; -use alloc::sync::Arc; -use alloc::sync::Weak; +use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use spin::Once; diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index e385ab6ab09..32503e6a31a 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! The `/dev` directory contains the special device files for all the devices. @@ -27,8 +25,7 @@ use alloc::sync::Arc; use spin::{Once, RwLock}; -use crate::fs::lookup_path; -use crate::fs::Path; +use crate::fs::{lookup_path, Path}; use crate::logger; use crate::mem::paging::*; use crate::rendy::RendyInfo; @@ -36,10 +33,10 @@ use crate::rendy::RendyInfo; use super::cache::{DirCacheItem, INodeCacheItem}; use super::inode::{INodeInterface, PollFlags, PollTable}; use super::ramfs::RamFs; -use super::FileSystemError; -use super::{FileSystem, Result, MOUNT_MANAGER}; +use super::{FileSystem, FileSystemError, Result, MOUNT_MANAGER}; -use aero_syscall::{prelude::*, MMapFlags}; +use aero_syscall::prelude::*; +use aero_syscall::MMapFlags; lazy_static::lazy_static! { pub static ref DEV_FILESYSTEM: Arc = DevFs::new(); diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index 24a1209c68b..34859dcb155 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use aero_syscall::prelude::{EPollEvent, EPollEventFlags}; use aero_syscall::SyscallError; diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index 7788231ce45..3ff8fe9b0a1 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::sync::Arc; diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index 0d8482490b5..2f55f8eca96 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use bit_field::BitField; diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index bf42100896d..8e897cfde7e 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::mem::MaybeUninit; diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 91b26f3a480..e1aa480dbd1 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . mod disk; mod group_desc; diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index f67e7b55c3c..df2a32fbd19 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::sync::atomic::{AtomicUsize, Ordering}; diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index fd8c0a037a5..1f8fab2c0bb 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::sync::atomic::{AtomicUsize, Ordering}; @@ -23,8 +21,7 @@ use aero_syscall::prelude::{EPollEventFlags, PollEventFlags}; use aero_syscall::socket::{MessageFlags, MessageHeader}; use aero_syscall::{MMapFlags, OpenFlags, SyscallError}; -use alloc::sync::Arc; -use alloc::sync::Weak; +use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use intrusive_collections::UnsafeRef; @@ -34,16 +31,12 @@ use crate::mem::paging::{PhysFrame, VirtAddr}; use crate::socket::unix::UnixSocket; use crate::socket::SocketAddr; use crate::userland::scheduler; -use crate::utils::sync::WaitQueue; -use crate::utils::sync::{BMutex, Mutex}; +use crate::utils::sync::{BMutex, Mutex, WaitQueue}; -use super::cache; -use super::cache::Cacheable; -use super::cache::CachedINode; -use super::cache::{DirCacheItem, INodeCacheItem}; +use super::cache::{Cacheable, CachedINode, DirCacheItem, INodeCacheItem}; use super::devfs::DevINode; use super::file_table::FileHandle; -use super::{FileSystem, FileSystemError, Result}; +use super::{cache, FileSystem, FileSystemError, Result}; static DIR_CACHE_MARKER: AtomicUsize = AtomicUsize::new(0x00); @@ -358,7 +351,7 @@ impl From for aero_syscall::SysFileType { match file { FileType::File => aero_syscall::SysFileType::File, FileType::Directory => aero_syscall::SysFileType::Directory, - FileType::Device => aero_syscall::SysFileType::CharDevice, /* FIXME: determine if it */ + FileType::Device => aero_syscall::SysFileType::CharDevice, // FIXME: determine if it // is a character or // block device. FileType::Socket => aero_syscall::SysFileType::Socket, @@ -393,13 +386,11 @@ impl DirEntry { pub fn new(parent: DirCacheItem, inode: INodeCacheItem, name: String) -> DirCacheItem { let dcache = cache::dcache(); - /* - * Helper bool to avoid situations where the directory entry is already cached. The - * possible cases are: - * - * "." (ie. we do not want to re-cache the current directory) - * ".." (ie. we do not want to re-cache the current directory's, parent directory). - */ + // Helper bool to avoid situations where the directory entry is already cached. The + // possible cases are: + // + // "." (ie. we do not want to re-cache the current directory) + // ".." (ie. we do not want to re-cache the current directory's, parent directory). let cache_me = ![".", ".."].contains(&name.as_str()); let entry = Self { diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index af00a0c8979..a546b5afda6 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::mem; @@ -27,8 +25,7 @@ use crate::userland::scheduler; use crate::utils::sync::Mutex; use spin::Once; -use self::cache::Cacheable; -use self::cache::DirCacheItem; +use self::cache::{Cacheable, DirCacheItem}; pub mod block; pub mod cache; diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index 16c4e172f17..a2dfe5cd8f6 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::sync::atomic::{AtomicUsize, Ordering}; @@ -30,11 +28,13 @@ use spin::RwLock; use crate::mem::paging::*; use crate::utils::sync::Mutex; -use super::cache::{self, CacheWeak}; -use super::cache::{CachedINode, DirCacheItem, INodeCacheItem, INodeCacheWeakItem}; +use super::cache::{ + self, CacheWeak, CachedINode, DirCacheItem, INodeCacheItem, INodeCacheWeakItem, +}; use super::devfs::DevINode; -use super::inode::{DirEntry, FileType, INodeInterface, PollFlags, PollTable}; -use super::inode::{FileContents, Metadata}; +use super::inode::{ + DirEntry, FileContents, FileType, INodeInterface, Metadata, PollFlags, PollTable, +}; use super::{FileSystem, FileSystemError, Result}; #[derive(Default)] @@ -328,7 +328,7 @@ impl INodeInterface for LockedRamINode { id: this.id, file_type: this.file_type, size: match &this.contents { - FileContents::Content(bytes) => bytes.lock().len(), /* Temporary value dropped */ + FileContents::Content(bytes) => bytes.lock().len(), // Temporary value dropped // and lock is unlocked! FileContents::StaticContent(bytes) => bytes.len(), _ => 0x00, diff --git a/src/aero_kernel/src/logger.rs b/src/aero_kernel/src/logger.rs index 1b769681d38..d20c59dff9d 100644 --- a/src/aero_kernel/src/logger.rs +++ b/src/aero_kernel/src/logger.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::fmt::Write; use core::sync::atomic::{AtomicBool, Ordering}; diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 1c444bacbdf..a55de3a0fe2 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! # Aero //! Aero is a new modern, unix based operating system. It is being developed for educational diff --git a/src/aero_kernel/src/mem/alloc.rs b/src/aero_kernel/src/mem/alloc.rs index 70c8fbb2a77..4325f6c16e1 100644 --- a/src/aero_kernel/src/mem/alloc.rs +++ b/src/aero_kernel/src/mem/alloc.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::alloc; use core::alloc::{GlobalAlloc, Layout}; diff --git a/src/aero_kernel/src/mem/mod.rs b/src/aero_kernel/src/mem/mod.rs index 7399e6a526e..7240f3e5de0 100644 --- a/src/aero_kernel/src/mem/mod.rs +++ b/src/aero_kernel/src/mem/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . pub mod alloc; pub mod paging; diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index c88752eb8df..9c3c8e3dd64 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! Physical and virtual addresses manipulation @@ -261,6 +259,7 @@ impl fmt::Pointer for VirtAddr { impl Add for VirtAddr { type Output = Self; + #[inline] fn add(self, rhs: u64) -> Self::Output { VirtAddr::new(self.0 + rhs) @@ -277,6 +276,7 @@ impl AddAssign for VirtAddr { #[cfg(target_pointer_width = "64")] impl Add for VirtAddr { type Output = Self; + #[inline] fn add(self, rhs: usize) -> Self::Output { self + rhs as u64 @@ -293,6 +293,7 @@ impl AddAssign for VirtAddr { impl Sub for VirtAddr { type Output = Self; + #[inline] fn sub(self, rhs: u64) -> Self::Output { VirtAddr::new(self.0.checked_sub(rhs).unwrap()) @@ -309,6 +310,7 @@ impl SubAssign for VirtAddr { #[cfg(target_pointer_width = "64")] impl Sub for VirtAddr { type Output = Self; + #[inline] fn sub(self, rhs: usize) -> Self::Output { self - rhs as u64 @@ -325,6 +327,7 @@ impl SubAssign for VirtAddr { impl Sub for VirtAddr { type Output = u64; + #[inline] fn sub(self, rhs: VirtAddr) -> Self::Output { self.as_u64().checked_sub(rhs.as_u64()).unwrap() @@ -478,6 +481,7 @@ impl fmt::Pointer for PhysAddr { impl Add for PhysAddr { type Output = Self; + fn add(self, rhs: u64) -> Self::Output { PhysAddr::new(self.0 + rhs) } @@ -492,6 +496,7 @@ impl AddAssign for PhysAddr { #[cfg(target_pointer_width = "64")] impl Add for PhysAddr { type Output = Self; + fn add(self, rhs: usize) -> Self::Output { self + rhs as u64 } @@ -506,6 +511,7 @@ impl AddAssign for PhysAddr { impl Sub for PhysAddr { type Output = Self; + fn sub(self, rhs: u64) -> Self::Output { PhysAddr::new(self.0.checked_sub(rhs).unwrap()) } @@ -520,6 +526,7 @@ impl SubAssign for PhysAddr { #[cfg(target_pointer_width = "64")] impl Sub for PhysAddr { type Output = Self; + #[inline] fn sub(self, rhs: usize) -> Self::Output { self - rhs as u64 @@ -535,6 +542,7 @@ impl SubAssign for PhysAddr { impl Sub for PhysAddr { type Output = u64; + fn sub(self, rhs: PhysAddr) -> Self::Output { self.as_u64().checked_sub(rhs.as_u64()).unwrap() } diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 64a6994498c..084b09b109b 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::alloc::{AllocError, Allocator, Layout}; use core::ptr::NonNull; diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index 88ecde179fe..c643d5e5a18 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . // Some code borrowed from the x86_64 crate (MIT + Apache) and add support for 5-level paging // and some kernel specific features that cannot be directly done in the crate itself. @@ -24,13 +22,10 @@ use core::ops::Range; use crate::mem::AddressSpace; -use super::{ - addr::{PhysAddr, VirtAddr}, - page::PhysFrame, - page::{AddressNotAligned, Page, PageSize, Size1GiB, Size2MiB, Size4KiB}, - page_table::{FrameError, PageTable, PageTableEntry, PageTableFlags}, - FRAME_ALLOCATOR, -}; +use super::addr::{PhysAddr, VirtAddr}; +use super::page::{AddressNotAligned, Page, PageSize, PhysFrame, Size1GiB, Size2MiB, Size4KiB}; +use super::page_table::{FrameError, PageTable, PageTableEntry, PageTableFlags}; +use super::FRAME_ALLOCATOR; /// A trait for types that can allocate a frame of memory. /// diff --git a/src/aero_kernel/src/mem/paging/mod.rs b/src/aero_kernel/src/mem/paging/mod.rs index 02e9c3c53f7..2733b5ffc88 100644 --- a/src/aero_kernel/src/mem/paging/mod.rs +++ b/src/aero_kernel/src/mem/paging/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . mod addr; mod frame; @@ -25,13 +23,11 @@ mod page_table; pub use self::addr::*; pub use self::frame::*; -pub use self::mapper::MapperFlush; -pub use self::mapper::*; +pub use self::mapper::{MapperFlush, *}; pub use self::page::*; pub use self::page_table::*; -use limine::MemmapEntry; -use limine::NonNullPtr; +use limine::{MemmapEntry, NonNullPtr}; pub use frame::LockedFrameAllocator; diff --git a/src/aero_kernel/src/mem/paging/page.rs b/src/aero_kernel/src/mem/paging/page.rs index 55f1f8bd6b0..790305cce6f 100644 --- a/src/aero_kernel/src/mem/paging/page.rs +++ b/src/aero_kernel/src/mem/paging/page.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! Abstractions for default-sized and huge virtual memory pages. @@ -148,6 +146,7 @@ impl fmt::Debug for Page { impl Add for Page { type Output = Self; + #[inline] fn add(self, rhs: u64) -> Self::Output { Page::containing_address(self.start_address() + rhs * S::SIZE) @@ -163,6 +162,7 @@ impl AddAssign for Page { impl Sub for Page { type Output = Self; + #[inline] fn sub(self, rhs: u64) -> Self::Output { Page::containing_address(self.start_address() - rhs * S::SIZE) @@ -178,6 +178,7 @@ impl SubAssign for Page { impl Sub for Page { type Output = u64; + #[inline] fn sub(self, rhs: Self) -> Self::Output { (self.start_address - rhs.start_address) / S::SIZE @@ -289,6 +290,7 @@ impl fmt::Debug for PhysFrame { impl Add for PhysFrame { type Output = Self; + #[inline] fn add(self, rhs: u64) -> Self::Output { PhysFrame::containing_address(self.start_address() + rhs * S::SIZE) @@ -304,6 +306,7 @@ impl AddAssign for PhysFrame { impl Sub for PhysFrame { type Output = Self; + #[inline] fn sub(self, rhs: u64) -> Self::Output { PhysFrame::containing_address(self.start_address() - rhs * S::SIZE) @@ -319,6 +322,7 @@ impl SubAssign for PhysFrame { impl Sub> for PhysFrame { type Output = u64; + #[inline] fn sub(self, rhs: PhysFrame) -> Self::Output { (self.start_address - rhs.start_address) / S::SIZE diff --git a/src/aero_kernel/src/mem/paging/page_table.rs b/src/aero_kernel/src/mem/paging/page_table.rs index 98651965fb7..dd50070d5bd 100644 --- a/src/aero_kernel/src/mem/paging/page_table.rs +++ b/src/aero_kernel/src/mem/paging/page_table.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! Abstractions for page tables and page table entries. diff --git a/src/aero_kernel/src/mem/pti.rs b/src/aero_kernel/src/mem/pti.rs index a863c75ec26..6292f74d41b 100644 --- a/src/aero_kernel/src/mem/pti.rs +++ b/src/aero_kernel/src/mem/pti.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! PTI (Page Table Isolation) is a feature that mitigates the Meltdown security //! vulnerability (affecting mainly Intel's x86 CPUs) and improves kernel hardening against diff --git a/src/aero_kernel/src/mem/slab.rs b/src/aero_kernel/src/mem/slab.rs index 14de4a017b1..53a5b37f83d 100644 --- a/src/aero_kernel/src/mem/slab.rs +++ b/src/aero_kernel/src/mem/slab.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::ptr::NonNull; diff --git a/src/aero_kernel/src/mem/vmalloc.rs b/src/aero_kernel/src/mem/vmalloc.rs index 8e8befe4df1..ced514b850d 100644 --- a/src/aero_kernel/src/mem/vmalloc.rs +++ b/src/aero_kernel/src/mem/vmalloc.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! Due to internal-fragmentation in the buddy frame allocator, we cannot allocate large //! amount of contiguous physical memory. We instead use [`vmalloc`] to allocate virtually diff --git a/src/aero_kernel/src/modules.rs b/src/aero_kernel/src/modules.rs index b55d9326edc..033851ed3e7 100644 --- a/src/aero_kernel/src/modules.rs +++ b/src/aero_kernel/src/modules.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! A kernel module is an object file that contains code that can extend //! the kernel functionality at runtime. When a kernel module is no longer needed, diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index 52941d4779a..7c955334855 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! Address Resolution Protocol diff --git a/src/aero_kernel/src/net/ethernet.rs b/src/aero_kernel/src/net/ethernet.rs index 180d35e37ac..07cff800912 100644 --- a/src/aero_kernel/src/net/ethernet.rs +++ b/src/aero_kernel/src/net/ethernet.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::alloc::{Allocator, Layout}; diff --git a/src/aero_kernel/src/net/ip.rs b/src/aero_kernel/src/net/ip.rs index e4493a3a4ac..0802531ca62 100644 --- a/src/aero_kernel/src/net/ip.rs +++ b/src/aero_kernel/src/net/ip.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use simple_endian::BigEndian; diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 9bd3edb252c..bb4b3dabcab 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -1,25 +1,24 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::marker::PhantomData; -use alloc::{sync::Arc, vec::Vec}; +use alloc::sync::Arc; +use alloc::vec::Vec; use spin::RwLock; pub mod arp; @@ -31,10 +30,9 @@ pub mod udp; pub use ethernet::{Eth, MacAddr}; -use crate::{ - mem::paging::VirtAddr, - userland::{scheduler, task::Task}, -}; +use crate::mem::paging::VirtAddr; +use crate::userland::scheduler; +use crate::userland::task::Task; use self::ip::Ipv4Addr; diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs index c93962fa695..6cb1894b0b9 100644 --- a/src/aero_kernel/src/net/udp.rs +++ b/src/aero_kernel/src/net/udp.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::collections::BTreeMap; use alloc::sync::Arc; diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 811daafb332..2b2d00d78e2 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -1,36 +1,31 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::fmt::Write; -use core::fmt; -use core::ops::Index; -use core::ops::IndexMut; +use core::ops::{Index, IndexMut}; use core::time::Duration; -use core::u8; +use core::{fmt, u8}; use alloc::boxed::Box; use limine::Framebuffer; use spin::Once; -use vte::ansi::NamedColor; -use vte::ansi::Timeout; +use vte::ansi::{NamedColor, Timeout}; use crate::cmdline::CommandLine; use crate::mem; diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index a5ab57ae1eb..07a89ca8f5a 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -1,27 +1,26 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . pub mod tcp; pub mod udp; pub mod unix; -use aero_syscall::{prelude::IfReq, *}; +use aero_syscall::prelude::IfReq; +use aero_syscall::*; use crate::mem::paging::VirtAddr; diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index d87ef14f289..5d97a9466d0 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use aero_syscall::prelude::{IfReq, SIOCGIFHWADDR, SIOCGIFINDEX, SIOCSIFADDR, SIOCSIFNETMASK}; use aero_syscall::socket::{MessageFlags, MessageHeader}; diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 3773068c2e5..84298c266ae 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use aero_syscall::{OpenFlags, SocketAddrUnix, SyscallError, AF_UNIX}; diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 721c31c07ce..1c6d6498fd5 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -1,25 +1,23 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ - +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +use aero_syscall::prelude::*; use aero_syscall::signal::SigProcMask; -use aero_syscall::{prelude::*, TimeSpec}; -use aero_syscall::{OpenFlags, Stat, SyscallError}; +use aero_syscall::{OpenFlags, Stat, SyscallError, TimeSpec}; use crate::fs::cache::{self, DirCacheImpl}; use crate::fs::epoll::EPoll; diff --git a/src/aero_kernel/src/syscall/futex.rs b/src/aero_kernel/src/syscall/futex.rs index 053f04d4c11..de97cfb92da 100644 --- a/src/aero_kernel/src/syscall/futex.rs +++ b/src/aero_kernel/src/syscall/futex.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::sync::atomic::{AtomicU32, Ordering}; diff --git a/src/aero_kernel/src/syscall/ipc.rs b/src/aero_kernel/src/syscall/ipc.rs index 6e678294a01..662050f9bad 100644 --- a/src/aero_kernel/src/syscall/ipc.rs +++ b/src/aero_kernel/src/syscall/ipc.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use crate::userland::scheduler::get_scheduler; use crate::userland::task::TaskId; @@ -23,7 +21,8 @@ use crate::userland::task::TaskId; use crate::utils::sync::{Mutex, WaitQueue}; use aero_syscall::SyscallError; -use alloc::{collections::VecDeque, vec::Vec}; +use alloc::collections::VecDeque; +use alloc::vec::Vec; use spin::Once; // TODO: Make this reassignable in case we want to handle the root node's death, so diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 8eb69352200..6e8f7916122 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . //! System Calls are used to call a kernel service from userland. //! diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index e33d8e55b8f..c940f320cd6 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -6,8 +6,7 @@ use aero_syscall::*; use alloc::sync::Arc; use crate::fs::cache::DirCacheItem; -use crate::fs::inode::DirEntry; -use crate::fs::inode::INodeInterface; +use crate::fs::inode::{DirEntry, INodeInterface}; use crate::mem::paging::VirtAddr; use crate::socket::tcp::TcpSocket; diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index 2e0eba14e23..8b76e1fc5c0 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use aero_syscall::signal::{SigAction, SigProcMask}; use aero_syscall::*; diff --git a/src/aero_kernel/src/syscall/time.rs b/src/aero_kernel/src/syscall/time.rs index 787e7a1013a..f48328cf11e 100644 --- a/src/aero_kernel/src/syscall/time.rs +++ b/src/aero_kernel/src/syscall/time.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use aero_syscall::time::{ITimerVal, ITIMER_REAL}; use aero_syscall::{SyscallError, TimeSpec}; diff --git a/src/aero_kernel/src/tests.rs b/src/aero_kernel/src/tests.rs index b5f84705858..f0452b4e902 100644 --- a/src/aero_kernel/src/tests.rs +++ b/src/aero_kernel/src/tests.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . #[cfg(feature = "ci")] use crate::emu; diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index b8c0f213255..ae61955f74c 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::panic::PanicInfo; @@ -28,8 +26,7 @@ use xmas_elf::ElfFile; use crate::mem::paging::{Translate, VirtAddr}; use crate::mem::AddressSpace; -use crate::logger; -use crate::rendy; +use crate::{logger, rendy}; use crate::arch::interrupts; diff --git a/src/aero_kernel/src/userland/mod.rs b/src/aero_kernel/src/userland/mod.rs index 80ef4a53329..3568d557cc4 100644 --- a/src/aero_kernel/src/userland/mod.rs +++ b/src/aero_kernel/src/userland/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use crate::fs; use crate::fs::Path; diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index 4210c261676..a58f26f860c 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . #[cfg(feature = "round-robin")] pub mod round_robin; @@ -23,8 +21,9 @@ pub mod round_robin; use alloc::sync::Arc; use crate::arch::interrupts::{self, InterruptStack}; +use crate::fs::cache::DirCacheItem; +use crate::syscall::ExecArgs; use crate::utils::sync::Mutex; -use crate::{fs::cache::DirCacheItem, syscall::ExecArgs}; use spin::Once; diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 7be4566b104..bbbdc035939 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::sync::Arc; diff --git a/src/aero_kernel/src/userland/signals.rs b/src/aero_kernel/src/userland/signals.rs index 20b10b75a27..cde84ef2030 100644 --- a/src/aero_kernel/src/userland/signals.rs +++ b/src/aero_kernel/src/userland/signals.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use aero_syscall::signal::*; diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 88f4977bb33..14c181aee55 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . pub mod sessions; diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 9f2dd803b37..edee089bdb7 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::fmt::Write; @@ -30,14 +28,11 @@ use xmas_elf::program::*; use xmas_elf::*; use crate::arch::task::userland_last_address; -use crate::fs; -use crate::fs::cache::DirCacheImpl; -use crate::fs::cache::DirCacheItem; -use crate::fs::FileSystemError; -use crate::fs::Path; -use crate::mem; +use crate::fs::cache::{DirCacheImpl, DirCacheItem}; +use crate::fs::{FileSystemError, Path}; use crate::mem::paging::*; use crate::mem::AddressSpace; +use crate::{fs, mem}; use crate::syscall::ExecArgs; use crate::utils::sync::BMutex; @@ -963,31 +958,29 @@ impl VmProtected { } #[rustfmt::skip] - /* - * The last non-bss frame of the segment consists partly of data and partly of bss - * memory, which must be zeroed. Unfortunately, the file representation might have - * reused the part of the frame that should be zeroed to store the next segment. This - * means that we can't simply overwrite that part with zeroes, as we might overwrite - * other data this way. - * - * Example: - * - * XXXXXXXXXXXXXXX000000YYYYYYY000ZZZZZZZZZZZ virtual memory (XYZ are data) - * |·············| /·····/ /·········/ - * |·············| ___/·····/ /·········/ - * |·············|/·····/‾‾‾ /·········/ - * |·············||·····|/·̅·̅·̅·̅·̅·····/‾‾‾‾ - * XXXXXXXXXXXXXXXYYYYYYYZZZZZZZZZZZ file memory (zeros are not saved) - * ' ' ' ' ' - * The areas filled with dots (`·`) indicate a mapping between virtual and file - * memory. We see that the data regions `X`, `Y`, `Z` have a valid mapping, while - * the regions that are initialized with 0 have not. - * - * The ticks (`'`) below the file memory line indicate the start of a new frame. We - * see that the last frames of the `X` and `Y` regions in the file are followed - * by the bytes of the next region. So we can't zero these parts of the frame - * because they are needed by other memory regions. - */ + // The last non-bss frame of the segment consists partly of data and partly of bss + // memory, which must be zeroed. Unfortunately, the file representation might have + // reused the part of the frame that should be zeroed to store the next segment. This + // means that we can't simply overwrite that part with zeroes, as we might overwrite + // other data this way. + // + // Example: + // + // XXXXXXXXXXXXXXX000000YYYYYYY000ZZZZZZZZZZZ virtual memory (XYZ are data) + // |·············| /·····/ /·········/ + // |·············| ___/·····/ /·········/ + // |·············|/·····/‾‾‾ /·········/ + // |·············||·····|/·̅·̅·̅·̅·̅·····/‾‾‾‾ + // XXXXXXXXXXXXXXXYYYYYYYZZZZZZZZZZZ file memory (zeros are not saved) + // ' ' ' ' ' + // The areas filled with dots (`·`) indicate a mapping between virtual and file + // memory. We see that the data regions `X`, `Y`, `Z` have a valid mapping, while + // the regions that are initialized with 0 have not. + // + // The ticks (`'`) below the file memory line indicate the start of a new frame. We + // see that the last frames of the `X` and `Y` regions in the file are followed + // by the bytes of the next region. So we can't zero these parts of the frame + // because they are needed by other memory regions. let address = self .mmap( virtual_start, diff --git a/src/aero_kernel/src/utils/buffer.rs b/src/aero_kernel/src/utils/buffer.rs index 22d3135700b..894fd42e066 100644 --- a/src/aero_kernel/src/utils/buffer.rs +++ b/src/aero_kernel/src/utils/buffer.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::fmt::Write; diff --git a/src/aero_kernel/src/utils/dma.rs b/src/aero_kernel/src/utils/dma.rs index 364724922f6..6a4b884f56a 100644 --- a/src/aero_kernel/src/utils/dma.rs +++ b/src/aero_kernel/src/utils/dma.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use alloc::boxed::Box; @@ -27,11 +25,9 @@ use crate::mem::paging::*; pub struct DmaAllocator; -/* - * XXX: The main issue with DMA buffers is when they are bigger than one page. DMA buffers - * must be made of contiguous pages in physical memory because the device transfers the - * the data using the ISA or PCI system bus (which carry physical addresses). - */ +// XXX: The main issue with DMA buffers is when they are bigger than one page. DMA buffers +// must be made of contiguous pages in physical memory because the device transfers the +// the data using the ISA or PCI system bus (which carry physical addresses). unsafe impl Allocator for DmaAllocator { fn allocate(&self, layout: Layout) -> Result, AllocError> { // XXX: The DMA buffer must be aligned to a page boundary. diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index 3d44ea6661c..e3f919e2ed4 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -1,24 +1,27 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ - -use alloc::{alloc::alloc_zeroed, sync::Arc}; -use core::{alloc::Layout, any::Any, cell::UnsafeCell, mem, ptr::Unique}; +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +use alloc::alloc::alloc_zeroed; +use alloc::sync::Arc; +use core::alloc::Layout; +use core::any::Any; +use core::cell::UnsafeCell; +use core::mem; +use core::ptr::Unique; use crate::mem::paging::{align_down, ReadErr, VirtAddr}; diff --git a/src/aero_proc/src/lib.rs b/src/aero_proc/src/lib.rs index 2319c447320..36f561b3dc8 100644 --- a/src/aero_proc/src/lib.rs +++ b/src/aero_proc/src/lib.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . #![feature(proc_macro_diagnostic, proc_macro_span)] diff --git a/src/aero_proc/src/syscall.rs b/src/aero_proc/src/syscall.rs index 7e987962bf8..80d3ba2434d 100644 --- a/src/aero_proc/src/syscall.rs +++ b/src/aero_proc/src/syscall.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use proc_macro::TokenStream; use proc_macro2::{Ident, Span}; diff --git a/src/aero_proc/src/test.rs b/src/aero_proc/src/test.rs index 11e75f2bfcd..845f35dd17b 100644 --- a/src/aero_proc/src/test.rs +++ b/src/aero_proc/src/test.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use proc_macro::TokenStream; use syn::ItemFn; diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 13dd937e3c2..f62eefc4fa7 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::ffi; diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index ce549aa186a..caef8fc8d8b 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . #![no_std] #![feature(decl_macro)] diff --git a/src/aero_syscall/src/signal.rs b/src/aero_syscall/src/signal.rs index 9071e4b8921..aa8a4ea96ef 100644 --- a/src/aero_syscall/src/signal.rs +++ b/src/aero_syscall/src/signal.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . // mlibc/abis/linux/signal.h pub const SIGABRT: usize = 6; diff --git a/src/aero_syscall/src/syscall.rs b/src/aero_syscall/src/syscall.rs index 6d80d4a73b8..36e20f8389c 100644 --- a/src/aero_syscall/src/syscall.rs +++ b/src/aero_syscall/src/syscall.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use core::arch::asm; diff --git a/src/aero_syscall/src/time.rs b/src/aero_syscall/src/time.rs index 3c5e6f851a3..818c121ca2d 100644 --- a/src/aero_syscall/src/time.rs +++ b/src/aero_syscall/src/time.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2023 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . pub const ITIMER_REAL: usize = 0; pub const ITIMER_VIRTUAL: usize = 1; diff --git a/src/uapi/src/drm.rs b/src/uapi/src/drm.rs index ca17055c8dd..a62adb9521f 100644 --- a/src/uapi/src/drm.rs +++ b/src/uapi/src/drm.rs @@ -1,29 +1,27 @@ -/* - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. - * Copyright (C) 2021-2022 The Aero Project Developers. - * - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ +// Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. +// Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. +// Copyright (C) 2021-2022 The Aero Project Developers. +// +// All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice (including the next +// paragraph) shall be included in all copies or substantial portions of the +// Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. use crate::ioctl; use core::ffi; diff --git a/src/uapi/src/ioctl.rs b/src/uapi/src/ioctl.rs index 9940b81b72b..a69c8b23da2 100644 --- a/src/uapi/src/ioctl.rs +++ b/src/uapi/src/ioctl.rs @@ -1,10 +1,8 @@ -/* - * The generic ioctl numbering scheme doesn't really enforce - * a type field. De facto, however, the top 8 bits of the lower 16 - * bits are indeed used as a type field, so we might just as well make - * this explicit here. Please be sure to use the decoding functions - * below from now on. - */ +// The generic ioctl numbering scheme doesn't really enforce +// a type field. De facto, however, the top 8 bits of the lower 16 +// bits are indeed used as a type field, so we might just as well make +// this explicit here. Please be sure to use the decoding functions +// below from now on. pub const IOC_NRBITS: usize = 8; pub const IOC_TYPEBITS: usize = 8; pub const IOC_SIZEBITS: usize = 14; @@ -25,12 +23,10 @@ pub const fn ioc(dir: usize, ty: usize, nr: usize, size: usize) -> usize { | ((size) << IOC_SIZESHIFT) } -/* - * Used to create numbers. - * - * NOTE: `iow` means userland is writing and kernel is reading. `ior` - * means userland is reading and kernel is writing. - */ +// Used to create numbers. +// +// NOTE: `iow` means userland is writing and kernel is reading. `ior` +// means userland is reading and kernel is writing. #[inline] pub const fn io(typ: usize, nr: usize) -> usize { ioc(IOC_NONE, typ, nr, 0) From d8cbf50a81f1ed86d8df70da251e9f400d2acd58 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 18 May 2023 17:40:00 +1000 Subject: [PATCH 207/368] tty: remove the ANSI parser Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/tty.rs | 383 +---------------------------- src/aero_kernel/src/rendy.rs | 100 ++------ 2 files changed, 23 insertions(+), 460 deletions(-) diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty.rs index 7772a1055d6..fa7eee19b5b 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty.rs @@ -20,8 +20,8 @@ use core::sync::atomic::{AtomicUsize, Ordering}; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; -use crate::fs::devfs; use crate::fs::inode::{self, PollFlags, PollTable}; +use crate::fs::{devfs, FileSystemError}; use crate::{fs, rendy}; use crate::fs::inode::INodeInterface; @@ -190,8 +190,6 @@ struct TtyState { lalt: bool, altgr: bool, caps: bool, - - parser: vte::Parser, } struct Tty { @@ -217,8 +215,6 @@ impl Tty { lalt: false, altgr: false, caps: false, - - parser: vte::Parser::new(), }), block_queue: WaitQueue::new(), stdin: Mutex::new(StdinBuffer::new()), @@ -281,12 +277,9 @@ impl INodeInterface for Tty { } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { - let mut state = self.state.lock_irq(); - let mut performer = AnsiEscape; + let string = core::str::from_utf8(buffer).map_err(|_| FileSystemError::NotSupported)?; - for character in buffer.iter() { - state.parser.advance(&mut performer, *character); - } + crate::rendy::print!("{}", string); log::debug!("TTY::write_at(): {}", unsafe { core::str::from_utf8_unchecked(buffer) @@ -543,376 +536,6 @@ impl KeyboardListener for Tty { } } -enum ParsedColor { - Unknown, - Foreground(u16), - Background(u16), -} - -const SGR_FOREGROUND_OFFSET_1: u16 = 30; -const SGR_BACKGROUND_OFFSET_1: u16 = 40; -const SGR_FOREGROUND_OFFSET_2: u16 = 90; -const SGR_BACKGROUND_OFFSET_2: u16 = 100; - -const ANSI_COLORS: &[u32; 8] = &[ - 0x00000000, // black - 0x00aa0000, // red - 0x0000aa00, // green - 0x00aa5500, // brown - 0x000000aa, // blue - 0x00aa00aa, // magenta - 0x0000aaaa, // cyan - 0x00aaaaaa, // grey -]; - -const ANSI_BRIGHT_COLORS: &[u32; 8] = &[ - 0x00555555, // black - 0x00ff5555, // red - 0x0055ff55, // green - 0x00ffff55, // brown - 0x005555ff, // blue - 0x00ff55ff, // magenta - 0x0055ffff, // cyan - 0x00ffffff, // grey -]; - -fn fixed_to_rgb(fixed: u16) -> u32 { - fixed as u32 -} - -struct AnsiEscape; - -impl vte::Perform for AnsiEscape { - fn print(&mut self, char: char) { - rendy::print!("{}", char); - } - - fn execute(&mut self, byte: u8) { - let char = byte as char; - - match char { - '\n' | '\t' => rendy::print!("{}", char), - - '\r' => { - let (_, y) = rendy::get_cursor_position(); - rendy::set_cursor_position(0, y) - } - - '\u{8}' => { - rendy::backspace(); - } - - _ => {} - } - } - - fn csi_dispatch( - &mut self, - params: &vte::Params, - _intermediates: &[u8], - ignore: bool, - action: char, - ) { - if ignore { - return; - } - - match action { - // Moves the cursor to row `n`, column `m`. The values are - // 1-based, and default to 1 (top left corner) if omitted. - 'H' | 'f' => { - let mut iter = params.iter(); - - let x = iter.next().unwrap_or(&[1])[0] as usize; - let y = iter.next().unwrap_or(&[1])[0] as usize; - - let mut x = if x != 0 { x - 1 } else { x }; - let mut y = if y != 0 { y - 1 } else { y }; - - let (rows, cols) = rendy::get_term_info(); - - // Make sure the provided coordinates are valid. - if x >= cols { - x = cols - 1; - } - - if y >= rows { - y = rows - 1; - } - - // Move the cursor to the position. - rendy::set_cursor_position(x, y); - } - - 'l' | 'h' => match params.iter().next() { - Some([25]) => { - // Disable the cursor if action == 'l` and enable it if action - // == 'h'. - rendy::set_cursor_visibility(action == 'h') - } - - _ => unimplemented!(), - }, - - // Clears parts of the screen. - 'J' => { - // If `n` is missing, it defaults to 0. - let n = params.iter().next().unwrap_or(&[0])[0] as usize; - - match n { - // If `n` is 0 (or missing), clear from cursor to end of screen. - 0 => { - let (x, y) = rendy::get_cursor_position(); - let (term_rows, term_cols) = rendy::get_rows_cols(); - - let rows_remaining = term_rows - (y + 1); - let cols_diff = term_cols - (x + 1); - let to_clear = rows_remaining * term_cols + cols_diff; - - rendy::set_auto_flush(false); - - for _ in 0..to_clear { - rendy::print!(" "); - } - - rendy::set_cursor_position(x, y); - rendy::double_buffer_flush(); - rendy::set_auto_flush(true); - } - - 1 => unimplemented!(), - - // If `n` is 2 or 3, clear the entire screen. - // - // TODO(Andy-Python-Programmer): When we support scrollback buffer, if `n` is - // 3, clear the entire scrollback buffer as well. - 2 | 3 => rendy::clear_screen(false), - - // Unknown value, do nothing. - _ => unimplemented!(), - } - } - - 'C' => { - // If `n` is missing, it defaults to 1. - let mut n = params.iter().next().unwrap_or(&[1])[0] as usize; - - let (x, y) = rendy::get_cursor_position(); - let (_, term_cols) = rendy::get_rows_cols(); - - if x + n > term_cols - 1 { - n = (term_cols - 1) - x; - } - - if n == 0 { - n = 1; - } - - rendy::set_cursor_position(x + n, y); - } - - 'K' => { - // If `n` is missing, it defaults to 0. - let n = params.iter().next().unwrap_or(&[0])[0] as usize; - - // NOTE: The cursor position does not change. - match n { - // If `n` is 0 (or missing), clear from cursor to the end of the line. - 0 => { - let (x, y) = rendy::get_cursor_position(); - let (_, term_cols) = rendy::get_rows_cols(); - - for _ in x..term_cols { - rendy::print!(" "); - } - - rendy::set_cursor_position(x, y); - } - - // If `n` is 1, clear from cursor to beginning of the line. - 1 => { - let (x, y) = rendy::get_cursor_position(); - - rendy::set_cursor_position(0, y); - - for _ in 0..x { - rendy::print!(" ") - } - } - - // If `n` is 2, clear entire line. - 2 => { - let (_, term_cols) = rendy::get_rows_cols(); - let (x, y) = rendy::get_cursor_position(); - - rendy::set_cursor_position(0, y); - - for _ in 0..term_cols { - rendy::print!(" ") - } - - rendy::set_cursor_position(x, y); - } - - _ => unimplemented!(), - } - } - - 'D' => { - // If `n` is missing, it defaults to 1. - let mut n = params.iter().next().unwrap_or(&[1])[0] as usize; - - let (x, y) = rendy::get_cursor_position(); - - // If the cursor is already at the edge of the screen, this has no effect. - if n > x { - n = x; - } - - if n == 0 { - n = 1; - } - - rendy::set_cursor_position(x - n, y); - } - - // Sets colors and style of the characters following this code. - 'm' => { - let mut piter = params.iter(); - let mut bright = false; - - while let Some(param) = piter.next() { - if !param.is_empty() { - let p1 = param[0]; - - match p1 { - // Reset or normal. All attributes off. - 0 => { - bright = false; - // TODO: Turn off dim. - - rendy::reset_default(); - } - - // Bold or increased intensity: - 1 => { - bright = true; - // TODO: Turn off dim. - } - - // Faint, decreased intensity, or dim. - 2 => { - // TODO: Turn on dim. - bright = false; - } - - code => { - let parsed_color = if code >= 30 && code <= 37 { - ParsedColor::Foreground(code - SGR_FOREGROUND_OFFSET_1) - } else if code >= 40 && code <= 47 { - ParsedColor::Background(code - SGR_BACKGROUND_OFFSET_1) - } else if code >= 90 && code <= 97 { - ParsedColor::Foreground(code - SGR_FOREGROUND_OFFSET_2) - } else if code >= 100 && code <= 107 { - ParsedColor::Background(code - SGR_BACKGROUND_OFFSET_2) - } else { - ParsedColor::Unknown - }; - - match parsed_color { - ParsedColor::Foreground(color) => { - let ccode = if bright { - ANSI_BRIGHT_COLORS[color as usize] - } else { - ANSI_COLORS[color as usize] - }; - - rendy::set_text_fg(ccode); - } - - ParsedColor::Background(color) => { - let ccode = if bright { - ANSI_BRIGHT_COLORS[color as usize] - } else { - ANSI_COLORS[color as usize] - }; - - rendy::set_text_bg(ccode); - } - - ParsedColor::Unknown => { - let parse_rgb = - |setter: fn(u32), piter: &mut vte::ParamsIter| { - let r = piter.next().unwrap_or(&[0])[0]; - let g = piter.next().unwrap_or(&[0])[0]; - let b = piter.next().unwrap_or(&[0])[0]; - - let color = - (r as u32) << 16 | (g as u32) << 8 | b as u32; - - setter(color); - }; - - let parse_fixed = - |setter: fn(u32), piter: &mut vte::ParamsIter| { - let fixed = piter.next().unwrap_or(&[0])[0]; - let color = fixed_to_rgb(fixed); - - setter(color); - }; - - let run_special_parser = - |setter: fn(u32), piter: &mut vte::ParamsIter| { - if let Some(arg_typee) = piter.next() { - let p1 = arg_typee[0]; - - match p1 { - // A colour number from 0 to 255, for use in - // 256-colour terminal - // environments. - // - // - Colours 0 to 7 are the `Black` to - // `White` variants respectively. - // - Colours 8 to 15 are brighter versions - // of the eight colours above. - // - Colours 16 to 231 contain several - // palettes of bright colours, - // - Colours 232 to 255 are shades of grey - // from black to white. - // - // [cc]: https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg - 5 => parse_fixed(setter, piter), - - // A 24-bit RGB color, as specified by - // ISO-8613-3. - 2 => parse_rgb(setter, piter), - - _ => (), - } - } - }; - - // Background - if code == 48 { - run_special_parser(rendy::set_text_bg, &mut piter); - } - // Foreground - else if code == 38 { - run_special_parser(rendy::set_text_fg, &mut piter); - } - } - } - } - } - } - } - } - - _ => log::debug!("unknown action: {}", action), - } - } -} - fn init_tty() { devfs::install_device(TTY.clone()).expect("failed to register tty as a device"); } diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 2b2d00d78e2..40b1a8079b3 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -25,7 +25,7 @@ use alloc::boxed::Box; use limine::Framebuffer; use spin::Once; -use vte::ansi::{NamedColor, Timeout}; +use vte::ansi::{Handler, NamedColor, Timeout}; use crate::cmdline::CommandLine; use crate::mem; @@ -514,10 +514,6 @@ impl<'a> Inner<'a> { } } - fn set_auto_flush(&mut self, yes: bool) { - self.auto_flush = yes; - } - fn draw_cursor(&mut self) { let i = self.x_pos + self.y_pos * self.cols; let mut char; @@ -708,24 +704,6 @@ impl<'a> Inner<'a> { } } - fn backspace(&mut self) { - let empty = Character { - char: ' ', - fg: self.color.get_foreground(), - bg: self.color.get_background(), - }; - - if self.x_pos == 0 { - self.y_pos -= 1; - self.x_pos = self.cols - 1; - } else { - self.x_pos -= 1; - } - - self.push_to_queue(&empty, self.x_pos, self.y_pos); - self.double_buffer_flush(); - } - fn set_cursor_position(&mut self, x: usize, y: usize) { assert!(x <= self.cols && y <= self.rows); @@ -842,10 +820,29 @@ impl<'a> vte::ansi::Handler for Inner<'a> { } } + #[inline] fn linefeed(&mut self) { self.input('\n'); } + fn backspace(&mut self) { + let empty = Character { + char: ' ', + fg: self.color.get_foreground(), + bg: self.color.get_background(), + }; + + if self.x_pos == 0 { + self.y_pos -= 1; + self.x_pos = self.cols - 1; + } else { + self.x_pos -= 1; + } + + self.push_to_queue(&empty, self.x_pos, self.y_pos); + self.double_buffer_flush(); + } + fn terminal_attribute(&mut self, attr: Attr) { match attr { Attr::Reset => { @@ -944,25 +941,6 @@ pub fn backspace() { DEBUG_RENDY.get().map(|l| l.lock_irq().backspace()); } -pub fn set_text_color(fg: u32, bg: u32) { - DEBUG_RENDY - .get() - .map(|l| l.lock_irq().color = ColorCode::new(fg, bg)); -} - -pub fn set_text_fg(fg: u32) { - DEBUG_RENDY.get().map(|l| l.lock_irq().color.0 = fg); -} - -pub fn set_text_bg(bg: u32) { - DEBUG_RENDY.get().map(|l| l.lock_irq().color.1 = bg); -} - -/// Resets the text foreground and background to their default values. -pub fn reset_default() { - set_text_color(DEFAULT_TEXT_FOREGROUND, DEFAULT_TEXT_BACKGROUND) -} - /// Returns the terminal's resolution in the form of a `(horizontal_resolution, /// vertical_resolution)` tuple. /// @@ -1030,44 +1008,6 @@ pub fn set_cursor_position(x: usize, y: usize) { .map(|l| l.lock_irq().set_cursor_position(x, y)); } -pub fn set_cursor_visibility(yes: bool) { - DEBUG_RENDY - .get() - .map(|l| l.lock_irq().cursor_visibility = yes); -} - -/// Returns a tuple of the amount of `(rows, columns)` in the terminal. -/// -/// ## Panics -/// This function was called before the terminal was initialized. -pub fn get_term_info() -> (usize, usize) { - DEBUG_RENDY - .get() - .map(|l| { - let lock = l.lock_irq(); - (lock.rows, lock.cols) - }) - .expect("get_term_info: invoked before the terminal was initialized") -} - -/// ## Panics -/// This function was called before the terminal was initialized. -pub fn set_auto_flush(yes: bool) { - DEBUG_RENDY - .get() - .map(|e| e.lock_irq().set_auto_flush(yes)) - .expect("set_auto_flush: invoked before the terminal was initialized"); -} - -/// ## Panics -/// This function was called before the terminal was initialized. -pub fn double_buffer_flush() { - DEBUG_RENDY - .get() - .map(|e| e.lock_irq().double_buffer_flush()) - .expect("double_buffer_flush: invoked before the terminal was initialized"); -} - /// Force-unlocks the rendy to prevent a deadlock. /// /// ## Safety From cd679cfd79d4b7d2e0a8688fd9324f0fd037c612 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 20 May 2023 19:08:52 +1000 Subject: [PATCH 208/368] devfs: add `/dev/ctty` which points to the controlling terminal of the current process Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/pty.rs | 26 ++-- src/aero_kernel/src/drivers/tty/ctty.rs | 118 ++++++++++++++++++ .../src/drivers/{tty.rs => tty/mod.rs} | 6 + src/aero_kernel/src/fs/mod.rs | 2 + src/aero_kernel/src/main.rs | 3 +- src/aero_kernel/src/userland/task/mod.rs | 5 + src/aero_kernel/src/userland/terminal.rs | 4 +- src/aero_syscall/src/lib.rs | 1 + 8 files changed, 154 insertions(+), 11 deletions(-) create mode 100644 src/aero_kernel/src/drivers/tty/ctty.rs rename src/aero_kernel/src/drivers/{tty.rs => tty/mod.rs} (99%) diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 3d09ea0382e..0512ba68f34 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -156,23 +156,23 @@ impl INodeInterface for Master { } } -impl TerminalDevice for Master { +impl TerminalDevice for Slave { fn attach(&self, task: Arc) { assert!(task.is_session_leader()); - self.discipline.set_foreground(task); + self.master.discipline.set_foreground(task); } fn detach(&self, task: Arc) { use aero_syscall::signal::*; use aero_syscall::*; - if !self.is_cooked() { + if !self.master.is_cooked() { return; } if let ExitStatus::Signal(signo) = task.exit_status() { - let mut buffer = self.buffer.lock_irq(); - let termios = self.termios.lock_irq(); + let mut buffer = self.master.buffer.lock_irq(); + let termios = self.master.termios.lock_irq(); // converts `X` into `^X` and pushes the result into the master PTY buffer. let mut ctrl = |c| { @@ -188,12 +188,20 @@ impl TerminalDevice for Master { } struct Slave { + sref: Weak, master: Arc, } impl Slave { - pub fn new(master: Arc) -> Self { - Self { master } + pub fn new(master: Arc) -> Arc { + Arc::new_cyclic(|sref| Self { + sref: sref.clone(), + master, + }) + } + + fn sref(&self) -> Arc { + self.sref.upgrade().unwrap() } } @@ -238,7 +246,7 @@ impl INodeInterface for Slave { let current_task = scheduler::get_scheduler().current_task(); assert!(current_task.is_session_leader()); - current_task.attach(self.master.clone()); + current_task.attach(self.sref()); Ok(0) } @@ -327,7 +335,7 @@ impl INodeInterface for Ptmx { _handle: Arc, ) -> fs::Result> { let master = Arc::new(Master::new()); - let slave = Arc::new(Slave::new(master.clone())); + let slave = Slave::new(master.clone()); let inode = DirEntry::from_inode(master, String::from("")); PTS_FS.get().unwrap().insert_slave(slave); diff --git a/src/aero_kernel/src/drivers/tty/ctty.rs b/src/aero_kernel/src/drivers/tty/ctty.rs new file mode 100644 index 00000000000..e04100a23a6 --- /dev/null +++ b/src/aero_kernel/src/drivers/tty/ctty.rs @@ -0,0 +1,118 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +//! `/dev/ctty`: Controlling terminal of the current process. + +use aero_syscall::TIOCNOTTY; +use alloc::sync::{Arc, Weak}; + +use crate::fs::devfs::Device; +use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags, PollTable}; +use crate::fs::{self, devfs, FileSystemError}; +use crate::userland::scheduler; + +struct Ctty { + device_id: usize, + sref: Weak, +} + +impl Ctty { + fn new() -> Arc { + Arc::new_cyclic(|sref| Self { + device_id: devfs::alloc_device_marker(), + sref: sref.clone(), + }) + } + + /// Returns the controlling terminal device of the current process. + fn controlling_terminal() -> fs::Result> { + let current_task = scheduler::get_scheduler().current_task(); + let terminal_device = current_task.controlling_terminal(); + + terminal_device + .map(|device| device as Arc) + .ok_or(FileSystemError::NoTty) + } + + #[inline] + fn sref(&self) -> Arc { + self.sref.upgrade().unwrap() + } +} + +impl INodeInterface for Ctty { + fn metadata(&self) -> fs::Result { + Ok(Metadata { + id: 0, + file_type: FileType::Device, + size: 0, + children_len: 0, + }) + } + + fn read_at(&self, offset: usize, buffer: &mut [u8]) -> fs::Result { + Self::controlling_terminal()?.read_at(offset, buffer) + } + + fn write_at(&self, offset: usize, buffer: &[u8]) -> fs::Result { + Self::controlling_terminal()?.write_at(offset, buffer) + } + + fn poll(&self, table: Option<&mut PollTable>) -> fs::Result { + Self::controlling_terminal()?.poll(table) + } + + /// ### Supported `ioctl(2)` requests + /// + /// In addition to the `ioctl(2)` requests supported by the device that CTTY refers to, the + /// `ioctl(2)` request `TIOCNOTTY` is supported. + fn ioctl(&self, command: usize, arg: usize) -> fs::Result { + match command { + TIOCNOTTY => { + let current_task = scheduler::get_scheduler().current_task(); + current_task.detach(); + + Ok(0) + } + + _ => Self::controlling_terminal()?.ioctl(command, arg), + } + } +} + +impl Device for Ctty { + #[inline] + fn device_marker(&self) -> usize { + self.device_id + } + + #[inline] + fn device_name(&self) -> String { + String::from("ctty") + } + + #[inline] + fn inode(&self) -> Arc { + self.sref() + } +} + +/// Registers the `/dev/ctty` character device. +pub fn init() -> fs::Result<()> { + devfs::install_device(Ctty::new())?; + Ok(()) +} diff --git a/src/aero_kernel/src/drivers/tty.rs b/src/aero_kernel/src/drivers/tty/mod.rs similarity index 99% rename from src/aero_kernel/src/drivers/tty.rs rename to src/aero_kernel/src/drivers/tty/mod.rs index fa7eee19b5b..6ca90322093 100644 --- a/src/aero_kernel/src/drivers/tty.rs +++ b/src/aero_kernel/src/drivers/tty/mod.rs @@ -15,6 +15,11 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +// `/dev/ctty`: controlling terminal of the process +// `/dev/vtty[0-9]`: virtual terminals + +mod ctty; + use core::sync::atomic::{AtomicUsize, Ordering}; use alloc::sync::{Arc, Weak}; @@ -538,6 +543,7 @@ impl KeyboardListener for Tty { fn init_tty() { devfs::install_device(TTY.clone()).expect("failed to register tty as a device"); + ctty::init().unwrap(); } crate::module_init!(init_tty, ModuleType::Other); diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index a546b5afda6..b8505e0fa69 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -131,6 +131,7 @@ pub enum FileSystemError { ConnectionRefused, NotConnected, WouldBlock, + NoTty, } impl From for SyscallError { @@ -150,6 +151,7 @@ impl From for SyscallError { FileSystemError::IsDir => Self::EISDIR, FileSystemError::NotConnected => Self::ENOTCONN, FileSystemError::WouldBlock => Self::EAGAIN, + FileSystemError::NoTty => Self::ENOTTY, } } } diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index a55de3a0fe2..1537162ee8f 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -44,7 +44,8 @@ pointer_is_aligned, const_trait_impl, int_roundings, - const_ptr_is_null + const_ptr_is_null, + trait_upcasting, // https://github.com/rust-lang/rust/issues/65991 )] #![deny(trivial_numeric_casts, unused_allocation)] #![test_runner(crate::tests::test_runner)] diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 14c181aee55..5833c42221f 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -699,6 +699,11 @@ impl Task { } } + /// Returns the controlling terminal of the task. + pub fn controlling_terminal(&self) -> Option> { + self.controlling_terminal.lock_irq().clone() + } + /// Returns whether the task is the session leader (`pid` == `sid`). pub fn is_session_leader(&self) -> bool { self.session_id() == self.pid().as_usize() diff --git a/src/aero_kernel/src/userland/terminal.rs b/src/aero_kernel/src/userland/terminal.rs index 33924062a56..18527995dc4 100644 --- a/src/aero_kernel/src/userland/terminal.rs +++ b/src/aero_kernel/src/userland/terminal.rs @@ -22,6 +22,7 @@ use alloc::vec::Vec; use spin::RwLock; +use crate::fs::inode::INodeInterface; use crate::utils::sync::{Mutex, WaitQueue}; use super::signals::SignalError; @@ -29,7 +30,8 @@ use super::task::sessions::{Group, SESSIONS}; use super::task::Task; /// Terminal Device -pub trait TerminalDevice: Send + Sync { +#[downcastable] +pub trait TerminalDevice: Send + Sync + INodeInterface { /// Called when a session leader is attached/connected to the terminal device. /// /// The processs group of `task` will be set as the active process group that is associated with diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index caef8fc8d8b..0a9aa5c3703 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -290,6 +290,7 @@ pub const TIOCSWINSZ: usize = 0x5414; pub const TCGETS: usize = 0x5401; pub const TCSETSF: usize = 0x5404; pub const TIOCSCTTY: usize = 0x540e; +pub const TIOCNOTTY: usize = 0x5422; #[derive(Default, Copy, Clone)] #[repr(C)] From 6688d75d635e0c82159431475a3709bba1a5a91e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 20 May 2023 19:20:37 +1000 Subject: [PATCH 209/368] kernel: add tracking issue comments for unstable features Signed-off-by: Anhad Singh --- src/aero_kernel/src/main.rs | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 1537162ee8f..9298a49025e 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -26,25 +26,25 @@ //! * #![feature( - custom_test_frameworks, - alloc_error_handler, - lang_items, - panic_info_message, - decl_macro, - ptr_internals, - linked_list_cursors, - extern_types, - new_uninit, - step_trait, - prelude_import, - allocator_api, - maybe_uninit_write_slice, - slice_ptr_get, - maybe_uninit_as_bytes, - pointer_is_aligned, - const_trait_impl, - int_roundings, - const_ptr_is_null, + custom_test_frameworks, // https://github.com/rust-lang/rust/issues/50297 + alloc_error_handler, // https://github.com/rust-lang/rust/issues/51540 + lang_items, // No tracking issue + panic_info_message, // https://github.com/rust-lang/rust/issues/66745 + decl_macro, // https://github.com/rust-lang/rust/issues/39412 + ptr_internals, // No tracking issue + linked_list_cursors, // https://github.com/rust-lang/rust/issues/58533 + extern_types, // https://github.com/rust-lang/rust/issues/43467 + new_uninit, // https://github.com/rust-lang/rust/issues/63291 + step_trait, // https://github.com/rust-lang/rust/issues/42168 + prelude_import, // No tracking issue + allocator_api, // https://github.com/rust-lang/rust/issues/32838 + maybe_uninit_write_slice, // https://github.com/rust-lang/rust/issues/79995 + slice_ptr_get, // https://github.com/rust-lang/rust/issues/74265 + maybe_uninit_as_bytes, // https://github.com/rust-lang/rust/issues/93092 + pointer_is_aligned, // https://github.com/rust-lang/rust/issues/96284 + const_trait_impl, // https://github.com/rust-lang/rust/issues/67792 + int_roundings, // https://github.com/rust-lang/rust/issues/88581 + const_ptr_is_null, // https://github.com/rust-lang/rust/issues/74939 trait_upcasting, // https://github.com/rust-lang/rust/issues/65991 )] #![deny(trivial_numeric_casts, unused_allocation)] From d38d9715b9a5d92e681ce7092686b66a48e1191b Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 20 May 2023 19:28:09 +1000 Subject: [PATCH 210/368] ci: remove the iso building per commit Signed-off-by: Anhad Singh --- .github/workflows/build.yml | 95 +++++++++++++------------------------ aero.py | 3 +- 2 files changed, 36 insertions(+), 62 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4191e7779ad..8b8b1f67ea2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,61 +1,34 @@ -name: Aero - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -env: - CARGO_TERM_COLOR: always - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: nightly - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y nasm meson ninja-build - python3 -m pip install requests xbstrap - sudo ./tools/deps.sh - - name: Build the kernel and userland - run: ./aero.py --no-run - - name: Build kernel documentation - run: ./aero.py --document - - name: Upload built image as artifact - uses: actions/upload-artifact@v2 - with: - name: Aero - path: ./build/aero.iso - - name: Deploy documentation - uses: peaceiris/actions-gh-pages@v3 - if: github.ref == 'refs/heads/master' && (github.event_name == 'push' || github.event_name == 'schedule') - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./build/web/ - - run_tests: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: nightly - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y nasm meson ninja-build qemu-system-x86 - python3 -m pip install requests xbstrap - - name: Print QEMU version - run: qemu-system-x86_64 --version - - name: Run tests - run: RUST_BACKTRACE=1 ./aero.py --test --features=ci --bios uefi -- -display none -device isa-debug-exit,iobase=0xf4,iosize=0x04 +name: Aero + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y nasm meson ninja-build + python3 -m pip install requests xbstrap + sudo ./tools/deps.sh + - name: Build documentation + run: ./aero.py --document + - name: Deploy documentation + uses: peaceiris/actions-gh-pages@v3 + if: github.ref == 'refs/heads/master' && (github.event_name == 'push' || github.event_name == 'schedule') + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./build/web/ diff --git a/aero.py b/aero.py index 383e4d52764..8a38a33bec4 100755 --- a/aero.py +++ b/aero.py @@ -607,7 +607,8 @@ def main(): log_error("aarch64 requires UEFI (help: run again with `--bios=uefi`)") return - download_bundled() + if not args.document: + download_bundled() if args.only_run: iso_path = os.path.join(BUILD_DIR, 'aero.iso') From 364437aa840b730a32ba43e823ec6c3bbe7f73f2 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 20 May 2023 19:45:16 +1000 Subject: [PATCH 211/368] ci: add formatting check Signed-off-by: Anhad Singh --- .github/workflows/build.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8b8b1f67ea2..213138a9534 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,9 @@ on: env: CARGO_TERM_COLOR: always + RED: '\033[1;31m' + NOCOLOR: '\033[0m' + jobs: build: runs-on: ubuntu-latest @@ -24,8 +27,12 @@ jobs: sudo apt-get install -y nasm meson ninja-build python3 -m pip install requests xbstrap sudo ./tools/deps.sh - - name: Build documentation + - name: Build Documentation run: ./aero.py --document + - name: Formatting Check + run: | + ./aero.py --fmt + git diff-index --quiet HEAD -- || (printf "${RED}error${NOCOLOR}: formatting check failed, run \`./aero.py --fmt\`\n" && exit 1) - name: Deploy documentation uses: peaceiris/actions-gh-pages@v3 if: github.ref == 'refs/heads/master' && (github.event_name == 'push' || github.event_name == 'schedule') From ad77bef54fa780ad6a929661434f7fb915be5166 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 20 May 2023 19:46:06 +1000 Subject: [PATCH 212/368] ci: cut down the dependencies Signed-off-by: Anhad Singh --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 213138a9534..b707ee4045b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,9 +24,8 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y nasm meson ninja-build + sudo apt-get install -y nasm python3 -m pip install requests xbstrap - sudo ./tools/deps.sh - name: Build Documentation run: ./aero.py --document - name: Formatting Check From d15765fae911f8a46e52d20774f539fbd36f9029 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 20 May 2023 20:07:27 +1000 Subject: [PATCH 213/368] ci: weekly builds Signed-off-by: Anhad Singh --- .github/workflows/weekly.yml | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/weekly.yml diff --git a/.github/workflows/weekly.yml b/.github/workflows/weekly.yml new file mode 100644 index 00000000000..32cfe892b2a --- /dev/null +++ b/.github/workflows/weekly.yml @@ -0,0 +1,49 @@ +name: Weekly Aero Build + +on: + schedule: + - cron: '0 0 * * *' + +jobs: + aero-build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Unshallow repo tags + run: git fetch --prune --unshallow --tags + + - name: Check if build is necessary + run: test "$(git tag --points-at HEAD)" = "" + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y nasm meson ninja-build + python3 -m pip install requests xbstrap + sudo ./tools/deps.sh + + - name: Build Sysroot + run: | + mkdir build + + pushd build + [ -f bootstrap.link ] || xbstrap init .. + xbstrap install bash coreutils dwm alacritty + popd + + - name: Build Kernel + run: ./aero.py --no-run + + - name: Create weekly release + uses: softprops/action-gh-release@v1 + with: + name: Weekly Build ${{ env.TAG_DATE }} + tag_name: nightly-${{ env.TAG_DATE }} + body: Image of an up to date Aero weekly build :^) + files: | + build/aero.iso + build/disk.img + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From c4b03a15290711c4809c065f3fa077f510d9a627 Mon Sep 17 00:00:00 2001 From: Anhad Singh <62820092+Andy-Python-Programmer@users.noreply.github.com> Date: Sun, 21 May 2023 11:02:36 +1000 Subject: [PATCH 214/368] Update weekly.yml --- .github/workflows/weekly.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/weekly.yml b/.github/workflows/weekly.yml index 32cfe892b2a..41204a8cd60 100644 --- a/.github/workflows/weekly.yml +++ b/.github/workflows/weekly.yml @@ -3,6 +3,7 @@ name: Weekly Aero Build on: schedule: - cron: '0 0 * * *' + workflow_dispatch: jobs: aero-build: From 99ea8b403cb41f487d48ab67c99bf185e98d6a26 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 21 May 2023 11:51:23 +1000 Subject: [PATCH 215/368] deps::ubuntu: add `autopoint` In Ubuntu 12.04 LTS and later it is no longer part of the monolithic `gettext` package. Signed-off-by: Anhad Singh --- tools/deps/deps_linux | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/deps/deps_linux b/tools/deps/deps_linux index 1241dc87ce5..90a624f5912 100755 --- a/tools/deps/deps_linux +++ b/tools/deps/deps_linux @@ -26,6 +26,7 @@ packages=( "texinfo" "groff" "gettext" + "autopoint" "expat" "bison" "flex" From 6e78524c2cbdbd236872f24449fd443f5f334c9b Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 21 May 2023 12:59:05 +1000 Subject: [PATCH 216/368] patches::rust-libc: fix The patch was broken because the xbstrap files were committed accidently. Signed-off-by: Anhad Singh --- patches/rust-libc/rust-libc.patch | 39 +++++++++++++------------------ 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/patches/rust-libc/rust-libc.patch b/patches/rust-libc/rust-libc.patch index deeaee0c247..04bc44bb09e 100644 --- a/patches/rust-libc/rust-libc.patch +++ b/patches/rust-libc/rust-libc.patch @@ -1,30 +1,15 @@ -From 56759ca28e1aa33227e0085bcafd535ebbfdcf4c Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Mon, 10 Apr 2023 14:02:17 +1000 +From a23324fdc96748fc48b5deb824db43b693b6c5dc Mon Sep 17 00:00:00 2001 +From: Anhad Singh +Date: Sun, 21 May 2023 12:58:08 +1000 Subject: [PATCH] --- - checkedout.xbstrap | 0 - fetched.xbstrap | 0 - patched.xbstrap | 0 .../linux_like/linux/gnu/b64/x86_64/mod.rs | 4 +- src/unix/linux_like/linux/gnu/mod.rs | 4 +- src/unix/linux_like/linux/mod.rs | 28 +- - src/unix/mlibc/mod.rs | 561 ++++++++++++++++-- - 7 files changed, 543 insertions(+), 54 deletions(-) - create mode 100644 checkedout.xbstrap - create mode 100644 fetched.xbstrap - create mode 100644 patched.xbstrap + src/unix/mlibc/mod.rs | 568 ++++++++++++++++-- + 4 files changed, 550 insertions(+), 54 deletions(-) -diff --git a/checkedout.xbstrap b/checkedout.xbstrap -new file mode 100644 -index 0000000..e69de29 -diff --git a/fetched.xbstrap b/fetched.xbstrap -new file mode 100644 -index 0000000..e69de29 -diff --git a/patched.xbstrap b/patched.xbstrap -new file mode 100644 -index 0000000..e69de29 diff --git a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs index e6307e2..cae81c4 100644 --- a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs @@ -200,7 +185,7 @@ index be12190..c8762d5 100644 .field("ifr_name", &self.ifr_name) .field("ifr_ifru", &self.ifr_ifru) diff --git a/src/unix/mlibc/mod.rs b/src/unix/mlibc/mod.rs -index 2046530..a19b7fa 100644 +index 2046530..8a4f974 100644 --- a/src/unix/mlibc/mod.rs +++ b/src/unix/mlibc/mod.rs @@ -47,7 +47,6 @@ pub type fsfilcnt_t = ::c_uint; @@ -989,7 +974,7 @@ index 2046530..a19b7fa 100644 pub fn pthread_create( thread: *mut ::pthread_t, attr: *const ::pthread_attr_t, -@@ -752,6 +1239,8 @@ extern "C" { +@@ -752,7 +1239,16 @@ extern "C" { addr: *mut ::sockaddr, addrlen: *mut ::socklen_t, ) -> ::ssize_t; @@ -998,6 +983,14 @@ index 2046530..a19b7fa 100644 pub fn setgroups(ngroups: ::c_int, ptr: *const ::gid_t) -> ::c_int; pub fn setpwent(); pub fn writev(fd: ::c_int, iov: *const ::iovec, count: ::c_int) -> ::ssize_t; ++ ++ // Non standard extensions, also found on modern BSD's. ++ // ++ // options/posix/include/sys/uio.h ++ pub fn preadv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; ++ pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) ++ -> ::ssize_t; + } -- -2.40.0 +2.40.1 From 7a8528756d49c055594506d02f81606a21277f8b Mon Sep 17 00:00:00 2001 From: Anhad Singh <62820092+Andy-Python-Programmer@users.noreply.github.com> Date: Sun, 21 May 2023 13:03:30 +1000 Subject: [PATCH 217/368] Update weekly.yml * Fix the `cron` to be weekly instead of nightly * Install `xorg-xserver` and `xorg-xinit` --- .github/workflows/weekly.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/weekly.yml b/.github/workflows/weekly.yml index 41204a8cd60..d5a6ddb854f 100644 --- a/.github/workflows/weekly.yml +++ b/.github/workflows/weekly.yml @@ -2,7 +2,7 @@ name: Weekly Aero Build on: schedule: - - cron: '0 0 * * *' + - cron: '0 0 * * 0' workflow_dispatch: jobs: @@ -31,7 +31,7 @@ jobs: pushd build [ -f bootstrap.link ] || xbstrap init .. - xbstrap install bash coreutils dwm alacritty + xbstrap install bash coreutils dwm xorg-xserver xorg-xinit alacritty popd - name: Build Kernel From a5503a5f3e45c362cdd5ea7abab93e20040825c5 Mon Sep 17 00:00:00 2001 From: Anhad Singh <62820092+Andy-Python-Programmer@users.noreply.github.com> Date: Sun, 21 May 2023 13:13:11 +1000 Subject: [PATCH 218/368] Update weekly.yml Misspelt `xorg-server` as `xorg-xserver`. Godamn, gotta love CI. --- .github/workflows/weekly.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/weekly.yml b/.github/workflows/weekly.yml index d5a6ddb854f..55b43e5a990 100644 --- a/.github/workflows/weekly.yml +++ b/.github/workflows/weekly.yml @@ -31,7 +31,7 @@ jobs: pushd build [ -f bootstrap.link ] || xbstrap init .. - xbstrap install bash coreutils dwm xorg-xserver xorg-xinit alacritty + xbstrap install bash coreutils dwm xorg-server xorg-xinit alacritty popd - name: Build Kernel From 4a96fe62c27f38e4145aa393523f50202d3c67ed Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 21 May 2023 16:43:36 +1000 Subject: [PATCH 219/368] misc: clippy :^) Signed-off-by: Anhad Singh --- .vscode/settings.json | 1 + src/aero_kernel/build.rs | 4 +- src/aero_kernel/src/acpi/hpet.rs | 4 +- src/aero_kernel/src/acpi/rsdp.rs | 4 +- src/aero_kernel/src/arch/x86_64/apic.rs | 4 +- .../src/arch/x86_64/interrupts/exceptions.rs | 2 +- .../src/arch/x86_64/interrupts/mod.rs | 2 +- src/aero_kernel/src/arch/x86_64/mod.rs | 2 +- src/aero_kernel/src/arch/x86_64/task.rs | 8 +- src/aero_kernel/src/arch/x86_64/tls.rs | 2 +- src/aero_kernel/src/cmdline.rs | 2 +- src/aero_kernel/src/drivers/block/ahci.rs | 4 +- .../src/drivers/block/ide/channel.rs | 2 +- src/aero_kernel/src/drivers/block/ide/mod.rs | 17 +- .../src/drivers/block/nvme/command.rs | 24 +-- src/aero_kernel/src/drivers/block/nvme/mod.rs | 6 +- .../src/drivers/block/nvme/queue.rs | 2 +- src/aero_kernel/src/drivers/drm/mod.rs | 10 +- src/aero_kernel/src/drivers/e1000.rs | 6 +- src/aero_kernel/src/drivers/keyboard.rs | 4 +- src/aero_kernel/src/drivers/mouse.rs | 6 +- src/aero_kernel/src/drivers/pty.rs | 12 +- src/aero_kernel/src/drivers/tty/mod.rs | 22 +- src/aero_kernel/src/drivers/uart_16550.rs | 6 +- src/aero_kernel/src/fs/block/gpt.rs | 2 +- src/aero_kernel/src/fs/block/mod.rs | 4 +- src/aero_kernel/src/fs/cache.rs | 12 +- src/aero_kernel/src/fs/devfs.rs | 6 +- src/aero_kernel/src/fs/epoll.rs | 2 +- src/aero_kernel/src/fs/eventfd.rs | 4 +- src/aero_kernel/src/fs/ext2/group_desc.rs | 6 +- src/aero_kernel/src/fs/ext2/mod.rs | 30 ++- src/aero_kernel/src/fs/file_table.rs | 2 +- src/aero_kernel/src/fs/inode.rs | 4 +- src/aero_kernel/src/fs/mod.rs | 2 +- src/aero_kernel/src/fs/procfs.rs | 12 +- src/aero_kernel/src/fs/ramfs.rs | 22 +- src/aero_kernel/src/logger.rs | 24 +-- src/aero_kernel/src/mem/alloc.rs | 3 +- src/aero_kernel/src/mem/mod.rs | 3 +- src/aero_kernel/src/mem/paging/addr.rs | 2 +- src/aero_kernel/src/mem/paging/frame.rs | 2 +- src/aero_kernel/src/mem/paging/mapper.rs | 10 +- src/aero_kernel/src/mem/slab.rs | 4 +- src/aero_kernel/src/mem/vmalloc.rs | 4 +- src/aero_kernel/src/modules.rs | 2 +- src/aero_kernel/src/net/arp.rs | 2 +- src/aero_kernel/src/net/mod.rs | 2 +- src/aero_kernel/src/net/tcp.rs | 4 +- src/aero_kernel/src/net/udp.rs | 4 +- src/aero_kernel/src/rendy.rs | 50 ++--- src/aero_kernel/src/socket/tcp.rs | 10 +- src/aero_kernel/src/socket/udp.rs | 5 +- src/aero_kernel/src/socket/unix.rs | 12 +- src/aero_kernel/src/syscall/fs.rs | 6 +- src/aero_kernel/src/syscall/futex.rs | 4 +- src/aero_kernel/src/syscall/net.rs | 4 +- src/aero_kernel/src/unwind.rs | 4 +- src/aero_kernel/src/userland/scheduler/mod.rs | 4 +- .../src/userland/scheduler/round_robin.rs | 20 +- src/aero_kernel/src/userland/signals.rs | 2 +- src/aero_kernel/src/userland/task/mod.rs | 18 +- src/aero_kernel/src/userland/vm.rs | 197 +++++++++--------- src/aero_kernel/src/utils/buffer.rs | 6 +- src/aero_kernel/src/utils/mod.rs | 4 +- src/aero_kernel/src/utils/sync.rs | 5 +- src/aero_proc/src/downcastable.rs | 12 +- src/aero_proc/src/syscall.rs | 162 +++++++------- src/aero_syscall/src/lib.rs | 59 +++--- src/aero_syscall/src/signal.rs | 10 +- 70 files changed, 432 insertions(+), 492 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 1ba4c2a7a7c..887a54e7cd9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,4 +16,5 @@ "termios.h": "c", "termios-c_iflag.h": "c" }, + "rust-analyzer.check.command": "clippy", } \ No newline at end of file diff --git a/src/aero_kernel/build.rs b/src/aero_kernel/build.rs index f71b6288bcf..7af6bbde842 100644 --- a/src/aero_kernel/build.rs +++ b/src/aero_kernel/build.rs @@ -73,8 +73,8 @@ fn main() -> Result<(), Box> { inc_files = inc_files .iter() .map(|e| { - let e = e.split("/").collect::>(); - e[..e.len() - 1].join("/").to_string() + let e = e.split('/').collect::>(); + e[..e.len() - 1].join("/") }) .collect::>(); diff --git a/src/aero_kernel/src/acpi/hpet.rs b/src/aero_kernel/src/acpi/hpet.rs index b0d5de7599f..89e211f0ae8 100644 --- a/src/aero_kernel/src/acpi/hpet.rs +++ b/src/aero_kernel/src/acpi/hpet.rs @@ -36,8 +36,6 @@ pub(super) struct Hpet { impl Hpet { pub fn new(sdt: &'static Sdt) -> Self { - let this = unsafe { ptr::read((sdt as *const Sdt) as *const Self) }; - - this + unsafe { ptr::read((sdt as *const Sdt) as *const Self) } } } diff --git a/src/aero_kernel/src/acpi/rsdp.rs b/src/aero_kernel/src/acpi/rsdp.rs index 9268c70aa51..05ec2af1035 100644 --- a/src/aero_kernel/src/acpi/rsdp.rs +++ b/src/aero_kernel/src/acpi/rsdp.rs @@ -199,7 +199,7 @@ pub(super) fn find_rsdt_address(rsdp_address: VirtAddr) -> RsdtAddress { assert!(valid, "rsdp: failed to validate RSDP v20 checksum"); let xsdt_address = PhysAddr::new(v20.xsdt_address).as_hhdm_virt(); - return RsdtAddress::Xsdt(xsdt_address); + RsdtAddress::Xsdt(xsdt_address) } else { let v10 = unsafe { &*(rsdp_address.as_ptr() as *const Rsdp10) }; let valid = validate_rsdt_checksum(v10); @@ -207,6 +207,6 @@ pub(super) fn find_rsdt_address(rsdp_address: VirtAddr) -> RsdtAddress { assert!(valid, "rsdp: failed to validate RSDP v10 checksum"); let rsdt_address = PhysAddr::new(v10.rsdt_address as u64).as_hhdm_virt(); - return RsdtAddress::Rsdt(rsdt_address); + RsdtAddress::Rsdt(rsdt_address) } } diff --git a/src/aero_kernel/src/arch/x86_64/apic.rs b/src/aero_kernel/src/arch/x86_64/apic.rs index bfc416fbe15..32a485ab910 100644 --- a/src/aero_kernel/src/arch/x86_64/apic.rs +++ b/src/aero_kernel/src/arch/x86_64/apic.rs @@ -404,7 +404,7 @@ pub fn io_apic_set_redirect(vec: u8, gsi: u32, flags: u16, status: i32) { let ioredtbl = (gsi - entry.global_system_interrupt_base) * 2 + 16; unsafe { - io_apic_write(io_apic, ioredtbl + 0, redirect as _); + io_apic_write(io_apic, ioredtbl, redirect as _); io_apic_write(io_apic, ioredtbl + 1, (redirect as u64 >> 32) as _); } @@ -468,5 +468,5 @@ pub fn init() -> ApicType { INTERRUPT_CONTROLLER.switch_to_apic(); } - return apic_type; + apic_type } diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs index 6274c8124d7..7ae54b94599 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs @@ -116,7 +116,7 @@ pub fn breakpoint(stack: &mut InterruptErrorStack) { // // So we will set the RIP to RIP - 1, pointing to the int3 // instruction. - (*stack).stack.iret.rip -= 1; + stack.stack.iret.rip -= 1; } pub(super) fn page_fault(stack: &mut InterruptErrorStack) { diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs index 785d32db291..065b7e2983b 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs @@ -259,7 +259,7 @@ pub fn allocate_vector() -> u8 { static IDT_FREE_VECTOR: Mutex = Mutex::new(32); let mut fvector = IDT_FREE_VECTOR.lock(); - let fcopy = fvector.clone(); + let fcopy = *fvector; if fcopy == 0xf0 { panic!("allocate_vector: vector allocation exhausted") diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index 2dffcee57e4..28ebcf6e01a 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -165,7 +165,7 @@ extern "C" fn arch_aero_main() -> ! { .first() .expect("limine: no framebuffer found!"); - rendy::init(&*framebuffer, &command_line); + rendy::init(framebuffer, &command_line); logger::set_rendy_debug(true); interrupts::init(); diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index b8cd1bd5169..757ca950dfe 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -240,8 +240,8 @@ impl ArchTask { user: true, // The FS and GS bases are inherited from the parent process. - fs_base: self.fs_base.clone(), - gs_base: self.gs_base.clone(), + fs_base: self.fs_base, + gs_base: self.gs_base, fpu_storage: Some(fpu_storage), }) @@ -296,8 +296,8 @@ impl ArchTask { user: true, // The FS and GS bases are inherited from the parent process. - fs_base: self.fs_base.clone(), - gs_base: self.gs_base.clone(), + fs_base: self.fs_base, + gs_base: self.gs_base, fpu_storage: Some(fpu_storage), }) diff --git a/src/aero_kernel/src/arch/x86_64/tls.rs b/src/aero_kernel/src/arch/x86_64/tls.rs index b3cf59248d2..b1a802c0fc7 100644 --- a/src/aero_kernel/src/arch/x86_64/tls.rs +++ b/src/aero_kernel/src/arch/x86_64/tls.rs @@ -175,6 +175,6 @@ where let lock = CPU_INFO.lock(); for info in lock.iter() { - f(&info); + f(info); } } diff --git a/src/aero_kernel/src/cmdline.rs b/src/aero_kernel/src/cmdline.rs index 23649470514..d5299aac0c4 100644 --- a/src/aero_kernel/src/cmdline.rs +++ b/src/aero_kernel/src/cmdline.rs @@ -51,7 +51,7 @@ fn parse_number(mut string: &str) -> Result { string = string.trim_start_matches("0o"); usize::from_str_radix(string, 8) } else { - usize::from_str_radix(string, 10) + string.parse::() } } diff --git a/src/aero_kernel/src/drivers/block/ahci.rs b/src/aero_kernel/src/drivers/block/ahci.rs index 4ee7b72044e..29c554612e8 100644 --- a/src/aero_kernel/src/drivers/block/ahci.rs +++ b/src/aero_kernel/src/drivers/block/ahci.rs @@ -433,7 +433,7 @@ impl HbaCmdTbl { } fn prdt_entry_mut(&mut self, i: usize) -> &mut HbaPrdtEntry { - unsafe { &mut *self.prdt_entry.as_mut_ptr().offset(i as isize) } + unsafe { &mut *self.prdt_entry.as_mut_ptr().add(i) } } } @@ -725,7 +725,7 @@ impl HbaPort { impl HbaMemory { fn port_mut(&mut self, port: usize) -> &mut HbaPort { - unsafe { &mut *((self as *mut Self).offset(1) as *mut HbaPort).offset(port as isize) } + unsafe { &mut *((self as *mut Self).offset(1) as *mut HbaPort).add(port) } } } diff --git a/src/aero_kernel/src/drivers/block/ide/channel.rs b/src/aero_kernel/src/drivers/block/ide/channel.rs index e22044ed66f..dd2710dafc1 100644 --- a/src/aero_kernel/src/drivers/block/ide/channel.rs +++ b/src/aero_kernel/src/drivers/block/ide/channel.rs @@ -154,7 +154,7 @@ impl IdeChannelData { _ => {} } - return false; + false } pub fn setup_prdt(&mut self) { diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index 538a7127b60..7f2013c964f 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -54,7 +54,7 @@ impl BlockDeviceInterface for IdeDrive { let count = dest.len().ceil_div(512); let request = Arc::new(DmaRequest::new(sector, count)); - let res = self.channel.run_request(request.clone(), self.slave); + let res = self.channel.run_request(request, self.slave); if res.is_some() { todo!() @@ -177,22 +177,11 @@ impl IdeDevice { if idx > 0 { header.enable_bus_mastering(); - for channel in self - .channels - .iter_mut() - .filter(|a| a.is_some()) - .map(|a| a.as_mut().unwrap()) - { + for channel in self.channels.iter_mut().filter_map(|a| a.as_mut()) { channel.init(); } - for (i, drive) in self - .ide_devs - .iter() - .filter(|e| e.is_some()) - .map(|e| e.as_ref().unwrap()) - .enumerate() - { + for (i, drive) in self.ide_devs.iter().filter_map(|e| e.as_ref()).enumerate() { let name = alloc::format!("blck{}", i); let block_device = BlockDevice::new(name, drive.clone()); diff --git a/src/aero_kernel/src/drivers/block/nvme/command.rs b/src/aero_kernel/src/drivers/block/nvme/command.rs index ba53854ae76..49e8353d090 100644 --- a/src/aero_kernel/src/drivers/block/nvme/command.rs +++ b/src/aero_kernel/src/drivers/block/nvme/command.rs @@ -97,9 +97,9 @@ pub struct IdentifyCommand { pub reserved11: [u32; 5], } -impl Into for IdentifyCommand { - fn into(self) -> Command { - Command { identify: self } +impl From for Command { + fn from(val: IdentifyCommand) -> Self { + Command { identify: val } } } @@ -288,9 +288,9 @@ pub struct ReadWriteCommand { pub app_mask: u16, } -impl Into for ReadWriteCommand { - fn into(self) -> Command { - Command { rw: self } +impl From for Command { + fn from(val: ReadWriteCommand) -> Self { + Command { rw: val } } } @@ -310,9 +310,9 @@ pub struct CreateSQCommand { pub reserved2: [u32; 4], } -impl Into for CreateSQCommand { - fn into(self) -> Command { - Command { create_sq: self } +impl From for Command { + fn from(val: CreateSQCommand) -> Self { + Command { create_sq: val } } } @@ -332,9 +332,9 @@ pub struct CreateCQCommand { pub reserved2: [u32; 4], } -impl Into for CreateCQCommand { - fn into(self) -> Command { - Command { create_cq: self } +impl From for Command { + fn from(val: CreateCQCommand) -> Self { + Command { create_cq: val } } } diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 240f29f39d2..383570751f2 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -143,7 +143,7 @@ impl ControllerConfig { /// Sets the command set to be used. fn set_css(&mut self, command_set: CommandSet) { // XXX: This field shall only be changed when the controller is disabled. - assert_eq!(self.is_enabled(), false); + assert!(!self.is_enabled()); let mut cfg = self.0.get(); cfg.set_bits(4..7, command_set as u32); @@ -316,7 +316,7 @@ impl<'a> Controller<'a> { let queue_size = registers.capability.max_queue_entries() as usize; - let mut admin = QueuePair::new(®isters, queue_size)?; + let mut admin = QueuePair::new(registers, queue_size)?; registers .aqa @@ -352,7 +352,7 @@ impl<'a> Controller<'a> { ); // Create and initialize the I/O queues. - let io_queue = QueuePair::new(®isters, queue_size)?; + let io_queue = QueuePair::new(registers, queue_size)?; let mut io_cq_cmd = CreateCQCommand::default(); diff --git a/src/aero_kernel/src/drivers/block/nvme/queue.rs b/src/aero_kernel/src/drivers/block/nvme/queue.rs index c51de1e915c..4ed0b4221db 100644 --- a/src/aero_kernel/src/drivers/block/nvme/queue.rs +++ b/src/aero_kernel/src/drivers/block/nvme/queue.rs @@ -92,7 +92,7 @@ impl Queue<'_, Completion> { self.doorbell.0.set(self.index as u32); - Some(cmd.clone()) + Some(*cmd) } } diff --git a/src/aero_kernel/src/drivers/drm/mod.rs b/src/aero_kernel/src/drivers/drm/mod.rs index 62b5497821b..1bf7d9d4bc3 100644 --- a/src/aero_kernel/src/drivers/drm/mod.rs +++ b/src/aero_kernel/src/drivers/drm/mod.rs @@ -145,7 +145,7 @@ impl ModeObject for Crtc { } fn object(&self) -> Arc { - self.sref.upgrade().unwrap().clone() + self.sref.upgrade().unwrap() } } @@ -189,7 +189,7 @@ impl ModeObject for Encoder { } fn object(&self) -> Arc { - self.sref.upgrade().unwrap().clone() + self.sref.upgrade().unwrap() } } @@ -238,7 +238,7 @@ impl ModeObject for Connector { } fn object(&self) -> Arc { - self.sref.upgrade().unwrap().clone() + self.sref.upgrade().unwrap() } } @@ -266,7 +266,7 @@ impl ModeObject for Framebuffer { } fn object(&self) -> Arc { - self.sref.upgrade().unwrap().clone() + self.sref.upgrade().unwrap() } } @@ -620,7 +620,7 @@ impl INodeInterface for Drm { self.device .framebuffer_create(&handle, struc.width, struc.height, struc.pitch); - let fb = Framebuffer::new(self.allocate_object_id(), handle.clone()); + let fb = Framebuffer::new(self.allocate_object_id(), handle); self.install_framebuffer(fb.clone()); struc.fb_id = fb.id(); diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index a1b4a62a46d..1c45e00844e 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -606,7 +606,7 @@ impl NetworkDriver for Device { loop { let mut e1000 = self.e1000.lock_irq(); if let Some(data) = e1000.recv() { - self.wq.remove(task.clone()); + self.wq.remove(task); return data; } else { drop(e1000); @@ -649,7 +649,9 @@ impl PciDeviceHandle for Handler { static DEVICE: Once> = Once::new(); fn irq_handler(_stack: &mut InterruptStack) { - DEVICE.get().map(|e| e.handle_irq()); + if let Some(e) = DEVICE.get() { + e.handle_irq() + } } fn init() { diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index 316e1fb4be9..00d884c0293 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -245,7 +245,9 @@ impl INodeInterface for KeyboardDevice { } fn poll(&self, table: Option<&mut fs::inode::PollTable>) -> fs::Result { - table.map(|q| q.insert(&self.wq)); + if let Some(q) = table { + q.insert(&self.wq) + } if !self.buffer.lock_irq().is_empty() { Ok(PollFlags::IN) diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs index a02c27d575c..496c17bfab1 100644 --- a/src/aero_kernel/src/drivers/mouse.rs +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -110,7 +110,7 @@ impl Mouse { this.y = packet as i16; } - PACKETS.lock_irq().push(this.clone()); + PACKETS.lock_irq().push(*this); self.wq.notify_all(); } } @@ -154,7 +154,9 @@ impl INodeInterface for Mouse { } fn poll(&self, table: Option<&mut PollTable>) -> fs::Result { - table.map(|e| e.insert(&MOUSE.wq)); + if let Some(e) = table { + e.insert(&MOUSE.wq) + } if !PACKETS.lock_irq().is_empty() { Ok(PollFlags::IN) diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 0512ba68f34..432968936d0 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -125,7 +125,9 @@ impl INodeInterface for Master { } fn poll(&self, table: Option<&mut fs::inode::PollTable>) -> fs::Result { - table.map(|e| e.insert(&self.wq)); + if let Some(e) = table { + e.insert(&self.wq) + } let mut flags = fs::inode::PollFlags::OUT; if !self.buffer.lock_irq().is_empty() { @@ -400,11 +402,7 @@ impl INodeInterface for PtsINode { .find(|(&e, _)| e == id) .ok_or(FileSystemError::EntryNotFound)?; - Ok(DirEntry::new( - dir.clone(), - inode.clone(), - String::from(name), - )) + Ok(DirEntry::new(dir, inode.clone(), String::from(name))) } fn weak_filesystem(&self) -> Option> { @@ -453,7 +451,7 @@ impl fs::FileSystem for PtsFs { fn pty_init() { devfs::install_device(PTMX.clone()).unwrap(); - let fs = PTS_FS.call_once(|| PtsFs::new()); + let fs = PTS_FS.call_once(PtsFs::new); let root = DEV_FILESYSTEM.root_dir().inode(); root.mkdir("pts").unwrap(); diff --git a/src/aero_kernel/src/drivers/tty/mod.rs b/src/aero_kernel/src/drivers/tty/mod.rs index 6ca90322093..b83f84ddc99 100644 --- a/src/aero_kernel/src/drivers/tty/mod.rs +++ b/src/aero_kernel/src/drivers/tty/mod.rs @@ -179,7 +179,7 @@ impl StdinBuffer { } fn is_complete(&self) -> bool { - self.back_buffer.len() > 0 || self.front_buffer.len() > 0 + !self.back_buffer.is_empty() || !self.front_buffer.is_empty() } fn advance_cursor(&mut self) { @@ -294,7 +294,9 @@ impl INodeInterface for Tty { } fn poll(&self, table: Option<&mut PollTable>) -> fs::Result { - table.map(|e| e.insert(&self.block_queue)); + if let Some(e) = table { + e.insert(&self.block_queue) + } let mut events = PollFlags::empty(); if self.stdin.lock_irq().is_complete() { @@ -330,7 +332,7 @@ impl INodeInterface for Tty { let lock = TERMIOS.lock_irq(); let this = &*lock; - *termios = this.clone(); + *termios = *this; Ok(0x00) } @@ -347,7 +349,7 @@ impl INodeInterface for Tty { let mut lock = TERMIOS.lock_irq(); let this = &mut *lock; - *this = termios.clone(); + *this = *termios; Ok(0x00) } @@ -438,11 +440,11 @@ impl KeyboardListener for Tty { if termios.c_lflag.contains(aero_syscall::TermiosLFlag::ICANON) { let mut stdin = self.stdin.lock_irq(); - if stdin.back_buffer.pop().is_some() { - if termios.c_lflag.contains(aero_syscall::TermiosLFlag::ECHO) { - rendy::backspace(); - stdin.cursor -= 1; - } + if stdin.back_buffer.pop().is_some() + && termios.c_lflag.contains(aero_syscall::TermiosLFlag::ECHO) + { + rendy::backspace(); + stdin.cursor -= 1; } } else { push_str("\x08"); @@ -483,7 +485,7 @@ impl KeyboardListener for Tty { KeyCode::KEY_ENTER | KeyCode::KEY_KPENTER if !released => { let mut stdin = self.stdin.lock_irq(); - stdin.back_buffer.push('\n' as u8); + stdin.back_buffer.push(b'\n'); stdin.cursor = 0; if termios.c_lflag.contains(aero_syscall::TermiosLFlag::ECHO) { diff --git a/src/aero_kernel/src/drivers/uart_16550.rs b/src/aero_kernel/src/drivers/uart_16550.rs index 8954d361389..39ea116cc3f 100644 --- a/src/aero_kernel/src/drivers/uart_16550.rs +++ b/src/aero_kernel/src/drivers/uart_16550.rs @@ -145,7 +145,7 @@ pub macro serial_println { #[doc(hidden)] pub fn _serial_print(args: fmt::Arguments) { - COM_1 - .get() - .map(|c| c.lock().write_fmt(args).expect("failed to write to COM1")); + if let Some(c) = COM_1.get() { + c.lock().write_fmt(args).expect("failed to write to COM1") + } } diff --git a/src/aero_kernel/src/fs/block/gpt.rs b/src/aero_kernel/src/fs/block/gpt.rs index 796f4ef574a..3974338c853 100644 --- a/src/aero_kernel/src/fs/block/gpt.rs +++ b/src/aero_kernel/src/fs/block/gpt.rs @@ -151,7 +151,7 @@ impl Gpt { // SAFETY: The entries list is initialized above. let entries = unsafe { entry_list.assume_init() }; - return Some(Self { entries }); + Some(Self { entries }) } pub fn entries(&self) -> &[GptEntry] { diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 0eddf83d23a..3c056c07c6c 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -331,7 +331,7 @@ impl Device for BlockDevice { } fn inode(&self) -> Arc { - self.sref.upgrade().unwrap().clone() + self.sref.upgrade().unwrap() } } @@ -427,7 +427,7 @@ pub fn launch() -> Result<()> { log::info!("gpt: found ext2 filesystem on {}!", device.name()); super::ROOT_FS.call_once(|| ext2.clone()); - super::ROOT_DIR.call_once(|| ext2.root_dir().clone()); + super::ROOT_DIR.call_once(|| ext2.root_dir()); } } } diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index 29a1d8a705b..62f3f43764a 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -390,12 +390,16 @@ impl DirCacheImpl for DirCacheItem { #[inline] pub fn clear_inode_cache() { - INODE_CACHE.get().map(|cache| cache.clear()); + if let Some(cache) = INODE_CACHE.get() { + cache.clear() + } } #[inline] pub fn clear_dir_cache() { - DIR_CACHE.get().map(|cache| cache.clear()); + if let Some(cache) = DIR_CACHE.get() { + cache.clear() + } } pub fn icache() -> &'static Arc { @@ -412,6 +416,6 @@ pub fn dcache() -> &'static Arc { /// This function is responsible for initializing the inode cache. pub fn init() { - INODE_CACHE.call_once(|| INodeCache::new()); - DIR_CACHE.call_once(|| DirCache::new()); + INODE_CACHE.call_once(INodeCache::new); + DIR_CACHE.call_once(DirCache::new); } diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index 32503e6a31a..15d2f07bd4f 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -452,10 +452,10 @@ pub(super) fn init() -> Result<()> { let rendy_info = crate::rendy::get_rendy_info(); { - let null = DEV_NULL.call_once(|| DevNull::new()); - let kmsg = DEV_KMSG.call_once(|| DevKmsg::new()); + let null = DEV_NULL.call_once(DevNull::new); + let kmsg = DEV_KMSG.call_once(DevKmsg::new); let fb = DEV_FB.call_once(|| DevFb::new(rendy_info)); - let urandom = DEV_URANDOM.call_once(|| DevUrandom::new()); + let urandom = DEV_URANDOM.call_once(DevUrandom::new); install_device(null.clone())?; install_device(kmsg.clone())?; diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index 34859dcb155..d8ae513590d 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -171,7 +171,7 @@ impl EPoll { // If all events are ready, we can return now. if n > 0 { - debug_assert!(fds.len() == 0); + debug_assert!(fds.is_empty()); return Ok(n); } diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index 3ff8fe9b0a1..19972372a38 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -68,7 +68,9 @@ impl INodeInterface for EventFd { let count = self.count.lock_irq(); let mut events = PollFlags::empty(); - table.map(|e| e.insert(&self.wq)); // listen for changes + if let Some(e) = table { + e.insert(&self.wq) + } // listen for changes if *count > 0 { events.insert(PollFlags::IN); diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index 8e897cfde7e..3380add761a 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -134,7 +134,7 @@ impl GroupDescriptors { let mut descriptors = self.descriptors.write(); let block_group = &mut descriptors[block_group_idx]; - let mut bitmap = Bitmap::new(fs.clone(), block_group.block_bitmap as usize)?; + let mut bitmap = Bitmap::new(fs, block_group.block_bitmap as usize)?; let block_id = block_group_idx * blocks_per_group + bitmap.alloc()?; block_group.free_blocks_count -= 1; @@ -156,7 +156,7 @@ impl GroupDescriptors { let mut descriptors = self.descriptors.write(); let block_group = &mut descriptors[block_group_idx]; - let mut bitmap = Bitmap::new(fs.clone(), block_group.inode_bitmap as usize)?; + let mut bitmap = Bitmap::new(fs, block_group.inode_bitmap as usize)?; // Since inode numbers start from 1 rather than 0, the first bit in the first block // group's inode bitmap represent inode number 1. Thus, we add 1 to the allocated // inode number. @@ -207,7 +207,7 @@ impl Bitmap { for (i, e) in self.bitmap.iter_mut().enumerate() { if *e != u8::MAX { for bit in 0..8 { - if e.get_bit(bit) == false { + if !e.get_bit(bit) { e.set_bit(bit, true); return Some(i * 8 + bit); diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index e1aa480dbd1..b4ef58d84a5 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -269,7 +269,7 @@ impl INode { fs.block.read(offset, res.as_bytes_mut()); // SAFETY: We have initialized the variable above. - return Some(unsafe { res.assume_init() }); + Some(unsafe { res.assume_init() }) } else { // singly indirect block let block_ptrs = self.inode.read().data_ptr[12] as usize * block_size; @@ -279,7 +279,7 @@ impl INode { fs.block.read(offset, res.as_bytes_mut()); // SAFETY: We have initialized the variable above. - return Some(unsafe { res.assume_init() }); + Some(unsafe { res.assume_init() }) } } @@ -307,10 +307,7 @@ impl INode { return Err(FileSystemError::NotSupported); } - if DirEntryIter::new(self.sref()) - .find(|(e, _)| e == name) - .is_some() - { + if DirEntryIter::new(self.sref()).any(|(e, _)| e == name) { return Err(FileSystemError::EntryExists); } @@ -448,10 +445,7 @@ impl INodeInterface for INode { fn rename(&self, old: DirCacheItem, dest: &str) -> super::Result<()> { assert!(self.metadata()?.is_directory()); - if DirEntryIter::new(self.sref()) - .find(|(name, _)| name == dest) - .is_some() - { + if DirEntryIter::new(self.sref()).any(|(name, _)| name == dest) { return Err(FileSystemError::EntryExists); } @@ -506,7 +500,7 @@ impl INodeInterface for INode { name: &str, inode: Arc, ) -> super::Result { - Ok(self.make_inode(name, FileType::Socket, Some(inode))?) + self.make_inode(name, FileType::Socket, Some(inode)) } fn resolve_link(&self) -> super::Result { @@ -523,7 +517,7 @@ impl INodeInterface for INode { let path_bytes = &data_bytes[..path_len]; let path = core::str::from_utf8(path_bytes).or(Err(FileSystemError::InvalidPath))?; - return Ok(path.into()); + Ok(path.into()) } else { let mut buffer = Box::<[u8]>::new_uninit_slice(path_len); self.read(0, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; @@ -531,7 +525,7 @@ impl INodeInterface for INode { let path_bytes = unsafe { buffer.assume_init() }; let path = core::str::from_utf8(&path_bytes).or(Err(FileSystemError::InvalidPath))?; - return Ok(path.into()); + Ok(path.into()) } } @@ -555,7 +549,7 @@ impl INodeInterface for INode { return proxy.listen(backlog); } - return Err(SyscallError::EACCES); + Err(SyscallError::EACCES) } // XXX: We do not require to handle `bind` here since if this function @@ -566,7 +560,7 @@ impl INodeInterface for INode { return proxy.connect(address, length); } - return Err(FileSystemError::NotSupported); + Err(FileSystemError::NotSupported) } fn accept(&self, address: Option<(VirtAddr, &mut u32)>) -> super::Result> { @@ -574,7 +568,7 @@ impl INodeInterface for INode { return proxy.accept(address); } - return Err(FileSystemError::NotSupported); + Err(FileSystemError::NotSupported) } fn send(&self, message_hdr: &mut MessageHeader, flags: MessageFlags) -> super::Result { @@ -598,7 +592,7 @@ impl INodeInterface for INode { return proxy.poll(table); } - return Err(FileSystemError::NotSupported); + Err(FileSystemError::NotSupported) } fn as_unix_socket(&self) -> super::Result> { @@ -645,7 +639,7 @@ impl Iterator for DirEntryIter { // SAFETY: We have initialized the name above. let name = unsafe { name.assume_init() }; - let name = unsafe { core::str::from_utf8_unchecked(&*name) }; + let name = unsafe { core::str::from_utf8_unchecked(&name) }; self.offset += entry.entry_size as usize; Some((name.to_string(), entry)) diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index df2a32fbd19..496d4797219 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -50,7 +50,7 @@ impl FileHandle { pub fn new(fd: usize, inode: DirCacheItem, flags: OpenFlags) -> Self { Self { fd, - inode: inode.clone(), + inode, offset: Arc::new(AtomicUsize::new(0)), flags: RwLock::new(flags), } diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 1f8fab2c0bb..7d416803d09 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -395,7 +395,7 @@ impl DirEntry { let entry = Self { data: BMutex::new(DirProtectedData { - parent: Some(parent.clone()), + parent: Some(parent), inode: inode.clone(), name, }), @@ -429,7 +429,7 @@ impl DirEntry { dcache.make_item_no_cache(Self { data: BMutex::new(DirProtectedData { parent: None, - inode: inode.clone(), + inode, name, }), diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index b8505e0fa69..cc3327fbaa3 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -172,7 +172,7 @@ impl Path { /// Returns an iterator over the components of the path. pub fn components(&self) -> impl Iterator { - self.0.split("/").filter(|e| *e != "" && *e != ".") + self.0.split('/').filter(|e| !e.is_empty() && *e != ".") } pub fn as_str(&self) -> &str { diff --git a/src/aero_kernel/src/fs/procfs.rs b/src/aero_kernel/src/fs/procfs.rs index ed3c398a3a7..dd26543a3fe 100644 --- a/src/aero_kernel/src/fs/procfs.rs +++ b/src/aero_kernel/src/fs/procfs.rs @@ -184,11 +184,7 @@ impl INodeInterface for LockedProcINode { .get(name) .ok_or(FileSystemError::EntryNotFound)?; - Ok(DirEntry::new( - dir.clone(), - child.clone(), - String::from(name), - )) + Ok(DirEntry::new(dir, child.clone(), String::from(name))) } fn metadata(&self) -> Result { @@ -213,7 +209,7 @@ impl INodeInterface for LockedProcINode { 0x00 => Some(DirEntry::new( parent, // UNWRAP: The inner node value should not be dropped. - this.node.upgrade().unwrap().into(), + this.node.upgrade().unwrap(), String::from("."), )), @@ -221,7 +217,7 @@ impl INodeInterface for LockedProcINode { Some(DirEntry::new( parent, // UNWRAP: The inner node value should not be dropped. - this.node.upgrade().unwrap().into(), + this.node.upgrade().unwrap(), String::from(".."), )) } @@ -272,7 +268,7 @@ impl ProcFs { inode.init( &ramfs.root_inode.downgrade(), - &&root_cached.downgrade(), + &root_cached.downgrade(), &Arc::downgrade(&ramfs), FileType::Directory, ); diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index a2dfe5cd8f6..4d81a041db4 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -211,7 +211,7 @@ impl INodeInterface for LockedRamINode { 0x00 => Some(DirEntry::new( parent, // UNWRAP: The inner node value should not be dropped. - this.node.upgrade().unwrap().into(), + this.node.upgrade().unwrap(), String::from("."), )), @@ -219,7 +219,7 @@ impl INodeInterface for LockedRamINode { Some(DirEntry::new( parent, // UNWRAP: The inner node value should not be dropped. - this.node.upgrade().unwrap().into(), + this.node.upgrade().unwrap(), String::from(".."), )) } @@ -251,7 +251,7 @@ impl INodeInterface for LockedRamINode { let mut vec = vec.lock(); vec.resize(size, 0); - return Ok(()); + Ok(()) } _ => { @@ -273,7 +273,7 @@ impl INodeInterface for LockedRamINode { let size = core::cmp::min(buffer.len(), vec.len() - offset); - for (i, b) in (&vec.as_slice()[offset..offset + size]).iter().enumerate() { + for (i, b) in vec.as_slice()[offset..offset + size].iter().enumerate() { buffer[i] = *b; } @@ -283,7 +283,7 @@ impl INodeInterface for LockedRamINode { FileContents::StaticContent(static_buffer) => { let size = core::cmp::min(buffer.len(), static_buffer.len() - offset); - for (i, b) in (&static_buffer[offset..offset + size]).iter().enumerate() { + for (i, b) in static_buffer[offset..offset + size].iter().enumerate() { buffer[i] = *b; } @@ -395,11 +395,7 @@ impl INodeInterface for LockedRamINode { .get(name) .ok_or(FileSystemError::EntryNotFound)?; - Ok(DirEntry::new( - dir.clone(), - child.clone(), - String::from(name), - )) + Ok(DirEntry::new(dir, child.clone(), String::from(name))) } fn as_unix_socket(&self) -> Result> { @@ -449,7 +445,7 @@ impl INodeInterface for LockedRamINode { { let this = self.0.read(); - if this.children.iter().find(|(e, _)| e == &name).is_some() { + if this.children.iter().any(|(e, _)| e == &name) { return Err(FileSystemError::EntryExists); } } @@ -457,7 +453,7 @@ impl INodeInterface for LockedRamINode { let mut this = self.0.write(); // Create the link! - this.children.insert(name.to_string(), src.clone()); + this.children.insert(name.to_string(), src); Ok(()) } } @@ -495,7 +491,7 @@ impl RamFs { .unwrap() .init( &ramfs.root_inode.downgrade(), - &&root_cached.downgrade(), + &root_cached.downgrade(), &Arc::downgrade(&ramfs), FileType::Directory, ); diff --git a/src/aero_kernel/src/logger.rs b/src/aero_kernel/src/logger.rs index d20c59dff9d..bff6a2db93a 100644 --- a/src/aero_kernel/src/logger.rs +++ b/src/aero_kernel/src/logger.rs @@ -69,16 +69,13 @@ impl log::Log for AeroLogger { if scheduler::is_initialized() { // fetch the current task, grab the TID and PID. - scheduler::get_scheduler() - .inner - .current_task_optional() - .map(|task| { - serial_print!( - "(tid={}, pid={}) ", - task.tid().as_usize(), - task.pid().as_usize() - ); - }); + if let Some(task) = scheduler::get_scheduler().inner.current_task_optional() { + serial_print!( + "(tid={}, pid={}) ", + task.tid().as_usize(), + task.pid().as_usize() + ) + } } match record.level() { @@ -103,15 +100,16 @@ impl log::Log for AeroLogger { /// This method is not memory safe and should be only used when absolutely necessary. #[inline] pub unsafe fn force_unlock() { - LOG_RING_BUFFER.get().map(|l| l.force_unlock()); + if let Some(l) = LOG_RING_BUFFER.get() { + l.force_unlock() + } } -pub fn get_log_buffer<'a>() -> String { +pub fn get_log_buffer() -> String { LOG_RING_BUFFER .get() .map(|l| String::from(l.lock_irq().extract())) .expect("log: attempted to get the log ring buffer before it was initialized") - .clone() } #[inline] diff --git a/src/aero_kernel/src/mem/alloc.rs b/src/aero_kernel/src/mem/alloc.rs index 4325f6c16e1..e46403e3eb2 100644 --- a/src/aero_kernel/src/mem/alloc.rs +++ b/src/aero_kernel/src/mem/alloc.rs @@ -210,12 +210,11 @@ unsafe impl GlobalAlloc for LockedHeap { // SAFETY: We we need to be careful to not cause a deadlock as the interrupt // handlers utilize the heap and might interrupt an in-progress allocation. So, we // lock the interrupts during the allocation. - let ptr = self.0.alloc(layout); #[cfg(feature = "kmemleak")] kmemleak::MEM_LEAK_CATCHER.track_caller(ptr, layout); - ptr + self.0.alloc(layout) } unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { diff --git a/src/aero_kernel/src/mem/mod.rs b/src/aero_kernel/src/mem/mod.rs index 7240f3e5de0..41f68d04780 100644 --- a/src/aero_kernel/src/mem/mod.rs +++ b/src/aero_kernel/src/mem/mod.rs @@ -83,9 +83,8 @@ impl AddressSpace { } let addr = PhysAddr::new(value & 0x_000f_ffff_ffff_f000); - let frame = PhysFrame::containing_address(addr); - frame + PhysFrame::containing_address(addr) }; Self { cr3 } diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 9c3c8e3dd64..8a3698b0997 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -127,7 +127,7 @@ impl VirtAddr { /// Converts this HHDM (Higher Half Direct Map) virtual address to its physical address. pub fn as_hhdm_phys(&self) -> PhysAddr { - unsafe { PhysAddr::new(self.clone() - crate::PHYSICAL_MEMORY_OFFSET) } + unsafe { PhysAddr::new(*self - crate::PHYSICAL_MEMORY_OFFSET) } } /// Returns if the address is valid to read `sizeof(T)` bytes at the address. diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 084b09b109b..97a3fb2a875 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -413,7 +413,7 @@ impl GlobalFrameAllocator { } } - return 0; + 0 } fn get_bit_idx(&self, addr: PhysAddr, order: usize) -> usize { diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index c643d5e5a18..1594b4ba2ca 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -609,7 +609,7 @@ impl<'a, P: PageTableFrameMapping> Mapper for MappedPageTable<'a, P> { p4 = self.page_table_walker.next_table(&p5[page.p5_index()])?; } else { - p4 = &self.page_table; + p4 = self.page_table; } let p3 = self.page_table_walker.next_table(&p4[page.p4_index()])?; @@ -721,7 +721,7 @@ impl<'a, P: PageTableFrameMapping> Mapper for MappedPageTable<'a, P> { p4 = self.page_table_walker.next_table(&p5[page.p5_index()])?; } else { - p4 = &self.page_table; + p4 = self.page_table; } let p3 = self.page_table_walker.next_table(&p4[page.p4_index()])?; @@ -755,7 +755,7 @@ impl<'a, P: PageTableFrameMapping> Translate for MappedPageTable<'a, P> { } }; } else { - p4 = &self.page_table; + p4 = self.page_table; } let p3 = match self.page_table_walker.next_table(&p4[addr.p4_index()]) { @@ -771,7 +771,7 @@ impl<'a, P: PageTableFrameMapping> Translate for MappedPageTable<'a, P> { Err(PageTableWalkError::MappedToHugePage) => { let entry = &p3[addr.p3_index()]; let frame = PhysFrame::containing_address(entry.addr()); - let offset = addr.as_u64() & 0o_777_777_7777; + let offset = addr.as_u64() & 0o7_777_777_777; let flags = entry.flags(); return TranslateResult::Mapped { frame: MappedFrame::Size1GiB(frame), @@ -786,7 +786,7 @@ impl<'a, P: PageTableFrameMapping> Translate for MappedPageTable<'a, P> { Err(PageTableWalkError::MappedToHugePage) => { let entry = &p2[addr.p2_index()]; let frame = PhysFrame::containing_address(entry.addr()); - let offset = addr.as_u64() & 0o_777_7777; + let offset = addr.as_u64() & 0o7_777_777; let flags = entry.flags(); return TranslateResult::Mapped { frame: MappedFrame::Size2MiB(frame), diff --git a/src/aero_kernel/src/mem/slab.rs b/src/aero_kernel/src/mem/slab.rs index 53a5b37f83d..a291c347441 100644 --- a/src/aero_kernel/src/mem/slab.rs +++ b/src/aero_kernel/src/mem/slab.rs @@ -38,7 +38,7 @@ impl SlabHeader { } /// Returns the slab pool to which this header belongs to. - pub fn as_slab<'a>(&'a self) -> &'a SmallSlab { + pub fn as_slab(&self) -> &SmallSlab { self.ptr.as_ref() } } @@ -142,7 +142,7 @@ impl SmallSlab { let entry = first_free.add(i * fact); let next = first_free.add((i + 1) * fact); - (&mut *entry).0 = Some(NonNull::new_unchecked(next)); + (*entry).0 = Some(NonNull::new_unchecked(next)); } } diff --git a/src/aero_kernel/src/mem/vmalloc.rs b/src/aero_kernel/src/mem/vmalloc.rs index ced514b850d..e1ec8f7a50b 100644 --- a/src/aero_kernel/src/mem/vmalloc.rs +++ b/src/aero_kernel/src/mem/vmalloc.rs @@ -107,10 +107,10 @@ impl Vmalloc { .find(|(_, area)| area.protected.lock().size >= size_bytes)?; let mut area_p = area.protected.lock(); - let address = area_p.addr.clone(); + let address = area_p.addr; if area_p.size > size_bytes { - area_p.addr = area_p.addr + size_bytes; + area_p.addr += size_bytes; area_p.size -= size_bytes; } else { // NOTE: the area is has exactly the requested size, so we can remove it diff --git a/src/aero_kernel/src/modules.rs b/src/aero_kernel/src/modules.rs index 033851ed3e7..32a9bde5219 100644 --- a/src/aero_kernel/src/modules.rs +++ b/src/aero_kernel/src/modules.rs @@ -54,7 +54,7 @@ unsafe impl Sync for Module {} #[macro_export] macro_rules! module_init { ($init_function:expr, $ty:path) => { - use crate::modules::ModuleType; + use $crate::modules::ModuleType; #[used] #[link_section = ".kernel_modules.init"] diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index 7c955334855..57bddb482a6 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -71,7 +71,7 @@ impl Cache { } fn request(&mut self, ip: Ipv4Addr, packet: Packet) { - if let Some(_) = self.0.get_mut(&ip) { + if self.0.get_mut(&ip).is_some() { todo!() } else { let queue = alloc::vec![packet]; diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index bb4b3dabcab..20243ffbb6f 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -177,7 +177,7 @@ impl Packet { Packet:: { addr, len, - _phantom: PhantomData::default(), + _phantom: PhantomData, } } } diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs index c3d865355c2..b5e33abed38 100644 --- a/src/aero_kernel/src/net/tcp.rs +++ b/src/aero_kernel/src/net/tcp.rs @@ -75,7 +75,7 @@ impl PacketHeader for Packet { fn send(&self) { let ip_packet = self.downgrade(); - let mut packet = self.clone(); + let mut packet = *self; let header = packet.header_mut(); header.compute_checksum(ip_packet.header()); @@ -89,7 +89,7 @@ impl PacketHeader for Packet { let handlers = HANDLERS.read(); if let Some(handler) = handlers.get(&dest_port) { - handler.recv(self.clone()); + handler.recv(*self); } else { log::warn!("tcp: no handler registered for port {}", dest_port); } diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs index 6cb1894b0b9..faef257adc5 100644 --- a/src/aero_kernel/src/net/udp.rs +++ b/src/aero_kernel/src/net/udp.rs @@ -53,7 +53,7 @@ impl PacketUpHierarchy for Packet {} impl PacketHeader

for Packet { fn send(&self) { { - let mut this = self.clone(); + let mut this = *self; let header = this.header_mut(); header.compute_checksum(self.downgrade().header()); } @@ -68,7 +68,7 @@ impl PacketHeader
for Packet { let handlers = HANDLERS.read(); if let Some(handler) = handlers.get(&dest_port) { - handler.recv(self.clone()); + handler.recv(*self); } else { log::warn!("udp: no handler registered for port {}", dest_port); } diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 40b1a8079b3..1c04c262c76 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -177,8 +177,7 @@ struct Image { } fn parse_bmp_image(data: &[u8]) -> Image { - let header: &BmpHeader = - unsafe { core::mem::transmute(data as *const [u8] as *const u8 as *const BmpHeader) }; + let header: &BmpHeader = unsafe { &*(data.as_ptr().cast::()) }; // Check if the BMP image has the correct signature (ie. "BM"). assert!(&header.bf_signature == b"BM"); @@ -189,7 +188,7 @@ fn parse_bmp_image(data: &[u8]) -> Image { let mut image = mem::alloc_boxed_buffer::(header.bf_size as usize); let bytes = image.len(); - (&mut image[..bytes - header.bf_offset as usize]) + image[..bytes - header.bf_offset as usize] .copy_from_slice(&data[header.bf_offset as usize..header.bf_size as usize]); Image { @@ -378,7 +377,7 @@ impl<'a> Inner<'a> { } } - pub fn get_framebuffer<'b>(&'b mut self) -> &'b mut [u32] { + pub fn get_framebuffer(&mut self) -> &mut [u32] { self.buffer } @@ -409,14 +408,13 @@ impl<'a> Inner<'a> { let g = (alpha * (fg >> 8) as u8 as u32 + inv_alpha * (bg >> 8) as u8 as u32) / 256; let b = (alpha * fg as u8 as u32 + inv_alpha * bg as u8 as u32) / 256; - (0 << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF) + ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF) }; let theme_background = self.theme_background; - self.genloop(image, xstart, xend, ystart, yend, |_, __, c| { - let blend = color_blend(theme_background, c) as usize; - blend + self.genloop(image, xstart, xend, ystart, yend, |_, __, color| { + color_blend(theme_background, color) as usize }) } @@ -493,7 +491,7 @@ impl<'a> Inner<'a> { let item = self.map[i]; unsafe { - (&mut *item.unwrap()).char = *char; + (*item.unwrap()).char = *char; } } @@ -520,21 +518,19 @@ impl<'a> Inner<'a> { if self.map[i].is_some() { unsafe { - char = (&mut *self.map[i].unwrap()).char; + char = (*self.map[i].unwrap()).char; } } else { char = self.grid[i]; } - let temp = char.fg; - char.fg = char.bg; - char.bg = temp; + core::mem::swap(&mut char.fg, &mut char.bg); self.plot_char(self.x_pos, self.y_pos, char); if self.map[i].is_some() { unsafe { - self.grid[i] = (&mut *self.map[i].unwrap()).char; + self.grid[i] = (*self.map[i].unwrap()).char; } self.map[i] = None; @@ -544,7 +540,7 @@ impl<'a> Inner<'a> { fn plot_char(&mut self, x: usize, y: usize, char: Character) { let ch = match char.char { ch if ch.is_ascii() => ch, - _ => '?' as char, + _ => '?', }; if x >= self.cols || y >= self.rows { @@ -556,7 +552,7 @@ impl<'a> Inner<'a> { let glyph = &FONT[ch as usize]; // naming: fx, fy for font coordinates and gx, gy for glyph coordinates - for gy in 0..FONT_HEIGHT { + for (gy, glyph) in glyph.iter().enumerate().take(FONT_HEIGHT) { let fb_line = unsafe { self.buffer .as_mut_ptr() @@ -570,7 +566,7 @@ impl<'a> Inner<'a> { }; for gx in 0..FONT_WIDTH { - let draw = glyph[gy] & (1 << (FONT_WIDTH - gx - 1)) != 0; + let draw = *glyph & (1 << (FONT_WIDTH - gx - 1)) != 0; let color = if draw { char.fg } else if char.bg == u32::MAX { @@ -778,7 +774,7 @@ impl<'this> DebugRendy<'this> { performer: Processor::new(), }; - let image = cmdline.term_background.map(|a| parse_bmp_image(a)); + let image = cmdline.term_background.map(parse_bmp_image); this.generate_canvas(image); this.clear(true); @@ -934,11 +930,15 @@ pub fn _print(args: fmt::Arguments) { /// Clears the screen and if `mv` is set to true, resets the /// cursor position to `0`. pub fn clear_screen(mv: bool) { - DEBUG_RENDY.get().map(|l| l.lock_irq().clear(mv)); + if let Some(l) = DEBUG_RENDY.get() { + l.lock_irq().clear(mv) + } } pub fn backspace() { - DEBUG_RENDY.get().map(|l| l.lock_irq().backspace()); + if let Some(l) = DEBUG_RENDY.get() { + l.lock_irq().backspace() + } } /// Returns the terminal's resolution in the form of a `(horizontal_resolution, @@ -1003,9 +1003,9 @@ pub fn get_cursor_position() -> (usize, usize) { /// * If the provided `x` position is greator then the amount of columns. /// * If the provided `y` position is greator then the amount of rows. pub fn set_cursor_position(x: usize, y: usize) { - DEBUG_RENDY - .get() - .map(|l| l.lock_irq().set_cursor_position(x, y)); + if let Some(l) = DEBUG_RENDY.get() { + l.lock_irq().set_cursor_position(x, y) + } } /// Force-unlocks the rendy to prevent a deadlock. @@ -1013,7 +1013,9 @@ pub fn set_cursor_position(x: usize, y: usize) { /// ## Safety /// This method is not memory safe and should be only used when absolutely necessary. pub unsafe fn force_unlock() { - DEBUG_RENDY.get().map(|l| l.force_unlock()); + if let Some(l) = DEBUG_RENDY.get() { + l.force_unlock() + } } pub fn init(framebuffer_tag: &Framebuffer, cmdline: &CommandLine) { diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index ba52b765b4c..1611f3ece62 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -29,6 +29,7 @@ use crate::net::{Packet, PacketHeader, PacketTrait}; use crate::utils::sync::{Mutex, WaitQueue}; /// TCP Stream +#[derive(Default)] struct Stream { buffer: Vec, } @@ -51,12 +52,6 @@ impl Stream { } } -impl Default for Stream { - fn default() -> Self { - Self { buffer: Vec::new() } - } -} - #[derive(Default)] struct TransmissionControl { /// Sequence number of the next byte to be sent. @@ -252,8 +247,7 @@ impl INodeInterface for TcpSocket { let data = message_hdr .iovecs() .iter() - .map(|e| e.as_slice()) - .flatten() + .flat_map(|e| e.as_slice()) .copied() .collect::>(); diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index 5d97a9466d0..cdcdfb256c1 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -169,8 +169,7 @@ impl INodeInterface for UdpSocket { let data = message_hdr .iovecs() .iter() - .map(|e| e.as_slice()) - .flatten() + .flat_map(|e| e.as_slice()) .copied() .collect::>(); @@ -233,7 +232,7 @@ impl INodeInterface for UdpSocket { }; let mac_addr = net::default_device().mac(); - hwaddr.copy_from_slice(&mac_addr.0.as_slice()); + hwaddr.copy_from_slice(mac_addr.0.as_slice()); Ok(0) } diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 84298c266ae..0cb7fbe8e60 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -36,7 +36,7 @@ use crate::utils::sync::{Mutex, WaitQueue}; use super::SocketAddr; -fn path_from_unix_sock<'sock>(address: &'sock SocketAddrUnix) -> fs::Result<&'sock Path> { +fn path_from_unix_sock(address: &SocketAddrUnix) -> fs::Result<&Path> { // The abstract namespace socket allows the creation of a socket // connection which does not require a path to be created. let abstract_namespaced = address.path[0] == 0; @@ -219,7 +219,7 @@ impl UnixSocket { .ok_or(FileSystemError::NotSocket)?; a.inner.lock_irq().state = UnixSocketState::Connected(b.clone()); - b.inner.lock_irq().state = UnixSocketState::Connected(a.clone()); + b.inner.lock_irq().state = UnixSocketState::Connected(a); Ok(()) } @@ -414,7 +414,9 @@ impl INodeInterface for UnixSocket { let buffer = self.buffer.lock_irq(); let inner = self.inner.lock_irq(); - table.map(|e| e.insert(&self.wq)); + if let Some(e) = table { + e.insert(&self.wq) + } let mut events = PollFlags::OUT; @@ -425,8 +427,8 @@ impl INodeInterface for UnixSocket { return Ok(events); } } - - _ => {} + UnixSocketState::Disconnected => todo!(), + UnixSocketState::Connected(_) => todo!(), } if !buffer.is_empty() { diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 1c6d6498fd5..f0e9a81d149 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -484,7 +484,7 @@ pub fn epoll_ctl( match mode { EPOLL_CTL_ADD => { - epoll.add_event(fd, event.clone())?; + epoll.add_event(fd, *event)?; Ok(0) } @@ -494,7 +494,7 @@ pub fn epoll_ctl( } EPOLL_CTL_MOD => { - epoll.update_event(fd, event.clone())?; + epoll.update_event(fd, *event)?; Ok(0) } @@ -646,7 +646,7 @@ fn do_poll(fds: &mut [PollFd], timeout: Option<&TimeSpec>) -> Result Result { // Nothing to poll on. - if fds.len() == 0 { + if fds.is_empty() { return Ok(0); } diff --git a/src/aero_kernel/src/syscall/futex.rs b/src/aero_kernel/src/syscall/futex.rs index de97cfb92da..ce419cfb73b 100644 --- a/src/aero_kernel/src/syscall/futex.rs +++ b/src/aero_kernel/src/syscall/futex.rs @@ -72,7 +72,7 @@ impl FutexContainer { /// Returns the futex at the given key, or None if it doesn't exist. fn get(&self, key: PhysAddr) -> Option> { - self.futexes.lock_irq().get(&key).map(|e| e.clone()) + self.futexes.lock_irq().get(&key).cloned() } /// Tests the that the value at the futex word pointed to by `uaddr` still contains the @@ -126,7 +126,7 @@ static FUTEX_CONTAINER: Once = Once::new(); /// Returns a reference to the futex container; initializing if necessary. fn get_futex_container() -> &'static FutexContainer { - FUTEX_CONTAINER.call_once(|| FutexContainer::new()) + FUTEX_CONTAINER.call_once(FutexContainer::new) } #[syscall] diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index c940f320cd6..8e6b94b1d82 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -19,8 +19,8 @@ use crate::userland::scheduler; /// Creates a [`SocketAddr`] from the provided userland socket structure address. This /// is done by looking at the family field present in every socket address structure. fn socket_addr_from_addr<'sys>(address: VirtAddr) -> Result, SyscallError> { - let family = address.read_mut::()?.clone(); - Ok(SocketAddr::from_family(address, family)?) + let family = *address.read_mut::()?; + SocketAddr::from_family(address, family) } /// Connects the socket to the specified address. diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index ae61955f74c..7b3c3b67709 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -81,7 +81,7 @@ pub fn unwind_stack_trace() { for section in kernel_elf.section_iter() { if section.get_type() == Ok(ShType::SymTab) { let section_data = section - .get_data(&kernel_elf) + .get_data(kernel_elf) .expect("Failed to get kernel section data information"); if let SectionData::SymbolTable64(symtab) = section_data { @@ -136,7 +136,7 @@ pub fn unwind_stack_trace() { let st_size = data.size() as usize; if rip >= st_value && rip < (st_value + st_size) { - let mangled_name = data.get_name(&kernel_elf).unwrap_or(""); + let mangled_name = data.get_name(kernel_elf).unwrap_or(""); let demangled_name = rustc_demangle::demangle(mangled_name); name = Some(demangled_name); diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index a58f26f860c..2ba14f4e259 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -142,7 +142,7 @@ impl Scheduler { /// Lookup a task by ID #[inline] pub fn find_task(&self, task_id: TaskId) -> Option> { - self.tasks.0.lock().get(&task_id).map(|task| task.clone()) + self.tasks.0.lock().get(&task_id).cloned() } } @@ -175,7 +175,7 @@ fn scheduler_irq_handler(_stack: &mut InterruptStack) { /// Initialize the scheduler and set up the scheduler interrupt. pub fn init() { - SCHEDULER.call_once(|| Scheduler::new()).inner.init(); + SCHEDULER.call_once(Scheduler::new).inner.init(); let scheduler_vector = interrupts::allocate_vector(); interrupts::register_handler(scheduler_vector, scheduler_irq_handler); diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index bbbdc035939..0b999cee2f9 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -64,7 +64,7 @@ impl TaskQueue { } fn push_runnable(&mut self, task: Arc) { - debug_assert_eq!(task.link.is_linked(), false); // Make sure the task is not already linked + debug_assert!(!task.link.is_linked()); // Make sure the task is not already linked task.update_state(TaskState::Runnable); self.runnable.push_back(task); @@ -72,13 +72,13 @@ impl TaskQueue { fn push_dead(&mut self, task: Arc) { debug_assert_eq!(task.state(), TaskState::Runnable); - debug_assert_eq!(task.link.is_linked(), false); // Make sure the task is not already linked + debug_assert!(!task.link.is_linked()); // Make sure the task is not already linked self.dead.push_back(task); } fn push_deadline_awaiting(&mut self, task: Arc, duration: usize) { - debug_assert_eq!(task.link.is_linked(), false); // Make sure the task is not already linked + debug_assert!(!task.link.is_linked()); // Make sure the task is not already linked task.update_state(TaskState::AwaitingIo); task.set_sleep_duration(crate::arch::time::get_uptime_ticks() + duration); @@ -87,7 +87,7 @@ impl TaskQueue { } fn push_awaiting(&mut self, task: Arc) { - debug_assert_eq!(task.link.is_linked(), false); // Make sure the task is not already linked + debug_assert!(!task.link.is_linked()); // Make sure the task is not already linked task.update_state(TaskState::AwaitingIo); self.awaiting.push_back(task); @@ -109,11 +109,9 @@ impl RoundRobin { /// Creates a new instance of the round robin scheduler and return a /// reference-counting pointer to itself. pub fn new() -> Arc { - let this = Arc::new(Self { - queue: PerCpu::new(|| TaskQueue::new()), - }); - - this + Arc::new(Self { + queue: PerCpu::new(TaskQueue::new), + }) } fn sweep_dead(&self) { @@ -141,7 +139,7 @@ impl RoundRobin { if task.load_sleep_duration() <= time { let ptr = cursor.remove().unwrap(); - assert_eq!(ptr.link.is_linked(), false); + assert!(!ptr.link.is_linked()); ptr.update_state(TaskState::Runnable); ptr.set_sleep_duration(0); @@ -301,7 +299,7 @@ impl SchedulerInterface for RoundRobin { current_task.exit_status.call_once(|| status); - queue.push_dead(current_task.clone()); + queue.push_dead(current_task); queue.dead_wq.notify_all(); core::mem::drop(guard); diff --git a/src/aero_kernel/src/userland/signals.rs b/src/aero_kernel/src/userland/signals.rs index cde84ef2030..125c5e1e6b4 100644 --- a/src/aero_kernel/src/userland/signals.rs +++ b/src/aero_kernel/src/userland/signals.rs @@ -115,7 +115,7 @@ const IMMUTABLE_MASK: u64 = (1u64 << SIGSTOP) | (1u64 << SIGCONT) | (1u64 << SIG /// Returns [`true`] if the provided `signal` is overridable. fn can_override(signal: usize) -> bool { - IMMUTABLE_MASK.get_bit(signal) == false + !IMMUTABLE_MASK.get_bit(signal) } pub type SignalResult = core::result::Result; diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 5833c42221f..46e8333f9cd 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -120,7 +120,7 @@ impl Zombies { } fn add_zombie(&self, zombie: Arc) { - assert_eq!(zombie.link.is_linked(), false); + assert!(!zombie.link.is_linked()); assert_eq!(zombie.state(), TaskState::Zombie); let mut list = self.list.lock(); @@ -166,11 +166,11 @@ impl Zombies { // mlibc/abis/linux/wait.h (`W_EXITCODE`) match exit_status { ExitStatus::Normal(code) => { - *status = ((code as u32) << 8) | 0; + *status = (code as u32) << 8; } ExitStatus::Signal(signal) => { - *status = (0 << 8) | signal as u32; + *status = signal as u32; } } @@ -239,7 +239,7 @@ impl Task { message_queue: MessageQueue::new(), - tid: pid.clone(), + tid: pid, sid: AtomicUsize::new(pid.as_usize()), gid: AtomicUsize::new(pid.as_usize()), pid, @@ -285,7 +285,7 @@ impl Task { vm: Arc::new(Vm::new()), state: AtomicU8::new(TaskState::Runnable as _), - tid: pid.clone(), + tid: pid, gid: AtomicUsize::new(pid.as_usize()), sid: AtomicUsize::new(pid.as_usize()), pid, @@ -329,7 +329,7 @@ impl Task { sleep_duration: AtomicUsize::new(0), exit_status: Once::new(), - tid: pid.clone(), + tid: pid, sid: AtomicUsize::new(self.session_id()), gid: AtomicUsize::new(self.group_id()), pid, @@ -391,7 +391,7 @@ impl Task { sleep_duration: AtomicUsize::new(0), exit_status: Once::new(), - tid: pid.clone(), + tid: pid, sid: AtomicUsize::new(self.session_id()), gid: AtomicUsize::new(self.group_id()), pid, @@ -544,11 +544,11 @@ impl Task { pub(super) fn update_state(&self, state: TaskState) { if state == TaskState::Zombie { - for file in self.file_table.0.read().iter() { + self.file_table.0.read().iter().for_each(|file| { if let Some(a) = file { a.inode().close(*a.flags.read()); } - } + }); } // if state != TaskState::Runnable { diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index edee089bdb7..fbc0fe723e8 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -59,11 +59,11 @@ pub enum ElfLoadError { fn parse_elf_header<'header>(file: DirCacheItem) -> Result, ElfLoadError> { // 1. Read the ELF PT1 header: - let mut pt1_hdr_slice = Box::leak(mem::alloc_boxed_buffer::(ELF_PT1_SIZE)); + let pt1_hdr_slice = Box::leak(mem::alloc_boxed_buffer::(ELF_PT1_SIZE)); file.inode() - .read_at(0, &mut pt1_hdr_slice) - .map_err(|err| ElfLoadError::IOError(err))?; + .read_at(0, pt1_hdr_slice) + .map_err(ElfLoadError::IOError)?; let pt1_header: &'header _ = unsafe { &*(pt1_hdr_slice.as_ptr() as *const HeaderPt1) }; @@ -75,11 +75,11 @@ fn parse_elf_header<'header>(file: DirCacheItem) -> Result, ElfL let pt2_header = match pt1_header.class() { // 3. Read the 64-bit PT2 header: Class::SixtyFour => { - let mut pt2_hdr_slice = Box::leak(mem::alloc_boxed_buffer::(ELF_PT2_64_SIZE)); + let pt2_hdr_slice = Box::leak(mem::alloc_boxed_buffer::(ELF_PT2_64_SIZE)); file.inode() - .read_at(ELF_PT1_SIZE, &mut pt2_hdr_slice) - .map_err(|err| ElfLoadError::IOError(err))?; + .read_at(ELF_PT1_SIZE, pt2_hdr_slice) + .map_err(ElfLoadError::IOError)?; let pt2_header_ptr = pt2_hdr_slice.as_ptr(); let pt2_header: &'header _ = unsafe { &*(pt2_header_ptr as *const HeaderPt2_) }; @@ -119,11 +119,11 @@ fn parse_program_header<'pheader>( let size = pt2.ph_entry_size() as usize; // 2. Read the 64-bit program header: - let mut phdr_buffer = Box::leak(mem::alloc_boxed_buffer::(size)); + let phdr_buffer = Box::leak(mem::alloc_boxed_buffer::(size)); file.inode() - .read_at(start, &mut phdr_buffer) - .map_err(|err| ElfLoadError::IOError(err))?; + .read_at(start, phdr_buffer) + .map_err(ElfLoadError::IOError)?; let phdr_ptr = phdr_buffer.as_ptr(); @@ -153,7 +153,7 @@ struct Shebang { impl Shebang { fn new(path: String, argument: String) -> Result { let path = Path::new(&path); - let interpreter = fs::lookup_path(path).map_err(|err| ElfLoadError::IOError(err))?; + let interpreter = fs::lookup_path(path).map_err(ElfLoadError::IOError)?; Ok(Self { interpreter, @@ -169,9 +169,9 @@ fn contains_shebang(bin: DirCacheItem) -> Result { bin.inode() .read_at(0, shebang) - .map_err(|err| ElfLoadError::IOError(err))?; + .map_err(ElfLoadError::IOError)?; - Ok(shebang[0] == '#' as u8 && shebang[1] == '!' as u8) + Ok(shebang[0] == b'#' && shebang[1] == b'!') } fn parse_shebang(bin: DirCacheItem) -> Result, ElfLoadError> { @@ -187,9 +187,7 @@ fn parse_shebang(bin: DirCacheItem) -> Result, ElfLoadError> { let read_at_index = |idx: usize| -> Result { let c = &mut [0u8; 1]; - bin.inode() - .read_at(idx, c) - .map_err(|err| ElfLoadError::IOError(err))?; + bin.inode().read_at(idx, c).map_err(ElfLoadError::IOError)?; Ok(c[0] as char) }; @@ -559,7 +557,7 @@ impl Mapping { // and they are just allocated on faults. So there might be a chance where we // try to unmap a region that is mapped but not actually allocated. Err(UnmapError::PageNotMapped) => Ok(()), - Err(err) => return Err(err), + Err(err) => Err(err), } }; @@ -578,8 +576,8 @@ impl Mapping { }); let new_mapping = Mapping { - protection: self.protection.clone(), - flags: self.flags.clone(), + protection: self.protection, + flags: self.flags, start_addr: end, end_addr: end + (self.end_addr - end), file: new_file, @@ -689,7 +687,7 @@ impl VmProtected { let mut address_space = AddressSpace::this(); let mut offset_table = address_space.offset_page_table(); - let result = match (is_private, is_annon) { + match (is_private, is_annon) { (true, true) => { map.handle_pf_private_anon(&mut offset_table, reason, accessed_address) } @@ -699,9 +697,7 @@ impl VmProtected { } (false, true) => unreachable!("shared and anonymous mapping"), - }; - - result + } } else { log::trace!("mapping not found for address: {:#x}", accessed_address); @@ -722,12 +718,10 @@ impl VmProtected { return None; } else if map.start_addr < address { cursor.move_next(); + } else if address + size > map.start_addr { + return None; } else { - if address + size > map.start_addr { - return None; - } else { - break; - } + break; } } @@ -754,27 +748,25 @@ impl VmProtected { if map.start_addr < address { cursor.move_next(); - } else { - if let Some(pmap) = cursor.peek_prev() { - let start = core::cmp::max(address, pmap.end_addr); - let hole = map_start.as_u64() - start.as_u64(); - - if hole as usize >= size { - return Some((start, cursor)); - } else { - // The hole is too small - cursor.move_next(); - } + } else if let Some(pmap) = cursor.peek_prev() { + let start = core::cmp::max(address, pmap.end_addr); + let hole = map_start.as_u64() - start.as_u64(); + + if hole as usize >= size { + return Some((start, cursor)); } else { - let hole = map_start.as_u64() - address.as_u64(); - - return if hole as usize >= size { - Some((address, cursor)) - } else { - // The hole is too small - None - }; + // The hole is too small + cursor.move_next(); } + } else { + let hole = map_start.as_u64() - address.as_u64(); + + return if hole as usize >= size { + Some((address, cursor)) + } else { + // The hole is too small + None + }; } } @@ -791,7 +783,7 @@ impl VmProtected { file: Option, ) -> Option { // Offset is required to be a multiple of page size. - if (offset as u64 & Size4KiB::SIZE - 1) != 0 { + if (offset as u64 & (Size4KiB::SIZE - 1)) != 0 { return None; } @@ -822,26 +814,24 @@ impl VmProtected { if address == VirtAddr::zero() { // We need to find a free mapping above 0x7000_0000_0000. self.find_any_above(VirtAddr::new(0x7000_0000_0000), size_aligned as _) - } else { - if flags.contains(MMapFlags::MAP_FIXED) { - // SAFETY: The provided address should be page aligned. - if !address.is_aligned(Size4KiB::SIZE) { - return None; - } - - // SAFETY: The provided (address + size) should be less then - // the userland max address. - if (address + size_aligned) > userland_last_address() { - return None; - } + } else if flags.contains(MMapFlags::MAP_FIXED) { + // SAFETY: The provided address should be page aligned. + if !address.is_aligned(Size4KiB::SIZE) { + return None; + } - self.munmap(address, size_aligned as usize); // Unmap any existing mappings. - self.find_fixed_mapping(address, size_aligned as _) - } else { - self.find_any_above(address, size) + // SAFETY: The provided (address + size) should be less then + // the userland max address. + if (address + size_aligned) > userland_last_address() { + return None; } + + self.munmap(address, size_aligned as usize); // Unmap any existing mappings. + self.find_fixed_mapping(address, size_aligned as _) + } else { + self.find_any_above(address, size) } - .and_then(|(addr, mut cursor)| { + .map(|(addr, mut cursor)| { // Merge same mappings instead of creating a new one. if let Some(prev) = cursor.peek_prev() { if prev.end_addr == addr @@ -851,7 +841,7 @@ impl VmProtected { { prev.end_addr = addr + size_aligned; - return Some(addr); + return addr; } } @@ -866,7 +856,7 @@ impl VmProtected { refresh_flags: true, }); - Some(addr) + addr }) } @@ -893,7 +883,10 @@ impl VmProtected { } largv.push(bin.absolute_path_str().as_bytes()); - argv.map(|argv| largv.extend(&argv.inner[1..])); + + if let Some(argv) = argv { + largv.extend(&argv.inner[1..]) + } return self.load_bin(shebang.interpreter, Some(largv), envv); } @@ -1085,47 +1078,45 @@ impl VmProtected { while let Some(map) = cursor.current() { if map.end_addr <= start { cursor.move_next(); + } else if end <= map.start_addr || start >= map.end_addr { + break; + } else if start > map.start_addr && end < map.end_addr { + // The address we want to unmap is in the middle of the region. So we + // will need to split the mapping and update the end address accordingly. + let (left, mut mid, right) = map.split(start, end); + mid.protection = prot; + + cursor.insert_after(right); + cursor.insert_after(mid); + cursor.insert_after(left); + cursor.remove_current(); + break; + } else if start <= map.start_addr && end >= map.end_addr { + // full + map.protection = prot; + cursor.move_next(); + } else if start <= map.start_addr && end < map.end_addr { + // start + let mut mapping = map.clone(); + mapping.end_addr = end; + mapping.protection = prot; + + map.start_addr = end; + cursor.insert_before(mapping); + break; } else { - if end <= map.start_addr || start >= map.end_addr { - break; - } else if start > map.start_addr && end < map.end_addr { - // The address we want to unmap is in the middle of the region. So we - // will need to split the mapping and update the end address accordingly. - let (left, mut mid, right) = map.split(start, end); - mid.protection = prot; - - cursor.insert_after(right); - cursor.insert_after(mid); - cursor.insert_after(left); - cursor.remove_current(); - break; - } else if start <= map.start_addr && end >= map.end_addr { - // full - map.protection = prot; - cursor.move_next(); - } else if start <= map.start_addr && end < map.end_addr { - // start - let mut mapping = map.clone(); - mapping.end_addr = end; - mapping.protection = prot; - - map.start_addr = end; - cursor.insert_before(mapping); - break; - } else { - // end - let mut mapping = map.clone(); - mapping.start_addr = end; - mapping.protection = prot; + // end + let mut mapping = map.clone(); + mapping.start_addr = end; + mapping.protection = prot; - map.end_addr = start; - cursor.insert_after(mapping); - cursor.move_next(); - } + map.end_addr = start; + cursor.insert_after(mapping); + cursor.move_next(); } } - return true; + true } fn fork_from(&mut self, parent: &Vm) { diff --git a/src/aero_kernel/src/utils/buffer.rs b/src/aero_kernel/src/utils/buffer.rs index 894fd42e066..4b81e700ea9 100644 --- a/src/aero_kernel/src/utils/buffer.rs +++ b/src/aero_kernel/src/utils/buffer.rs @@ -116,7 +116,7 @@ impl + AsMut<[u8]>> RingBuffer { } } - return ""; + "" } /// Appends the provided byte to the ring buffer. @@ -144,8 +144,8 @@ mod tests { fn partially_overwritten_buffer() { let mut buf = RingBuffer::new([0u8; 16]); write!(buf, "\nfirst\n").unwrap(); - write!(buf, "second\n").unwrap(); - write!(buf, "third\n").unwrap(); + writeln!(buf, "second").unwrap(); + writeln!(buf, "third").unwrap(); assert_eq!(buf.extract(), "st\nsecond\nthird\n"); } diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index e3f919e2ed4..96771c17a5b 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -147,7 +147,7 @@ impl PerCpu { #[inline] pub fn as_mut_ptr(&self) -> *mut T { - unsafe { (&mut *self.data.get()).as_mut() } + unsafe { (*self.data.get()).as_mut() } } #[inline] @@ -163,7 +163,7 @@ impl PerCpu { pub fn slice_into_bytes(slice: &[T]) -> &[u8] { let data = slice.as_ptr() as *const u8; - let size = slice.len() * core::mem::size_of::(); + let size = core::mem::size_of_val(slice); unsafe { core::slice::from_raw_parts(data, size) } } diff --git a/src/aero_kernel/src/utils/sync.rs b/src/aero_kernel/src/utils/sync.rs index 332c50dfb19..8adfd2b0459 100644 --- a/src/aero_kernel/src/utils/sync.rs +++ b/src/aero_kernel/src/utils/sync.rs @@ -148,10 +148,7 @@ impl BMutex { if let Some(guard) = self.spin.inner.try_lock() { self.wq.remove(task); - return BMutexGuard { - guard, - mutex: &self, - }; + return BMutexGuard { guard, mutex: self }; } let _ = scheduler::get_scheduler().inner.await_io(); diff --git a/src/aero_proc/src/downcastable.rs b/src/aero_proc/src/downcastable.rs index abe490bd032..9de451fb531 100644 --- a/src/aero_proc/src/downcastable.rs +++ b/src/aero_proc/src/downcastable.rs @@ -10,13 +10,11 @@ pub fn parse(_: TokenStream, item: TokenStream) -> TokenStream { let generics = &parsed_trait.generics; // `auto` and `unsafe` traits are not allowed: - parsed_trait - .auto_token - .map(|e| emit_error!(e.span(), "`auto` traits are not downcastable")); - - parsed_trait - .unsafety - .map(|e| emit_error!(e.span(), "`unsafe` traits are not downcastable")); + if let Some(token) = parsed_trait.auto_token { + emit_error!(token.span(), "`auto` traits are not downcastable") + } else if let Some(token) = parsed_trait.unsafety { + emit_error!(token.span(), "`unsafe` traits are not downcastable") + } let super_traits = parsed_trait.supertraits.clone(); diff --git a/src/aero_proc/src/syscall.rs b/src/aero_proc/src/syscall.rs index 80d3ba2434d..6f8751e5106 100644 --- a/src/aero_proc/src/syscall.rs +++ b/src/aero_proc/src/syscall.rs @@ -70,17 +70,13 @@ pub fn parse(attr: TokenStream, item: TokenStream) -> TokenStream { let parsed_fn = syn::parse_macro_input!(item as syn::ItemFn); let signature = &parsed_fn.sig; - signature - .constness - .map(|e| emit_error!(e.span(), "syscall functions cannot be `const`")); - - signature - .asyncness - .map(|e| emit_error!(e.span(), "syscall functions cannot be `async`")); - - signature - .unsafety - .map(|e| emit_error!(e.span(), "syscalls functions cannot be `unsafe`")); + if let Some(token) = signature.constness { + emit_error!(token.span(), "syscall functions cannot be `const`"); + } else if let Some(token) = signature.asyncness { + emit_error!(token.span(), "syscall functions cannot be `async`"); + } else if let Some(token) = signature.unsafety { + emit_error!(token.span(), "syscall functions cannot be `unsafe`"); + } let generics = &signature.generics; @@ -269,81 +265,77 @@ fn process_call_args(args: &Punctuated) -> Vec { let mut result = Vec::new(); for arg in args { - match arg { - FnArg::Typed(arg) => match arg.pat.as_ref() { - Pat::Ident(pat) => { - let ty = &arg.ty; - let ident = &pat.ident; - - if let Some(arg_type) = determine_arg_type(ty) { - let data_ident = Ident::new(&format!("{}_data", ident), Span::call_site()); - let len_ident = Ident::new(&format!("{}_len", ident), Span::call_site()); - - match arg_type { - ArgType::Slice(is_mut) => { - let slice_expr: Expr = if is_mut { - syn::parse_quote! { - crate::utils::validate_slice_mut(#data_ident as *mut _, #len_ident)? - } - } else { - syn::parse_quote! { - crate::utils::validate_slice(#data_ident as *const _, #len_ident)? - } - }; - - result.push(slice_expr); - } - ArgType::Array(is_mut) => { - let array_expr: Expr = if is_mut { - syn::parse_quote! { - crate::utils::validate_array_mut(#data_ident as *mut _)? - } - } else { - unimplemented!() - }; - - result.push(array_expr); - } - ArgType::Pointer(is_mut) => { - let ptr_expr: Expr = if is_mut { - syn::parse_quote!(#ident as *mut _) - } else { - syn::parse_quote!(#ident as *const _) - }; - - result.push(ptr_expr); - } - ArgType::Reference(is_mut) => { - let ref_expr: Expr = if is_mut { - syn::parse_quote!({ - crate::utils::validate_mut_ptr(#ident as *mut _)? - }) - } else { - syn::parse_quote!({ - crate::utils::validate_ptr(#ident as *const _)? - }) - }; - - result.push(ref_expr); - } - ArgType::String => result.push(syn::parse_quote! { - crate::utils::validate_str(#data_ident as *const _, #len_ident)? - }), - ArgType::Path => result.push(syn::parse_quote! { - { - let string = crate::utils::validate_str(#data_ident as *const _, #len_ident)?; - let path = Path::new(string); - path - } - }), - } - } else { - result.push(syn::parse_quote!(#ident)); - } + if let FnArg::Typed(arg) = arg { + if let Pat::Ident(pat) = arg.pat.as_ref() { + let ty = &arg.ty; + let ident = &pat.ident; + + if let Some(arg_type) = determine_arg_type(ty) { + let data_ident = Ident::new(&format!("{}_data", ident), Span::call_site()); + let len_ident = Ident::new(&format!("{}_len", ident), Span::call_site()); + + match arg_type { + ArgType::Slice(is_mut) => { + let slice_expr: Expr = if is_mut { + syn::parse_quote! { + crate::utils::validate_slice_mut(#data_ident as *mut _, #len_ident)? + } + } else { + syn::parse_quote! { + crate::utils::validate_slice(#data_ident as *const _, #len_ident)? + } + }; + + result.push(slice_expr); + } + ArgType::Array(is_mut) => { + let array_expr: Expr = if is_mut { + syn::parse_quote! { + crate::utils::validate_array_mut(#data_ident as *mut _)? + } + } else { + unimplemented!() + }; + + result.push(array_expr); + } + ArgType::Pointer(is_mut) => { + let ptr_expr: Expr = if is_mut { + syn::parse_quote!(#ident as *mut _) + } else { + syn::parse_quote!(#ident as *const _) + }; + + result.push(ptr_expr); + } + ArgType::Reference(is_mut) => { + let ref_expr: Expr = if is_mut { + syn::parse_quote!({ + crate::utils::validate_mut_ptr(#ident as *mut _)? + }) + } else { + syn::parse_quote!({ + crate::utils::validate_ptr(#ident as *const _)? + }) + }; + + result.push(ref_expr); + } + ArgType::String => result.push(syn::parse_quote! { + crate::utils::validate_str(#data_ident as *const _, #len_ident)? + }), + ArgType::Path => result.push(syn::parse_quote! { + { + let string = crate::utils::validate_str(#data_ident as *const _, #len_ident)?; + let path = Path::new(string); + path + } + }), + } + } else { + result.push(syn::parse_quote!(#ident)); } - _ => {} - }, - _ => {} + } } } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 0a9aa5c3703..48f56c348cf 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -101,6 +101,7 @@ bitflags::bitflags! { #[derive(Copy, Clone, PartialEq, Debug)] #[repr(isize)] +#[allow(clippy::enum_clike_unportable_variant)] pub enum SyscallError { EDOM = 1, EILSEQ = 2, @@ -498,24 +499,12 @@ pub fn sys_open(path: &str, mode: OpenFlags) -> Result { } pub fn sys_write(fd: usize, buf: &[u8]) -> Result { - let value = syscall3( - prelude::SYS_WRITE, - fd as usize, - buf.as_ptr() as usize, - buf.len(), - ); - + let value = syscall3(prelude::SYS_WRITE, fd, buf.as_ptr() as usize, buf.len()); isize_as_syscall_result(value as _) } pub fn sys_read(fd: usize, buf: &mut [u8]) -> Result { - let value = syscall3( - prelude::SYS_READ, - fd as usize, - buf.as_mut_ptr() as usize, - buf.len(), - ); - + let value = syscall3(prelude::SYS_READ, fd, buf.as_mut_ptr() as usize, buf.len()); isize_as_syscall_result(value as _) } @@ -537,7 +526,7 @@ pub fn sys_getcwd(buf: &mut [u8]) -> Result { pub fn sys_getdents(fd: usize, buf: &mut [u8]) -> Result { let value = syscall3( prelude::SYS_GETDENTS, - fd as usize, + fd, buf.as_mut_ptr() as usize, buf.len(), ); @@ -551,7 +540,7 @@ pub fn sys_fork() -> Result { } pub fn sys_munmap(address: usize, size: usize) -> Result { - let value = syscall2(prelude::SYS_MUNMAP, address as usize, size as usize); + let value = syscall2(prelude::SYS_MUNMAP, address, size); isize_as_syscall_result(value as _) } @@ -621,7 +610,7 @@ pub fn sys_access(fd: usize, path: &str) -> Result { pub fn sys_waitpid(pid: usize, status: &mut u32, flags: usize) -> Result { let value = syscall3( prelude::SYS_WAITPID, - pid as usize, + pid, status as *mut u32 as usize, flags, ); @@ -630,7 +619,7 @@ pub fn sys_waitpid(pid: usize, status: &mut u32, flags: usize) -> Result Result { - let value = syscall3(prelude::SYS_IOCTL, fd as usize, command, arg); + let value = syscall3(prelude::SYS_IOCTL, fd, command, arg); isize_as_syscall_result(value as _) } @@ -872,11 +861,11 @@ pub fn sys_sigaction( prelude::SYS_SIGACTION, sig, sigact - .and_then(|f| Some(f as *const signal::SigAction as usize)) + .map(|f| f as *const signal::SigAction as usize) .unwrap_or(0), sys_sigreturn as usize, old_sigaction - .and_then(|f| Some(f as *mut signal::SigAction as usize)) + .map(|f| f as *mut signal::SigAction as usize) .unwrap_or(0), ); @@ -966,21 +955,21 @@ bitflags::bitflags! { const S_IFLNK = 0x0A000; const S_IFSOCK = 0x0C000; - const S_IRWXU = 0700; - const S_IRUSR = 0400; - const S_IWUSR = 0200; - const S_IXUSR = 0100; - const S_IRWXG = 070; - const S_IRGRP = 040; - const S_IWGRP = 020; - const S_IXGRP = 010; - const S_IRWXO = 07; - const S_IROTH = 04; - const S_IWOTH = 02; - const S_IXOTH = 01; - const S_ISUID = 04000; - const S_ISGID = 02000; - const S_ISVTX = 01000; + const S_IRWXU = 0o700; + const S_IRUSR = 0o400; + const S_IWUSR = 0o200; + const S_IXUSR = 0o100; + const S_IRWXG = 0o70; + const S_IRGRP = 0o40; + const S_IWGRP = 0o20; + const S_IXGRP = 0o10; + const S_IRWXO = 0o7; + const S_IROTH = 0o4; + const S_IWOTH = 0o2; + const S_IXOTH = 0o1; + const S_ISUID = 0o4000; + const S_ISGID = 0o2000; + const S_ISVTX = 0o1000; const S_IREAD = Self::S_IRUSR.bits(); const S_IWRITE = Self::S_IWUSR.bits(); diff --git a/src/aero_syscall/src/signal.rs b/src/aero_syscall/src/signal.rs index aa8a4ea96ef..3d6a2c4c4ef 100644 --- a/src/aero_syscall/src/signal.rs +++ b/src/aero_syscall/src/signal.rs @@ -64,19 +64,14 @@ pub const SIG_ERR: i64 = -1; // error pub const SIG_DFL: i64 = 0; // default pub const SIG_IGN: i64 = 1; // ignore -#[derive(Debug, Copy, Clone, PartialEq)] +#[derive(Debug, Default, Copy, Clone, PartialEq)] pub enum SignalHandler { Ignore, + #[default] Default, Handle(extern "C" fn(usize)), } -impl Default for SignalHandler { - fn default() -> Self { - SignalHandler::Default - } -} - impl From for SignalHandler { fn from(v: u64) -> Self { let v = v as i64; @@ -105,6 +100,7 @@ impl From for u64 { match h { SignalHandler::Ignore => SIG_IGN as u64, SignalHandler::Default => SIG_DFL as u64, + #[allow(clippy::fn_to_numeric_cast)] SignalHandler::Handle(f) => f as u64, } } From b6d7c66611a8d2973cd0ccb7c6d73bebb22716ea Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 21 May 2023 17:07:11 +1000 Subject: [PATCH 220/368] utils: fix `find_first_unset` in bitmap Signed-off-by: Anhad Singh --- src/aero_kernel/src/utils/bitmap.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/aero_kernel/src/utils/bitmap.rs b/src/aero_kernel/src/utils/bitmap.rs index 2483504c378..3b1e7fe72f1 100644 --- a/src/aero_kernel/src/utils/bitmap.rs +++ b/src/aero_kernel/src/utils/bitmap.rs @@ -100,20 +100,18 @@ impl Bitmap { for (i, block) in self.bitmap.iter().enumerate() { let mut block_value = *block; - if block_value == 0 { - return Some(i * BLOCK_BITS); - } + if block_value != usize::MAX { + let mut bit = 0; - let mut bit = 0; + // Loop through the bits in the block and find + // the first unset bit. + while block_value.get_bit(0) { + block_value >>= 1; + bit += 1; + } - // Loop through the bits in the block and find - // the first unset bit. - while block_value.get_bit(0) { - block_value >>= 1; - bit += 1; + return Some((i * BLOCK_BITS) + bit); } - - return Some((i * BLOCK_BITS) + bit); } None From 44588fb625faf2474fbaceea84513c33ca9f2d54 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 21 May 2023 17:41:25 +1000 Subject: [PATCH 221/368] kernel: more clippy fixes Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/apic.rs | 4 +- src/aero_kernel/src/drivers/block/ahci.rs | 92 +++++++++---------- .../src/drivers/block/ide/channel.rs | 12 +-- src/aero_kernel/src/drivers/block/nvme/mod.rs | 4 +- src/aero_kernel/src/drivers/mouse.rs | 16 ++-- src/aero_kernel/src/drivers/pci.rs | 8 +- src/aero_kernel/src/drivers/pty.rs | 7 +- src/aero_kernel/src/logger.rs | 2 +- src/aero_kernel/src/main.rs | 1 + src/aero_kernel/src/mem/paging/mapper.rs | 36 +++----- src/aero_kernel/src/net/checksum.rs | 10 +- src/aero_kernel/src/rendy.rs | 4 +- src/aero_kernel/src/socket/unix.rs | 18 ++-- 13 files changed, 93 insertions(+), 121 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/apic.rs b/src/aero_kernel/src/arch/x86_64/apic.rs index 32a485ab910..287e9fe9acb 100644 --- a/src/aero_kernel/src/arch/x86_64/apic.rs +++ b/src/aero_kernel/src/arch/x86_64/apic.rs @@ -383,12 +383,12 @@ pub fn io_apic_set_redirect(vec: u8, gsi: u32, flags: u16, status: i32) { let mut redirect = 0x00; // Active high(0) or low(1) - if flags & 2 == 1 { + if (flags & (1 << 1)) != 0 { redirect |= (1 << 13) as u8; } // Edge(0) or level(1) triggered - if flags & 8 == 1 { + if (flags & (1 << 3)) != 0 { redirect |= (1 << 15) as u8; } diff --git a/src/aero_kernel/src/drivers/block/ahci.rs b/src/aero_kernel/src/drivers/block/ahci.rs index 29c554612e8..d8ac56d497f 100644 --- a/src/aero_kernel/src/drivers/block/ahci.rs +++ b/src/aero_kernel/src/drivers/block/ahci.rs @@ -278,9 +278,9 @@ impl DmaRequest { match self.command { DmaCommand::Read => { if lba48 { - AtaCommand::AtaCommandReadDmaExt + AtaCommand::ReadDmaExt } else { - AtaCommand::AtaCommandReadDma + AtaCommand::ReadDma } } } @@ -295,65 +295,59 @@ impl DmaRequest { #[derive(Debug, PartialEq, Copy, Clone)] #[repr(u8)] pub enum AtaCommand { - AtaCommandWriteDma = 0xCA, - AtaCommandWriteDmaQueued = 0xCC, - AtaCommandWriteMultiple = 0xC5, - AtaCommandWriteSectors = 0x30, + WriteDma = 0xCA, + WriteDmaQueued = 0xCC, + WriteMultiple = 0xC5, + WriteSectors = 0x30, - AtaCommandReadDma = 0xC8, - AtaCommandReadDmaQueued = 0xC7, - AtaCommandReadMultiple = 0xC4, - AtaCommandReadSectors = 0x20, + ReadDma = 0xC8, + ReadDmaQueued = 0xC7, + ReadMultiple = 0xC4, + ReadSectors = 0x20, - AtaCommandWriteDmaExt = 0x35, - AtaCommandWriteDmaQueuedExt = 0x36, - AtaCommandWriteMultipleExt = 0x39, - AtaCommandWriteSectorsExt = 0x34, + WriteDmaExt = 0x35, + WriteDmaQueuedExt = 0x36, + WriteMultipleExt = 0x39, + WriteSectorsExt = 0x34, - AtaCommandReadDmaExt = 0x25, - AtaCommandReadDmaQueuedExt = 0x26, - AtaCommandReadMultipleExt = 0x29, - AtaCommandReadSectorsExt = 0x24, + ReadDmaExt = 0x25, + ReadDmaQueuedExt = 0x26, + ReadMultipleExt = 0x29, + ReadSectorsExt = 0x24, - AtaCommandPacket = 0xA0, - AtaCommandDeviceReset = 0x08, + Packet = 0xA0, + DeviceReset = 0x08, - AtaCommandService = 0xA2, - AtaCommandNop = 0, - AtaCommandNopNopAutopoll = 1, + Service = 0xA2, + Nop = 0, + NopNopAutopoll = 1, - AtaCommandGetMediaStatus = 0xDA, + GetMediaStatus = 0xDA, - AtaCommandFlushCache = 0xE7, - AtaCommandFlushCacheExt = 0xEA, + FlushCache = 0xE7, + FlushCacheExt = 0xEA, - AtaCommandDataSetManagement = 0x06, + DataSetManagement = 0x06, - AtaCommandMediaEject = 0xED, + MediaEject = 0xED, - AtaCommandIdentifyPacketDevice = 0xA1, - AtaCommandIdentifyDevice = 0xEC, + IdentifyPacketDevice = 0xA1, + IdentifyDevice = 0xEC, - AtaCommandSetFeatures = 0xEF, - AtaCommandSetFeaturesEnableReleaseInt = 0x5D, - AtaCommandSetFeaturesEnableServiceInt = 0x5E, - AtaCommandSetFeaturesDisableReleaseInt = 0xDD, - AtaCommandSetFeaturesDisableServiceInt = 0xDE, + SetFeatures = 0xEF, + SetFeaturesEnableReleaseInt = 0x5D, + SetFeaturesEnableServiceInt = 0x5E, + SetFeaturesDisableReleaseInt = 0xDD, + SetFeaturesDisableServiceInt = 0xDE, } impl AtaCommand { pub fn is_lba48(&self) -> bool { - match self { - AtaCommand::AtaCommandReadDmaExt | AtaCommand::AtaCommandWriteDmaExt => true, - _ => false, - } + matches!(self, AtaCommand::ReadDmaExt | AtaCommand::WriteDmaExt) } pub fn is_write(&self) -> bool { - match self { - AtaCommand::AtaCommandWriteDmaExt | AtaCommand::AtaCommandWriteDma => true, - _ => false, - } + matches!(self, AtaCommand::WriteDmaExt | AtaCommand::WriteDma) } } @@ -655,8 +649,7 @@ impl HbaPort { let header = self.cmd_header_at(slot); let mut flags = header.flags.get(); - if command == AtaCommand::AtaCommandWriteDmaExt || command == AtaCommand::AtaCommandWriteDma - { + if command == AtaCommand::WriteDmaExt || command == AtaCommand::WriteDma { flags.insert(HbaCmdHeaderFlags::W); // If its a write command add the write flag. } else { flags.remove(HbaCmdHeaderFlags::W); // If its a read command remove the write flag. @@ -932,11 +925,10 @@ struct AhciDriver { impl PciDeviceHandle for AhciDriver { fn handles(&self, vendor_id: Vendor, device_id: DeviceType) -> bool { - match (vendor_id, device_id) { - (Vendor::Intel, DeviceType::SataController) => true, - - _ => false, - } + matches!( + (vendor_id, device_id), + (Vendor::Intel, DeviceType::SataController) + ) } fn start(&self, header: &PciHeader, _offset_table: &mut OffsetPageTable) { diff --git a/src/aero_kernel/src/drivers/block/ide/channel.rs b/src/aero_kernel/src/drivers/block/ide/channel.rs index dd2710dafc1..a243b58faf1 100644 --- a/src/aero_kernel/src/drivers/block/ide/channel.rs +++ b/src/aero_kernel/src/drivers/block/ide/channel.rs @@ -121,7 +121,7 @@ impl IdeChannelData { self.base.set_drive_select(slave, false, 0); delay(1000); - self.base.set_command(AtaCommand::AtaCommandIdentifyDevice); + self.base.set_command(AtaCommand::IdentifyDevice); delay(1000); let status = self.base.status(); @@ -146,15 +146,7 @@ impl IdeChannelData { let lm = self.base.lba_mid(); let lh = self.base.lba_hi(); - match (lm, lh) { - (0x0, 0x0) => { - return true; - } - - _ => {} - } - - false + lm == 0 && lh == 0 } pub fn setup_prdt(&mut self) { diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 383570751f2..48c69103f12 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -103,7 +103,7 @@ impl Capability { #[repr(u32)] enum CommandSet { - NVM = 0b000, + Nvm = 0b000, } const_assert_eq!(core::mem::size_of::(), 4); @@ -329,7 +329,7 @@ impl<'a> Controller<'a> { registers.acq.set(admin.completion_addr().as_u64()); // Set the controller configuration and admin queue base addresses. - registers.cc.set_css(CommandSet::NVM); + registers.cc.set_css(CommandSet::Nvm); registers.cc.set_ams(ArbitrationMechanism::RoundRobin); registers.cc.set_iosqes(6); // 64 bytes registers.cc.set_iocqes(4); // 16 bytes diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs index 496c17bfab1..eadf67f6eca 100644 --- a/src/aero_kernel/src/drivers/mouse.rs +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -29,14 +29,14 @@ bitflags::bitflags! { /// Represents the flags currently set for the mouse. #[derive(Default)] pub struct MouseFlags: u8 { - const LEFT_BUTTON = 0b00000001; - const RIGHT_BUTTON = 0b00000010; - const MIDDLE_BUTTON = 0b00000100; - const ALWAYS_ONE = 0b00001000; - const X_SIGN = 0b00010000; - const Y_SIGN = 0b00100000; - const X_OVERFLOW = 0b01000000; - const Y_OVERFLOW = 0b10000000; + const LEFT_BUTTON = 0b0000_0001; + const RIGHT_BUTTON = 0b0000_0010; + const MIDDLE_BUTTON = 0b0000_0100; + const ALWAYS_ONE = 0b0000_1000; + const X_SIGN = 0b0001_0000; + const Y_SIGN = 0b0010_0000; + const X_OVERFLOW = 0b0100_0000; + const Y_OVERFLOW = 0b1000_0000; } } diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index db84fac5e02..08c53cae987 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -502,8 +502,8 @@ impl DeviceType { #[derive(Debug, PartialEq)] pub enum Vendor { Intel, - AMD, - NVIDIA, + Amd, + Nvidia, Qemu, Unknown(u32), } @@ -512,8 +512,8 @@ impl Vendor { pub fn new(id: u32) -> Self { match id { 0x8086 => Self::Intel, - 0x1022 => Self::AMD, - 0x10DE => Self::NVIDIA, + 0x1022 => Self::Amd, + 0x10DE => Self::Nvidia, 0x1234 => Self::Qemu, _ => Self::Unknown(id), } diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 432968936d0..9ecfb87709b 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -181,10 +181,9 @@ impl TerminalDevice for Slave { buffer.extend_from_slice(&[b'^', c + 0x40]); }; - match *signo { - SIGINT => ctrl(termios.c_cc[VINTR]), - _ => {} - }; + if *signo == SIGINT { + ctrl(termios.c_cc[VINTR]) + } } } } diff --git a/src/aero_kernel/src/logger.rs b/src/aero_kernel/src/logger.rs index bff6a2db93a..0ff59ab1e73 100644 --- a/src/aero_kernel/src/logger.rs +++ b/src/aero_kernel/src/logger.rs @@ -74,7 +74,7 @@ impl log::Log for AeroLogger { "(tid={}, pid={}) ", task.tid().as_usize(), task.pid().as_usize() - ) + ); } } diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 9298a49025e..af149398ec7 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -52,6 +52,7 @@ #![no_std] #![no_main] #![reexport_test_harness_main = "test_main"] +// #![warn(clippy::pedantic)] #[macro_use] extern crate aero_proc; diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index 1594b4ba2ca..94d863cf5ff 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -530,17 +530,14 @@ impl<'a, P: PageTableFrameMapping> Mapper for MappedPageTable<'a, P> { &mut self, page: Page, ) -> Result<(PhysFrame, MapperFlush), UnmapError> { - let p4; - - if self.level_5_paging_enabled { + let p4 = if self.level_5_paging_enabled { let p5 = &mut self.page_table; - p4 = self - .page_table_walker - .next_table_mut(&mut p5[page.p5_index()])?; + self.page_table_walker + .next_table_mut(&mut p5[page.p5_index()])? } else { - p4 = &mut self.page_table; - } + &mut self.page_table + }; let p3 = self .page_table_walker @@ -573,17 +570,14 @@ impl<'a, P: PageTableFrameMapping> Mapper for MappedPageTable<'a, P> { page: Page, flags: PageTableFlags, ) -> Result, FlagUpdateError> { - let p4; - - if self.level_5_paging_enabled { + let p4 = if self.level_5_paging_enabled { let p5 = &mut self.page_table; - p4 = self - .page_table_walker - .next_table_mut(&mut p5[page.p5_index()])?; + self.page_table_walker + .next_table_mut(&mut p5[page.p5_index()])? } else { - p4 = &mut self.page_table; - } + &mut self.page_table + }; let p3 = self .page_table_walker @@ -1156,9 +1150,7 @@ impl<'a> OffsetPageTable<'a> { i: usize| -> Result<(bool, &mut PageTable), MapToError> { let entry = &mut table[i]; - let created; - - if !entry.flags().contains(PageTableFlags::PRESENT) { + let created = if !entry.flags().contains(PageTableFlags::PRESENT) { let frame = FRAME_ALLOCATOR .allocate_frame() .ok_or(MapToError::FrameAllocationFailed)?; @@ -1170,7 +1162,7 @@ impl<'a> OffsetPageTable<'a> { | PageTableFlags::USER_ACCESSIBLE, ); - created = true; + true } else { entry.set_flags( PageTableFlags::PRESENT @@ -1178,8 +1170,8 @@ impl<'a> OffsetPageTable<'a> { | PageTableFlags::USER_ACCESSIBLE, ); - created = false; - } + false + }; let page_table_ptr = { let addr = entry.frame().unwrap().start_address().as_hhdm_virt(); diff --git a/src/aero_kernel/src/net/checksum.rs b/src/aero_kernel/src/net/checksum.rs index 250cf2124fe..ca27c3af6a1 100644 --- a/src/aero_kernel/src/net/checksum.rs +++ b/src/aero_kernel/src/net/checksum.rs @@ -33,11 +33,11 @@ fn calculate_checksum(data: &[u8]) -> u32 { ) }; - let mut sum = 0; - - for i in 0..(data.len() / 2) { - sum += bytes[i].to_native() as u32 - } + let mut sum = bytes + .iter() + .take(data.len() / 2) + .map(|byte| byte.to_native() as u32) + .sum(); // Add left-over byte, if any. if data.len() % 2 == 1 { diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 1c04c262c76..0bb171e7a65 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -415,7 +415,7 @@ impl<'a> Inner<'a> { self.genloop(image, xstart, xend, ystart, yend, |_, __, color| { color_blend(theme_background, color) as usize - }) + }); } fn generate_canvas(&mut self, image: Option) { @@ -1039,7 +1039,7 @@ pub fn init(framebuffer_tag: &Framebuffer, cmdline: &CommandLine) { let framebuffer = unsafe { core::slice::from_raw_parts_mut::( - framebuffer_tag.address.as_ptr().unwrap() as *mut u32, + framebuffer_tag.address.as_ptr().unwrap().cast::(), framebuffer_info.byte_len, ) }; diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 0cb7fbe8e60..b3284eb997a 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -399,9 +399,9 @@ impl INodeInterface for UnixSocket { let mut buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; - header - .name_mut::() - .map(|e| *e = peer.inner.lock_irq().address.as_ref().cloned().unwrap()); + if let Some(addr) = header.name_mut::() { + *addr = peer.inner.lock_irq().address.as_ref().cloned().unwrap(); + } Ok(header .iovecs_mut() @@ -420,15 +420,11 @@ impl INodeInterface for UnixSocket { let mut events = PollFlags::OUT; - match &inner.state { - UnixSocketState::Listening(queue) => { - if !queue.is_empty() { - events.insert(PollFlags::IN); - return Ok(events); - } + if let UnixSocketState::Listening(queue) = &inner.state { + if !queue.is_empty() { + events.insert(PollFlags::IN); + return Ok(events); } - UnixSocketState::Disconnected => todo!(), - UnixSocketState::Connected(_) => todo!(), } if !buffer.is_empty() { From 5fa3915bc14ea59ed35ae9eac9c75ebf459ed35e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 21 May 2023 18:31:46 +1000 Subject: [PATCH 222/368] kernel: more cleanup Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/block/ide/mod.rs | 9 ++-- src/aero_kernel/src/fs/block/mod.rs | 2 +- src/aero_kernel/src/fs/file_table.rs | 36 +++++++--------- src/aero_kernel/src/fs/pipe.rs | 8 ++-- src/aero_kernel/src/fs/procfs.rs | 41 ++++++++++--------- src/aero_kernel/src/fs/ramfs.rs | 4 +- src/aero_kernel/src/modules.rs | 6 +-- .../src/userland/scheduler/round_robin.rs | 2 +- src/aero_kernel/src/userland/signals.rs | 4 +- src/aero_kernel/src/userland/task/mod.rs | 2 +- 10 files changed, 54 insertions(+), 60 deletions(-) diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index 7f2013c964f..16ea8ef7bc8 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -197,11 +197,10 @@ struct Ide { impl PciDeviceHandle for Ide { fn handles(&self, vendor_id: Vendor, device_id: DeviceType) -> bool { - match (vendor_id, device_id) { - (Vendor::Intel, DeviceType::IdeController) => true, - - _ => false, - } + matches!( + (vendor_id, device_id), + (Vendor::Intel, DeviceType::IdeController) + ) } fn start(&self, header: &PciHeader, _offset_table: &mut OffsetPageTable) { diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 3c056c07c6c..6f230b56f49 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -373,7 +373,7 @@ impl BlockDeviceInterface for PartitionBlockDevice { return None; } - self.write_dma(self.offset + sector, start, size) + self.device.write_dma(self.offset + sector, start, size) } fn read_dma(&self, sector: usize, start: PhysAddr, size: usize) -> Option { diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index 496d4797219..05997abbc35 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -192,10 +192,8 @@ impl FileTable { pub fn get_handle(&self, fd: usize) -> Option> { let files = self.0.read(); - if let Some(file) = &files.get(fd) { - if let Some(handle) = file { - return Some(handle.clone()); - } + if let Some(Some(handle)) = &files.get(fd) { + return Some(handle.clone()); } None @@ -204,14 +202,12 @@ impl FileTable { pub fn log(&self) { let files = self.0.read(); - for handle in files.iter() { - if let Some(handle) = handle { - log::debug!( - "file handle: (fd={}, path=`{}`)", - handle.fd, - handle.inode.absolute_path_str() - ) - } + for handle in files.iter().flatten() { + log::debug!( + "file handle: (fd={}, path=`{}`)", + handle.fd, + handle.inode.absolute_path_str() + ) } } @@ -297,16 +293,14 @@ impl FileTable { pub fn deep_clone(&self) -> Self { let files = self.0.read(); - for file in files.iter() { - if let Some(handle) = file { - let flags = *handle.flags.read(); + for handle in files.iter().flatten() { + let flags = *handle.flags.read(); - handle - .inode - .inode() - .open(flags, handle.clone()) - .expect("FileTable::clone: failed to open file"); - } + handle + .inode + .inode() + .open(flags, handle.clone()) + .expect("FileTable::clone: failed to open file"); } Self(RwLock::new(files.clone())) diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index 0f663befb95..5533a6bccef 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -106,10 +106,10 @@ impl INodeInterface for Pipe { } fn poll(&self, table: Option<&mut PollTable>) -> super::Result { - table.map(|e| { - e.insert(&self.readers); - e.insert(&self.writers) - }); + if let Some(table) = table { + table.insert(&self.readers); + table.insert(&self.writers); + } let mut flags = PollFlags::OUT; diff --git a/src/aero_kernel/src/fs/procfs.rs b/src/aero_kernel/src/fs/procfs.rs index dd26543a3fe..31f9d4521f7 100644 --- a/src/aero_kernel/src/fs/procfs.rs +++ b/src/aero_kernel/src/fs/procfs.rs @@ -46,34 +46,35 @@ fn get_cpuinfo_cached() -> &'static str { let mut data = json!({ "processors": [] }); - data.get_mut("processors") + if let Some(processors) = data + .get_mut("processors") .and_then(|processors| processors.as_array_mut()) - .map(|processors| { - let mut cpu_info = vec![]; + { + let mut cpu_info = vec![]; - #[cfg(target_arch = "x86_64")] - tls::for_cpu_info_cached(|info| { - let mut processor = json!({}); + #[cfg(target_arch = "x86_64")] + tls::for_cpu_info_cached(|info| { + let mut processor = json!({}); - processor["id"] = Value::Number(Number::from(info.cpuid)); - processor["fpu"] = Value::Bool(info.fpu); + processor["id"] = Value::Number(Number::from(info.cpuid)); + processor["fpu"] = Value::Bool(info.fpu); - push_string_if_some(&mut processor, "brand", info.brand.clone()); - push_string_if_some(&mut processor, "vendor", info.vendor.clone()); + push_string_if_some(&mut processor, "brand", info.brand.clone()); + push_string_if_some(&mut processor, "vendor", info.vendor.clone()); - processor["features"] = Value::Array( - info.features - .iter() - .map(|feature| Value::String(feature.to_string())) - .collect(), - ); + processor["features"] = Value::Array( + info.features + .iter() + .map(|feature| Value::String(feature.to_string())) + .collect(), + ); - cpu_info.push(processor); - }); - - *processors = cpu_info; + cpu_info.push(processor); }); + *processors = cpu_info; + } + data.to_string() }) } diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index 4d81a041db4..d1542c5778f 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -236,7 +236,7 @@ impl INodeInterface for LockedRamINode { fn unlink(&self, name: &str) -> Result<()> { let mut this = self.0.write(); - if let Some(_) = this.children.remove(name) { + if this.children.remove(name).is_some() { Ok(()) } else { Err(FileSystemError::EntryNotFound) @@ -445,7 +445,7 @@ impl INodeInterface for LockedRamINode { { let this = self.0.read(); - if this.children.iter().any(|(e, _)| e == &name) { + if this.children.iter().any(|(e, _)| e == name) { return Err(FileSystemError::EntryExists); } } diff --git a/src/aero_kernel/src/modules.rs b/src/aero_kernel/src/modules.rs index 32a9bde5219..c7ce92203a7 100644 --- a/src/aero_kernel/src/modules.rs +++ b/src/aero_kernel/src/modules.rs @@ -45,7 +45,7 @@ pub enum ModuleType { #[derive(Debug)] #[repr(C)] pub struct Module { - pub init: *const fn() -> (), + pub init: *const (), pub ty: ModuleType, } @@ -59,7 +59,7 @@ macro_rules! module_init { #[used] #[link_section = ".kernel_modules.init"] static __MODULE_INIT: $crate::modules::Module = $crate::modules::Module { - init: $init_function as *const fn() -> (), + init: $init_function as *const (), ty: $ty, }; }; @@ -102,7 +102,7 @@ pub(crate) fn init() { launched_fs = true; } - let init = core::mem::transmute::<*const fn() -> (), fn() -> ()>(module.init); + let init = core::mem::transmute::<*const (), fn() -> ()>(module.init); init(); } } diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 0b999cee2f9..53ad3fe2ac0 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -123,7 +123,7 @@ impl RoundRobin { self.await_io().unwrap(); } else if let Some(task) = queue.dead.pop_front() { task.update_state(TaskState::Zombie); - task.into_zombie(); + task.make_zombie(); } } diff --git a/src/aero_kernel/src/userland/signals.rs b/src/aero_kernel/src/userland/signals.rs index 125c5e1e6b4..cf9d7e849e7 100644 --- a/src/aero_kernel/src/userland/signals.rs +++ b/src/aero_kernel/src/userland/signals.rs @@ -158,7 +158,7 @@ impl SignalEntry { }) } - pub fn into_sigaction(&self) -> SigAction { + pub fn sigaction(&self) -> SigAction { let handler: usize = self.handler.into(); SigAction { @@ -369,7 +369,7 @@ impl Signals { let mut signals = self.entries(); if let Some(old) = old { - *old = signals[signal].into_sigaction(); + *old = signals[signal].sigaction(); } if let Some(handler) = handler { diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 46e8333f9cd..b0ffb6db0f1 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -657,7 +657,7 @@ impl Task { } } - pub(super) fn into_zombie(&self) { + pub(super) fn make_zombie(&self) { self.detach(); self.arch_task_mut().dealloc(); From 5e9ea3705bdb49dce3e131bf621753751954e9d1 Mon Sep 17 00:00:00 2001 From: Anhad Singh <62820092+Andy-Python-Programmer@users.noreply.github.com> Date: Sun, 21 May 2023 20:06:35 +1000 Subject: [PATCH 223/368] Update README.md * Make use of my own lines of code service. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f670ddb6de..2dbc173adec 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Aero supports *modern* PC features such as Long Mode, 5-level paging, and SMP (multicore), to name a few. ![workflow](https://github.com/Andy-Python-Programmer/aero/actions/workflows/build.yml/badge.svg) -[![lines_of_code](https://tokei.rs/b1/github/Andy-Python-Programmer/aero)](https://github.com/Andy-Python-Programmer/aero) +[![lines_of_code](https://img.shields.io/endpoint?url=https://andypythonappdevelop.npkn.net/f0d517/)](https://github.com/Andy-Python-Programmer/aero) [![discord](https://img.shields.io/discord/828564770063122432)](https://discord.gg/8gwhTTZwt8) **Is this a Linux distribution?** From 7341fb577f06c540da246ad610ea41944057c99e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Mon, 22 May 2023 18:30:52 +1000 Subject: [PATCH 224/368] kernel: `ctty` -> `tty` This is because a lot of programs expect it to work that way. `vtty` is fine because currently X is the only dependent on that and will be. Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/tty/ctty.rs | 4 +-- src/aero_kernel/src/drivers/tty/mod.rs | 4 +-- userland/apps/init/src/main.rs | 36 ++++++++++++------------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/aero_kernel/src/drivers/tty/ctty.rs b/src/aero_kernel/src/drivers/tty/ctty.rs index e04100a23a6..19976314f64 100644 --- a/src/aero_kernel/src/drivers/tty/ctty.rs +++ b/src/aero_kernel/src/drivers/tty/ctty.rs @@ -15,7 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -//! `/dev/ctty`: Controlling terminal of the current process. +//! `/dev/tty`: Controlling terminal of the current process. use aero_syscall::TIOCNOTTY; use alloc::sync::{Arc, Weak}; @@ -102,7 +102,7 @@ impl Device for Ctty { #[inline] fn device_name(&self) -> String { - String::from("ctty") + String::from("tty") } #[inline] diff --git a/src/aero_kernel/src/drivers/tty/mod.rs b/src/aero_kernel/src/drivers/tty/mod.rs index b83f84ddc99..0451f5b6038 100644 --- a/src/aero_kernel/src/drivers/tty/mod.rs +++ b/src/aero_kernel/src/drivers/tty/mod.rs @@ -15,7 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -// `/dev/ctty`: controlling terminal of the process +// `/dev/tty`: controlling terminal of the process // `/dev/vtty[0-9]`: virtual terminals mod ctty; @@ -364,7 +364,7 @@ impl devfs::Device for Tty { } fn device_name(&self) -> String { - String::from("tty") + String::from("vtty") } fn inode(&self) -> Arc { diff --git a/userland/apps/init/src/main.rs b/userland/apps/init/src/main.rs index 5b08dcba9d2..ecbaef5d8c2 100644 --- a/userland/apps/init/src/main.rs +++ b/userland/apps/init/src/main.rs @@ -1,28 +1,26 @@ -/* - * Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2022 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use std::error::Error; use std::fs::{File, OpenOptions}; use std::os::fd::AsRawFd; use std::process::Command; -const TTY_PATH: &str = "/dev/tty"; +const TTY_PATH: &str = "/dev/vtty"; const DEV_NULL: &str = "/dev/null"; struct FileSet([File; N]); From b2e99e26cc82b40c2ee6cac37122e13c72e6b5b4 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 25 May 2023 16:59:00 +1000 Subject: [PATCH 225/368] bootstrap: use GitLab repos for `mesa-demos` and `xorg-xinit` * Bumps `xorg-server` - requires rebuild of `xf86-video-fbdev` Fixes #103 Signed-off-by: Anhad Singh --- bootstrap/xorg.yml | 10 +- patches/mesa-utils/mesa-utils.patch | 29 ---- patches/mlibc/mlibc.patch | 54 ++++++-- ...ecific-changes.patch => xorg-server.patch} | 128 ++++++++---------- 4 files changed, 109 insertions(+), 112 deletions(-) delete mode 100644 patches/mesa-utils/mesa-utils.patch rename patches/xorg-server/{0001-xserver-aero-specific-changes.patch => xorg-server.patch} (82%) diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index 3caa6aeaf28..fe1054cbdd7 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -564,10 +564,10 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' - - name: mesa-utils + - name: mesa-demos source: subdir: 'bundled' - git: 'https://github.com/freedesktop/mesa-demos' + git: 'https://gitlab.freedesktop.org/mesa/demos.git/' branch: 'master' tools_required: - host-autoconf-v2.69 @@ -934,7 +934,7 @@ packages: - name: xorg-xinit source: subdir: 'bundled' - git: 'https://github.com/freedesktop/xorg-xinit' + git: 'https://gitlab.freedesktop.org/xorg/app/xinit' tag: 'xinit-1.3.4' version: '1.3.4' tools_required: @@ -981,8 +981,8 @@ packages: source: subdir: 'bundled' git: 'https://gitlab.freedesktop.org/xorg/xserver.git' - tag: 'xorg-server-1.20.14' - version: '1.20.14' + tag: 'xorg-server-21.1.8' + version: '21.1.8' tools_required: - host-autoconf-v2.69 - host-automake-v1.16 diff --git a/patches/mesa-utils/mesa-utils.patch b/patches/mesa-utils/mesa-utils.patch deleted file mode 100644 index 1fd9b0fbd26..00000000000 --- a/patches/mesa-utils/mesa-utils.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 212ebc20ae9724fb6b69980170a5527fbd9f312e Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 11 Dec 2022 15:18:55 +1100 -Subject: [PATCH] - ---- - configure.ac | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/configure.ac b/configure.ac -index ddc68b5..373e51b 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -93,9 +93,9 @@ AC_EGREP_HEADER([glutInitContextProfile], - []) - - dnl Check for GLEW --PKG_CHECK_MODULES(GLEW, [glew >= 1.5.4]) --DEMO_CFLAGS="$DEMO_CFLAGS $GLEW_CFLAGS" --DEMO_LIBS="$DEMO_LIBS $GLEW_LIBS" -+dnl PKG_CHECK_MODULES(GLEW, [glew >= 1.5.4]) -+dnl DEMO_CFLAGS="$DEMO_CFLAGS $GLEW_CFLAGS" -+dnl DEMO_LIBS="$DEMO_LIBS $GLEW_LIBS" - - # LIBS was set by AC_CHECK_LIB above - LIBS="" --- -2.38.1 - diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 616d7609afb..714c65e9c3f 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,4 +1,4 @@ -From 9a74ab891ad2f1e2c47ef495767e5b3a25c33fa2 Mon Sep 17 00:00:00 2001 +From 3f789791be46cefe9ff8a5c6196a3a23bed9620f Mon Sep 17 00:00:00 2001 From: Andy-Python-Programmer Date: Sun, 16 Apr 2023 14:21:09 +1000 Subject: [PATCH] @@ -6,14 +6,14 @@ Subject: [PATCH] Signed-off-by: Andy-Python-Programmer --- .gitignore | 2 ++ - options/ansi/generic/stdlib-stubs.cpp | 6 ++++-- - options/glibc/generic/execinfo.cpp | 5 +++-- + options/ansi/generic/stdlib-stubs.cpp | 6 +++-- + options/glibc/generic/execinfo.cpp | 5 ++-- options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 27 +++++++++++++++++-------- - sysdeps/aero/generic/filesystem.cpp | 14 +++++++------ - sysdeps/aero/generic/sockets.cpp | 29 +++++++++++++++++++++++++-- - sysdeps/aero/include/aero/syscall.h | 10 +++++++++ - 8 files changed, 74 insertions(+), 21 deletions(-) + sysdeps/aero/generic/aero.cpp | 27 +++++++++++++++------- + sysdeps/aero/generic/filesystem.cpp | 33 ++++++++++++++------------- + sysdeps/aero/generic/sockets.cpp | 29 +++++++++++++++++++++-- + sysdeps/aero/include/aero/syscall.h | 10 ++++++++ + 8 files changed, 83 insertions(+), 31 deletions(-) diff --git a/.gitignore b/.gitignore index fdd60a0..9f811f4 100644 @@ -125,7 +125,7 @@ index 6eeb980..e6bd277 100644 } diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index a2c483b..5332f22 100644 +index a2c483b..fa5a369 100644 --- a/sysdeps/aero/generic/filesystem.cpp +++ b/sysdeps/aero/generic/filesystem.cpp @@ -155,14 +155,16 @@ int sys_tcgetattr(int fd, struct termios *attr) { @@ -151,6 +151,40 @@ index a2c483b..5332f22 100644 return e; return 0; +@@ -178,9 +180,7 @@ int sys_mkdir(const char *path, mode_t) { + return 0; + } + +-int sys_rmdir(const char *path) UNIMPLEMENTED("sys_rmdir") +- +- int sys_link(const char *srcpath, const char *destpath) { ++int sys_link(const char *srcpath, const char *destpath) { + auto result = + syscall(SYS_LINK, srcpath, strlen(srcpath), destpath, strlen(destpath)); + +@@ -191,14 +191,15 @@ int sys_rmdir(const char *path) UNIMPLEMENTED("sys_rmdir") + return 0; + } + +-int sys_unlinkat(int fd, const char *path, int flags) { +- auto result = syscall(SYS_UNLINK, fd, path, strlen(path), flags); +- +- if (result < 0) { +- return -result; +- } ++int sys_rmdir(const char *path) { ++ return sys_unlinkat(AT_FDCWD, path, AT_REMOVEDIR); ++} + +- return 0; ++int sys_unlinkat(int fd, const char *path, int flags) { ++ auto ret = syscall(SYS_UNLINK, fd, path, strlen(path), flags); ++ if (int e = sc_error(ret); e) ++ return e; ++ return 0; + } + + struct aero_dir_entry { diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp index 4db9956..4cb3ee8 100644 --- a/sysdeps/aero/generic/sockets.cpp @@ -228,5 +262,5 @@ index aa642e5..d8bf99e 100644 +} #endif // SYSCALL_H -- -2.40.0 +2.40.1 diff --git a/patches/xorg-server/0001-xserver-aero-specific-changes.patch b/patches/xorg-server/xorg-server.patch similarity index 82% rename from patches/xorg-server/0001-xserver-aero-specific-changes.patch rename to patches/xorg-server/xorg-server.patch index c9890ecc64a..3ef2ef41b18 100644 --- a/patches/xorg-server/0001-xserver-aero-specific-changes.patch +++ b/patches/xorg-server/xorg-server.patch @@ -1,12 +1,10 @@ -From 6a1cb57184179a2971bedd477fa71f30bbac6a09 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Thu, 30 Jun 2022 11:10:21 +1000 -Subject: [PATCH] xserver: aero specific changes +From b43c01a762f484fd03051b57724cdad82584c9aa Mon Sep 17 00:00:00 2001 +From: Anhad Singh +Date: Tue, 23 May 2023 19:10:14 +1000 +Subject: [PATCH] ^) -Signed-off-by: Andy-Python-Programmer +Signed-off-by: Anhad Singh --- - .gitignore | 2 ++ - configure.ac | 2 ++ hw/xfree86/common/xf86Bus.c | 2 ++ hw/xfree86/common/xf86Config.c | 2 ++ hw/xfree86/common/xf86Configure.c | 1 + @@ -15,43 +13,22 @@ Signed-off-by: Andy-Python-Programmer hw/xfree86/common/xf86Init.c | 2 ++ hw/xfree86/fbdevhw/fbdevhw.c | 36 +++++++++++++++--------- hw/xfree86/fbdevhw/fbdevhw.h | 4 +-- + hw/xfree86/fbdevhw/meson.build | 2 +- hw/xfree86/os-support/shared/posix_tty.c | 3 ++ hw/xfree86/os-support/shared/sigio.c | 3 ++ include/os.h | 1 + + meson.build | 3 +- mi/mibitblt.c | 2 ++ os/access.c | 2 +- os/ospoll.c | 2 ++ - os/utils.c | 6 ++-- - 17 files changed, 52 insertions(+), 20 deletions(-) + os/utils.c | 4 +-- + 17 files changed, 50 insertions(+), 21 deletions(-) -diff --git a/.gitignore b/.gitignore -index dc56b46..81d9886 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -80,3 +80,5 @@ core - doltcompile - doltlibtool - xserver.ent -+# editor configs: -+.vscode -diff --git a/configure.ac b/configure.ac -index 0909cc5..080b906 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1967,6 +1967,8 @@ if test "x$XORG" = xyes; then - XORG_DRIVER_MODESETTING=yes - fi - -+ XORG_DRIVER_MODESETTING=no -+ - AC_SUBST([XORG_LIBS]) - AC_SUBST([XORG_SYS_LIBS]) - AC_SUBST([XORG_INCS]) diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c -index a8f1073..d7399aa 100644 +index fd144db..b232e27 100644 --- a/hw/xfree86/common/xf86Bus.c +++ b/hw/xfree86/common/xf86Bus.c -@@ -536,6 +536,7 @@ xf86GetDevFromEntity(int entityIndex, int instance) +@@ -556,6 +556,7 @@ xf86GetDevFromEntity(int entityIndex, int instance) void xf86PostProbe(void) { @@ -59,29 +36,29 @@ index a8f1073..d7399aa 100644 if (fbSlotClaimed && ( #if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__) sbusSlotClaimed || -@@ -551,6 +552,7 @@ xf86PostProbe(void) +@@ -571,6 +572,7 @@ xf86PostProbe(void) )) FatalError("Cannot run in framebuffer mode. Please specify busIDs " " for all framebuffer devices\n"); +#endif } - int + Bool diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c -index 09d27ec..83be062 100644 +index 5d814c1..dabfec8 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c -@@ -49,6 +49,8 @@ - #include - #include +@@ -47,6 +47,8 @@ + #endif + #include +#include + + #include + #include "xf86.h" - #include "xf86Modes.h" - #include "xf86Parser.h" diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c -index 44e7591..6265f65 100644 +index 4347f6d..3a66af7 100644 --- a/hw/xfree86/common/xf86Configure.c +++ b/hw/xfree86/common/xf86Configure.c @@ -27,6 +27,7 @@ @@ -93,7 +70,7 @@ index 44e7591..6265f65 100644 #include "xf86Config.h" #include "xf86_OSlib.h" diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c -index 8a800bd..d847fa8 100644 +index 395bbc7..5937017 100644 --- a/hw/xfree86/common/xf86Events.c +++ b/hw/xfree86/common/xf86Events.c @@ -53,6 +53,7 @@ @@ -105,7 +82,7 @@ index 8a800bd..d847fa8 100644 #include #include diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c -index 42a51dd..813bad1 100644 +index 0389945..ac231bf 100644 --- a/hw/xfree86/common/xf86Helper.c +++ b/hw/xfree86/common/xf86Helper.c @@ -38,6 +38,7 @@ @@ -114,10 +91,10 @@ index 42a51dd..813bad1 100644 +#include #include + #include "mi.h" #include "os.h" - #include "servermd.h" diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c -index 2ec6b2f..c1d9c24 100644 +index 5695e71..96c2d15 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c @@ -37,6 +37,8 @@ @@ -130,7 +107,7 @@ index 2ec6b2f..c1d9c24 100644 #if !defined(WIN32) #define HAS_UTSNAME 1 diff --git a/hw/xfree86/fbdevhw/fbdevhw.c b/hw/xfree86/fbdevhw/fbdevhw.c -index 9508951..a4c1e6e 100644 +index 3d8b92e..dae3960 100644 --- a/hw/xfree86/fbdevhw/fbdevhw.c +++ b/hw/xfree86/fbdevhw/fbdevhw.c @@ -10,12 +10,13 @@ @@ -171,7 +148,7 @@ index 9508951..a4c1e6e 100644 /* only touch non-PCI devices on this path */ +#if 0 { - char buf[PATH_MAX]; + char buf[PATH_MAX] = {0}; char *sysfs_path = NULL; @@ -344,6 +348,7 @@ fbdev_open(int scrnIndex, const char *dev, char **namep) } @@ -262,6 +239,16 @@ index 4984ccf..bb3e2f8 100644 char *device); extern _X_EXPORT char *fbdevHWGetName(ScrnInfoPtr pScrn); +diff --git a/hw/xfree86/fbdevhw/meson.build b/hw/xfree86/fbdevhw/meson.build +index f3146f3..5e5e6e8 100644 +--- a/hw/xfree86/fbdevhw/meson.build ++++ b/hw/xfree86/fbdevhw/meson.build +@@ -1,4 +1,4 @@ +-if host_machine.system() == 'linux' ++if host_machine.system() == 'linux' or host_machine.system() == 'aero' + srcs_fbdevhw = 'fbdevhw.c' + else + srcs_fbdevhw = 'fbdevhwstub.c' diff --git a/hw/xfree86/os-support/shared/posix_tty.c b/hw/xfree86/os-support/shared/posix_tty.c index 0cb9788..e8cac5d 100644 --- a/hw/xfree86/os-support/shared/posix_tty.c @@ -277,7 +264,7 @@ index 0cb9788..e8cac5d 100644 #include #include "xf86.h" diff --git a/hw/xfree86/os-support/shared/sigio.c b/hw/xfree86/os-support/shared/sigio.c -index 247bec7..216e8cd 100644 +index ad8af60..6f81278 100644 --- a/hw/xfree86/os-support/shared/sigio.c +++ b/hw/xfree86/os-support/shared/sigio.c @@ -56,6 +56,9 @@ @@ -291,7 +278,7 @@ index 247bec7..216e8cd 100644 #include #include "xf86.h" diff --git a/include/os.h b/include/os.h -index 2a1c29e..2a7fc76 100644 +index bb3348b..64b04dc 100644 --- a/include/os.h +++ b/include/os.h @@ -51,6 +51,7 @@ SOFTWARE. @@ -302,8 +289,22 @@ index 2a1c29e..2a7fc76 100644 #ifdef MONOTONIC_CLOCK #include #endif +diff --git a/meson.build b/meson.build +index 637938a..b5d761c 100644 +--- a/meson.build ++++ b/meson.build +@@ -439,7 +439,8 @@ if not libdrm_dep.found() and libdrm_required + error('DRI requested, but LIBDRM not found') + endif + +-build_modesetting = libdrm_dep.found() and dri2proto_dep.found() ++# build_modesetting = libdrm_dep.found() and dri2proto_dep.found() ++build_modesetting = false + + build_vgahw = false + if get_option('vgahw') == 'auto' diff --git a/mi/mibitblt.c b/mi/mibitblt.c -index 43d9bd9..740c0d2 100644 +index 0b13e49..aff6539 100644 --- a/mi/mibitblt.c +++ b/mi/mibitblt.c @@ -49,6 +49,8 @@ SOFTWARE. @@ -316,11 +317,11 @@ index 43d9bd9..740c0d2 100644 #include diff --git a/os/access.c b/os/access.c -index 9724616..81befe3 100644 +index 61ee8e3..24cabae 100644 --- a/os/access.c +++ b/os/access.c -@@ -117,7 +117,7 @@ SOFTWARE. - #endif +@@ -120,7 +120,7 @@ SOFTWARE. + #include #endif -#if defined(SVR4) || (defined(SYSV) && defined(__i386__)) || defined(__GNU__) @@ -347,10 +348,10 @@ index c68aabc..19006c3 100644 #if !HAVE_OSPOLL #include "xserver_poll.h" diff --git a/os/utils.c b/os/utils.c -index 2ba1c80..ffa961f 100644 +index 92a66e8..646722e 100644 --- a/os/utils.c +++ b/os/utils.c -@@ -1402,7 +1402,7 @@ System(const char *command) +@@ -1403,7 +1403,7 @@ System(const char *command) return -1; } @@ -359,16 +360,7 @@ index 2ba1c80..ffa961f 100644 } static struct pid { -@@ -1474,7 +1474,7 @@ Popen(const char *command, const char *type) - } - close(pdes[1]); - } -- execl("/bin/sh", "sh", "-c", command, (char *) NULL); -+ execl("/usr/bin/bash", "sh", "-c", command, (char *) NULL); - _exit(127); - } - -@@ -1632,7 +1632,7 @@ Pclose(void *iop) +@@ -1633,7 +1633,7 @@ Pclose(void *iop) } #endif @@ -378,5 +370,5 @@ index 2ba1c80..ffa961f 100644 int -- -2.25.1 +2.40.1 From 8fe13d7c04466d5585fe965309312a6e5131a43e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 26 May 2023 16:10:17 +1000 Subject: [PATCH 226/368] bootstrap::xorg: add `libxcvt` Signed-off-by: Anhad Singh --- bootstrap/xorg.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index fe1054cbdd7..cfde0b56cd7 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -974,6 +974,33 @@ packages: DESTDIR: '@THIS_COLLECT_DIR@' - args: ['cp', '@SOURCE_ROOT@/extra-files/xorg/xinitrc', '@THIS_COLLECT_DIR@/etc/X11/xinit/xinitrc'] + # X.Org xcvt library and cvt program + # + # VESA CVT standard timing modeline generation library & utility. + - name: libxcvt + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/xorg/lib/libxcvt.git' + tag: 'libxcvt-0.1.2' + version: '0.1.2' + tools_required: + - host-gcc + - host-pkg-config + pkgs_required: + - mlibc + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja', '-j@PARALLELISM@'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + # The X server accepts requests from client applications to create windows, # which are (normally rectangular) "virtual screens" that the client program # can draw into. @@ -1006,6 +1033,7 @@ packages: - libepoxy - libxkbfile - libxfont2 + - libxcvt - pixman configure: - args: From ca5c63b0ce7b4084a996f8a9f10b5a7b3f2b33df Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 26 May 2023 17:21:53 +1000 Subject: [PATCH 227/368] userland: cleanup * delete aero_shell, utest and utest_proc * delete all the syscall wrappers around syscalls in aero_syscall except ipc() syscalls * fix some clippy issues * update copyright in updated files Signed-off-by: Anhad Singh --- src/aero_syscall/src/lib.rs | 365 +--------------- userland/Cargo.lock | 26 +- userland/apps/aero_shell/Cargo.toml | 9 - userland/apps/aero_shell/src/main.rs | 462 --------------------- userland/apps/utest-proc/Cargo.toml | 12 - userland/apps/utest-proc/src/lib.rs | 48 --- userland/apps/utest/Cargo.toml | 10 - userland/apps/utest/src/main.rs | 359 ---------------- userland/apps/utest/src/mmap.rs | 18 - userland/apps/window_test/src/main.rs | 36 +- userland/libs/aero_ipc/src/lib.rs | 66 ++- userland/servers/system_server/src/main.rs | 39 +- userland/servers/window_server/Cargo.toml | 1 + userland/servers/window_server/src/main.rs | 38 +- 14 files changed, 108 insertions(+), 1381 deletions(-) delete mode 100644 userland/apps/aero_shell/Cargo.toml delete mode 100644 userland/apps/aero_shell/src/main.rs delete mode 100644 userland/apps/utest-proc/Cargo.toml delete mode 100644 userland/apps/utest-proc/src/lib.rs delete mode 100644 userland/apps/utest/Cargo.toml delete mode 100644 userland/apps/utest/src/main.rs delete mode 100644 userland/apps/utest/src/mmap.rs diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 48f56c348cf..b39fef7b0b2 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -481,191 +481,39 @@ pub fn isize_as_syscall_result(value: isize) -> Result { } } -pub fn sys_exit(status: usize) -> ! { - syscall1(prelude::SYS_EXIT, status); - unreachable!() -} - -pub fn sys_open(path: &str, mode: OpenFlags) -> Result { - let value = syscall4( - prelude::SYS_OPEN, - 0x00, - path.as_ptr() as usize, - path.len(), - mode.bits(), - ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_write(fd: usize, buf: &[u8]) -> Result { - let value = syscall3(prelude::SYS_WRITE, fd, buf.as_ptr() as usize, buf.len()); - isize_as_syscall_result(value as _) -} - -pub fn sys_read(fd: usize, buf: &mut [u8]) -> Result { - let value = syscall3(prelude::SYS_READ, fd, buf.as_mut_ptr() as usize, buf.len()); - isize_as_syscall_result(value as _) -} - -pub fn sys_chdir(path: &str) -> Result { - let value = syscall2(prelude::SYS_CHDIR, path.as_ptr() as usize, path.len()); - isize_as_syscall_result(value as _) -} - -pub fn sys_close(fd: usize) -> Result { - let value = syscall1(prelude::SYS_CLOSE, fd); - isize_as_syscall_result(value as _) -} - -pub fn sys_getcwd(buf: &mut [u8]) -> Result { - let value = syscall2(prelude::SYS_GETCWD, buf.as_mut_ptr() as usize, buf.len()); - isize_as_syscall_result(value as _) -} - -pub fn sys_getdents(fd: usize, buf: &mut [u8]) -> Result { - let value = syscall3( - prelude::SYS_GETDENTS, - fd, - buf.as_mut_ptr() as usize, - buf.len(), - ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_fork() -> Result { - let value = syscall0(prelude::SYS_FORK); - isize_as_syscall_result(value as _) -} - -pub fn sys_munmap(address: usize, size: usize) -> Result { - let value = syscall2(prelude::SYS_MUNMAP, address, size); - isize_as_syscall_result(value as _) -} - -pub fn sys_mkdir(path: &str) -> Result { - let value = syscall2(prelude::SYS_MKDIR, path.as_ptr() as usize, path.len()); - isize_as_syscall_result(value as _) -} - -pub fn sys_log(message: &str) -> Result { - let value = syscall2(prelude::SYS_LOG, message.as_ptr() as usize, message.len()); - isize_as_syscall_result(value as _) -} - -pub fn sys_mkdirat(dfd: isize, path: &str) -> Result { - let value = syscall3( - prelude::SYS_MKDIR_AT, - dfd as usize, - path.as_ptr() as usize, - path.len(), - ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_exec(path: &str, argv: &[&str], envv: &[&str]) -> Result { - let value = syscall6( - prelude::SYS_EXEC, - path.as_ptr() as usize, - path.len(), - argv.as_ptr() as usize, - argv.len(), - envv.as_ptr() as usize, - envv.len(), - ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_rmdir(path: &str) -> Result { - let value = syscall2(prelude::SYS_RMDIR, path.as_ptr() as usize, path.len()); - isize_as_syscall_result(value as _) -} - -pub fn sys_uname(struc: &mut Utsname) -> Result { - let value = syscall1(prelude::SYS_UNAME, struc as *mut Utsname as usize); - isize_as_syscall_result(value as _) -} - -pub fn sys_shutdown() -> ! { - syscall0(prelude::SYS_SHUTDOWN); - unreachable!() -} - -pub fn sys_access(fd: usize, path: &str) -> Result { - let value = syscall5( - prelude::SYS_ACCESS, - fd, - path.as_ptr() as usize, - path.len(), - 0, - 0, - ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_waitpid(pid: usize, status: &mut u32, flags: usize) -> Result { +pub fn sys_ipc_send(pid: usize, message: &[u8]) -> Result<(), SyscallError> { let value = syscall3( - prelude::SYS_WAITPID, + prelude::SYS_IPC_SEND, pid, - status as *mut u32 as usize, - flags, + message.as_ptr() as usize, + message.len(), ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_ioctl(fd: usize, command: usize, arg: usize) -> Result { - let value = syscall3(prelude::SYS_IOCTL, fd, command, arg); - isize_as_syscall_result(value as _) + isize_as_syscall_result(value as _).map(|_| ()) } -pub fn sys_mmap( - address: usize, - size: usize, - protection: MMapProt, - flags: MMapFlags, - fd: usize, - offset: usize, -) -> Result { - let value = syscall6( - prelude::SYS_MMAP, - address, - size, - protection.bits(), - flags.bits(), - fd, - offset, +pub fn sys_ipc_recv<'a>( + pid: &mut usize, + message: &'a mut [u8], + block: bool, +) -> Result<&'a mut [u8], SyscallError> { + let value = syscall4( + prelude::SYS_IPC_RECV, + pid as *mut usize as usize, + message.as_ptr() as usize, + message.len(), + block as usize, ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_getpid() -> Result { - let value = syscall0(prelude::SYS_GETPID); - isize_as_syscall_result(value as _) -} - -pub fn sys_gettid() -> Result { - let value = syscall0(prelude::SYS_GETTID); - isize_as_syscall_result(value as _) + isize_as_syscall_result(value as _).map(|size| &mut message[0..size]) } -pub fn sys_gethostname(buf: &mut [u8]) -> Result { - let value = syscall2( - prelude::SYS_GETHOSTNAME, - buf.as_mut_ptr() as usize, - buf.len(), - ); +pub fn sys_ipc_discover_root() -> Result { + let value = syscall0(prelude::SYS_IPC_DISCOVER_ROOT); isize_as_syscall_result(value as _) } -pub fn sys_sethostname(name: &str) -> Result { - let value = syscall2(prelude::SYS_SETHOSTNAME, name.as_ptr() as usize, name.len()); - isize_as_syscall_result(value as _) +pub fn sys_ipc_become_root() -> Result<(), SyscallError> { + let value = syscall0(prelude::SYS_IPC_BECOME_ROOT); + isize_as_syscall_result(value as _).map(|_| ()) } // Sockets @@ -789,159 +637,6 @@ pub const AF_UNSPEC: u32 = PF_UNSPEC; pub const AF_NETLINK: u32 = PF_NETLINK; pub const AF_BRIDGE: u32 = PF_BRIDGE; -pub fn sys_socket( - domain: usize, - socket_type: usize, - protocol: usize, -) -> Result { - let value = syscall3(prelude::SYS_SOCKET, domain, socket_type, protocol); - isize_as_syscall_result(value as _) -} - -pub fn sys_listen(fd: usize, backlog: usize) -> Result { - let value = syscall2(prelude::SYS_LISTEN, fd, backlog); - isize_as_syscall_result(value as _) -} - -pub fn sys_unlink(fd: usize, path: &str, flags: OpenFlags) -> Result { - let value = syscall4( - prelude::SYS_UNLINK, - fd, - path.as_ptr() as usize, - path.len(), - flags.bits(), - ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_gettime(clock: usize, timespec: &mut TimeSpec) -> Result { - let value = syscall2(prelude::SYS_GETTIME, clock, timespec as *mut _ as usize); - isize_as_syscall_result(value as _) -} - -pub fn sys_seek(fd: usize, offset: usize, whence: SeekWhence) -> Result { - let value = syscall3(prelude::SYS_SEEK, fd, offset, whence as usize); - isize_as_syscall_result(value as _) -} - -pub fn sys_sleep(timespec: &TimeSpec) -> Result { - let value = syscall1(prelude::SYS_SLEEP, timespec as *const _ as usize); - isize_as_syscall_result(value as _) -} - -pub fn sys_pipe(fds: &mut [usize; 2], flags: OpenFlags) -> Result { - let value = syscall2(prelude::SYS_PIPE, fds.as_ptr() as usize, flags.bits()); - isize_as_syscall_result(value as _) -} - -pub fn sys_info(struc: &mut SysInfo) -> Result { - let value = syscall1(prelude::SYS_INFO, struc as *mut _ as usize); - isize_as_syscall_result(value as _) -} - -pub fn sys_clone(entry: usize, stack: usize) -> Result { - let value = syscall2(prelude::SYS_CLONE, entry, stack); - isize_as_syscall_result(value as _) -} - -pub fn sys_sigreturn() -> Result { - let value = syscall0(prelude::SYS_SIGRETURN); - isize_as_syscall_result(value as _) -} - -pub fn sys_sigaction( - sig: usize, - sigaction: Option<&signal::SigAction>, - old_sigaction: Option<&mut signal::SigAction>, -) -> Result { - let sigact = sigaction; - - let value = syscall4( - prelude::SYS_SIGACTION, - sig, - sigact - .map(|f| f as *const signal::SigAction as usize) - .unwrap_or(0), - sys_sigreturn as usize, - old_sigaction - .map(|f| f as *mut signal::SigAction as usize) - .unwrap_or(0), - ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_sigprocmask( - how: signal::SigProcMask, - set: &mut u64, - old_set: Option<&mut u64>, -) -> Result { - let old_set = match old_set { - Some(e) => e as *const u64 as usize, - None => 0, - }; - - let value = syscall3( - prelude::SYS_SIGPROCMASK, - how as usize, - set as *const u64 as usize, - old_set, - ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_dup(fd: usize, flags: OpenFlags) -> Result { - let value = syscall2(prelude::SYS_DUP, fd, flags.bits()); - isize_as_syscall_result(value as _) -} - -pub fn sys_fcntl(fd: usize, command: usize, argument: usize) -> Result { - let value = syscall3(prelude::SYS_FCNTL, fd, command, argument); - isize_as_syscall_result(value as _) -} - -pub fn sys_dup2(fd: usize, new_fd: usize, flags: OpenFlags) -> Result { - let value = syscall3(prelude::SYS_DUP2, fd, new_fd, flags.bits()); - isize_as_syscall_result(value as _) -} - -pub fn sys_ipc_send(pid: usize, message: &[u8]) -> Result<(), SyscallError> { - let value = syscall3( - prelude::SYS_IPC_SEND, - pid, - message.as_ptr() as usize, - message.len(), - ); - isize_as_syscall_result(value as _).map(|_| ()) -} - -pub fn sys_ipc_recv<'a>( - pid: &mut usize, - message: &'a mut [u8], - block: bool, -) -> Result<&'a mut [u8], SyscallError> { - let value = syscall4( - prelude::SYS_IPC_RECV, - pid as *mut usize as usize, - message.as_ptr() as usize, - message.len(), - block as usize, - ); - isize_as_syscall_result(value as _).map(|size| &mut message[0..size]) -} - -pub fn sys_ipc_discover_root() -> Result { - let value = syscall0(prelude::SYS_IPC_DISCOVER_ROOT); - isize_as_syscall_result(value as _) -} - -pub fn sys_ipc_become_root() -> Result<(), SyscallError> { - let value = syscall0(prelude::SYS_IPC_BECOME_ROOT); - isize_as_syscall_result(value as _).map(|_| ()) -} - // sysdeps/aero/include/abi-bits/stat.h bitflags::bitflags! { #[derive(Default)] @@ -995,19 +690,3 @@ pub struct Stat { pub st_blksize: u64, pub st_blocks: u64, } - -pub fn sys_stat(path: &str, stat: &mut Stat) -> Result { - let value = syscall3( - prelude::SYS_STAT, - path.as_ptr() as usize, - path.len(), - stat as *mut Stat as usize, - ); - - isize_as_syscall_result(value as _) -} - -pub fn sys_fstat(fd: usize, stat: &mut Stat) -> Result { - let value = syscall2(prelude::SYS_FSTAT, fd, stat as *mut Stat as usize); - isize_as_syscall_result(value as _) -} diff --git a/userland/Cargo.lock b/userland/Cargo.lock index 04b43fefabb..a5679041e76 100644 --- a/userland/Cargo.lock +++ b/userland/Cargo.lock @@ -13,14 +13,6 @@ dependencies = [ "spin 0.9.8", ] -[[package]] -name = "aero_shell" -version = "0.1.0" -dependencies = [ - "aero_ipc", - "aero_syscall", -] - [[package]] name = "aero_syscall" version = "0.1.0" @@ -324,23 +316,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" -[[package]] -name = "utest" -version = "0.1.0" -dependencies = [ - "aero_ipc", - "aero_syscall", - "utest-proc", -] - -[[package]] -name = "utest-proc" -version = "0.1.0" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "version_check" version = "0.9.4" @@ -360,6 +335,7 @@ dependencies = [ "aero_ipc", "aero_syscall", "hashbrown", + "libc 0.2.139 (git+https://github.com/Andy-Python-Programmer/libc)", "spin 0.9.8", ] diff --git a/userland/apps/aero_shell/Cargo.toml b/userland/apps/aero_shell/Cargo.toml deleted file mode 100644 index a54ac524191..00000000000 --- a/userland/apps/aero_shell/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "aero_shell" -version = "0.1.0" -authors = ["Anhad Singh "] -edition = "2021" - -[dependencies] -aero_syscall = { path = "../../../src/aero_syscall" } -aero_ipc = { path = "../../libs/aero_ipc" } diff --git a/userland/apps/aero_shell/src/main.rs b/userland/apps/aero_shell/src/main.rs deleted file mode 100644 index 98ad84deee9..00000000000 --- a/userland/apps/aero_shell/src/main.rs +++ /dev/null @@ -1,462 +0,0 @@ -/* -* Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ - -use std::sync::atomic::{AtomicU32, Ordering}; - -use std::error::Error; -use std::io::{BufRead, BufReader}; - -use std::fs::File; - -use std::fs; - -use aero_ipc::SystemService; -use aero_syscall::*; - -use std::io::Write; - -const MAGENTA_FG: &str = "\x1b[1;35m"; -const RESET: &str = "\x1b[0m"; -const UWUFETCH_LOGO: &str = r#" - ,---, - ' .' \ - / ; '. - : : \ - : | /\ \ - | : ' ;. : - | | ;/ \ \ - ' : | \ \ ,' - | | ' '--' - | : : - | | ,' - `--'' -"#; - -macro_rules! error { - ($($arg:tt)*) => { - std::print!("\x1b[1;31merror\x1b[0m: {}\n", format_args!($($arg)*)) - } -} - -static LAST_EXIT_CODE: AtomicU32 = AtomicU32::new(0); - -fn repl(history: &mut Vec) -> Result<(), SyscallError> { - let mut hostname_buf = [0; 64]; - let mut pwd_buffer = [0; 1024]; - let mut cmd_buffer = [0; 1024]; - - let hostname_len = sys_gethostname(&mut hostname_buf)?; - let hostname = unsafe { core::str::from_utf8_unchecked(&hostname_buf[0..hostname_len]) }; - let username = "root"; // TODO: Unhardcode this at some point :^) - - let pwd_length = sys_getcwd(&mut pwd_buffer)?; - let pwd = unsafe { core::str::from_utf8_unchecked(&pwd_buffer[0..pwd_length]) }; - - let mut stdout = std::io::stdout(); - - write!( - stdout, - "\x1b[1;32m{}@{}\x1b[0m:\x1b[1;34m{}\x1b[0m ", - username, hostname, pwd - ) - .unwrap(); - - stdout.flush().unwrap(); - - let cmd_length = sys_read(0, &mut cmd_buffer)?; - let cmd_string = unsafe { core::str::from_utf8_unchecked(&cmd_buffer[0..cmd_length]).trim() }; - - let mut args = cmd_string.split_whitespace(); - - if let Some(cmd) = args.next() { - history.push(cmd_string.to_string()); - - match cmd { - "echo" => { - let message = args.collect::>().join(" "); - let message = message.replace( - "$?", - LAST_EXIT_CODE.load(Ordering::SeqCst).to_string().as_str(), - ); - - println!("{}", message); - } - - "ls" => list_directory(args.next().unwrap_or(".")).unwrap(), - "pwd" => println!("{}", pwd), - "cd" => { - sys_chdir(args.next().unwrap_or(".."))?; - } - "mkdir" => match args.next() { - Some(path) => { - sys_mkdir(path)?; - } - None => error!("mkdir: missing operand"), - }, - "rmdir" => match args.next() { - Some(path) => { - sys_rmdir(path)?; - } - None => error!("rmdir: missing operand"), - }, - "exit" => match args.next() { - Some(status) => match status.parse::() { - Ok(exit_code) => sys_exit(exit_code), - Err(_) => error!("exit: invalid operand"), - }, - None => sys_exit(0), - }, - "cat" => cat_file(args.next()).unwrap(), - "clear" => print!("{esc}[2J{esc}[1;1H", esc = 27 as char), - "dmsg" => print_kernel_log().unwrap(), - "uwufetch" => uwufetch()?, - "uname" => uname()?, - "history" => { - for entry in history.iter() { - println!("{}", entry); - } - } - - "uwutest" => { - // TODO: Make a uwutest program that is executed by the kernel - // if the test kernel is built instead of randomly bloating the shell - // with tests :). - - // let fb = sys_open("/dev/fb", OpenFlags::O_RDWR)?; - - // let buffer = &[u32::MAX; (1024 * 768)]; - // let casted = buffer.as_ptr() as *mut u8; - // let casted = unsafe { core::slice::from_raw_parts(casted, (1024 * 768) as usize) }; - - // println!("writing to fb"); - // sys_write(fb, casted)?; - // sys_close(fb)?; - - uwutest()?; - } - - "pid" => { - println!("{}", sys_getpid()?); - } - - "uptime" => { - print!("{}", get_uptime()?); - } - - "sleep" => { - let duration = args.next().unwrap_or("0").parse::().unwrap_or(0); - let timespec = TimeSpec { - tv_sec: duration as isize, - tv_nsec: 0, - }; - - sys_sleep(×pec)?; - } - - "shutdown" => sys_shutdown(), - - "doom" => { - let child = sys_fork()?; - - if child == 0 { - let args = args.collect::>(); - let mut argv = Vec::new(); - - argv.push("/usr/bin/doomgeneric"); - - argv.extend(&["-iwad", "./doom1.wad"]); - argv.extend(args); - - let argv = argv.as_slice(); - - if sys_exec("/usr/bin/doomgeneric", argv, &["TERM=linux"]).is_err() { - println!("{}: command not found", cmd); - sys_exit(1); - } - } else { - // Wait for the child - let mut status = 0; - sys_waitpid(child, &mut status, 0)?; - - let exit_code = status & 0xff; - LAST_EXIT_CODE.store(exit_code, Ordering::SeqCst); - - if exit_code != 0 { - error!("{} exited with a non-zero status code: {} ", cmd, exit_code); - } - } - } - - _ => { - let mut args = args.collect::>(); - - // If the command ends with an `&`, then we have to run the command in the background. - let run_background = args.last().map(|&e| e == "&").unwrap_or(false); - - // Remove the `&` from the arguments array if present. - if run_background { - args.pop(); - } - - let child = sys_fork()?; - - if child == 0 { - let mut argv = Vec::new(); - - argv.push(cmd); - argv.extend(args); - - let argv = argv.as_slice(); - - match sys_exec( - cmd, - argv, - &[ - "TERM=linux", - // The `XDG_RUNTIME_DIR` environment variable tells the tells any program you - // run where to find a user-specific directory in which it can store small - // temporary files. - "XDG_RUNTIME_DIR=tmp", - "DISPLAY=:0", - ], - ) { - Ok(_) => core::unreachable!(), - Err(SyscallError::EISDIR) => error!("{}: is a directory", cmd), - Err(SyscallError::ENOENT) => error!("{}: command not found", cmd), - Err(err) => error!("{}: {:?}", cmd, err), - } - - sys_exit(0); - } else if !run_background { - // We are not running the command in the background, so wait for the child. - let mut status = 0; - sys_waitpid(child, &mut status, 0)?; - - let exit_code = status & 0xff; - LAST_EXIT_CODE.store(exit_code, Ordering::SeqCst); - - if exit_code != 0 { - error!("{} exited with a non-zero status code: {} ", cmd, exit_code); - } - } - } - } - } - - Ok(()) -} - -fn list_directory(path: &str) -> Result<(), Box> { - let rdir = fs::read_dir(path)?; - - for file in rdir { - let name = file?.file_name(); - let name_str = name.to_str().ok_or("ls: invalid filename")?; - - print!("{name_str} "); - } - - println!(); - Ok(()) -} - -fn cat_file(path: Option<&str>) -> Result<(), Box> { - let file = path - .map(|e| File::open(e)) - // On the `None` arm, we take input from stdin until we get interrupted. This is the - // behaviour of `cat` that comes with any modern Linux distro. - .unwrap_or_else(|| File::open("/dev/tty"))?; - - let mut reader = BufReader::new(file); - - loop { - let mut line = String::new(); - let size = reader.read_line(&mut line)?; - - // We have reached the end of the file. - if size == 0 { - break; - } - - print!("{line}"); - } - - println!(); - Ok(()) -} - -fn print_kernel_log() -> Result<(), Box> { - // dmsg is just a wrapper around `cat /dev/kmsg` - // TODO: Add colored output back :^) - - cat_file(Some("/dev/kmsg")) -} - -fn uwutest() -> Result<(), SyscallError> { - let my_pid = sys_getpid()?; - let ipc = SystemService::open(sys_ipc_discover_root()?); - - ipc.announce(my_pid, "TestServer") - .expect("Failed to announce"); - - println!( - "TestServer is at {}", - ipc.discover("TestServer").expect("Failed to discover") - ); - - Ok(()) -} - -fn get_uptime() -> Result { - let mut info = unsafe { core::mem::zeroed() }; - - sys_info(&mut info)?; - - let mut uptime = String::new(); - - let days = info.uptime / (3600 * 24); - let hours = info.uptime % (3600 * 24) / 3600; - let minutes = info.uptime % 3600 / 60; - let seconds = info.uptime % 60; - - if days > 0 { - uptime.push_str(&format!( - "{} day{}, ", - days, - if days == 1 { "" } else { "s" } - )); - } - - if hours > 0 { - uptime.push_str(&format!( - "{} hour{}, ", - hours, - if hours == 1 { "" } else { "s" }, - )); - } - - if minutes > 0 { - uptime.push_str(&format!( - "{} minute{}, ", - minutes, - if minutes == 1 { "" } else { "s" } - )); - } - - uptime.push_str(&format!( - "{} second{}", - seconds, - if seconds == 1 { "" } else { "s" } - )); - - Ok(uptime) -} - -fn uwufetch() -> Result<(), SyscallError> { - let print_prefix = |prefix| { - print!("{}{}{}: ", MAGENTA_FG, prefix, RESET); - }; - - let mut hostname_buf = [0; 64]; - - let hostname_len = sys_gethostname(&mut hostname_buf)?; - let hostname = unsafe { core::str::from_utf8_unchecked(&hostname_buf[0..hostname_len]) }; - let username = "root"; // TODO: Unhardcode this at some point :^) - - for (i, line) in UWUFETCH_LOGO.lines().skip(1).enumerate() { - print!(" {}{:<19}{}", MAGENTA_FG, line, RESET); - - if i == 1 { - println!("{}@{}", username, hostname); - } else if i == 2 { - println!("{}", "-".repeat(username.len() + hostname.len() + 1)); - } else if i == 3 { - print_prefix("OS"); - println!("Aero"); - } else if i == 4 { - let tty_fd = sys_open("/dev/tty", OpenFlags::O_RDONLY)?; - - let mut resolution = WinSize::default(); - sys_ioctl(tty_fd, TIOCGWINSZ, &mut resolution as *mut _ as usize)?; - - sys_close(tty_fd)?; - - print_prefix("Resolution"); - println!("{}x{}", resolution.ws_xpixel, resolution.ws_ypixel); - } else if i == 5 { - let mut uname_info = Utsname::default(); - - sys_uname(&mut uname_info)?; - - print_prefix("Kernel"); - println!( - "{} {} ({})", - uname_info.name(), - uname_info.version(), - uname_info.machine() - ); - } else if i == 6 { - print_prefix("Uptime"); - println!("{}", get_uptime()?); - } else { - println!(); - } - } - - Ok(()) -} - -fn uname() -> Result<(), SyscallError> { - let mut uname_info = Utsname::default(); - - sys_uname(&mut uname_info)?; - - println!( - "{} {} {} {} {}", - uname_info.name(), - uname_info.nodename(), - uname_info.release(), - uname_info.version(), - uname_info.machine() - ); - - Ok(()) -} - -// fn handle_segmentation_fault(_fault: usize) { -// error!("segmentation fault"); -// process::exit(1); -// } - -// fn install_sighandler(signum: libc::c_int, handler: fn(usize)) -> libc::sighandler_t { -// unsafe { libc::signal(signum, handler as libc::sighandler_t) } -// } - -fn main() { - // install all the necessary signal handlers. - // install_sighandler(libc::SIGSEGV, handle_segmentation_fault); - - let mut history = vec![]; - - loop { - if let Err(error) = repl(&mut history) { - error!("{:?}", error); - } - } -} diff --git a/userland/apps/utest-proc/Cargo.toml b/userland/apps/utest-proc/Cargo.toml deleted file mode 100644 index 7443a34d2b8..00000000000 --- a/userland/apps/utest-proc/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "utest-proc" -version = "0.1.0" -edition = "2021" -authors = ["Anhad Singh "] - -[lib] -proc-macro = true - -[dependencies] -syn = { version = "1.0.82", features = ["proc-macro", "full"] } -quote = "1.0.10" diff --git a/userland/apps/utest-proc/src/lib.rs b/userland/apps/utest-proc/src/lib.rs deleted file mode 100644 index 80683d16f5d..00000000000 --- a/userland/apps/utest-proc/src/lib.rs +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ - -use proc_macro::TokenStream; -use syn::ItemFn; - -extern crate proc_macro; - -#[proc_macro_attribute] -pub fn test(_: TokenStream, input: TokenStream) -> TokenStream { - let input = syn::parse_macro_input!(input as ItemFn); - - let name = &input.sig.ident; - let vis = &input.vis; - let body = &input.block; - - let marker_name = quote::format_ident!("{}_func", name); - - let result = quote::quote! { - #[allow(warnings)] - #vis static #name: crate::Test = crate::Test { - func: #marker_name, - path: concat!(module_path!(), "::", stringify!(#name)) - }; - - fn #marker_name() -> Result<(), SyscallError> { - #body - } - }; - - result.into() -} diff --git a/userland/apps/utest/Cargo.toml b/userland/apps/utest/Cargo.toml deleted file mode 100644 index fd91d4036b9..00000000000 --- a/userland/apps/utest/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "utest" -version = "0.1.0" -edition = "2021" -authors = ["Anhad Singh "] - -[dependencies] -aero_syscall = { path = "../../../src/aero_syscall" } -aero_ipc = { path = "../../libs/aero_ipc" } -utest-proc = { path = "../utest-proc" } diff --git a/userland/apps/utest/src/main.rs b/userland/apps/utest/src/main.rs deleted file mode 100644 index 985fa506b0c..00000000000 --- a/userland/apps/utest/src/main.rs +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ - -#![feature(naked_functions)] - -use core::sync::atomic::{AtomicUsize, Ordering}; - -use aero_syscall::signal::*; -use aero_syscall::*; - -mod mmap; - -pub struct Test<'a> { - path: &'a str, - func: fn() -> Result<(), SyscallError>, -} - -static TEST_FUNCTIONS: &[&'static Test<'static>] = &[ - // TODO: Why does clone process fail? - // &clone_process, - &sysenter_test, - &rpc_test, - &forked_pipe, - &signal_handler, - &dup_fds, - &dup2_redirect_stdout, - &fcntl_get_set_fdflags, - // mmap tests: - &mmap::zero_sized_mapping, -]; - -fn main() { - sys_open("/dev/tty", OpenFlags::O_RDONLY).expect("Failed to open stdin"); - sys_open("/dev/tty", OpenFlags::O_WRONLY).expect("Failed to open stdout"); - sys_open("/dev/tty", OpenFlags::O_WRONLY).expect("Failed to open stderr"); - - println!("running {} tests", TEST_FUNCTIONS.len()); - - for test_function in TEST_FUNCTIONS { - (test_function.func)().unwrap(); - println!("test {} ... \x1b[1;32mok\x1b[0m", test_function.path); - } -} - -#[utest_proc::test] -fn fcntl_get_set_fdflags() -> Result<(), SyscallError> { - let fd = sys_open("/dev/tty", OpenFlags::O_RDONLY)?; - let flags = prelude::FdFlags::CLOEXEC; - - sys_fcntl(fd, prelude::F_SETFD, flags.bits())?; - let fd_flags = sys_fcntl(fd, prelude::F_GETFD, 0)?; - - core::assert_eq!(fd_flags, flags.bits()); - - sys_close(fd)?; - Ok(()) -} - -#[utest_proc::test] -fn dup2_redirect_stdout() -> Result<(), SyscallError> { - let utest_fd = sys_open("utest.txt", OpenFlags::O_WRONLY | OpenFlags::O_CREAT)?; - - // We set the new_fd to the file descriptor of stdout (i.e. 1) - sys_dup2(utest_fd, 1, OpenFlags::O_WRONLY)?; - - // Now if we write to stdout, it will be written to utest.txt - println!("yes"); - - sys_seek(utest_fd, 0, SeekWhence::SeekSet)?; - - let mut content = [0; 3]; - sys_read(utest_fd, &mut content)?; - - core::assert_eq!(&content, b"yes"); - - sys_unlink(AT_FDCWD as usize, "utest.txt", OpenFlags::empty())?; - sys_close(utest_fd)?; - - // Restore the actual stdout. - let tty_fd = sys_open("/dev/tty", OpenFlags::O_WRONLY)?; - sys_dup2(tty_fd, 1, OpenFlags::O_WRONLY)?; - - Ok(()) -} - -#[utest_proc::test] -fn dup_fds() -> Result<(), SyscallError> { - let utest_fd = sys_open("utest.txt", OpenFlags::O_WRONLY | OpenFlags::O_CREAT)?; - - // dup() will create a copy of the utest fd as cutest_fd then both can - // be used interchangeably. - let cutest_fd = sys_dup(utest_fd, OpenFlags::O_RDWR)?; - - sys_write(utest_fd, b"testing ")?; - sys_write(cutest_fd, b"dup...\n")?; - - sys_seek(utest_fd, 0, SeekWhence::SeekSet)?; - - let mut content = [0; 15]; - sys_read(utest_fd, &mut content)?; - - core::assert_eq!(&content, b"testing dup...\n"); - - sys_unlink(AT_FDCWD as usize, "utest.txt", OpenFlags::empty())?; - - // Close all of the fds. - sys_close(utest_fd)?; - sys_close(cutest_fd)?; - - Ok(()) -} - -#[utest_proc::test] -fn signal_handler() -> Result<(), SyscallError> { - let child = sys_fork()?; - - // We perform the test in a forked process since then we dont - // have to worry about restoring the signal handlers. - if child == 0 { - let mut pipe = [0usize; 2]; - sys_pipe(&mut pipe, OpenFlags::empty())?; - - static PIPE_WRITE: AtomicUsize = AtomicUsize::new(0); - PIPE_WRITE.store(pipe[1], Ordering::SeqCst); - - extern "C" fn handle_segmentation_fault(fault: usize) { - core::assert_eq!(fault, 11); - - let pfd = PIPE_WRITE.load(Ordering::SeqCst); - - // Dont worry about closing the file descriptors since they will - // be auto closed by the parent. - sys_write(pfd, b"yes").expect("failed to write to the pipe"); - sys_exit(0); - } - - // Install the signal handler. - let handler = SignalHandler::Handle(handle_segmentation_fault); - let sigaction = SigAction::new(handler, 0, SignalFlags::empty()); - - sys_sigaction(SIGSEGV, Some(&sigaction), None) - .expect("failed to install the segmentation fault handler"); - - // On fork the signal handler will be copied over to the child process. - let child = sys_fork()?; - - if child == 0 { - // Create a traditional page fault :^) - unsafe { - *(0xcafebabe as *mut usize) = 69; - } - } else { - let mut buffer = [0; 3]; - sys_read(pipe[0], &mut buffer)?; - - core::assert_eq!(&buffer, b"yes"); - } - - // Close the pipe - sys_close(pipe[0])?; - sys_close(pipe[1])?; - - sys_exit(0) - } else { - let mut status = 0; - sys_waitpid(child, &mut status, 0)?; - } - - Ok(()) -} - -#[utest_proc::test] -fn forked_pipe() -> Result<(), SyscallError> { - let mut pipe = [0usize; 2]; - sys_pipe(&mut pipe, OpenFlags::empty())?; - - let child = sys_fork()?; - - if child == 0 { - sys_close(pipe[0])?; // close the read end - - sys_write(pipe[1], b"Hello, World!")?; - - sys_close(pipe[1])?; // close the write end - sys_exit(0) - } else { - let mut status = 0; - sys_waitpid(child, &mut status, 0)?; - - sys_close(pipe[1])?; // close the write end - - let mut buffer = [0; 13]; - sys_read(pipe[0], &mut buffer)?; - - core::assert_eq!(&buffer, b"Hello, World!"); - - sys_close(pipe[0])?; // close the read end - } - - Ok(()) -} - -// Emulates how mlibc under the hood does clone() -#[utest_proc::test] -fn clone_process() -> Result<(), SyscallError> { - const STACK_SIZE: usize = 4096; - - #[naked] - unsafe extern "C" fn cloned_process_start() { - core::arch::asm!( - " - pop rdi - pop rsi - pop rdx - call cloned_process_trampoline - ", - options(noreturn) - ); - } - - #[no_mangle] - extern "C" fn cloned_process_trampoline(func: usize, arg: usize, tcb: usize) { - core::assert_eq!(tcb, 0xcafebabe); - core::assert_eq!(arg, 0xbabecafe); - - let ptr = func as *const (); - let code: extern "C" fn() = unsafe { core::mem::transmute(ptr) }; - - (code)(); - sys_exit(0); - } - - extern "C" fn cloned_process() { - println!("Hello, World from cloned process!"); - } - - // Allocate the stack for the child process. - let stack = sys_mmap( - 0, - STACK_SIZE, - MMapProt::PROT_READ | MMapProt::PROT_WRITE, - MMapFlags::MAP_PRIVATE | MMapFlags::MAP_ANONYOMUS, - -1isize as usize, - 0, - )?; - - let stack_top = stack + STACK_SIZE; - let mut stack_ptr = stack_top as *mut usize; - - // Prepare the stack for the child process. - unsafe { - *stack_ptr = 0xcafebabe; // TCB pointer - - stack_ptr = stack_ptr.sub(1); - *stack_ptr = 0xbabecafe; // User argument - - stack_ptr = stack_ptr.sub(1); - *stack_ptr = cloned_process as usize; // Inner function - } - - // Create the child process. - let child = sys_clone(cloned_process_start as usize, stack_ptr as usize)?; - - let mut status = 0; - sys_waitpid(child, &mut status, 0)?; - - // Free the allocated stack. - sys_munmap(stack, STACK_SIZE)?; - - let exit_code = status & 0xff; - - if exit_code != 0 { - core::panic!("child exited with a non-zero status code: {}", exit_code); - } - - Ok(()) -} - -aero_ipc::ipc! { - trait Hello { - fn hello(favorite_number: i32) -> (); - } -} - -struct HelloServer; - -impl Hello::Server for HelloServer { - fn hello(&self, favnum: i32) { - println!("hey: {}", favnum); - } -} - -#[utest_proc::test] -fn rpc_test() -> Result<(), SyscallError> { - aero_ipc::listen(Hello::handler(HelloServer {})); - let c = Hello::open(sys_getpid().unwrap()); - c.hello(3); - - Ok(()) -} - -#[utest_proc::test] -fn sysenter_test() -> Result<(), SyscallError> { - let pid = sys_fork()?; - - if pid == 0 { - unsafe { - core::arch::asm! { - "sysenter", - in("rcx") 0xf0f0usize << 48, - in("r11") 0x0f0fusize << 48, - } - } - - core::unreachable!(); - } else { - let mut status = 0; - sys_waitpid(pid, &mut status, 0)?; - } - - let msg = "sysenter works!\n"; - let ptr = msg.as_ptr(); - let len = msg.len(); - - unsafe { - core::arch::asm! { - " - mov r11, rsp - lea rcx, [rip + 1f] - sysenter - 1: - ", - in("rax") consts::SYS_WRITE, - in("rdi") 1, - in("rsi") ptr, - inout("rdx") len => _, - out("r11") _, - out("rcx") _, - } - } - - Ok(()) -} diff --git a/userland/apps/utest/src/mmap.rs b/userland/apps/utest/src/mmap.rs deleted file mode 100644 index 49c9eb0abaf..00000000000 --- a/userland/apps/utest/src/mmap.rs +++ /dev/null @@ -1,18 +0,0 @@ -use aero_syscall::*; - -/// Assert that the `mmap` syscall bails out when you provide `0` as the -/// size of the mapping. -#[utest_proc::test] -pub fn zero_sized_mapping() -> Result { - let result = sys_mmap( - 0, - 0, - MMapProt::PROT_READ, - MMapFlags::MAP_ANONYOMUS | MMapFlags::MAP_PRIVATE, - -1isize as usize, - 0, - ); - - core::assert_eq!(result, Err(SyscallError::EFAULT)); - Ok(()) -} diff --git a/userland/apps/window_test/src/main.rs b/userland/apps/window_test/src/main.rs index 6b381df06d1..2adf6124ad9 100644 --- a/userland/apps/window_test/src/main.rs +++ b/userland/apps/window_test/src/main.rs @@ -1,24 +1,22 @@ -/* -* Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use aero_ipc::{SystemService, WindowService}; -use aero_syscall::*; +use aero_syscall::{sys_ipc_discover_root, SyscallError}; fn discover_service(name: &str) -> Result { let root_pid = sys_ipc_discover_root()?; diff --git a/userland/libs/aero_ipc/src/lib.rs b/userland/libs/aero_ipc/src/lib.rs index 45b41e51f87..5aff25713b6 100644 --- a/userland/libs/aero_ipc/src/lib.rs +++ b/userland/libs/aero_ipc/src/lib.rs @@ -1,21 +1,19 @@ -/* - * Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2022 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . #![feature(decl_macro)] mod interfaces; @@ -57,7 +55,8 @@ impl MessageTransport for SendReceiveTransport { IDALLOC.fetch_xor(value << 13, Ordering::SeqCst); IDALLOC.fetch_xor(value >> 7, Ordering::SeqCst); IDALLOC.fetch_xor(value << 17, Ordering::SeqCst); - return IDALLOC.fetch_add(1, Ordering::SeqCst) >> 3; + + IDALLOC.fetch_add(1, Ordering::SeqCst) >> 3 } fn free_id(_: usize) {} @@ -69,19 +68,17 @@ impl MessageTransport for SendReceiveTransport { loop { // get a response let rx = service_with_response_finding(); - match rx { - // if we got a response, - Some((srcpid, mut msg)) => { - // and the response has the correct message ID... - let mut deser = postcard::Deserializer::from_bytes(&msg); - let msgid = usize::deserialize(&mut deser) - .expect("message ID not present in the message!"); - if msgid == (mid << 1) | 1 && meta == srcpid { - // return the message contents! - return msg.split_off(core::mem::size_of::()); - } + + // if we got a response + if let Some((srcpid, mut msg)) = rx { + // and the response has the correct message ID... + let mut deser = postcard::Deserializer::from_bytes(&msg); + let msgid = + usize::deserialize(&mut deser).expect("message ID not present in the message!"); + if msgid == (mid << 1) | 1 && meta == srcpid { + // return the message contents! + return msg.split_off(core::mem::size_of::()); } - None => {} } } } @@ -257,10 +254,7 @@ pub fn service_request() { let msg = sys_ipc_recv(&mut src, arena.as_mut(), true).expect("sys_ipc_recv failed!"); - match handle_request(src, msg) { - Some(data) => { - sys_ipc_send(src, &data).expect("sys_ipc_send failed, reply dropped!"); - } - _ => {} + if let Some(data) = handle_request(src, msg) { + sys_ipc_send(src, &data).expect("sys_ipc_send failed, reply dropped!"); } } diff --git a/userland/servers/system_server/src/main.rs b/userland/servers/system_server/src/main.rs index f78189abc95..b0a24cf5d94 100644 --- a/userland/servers/system_server/src/main.rs +++ b/userland/servers/system_server/src/main.rs @@ -1,28 +1,27 @@ -/* -* Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use std::error::Error; use std::process::Command; use aero_ipc::{SystemService, SystemServiceError, SystemServiceResult}; use aero_syscall::*; -use hashbrown::{hash_map::Entry, HashMap}; +use hashbrown::hash_map::Entry; +use hashbrown::HashMap; use spin::RwLock; fn main() -> Result<(), Box> { @@ -68,7 +67,7 @@ impl SystemService::Server for SystemServer { self.services .read() .get(&name) - .map(|pid| *pid) + .copied() .ok_or(SystemServiceError::NotFound) } } diff --git a/userland/servers/window_server/Cargo.toml b/userland/servers/window_server/Cargo.toml index d10bc5f79b0..9370d4d6585 100644 --- a/userland/servers/window_server/Cargo.toml +++ b/userland/servers/window_server/Cargo.toml @@ -9,3 +9,4 @@ hashbrown = "0.12.0" spin = "0.9.8" aero_syscall = { path = "../../../src/aero_syscall" } aero_ipc = { path = "../../libs/aero_ipc" } +libc = { git = "https://github.com/Andy-Python-Programmer/libc" } diff --git a/userland/servers/window_server/src/main.rs b/userland/servers/window_server/src/main.rs index 85cd076db57..42d0841859e 100644 --- a/userland/servers/window_server/src/main.rs +++ b/userland/servers/window_server/src/main.rs @@ -1,27 +1,25 @@ -/* -* Copyright (C) 2021-2022 The Aero Project Developers. - * - * This file is part of The Aero Project. - * - * Aero is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Aero is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aero. If not, see . - */ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . use aero_ipc::{SystemService, WindowService}; -use aero_syscall::*; +use aero_syscall::sys_ipc_discover_root; fn main() { - let self_pid = sys_getpid().unwrap(); + let self_pid = unsafe { libc::getpid() as usize }; let ipc_root = sys_ipc_discover_root().unwrap(); let system_client = SystemService::open(ipc_root); From 11dab1ebcdf14b06433ed4032ea929a1ab58df33 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 26 May 2023 18:20:29 +1000 Subject: [PATCH 228/368] tty: move vtty[n] to a submodule Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/keyboard.rs | 9 - src/aero_kernel/src/drivers/tty/mod.rs | 533 +---------------------- src/aero_kernel/src/drivers/tty/vtty.rs | 538 ++++++++++++++++++++++++ 3 files changed, 542 insertions(+), 538 deletions(-) create mode 100644 src/aero_kernel/src/drivers/tty/vtty.rs diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index 00d884c0293..1968a2e40fb 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -307,15 +307,6 @@ pub fn register_keyboard_listener(listener: Arc) { KEYBOARD_LISTENER.write().push(listener) } -pub fn remove_keyboard_listener(target: Arc) { - for (index, listener) in KEYBOARD_LISTENER.read().iter().enumerate() { - if Arc::ptr_eq(listener, &target) { - KEYBOARD_LISTENER.write().remove(index); - return; - } - } -} - pub fn keyboard_irq_handler(_stack: &mut InterruptStack) { let scancode = unsafe { io::inb(0x60) }; diff --git a/src/aero_kernel/src/drivers/tty/mod.rs b/src/aero_kernel/src/drivers/tty/mod.rs index 0451f5b6038..a98769fc943 100644 --- a/src/aero_kernel/src/drivers/tty/mod.rs +++ b/src/aero_kernel/src/drivers/tty/mod.rs @@ -15,537 +15,12 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -// `/dev/tty`: controlling terminal of the process -// `/dev/vtty[0-9]`: virtual terminals - mod ctty; +mod vtty; -use core::sync::atomic::{AtomicUsize, Ordering}; - -use alloc::sync::{Arc, Weak}; -use alloc::vec::Vec; - -use crate::fs::inode::{self, PollFlags, PollTable}; -use crate::fs::{devfs, FileSystemError}; -use crate::{fs, rendy}; - -use crate::fs::inode::INodeInterface; -use crate::mem::paging::VirtAddr; -use crate::userland::scheduler; -use crate::userland::task::Task; -use crate::userland::terminal::TerminalDevice; -use crate::utils::sync::{Mutex, WaitQueue}; - -#[cfg(target_arch = "x86_64")] -use super::keyboard::KeyCode; -#[cfg(target_arch = "x86_64")] -use super::keyboard::KeyboardListener; - -lazy_static::lazy_static! { - static ref TTY: Arc = Tty::new(); - - static ref TERMIOS: Mutex = Mutex::new(aero_syscall::Termios { - c_iflag: aero_syscall::TermiosIFlag::empty(), - c_oflag: aero_syscall::TermiosOFlag::empty(), - c_cflag: aero_syscall::TermiosCFlag::empty(), - c_lflag: aero_syscall::TermiosLFlag::ECHO | aero_syscall::TermiosLFlag::ICANON, - c_line: 0, - c_cc: [0; 32], - c_ispeed: 0, - c_ospeed: 0, - }); -} - -// From the linux kernel: https://github.com/torvalds/linux/blob/master/drivers/tty/vt/defkeymap.c_shipped -const PLAIN_MAP: &[u16; 128] = &[ - 0xf200, 0xf01b, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036, 0xf037, 0xf038, 0xf039, 0xf030, - 0xf02d, 0xf03d, 0xf07f, 0xf009, 0xfb71, 0xfb77, 0xfb65, 0xfb72, 0xfb74, 0xfb79, 0xfb75, 0xfb69, - 0xfb6f, 0xfb70, 0xf05b, 0xf05d, 0xf201, 0xf702, 0xfb61, 0xfb73, 0xfb64, 0xfb66, 0xfb67, 0xfb68, - 0xfb6a, 0xfb6b, 0xfb6c, 0xf03b, 0xf027, 0xf060, 0xf700, 0xf05c, 0xfb7a, 0xfb78, 0xfb63, 0xfb76, - 0xfb62, 0xfb6e, 0xfb6d, 0xf02c, 0xf02e, 0xf02f, 0xf700, 0xf30c, 0xf703, 0xf020, 0xf207, 0xf100, - 0xf101, 0xf102, 0xf103, 0xf104, 0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf208, 0xf209, 0xf307, - 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, 0xf302, 0xf303, 0xf300, 0xf310, - 0xf206, 0xf200, 0xf03c, 0xf10a, 0xf10b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf01c, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf601, 0xf602, 0xf117, - 0xf600, 0xf119, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -]; - -const SHIFT_MAP: &[u16; 128] = &[ - 0xf200, 0xf01b, 0xf021, 0xf040, 0xf023, 0xf024, 0xf025, 0xf05e, 0xf026, 0xf02a, 0xf028, 0xf029, - 0xf05f, 0xf02b, 0xf07f, 0xf009, 0xfb51, 0xfb57, 0xfb45, 0xfb52, 0xfb54, 0xfb59, 0xfb55, 0xfb49, - 0xfb4f, 0xfb50, 0xf07b, 0xf07d, 0xf201, 0xf702, 0xfb41, 0xfb53, 0xfb44, 0xfb46, 0xfb47, 0xfb48, - 0xfb4a, 0xfb4b, 0xfb4c, 0xf03a, 0xf022, 0xf07e, 0xf700, 0xf07c, 0xfb5a, 0xfb58, 0xfb43, 0xfb56, - 0xfb42, 0xfb4e, 0xfb4d, 0xf03c, 0xf03e, 0xf03f, 0xf700, 0xf30c, 0xf703, 0xf020, 0xf207, 0xf10a, - 0xf10b, 0xf10c, 0xf10d, 0xf10e, 0xf10f, 0xf110, 0xf111, 0xf112, 0xf113, 0xf213, 0xf203, 0xf307, - 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, 0xf302, 0xf303, 0xf300, 0xf310, - 0xf206, 0xf200, 0xf03e, 0xf10a, 0xf10b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, 0xf20b, 0xf601, 0xf602, 0xf117, - 0xf600, 0xf20a, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -]; - -const ALTGR_MAP: &[u16; 128] = &[ - 0xf200, 0xf200, 0xf200, 0xf040, 0xf200, 0xf024, 0xf200, 0xf200, 0xf07b, 0xf05b, 0xf05d, 0xf07d, - 0xf05c, 0xf200, 0xf200, 0xf200, 0xfb71, 0xfb77, 0xf918, 0xfb72, 0xfb74, 0xfb79, 0xfb75, 0xfb69, - 0xfb6f, 0xfb70, 0xf200, 0xf07e, 0xf201, 0xf702, 0xf914, 0xfb73, 0xf917, 0xf919, 0xfb67, 0xfb68, - 0xfb6a, 0xfb6b, 0xfb6c, 0xf200, 0xf200, 0xf200, 0xf700, 0xf200, 0xfb7a, 0xfb78, 0xf916, 0xfb76, - 0xf915, 0xfb6e, 0xfb6d, 0xf200, 0xf200, 0xf200, 0xf700, 0xf30c, 0xf703, 0xf200, 0xf207, 0xf50c, - 0xf50d, 0xf50e, 0xf50f, 0xf510, 0xf511, 0xf512, 0xf513, 0xf514, 0xf515, 0xf208, 0xf202, 0xf911, - 0xf912, 0xf913, 0xf30b, 0xf90e, 0xf90f, 0xf910, 0xf30a, 0xf90b, 0xf90c, 0xf90d, 0xf90a, 0xf310, - 0xf206, 0xf200, 0xf07c, 0xf516, 0xf517, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf601, 0xf602, 0xf117, - 0xf600, 0xf119, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -]; - -const CTRL_MAP: &[u16; 128] = &[ - 0xf200, 0xf200, 0xf200, 0xf000, 0xf01b, 0xf01c, 0xf01d, 0xf01e, 0xf01f, 0xf07f, 0xf200, 0xf200, - 0xf01f, 0xf200, 0xf008, 0xf200, 0xf011, 0xf017, 0xf005, 0xf012, 0xf014, 0xf019, 0xf015, 0xf009, - 0xf00f, 0xf010, 0xf01b, 0xf01d, 0xf201, 0xf702, 0xf001, 0xf013, 0xf004, 0xf006, 0xf007, 0xf008, - 0xf00a, 0xf00b, 0xf00c, 0xf200, 0xf007, 0xf000, 0xf700, 0xf01c, 0xf01a, 0xf018, 0xf003, 0xf016, - 0xf002, 0xf00e, 0xf00d, 0xf200, 0xf20e, 0xf07f, 0xf700, 0xf30c, 0xf703, 0xf000, 0xf207, 0xf100, - 0xf101, 0xf102, 0xf103, 0xf104, 0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf208, 0xf204, 0xf307, - 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, 0xf302, 0xf303, 0xf300, 0xf310, - 0xf206, 0xf200, 0xf200, 0xf10a, 0xf10b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf01c, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf601, 0xf602, 0xf117, - 0xf600, 0xf119, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -]; - -const SHIFT_CTRL_MAP: &[u16; 128] = &[ - 0xf200, 0xf200, 0xf200, 0xf000, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf01f, 0xf200, 0xf200, 0xf200, 0xf011, 0xf017, 0xf005, 0xf012, 0xf014, 0xf019, 0xf015, 0xf009, - 0xf00f, 0xf010, 0xf200, 0xf200, 0xf201, 0xf702, 0xf001, 0xf013, 0xf004, 0xf006, 0xf007, 0xf008, - 0xf00a, 0xf00b, 0xf00c, 0xf200, 0xf200, 0xf200, 0xf700, 0xf200, 0xf01a, 0xf018, 0xf003, 0xf016, - 0xf002, 0xf00e, 0xf00d, 0xf200, 0xf200, 0xf200, 0xf700, 0xf30c, 0xf703, 0xf200, 0xf207, 0xf200, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf208, 0xf200, 0xf307, - 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, 0xf302, 0xf303, 0xf300, 0xf310, - 0xf206, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf601, 0xf602, 0xf117, - 0xf600, 0xf119, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -]; - -const ALT_MAP: &[u16; 128] = &[ - 0xf200, 0xf81b, 0xf831, 0xf832, 0xf833, 0xf834, 0xf835, 0xf836, 0xf837, 0xf838, 0xf839, 0xf830, - 0xf82d, 0xf83d, 0xf87f, 0xf809, 0xf871, 0xf877, 0xf865, 0xf872, 0xf874, 0xf879, 0xf875, 0xf869, - 0xf86f, 0xf870, 0xf85b, 0xf85d, 0xf80d, 0xf702, 0xf861, 0xf873, 0xf864, 0xf866, 0xf867, 0xf868, - 0xf86a, 0xf86b, 0xf86c, 0xf83b, 0xf827, 0xf860, 0xf700, 0xf85c, 0xf87a, 0xf878, 0xf863, 0xf876, - 0xf862, 0xf86e, 0xf86d, 0xf82c, 0xf82e, 0xf82f, 0xf700, 0xf30c, 0xf703, 0xf820, 0xf207, 0xf500, - 0xf501, 0xf502, 0xf503, 0xf504, 0xf505, 0xf506, 0xf507, 0xf508, 0xf509, 0xf208, 0xf209, 0xf907, - 0xf908, 0xf909, 0xf30b, 0xf904, 0xf905, 0xf906, 0xf30a, 0xf901, 0xf902, 0xf903, 0xf900, 0xf310, - 0xf206, 0xf200, 0xf83c, 0xf50a, 0xf50b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf01c, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf210, 0xf211, 0xf117, - 0xf600, 0xf119, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -]; - -const CTRL_ALT_MAP: &[u16; 128] = &[ - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf811, 0xf817, 0xf805, 0xf812, 0xf814, 0xf819, 0xf815, 0xf809, - 0xf80f, 0xf810, 0xf200, 0xf200, 0xf201, 0xf702, 0xf801, 0xf813, 0xf804, 0xf806, 0xf807, 0xf808, - 0xf80a, 0xf80b, 0xf80c, 0xf200, 0xf200, 0xf200, 0xf700, 0xf200, 0xf81a, 0xf818, 0xf803, 0xf816, - 0xf802, 0xf80e, 0xf80d, 0xf200, 0xf200, 0xf200, 0xf700, 0xf30c, 0xf703, 0xf200, 0xf207, 0xf500, - 0xf501, 0xf502, 0xf503, 0xf504, 0xf505, 0xf506, 0xf507, 0xf508, 0xf509, 0xf208, 0xf200, 0xf307, - 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, 0xf302, 0xf303, 0xf300, 0xf20c, - 0xf206, 0xf200, 0xf200, 0xf50a, 0xf50b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, - 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf601, 0xf602, 0xf117, - 0xf600, 0xf119, 0xf115, 0xf20c, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, - 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, -]; - -struct StdinBuffer { - back_buffer: Vec, - front_buffer: Vec, // more like a queue - - cursor: usize, -} - -impl StdinBuffer { - fn new() -> Self { - Self { - back_buffer: Vec::new(), - front_buffer: Vec::new(), - - cursor: 0, - } - } - - fn swap_buffer(&mut self) { - for c in self.back_buffer.drain(..) { - self.front_buffer.push(c); - } - } - - fn is_complete(&self) -> bool { - !self.back_buffer.is_empty() || !self.front_buffer.is_empty() - } - - fn advance_cursor(&mut self) { - self.cursor += 1; - } -} - -struct TtyState { - lshift: bool, - rshift: bool, - lctrl: bool, - rctrl: bool, - lalt: bool, - altgr: bool, - caps: bool, -} - -struct Tty { - device_id: usize, - state: Mutex, - sref: Weak, - - stdin: Mutex, - block_queue: WaitQueue, - - connected: AtomicUsize, -} - -impl Tty { - fn new() -> Arc { - Arc::new_cyclic(|sref| Self { - device_id: devfs::alloc_device_marker(), - state: Mutex::new(TtyState { - lshift: false, - rshift: false, - lctrl: false, - rctrl: false, - lalt: false, - altgr: false, - caps: false, - }), - block_queue: WaitQueue::new(), - stdin: Mutex::new(StdinBuffer::new()), - connected: AtomicUsize::new(0), - sref: sref.clone(), - }) - } -} - -impl INodeInterface for Tty { - fn open( - &self, - _flags: aero_syscall::OpenFlags, - _handle: Arc, - ) -> fs::Result> { - let connected = self.connected.fetch_add(1, Ordering::SeqCst); - if connected == 0 { - super::keyboard::register_keyboard_listener(TTY.clone()); - - // FIXME: This is wrong since programs assume that /dev/tty points to the controlling - // terminal not TTY1,TTY2, etc.. This means that the Aero rendy should be another device - // node. - let current_task = scheduler::get_scheduler().current_task(); - current_task.attach(self.sref.upgrade().unwrap()); - } - - Ok(None) - } - - fn close(&self, _flags: aero_syscall::OpenFlags) { - let connected = self.connected.fetch_sub(1, Ordering::SeqCst); - if connected == 1 { - // We were the last process that was connected to the TTY; remove - // the keyboard listener. - super::keyboard::remove_keyboard_listener(TTY.clone()); - } - } - - fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { - self.block_queue - .block_on(&self.stdin, |future| future.is_complete())?; - - let mut stdin = self.stdin.lock_irq(); - - // record the back buffer size before swapping - stdin.swap_buffer(); - let back_len = stdin.front_buffer.len(); - - if buffer.len() > stdin.front_buffer.len() { - for (i, c) in stdin.front_buffer.drain(..).enumerate() { - buffer[i] = c; - } - } else { - for (i, c) in stdin.front_buffer.drain(..buffer.len()).enumerate() { - buffer[i] = c; - } - } - - Ok(core::cmp::min(buffer.len(), back_len)) - } - - fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { - let string = core::str::from_utf8(buffer).map_err(|_| FileSystemError::NotSupported)?; - - crate::rendy::print!("{}", string); - - log::debug!("TTY::write_at(): {}", unsafe { - core::str::from_utf8_unchecked(buffer) - }); - - Ok(buffer.len()) - } - - fn poll(&self, table: Option<&mut PollTable>) -> fs::Result { - if let Some(e) = table { - e.insert(&self.block_queue) - } - let mut events = PollFlags::empty(); - - if self.stdin.lock_irq().is_complete() { - events.insert(PollFlags::IN); - } - - Ok(events) - } - - fn ioctl(&self, command: usize, arg: usize) -> fs::Result { - match command { - aero_syscall::TIOCGWINSZ => { - let winsize = VirtAddr::new(arg as u64); - let winsize = unsafe { &mut *(winsize.as_mut_ptr::()) }; - - let (rows, cols) = rendy::get_rows_cols(); - - winsize.ws_row = rows as u16; - winsize.ws_col = cols as u16; - - let (xpixel, ypixel) = rendy::get_resolution(); - - winsize.ws_xpixel = xpixel as u16; - winsize.ws_ypixel = ypixel as u16; - - Ok(0x00) - } - - aero_syscall::TCGETS => { - let termios = VirtAddr::new(arg as u64); - let termios = unsafe { &mut *(termios.as_mut_ptr::()) }; - - let lock = TERMIOS.lock_irq(); - let this = &*lock; - - *termios = *this; - Ok(0x00) - } - - aero_syscall::TCSETSF => { - // Allow the output buffer to drain, discard pending input. - let mut stdin = self.stdin.lock_irq(); - stdin.back_buffer.clear(); - stdin.cursor = 0; - core::mem::drop(stdin); - - let termios = VirtAddr::new(arg as u64); - let termios = unsafe { &*(termios.as_mut_ptr::()) }; - - let mut lock = TERMIOS.lock_irq(); - let this = &mut *lock; - - *this = *termios; - Ok(0x00) - } - - _ => Err(fs::FileSystemError::NotSupported), - } - } -} - -impl devfs::Device for Tty { - fn device_marker(&self) -> usize { - self.device_id - } - - fn device_name(&self) -> String { - String::from("vtty") - } - - fn inode(&self) -> Arc { - self.sref.upgrade().unwrap() - } -} - -impl TerminalDevice for Tty { - fn attach(&self, _task: Arc) { - // FIXME: We should handle foreground groups in TTY aswell - } - - fn detach(&self, _task: Arc) { - // FIXME: TTY handle - } -} - -#[cfg(target_arch = "x86_64")] -impl KeyboardListener for Tty { - fn on_key(&self, key: KeyCode, released: bool) { - let mut state = self.state.lock(); - let termios = TERMIOS.lock_irq(); - - let push_str = |k: &str| { - // TODO: decckm - let mut stdin = self.stdin.lock_irq(); - - for each in k.bytes() { - stdin.back_buffer.push(each); - } - }; - - let lchar = || { - let mut shift = state.lshift || state.rshift; - let ctrl = state.lctrl || state.rctrl; - - if state.caps && state.caps { - shift = !shift; - } - - let map = match (shift, ctrl, state.lalt, state.altgr) { - (false, false, false, false) => PLAIN_MAP, - (true, false, false, false) => SHIFT_MAP, - (false, true, false, false) => CTRL_MAP, - (false, false, true, false) => ALT_MAP, - (false, false, false, true) => ALTGR_MAP, - (true, true, false, false) => SHIFT_CTRL_MAP, - (false, true, true, false) => CTRL_ALT_MAP, - _ => PLAIN_MAP, - }; - - let character = - unsafe { core::char::from_u32_unchecked((map[key as usize] & 0xff) as _) }; - - // Check if the character is actually printable printable. - if !(0x20..0x7e).contains(&(character as u32)) { - return; - } - - { - let mut stdin = self.stdin.lock_irq(); - - stdin.back_buffer.push(character as u8); - stdin.advance_cursor(); - } - - if termios.c_lflag.contains(aero_syscall::TermiosLFlag::ECHO) { - rendy::print!("{}", character); - } - }; - - let backspace = || { - if termios.c_lflag.contains(aero_syscall::TermiosLFlag::ICANON) { - let mut stdin = self.stdin.lock_irq(); - - if stdin.back_buffer.pop().is_some() - && termios.c_lflag.contains(aero_syscall::TermiosLFlag::ECHO) - { - rendy::backspace(); - stdin.cursor -= 1; - } - } else { - push_str("\x08"); - } - }; - - if !termios.c_lflag.contains(aero_syscall::TermiosLFlag::ICANON) && !released { - match key { - KeyCode::KEY_BACKSPACE if !released => backspace(), - KeyCode::KEY_CAPSLOCK if !released => state.caps = !state.caps, - - KeyCode::KEY_LEFTSHIFT => state.lshift = !released, - KeyCode::KEY_RIGHTSHIFT => state.rshift = !released, - - KeyCode::KEY_LEFTCTRL => state.lctrl = !released, - KeyCode::KEY_RIGHTCTRL => state.rctrl = !released, - - KeyCode::KEY_LEFTALT => state.lalt = !released, - KeyCode::KEY_RIGHTALT => state.altgr = !released, - KeyCode::KEY_ENTER => push_str("\n"), - - KeyCode::KEY_UP => push_str("\x1b[A"), - KeyCode::KEY_LEFT => push_str("\x1b[D"), - KeyCode::KEY_DOWN => push_str("\x1b[B"), - KeyCode::KEY_RIGHT => push_str("\x1b[C"), - - _ if !released => lchar(), - _ => {} - } - - self.stdin.lock_irq().cursor = 0; - self.block_queue.notify_all(); - return; - } - - match key { - KeyCode::KEY_CAPSLOCK if !released => state.caps = !state.caps, - KeyCode::KEY_ENTER | KeyCode::KEY_KPENTER if !released => { - let mut stdin = self.stdin.lock_irq(); - - stdin.back_buffer.push(b'\n'); - stdin.cursor = 0; - - if termios.c_lflag.contains(aero_syscall::TermiosLFlag::ECHO) { - rendy::print!("\n"); - } - - self.block_queue.notify_all(); - } - - KeyCode::KEY_BACKSPACE if !released => backspace(), - - KeyCode::KEY_LEFTSHIFT => state.lshift = !released, - KeyCode::KEY_RIGHTSHIFT => state.rshift = !released, - - KeyCode::KEY_LEFTCTRL => state.lctrl = !released, - KeyCode::KEY_RIGHTCTRL => state.rctrl = !released, - - KeyCode::KEY_LEFTALT => state.lalt = !released, - KeyCode::KEY_RIGHTALT => state.altgr = !released, - - KeyCode::KEY_LEFT if !released => { - let mut stdin = self.stdin.lock_irq(); - - // We are at the start of the input so, we cannot shift - // the cursor to the left anymore. - if stdin.cursor == 0 { - return; - } - - let (x, y) = rendy::get_cursor_position(); - rendy::set_cursor_position(x - 1, y); - - stdin.cursor -= 1; - } - - KeyCode::KEY_RIGHT if !released => { - let mut stdin = self.stdin.lock_irq(); - - // We are at the end of the input so, we cannot shift - // the cursor to the right anymore. - if stdin.cursor == stdin.back_buffer.len() { - return; - } - - let (x, y) = rendy::get_cursor_position(); - rendy::set_cursor_position(x + 1, y); - - stdin.advance_cursor(); - } - - _ if !released => lchar(), - - _ => {} - } - } -} - -fn init_tty() { - devfs::install_device(TTY.clone()).expect("failed to register tty as a device"); +fn init() { ctty::init().unwrap(); + vtty::init().unwrap(); } -crate::module_init!(init_tty, ModuleType::Other); +crate::module_init!(init, ModuleType::Other); diff --git a/src/aero_kernel/src/drivers/tty/vtty.rs b/src/aero_kernel/src/drivers/tty/vtty.rs new file mode 100644 index 00000000000..236714639a0 --- /dev/null +++ b/src/aero_kernel/src/drivers/tty/vtty.rs @@ -0,0 +1,538 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +//! `/dev/vtty[0-9]`: virtual terminals + +use core::sync::atomic::{AtomicUsize, Ordering}; + +use alloc::sync::{Arc, Weak}; +use alloc::vec::Vec; + +use crate::fs::inode::{self, PollFlags, PollTable}; +use crate::fs::{devfs, FileSystemError}; +use crate::{fs, rendy}; + +use crate::fs::inode::INodeInterface; +use crate::mem::paging::VirtAddr; +use crate::userland::scheduler; +use crate::userland::task::Task; +use crate::userland::terminal::TerminalDevice; +use crate::utils::sync::{Mutex, WaitQueue}; + +#[cfg(target_arch = "x86_64")] +use crate::drivers::keyboard::KeyCode; +#[cfg(target_arch = "x86_64")] +use crate::drivers::keyboard::KeyboardListener; + +lazy_static::lazy_static! { + static ref TTY: Arc = Tty::new(); + + static ref TERMIOS: Mutex = Mutex::new(aero_syscall::Termios { + c_iflag: aero_syscall::TermiosIFlag::empty(), + c_oflag: aero_syscall::TermiosOFlag::empty(), + c_cflag: aero_syscall::TermiosCFlag::empty(), + c_lflag: aero_syscall::TermiosLFlag::ECHO | aero_syscall::TermiosLFlag::ICANON, + c_line: 0, + c_cc: [0; 32], + c_ispeed: 0, + c_ospeed: 0, + }); +} + +// From the linux kernel: https://github.com/torvalds/linux/blob/master/drivers/tty/vt/defkeymap.c_shipped +const PLAIN_MAP: &[u16; 128] = &[ + 0xf200, 0xf01b, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036, 0xf037, 0xf038, 0xf039, 0xf030, + 0xf02d, 0xf03d, 0xf07f, 0xf009, 0xfb71, 0xfb77, 0xfb65, 0xfb72, 0xfb74, 0xfb79, 0xfb75, 0xfb69, + 0xfb6f, 0xfb70, 0xf05b, 0xf05d, 0xf201, 0xf702, 0xfb61, 0xfb73, 0xfb64, 0xfb66, 0xfb67, 0xfb68, + 0xfb6a, 0xfb6b, 0xfb6c, 0xf03b, 0xf027, 0xf060, 0xf700, 0xf05c, 0xfb7a, 0xfb78, 0xfb63, 0xfb76, + 0xfb62, 0xfb6e, 0xfb6d, 0xf02c, 0xf02e, 0xf02f, 0xf700, 0xf30c, 0xf703, 0xf020, 0xf207, 0xf100, + 0xf101, 0xf102, 0xf103, 0xf104, 0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf208, 0xf209, 0xf307, + 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, 0xf302, 0xf303, 0xf300, 0xf310, + 0xf206, 0xf200, 0xf03c, 0xf10a, 0xf10b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, + 0xf30e, 0xf702, 0xf30d, 0xf01c, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf601, 0xf602, 0xf117, + 0xf600, 0xf119, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, + 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, +]; + +const SHIFT_MAP: &[u16; 128] = &[ + 0xf200, 0xf01b, 0xf021, 0xf040, 0xf023, 0xf024, 0xf025, 0xf05e, 0xf026, 0xf02a, 0xf028, 0xf029, + 0xf05f, 0xf02b, 0xf07f, 0xf009, 0xfb51, 0xfb57, 0xfb45, 0xfb52, 0xfb54, 0xfb59, 0xfb55, 0xfb49, + 0xfb4f, 0xfb50, 0xf07b, 0xf07d, 0xf201, 0xf702, 0xfb41, 0xfb53, 0xfb44, 0xfb46, 0xfb47, 0xfb48, + 0xfb4a, 0xfb4b, 0xfb4c, 0xf03a, 0xf022, 0xf07e, 0xf700, 0xf07c, 0xfb5a, 0xfb58, 0xfb43, 0xfb56, + 0xfb42, 0xfb4e, 0xfb4d, 0xf03c, 0xf03e, 0xf03f, 0xf700, 0xf30c, 0xf703, 0xf020, 0xf207, 0xf10a, + 0xf10b, 0xf10c, 0xf10d, 0xf10e, 0xf10f, 0xf110, 0xf111, 0xf112, 0xf113, 0xf213, 0xf203, 0xf307, + 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, 0xf302, 0xf303, 0xf300, 0xf310, + 0xf206, 0xf200, 0xf03e, 0xf10a, 0xf10b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, + 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, 0xf20b, 0xf601, 0xf602, 0xf117, + 0xf600, 0xf20a, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, + 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, +]; + +const ALTGR_MAP: &[u16; 128] = &[ + 0xf200, 0xf200, 0xf200, 0xf040, 0xf200, 0xf024, 0xf200, 0xf200, 0xf07b, 0xf05b, 0xf05d, 0xf07d, + 0xf05c, 0xf200, 0xf200, 0xf200, 0xfb71, 0xfb77, 0xf918, 0xfb72, 0xfb74, 0xfb79, 0xfb75, 0xfb69, + 0xfb6f, 0xfb70, 0xf200, 0xf07e, 0xf201, 0xf702, 0xf914, 0xfb73, 0xf917, 0xf919, 0xfb67, 0xfb68, + 0xfb6a, 0xfb6b, 0xfb6c, 0xf200, 0xf200, 0xf200, 0xf700, 0xf200, 0xfb7a, 0xfb78, 0xf916, 0xfb76, + 0xf915, 0xfb6e, 0xfb6d, 0xf200, 0xf200, 0xf200, 0xf700, 0xf30c, 0xf703, 0xf200, 0xf207, 0xf50c, + 0xf50d, 0xf50e, 0xf50f, 0xf510, 0xf511, 0xf512, 0xf513, 0xf514, 0xf515, 0xf208, 0xf202, 0xf911, + 0xf912, 0xf913, 0xf30b, 0xf90e, 0xf90f, 0xf910, 0xf30a, 0xf90b, 0xf90c, 0xf90d, 0xf90a, 0xf310, + 0xf206, 0xf200, 0xf07c, 0xf516, 0xf517, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, + 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf601, 0xf602, 0xf117, + 0xf600, 0xf119, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, + 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, +]; + +const CTRL_MAP: &[u16; 128] = &[ + 0xf200, 0xf200, 0xf200, 0xf000, 0xf01b, 0xf01c, 0xf01d, 0xf01e, 0xf01f, 0xf07f, 0xf200, 0xf200, + 0xf01f, 0xf200, 0xf008, 0xf200, 0xf011, 0xf017, 0xf005, 0xf012, 0xf014, 0xf019, 0xf015, 0xf009, + 0xf00f, 0xf010, 0xf01b, 0xf01d, 0xf201, 0xf702, 0xf001, 0xf013, 0xf004, 0xf006, 0xf007, 0xf008, + 0xf00a, 0xf00b, 0xf00c, 0xf200, 0xf007, 0xf000, 0xf700, 0xf01c, 0xf01a, 0xf018, 0xf003, 0xf016, + 0xf002, 0xf00e, 0xf00d, 0xf200, 0xf20e, 0xf07f, 0xf700, 0xf30c, 0xf703, 0xf000, 0xf207, 0xf100, + 0xf101, 0xf102, 0xf103, 0xf104, 0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf208, 0xf204, 0xf307, + 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, 0xf302, 0xf303, 0xf300, 0xf310, + 0xf206, 0xf200, 0xf200, 0xf10a, 0xf10b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, + 0xf30e, 0xf702, 0xf30d, 0xf01c, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf601, 0xf602, 0xf117, + 0xf600, 0xf119, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, + 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, +]; + +const SHIFT_CTRL_MAP: &[u16; 128] = &[ + 0xf200, 0xf200, 0xf200, 0xf000, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, + 0xf01f, 0xf200, 0xf200, 0xf200, 0xf011, 0xf017, 0xf005, 0xf012, 0xf014, 0xf019, 0xf015, 0xf009, + 0xf00f, 0xf010, 0xf200, 0xf200, 0xf201, 0xf702, 0xf001, 0xf013, 0xf004, 0xf006, 0xf007, 0xf008, + 0xf00a, 0xf00b, 0xf00c, 0xf200, 0xf200, 0xf200, 0xf700, 0xf200, 0xf01a, 0xf018, 0xf003, 0xf016, + 0xf002, 0xf00e, 0xf00d, 0xf200, 0xf200, 0xf200, 0xf700, 0xf30c, 0xf703, 0xf200, 0xf207, 0xf200, + 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf208, 0xf200, 0xf307, + 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, 0xf302, 0xf303, 0xf300, 0xf310, + 0xf206, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, + 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf601, 0xf602, 0xf117, + 0xf600, 0xf119, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, + 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, +]; + +const ALT_MAP: &[u16; 128] = &[ + 0xf200, 0xf81b, 0xf831, 0xf832, 0xf833, 0xf834, 0xf835, 0xf836, 0xf837, 0xf838, 0xf839, 0xf830, + 0xf82d, 0xf83d, 0xf87f, 0xf809, 0xf871, 0xf877, 0xf865, 0xf872, 0xf874, 0xf879, 0xf875, 0xf869, + 0xf86f, 0xf870, 0xf85b, 0xf85d, 0xf80d, 0xf702, 0xf861, 0xf873, 0xf864, 0xf866, 0xf867, 0xf868, + 0xf86a, 0xf86b, 0xf86c, 0xf83b, 0xf827, 0xf860, 0xf700, 0xf85c, 0xf87a, 0xf878, 0xf863, 0xf876, + 0xf862, 0xf86e, 0xf86d, 0xf82c, 0xf82e, 0xf82f, 0xf700, 0xf30c, 0xf703, 0xf820, 0xf207, 0xf500, + 0xf501, 0xf502, 0xf503, 0xf504, 0xf505, 0xf506, 0xf507, 0xf508, 0xf509, 0xf208, 0xf209, 0xf907, + 0xf908, 0xf909, 0xf30b, 0xf904, 0xf905, 0xf906, 0xf30a, 0xf901, 0xf902, 0xf903, 0xf900, 0xf310, + 0xf206, 0xf200, 0xf83c, 0xf50a, 0xf50b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, + 0xf30e, 0xf702, 0xf30d, 0xf01c, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf210, 0xf211, 0xf117, + 0xf600, 0xf119, 0xf115, 0xf116, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, + 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, +]; + +const CTRL_ALT_MAP: &[u16; 128] = &[ + 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, + 0xf200, 0xf200, 0xf200, 0xf200, 0xf811, 0xf817, 0xf805, 0xf812, 0xf814, 0xf819, 0xf815, 0xf809, + 0xf80f, 0xf810, 0xf200, 0xf200, 0xf201, 0xf702, 0xf801, 0xf813, 0xf804, 0xf806, 0xf807, 0xf808, + 0xf80a, 0xf80b, 0xf80c, 0xf200, 0xf200, 0xf200, 0xf700, 0xf200, 0xf81a, 0xf818, 0xf803, 0xf816, + 0xf802, 0xf80e, 0xf80d, 0xf200, 0xf200, 0xf200, 0xf700, 0xf30c, 0xf703, 0xf200, 0xf207, 0xf500, + 0xf501, 0xf502, 0xf503, 0xf504, 0xf505, 0xf506, 0xf507, 0xf508, 0xf509, 0xf208, 0xf200, 0xf307, + 0xf308, 0xf309, 0xf30b, 0xf304, 0xf305, 0xf306, 0xf30a, 0xf301, 0xf302, 0xf303, 0xf300, 0xf20c, + 0xf206, 0xf200, 0xf200, 0xf50a, 0xf50b, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, + 0xf30e, 0xf702, 0xf30d, 0xf200, 0xf701, 0xf205, 0xf114, 0xf603, 0xf118, 0xf601, 0xf602, 0xf117, + 0xf600, 0xf119, 0xf115, 0xf20c, 0xf11a, 0xf10c, 0xf10d, 0xf11b, 0xf11c, 0xf110, 0xf311, 0xf11d, + 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, +]; + +struct StdinBuffer { + back_buffer: Vec, + front_buffer: Vec, // more like a queue + + cursor: usize, +} + +impl StdinBuffer { + fn new() -> Self { + Self { + back_buffer: Vec::new(), + front_buffer: Vec::new(), + + cursor: 0, + } + } + + fn swap_buffer(&mut self) { + for c in self.back_buffer.drain(..) { + self.front_buffer.push(c); + } + } + + fn is_complete(&self) -> bool { + !self.back_buffer.is_empty() || !self.front_buffer.is_empty() + } + + fn advance_cursor(&mut self) { + self.cursor += 1; + } +} + +struct TtyState { + lshift: bool, + rshift: bool, + lctrl: bool, + rctrl: bool, + lalt: bool, + altgr: bool, + caps: bool, +} + +struct Tty { + device_id: usize, + state: Mutex, + sref: Weak, + + stdin: Mutex, + block_queue: WaitQueue, + + connected: AtomicUsize, +} + +impl Tty { + fn new() -> Arc { + Arc::new_cyclic(|sref| Self { + device_id: devfs::alloc_device_marker(), + state: Mutex::new(TtyState { + lshift: false, + rshift: false, + lctrl: false, + rctrl: false, + lalt: false, + altgr: false, + caps: false, + }), + block_queue: WaitQueue::new(), + stdin: Mutex::new(StdinBuffer::new()), + connected: AtomicUsize::new(0), + sref: sref.clone(), + }) + } +} + +impl INodeInterface for Tty { + fn open( + &self, + _flags: aero_syscall::OpenFlags, + _handle: Arc, + ) -> fs::Result> { + let connected = self.connected.fetch_add(1, Ordering::SeqCst); + if connected == 0 { + crate::drivers::keyboard::register_keyboard_listener(TTY.clone()); + + let current_task = scheduler::get_scheduler().current_task(); + current_task.attach(self.sref.upgrade().unwrap()); + } + + Ok(None) + } + + fn close(&self, _flags: aero_syscall::OpenFlags) { + self.connected.fetch_sub(1, Ordering::SeqCst); + } + + fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + self.block_queue + .block_on(&self.stdin, |future| future.is_complete())?; + + let mut stdin = self.stdin.lock_irq(); + + // record the back buffer size before swapping + stdin.swap_buffer(); + let back_len = stdin.front_buffer.len(); + + if buffer.len() > stdin.front_buffer.len() { + for (i, c) in stdin.front_buffer.drain(..).enumerate() { + buffer[i] = c; + } + } else { + for (i, c) in stdin.front_buffer.drain(..buffer.len()).enumerate() { + buffer[i] = c; + } + } + + Ok(core::cmp::min(buffer.len(), back_len)) + } + + fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { + let string = core::str::from_utf8(buffer).map_err(|_| FileSystemError::NotSupported)?; + + crate::rendy::print!("{}", string); + + log::debug!("TTY::write_at(): {}", unsafe { + core::str::from_utf8_unchecked(buffer) + }); + + Ok(buffer.len()) + } + + fn poll(&self, table: Option<&mut PollTable>) -> fs::Result { + if let Some(e) = table { + e.insert(&self.block_queue) + } + let mut events = PollFlags::empty(); + + if self.stdin.lock_irq().is_complete() { + events.insert(PollFlags::IN); + } + + Ok(events) + } + + fn ioctl(&self, command: usize, arg: usize) -> fs::Result { + match command { + aero_syscall::TIOCGWINSZ => { + let winsize = VirtAddr::new(arg as u64); + let winsize = unsafe { &mut *(winsize.as_mut_ptr::()) }; + + let (rows, cols) = rendy::get_rows_cols(); + + winsize.ws_row = rows as u16; + winsize.ws_col = cols as u16; + + let (xpixel, ypixel) = rendy::get_resolution(); + + winsize.ws_xpixel = xpixel as u16; + winsize.ws_ypixel = ypixel as u16; + + Ok(0x00) + } + + aero_syscall::TCGETS => { + let termios = VirtAddr::new(arg as u64); + let termios = unsafe { &mut *(termios.as_mut_ptr::()) }; + + let lock = TERMIOS.lock_irq(); + let this = &*lock; + + *termios = *this; + Ok(0x00) + } + + aero_syscall::TCSETSF => { + // Allow the output buffer to drain, discard pending input. + let mut stdin = self.stdin.lock_irq(); + stdin.back_buffer.clear(); + stdin.cursor = 0; + core::mem::drop(stdin); + + let termios = VirtAddr::new(arg as u64); + let termios = unsafe { &*(termios.as_mut_ptr::()) }; + + let mut lock = TERMIOS.lock_irq(); + let this = &mut *lock; + + *this = *termios; + Ok(0x00) + } + + _ => Err(fs::FileSystemError::NotSupported), + } + } +} + +impl devfs::Device for Tty { + fn device_marker(&self) -> usize { + self.device_id + } + + fn device_name(&self) -> String { + String::from("vtty") + } + + fn inode(&self) -> Arc { + self.sref.upgrade().unwrap() + } +} + +impl TerminalDevice for Tty { + fn attach(&self, _task: Arc) { + // FIXME: We should handle foreground groups in TTY aswell + } + + fn detach(&self, _task: Arc) { + // FIXME: TTY handle + } +} + +#[cfg(target_arch = "x86_64")] +impl KeyboardListener for Tty { + fn on_key(&self, key: KeyCode, released: bool) { + let mut state = self.state.lock(); + let termios = TERMIOS.lock_irq(); + + let push_str = |k: &str| { + // TODO: decckm + let mut stdin = self.stdin.lock_irq(); + + for each in k.bytes() { + stdin.back_buffer.push(each); + } + }; + + let lchar = || { + let mut shift = state.lshift || state.rshift; + let ctrl = state.lctrl || state.rctrl; + + if state.caps { + shift = !shift; + } + + let map = match (shift, ctrl, state.lalt, state.altgr) { + (false, false, false, false) => PLAIN_MAP, + (true, false, false, false) => SHIFT_MAP, + (false, true, false, false) => CTRL_MAP, + (false, false, true, false) => ALT_MAP, + (false, false, false, true) => ALTGR_MAP, + (true, true, false, false) => SHIFT_CTRL_MAP, + (false, true, true, false) => CTRL_ALT_MAP, + _ => PLAIN_MAP, + }; + + let character = + unsafe { core::char::from_u32_unchecked((map[key as usize] & 0xff) as _) }; + + // Check if the character is actually printable printable. + if !(0x20..0x7e).contains(&(character as u32)) { + return; + } + + { + let mut stdin = self.stdin.lock_irq(); + + stdin.back_buffer.push(character as u8); + stdin.advance_cursor(); + } + + if termios.c_lflag.contains(aero_syscall::TermiosLFlag::ECHO) { + rendy::print!("{}", character); + } + }; + + let backspace = || { + if termios.c_lflag.contains(aero_syscall::TermiosLFlag::ICANON) { + let mut stdin = self.stdin.lock_irq(); + + if stdin.back_buffer.pop().is_some() + && termios.c_lflag.contains(aero_syscall::TermiosLFlag::ECHO) + { + rendy::backspace(); + stdin.cursor -= 1; + } + } else { + push_str("\x08"); + } + }; + + if !termios.c_lflag.contains(aero_syscall::TermiosLFlag::ICANON) && !released { + match key { + KeyCode::KEY_BACKSPACE if !released => backspace(), + KeyCode::KEY_CAPSLOCK if !released => state.caps = !state.caps, + + KeyCode::KEY_LEFTSHIFT => state.lshift = !released, + KeyCode::KEY_RIGHTSHIFT => state.rshift = !released, + + KeyCode::KEY_LEFTCTRL => state.lctrl = !released, + KeyCode::KEY_RIGHTCTRL => state.rctrl = !released, + + KeyCode::KEY_LEFTALT => state.lalt = !released, + KeyCode::KEY_RIGHTALT => state.altgr = !released, + KeyCode::KEY_ENTER => push_str("\n"), + + KeyCode::KEY_UP => push_str("\x1b[A"), + KeyCode::KEY_LEFT => push_str("\x1b[D"), + KeyCode::KEY_DOWN => push_str("\x1b[B"), + KeyCode::KEY_RIGHT => push_str("\x1b[C"), + + _ if !released => lchar(), + _ => {} + } + + self.stdin.lock_irq().cursor = 0; + self.block_queue.notify_all(); + return; + } + + match key { + KeyCode::KEY_CAPSLOCK if !released => state.caps = !state.caps, + KeyCode::KEY_ENTER | KeyCode::KEY_KPENTER if !released => { + let mut stdin = self.stdin.lock_irq(); + + stdin.back_buffer.push(b'\n'); + stdin.cursor = 0; + + if termios.c_lflag.contains(aero_syscall::TermiosLFlag::ECHO) { + rendy::print!("\n"); + } + + self.block_queue.notify_all(); + } + + KeyCode::KEY_BACKSPACE if !released => backspace(), + + KeyCode::KEY_LEFTSHIFT => state.lshift = !released, + KeyCode::KEY_RIGHTSHIFT => state.rshift = !released, + + KeyCode::KEY_LEFTCTRL => state.lctrl = !released, + KeyCode::KEY_RIGHTCTRL => state.rctrl = !released, + + KeyCode::KEY_LEFTALT => state.lalt = !released, + KeyCode::KEY_RIGHTALT => state.altgr = !released, + + KeyCode::KEY_LEFT if !released => { + let mut stdin = self.stdin.lock_irq(); + + // We are at the start of the input so, we cannot shift + // the cursor to the left anymore. + if stdin.cursor == 0 { + return; + } + + let (x, y) = rendy::get_cursor_position(); + rendy::set_cursor_position(x - 1, y); + + stdin.cursor -= 1; + } + + KeyCode::KEY_RIGHT if !released => { + let mut stdin = self.stdin.lock_irq(); + + // We are at the end of the input so, we cannot shift + // the cursor to the right anymore. + if stdin.cursor == stdin.back_buffer.len() { + return; + } + + let (x, y) = rendy::get_cursor_position(); + rendy::set_cursor_position(x + 1, y); + + stdin.advance_cursor(); + } + + _ if !released => lchar(), + + _ => {} + } + } +} + +pub fn init() -> Result<(), FileSystemError> { + devfs::install_device(TTY.clone())?; + Ok(()) +} From ca83275356307ac49193c4f33373868dc770a8b4 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 27 May 2023 12:00:28 +1000 Subject: [PATCH 229/368] ci: remove weekly builds * I run out of build time and space sorry :( Signed-off-by: Anhad Singh --- .github/workflows/weekly.yml | 50 ------------------------------------ 1 file changed, 50 deletions(-) delete mode 100644 .github/workflows/weekly.yml diff --git a/.github/workflows/weekly.yml b/.github/workflows/weekly.yml deleted file mode 100644 index 55b43e5a990..00000000000 --- a/.github/workflows/weekly.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Weekly Aero Build - -on: - schedule: - - cron: '0 0 * * 0' - workflow_dispatch: - -jobs: - aero-build: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Unshallow repo tags - run: git fetch --prune --unshallow --tags - - - name: Check if build is necessary - run: test "$(git tag --points-at HEAD)" = "" - - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y nasm meson ninja-build - python3 -m pip install requests xbstrap - sudo ./tools/deps.sh - - - name: Build Sysroot - run: | - mkdir build - - pushd build - [ -f bootstrap.link ] || xbstrap init .. - xbstrap install bash coreutils dwm xorg-server xorg-xinit alacritty - popd - - - name: Build Kernel - run: ./aero.py --no-run - - - name: Create weekly release - uses: softprops/action-gh-release@v1 - with: - name: Weekly Build ${{ env.TAG_DATE }} - tag_name: nightly-${{ env.TAG_DATE }} - body: Image of an up to date Aero weekly build :^) - files: | - build/aero.iso - build/disk.img - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From a2bad6d7c8398d73e61c0f9761f7aa410cd36f80 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 28 May 2023 18:29:35 +1000 Subject: [PATCH 230/368] x86_64: add copy{from,to} functions These are safer variants for read_mut() for userspace memory accesses. Pretty documented rn but more detail could be done ig :^) Signed-off-by: Anhad Singh --- .../src/arch/x86_64/interrupts/exceptions.rs | 7 + .../src/arch/x86_64/interrupts/idt.rs | 6 +- src/aero_kernel/src/arch/x86_64/mod.rs | 1 + src/aero_kernel/src/arch/x86_64/task.rs | 6 + src/aero_kernel/src/arch/x86_64/tls.rs | 2 + src/aero_kernel/src/arch/x86_64/user_copy.rs | 154 ++++++++++++++++++ src/aero_kernel/src/drivers/drm/mod.rs | 38 ++--- src/aero_kernel/src/main.rs | 1 + src/aero_kernel/src/socket/udp.rs | 13 +- src/aero_kernel/src/socket/unix.rs | 3 +- 10 files changed, 199 insertions(+), 32 deletions(-) create mode 100644 src/aero_kernel/src/arch/x86_64/user_copy.rs diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs index 7ae54b94599..0f24e29239d 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs @@ -18,6 +18,7 @@ use super::{io, InterruptErrorStack}; use crate::arch::controlregs; +use crate::arch::tls::get_percpu; use crate::mem::paging::PageFaultErrorCode; use crate::unwind; @@ -120,6 +121,12 @@ pub fn breakpoint(stack: &mut InterruptErrorStack) { } pub(super) fn page_fault(stack: &mut InterruptErrorStack) { + let pf_resume = get_percpu().pf_resume.as_ptr::(); + if !pf_resume.is_null() { + stack.stack.iret.rip = pf_resume as u64; + return; + } + let accessed_address = controlregs::read_cr2(); let reason = PageFaultErrorCode::from_bits_truncate(stack.code); diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs index 02040402eeb..319fed51093 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs @@ -196,21 +196,21 @@ pub fn init() { INTERRUPT_HANDLERS.lock()[7] = IrqHandler::ErrorHandler(exceptions::device_not_available); INTERRUPT_HANDLERS.lock()[8] = IrqHandler::ErrorHandler(exceptions::double_fault); - // INTERRUPT_HANDLERS.lock()[9] is reserved. + // INTERRUPT_HANDLERS[9] is reserved. INTERRUPT_HANDLERS.lock()[10] = IrqHandler::ErrorHandler(exceptions::invalid_tss); INTERRUPT_HANDLERS.lock()[11] = IrqHandler::ErrorHandler(exceptions::segment_not_present); INTERRUPT_HANDLERS.lock()[12] = IrqHandler::ErrorHandler(exceptions::stack_segment); INTERRUPT_HANDLERS.lock()[13] = IrqHandler::ErrorHandler(exceptions::protection); INTERRUPT_HANDLERS.lock()[14] = IrqHandler::ErrorHandler(exceptions::page_fault); - // INTERRUPT_HANDLERS.lock()[15] is reserved. + // INTERRUPT_HANDLERS[15] is reserved. INTERRUPT_HANDLERS.lock()[16] = IrqHandler::ErrorHandler(exceptions::fpu_fault); INTERRUPT_HANDLERS.lock()[17] = IrqHandler::ErrorHandler(exceptions::alignment_check); INTERRUPT_HANDLERS.lock()[18] = IrqHandler::ErrorHandler(exceptions::machine_check); INTERRUPT_HANDLERS.lock()[19] = IrqHandler::ErrorHandler(exceptions::simd); INTERRUPT_HANDLERS.lock()[20] = IrqHandler::ErrorHandler(exceptions::virtualization); - // INTERRUPT_HANDLERS.lock()[21..29] are reserved. + // INTERRUPT_HANDLERS[21..29] are reserved. INTERRUPT_HANDLERS.lock()[30] = IrqHandler::ErrorHandler(exceptions::security); unsafe { diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index 28ebcf6e01a..a99ff58162c 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -25,6 +25,7 @@ pub mod syscall; pub mod task; pub mod time; pub mod tls; +pub mod user_copy; use core::sync::atomic::Ordering; diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 757ca950dfe..83f784f8a51 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -109,6 +109,12 @@ pub fn userland_last_address() -> VirtAddr { }) } +/// Returns whether the given pointer is within the userland address space. +pub fn user_access_ok(ptr: *const T) -> bool { + let size = core::mem::size_of::(); + VirtAddr::new(ptr as u64 + size as u64) <= super::task::userland_last_address() +} + const USERLAND_STACK_SIZE: u64 = 0x64000; //(1 << 47) - (Size4KiB::SIZE * 2) diff --git a/src/aero_kernel/src/arch/x86_64/tls.rs b/src/aero_kernel/src/arch/x86_64/tls.rs index b1a802c0fc7..9cd20e295b7 100644 --- a/src/aero_kernel/src/arch/x86_64/tls.rs +++ b/src/aero_kernel/src/arch/x86_64/tls.rs @@ -31,6 +31,7 @@ use alloc::vec::Vec; use super::gdt::*; use super::io; +use crate::mem::paging::VirtAddr; use crate::utils::sync::Mutex; use raw_cpuid::FeatureInfo; @@ -115,6 +116,7 @@ pub struct PerCpuData { pub lapic_timer_frequency: u32, pub(super) gdt: &'static mut [GdtEntry], + pub(super) pf_resume: VirtAddr, } /// SAFETY: The GS base should point to the kernel PCR. diff --git a/src/aero_kernel/src/arch/x86_64/user_copy.rs b/src/aero_kernel/src/arch/x86_64/user_copy.rs new file mode 100644 index 00000000000..4ee203c16e4 --- /dev/null +++ b/src/aero_kernel/src/arch/x86_64/user_copy.rs @@ -0,0 +1,154 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +use core::mem::MaybeUninit; +use core::ops::{Deref, DerefMut}; + +use crate::mem::paging::VirtAddr; + +use super::task::user_access_ok; +use super::tls::get_percpu; + +/// Copy to/from a block of data from user space. Returns whether the copy was successful. +/// +/// # Safety +/// The caller must ensure that: +/// * If copying to userspace, the `dest` pointer must be within the userland address space. +/// * If copying from userspace, the `dest` pointer must be valid for `size` bytes. +/// +/// ## Concurrent Accesses +/// Concurrent access, *including potential data races with userspace memory*, are permitted since +/// other userspace threads or processes may modify the memory concurrently. This behavior is +/// similar to how [`std::io`] permits data races with file contents on disk. +/// +/// [`std::io`]: https://doc.rust-lang.org/std/io/index.html +#[naked] +unsafe extern "C" fn copy_to_from_user( + dest: *mut u8, + src: *const u8, + size: usize, + + fault_resume: *const u8, +) -> bool { + // Registers used: + // + // %rax = argument 1, `dest` + // %rsi = argument 2, `src` + // %rdx = argument 3, `size` + // %rcx = argument 4, `fault_resume` + asm!( + // Copy `fault_resume` out of %rcx because it will be utilized by `rep movsb` latter. + "mov r10, rcx", + // Setup the page fault resume. + "lea rax, 1f", + "mov [r10], rax", + // XXX: From this point until the fault return is reset, no function calls or stack + // manipulations should be performed. We must ensure the ability to restore all callee + // registers without any knowledge of the exact location within this code where a fault may + // occur. + // + // Copy 8 bytes at a time and then one byte at a time for the remainder. + "mov rcx, rdx", + "shr rcx, 3", + "rep movsq", + "and edx, 7", + "je 2f", + "mov ecx, edx", + "rep movsb", + // Set return value to `true`. + "2:", + "mov eax, 1", + // Reset the `fault_resume` pointer and return. + "3:", + "mov qword ptr [r10], 0", + "ret", + // `fault_resume` handler - set return value to `false` and return. + "1:", + "xor eax, eax", + "jmp 3b", + options(noreturn) + ) +} + +/// Copy a structure from userspace memory. Returns whether the copy was successful. +#[must_use] +fn copy_from_user(dest: &mut MaybeUninit, src: *const T) -> bool { + let fault_resume = &get_percpu().pf_resume as *const _ as *const u8; + let size = core::mem::size_of::(); + + user_access_ok(src); + + // SAFETY: We have verified that the `src` pointer is within the userland address space. + unsafe { copy_to_from_user(dest.as_mut_ptr().cast(), src.cast(), size, fault_resume) } +} + +/// Copy a structure from userspace memory. Returns whether the copy was successful. +#[must_use] +fn copy_to_user(dest: *mut T, src: &T) -> bool { + let fault_resume = &get_percpu().pf_resume as *const _ as *const u8; + let size = core::mem::size_of::(); + let src_ptr = src as *const T; + + user_access_ok(dest); + + // SAFETY: We have verified that the `dest` pointer is within the userland address space. + unsafe { copy_to_from_user(dest.cast(), src_ptr.cast(), size, fault_resume) } +} + +/// A reference to a structure in userspace memory, which can be either read-only or read-write. +/// +/// Concurrent access, *including data races to/from userspace memory*, are permitted. See the +/// documentation of [`copy_to_from_user`] for more information. +pub struct UserRef { + ptr: *mut T, + val: T, +} + +impl UserRef { + pub unsafe fn new(address: VirtAddr) -> Self { + let mut val = MaybeUninit::::uninit(); + + // FIXME: Return an error if the copy fails. + assert!(copy_from_user(&mut val, address.as_ptr())); + + Self { + ptr: address.as_mut_ptr(), + // SAFETY: We have initialized the value via `copy_from_user` above. + val: unsafe { val.assume_init() }, + } + } +} + +impl Deref for UserRef { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.val + } +} + +impl DerefMut for UserRef { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.val + } +} + +impl Drop for UserRef { + fn drop(&mut self) { + assert!(copy_to_user(self.ptr, &self.val)); + } +} diff --git a/src/aero_kernel/src/drivers/drm/mod.rs b/src/aero_kernel/src/drivers/drm/mod.rs index 1bf7d9d4bc3..757b2e3c5c5 100644 --- a/src/aero_kernel/src/drivers/drm/mod.rs +++ b/src/aero_kernel/src/drivers/drm/mod.rs @@ -24,6 +24,7 @@ use alloc::vec::Vec; use bit_field::BitField; use hashbrown::HashMap; +use crate::arch::user_copy::UserRef; use crate::fs; use crate::fs::inode::INodeInterface; use crate::fs::{devfs, FileSystemError}; @@ -405,7 +406,7 @@ impl INodeInterface for Drm { fn ioctl(&self, command: usize, arg: usize) -> fs::Result { match command { DRM_IOCTL_VERSION => { - let struc = VirtAddr::new(arg as u64).read_mut::().unwrap(); + let mut struc = unsafe { UserRef::::new(VirtAddr::new(arg as u64)) }; let (major, minor, patch_level) = self.device.driver_version(); let (name, desc, date) = self.device.driver_info(); @@ -422,7 +423,7 @@ impl INodeInterface for Drm { } DRM_IOCTL_GET_CAP => { - let struc = VirtAddr::new(arg as u64).read_mut::().unwrap(); + let mut struc = unsafe { UserRef::::new(VirtAddr::new(arg as u64)) }; // NOTE: The user is responsible for zeroing out the structure. match struc.capability { @@ -442,9 +443,8 @@ impl INodeInterface for Drm { } DRM_IOCTL_MODE_GETRESOURCES => { - let struc = VirtAddr::new(arg as u64) - .read_mut::() - .unwrap(); + let mut struc = + unsafe { UserRef::::new(VirtAddr::new(arg as u64)) }; /// Copies the mode object IDs into the user provided buffer. For safety, checkout /// the [`copy_field`] function. @@ -489,7 +489,7 @@ impl INodeInterface for Drm { } DRM_IOCTL_GET_CRTC => { - let struc = VirtAddr::new(arg as u64).read_mut::().unwrap(); + let struc = unsafe { UserRef::::new(VirtAddr::new(arg as u64)) }; let _object = self.find_object(struc.crtc_id).unwrap().as_crtc().unwrap(); log::warn!("drm::get_crtc: is a stub!"); @@ -497,7 +497,7 @@ impl INodeInterface for Drm { } DRM_IOCTL_SET_CRTC => { - let struc = VirtAddr::new(arg as u64).read_mut::().unwrap(); + let struc = unsafe { UserRef::::new(VirtAddr::new(arg as u64)) }; let _object = self.find_object(struc.crtc_id).unwrap().as_crtc().unwrap(); let object = self @@ -513,9 +513,8 @@ impl INodeInterface for Drm { } DRM_IOCTL_GET_ENCODER => { - let struc = VirtAddr::new(arg as u64) - .read_mut::() - .unwrap(); + let mut struc = + unsafe { UserRef::::new(VirtAddr::new(arg as u64)) }; let object = self .find_object(struc.encoder_id) @@ -544,9 +543,8 @@ impl INodeInterface for Drm { } DRM_IOCTL_GET_CONNECTOR => { - let struc = VirtAddr::new(arg as u64) - .read_mut::() - .unwrap(); + let mut struc = + unsafe { UserRef::::new(VirtAddr::new(arg as u64)) }; let object = self .find_object(struc.connector_id) @@ -592,9 +590,8 @@ impl INodeInterface for Drm { } DRM_IOCTL_MODE_CREATE_DUMB => { - let struc = VirtAddr::new(arg as u64) - .read_mut::() - .unwrap(); + let mut struc = + unsafe { UserRef::::new(VirtAddr::new(arg as u64)) }; let (mut buffer, pitch) = self.device @@ -612,9 +609,7 @@ impl INodeInterface for Drm { } DRM_IOCTL_MODE_ADDFB => { - let struc = VirtAddr::new(arg as u64) - .read_mut::() - .unwrap(); + let mut struc = unsafe { UserRef::::new(VirtAddr::new(arg as u64)) }; let handle = self.find_handle(struc.handle).unwrap(); self.device @@ -628,9 +623,8 @@ impl INodeInterface for Drm { } DRM_IOCTL_MODE_MAP_DUMB => { - let struc = VirtAddr::new(arg as u64) - .read_mut::() - .unwrap(); + let mut struc = + unsafe { UserRef::::new(VirtAddr::new(arg as u64)) }; let handle = self.find_handle(struc.handle).unwrap(); struc.offset = handle.mapping as _; diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index af149398ec7..d1bdf85533b 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -46,6 +46,7 @@ int_roundings, // https://github.com/rust-lang/rust/issues/88581 const_ptr_is_null, // https://github.com/rust-lang/rust/issues/74939 trait_upcasting, // https://github.com/rust-lang/rust/issues/65991 + naked_functions, // https://github.com/rust-lang/rust/issues/32408 )] #![deny(trivial_numeric_casts, unused_allocation)] #![test_runner(crate::tests::test_runner)] diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index cdcdfb256c1..e39f9a8b819 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -22,6 +22,7 @@ use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use spin::Once; +use crate::arch::user_copy::UserRef; use crate::fs::cache::DirCacheItem; use crate::fs::file_table::FileHandle; use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags}; @@ -209,7 +210,7 @@ impl INodeInterface for UdpSocket { fn ioctl(&self, command: usize, arg: usize) -> fs::Result { match command { SIOCGIFINDEX => { - let ifreq = VirtAddr::new(arg as _).read_mut::()?; + let mut ifreq = unsafe { UserRef::::new(VirtAddr::new(arg as _)) }; let name = ifreq.name().unwrap(); assert!(name == "eth0"); @@ -219,7 +220,7 @@ impl INodeInterface for UdpSocket { } SIOCGIFHWADDR => { - let ifreq = VirtAddr::new(arg as _).read_mut::()?; + let mut ifreq = unsafe { UserRef::::new(VirtAddr::new(arg as _)) }; let name = ifreq.name().ok_or(FileSystemError::InvalidPath)?; assert!(name == "eth0"); @@ -237,8 +238,8 @@ impl INodeInterface for UdpSocket { } SIOCSIFADDR => { - let ifreq = VirtAddr::new(arg as _).read_mut::()?; - let socket = SocketAddr::from_ifreq(ifreq) + let ifreq = unsafe { UserRef::::new(VirtAddr::new(arg as _)) }; + let socket = SocketAddr::from_ifreq(&ifreq) .map_err(|_| FileSystemError::NotSupported)? .as_inet() .ok_or(FileSystemError::NotSupported)?; @@ -254,8 +255,8 @@ impl INodeInterface for UdpSocket { } SIOCSIFNETMASK => { - let ifreq = VirtAddr::new(arg as _).read_mut::()?; - let socket = SocketAddr::from_ifreq(ifreq) + let ifreq = unsafe { UserRef::::new(VirtAddr::new(arg as _)) }; + let socket = SocketAddr::from_ifreq(&ifreq) .map_err(|_| FileSystemError::NotSupported)? .as_inet() .ok_or(FileSystemError::NotSupported)?; diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index b3284eb997a..87bc36840e3 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -24,6 +24,7 @@ use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use spin::Once; +use crate::arch::user_copy::UserRef; use crate::fs; use crate::fs::cache::DirCacheItem; use crate::fs::file_table::FileHandle; @@ -367,7 +368,7 @@ impl INodeInterface for UnixSocket { } if let Some((address, length)) = address { - let address = address.read_mut::()?; + let mut address = unsafe { UserRef::new(address) }; if let Some(paddr) = peer.inner.lock_irq().address.as_ref() { *address = paddr.clone(); From 02ed486d06e5fc6739143e2b72ceb45a9b94e660 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 28 May 2023 19:33:43 +1000 Subject: [PATCH 231/368] x86_64: more optimized versions of mem{cpy,set} Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/mem.rs | 83 ++++++++++++++++++++ src/aero_kernel/src/arch/x86_64/mod.rs | 4 +- src/aero_kernel/src/arch/x86_64/user_copy.rs | 4 +- 3 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 src/aero_kernel/src/arch/x86_64/mem.rs diff --git a/src/aero_kernel/src/arch/x86_64/mem.rs b/src/aero_kernel/src/arch/x86_64/mem.rs new file mode 100644 index 00000000000..4c8a5fcf930 --- /dev/null +++ b/src/aero_kernel/src/arch/x86_64/mem.rs @@ -0,0 +1,83 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +#[no_mangle] +#[naked] +unsafe extern "C" fn memcpy_movsq(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 { + // Registers used: + // + // %rdi = argument 1, `dest` + // %rsi = argument 2, `src` + // %rdx = argument 3, `len` + asm!( + // Save the return value. + "mov rax, rdi", + // Copy in 8 byte chunks. + "mov rcx, rdx", + "shr rcx, 3", + "rep movsq", + // Copy the rest. + "mov rcx, rdx", + "and rcx, 0x7", + "rep movsb", + "ret", + options(noreturn) + ); +} + +#[no_mangle] +#[naked] +unsafe extern "C" fn memset_stosq(dest: *mut u8, byte: i32, len: usize) -> *mut u8 { + // Registers used: + // + // %rdi = argument 1, `dest` + // %rsi = argument 2, `byte` + // %rdx = argument 3, `len` + asm!( + // Save the return value. + "mov r11, rdi", + // Create an 8-byte copy of the pattern. + "mov rcx, rdx", + "movzx rax, sil", + "mov r10, 0x0101010101010101", + "mul r10", + "mov rdx, rcx", + // Copy in 8 byte chunks. + "shr rcx, 3", + "rep stosq", + // Copy the rest. + "mov rcx, rdx", + "and rcx, 0x7", + "rep stosb", + // Restore the return value. + "mov rax, r11", + "ret", + options(noreturn) + ) +} + +// FIXME(andypython): pick the best implementation for the current CPU using indirect functions. + +#[no_mangle] +extern "C" fn memcpy(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 { + unsafe { memcpy_movsq(dest, src, len) } +} + +#[no_mangle] +extern "C" fn memset(dest: *mut u8, byte: i32, len: usize) -> *mut u8 { + unsafe { memset_stosq(dest, byte, len) } +} diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index a99ff58162c..89c4a8dcc41 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -20,6 +20,7 @@ pub mod controlregs; pub mod gdt; pub mod interrupts; pub mod io; +pub mod mem; pub mod signals; pub mod syscall; pub mod task; @@ -32,7 +33,6 @@ use core::sync::atomic::Ordering; use crate::acpi::aml; use crate::{acpi, cmdline}; -use crate::mem; use crate::mem::paging; use crate::mem::paging::VirtAddr; @@ -136,7 +136,7 @@ extern "C" fn arch_aero_main() -> ! { paging::init(memmap).unwrap(); log::info!("loaded paging"); - mem::alloc::init_heap(); + crate::mem::alloc::init_heap(); log::info!("loaded heap"); // SMP initialization. diff --git a/src/aero_kernel/src/arch/x86_64/user_copy.rs b/src/aero_kernel/src/arch/x86_64/user_copy.rs index 4ee203c16e4..f9fd52f4ea4 100644 --- a/src/aero_kernel/src/arch/x86_64/user_copy.rs +++ b/src/aero_kernel/src/arch/x86_64/user_copy.rs @@ -46,10 +46,10 @@ unsafe extern "C" fn copy_to_from_user( ) -> bool { // Registers used: // - // %rax = argument 1, `dest` + // %rdi = argument 1, `dest` // %rsi = argument 2, `src` // %rdx = argument 3, `size` - // %rcx = argument 4, `fault_resume` + // %rcx = argument 4, `fault_resume` (copied to %r10) asm!( // Copy `fault_resume` out of %rcx because it will be utilized by `rep movsb` latter. "mov r10, rcx", From 1977333064271ade074eb02f7919868533c4bf22 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Mon, 29 May 2023 17:48:43 +1000 Subject: [PATCH 232/368] x86_64::mem: add memmove_erms Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/mem.rs | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/aero_kernel/src/arch/x86_64/mem.rs b/src/aero_kernel/src/arch/x86_64/mem.rs index 4c8a5fcf930..1b7ad5bb802 100644 --- a/src/aero_kernel/src/arch/x86_64/mem.rs +++ b/src/aero_kernel/src/arch/x86_64/mem.rs @@ -70,6 +70,44 @@ unsafe extern "C" fn memset_stosq(dest: *mut u8, byte: i32, len: usize) -> *mut ) } +#[no_mangle] +#[naked] +unsafe extern "C" fn memmove_erms(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 { + // Registers used: + // + // %rdi = argument 1, `dest` + // %rsi = argument 2, `src` + // %rdx = argument 3, `len` + asm!( + "mov rax, rdi", + // Skip zero length. + "test rdx, rdx", + "jz 2f", + // Copying forwards: + "mov rcx, rdx", + "cmp rdi, rsi", + "jb 1f", + // `src` == `dest` + "je 2f", + "lea rdx, [rsi + rcx]", + "cmp rdi, rdx", + "jb 3f", + "1:", + "rep movsb", + "2:", + "ret", + // Copying backwards: + "3:", + "lea rdi, [rdi + rcx - 1]", + "lea rsi, [rsi + rcx - 1]", + "std", + "rep movsb", + "cld", + "ret", + options(noreturn) + ) +} + // FIXME(andypython): pick the best implementation for the current CPU using indirect functions. #[no_mangle] @@ -81,3 +119,8 @@ extern "C" fn memcpy(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 { extern "C" fn memset(dest: *mut u8, byte: i32, len: usize) -> *mut u8 { unsafe { memset_stosq(dest, byte, len) } } + +#[no_mangle] +extern "C" fn memmove(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 { + unsafe { memmove_erms(dest, src, len) } +} From 97a6260dd9dd96b5146d5b57a80e50d5254d8f2f Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 3 Jun 2023 15:07:58 +1000 Subject: [PATCH 233/368] x86_64: make use of FSGSBASE instructions if available Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/io.rs | 90 +++++++++++++++++++++++++ src/aero_kernel/src/arch/x86_64/mod.rs | 16 +++++ src/aero_kernel/src/arch/x86_64/task.rs | 55 +++++++-------- 3 files changed, 130 insertions(+), 31 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/io.rs b/src/aero_kernel/src/arch/x86_64/io.rs index d69e0519b9c..866be0ddc50 100644 --- a/src/aero_kernel/src/arch/x86_64/io.rs +++ b/src/aero_kernel/src/arch/x86_64/io.rs @@ -17,6 +17,8 @@ //! Wrapper functions for the hardware IO using respective assembly instructions. +use crate::mem::paging::VirtAddr; + pub const IA32_EFER: u32 = 0xc0000080; /// Map of BASE Address of FS (R/W) See Table 35-2. @@ -226,3 +228,91 @@ impl BasedPort { unsafe { V::port_out(self.base + offset, value) } } } + +#[inline] +pub unsafe fn wrfsbase(base: VirtAddr) { + asm!("wrfsbase {}", in(reg) base.as_u64(), options(nostack, preserves_flags)); +} + +#[inline] +pub fn rdfsbase() -> VirtAddr { + unsafe { + let val: u64; + asm!("rdfsbase {}", out(reg) val, options(nomem, nostack, preserves_flags)); + + VirtAddr::new(val) + } +} + +#[inline] +pub unsafe fn wrgsbase(base: VirtAddr) { + asm!("wrgsbase {}", in(reg) base.as_u64(), options(nostack, preserves_flags)); +} + +#[inline] +pub fn rdgsbase() -> VirtAddr { + unsafe { + let val: u64; + asm!("rdgsbase {}", out(reg) val, options(nomem, nostack, preserves_flags)); + + VirtAddr::new(val) + } +} + +/// # Safety +/// The caller must ensure that the swap operation does not cause any undefined behavior. +#[inline] +pub unsafe fn swapgs() { + asm!("swapgs", options(nostack, preserves_flags)); +} + +// XXX: There is no variant of the {rd,wr}gsbase instructions for accessing `KERNEL_GS_BASE`, so we +// wrap those in two `swapgs` instructions. This approach is still faster than reading/writing from +// the `KERNEL_GS_BASE` MSR. + +/// Sets the inactive `GS` segment's base address. +#[inline] +pub unsafe fn set_inactive_gsbase(base: VirtAddr) { + if super::has_fsgsbase() { + swapgs(); + wrgsbase(base); + swapgs(); + } else { + wrmsr(IA32_KERNEL_GSBASE, base.as_u64()); + } +} + +/// Returns the inactive `GS` segment's base address. +#[inline] +pub fn get_inactive_gsbase() -> VirtAddr { + if super::has_fsgsbase() { + // SAFETY: The GS base is swapped back to the original value after the read. + unsafe { swapgs() }; + let base = rdgsbase(); + unsafe { swapgs() }; + + base + } else { + VirtAddr::new(unsafe { rdmsr(IA32_KERNEL_GSBASE) }) + } +} + +/// Returns the `FS` segment's base address. +#[inline] +pub fn get_fsbase() -> VirtAddr { + if super::has_fsgsbase() { + rdfsbase() + } else { + VirtAddr::new(unsafe { rdmsr(IA32_FS_BASE) }) + } +} + +/// Sets the `FS` segment's base address. +#[inline] +pub unsafe fn set_fsbase(base: VirtAddr) { + if super::has_fsgsbase() { + wrfsbase(base); + } else { + wrmsr(IA32_FS_BASE, base.as_u64()); + } +} diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index 89c4a8dcc41..3a4d8fa8372 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -41,6 +41,7 @@ use crate::{drivers, logger, rendy}; use raw_cpuid::CpuId; use limine::*; +use spin::Once; use self::interrupts::INTERRUPT_CONTROLLER; @@ -244,6 +245,17 @@ fn enable_xsave() { unsafe { controlregs::write_xcr0(xcr0) } } +pub fn has_fsgsbase() -> bool { + static HAS_FSGSBASE: Once = Once::new(); + + *HAS_FSGSBASE.call_once(|| { + CpuId::new() + .get_extended_feature_info() + .unwrap() + .has_fsgsbase() + }) +} + pub fn init_cpu() { unsafe { // Enable the no-execute page protection feature. @@ -268,6 +280,10 @@ pub fn init_cpu() { cr4.insert(controlregs::Cr4Flags::OSFXSR); cr4.insert(controlregs::Cr4Flags::OSXMMEXCPT_ENABLE); + if has_fsgsbase() { + cr4.insert(controlregs::Cr4Flags::FSGSBASE); + } + controlregs::write_cr4(cr4); } diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 83f784f8a51..7748a8d629d 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -72,11 +72,11 @@ struct Context { #[repr(u64)] #[derive(Debug, Copy, Clone)] pub enum AuxvType { - AtNull = 0, - AtPhdr = 3, - AtPhEnt = 4, - AtPhNum = 5, - AtEntry = 9, + Null = 0, + Phdr = 3, + PhEnt = 4, + PhNum = 5, + Entry = 9, } /// Returns the first address outside the user range. @@ -96,14 +96,8 @@ pub fn userland_last_address() -> VirtAddr { static CACHED: spin::Once = spin::Once::new(); *CACHED.call_once(|| { - let virtual_mask_shift: u64; let la57 = crate::mem::paging::level_5_paging_enabled(); - - if la57 { - virtual_mask_shift = 56; - } else { - virtual_mask_shift = 47; - } + let virtual_mask_shift: u64 = if la57 { 56 } else { 47 }; VirtAddr::new((1u64 << virtual_mask_shift) - Size4KiB::SIZE) }) @@ -386,13 +380,13 @@ impl ArchTask { let mut envp = Vec::new(); let mut argp = Vec::new(); - loaded_binary - .envv - .map(|envv| envp = envv.push_into_stack(&mut stack)); + if let Some(envv) = loaded_binary.envv { + envp = envv.push_into_stack(&mut stack); + } - loaded_binary - .argv - .map(|argv| argp = argv.push_into_stack(&mut stack)); + if let Some(argv) = loaded_binary.argv { + argp = argv.push_into_stack(&mut stack); + } stack.align_down(); @@ -409,16 +403,16 @@ impl ArchTask { unsafe { let hdr: [(AuxvType, usize); 4] = [ ( - AuxvType::AtPhdr, + AuxvType::Phdr, (p2_header.ph_offset() + loaded_binary.base_addr.as_u64()) as usize, ), - (AuxvType::AtPhEnt, p2_header.ph_entry_size() as usize), - (AuxvType::AtPhNum, p2_header.ph_count() as usize), - (AuxvType::AtEntry, p2_header.entry_point() as usize), + (AuxvType::PhEnt, p2_header.ph_entry_size() as usize), + (AuxvType::PhNum, p2_header.ph_count() as usize), + (AuxvType::Entry, p2_header.entry_point() as usize), ]; stack.write(0usize); // Make it 16 bytes aligned - stack.write(AuxvType::AtNull); + stack.write(AuxvType::Null); stack.write(hdr); } @@ -504,8 +498,7 @@ impl ArchTask { /// belongs to. This is required since we also update the GS base register with the /// `base` immediately (not waiting for a switch). pub unsafe fn set_gs_base(&mut self, base: VirtAddr) { - io::wrmsr(io::IA32_KERNEL_GSBASE, base.as_u64()); - self.gs_base = base; + io::set_inactive_gsbase(base); } /// Returns the saved FS base for this task. @@ -520,8 +513,7 @@ impl ArchTask { /// belongs to. This is required since we also update the FS base register with the /// `base` immediately (not waiting for a switch). pub unsafe fn set_fs_base(&mut self, base: VirtAddr) { - io::wrmsr(io::IA32_FS_BASE, base.as_u64()); - self.fs_base = base; + io::set_fsbase(base); } } @@ -559,11 +551,12 @@ pub fn arch_task_spinup(from: &mut ArchTask, to: &ArchTask) { super::gdt::get_task_state_segment().rsp[0] = kstackp; io::wrmsr(io::IA32_SYSENTER_ESP, kstackp); - // switch to the new FS base. - io::wrmsr(io::IA32_FS_BASE, to.fs_base.as_u64()); + // Preserve and restore the %fs, %gs bases. + from.fs_base = io::get_fsbase(); + from.gs_base = io::get_inactive_gsbase(); - // update the swap GS target to point to the new GS base. - io::wrmsr(io::IA32_KERNEL_GSBASE, to.gs_base.as_u64()); + io::set_fsbase(to.fs_base); + io::set_inactive_gsbase(to.gs_base); if let Some(fpu) = from.fpu_storage.as_mut() { xsave(fpu); From bc4c8b3bac4698901c1ed02f79f3a9582107d29d Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 3 Jun 2023 17:11:27 +1000 Subject: [PATCH 234/368] bitmap: make use of `trailing_{zeros,ones}` Signed-off-by: Anhad Singh --- aero.py | 3 + src/aero_kernel/src/utils/bitmap.rs | 115 +++++++++++++++++----------- 2 files changed, 74 insertions(+), 44 deletions(-) diff --git a/aero.py b/aero.py index 8a38a33bec4..98ebbbd67d0 100755 --- a/aero.py +++ b/aero.py @@ -644,6 +644,9 @@ def main(): if not kernel_bin or args.check: return + + if not user_bins: + user_bins = [] kernel_bin = kernel_bin[0] iso_path = prepare_iso(args, kernel_bin, user_bins) diff --git a/src/aero_kernel/src/utils/bitmap.rs b/src/aero_kernel/src/utils/bitmap.rs index 3b1e7fe72f1..def9d3aca24 100644 --- a/src/aero_kernel/src/utils/bitmap.rs +++ b/src/aero_kernel/src/utils/bitmap.rs @@ -98,19 +98,9 @@ impl Bitmap { /// ``` pub fn find_first_unset(&self) -> Option { for (i, block) in self.bitmap.iter().enumerate() { - let mut block_value = *block; - - if block_value != usize::MAX { - let mut bit = 0; - - // Loop through the bits in the block and find - // the first unset bit. - while block_value.get_bit(0) { - block_value >>= 1; - bit += 1; - } - - return Some((i * BLOCK_BITS) + bit); + let trailing_ones = block.trailing_ones(); + if trailing_ones < BLOCK_BITS as u32 { + return Some(i * BLOCK_BITS + trailing_ones as usize); } } @@ -130,19 +120,9 @@ impl Bitmap { /// ``` pub fn find_first_set(&self) -> Option { for (i, block) in self.bitmap.iter().enumerate() { - let mut block_value = *block; - - if block_value != 0 { - let mut bit = 0; - - // Loop through the bits in the block and find - // the first set bit. - while !block_value.get_bit(0) { - block_value >>= 1; - bit += 1; - } - - return Some((i * BLOCK_BITS) + bit); + let trailing_zeros = block.trailing_zeros(); + if trailing_zeros < BLOCK_BITS as u32 { + return Some(i * BLOCK_BITS + trailing_zeros as usize); } } @@ -155,33 +135,80 @@ mod test { use super::*; use alloc::alloc::Global; + const TEST_BITMAP_SIZE: usize = 4096; + #[test] - fn bitmap_first_unset_idx() { - let mut bitmap = Bitmap::new_in(Global, 4096); + fn find_first_unset() { + let mut map = Bitmap::new_in(Global, TEST_BITMAP_SIZE); - bitmap.set(69, true); - assert_eq!(bitmap.find_first_unset(), Some(0)); + // Set all of the bits to true. + for i in 0..TEST_BITMAP_SIZE { + assert_eq!(map.find_first_unset(), Some(i)); + map.set(i, true); + } - bitmap.set(0, true); - assert_eq!(bitmap.find_first_unset(), Some(1)); - } + assert_eq!(map.find_first_unset(), None); - #[test] - fn bitmap_first_set_idx() { - let mut bitmap = Bitmap::new_in(Global, 4096); + map.set(0, false); + assert_eq!(map.find_first_unset(), Some(0)); + + map.set(0, true); + map.set(1, false); + assert_eq!(map.find_first_unset(), Some(1)); + + map.set(56, false); + assert_eq!(map.find_first_unset(), Some(1)); - bitmap.set(69, true); - assert_eq!(bitmap.find_first_set(), Some(69)); + map.set(1, true); + assert_eq!(map.find_first_unset(), Some(56)); + + map.set(80, false); + assert_eq!(map.find_first_unset(), Some(56)); + + map.set(56, true); + assert_eq!(map.find_first_unset(), Some(80)); + + map.set(82, false); + assert_eq!(map.find_first_unset(), Some(80)); + + map.set(80, true); + assert_eq!(map.find_first_unset(), Some(82)); + + map.set(5, false); + assert_eq!(map.find_first_unset(), Some(5)); } #[test] - fn bitmap_set_and_test() { - let mut bitmap = Bitmap::new_in(Global, 4096); + fn find_first_set() { + let mut map = Bitmap::new_in(Global, TEST_BITMAP_SIZE); + assert_eq!(map.find_first_set(), None); + + map.set(0, true); + assert_eq!(map.find_first_set(), Some(0)); + + map.set(0, false); + map.set(1, true); + assert_eq!(map.find_first_set(), Some(1)); + + map.set(56, true); + assert_eq!(map.find_first_set(), Some(1)); + + map.set(1, false); + assert_eq!(map.find_first_set(), Some(56)); + + map.set(80, true); + assert_eq!(map.find_first_set(), Some(56)); + + map.set(56, false); + assert_eq!(map.find_first_set(), Some(80)); + + map.set(82, true); + assert_eq!(map.find_first_set(), Some(80)); - bitmap.set(69, true); - assert!(bitmap.is_set(69)); + map.set(80, false); + assert_eq!(map.find_first_set(), Some(82)); - bitmap.set(69, false); - assert!(!bitmap.is_set(69)); + map.set(5, true); + assert_eq!(map.find_first_set(), Some(5)); } } From 5a559a126f0cb737eb6c1d0fcb581f6e8eb06b02 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 29 Jun 2023 15:30:55 +1000 Subject: [PATCH 235/368] kernel: add `cpu_local` proc macro Its like the `thread_local` macro; makes the code much cleaner :^) Signed-off-by: Anhad Singh --- src/.cargo/kernel.ld | 8 ++ src/aero_kernel/src/arch/x86_64/apic.rs | 9 +- src/aero_kernel/src/arch/x86_64/cpu_local.rs | 98 +++++++++++++++++++ src/aero_kernel/src/arch/x86_64/gdt.rs | 39 +++----- .../src/arch/x86_64/interrupts/exceptions.rs | 12 ++- .../src/arch/x86_64/interrupts/mod.rs | 2 +- src/aero_kernel/src/arch/x86_64/mod.rs | 8 +- .../src/arch/x86_64/syscall_handler.asm | 4 +- src/aero_kernel/src/arch/x86_64/task.rs | 2 +- src/aero_kernel/src/arch/x86_64/tls.rs | 37 +------ src/aero_kernel/src/arch/x86_64/user_copy.rs | 6 +- src/aero_kernel/src/mem/paging/addr.rs | 5 + src/aero_kernel/src/utils/mod.rs | 3 + src/aero_proc/src/cpu_local.rs | 41 ++++++++ src/aero_proc/src/lib.rs | 7 ++ 15 files changed, 205 insertions(+), 76 deletions(-) create mode 100644 src/aero_kernel/src/arch/x86_64/cpu_local.rs create mode 100644 src/aero_proc/src/cpu_local.rs diff --git a/src/.cargo/kernel.ld b/src/.cargo/kernel.ld index ca517cc91d2..2dac010f6a5 100644 --- a/src/.cargo/kernel.ld +++ b/src/.cargo/kernel.ld @@ -30,6 +30,14 @@ SECTIONS *(.rodata .rodata.*) } :rodata + .cpu_local : { + __cpu_local_start = .; + KEEP(*(.cpu_local_self_ptr)); + KEEP(*(.cpu_local_tss)); + KEEP(*(.cpu_local)); + __cpu_local_end = .; + } + /* Move to the next memory page for .data */ . += CONSTANT(MAXPAGESIZE); diff --git a/src/aero_kernel/src/arch/x86_64/apic.rs b/src/aero_kernel/src/arch/x86_64/apic.rs index 287e9fe9acb..6b08befd45b 100644 --- a/src/aero_kernel/src/arch/x86_64/apic.rs +++ b/src/aero_kernel/src/arch/x86_64/apic.rs @@ -18,8 +18,8 @@ use core::ptr; use core::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering}; +use crate::arch::interrupts; use crate::arch::interrupts::InterruptStack; -use crate::arch::{interrupts, tls}; use crate::mem::paging::{PhysAddr, VirtAddr}; use raw_cpuid::{CpuId, FeatureInfo}; use spin::Once; @@ -108,6 +108,9 @@ fn lapic_error_handler(_stack: &mut InterruptStack) { log::error!("ESR={:#0x}", self::get_local_apic().get_esr()); } +#[cpu_local] +static mut LAPIC_TIMER_FREQUENCY: u32 = 0; + pub struct LocalApic { address: VirtAddr, apic_type: ApicType, @@ -194,7 +197,7 @@ impl LocalApic { pub fn timer_oneshot(&mut self, vec: u8, us: usize) { self.timer_stop(); - let lapic_timer_frequency = tls::get_percpu().lapic_timer_frequency; + let lapic_timer_frequency = unsafe { *LAPIC_TIMER_FREQUENCY }; let ticks = us * (lapic_timer_frequency / 1000000) as usize; unsafe { @@ -225,7 +228,7 @@ impl LocalApic { let pit_ticks = initial_pit_tick - final_pit_tick; let timer_frequency = (SAMPLES / pit_ticks as u32) * time::PIT_DIVIDEND as u32; - tls::get_percpu().lapic_timer_frequency = timer_frequency; + *LAPIC_TIMER_FREQUENCY = timer_frequency; } self.timer_stop(); diff --git a/src/aero_kernel/src/arch/x86_64/cpu_local.rs b/src/aero_kernel/src/arch/x86_64/cpu_local.rs new file mode 100644 index 00000000000..f42b6372288 --- /dev/null +++ b/src/aero_kernel/src/arch/x86_64/cpu_local.rs @@ -0,0 +1,98 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +use core::alloc::Layout; +use core::ops::{Deref, DerefMut}; + +use crate::mem::paging::VirtAddr; +use crate::utils::LinkerSymbol; + +use super::io; + +extern "C" { + static __cpu_local_start: LinkerSymbol; + static __cpu_local_end: LinkerSymbol; +} + +#[repr(C)] +pub struct CpuLocal(T); + +impl CpuLocal { + pub const fn new(val: T) -> Self { + Self(val) + } + + pub fn addr(&self) -> VirtAddr { + let val: u64; + + unsafe { + // gs:[0] -> SELF_PTR + asm!( + "mov {}, qword ptr gs:[0]", + lateout(reg) val, + options(nostack, preserves_flags, pure, readonly), + ); + } + + let self_addr = VirtAddr::new(self as *const _ as u64); + let section_addr = VirtAddr::new(unsafe { &__cpu_local_start as *const _ as u64 }); + + let offset = self_addr - section_addr; + VirtAddr::new(val) + offset + } +} + +impl Deref for CpuLocal { + type Target = T; + + fn deref(&self) -> &Self::Target { + unsafe { &*self.addr().as_ptr() } + } +} + +impl DerefMut for CpuLocal { + fn deref_mut(&mut self) -> &mut Self::Target { + unsafe { &mut *self.addr().as_mut_ptr() } + } +} + +/// The GS register holds a pointer to CPU-local data at a fixed offset of 0. While this approach +/// requires an additional memory lookup for accessing the data, it enables better code optimization +/// since the subsequent access is just a normal memory access. Considering the size of the +/// CPU-local data, this optimization is beneficial. +#[cpu_local(subsection = "self_ptr")] +static SELF_PTR: u64 = 0; + +#[cpu_local] +static mut CPUID: usize = 0; + +pub fn init(cpu_id: usize) { + unsafe { + let start = VirtAddr::new(&__cpu_local_start as *const _ as u64); + let end = VirtAddr::new(&__cpu_local_end as *const _ as u64); + let size = end - start; + + let layout = Layout::from_size_align_unchecked(size as _, 64); + let data = alloc::alloc::alloc_zeroed(layout); + + core::ptr::copy_nonoverlapping::(start.as_ptr(), data, size as usize); + *data.cast::() = data as u64; + + io::wrmsr(io::IA32_GS_BASE, data as u64); + *CPUID = cpu_id; + } +} diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index 3fd61a9f58a..8a651b6a2d7 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -29,10 +29,6 @@ use core::mem; use alloc::alloc::alloc_zeroed; -use crate::arch::tls::PerCpuData; - -use super::{io, tls}; - bitflags::bitflags! { /// Specifies which element to load into a segment from /// descriptor tables (i.e., is a index to LDT or GDT table @@ -283,12 +279,16 @@ pub struct Tss { pub iomap_base: u16, // offset 0x66 } -// Processor Control Region -#[repr(C)] -pub struct Kpcr { - pub tss: Tss, - pub cpu_local: PerCpuData, -} +#[cpu_local(subsection = "tss")] +pub static mut TSS: Tss = Tss { + reserved: 0, + rsp: [0; 3], + reserved2: 0, + ist: [0; 7], + reserved3: 0, + reserved4: 0, + iomap_base: 0, +}; /// Initialize the bootstrap GDT which is required to initialize TLS (Thread Local Storage) /// support so, after the kernel heap we will map the TLS section and initialize the *actual* GDT @@ -315,14 +315,6 @@ pub fn init_boot() { } } -pub fn get_task_state_segment() -> &'static mut Tss { - &mut get_kpcr().tss -} - -pub fn get_kpcr() -> &'static mut Kpcr { - unsafe { &mut *(io::rdmsr(io::IA32_GS_BASE) as *mut Kpcr) } -} - static STK: [u8; 4096 * 16] = [0; 4096 * 16]; /// Initialize the *actual* GDT stored in TLS. @@ -345,14 +337,13 @@ pub fn init() { gdt.copy_from_slice(&GDT); unsafe { - let tss_ref = get_task_state_segment(); - let tss_ptr = tss_ref as *mut Tss; + let tss_ptr = TSS.addr().as_mut_ptr::(); gdt[GdtEntryType::TSS as usize].set_offset(tss_ptr as u32); gdt[GdtEntryType::TSS as usize].set_limit(mem::size_of::() as u32); gdt[GdtEntryType::TSS_HI as usize].set_raw((tss_ptr as u64) >> 32); - tss_ref.rsp[0] = STK.as_ptr().offset(4096 * 16) as u64; + TSS.rsp[0] = STK.as_ptr().offset(4096 * 16) as u64; let gdt_descriptor = GdtDescriptor::new( (mem::size_of::<[GdtEntry; GDT_ENTRY_COUNT]>() - 1) as u16, @@ -371,9 +362,9 @@ pub fn init() { load_tss(SegmentSelector::new(GdtEntryType::TSS, Ring::Ring0)); } - // Now we update the per-cpu storage to store a reference - // to the per-cpu GDT. - tls::get_percpu().gdt = gdt; + // // Now we update the per-cpu storage to store a reference + // // to the per-cpu GDT. + // tls::get_percpu().gdt = gdt; } #[inline(always)] diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs index 0f24e29239d..579e1d9c860 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs @@ -18,12 +18,14 @@ use super::{io, InterruptErrorStack}; use crate::arch::controlregs; -use crate::arch::tls::get_percpu; -use crate::mem::paging::PageFaultErrorCode; +use crate::mem::paging::{PageFaultErrorCode, VirtAddr}; use crate::unwind; use crate::userland::scheduler; +#[cpu_local] +pub static mut PF_RESUME: VirtAddr = VirtAddr::new(0); + const LOG_PF_PTABLE: bool = true; macro interrupt_exception(fn $name:ident() => $message:expr) { @@ -121,9 +123,9 @@ pub fn breakpoint(stack: &mut InterruptErrorStack) { } pub(super) fn page_fault(stack: &mut InterruptErrorStack) { - let pf_resume = get_percpu().pf_resume.as_ptr::(); - if !pf_resume.is_null() { - stack.stack.iret.rip = pf_resume as u64; + let pf_resume = unsafe { *PF_RESUME }; + if !pf_resume.is_zero() { + stack.stack.iret.rip = pf_resume.as_u64(); return; } diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs index 065b7e2983b..ce3e0bfc055 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs @@ -15,7 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -mod exceptions; +pub mod exceptions; mod idt; use core::sync::atomic::{AtomicUsize, Ordering}; diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index 3a4d8fa8372..71b8bf379f4 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -15,6 +15,8 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +pub mod cpu_local; + pub mod apic; pub mod controlregs; pub mod gdt; @@ -181,7 +183,8 @@ extern "C" fn arch_aero_main() -> ! { acpi::init(rsdp); log::info!("loaded ACPI"); - tls::init(0); + tls::init(); + cpu_local::init(0); log::info!("loaded TLS"); crate::unwind::set_panic_hook_ready(true); @@ -209,7 +212,8 @@ extern "C" fn x86_64_aero_ap_main(boot_info: *const SmpInfo) -> ! { gdt::init_boot(); log::info!("AP{}: loaded boot GDT", ap_id); - tls::init(ap_id); + tls::init(); + cpu_local::init(ap_id); log::info!("AP{}: loaded TLS", ap_id); gdt::init(); diff --git a/src/aero_kernel/src/arch/x86_64/syscall_handler.asm b/src/aero_kernel/src/arch/x86_64/syscall_handler.asm index c82af12db7e..e9a519d0c9c 100644 --- a/src/aero_kernel/src/arch/x86_64/syscall_handler.asm +++ b/src/aero_kernel/src/arch/x86_64/syscall_handler.asm @@ -23,8 +23,8 @@ extern x86_64_do_syscall extern x86_64_check_sysenter global x86_64_syscall_handler -%define TSS_TEMP_USTACK_OFF 0x1c -%define TSS_RSP0_OFF 0x04 +%define TSS_TEMP_USTACK_OFF 0x24 +%define TSS_RSP0_OFF 0xc %define USERLAND_SS 0x23 %define USERLAND_CS 0x2b diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 7748a8d629d..65dbe30a927 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -548,7 +548,7 @@ pub fn arch_task_spinup(from: &mut ArchTask, to: &ArchTask) { unsafe { // Load the new thread's kernel stack pointer everywhere it's needed. let kstackp = to.context_switch_rsp.as_u64(); - super::gdt::get_task_state_segment().rsp[0] = kstackp; + super::gdt::TSS.rsp[0] = kstackp; io::wrmsr(io::IA32_SYSENTER_ESP, kstackp); // Preserve and restore the %fs, %gs bases. diff --git a/src/aero_kernel/src/arch/x86_64/tls.rs b/src/aero_kernel/src/arch/x86_64/tls.rs index 9cd20e295b7..e2cedfb0388 100644 --- a/src/aero_kernel/src/arch/x86_64/tls.rs +++ b/src/aero_kernel/src/arch/x86_64/tls.rs @@ -23,15 +23,8 @@ //! * //! * -use core::alloc::Layout; - -use alloc::alloc::alloc_zeroed; use alloc::vec::Vec; -use super::gdt::*; -use super::io; - -use crate::mem::paging::VirtAddr; use crate::utils::sync::Mutex; use raw_cpuid::FeatureInfo; @@ -110,37 +103,11 @@ pub struct CpuInfo { pub features: Vec<&'static &'static str>, } -#[repr(C)] -pub struct PerCpuData { - pub cpuid: usize, - pub lapic_timer_frequency: u32, - - pub(super) gdt: &'static mut [GdtEntry], - pub(super) pf_resume: VirtAddr, -} - -/// SAFETY: The GS base should point to the kernel PCR. pub fn get_cpuid() -> usize { - get_percpu().cpuid + 0 } -/// SAFETY: The GS base should point to the kernel PCR. -pub fn get_percpu() -> &'static mut PerCpuData { - &mut get_kpcr().cpu_local -} - -pub fn init(cpuid: usize) { - // NOTE: Inside kernel space, the GS base will always point to the CPU local data and when - // jumping to userland `swapgs` is called making the GS base point to the userland TLS data. - unsafe { - let kpcr_layout = Layout::new::(); - - let kpcr_ptr = alloc_zeroed(kpcr_layout) as *mut Kpcr; - io::wrmsr(io::IA32_GS_BASE, kpcr_ptr as u64); - } - - get_percpu().cpuid = cpuid; - +pub fn init() { let cpuid = raw_cpuid::CpuId::new(); let features = cpuid diff --git a/src/aero_kernel/src/arch/x86_64/user_copy.rs b/src/aero_kernel/src/arch/x86_64/user_copy.rs index f9fd52f4ea4..bc632787009 100644 --- a/src/aero_kernel/src/arch/x86_64/user_copy.rs +++ b/src/aero_kernel/src/arch/x86_64/user_copy.rs @@ -18,10 +18,10 @@ use core::mem::MaybeUninit; use core::ops::{Deref, DerefMut}; +use crate::interrupts::exceptions::PF_RESUME; use crate::mem::paging::VirtAddr; use super::task::user_access_ok; -use super::tls::get_percpu; /// Copy to/from a block of data from user space. Returns whether the copy was successful. /// @@ -87,7 +87,7 @@ unsafe extern "C" fn copy_to_from_user( /// Copy a structure from userspace memory. Returns whether the copy was successful. #[must_use] fn copy_from_user(dest: &mut MaybeUninit, src: *const T) -> bool { - let fault_resume = &get_percpu().pf_resume as *const _ as *const u8; + let fault_resume = unsafe { PF_RESUME.addr() }.as_ptr(); let size = core::mem::size_of::(); user_access_ok(src); @@ -99,7 +99,7 @@ fn copy_from_user(dest: &mut MaybeUninit, src: *const T) -> bool { /// Copy a structure from userspace memory. Returns whether the copy was successful. #[must_use] fn copy_to_user(dest: *mut T, src: &T) -> bool { - let fault_resume = &get_percpu().pf_resume as *const _ as *const u8; + let fault_resume = unsafe { PF_RESUME.addr() }.as_ptr(); let size = core::mem::size_of::(); let src_ptr = src as *const T; diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 8a3698b0997..354b9100751 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -108,6 +108,11 @@ impl VirtAddr { self.as_ptr::() as *mut T } + #[inline] + pub fn is_zero(self) -> bool { + self.0 == 0 + } + /// Validate reads `sizeof(T)` bytes from the virtual address and returns a mutable /// reference to the value (`&mut T`). /// diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index 96771c17a5b..5678717fce6 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -249,3 +249,6 @@ mod tests { assert_eq!((7usize).ceil_div(4), 2); } } + +#[repr(transparent)] +pub struct LinkerSymbol(core::cell::UnsafeCell); diff --git a/src/aero_proc/src/cpu_local.rs b/src/aero_proc/src/cpu_local.rs new file mode 100644 index 00000000000..244fee62336 --- /dev/null +++ b/src/aero_proc/src/cpu_local.rs @@ -0,0 +1,41 @@ +use proc_macro::TokenStream; +use syn::{Lit, Meta, MetaNameValue, NestedMeta}; + +pub fn parse(attr: TokenStream, item: TokenStream) -> TokenStream { + let item = syn::parse_macro_input!(item as syn::ItemStatic); + + let ty = &item.ty; + let ident = &item.ident; + let mutability = &item.mutability; + let vis = &item.vis; + let initializer = &item.expr; + + // Parse the attribute arguments + let args = syn::parse_macro_input!(attr as syn::AttributeArgs); + + // Process each argument to find the subsection value + let mut subsection = None; + for arg in args { + if let NestedMeta::Meta(Meta::NameValue(MetaNameValue { path, lit, .. })) = arg { + if let Some(ident) = path.get_ident() { + if ident == "subsection" { + if let Lit::Str(lit_str) = lit { + subsection = Some(lit_str.value()); + } + } + } + } + } + + let link_section = match subsection { + Some(subsection) => format!(".cpu_local_{}", subsection), + None => ".cpu_local".to_string(), + }; + + quote::quote! { + #[link_section = #link_section] + #[used] + #vis static #mutability #ident: crate::arch::cpu_local::CpuLocal<#ty> = crate::arch::cpu_local::CpuLocal::new(#initializer); + } + .into() +} diff --git a/src/aero_proc/src/lib.rs b/src/aero_proc/src/lib.rs index 36f561b3dc8..d0e7f8aa90a 100644 --- a/src/aero_proc/src/lib.rs +++ b/src/aero_proc/src/lib.rs @@ -20,6 +20,7 @@ #[macro_use] extern crate proc_macro_error; +mod cpu_local; mod downcastable; mod syscall; mod test; @@ -57,3 +58,9 @@ pub fn syscall(attr: TokenStream, item: TokenStream) -> TokenStream { pub fn downcastable(attr: TokenStream, item: TokenStream) -> TokenStream { downcastable::parse(attr, item) } + +#[proc_macro_attribute] +#[proc_macro_error] +pub fn cpu_local(attr: TokenStream, item: TokenStream) -> TokenStream { + cpu_local::parse(attr, item) +} From 6ef128dce8bbeae426d433b85482439fdde7d54c Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 29 Jun 2023 15:39:56 +1000 Subject: [PATCH 236/368] kernel: fix formatting Signed-off-by: Anhad Singh --- src/aero_kernel/src/userland/scheduler/round_robin.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 53ad3fe2ac0..fe1f2e59375 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -261,11 +261,10 @@ impl SchedulerInterface for RoundRobin { fn preempt(&self) { // We want to preempt under the following circumstances: // - // 1. When a process switches from the running state to the waiting - // state. + // 1. When a process switches from the running state to the waiting state. // 2. When the timer interrupt fires. - // 3. When the process switches from the waiting state to the runnable state - // (for example, on completion of I/O operation). + // 3. When the process switches from the waiting state to the runnable state (for example, + // on completion of I/O operation). // 4. When the process is terminated. let guard = IrqGuard::new(); From 05a3f5f92e0d02baf5131a0b310e961b30f9c8b5 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 29 Jun 2023 15:44:21 +1000 Subject: [PATCH 237/368] kernel: bump dependencies Deps bumped: * intrusive-collections * proc-macro2 Signed-off-by: Anhad Singh --- src/Cargo.lock | 18 +++++++++--------- src/aero_kernel/Cargo.toml | 2 +- src/aero_proc/Cargo.toml | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index d0aae938a0a..3c084667136 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -201,11 +201,11 @@ dependencies = [ [[package]] name = "intrusive-collections" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe531a7789d7120f3e17d4f3f2cd95f54418ba7354f60b7b622b6644a07888a" +checksum = "3f4f90afb01281fdeffb0f8e082d230cbe4f888f837cc90759696b858db1a700" dependencies = [ - "memoffset 0.5.6", + "memoffset 0.8.0", ] [[package]] @@ -263,18 +263,18 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.5.6" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ "autocfg", ] [[package]] name = "memoffset" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" dependencies = [ "autocfg", ] @@ -350,9 +350,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.47" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" dependencies = [ "unicode-ident", ] diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index 032d795f106..a31b87e3fb9 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -34,7 +34,7 @@ hashbrown = "0.12.3" rustc-demangle = "0.1.20" # intrusive-collections: # `nightly`: Get access to const variants of the functions. -intrusive-collections = { version = "0.9.2", features = ["nightly"] } +intrusive-collections = { version = "0.9.5", features = ["nightly"] } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } lai = { git = "https://github.com/aero-os/lai-rs" } uapi = { path = "../uapi" } diff --git a/src/aero_proc/Cargo.toml b/src/aero_proc/Cargo.toml index feeee04f920..04f2a19be45 100644 --- a/src/aero_proc/Cargo.toml +++ b/src/aero_proc/Cargo.toml @@ -12,7 +12,7 @@ default = [] proc-macro = true [dependencies] -proc-macro2 = "1.0.37" +proc-macro2 = "1.0.63" proc-macro-error = "1.0.4" quote = "1.0.18" From 23ed2ee68f589985841c13d5d3d9f5063f2bd4fe Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 29 Jun 2023 16:12:14 +1000 Subject: [PATCH 238/368] kernel: bump deps Signed-off-by: Anhad Singh --- src/Cargo.lock | 82 +++++++++++++++++++------------------- src/aero_kernel/Cargo.toml | 18 ++++----- 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index 3c084667136..5398995dca0 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -9,12 +9,12 @@ dependencies = [ "aero_proc", "aero_syscall", "bit_field", - "bitflags", + "bitflags 1.3.2", "bytemuck", "byteorder", "cfg-if", "cpio_reader", - "hashbrown", + "hashbrown 0.14.0", "intrusive-collections", "lai", "lazy_static", @@ -48,7 +48,7 @@ dependencies = [ name = "aero_syscall" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.3.2", "num-derive", "num-traits", "simple_endian 0.2.1 (git+https://github.com/michalfita/simple-endian-rs?branch=bugfix/4/fix-no_std-support-right-way)", @@ -56,15 +56,21 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ - "getrandom", + "cfg-if", "once_cell", "version_check", ] +[[package]] +name = "allocator-api2" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56fc6cf8dc8c4158eed8649f9b8b0ea1518eb62b544fe9490d66fa0b349eafe9" + [[package]] name = "arrayvec" version = "0.7.2" @@ -79,9 +85,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bit_field" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" [[package]] name = "bitflags" @@ -89,11 +95,17 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "bytemuck" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" [[package]] name = "byteorder" @@ -118,7 +130,7 @@ name = "cpio_reader" version = "0.1.1" source = "git+https://github.com/Andy-Python-Programmer/cpio_reader#8ae88c281288385447976398c57af0549a47ce72" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -171,23 +183,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] -name = "getrandom" -version = "0.2.8" +name = "hashbrown" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "cfg-if", - "libc", - "wasi", + "ahash", ] [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" dependencies = [ "ahash", + "allocator-api2", ] [[package]] @@ -245,20 +256,17 @@ source = "git+https://github.com/limine-bootloader/limine-rs#2f0ae642064749372a6 [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "lru" -version = "0.8.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" +checksum = "03f1160296536f10c833a82dca22267d5486734230d47bf00bf435885814ba1e" dependencies = [ - "hashbrown", + "hashbrown 0.13.2", ] [[package]] @@ -368,11 +376,11 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "10.6.0" +version = "11.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6823ea29436221176fe662da99998ad3b4db2c7f31e7b6f5fe43adccd6320bb" +checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" dependencies = [ - "bitflags", + "bitflags 2.3.3", ] [[package]] @@ -399,9 +407,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "ryu" @@ -512,17 +520,11 @@ dependencies = [ "quote", ] -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - [[package]] name = "xmas-elf" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d29b4d8e7beaceb4e77447ba941a7600d23d0319ab52da0461abea214832d5a" +checksum = "f820cc767d65b32eef9d7ce7201448f28501c59edc55d47b71375fea579fc2df" dependencies = [ "zero", ] diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index a31b87e3fb9..edb0a470059 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -27,11 +27,11 @@ spin = { version = "0.9.8", default-features = false, features = [ "once", ] } bitflags = "1.2.1" -bit_field = "0.10.1" -log = "0.4.14" -xmas-elf = "0.8.0" -hashbrown = "0.12.3" -rustc-demangle = "0.1.20" +bit_field = "0.10.2" +log = "0.4.19" +xmas-elf = "0.9.0" +hashbrown = "0.14.0" +rustc-demangle = "0.1.23" # intrusive-collections: # `nightly`: Get access to const variants of the functions. intrusive-collections = { version = "0.9.5", features = ["nightly"] } @@ -40,10 +40,10 @@ lai = { git = "https://github.com/aero-os/lai-rs" } uapi = { path = "../uapi" } cpio_reader = { git = "https://github.com/Andy-Python-Programmer/cpio_reader" } static_assertions = "1.1.0" -lru = "0.8.0" -bytemuck = "1.12.1" +lru = "0.10.0" +bytemuck = "1.13.1" simple_endian = { git = "https://github.com/Andy-Python-Programmer/simple-endian-rs" } -byteorder = { version = "*", default-features = false } +byteorder = { version = "1.4.3", default-features = false } limine = { git = "https://github.com/limine-bootloader/limine-rs" } cfg-if = "1.0" num-traits = { version = "0.2", default-features = false } @@ -51,7 +51,7 @@ vte = { git = "https://github.com/alacritty/vte", features = ["ansi"] } # X86_64 specific dependencies: [target.'cfg(target_arch = "x86_64")'.dependencies] -raw-cpuid = "10.0.0" +raw-cpuid = "11.0.1" [dependencies.lazy_static] version = "1.4.0" From 44adc4103a35376d695dee72c29eabf14949e8f7 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 15 Jul 2023 18:46:48 +1000 Subject: [PATCH 239/368] kernel: add indirect function support * Use it to determine the fastest implementation of `memcpy` and `memset`. Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/mem.rs | 79 +++++++++++++++++++++----- src/aero_kernel/src/arch/x86_64/mod.rs | 40 ++++++------- src/aero_kernel/src/main.rs | 26 +++++++++ src/aero_kernel/src/unwind.rs | 2 +- src/aero_proc/src/indirect.rs | 42 ++++++++++++++ src/aero_proc/src/lib.rs | 7 +++ 6 files changed, 162 insertions(+), 34 deletions(-) create mode 100644 src/aero_proc/src/indirect.rs diff --git a/src/aero_kernel/src/arch/x86_64/mem.rs b/src/aero_kernel/src/arch/x86_64/mem.rs index 1b7ad5bb802..00f76b35185 100644 --- a/src/aero_kernel/src/arch/x86_64/mem.rs +++ b/src/aero_kernel/src/arch/x86_64/mem.rs @@ -15,7 +15,16 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -#[no_mangle] +fn should_store_by_byte() -> bool { + let cpuid = raw_cpuid::CpuId::new(); + if let Some(features) = cpuid.get_extended_feature_info() { + // Check if "Enhanced" or "Fast Short" optimizations are available. + features.has_rep_movsb_stosb() + } else { + false + } +} + #[naked] unsafe extern "C" fn memcpy_movsq(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 { // Registers used: @@ -39,7 +48,33 @@ unsafe extern "C" fn memcpy_movsq(dest: *mut u8, src: *const u8, len: usize) -> ); } -#[no_mangle] +#[naked] +unsafe extern "C" fn memcpy_movsb(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 { + // Registers used: + // + // %rdi = argument 1, `dest` + // %rsi = argument 2, `src` + // %rdx = argument 3, `len` + asm!( + // Save the return value. + "mov rax, rdi", + // Copy! + "mov rcx, rdx", + "rep movsb", + "ret", + options(noreturn) + ) +} + +#[indirect] +extern "C" fn memcpy() -> fn(*mut u8, *const u8, usize) { + if should_store_by_byte() { + memcpy_movsb + } else { + memcpy_movsq + } +} + #[naked] unsafe extern "C" fn memset_stosq(dest: *mut u8, byte: i32, len: usize) -> *mut u8 { // Registers used: @@ -70,6 +105,34 @@ unsafe extern "C" fn memset_stosq(dest: *mut u8, byte: i32, len: usize) -> *mut ) } +#[naked] +unsafe extern "C" fn memset_stosb(dest: *mut u8, byte: i32, len: usize) -> *mut u8 { + // Registers used: + // + // %rdi = argument 1, `dest` + // %rsi = argument 2, `byte` + // %rdx = argument 3, `len` + asm!( + // Save the return value. + "mov r11, rdi", + "mov al, sil", + "mov rcx, rdx", + "rep stosb", + "mov rax, r11", + "ret", + options(noreturn) + ) +} + +#[indirect] +extern "C" fn memset() -> fn(*mut u8, i32, usize) { + if should_store_by_byte() { + memset_stosb + } else { + memset_stosq + } +} + #[no_mangle] #[naked] unsafe extern "C" fn memmove_erms(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 { @@ -108,18 +171,6 @@ unsafe extern "C" fn memmove_erms(dest: *mut u8, src: *const u8, len: usize) -> ) } -// FIXME(andypython): pick the best implementation for the current CPU using indirect functions. - -#[no_mangle] -extern "C" fn memcpy(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 { - unsafe { memcpy_movsq(dest, src, len) } -} - -#[no_mangle] -extern "C" fn memset(dest: *mut u8, byte: i32, len: usize) -> *mut u8 { - unsafe { memset_stosq(dest, byte, len) } -} - #[no_mangle] extern "C" fn memmove(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 { unsafe { memmove_erms(dest, src, len) } diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index 71b8bf379f4..b864b6269c7 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -59,25 +59,6 @@ static HHDM: HhdmRequest = HhdmRequest::new(0); #[no_mangle] extern "C" fn arch_aero_main() -> ! { - unsafe { - core::ptr::read_volatile(STACK.get_response().as_ptr().unwrap()); - } - - // SAFETY: We have exclusive access to the memory map. - let memmap = MEMMAP - .get_response() - .get_mut() - .expect("limine: invalid memmap response") - .memmap_mut(); - - unsafe { - interrupts::disable_interrupts(); - } - - unsafe { - crate::PHYSICAL_MEMORY_OFFSET = VirtAddr::new(HHDM.get_response().get().unwrap().offset); - } - let kernel_file_resp = KERNEL_FILE .get_response() .get() @@ -107,6 +88,27 @@ extern "C" fn arch_aero_main() -> ! { UnwindInfo::new(elf) }); + crate::relocate_self(); + + unsafe { + core::ptr::read_volatile(STACK.get_response().as_ptr().unwrap()); + } + + // SAFETY: We have exclusive access to the memory map. + let memmap = MEMMAP + .get_response() + .get_mut() + .expect("limine: invalid memmap response") + .memmap_mut(); + + unsafe { + interrupts::disable_interrupts(); + } + + unsafe { + crate::PHYSICAL_MEMORY_OFFSET = VirtAddr::new(HHDM.get_response().get().unwrap().offset); + } + // Now that we have unwind info, we can initialize the COM ports. This // will be used to print panic messages/logs before the debug renderer is // initialized to the serial output (if available). diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index d1bdf85533b..bf1a0531a9e 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -112,6 +112,32 @@ static mut PHYSICAL_MEMORY_OFFSET: VirtAddr = VirtAddr::zero(); const IO_VIRTUAL_BASE: VirtAddr = VirtAddr::new(0xffffff0000000000); +const STT_GNU_IFUNC: u32 = 37; + +pub fn relocate_self() { + use xmas_elf::sections::SectionData; + + let unwind_info = unwind::UNWIND_INFO.get().unwrap(); + let kernel_elf = &unwind_info.kernel_elf; + + for section in kernel_elf.section_iter() { + if let Ok(SectionData::Rela64(rela)) = section.get_data(kernel_elf) { + for item in rela { + if !item.get_type() == STT_GNU_IFUNC { + continue; + } + + let offset = unsafe { &mut *(item.get_offset() as *mut usize) }; + + let resolver_ptr = item.get_addend() as *const u8; + let resolver: fn() -> usize = unsafe { core::mem::transmute(resolver_ptr) }; + + *offset = resolver(); + } + } + } +} + fn aero_main() -> ! { // NOTE: In this function we only want to initialize essential services, including // the task scheduler. Rest of the initializing (including kernel modules) should go diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index 7b3c3b67709..a6d59abc1a7 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -60,7 +60,7 @@ pub fn prepare_panic() { } pub struct UnwindInfo { - kernel_elf: ElfFile<'static>, + pub kernel_elf: ElfFile<'static>, } impl UnwindInfo { diff --git a/src/aero_proc/src/indirect.rs b/src/aero_proc/src/indirect.rs new file mode 100644 index 00000000000..a1e8a3c54cb --- /dev/null +++ b/src/aero_proc/src/indirect.rs @@ -0,0 +1,42 @@ +use proc_macro::TokenStream; +use proc_macro2::{Ident, Span}; + +pub fn parse(_: TokenStream, item: TokenStream) -> TokenStream { + let item = syn::parse_macro_input!(item as syn::ItemFn); + let args = item.sig.inputs; + + let name = item.sig.ident.to_string(); + + // Underscores at the beginning of the identifier make it reserved, and the more underscores + // there are, the more reserveder it is. + let resolve_name = Ident::new(&format!("__resolve_{name}"), Span::call_site()); + + let inline = format!( + r" + .global {name} + + .type {name}, @gnu_indirect_function + .set {name},{{}} + " + ); + + let name = &item.sig.ident; + let resolve_body = &item.block; + + quote::quote! { + fn #resolve_name() -> usize { + let resolved_function = { + #resolve_body + }; + + resolved_function as usize + } + + ::core::arch::global_asm!(#inline, sym #resolve_name); + + extern "C" { + fn #name(#args); + } + } + .into() +} diff --git a/src/aero_proc/src/lib.rs b/src/aero_proc/src/lib.rs index d0e7f8aa90a..2dfe0ac0c59 100644 --- a/src/aero_proc/src/lib.rs +++ b/src/aero_proc/src/lib.rs @@ -22,6 +22,7 @@ extern crate proc_macro_error; mod cpu_local; mod downcastable; +mod indirect; mod syscall; mod test; @@ -64,3 +65,9 @@ pub fn downcastable(attr: TokenStream, item: TokenStream) -> TokenStream { pub fn cpu_local(attr: TokenStream, item: TokenStream) -> TokenStream { cpu_local::parse(attr, item) } + +#[proc_macro_attribute] +#[proc_macro_error] +pub fn indirect(attr: TokenStream, item: TokenStream) -> TokenStream { + indirect::parse(attr, item) +} From 120f2d32eb4a39c5b936ea946dfda96b742e102f Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 15 Jul 2023 18:57:48 +1000 Subject: [PATCH 240/368] workspaces: use resolver V2 Signed-off-by: Anhad Singh --- src/Cargo.toml | 1 + userland/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Cargo.toml b/src/Cargo.toml index 2a3e0e90ff0..cca7d273148 100644 --- a/src/Cargo.toml +++ b/src/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = ["aero_kernel", "aero_syscall", "aero_proc"] [profile.release] diff --git a/userland/Cargo.toml b/userland/Cargo.toml index 1a52adcab02..c2e6b521c9c 100644 --- a/userland/Cargo.toml +++ b/userland/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = ["apps/*", "servers/*"] [profile.release] From 94e01d23b246622b85edbc45c793602134cb8a7a Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 16 Jul 2023 12:55:00 +1000 Subject: [PATCH 241/368] io: make {set,get}_{fs,gs}_base indirect functions Signed-off-by: Anhad Singh --- bootstrap.yml | 4 +- src/aero_kernel/src/arch/x86_64/io.rs | 70 +++++++++++++++++++------- src/aero_kernel/src/arch/x86_64/mem.rs | 4 +- src/aero_proc/src/indirect.rs | 19 ++++++- userland/Cargo.lock | 4 +- 5 files changed, 75 insertions(+), 26 deletions(-) diff --git a/bootstrap.yml b/bootstrap.yml index 7d1e86f97b1..038969ab637 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -902,7 +902,7 @@ packages: - '--prefix=/usr' - '-Dheaders_only=true' - '-Ddisable_iconv_option=true' - - '-Dbuildtype=debug' + - '--buildtype=release' - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' - '@THIS_SOURCE_DIR@' build: @@ -929,7 +929,7 @@ packages: - '--libdir=lib' - '-Dmlibc_no_headers=true' - '-Ddisable_iconv_option=true' - - '-Dbuildtype=debug' + - '--buildtype=release' - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' - '@THIS_SOURCE_DIR@' build: diff --git a/src/aero_kernel/src/arch/x86_64/io.rs b/src/aero_kernel/src/arch/x86_64/io.rs index 866be0ddc50..cd8ea6bcc52 100644 --- a/src/aero_kernel/src/arch/x86_64/io.rs +++ b/src/aero_kernel/src/arch/x86_64/io.rs @@ -261,7 +261,7 @@ pub fn rdgsbase() -> VirtAddr { /// # Safety /// The caller must ensure that the swap operation does not cause any undefined behavior. -#[inline] +#[inline(always)] pub unsafe fn swapgs() { asm!("swapgs", options(nostack, preserves_flags)); } @@ -271,48 +271,80 @@ pub unsafe fn swapgs() { // the `KERNEL_GS_BASE` MSR. /// Sets the inactive `GS` segment's base address. -#[inline] -pub unsafe fn set_inactive_gsbase(base: VirtAddr) { - if super::has_fsgsbase() { +#[indirect] +pub fn set_inactive_gsbase() -> fn(base: VirtAddr) { + unsafe fn with_wrgsbase(base: VirtAddr) { swapgs(); wrgsbase(base); swapgs(); - } else { + } + + unsafe fn with_wrmsr(base: VirtAddr) { wrmsr(IA32_KERNEL_GSBASE, base.as_u64()); } + + if super::has_fsgsbase() { + with_wrgsbase + } else { + with_wrmsr + } } /// Returns the inactive `GS` segment's base address. -#[inline] -pub fn get_inactive_gsbase() -> VirtAddr { - if super::has_fsgsbase() { +#[indirect] +pub fn get_inactive_gsbase() -> fn() -> VirtAddr { + fn with_rdgsbase() -> VirtAddr { // SAFETY: The GS base is swapped back to the original value after the read. unsafe { swapgs() }; let base = rdgsbase(); unsafe { swapgs() }; base - } else { + } + + fn with_rdmsr() -> VirtAddr { VirtAddr::new(unsafe { rdmsr(IA32_KERNEL_GSBASE) }) } -} -/// Returns the `FS` segment's base address. -#[inline] -pub fn get_fsbase() -> VirtAddr { if super::has_fsgsbase() { - rdfsbase() + with_rdgsbase } else { - VirtAddr::new(unsafe { rdmsr(IA32_FS_BASE) }) + with_rdmsr } } /// Sets the `FS` segment's base address. -#[inline] -pub unsafe fn set_fsbase(base: VirtAddr) { - if super::has_fsgsbase() { +#[indirect] +pub fn set_fsbase() -> fn(base: VirtAddr) { + unsafe fn with_wrfsbase(base: VirtAddr) { wrfsbase(base); - } else { + } + + unsafe fn with_wrmsr(base: VirtAddr) { wrmsr(IA32_FS_BASE, base.as_u64()); } + + if super::has_fsgsbase() { + with_wrfsbase + } else { + with_wrmsr + } +} + +/// Returns the `FS` segment's base address. +#[indirect] +pub fn get_fsbase() -> fn() -> VirtAddr { + fn with_rdfsbase() -> VirtAddr { + rdfsbase() + } + + fn with_rdmsr() -> VirtAddr { + VirtAddr::new(unsafe { rdmsr(IA32_FS_BASE) }) + } + + if super::has_fsgsbase() { + with_rdfsbase + } else { + with_rdmsr + } } diff --git a/src/aero_kernel/src/arch/x86_64/mem.rs b/src/aero_kernel/src/arch/x86_64/mem.rs index 00f76b35185..5871c7cf008 100644 --- a/src/aero_kernel/src/arch/x86_64/mem.rs +++ b/src/aero_kernel/src/arch/x86_64/mem.rs @@ -67,7 +67,7 @@ unsafe extern "C" fn memcpy_movsb(dest: *mut u8, src: *const u8, len: usize) -> } #[indirect] -extern "C" fn memcpy() -> fn(*mut u8, *const u8, usize) { +extern "C" fn memcpy() -> fn(dest: *mut u8, src: *const u8, len: usize) { if should_store_by_byte() { memcpy_movsb } else { @@ -125,7 +125,7 @@ unsafe extern "C" fn memset_stosb(dest: *mut u8, byte: i32, len: usize) -> *mut } #[indirect] -extern "C" fn memset() -> fn(*mut u8, i32, usize) { +extern "C" fn memset() -> fn(dest: *mut u8, byte: i32, len: usize) { if should_store_by_byte() { memset_stosb } else { diff --git a/src/aero_proc/src/indirect.rs b/src/aero_proc/src/indirect.rs index a1e8a3c54cb..6af4dad3b85 100644 --- a/src/aero_proc/src/indirect.rs +++ b/src/aero_proc/src/indirect.rs @@ -1,11 +1,28 @@ use proc_macro::TokenStream; use proc_macro2::{Ident, Span}; +use syn::spanned::Spanned; pub fn parse(_: TokenStream, item: TokenStream) -> TokenStream { let item = syn::parse_macro_input!(item as syn::ItemFn); let args = item.sig.inputs; + if !args.is_empty() { + abort!(args.span(), "resolver is expected to take no arguments"); + } + let name = item.sig.ident.to_string(); + let vis = item.vis; + + let output_fn = match item.sig.output { + syn::ReturnType::Type(_, ty) => match ty.as_ref() { + syn::Type::BareFn(bare_fn) => bare_fn.clone(), + ty => abort!(ty.span(), "expected output function type"), + }, + ty => abort!(ty.span(), "expected output function type"), + }; + + let output_args = &output_fn.inputs; + let output_ret = &output_fn.output; // Underscores at the beginning of the identifier make it reserved, and the more underscores // there are, the more reserveder it is. @@ -35,7 +52,7 @@ pub fn parse(_: TokenStream, item: TokenStream) -> TokenStream { ::core::arch::global_asm!(#inline, sym #resolve_name); extern "C" { - fn #name(#args); + #vis fn #name(#output_args) #output_ret; } } .into() diff --git a/userland/Cargo.lock b/userland/Cargo.lock index a5679041e76..15341c51091 100644 --- a/userland/Cargo.lock +++ b/userland/Cargo.lock @@ -199,9 +199,9 @@ checksum = "7c68cb38ed13fd7bc9dd5db8f165b7c8d9c1a315104083a2b10f11354c2af97f" [[package]] name = "proc-macro2" -version = "1.0.51" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" dependencies = [ "unicode-ident", ] From 10fc44e6f87905677826a6d2a05d99a3bfbeb9f3 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 2 Aug 2023 18:52:28 +1000 Subject: [PATCH 242/368] kernel: minor cleanups Suggested by clippy :) Signed-off-by: Anhad Singh --- src/aero_kernel/src/acpi/rsdp.rs | 25 +++++++------------------ src/aero_kernel/src/mem/paging/addr.rs | 2 +- src/aero_kernel/src/utils/dma.rs | 2 +- src/aero_syscall/src/lib.rs | 2 ++ 4 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/aero_kernel/src/acpi/rsdp.rs b/src/aero_kernel/src/acpi/rsdp.rs index 05ec2af1035..5baa2eae1df 100644 --- a/src/aero_kernel/src/acpi/rsdp.rs +++ b/src/aero_kernel/src/acpi/rsdp.rs @@ -39,21 +39,10 @@ pub(super) unsafe fn validate_checksum(ptr: *const u8, size: usize) -> bool { sum == 0 } -pub(super) trait RsdtTyp { - fn as_usize(self) -> usize; -} - -impl RsdtTyp for u32 { - fn as_usize(self) -> usize { - self as _ - } -} +pub(super) trait RsdtTyp {} -impl RsdtTyp for u64 { - fn as_usize(self) -> usize { - self as _ - } -} +impl RsdtTyp for u32 {} +impl RsdtTyp for u64 {} pub(super) trait RsdtHeader { fn signature(&self) -> &[u8]; @@ -103,7 +92,7 @@ pub(super) struct Rsdt { impl Rsdt { pub fn new(address: VirtAddr) -> &'static Self { - let this = unsafe { &*(address.as_ptr() as *const Self) }; + let this = unsafe { &*address.as_ptr::() }; let valid_checksum = this.header.is_valid(); let valid_signature = this.header.signature() == b"RSDT"; @@ -144,7 +133,7 @@ impl Rsdt { impl Rsdt { pub fn new(address: VirtAddr) -> &'static Self { - let this = unsafe { &*(address.as_ptr() as *const Self) }; + let this = unsafe { &*address.as_ptr::() }; let valid_checksum = this.header.is_valid(); let valid_signature = this.header.signature() == b"XSDT"; @@ -191,7 +180,7 @@ pub(super) enum RsdtAddress { pub(super) fn find_rsdt_address(rsdp_address: VirtAddr) -> RsdtAddress { // Look for RSDP v2 header, and if it does not exists, look for RSDP v1 header. - let v20 = unsafe { &*(rsdp_address.as_ptr() as *const Rsdp20) }; + let v20 = unsafe { &*rsdp_address.as_ptr::() }; let is_v20 = v20.revision >= 2 && v20.xsdt_address != 0; if is_v20 { @@ -201,7 +190,7 @@ pub(super) fn find_rsdt_address(rsdp_address: VirtAddr) -> RsdtAddress { let xsdt_address = PhysAddr::new(v20.xsdt_address).as_hhdm_virt(); RsdtAddress::Xsdt(xsdt_address) } else { - let v10 = unsafe { &*(rsdp_address.as_ptr() as *const Rsdp10) }; + let v10 = unsafe { &*rsdp_address.as_ptr::() }; let valid = validate_rsdt_checksum(v10); assert!(valid, "rsdp: failed to validate RSDP v10 checksum"); diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 354b9100751..141c72b1984 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -122,7 +122,7 @@ impl VirtAddr { /// ``` pub fn read_mut<'a, T: Sized>(&self) -> Result<&'a mut T, ReadErr> { self.validate_read::()?; - Ok(unsafe { &mut *(self.as_mut_ptr() as *mut T) }) + Ok(unsafe { &mut *self.as_mut_ptr() }) } pub fn as_bytes_mut(&self, size_bytes: usize) -> &mut [u8] { diff --git a/src/aero_kernel/src/utils/dma.rs b/src/aero_kernel/src/utils/dma.rs index 6a4b884f56a..9202ac5b742 100644 --- a/src/aero_kernel/src/utils/dma.rs +++ b/src/aero_kernel/src/utils/dma.rs @@ -37,7 +37,7 @@ unsafe impl Allocator for DmaAllocator { let virt = phys.as_hhdm_virt(); // SAFETY: The frame is aligned and non-null. - let ptr = unsafe { NonNull::new_unchecked(virt.as_mut_ptr() as *mut u8) }; + let ptr = unsafe { NonNull::new_unchecked(virt.as_mut_ptr()) }; Ok(NonNull::slice_from_raw_parts(ptr, size_bytes)) } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index b39fef7b0b2..e740c6466bd 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -17,6 +17,8 @@ #![no_std] #![feature(decl_macro)] +// cc +#![allow(clippy::bad_bit_mask)] #[macro_use] extern crate num_derive; From f4f923338661f06eaece74de9c42d6502701ac74 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 3 Aug 2023 13:41:15 +1000 Subject: [PATCH 243/368] bootstrap: bump gcc to 13.2.0 Signed-off-by: Anhad Singh --- bootstrap.yml | 12 +++---- patches/gcc/gcc.patch | 74 ++++++++++++++++++------------------------- 2 files changed, 37 insertions(+), 49 deletions(-) diff --git a/bootstrap.yml b/bootstrap.yml index 038969ab637..5660a7004f7 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -19,9 +19,9 @@ sources: - name: gcc subdir: 'bundled' git: 'git://gcc.gnu.org/git/gcc.git' - tag: 'releases/gcc-11.2.0' + tag: 'releases/gcc-13.2.0' patch-path-strip: 1 - version: '11.2.0' + version: '13.2.0' tools_required: - host-autoconf-v2.69 - host-automake-v1.16 @@ -38,16 +38,16 @@ sources: '@THIS_SOURCE_DIR@/'] - args: ['cp', '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/gmp-6.1.0/configfsf.sub'] + '@THIS_SOURCE_DIR@/gmp-6.2.1/configfsf.sub'] - args: ['cp', '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/isl-0.18/config.sub'] + '@THIS_SOURCE_DIR@/isl-0.24/config.sub'] - args: ['cp', '-f', '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/mpc-1.0.3/config.sub'] + '@THIS_SOURCE_DIR@/mpc-1.2.1/config.sub'] - args: ['cp', '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/mpfr-3.1.6/config.sub'] + '@THIS_SOURCE_DIR@/mpfr-4.1.0/config.sub'] - name: mlibc subdir: 'bundled' diff --git a/patches/gcc/gcc.patch b/patches/gcc/gcc.patch index f019b16f297..9465555f5b7 100644 --- a/patches/gcc/gcc.patch +++ b/patches/gcc/gcc.patch @@ -1,11 +1,10 @@ -From dee75c7161a4ffc5760f7615ed7846a9592bc77c Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Tue, 31 Aug 2021 11:02:13 +1000 -Subject: [PATCH] targets: add aero target port +From 4c867374622a04f29a5501dfc74f1057041cc0fc Mon Sep 17 00:00:00 2001 +From: Anhad Singh +Date: Thu, 3 Aug 2023 12:51:21 +1000 +Subject: [PATCH] gcc: add aero target -Signed-off-by: Andy-Python-Programmer +Signed-off-by: Anhad Singh --- - .vscode/settings.json | 3 +++ config.sub | 4 ++-- fixincludes/mkfixinc.sh | 1 + gcc/config.gcc | 12 ++++++++++++ @@ -14,42 +13,31 @@ Signed-off-by: Andy-Python-Programmer libgcc/libgcov.h | 1 + libstdc++-v3/crossconfig.m4 | 12 ++++++++++++ libtool.m4 | 14 ++++++++++++++ - 9 files changed, 83 insertions(+), 2 deletions(-) - create mode 100644 .vscode/settings.json + 8 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 gcc/config/aero.h -diff --git a/.vscode/settings.json b/.vscode/settings.json -new file mode 100644 -index 000000000..560faaa36 ---- /dev/null -+++ b/.vscode/settings.json -@@ -0,0 +1,3 @@ -+{ -+ "editor.formatOnSave": false, -+} -\ No newline at end of file diff --git a/config.sub b/config.sub -index 63c1f1c8b..36fff07fb 100755 +index 38f3d037a..956f31f08 100755 --- a/config.sub +++ b/config.sub -@@ -133,7 +133,7 @@ case $1 in - case $maybe_os in +@@ -145,7 +145,7 @@ case $1 in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ -- | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ -+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* | aero* \ - | storm-chaos* | os2-emx* | rtmk-nova*) + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ +- | storm-chaos* | os2-emx* | rtmk-nova*) ++ | storm-chaos* | os2-emx* | rtmk-nova* | aero*) basic_machine=$field1 basic_os=$maybe_os -@@ -1723,7 +1723,7 @@ case $os in - | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ - | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ - | skyos* | haiku* | rdos* | toppers* | drops* | es* \ -- | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ -+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | aero* | bme* \ + ;; +@@ -1749,7 +1749,7 @@ case $os in + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*) + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ +- | fiwix* ) ++ | fiwix* | aero*) ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) diff --git a/fixincludes/mkfixinc.sh b/fixincludes/mkfixinc.sh index df90720b7..e8c2b21c1 100755 --- a/fixincludes/mkfixinc.sh @@ -63,10 +51,10 @@ index df90720b7..e8c2b21c1 100755 i?86-*-mingw32* | \ x86_64-*-mingw32* | \ diff --git a/gcc/config.gcc b/gcc/config.gcc -index 357b0bed0..a88cface2 100644 +index 648b3dc21..4a13aceda 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc -@@ -822,6 +822,15 @@ case ${target} in +@@ -840,6 +840,15 @@ case ${target} in tmake_file="${tmake_file} t-freebsd" target_has_targetdm=yes ;; @@ -82,12 +70,12 @@ index 357b0bed0..a88cface2 100644 *-*-fuchsia*) native_system_header_dir=/include ;; -@@ -2240,6 +2249,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) +@@ -2214,6 +2223,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) ;; esac ;; +x86_64-*-aero*) -+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h gnu-user.h glibc-stdint.h i386/x86-64.h i386/gnu-user-common.h i386/gnu-user64.h aero.h" ++ tm_file="${tm_file} i386/unix.h i386/att.h elfos.h gnu-user.h glibc-stdint.h i386/x86-64.h i386/gnu-user-common.h i386/gnu-user64.h aero.h" + ;; x86_64-*-fuchsia*) tmake_file="${tmake_file} i386/t-x86_64-elf" @@ -129,10 +117,10 @@ index 000000000..e8c149e40 + builtin_assert("system=posix"); \ + } while (0); diff --git a/libgcc/config.host b/libgcc/config.host -index 50f000622..d1aa00f1a 100644 +index 9d7212028..3724a1ac5 100644 --- a/libgcc/config.host +++ b/libgcc/config.host -@@ -245,6 +245,11 @@ case ${host} in +@@ -281,6 +281,11 @@ case ${host} in tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-fuchsia" extra_parts="crtbegin.o crtend.o" ;; @@ -144,7 +132,7 @@ index 50f000622..d1aa00f1a 100644 *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi) tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-linux" extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o" -@@ -703,6 +708,9 @@ x86_64-*-elf* | x86_64-*-rtems*) +@@ -715,6 +720,9 @@ x86_64-*-elf* | x86_64-*-rtems*) x86_64-*-fuchsia*) tmake_file="$tmake_file t-libgcc-pic" ;; @@ -155,7 +143,7 @@ index 50f000622..d1aa00f1a 100644 tmake_file="${tmake_file} i386/t-dragonfly i386/t-crtstuff" md_unwind_header=i386/dragonfly-unwind.h diff --git a/libgcc/libgcov.h b/libgcc/libgcov.h -index 7b0d367ec..2bce0a7e1 100644 +index 92df440d4..320f3b500 100644 --- a/libgcc/libgcov.h +++ b/libgcc/libgcov.h @@ -44,6 +44,7 @@ @@ -167,7 +155,7 @@ index 7b0d367ec..2bce0a7e1 100644 #if HAVE_SYS_MMAN_H #include diff --git a/libstdc++-v3/crossconfig.m4 b/libstdc++-v3/crossconfig.m4 -index ff44d5ae0..8b41eb058 100644 +index b3269cb88..4187dba89 100644 --- a/libstdc++-v3/crossconfig.m4 +++ b/libstdc++-v3/crossconfig.m4 @@ -136,6 +136,18 @@ case "${host}" in @@ -190,7 +178,7 @@ index ff44d5ae0..8b41eb058 100644 SECTION_FLAGS='-ffunction-sections -fdata-sections' AC_SUBST(SECTION_FLAGS) diff --git a/libtool.m4 b/libtool.m4 -index 17f8e5f30..5d29258d9 100644 +index b92e284d9..491d24c54 100644 --- a/libtool.m4 +++ b/libtool.m4 @@ -2491,6 +2491,16 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu* | uclinuxfdpiceabi) @@ -210,7 +198,7 @@ index 17f8e5f30..5d29258d9 100644 netbsd*) version_type=sunos need_lib_prefix=no -@@ -3090,6 +3100,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi) +@@ -3109,6 +3119,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi) lt_cv_deplibs_check_method=pass_all ;; @@ -222,5 +210,5 @@ index 17f8e5f30..5d29258d9 100644 if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' -- -2.25.1 +2.41.0 From 21b6afbc8ca869ba98a46ce42a60de61a13e39e6 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 3 Aug 2023 17:02:25 +1000 Subject: [PATCH 244/368] bootstrap: update mlibc Signed-off-by: Anhad Singh --- bootstrap.yml | 2 +- patches/mlibc/mlibc.patch | 209 -------------------------------------- 2 files changed, 1 insertion(+), 210 deletions(-) diff --git a/bootstrap.yml b/bootstrap.yml index 5660a7004f7..376967f155b 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -51,7 +51,7 @@ sources: - name: mlibc subdir: 'bundled' - git: 'https://github.com/managarm/mlibc' + git: 'https://github.com/aero-os/mlibc' branch: 'master' - name: tzcode diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 714c65e9c3f..bf4e0d9b08e 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -25,23 +25,6 @@ index fdd60a0..9f811f4 100644 .vscode +# clangd cache files: +.cache -diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp -index c33dfba..ec8baa4 100644 ---- a/options/ansi/generic/stdlib-stubs.cpp -+++ b/options/ansi/generic/stdlib-stubs.cpp -@@ -396,8 +396,10 @@ int mbtowc(wchar_t *__restrict wc, const char *__restrict mb, size_t max_size) { - mlibc::code_seq wseq{wc, wc + 1}; - mlibc::code_seq nseq{mb, mb + max_size}; - auto e = cc->decode_wtranscode(nseq, wseq, mbtowc_state); -- if (e != mlibc::charcode_error::null) -- __ensure(!"decode_wtranscode() errors are not handled"); -+ if (e != mlibc::charcode_error::null) { -+ errno = EILSEQ; -+ return -1; -+ } - - return nseq.it - mb; - } else { diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp index 3474615..10a2109 100644 --- a/options/glibc/generic/execinfo.cpp @@ -71,196 +54,4 @@ index 003a162..ab01a7a 100644 +constexpr bool logBaseAddresses = true; constexpr bool logRpath = false; constexpr bool eagerBinding = true; - -diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index 6eeb980..e6bd277 100644 ---- a/sysdeps/aero/generic/aero.cpp -+++ b/sysdeps/aero/generic/aero.cpp -@@ -176,13 +176,6 @@ int sys_kill(int pid, int sig) { - return 0; - } - --int sys_getpgid(pid_t pid, pid_t *pgid) { -- mlibc::infoLogger() << "sys_getpgid() is unimplemented" << frg::endlog; -- *pgid = 0; -- -- return 0; --} -- - int sys_clock_get(int clock, time_t *secs, long *nanos) { - struct timespec ts; - auto result = syscall(SYS_GETTIME, clock, &ts); -@@ -239,6 +232,21 @@ int sys_sleep(time_t *sec, long *nanosec) { - return 0; - } - -+pid_t sys_getpgid(pid_t pid, pid_t *pgid) { -+ auto ret = syscall(SYS_GETPGID, pid); -+ if(int e = sc_error(ret); e) -+ return e; -+ *pgid = ret; -+ return 0; -+} -+ -+int sys_setpgid(pid_t pid, pid_t pgid) { -+ auto ret = syscall(SYS_SETPGID, pid, pgid); -+ if(int e = sc_error(ret); e) -+ return e; -+ return 0; -+} -+ - uid_t sys_getuid() { - mlibc::infoLogger() << "mlibc: sys_setuid is a stub" << frg::endlog; - return 0; -@@ -250,7 +258,10 @@ uid_t sys_geteuid() { - } - - int sys_setsid(pid_t *sid) { -- mlibc::infoLogger() << "mlibc: sys_setsid is a stub" << frg::endlog; -+ auto ret = syscall(SYS_SETSID); -+ if(int e = sc_error(ret); e) -+ return e; -+ *sid = ret; - return 0; - } - -diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index a2c483b..fa5a369 100644 ---- a/sysdeps/aero/generic/filesystem.cpp -+++ b/sysdeps/aero/generic/filesystem.cpp -@@ -155,14 +155,16 @@ int sys_tcgetattr(int fd, struct termios *attr) { - } - - int sys_tcsetattr(int fd, int optional_action, const struct termios *attr) { -- if (optional_action) -- mlibc::infoLogger() -- << "mlibc: warning: sys_tcsetattr ignores optional_action" -- << frg::endlog; -+ int req; - -- int result; -+ switch (optional_action) { -+ case TCSANOW: req = TCSETS; break; -+ case TCSADRAIN: req = TCSETSW; break; -+ case TCSAFLUSH: req = TCSETSF; break; -+ default: return EINVAL; -+ } - -- if (int e = sys_ioctl(fd, TCSETSF, (void *)attr, &result); e) -+ if (int e = sys_ioctl(fd, req, (void *)attr, NULL); e) - return e; - - return 0; -@@ -178,9 +180,7 @@ int sys_mkdir(const char *path, mode_t) { - return 0; - } - --int sys_rmdir(const char *path) UNIMPLEMENTED("sys_rmdir") -- -- int sys_link(const char *srcpath, const char *destpath) { -+int sys_link(const char *srcpath, const char *destpath) { - auto result = - syscall(SYS_LINK, srcpath, strlen(srcpath), destpath, strlen(destpath)); - -@@ -191,14 +191,15 @@ int sys_rmdir(const char *path) UNIMPLEMENTED("sys_rmdir") - return 0; - } - --int sys_unlinkat(int fd, const char *path, int flags) { -- auto result = syscall(SYS_UNLINK, fd, path, strlen(path), flags); -- -- if (result < 0) { -- return -result; -- } -+int sys_rmdir(const char *path) { -+ return sys_unlinkat(AT_FDCWD, path, AT_REMOVEDIR); -+} - -- return 0; -+int sys_unlinkat(int fd, const char *path, int flags) { -+ auto ret = syscall(SYS_UNLINK, fd, path, strlen(path), flags); -+ if (int e = sc_error(ret); e) -+ return e; -+ return 0; - } - - struct aero_dir_entry { -diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp -index 4db9956..4cb3ee8 100644 ---- a/sysdeps/aero/generic/sockets.cpp -+++ b/sysdeps/aero/generic/sockets.cpp -@@ -5,7 +5,11 @@ - #include - - #include -+ -+#include - #include -+#include -+#include - - namespace { - -@@ -210,10 +214,31 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, - << frg::endlog; - return 0; - } else { -- mlibc::panicLogger() -+ mlibc::infoLogger() - << "\e[31mmlibc: Unexpected setsockopt() call, layer: " << layer - << " number: " << number << "\e[39m" << frg::endlog; -- __builtin_unreachable(); -+ return 0; - } - } -+ -+int sys_if_nametoindex(const char *name, unsigned int *ret) { -+ int fd = 0; -+ -+ // TODO(andypython): is the SOCK_CLOEXEC flag required in this case? -+ int r = sys_socket(AF_INET, SOCK_DGRAM, AF_UNSPEC, &fd); -+ if (r) -+ return r; -+ -+ struct ifreq ifr; -+ strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); -+ -+ r = sys_ioctl(fd, SIOCGIFINDEX, &ifr, NULL); -+ close(fd); -+ -+ if (r) -+ return r; -+ -+ *ret = ifr.ifr_ifindex; -+ return 0; -+} - } // namespace mlibc -diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index aa642e5..d8bf99e 100644 ---- a/sysdeps/aero/include/aero/syscall.h -+++ b/sysdeps/aero/include/aero/syscall.h -@@ -75,6 +75,10 @@ - #define SYS_RENAME 68 - #define SYS_MPROTECT 69 - #define SYS_SOCK_SEND 70 -+#define SYS_TRACE 71 -+#define SYS_SETPGID 72 -+#define SYS_SETSID 73 -+#define SYS_GETPGID 74 - - // Invalid syscall used to trigger a log error in the kernel (as a hint) - // so, that we can implement the syscall in the kernel. -@@ -217,4 +221,10 @@ __attribute__((__always_inline__)) static inline long syscall(sc_word_t call, - T... args) { - return _syscall(call, sc_cast(args)...); - } -+ -+inline int sc_error(long ret) { -+ if (ret < 0) -+ return -ret; -+ return 0; -+} - #endif // SYSCALL_H --- -2.40.1 From 43a71aabe9637401da73566a2b8c631486155565 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 3 Aug 2023 17:02:50 +1000 Subject: [PATCH 245/368] syscall: add sock_shutdown() Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/inode.rs | 4 ++++ src/aero_kernel/src/socket/unix.rs | 5 +++++ src/aero_kernel/src/syscall/mod.rs | 1 + src/aero_kernel/src/syscall/net.rs | 9 +++++++++ src/aero_syscall/src/consts.rs | 1 + 5 files changed, 20 insertions(+) diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 7d416803d09..ed6588e00bb 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -157,6 +157,10 @@ pub trait INodeInterface: Send + Sync { Ok(aero_syscall::Stat::default()) } + fn shutdown(&self, _how: usize) -> Result<()> { + Err(FileSystemError::NotSupported) + } + /// Creates a new dev inode with the provided `name` and the device `marker` in /// the filesystem. /// diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 87bc36840e3..2e860279590 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -434,4 +434,9 @@ impl INodeInterface for UnixSocket { Ok(events) } + + fn shutdown(&self, how: usize) -> fs::Result<()> { + log::warn!("shutdown how={how}"); + Ok(()) + } } diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 6e8f7916122..40cd9190f37 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -289,6 +289,7 @@ pub fn generic_do_syscall( SYS_SOCK_RECV => net::sock_recv(b, c, d), SYS_SOCK_SEND => net::sock_send(b, c, d), SYS_SOCKET_PAIR => net::socket_pair(b, c, d, e), + SYS_SOCK_SHUTDOWN => net::shutdown(b, c), SYS_GETTIME => time::gettime(b, c), SYS_SLEEP => time::sleep(b), diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index 8e6b94b1d82..05d90a22f55 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -23,6 +23,15 @@ fn socket_addr_from_addr<'sys>(address: VirtAddr) -> Result, Sy SocketAddr::from_family(address, family) } +#[syscall] +pub fn shutdown(fd: usize, how: usize) -> Result { + let file_table = &scheduler::get_scheduler().current_task().file_table; + let socket = file_table.get_handle(fd).ok_or(SyscallError::EINVAL)?; + + socket.inode().shutdown(how)?; + Ok(0) +} + /// Connects the socket to the specified address. #[syscall] pub fn connect(fd: usize, address: usize, length: usize) -> Result { diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index f62eefc4fa7..036420483d1 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -95,6 +95,7 @@ pub const SYS_TRACE: usize = 71; pub const SYS_SETPGID: usize = 72; pub const SYS_SETSID: usize = 73; pub const SYS_GETPGID: usize = 74; +pub const SYS_SOCK_SHUTDOWN: usize = 75; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; From 62efc5e08164749a7b38a4dbf2dfa19237126dbe Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 3 Aug 2023 17:23:39 +1000 Subject: [PATCH 246/368] dma: deallocate Signed-off-by: Anhad Singh --- src/aero_kernel/src/main.rs | 1 + src/aero_kernel/src/mem/paging/frame.rs | 7 +++++++ src/aero_kernel/src/utils/dma.rs | 10 ++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index bf1a0531a9e..712a852fecd 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -47,6 +47,7 @@ const_ptr_is_null, // https://github.com/rust-lang/rust/issues/74939 trait_upcasting, // https://github.com/rust-lang/rust/issues/65991 naked_functions, // https://github.com/rust-lang/rust/issues/32408 + strict_provenance )] #![deny(trivial_numeric_casts, unused_allocation)] #![test_runner(crate::tests::test_runner)] diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 97a3fb2a875..31a50e8f08b 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -77,6 +77,13 @@ impl LockedFrameAllocator { .call_once(|| Mutex::new(GlobalFrameAllocator::new(memory_map))); } + pub fn dealloc(&self, addr: PhysAddr, size_bytes: usize) { + let order = order_from_size(size_bytes as u64); + + let mut allocator = self.0.get().unwrap().lock_irq(); + allocator.deallocate_frame_inner(addr, order); + } + pub fn alloc(&self, size_bytes: usize) -> Option { let order = order_from_size(size_bytes as u64); diff --git a/src/aero_kernel/src/utils/dma.rs b/src/aero_kernel/src/utils/dma.rs index 9202ac5b742..e5b95d0642f 100644 --- a/src/aero_kernel/src/utils/dma.rs +++ b/src/aero_kernel/src/utils/dma.rs @@ -30,7 +30,6 @@ pub struct DmaAllocator; // the data using the ISA or PCI system bus (which carry physical addresses). unsafe impl Allocator for DmaAllocator { fn allocate(&self, layout: Layout) -> Result, AllocError> { - // XXX: The DMA buffer must be aligned to a page boundary. let size_bytes = layout.size(); let phys = FRAME_ALLOCATOR.alloc_zeroed(size_bytes).ok_or(AllocError)?; @@ -41,7 +40,14 @@ unsafe impl Allocator for DmaAllocator { Ok(NonNull::slice_from_raw_parts(ptr, size_bytes)) } - unsafe fn deallocate(&self, _ptr: NonNull, _layout: Layout) {} + unsafe fn deallocate(&self, ptr: NonNull, layout: Layout) { + let size_bytes = layout.size(); + + let addr: usize = ptr.addr().into(); + let addr = VirtAddr::new(addr as u64); + + FRAME_ALLOCATOR.dealloc(addr.as_hhdm_phys(), size_bytes); + } } pub type DmaBuffer = Box; From f95a61fd0c4d691c36b2b44cb2b8619e77f07f54 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 3 Aug 2023 17:25:48 +1000 Subject: [PATCH 247/368] kernel: cargo update Signed-off-by: Anhad Singh --- src/Cargo.lock | 145 +++++++++++++++++++++++-------------------------- 1 file changed, 68 insertions(+), 77 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index 5398995dca0..e7c4292400b 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -67,15 +67,15 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56fc6cf8dc8c4158eed8649f9b8b0ea1518eb62b544fe9490d66fa0b349eafe9" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "autocfg" @@ -115,9 +115,12 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.77" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" +checksum = "6c6b2562119bf28c3439f7f02db99faf0aa1a8cdfe5772a2ee155d32227239f0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -135,9 +138,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.6" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ "cfg-if", "crossbeam-utils", @@ -145,9 +148,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -156,31 +159,31 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.13" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset 0.7.1", + "memoffset", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] [[package]] name = "either" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "hashbrown" @@ -203,32 +206,29 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "intrusive-collections" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4f90afb01281fdeffb0f8e082d230cbe4f888f837cc90759696b858db1a700" +checksum = "b694dc9f70c3bda874626d2aed13b780f137aab435f4e9814121955cf706122e" dependencies = [ - "memoffset 0.8.0", + "memoffset", ] [[package]] name = "itoa" -version = "1.0.4" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "lai" version = "0.1.0" -source = "git+https://github.com/aero-os/lai-rs#b183090306c75cc09118ddff9fac4cab2a8a310c" +source = "git+https://github.com/aero-os/lai-rs#87d3b172f7acf017955a705feb453ad865dcbf14" dependencies = [ "cc", "log", @@ -245,14 +245,14 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.138" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "limine" -version = "0.1.10" -source = "git+https://github.com/limine-bootloader/limine-rs#2f0ae642064749372a61cf3290f22ce71d21df27" +version = "0.1.11" +source = "git+https://github.com/limine-bootloader/limine-rs#4394419fe347901a9308a8956df16454a4b87b02" [[package]] name = "log" @@ -262,36 +262,27 @@ checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "lru" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03f1160296536f10c833a82dca22267d5486734230d47bf00bf435885814ba1e" +checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" dependencies = [ "hashbrown 0.13.2", ] [[package]] name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] [[package]] name = "nasm-rs" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce095842aee9aa3ecbda7a5d2a4df680375fd128a8596b6b56f8e497e231f483" +checksum = "fe4d98d0065f4b1daf164b3eafb11974c94662e5e2396cf03f32d0bb5c17da51" dependencies = [ "rayon", ] @@ -309,18 +300,18 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.14.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", @@ -328,9 +319,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.16.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "proc-macro-error" @@ -358,18 +349,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.63" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.21" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -385,9 +376,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" dependencies = [ "either", "rayon-core", @@ -395,9 +386,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -413,27 +404,27 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "ryu" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.149" +version = "1.0.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256b9932320c590e707b94576e3cc1f7c9024d0ee6612dfbcf1cb106cbe8e055" +checksum = "0ea67f183f058fe88a4e3ec6e2788e003840893b91bac4559cabedd00863b3ed" [[package]] name = "serde_json" -version = "1.0.89" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -470,9 +461,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "syn" -version = "1.0.105" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -485,14 +476,14 @@ version = "0.1.0" [[package]] name = "unicode-ident" -version = "1.0.5" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "utf8parse" version = "0.2.1" -source = "git+https://github.com/alacritty/vte#d5036ab2c20dfb0853cb1c7b9bc41a58c24c5bf2" +source = "git+https://github.com/alacritty/vte#94e74f3a64f42d5dad4e3d42dbe8c23291038214" [[package]] name = "version_check" @@ -502,8 +493,8 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vte" -version = "0.11.0" -source = "git+https://github.com/alacritty/vte#d5036ab2c20dfb0853cb1c7b9bc41a58c24c5bf2" +version = "0.11.1" +source = "git+https://github.com/alacritty/vte#94e74f3a64f42d5dad4e3d42dbe8c23291038214" dependencies = [ "arrayvec", "log", @@ -514,7 +505,7 @@ dependencies = [ [[package]] name = "vte_generate_state_changes" version = "0.1.1" -source = "git+https://github.com/alacritty/vte#d5036ab2c20dfb0853cb1c7b9bc41a58c24c5bf2" +source = "git+https://github.com/alacritty/vte#94e74f3a64f42d5dad4e3d42dbe8c23291038214" dependencies = [ "proc-macro2", "quote", From 2adc7ac4f1c7cf271ffb16fd38665bfc7d8213a2 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 4 Aug 2023 18:19:37 +1000 Subject: [PATCH 248/368] bootstrap: add vim Signed-off-by: Anhad Singh --- bootstrap.yml | 1 + bootstrap/editors.yml | 60 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 bootstrap/editors.yml diff --git a/bootstrap.yml b/bootstrap.yml index 376967f155b..4991de639da 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -3,6 +3,7 @@ imports: - file: bootstrap/net.yml - file: bootstrap/vcs.yml - file: bootstrap/db.yml + - file: bootstrap/editors.yml general: cargo: diff --git a/bootstrap/editors.yml b/bootstrap/editors.yml new file mode 100644 index 00000000000..5842bc33825 --- /dev/null +++ b/bootstrap/editors.yml @@ -0,0 +1,60 @@ +packages: + - name: vim + source: + subdir: 'bundled' + git: 'https://github.com/vim/vim.git' + tag: 'v8.2.3704' + version: '8.2.3704' + tools_required: + - host-gcc + - host-pkg-config + - host-automake-v1.16 + pkgs_required: + - mlibc + - ncurses + - libiconv + revision: 4 + configure: + # vim does not seem to support out-of-tree builds, so we just copy + # the source tree into the build directory instead + - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + - args: + - './configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-gtktest' + - '--disable-icon-cache-update' + - '--disable-desktop-database-update' + - '--disable-canberra' + - '--disable-selinux' + - '--disable-xsmp' + - '--disable-channel' + - '--disable-netbeans' + - '--enable-multibyte' + - '--disable-acl' + - '--disable-gpm' + - '--disable-sysmouse' + - '--disable-nls' + - '--with-tlib=tinfo' + - '--enable-gui=no' + - '--without-x' + environ: + ac_cv_small_wchar_t: 'no' + ac_cv_func_sigsetjmp: 'no' + vim_cv_toupper_broken: 'no' + vim_cv_terminfo: 'yes' + vim_cv_tgetent: 'zero' + vim_cv_tty_group: '' + vim_cv_tty_mode: '0620' + vim_cv_getcwd_broken: 'no' + vim_cv_stat_ignores_slash: 'no' + vim_cv_memmove_handles_overlap: 'yes' + vim_cv_bcopy_handles_overlap: 'yes' + vim_cv_memcpy_handles_overlap: 'yes' + STRIP: 'x86_64-aero-strip' + workdir: '@THIS_BUILD_DIR@/src/' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' From 41b4edc8342d915cb75d673fffb24b657de3ab7a Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 4 Aug 2023 19:40:16 +1000 Subject: [PATCH 249/368] fix dhcpd Signed-off-by: Anhad Singh --- src/aero_kernel/src/socket/ipv4.rs | 55 ++++++++++++++++++++++++++++++ src/aero_kernel/src/socket/mod.rs | 1 + src/aero_kernel/src/socket/udp.rs | 12 +------ src/aero_kernel/src/syscall/net.rs | 4 ++- 4 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 src/aero_kernel/src/socket/ipv4.rs diff --git a/src/aero_kernel/src/socket/ipv4.rs b/src/aero_kernel/src/socket/ipv4.rs new file mode 100644 index 00000000000..d27895816a3 --- /dev/null +++ b/src/aero_kernel/src/socket/ipv4.rs @@ -0,0 +1,55 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +//! IPv4 or `AF_RAW` sockets. + +use alloc::sync::Arc; + +use aero_syscall::prelude::{IfReq, SIOCGIFINDEX}; + +use crate::arch::user_copy::UserRef; + +use crate::fs::inode::INodeInterface; +use crate::fs::Result; + +use crate::mem::paging::VirtAddr; + +pub struct Ipv4Socket {} + +impl Ipv4Socket { + pub fn new() -> Arc { + Arc::new(Self {}) + } +} + +impl INodeInterface for Ipv4Socket { + fn ioctl(&self, command: usize, arg: usize) -> Result { + match command { + SIOCGIFINDEX => { + let mut ifreq = unsafe { UserRef::::new(VirtAddr::new(arg as _)) }; + + let name = ifreq.name().unwrap(); + assert!(name == "eth0"); + + ifreq.data.ifindex = 1; // FIXME: Fill the actual interface index + Ok(0) + } + + _ => unimplemented!(), + } + } +} diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index 07a89ca8f5a..987bcb46f24 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +pub mod ipv4; pub mod tcp; pub mod udp; pub mod unix; diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index e39f9a8b819..4e45c8d83b2 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -15,7 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -use aero_syscall::prelude::{IfReq, SIOCGIFHWADDR, SIOCGIFINDEX, SIOCSIFADDR, SIOCSIFNETMASK}; +use aero_syscall::prelude::{IfReq, SIOCGIFHWADDR, SIOCSIFADDR, SIOCSIFNETMASK}; use aero_syscall::socket::{MessageFlags, MessageHeader}; use aero_syscall::{OpenFlags, SocketAddrInet}; use alloc::sync::{Arc, Weak}; @@ -209,16 +209,6 @@ impl INodeInterface for UdpSocket { fn ioctl(&self, command: usize, arg: usize) -> fs::Result { match command { - SIOCGIFINDEX => { - let mut ifreq = unsafe { UserRef::::new(VirtAddr::new(arg as _)) }; - - let name = ifreq.name().unwrap(); - assert!(name == "eth0"); - - ifreq.data.ifindex = 1; // FIXME: Fill the actual interface index - Ok(0) - } - SIOCGIFHWADDR => { let mut ifreq = unsafe { UserRef::::new(VirtAddr::new(arg as _)) }; diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index 05d90a22f55..b16a4e9360a 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -9,6 +9,7 @@ use crate::fs::cache::DirCacheItem; use crate::fs::inode::{DirEntry, INodeInterface}; use crate::mem::paging::VirtAddr; +use crate::socket::ipv4::Ipv4Socket; use crate::socket::tcp::TcpSocket; use crate::socket::udp::UdpSocket; use crate::socket::unix::*; @@ -123,7 +124,7 @@ fn create_socket( socket_type: usize, protocol: usize, ) -> Result { - let typ = SocketType::from_usize(socket_type).ok_or(SyscallError::EINVAL)?; + let typ = SocketType::from_usize(socket_type & 0b1111).ok_or(SyscallError::EINVAL)?; let protocol = IpProtocol::from_usize(protocol).ok_or(SyscallError::EINVAL)?; let socket = match domain as u32 { @@ -133,6 +134,7 @@ fn create_socket( UdpSocket::new() as Arc } + (SocketType::Dgram, IpProtocol::Raw) => Ipv4Socket::new() as Arc, (SocketType::Stream, IpProtocol::Default | IpProtocol::Tcp) => { TcpSocket::new() as Arc } From 5c9b1792c4e066e30d15f6fba2fe5bce70cd247a Mon Sep 17 00:00:00 2001 From: MolassesLover <60114762+MolassesLover@users.noreply.github.com> Date: Mon, 14 Aug 2023 12:45:56 +0200 Subject: [PATCH 250/368] Added missing Ubuntu dependencies > **Note**: This commit message is written in Markdown for the sake of clean documentation. I'm not entirely sure if `deps_linux` is intended to *only* install Ubuntu dependencies, as it checks for `apt`, and not the distribution the script is being run on. ``` if [ -x "$(command -v apt)" ]; then PKGMAN="apt" ``` Despite this, I'm assuming its intended for Ubuntu, as that seems to be the primary GNU/Linux distribution used for the compilation of Aero. --- tools/deps/deps_linux | 53 ++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/tools/deps/deps_linux b/tools/deps/deps_linux index 90a624f5912..4da9f86b8cb 100755 --- a/tools/deps/deps_linux +++ b/tools/deps/deps_linux @@ -4,43 +4,44 @@ if [ -x "$(command -v apt)" ]; then PKGMAN="apt" packages=( + "autopoint" "bash" - "coreutils" - "make" - "patch" - "tar" - "gzip" "binutils" - "gcc" - "git" - "subversion" - "mercurial" + "bison" + "cmake" + "coreutils" "curl" - "wget" - "xz-utils" - "nasm" - "mtools" - "meson" - "perl" - "m4" - "texinfo" - "groff" - "gettext" - "autopoint" "expat" - "bison" "flex" + "gcc" + "gettext" + "git" + "gperf" + "groff" + "gzip" "help2man" + "libgmp-dev" + "m4" + "make" + "mercurial" + "meson" + "mtools" + "nasm" "openssl" - "gperf" - "rsync" - "xsltproc" + "patch" + "perl" "python3" - "python3-pip" "python3-mako" + "python3-pip" + "rsync" + "subversion" + "tar" + "texinfo" + "wget" "xcb-proto" "xorriso" - "cmake" + "xsltproc" + "xz-utils" ) function install_package() { apt-get install -y $1; } From 08df5e432bcc85aee5080197c53be599565e7510 Mon Sep 17 00:00:00 2001 From: MolassesLover <60114762+MolassesLover@users.noreply.github.com> Date: Mon, 14 Aug 2023 13:14:42 +0200 Subject: [PATCH 251/368] Created a Dockerfile running `ubuntu:latest` --- Dockerfile | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000000..a9d42f85791 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,53 @@ +FROM ubuntu:latest +WORKDIR /opt/workdir +# Cargo executables are installed here: +ENV PATH="$PATH:/home/workuser/.cargo/bin" +# Python executables are installed here: +ENV PATH="$PATH:/home/workuser/.local/bin" + +RUN apt-get update +RUN apt-get install -y \ + autopoint \ + bash \ + binutils \ + bison \ + cmake \ + coreutils \ + curl \ + expat \ + flex \ + gcc \ + gettext \ + git \ + gperf \ + groff \ + gzip \ + help2man \ + libgmp-dev \ + m4 \ + make \ + mercurial \ + meson \ + mtools \ + nasm \ + openssl \ + patch \ + perl \ + python3 \ + python3-mako \ + python3-pip \ + rsync \ + subversion \ + tar \ + texinfo \ + wget \ + xcb-proto \ + xorriso \ + xsltproc \ + xz-utils +RUN useradd -m workuser + +USER workuser +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +RUN python3 -m pip install requests xbstrap +ENTRYPOINT python3 aero.py --no-run \ No newline at end of file From 8424fa125a2e391d7462bddd60ed40efea25f136 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 19 Aug 2023 15:02:27 +1000 Subject: [PATCH 252/368] fix(kernel): allow use of internal compiler features for now Fixes: #105 Signed-off-by: Anhad Singh --- src/aero_kernel/src/main.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 712a852fecd..2e276084404 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -49,6 +49,11 @@ naked_functions, // https://github.com/rust-lang/rust/issues/32408 strict_provenance )] +// TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? +// `lang_items` => is currently used for the personality function (`rust_eh_personality`). +// `prelude_import` => is currently just used to re-export alloc prelude. This just makes the +// files overall more readable. +#![allow(internal_features)] #![deny(trivial_numeric_casts, unused_allocation)] #![test_runner(crate::tests::test_runner)] #![no_std] From 07821a269a98ae856e19474812cecb0c5ce0360b Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 24 Aug 2023 19:06:26 +1000 Subject: [PATCH 253/368] all: make use of the byte_endian crate instead of simple_endian Signed-off-by: Anhad Singh --- src/Cargo.lock | 26 +++++++------------------- src/aero_kernel/Cargo.toml | 3 +-- src/aero_kernel/src/net/arp.rs | 2 +- src/aero_kernel/src/net/checksum.rs | 2 +- src/aero_kernel/src/net/ip.rs | 2 +- src/aero_kernel/src/net/tcp.rs | 2 +- src/aero_kernel/src/net/udp.rs | 2 +- src/aero_syscall/Cargo.toml | 13 +------------ src/aero_syscall/src/lib.rs | 2 +- userland/Cargo.lock | 12 ++++++------ 10 files changed, 21 insertions(+), 45 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index e7c4292400b..90da9660b70 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -10,8 +10,8 @@ dependencies = [ "aero_syscall", "bit_field", "bitflags 1.3.2", + "byte_endian", "bytemuck", - "byteorder", "cfg-if", "cpio_reader", "hashbrown 0.14.0", @@ -26,7 +26,6 @@ dependencies = [ "raw-cpuid", "rustc-demangle", "serde_json", - "simple_endian 0.2.1 (git+https://github.com/Andy-Python-Programmer/simple-endian-rs)", "spin 0.9.8", "static_assertions", "uapi", @@ -49,9 +48,9 @@ name = "aero_syscall" version = "0.1.0" dependencies = [ "bitflags 1.3.2", + "byte_endian", "num-derive", "num-traits", - "simple_endian 0.2.1 (git+https://github.com/michalfita/simple-endian-rs?branch=bugfix/4/fix-no_std-support-right-way)", ] [[package]] @@ -101,18 +100,17 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +[[package]] +name = "byte_endian" +version = "0.1.0" +source = "git+https://github.com/aero-os/byte_endian#47cec808e9c2813563f3a103ac2da2106c65f755" + [[package]] name = "bytemuck" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - [[package]] name = "cc" version = "1.0.81" @@ -431,16 +429,6 @@ dependencies = [ "serde", ] -[[package]] -name = "simple_endian" -version = "0.2.1" -source = "git+https://github.com/michalfita/simple-endian-rs?branch=bugfix/4/fix-no_std-support-right-way#7210f40881d16f7f2e3d8d40f6381fa222843caa" - -[[package]] -name = "simple_endian" -version = "0.2.1" -source = "git+https://github.com/Andy-Python-Programmer/simple-endian-rs#626b4f2a7dfb8bfaa46a728fd6db886fe8b42fa3" - [[package]] name = "spin" version = "0.5.2" diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index edb0a470059..c79b1ba23e8 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -42,8 +42,7 @@ cpio_reader = { git = "https://github.com/Andy-Python-Programmer/cpio_reader" } static_assertions = "1.1.0" lru = "0.10.0" bytemuck = "1.13.1" -simple_endian = { git = "https://github.com/Andy-Python-Programmer/simple-endian-rs" } -byteorder = { version = "1.4.3", default-features = false } +byte_endian = { git = "https://github.com/aero-os/byte_endian" } limine = { git = "https://github.com/limine-bootloader/limine-rs" } cfg-if = "1.0" num-traits = { version = "0.2", default-features = false } diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index 57bddb482a6..3f16beb6cf7 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -19,7 +19,7 @@ use alloc::collections::BTreeMap; use alloc::vec::Vec; -use simple_endian::BigEndian; +use byte_endian::BigEndian; use spin::{Once, RwLock}; use crate::net::{default_device, ethernet, PacketUpHierarchy}; diff --git a/src/aero_kernel/src/net/checksum.rs b/src/aero_kernel/src/net/checksum.rs index ca27c3af6a1..3ec9cf1ff8e 100644 --- a/src/aero_kernel/src/net/checksum.rs +++ b/src/aero_kernel/src/net/checksum.rs @@ -1,4 +1,4 @@ -use simple_endian::BigEndian; +use byte_endian::BigEndian; use super::ip::{self, Ipv4Addr}; diff --git a/src/aero_kernel/src/net/ip.rs b/src/aero_kernel/src/net/ip.rs index 0802531ca62..fe2a483dcc6 100644 --- a/src/aero_kernel/src/net/ip.rs +++ b/src/aero_kernel/src/net/ip.rs @@ -15,7 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -use simple_endian::BigEndian; +use byte_endian::BigEndian; use super::*; diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs index b5e33abed38..a816f31188e 100644 --- a/src/aero_kernel/src/net/tcp.rs +++ b/src/aero_kernel/src/net/tcp.rs @@ -19,7 +19,7 @@ use alloc::collections::BTreeMap; use alloc::sync::Arc; use bit_field::BitField; -use simple_endian::BigEndian; +use byte_endian::BigEndian; use spin::RwLock; use super::ip::{self, Ipv4, Ipv4Addr}; diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs index faef257adc5..698429d238e 100644 --- a/src/aero_kernel/src/net/udp.rs +++ b/src/aero_kernel/src/net/udp.rs @@ -17,7 +17,7 @@ use alloc::collections::BTreeMap; use alloc::sync::Arc; -use simple_endian::BigEndian; +use byte_endian::BigEndian; use spin::RwLock; use super::ip::{Ipv4, Ipv4Addr}; diff --git a/src/aero_syscall/Cargo.toml b/src/aero_syscall/Cargo.toml index f5852b26768..eab1f80e0aa 100644 --- a/src/aero_syscall/Cargo.toml +++ b/src/aero_syscall/Cargo.toml @@ -8,15 +8,4 @@ edition = "2021" bitflags = "1.2.1" num-derive = { version = "0.3", default-features = false } num-traits = { version = "0.2", default-features = false } -simple_endian = { git = "https://github.com/michalfita/simple-endian-rs", branch = "bugfix/4/fix-no_std-support-right-way", default_features = false, features = [ - "bitwise", - "comparisons", - "format", - "math_ops", - "neg_ops", - "shift_ops", - "both_endian", - "float_impls", - "integer_impls", - "byte_impls", -] } +byte_endian = { git = "https://github.com/aero-os/byte_endian" } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index e740c6466bd..34699ab5764 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -29,7 +29,7 @@ pub mod socket; pub mod syscall; pub mod time; -use simple_endian::BigEndian; +use byte_endian::BigEndian; pub use crate::syscall::*; diff --git a/userland/Cargo.lock b/userland/Cargo.lock index 15341c51091..efee3926e62 100644 --- a/userland/Cargo.lock +++ b/userland/Cargo.lock @@ -18,9 +18,9 @@ name = "aero_syscall" version = "0.1.0" dependencies = [ "bitflags", + "byte_endian", "num-derive", "num-traits", - "simple_endian", ] [[package]] @@ -55,6 +55,11 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "byte_endian" +version = "0.1.0" +source = "git+https://github.com/aero-os/byte_endian#47cec808e9c2813563f3a103ac2da2106c65f755" + [[package]] name = "byteorder" version = "1.4.3" @@ -256,11 +261,6 @@ dependencies = [ "syn", ] -[[package]] -name = "simple_endian" -version = "0.2.1" -source = "git+https://github.com/michalfita/simple-endian-rs?branch=bugfix/4/fix-no_std-support-right-way#7210f40881d16f7f2e3d8d40f6381fa222843caa" - [[package]] name = "spin" version = "0.5.2" From 8e52f9ce2e5aeb680cfcba9f36e674c03ad937ff Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Tue, 19 Sep 2023 17:35:33 +1000 Subject: [PATCH 254/368] feat(net): switch to crabnet Signed-off-by: Anhad Singh --- .vscode/settings.json | 2 +- src/Cargo.lock | 69 ++++++++++- src/aero_kernel/Cargo.toml | 5 +- src/aero_kernel/src/drivers/e1000.rs | 29 +++-- src/aero_kernel/src/mem/paging/addr.rs | 2 +- src/aero_kernel/src/net/arp.rs | 134 +++++++++++---------- src/aero_kernel/src/net/checksum.rs | 76 ------------ src/aero_kernel/src/net/ethernet.rs | 57 +++------ src/aero_kernel/src/net/ip.rs | 125 ------------------- src/aero_kernel/src/net/mod.rs | 119 ++++++++++++++++-- src/aero_kernel/src/net/tcp.rs | 159 +------------------------ src/aero_kernel/src/net/udp.rs | 85 ++----------- src/aero_kernel/src/socket/tcp.rs | 76 ++++++------ src/aero_kernel/src/socket/udp.rs | 23 ++-- 14 files changed, 344 insertions(+), 617 deletions(-) delete mode 100644 src/aero_kernel/src/net/checksum.rs delete mode 100644 src/aero_kernel/src/net/ip.rs diff --git a/.vscode/settings.json b/.vscode/settings.json index 887a54e7cd9..8cbe5c341c6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,5 +16,5 @@ "termios.h": "c", "termios-c_iflag.h": "c" }, - "rust-analyzer.check.command": "clippy", + // "rust-analyzer.check.command": "clippy", } \ No newline at end of file diff --git a/src/Cargo.lock b/src/Cargo.lock index 90da9660b70..7b2d9c73721 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -22,6 +22,8 @@ dependencies = [ "log", "lru", "nasm-rs", + "netstack", + "netstack_tcp", "num-traits", "raw-cpuid", "rustc-demangle", @@ -96,14 +98,14 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" [[package]] name = "byte_endian" version = "0.1.0" -source = "git+https://github.com/aero-os/byte_endian#47cec808e9c2813563f3a103ac2da2106c65f755" +source = "git+https://github.com/aero-os/byte_endian#540be6149cd9408088a9e45be2d31f4241418c2f" [[package]] name = "bytemuck" @@ -183,6 +185,30 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + [[package]] name = "hashbrown" version = "0.13.2" @@ -254,9 +280,9 @@ source = "git+https://github.com/limine-bootloader/limine-rs#4394419fe347901a930 [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "lru" @@ -285,6 +311,25 @@ dependencies = [ "rayon", ] +[[package]] +name = "netstack" +version = "0.1.0" +dependencies = [ + "bit_field", + "bitflags 2.4.0", + "byte_endian", + "static_assertions", +] + +[[package]] +name = "netstack_tcp" +version = "0.1.0" +dependencies = [ + "futures-util", + "log", + "netstack", +] + [[package]] name = "num-derive" version = "0.3.3" @@ -321,6 +366,18 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -369,7 +426,7 @@ version = "11.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.0", ] [[package]] diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index c79b1ba23e8..9b341307b45 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -42,12 +42,15 @@ cpio_reader = { git = "https://github.com/Andy-Python-Programmer/cpio_reader" } static_assertions = "1.1.0" lru = "0.10.0" bytemuck = "1.13.1" -byte_endian = { git = "https://github.com/aero-os/byte_endian" } limine = { git = "https://github.com/limine-bootloader/limine-rs" } cfg-if = "1.0" num-traits = { version = "0.2", default-features = false } vte = { git = "https://github.com/alacritty/vte", features = ["ansi"] } +byte_endian = { git = "https://github.com/aero-os/byte_endian" } +netstack = { path = "../../../orgs/aero/netstack" } +netstack_tcp = { path = "../../../orgs/aero/netstack/netstack_tcp", default-features = false } + # X86_64 specific dependencies: [target.'cfg(target_arch = "x86_64")'.dependencies] raw-cpuid = "11.0.1" diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index 1c45e00844e..04752d93273 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use alloc::boxed::Box; use alloc::sync::Arc; use spin::Once; @@ -23,9 +24,11 @@ use crate::arch::interrupts::{self, InterruptStack}; use crate::drivers::pci::*; use crate::mem::paging::*; use crate::userland::scheduler; +use crate::utils::dma::DmaAllocator; use crate::utils::sync::{Mutex, WaitQueue}; -use crate::net::{self, ethernet, MacAddr, NetworkDevice, NetworkDriver, PacketBaseTrait}; +use crate::net::{self, ethernet, NetworkDevice, NetworkDriver}; +use netstack::data_link::MacAddr; const TX_DESC_NUM: u32 = 32; const TX_DESC_SIZE: u32 = TX_DESC_NUM * core::mem::size_of::() as u32; @@ -374,11 +377,12 @@ impl E1000 { } } - fn send(&mut self, packet: net::Packet) { + fn send(&mut self, packet: Box<[u8], DmaAllocator>) { let cur = self.tx_cur; let ring = self.tx_ring(); - ring[cur].addr = unsafe { packet.addr() - crate::PHYSICAL_MEMORY_OFFSET }; + ring[cur].addr = + unsafe { VirtAddr::new(packet.as_ptr() as u64) - crate::PHYSICAL_MEMORY_OFFSET }; ring[cur].length = packet.len() as _; ring[cur].cmd = 0b1011; ring[cur].status = TStatus::empty(); @@ -386,9 +390,10 @@ impl E1000 { self.tx_cur = (self.tx_cur + 1) % TX_DESC_NUM as usize; self.write(Register::TxDescTail, self.tx_cur as u32); + core::mem::forget(packet); // FIXME: hack } - fn recv(&mut self) -> Option { + fn recv<'a>(&mut self) -> Option> { let id = self.rx_cur; let desc = &mut self.rx_ring()[id]; @@ -396,13 +401,11 @@ impl E1000 { return None; } - Some(net::RecvPacket { - packet: net::Packet::::new( - PhysAddr::new(desc.addr).as_hhdm_virt(), - desc.length as usize, - ), - id, - }) + let packet = PhysAddr::new(desc.addr) + .as_hhdm_virt() + .as_bytes_mut(desc.length as usize); + + Some(net::RecvPacket { packet, id }) } fn recv_end(&mut self, id: usize) { @@ -595,7 +598,7 @@ impl Device { } impl NetworkDriver for Device { - fn send(&self, packet: net::Packet) { + fn send(&self, packet: Box<[u8], DmaAllocator>) { self.e1000.lock_irq().send(packet) } @@ -619,7 +622,7 @@ impl NetworkDriver for Device { self.e1000.lock_irq().recv_end(packet_id) } - fn mac(&self) -> net::MacAddr { + fn mac(&self) -> MacAddr { self.e1000.lock_irq().mac } } diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 141c72b1984..b42ef95dd0f 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -125,7 +125,7 @@ impl VirtAddr { Ok(unsafe { &mut *self.as_mut_ptr() }) } - pub fn as_bytes_mut(&self, size_bytes: usize) -> &mut [u8] { + pub fn as_bytes_mut<'a>(&self, size_bytes: usize) -> &'a mut [u8] { self.validate_read::<&[u8]>().unwrap(); unsafe { core::slice::from_raw_parts_mut(self.as_mut_ptr(), size_bytes) } } diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index 3f16beb6cf7..1f7c500fa32 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -22,15 +22,20 @@ use alloc::vec::Vec; use byte_endian::BigEndian; use spin::{Once, RwLock}; -use crate::net::{default_device, ethernet, PacketUpHierarchy}; +use crate::net::default_device; +use crate::net::shim::PacketSend; -use super::ethernet::MacAddr; -use super::ip::Ipv4Addr; -use super::{ConstPacketKind, Eth, Packet, PacketDownHierarchy, PacketHeader}; +use netstack::data_link::{Arp, ArpAddress, ArpHardwareType, ArpOpcode, Eth, EthType}; +use netstack::network::Ipv4Addr; + +// use super::{ConstPacketKind, Eth, Packet, PacketDownHierarchy, PacketHeader}; +use netstack::data_link::MacAddr; + +use super::RawPacket; enum Status { Resolved, - Pending(Vec>), + Pending(Vec), } struct Entry { @@ -61,8 +66,9 @@ impl Cache { for mut packet in queue { log::trace!("[ ARP ] (!!) Sending queued packed to {ip:?} {mac:?}"); - packet.header_mut().dest_mac = mac; - super::default_device().send(packet); + // packet.header_mut().dest_mac = mac; + // super::default_device().send(packet); + unreachable!() } } } else { @@ -70,7 +76,7 @@ impl Cache { } } - fn request(&mut self, ip: Ipv4Addr, packet: Packet) { + fn request(&mut self, ip: Ipv4Addr, packet: RawPacket) { if self.0.get_mut(&ip).is_some() { todo!() } else { @@ -153,71 +159,63 @@ impl ArpHeader { } } -#[derive(Debug, Copy, Clone)] -pub struct Arp {} +// #[derive(Debug, Copy, Clone)] +// pub struct Arp {} -impl Packet { - pub fn create() -> Packet { - let device = default_device(); +// impl Packet { +// pub fn create() -> Packet { +// let device = default_device(); - let mut packet: Packet = - Packet::::create(ethernet::Type::Arp, core::mem::size_of::()).upgrade(); +// let mut packet: Packet = +// Packet::::create(ethernet::Type::Arp, +// core::mem::size_of::()).upgrade(); - let header = packet.header_mut(); - header.htype = HType::Ethernet; - header.ptype = PType::Ipv4; - header.hlen = BigEndian::from(MacAddr::ADDR_SIZE as u8); - header.plen = BigEndian::from(Ipv4Addr::ADDR_SIZE as u8); +// let header = packet.header_mut(); +// header.htype = HType::Ethernet; +// header.ptype = PType::Ipv4; +// header.hlen = BigEndian::from(MacAddr::ADDR_SIZE as u8); +// header.plen = BigEndian::from(Ipv4Addr::ADDR_SIZE as u8); - header.src_ip = device.ip(); - header.src_mac = device.mac(); +// header.src_ip = device.ip(); +// header.src_mac = device.mac(); - packet - } -} +// packet +// } +// } -impl ConstPacketKind for Arp { - const HSIZE: usize = core::mem::size_of::(); -} +// impl ConstPacketKind for Arp { +// const HSIZE: usize = core::mem::size_of::(); +// } -impl PacketUpHierarchy for Packet {} -impl PacketHeader for Packet { - fn send(&self) { - self.downgrade().send() - } +// impl PacketUpHierarchy for Packet {} +// impl PacketHeader for Packet { +// fn recv(&self) { +// let header = self.header(); - fn recv(&self) { - let header = self.header(); +// CACHE +// .get() +// .as_ref() +// .expect("arp: cache not initialized") +// .write() +// .insert(header.src_ip, header.src_mac); - CACHE - .get() - .as_ref() - .expect("arp: cache not initialized") - .write() - .insert(header.src_ip, header.src_mac); +// let device = default_device(); - let device = default_device(); +// if header.opcode() == Opcode::Request && header.dest_ip == device.ip() { +// let mut packet = Packet::::create(); +// let reply_header = packet.header_mut(); - if header.opcode() == Opcode::Request && header.dest_ip == device.ip() { - let mut packet = Packet::::create(); - let reply_header = packet.header_mut(); +// reply_header.opcode = Opcode::Reply; +// reply_header.dest_ip = header.src_ip; +// reply_header.dest_mac = header.src_mac; - reply_header.opcode = Opcode::Reply; - reply_header.dest_ip = header.src_ip; - reply_header.dest_mac = header.src_mac; +// packet.send(); +// } +// } +// } - packet.send(); - } - } -} - -pub fn request_ip(target: Ipv4Addr, to: Packet) { - let mut packet = Packet::::create(); - let header = packet.header_mut(); - - header.opcode = Opcode::Request; - header.dest_ip = target; - header.dest_mac = MacAddr::NULL; +pub fn request_ip(target: Ipv4Addr, to: RawPacket) { + let arp = make_arp(ArpOpcode::Request, ArpAddress::new(MacAddr::NULL, target)); log::debug!("[ ARP ] (!!) Sending request for {target:?}"); @@ -228,5 +226,19 @@ pub fn request_ip(target: Ipv4Addr, to: Packet) { .write() .request(target, to); - packet.send(); + let eth = Eth::new(MacAddr::NULL, MacAddr::BROADCAST, EthType::Arp); + (eth / arp).send(); +} + +fn make_arp(opcode: ArpOpcode, dest_addr: ArpAddress) -> Arp { + let device = default_device(); + let src_addr = ArpAddress::new(device.mac(), device.ip()); + + Arp::new( + ArpHardwareType::Ethernet, + EthType::Ip, + src_addr, + dest_addr, + opcode, + ) } diff --git a/src/aero_kernel/src/net/checksum.rs b/src/aero_kernel/src/net/checksum.rs deleted file mode 100644 index 3ec9cf1ff8e..00000000000 --- a/src/aero_kernel/src/net/checksum.rs +++ /dev/null @@ -1,76 +0,0 @@ -use byte_endian::BigEndian; - -use super::ip::{self, Ipv4Addr}; - -#[repr(C, packed)] -pub struct PseudoHeader { - src_ip: Ipv4Addr, - dst_ip: Ipv4Addr, - reserved: u8, - ty: ip::Type, - size: BigEndian, -} - -impl PseudoHeader { - pub fn new(ip_hdr: &ip::Header) -> PseudoHeader { - let len = ip_hdr.length; - PseudoHeader { - src_ip: ip_hdr.src_ip, - dst_ip: ip_hdr.dest_ip, - reserved: 0, - ty: ip_hdr.protocol, - size: BigEndian::from(len.to_native() - core::mem::size_of::() as u16), - } - } -} - -/// Compute the 32-bit internet checksum for `data`. -fn calculate_checksum(data: &[u8]) -> u32 { - let bytes = unsafe { - core::slice::from_raw_parts( - data.as_ptr() as *const BigEndian, - data.len() / core::mem::size_of::(), - ) - }; - - let mut sum = bytes - .iter() - .take(data.len() / 2) - .map(|byte| byte.to_native() as u32) - .sum(); - - // Add left-over byte, if any. - if data.len() % 2 == 1 { - sum += ((*data.last().unwrap()) as u32) << 8; - } - - sum -} - -/// Folds the 32-bit sum (`sum`) to 16 bits in the network byte order. -pub fn make(mut sum: u32) -> BigEndian { - while (sum >> 16) != 0 { - sum = (sum & 0xffff) + (sum >> 16); - } - - BigEndian::from(!(sum as u16)) -} - -/// Combine several RFC 1071 compliant checksums. -pub fn make_combine(a: &[u32]) -> BigEndian { - make(a.iter().sum()) -} - -/// Compute the internet checksum for `value`. -pub fn calculate(value: &T) -> u32 { - let bytes = unsafe { - core::slice::from_raw_parts(value as *const _ as *const u8, core::mem::size_of::()) - }; - calculate_checksum(bytes) -} - -/// Compute the internet checksum for `value` of `size`. -pub fn calculate_with_len(value: &T, size: usize) -> u32 { - let bytes = unsafe { core::slice::from_raw_parts(value as *const _ as *const u8, size) }; - calculate_checksum(bytes) -} diff --git a/src/aero_kernel/src/net/ethernet.rs b/src/aero_kernel/src/net/ethernet.rs index 07cff800912..a324b86ebba 100644 --- a/src/aero_kernel/src/net/ethernet.rs +++ b/src/aero_kernel/src/net/ethernet.rs @@ -20,17 +20,9 @@ use core::alloc::{Allocator, Layout}; use crate::mem::paging::{PageSize, Size4KiB}; use crate::utils::dma::DmaAllocator; -use super::*; - -#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)] -#[repr(transparent)] -pub struct MacAddr(pub [u8; Self::ADDR_SIZE]); +use netstack::data_link::MacAddr; -impl MacAddr { - pub const ADDR_SIZE: usize = 6; - pub const BROADCAST: Self = Self([0xff; Self::ADDR_SIZE]); - pub const NULL: Self = Self([0; Self::ADDR_SIZE]); -} +use super::*; #[repr(u16)] pub enum Type { @@ -74,39 +66,18 @@ impl Packet { } impl PacketHeader
for Packet { - fn send(&self) { - let ip = match self.header().typ { - Type::Ip => { - let packet: Packet = self.upgrade(); - packet.header().dest_ip - } - - Type::Arp => Ipv4Addr::BROADCAST, - }; - - if let Some(addr) = arp::get(ip) { - let mut packet = self.clone(); - { - let header = packet.header_mut(); - header.dest_mac = addr; - } - super::default_device().send(packet); - } else { - arp::request_ip(ip, self.clone()); - } - } - fn recv(&self) { - match self.header().typ { - Type::Ip => { - let packet: Packet = self.upgrade(); - packet.recv() - } - - Type::Arp => { - let packet: Packet = self.upgrade(); - packet.recv() - } - } + // match self.header().typ { + // Type::Ip => { + // let packet: Packet = self.upgrade(); + // packet.recv() + // } + + // Type::Arp => { + // let packet: Packet = self.upgrade(); + // packet.recv() + // } + // } + todo!() } } diff --git a/src/aero_kernel/src/net/ip.rs b/src/aero_kernel/src/net/ip.rs deleted file mode 100644 index fe2a483dcc6..00000000000 --- a/src/aero_kernel/src/net/ip.rs +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. -// -// This file is part of The Aero Project. -// -// Aero is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Aero is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Aero. If not, see . - -use byte_endian::BigEndian; - -use super::*; - -#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default)] -#[repr(C)] -pub struct Ipv4Addr(pub [u8; Self::ADDR_SIZE]); - -impl Ipv4Addr { - /// Size of IPv4 adderess in octets. - /// - /// [RFC 8200 § 2]: https://www.rfc-editor.org/rfc/rfc791#section-3.2 - pub const ADDR_SIZE: usize = 4; - pub const BROADCAST: Self = Self([0xff; Self::ADDR_SIZE]); - - pub fn new(addr: [u8; Self::ADDR_SIZE]) -> Self { - Self(addr) - } -} - -#[derive(Debug, Copy, Clone)] -#[repr(u8)] -pub enum Type { - Tcp = 6u8.swap_bytes(), - Udp = 17u8.swap_bytes(), -} - -#[repr(C, packed)] -pub struct Header { - pub v: BigEndian, - pub tos: BigEndian, - pub length: BigEndian, - pub ident: BigEndian, - pub frag_offset: BigEndian, - pub ttl: BigEndian, - pub protocol: Type, - pub hcrc: BigEndian, - pub src_ip: Ipv4Addr, - pub dest_ip: Ipv4Addr, -} - -impl Header { - /// Set the payload length. - fn set_length(&mut self, length: u16) { - self.length = BigEndian::from(length); - } - - pub fn length(&self) -> u16 { - self.length.into() - } -} - -#[derive(Clone)] -pub struct Ipv4; - -impl ConstPacketKind for Ipv4 { - const HSIZE: usize = core::mem::size_of::
(); -} - -impl Packet { - pub fn create(protocol: Type, dest: Ipv4Addr, mut size: usize) -> Packet { - size += Ipv4::HSIZE; - - let mut packet: Packet = Packet::::create(ethernet::Type::Ip, size).upgrade(); - let header = packet.header_mut(); - - header.v = BigEndian::::from(0x45); - header.tos = BigEndian::::from(0); - header.ident = BigEndian::::from(0); - header.frag_offset = BigEndian::::from(0); - header.ttl = BigEndian::::from(64); - header.hcrc = BigEndian::::from(0); - - header.set_length(size as _); - - header.protocol = protocol; - header.dest_ip = dest; - - header.src_ip = default_device().ip(); - header.hcrc = checksum::make(checksum::calculate(header)); - packet - } -} - -impl PacketUpHierarchy for Packet {} -impl PacketHeader
for Packet { - fn send(&self) { - self.downgrade().send() // send the ethernet packet - } - - fn recv(&self) { - let mut packet = self.clone(); - let header = self.header(); - - packet.len = header.length() as usize; - match header.protocol { - Type::Udp => { - let packet: Packet = packet.upgrade(); - packet.recv(); - } - - Type::Tcp => { - let packet: Packet = packet.upgrade(); - packet.recv(); - } - } - } -} diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 20243ffbb6f..9d582e3103b 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -17,28 +17,29 @@ use core::marker::PhantomData; +use alloc::boxed::Box; use alloc::sync::Arc; use alloc::vec::Vec; use spin::RwLock; pub mod arp; -mod checksum; pub mod ethernet; -pub mod ip; pub mod tcp; pub mod udp; -pub use ethernet::{Eth, MacAddr}; +pub use ethernet::Eth; +use netstack::data_link::MacAddr; use crate::mem::paging::VirtAddr; use crate::userland::scheduler; use crate::userland::task::Task; +use crate::utils::dma::DmaAllocator; -use self::ip::Ipv4Addr; +use netstack::network::Ipv4Addr; -#[downcastable] +// #[downcastable] pub trait NetworkDriver: Send + Sync { - fn send(&self, packet: Packet); + fn send(&self, packet: Box<[u8], DmaAllocator>); fn recv(&self) -> RecvPacket; fn recv_end(&self, packet_id: usize); fn mac(&self) -> MacAddr; @@ -94,12 +95,12 @@ impl core::ops::Deref for NetworkDevice { } #[derive(Debug)] -pub struct RecvPacket { - pub packet: Packet, +pub struct RecvPacket<'a> { + pub packet: &'a [u8], pub id: usize, } -impl Drop for RecvPacket { +impl<'a> Drop for RecvPacket<'a> { fn drop(&mut self) { default_device().recv_end(self.id) } @@ -197,7 +198,6 @@ pub trait PacketDownHierarchy: PacketBaseTrait { } pub trait PacketHeader: PacketBaseTrait { - fn send(&self); fn recv(&self); fn header(&self) -> &H { @@ -213,11 +213,31 @@ static DEVICES: RwLock>> = RwLock::new(Vec::new()); static DEFAULT_DEVICE: RwLock>> = RwLock::new(None); fn packet_processor_thread() { + use netstack::data_link::{Eth, EthType}; + use netstack::network::{Ipv4, Ipv4Type}; + use netstack::transport::Udp; + use netstack::PacketParser; + let device = default_device(); loop { let packet = device.recv(); - packet.packet.recv(); + + let mut parser = PacketParser::new(packet.packet); + let eth = parser.next::(); + + match eth.typ() { + EthType::Ip => { + let ip = parser.next::(); + + match ip.protocol() { + Ipv4Type::Udp => udp::do_recv(parser.next::(), parser.payload()), + Ipv4Type::Tcp => todo!(), + } + } + + EthType::Arp => todo!(), + } } } @@ -255,3 +275,80 @@ pub fn init() { arp::init(); log::info!("net::arp: initialized cache"); } + +pub type RawPacket = Box<[u8], DmaAllocator>; + +pub mod shim { + use crate::net::{self, arp}; + use crate::utils::dma::DmaAllocator; + + use netstack::data_link::{Arp, Eth}; + use netstack::network::Ipv4; + use netstack::{IntoBoxedBytes, Protocol, Stacked}; + + pub trait PacketSend { + fn send(self); + } + + // Deref for Stacked where T: Stacked? + impl PacketSend for Stacked, T>, U> { + fn send(mut self) { + let device = net::default_device(); + + let eth = &mut self.upper.upper.upper; + let ip = &self.upper.upper.lower; + + eth.src_mac = device.mac(); + + if let Some(addr) = arp::get(ip.dest_ip()) { + eth.dest_mac = addr; + device.send(self.into_boxed_bytes_in(DmaAllocator)); + } else { + // arp::request_ip(ip, self.clone()); + todo!() + } + } + } + + impl PacketSend for Stacked { + fn send(self) { + // let device = net::default_device(); + + // let eth = &mut self.upper; + // let arp = &mut self.lower; + + // eth.src_mac = device.mac(); + // eth.dest_mac = arp.dest_mac; + todo!() + } + } + + // struct DefaultDevice; + + // impl NetworkDevice for DefaultDevice { + // fn send_bytes(&self, bytes: Box<[u8], A>) { + // panic!("Sending {} bytes", bytes.len()); + // } + // } + + // pub trait NetworkDevice { + // fn send_bytes(&self, bytes: Box<[u8], A>); + // } + + // pub trait SendablePacket + // where + // Self: Sized + IntoBoxedBytes, + // { + // #[inline] + // fn send(self) { + // DefaultDevice.send_bytes(self.into_boxed_bytes()) + // } + + // #[inline] + // fn send_in>(self, device: &T) { + // device.send_bytes(self.into_boxed_bytes()) + // } + // } + + // impl SendablePacket for T {} +} diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs index a816f31188e..59a4f497001 100644 --- a/src/aero_kernel/src/net/tcp.rs +++ b/src/aero_kernel/src/net/tcp.rs @@ -18,169 +18,12 @@ use alloc::collections::BTreeMap; use alloc::sync::Arc; -use bit_field::BitField; -use byte_endian::BigEndian; use spin::RwLock; -use super::ip::{self, Ipv4, Ipv4Addr}; -use super::{ - checksum, Packet, PacketDownHierarchy, PacketHeader, PacketKind, PacketTrait, PacketUpHierarchy, -}; - -#[derive(Debug, Copy, Clone)] -pub struct Tcp {} - -impl Packet { - pub fn create(src_port: u16, dest_port: u16, size: usize, target: Ipv4Addr) -> Packet { - let total_size = core::mem::size_of::() + size; - let mut packet: Packet = - Packet::::create(ip::Type::Tcp, target, total_size).upgrade(); - - let header = packet.header_mut(); - - header.src_port = src_port.into(); - header.dest_port = dest_port.into(); - header.set_header_len(core::mem::size_of::() as u8); - - packet - } - - pub fn ack_len(&self) -> u32 { - let data_size = self.as_slice().len() as u32; - let flags = self.header().flags(); - - let mut addend = 0; - if flags.contains(TcpFlags::FIN) | flags.contains(TcpFlags::SYN) { - addend = 1; - } - - data_size + addend - } -} - -bitflags::bitflags! { - pub struct TcpFlags: u16 { - const FIN = 1 << 0; - const SYN = 1 << 1; - const RST = 1 << 2; - const PSH = 1 << 3; - const ACK = 1 << 4; - const URG = 1 << 5; - } -} - -impl PacketKind for Tcp {} -impl PacketUpHierarchy for Packet {} -impl PacketHeader for Packet { - fn send(&self) { - let ip_packet = self.downgrade(); - - let mut packet = *self; - let header = packet.header_mut(); - - header.compute_checksum(ip_packet.header()); - ip_packet.send(); - } - - fn recv(&self) { - let header = self.header(); - let dest_port = header.dest_port(); - - let handlers = HANDLERS.read(); - - if let Some(handler) = handlers.get(&dest_port) { - handler.recv(*self); - } else { - log::warn!("tcp: no handler registered for port {}", dest_port); - } - } -} - -impl PacketTrait for Packet { - fn header_size(&self) -> usize { - self.header().header_len() as usize - } -} - -#[repr(C, packed)] -pub struct TcpHeader { - src_port: BigEndian, - dest_port: BigEndian, - seq_nr: BigEndian, - ack_nr: BigEndian, - flags: BigEndian, - window: BigEndian, - checksum: BigEndian, - urgent_ptr: BigEndian, -} - -const_assert_eq!(core::mem::size_of::(), 20); - -impl TcpHeader { - /// Return the header length, in octets. - pub fn header_len(&self) -> u8 { - let flags = self.flags; - (flags.to_native().get_bits(12..=15) * 4) as u8 - } - - /// Sets the ACK number to `val` and sets the [`TcpFlags::ACK`] flag. - pub fn set_ack_number(&mut self, val: u32) { - self.ack_nr = val.into(); - - let mut flags = self.flags(); - flags.insert(TcpFlags::ACK); - self.set_flags(flags); - } - - pub fn set_header_len(&mut self, val: u8) { - let mut flags = self.flags.to_native(); - flags.set_bits(12..=15, val as u16 / 4); - self.flags = flags.into(); - } - - pub fn compute_checksum(&mut self, ip_header: &ip::Header) { - self.checksum = BigEndian::from(0); - self.checksum = checksum::make_combine(&[ - checksum::calculate(&checksum::PseudoHeader::new(ip_header)), - checksum::calculate_with_len( - self, - ip_header.length() as usize - core::mem::size_of::(), - ), - ]); - } - - pub fn dest_port(&self) -> u16 { - self.dest_port.to_native() - } - - pub fn set_sequence_number(&mut self, val: u32) { - self.seq_nr = val.into(); - } - - pub fn sequence_number(&self) -> u32 { - self.seq_nr.to_native() - } - - pub fn set_window(&mut self, val: u16) { - self.window = val.into(); - } - - pub fn set_flags(&mut self, val: TcpFlags) { - let mut flags = self.flags.to_native(); - flags.set_bits(0..=5, val.bits()); - self.flags = flags.into(); - } - - pub fn flags(&self) -> TcpFlags { - let raw = self.flags.to_native().get_bits(0..=5); - TcpFlags::from_bits_truncate(raw) - } -} - static HANDLERS: RwLock>> = RwLock::new(BTreeMap::new()); pub trait TcpHandler: Send + Sync { - fn recv(&self, packet: Packet); + fn recv(&self, packet: &netstack::transport::Tcp); } pub fn alloc_ephemeral_port(socket: Arc) -> Option { diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs index 698429d238e..9a8cb346bde 100644 --- a/src/aero_kernel/src/net/udp.rs +++ b/src/aero_kernel/src/net/udp.rs @@ -17,92 +17,27 @@ use alloc::collections::BTreeMap; use alloc::sync::Arc; -use byte_endian::BigEndian; use spin::RwLock; -use super::ip::{Ipv4, Ipv4Addr}; -use super::{checksum, ip, PacketDownHierarchy}; +use netstack::network::Ipv4Addr; +use netstack::transport::Udp; -use super::{ConstPacketKind, Packet, PacketHeader, PacketUpHierarchy}; +pub fn do_recv(udp: &Udp, payload: &[u8]) { + let dest_port = udp.dst_port(); -#[derive(Copy, Clone)] -pub struct Udp; + let handlers = HANDLERS.read(); -impl ConstPacketKind for Udp { - const HSIZE: usize = core::mem::size_of::
(); -} - -impl Packet { - pub fn create(src_port: u16, dest_port: u16, mut size: usize, target: Ipv4Addr) -> Packet { - size += Udp::HSIZE; - - let ip_packet = Packet::::create(ip::Type::Udp, target, size); - let mut packet: Packet = ip_packet.upgrade(); - - let header = packet.header_mut(); - - header.src_port = BigEndian::from(src_port); - header.dst_port = BigEndian::from(dest_port); - header.len = BigEndian::from(size as u16); - - packet - } -} - -impl PacketUpHierarchy for Packet {} -impl PacketHeader
for Packet { - fn send(&self) { - { - let mut this = *self; - let header = this.header_mut(); - header.compute_checksum(self.downgrade().header()); - } - - self.downgrade().send() // send the IP packet - } - - fn recv(&self) { - let header = self.header(); - let dest_port = header.dst_port().to_native(); - - let handlers = HANDLERS.read(); - - if let Some(handler) = handlers.get(&dest_port) { - handler.recv(*self); - } else { - log::warn!("udp: no handler registered for port {}", dest_port); - } - } -} - -#[repr(C, packed)] -pub struct Header { - pub src_port: BigEndian, - pub dst_port: BigEndian, - pub len: BigEndian, - pub crc: BigEndian, -} - -impl Header { - fn compute_checksum(&mut self, header: &ip::Header) { - self.crc = BigEndian::from(0); - - let length = self.len; - self.crc = checksum::make_combine(&[ - checksum::calculate(&checksum::PseudoHeader::new(header)), - checksum::calculate_with_len(self, length.to_native() as usize), - ]); - } - - fn dst_port(&self) -> BigEndian { - self.dst_port + if let Some(handler) = handlers.get(&dest_port) { + handler.recv(udp, payload); + } else { + log::warn!("udp: no handler registered for port {}", dest_port); } } static HANDLERS: RwLock>> = RwLock::new(BTreeMap::new()); pub trait UdpHandler: Send + Sync { - fn recv(&self, packet: Packet); + fn recv(&self, udp: &Udp, payload: &[u8]); } pub fn alloc_ephemeral_port(socket: Arc) -> Option { diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 1611f3ece62..0c052914934 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -17,17 +17,21 @@ use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; +use netstack::data_link::MacAddr; use spin::Once; use crate::fs::cache::DirCacheItem; use crate::fs::file_table::FileHandle; use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags}; use crate::fs::{self, FileSystemError}; -use crate::net::ip::Ipv4Addr; -use crate::net::tcp::{self, Tcp, TcpFlags, TcpHandler}; -use crate::net::{Packet, PacketHeader, PacketTrait}; +use crate::net::tcp::{self, TcpHandler}; use crate::utils::sync::{Mutex, WaitQueue}; +use netstack::data_link::Eth; +use netstack::network::{Ipv4, Ipv4Addr}; +use netstack::transport::{Tcp, TcpFlags}; +use netstack::Stacked; + /// TCP Stream #[derive(Default)] struct Stream { @@ -80,49 +84,48 @@ struct TcpData { } impl TcpData { - fn make_packet(&self, size: usize, flags: TcpFlags) -> Packet { - let mut packet = Packet::::create(self.src_port, self.dest_port, size, self.target); - let header = packet.header_mut(); - - header.set_sequence_number(self.control.send_next); - header.set_window(u16::MAX); - header.set_flags(flags); + fn make_layer(&self, flags: TcpFlags) -> Tcp { + Tcp::new(self.src_port, self.dest_port) + .set_sequence_number(self.control.send_next) + .set_window(u16::MAX) + .set_flags(flags) + } - packet + fn make_ack_packet(&self) -> Tcp { + self.make_layer(TcpFlags::empty()) + .set_ack_number(self.control.recv_next) } - fn make_ack_packet(&self, size: usize) -> Packet { - let mut packet = self.make_packet(size, TcpFlags::empty()); - let header = packet.header_mut(); + fn send_packet(&mut self, tcp: Tcp, payload: &[u8]) { + use crate::net::shim::PacketSend; - header.set_ack_number(self.control.recv_next); - packet - } + use netstack::data_link::{Eth, EthType}; + use netstack::network::{Ipv4, Ipv4Type}; + + let eth = Eth::new(MacAddr::NULL, MacAddr::NULL, EthType::Ip); + let ipv4 = Ipv4::new(Ipv4Addr::BROADCAST, Ipv4Addr::BROADCAST, Ipv4Type::Tcp); + let packet = eth / ipv4 / tcp / payload; - fn send_packet(&mut self, packet: Packet) { self.control.send_next = self.control.send_next.wrapping_add(packet.ack_len()); packet.send(); } fn send_sync(&mut self) { - self.send_packet(self.make_packet(0, TcpFlags::SYN)); + self.send_packet(self.make_layer(TcpFlags::SYN), &[]); self.state = State::SynSent; } - fn recv(&mut self, packet: Packet) { - let header = packet.header(); - + fn recv(&mut self, packet: &Tcp, payload: &[u8]) { match self.state { State::SynSent => { - assert!(header.flags().contains(TcpFlags::ACK | TcpFlags::SYN)); + assert!(packet.flags().contains(TcpFlags::ACK | TcpFlags::SYN)); self.state = State::Established; } State::Established => { - if !packet.as_slice().is_empty() { - let data = packet.as_slice(); - self.stream.write(data); - } else if header.flags().contains(TcpFlags::FIN) { + if !payload.is_empty() { + self.stream.write(payload); + } else if packet.flags().contains(TcpFlags::FIN) { todo!() } else { log::trace!("[ TCP ] Connection Established!"); @@ -133,8 +136,9 @@ impl TcpData { State::Closed => unreachable!(), } - self.control.recv_next = header.sequence_number().wrapping_add(packet.ack_len()); - self.send_packet(self.make_ack_packet(0)); + // self.control.recv_next = packet.sequence_number().wrapping_add(packet.ack_len()); + todo!() + // self.send_packet(self.make_ack_packet(), &[]); } } @@ -231,9 +235,8 @@ impl INodeInterface for TcpSocket { .block_on(&self.data, |e| e.state == State::Established)?; for chunk in buffer.chunks(Self::MAX_MTU) { - let mut packet = data.make_ack_packet(chunk.len()); - packet.as_slice_mut().copy_from_slice(chunk); - data.send_packet(packet); + let mut packet = data.make_ack_packet(); + data.send_packet(packet, chunk); } Ok(buffer.len()) @@ -254,9 +257,8 @@ impl INodeInterface for TcpSocket { let mut inner = self.data.lock_irq(); for chunk in data.chunks(Self::MAX_MTU) { - let mut packet = inner.make_ack_packet(chunk.len()); - packet.as_slice_mut().copy_from_slice(chunk); - inner.send_packet(packet); + let mut packet = inner.make_ack_packet(); + inner.send_packet(packet, chunk); } Ok(data.len()) @@ -281,7 +283,7 @@ impl INodeInterface for TcpSocket { } impl TcpHandler for TcpSocket { - fn recv(&self, packet: Packet) { - self.data.lock_irq().recv(packet); + fn recv(&self, packet: &Tcp) { + self.data.lock_irq().recv(packet, &[]); } } diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index 4e45c8d83b2..4e42472ed23 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -28,13 +28,16 @@ use crate::fs::file_table::FileHandle; use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags}; use crate::fs::{self, FileSystemError}; use crate::mem::paging::VirtAddr; -use crate::net::ip::Ipv4Addr; -use crate::net::udp::{self, Udp, UdpHandler}; -use crate::net::{self, MacAddr, Packet, PacketHeader, PacketTrait}; +use crate::net::udp::{self, UdpHandler}; +use crate::net::{self}; use crate::utils::sync::{Mutex, WaitQueue}; use super::SocketAddr; +use netstack::data_link::{Eth, EthType, MacAddr}; +use netstack::network::{Ipv4, Ipv4Addr, Ipv4Type}; +use netstack::transport::Udp; + #[derive(Default)] enum SocketState { /// The socket is not connected. @@ -48,7 +51,7 @@ struct UdpSocketInner { /// The address that the socket has been bound to. address: Option, state: SocketState, - incoming: Vec>, + incoming: Vec>, } pub struct UdpSocket { @@ -174,10 +177,12 @@ impl INodeInterface for UdpSocket { .copied() .collect::>(); - let mut packet = Packet::::create(src_port, dest_port, data.len(), dest_ip); + use crate::net::shim::PacketSend; - let dest = packet.as_slice_mut(); - dest.copy_from_slice(data.as_slice()); + let eth = Eth::new(MacAddr::NULL, MacAddr::NULL, EthType::Ip); + let ipv4 = Ipv4::new(Ipv4Addr::BROADCAST, Ipv4Addr::BROADCAST, Ipv4Type::Udp); + let udp = Udp::new(src_port, dest_port); + let packet = eth / ipv4 / udp / data.as_slice(); packet.send(); Ok(data.len()) @@ -282,8 +287,8 @@ impl INodeInterface for UdpSocket { } impl UdpHandler for UdpSocket { - fn recv(&self, packet: Packet) { - self.inner.lock_irq().incoming.push(packet); + fn recv(&self, _udp: &Udp, payload: &[u8]) { + self.inner.lock_irq().incoming.push(payload.to_vec()); self.wq.notify_all(); } } From 76812403d4964f6ab76b7128e44e6d8fc8541c63 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Tue, 19 Sep 2023 17:48:00 +1000 Subject: [PATCH 255/368] misc(net): cleanup Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/e1000.rs | 2 +- src/aero_kernel/src/net/arp.rs | 69 +++++--------- src/aero_kernel/src/net/ethernet.rs | 83 ----------------- src/aero_kernel/src/net/mod.rs | 131 +++------------------------ 4 files changed, 34 insertions(+), 251 deletions(-) delete mode 100644 src/aero_kernel/src/net/ethernet.rs diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index 04752d93273..085f38f5783 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -27,7 +27,7 @@ use crate::userland::scheduler; use crate::utils::dma::DmaAllocator; use crate::utils::sync::{Mutex, WaitQueue}; -use crate::net::{self, ethernet, NetworkDevice, NetworkDriver}; +use crate::net::{self, NetworkDevice, NetworkDriver}; use netstack::data_link::MacAddr; const TX_DESC_NUM: u32 = 32; diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index 1f7c500fa32..91b76912885 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -19,13 +19,12 @@ use alloc::collections::BTreeMap; use alloc::vec::Vec; -use byte_endian::BigEndian; use spin::{Once, RwLock}; use crate::net::default_device; use crate::net::shim::PacketSend; -use netstack::data_link::{Arp, ArpAddress, ArpHardwareType, ArpOpcode, Eth, EthType}; +use netstack::data_link::{Arp, ArpAddress, ArpHardwareType, ArpOpcode, EthType}; use netstack::network::Ipv4Addr; // use super::{ConstPacketKind, Eth, Packet, PacketDownHierarchy, PacketHeader}; @@ -68,7 +67,7 @@ impl Cache { log::trace!("[ ARP ] (!!) Sending queued packed to {ip:?} {mac:?}"); // packet.header_mut().dest_mac = mac; // super::default_device().send(packet); - unreachable!() + todo!() } } } else { @@ -116,49 +115,6 @@ pub fn init() { }); } -/// Hardware Address Space (e.g., Ethernet, Packet Radio Net.) -#[derive(Copy, Clone)] -#[repr(u16)] -pub enum HType { - Ethernet = 1u16.swap_bytes(), -} - -/// Internetwork Protocol for which the ARP request is intended. -#[derive(Copy, Clone)] -#[repr(u16)] -pub enum PType { - Ipv4 = 0x0800u16.swap_bytes(), -} - -/// ARP Opcode -#[derive(Copy, Clone, Eq, PartialEq)] -#[repr(u16)] -pub enum Opcode { - Request = 1u16.swap_bytes(), - Reply = 2u16.swap_bytes(), -} - -#[repr(C, packed)] -pub struct ArpHeader { - pub htype: HType, - pub ptype: PType, - /// Length (in octets) of a hardware address. - pub hlen: BigEndian, - /// Length (in octets) of internetwork addresses. - pub plen: BigEndian, - pub opcode: Opcode, - pub src_mac: MacAddr, - pub src_ip: Ipv4Addr, - pub dest_mac: MacAddr, - pub dest_ip: Ipv4Addr, -} - -impl ArpHeader { - pub fn opcode(&self) -> Opcode { - self.opcode - } -} - // #[derive(Debug, Copy, Clone)] // pub struct Arp {} @@ -214,6 +170,24 @@ impl ArpHeader { // } // } +pub fn do_recv(arp: &Arp) { + CACHE + .get() + .as_ref() + .expect("arp: cache not initialized") + .write() + .insert(arp.src_ip(), arp.src_mac()); + + let device = default_device(); + + if arp.opcode() == ArpOpcode::Request && arp.dest_ip() == device.ip() { + let addr = ArpAddress::new(arp.src_mac(), arp.src_ip()); + let reply_arp = make_arp(ArpOpcode::Reply, addr); + + reply_arp.send(); + } +} + pub fn request_ip(target: Ipv4Addr, to: RawPacket) { let arp = make_arp(ArpOpcode::Request, ArpAddress::new(MacAddr::NULL, target)); @@ -226,8 +200,7 @@ pub fn request_ip(target: Ipv4Addr, to: RawPacket) { .write() .request(target, to); - let eth = Eth::new(MacAddr::NULL, MacAddr::BROADCAST, EthType::Arp); - (eth / arp).send(); + arp.send(); } fn make_arp(opcode: ArpOpcode, dest_addr: ArpAddress) -> Arp { diff --git a/src/aero_kernel/src/net/ethernet.rs b/src/aero_kernel/src/net/ethernet.rs deleted file mode 100644 index a324b86ebba..00000000000 --- a/src/aero_kernel/src/net/ethernet.rs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. -// -// This file is part of The Aero Project. -// -// Aero is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Aero is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Aero. If not, see . - -use core::alloc::{Allocator, Layout}; - -use crate::mem::paging::{PageSize, Size4KiB}; -use crate::utils::dma::DmaAllocator; - -use netstack::data_link::MacAddr; - -use super::*; - -#[repr(u16)] -pub enum Type { - Ip = 0x800u16.swap_bytes(), - Arp = 0x0806u16.swap_bytes(), -} - -#[repr(C, packed)] -pub struct Header { - pub dest_mac: MacAddr, - pub src_mac: MacAddr, - pub typ: Type, -} - -#[derive(Debug, Clone)] -pub struct Eth; - -impl ConstPacketKind for Eth { - const HSIZE: usize = core::mem::size_of::
(); -} - -impl Packet { - pub fn create(typ: Type, mut size: usize) -> Packet { - size += Eth::HSIZE; - - let src_mac = super::default_device().mac(); - - // Allocate the packet (needs to be 4KiB aligned). - let layout = unsafe { Layout::from_size_align_unchecked(size, Size4KiB::SIZE as usize) }; - let ptr = DmaAllocator.allocate_zeroed(layout).expect("net: OOM!"); - let addr = VirtAddr::new(ptr.as_mut_ptr() as u64); - - let mut packet = Packet::::new(addr, size); - let header = packet.header_mut(); - - header.src_mac = src_mac; - header.typ = typ; - - packet - } -} - -impl PacketHeader
for Packet { - fn recv(&self) { - // match self.header().typ { - // Type::Ip => { - // let packet: Packet = self.upgrade(); - // packet.recv() - // } - - // Type::Arp => { - // let packet: Packet = self.upgrade(); - // packet.recv() - // } - // } - todo!() - } -} diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 9d582e3103b..709e05b6227 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -15,29 +15,24 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -use core::marker::PhantomData; - use alloc::boxed::Box; use alloc::sync::Arc; use alloc::vec::Vec; use spin::RwLock; pub mod arp; -pub mod ethernet; pub mod tcp; pub mod udp; -pub use ethernet::Eth; use netstack::data_link::MacAddr; -use crate::mem::paging::VirtAddr; use crate::userland::scheduler; use crate::userland::task::Task; use crate::utils::dma::DmaAllocator; use netstack::network::Ipv4Addr; -// #[downcastable] +#[downcastable] pub trait NetworkDriver: Send + Sync { fn send(&self, packet: Box<[u8], DmaAllocator>); fn recv(&self) -> RecvPacket; @@ -106,114 +101,11 @@ impl<'a> Drop for RecvPacket<'a> { } } -pub trait PacketKind {} - -pub trait ConstPacketKind: PacketKind { - const HSIZE: usize; -} - -impl PacketKind for T {} - -impl PacketDownHierarchy for Packet -where - U: PacketKind, - D: ConstPacketKind, - Packet: PacketUpHierarchy, -{ -} - -pub trait PacketBaseTrait { - fn addr(&self) -> VirtAddr; - fn len(&self) -> usize; -} - -pub trait PacketTrait: PacketBaseTrait { - fn header_size(&self) -> usize; - - // TODO: Rename as_slice{_mut} to payload{_mut}? - fn as_slice_mut(&mut self) -> &mut [u8] { - let hsize = self.header_size(); - - let start = self.addr() + hsize; - let size = self.len() - hsize; - - unsafe { core::slice::from_raw_parts_mut(start.as_mut_ptr(), size) } - } - - fn as_slice(&self) -> &[u8] { - let hsize = self.header_size(); - - let start = self.addr() + hsize; - let size = self.len() - hsize; - - unsafe { core::slice::from_raw_parts(start.as_ptr(), size) } - } -} - -impl PacketTrait for Packet { - fn header_size(&self) -> usize { - T::HSIZE - } -} - -#[derive(Debug, Copy, Clone)] -pub struct Packet { - pub addr: VirtAddr, - pub len: usize, - _phantom: PhantomData, -} - -impl PacketBaseTrait for Packet { - fn addr(&self) -> VirtAddr { - self.addr - } - - fn len(&self) -> usize { - self.len - } -} - -impl Packet { - pub fn new(addr: VirtAddr, len: usize) -> Packet { - Packet:: { - addr, - len, - _phantom: PhantomData, - } - } -} - -pub trait PacketUpHierarchy: PacketTrait { - fn upgrade(&self) -> Packet { - let header_size = self.header_size(); - Packet::::new(self.addr() + header_size, self.len() - header_size) - } -} - -pub trait PacketDownHierarchy: PacketBaseTrait { - fn downgrade(&self) -> Packet { - let header_size = B::HSIZE; - Packet::::new(self.addr() - header_size, self.len() + header_size) - } -} - -pub trait PacketHeader: PacketBaseTrait { - fn recv(&self); - - fn header(&self) -> &H { - self.addr().read_mut::().unwrap() - } - - fn header_mut(&mut self) -> &mut H { - self.addr().read_mut::().unwrap() - } -} - static DEVICES: RwLock>> = RwLock::new(Vec::new()); static DEFAULT_DEVICE: RwLock>> = RwLock::new(None); fn packet_processor_thread() { - use netstack::data_link::{Eth, EthType}; + use netstack::data_link::{Arp, Eth, EthType}; use netstack::network::{Ipv4, Ipv4Type}; use netstack::transport::Udp; use netstack::PacketParser; @@ -236,7 +128,9 @@ fn packet_processor_thread() { } } - EthType::Arp => todo!(), + EthType::Arp => { + arp::do_recv(parser.next::()); + } } } } @@ -282,7 +176,7 @@ pub mod shim { use crate::net::{self, arp}; use crate::utils::dma::DmaAllocator; - use netstack::data_link::{Arp, Eth}; + use netstack::data_link::{Arp, Eth, EthType, MacAddr}; use netstack::network::Ipv4; use netstack::{IntoBoxedBytes, Protocol, Stacked}; @@ -310,16 +204,15 @@ pub mod shim { } } - impl PacketSend for Stacked { + impl PacketSend for Arp { fn send(self) { - // let device = net::default_device(); + let device = net::default_device(); - // let eth = &mut self.upper; - // let arp = &mut self.lower; + let eth = Eth::new(MacAddr::NULL, MacAddr::BROADCAST, EthType::Arp) + .set_dest_mac(self.dest_mac()) + .set_src_mac(device.mac()); - // eth.src_mac = device.mac(); - // eth.dest_mac = arp.dest_mac; - todo!() + device.send((eth / self).into_boxed_bytes_in(DmaAllocator)); } } From 6658f8e7324423f914ddaf34ad59b63152509936 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 22 Sep 2023 13:59:38 +1000 Subject: [PATCH 256/368] feat(tcp): use `crabnet_tcp` Signed-off-by: Anhad Singh --- patches/mlibc/mlibc.patch | 174 ++++++-- src/Cargo.lock | 79 +--- src/aero_kernel/Cargo.toml | 4 +- src/aero_kernel/src/drivers/e1000.rs | 2 +- src/aero_kernel/src/fs/ext2/mod.rs | 4 +- src/aero_kernel/src/fs/inode.rs | 23 +- src/aero_kernel/src/net/arp.rs | 16 +- src/aero_kernel/src/net/mod.rs | 41 +- src/aero_kernel/src/net/tcp.rs | 19 +- src/aero_kernel/src/net/udp.rs | 6 +- src/aero_kernel/src/socket/mod.rs | 20 +- src/aero_kernel/src/socket/tcp.rs | 377 ++++++++---------- src/aero_kernel/src/socket/udp.rs | 16 +- src/aero_kernel/src/socket/unix.rs | 6 +- src/aero_kernel/src/syscall/mod.rs | 57 +-- src/aero_kernel/src/syscall/net.rs | 73 +++- src/aero_kernel/src/userland/scheduler/mod.rs | 5 + src/aero_syscall/src/consts.rs | 2 + 18 files changed, 504 insertions(+), 420 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index bf4e0d9b08e..e16aed655cc 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,57 +1,153 @@ -From 3f789791be46cefe9ff8a5c6196a3a23bed9620f Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 16 Apr 2023 14:21:09 +1000 -Subject: [PATCH] +From 1e4603c9de5ce2dcb596dfb95254b0ae119d1036 Mon Sep 17 00:00:00 2001 +From: Anhad Singh +Date: Thu, 3 Aug 2023 16:36:12 +1000 +Subject: [PATCH] socket: implement shutdown(2) -Signed-off-by: Andy-Python-Programmer +Signed-off-by: Anhad Singh --- - .gitignore | 2 ++ - options/ansi/generic/stdlib-stubs.cpp | 6 +++-- - options/glibc/generic/execinfo.cpp | 5 ++-- - options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 27 +++++++++++++++------- - sysdeps/aero/generic/filesystem.cpp | 33 ++++++++++++++------------- - sysdeps/aero/generic/sockets.cpp | 29 +++++++++++++++++++++-- - sysdeps/aero/include/aero/syscall.h | 10 ++++++++ - 8 files changed, 83 insertions(+), 31 deletions(-) + options/glibc/generic/execinfo.cpp | 5 ++-- + options/posix/generic/sys-socket-stubs.cpp | 9 ++++++-- + options/posix/include/mlibc/posix-sysdeps.hpp | 1 + + sysdeps/aero/generic/signals.cpp | 19 ++++++--------- + sysdeps/aero/generic/sockets.cpp | 23 +++++++++++++++++++ + sysdeps/aero/include/aero/syscall.h | 3 +++ + 6 files changed, 44 insertions(+), 16 deletions(-) -diff --git a/.gitignore b/.gitignore -index fdd60a0..9f811f4 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -3,3 +3,5 @@ subprojects - *.xbstrap - # editor configs: - .vscode -+# clangd cache files: -+.cache diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp -index 3474615..10a2109 100644 +index 3474615..aaf593a 100644 --- a/options/glibc/generic/execinfo.cpp +++ b/options/glibc/generic/execinfo.cpp @@ -1,9 +1,10 @@ #include #include -+#include ++#include int backtrace(void **, int) { - __ensure(!"Not implemented"); - __builtin_unreachable(); -+ mlibc::infoLogger() << "backtrace() is unimplemented" << frg::endlog; ++ mlibc::infoLogger() << "backtrace: Not implemented" << frg::endlog; + return 0; } char **backtrace_symbols(void *const *, int) { -diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp -index 003a162..ab01a7a 100644 ---- a/options/rtdl/generic/linker.cpp -+++ b/options/rtdl/generic/linker.cpp -@@ -18,7 +18,7 @@ uintptr_t libraryBase = 0x41000000; - - constexpr bool verbose = false; - constexpr bool stillSlightlyVerbose = false; --constexpr bool logBaseAddresses = false; -+constexpr bool logBaseAddresses = true; - constexpr bool logRpath = false; - constexpr bool eagerBinding = true; +diff --git a/options/posix/generic/sys-socket-stubs.cpp b/options/posix/generic/sys-socket-stubs.cpp +index 1674945..037a994 100644 +--- a/options/posix/generic/sys-socket-stubs.cpp ++++ b/options/posix/generic/sys-socket-stubs.cpp +@@ -187,8 +187,13 @@ int setsockopt(int fd, int layer, int number, + return mlibc::sys_setsockopt(fd, layer, number, buffer, size); + } + +-int shutdown(int, int) { +- mlibc::infoLogger() << "mlibc: shutdown() is a no-op!" << frg::endlog; ++int shutdown(int sockfd, int how) { ++ auto sysdep = MLIBC_CHECK_OR_ENOSYS(mlibc::sys_shutdown, -1); ++ if(int e = sysdep(sockfd, how); e) { ++ errno = e; ++ return -1; ++ } ++ + return 0; + } + +diff --git a/options/posix/include/mlibc/posix-sysdeps.hpp b/options/posix/include/mlibc/posix-sysdeps.hpp +index 9918188..c694079 100644 +--- a/options/posix/include/mlibc/posix-sysdeps.hpp ++++ b/options/posix/include/mlibc/posix-sysdeps.hpp +@@ -159,6 +159,7 @@ int sys_vm_unmap(void *pointer, size_t size); + void *__restrict buffer, socklen_t *__restrict size); + [[gnu::weak]] int sys_setsockopt(int fd, int layer, int number, + const void *buffer, socklen_t size); ++[[gnu::weak]] int sys_shutdown(int sockfd, int how); + [[gnu::weak]] int sys_sigprocmask(int how, const sigset_t *__restrict set, + sigset_t *__restrict retrieve); + [[gnu::weak]] int sys_sigaction(int, const struct sigaction *__restrict, +diff --git a/sysdeps/aero/generic/signals.cpp b/sysdeps/aero/generic/signals.cpp +index a6f69ff..611db69 100644 +--- a/sysdeps/aero/generic/signals.cpp ++++ b/sysdeps/aero/generic/signals.cpp +@@ -29,25 +29,20 @@ int sys_sigaction(int how, const struct sigaction *__restrict action, + #endif + + auto sigreturn = (sc_word_t)__mlibc_signal_restore; +- +- auto res = syscall(SYS_SIGACTION, how, (sc_word_t)action, sigreturn, ++ auto ret = syscall(SYS_SIGACTION, how, (sc_word_t)action, sigreturn, + (sc_word_t)old_action); + +- if (res < 0) { +- return -res; +- } +- ++ if(int e = sc_error(ret); e) ++ return e; + return 0; + } + + int sys_sigprocmask(int how, const sigset_t *__restrict set, + sigset_t *__restrict retrieve) { +- auto result = syscall(SYS_SIGPROCMASK, how, set, retrieve); + +- if (result < 0) { +- return -result; +- } +- +- return 0; ++ auto ret = syscall(SYS_SIGPROCMASK, how, set, retrieve); ++ if(int e = sc_error(ret); e) ++ return e; ++ return 0; + } + } // namespace mlibc +\ No newline at end of file +diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp +index 2db218c..ed3fc06 100644 +--- a/sysdeps/aero/generic/sockets.cpp ++++ b/sysdeps/aero/generic/sockets.cpp +@@ -221,6 +221,29 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, + } + } + ++int sys_shutdown(int sockfd, int how) { ++ auto ret = syscall(SYS_SOCK_SHUTDOWN, sockfd, how); ++ if(int e = sc_error(ret); e) ++ return e; ++ return 0; ++} ++ ++int sys_peername(int fd, struct sockaddr *addr_ptr, socklen_t max_addr_length, socklen_t *actual_length) { ++ auto ret = syscall(SYS_GETPEERNAME, fd, addr_ptr, &max_addr_length); ++ if (int e = sc_error(ret); e) ++ return e; ++ *actual_length = max_addr_length; ++ return 0; ++} ++ ++int sys_sockname(int fd, struct sockaddr *addr_ptr, socklen_t max_addr_length, socklen_t *actual_length) { ++ auto ret = syscall(SYS_GETSOCKNAME, fd, addr_ptr, &max_addr_length); ++ if (int e = sc_error(ret); e) ++ return e; ++ *actual_length = max_addr_length; ++ return 0; ++} ++ + int sys_if_nametoindex(const char *name, unsigned int *ret) { + int fd = 0; + int r = sys_socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, AF_UNSPEC, &fd); +diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h +index d8bf99e..39c5b65 100644 +--- a/sysdeps/aero/include/aero/syscall.h ++++ b/sysdeps/aero/include/aero/syscall.h +@@ -79,6 +79,9 @@ + #define SYS_SETPGID 72 + #define SYS_SETSID 73 + #define SYS_GETPGID 74 ++#define SYS_SOCK_SHUTDOWN 75 ++#define SYS_GETPEERNAME 76 ++#define SYS_GETSOCKNAME 77 + + // Invalid syscall used to trigger a log error in the kernel (as a hint) + // so, that we can implement the syscall in the kernel. +-- +2.42.0 diff --git a/src/Cargo.lock b/src/Cargo.lock index 7b2d9c73721..d873aefc2c5 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -14,6 +14,8 @@ dependencies = [ "bytemuck", "cfg-if", "cpio_reader", + "crabnet", + "crabnet_tcp", "hashbrown 0.14.0", "intrusive-collections", "lai", @@ -22,8 +24,6 @@ dependencies = [ "log", "lru", "nasm-rs", - "netstack", - "netstack_tcp", "num-traits", "raw-cpuid", "rustc-demangle", @@ -136,6 +136,26 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "crabnet" +version = "0.1.0" +source = "git+https://github.com/aero-os/crabnet#4e9e10290136ab34b2b73bd7ce81803c2303674c" +dependencies = [ + "bit_field", + "bitflags 2.4.0", + "byte_endian", + "static_assertions", +] + +[[package]] +name = "crabnet_tcp" +version = "0.1.0" +source = "git+https://github.com/aero-os/crabnet#4e9e10290136ab34b2b73bd7ce81803c2303674c" +dependencies = [ + "crabnet", + "log", +] + [[package]] name = "crossbeam-channel" version = "0.5.8" @@ -185,30 +205,6 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "pin-utils", -] - [[package]] name = "hashbrown" version = "0.13.2" @@ -311,25 +307,6 @@ dependencies = [ "rayon", ] -[[package]] -name = "netstack" -version = "0.1.0" -dependencies = [ - "bit_field", - "bitflags 2.4.0", - "byte_endian", - "static_assertions", -] - -[[package]] -name = "netstack_tcp" -version = "0.1.0" -dependencies = [ - "futures-util", - "log", - "netstack", -] - [[package]] name = "num-derive" version = "0.3.3" @@ -366,18 +343,6 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "proc-macro-error" version = "1.0.4" diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index 9b341307b45..f1f9cac37a2 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -48,8 +48,8 @@ num-traits = { version = "0.2", default-features = false } vte = { git = "https://github.com/alacritty/vte", features = ["ansi"] } byte_endian = { git = "https://github.com/aero-os/byte_endian" } -netstack = { path = "../../../orgs/aero/netstack" } -netstack_tcp = { path = "../../../orgs/aero/netstack/netstack_tcp", default-features = false } +crabnet = { git = "https://github.com/aero-os/crabnet" } +crabnet_tcp = { git = "https://github.com/aero-os/crabnet", default-features = false } # X86_64 specific dependencies: [target.'cfg(target_arch = "x86_64")'.dependencies] diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index 085f38f5783..dfb58016563 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -28,7 +28,7 @@ use crate::utils::dma::DmaAllocator; use crate::utils::sync::{Mutex, WaitQueue}; use crate::net::{self, NetworkDevice, NetworkDriver}; -use netstack::data_link::MacAddr; +use crabnet::data_link::MacAddr; const TX_DESC_NUM: u32 = 32; const TX_DESC_SIZE: u32 = TX_DESC_NUM * core::mem::size_of::() as u32; diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index b4ef58d84a5..987531513b3 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -33,7 +33,7 @@ use crate::fs::ext2::disk::{FileType, Revision, SuperBlock}; use crate::mem::paging::*; use crate::socket::unix::UnixSocket; -use crate::socket::SocketAddr; +use crate::socket::SocketAddrRef; use crate::utils::CeilDiv; use self::group_desc::GroupDescriptors; @@ -555,7 +555,7 @@ impl INodeInterface for INode { // XXX: We do not require to handle `bind` here since if this function // is being is called on an EXT2 inode then, it has already been bound. - fn connect(&self, address: SocketAddr, length: usize) -> super::Result<()> { + fn connect(&self, address: SocketAddrRef, length: usize) -> super::Result<()> { if let Some(proxy) = self.proxy.as_ref() { return proxy.connect(address, length); } diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index ed6588e00bb..5c03caf0471 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -29,7 +29,7 @@ use spin::Once; use crate::mem::paging::{PhysFrame, VirtAddr}; use crate::socket::unix::UnixSocket; -use crate::socket::SocketAddr; +use crate::socket::{SocketAddr, SocketAddrRef}; use crate::userland::scheduler; use crate::utils::sync::{BMutex, Mutex, WaitQueue}; @@ -234,11 +234,11 @@ pub trait INodeInterface: Send + Sync { } // Socket operations: - fn bind(&self, _address: SocketAddr, _length: usize) -> Result<()> { + fn bind(&self, _address: SocketAddrRef, _length: usize) -> Result<()> { Err(FileSystemError::NotSocket) } - fn connect(&self, _address: SocketAddr, _length: usize) -> Result<()> { + fn connect(&self, _address: SocketAddrRef, _length: usize) -> Result<()> { Err(FileSystemError::NotSocket) } @@ -258,6 +258,14 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSocket) } + fn get_peername(&self) -> Result { + Err(FileSystemError::NotSupported) + } + + fn get_sockname(&self) -> Result { + Err(FileSystemError::NotSupported) + } + /// Returns the inner UNIX socket inode if bound to one. fn as_unix_socket(&self) -> Result> { Err(FileSystemError::NotSocket) @@ -283,6 +291,15 @@ pub struct Metadata { } impl Metadata { + pub fn with_file_type(file_type: FileType) -> Self { + Self { + file_type, + id: 0, + size: 0, + children_len: 0, + } + } + #[inline] pub fn id(&self) -> usize { self.id diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index 91b76912885..a7f77d73e6e 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -24,11 +24,8 @@ use spin::{Once, RwLock}; use crate::net::default_device; use crate::net::shim::PacketSend; -use netstack::data_link::{Arp, ArpAddress, ArpHardwareType, ArpOpcode, EthType}; -use netstack::network::Ipv4Addr; - -// use super::{ConstPacketKind, Eth, Packet, PacketDownHierarchy, PacketHeader}; -use netstack::data_link::MacAddr; +use crabnet::data_link::{Arp, ArpAddress, ArpHardwareType, ArpOpcode, Eth, EthType, MacAddr}; +use crabnet::network::Ipv4Addr; use super::RawPacket; @@ -65,9 +62,12 @@ impl Cache { for mut packet in queue { log::trace!("[ ARP ] (!!) Sending queued packed to {ip:?} {mac:?}"); - // packet.header_mut().dest_mac = mac; - // super::default_device().send(packet); - todo!() + + // FIXME: make this cleaner + let eth = unsafe { &mut *packet.as_mut_ptr().cast::() }; + eth.dest_mac = mac; + + super::default_device().send(packet); } } } else { diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 709e05b6227..43829ff30aa 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -24,13 +24,12 @@ pub mod arp; pub mod tcp; pub mod udp; -use netstack::data_link::MacAddr; - use crate::userland::scheduler; use crate::userland::task::Task; use crate::utils::dma::DmaAllocator; -use netstack::network::Ipv4Addr; +use crabnet::data_link::MacAddr; +use crabnet::network::Ipv4Addr; #[downcastable] pub trait NetworkDriver: Send + Sync { @@ -105,10 +104,10 @@ static DEVICES: RwLock>> = RwLock::new(Vec::new()); static DEFAULT_DEVICE: RwLock>> = RwLock::new(None); fn packet_processor_thread() { - use netstack::data_link::{Arp, Eth, EthType}; - use netstack::network::{Ipv4, Ipv4Type}; - use netstack::transport::Udp; - use netstack::PacketParser; + use crabnet::data_link::{Arp, Eth, EthType}; + use crabnet::network::{Ipv4, Ipv4Type}; + use crabnet::transport::{Tcp, Udp}; + use crabnet::PacketParser; let device = default_device(); @@ -123,8 +122,23 @@ fn packet_processor_thread() { let ip = parser.next::(); match ip.protocol() { - Ipv4Type::Udp => udp::do_recv(parser.next::(), parser.payload()), - Ipv4Type::Tcp => todo!(), + Ipv4Type::Udp => { + let udp = parser.next::(); + let size = ip.payload_len() as usize - core::mem::size_of::(); + + let payload = &parser.payload()[..size]; + udp::on_packet(udp, payload); + } + + Ipv4Type::Tcp => { + let tcp = parser.next::(); + let options_size = tcp.options_size() as usize; + let size = ip.payload_len() as usize - core::mem::size_of::(); + + // TODO(andypython): do not ignore TCP options. + let payload = &parser.payload()[options_size..size]; + tcp::on_packet(tcp, payload) + } } } @@ -176,9 +190,9 @@ pub mod shim { use crate::net::{self, arp}; use crate::utils::dma::DmaAllocator; - use netstack::data_link::{Arp, Eth, EthType, MacAddr}; - use netstack::network::Ipv4; - use netstack::{IntoBoxedBytes, Protocol, Stacked}; + use crabnet::data_link::{Arp, Eth, EthType, MacAddr}; + use crabnet::network::Ipv4; + use crabnet::{IntoBoxedBytes, Protocol, Stacked}; pub trait PacketSend { fn send(self); @@ -198,8 +212,7 @@ pub mod shim { eth.dest_mac = addr; device.send(self.into_boxed_bytes_in(DmaAllocator)); } else { - // arp::request_ip(ip, self.clone()); - todo!() + arp::request_ip(ip.dest_ip(), self.into_boxed_bytes_in(DmaAllocator)); } } } diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs index 59a4f497001..ea57b60c778 100644 --- a/src/aero_kernel/src/net/tcp.rs +++ b/src/aero_kernel/src/net/tcp.rs @@ -18,15 +18,28 @@ use alloc::collections::BTreeMap; use alloc::sync::Arc; +use crabnet::transport::Tcp; use spin::RwLock; -static HANDLERS: RwLock>> = RwLock::new(BTreeMap::new()); +use crate::socket::tcp::TcpSocket; + +static HANDLERS: RwLock>> = RwLock::new(BTreeMap::new()); + +pub fn on_packet(tcp: &Tcp, payload: &[u8]) { + let handlers = HANDLERS.read(); + + if let Some(handler) = handlers.get(&tcp.dest_port()) { + handler.on_packet(tcp, payload); + } else { + log::warn!("tcp: no handler registered for port {}", tcp.dest_port()); + } +} pub trait TcpHandler: Send + Sync { - fn recv(&self, packet: &netstack::transport::Tcp); + fn recv(&self, packet: &Tcp, payload: &[u8]); } -pub fn alloc_ephemeral_port(socket: Arc) -> Option { +pub fn alloc_ephemeral_port(socket: Arc) -> Option { const EPHEMERAL_START: u16 = 49152; const EPHEMERAL_END: u16 = u16::MAX; diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs index 9a8cb346bde..f93eef32ef2 100644 --- a/src/aero_kernel/src/net/udp.rs +++ b/src/aero_kernel/src/net/udp.rs @@ -19,10 +19,10 @@ use alloc::collections::BTreeMap; use alloc::sync::Arc; use spin::RwLock; -use netstack::network::Ipv4Addr; -use netstack::transport::Udp; +use crabnet::network::Ipv4Addr; +use crabnet::transport::Udp; -pub fn do_recv(udp: &Udp, payload: &[u8]) { +pub fn on_packet(udp: &Udp, payload: &[u8]) { let dest_port = udp.dst_port(); let handlers = HANDLERS.read(); diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index 987bcb46f24..28f49589a11 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -17,6 +17,7 @@ pub mod ipv4; pub mod tcp; +// pub mod tcp2; pub mod udp; pub mod unix; @@ -26,16 +27,21 @@ use aero_syscall::*; use crate::mem::paging::VirtAddr; #[derive(Debug)] -pub enum SocketAddr<'a> { +pub enum SocketAddr { + Inet(SocketAddrInet), +} + +#[derive(Debug)] +pub enum SocketAddrRef<'a> { Unix(&'a SocketAddrUnix), INet(&'a SocketAddrInet), } -impl<'a> SocketAddr<'a> { +impl<'a> SocketAddrRef<'a> { pub fn from_family(address: VirtAddr, family: u32) -> Result { match family { - AF_UNIX => Ok(SocketAddr::Unix(address.read_mut::()?)), - AF_INET => Ok(SocketAddr::INet(address.read_mut::()?)), + AF_UNIX => Ok(SocketAddrRef::Unix(address.read_mut::()?)), + AF_INET => Ok(SocketAddrRef::INet(address.read_mut::()?)), _ => Err(SyscallError::EINVAL), } @@ -44,7 +50,7 @@ impl<'a> SocketAddr<'a> { pub fn from_ifreq(ifreq: &IfReq) -> Result { // SAFETY??? let family = unsafe { ifreq.data.addr.sa_family }; - SocketAddr::from_family( + SocketAddrRef::from_family( VirtAddr::new(&unsafe { ifreq.data.addr } as *const _ as _), family, ) @@ -54,14 +60,14 @@ impl<'a> SocketAddr<'a> { /// the address is not a unix socket address. pub fn as_unix(&self) -> Option<&'a SocketAddrUnix> { match self { - SocketAddr::Unix(address) => Some(address), + SocketAddrRef::Unix(address) => Some(address), _ => None, } } pub fn as_inet(&self) -> Option<&'a SocketAddrInet> { match self { - SocketAddr::INet(addr) => Some(addr), + SocketAddrRef::INet(addr) => Some(addr), _ => None, } } diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 0c052914934..0af5ce56e24 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -1,289 +1,250 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. -// -// This file is part of The Aero Project. -// -// Aero is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Aero is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Aero. If not, see . - +use aero_syscall::socket::{MessageFlags, MessageHeader}; +use aero_syscall::{InAddr, OpenFlags, SocketAddrInet, AF_INET}; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; -use netstack::data_link::MacAddr; + use spin::Once; -use crate::fs::cache::DirCacheItem; +use crabnet::data_link::{Eth, EthType, MacAddr}; +use crabnet::transport::Tcp; +use crabnet_tcp::{Address, Error as TcpError, State}; + use crate::fs::file_table::FileHandle; -use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags}; +use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags, PollTable}; use crate::fs::{self, FileSystemError}; -use crate::net::tcp::{self, TcpHandler}; +use crate::net; +use crate::net::shim::PacketSend; +use crate::net::{tcp, NetworkDevice}; use crate::utils::sync::{Mutex, WaitQueue}; -use netstack::data_link::Eth; -use netstack::network::{Ipv4, Ipv4Addr}; -use netstack::transport::{Tcp, TcpFlags}; -use netstack::Stacked; +// ./aero.py -- -netdev user,id=mynet0 -device e1000,netdev=mynet0,id=ck_nic0 -object +// filter-dump,id=mynet0,netdev=mynet0,file=qemulog.log -/// TCP Stream -#[derive(Default)] -struct Stream { - buffer: Vec, -} +struct DeviceShim(Arc); -impl Stream { - fn write(&mut self, buffer: &[u8]) { - self.buffer.extend_from_slice(buffer); - } +impl crabnet_tcp::NetworkDevice for DeviceShim { + fn send( + &self, + ipv4: crabnet::network::Ipv4, + tcp: Tcp, + payload: &[u8], + _handle: crabnet_tcp::RetransmitHandle, + ) { + // TODO(andypython): Handle TCP retransmission here. - fn read(&mut self, buffer: &mut [u8]) -> usize { - let size = buffer.len().min(self.buffer.len()); - let target = self.buffer.drain(..size).collect::>(); + let eth = Eth::new(MacAddr::NULL, self.0.mac(), EthType::Ip); + let ipv4 = ipv4.set_src_ip(self.0.ip()); - buffer[..size].copy_from_slice(target.as_slice()); - size + (eth / ipv4 / tcp / payload).send(); } - fn is_empty(&self) -> bool { - self.buffer.is_empty() + fn remove_retransmit(&self, _seq_number: u32) { + // TODO(andypython): Handle TCP retransmission here. } } -#[derive(Default)] -struct TransmissionControl { - /// Sequence number of the next byte to be sent. - send_next: u32, - recv_next: u32, -} - -#[derive(Default, PartialEq, Eq, Debug)] -enum State { - #[default] - Closed, - SynSent, - Established, -} - -#[derive(Default)] -struct TcpData { - control: TransmissionControl, - state: State, - - src_port: u16, - dest_port: u16, - target: Ipv4Addr, - - stream: Stream, +pub struct TcpSocket { + tcp: Mutex>>, + wq: WaitQueue, + handle: Once>, + sref: Weak, + peer: Once, } -impl TcpData { - fn make_layer(&self, flags: TcpFlags) -> Tcp { - Tcp::new(self.src_port, self.dest_port) - .set_sequence_number(self.control.send_next) - .set_window(u16::MAX) - .set_flags(flags) +impl TcpSocket { + pub fn new() -> Arc { + Arc::new_cyclic(|sref| Self { + tcp: Mutex::new(None), + wq: WaitQueue::new(), + sref: sref.clone(), + handle: Once::new(), + peer: Once::new(), + }) } - fn make_ack_packet(&self) -> Tcp { - self.make_layer(TcpFlags::empty()) - .set_ack_number(self.control.recv_next) + pub fn on_packet(&self, tcp: &Tcp, payload: &[u8]) { + if let Some(socket) = self.tcp.lock_irq().as_mut() { + socket.on_packet(tcp, payload); + self.wq.notify_all(); + } } - fn send_packet(&mut self, tcp: Tcp, payload: &[u8]) { - use crate::net::shim::PacketSend; + fn sref(&self) -> Arc { + self.sref.upgrade().unwrap() + } - use netstack::data_link::{Eth, EthType}; - use netstack::network::{Ipv4, Ipv4Type}; + /// Returns whether the socket is in non-blocking mode. + pub fn non_blocking(&self) -> bool { + self.handle + .get() + .map(|handle| handle.flags.read().contains(OpenFlags::O_NONBLOCK)) + .unwrap_or_default() + } - let eth = Eth::new(MacAddr::NULL, MacAddr::NULL, EthType::Ip); - let ipv4 = Ipv4::new(Ipv4Addr::BROADCAST, Ipv4Addr::BROADCAST, Ipv4Type::Tcp); - let packet = eth / ipv4 / tcp / payload; + pub fn do_recv(&self, buf: &mut [u8]) -> Result { + let mut tcp = self.tcp.lock_irq(); + let socket = tcp.as_mut().ok_or(FileSystemError::NotConnected)?; - self.control.send_next = self.control.send_next.wrapping_add(packet.ack_len()); - packet.send(); - } + match socket.recv(buf) { + Ok(bytes_read) => Ok(bytes_read), - fn send_sync(&mut self) { - self.send_packet(self.make_layer(TcpFlags::SYN), &[]); - self.state = State::SynSent; - } + Err(TcpError::WouldBlock) if self.non_blocking() => Err(FileSystemError::WouldBlock), + Err(TcpError::WouldBlock) => { + drop(tcp); - fn recv(&mut self, packet: &Tcp, payload: &[u8]) { - match self.state { - State::SynSent => { - assert!(packet.flags().contains(TcpFlags::ACK | TcpFlags::SYN)); - self.state = State::Established; - } + let mut socket = self.wq.block_on(&self.tcp, |tcp| { + tcp.as_ref() + .map(|socket| !socket.recv_queue.is_empty()) + .unwrap_or(true) + })?; - State::Established => { - if !payload.is_empty() { - self.stream.write(payload); - } else if packet.flags().contains(TcpFlags::FIN) { - todo!() + if let Some(socket) = socket.as_mut() { + Ok(socket.recv(buf).unwrap()) } else { - log::trace!("[ TCP ] Connection Established!"); - return; + Err(FileSystemError::NotConnected) } } - State::Closed => unreachable!(), + Err(err) => unreachable!("{err:?}"), } + } + + pub fn send(&self, buf: &[u8]) -> Result { + let mut tcp = self.tcp.lock_irq(); + let socket = tcp.as_mut().ok_or(FileSystemError::NotConnected)?; - // self.control.recv_next = packet.sequence_number().wrapping_add(packet.ack_len()); - todo!() - // self.send_packet(self.make_ack_packet(), &[]); + let bytes_written = socket.send(buf).unwrap(); + Ok(bytes_written) } } -pub struct TcpSocket { - sref: Weak, - data: Mutex, - handle: Once>, - wq: WaitQueue, -} +impl INodeInterface for TcpSocket { + fn connect(&self, address: super::SocketAddrRef, _length: usize) -> crate::fs::Result<()> { + { + let mut tcp = self.tcp.lock_irq(); + assert!(tcp.is_none(), "connect: socket is already initialized"); -impl TcpSocket { - const MAX_MTU: usize = 1460; + let port = tcp::alloc_ephemeral_port(self.sref()).unwrap(); - pub fn new() -> Arc { - Arc::new_cyclic(|sref| Self { - handle: Once::new(), - sref: sref.clone(), - data: Mutex::new(TcpData::default()), - wq: WaitQueue::new(), - }) - } + let addr = address.as_inet().ok_or(FileSystemError::NotSupported)?; + self.peer.call_once(|| addr.clone()); - fn sref(&self) -> Arc { - self.sref.upgrade().unwrap() - } -} + let addr = Address::new(port, addr.port(), addr.addr().into()); -impl INodeInterface for TcpSocket { - fn metadata(&self) -> fs::Result { - Ok(Metadata { - id: 0, - file_type: FileType::Socket, - size: 0, - children_len: 0, - }) + let device = Arc::new(DeviceShim(net::default_device())); + let socket = crabnet_tcp::Socket::connect(device, addr); + + *tcp = Some(socket); + } + + let _ = self.wq.block_on(&self.tcp, |x| { + x.as_ref().unwrap().state() == State::Established + }); + + Ok(()) } fn open( &self, _flags: aero_syscall::OpenFlags, handle: Arc, - ) -> fs::Result> { + ) -> fs::Result> { self.handle.call_once(|| handle); Ok(None) } - fn bind(&self, _address: super::SocketAddr, _length: usize) -> fs::Result<()> { - todo!() + #[inline] + fn metadata(&self) -> Result { + Ok(Metadata::with_file_type(FileType::Socket)) } - fn connect(&self, address: super::SocketAddr, _length: usize) -> fs::Result<()> { - let address = address.as_inet().ok_or(FileSystemError::NotSupported)?; - let port = tcp::alloc_ephemeral_port(self.sref()).unwrap(); - - let mut inner = self.data.lock_irq(); - inner.src_port = port; - inner.dest_port = address.port(); - inner.target = Ipv4Addr::new(address.addr()); + #[inline] + fn read_at(&self, _offset: usize, buf: &mut [u8]) -> Result { + self.do_recv(buf) + } - inner.send_sync(); - Ok(()) + #[inline] + fn write_at(&self, _offset: usize, buf: &[u8]) -> Result { + self.send(buf) } - fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { - let mut data = self - .wq - .block_on(&self.data, |e| e.state == State::Established)?; + fn send(&self, message_hdr: &mut MessageHeader, _flags: MessageFlags) -> fs::Result { + let data = message_hdr + .iovecs() + .iter() + .flat_map(|e| e.as_slice()) + .copied() + .collect::>(); + + let mut tcp = self.tcp.lock_irq(); + let socket = tcp.as_mut().ok_or(FileSystemError::NotSupported)?; + + // TODO: handle fragmentation in crabnet_tcp + for chunk in data.chunks(1460) { + socket.send(chunk).expect("failed to send data"); + } + + // -netdev user,id=mynet0,net=192.168.1.0/24,dhcpstart=192.168.1.128,hostfwd=tcp::4444-:80 + // -device e1000,netdev=mynet0,id=ck_nic0 -object + // filter-dump,id=mynet0,netdev=user,file=qemulog.log + + Ok(data.len()) + } - assert!(!data.stream.is_empty()); - Ok(data.stream.read(buffer)) + fn get_peername(&self) -> fs::Result { + if let Some(peer) = self.peer.get() { + let addr = super::SocketAddr::Inet(peer.clone()); + Ok(addr) + } else { + Err(FileSystemError::NotConnected) + } } - fn recv( - &self, - message_hdr: &mut aero_syscall::socket::MessageHeader, - _flags: aero_syscall::socket::MessageFlags, - ) -> fs::Result { - let mut data = self.data.lock_irq(); - assert!(!data.stream.is_empty()); + fn get_sockname(&self) -> fs::Result { + if let Some(socket) = self.tcp.lock().as_mut() { + // FIXME: + let addr = SocketAddrInet { + family: AF_INET, + port: socket.addr.src_port.into(), + sin_addr: InAddr { addr: 0 }, + padding: [0; 8], + }; + Ok(super::SocketAddr::Inet(addr)) + } else { + Err(FileSystemError::NotConnected) + } + } + + fn recv(&self, message_hdr: &mut MessageHeader, _flags: MessageFlags) -> fs::Result { Ok(message_hdr .iovecs_mut() .iter_mut() .map(|iovec| { let iovec = iovec.as_slice_mut(); - data.stream.read(iovec) + self.do_recv(iovec).unwrap() }) .sum::()) } - fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { - let mut data = self - .wq - .block_on(&self.data, |e| e.state == State::Established)?; - - for chunk in buffer.chunks(Self::MAX_MTU) { - let mut packet = data.make_ack_packet(); - data.send_packet(packet, chunk); - } - - Ok(buffer.len()) - } - - fn send( - &self, - message_hdr: &mut aero_syscall::socket::MessageHeader, - _flags: aero_syscall::socket::MessageFlags, - ) -> fs::Result { - let data = message_hdr - .iovecs() - .iter() - .flat_map(|e| e.as_slice()) - .copied() - .collect::>(); - - let mut inner = self.data.lock_irq(); - - for chunk in data.chunks(Self::MAX_MTU) { - let mut packet = inner.make_ack_packet(); - inner.send_packet(packet, chunk); + fn poll(&self, table: Option<&mut PollTable>) -> fs::Result { + if let Some(table) = table { + table.insert(&self.wq); } - Ok(data.len()) - } - - fn poll(&self, _table: Option<&mut fs::inode::PollTable>) -> fs::Result { let mut flags = PollFlags::empty(); - let data = self.data.lock_irq(); + let mut tcp = self.tcp.lock_irq(); - if data.state == State::Closed { - return Ok(flags); - } + if let Some(socket) = tcp.as_mut() { + assert_ne!(socket.state(), State::Closed); - flags |= PollFlags::OUT; + flags |= PollFlags::OUT; - if !data.stream.is_empty() { - flags |= PollFlags::IN; + if !socket.recv_queue.is_empty() { + flags |= PollFlags::IN; + } } Ok(flags) } } - -impl TcpHandler for TcpSocket { - fn recv(&self, packet: &Tcp) { - self.data.lock_irq().recv(packet, &[]); - } -} diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index 4e42472ed23..27e98af35c4 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -32,11 +32,11 @@ use crate::net::udp::{self, UdpHandler}; use crate::net::{self}; use crate::utils::sync::{Mutex, WaitQueue}; -use super::SocketAddr; +use super::SocketAddrRef; -use netstack::data_link::{Eth, EthType, MacAddr}; -use netstack::network::{Ipv4, Ipv4Addr, Ipv4Type}; -use netstack::transport::Udp; +use crabnet::data_link::{Eth, EthType, MacAddr}; +use crabnet::network::{Ipv4, Ipv4Addr, Ipv4Type}; +use crabnet::transport::Udp; #[derive(Default)] enum SocketState { @@ -129,7 +129,7 @@ impl INodeInterface for UdpSocket { }) } - fn bind(&self, address: super::SocketAddr, _length: usize) -> fs::Result<()> { + fn bind(&self, address: super::SocketAddrRef, _length: usize) -> fs::Result<()> { let address = address.as_inet().ok_or(FileSystemError::NotSupported)?; self.set_addr(address.clone()); @@ -137,7 +137,7 @@ impl INodeInterface for UdpSocket { Ok(()) } - fn connect(&self, address: super::SocketAddr, _length: usize) -> fs::Result<()> { + fn connect(&self, address: super::SocketAddrRef, _length: usize) -> fs::Result<()> { let address = address.as_inet().ok_or(FileSystemError::NotSupported)?; let host_addr = Ipv4Addr::new(address.sin_addr.addr.to_be_bytes()); @@ -234,7 +234,7 @@ impl INodeInterface for UdpSocket { SIOCSIFADDR => { let ifreq = unsafe { UserRef::::new(VirtAddr::new(arg as _)) }; - let socket = SocketAddr::from_ifreq(&ifreq) + let socket = SocketAddrRef::from_ifreq(&ifreq) .map_err(|_| FileSystemError::NotSupported)? .as_inet() .ok_or(FileSystemError::NotSupported)?; @@ -251,7 +251,7 @@ impl INodeInterface for UdpSocket { SIOCSIFNETMASK => { let ifreq = unsafe { UserRef::::new(VirtAddr::new(arg as _)) }; - let socket = SocketAddr::from_ifreq(&ifreq) + let socket = SocketAddrRef::from_ifreq(&ifreq) .map_err(|_| FileSystemError::NotSupported)? .as_inet() .ok_or(FileSystemError::NotSupported)?; diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 2e860279590..03ca06b7594 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -35,7 +35,7 @@ use crate::fs::{FileSystemError, Path}; use crate::mem::paging::VirtAddr; use crate::utils::sync::{Mutex, WaitQueue}; -use super::SocketAddr; +use super::SocketAddrRef; fn path_from_unix_sock(address: &SocketAddrUnix) -> fs::Result<&Path> { // The abstract namespace socket allows the creation of a socket @@ -301,7 +301,7 @@ impl INodeInterface for UnixSocket { } } - fn bind(&self, address: SocketAddr, _length: usize) -> fs::Result<()> { + fn bind(&self, address: SocketAddrRef, _length: usize) -> fs::Result<()> { let address = address.as_unix().ok_or(FileSystemError::NotSupported)?; let path = path_from_unix_sock(address)?; @@ -318,7 +318,7 @@ impl INodeInterface for UnixSocket { Ok(()) } - fn connect(&self, address: SocketAddr, _length: usize) -> fs::Result<()> { + fn connect(&self, address: SocketAddrRef, _length: usize) -> fs::Result<()> { let address = address.as_unix().ok_or(FileSystemError::NotSupported)?; let path = path_from_unix_sock(address)?; let socket = fs::lookup_path(path)?; diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 40cd9190f37..7c1941b6a26 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -16,61 +16,6 @@ // along with Aero. If not, see . //! System Calls are used to call a kernel service from userland. -//! -//! | %rax | Name | -//! |--------|-------------------------| -//! | 0 | read | -//! | 1 | write | -//! | 2 | open | -//! | 3 | close | -//! | 4 | shutdown | -//! | 5 | exit | -//! | 6 | fork | -//! | 7 | reboot | -//! | 8 | mmap | -//! | 9 | munmap | -//! | 10 | arch_prctl | -//! | 11 | get_dents | -//! | 12 | get_cwd | -//! | 13 | chdir | -//! | 14 | mkdir | -//! | 15 | mkdirat | -//! | 16 | rmdir | -//! | 17 | exec | -//! | 18 | log | -//! | 19 | uname | -//! | 20 | waitpid | -//! | 21 | ioctl | -//! | 22 | getpid | -//! | 23 | socket | -//! | 24 | connect | -//! | 25 | bind | -//! | 26 | listen | -//! | 27 | accept | -//! | 28 | seek | -//! | 29 | gettid | -//! | 30 | gettime | -//! | 31 | sleep | -//! | 32 | access | -//! | 33 | pipe | -//! | 34 | unlink | -//! | 35 | gethostname | -//! | 36 | sethostname | -//! | 37 | info | -//! | 38 | clone | -//! | 39 | sigreturn | -//! | 40 | sigaction | -//! | 41 | sigprocmask | -//! | 42 | dup | -//! | 43 | fcntl | -//! | 44 | dup2 | -//! | 45 | ipc_send | -//! | 46 | ipc_recv | -//! | 47 | ipc_discover_root | -//! | 48 | ipc_become_root | -//! | 49 | stat | -//! | 50 | fstat | -//! | 51 | read_link | use core::mem::MaybeUninit; @@ -290,6 +235,8 @@ pub fn generic_do_syscall( SYS_SOCK_SEND => net::sock_send(b, c, d), SYS_SOCKET_PAIR => net::socket_pair(b, c, d, e), SYS_SOCK_SHUTDOWN => net::shutdown(b, c), + SYS_GETPEERNAME => net::get_peername(b, c, d), + SYS_GETSOCKNAME => net::get_sockname(b, c, d), SYS_GETTIME => time::gettime(b, c), SYS_SLEEP => time::sleep(b), diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index b16a4e9360a..0433281f569 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -1,9 +1,9 @@ -use aero_syscall::socket::MessageFlags; -use num_traits::cast::FromPrimitive; - -use aero_syscall::socket::MessageHeader; +use aero_syscall::socket::{MessageFlags, MessageHeader}; use aero_syscall::*; use alloc::sync::Arc; +use num_traits::cast::FromPrimitive; + +use crate::arch::user_copy::UserRef; use crate::fs::cache::DirCacheItem; use crate::fs::inode::{DirEntry, INodeInterface}; @@ -13,15 +13,15 @@ use crate::socket::ipv4::Ipv4Socket; use crate::socket::tcp::TcpSocket; use crate::socket::udp::UdpSocket; use crate::socket::unix::*; -use crate::socket::SocketAddr; +use crate::socket::{SocketAddr, SocketAddrRef}; use crate::userland::scheduler; /// Creates a [`SocketAddr`] from the provided userland socket structure address. This /// is done by looking at the family field present in every socket address structure. -fn socket_addr_from_addr<'sys>(address: VirtAddr) -> Result, SyscallError> { +fn socket_addr_from_addr<'sys>(address: VirtAddr) -> Result, SyscallError> { let family = *address.read_mut::()?; - SocketAddr::from_family(address, family) + SocketAddrRef::from_family(address, family) } #[syscall] @@ -194,6 +194,65 @@ pub fn bind(fd: usize, address: usize, length: usize) -> Result Result { + let thread = scheduler::current_thread(); + let file = thread + .file_table + .get_handle(fd) + .ok_or(SyscallError::ENOENT)?; + + let inode = file.inode(); + if !inode.metadata()?.is_socket() { + return Err(SyscallError::ENOTSOCK); + } + + let peer = inode.get_peername()?; + + match peer { + SocketAddr::Inet(peer) => { + let size = core::mem::size_of::() as u32; + assert!(*len >= size); + + let mut target = unsafe { UserRef::::new(VirtAddr::new(addr as u64)) }; + *target = peer; + *len = size; + } + } + + Ok(0) +} + +#[syscall] +pub fn get_sockname(fd: usize, addr: usize, len: &mut u32) -> Result { + let thread = scheduler::current_thread(); + let file = thread + .file_table + .get_handle(fd) + .ok_or(SyscallError::ENOENT)?; + + let inode = file.inode(); + if !inode.metadata()?.is_socket() { + return Err(SyscallError::ENOTSOCK); + } + + let name = inode.get_sockname()?; + + match name { + SocketAddr::Inet(name) => { + let size = core::mem::size_of::() as u32; + assert!(*len >= size); + + let mut target = unsafe { UserRef::::new(VirtAddr::new(addr as u64)) }; + *target = name; + *len = size; + } + } + + Ok(0) +} + /// Create an unbound pair of connected sockets in a specified domain, of a /// specified type, under the protocol optionally specified by the protocol /// argument. The two sockets shall be identical. The file descriptors used diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index 2ba14f4e259..c9272b551a6 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -153,6 +153,11 @@ pub fn get_scheduler() -> &'static Scheduler { .expect("Attempted to get the scheduler before it was initialized") } +#[inline] +pub fn current_thread() -> Arc { + get_scheduler().current_task() +} + /// Returns true if the task scheduler has been initiaized. pub fn is_initialized() -> bool { SCHEDULER.get().is_some() diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 036420483d1..cdffd395147 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -96,6 +96,8 @@ pub const SYS_SETPGID: usize = 72; pub const SYS_SETSID: usize = 73; pub const SYS_GETPGID: usize = 74; pub const SYS_SOCK_SHUTDOWN: usize = 75; +pub const SYS_GETPEERNAME: usize = 76; +pub const SYS_GETSOCKNAME: usize = 77; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; From c63e0369ae36578de94c3fb416d880c8aa8c74dd Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 29 Sep 2023 19:23:04 +1000 Subject: [PATCH 257/368] fix(kernel): fix panic handler function signature The panic handler needs to be an extern "Rust" function not a extern "C" function. This commit fixes that by making the panic handler a normal function. Signed-off-by: Anhad Singh --- src/aero_kernel/src/unwind.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index a6d59abc1a7..855caa37268 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -160,7 +160,7 @@ use crate::emu; use crate::utils::sync::IrqGuard; #[panic_handler] -extern "C" fn rust_begin_unwind(info: &PanicInfo) -> ! { +fn rust_begin_unwind(info: &PanicInfo) -> ! { prepare_panic(); let default_panic = &format_args!(""); From f7cd1a06957418bce8f35364e42d01d27658f5f7 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 29 Sep 2023 20:02:35 +1000 Subject: [PATCH 258/368] feat(kernel): bump `crabnet` and `crabnet_tcp` * Bump `crabnet` and `crabnet_tcp` * No longer ignore the TCP options and pass them to `on_packet` on the respective TCP socket. Signed-off-by: Anhad Singh --- src/Cargo.lock | 4 ++-- src/aero_kernel/Cargo.toml | 2 ++ src/aero_kernel/src/net/mod.rs | 30 ++++++++++++++++++++++++----- src/aero_kernel/src/net/tcp.rs | 6 +++--- src/aero_kernel/src/socket/tcp.rs | 32 ++++++++++++++++--------------- 5 files changed, 49 insertions(+), 25 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index d873aefc2c5..cae1db1890e 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -139,7 +139,7 @@ dependencies = [ [[package]] name = "crabnet" version = "0.1.0" -source = "git+https://github.com/aero-os/crabnet#4e9e10290136ab34b2b73bd7ce81803c2303674c" +source = "git+https://github.com/aero-os/crabnet#95894c3885b6b3b50942488075631f087cfa9d75" dependencies = [ "bit_field", "bitflags 2.4.0", @@ -150,7 +150,7 @@ dependencies = [ [[package]] name = "crabnet_tcp" version = "0.1.0" -source = "git+https://github.com/aero-os/crabnet#4e9e10290136ab34b2b73bd7ce81803c2303674c" +source = "git+https://github.com/aero-os/crabnet#95894c3885b6b3b50942488075631f087cfa9d75" dependencies = [ "crabnet", "log", diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index f1f9cac37a2..ae6589737e2 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -50,6 +50,8 @@ vte = { git = "https://github.com/alacritty/vte", features = ["ansi"] } byte_endian = { git = "https://github.com/aero-os/byte_endian" } crabnet = { git = "https://github.com/aero-os/crabnet" } crabnet_tcp = { git = "https://github.com/aero-os/crabnet", default-features = false } +# crabnet = { path = "../../../orgs/aero/crabnet" } +# crabnet_tcp = { path = "../../../orgs/aero/crabnet/crabnet_tcp", default-features = false } # X86_64 specific dependencies: [target.'cfg(target_arch = "x86_64")'.dependencies] diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 43829ff30aa..3a2f4767948 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -18,6 +18,7 @@ use alloc::boxed::Box; use alloc::sync::Arc; use alloc::vec::Vec; +use crabnet::transport::TcpOptions; use spin::RwLock; pub mod arp; @@ -132,12 +133,11 @@ fn packet_processor_thread() { Ipv4Type::Tcp => { let tcp = parser.next::(); - let options_size = tcp.options_size() as usize; - let size = ip.payload_len() as usize - core::mem::size_of::(); + let size = ip.payload_len() as usize - tcp.header_size() as usize; + let options = parser.next::(); + let payload = &parser.payload()[..size]; - // TODO(andypython): do not ignore TCP options. - let payload = &parser.payload()[options_size..size]; - tcp::on_packet(tcp, payload) + tcp::on_packet(tcp, options, payload) } } } @@ -217,6 +217,26 @@ pub mod shim { } } + impl PacketSend + for Stacked, T>, U>, S> + { + fn send(mut self) { + let device = net::default_device(); + + let eth = &mut self.upper.upper.upper.upper; + let ip = &self.upper.upper.upper.lower; + + eth.src_mac = device.mac(); + + if let Some(addr) = arp::get(ip.dest_ip()) { + eth.dest_mac = addr; + device.send(self.into_boxed_bytes_in(DmaAllocator)); + } else { + arp::request_ip(ip.dest_ip(), self.into_boxed_bytes_in(DmaAllocator)); + } + } + } + impl PacketSend for Arp { fn send(self) { let device = net::default_device(); diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs index ea57b60c778..cdef80717d9 100644 --- a/src/aero_kernel/src/net/tcp.rs +++ b/src/aero_kernel/src/net/tcp.rs @@ -18,18 +18,18 @@ use alloc::collections::BTreeMap; use alloc::sync::Arc; -use crabnet::transport::Tcp; +use crabnet::transport::{Tcp, TcpOptions}; use spin::RwLock; use crate::socket::tcp::TcpSocket; static HANDLERS: RwLock>> = RwLock::new(BTreeMap::new()); -pub fn on_packet(tcp: &Tcp, payload: &[u8]) { +pub fn on_packet(tcp: &Tcp, options: TcpOptions, payload: &[u8]) { let handlers = HANDLERS.read(); if let Some(handler) = handlers.get(&tcp.dest_port()) { - handler.on_packet(tcp, payload); + handler.on_packet(tcp, options, payload); } else { log::warn!("tcp: no handler registered for port {}", tcp.dest_port()); } diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 0af5ce56e24..849d8680032 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -3,11 +3,12 @@ use aero_syscall::{InAddr, OpenFlags, SocketAddrInet, AF_INET}; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; +use crabnet::network::Ipv4Addr; use spin::Once; use crabnet::data_link::{Eth, EthType, MacAddr}; -use crabnet::transport::Tcp; -use crabnet_tcp::{Address, Error as TcpError, State}; +use crabnet::transport::{Tcp, TcpOptions}; +use crabnet_tcp::{Address, Error as TcpError, Packet as TcpPacket, State}; use crate::fs::file_table::FileHandle; use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags, PollTable}; @@ -23,19 +24,14 @@ use crate::utils::sync::{Mutex, WaitQueue}; struct DeviceShim(Arc); impl crabnet_tcp::NetworkDevice for DeviceShim { - fn send( - &self, - ipv4: crabnet::network::Ipv4, - tcp: Tcp, - payload: &[u8], - _handle: crabnet_tcp::RetransmitHandle, - ) { - // TODO(andypython): Handle TCP retransmission here. + fn ip(&self) -> Ipv4Addr { + self.0.ip() + } + fn send(&self, packet: TcpPacket, _handle: crabnet_tcp::RetransmitHandle) { + // TODO(andypython): Handle TCP retransmission here. let eth = Eth::new(MacAddr::NULL, self.0.mac(), EthType::Ip); - let ipv4 = ipv4.set_src_ip(self.0.ip()); - - (eth / ipv4 / tcp / payload).send(); + (eth / packet.ip / packet.tcp / packet.options / packet.payload).send(); } fn remove_retransmit(&self, _seq_number: u32) { @@ -62,9 +58,15 @@ impl TcpSocket { }) } - pub fn on_packet(&self, tcp: &Tcp, payload: &[u8]) { + pub fn on_packet(&self, tcp: &Tcp, options: TcpOptions, payload: &[u8]) { if let Some(socket) = self.tcp.lock_irq().as_mut() { - socket.on_packet(tcp, payload); + // Ignore any invalid TCP options. + let options = options + .iter() + .filter_map(|option| option.ok()) + .collect::>(); + + socket.on_packet(tcp, &options, payload); self.wq.notify_all(); } } From e9077a0621195c01de0812cac122d5f170006289 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 29 Sep 2023 20:59:04 +1000 Subject: [PATCH 259/368] misc(kernel): bump dependencies * Bump dependencies * Remove `cfg_if` since now we have the `cfg_match` macro in `core` :) Signed-off-by: Anhad Singh --- src/Cargo.lock | 49 +++++++++++++++--------------- src/aero_kernel/Cargo.toml | 11 +++---- src/aero_kernel/src/drivers/mod.rs | 8 +++-- src/aero_kernel/src/main.rs | 1 + 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index cae1db1890e..14e7f194731 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -12,11 +12,10 @@ dependencies = [ "bitflags 1.3.2", "byte_endian", "bytemuck", - "cfg-if", "cpio_reader", "crabnet", "crabnet_tcp", - "hashbrown 0.14.0", + "hashbrown", "intrusive-collections", "lai", "lazy_static", @@ -109,9 +108,9 @@ source = "git+https://github.com/aero-os/byte_endian#540be6149cd9408088a9e45be2d [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" [[package]] name = "cc" @@ -139,7 +138,7 @@ dependencies = [ [[package]] name = "crabnet" version = "0.1.0" -source = "git+https://github.com/aero-os/crabnet#95894c3885b6b3b50942488075631f087cfa9d75" +source = "git+https://github.com/aero-os/crabnet#a46a02f9f650cbe8d7436b322f924510e5bda9f7" dependencies = [ "bit_field", "bitflags 2.4.0", @@ -150,7 +149,7 @@ dependencies = [ [[package]] name = "crabnet_tcp" version = "0.1.0" -source = "git+https://github.com/aero-os/crabnet#95894c3885b6b3b50942488075631f087cfa9d75" +source = "git+https://github.com/aero-os/crabnet#a46a02f9f650cbe8d7436b322f924510e5bda9f7" dependencies = [ "crabnet", "log", @@ -200,25 +199,22 @@ dependencies = [ ] [[package]] -name = "either" -version = "1.9.0" +name = "cursor-icon" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "740bb192a8e2d1350119916954f4409ee7f62f149b536911eeb78ba5a20526bf" [[package]] -name = "hashbrown" -version = "0.13.2" +name = "either" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" dependencies = [ "ahash", "allocator-api2", @@ -282,11 +278,11 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "lru" -version = "0.10.1" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" +checksum = "a4a83fb7698b3643a0e34f9ae6f2e8f0178c0fd42f8b59d493aa271ff3a5bf21" dependencies = [ - "hashbrown 0.13.2", + "hashbrown", ] [[package]] @@ -493,7 +489,8 @@ checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "utf8parse" version = "0.2.1" -source = "git+https://github.com/alacritty/vte#94e74f3a64f42d5dad4e3d42dbe8c23291038214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "version_check" @@ -503,10 +500,13 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vte" -version = "0.11.1" -source = "git+https://github.com/alacritty/vte#94e74f3a64f42d5dad4e3d42dbe8c23291038214" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "401dc1020e10f74d38616c1f1ab92ccd85dc902705a29d0730e0fbea8534f91a" dependencies = [ "arrayvec", + "bitflags 2.4.0", + "cursor-icon", "log", "utf8parse", "vte_generate_state_changes", @@ -515,7 +515,8 @@ dependencies = [ [[package]] name = "vte_generate_state_changes" version = "0.1.1" -source = "git+https://github.com/alacritty/vte#94e74f3a64f42d5dad4e3d42dbe8c23291038214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" dependencies = [ "proc-macro2", "quote", diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index ae6589737e2..330b80b8a64 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -30,22 +30,21 @@ bitflags = "1.2.1" bit_field = "0.10.2" log = "0.4.19" xmas-elf = "0.9.0" -hashbrown = "0.14.0" +hashbrown = "0.14.1" rustc-demangle = "0.1.23" # intrusive-collections: # `nightly`: Get access to const variants of the functions. -intrusive-collections = { version = "0.9.5", features = ["nightly"] } +intrusive-collections = { version = "0.9.6", features = ["nightly"] } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } lai = { git = "https://github.com/aero-os/lai-rs" } uapi = { path = "../uapi" } cpio_reader = { git = "https://github.com/Andy-Python-Programmer/cpio_reader" } static_assertions = "1.1.0" -lru = "0.10.0" -bytemuck = "1.13.1" +lru = "0.11.1" +bytemuck = "1.14.0" limine = { git = "https://github.com/limine-bootloader/limine-rs" } -cfg-if = "1.0" num-traits = { version = "0.2", default-features = false } -vte = { git = "https://github.com/alacritty/vte", features = ["ansi"] } +vte = { version = "0.12.0", features = ["ansi"] } byte_endian = { git = "https://github.com/aero-os/byte_endian" } crabnet = { git = "https://github.com/aero-os/crabnet" } diff --git a/src/aero_kernel/src/drivers/mod.rs b/src/aero_kernel/src/drivers/mod.rs index de2dff01226..795bdb8985d 100644 --- a/src/aero_kernel/src/drivers/mod.rs +++ b/src/aero_kernel/src/drivers/mod.rs @@ -33,11 +33,13 @@ pub mod pci; pub mod pty; pub mod tty; -cfg_if::cfg_if! { - if #[cfg(target_arch = "x86_64")] { +cfg_match! { + cfg(target_arch = "x86_64") => { pub mod uart_16550; pub use self::uart_16550 as uart; - } else if #[cfg(target_arch = "aarch64")] { + } + + cfg(target_arch = "aarch64") => { pub mod uart_pl011; pub use self::uart_pl011 as uart; } diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 2e276084404..e0c73d006cd 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -47,6 +47,7 @@ const_ptr_is_null, // https://github.com/rust-lang/rust/issues/74939 trait_upcasting, // https://github.com/rust-lang/rust/issues/65991 naked_functions, // https://github.com/rust-lang/rust/issues/32408 + cfg_match, // https://github.com/rust-lang/rust/issues/115585 strict_provenance )] // TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? From d8c14285b54d4cff2f89f22cc94c6048fb4566eb Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 4 Oct 2023 19:07:24 +1100 Subject: [PATCH 260/368] feat(kernel): make DNS resolution work properly * Add the loopback device * Create the /etc/resolv.conf file, where the entry is the default SLIRP DNS server address. * Add sock_send() for Unix sockets. * On socket(), create the inode with name <{type}_socket> instead of just which makes debugging easier. * Add some assertions that I will deal with later :) Signed-off-by: Anhad Singh --- CONTRIBUTING.md | 4 +- base-files/etc/resolv.conf | 1 + src/Cargo.lock | 99 ++++++++++++++--------------- src/aero_kernel/src/net/arp.rs | 4 ++ src/aero_kernel/src/net/loopback.rs | 60 +++++++++++++++++ src/aero_kernel/src/net/mod.rs | 46 ++++++++++++-- src/aero_kernel/src/net/tcp.rs | 2 + src/aero_kernel/src/net/udp.rs | 1 + src/aero_kernel/src/socket/tcp.rs | 4 ++ src/aero_kernel/src/socket/udp.rs | 20 +++--- src/aero_kernel/src/socket/unix.rs | 12 ++++ src/aero_kernel/src/syscall/net.rs | 15 +++-- 12 files changed, 195 insertions(+), 73 deletions(-) create mode 100644 base-files/etc/resolv.conf create mode 100644 src/aero_kernel/src/net/loopback.rs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 746c0e124a1..1ab51c94ade 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,4 +36,6 @@ $ lldb (lldb) ```` -Check out the docs for your debugger for information about how to use the debugger. \ No newline at end of file +Check out the docs for your debugger for information about how to use the debugger. + +`./aero.py -- -netdev user,id=spider -device e1000,netdev=spider,id=ck_nic0 -object filter-dump,id=spider,netdev=spider,file=qemulog.log` \ No newline at end of file diff --git a/base-files/etc/resolv.conf b/base-files/etc/resolv.conf new file mode 100644 index 00000000000..27a94c07e56 --- /dev/null +++ b/base-files/etc/resolv.conf @@ -0,0 +1 @@ +nameserver 10.0.2.3 diff --git a/src/Cargo.lock b/src/Cargo.lock index 14e7f194731..773f4b49eac 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -41,7 +41,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -114,9 +114,9 @@ checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" [[package]] name = "cc" -version = "1.0.81" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c6b2562119bf28c3439f7f02db99faf0aa1a8cdfe5772a2ee155d32227239f0" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "libc", ] @@ -138,7 +138,7 @@ dependencies = [ [[package]] name = "crabnet" version = "0.1.0" -source = "git+https://github.com/aero-os/crabnet#a46a02f9f650cbe8d7436b322f924510e5bda9f7" +source = "git+https://github.com/aero-os/crabnet#14fd222842e717c63b695f09790726b209165715" dependencies = [ "bit_field", "bitflags 2.4.0", @@ -149,22 +149,12 @@ dependencies = [ [[package]] name = "crabnet_tcp" version = "0.1.0" -source = "git+https://github.com/aero-os/crabnet#a46a02f9f650cbe8d7436b322f924510e5bda9f7" +source = "git+https://github.com/aero-os/crabnet#14fd222842e717c63b695f09790726b209165715" dependencies = [ "crabnet", "log", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" version = "0.8.3" @@ -220,12 +210,6 @@ dependencies = [ "allocator-api2", ] -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - [[package]] name = "intrusive-collections" version = "0.9.6" @@ -261,9 +245,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.147" +version = "0.2.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" [[package]] name = "limine" @@ -311,7 +295,7 @@ checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -323,16 +307,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "once_cell" version = "1.18.0" @@ -348,7 +322,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -365,18 +339,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.32" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -392,9 +366,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" dependencies = [ "either", "rayon-core", @@ -402,14 +376,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] @@ -432,15 +404,29 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.180" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea67f183f058fe88a4e3ec6e2788e003840893b91bac4559cabedd00863b3ed" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] [[package]] name = "serde_json" -version = "1.0.104" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" dependencies = [ "itoa", "ryu", @@ -476,15 +462,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "uapi" version = "0.1.0" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "utf8parse" diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index a7f77d73e6e..ce804f5a789 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -76,6 +76,10 @@ impl Cache { } fn request(&mut self, ip: Ipv4Addr, packet: RawPacket) { + if ip == Ipv4Addr::LOOPBACK { + panic!() + } + if self.0.get_mut(&ip).is_some() { todo!() } else { diff --git a/src/aero_kernel/src/net/loopback.rs b/src/aero_kernel/src/net/loopback.rs new file mode 100644 index 00000000000..6a43b41b0e7 --- /dev/null +++ b/src/aero_kernel/src/net/loopback.rs @@ -0,0 +1,60 @@ +// Copyright (C) 2021-2023 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + +//! Loopback device. + +use alloc::boxed::Box; +use alloc::sync::Arc; +use crabnet::data_link::MacAddr; +use crabnet::network::Ipv4Addr; + +use crate::utils::dma::DmaAllocator; + +use super::{NetworkDevice, NetworkDriver, RecvPacket}; + +pub struct Loopback; + +impl NetworkDriver for Loopback { + fn send(&self, _packet: Box<[u8], DmaAllocator>) { + todo!() + } + + fn recv(&self) -> RecvPacket { + todo!() + } + + fn recv_end(&self, _packet_id: usize) { + todo!() + } + + #[inline] + fn mac(&self) -> MacAddr { + // TODO: What should this really be? + MacAddr::NULL + } +} + +lazy_static::lazy_static! { + pub static ref LOOPBACK: Arc = (|| { + let device = Arc::new(NetworkDevice::new(Arc::new(Loopback))); + + device.set_ip(Ipv4Addr::LOOPBACK); + device.set_subnet_mask(Ipv4Addr::new(255, 0, 0, 0)); + + device + })(); +} diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 3a2f4767948..1ef19dd290b 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -22,6 +22,7 @@ use crabnet::transport::TcpOptions; use spin::RwLock; pub mod arp; +pub mod loopback; pub mod tcp; pub mod udp; @@ -45,8 +46,12 @@ struct Metadata { ip: Ipv4Addr, #[allow(dead_code)] subnet_mask: Ipv4Addr, + default_gateway: Ipv4Addr, } +// FIXME(andypython): This is very inefficient. We store the driver as an Arc and +// the device with metadata as an Arc. Two heap allocations for nothing, bruh +// moments. pub struct NetworkDevice { driver: Arc, metadata: RwLock, @@ -55,8 +60,15 @@ pub struct NetworkDevice { impl NetworkDevice { pub fn new(driver: Arc) -> Self { // FIXME(andy): DHCPD should handle static IP assignment. - let mut metadata = Metadata::default(); - metadata.ip = Ipv4Addr::new([192, 168, 100, 0]); + // + // https://wiki.qemu.org/Documentation/Networking + let metadata = Metadata { + ip: Ipv4Addr::new(192, 168, 100, 0), + // What should the default be? Also this should really be handled inside dhcpd. + default_gateway: Ipv4Addr::new(10, 0, 2, 2), + subnet_mask: Ipv4Addr::new(255, 255, 255, 0), + ..Default::default() + }; Self { driver, @@ -79,6 +91,11 @@ impl NetworkDevice { pub fn subnet_mask(&self) -> Ipv4Addr { self.metadata.read().subnet_mask } + + #[inline] + pub fn default_gateway(&self) -> Ipv4Addr { + self.metadata.read().default_gateway + } } impl core::ops::Deref for NetworkDevice { @@ -180,6 +197,7 @@ pub fn init() { return; } + DEVICES.write().push(loopback::LOOPBACK.clone()); arp::init(); log::info!("net::arp: initialized cache"); } @@ -199,6 +217,8 @@ pub mod shim { } // Deref for Stacked where T: Stacked? + // + // TODO(andypython): Can all of the packet send impls be refactored? impl PacketSend for Stacked, T>, U> { fn send(mut self) { let device = net::default_device(); @@ -206,13 +226,20 @@ pub mod shim { let eth = &mut self.upper.upper.upper; let ip = &self.upper.upper.lower; + let mut dest_ip = ip.dest_ip(); + + if !dest_ip.is_broadcast() && !dest_ip.is_same_subnet(device.ip(), device.subnet_mask()) + { + dest_ip = device.default_gateway(); + } + eth.src_mac = device.mac(); - if let Some(addr) = arp::get(ip.dest_ip()) { + if let Some(addr) = arp::get(dest_ip) { eth.dest_mac = addr; device.send(self.into_boxed_bytes_in(DmaAllocator)); } else { - arp::request_ip(ip.dest_ip(), self.into_boxed_bytes_in(DmaAllocator)); + arp::request_ip(dest_ip, self.into_boxed_bytes_in(DmaAllocator)); } } } @@ -226,13 +253,20 @@ pub mod shim { let eth = &mut self.upper.upper.upper.upper; let ip = &self.upper.upper.upper.lower; + let mut dest_ip = ip.dest_ip(); + + if !dest_ip.is_broadcast() && !dest_ip.is_same_subnet(device.ip(), device.subnet_mask()) + { + dest_ip = device.default_gateway(); + } + eth.src_mac = device.mac(); - if let Some(addr) = arp::get(ip.dest_ip()) { + if let Some(addr) = arp::get(dest_ip) { eth.dest_mac = addr; device.send(self.into_boxed_bytes_in(DmaAllocator)); } else { - arp::request_ip(ip.dest_ip(), self.into_boxed_bytes_in(DmaAllocator)); + arp::request_ip(dest_ip, self.into_boxed_bytes_in(DmaAllocator)); } } } diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs index cdef80717d9..9ffb6f520cf 100644 --- a/src/aero_kernel/src/net/tcp.rs +++ b/src/aero_kernel/src/net/tcp.rs @@ -53,6 +53,8 @@ pub fn alloc_ephemeral_port(socket: Arc) -> Option { continue; } + log::warn!("[ TCP ] Listening on port {port}"); + handlers.insert(port, socket); return Some(port); } diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs index f93eef32ef2..f90ea9d284c 100644 --- a/src/aero_kernel/src/net/udp.rs +++ b/src/aero_kernel/src/net/udp.rs @@ -54,6 +54,7 @@ pub fn alloc_ephemeral_port(socket: Arc) -> Option { continue; } + log::warn!("[ UDP ] Listening on port {port}"); handlers.insert(port, socket); return Some(port); } diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 849d8680032..34d29602714 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -131,6 +131,10 @@ impl INodeInterface for TcpSocket { let addr = address.as_inet().ok_or(FileSystemError::NotSupported)?; self.peer.call_once(|| addr.clone()); + if addr.addr() == Ipv4Addr::LOOPBACK.0 { + return Err(FileSystemError::NotSupported); + } + let addr = Address::new(port, addr.port(), addr.addr().into()); let device = Arc::new(DeviceShim(net::default_device())); diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index 27e98af35c4..0409073d0bf 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -140,7 +140,7 @@ impl INodeInterface for UdpSocket { fn connect(&self, address: super::SocketAddrRef, _length: usize) -> fs::Result<()> { let address = address.as_inet().ok_or(FileSystemError::NotSupported)?; - let host_addr = Ipv4Addr::new(address.sin_addr.addr.to_be_bytes()); + let host_addr = Ipv4Addr::from(address.sin_addr.addr.to_be_bytes()); udp::connect(host_addr, address.port.to_native()); self.set_state(SocketState::Connected(address.clone())); @@ -154,7 +154,7 @@ impl INodeInterface for UdpSocket { .unwrap_or_else(|| self.dest()); let dest_port = name.port.to_native(); - let dest_ip = Ipv4Addr::new(name.addr()); + let dest_ip = Ipv4Addr::from(name.addr()); let src_port; @@ -165,11 +165,6 @@ impl INodeInterface for UdpSocket { log::debug!("Inet::send(): allocated ephemeral port {}", src_port); } - // FIXME: loopback - if dest_ip == Ipv4Addr::new([127, 0, 0, 1]) { - return Err(FileSystemError::NotSupported); - } - let data = message_hdr .iovecs() .iter() @@ -177,6 +172,13 @@ impl INodeInterface for UdpSocket { .copied() .collect::>(); + // FIXME: loopback + if dest_ip == Ipv4Addr::LOOPBACK { + log::debug!("looback moments :)"); + return Err(FileSystemError::NotSupported); + // return Ok(data.len()); + } + use crate::net::shim::PacketSend; let eth = Eth::new(MacAddr::NULL, MacAddr::NULL, EthType::Ip); @@ -245,7 +247,7 @@ impl INodeInterface for UdpSocket { assert!(name == "eth0"); let device = net::default_device(); - device.set_ip(Ipv4Addr::new(socket.addr())); + device.set_ip(Ipv4Addr::from(socket.addr())); Ok(0) } @@ -262,7 +264,7 @@ impl INodeInterface for UdpSocket { assert!(name == "eth0"); let device = net::default_device(); - device.set_subnet_mask(Ipv4Addr::new(socket.addr())); + device.set_subnet_mask(Ipv4Addr::from(socket.addr())); Ok(0) } diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 03ca06b7594..f8d635e4e4e 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -411,6 +411,18 @@ impl INodeInterface for UnixSocket { .sum::()) } + fn send(&self, message_hdr: &mut MessageHeader, _flags: MessageFlags) -> fs::Result { + // FIXME(andyython): figure out the message header stuff... + let data = message_hdr + .iovecs() + .iter() + .flat_map(|e| e.as_slice()) + .copied() + .collect::>(); + + self.write_at(0, &data) + } + fn poll(&self, table: Option<&mut PollTable>) -> fs::Result { let buffer = self.buffer.lock_irq(); let inner = self.inner.lock_irq(); diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index 0433281f569..4f864f20908 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -127,16 +127,19 @@ fn create_socket( let typ = SocketType::from_usize(socket_type & 0b1111).ok_or(SyscallError::EINVAL)?; let protocol = IpProtocol::from_usize(protocol).ok_or(SyscallError::EINVAL)?; - let socket = match domain as u32 { - AF_UNIX => UnixSocket::new() as Arc, + let (name, socket) = match domain as u32 { + AF_UNIX => ("unix", UnixSocket::new() as Arc), AF_INET => match (typ, protocol) { (SocketType::Dgram, IpProtocol::Default | IpProtocol::Udp) => { - UdpSocket::new() as Arc + ("udp", UdpSocket::new() as Arc) + } + + (SocketType::Dgram, IpProtocol::Raw) => { + ("ipv4", Ipv4Socket::new() as Arc) } - (SocketType::Dgram, IpProtocol::Raw) => Ipv4Socket::new() as Arc, (SocketType::Stream, IpProtocol::Default | IpProtocol::Tcp) => { - TcpSocket::new() as Arc + ("tcp", TcpSocket::new() as Arc) } _ => { @@ -157,7 +160,7 @@ fn create_socket( } }; - let entry = DirEntry::from_inode(socket, String::from("")); + let entry = DirEntry::from_inode(socket, alloc::format!("<{name}_socket>")); Ok(entry) } From c558b7958913e82105066cf36403a16f165200c2 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 6 Oct 2023 17:53:42 +1100 Subject: [PATCH 261/368] misc(kernel): make use of the stabilized div_ceil Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/block/ahci.rs | 4 +-- src/aero_kernel/src/drivers/block/ide/mod.rs | 3 +-- src/aero_kernel/src/drivers/block/nvme/mod.rs | 4 +-- src/aero_kernel/src/fs/ext2/disk.rs | 3 +-- src/aero_kernel/src/fs/ext2/mod.rs | 3 +-- src/aero_kernel/src/syscall/time.rs | 3 +-- src/aero_kernel/src/utils/mod.rs | 27 ------------------- 7 files changed, 8 insertions(+), 39 deletions(-) diff --git a/src/aero_kernel/src/drivers/block/ahci.rs b/src/aero_kernel/src/drivers/block/ahci.rs index d8ac56d497f..bbe5b67c291 100644 --- a/src/aero_kernel/src/drivers/block/ahci.rs +++ b/src/aero_kernel/src/drivers/block/ahci.rs @@ -25,7 +25,7 @@ use crate::mem::paging::*; use crate::mem::AddressSpace; use crate::utils::sync::Mutex; -use crate::utils::{CeilDiv, VolatileCell}; +use crate::utils::VolatileCell; use crate::drivers::pci::*; @@ -201,7 +201,7 @@ pub struct DmaBuffer { impl DmaBuffer { pub fn sectors(&self) -> usize { - self.data_size.ceil_div(512) + self.data_size.div_ceil(512) } pub fn start(&self) -> PhysAddr { diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index 16ea8ef7bc8..688172d8909 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -32,7 +32,6 @@ use crate::fs::block::{BlockDevice, BlockDeviceInterface}; use crate::mem::paging::OffsetPageTable; use crate::utils::sync::Mutex; -use crate::utils::CeilDiv; use super::ahci::DmaRequest; @@ -51,7 +50,7 @@ impl IdeDrive { impl BlockDeviceInterface for IdeDrive { fn read_block(&self, sector: usize, dest: &mut [MaybeUninit]) -> Option { - let count = dest.len().ceil_div(512); + let count = dest.len().div_ceil(512); let request = Arc::new(DmaRequest::new(sector, count)); let res = self.channel.run_request(request, self.slave); diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 48c69103f12..706776e5149 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -35,7 +35,7 @@ use crate::mem::paging::*; use crate::utils::dma::*; use crate::utils::sync::BMutex; -use crate::utils::{CeilDiv, VolatileCell}; +use crate::utils::VolatileCell; #[derive(Copy, Clone, Debug)] enum Error { @@ -231,7 +231,7 @@ impl<'a> Namespace<'a> { fn rw_command(&self, opcode: CommandOpcode, sector: usize, start: PhysAddr, size_bytes: usize) { assert!(size_bytes != 0); - let blocks = size_bytes.ceil_div(self.block_size); + let blocks = size_bytes.div_ceil(self.block_size); let mut read_cmd = ReadWriteCommand::default(); read_cmd.opcode = opcode as u8; diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index 2f55f8eca96..f99f046c45c 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -18,7 +18,6 @@ use bit_field::BitField; use crate::fs::inode; -use crate::utils::CeilDiv; trait Revsion {} @@ -112,7 +111,7 @@ impl SuperBlock { /// Returns the length of the BGDT. pub fn bgdt_len(&self) -> usize { - self.blocks_count.ceil_div(self.blocks_per_group) as usize + self.blocks_count.div_ceil(self.blocks_per_group) as usize } pub fn bgdt_block(&self) -> usize { diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 987531513b3..817d09a570e 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -34,7 +34,6 @@ use crate::mem::paging::*; use crate::socket::unix::UnixSocket; use crate::socket::SocketAddrRef; -use crate::utils::CeilDiv; use self::group_desc::GroupDescriptors; @@ -186,7 +185,7 @@ impl INode { let new_block = fs.bgdt.alloc_block_ptr()?; - let mut next_block_num = self.inode.read().size().ceil_div(block_size); + let mut next_block_num = self.inode.read().size().div_ceil(block_size); if next_block_num < 12 { let mut inode = self.inode.write(); diff --git a/src/aero_kernel/src/syscall/time.rs b/src/aero_kernel/src/syscall/time.rs index f48328cf11e..cde62a4eeaa 100644 --- a/src/aero_kernel/src/syscall/time.rs +++ b/src/aero_kernel/src/syscall/time.rs @@ -23,14 +23,13 @@ use alloc::vec::Vec; use crate::userland::scheduler; use crate::userland::task::Task; use crate::utils::sync::{IrqGuard, Mutex}; -use crate::utils::CeilDiv; const CLOCK_TYPE_REALTIME: usize = 0; const CLOCK_TYPE_MONOTONIC: usize = 1; #[syscall] pub fn sleep(timespec: &TimeSpec) -> Result { - let duration = (timespec.tv_nsec as usize).ceil_div(1000000000) + timespec.tv_sec as usize; + let duration = (timespec.tv_nsec as usize).div_ceil(1000000000) + timespec.tv_sec as usize; scheduler::get_scheduler().inner.sleep(Some(duration))?; diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index 5678717fce6..081c8284836 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -223,32 +223,5 @@ impl<'a> StackHelper<'a> { } } -pub trait CeilDiv { - fn ceil_div(self, d: Self) -> Self; -} - -macro_rules! ceil_div_impl { - ($($t:ty)*) => ($( - impl CeilDiv for $t { - fn ceil_div(self, d: $t) -> $t { - (self + d - 1) / d - } - } - )*) -} - -ceil_div_impl!(u8 u16 u32 u64 usize u128); - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn unsigned_div_ceil() { - assert_eq!((8usize).ceil_div(3), 3); - assert_eq!((7usize).ceil_div(4), 2); - } -} - #[repr(transparent)] pub struct LinkerSymbol(core::cell::UnsafeCell); From f0c6d28053b4d30569417fd2b2f5ee408aafcd51 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 7 Oct 2023 16:31:07 +1100 Subject: [PATCH 262/368] misc(unwind): update to the new panic message format https://blog.rust-lang.org/2023/10/05/Rust-1.73.0.html#cleaner-panic-messages Signed-off-by: Anhad Singh --- src/aero_kernel/src/unwind.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index 855caa37268..af3f49a7698 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -163,8 +163,8 @@ use crate::utils::sync::IrqGuard; fn rust_begin_unwind(info: &PanicInfo) -> ! { prepare_panic(); - let default_panic = &format_args!(""); - let panic_message = info.message().unwrap_or(default_panic); + let message = info.message().unwrap(); + let location = info.location().unwrap(); // Get the CPU ID where this panic happened and if PANIC_HOOK_READY is false // then we cannot get the CPU where this panic happened. @@ -174,14 +174,8 @@ fn rust_begin_unwind(info: &PanicInfo) -> ! { 0x00 }; - log::error!("cpu '{}' panicked at '{}'", cpu_id, panic_message); - - // Print the panic location if it is available. - if let Some(panic_location) = info.location() { - log::error!("{}", panic_location); - } - - // Add a new line to make the stack trace more readable. + log::error!("cpu '{cpu_id}' panicked at {location}:"); + log::error!("{message}"); log::error!(""); unwind_stack_trace(); From deb049b04ed3e3f55e292bd62f9ac37cc7b0dade Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 13 Oct 2023 20:04:03 +1100 Subject: [PATCH 263/368] ports: add webkitgtk Signed-off-by: Anhad Singh --- base-files/a | 21 +- bootstrap.yml | 54 +- bootstrap/net.yml | 476 +++++++-- bootstrap/x11-themes.yml | 49 + bootstrap/xorg.yml | 139 ++- extra-files/firefox/mozconfig | 26 + patches/alsa-lib/alsa-lib.patch | 124 +++ patches/mlibc/mlibc.patch | 2 +- patches/nss/0001-Add-a-missing-include.patch | 24 + patches/nss/0002-NSS-Standalone-patch.patch | 258 +++++ patches/rust-getrandom/rust-getrandom.patch | 53 + patches/rust-libc/rust-libc.patch | 996 ------------------ patches/rust-libloading/rust-libloading.patch | 23 +- patches/rust-nix/rust-nix.patch | 506 ++++++--- patches/webkitgtk/webkitgtk.patch | 45 +- patches/xorg-server/xorg-server.patch | 181 ++-- src/aero_kernel/src/arch/x86_64/task.rs | 4 +- src/aero_kernel/src/fs/block/mod.rs | 1 + src/aero_kernel/src/fs/eventfd.rs | 4 +- src/aero_kernel/src/fs/ext2/group_desc.rs | 18 +- src/aero_kernel/src/fs/ext2/mod.rs | 15 +- src/aero_kernel/src/fs/mod.rs | 16 +- src/aero_kernel/src/main.rs | 1 + src/aero_kernel/src/mem/paging/mapper.rs | 7 +- src/aero_kernel/src/rendy.rs | 5 +- src/aero_kernel/src/syscall/fs.rs | 5 +- src/aero_kernel/src/syscall/mod.rs | 4 + src/aero_kernel/src/userland/vm.rs | 20 +- src/aero_proc/src/syscall.rs | 32 +- tools/cargo-inject-patches.py | 10 +- userland/apps/init/src/main.rs | 24 +- 31 files changed, 1714 insertions(+), 1429 deletions(-) create mode 100644 bootstrap/x11-themes.yml create mode 100644 extra-files/firefox/mozconfig create mode 100644 patches/alsa-lib/alsa-lib.patch create mode 100644 patches/nss/0001-Add-a-missing-include.patch create mode 100644 patches/nss/0002-NSS-Standalone-patch.patch create mode 100644 patches/rust-getrandom/rust-getrandom.patch delete mode 100644 patches/rust-libc/rust-libc.patch diff --git a/base-files/a b/base-files/a index d9ae7e1d5e3..6a904dd38ac 100644 --- a/base-files/a +++ b/base-files/a @@ -1,2 +1,21 @@ #!/usr/bin/bash -systrace curl 192.168.1.25:8080 + +echo "Running update-mime-database to get the mime database" +update-mime-database /usr/share/mime/ + +echo "Running gio-querymodules to generate gio cache" +gio-querymodules /usr/lib/gio/modules/ + +echo "Running glib-compile-schemas to get gtk3 working" +glib-compile-schemas /usr/share/glib-2.0/schemas/ + +echo "Running gdk-pixbuf-query-loaders to get gtk3 working" +gdk-pixbuf-query-loaders --update-cache + +echo "Running gtk-query-immodules-3.0 to get gtk3 working" +gtk-query-immodules-3.0 --update-cache + +echo "Running gtk-query-immodules-2.0 to get gtk2 working" +gtk-query-immodules-2.0 --update-cache + +/usr/libexec/webkit2gtk-4.0/MiniBrowser diff --git a/bootstrap.yml b/bootstrap.yml index 4991de639da..dd8b37f0753 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -1,5 +1,6 @@ imports: - file: bootstrap/xorg.yml + - file: bootstrap/x11-themes.yml - file: bootstrap/net.yml - file: bootstrap/vcs.yml - file: bootstrap/db.yml @@ -94,13 +95,14 @@ sources: - name: rust-libc subdir: 'bundled' git: 'https://github.com/Andy-Python-Programmer/libc.git' + commit: 'fe4e9cda46b0be8421b0f56df0b63b8c4dcaf5e6' branch: 'master' - name: rust-num-cpus subdir: 'bundled' git: 'https://github.com/seanmonstar/num_cpus.git' - tag: 'v1.13.0' - version: '1.13.0' + tag: 'v1.15.0' + version: '1.15.0' - name: rust-users subdir: 'bundled' @@ -123,8 +125,8 @@ sources: - name: rust-nix subdir: 'bundled' git: 'https://github.com/nix-rust/nix.git' - tag: 'v0.22.3' - version: '0.22.3' + tag: 'v0.24.3' + version: '0.24.3' - name: rust-mio-0.6 subdir: 'bundled' @@ -148,8 +150,21 @@ sources: - name: rust-libloading subdir: 'bundled' git: 'https://github.com/nagisa/rust_libloading.git' - tag: '0.7.3' - version: '0.7.3' + tag: '0.8.1' + version: '0.8.1' + + - name: rust-getrandom + subdir: 'bundled' + git: 'https://github.com/rust-random/getrandom.git' + tag: 'v0.2.9' + version: '0.2.9' + + - name: rust-rustix + subdir: 'bundled' + git: 'https://github.com/bytecodealliance/rustix' + branch: 'main' + # For some reason they do not have a release tag for the latest release. Bruh momento. + commit: '2eedbb2fa1e18a11f44df10fa41ef82a6756caf3' - name: rust-patched-libs subdir: 'bundled' @@ -174,6 +189,10 @@ sources: recursive: true - name: rust-libloading recursive: true + - name: rust-getrandom + recursive: true + - name: rust-rustix + recursive: true # --------------------------------------------------------------------------- # Rust patched crates end # --------------------------------------------------------------------------- @@ -229,15 +248,15 @@ sources: - name: icu subdir: 'bundled' git: 'https://github.com/unicode-org/icu.git' - tag: 'release-70-1' - version: '70.1' + tag: 'release-73-2' + version: '73.2' tools_required: - host-autoconf-v2.69 - host-automake-v1.16 - host-libtool regenerate: - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.15/share/automake-1.15/config.sub', + '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', '@THIS_SOURCE_DIR@/icu4c/source'] tools: @@ -303,6 +322,23 @@ tools: install: - args: ['make', 'install'] + + - name: host-autoconf-v2.13 + source: + name: autoconf-v2.13 + subdir: 'bundled' + url: 'https://ftp.gnu.org/gnu/autoconf/autoconf-2.13.tar.gz' + format: 'tar.gz' + extract_path: 'autoconf-2.13' + patch-path-strip: 3 + version: '2.13' + configure: + - args: ['@THIS_SOURCE_DIR@/configure', '--prefix=@PREFIX@'] + compile: + - args: ['make', '-j@PARALLELISM@'] + install: + - args: ['make', 'install'] + - name: host-automake-v1.16 source: name: automake-v1.16 diff --git a/bootstrap/net.yml b/bootstrap/net.yml index 5960dc8c71e..fb8a47a2d2c 100644 --- a/bootstrap/net.yml +++ b/bootstrap/net.yml @@ -1,3 +1,10 @@ +sources: + - name: nss + subdir: 'bundled' + git: 'https://github.com/nss-dev/nss.git' + tag: 'NSS_3_94_RTM' + version: '3.94.RTM' + packages: - name: dhcpd source: @@ -318,88 +325,409 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' - # - name: webkitgtk - # metadata: - # summary: 'An open source web browser engine, with a small example browser' - # description: 'This package provides WebKitGTK, a port of the portable web rendering engine WebKit to the GTK+ 3 and GTK 4 platforms.' - # spdx: 'LGPL-2.0-or-later BSD-2-Clause' - # website: 'https://webkitgtk.org' - # maintainer: "Dennis Bonke " - # categories: ['net-libs'] + - name: alsa-lib + source: + subdir: 'bundled' + git: 'https://github.com/alsa-project/alsa-lib.git' + tag: 'v1.2.9' + version: '1.2.9' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + regenerate: + - args: ['autoreconf', '-fvi'] + tools_required: + - host-gcc + pkgs_required: + - mlibc + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: nspr + source: + subdir: 'bundled' + hg: 'https://hg.mozilla.org/projects/nspr/' + tag: 'NSPR_4_35_RTM' + version: '4.35.1' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + regenerate: + - args: ['autoreconf', '-fvi'] + - args: ['cp', + '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', + '@THIS_SOURCE_DIR@/build/autoconf/'] + tools_required: + - host-gcc + pkgs_required: + - mlibc + configure: + # Disable installing two unneeded scripts. + - args: ['sed', '-ri', '/^RELEASE/s/^/#/', '@THIS_SOURCE_DIR@/pr/src/misc/Makefile.in'] + # Disable installing static libraries. + - args: ['sed', '-i', 's#$(LIBRARY) ##', '@THIS_SOURCE_DIR@/config/rules.mk'] + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-linux' + - '--build=x86_64-linux' + - '--prefix=/usr' + - '--with-mozilla' + - '--with-pthreads' + - '--enable-64bit' + environ: + CROSS_COMPILE: '1' + ac_cv_func_syscall: 'no' + build: + # We first build a native nsinstall that the build can use later on. + - args: ['make', 'CC=gcc', 'CXX=g++', '-C', '@THIS_BUILD_DIR@/config/'] + - args: ['mv', '-v', '@THIS_BUILD_DIR@/config/nsinstall', '@THIS_BUILD_DIR@/config/native-nsinstall'] + - args: ['sed', '-s', 's#/nsinstall$#/native-nsinstall#', '-i', '@THIS_BUILD_DIR@/config/autoconf.mk'] + - args: ['rm', '-v', '@THIS_BUILD_DIR@/config/nsinstall.o'] + # Then build the real deal + - args: ['make', 'CC=x86_64-aero-gcc', 'CXX=x86_64-aero-g++', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + quiet: true + + - name: nss + from_source: nss + tools_required: + - host-gcc + pkgs_required: + - mlibc + - nspr + - sqlite + - zlib + configure: + - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + build: + # First, build a host version of nsinstall. + - args: ['make', '-C', '@THIS_BUILD_DIR@/coreconf/'] + environ: + CC: 'gcc' + BUILD_OPT: '1' + NSPR_INCLUDE_DIR: '/usr/include/nspr' + USE_SYSTEM_ZLIB: '1' + ZLIB_LIBS: '-lz' + NSS_ENABLE_WERROR: '0' + USE_64: '1' + NSS_USE_SYSTEM_SQLITE: '1' + NS_USE_GCC: '1' + CC_IS_GCC: '1' + NSDISTMODE: 'copy' + # Then, build some configuration items courtesy of BLFS (see the patches). + - args: | + make V=1 -C @THIS_BUILD_DIR@/config NSINSTALL=@THIS_BUILD_DIR@/$(find -type f -name nsinstall) -j1 + environ: + # Optimized builds. + BUILD_OPT: '1' + # NSPR is here. + NSPR_INCLUDE_DIR: '@SYSROOT_DIR@/usr/include/nspr' + # Use our zlib. + USE_SYSTEM_ZLIB: '1' + # Freestanding freebl yes please. + FREEBL_NO_DEPEND: '1' + FREEBL_LOWHASH: '1' + NSS_SEED_ONLY_DEV_URANDOM: '1' + # Link with zlib. + ZLIB_LIBS: '-lz' + # Do not enable Werror. + NSS_ENABLE_WERROR: '0' + # We are 64 bit. + USE_64: '1' + # Use system sqlite. + NSS_USE_SYSTEM_SQLITE: '1' + # We're using gcc. + NS_USE_GCC: '1' + CC_IS_GCC: '1' + # We're cross compiling. + CROSS_COMPILE: '1' + # Don't symlink files, copy them. + NSDISTMODE: 'copy' + # Do not build the tests. + NSS_DISABLE_GTESTS: '1' + # Put the libs and binaries here. + SOURCE_PREFIX: '@THIS_BUILD_DIR@/dist' + # Specify the compiler. + CC: 'x86_64-aero-gcc' + CXX: 'x86_64-aero-g++' + # Then build the main libraries and binaries. + - args: | + make V=1 -C @THIS_BUILD_DIR@/. NSINSTALL=@THIS_BUILD_DIR@/$(find -type f -name nsinstall) -j1 + environ: + BUILD_OPT: '1' + NSPR_INCLUDE_DIR: '@SYSROOT_DIR@/usr/include/nspr' + USE_SYSTEM_ZLIB: '1' + FREEBL_NO_DEPEND: '1' + FREEBL_LOWHASH: '1' + NSS_SEED_ONLY_DEV_URANDOM: '1' + ZLIB_LIBS: '-lz' + NSS_ENABLE_WERROR: '0' + USE_64: '1' + NSS_USE_SYSTEM_SQLITE: '1' + NS_USE_GCC: '1' + CC_IS_GCC: '1' + CROSS_COMPILE: '1' + NSDISTMODE: 'copy' + NSS_DISABLE_GTESTS: '1' + SOURCE_PREFIX: '@THIS_BUILD_DIR@/dist' + CC: 'x86_64-aero-gcc' + CXX: 'x86_64-aero-g++' + # Create some directories to install into. + - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/lib/pkgconfig'] + - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/bin'] + - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/include'] + # And install everything, this _will_ break on a non Linux box, but unfortunately NSS hardcodes kernel names and versions. + # If someone wants to patch NSS to not do that, greatly appreciated. + # These install instructions are adapted from BLFS, and not Gentoo as I usually do. + - args: | + cd dist + install -v -m755 Linux*/lib/*.so @THIS_COLLECT_DIR@/usr/lib + install -v -m644 Linux*/lib/{*.chk,libcrmf.a} @THIS_COLLECT_DIR@/usr/lib + install -v -m755 -d @THIS_COLLECT_DIR@/usr/include/nss + cp -v -RL {public,private}/nss/* @THIS_COLLECT_DIR@/usr/include/nss + chmod -v 644 @THIS_COLLECT_DIR@/usr/include/nss/* + install -v -m755 Linux*/bin/{certutil,nss-config,pk12util} @THIS_COLLECT_DIR@/usr/bin + install -v -m644 Linux*/lib/pkgconfig/nss.pc @THIS_COLLECT_DIR@/usr/lib/pkgconfig + + - name: libevent + source: + subdir: bundled + git: 'https://github.com/libevent/libevent.git' + tag: 'release-2.1.12-stable' + version: '2.1.12' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + regenerate: + - args: ['./autogen.sh'] + # Fix an issue that prevents event_rpcgen.py from working. + - args: ['sed', '-i', 's/python/&3/', '@THIS_SOURCE_DIR@/event_rpcgen.py'] + tools_required: + - host-gcc + pkgs_required: + - mlibc + - openssl + - zlib + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--disable-static' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: libvpx + source: + subdir: 'bundled' + git: 'https://chromium.googlesource.com/webm/libvpx.git' + tag: 'v1.11.0' + version: '1.11.0' + tools_required: + - host-gcc + pkgs_required: + - mlibc + configure: + # Fix ownership and permission of installed files. + - args: ['sed', '-i', 's/cp -p/cp/', '@THIS_SOURCE_DIR@/build/make/Makefile'] + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--prefix=/usr' + - '--disable-static' + - '--enable-shared' + # Generic GNU target to disable optimizations + - '--force-target=generic-gnu' + - '--enable-pic' + - '--enable-vp8' + - '--enable-vp9' + - '--enable-multithread' + - '--enable-vp9-highbitdepth' + - '--disable-examples' + - '--disable-install-docs' + - '--disable-docs' + build: + - args: ['make', 'HAVE_GNU_STRIP=no', 'CC=x86_64-aero-gcc', 'LD=x86_64-aero-gcc', 'CXX=x86_64-aero-g++', 'AR=x86_64-aero-ar', 'NM=x86_64-aero-nm', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + # - name: firefox # source: # subdir: 'bundled' - # git: 'https://github.com/WebKit/WebKit.git' - # # I think? Apple is weird with naming - # tag: 'Safari-612.1.27.0.24' - # version: '2.33.3' + # git: 'https://github.com/mozilla/gecko-dev' + # commit: 7baa783763c946ff667c3faea292e91d3de1e459 + # branch: master + # configure: + # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + # - args: ['cp', '@SOURCE_ROOT@/extra-files/firefox/mozconfig', '@THIS_BUILD_DIR@/mozconfig'] # tools_required: # - host-gcc - # - host-cmake + # - host-rust + # - host-pkg-config + # # - virtual: pkgconfig-for-target + # # triple: "x86_64-aero" # pkgs_required: # - mlibc - # - cairo - # - fontconfig - # - freetype - # - libgcrypt + # - alsa-lib # - glib - # - harfbuzz - # - icu - # - libjpeg-turbo - # - zlib - # - libpng - # - libxml - # - atk - # - sqlite - # - libwebp # - gtk+-3 - # - libsoup - # - libxslt - # - at-spi2-core - # - libtasn - # - libx11 - # - libxcomposite - # - libxdamage - # - libxrender - # - libxt - # - mesa - # # - gst-plugins-base + # - gtk+-2 + # - icu + # - gcc + # - nspr + # - nss + # - libvpx + # - libevent + # sources_required: + # - rust-patched-libs + # build: + # - args: ['./mach', 'build'] + # environ: + # HOST_CC: 'gcc' + # HOST_CXX: 'g++' + # CC: 'x86_64-aero-gcc' + # CXX: 'x86_64-aero-g++' + # CARGOFLAGS: '--verbose' + # MOZ_RUST_TIER: '1' + # BINDGEN_EXTRA_CLANG_ARGS: '-isystem@SYSROOT_DIR/usr/include' + # # CROSS_SYSROOT: '@SYSROOT_DIR@'./system-root/usr/include/c++/11.2.0/memory + + # cargo install cbindgen + # + # pacman -S autoconf2.13 + # - name: firefox-esr + # source: + # subdir: 'bundled' + # git: 'https://github.com/mozilla/gecko-dev' + # branch: 'FIREFOX_ESR_68_0_X_RELBRANCH' # configure: - # - args: - # - 'cmake' - # - '-GNinja' - # - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.cmake' - # - '-DCMAKE_INSTALL_PREFIX=/usr' - # - '-DCMAKE_SYSTEM_PROCESSOR=x86_64' - # - '-DCMAKE_BUILD_TYPE=Release' - # - '-DCMAKE_SKIP_RPATH=ON' - # - '-DPORT=GTK' - # - '-DLIB_INSTALL_DIR=/usr/lib' - # - '-DUSE_LIBHYPHEN=OFF' - # - '-DENABLE_GAMEPAD=OFF' - # - '-DENABLE_MINIBROWSER=ON' - # - '-DUSE_WOFF2=OFF' - # - '-DUSE_SYSTEMD=OFF' - # - '-DENABLE_BUBBLEWRAP_SANDBOX=OFF' - # - '-Wno-dev -G Ninja' - # - '-DUSE_LIBNOTIFY=OFF' - # - '-DUSE_SYSTEM_MALLOC=ON' - # - '-DENABLE_GEOLOCATION=OFF' - # - '-DENABLE_VIDEO=OFF' - # - '-DENABLE_WEB_AUDIO=OFF' - # - '-DENABLE_INTROSPECTION=OFF' - # - '-DUSE_LIBSECRET=OFF' - # - '-DUSE_OPENJPEG=OFF' - # - '-DENABLE_SPELLCHECK=OFF' - # - '-DENABLE_WAYLAND_TARGET=OFF' - # - '-DENABLE_X11_TARGET=ON' - # - '-DENABLE_WEBGL=ON' - # - '-DUSE_WPE_RENDERER=OFF' - # - '-DENABLE_WEBGL2=OFF' - # - '-DUSE_SOUP2=ON' - # - '-DUSE_LCMS=OFF' - # - '@THIS_SOURCE_DIR@' + # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + # - args: ['cp', '@SOURCE_ROOT@/extra-files/firefox/mozconfig', '@THIS_BUILD_DIR@/mozconfig'] + # tools_required: + # - host-gcc + # - host-rust + # - host-pkg-config + # # - virtual: pkgconfig-for-target + # # triple: "x86_64-aero" + # pkgs_required: + # - mlibc + # - alsa-lib + # - glib + # - gtk+-3 + # - gtk+-2 + # - gcc # build: - # - args: ['ninja', '-j8'] - # - args: ['ninja', 'install'] + # # python ~/work/aero/tools/cargo-inject-patches.py ./Cargo.toml + # - args: ['./mach', 'build'] # environ: - # DESTDIR: '@THIS_COLLECT_DIR@' + # HOST_CC: 'clang' + # CC: 'x86_64-aero-gcc' + # CARGOFLAGS: '--verbose' + # # - args: ['./mach', 'install'] + # # environ: + # # DESTDIR: '@THIS_COLLECT_DIR@' + + # /home/andy/work/aero/bundled/webkitgtk/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp:313:14: error: ‘mkstemps’ was not declared in this scope; did you mean ‘mkstemp’? + # 313 | int fd = mkstemps(&tempFileTemplate[0], static_cast(extension.size())); + # | ^~~~~~~~ + # | mkstemp + - name: webkitgtk + source: + subdir: bundled + git: 'https://github.com/WebKit/WebKit.git' + # I think? Apple is weird with naming + tag: 'Safari-612.1.27.0.24' + version: '2.33.3' + tools_required: + - host-gcc + - host-cmake + pkgs_required: + - mlibc + - cairo + - fontconfig + - freetype + - libgcrypt + - glib + - harfbuzz + - icu + - libjpeg-turbo + - zlib + - sqlite + - libpng + - libxml + - atk + - libwebp + - gtk+-3 + - libsoup + - libxslt + - at-spi2-core + - libtasn + - libx11 + - libxcomposite + - libxdamage + - libxrender + - libxt + - mesa + configure: + - args: + - 'cmake' + - '-GNinja' + - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.cmake' + - '-DCMAKE_INSTALL_PREFIX=/usr' + - '-DCMAKE_SYSTEM_PROCESSOR=x86_64' + - '-DCMAKE_BUILD_TYPE=Release' + - '-DCMAKE_SKIP_RPATH=ON' + - '-DPORT=GTK' + - '-DLIB_INSTALL_DIR=/usr/lib' + - '-DUSE_LIBHYPHEN=OFF' + - '-DENABLE_GAMEPAD=OFF' + - '-DENABLE_MINIBROWSER=ON' + - '-DUSE_WOFF2=OFF' + - '-DUSE_SYSTEMD=OFF' + - '-DENABLE_BUBBLEWRAP_SANDBOX=OFF' + - '-Wno-dev -G Ninja' + - '-DUSE_LIBNOTIFY=OFF' + - '-DUSE_SYSTEM_MALLOC=ON' + - '-DENABLE_GEOLOCATION=OFF' + - '-DENABLE_VIDEO=OFF' + - '-DENABLE_WEB_AUDIO=OFF' + - '-DENABLE_INTROSPECTION=OFF' + - '-DUSE_LIBSECRET=OFF' + - '-DUSE_OPENJPEG=OFF' + - '-DENABLE_SPELLCHECK=OFF' + - '-DENABLE_WAYLAND_TARGET=OFF' + - '-DENABLE_X11_TARGET=ON' + - '-DENABLE_WEBGL=ON' + - '-DUSE_WPE_RENDERER=OFF' + - '-DENABLE_WEBGL2=OFF' + - '-DUSE_SOUP2=ON' + - '-DUSE_LCMS=OFF' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja', '-j6'] + # environ: + # CXXFLAGS: '-std=c++11' + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/x11-themes.yml b/bootstrap/x11-themes.yml new file mode 100644 index 00000000000..09506dfd667 --- /dev/null +++ b/bootstrap/x11-themes.yml @@ -0,0 +1,49 @@ +packages: + # This package contains a default fallback theme for implementations of the icon theme specification. + - name: hicolor-icon-theme + source: + subdir: 'bundled' + git: 'https://gitlab.freedesktop.org/xdg/default-icon-theme.git' + tag: '0.17' + version: '0.17' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + regenerate: + - args: ['./autogen.sh', '--no-configure'] + tools_required: + - host-gcc + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + + - name: adwaita-icon-theme + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/adwaita-icon-theme.git' + tag: '45.0' + version: '45.0' + tools_required: + - host-gcc + pkgs_required: + - hicolor-icon-theme + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index cfde0b56cd7..2c9f9a4b604 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -1008,8 +1008,8 @@ packages: source: subdir: 'bundled' git: 'https://gitlab.freedesktop.org/xorg/xserver.git' - tag: 'xorg-server-21.1.8' - version: '21.1.8' + tag: 'xorg-server-1.20.14' + version: '1.20.14' tools_required: - host-autoconf-v2.69 - host-automake-v1.16 @@ -2357,6 +2357,104 @@ packages: # post_install: # - args: 'glib-compile-schemas /usr/share/glib-2.0/schemas' + # Deprecated, please don't depend on this anymore. Only here for gtklife and hexchat. + - name: gtk+-2 + source: + subdir: 'bundled' + url: 'https://download.gnome.org/sources/gtk+/2.24/gtk+-2.24.32.tar.xz' + format: 'tar.xz' + checksum: blake2b:03f4c0a8be98473f62bc8c86859937969c4169960a5f93d37ff6dcde00413215fa6c7125b15781bf50d67b40aa0056cb71b83fb50acb2c3467b5deb3c8d938f0 + extract_path: 'gtk+-2.24.32' + patch-path-strip: 1 + version: '2.24.32' + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-pkg-config + - host-xorg-macros + - host-glib + regenerate: + - args: ['autoreconf', '-fvi'] + tools_required: + - host-gcc + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - atk + - cairo + - glib + - gdk-pixbuf + - libx11 + - libxext + - libxcb + - pango + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--sysconfdir=/etc' + - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. + - '--disable-gtk-doc-html' + - '--disable-cups' + - '--disable-papi' + - '--disable-introspection' + - '--disable-glibtest' + - '--disable-test-print-backend' + - '--enable-xkb' + environ: + ac_cv_func_getresuid: 'no' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + quiet: true + # Rename a file to avoid conflicts, we will use gtk3 as default, so rename this one. + - args: ['mv', '-v', '@THIS_COLLECT_DIR@/usr/bin/gtk-update-icon-cache', '@THIS_COLLECT_DIR@/usr/bin/gtk2-update-icon-cache'] + scripts: + post_install: + - args: ['gtk-query-immodules-2.0', '--update-cache'] + - args: ['glib-compile-schemas', '/usr/share/glib-2.0/schemas'] + + # Collection of GSettings schemas for GNOME desktop + - name: gsettings-desktop-schemas + source: + subdir: 'bundled' + git: 'https://gitlab.gnome.org/GNOME/gsettings-desktop-schemas.git' + tag: '42.0' + version: '42.0' + tools_required: + - host-gcc + - host-gobject-introspection + - host-libtool + - host-pkg-config + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - glib + configure: + - args: | + sed -i -r 's:"(/system):"/org/gnome\1:g' @THIS_SOURCE_DIR@/schemas/*.in + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '-Dintrospection=false' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + scripts: + post_install: + - args: 'glib-compile-schemas /usr/share/glib-2.0/schemas' + - name: gtk+-3 source: subdir: 'bundled' @@ -2391,7 +2489,7 @@ packages: - libxi - harfbuzz - libxcursor - #- gsettings-desktop-schemas + - gsettings-desktop-schemas - dbus configure: - args: @@ -2502,3 +2600,38 @@ packages: - args: ['make', 'install'] environ: DESTDIR: '@THIS_COLLECT_DIR@' + + - name: gdk-pixbuf-xlib + source: + subdir: 'bundled' + url: 'https://download.gnome.org/sources/gdk-pixbuf-xlib/2.40/gdk-pixbuf-xlib-2.40.2.tar.xz' + format: 'tar.xz' + checksum: blake2b:a515e86bc69f59910f61fe9c275ab89c0732f0aa2cfb614ac94e597de420d25708a11b9b21313c7cfe3763434f45a8318412ae5889c24c8ed57dac68e09c0227 + extract_path: 'gdk-pixbuf-xlib-2.40.2' + patch-path-strip: 1 + version: '2.40.2' + tools_required: + - host-gcc + - host-libtool + - host-pkg-config + - virtual: pkgconfig-for-target + triple: "x86_64-aero" + pkgs_required: + - mlibc + - gdk-pixbuf + - libx11 + configure: + - args: + - 'meson' + - '--cross-file' + - '@SOURCE_ROOT@/userland/cross-file.ini' + - '--prefix=/usr' + - '@THIS_SOURCE_DIR@' + build: + - args: ['ninja'] + - args: ['ninja', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + scripts: + post_install: + - args: ['gdk-pixbuf-query-loaders', '--update-cache'] diff --git a/extra-files/firefox/mozconfig b/extra-files/firefox/mozconfig new file mode 100644 index 00000000000..fe6dcdbdeb6 --- /dev/null +++ b/extra-files/firefox/mozconfig @@ -0,0 +1,26 @@ +ac_add_options --disable-necko-wifi +ac_add_options --target=x86_64-aero +ac_add_options --with-toolchain-prefix=x86_64-aero +ac_add_options --enable-project=browser +ac_add_options --enable-alsa +ac_add_options --prefix=/usr + +ac_add_options --enable-optimize + +# use system libs if possible +ac_add_options --with-system-nss +ac_add_options --with-system-jpeg +ac_add_options --with-system-zlib +ac_add_options --with-system-icu +ac_add_options --with-system-libevent +ac_add_options --with-system-nspr +ac_add_options --with-system-nss +ac_add_options --with-system-webp + +ac_add_options --enable-default-toolkit=cairo-gtk3 + +ac_add_options --disable-pulseaudio +ac_add_options --disable-crashreporter +ac_add_options --disable-dbus +ac_add_options --disable-updater +ac_add_options --disable-tests diff --git a/patches/alsa-lib/alsa-lib.patch b/patches/alsa-lib/alsa-lib.patch new file mode 100644 index 00000000000..1ebb5b22abc --- /dev/null +++ b/patches/alsa-lib/alsa-lib.patch @@ -0,0 +1,124 @@ +From 3b4d643d6648ead86648e0033868f903af6aeb70 Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Wed, 2 Aug 2023 13:50:05 +0200 +Subject: [PATCH] Add Managarm support + +Signed-off-by: Dennis Bonke +--- + src/conf.c | 10 ++++++++++ + src/pcm/pcm_ladspa.c | 5 +++++ + src/ucm/main.c | 5 +++++ + src/ucm/parser.c | 8 ++++++++ + src/ucm/ucm_exec.c | 7 +++++++ + src/ucm/ucm_subs.c | 5 +++++ + 6 files changed, 40 insertions(+) + +diff --git a/src/conf.c b/src/conf.c +index da51182..743e4cd 100644 +--- a/src/conf.c ++++ b/src/conf.c +@@ -435,6 +435,16 @@ beginning:

+ #include + #endif + ++#ifdef __aero__ ++#define stat64 stat ++#define dirent64 dirent ++#define lstat64 lstat ++#define readdir64 readdir ++#define scandir64 scandir ++#define versionsort64 versionsort ++typedef ino_t ino64_t; ++#endif ++ + #ifndef DOC_HIDDEN + + #ifdef HAVE_LIBPTHREAD +diff --git a/src/pcm/pcm_ladspa.c b/src/pcm/pcm_ladspa.c +index 9b2b32d..dde5d2a 100644 +--- a/src/pcm/pcm_ladspa.c ++++ b/src/pcm/pcm_ladspa.c +@@ -41,6 +41,11 @@ + + #include "ladspa.h" + ++#ifdef __aero__ ++#define readdir64 readdir ++#define dirent64 dirent ++#endif ++ + #ifndef PIC + /* entry for static linking */ + const char *_snd_module_pcm_ladspa = ""; +diff --git a/src/ucm/main.c b/src/ucm/main.c +index 66ffd00..7448963 100644 +--- a/src/ucm/main.c ++++ b/src/ucm/main.c +@@ -40,6 +40,11 @@ + #include + #include + ++#ifdef __aero__ ++#define stat64 stat ++#define fstat64 fstat ++#endif ++ + /* + * misc + */ +diff --git a/src/ucm/parser.c b/src/ucm/parser.c +index c111661..2115ac7 100644 +--- a/src/ucm/parser.c ++++ b/src/ucm/parser.c +@@ -36,6 +36,14 @@ + #include + #include + ++#ifdef __aero__ ++#define stat64 stat ++#define lstat64 lstat ++#define scandir64 scandir ++#define versionsort64 versionsort ++#define dirent64 dirent ++#endif ++ + static int filename_filter(const struct dirent64 *dirent); + + static int parse_sequence(snd_use_case_mgr_t *uc_mgr, +diff --git a/src/ucm/ucm_exec.c b/src/ucm/ucm_exec.c +index 276cf59..a6890dd 100644 +--- a/src/ucm/ucm_exec.c ++++ b/src/ucm/ucm_exec.c +@@ -42,6 +42,13 @@ extern char **environ; + #endif + #endif + ++#ifdef __aero__ ++#define stat64 stat ++#define dirent64 dirent ++#define lstat64 lstat ++#define readdir64 readdir ++#endif ++ + static pthread_mutex_t fork_lock = PTHREAD_MUTEX_INITIALIZER; + + /* +diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c +index e62290e..b4dbff2 100644 +--- a/src/ucm/ucm_subs.c ++++ b/src/ucm/ucm_subs.c +@@ -30,6 +30,11 @@ + #include + #include + ++#ifdef __aero__ ++#define stat64 stat ++#define lstat64 lstat ++#endif ++ + static char *rval_open_name(snd_use_case_mgr_t *uc_mgr) + { + const char *name; +-- +2.40.1 + diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index e16aed655cc..924b3edfad2 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,4 +1,4 @@ -From 1e4603c9de5ce2dcb596dfb95254b0ae119d1036 Mon Sep 17 00:00:00 2001 +From d33a19a85fd625a2acf53f95f32c369b7f91e230 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 3 Aug 2023 16:36:12 +1000 Subject: [PATCH] socket: implement shutdown(2) diff --git a/patches/nss/0001-Add-a-missing-include.patch b/patches/nss/0001-Add-a-missing-include.patch new file mode 100644 index 00000000000..eb71fcab2a5 --- /dev/null +++ b/patches/nss/0001-Add-a-missing-include.patch @@ -0,0 +1,24 @@ +From 8c7f96493b8706d43b30f49d56e0e84ee27fe65e Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Wed, 27 Apr 2022 20:27:21 +0200 +Subject: [PATCH 1/2] Add a missing include + +Signed-off-by: Dennis Bonke +--- + lib/dbm/src/h_page.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/lib/dbm/src/h_page.c b/lib/dbm/src/h_page.c +index d4e4ff6..7b3271e 100644 +--- a/lib/dbm/src/h_page.c ++++ b/lib/dbm/src/h_page.c +@@ -81,6 +81,7 @@ static char sccsid[] = "@(#)hash_page.c 8.7 (Berkeley) 8/16/94"; + #endif + + #include ++#include + + #include "mcom_db.h" + #include "hash.h" +-- +2.36.0 diff --git a/patches/nss/0002-NSS-Standalone-patch.patch b/patches/nss/0002-NSS-Standalone-patch.patch new file mode 100644 index 00000000000..cd78732af8a --- /dev/null +++ b/patches/nss/0002-NSS-Standalone-patch.patch @@ -0,0 +1,258 @@ +From ee4b3e43e0143f94289c418c0db5f803119e8be6 Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Wed, 27 Apr 2022 20:35:40 +0200 +Subject: [PATCH 2/2] NSS Standalone patch + +Taken from Beyond Linux From Scratch (https://www.linuxfromscratch.org/patches/blfs/svn/nss-3.77-standalone-1.patch) + +Adds auto-generated nss.pc and nss-config script, and allows building without nspr in the source tree. +Minimum NSPR version is now read out from package, instead of hardcoded value in the patch. + +Signed-off-by: Dennis Bonke +--- + config/Makefile | 41 ++++++++++++ + config/nss-config.in | 152 +++++++++++++++++++++++++++++++++++++++++++ + config/nss.pc.in | 11 ++++ + manifest.mn | 2 +- + 4 files changed, 205 insertions(+), 1 deletion(-) + create mode 100644 config/Makefile + create mode 100644 config/nss-config.in + create mode 100644 config/nss.pc.in + +diff --git a/config/Makefile b/config/Makefile +new file mode 100644 +index 0000000..662020a +--- /dev/null ++++ b/config/Makefile +@@ -0,0 +1,41 @@ ++CORE_DEPTH = .. ++DEPTH = .. ++ ++include $(CORE_DEPTH)/coreconf/config.mk ++ ++NSS_MAJOR_VERSION = `grep "NSS_VMAJOR" ../lib/nss/nss.h | awk '{print $$3}'` ++NSS_MINOR_VERSION = `grep "NSS_VMINOR" ../lib/nss/nss.h | awk '{print $$3}'` ++NSS_PATCH_VERSION = `grep "NSS_VPATCH" ../lib/nss/nss.h | awk '{print $$3}'` ++NSS_NSPR_MINIMUM = `head -n1 ../automation/release/nspr-version.txt` ++PREFIX = /usr ++ ++all: export libs ++ ++export: ++ # Create the nss.pc file ++ mkdir -p $(DIST)/lib/pkgconfig ++ sed -e "s,@prefix@,$(PREFIX)," \ ++ -e "s,@exec_prefix@,\$${prefix}," \ ++ -e "s,@libdir@,\$${prefix}/lib," \ ++ -e "s,@includedir@,\$${prefix}/include/nss," \ ++ -e "s,@NSS_MAJOR_VERSION@,$(NSS_MAJOR_VERSION),g" \ ++ -e "s,@NSS_MINOR_VERSION@,$(NSS_MINOR_VERSION)," \ ++ -e "s,@NSS_PATCH_VERSION@,$(NSS_PATCH_VERSION)," \ ++ -e "s,@NSS_NSPR_MINIMUM@,$(NSS_NSPR_MINIMUM)," \ ++ nss.pc.in > nss.pc ++ chmod 0644 nss.pc ++ cp -v nss.pc $(DIST)/lib/pkgconfig ++ ++ # Create the nss-config script ++ mkdir -p $(DIST)/bin ++ sed -e "s,@prefix@,$(PREFIX)," \ ++ -e "s,@NSS_MAJOR_VERSION@,$(NSS_MAJOR_VERSION)," \ ++ -e "s,@NSS_MINOR_VERSION@,$(NSS_MINOR_VERSION)," \ ++ -e "s,@NSS_PATCH_VERSION@,$(NSS_PATCH_VERSION)," \ ++ nss-config.in > nss-config ++ chmod 0755 nss-config ++ cp -v nss-config $(DIST)/bin ++ ++libs: ++ ++dummy: all export libs +diff --git a/config/nss-config.in b/config/nss-config.in +new file mode 100644 +index 0000000..7e3750d +--- /dev/null ++++ b/config/nss-config.in +@@ -0,0 +1,152 @@ ++#!/bin/sh ++ ++prefix=@prefix@ ++ ++major_version=@NSS_MAJOR_VERSION@ ++minor_version=@NSS_MINOR_VERSION@ ++patch_version=@NSS_PATCH_VERSION@ ++ ++usage() ++{ ++ cat <&2 ++fi ++ ++lib_nss=yes ++lib_nssutil=yes ++lib_smime=yes ++lib_ssl=yes ++lib_softokn=yes ++ ++while test $# -gt 0; do ++ case "$1" in ++ -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; ++ *) optarg= ;; ++ esac ++ ++ case $1 in ++ --prefix=*) ++ prefix=$optarg ++ ;; ++ --prefix) ++ echo_prefix=yes ++ ;; ++ --exec-prefix=*) ++ exec_prefix=$optarg ++ ;; ++ --exec-prefix) ++ echo_exec_prefix=yes ++ ;; ++ --includedir=*) ++ includedir=$optarg ++ ;; ++ --includedir) ++ echo_includedir=yes ++ ;; ++ --libdir=*) ++ libdir=$optarg ++ ;; ++ --libdir) ++ echo_libdir=yes ++ ;; ++ --version) ++ echo ${major_version}.${minor_version}.${patch_version} ++ ;; ++ --cflags) ++ echo_cflags=yes ++ ;; ++ --libs) ++ echo_libs=yes ++ ;; ++ nss) ++ lib_nss=yes ++ ;; ++ nssutil) ++ lib_nssutil=yes ++ ;; ++ smime) ++ lib_smime=yes ++ ;; ++ ssl) ++ lib_ssl=yes ++ ;; ++ softokn) ++ lib_softokn=yes ++ ;; ++ *) ++ usage 1 1>&2 ++ ;; ++ esac ++ shift ++done ++ ++# Set variables that may be dependent upon other variables ++if test -z "$exec_prefix"; then ++ exec_prefix=`pkg-config --variable=exec_prefix nss` ++fi ++if test -z "$includedir"; then ++ includedir=`pkg-config --variable=includedir nss` ++fi ++if test -z "$libdir"; then ++ libdir=`pkg-config --variable=libdir nss` ++fi ++ ++if test "$echo_prefix" = "yes"; then ++ echo $prefix ++fi ++ ++if test "$echo_exec_prefix" = "yes"; then ++ echo $exec_prefix ++fi ++ ++if test "$echo_includedir" = "yes"; then ++ echo $includedir ++fi ++ ++if test "$echo_libdir" = "yes"; then ++ echo $libdir ++fi ++ ++if test "$echo_cflags" = "yes"; then ++ echo -I$includedir ++fi ++ ++if test "$echo_libs" = "yes"; then ++ libdirs="-L$libdir" ++ if test -n "$lib_nss"; then ++ libdirs="$libdirs -lnss${major_version}" ++ fi ++ if test -n "$lib_nssutil"; then ++ libdirs="$libdirs -lnssutil${major_version}" ++ fi ++ if test -n "$lib_smime"; then ++ libdirs="$libdirs -lsmime${major_version}" ++ fi ++ if test -n "$lib_ssl"; then ++ libdirs="$libdirs -lssl${major_version}" ++ fi ++ if test -n "$lib_softokn"; then ++ libdirs="$libdirs -lsoftokn${major_version}" ++ fi ++ echo $libdirs ++fi +diff --git a/config/nss.pc.in b/config/nss.pc.in +new file mode 100644 +index 0000000..c8c263d +--- /dev/null ++++ b/config/nss.pc.in +@@ -0,0 +1,11 @@ ++prefix=@prefix@ ++exec_prefix=@exec_prefix@ ++libdir=@libdir@ ++includedir=@includedir@ ++ ++Name: NSS ++Description: Network Security Services ++Version: @NSS_MAJOR_VERSION@.@NSS_MINOR_VERSION@.@NSS_PATCH_VERSION@ ++Requires: nspr >= @NSS_NSPR_MINIMUM@ ++Libs: -L@libdir@ -lnss@NSS_MAJOR_VERSION@ -lnssutil@NSS_MAJOR_VERSION@ -lsmime@NSS_MAJOR_VERSION@ -lssl@NSS_MAJOR_VERSION@ -lsoftokn@NSS_MAJOR_VERSION@ ++Cflags: -I${includedir} +diff --git a/manifest.mn b/manifest.mn +index fbc420a..b983d88 100644 +--- a/manifest.mn ++++ b/manifest.mn +@@ -10,7 +10,7 @@ IMPORTS = nspr20/v4.8 \ + + RELEASE = nss + +-DIRS = coreconf lib cmd cpputil gtests ++DIRS = coreconf lib cmd cpputil gtests config + + HAVE_ALL_TARGET := 1 + +-- +2.36.0 diff --git a/patches/rust-getrandom/rust-getrandom.patch b/patches/rust-getrandom/rust-getrandom.patch new file mode 100644 index 00000000000..9b244bc8249 --- /dev/null +++ b/patches/rust-getrandom/rust-getrandom.patch @@ -0,0 +1,53 @@ +From 7ffdb350f8bf10017165131c8433e8371df89754 Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Mon, 7 Aug 2023 16:07:20 +0200 +Subject: [PATCH] Add aero support + +Signed-off-by: Dennis Bonke +--- + src/lib.rs | 2 +- + src/use_file.rs | 1 + + src/util_libc.rs | 2 +- + 3 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/src/lib.rs b/src/lib.rs +index 931856f..e700572 100644 +--- a/src/lib.rs ++++ b/src/lib.rs +@@ -215,7 +215,7 @@ pub use crate::error::Error; + // The function MUST NOT ever write uninitialized bytes into `dest`, + // regardless of what value it returns. + cfg_if! { +- if #[cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix"))] { ++ if #[cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix", target_os = "aero"))] { + mod util_libc; + #[path = "use_file.rs"] mod imp; + } else if #[cfg(any(target_os = "android", target_os = "linux"))] { +diff --git a/src/use_file.rs b/src/use_file.rs +index a6ef0d2..ef9bf54 100644 +--- a/src/use_file.rs ++++ b/src/use_file.rs +@@ -33,6 +33,7 @@ const FILE_PATH: &str = "/dev/random\0"; + target_os = "haiku", + target_os = "macos", + target_os = "nto", ++ target_os = "aero", + ))] + const FILE_PATH: &str = "/dev/urandom\0"; + +diff --git a/src/util_libc.rs b/src/util_libc.rs +index de1455c..65bc1a6 100644 +--- a/src/util_libc.rs ++++ b/src/util_libc.rs +@@ -19,7 +19,7 @@ use libc::c_void; + cfg_if! { + if #[cfg(any(target_os = "netbsd", target_os = "openbsd", target_os = "android"))] { + use libc::__errno as errno_location; +- } else if #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "redox"))] { ++ } else if #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "redox", target_os = "aero"))] { + use libc::__errno_location as errno_location; + } else if #[cfg(any(target_os = "solaris", target_os = "illumos"))] { + use libc::___errno as errno_location; +-- +2.42.0 + diff --git a/patches/rust-libc/rust-libc.patch b/patches/rust-libc/rust-libc.patch deleted file mode 100644 index 04bc44bb09e..00000000000 --- a/patches/rust-libc/rust-libc.patch +++ /dev/null @@ -1,996 +0,0 @@ -From a23324fdc96748fc48b5deb824db43b693b6c5dc Mon Sep 17 00:00:00 2001 -From: Anhad Singh -Date: Sun, 21 May 2023 12:58:08 +1000 -Subject: [PATCH] - ---- - .../linux_like/linux/gnu/b64/x86_64/mod.rs | 4 +- - src/unix/linux_like/linux/gnu/mod.rs | 4 +- - src/unix/linux_like/linux/mod.rs | 28 +- - src/unix/mlibc/mod.rs | 568 ++++++++++++++++-- - 4 files changed, 550 insertions(+), 54 deletions(-) - -diff --git a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs -index e6307e2..cae81c4 100644 ---- a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs -+++ b/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs -@@ -330,7 +330,7 @@ cfg_if! { - impl Eq for user_fpregs_struct {} - - impl ::fmt::Debug for user_fpregs_struct { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("user_fpregs_struct") - .field("cwd", &self.cwd) - .field("ftw", &self.ftw) -@@ -375,7 +375,7 @@ cfg_if! { - impl Eq for ucontext_t {} - - impl ::fmt::Debug for ucontext_t { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_flags) - .field("uc_link", &self.uc_link) -diff --git a/src/unix/linux_like/linux/gnu/mod.rs b/src/unix/linux_like/linux/gnu/mod.rs -index b8b6ded..98b49a0 100644 ---- a/src/unix/linux_like/linux/gnu/mod.rs -+++ b/src/unix/linux_like/linux/gnu/mod.rs -@@ -519,7 +519,7 @@ cfg_if! { - impl Eq for utmpx {} - - impl ::fmt::Debug for utmpx { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("utmpx") - .field("ut_type", &self.ut_type) - .field("ut_pid", &self.ut_pid) -@@ -568,7 +568,7 @@ cfg_if! { - - #[cfg(libc_union)] - impl ::fmt::Debug for __c_anonymous_ptrace_syscall_info_data { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - unsafe { - f.debug_struct("__c_anonymous_ptrace_syscall_info_data") - .field("entry", &self.entry) -diff --git a/src/unix/linux_like/linux/mod.rs b/src/unix/linux_like/linux/mod.rs -index be12190..c8762d5 100644 ---- a/src/unix/linux_like/linux/mod.rs -+++ b/src/unix/linux_like/linux/mod.rs -@@ -840,7 +840,7 @@ cfg_if! { - } - impl Eq for sockaddr_nl {} - impl ::fmt::Debug for sockaddr_nl { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("sockaddr_nl") - .field("nl_family", &self.nl_family) - .field("nl_pid", &self.nl_pid) -@@ -873,7 +873,7 @@ cfg_if! { - impl Eq for dirent {} - - impl ::fmt::Debug for dirent { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("dirent") - .field("d_ino", &self.d_ino) - .field("d_off", &self.d_off) -@@ -911,7 +911,7 @@ cfg_if! { - impl Eq for dirent64 {} - - impl ::fmt::Debug for dirent64 { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("dirent64") - .field("d_ino", &self.d_ino) - .field("d_off", &self.d_off) -@@ -941,7 +941,7 @@ cfg_if! { - impl Eq for pthread_cond_t {} - - impl ::fmt::Debug for pthread_cond_t { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("pthread_cond_t") - // FIXME: .field("size", &self.size) - .finish() -@@ -963,7 +963,7 @@ cfg_if! { - impl Eq for pthread_mutex_t {} - - impl ::fmt::Debug for pthread_mutex_t { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("pthread_mutex_t") - // FIXME: .field("size", &self.size) - .finish() -@@ -985,7 +985,7 @@ cfg_if! { - impl Eq for pthread_rwlock_t {} - - impl ::fmt::Debug for pthread_rwlock_t { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("pthread_rwlock_t") - // FIXME: .field("size", &self.size) - .finish() -@@ -1007,7 +1007,7 @@ cfg_if! { - impl Eq for pthread_barrier_t {} - - impl ::fmt::Debug for pthread_barrier_t { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("pthread_barrier_t") - .field("size", &self.size) - .finish() -@@ -1041,7 +1041,7 @@ cfg_if! { - impl Eq for sockaddr_alg {} - - impl ::fmt::Debug for sockaddr_alg { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("sockaddr_alg") - .field("salg_family", &self.salg_family) - .field("salg_type", &self.salg_type) -@@ -1072,7 +1072,7 @@ cfg_if! { - impl Eq for uinput_setup {} - - impl ::fmt::Debug for uinput_setup { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("uinput_setup") - .field("id", &self.id) - .field("name", &&self.name[..]) -@@ -1103,7 +1103,7 @@ cfg_if! { - impl Eq for uinput_user_dev {} - - impl ::fmt::Debug for uinput_user_dev { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("uinput_setup") - .field("name", &&self.name[..]) - .field("id", &self.id) -@@ -1152,7 +1152,7 @@ cfg_if! { - - #[allow(deprecated)] - impl ::fmt::Debug for af_alg_iv { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("af_alg_iv") - .field("ivlen", &self.ivlen) - .finish() -@@ -1176,7 +1176,7 @@ cfg_if! { - } - impl Eq for mq_attr {} - impl ::fmt::Debug for mq_attr { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("mq_attr") - .field("mq_flags", &self.mq_flags) - .field("mq_maxmsg", &self.mq_maxmsg) -@@ -1195,7 +1195,7 @@ cfg_if! { - } - #[cfg(libc_union)] - impl ::fmt::Debug for __c_anonymous_ifr_ifru { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("ifr_ifru") - .field("ifru_addr", unsafe { &self.ifru_addr }) - .field("ifru_dstaddr", unsafe { &self.ifru_dstaddr }) -@@ -1214,7 +1214,7 @@ cfg_if! { - } - } - impl ::fmt::Debug for ifreq { -- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { - f.debug_struct("ifreq") - .field("ifr_name", &self.ifr_name) - .field("ifr_ifru", &self.ifr_ifru) -diff --git a/src/unix/mlibc/mod.rs b/src/unix/mlibc/mod.rs -index 2046530..8a4f974 100644 ---- a/src/unix/mlibc/mod.rs -+++ b/src/unix/mlibc/mod.rs -@@ -47,7 +47,6 @@ pub type fsfilcnt_t = ::c_uint; - pub type sigset_t = ::c_long; - - // abis/mlibc/termios.h --pub type cc_t = ::c_uint; - pub type speed_t = ::c_uint; - pub type tcflag_t = ::c_uint; - -@@ -70,7 +69,7 @@ pub type in_addr_t = u32; - pub type in_port_t = u16; - - // abis/mlibc/socket.h --pub type sa_family_t = ::c_uint; -+pub type sa_family_t = ::c_int; - - // options/linux/include/sys/poll.h - pub type nfds_t = ::size_t; -@@ -112,7 +111,7 @@ s! { - pub sa_handler: ::Option, - pub sa_mask: sigset_t, - pub sa_flags: ::c_int, -- pub sa_sigaction: ::Option, -+ pub sa_sigaction: ::sighandler_t, - } - - // abis/mlibc/termios.h -@@ -121,7 +120,8 @@ s! { - pub c_oflag: tcflag_t, - pub c_cflag: tcflag_t, - pub c_lflag: tcflag_t, -- pub c_cc: [cc_t; NCCS], -+ pub c_line: ::cc_t, -+ pub c_cc: [::cc_t; NCCS], - pub ibaud: speed_t, - pub obaud: speed_t, - } -@@ -174,7 +174,7 @@ s! { - pub sin_family: sa_family_t, - pub sin_port: in_port_t, - pub sin_addr: in_addr, -- pub __padding: [u8; 8], // std relies on this being public -+ pub sin_zero: [u8; 8], // std relies on this being public - } - pub struct sockaddr_in6 { - pub sin6_family: sa_family_t, -@@ -238,22 +238,51 @@ s! { - // options/posix/include/bits/posix/pthread_t.h - pub struct __mlibc_thread_data {} - -+ // options/posix/include/sched.h -+ pub struct sched_param { -+ pub sched_priority: ::c_int, -+ } -+ -+ pub struct __mlibc_cpu_set { -+ pub __bits: [::c_ulong; 128 / core::mem::size_of::<::c_long>()], -+ } -+ - // options/posix/include/bits/posix/pthread.h - pub struct pthread_attr_t { -- pub __mlibc_deatchstate: ::c_int, -+ pub __mlibc_guardsize: ::size_t, -+ pub __mlibc_stacksize: ::size_t, -+ pub __mlibc_stackaddr: *mut ::c_void, -+ pub __mlibc_detachstate: ::c_int, -+ pub __mlibc_scope: ::c_int, -+ pub __mlibc_inheritsched: ::c_int, -+ pub __mlibc_schedparam: sched_param, -+ pub __mlibc_schedpolicy: ::c_int, -+ pub __mlibc_cpuset: *mut __mlibc_cpu_set, -+ pub __mlibc_cpusetsize: ::size_t, -+ pub __mlibc_sigmask: sigset_t, -+ pub __mlibc_sigmaskset: ::c_int, - } - pub struct pthread_cond_t { - pub __mlibc_seq: ::c_uint, -+ pub __mlibc_flags: ::c_uint, -+ pub __mlibc_clock: clockid_t, -+ } -+ pub struct pthread_condattr_t { -+ pub __mlibc_pshared: ::c_int, -+ pub __mlibc_clock: clockid_t, - } -- pub struct pthread_condattr_t {} - pub struct pthread_mutex_t { - pub __mlibc_state: ::c_uint, - pub __mlibc_recursion: ::c_uint, - pub __mlibc_flags: ::c_uint, -+ pub __mlibc_prioceiling: ::c_int, - } - pub struct pthread_mutexattr_t { - pub __mlibc_type: ::c_int, - pub __mlibc_robust: ::c_int, -+ pub __mlibc_protocol: ::c_int, -+ pub __mlibc_pshared: ::c_int, -+ pub __mlibc_prioceiling: ::c_int, - } - pub struct pthread_rwlock_t { - pub __mlibc_m: ::c_uint, -@@ -319,10 +348,172 @@ s! { - pub struct fd_set { - pub fds_bits: [c_char; 128], - } -+ -+ pub struct cmsghdr { -+ // FIXME: mio needs this to be a size_t for some reason -+ // pub cmsg_len: ::socklen_t, -+ pub cmsg_len: ::size_t, -+ pub cmsg_level: ::c_int, -+ pub cmsg_type: ::c_int, -+ } -+ -+ pub struct msghdr { -+ pub msg_name: *mut ::c_void, -+ pub msg_namelen: ::socklen_t, -+ pub msg_iov: *mut ::iovec, -+ pub msg_iovlen: ::c_int, -+ pub msg_control: *mut ::c_void, -+ pub msg_controllen: ::size_t, // nix assumes this is a size_t -+ pub msg_flags: ::c_int, -+ } -+ -+ // options/linux-headers/include/linux/if_packet.h -+ pub struct sockaddr_ll { -+ pub sll_family: ::c_ushort, -+ pub sll_protocol: ::c_ushort, -+ pub sll_ifindex: ::c_int, -+ pub sll_hatype: ::c_ushort, -+ pub sll_pkttype: ::c_uchar, -+ pub sll_halen: ::c_uchar, -+ pub sll_addr: [::c_uchar; 8] -+ } -+ -+ pub struct flock { -+ pub l_type: ::c_short, -+ pub l_whence: ::c_short, -+ pub l_start: ::off_t, -+ pub l_len: ::off_t, -+ pub l_pid: ::pid_t, -+ } -+ -+ pub struct __c_anonymous_ifru_map { -+ pub mem_start: ::c_ulong, -+ pub mem_end: ::c_ulong, -+ pub base_addr: ::c_ushort, -+ pub irq: ::c_uchar, -+ pub dma: ::c_uchar, -+ pub port: ::c_uchar, -+ } -+} -+ -+cfg_if! { -+ if #[cfg(feature = "extra_traits")] { -+ impl ::fmt::Debug for epoll_event { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { -+ let events = self.events; -+ let u64 = self.u64; -+ f.debug_struct("epoll_event") -+ .field("events", &events) -+ .field("u64", &u64) -+ .finish() -+ } -+ } -+ impl PartialEq for epoll_event { -+ fn eq(&self, other: &epoll_event) -> bool { -+ self.events == other.events -+ && self.u64 == other.u64 -+ } -+ } -+ impl Eq for epoll_event {} -+ impl ::hash::Hash for epoll_event { -+ fn hash(&self, state: &mut H) { -+ let events = self.events; -+ let u64 = self.u64; -+ events.hash(state); -+ u64.hash(state); -+ } -+ } -+ -+ #[cfg(libc_union)] -+ impl ::fmt::Debug for __c_anonymous_ifr_ifru { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { -+ f.debug_struct("ifr_ifru") -+ .field("ifru_addr", unsafe { &self.ifru_addr }) -+ .field("ifru_dstaddr", unsafe { &self.ifru_dstaddr }) -+ .field("ifru_broadaddr", unsafe { &self.ifru_broadaddr }) -+ .field("ifru_netmask", unsafe { &self.ifru_netmask }) -+ .field("ifru_hwaddr", unsafe { &self.ifru_hwaddr }) -+ .field("ifru_flags", unsafe { &self.ifru_flags }) -+ .field("ifru_ifindex", unsafe { &self.ifru_ifindex }) -+ .field("ifru_metric", unsafe { &self.ifru_metric }) -+ .field("ifru_mtu", unsafe { &self.ifru_mtu }) -+ .field("ifru_map", unsafe { &self.ifru_map }) -+ .field("ifru_slave", unsafe { &self.ifru_slave }) -+ .field("ifru_newname", unsafe { &self.ifru_newname }) -+ .field("ifru_data", unsafe { &self.ifru_data }) -+ .finish() -+ } -+ } -+ -+ impl ::fmt::Debug for ifreq { -+ fn fmt(&self, f: &mut ::fmt::Formatter<'_>) -> ::fmt::Result { -+ f.debug_struct("ifreq") -+ .field("ifr_name", &self.ifr_name) -+ .field("ifr_ifru", &self.ifr_ifru) -+ .finish() -+ } -+ } -+ } -+} -+ -+s_no_extra_traits! { -+ // options/linux/include/sys/epoll.h -+ #[cfg_attr(target_arch = "x86_64", repr(packed))] -+ pub struct epoll_event { -+ pub events: u32, -+ pub u64: u64, -+ } -+ -+ // options/posix/include/net/if.h -+ #[cfg(libc_union)] -+ pub union __c_anonymous_ifr_ifru { -+ pub ifru_addr: ::sockaddr, -+ pub ifru_dstaddr: ::sockaddr, -+ pub ifru_broadaddr: ::sockaddr, -+ pub ifru_netmask: ::sockaddr, -+ pub ifru_hwaddr: ::sockaddr, -+ pub ifru_flags: ::c_short, -+ pub ifru_ifindex: ::c_int, -+ pub ifru_metric: ::c_int, -+ pub ifru_mtu: ::c_int, -+ pub ifru_map: __c_anonymous_ifru_map, -+ pub ifru_slave: [::c_char; ::IFNAMSIZ], -+ pub ifru_newname: [::c_char; ::IFNAMSIZ], -+ pub ifru_data: *mut ::c_char, -+ } -+ -+ pub struct ifreq { -+ /// if name, e.g. "en0" -+ pub ifr_name: [::c_char; ::IFNAMSIZ], -+ #[cfg(libc_union)] -+ pub ifr_ifru: __c_anonymous_ifr_ifru, -+ #[cfg(not(libc_union))] -+ pub ifr_ifru: ::sockaddr, -+ } - } - - // options/posix/include/sys/wait.h - safe_f! { -+ pub fn CMSG_FIRSTHDR(_mhdr: *const msghdr) -> *mut cmsghdr { -+ core::unimplemented!() -+ } -+ -+ pub fn CMSG_NXTHDR(_mhdr: *const ::msghdr, _cmsg: *const ::cmsghdr) -> *mut ::cmsghdr { -+ core::unimplemented!() -+ } -+ -+ pub fn CMSG_LEN(_length: ::c_uint) -> ::c_uint { -+ core::unimplemented!() -+ } -+ -+ pub fn CMSG_DATA(_cmsg: *const cmsghdr) -> *mut ::c_uchar { -+ core::unimplemented!() -+ } -+ -+ pub fn CMSG_SPACE(_len: ::c_uint) -> ::c_uint { -+ core::unimplemented!() -+ } -+ - pub {const} fn WCOREDUMP(x: ::c_int) -> bool { - x & WCOREFLAG != 0 - } -@@ -349,6 +540,104 @@ safe_f! { - } - } - -+// abis/linux/termios.h - indices for the `c_cc` array in struct termios -+pub const NCCS: ::size_t = 32; -+pub const VINTR: ::c_int = 0; -+pub const VQUIT: ::c_int = 1; -+pub const VERASE: ::c_int = 2; -+pub const VKILL: ::c_int = 3; -+pub const VEOF: ::size_t = 4; -+pub const VTIME: ::c_int = 5; -+pub const VMIN: ::c_int = 6; -+pub const VSWTC: ::c_int = 7; -+pub const VSTART: ::c_int = 8; -+pub const VSTOP: ::c_int = 9; -+pub const VSUSP: ::c_int = 10; -+pub const VEOL: ::c_int = 11; -+pub const VREPRINT: ::c_int = 12; -+pub const VDISCARD: ::c_int = 13; -+pub const VWERASE: ::c_int = 14; -+pub const VLNEXT: ::c_int = 15; -+pub const VEOL2: ::c_int = 16; -+ -+// abis/linux/termios.h - bitwise flags for c_iflag in struct termios -+pub const BRKINT: ::c_uint = 0o000002; -+pub const ICRNL: ::c_uint = 0o000400; -+pub const IGNBRK: ::c_uint = 0o000001; -+pub const IGNCR: ::c_uint = 0o000200; -+pub const IGNPAR: ::c_uint = 0o000004; -+pub const INLCR: ::c_uint = 0o000100; -+pub const INPCK: ::c_uint = 0o000020; -+pub const ISTRIP: ::c_uint = 0o000040; -+pub const IXANY: ::c_uint = 0o004000; -+pub const IXOFF: ::c_uint = 0o010000; -+pub const IXON: ::c_uint = 0o002000; -+pub const PARMRK: ::c_uint = 0o000010; -+ -+// abis/linux/termios.h - bitwise flags for c_oflag in struct termios -+pub const OPOST: ::c_uint = 0o000001; -+pub const ONLCR: ::c_int = 0o000004; -+pub const OCRNL: ::c_int = 0o000010; -+pub const ONOCR: ::c_int = 0o000020; -+pub const ONLRET: ::c_int = 0o000040; -+pub const OFDEL: ::c_int = 0o000200; -+pub const OFILL: ::c_int = 0o000100; -+ -+pub const NLDLY: ::c_int = 0o000400; -+pub const NL0: ::c_int = 0o000000; -+pub const NL1: ::c_int = 0o000400; -+ -+pub const CRDLY: ::c_int = 0o003000; -+pub const CR0: ::c_int = 0o000000; -+pub const CR1: ::c_int = 0o001000; -+pub const CR2: ::c_int = 0o002000; -+pub const CR3: ::c_int = 0o003000; -+ -+pub const TABDLY: ::c_int = 0o014000; -+pub const TAB0: ::c_int = 0o000000; -+pub const TAB1: ::c_int = 0o004000; -+pub const TAB2: ::c_int = 0o010000; -+pub const TAB3: ::c_int = 0o014000; -+ -+pub const XTABS: ::c_int = 0o014000; -+pub const BSDLY: ::c_int = 0o020000; -+pub const BS0: ::c_int = 0o000000; -+pub const BS1: ::c_int = 0o020000; -+ -+pub const VTDLY: ::c_int = 0o040000; -+pub const VT0: ::c_int = 0o000000; -+pub const VT1: ::c_int = 0o040000; -+ -+pub const FFDLY: ::c_int = 0o100000; -+pub const FF0: ::c_int = 0o000000; -+pub const FF1: ::c_int = 0o100000; -+ -+// abis/linux/termios.h - bitwise constants for c_cflag in struct termios -+pub const CSIZE: ::c_int = 0o000060; -+pub const CS5: ::c_uint = 0o000000; -+pub const CS6: ::c_int = 0o000020; -+pub const CS7: ::c_int = 0o000040; -+pub const CS8: ::c_int = 0o000060; -+ -+pub const CSTOPB: ::c_int = 0o000100; -+pub const CREAD: ::c_int = 0o000200; -+pub const PARENB: ::c_int = 0o000400; -+pub const PARODD: ::c_int = 0o001000; -+pub const HUPCL: ::c_int = 0o002000; -+pub const CLOCAL: ::c_int = 0o004000; -+ -+// abis/linux/termios.h - bitwise constants for c_lflag in struct termios -+pub const ECHO: ::c_uint = 0o000010; -+pub const ECHOE: ::c_int = 0o000020; -+pub const ECHOK: ::c_int = 0o000040; -+pub const ECHONL: ::c_int = 0o000100; -+pub const ICANON: ::c_int = 0o000002; -+pub const IEXTEN: ::c_int = 0o100000; -+pub const ISIG: ::c_int = 0o000001; -+pub const NOFLSH: ::c_int = 0o000200; -+pub const TOSTOP: ::c_int = 0o000400; -+pub const ECHOPRT: ::c_int = 0o002000; -+ - // abis/mlibc/vm-flags.h - pub const MAP_ANON: ::c_int = 8; - pub const MAP_PRIVATE: ::c_int = 1; -@@ -356,11 +645,24 @@ pub const MAP_SHARED: ::c_int = 2; - pub const PROT_EXEC: ::c_int = 4; - pub const PROT_READ: ::c_int = 1; - pub const PROT_WRITE: ::c_int = 2; -+pub const PROT_NONE: ::c_int = 0; -+pub const MAP_FIXED: ::c_int = 2; -+pub const MAP_NORESERVE: ::c_int = 0x10; - - // options/posix/include/sys/mman.h -+pub const MAP_FILE: ::c_int = 0; - pub const MAP_FAILED: *mut ::c_void = usize::MAX as *mut ::c_void; - pub const MS_ASYNC: ::c_int = 1; - pub const MS_SYNC: ::c_int = 2; -+pub const MADV_NORMAL: ::c_int = 0; -+pub const MADV_RANDOM: ::c_int = 1; -+pub const MADV_SEQUENTIAL: ::c_int = 2; -+pub const MADV_WILLNEED: ::c_int = 3; -+pub const MADV_DONTNEED: ::c_int = 4; -+pub const MADV_FREE: ::c_int = 8; -+pub const MS_INVALIDATE: ::c_int = 4; -+pub const MCL_CURRENT: ::c_int = 1; -+pub const MCL_FUTURE: ::c_int = 2; - - // options/ansi/include/time.h - pub const CLOCK_MONOTONIC: clockid_t = 1; -@@ -369,33 +671,49 @@ pub const CLOCK_REALTIME: clockid_t = 0; - // options/posix/include/netdb.h - pub const EAI_SYSTEM: ::c_int = 9; - --// options/posix/include/termios.h - constants for tcsetattr() --pub const TCSANOW: ::c_int = 1; --pub const TCSADRAIN: ::c_int = 2; --pub const TCSAFLUSH: ::c_int = 3; -- --// options/posix/include/termios.h - bitwise constants for c_lflag in struct termios --pub const ECHO: ::tcflag_t = 0x0001; --pub const ECHOE: ::tcflag_t = 0x0002; --pub const ECHOK: ::tcflag_t = 0x0004; --pub const ECHONL: ::tcflag_t = 0x0008; --pub const ICANON: ::tcflag_t = 0x0010; --pub const IEXTEN: ::tcflag_t = 0x0020; --pub const ISIG: ::tcflag_t = 0x0040; --pub const NOFLSH: ::tcflag_t = 0x0080; --pub const TOSTOP: ::tcflag_t = 0x0100; --pub const ECHOPR: ::tcflag_t = 0x0200; -- - // abis/mlibc/in.h --pub const IPV6_ADD_MEMBERSHIP: ::c_int = 1; --pub const IPV6_DROP_MEMBERSHIP: ::c_int = 2; -+pub const IPV6_JOIN_GROUP: ::c_int = 1; -+pub const IPV6_LEAVE_GROUP: ::c_int = 2; -+pub const IPV6_MULTICAST_HOPS: ::c_int = 3; -+pub const IPV6_MULTICAST_IF: ::c_int = 4; - pub const IPV6_MULTICAST_LOOP: ::c_int = 5; -+pub const IPV6_UNICAST_HOPS: ::c_int = 6; - pub const IPV6_V6ONLY: ::c_int = 7; -+pub const IPV6_PMTUDISC_DONT: ::c_int = 8; -+pub const IPV6_PMTUDISC_DO: ::c_int = 9; -+pub const IPV6_MTU_DISCOVER: ::c_int = 23; -+pub const IPV6_RECVERR: ::c_int = 25; -+pub const IPV6_RECVPKTINFO: ::c_int = 49; -+pub const IPV6_PKTINFO: ::c_int = 50; -+pub const IPV6_RECVHOPLIMIT: ::c_int = 51; -+pub const IPV6_HOPLIMIT: ::c_int = 52; -+pub const IPV6_TCLASS: ::c_int = 67; -+pub const IP_TOS: ::c_int = 1; -+pub const IP_TTL: ::c_int = 2; -+pub const IP_OPTIONS: ::c_int = 4; -+pub const IP_PKTINFO: ::c_int = 8; -+pub const IP_MTU_DISCOVER: ::c_int = 10; -+pub const IP_RECVERR: ::c_int = 11; -+pub const IP_RECVTTL: ::c_int = 12; -+ -+pub const IP_DEFAULT_MULTICAST_TTL: ::c_int = 1; -+pub const IP_MULTICAST_IF: ::c_int = 32; -+pub const IP_MULTICAST_TTL: ::c_int = 33; -+pub const IP_MULTICAST_LOOP: ::c_int = 34; - pub const IP_ADD_MEMBERSHIP: ::c_int = 35; - pub const IP_DROP_MEMBERSHIP: ::c_int = 36; --pub const IP_MULTICAST_LOOP: ::c_int = 34; --pub const IP_MULTICAST_TTL: ::c_int = 33; --pub const IP_TTL: ::c_int = 2; -+pub const IP_UNBLOCK_SOURCE: ::c_int = 37; -+pub const IP_BLOCK_SOURCE: ::c_int = 38; -+pub const IP_ADD_SOURCE_MEMBERSHIP: ::c_int = 39; -+pub const IP_DROP_SOURCE_MEMBERSHIP: ::c_int = 40; -+pub const MCAST_JOIN_SOURCE_GROUP: ::c_int = 46; -+pub const MCAST_LEAVE_SOURCE_GROUP: ::c_int = 47; -+ -+pub const IPV6_ADD_MEMBERSHIP: ::c_int = IPV6_JOIN_GROUP; -+pub const IPV6_DROP_MEMBERSHIP: ::c_int = IPV6_LEAVE_GROUP; -+ -+// FIXME: not defined in mlibc -+pub const TCP_KEEPIDLE: ::c_int = 4; - - // abis/linux/signal.h - pub const SIGABRT: ::c_int = 6; -@@ -436,45 +754,121 @@ pub const SIGSYS: ::c_int = 31; - pub const SIGUNUSED: ::c_int = SIGSYS; - pub const SIGCANCEL: ::c_int = 32; - -+pub const SA_SIGINFO: ::c_int = 4; -+pub const SA_RESTART: ::c_int = 0x10000000; -+ -+pub const SIG_DFL: ::sighandler_t = 0 as ::sighandler_t; -+pub const SIG_IGN: ::sighandler_t = 1 as ::sighandler_t; -+pub const SIG_ERR: ::sighandler_t = !0 as ::sighandler_t; -+ - // abis/mlibc/signal.h - constants for sigprocmask() - pub const SIG_BLOCK: ::c_int = 0; - pub const SIG_UNBLOCK: ::c_int = 1; - pub const SIG_SETMASK: ::c_int = 2; - - // abis/mlibc/termios.h --pub const NCCS: usize = 11; -+pub const B0: ::c_uint = 0; -+pub const B50: ::c_uint = 1; -+pub const B75: ::c_uint = 2; -+pub const B110: ::c_uint = 3; -+pub const B134: ::c_uint = 4; -+pub const B150: ::c_uint = 5; -+pub const B200: ::c_uint = 6; -+pub const B300: ::c_uint = 7; -+pub const B600: ::c_uint = 8; -+pub const B1200: ::c_uint = 9; -+pub const B1800: ::c_uint = 10; -+pub const B2400: ::c_uint = 11; -+pub const B4800: ::c_uint = 12; -+pub const B9600: ::c_uint = 13; -+pub const B19200: ::c_uint = 14; -+pub const B38400: ::c_uint = 15; -+pub const B57600: ::c_uint = 16; -+pub const B115200: ::c_uint = 17; -+pub const B230400: ::c_uint = 18; -+pub const TCIFLUSH: ::c_int = 1; -+pub const TCIOFF: ::c_int = 1; -+pub const TCIOFLUSH: ::c_int = 2; -+pub const TCION: ::c_int = 2; -+pub const TCOFLUSH: ::c_int = 3; -+pub const TCOOFF: ::c_int = 3; -+pub const TCOON: ::c_int = 4; -+pub const TCSADRAIN: ::c_int = 2; -+pub const TCSAFLUSH: ::c_int = 3; -+pub const TCSANOW: ::c_int = 1; -+pub const TIOCSCTTY: ::c_ulong = 0x540e; -+pub const TIOCSWINSZ: ::c_ulong = 0x5414; - - // options/posix/include/termios.h - pub const TIOCGWINSZ: ::c_ulong = 0x5413; - -+// options/ansi/include/locale.h -+pub const LC_CTYPE: ::c_int = 3; -+ - // options/ansi/include/stdlib.h - pub const EXIT_FAILURE: ::c_int = 1; - pub const EXIT_SUCCESS: ::c_int = 0; - - // options/posix/include/dlfcn.h - pub const RTLD_DEFAULT: *mut ::c_void = 0 as *mut ::c_void; -+pub const RTLD_LAZY: ::c_int = 32; - - // options/posix/include/unistd.h -+pub const F_OK: ::c_int = 1; -+pub const R_OK: ::c_int = 2; - pub const STDERR_FILENO: ::c_int = 2; - pub const STDIN_FILENO: ::c_int = 0; - pub const STDOUT_FILENO: ::c_int = 1; -+pub const W_OK: ::c_int = 4; -+pub const X_OK: ::c_int = 8; -+pub const _PC_NAME_MAX: ::c_int = 3; -+pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 7; - pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 1; - pub const _SC_NPROCESSORS_ONLN: ::c_int = 6; -+pub const _SC_NGROUPS_MAX: ::c_int = 10; - pub const _SC_PAGESIZE: ::c_int = _SC_PAGE_SIZE; - pub const _SC_PAGE_SIZE: ::c_int = 3; - - // abis/mlibc/socket.h -+pub const AF_APPLETALK: ::c_int = PF_APPLETALK; -+pub const AF_BLUETOOTH: ::c_int = PF_BLUETOOTH; -+pub const AF_DECnet: ::c_int = PF_DECnet; - pub const AF_INET6: ::c_int = PF_INET6; - pub const AF_INET: ::c_int = PF_INET; -+pub const AF_IPX: ::c_int = PF_IPX; -+pub const AF_ISDN: ::c_int = PF_ISDN; -+pub const AF_PACKET: ::c_int = PF_PACKET; -+pub const AF_SNA: ::c_int = PF_SNA; - pub const AF_UNIX: ::c_int = 3; - pub const MSG_PEEK: ::c_int = 0x20; -+pub const MSG_TRUNC: ::c_int = 0x40; -+pub const AF_UNSPEC: ::c_int = PF_UNSPEC; -+pub const MSG_CTRUNC: ::c_int = 1; -+pub const MSG_CMSG_CLOEXEC: ::c_int = 0x2000; -+pub const MSG_EOR: ::c_int = 4; -+pub const MSG_OOB: ::c_int = 8; -+pub const MSG_WAITALL: ::c_int = 0x80; -+pub const PF_APPLETALK: ::c_int = 7; -+pub const PF_BLUETOOTH: ::c_int = 8; -+pub const PF_DECnet: ::c_int = 9; -+pub const MSG_DONTWAIT: ::c_int = 0x1000; - pub const PF_INET6: ::c_int = 2; - pub const PF_INET: ::c_int = 1; - pub const PF_UNIX: ::c_int = 3; -+pub const PF_UNSPEC: ::c_int = 4; -+pub const SCM_RIGHTS: ::c_int = 1; -+pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; - pub const SHUT_RD: ::c_int = 1; - pub const SHUT_RDWR: ::c_int = 2; - pub const SHUT_WR: ::c_int = 3; - pub const SOCK_DGRAM: ::c_int = 1; -+pub const SOCK_RAW: ::c_int = 2; -+pub const SOCK_RDM: ::c_int = 0x40000; -+pub const SOCK_SEQPACKET: ::c_int = 3; -+pub const PF_IPX: ::c_int = 10; -+pub const PF_ISDN: ::c_int = 11; -+pub const PF_PACKET: ::c_int = 13; -+pub const PF_SNA: ::c_int = 12; - pub const SOCK_STREAM: ::c_int = 4; - pub const SOL_SOCKET: ::c_int = 1; - pub const SO_ACCEPTCONN: ::c_int = 1; -@@ -494,6 +888,8 @@ pub const SO_SNDLOWAT: ::c_int = 14; - pub const SO_SNDTIMEO: ::c_int = 15; - pub const SO_TYPE: ::c_int = 16; - pub const SO_SNDBUFFORCE: ::c_int = 17; -+pub const TCP_KEEPCNT: ::c_int = 6; -+pub const TCP_KEEPINTVL: ::c_int = 5; - pub const SO_PEERCRED: ::c_int = 18; - pub const SO_ATTACH_FILTER: ::c_int = 19; - pub const SO_PASSCRED: ::c_int = 20; -@@ -503,6 +899,12 @@ pub const SO_PROTOCOL: ::c_int = 23; - pub const SO_REUSEPORT: ::c_int = 24; - pub const SO_TIMESTAMP: ::c_int = 25; - -+// options/posix/include/sys/file.h -+pub const LOCK_EX: ::c_int = 2; -+pub const LOCK_NB: ::c_int = 4; -+pub const LOCK_SH: ::c_int = 1; -+pub const LOCK_UN: ::c_int = 8; -+ - // abis/mlibc/errno.h - pub const EDOM: ::c_int = 1; - pub const EILSEQ: ::c_int = 2; -@@ -592,15 +994,24 @@ pub const ENOTBLK: ::c_int = 1083; - - // options/posix/include/fcntl.h - pub const AT_FDCWD: ::c_int = -100; --pub const F_DUPFD: ::c_int = 1; - pub const F_DUPFD_CLOEXEC: ::c_int = 2; -+pub const AT_REMOVEDIR: ::c_int = 8; - pub const F_GETFD: ::c_int = 3; - pub const F_SETFD: ::c_int = 4; -+pub const AT_SYMLINK_FOLLOW: ::c_int = 2; -+pub const AT_SYMLINK_NOFOLLOW: ::c_int = 4; -+pub const F_DUPFD: ::c_int = 1; - pub const F_GETFL: ::c_int = 5; - pub const F_SETFL: ::c_int = 6; - pub const F_GETLK: ::c_int = 7; - pub const F_SETLK: ::c_int = 8; - pub const F_SETLKW: ::c_int = 9; -+pub const O_DIRECTORY: ::c_int = 0x00020; -+pub const O_NOFOLLOW: ::c_int = 0x100; -+pub const O_ASYNC: ::c_int = 0x40000; -+pub const O_NDELAY: ::c_int = 0x400; -+pub const O_NOCTTY: ::c_int = 0x80; -+pub const O_SYNC: ::c_int = 0x2000; - pub const F_GETOWN: ::c_int = 10; - pub const F_SETOWN: ::c_int = 11; - pub const O_ACCMODE: ::c_int = 7; -@@ -644,23 +1055,56 @@ pub const S_IXGRP: mode_t = 0o10; - pub const S_IXOTH: mode_t = 0o1; - pub const S_IXUSR: mode_t = 0o100; - -+// Used by utimensat() and friends -+pub const UTIME_NOW: c_long = (1 << 30) - 1; -+pub const UTIME_OMIT: c_long = (1 << 30) - 2; -+ - // options/posix/include/sys/wait.h - pub const WCOREFLAG: ::c_int = 0x80; - pub const WNOHANG: ::c_int = 2; - - // options/linux/include/sys/poll.h --// TODO: Port epoll! - pub const POLLHUP: ::c_short = 8; - pub const POLLIN: ::c_short = 1; - pub const POLLNVAL: ::c_short = 0x40; - pub const POLLOUT: ::c_short = 2; - -+// options/linux/include/sys/epoll.h -+pub const EPOLLERR: ::c_int = 8; -+pub const EPOLLET: ::c_int = 1 << 31; -+pub const EPOLLHUP: ::c_int = 0x10; -+pub const EPOLLIN: ::c_int = 1; -+pub const EPOLLMSG: ::c_int = 0x400; -+pub const EPOLLONESHOT: ::c_int = 1 << 30; -+pub const EPOLLOUT: ::c_int = 4; -+pub const EPOLLPRI: ::c_int = 2; -+pub const EPOLLRDBAND: ::c_int = 0x80; -+pub const EPOLLRDHUP: ::c_int = 0x2000; -+pub const EPOLLRDNORM: ::c_int = 0x40; -+pub const EPOLLWRBAND: ::c_int = 0x200; -+pub const EPOLLWRNORM: ::c_int = 0x100; -+pub const EPOLLWAKEUP: ::c_int = 1 << 29; -+pub const EPOLL_CLOEXEC: ::c_int = 1; -+pub const EPOLL_CTL_ADD: ::c_int = 1; -+pub const EPOLL_CTL_DEL: ::c_int = 2; -+pub const EPOLL_CTL_MOD: ::c_int = 3; -+ -+// options/linux/include/sys/eventfd.h -+pub const EFD_CLOEXEC: ::c_int = O_CLOEXEC; -+pub const EFD_NONBLOCK: ::c_int = O_NONBLOCK; -+ - // options/glibc/include/sys/ioctl.h - pub const FIOCLEX: ::c_ulong = 0x5451; - pub const FIONBIO: ::c_ulong = 0x5421; - - // options/ansi/include/limits.h - pub const PTHREAD_STACK_MIN: ::size_t = 16384; -+pub const PATH_MAX: ::size_t = 4096; -+ -+// abis/linux/ioctls.h -+pub const SIOCGIFHWADDR: ::c_ulong = 0x8927; -+pub const SIOCSIFADDR: ::c_ulong = 0x8916; -+pub const SIOCSIFNETMASK: ::c_ulong = 0x891c; - - // options/posix/include/pthread.h - align_const! { -@@ -668,9 +1112,12 @@ align_const! { - __mlibc_state: 0, - __mlibc_recursion: 0, - __mlibc_flags: 0, -+ __mlibc_prioceiling: 0, - }; - pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - __mlibc_seq: 0, -+ __mlibc_flags: 0, -+ __mlibc_clock: 0, - }; - pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - __mlibc_m: 0, -@@ -689,11 +1136,40 @@ pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; - pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; - - extern "C" { -+ pub fn __errno_location() -> *mut ::c_int; -+ pub fn acct(filename: *const ::c_char) -> ::c_int; - pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int; - pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; - pub fn endpwent(); -+ pub fn epoll_create(size: ::c_int) -> ::c_int; -+ pub fn epoll_create1(flags: ::c_int) -> ::c_int; -+ pub fn epoll_ctl(epfd: ::c_int, op: ::c_int, fd: ::c_int, event: *mut ::epoll_event) -+ -> ::c_int; -+ pub fn epoll_wait( -+ epfd: ::c_int, -+ events: *mut ::epoll_event, -+ maxevents: ::c_int, -+ timeout: ::c_int, -+ ) -> ::c_int; -+ pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; -+ pub fn forkpty( -+ amaster: *mut ::c_int, -+ name: *mut ::c_char, -+ termp: *mut termios, -+ winp: *mut ::winsize, -+ ) -> ::pid_t; -+ pub fn futimes(file: ::c_int, times: *const ::timeval) -> ::c_int; -+ pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; - pub fn getpwent() -> *mut passwd; -+ pub fn openpty( -+ amaster: *mut ::c_int, -+ aslave: *mut ::c_int, -+ name: *mut ::c_char, -+ termp: *const termios, -+ winp: *const ::winsize, -+ ) -> ::c_int; -+ pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; - pub fn getgrgid_r( - gid: ::gid_t, - grp: *mut ::group, -@@ -728,13 +1204,24 @@ extern "C" { - buflen: ::size_t, - result: *mut *mut passwd, - ) -> ::c_int; -+ pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int; - pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; -+ pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; - pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; -- pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; -- pub fn pthread_condattr_setclock( -- attr: *mut pthread_condattr_t, -- clock_id: ::clockid_t, -+ pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; -+ pub fn shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int; -+ pub fn shm_unlink(name: *const ::c_char) -> ::c_int; -+ pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; -+ pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; -+ pub fn utimensat( -+ dirfd: ::c_int, -+ path: *const ::c_char, -+ times: *const ::timespec, -+ flag: ::c_int, - ) -> ::c_int; -+ pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; -+ pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, clock_id: clockid_t) -+ -> ::c_int; - pub fn pthread_create( - thread: *mut ::pthread_t, - attr: *const ::pthread_attr_t, -@@ -752,7 +1239,16 @@ extern "C" { - addr: *mut ::sockaddr, - addrlen: *mut ::socklen_t, - ) -> ::ssize_t; -+ pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; -+ pub fn sendmsg(fd: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; - pub fn setgroups(ngroups: ::c_int, ptr: *const ::gid_t) -> ::c_int; - pub fn setpwent(); - pub fn writev(fd: ::c_int, iov: *const ::iovec, count: ::c_int) -> ::ssize_t; -+ -+ // Non standard extensions, also found on modern BSD's. -+ // -+ // options/posix/include/sys/uio.h -+ pub fn preadv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; -+ pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -+ -> ::ssize_t; - } --- -2.40.1 - diff --git a/patches/rust-libloading/rust-libloading.patch b/patches/rust-libloading/rust-libloading.patch index ac3ec05e6f1..743d6cedefc 100644 --- a/patches/rust-libloading/rust-libloading.patch +++ b/patches/rust-libloading/rust-libloading.patch @@ -1,14 +1,15 @@ -From f5fab150ee8fbfdef46888837b6e6d43fd3ec1c0 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 13:39:51 +1100 +From d6dfe23ee9299412d8281dabb7f5d903e152b589 Mon Sep 17 00:00:00 2001 +From: Anhad Singh +Date: Tue, 10 Oct 2023 17:24:17 +1100 Subject: [PATCH] +Signed-off-by: Anhad Singh --- src/os/unix/consts.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/os/unix/consts.rs b/src/os/unix/consts.rs -index dbe4df9..fbdd2e3 100644 +index ed3edaf..61659ff 100644 --- a/src/os/unix/consts.rs +++ b/src/os/unix/consts.rs @@ -58,7 +58,7 @@ mod posix { @@ -18,9 +19,9 @@ index dbe4df9..fbdd2e3 100644 - if #[cfg(target_os = "haiku")] { + if #[cfg(any(target_os = "haiku", target_os = "aero"))] { pub(super) const RTLD_LAZY: c_int = 0; - } else if #[cfg(any( - target_os = "linux", -@@ -90,7 +90,7 @@ mod posix { + } else if #[cfg(target_os = "aix")] { + pub(super) const RTLD_LAZY: c_int = 4; +@@ -94,7 +94,7 @@ mod posix { } cfg_if! { @@ -29,7 +30,7 @@ index dbe4df9..fbdd2e3 100644 pub(super) const RTLD_NOW: c_int = 1; } else if #[cfg(any( target_os = "linux", -@@ -126,6 +126,7 @@ mod posix { +@@ -133,6 +133,7 @@ mod posix { cfg_if! { if #[cfg(any( target_os = "haiku", @@ -37,14 +38,14 @@ index dbe4df9..fbdd2e3 100644 all(target_os = "android",target_pointer_width = "32"), ))] { pub(super) const RTLD_GLOBAL: c_int = 2; -@@ -193,6 +194,7 @@ mod posix { - +@@ -210,6 +211,7 @@ mod posix { target_os = "fuchsia", target_os = "redox", + target_os = "hurd", + target_os = "aero", ))] { pub(super) const RTLD_LOCAL: c_int = 0; } else { -- -2.38.1 +2.42.0 diff --git a/patches/rust-nix/rust-nix.patch b/patches/rust-nix/rust-nix.patch index 6ff6e5acb49..0c124a2aa8e 100644 --- a/patches/rust-nix/rust-nix.patch +++ b/patches/rust-nix/rust-nix.patch @@ -1,20 +1,26 @@ -From 608f6dc307498272ec3a6317cac3bbbe2a8b74b1 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 12:21:43 +1100 -Subject: [PATCH] +From 2ac82af89ae503c8743dcd96bca3dcbddccd1eea Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Thu, 23 Feb 2023 00:41:07 +0100 +Subject: [PATCH] aero: initial port +Signed-off-by: Dennis Bonke --- - src/errno.rs | 217 +++++++++++++++++++++++++++++++++++++++++ - src/lib.rs | 12 ++- + src/errno.rs | 218 +++++++++++++++++++++++++++++++++++++++++ + src/features.rs | 2 +- + src/lib.rs | 10 +- src/sys/mod.rs | 10 +- - src/sys/socket/addr.rs | 16 +-- - src/sys/socket/mod.rs | 5 +- + src/sys/resource.rs | 2 + + src/sys/signal.rs | 16 +-- + src/sys/socket/addr.rs | 26 +++-- + src/sys/socket/mod.rs | 6 +- src/sys/termios.rs | 54 +++++++++- - src/unistd.rs | 27 +++++ - 7 files changed, 327 insertions(+), 14 deletions(-) + src/sys/time.rs | 3 +- + src/sys/timerfd.rs | 2 +- + src/unistd.rs | 30 ++++++ + 12 files changed, 350 insertions(+), 29 deletions(-) diff --git a/src/errno.rs b/src/errno.rs -index 9c2dfe4..d26d63d 100644 +index 41420e8..aedf294 100644 --- a/src/errno.rs +++ b/src/errno.rs @@ -22,6 +22,7 @@ cfg_if! { @@ -35,7 +41,7 @@ index 9c2dfe4..d26d63d 100644 match errno { UnknownErrno => "Unknown errno", EPERM => "Operation not permitted", -@@ -1557,6 +1561,219 @@ mod consts { +@@ -1562,6 +1566,220 @@ mod consts { } } @@ -111,7 +117,7 @@ index 9c2dfe4..d26d63d 100644 + // ENOTDIR = libc::ENOTDIR, + // ENOTEMPTY = libc::ENOTEMPTY, + // ENOTSOCK = libc::ENOTSOCK, -+ // ENOTSUP = libc::ENOTSUP, ++ ENOTSUP = libc::ENOTSUP, + ENOTTY = libc::ENOTTY, + // ENXIO = libc::ENXIO, + // EOPNOTSUPP = libc::EOPNOTSUPP, @@ -148,7 +154,7 @@ index 9c2dfe4..d26d63d 100644 + + // pub const EL2NSYNC: Errno = Errno::UnknownErrno; + -+ pub fn from_i32(e: i32) -> Errno { ++ pub const fn from_i32(e: i32) -> Errno { + use self::Errno::*; + + match e { @@ -218,7 +224,7 @@ index 9c2dfe4..d26d63d 100644 + // libc::ENOTDIR => ENOTDIR, + // libc::ENOTEMPTY => ENOTEMPTY, + // libc::ENOTSOCK => ENOTSOCK, -+ // libc::ENOTSUP => ENOTSUP, ++ libc::ENOTSUP => ENOTSUP, + // libc::ENOTTY => ENOTTY, + // libc::ENXIO => ENXIO, + // libc::EOPNOTSUPP => EOPNOTSUPP, @@ -252,126 +258,233 @@ index 9c2dfe4..d26d63d 100644 + } + } +} ++ #[cfg(target_os = "dragonfly")] mod consts { +diff --git a/src/features.rs b/src/features.rs +index 6108098..1f937e2 100644 +--- a/src/features.rs ++++ b/src/features.rs +@@ -1,7 +1,7 @@ + //! Feature tests for OS functionality + pub use self::os::*; + +-#[cfg(any(target_os = "linux", target_os = "android"))] ++#[cfg(any(target_os = "linux", target_os = "android", target_os = "aero"))] + mod os { + use std::os::unix::ffi::OsStrExt; + use crate::sys::utsname::uname; diff --git a/src/lib.rs b/src/lib.rs -index 3b534a5..f7c8495 100644 +index d4dcbc4..e5f03c7 100644 --- a/src/lib.rs +++ b/src/lib.rs -@@ -5,12 +5,13 @@ - #![crate_name = "nix"] +@@ -43,9 +43,10 @@ #![cfg(unix)] + #![cfg_attr(docsrs, doc(cfg(all())))] #![allow(non_camel_case_types)] +#![allow(non_snake_case)] - // latest bitflags triggers a rustc bug with cross-crate macro expansions causing dead_code - // warnings even though the macro expands into something with allow(dead_code) - #![allow(dead_code)] #![cfg_attr(test, deny(warnings))] #![recursion_limit = "500"] -#![deny(unused)] +// #![deny(unused)] + #![allow(unused_macros)] + #![cfg_attr(not(feature = "default"), allow(unused_imports))] #![deny(unstable_features)] - #![deny(missing_copy_implementations)] - #![deny(missing_debug_implementations)] -@@ -22,11 +23,13 @@ pub use libc; +@@ -62,12 +63,13 @@ pub use libc; #[macro_use] mod macros; // Public crates -#[cfg(not(target_os = "redox"))] +#[cfg(not(any(target_os = "redox", target_os = "aero")))] - pub mod dir; -+#[cfg(not(target_os = "aero"))] - pub mod env; - pub mod errno; - #[deny(missing_docs)] -+#[cfg(not(target_os = "aero"))] - pub mod features; - pub mod fcntl; - #[deny(missing_docs)] -@@ -54,15 +57,18 @@ pub mod mount; - target_os = "netbsd"))] - pub mod mqueue; - #[deny(missing_docs)] --#[cfg(not(target_os = "redox"))] -+#[cfg(not(any(target_os = "redox", target_os = "aero")))] - pub mod net; - #[deny(missing_docs)] + feature! { + #![feature = "dir"] + #[allow(missing_docs)] + pub mod dir; + } +#[cfg(not(target_os = "aero"))] - pub mod poll; - #[deny(missing_docs)] - #[cfg(not(any(target_os = "redox", target_os = "fuchsia")))] - pub mod pty; + feature! { + #![feature = "env"] + pub mod env; +@@ -96,7 +98,7 @@ feature! { + target_os = "openbsd"))] + #[deny(missing_docs)] + pub mod ifaddrs; +- #[cfg(not(target_os = "redox"))] ++ #[cfg(not(any(target_os = "redox", target_os = "aero")))] + #[deny(missing_docs)] + pub mod net; + } +@@ -124,6 +126,7 @@ feature! { + #[allow(missing_docs)] + pub mod mqueue; + } +#[cfg(not(target_os = "aero"))] - pub mod sched; - pub mod sys; + feature! { + #![feature = "poll"] + pub mod poll; +@@ -134,6 +137,7 @@ feature! { + #[deny(missing_docs)] + pub mod pty; + } +#[cfg(not(target_os = "aero"))] - pub mod time; - // This can be implemented for other platforms as soon as libc - // provides bindings for them. + feature! { + #![feature = "sched"] + pub mod sched; diff --git a/src/sys/mod.rs b/src/sys/mod.rs -index 43877a1..20dd8e5 100644 +index e5639f2..2cbdff5 100644 --- a/src/sys/mod.rs +++ b/src/sys/mod.rs -@@ -6,7 +6,7 @@ - target_os = "netbsd"))] - pub mod aio; +@@ -13,7 +13,7 @@ feature! { + feature! { + #![feature = "event"] --#[cfg(any(target_os = "android", target_os = "linux"))] -+#[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - pub mod epoll; +- #[cfg(any(target_os = "android", target_os = "linux"))] ++ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + #[allow(missing_docs)] + pub mod epoll; - #[cfg(any(target_os = "dragonfly", -@@ -42,6 +42,7 @@ pub mod mman; - #[cfg(target_os = "linux")] - pub mod personality; +@@ -64,6 +64,7 @@ feature! { + pub mod personality; + } +#[cfg(not(target_os = "aero"))] - pub mod pthread; - - #[cfg(any(target_os = "android", -@@ -59,7 +60,8 @@ pub mod quota; - #[cfg(any(target_os = "linux"))] - pub mod reboot; + feature! { + #![feature = "pthread"] + pub mod pthread; +@@ -100,7 +101,7 @@ feature! { + pub mod resource; + } -#[cfg(not(target_os = "redox"))] -+// #[cfg(not(target_os = "redox"))] +#[cfg(not(any(target_os = "redox", target_os = "aero")))] - pub mod select; - - #[cfg(any(target_os = "android", -@@ -69,6 +71,7 @@ pub mod select; - target_os = "macos"))] - pub mod sendfile; - -+#[cfg(not(target_os = "aero"))] - pub mod signal; - - #[cfg(any(target_os = "android", target_os = "linux"))] -@@ -89,6 +92,7 @@ pub mod stat; - ))] - pub mod statfs; + feature! { + #![feature = "poll"] + pub mod select; +@@ -152,6 +153,7 @@ feature! { + pub mod statfs; + } +#[cfg(not(target_os = "aero"))] - pub mod statvfs; - - #[cfg(any(target_os = "android", target_os = "linux"))] -@@ -100,8 +104,10 @@ pub mod time; - - pub mod uio; + feature! { + #![feature = "fs"] + pub mod statvfs; +@@ -181,6 +183,7 @@ feature! { + pub mod utsname; + } +#[cfg(not(target_os = "aero"))] - pub mod utsname; + feature! { + #![feature = "process"] + pub mod wait; +@@ -192,7 +195,7 @@ feature! { + pub mod inotify; + } -+#[cfg(not(target_os = "aero"))] - pub mod wait; +-#[cfg(any(target_os = "android", target_os = "linux"))] ++#[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + feature! { + #![feature = "time"] + pub mod timerfd; +@@ -203,6 +206,7 @@ feature! { + target_os = "freebsd", + target_os = "illumos", + target_os = "linux", ++ target_os = "aero", + target_os = "netbsd" + ), + feature = "time", +diff --git a/src/sys/resource.rs b/src/sys/resource.rs +index 76ceaf5..3457acd 100644 +--- a/src/sys/resource.rs ++++ b/src/sys/resource.rs +@@ -14,6 +14,7 @@ cfg_if! { + target_os = "openbsd", + target_os = "netbsd", + target_os = "macos", ++ target_os = "aero", + target_os = "ios", + target_os = "android", + target_os = "dragonfly", +@@ -48,6 +49,7 @@ libc_enum! { + target_os = "ios", + target_os = "android", + target_os = "dragonfly", ++ target_os = "aero", + all(target_os = "linux", not(any(target_env = "gnu", target_env = "uclibc"))) + ), repr(i32))] + #[non_exhaustive] +diff --git a/src/sys/signal.rs b/src/sys/signal.rs +index f982b4e..5621b6f 100644 +--- a/src/sys/signal.rs ++++ b/src/sys/signal.rs +@@ -99,13 +99,13 @@ libc_enum!{ + SIGSYS, + #[cfg(not(any(target_os = "android", target_os = "emscripten", + target_os = "fuchsia", target_os = "linux", +- target_os = "redox")))] ++ target_os = "redox", target_os = "aero")))] + #[cfg_attr(docsrs, doc(cfg(all())))] + /// Emulator trap + SIGEMT, + #[cfg(not(any(target_os = "android", target_os = "emscripten", + target_os = "fuchsia", target_os = "linux", +- target_os = "redox")))] ++ target_os = "redox", target_os = "aero")))] + #[cfg_attr(docsrs, doc(cfg(all())))] + /// Information request + SIGINFO, +@@ -157,11 +157,11 @@ impl FromStr for Signal { + "SIGSYS" => Signal::SIGSYS, + #[cfg(not(any(target_os = "android", target_os = "emscripten", + target_os = "fuchsia", target_os = "linux", +- target_os = "redox")))] ++ target_os = "redox", target_os = "aero")))] + "SIGEMT" => Signal::SIGEMT, + #[cfg(not(any(target_os = "android", target_os = "emscripten", + target_os = "fuchsia", target_os = "linux", +- target_os = "redox")))] ++ target_os = "redox", target_os = "aero")))] + "SIGINFO" => Signal::SIGINFO, + _ => return Err(Errno::EINVAL), + }) +@@ -215,11 +215,11 @@ impl Signal { + Signal::SIGSYS => "SIGSYS", + #[cfg(not(any(target_os = "android", target_os = "emscripten", + target_os = "fuchsia", target_os = "linux", +- target_os = "redox")))] ++ target_os = "redox", target_os = "aero")))] + Signal::SIGEMT => "SIGEMT", + #[cfg(not(any(target_os = "android", target_os = "emscripten", + target_os = "fuchsia", target_os = "linux", +- target_os = "redox")))] ++ target_os = "redox", target_os = "aero")))] + Signal::SIGINFO => "SIGINFO", + } + } +@@ -242,7 +242,7 @@ impl fmt::Display for Signal { + #[cfg(feature = "signal")] + pub use self::Signal::*; - #[cfg(any(target_os = "android", target_os = "linux"))] +-#[cfg(target_os = "redox")] ++#[cfg(any(target_os = "redox", target_os = "aero"))] + #[cfg(feature = "signal")] + const SIGNALS: [Signal; 29] = [ + SIGHUP, +@@ -349,7 +349,7 @@ const SIGNALS: [Signal; 30] = [ + SIGSYS]; + #[cfg(not(any(target_os = "linux", target_os = "android", + target_os = "fuchsia", target_os = "emscripten", +- target_os = "redox")))] ++ target_os = "redox", target_os = "aero")))] + #[cfg(feature = "signal")] + const SIGNALS: [Signal; 31] = [ + SIGHUP, diff --git a/src/sys/socket/addr.rs b/src/sys/socket/addr.rs -index d486056..b367e18 100644 +index 4b8ab09..f23da26 100644 --- a/src/sys/socket/addr.rs +++ b/src/sys/socket/addr.rs -@@ -17,6 +17,7 @@ use std::os::unix::io::RawFd; +@@ -19,6 +19,7 @@ use std::os::unix::io::RawFd; use crate::sys::socket::addr::sys_control::SysControlAddr; #[cfg(any(target_os = "android", target_os = "dragonfly", @@ -379,7 +492,7 @@ index d486056..b367e18 100644 target_os = "freebsd", target_os = "ios", target_os = "linux", -@@ -46,6 +47,7 @@ pub enum AddressFamily { +@@ -76,6 +77,7 @@ pub enum AddressFamily { /// Low level packet interface (see [`packet(7)`](https://man7.org/linux/man-pages/man7/packet.7.html)) #[cfg(any(target_os = "android", target_os = "linux", @@ -387,7 +500,7 @@ index d486056..b367e18 100644 target_os = "illumos", target_os = "fuchsia", target_os = "solaris"))] -@@ -245,7 +247,7 @@ impl AddressFamily { +@@ -376,7 +378,7 @@ impl AddressFamily { libc::AF_NETLINK => Some(AddressFamily::Netlink), #[cfg(any(target_os = "macos", target_os = "macos"))] libc::AF_SYSTEM => Some(AddressFamily::System), @@ -396,7 +509,45 @@ index d486056..b367e18 100644 libc::AF_PACKET => Some(AddressFamily::Packet), #[cfg(any(target_os = "dragonfly", target_os = "freebsd", -@@ -653,6 +655,7 @@ pub enum SockAddr { +@@ -707,7 +709,8 @@ pub struct UnixAddr { + #[cfg(any(target_os = "android", + target_os = "fuchsia", + target_os = "illumos", +- target_os = "linux" ++ target_os = "linux", ++ target_os = "aero" + ))] + sun_len: u8 + } +@@ -842,7 +845,8 @@ impl UnixAddr { + if #[cfg(any(target_os = "android", + target_os = "fuchsia", + target_os = "illumos", +- target_os = "linux" ++ target_os = "linux", ++ target_os = "aero" + ))] + { + UnixAddr { sun, sun_len } +@@ -900,7 +904,8 @@ impl UnixAddr { + if #[cfg(any(target_os = "android", + target_os = "fuchsia", + target_os = "illumos", +- target_os = "linux" ++ target_os = "linux", ++ target_os = "aero" + ))] + { + self.sun_len +@@ -940,6 +945,7 @@ impl SockaddrLike for UnixAddr { + cfg_if!{ + if #[cfg(any(target_os = "android", + target_os = "fuchsia", ++ target_os = "aero", + target_os = "illumos", + target_os = "linux" + ))] { +@@ -1817,6 +1823,7 @@ pub enum SockAddr { /// Datalink address (MAC) #[cfg(any(target_os = "android", target_os = "dragonfly", @@ -404,64 +555,64 @@ index d486056..b367e18 100644 target_os = "freebsd", target_os = "ios", target_os = "linux", -@@ -705,7 +708,7 @@ impl SockAddr { - SockAddr::Alg(..) => AddressFamily::Alg, - #[cfg(any(target_os = "ios", target_os = "macos"))] +@@ -1886,7 +1893,7 @@ impl SockAddr { + #[cfg(all(feature = "ioctl", + any(target_os = "ios", target_os = "macos")))] SockAddr::SysControl(..) => AddressFamily::System, - #[cfg(any(target_os = "android", target_os = "linux"))] + #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + #[cfg(feature = "net")] SockAddr::Link(..) => AddressFamily::Packet, #[cfg(any(target_os = "dragonfly", - target_os = "freebsd", -@@ -738,7 +741,7 @@ impl SockAddr { +@@ -1923,7 +1930,7 @@ impl SockAddr { if addr.is_null() { None } else { - match AddressFamily::from_i32(i32::from((*addr).sa_family)) { + match AddressFamily::from_i32((*addr).sa_family as i32) { Some(AddressFamily::Unix) => None, + #[cfg(feature = "net")] Some(AddressFamily::Inet) => Some(SockAddr::Inet( - InetAddr::V4(*(addr as *const libc::sockaddr_in)))), -@@ -750,7 +753,7 @@ impl SockAddr { - #[cfg(any(target_os = "ios", target_os = "macos"))] +@@ -1938,7 +1945,7 @@ impl SockAddr { + any(target_os = "ios", target_os = "macos")))] Some(AddressFamily::System) => Some(SockAddr::SysControl( SysControlAddr(*(addr as *const libc::sockaddr_ctl)))), - #[cfg(any(target_os = "android", target_os = "linux"))] + #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + #[cfg(feature = "net")] Some(AddressFamily::Packet) => Some(SockAddr::Link( LinkAddr(*(addr as *const libc::sockaddr_ll)))), - #[cfg(any(target_os = "dragonfly", -@@ -833,7 +836,7 @@ impl SockAddr { +@@ -2026,7 +2033,7 @@ impl SockAddr { mem::size_of_val(sa) as libc::socklen_t ), - #[cfg(any(target_os = "android", target_os = "linux"))] + #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + #[cfg(feature = "net")] SockAddr::Link(LinkAddr(ref addr)) => ( // This cast is always allowed in C - unsafe { -@@ -879,6 +882,7 @@ impl fmt::Display for SockAddr { - #[cfg(any(target_os = "ios", target_os = "macos"))] +@@ -2077,6 +2084,7 @@ impl fmt::Display for SockAddr { + any(target_os = "ios", target_os = "macos")))] SockAddr::SysControl(ref sc) => sc.fmt(f), #[cfg(any(target_os = "android", + target_os = "aero", target_os = "dragonfly", target_os = "freebsd", target_os = "ios", -@@ -1064,7 +1068,7 @@ pub mod sys_control { +@@ -2381,7 +2389,7 @@ pub mod sys_control { } -#[cfg(any(target_os = "android", target_os = "linux", target_os = "fuchsia"))] -+#[cfg(any(target_os = "android", target_os = "linux", target_os = "aero", target_os = "fuchsia"))] ++#[cfg(any(target_os = "android", target_os = "linux", target_os = "fuchsia", target_os = "aero"))] + #[cfg_attr(docsrs, doc(cfg(all())))] mod datalink { - use super::{fmt, AddressFamily}; - + feature! { diff --git a/src/sys/socket/mod.rs b/src/sys/socket/mod.rs -index da5573c..3bac136 100644 +index 3f26ccf..c83182b 100644 --- a/src/sys/socket/mod.rs +++ b/src/sys/socket/mod.rs -@@ -251,6 +251,7 @@ libc_bitflags!{ +@@ -344,6 +344,7 @@ libc_bitflags!{ /// /// Only used in [`recvmsg`](fn.recvmsg.html) function. #[cfg(any(target_os = "android", @@ -469,7 +620,15 @@ index da5573c..3bac136 100644 target_os = "dragonfly", target_os = "freebsd", target_os = "linux", -@@ -866,13 +867,13 @@ impl<'a> ControlMessage<'a> { +@@ -355,6 +356,7 @@ libc_bitflags!{ + /// (For more details, see [send(2)](https://linux.die.net/man/2/send)). + #[cfg(any(target_os = "android", + target_os = "dragonfly", ++ target_os = "aero", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "haiku", +@@ -1139,13 +1141,13 @@ impl<'a> ControlMessage<'a> { /// The value of CMSG_LEN on this message. /// Safe because CMSG_LEN is always safe @@ -486,10 +645,10 @@ index da5573c..3bac136 100644 fn cmsg_len(&self) -> libc::c_uint { unsafe{CMSG_LEN(self.len() as libc::c_uint)} diff --git a/src/sys/termios.rs b/src/sys/termios.rs -index 36a3601..c7bddc3 100644 +index a107f8b..6a9453e 100644 --- a/src/sys/termios.rs +++ b/src/sys/termios.rs -@@ -467,10 +467,19 @@ impl From for u32 { +@@ -375,10 +375,19 @@ impl From for u32 { } // TODO: Add TCSASOFT, which will require treating this as a bitfield. @@ -507,9 +666,9 @@ index 36a3601..c7bddc3 100644 +#[cfg(not(target_os = "aero"))] +libc_enum! { #[repr(i32)] + #[non_exhaustive] pub enum SetArg { - /// The change will occur immediately -@@ -482,10 +491,19 @@ libc_enum! { +@@ -391,10 +400,19 @@ libc_enum! { } } @@ -527,9 +686,9 @@ index 36a3601..c7bddc3 100644 +#[cfg(not(target_os = "aero"))] +libc_enum! { #[repr(i32)] + #[non_exhaustive] pub enum FlushArg { - /// Flush data that was received but not read -@@ -515,8 +533,17 @@ libc_enum! { +@@ -426,8 +444,17 @@ libc_enum! { } // TODO: Make this usable directly as a slice index. @@ -545,17 +704,18 @@ index 36a3601..c7bddc3 100644 +#[cfg(not(target_os = "aero"))] +libc_enum! { #[repr(usize)] + #[non_exhaustive] pub enum SpecialCharacterIndices { - VDISCARD, -@@ -601,13 +628,22 @@ libc_bitflags! { - IXOFF; +@@ -524,7 +551,7 @@ libc_bitflags! { #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(all())))] IXANY; - #[cfg(not(target_os = "redox"))] + #[cfg(not(any(target_os = "redox", target_os = "aero")))] + #[cfg_attr(docsrs, doc(cfg(all())))] IMAXBEL; #[cfg(any(target_os = "android", target_os = "linux", target_os = "macos"))] - IUTF8; +@@ -533,6 +560,15 @@ libc_bitflags! { } } @@ -571,7 +731,7 @@ index 36a3601..c7bddc3 100644 libc_bitflags! { /// Flags for configuring the output mode of a terminal pub struct OutputFlags: tcflag_t { -@@ -791,8 +827,16 @@ libc_bitflags! { +@@ -744,8 +780,16 @@ libc_bitflags! { } } @@ -588,7 +748,7 @@ index 36a3601..c7bddc3 100644 pub struct ControlFlags: tcflag_t { #[cfg(any(target_os = "dragonfly", target_os = "freebsd", -@@ -859,8 +903,16 @@ libc_bitflags! { +@@ -824,8 +868,16 @@ libc_bitflags! { } } @@ -604,12 +764,46 @@ index 36a3601..c7bddc3 100644 +libc_bitflags! { pub struct LocalFlags: tcflag_t { #[cfg(not(target_os = "redox"))] - ECHOKE; + #[cfg_attr(docsrs, doc(cfg(all())))] +diff --git a/src/sys/time.rs b/src/sys/time.rs +index c1ab67b..f43cf63 100644 +--- a/src/sys/time.rs ++++ b/src/sys/time.rs +@@ -16,6 +16,7 @@ const TIMESPEC_ZERO: libc::timespec = unsafe { + target_os = "freebsd", + target_os = "illumos", + target_os = "linux", ++ target_os = "aero", + target_os = "netbsd" + ), + feature = "time", +@@ -82,7 +83,7 @@ pub(crate) mod timer { + Interval(TimeSpec), + } + +- #[cfg(any(target_os = "android", target_os = "linux"))] ++ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + bitflags! { + /// Flags that are used for arming the timer. + pub struct TimerSetTimeFlags: libc::c_int { +diff --git a/src/sys/timerfd.rs b/src/sys/timerfd.rs +index 18acbae..0005b24 100644 +--- a/src/sys/timerfd.rs ++++ b/src/sys/timerfd.rs +@@ -57,7 +57,7 @@ impl FromRawFd for TimerFd { + libc_enum! { + /// The type of the clock used to mark the progress of the timer. For more + /// details on each kind of clock, please refer to [timerfd_create(2)](https://man7.org/linux/man-pages/man2/timerfd_create.2.html). +- #[repr(i32)] ++ #[repr(i64)] + #[non_exhaustive] + pub enum ClockId { + /// A settable system-wide real-time clock. diff --git a/src/unistd.rs b/src/unistd.rs -index d94cb99..8e26266 100644 +index d6ccdf1..af3b4a0 100644 --- a/src/unistd.rs +++ b/src/unistd.rs -@@ -1081,6 +1081,7 @@ pub fn pipe() -> std::result::Result<(RawFd, RawFd), Error> { +@@ -1132,6 +1132,7 @@ feature! { /// See also [pipe(2)](https://man7.org/linux/man-pages/man2/pipe.2.html) #[cfg(any(target_os = "android", target_os = "dragonfly", @@ -617,7 +811,7 @@ index d94cb99..8e26266 100644 target_os = "emscripten", target_os = "freebsd", target_os = "illumos", -@@ -1478,6 +1479,7 @@ pub fn getgroups() -> Result> { +@@ -1550,6 +1551,7 @@ pub fn getgroups() -> Result> { pub fn setgroups(groups: &[Gid]) -> Result<()> { cfg_if! { if #[cfg(any(target_os = "dragonfly", @@ -625,7 +819,7 @@ index d94cb99..8e26266 100644 target_os = "freebsd", target_os = "illumos", target_os = "ios", -@@ -1799,6 +1801,14 @@ pub fn mkstemp(template: &P) -> Result<(RawFd, PathBuf)> { +@@ -1886,6 +1888,14 @@ feature! { /// - [pathconf(2)](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pathconf.html) /// - [limits.h](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html) /// - [unistd.h](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html) @@ -639,8 +833,8 @@ index d94cb99..8e26266 100644 +#[cfg(not(target_os = "aero"))] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] #[repr(i32)] - pub enum PathconfVar { -@@ -1978,6 +1988,17 @@ pub fn pathconf(path: &P, var: PathconfVar) -> Result for User { - gid: Gid::from_raw((*pw).pw_gid), +@@ -2913,18 +2937,21 @@ impl From<&libc::passwd> for User { + gid: Gid::from_raw(pw.pw_gid), #[cfg(not(any(target_os = "android", target_os = "fuchsia", + target_os = "aero", target_os = "illumos", target_os = "linux", target_os = "solaris")))] - class: CString::new(CStr::from_ptr((*pw).pw_class).to_bytes()).unwrap(), + class: CString::new(CStr::from_ptr(pw.pw_class).to_bytes()).unwrap(), #[cfg(not(any(target_os = "android", target_os = "fuchsia", + target_os = "aero", target_os = "illumos", target_os = "linux", target_os = "solaris")))] - change: (*pw).pw_change, + change: pw.pw_change, #[cfg(not(any(target_os = "android", target_os = "fuchsia", + target_os = "aero", target_os = "illumos", target_os = "linux", target_os = "solaris")))] +@@ -2960,18 +2987,21 @@ impl From for libc::passwd { + pw_gid: u.gid.0, + #[cfg(not(any(target_os = "android", + target_os = "fuchsia", ++ target_os = "aero", + target_os = "illumos", + target_os = "linux", + target_os = "solaris")))] + pw_class: u.class.into_raw(), + #[cfg(not(any(target_os = "android", + target_os = "fuchsia", ++ target_os = "aero", + target_os = "illumos", + target_os = "linux", + target_os = "solaris")))] + pw_change: u.change, + #[cfg(not(any(target_os = "android", + target_os = "fuchsia", ++ target_os = "aero", + target_os = "illumos", + target_os = "linux", + target_os = "solaris")))] -- -2.38.1 +2.39.1 diff --git a/patches/webkitgtk/webkitgtk.patch b/patches/webkitgtk/webkitgtk.patch index dc84db0ae41..f80e91ec667 100644 --- a/patches/webkitgtk/webkitgtk.patch +++ b/patches/webkitgtk/webkitgtk.patch @@ -37,37 +37,37 @@ index 7857bfc167..c14fbb5b6c 100644 @@ -346,7 +346,7 @@ static inline void*& framePointerImpl(mcontext_t& machineContext) #error Unknown Architecture #endif - + -#elif OS(FUCHSIA) || OS(LINUX) +#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) - + // The following sequence depends on glibc's sys/ucontext.h. #if CPU(X86) @@ -497,7 +497,7 @@ static inline void*& instructionPointerImpl(mcontext_t& machineContext) #error Unknown Architecture #endif - + -#elif OS(FUCHSIA) || OS(LINUX) +#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) - + // The following sequence depends on glibc's sys/ucontext.h. #if CPU(X86) @@ -655,7 +655,7 @@ inline void*& argumentPointer<1>(mcontext_t& machineContext) #error Unknown Architecture #endif - + -#elif OS(FUCHSIA) || OS(LINUX) +#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) - + // The following sequence depends on glibc's sys/ucontext.h. #if CPU(X86) @@ -772,7 +772,7 @@ inline void*& llintInstructionPointer(mcontext_t& machineContext) #error Unknown Architecture #endif - + -#elif OS(FUCHSIA) || OS(LINUX) +#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) - + // The following sequence depends on glibc's sys/ucontext.h. #if CPU(X86) diff --git a/Source/JavaScriptCore/runtime/Options.cpp b/Source/JavaScriptCore/runtime/Options.cpp @@ -102,7 +102,7 @@ index 8379a69659..8f7493769f 100644 @@ -43,11 +43,11 @@ #define THUMB_FUNC_PARAM(name) #endif - + -#if (OS(LINUX) || OS(FREEBSD)) && CPU(X86_64) +#if (OS(LINUX) || OS(FREEBSD) || OS(AERO)) && CPU(X86_64) #define GLOBAL_REFERENCE(name) #name "@plt" @@ -138,21 +138,21 @@ index 61f13c2b73..de93124ef8 100644 @@ -226,7 +226,7 @@ #define HAVE_HOSTED_CORE_ANIMATION 1 #endif - + -#if OS(DARWIN) || OS(FUCHSIA) || ((OS(FREEBSD) || OS(LINUX)) && (CPU(X86) || CPU(X86_64) || CPU(ARM) || CPU(ARM64) || CPU(MIPS))) +#if OS(DARWIN) || OS(FUCHSIA) || OS(AERO) || ((OS(FREEBSD) || OS(LINUX)) && (CPU(X86) || CPU(X86_64) || CPU(ARM) || CPU(ARM64) || CPU(MIPS))) #define HAVE_MACHINE_CONTEXT 1 #endif - + @@ -238,7 +238,7 @@ #define HAVE_BACKTRACE_SYMBOLS 1 #endif - + -#if OS(DARWIN) || OS(LINUX) +#if OS(DARWIN) || OS(LINUX) || OS(AERO) #define HAVE_DLADDR 1 #endif - + diff --git a/Source/WTF/wtf/PlatformOS.h b/Source/WTF/wtf/PlatformOS.h index e61715fb72..ed72f251a9 100644 --- a/Source/WTF/wtf/PlatformOS.h @@ -160,13 +160,13 @@ index e61715fb72..ed72f251a9 100644 @@ -118,6 +118,11 @@ #define WTF_OS_WINDOWS 1 #endif - + +/* OS(AERO) - Aero */ +#if defined(__aero__) +#define WTF_OS_AERO 1 +#endif + - + /* OS(UNIX) - Any Unix-like system */ #if OS(AIX) \ @@ -128,6 +133,7 @@ @@ -184,12 +184,12 @@ index 743ef3dc84..3a61bc1dc3 100644 @@ -148,8 +148,8 @@ bool SQLiteDatabase::open(const String& filename, OpenMode openMode) LOG_ERROR("SQLite database could not set temp_store to memory"); } - + - if (openMode != OpenMode::ReadOnly) - useWALJournalMode(); + // if (openMode != OpenMode::ReadOnly) + // useWALJournalMode(); - + auto shmFileName = makeString(filename, "-shm"_s); if (FileSystem::fileExists(shmFileName)) { @@ -727,7 +727,7 @@ Expected SQLiteDatabase::prepareStatement(ASCIILiteral que @@ -206,7 +206,7 @@ index efcd663f84..11e5467c10 100644 --- a/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp +++ b/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp @@ -46,7 +46,7 @@ - + // Although it's available on Darwin, SOCK_SEQPACKET seems to work differently // than in traditional Unix so fallback to STREAM on that platform. -#if defined(SOCK_SEQPACKET) && !OS(DARWIN) @@ -219,14 +219,14 @@ index 998a2a7679..a490b3fb5f 100644 --- a/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp +++ b/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp @@ -47,8 +47,10 @@ - + #if HAVE(LINUX_MEMFD_H) #include +#if !OS(AERO) #include #endif +#endif - + #if PLATFORM(PLAYSTATION) #include "ArgumentCoders.h" @@ -132,7 +134,7 @@ static int createSharedMemory() @@ -236,7 +236,8 @@ index 998a2a7679..a490b3fb5f 100644 - fileDescriptor = syscall(__NR_memfd_create, "WebKitSharedMemory", MFD_CLOEXEC); + fileDescriptor = memfd_create("WebKitSharedMemory", MFD_CLOEXEC); } while (fileDescriptor == -1 && errno == EINTR); - + if (fileDescriptor != -1) -- -2.40.0 \ No newline at end of file +2.40.0 + diff --git a/patches/xorg-server/xorg-server.patch b/patches/xorg-server/xorg-server.patch index 3ef2ef41b18..9dc515d75fd 100644 --- a/patches/xorg-server/xorg-server.patch +++ b/patches/xorg-server/xorg-server.patch @@ -1,100 +1,114 @@ -From b43c01a762f484fd03051b57724cdad82584c9aa Mon Sep 17 00:00:00 2001 -From: Anhad Singh -Date: Tue, 23 May 2023 19:10:14 +1000 -Subject: [PATCH] ^) +From 6f785e20e4034b9016aa7e6cebc204f95b7808d6 Mon Sep 17 00:00:00 2001 +From: mintsuki +Date: Sun, 20 Feb 2022 06:19:57 +0100 +Subject: [PATCH] Lyre specific changes -Signed-off-by: Anhad Singh --- + configure.ac | 2 ++ hw/xfree86/common/xf86Bus.c | 2 ++ hw/xfree86/common/xf86Config.c | 2 ++ - hw/xfree86/common/xf86Configure.c | 1 + - hw/xfree86/common/xf86Events.c | 1 + - hw/xfree86/common/xf86Helper.c | 1 + + hw/xfree86/common/xf86Configure.c | 2 ++ + hw/xfree86/common/xf86Events.c | 2 ++ + hw/xfree86/common/xf86Helper.c | 2 ++ hw/xfree86/common/xf86Init.c | 2 ++ - hw/xfree86/fbdevhw/fbdevhw.c | 36 +++++++++++++++--------- - hw/xfree86/fbdevhw/fbdevhw.h | 4 +-- - hw/xfree86/fbdevhw/meson.build | 2 +- - hw/xfree86/os-support/shared/posix_tty.c | 3 ++ - hw/xfree86/os-support/shared/sigio.c | 3 ++ + hw/xfree86/fbdevhw/fbdevhw.c | 26 +++++++++++------------- + hw/xfree86/fbdevhw/fbdevhw.h | 4 ++-- + hw/xfree86/os-support/shared/posix_tty.c | 3 +++ + hw/xfree86/os-support/shared/sigio.c | 3 +++ include/os.h | 1 + - meson.build | 3 +- mi/mibitblt.c | 2 ++ os/access.c | 2 +- os/ospoll.c | 2 ++ - os/utils.c | 4 +-- - 17 files changed, 50 insertions(+), 21 deletions(-) + os/utils.c | 4 ++-- + 16 files changed, 42 insertions(+), 19 deletions(-) +diff --git a/configure.ac b/configure.ac +index 0909cc5..f551571 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1966,6 +1966,8 @@ if test "x$XORG" = xyes; then + if test "x$DRM" = xyes; then + XORG_DRIVER_MODESETTING=yes + fi ++ ++ XORG_DRIVER_MODESETTING=no + + AC_SUBST([XORG_LIBS]) + AC_SUBST([XORG_SYS_LIBS]) diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c -index fd144db..b232e27 100644 +index a8f1073..1b1120a 100644 --- a/hw/xfree86/common/xf86Bus.c +++ b/hw/xfree86/common/xf86Bus.c -@@ -556,6 +556,7 @@ xf86GetDevFromEntity(int entityIndex, int instance) +@@ -536,6 +536,7 @@ xf86GetDevFromEntity(int entityIndex, int instance) void xf86PostProbe(void) { -+#if 0 ++/* if (fbSlotClaimed && ( #if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__) sbusSlotClaimed || -@@ -571,6 +572,7 @@ xf86PostProbe(void) +@@ -551,6 +552,7 @@ xf86PostProbe(void) )) FatalError("Cannot run in framebuffer mode. Please specify busIDs " " for all framebuffer devices\n"); -+#endif ++*/ } - Bool + int diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c -index 5d814c1..dabfec8 100644 +index 09d27ec..83be062 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c -@@ -47,6 +47,8 @@ - #endif - +@@ -49,6 +49,8 @@ #include -+#include -+ #include ++#include ++ #include "xf86.h" + #include "xf86Modes.h" + #include "xf86Parser.h" diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c -index 4347f6d..3a66af7 100644 +index 44e7591..86d48d5 100644 --- a/hw/xfree86/common/xf86Configure.c +++ b/hw/xfree86/common/xf86Configure.c -@@ -27,6 +27,7 @@ +@@ -27,6 +27,8 @@ #include #endif +#include ++ #include "xf86.h" #include "xf86Config.h" #include "xf86_OSlib.h" diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c -index 395bbc7..5937017 100644 +index 8a800bd..ec5d33d 100644 --- a/hw/xfree86/common/xf86Events.c +++ b/hw/xfree86/common/xf86Events.c -@@ -53,6 +53,7 @@ +@@ -53,6 +53,8 @@ #include #endif +#include ++ #include #include #include diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c -index 0389945..ac231bf 100644 +index 42a51dd..64af1dc 100644 --- a/hw/xfree86/common/xf86Helper.c +++ b/hw/xfree86/common/xf86Helper.c -@@ -38,6 +38,7 @@ +@@ -38,6 +38,8 @@ #include #endif +#include ++ #include - #include "mi.h" #include "os.h" + #include "servermd.h" diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c -index 5695e71..96c2d15 100644 +index 2ec6b2f..c1d9c24 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c @@ -37,6 +37,8 @@ @@ -107,58 +121,57 @@ index 5695e71..96c2d15 100644 #if !defined(WIN32) #define HAS_UTSNAME 1 diff --git a/hw/xfree86/fbdevhw/fbdevhw.c b/hw/xfree86/fbdevhw/fbdevhw.c -index 3d8b92e..dae3960 100644 +index 9508951..bce130c 100644 --- a/hw/xfree86/fbdevhw/fbdevhw.c +++ b/hw/xfree86/fbdevhw/fbdevhw.c -@@ -10,12 +10,13 @@ +@@ -10,12 +10,12 @@ #include "xf86_OSproc.h" /* pci stuff */ -#include "xf86Pci.h" -+// #include "xf86Pci.h" ++//#include "xf86Pci.h" #include "xf86cmap.h" #include "fbdevhw.h" -#include "fbpriv.h" -+// #include "fbpriv.h" +#include #include "globals.h" #include -@@ -259,6 +260,7 @@ fbdev2xfree_timing(struct fb_var_screeninfo *var, DisplayModePtr mode) +@@ -259,6 +259,7 @@ fbdev2xfree_timing(struct fb_var_screeninfo *var, DisplayModePtr mode) /** * Try to find the framebuffer device for a given PCI device */ -+#if 0 ++/* static int fbdev_open_pci(struct pci_device *pPci, char **namep) { -@@ -303,6 +305,7 @@ fbdev_open_pci(struct pci_device *pPci, char **namep) +@@ -303,6 +304,7 @@ fbdev_open_pci(struct pci_device *pPci, char **namep) xf86DrvMsg(-1, X_ERROR, "Unable to find a valid framebuffer device\n"); return -1; } -+#endif ++*/ static int fbdev_open(int scrnIndex, const char *dev, char **namep) -@@ -330,6 +333,7 @@ fbdev_open(int scrnIndex, const char *dev, char **namep) +@@ -330,6 +332,7 @@ fbdev_open(int scrnIndex, const char *dev, char **namep) } /* only touch non-PCI devices on this path */ -+#if 0 ++/* { - char buf[PATH_MAX] = {0}; + char buf[PATH_MAX]; char *sysfs_path = NULL; -@@ -344,6 +348,7 @@ fbdev_open(int scrnIndex, const char *dev, char **namep) +@@ -344,6 +347,7 @@ fbdev_open(int scrnIndex, const char *dev, char **namep) } free(sysfs_path); } -+#endif ++*/ if (namep) { if (-1 == ioctl(fd, FBIOGET_FSCREENINFO, (void *) (&fix))) { -@@ -363,14 +368,16 @@ fbdev_open(int scrnIndex, const char *dev, char **namep) +@@ -363,14 +367,11 @@ fbdev_open(int scrnIndex, const char *dev, char **namep) /* -------------------------------------------------------------------- */ Bool @@ -171,16 +184,11 @@ index 3d8b92e..dae3960 100644 - fd = fbdev_open_pci(pPci, namep); - else - fd = fbdev_open(-1, device, namep); -+ // if (pPci) -+ // fd = fbdev_open_pci(pPci, namep); -+ // else -+ // fd = fbdev_open(-1, device, namep); -+ + fd = fbdev_open(-1, device, namep); if (-1 == fd) return FALSE; -@@ -379,7 +386,7 @@ fbdevHWProbe(struct pci_device *pPci, char *device, char **namep) +@@ -379,7 +380,7 @@ fbdevHWProbe(struct pci_device *pPci, char *device, char **namep) } Bool @@ -189,7 +197,7 @@ index 3d8b92e..dae3960 100644 { fbdevHWPtr fPtr; -@@ -387,10 +394,11 @@ fbdevHWInit(ScrnInfoPtr pScrn, struct pci_device *pPci, char *device) +@@ -387,10 +388,7 @@ fbdevHWInit(ScrnInfoPtr pScrn, struct pci_device *pPci, char *device) fPtr = FBDEVHWPTR(pScrn); /* open device */ @@ -197,15 +205,11 @@ index 3d8b92e..dae3960 100644 - fPtr->fd = fbdev_open_pci(pPci, NULL); - else - fPtr->fd = fbdev_open(pScrn->scrnIndex, device, NULL); -+ // if (pPci) -+ // fPtr->fd = fbdev_open_pci(pPci, NULL); -+ // else -+ // fPtr->fd = fbdev_open(pScrn->scrnIndex, device, NULL); + fPtr->fd = fbdev_open(pScrn->scrnIndex, device, NULL); if (-1 == fPtr->fd) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to open framebuffer device, consult warnings" -@@ -881,7 +889,7 @@ RETRY: +@@ -881,7 +879,7 @@ RETRY: "FBIOBLANK: %s\n", strerror(errno)); break; case EINTR: @@ -214,7 +218,7 @@ index 3d8b92e..dae3960 100644 goto RETRY; default: fPtr->unsupported_ioctls |= (1 << FBIOBLANK_UNSUPPORTED); -@@ -915,7 +923,7 @@ RETRY: +@@ -915,7 +913,7 @@ RETRY: "FBIOBLANK: %s\n", strerror(errno)); break; case EINTR: @@ -239,16 +243,6 @@ index 4984ccf..bb3e2f8 100644 char *device); extern _X_EXPORT char *fbdevHWGetName(ScrnInfoPtr pScrn); -diff --git a/hw/xfree86/fbdevhw/meson.build b/hw/xfree86/fbdevhw/meson.build -index f3146f3..5e5e6e8 100644 ---- a/hw/xfree86/fbdevhw/meson.build -+++ b/hw/xfree86/fbdevhw/meson.build -@@ -1,4 +1,4 @@ --if host_machine.system() == 'linux' -+if host_machine.system() == 'linux' or host_machine.system() == 'aero' - srcs_fbdevhw = 'fbdevhw.c' - else - srcs_fbdevhw = 'fbdevhwstub.c' diff --git a/hw/xfree86/os-support/shared/posix_tty.c b/hw/xfree86/os-support/shared/posix_tty.c index 0cb9788..e8cac5d 100644 --- a/hw/xfree86/os-support/shared/posix_tty.c @@ -264,7 +258,7 @@ index 0cb9788..e8cac5d 100644 #include #include "xf86.h" diff --git a/hw/xfree86/os-support/shared/sigio.c b/hw/xfree86/os-support/shared/sigio.c -index ad8af60..6f81278 100644 +index 247bec7..216e8cd 100644 --- a/hw/xfree86/os-support/shared/sigio.c +++ b/hw/xfree86/os-support/shared/sigio.c @@ -56,6 +56,9 @@ @@ -278,7 +272,7 @@ index ad8af60..6f81278 100644 #include #include "xf86.h" diff --git a/include/os.h b/include/os.h -index bb3348b..64b04dc 100644 +index 2a1c29e..2a7fc76 100644 --- a/include/os.h +++ b/include/os.h @@ -51,6 +51,7 @@ SOFTWARE. @@ -289,22 +283,8 @@ index bb3348b..64b04dc 100644 #ifdef MONOTONIC_CLOCK #include #endif -diff --git a/meson.build b/meson.build -index 637938a..b5d761c 100644 ---- a/meson.build -+++ b/meson.build -@@ -439,7 +439,8 @@ if not libdrm_dep.found() and libdrm_required - error('DRI requested, but LIBDRM not found') - endif - --build_modesetting = libdrm_dep.found() and dri2proto_dep.found() -+# build_modesetting = libdrm_dep.found() and dri2proto_dep.found() -+build_modesetting = false - - build_vgahw = false - if get_option('vgahw') == 'auto' diff --git a/mi/mibitblt.c b/mi/mibitblt.c -index 0b13e49..aff6539 100644 +index 43d9bd9..740c0d2 100644 --- a/mi/mibitblt.c +++ b/mi/mibitblt.c @@ -49,6 +49,8 @@ SOFTWARE. @@ -317,11 +297,11 @@ index 0b13e49..aff6539 100644 #include diff --git a/os/access.c b/os/access.c -index 61ee8e3..24cabae 100644 +index 9724616..3c4376a 100644 --- a/os/access.c +++ b/os/access.c -@@ -120,7 +120,7 @@ SOFTWARE. - #include +@@ -117,7 +117,7 @@ SOFTWARE. + #endif #endif -#if defined(SVR4) || (defined(SYSV) && defined(__i386__)) || defined(__GNU__) @@ -330,28 +310,28 @@ index 61ee8e3..24cabae 100644 #endif #if defined(SYSV) && defined(__i386__) diff --git a/os/ospoll.c b/os/ospoll.c -index c68aabc..19006c3 100644 +index c68aabc..a3217dc 100644 --- a/os/ospoll.c +++ b/os/ospoll.c @@ -45,11 +45,13 @@ #define HAVE_OSPOLL 1 #endif -+#if 0 ++/* #if !HAVE_OSPOLL && defined(HAVE_EPOLL_CREATE1) #include #define EPOLL 1 #define HAVE_OSPOLL 1 #endif -+#endif ++*/ #if !HAVE_OSPOLL #include "xserver_poll.h" diff --git a/os/utils.c b/os/utils.c -index 92a66e8..646722e 100644 +index 2ba1c80..63dedc6 100644 --- a/os/utils.c +++ b/os/utils.c -@@ -1403,7 +1403,7 @@ System(const char *command) +@@ -1402,7 +1402,7 @@ System(const char *command) return -1; } @@ -360,7 +340,7 @@ index 92a66e8..646722e 100644 } static struct pid { -@@ -1633,7 +1633,7 @@ Pclose(void *iop) +@@ -1632,7 +1632,7 @@ Pclose(void *iop) } #endif @@ -370,5 +350,4 @@ index 92a66e8..646722e 100644 int -- -2.40.1 - +2.35.1 diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 65dbe30a927..f6370fdbca8 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -77,6 +77,7 @@ pub enum AuxvType { PhEnt = 4, PhNum = 5, Entry = 9, + Secure = 23, } /// Returns the first address outside the user range. @@ -401,7 +402,7 @@ impl ArchTask { let p2_header = loaded_binary.elf.header.pt2; unsafe { - let hdr: [(AuxvType, usize); 4] = [ + let hdr: [(AuxvType, usize); 5] = [ ( AuxvType::Phdr, (p2_header.ph_offset() + loaded_binary.base_addr.as_u64()) as usize, @@ -409,6 +410,7 @@ impl ArchTask { (AuxvType::PhEnt, p2_header.ph_entry_size() as usize), (AuxvType::PhNum, p2_header.ph_count() as usize), (AuxvType::Entry, p2_header.entry_point() as usize), + (AuxvType::Secure, 0), ]; stack.write(0usize); // Make it 16 bytes aligned diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 6f230b56f49..c7589fec014 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -247,6 +247,7 @@ pub trait CachedAccess: BlockDeviceInterface { ); page.mark_dirty(); + page.sync(); loc += size; offset = align_down(offset as u64 + Size4KiB::SIZE, Size4KiB::SIZE) as usize; diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index 19972372a38..06dd3a78789 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -37,7 +37,7 @@ impl EventFd { impl INodeInterface for EventFd { fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> super::Result { let size = core::mem::size_of::(); - assert!(buffer.len() == size); + assert!(buffer.len() >= size); // SAFETY: We have above verified that it is safe to dereference // the value. @@ -53,7 +53,7 @@ impl INodeInterface for EventFd { fn write_at(&self, _offset: usize, buffer: &[u8]) -> super::Result { let size = core::mem::size_of::(); - assert!(buffer.len() == size); + assert!(buffer.len() >= size); // SAFETY: We have above verified that it is safe to dereference // the value. diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index 3380add761a..d3552158ba2 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -204,14 +204,16 @@ impl Bitmap { /// Allocates a free bit in the bitmap and returns its index. pub fn alloc(&mut self) -> Option { - for (i, e) in self.bitmap.iter_mut().enumerate() { - if *e != u8::MAX { - for bit in 0..8 { - if !e.get_bit(bit) { - e.set_bit(bit, true); - - return Some(i * 8 + bit); - } + for (i, byte) in self.bitmap.iter_mut().enumerate() { + if *byte == u8::MAX { + continue; + } + + for bit in 0..8 { + if !byte.get_bit(bit) { + byte.set_bit(bit, true); + + return Some(i * 8 + bit); } } } diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 817d09a570e..2c0a22ae82e 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -211,12 +211,17 @@ impl INode { if block_ptrs == 0 { block_ptrs = fs.bgdt.alloc_block_ptr()?; + self.inode.write().data_ptr[12] = block_ptrs as u32; } let block_ptrs = block_ptrs * block_size; - let offset = block_ptrs + (new_block * core::mem::size_of::()); + let offset = block_ptrs + (next_block_num * core::mem::size_of::()); fs.block.write(offset, &new_block.to_le_bytes()); + + let mut inode = self.inode.write(); + let inode_size = inode.size() + block_size; + inode.set_size(inode_size); } Some(new_block) @@ -303,7 +308,7 @@ impl INode { proxy: Option>, ) -> super::Result { if !self.metadata()?.is_directory() { - return Err(FileSystemError::NotSupported); + return Err(FileSystemError::NotDirectory); } if DirEntryIter::new(self.sref()).any(|(e, _)| e == name) { @@ -479,7 +484,7 @@ impl INodeInterface for INode { fn touch(&self, parent: DirCacheItem, name: &str) -> super::Result { if !self.metadata()?.is_directory() { - return Err(FileSystemError::NotSupported); + return Err(FileSystemError::NotDirectory); } let inode = self.make_inode(name, FileType::File, None)?; @@ -488,7 +493,7 @@ impl INodeInterface for INode { fn mkdir(&self, name: &str) -> super::Result { if !self.metadata()?.is_directory() { - return Err(FileSystemError::NotSupported); + return Err(FileSystemError::NotDirectory); } self.make_inode(name, FileType::Directory, None) @@ -532,7 +537,7 @@ impl INodeInterface for INode { assert!(self.proxy.is_none()); // TODO: support shared file mappings. - assert!(!flags.contains(MMapFlags::MAP_SHARED)); + // assert!(!flags.contains(MMapFlags::MAP_SHARED)); let private_cp: PhysFrame = FRAME_ALLOCATOR.allocate_frame().unwrap(); private_cp.as_slice_mut().fill(0); diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index cc3327fbaa3..230b12a4532 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -21,6 +21,7 @@ use aero_syscall::SyscallError; use alloc::collections::BTreeMap; use alloc::sync::Arc; +use crate::fs::cache::DirCacheImpl; use crate::userland::scheduler; use crate::utils::sync::Mutex; use spin::Once; @@ -198,7 +199,7 @@ impl Path { } } -#[derive(Debug, PartialEq)] +#[derive(Debug, Copy, Clone, PartialEq)] pub enum LookupMode { None, /// Creates the file if it does not exist. @@ -248,8 +249,17 @@ pub fn lookup_path_with( } else { // todo: fix this shit cwd.inode().mkdir(component)?; - cwd = - lookup_path_with(cwd, Path::new(component), LookupMode::None)?; + cwd = match lookup_path_with( + cwd.clone(), + Path::new(component), + LookupMode::None, + ) { + Ok(x) => x, + Err(e) => { + dbg!(component, cwd.absolute_path_str()); + return Err(dbg!(e)); + } + }; } } diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index e0c73d006cd..125db66fd92 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -75,6 +75,7 @@ mod prelude { pub use alloc::string::String; + pub use crate::rendy::dbg; pub use static_assertions::*; } } diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index 94d863cf5ff..169a01bd093 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -1189,8 +1189,11 @@ impl<'a> OffsetPageTable<'a> { let last_level_fork = |entry: &mut PageTableEntry, n1: &mut PageTable, i: usize| { let mut flags = entry.flags(); - // Setup copy on write page. - flags.remove(PageTableFlags::WRITABLE); + // Check if the mapping is shared. + if !flags.contains(PageTableFlags::BIT_10) { + // Setup copy on write page. + flags.remove(PageTableFlags::WRITABLE); + } entry.set_flags(flags); n1[i].set_frame(entry.frame().unwrap(), flags); diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 0bb171e7a65..30a13e7c29d 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -897,7 +897,7 @@ pub macro println { pub macro dbg { () => { - $crate::rendy::println!("[{}:{}]", $crate::file!(), $crate::line!()); + log::debug!("[{}:{}]", $crate::file!(), $crate::line!()); }, ($val:expr $(,)?) => { @@ -905,8 +905,7 @@ pub macro dbg { // of temporaries - https://stackoverflow.com/a/48732525/1063961 match $val { tmp => { - $crate::rendy::println!("[{}:{}] {} = {:#?}", - core::file!(), core::line!(), core::stringify!($val), &tmp); + log::debug!("[{}:{}] {} = {:#?}", core::file!(), core::line!(), core::stringify!($val), &tmp); tmp } } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index f0e9a81d149..a861e0f133f 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -410,7 +410,10 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result unimplemented!("fcntl: unknown command {command}"), + _ => { + log::error!("fcntl: unknown command {command}"); + Ok(0) + } } } diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 7c1941b6a26..db3ff553376 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -157,6 +157,10 @@ impl SysLog { result.push_str(alloc::format!(") = {:?}", self.result.unwrap()).as_str()); log::trace!("{result}"); + + if self.result.unwrap().is_err() { + crate::unwind::unwind_stack_trace(); + } } } diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index fbc0fe723e8..7fe895cc29a 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -432,17 +432,17 @@ impl Mapping { .mmap(offset as _, size as _, self.flags) .expect("handle_pf_file: file does not support mmap"); - unsafe { - offset_table.map_to( - Page::containing_address(address), - frame, - PageTableFlags::PRESENT - | PageTableFlags::USER_ACCESSIBLE - | self.protection.into(), - ) + let mut flags = PageTableFlags::PRESENT + | PageTableFlags::USER_ACCESSIBLE + | self.protection.into(); + + if self.flags.contains(MMapFlags::MAP_SHARED) { + flags |= PageTableFlags::BIT_10; } - .expect("failed to map allocated frame for private file read") - .flush(); + + unsafe { offset_table.map_to(Page::containing_address(address), frame, flags) } + .expect("failed to map allocated frame for private file read") + .flush(); true } else if reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) { diff --git a/src/aero_proc/src/syscall.rs b/src/aero_proc/src/syscall.rs index 6f8751e5106..cbd5089c522 100644 --- a/src/aero_proc/src/syscall.rs +++ b/src/aero_proc/src/syscall.rs @@ -275,21 +275,22 @@ fn process_call_args(args: &Punctuated) -> Vec { let len_ident = Ident::new(&format!("{}_len", ident), Span::call_site()); match arg_type { - ArgType::Slice(is_mut) => { - let slice_expr: Expr = if is_mut { - syn::parse_quote! { - crate::utils::validate_slice_mut(#data_ident as *mut _, #len_ident)? - } - } else { - syn::parse_quote! { - crate::utils::validate_slice(#data_ident as *const _, #len_ident)? - } - }; - - result.push(slice_expr); - } - ArgType::Array(is_mut) => { - let array_expr: Expr = if is_mut { + ArgType::Slice(is_mut) => { + let slice_expr: Expr = if is_mut { + syn::parse_quote! { + crate::utils::validate_slice_mut(#data_ident as *mut _, #len_ident)? + } + } else { + syn::parse_quote! { + crate::utils::validate_slice(#data_ident as *const _, #len_ident)? + } + }; + + result.push(slice_expr); + } + + ArgType::Array(is_mut) => { + let array_expr: Expr = if is_mut { syn::parse_quote! { crate::utils::validate_array_mut(#data_ident as *mut _)? } @@ -299,6 +300,7 @@ fn process_call_args(args: &Punctuated) -> Vec { result.push(array_expr); } + ArgType::Pointer(is_mut) => { let ptr_expr: Expr = if is_mut { syn::parse_quote!(#ident as *mut _) diff --git a/tools/cargo-inject-patches.py b/tools/cargo-inject-patches.py index 6d2d6fe48b3..7d046383d9d 100644 --- a/tools/cargo-inject-patches.py +++ b/tools/cargo-inject-patches.py @@ -9,17 +9,19 @@ patched_libs = { "backtrace": "0.3.64", "calloop": "0.9.3", - "libc": "0.2.139", - "libloading": "0.7.3", + "libc": "0.2.149", + "getrandom": "0.2.9", + "libloading": "0.8.1", "mio": ["0.6.23", "0.8.3"], - "nix": "0.22.3", - "num_cpus": "1.13.0", + "nix": "0.24.3", + "num_cpus": "1.15.0", "users": "0.11.0", "winit": "0.26.1", "glutin": "0.28.0", "glutin_glx_sys": "0.1.7", "glutin_egl_sys": "0.1.5", "shared_library": "0.1.9", + "rustix": "0.38.13" } parser = argparse.ArgumentParser(description="Inject patched Rust libraries into Cargo lockfiles") diff --git a/userland/apps/init/src/main.rs b/userland/apps/init/src/main.rs index ecbaef5d8c2..fc30f33b071 100644 --- a/userland/apps/init/src/main.rs +++ b/userland/apps/init/src/main.rs @@ -53,21 +53,21 @@ fn main() -> Result<(), Box> { let stdout = OpenOptions::new().write(true).open(TTY_PATH)?; // fd=1 let stderr = OpenOptions::new().write(true).open(TTY_PATH)?; // fd=2 - { - let stdset = FileSet::new([stdin, stdout, stderr]); - stdset.remove_cloexec(); + // { + let stdset = FileSet::new([stdin, stdout, stderr]); + stdset.remove_cloexec(); - Command::new("dhcpd").spawn()?; - } + Command::new("dhcpd").spawn()?; + // } - // Swap the `/dev/tty` std{in,out,err} file descriptors with `/dev/null` to suppress the Xorg - // server logs. - let stdin = OpenOptions::new().read(true).open(DEV_NULL)?; // fd=0 - let stdout = OpenOptions::new().write(true).open(DEV_NULL)?; // fd=1 - let stderr = OpenOptions::new().write(true).open(DEV_NULL)?; // fd=2 + // // Swap the `/dev/tty` std{in,out,err} file descriptors with `/dev/null` to suppress the Xorg + // // server logs. + // let stdin = OpenOptions::new().read(true).open(DEV_NULL)?; // fd=0 + // let stdout = OpenOptions::new().write(true).open(DEV_NULL)?; // fd=1 + // let stderr = OpenOptions::new().write(true).open(DEV_NULL)?; // fd=2 - let stdset = FileSet::new([stdin, stdout, stderr]); - stdset.remove_cloexec(); + // let stdset = FileSet::new([stdin, stdout, stderr]); + // stdset.remove_cloexec(); Command::new("startx") .env("RUST_BACKTRACE", "full") From 6b2f4e75f7535b11f63457b709c4d2a3d4f6b9e4 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 15 Oct 2023 21:18:04 +1100 Subject: [PATCH 264/368] update Signed-off-by: Anhad Singh --- bootstrap.yml | 14 +- bootstrap/vcs.yml | 92 ++-- bootstrap/xorg.yml | 91 ++-- patched.txt | 5 + patches/glib/{glib.patch => 0001-glib.patch} | 0 ...ch-out-assert-in-g_io_unix_get_flags.patch | 30 ++ patches/mlibc/mlibc.patch | 138 +++-- patches/rust-libloading/rust-libloading.patch | 23 +- patches/rust-nix/rust-nix.patch | 507 +++++------------- ....patch => 0001-Initial-Aero-support.patch} | 22 +- patches/webkitgtk/0002-xxx.patch | 181 +++++++ .../src/arch/x86_64/interrupts/exceptions.rs | 17 + src/aero_kernel/src/arch/x86_64/mod.rs | 4 +- src/aero_kernel/src/arch/x86_64/task.rs | 182 +++++-- src/aero_kernel/src/mem/mod.rs | 10 +- src/aero_kernel/src/mem/paging/mapper.rs | 8 +- src/aero_kernel/src/syscall/process.rs | 5 +- src/aero_kernel/src/userland/task/mod.rs | 1 + src/aero_kernel/src/userland/vm.rs | 53 +- tools/cargo-inject-patches.py | 2 +- userland/apps/init/src/main.rs | 24 +- 21 files changed, 783 insertions(+), 626 deletions(-) create mode 100644 patched.txt rename patches/glib/{glib.patch => 0001-glib.patch} (100%) create mode 100644 patches/glib/0002-Patch-out-assert-in-g_io_unix_get_flags.patch rename patches/webkitgtk/{webkitgtk.patch => 0001-Initial-Aero-support.patch} (95%) create mode 100644 patches/webkitgtk/0002-xxx.patch diff --git a/bootstrap.yml b/bootstrap.yml index dd8b37f0753..90ef0bb5961 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -125,8 +125,8 @@ sources: - name: rust-nix subdir: 'bundled' git: 'https://github.com/nix-rust/nix.git' - tag: 'v0.24.3' - version: '0.24.3' + tag: 'v0.22.3' + version: '0.22.3' - name: rust-mio-0.6 subdir: 'bundled' @@ -150,8 +150,8 @@ sources: - name: rust-libloading subdir: 'bundled' git: 'https://github.com/nagisa/rust_libloading.git' - tag: '0.8.1' - version: '0.8.1' + tag: '0.7.3' + version: '0.7.3' - name: rust-getrandom subdir: 'bundled' @@ -966,7 +966,7 @@ packages: - '--libdir=lib' - '-Dmlibc_no_headers=true' - '-Ddisable_iconv_option=true' - - '--buildtype=release' + - '--buildtype=debug' - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' - '@THIS_SOURCE_DIR@' build: @@ -2202,6 +2202,10 @@ packages: - '-Dxattr=false' - '@THIS_SOURCE_DIR@' environ: + # The warning is false positive and the more recent versions of GCC. Workaround and disable the warning. + # + # Bug 1744: https://gitlab.gnome.org/GNOME/glib/-/issues/1744 + CFLAGS: '-Wno-error=format-nonliteral' PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' PKG_CONFIG_LIBDIR: '@BUILD_ROOT@/system-root/usr/lib/pkgconfig:@BUILD_ROOT@/system-root/usr/share/pkgconfig' build: diff --git a/bootstrap/vcs.yml b/bootstrap/vcs.yml index 8b477baa697..31b040ad96d 100644 --- a/bootstrap/vcs.yml +++ b/bootstrap/vcs.yml @@ -3,49 +3,49 @@ packages: # # Git is one of the most used version control systems designed to # handle large projects efficiently. - - name: git - source: - subdir: 'bundled' - git: 'https://github.com/git/git.git' - tag: 'v2.32.0' - version: '2.32.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['autoreconf'] - tools_required: - - host-pkg-config - - host-gcc - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - python - - libexpat - - zlib - - openssl - - curl - - libiconv - - pcre - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - - args: - - './configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-python=python3' - - '--with-gitconfig=/etc/gitconfig' - - '--with-curl=@SYSROOT_DIR@/usr' - - '--without-iconv' - - '--with-libpcre' - - 'ac_cv_fread_reads_directories=1' - - 'ac_cv_snprintf_returns_bogus=1' - environ: - CURL_CONFIG: '@SYSROOT_DIR@/usr/bin/curl-config' - build: - - args: ['make', 'NO_GETTEXT=YesPlease', '-j@PARALLELISM@'] - - args: ['make', 'NO_GETTEXT=YesPlease', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' + # - name: git + # source: + # subdir: 'bundled' + # git: 'https://github.com/git/git.git' + # tag: 'v2.32.0' + # version: '2.32.0' + # tools_required: + # - host-autoconf-v2.69 + # - host-automake-v1.16 + # - host-libtool + # regenerate: + # - args: ['autoreconf'] + # tools_required: + # - host-pkg-config + # - host-gcc + # - virtual: pkgconfig-for-target + # triple: "x86_64-aero" + # pkgs_required: + # - mlibc + # - python + # - libexpat + # - zlib + # - openssl + # - curl + # - libiconv + # - pcre + # configure: + # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] + # - args: + # - './configure' + # - '--host=x86_64-aero' + # - '--prefix=/usr' + # - '--with-python=python3' + # - '--with-gitconfig=/etc/gitconfig' + # - '--with-curl=@SYSROOT_DIR@/usr' + # - '--without-iconv' + # - '--with-libpcre' + # - 'ac_cv_fread_reads_directories=1' + # - 'ac_cv_snprintf_returns_bogus=1' + # environ: + # CURL_CONFIG: '@SYSROOT_DIR@/usr/bin/curl-config' + # build: + # - args: ['make', 'NO_GETTEXT=YesPlease', '-j@PARALLELISM@'] + # - args: ['make', 'NO_GETTEXT=YesPlease', 'install'] + # environ: + # DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index 2c9f9a4b604..2078bb2a9b1 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -237,6 +237,7 @@ packages: - mlibc - xorg-util-macros - xorg-proto + - libxcb-util configure: - args: - '@THIS_SOURCE_DIR@/configure' @@ -564,44 +565,44 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' - - name: mesa-demos - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/mesa/demos.git/' - branch: 'master' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - tools_required: - - host-gcc - pkgs_required: - - mlibc - - mesa - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--disable-gles1' # Requires some linux header that we don't have - - '--disable-vg' - - '--disable-osmesa' - - '--disable-rbug' - - '--with-system-data-files' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' + # - name: mesa-demos + # source: + # subdir: 'bundled' + # git: 'https://gitlab.freedesktop.org/mesa/demos.git/' + # branch: 'master' + # tools_required: + # - host-autoconf-v2.69 + # - host-automake-v1.16 + # - host-libtool + # - host-pkg-config + # - host-xorg-macros + # regenerate: + # - args: ['./autogen.sh'] + # environ: + # 'NOCONFIGURE': 'yes' + # tools_required: + # - host-gcc + # pkgs_required: + # - mlibc + # - mesa + # configure: + # - args: + # - '@THIS_SOURCE_DIR@/configure' + # - '--host=x86_64-aero' + # - '--prefix=/usr' + # - '--sysconfdir=/etc' + # - '--localstatedir=/var' + # - '--disable-static' + # - '--disable-gles1' # Requires some linux header that we don't have + # - '--disable-vg' + # - '--disable-osmesa' + # - '--disable-rbug' + # - '--with-system-data-files' + # build: + # - args: ['make', '-j@PARALLELISM@'] + # - args: ['make', 'install'] + # environ: + # DESTDIR: '@THIS_COLLECT_DIR@' - name: mesa source: @@ -868,8 +869,8 @@ packages: source: subdir: 'bundled' git: 'https://gitlab.freedesktop.org/pixman/pixman.git' - tag: 'pixman-0.40.0' - version: '0.40.0' + tag: 'pixman-0.42.2' + version: '0.42.2' tools_required: - host-autoconf-v2.69 - host-automake-v1.16 @@ -2202,8 +2203,8 @@ packages: source: subdir: 'bundled' git: 'https://gitlab.gnome.org/GNOME/pango.git' - tag: '1.50.11' - version: '1.50.11' + tag: '1.50.14' + version: '1.50.14' tools_required: - host-pkg-config - host-gcc @@ -2223,8 +2224,12 @@ packages: - libxext - harfbuzz - libxft - revision: 2 + revision: 3 configure: + # False positive with GCC 13 and -O3, see bug #903259 + # + # https://gitlab.gnome.org/GNOME/pango/-/issues/740 + - args: ['sed', '-i', '-e', '/\-Werror=array-bounds/d', '@THIS_SOURCE_DIR@/meson.build'] - args: - 'meson' - '--cross-file' diff --git a/patched.txt b/patched.txt new file mode 100644 index 00000000000..f1b4bdf79af --- /dev/null +++ b/patched.txt @@ -0,0 +1,5 @@ +bootstrap-host-gcc +llvm +rust-libc +webkitgtk +pixman diff --git a/patches/glib/glib.patch b/patches/glib/0001-glib.patch similarity index 100% rename from patches/glib/glib.patch rename to patches/glib/0001-glib.patch diff --git a/patches/glib/0002-Patch-out-assert-in-g_io_unix_get_flags.patch b/patches/glib/0002-Patch-out-assert-in-g_io_unix_get_flags.patch new file mode 100644 index 00000000000..fa109fc2557 --- /dev/null +++ b/patches/glib/0002-Patch-out-assert-in-g_io_unix_get_flags.patch @@ -0,0 +1,30 @@ +From fe2c4357d753d3a5baed7e2354f3542a1e87b46d Mon Sep 17 00:00:00 2001 +From: Dennis Bonke +Date: Wed, 12 Oct 2022 02:54:15 +0200 +Subject: [PATCH 2/2] Patch out assert in g_io_unix_get_flags + +We don't implement the neccesary bits to fully support this, so in case of doubt, return readable and writeable. + +Signed-off-by: Dennis Bonke +--- + glib/giounix.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/glib/giounix.c b/glib/giounix.c +index ad3aba2..e0237fc 100644 +--- a/glib/giounix.c ++++ b/glib/giounix.c +@@ -436,7 +436,10 @@ g_io_unix_get_flags (GIOChannel *channel) + channel->is_writeable = TRUE; + break; + default: +- g_assert_not_reached (); ++ channel->is_readable = TRUE; ++ channel->is_writeable = TRUE; ++ break; ++ //g_assert_not_reached (); + } + + return flags; +-- +2.37.2 diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 924b3edfad2..a72e9f7fe37 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,17 +1,19 @@ -From d33a19a85fd625a2acf53f95f32c369b7f91e230 Mon Sep 17 00:00:00 2001 +From ea350e347faaa97e0499d34582ff068510809542 Mon Sep 17 00:00:00 2001 From: Anhad Singh -Date: Thu, 3 Aug 2023 16:36:12 +1000 -Subject: [PATCH] socket: implement shutdown(2) +Date: Fri, 13 Oct 2023 22:50:34 +1100 +Subject: [PATCH] Signed-off-by: Anhad Singh --- - options/glibc/generic/execinfo.cpp | 5 ++-- - options/posix/generic/sys-socket-stubs.cpp | 9 ++++++-- - options/posix/include/mlibc/posix-sysdeps.hpp | 1 + - sysdeps/aero/generic/signals.cpp | 19 ++++++--------- - sysdeps/aero/generic/sockets.cpp | 23 +++++++++++++++++++ - sysdeps/aero/include/aero/syscall.h | 3 +++ - 6 files changed, 44 insertions(+), 16 deletions(-) + options/glibc/generic/execinfo.cpp | 5 +++-- + options/posix/generic/posix_stdlib.cpp | 2 +- + options/rtdl/generic/linker.cpp | 2 +- + sysdeps/aero/generic/aero.cpp | 9 ++++++--- + sysdeps/aero/generic/filesystem.cpp | 10 ++++++++++ + sysdeps/aero/generic/signals.cpp | 19 +++++++------------ + sysdeps/aero/generic/sockets.cpp | 16 ++++++++++++++++ + sysdeps/aero/include/aero/syscall.h | 2 ++ + 8 files changed, 46 insertions(+), 19 deletions(-) diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp index 3474615..aaf593a 100644 @@ -30,38 +32,74 @@ index 3474615..aaf593a 100644 } char **backtrace_symbols(void *const *, int) { -diff --git a/options/posix/generic/sys-socket-stubs.cpp b/options/posix/generic/sys-socket-stubs.cpp -index 1674945..037a994 100644 ---- a/options/posix/generic/sys-socket-stubs.cpp -+++ b/options/posix/generic/sys-socket-stubs.cpp -@@ -187,8 +187,13 @@ int setsockopt(int fd, int layer, int number, - return mlibc::sys_setsockopt(fd, layer, number, buffer, size); +diff --git a/options/posix/generic/posix_stdlib.cpp b/options/posix/generic/posix_stdlib.cpp +index 76b85dc..4b783b3 100644 +--- a/options/posix/generic/posix_stdlib.cpp ++++ b/options/posix/generic/posix_stdlib.cpp +@@ -464,7 +464,7 @@ int grantpt(int) { } --int shutdown(int, int) { -- mlibc::infoLogger() << "mlibc: shutdown() is a no-op!" << frg::endlog; -+int shutdown(int sockfd, int how) { -+ auto sysdep = MLIBC_CHECK_OR_ENOSYS(mlibc::sys_shutdown, -1); -+ if(int e = sysdep(sockfd, how); e) { -+ errno = e; -+ return -1; -+ } -+ - return 0; + double strtod_l(const char *__restrict__ nptr, char ** __restrict__ endptr, locale_t) { +- mlibc::infoLogger() << "mlibc: strtod_l ignores locale!" << frg::endlog; ++ // mlibc::infoLogger() << "mlibc: strtod_l ignores locale!" << frg::endlog; + return strtod(nptr, endptr); + } + +diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp +index c604a50..eec0b7b 100644 +--- a/options/rtdl/generic/linker.cpp ++++ b/options/rtdl/generic/linker.cpp +@@ -18,7 +18,7 @@ uintptr_t libraryBase = 0x41000000; + + constexpr bool verbose = false; + constexpr bool stillSlightlyVerbose = false; +-constexpr bool logBaseAddresses = false; ++constexpr bool logBaseAddresses = true; + constexpr bool logRpath = false; + constexpr bool eagerBinding = true; + +diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp +index e6bd277..a341fcf 100644 +--- a/sysdeps/aero/generic/aero.cpp ++++ b/sysdeps/aero/generic/aero.cpp +@@ -303,10 +303,13 @@ int sys_clone(void *tcb, pid_t *tid_out, void *stack) { + return 0; + } + +-void sys_thread_exit() UNIMPLEMENTED("sys_thread_exit") ++void sys_thread_exit() { ++ syscall(SYS_EXIT); ++ __builtin_trap(); ++} + +- int sys_waitpid(pid_t pid, int *status, int flags, struct rusage *ru, +- pid_t *ret_pid) { ++int sys_waitpid(pid_t pid, int *status, int flags, struct rusage *ru, ++ pid_t *ret_pid) { + if (ru) { + mlibc::infoLogger() + << "mlibc: struct rusage in sys_waitpid is unsupported" +diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp +index fa5a369..33a11f4 100644 +--- a/sysdeps/aero/generic/filesystem.cpp ++++ b/sysdeps/aero/generic/filesystem.cpp +@@ -39,6 +39,16 @@ int sys_read(int fd, void *buf, size_t count, ssize_t *bytes_read) { + return 0; } -diff --git a/options/posix/include/mlibc/posix-sysdeps.hpp b/options/posix/include/mlibc/posix-sysdeps.hpp -index 9918188..c694079 100644 ---- a/options/posix/include/mlibc/posix-sysdeps.hpp -+++ b/options/posix/include/mlibc/posix-sysdeps.hpp -@@ -159,6 +159,7 @@ int sys_vm_unmap(void *pointer, size_t size); - void *__restrict buffer, socklen_t *__restrict size); - [[gnu::weak]] int sys_setsockopt(int fd, int layer, int number, - const void *buffer, socklen_t size); -+[[gnu::weak]] int sys_shutdown(int sockfd, int how); - [[gnu::weak]] int sys_sigprocmask(int how, const sigset_t *__restrict set, - sigset_t *__restrict retrieve); - [[gnu::weak]] int sys_sigaction(int, const struct sigaction *__restrict, ++int sys_fsync(int) { ++ mlibc::infoLogger() << "\e[35mmlibc: fsync is a stub\e[39m" << frg::endlog; ++ return 0; ++} ++ ++int sys_fdatasync(int) { ++ mlibc::infoLogger() << "\e[35mmlibc: fdatasync() is a no-op\e[39m" << frg::endlog; ++ return 0; ++} ++ + // clang-format off + int sys_pwrite(int fd, const void *buffer, size_t count, off_t off, + ssize_t *written) UNIMPLEMENTED("sys_pwrite") diff --git a/sysdeps/aero/generic/signals.cpp b/sysdeps/aero/generic/signals.cpp index a6f69ff..611db69 100644 --- a/sysdeps/aero/generic/signals.cpp @@ -101,20 +139,13 @@ index a6f69ff..611db69 100644 } // namespace mlibc \ No newline at end of file diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp -index 2db218c..ed3fc06 100644 +index 0cce3c0..10af36a 100644 --- a/sysdeps/aero/generic/sockets.cpp +++ b/sysdeps/aero/generic/sockets.cpp -@@ -221,6 +221,29 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, +@@ -221,6 +221,22 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, } } -+int sys_shutdown(int sockfd, int how) { -+ auto ret = syscall(SYS_SOCK_SHUTDOWN, sockfd, how); -+ if(int e = sc_error(ret); e) -+ return e; -+ return 0; -+} -+ +int sys_peername(int fd, struct sockaddr *addr_ptr, socklen_t max_addr_length, socklen_t *actual_length) { + auto ret = syscall(SYS_GETPEERNAME, fd, addr_ptr, &max_addr_length); + if (int e = sc_error(ret); e) @@ -131,18 +162,17 @@ index 2db218c..ed3fc06 100644 + return 0; +} + - int sys_if_nametoindex(const char *name, unsigned int *ret) { - int fd = 0; - int r = sys_socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, AF_UNSPEC, &fd); + int sys_shutdown(int sockfd, int how) { + auto ret = syscall(SYS_SOCK_SHUTDOWN, sockfd, how); + if(int e = sc_error(ret); e) diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index d8bf99e..39c5b65 100644 +index 3f36e4d..39c5b65 100644 --- a/sysdeps/aero/include/aero/syscall.h +++ b/sysdeps/aero/include/aero/syscall.h -@@ -79,6 +79,9 @@ - #define SYS_SETPGID 72 +@@ -80,6 +80,8 @@ #define SYS_SETSID 73 #define SYS_GETPGID 74 -+#define SYS_SOCK_SHUTDOWN 75 + #define SYS_SOCK_SHUTDOWN 75 +#define SYS_GETPEERNAME 76 +#define SYS_GETSOCKNAME 77 diff --git a/patches/rust-libloading/rust-libloading.patch b/patches/rust-libloading/rust-libloading.patch index 743d6cedefc..ac3ec05e6f1 100644 --- a/patches/rust-libloading/rust-libloading.patch +++ b/patches/rust-libloading/rust-libloading.patch @@ -1,15 +1,14 @@ -From d6dfe23ee9299412d8281dabb7f5d903e152b589 Mon Sep 17 00:00:00 2001 -From: Anhad Singh -Date: Tue, 10 Oct 2023 17:24:17 +1100 +From f5fab150ee8fbfdef46888837b6e6d43fd3ec1c0 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 20 Nov 2022 13:39:51 +1100 Subject: [PATCH] -Signed-off-by: Anhad Singh --- src/os/unix/consts.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/os/unix/consts.rs b/src/os/unix/consts.rs -index ed3edaf..61659ff 100644 +index dbe4df9..fbdd2e3 100644 --- a/src/os/unix/consts.rs +++ b/src/os/unix/consts.rs @@ -58,7 +58,7 @@ mod posix { @@ -19,9 +18,9 @@ index ed3edaf..61659ff 100644 - if #[cfg(target_os = "haiku")] { + if #[cfg(any(target_os = "haiku", target_os = "aero"))] { pub(super) const RTLD_LAZY: c_int = 0; - } else if #[cfg(target_os = "aix")] { - pub(super) const RTLD_LAZY: c_int = 4; -@@ -94,7 +94,7 @@ mod posix { + } else if #[cfg(any( + target_os = "linux", +@@ -90,7 +90,7 @@ mod posix { } cfg_if! { @@ -30,7 +29,7 @@ index ed3edaf..61659ff 100644 pub(super) const RTLD_NOW: c_int = 1; } else if #[cfg(any( target_os = "linux", -@@ -133,6 +133,7 @@ mod posix { +@@ -126,6 +126,7 @@ mod posix { cfg_if! { if #[cfg(any( target_os = "haiku", @@ -38,14 +37,14 @@ index ed3edaf..61659ff 100644 all(target_os = "android",target_pointer_width = "32"), ))] { pub(super) const RTLD_GLOBAL: c_int = 2; -@@ -210,6 +211,7 @@ mod posix { +@@ -193,6 +194,7 @@ mod posix { + target_os = "fuchsia", target_os = "redox", - target_os = "hurd", + target_os = "aero", ))] { pub(super) const RTLD_LOCAL: c_int = 0; } else { -- -2.42.0 +2.38.1 diff --git a/patches/rust-nix/rust-nix.patch b/patches/rust-nix/rust-nix.patch index 0c124a2aa8e..32bf6442d21 100644 --- a/patches/rust-nix/rust-nix.patch +++ b/patches/rust-nix/rust-nix.patch @@ -1,26 +1,20 @@ -From 2ac82af89ae503c8743dcd96bca3dcbddccd1eea Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Thu, 23 Feb 2023 00:41:07 +0100 -Subject: [PATCH] aero: initial port +From 608f6dc307498272ec3a6317cac3bbbe2a8b74b1 Mon Sep 17 00:00:00 2001 +From: Andy-Python-Programmer +Date: Sun, 20 Nov 2022 12:21:43 +1100 +Subject: [PATCH] -Signed-off-by: Dennis Bonke --- - src/errno.rs | 218 +++++++++++++++++++++++++++++++++++++++++ - src/features.rs | 2 +- - src/lib.rs | 10 +- + src/errno.rs | 217 +++++++++++++++++++++++++++++++++++++++++ + src/lib.rs | 12 ++- src/sys/mod.rs | 10 +- - src/sys/resource.rs | 2 + - src/sys/signal.rs | 16 +-- - src/sys/socket/addr.rs | 26 +++-- - src/sys/socket/mod.rs | 6 +- + src/sys/socket/addr.rs | 16 +-- + src/sys/socket/mod.rs | 5 +- src/sys/termios.rs | 54 +++++++++- - src/sys/time.rs | 3 +- - src/sys/timerfd.rs | 2 +- - src/unistd.rs | 30 ++++++ - 12 files changed, 350 insertions(+), 29 deletions(-) + src/unistd.rs | 27 +++++ + 7 files changed, 327 insertions(+), 14 deletions(-) diff --git a/src/errno.rs b/src/errno.rs -index 41420e8..aedf294 100644 +index 9c2dfe4..d26d63d 100644 --- a/src/errno.rs +++ b/src/errno.rs @@ -22,6 +22,7 @@ cfg_if! { @@ -41,7 +35,7 @@ index 41420e8..aedf294 100644 match errno { UnknownErrno => "Unknown errno", EPERM => "Operation not permitted", -@@ -1562,6 +1566,220 @@ mod consts { +@@ -1557,6 +1561,219 @@ mod consts { } } @@ -117,7 +111,7 @@ index 41420e8..aedf294 100644 + // ENOTDIR = libc::ENOTDIR, + // ENOTEMPTY = libc::ENOTEMPTY, + // ENOTSOCK = libc::ENOTSOCK, -+ ENOTSUP = libc::ENOTSUP, ++ // ENOTSUP = libc::ENOTSUP, + ENOTTY = libc::ENOTTY, + // ENXIO = libc::ENXIO, + // EOPNOTSUPP = libc::EOPNOTSUPP, @@ -154,7 +148,7 @@ index 41420e8..aedf294 100644 + + // pub const EL2NSYNC: Errno = Errno::UnknownErrno; + -+ pub const fn from_i32(e: i32) -> Errno { ++ pub fn from_i32(e: i32) -> Errno { + use self::Errno::*; + + match e { @@ -224,7 +218,7 @@ index 41420e8..aedf294 100644 + // libc::ENOTDIR => ENOTDIR, + // libc::ENOTEMPTY => ENOTEMPTY, + // libc::ENOTSOCK => ENOTSOCK, -+ libc::ENOTSUP => ENOTSUP, ++ // libc::ENOTSUP => ENOTSUP, + // libc::ENOTTY => ENOTTY, + // libc::ENXIO => ENXIO, + // libc::EOPNOTSUPP => EOPNOTSUPP, @@ -258,233 +252,126 @@ index 41420e8..aedf294 100644 + } + } +} -+ #[cfg(target_os = "dragonfly")] mod consts { -diff --git a/src/features.rs b/src/features.rs -index 6108098..1f937e2 100644 ---- a/src/features.rs -+++ b/src/features.rs -@@ -1,7 +1,7 @@ - //! Feature tests for OS functionality - pub use self::os::*; - --#[cfg(any(target_os = "linux", target_os = "android"))] -+#[cfg(any(target_os = "linux", target_os = "android", target_os = "aero"))] - mod os { - use std::os::unix::ffi::OsStrExt; - use crate::sys::utsname::uname; diff --git a/src/lib.rs b/src/lib.rs -index d4dcbc4..e5f03c7 100644 +index 3b534a5..f7c8495 100644 --- a/src/lib.rs +++ b/src/lib.rs -@@ -43,9 +43,10 @@ +@@ -5,12 +5,13 @@ + #![crate_name = "nix"] #![cfg(unix)] - #![cfg_attr(docsrs, doc(cfg(all())))] #![allow(non_camel_case_types)] +#![allow(non_snake_case)] + // latest bitflags triggers a rustc bug with cross-crate macro expansions causing dead_code + // warnings even though the macro expands into something with allow(dead_code) + #![allow(dead_code)] #![cfg_attr(test, deny(warnings))] #![recursion_limit = "500"] -#![deny(unused)] +// #![deny(unused)] - #![allow(unused_macros)] - #![cfg_attr(not(feature = "default"), allow(unused_imports))] #![deny(unstable_features)] -@@ -62,12 +63,13 @@ pub use libc; + #![deny(missing_copy_implementations)] + #![deny(missing_debug_implementations)] +@@ -22,11 +23,13 @@ pub use libc; #[macro_use] mod macros; // Public crates -#[cfg(not(target_os = "redox"))] +#[cfg(not(any(target_os = "redox", target_os = "aero")))] - feature! { - #![feature = "dir"] - #[allow(missing_docs)] - pub mod dir; - } + pub mod dir; +#[cfg(not(target_os = "aero"))] - feature! { - #![feature = "env"] - pub mod env; -@@ -96,7 +98,7 @@ feature! { - target_os = "openbsd"))] - #[deny(missing_docs)] - pub mod ifaddrs; -- #[cfg(not(target_os = "redox"))] -+ #[cfg(not(any(target_os = "redox", target_os = "aero")))] - #[deny(missing_docs)] - pub mod net; - } -@@ -124,6 +126,7 @@ feature! { - #[allow(missing_docs)] - pub mod mqueue; - } + pub mod env; + pub mod errno; + #[deny(missing_docs)] +#[cfg(not(target_os = "aero"))] - feature! { - #![feature = "poll"] - pub mod poll; -@@ -134,6 +137,7 @@ feature! { - #[deny(missing_docs)] - pub mod pty; - } + pub mod features; + pub mod fcntl; + #[deny(missing_docs)] +@@ -54,15 +57,18 @@ pub mod mount; + target_os = "netbsd"))] + pub mod mqueue; + #[deny(missing_docs)] +-#[cfg(not(target_os = "redox"))] ++#[cfg(not(any(target_os = "redox", target_os = "aero")))] + pub mod net; + #[deny(missing_docs)] ++#[cfg(not(target_os = "aero"))] + pub mod poll; + #[deny(missing_docs)] + #[cfg(not(any(target_os = "redox", target_os = "fuchsia")))] + pub mod pty; +#[cfg(not(target_os = "aero"))] - feature! { - #![feature = "sched"] - pub mod sched; + pub mod sched; + pub mod sys; ++#[cfg(not(target_os = "aero"))] + pub mod time; + // This can be implemented for other platforms as soon as libc + // provides bindings for them. diff --git a/src/sys/mod.rs b/src/sys/mod.rs -index e5639f2..2cbdff5 100644 +index 43877a1..20dd8e5 100644 --- a/src/sys/mod.rs +++ b/src/sys/mod.rs -@@ -13,7 +13,7 @@ feature! { - feature! { - #![feature = "event"] +@@ -6,7 +6,7 @@ + target_os = "netbsd"))] + pub mod aio; -- #[cfg(any(target_os = "android", target_os = "linux"))] -+ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - #[allow(missing_docs)] - pub mod epoll; +-#[cfg(any(target_os = "android", target_os = "linux"))] ++#[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] + pub mod epoll; -@@ -64,6 +64,7 @@ feature! { - pub mod personality; - } + #[cfg(any(target_os = "dragonfly", +@@ -42,6 +42,7 @@ pub mod mman; + #[cfg(target_os = "linux")] + pub mod personality; +#[cfg(not(target_os = "aero"))] - feature! { - #![feature = "pthread"] - pub mod pthread; -@@ -100,7 +101,7 @@ feature! { - pub mod resource; - } + pub mod pthread; + + #[cfg(any(target_os = "android", +@@ -59,7 +60,8 @@ pub mod quota; + #[cfg(any(target_os = "linux"))] + pub mod reboot; -#[cfg(not(target_os = "redox"))] ++// #[cfg(not(target_os = "redox"))] +#[cfg(not(any(target_os = "redox", target_os = "aero")))] - feature! { - #![feature = "poll"] - pub mod select; -@@ -152,6 +153,7 @@ feature! { - pub mod statfs; - } + pub mod select; + + #[cfg(any(target_os = "android", +@@ -69,6 +71,7 @@ pub mod select; + target_os = "macos"))] + pub mod sendfile; +#[cfg(not(target_os = "aero"))] - feature! { - #![feature = "fs"] - pub mod statvfs; -@@ -181,6 +183,7 @@ feature! { - pub mod utsname; - } + pub mod signal; + + #[cfg(any(target_os = "android", target_os = "linux"))] +@@ -89,6 +92,7 @@ pub mod stat; + ))] + pub mod statfs; +#[cfg(not(target_os = "aero"))] - feature! { - #![feature = "process"] - pub mod wait; -@@ -192,7 +195,7 @@ feature! { - pub mod inotify; - } + pub mod statvfs; --#[cfg(any(target_os = "android", target_os = "linux"))] -+#[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - feature! { - #![feature = "time"] - pub mod timerfd; -@@ -203,6 +206,7 @@ feature! { - target_os = "freebsd", - target_os = "illumos", - target_os = "linux", -+ target_os = "aero", - target_os = "netbsd" - ), - feature = "time", -diff --git a/src/sys/resource.rs b/src/sys/resource.rs -index 76ceaf5..3457acd 100644 ---- a/src/sys/resource.rs -+++ b/src/sys/resource.rs -@@ -14,6 +14,7 @@ cfg_if! { - target_os = "openbsd", - target_os = "netbsd", - target_os = "macos", -+ target_os = "aero", - target_os = "ios", - target_os = "android", - target_os = "dragonfly", -@@ -48,6 +49,7 @@ libc_enum! { - target_os = "ios", - target_os = "android", - target_os = "dragonfly", -+ target_os = "aero", - all(target_os = "linux", not(any(target_env = "gnu", target_env = "uclibc"))) - ), repr(i32))] - #[non_exhaustive] -diff --git a/src/sys/signal.rs b/src/sys/signal.rs -index f982b4e..5621b6f 100644 ---- a/src/sys/signal.rs -+++ b/src/sys/signal.rs -@@ -99,13 +99,13 @@ libc_enum!{ - SIGSYS, - #[cfg(not(any(target_os = "android", target_os = "emscripten", - target_os = "fuchsia", target_os = "linux", -- target_os = "redox")))] -+ target_os = "redox", target_os = "aero")))] - #[cfg_attr(docsrs, doc(cfg(all())))] - /// Emulator trap - SIGEMT, - #[cfg(not(any(target_os = "android", target_os = "emscripten", - target_os = "fuchsia", target_os = "linux", -- target_os = "redox")))] -+ target_os = "redox", target_os = "aero")))] - #[cfg_attr(docsrs, doc(cfg(all())))] - /// Information request - SIGINFO, -@@ -157,11 +157,11 @@ impl FromStr for Signal { - "SIGSYS" => Signal::SIGSYS, - #[cfg(not(any(target_os = "android", target_os = "emscripten", - target_os = "fuchsia", target_os = "linux", -- target_os = "redox")))] -+ target_os = "redox", target_os = "aero")))] - "SIGEMT" => Signal::SIGEMT, - #[cfg(not(any(target_os = "android", target_os = "emscripten", - target_os = "fuchsia", target_os = "linux", -- target_os = "redox")))] -+ target_os = "redox", target_os = "aero")))] - "SIGINFO" => Signal::SIGINFO, - _ => return Err(Errno::EINVAL), - }) -@@ -215,11 +215,11 @@ impl Signal { - Signal::SIGSYS => "SIGSYS", - #[cfg(not(any(target_os = "android", target_os = "emscripten", - target_os = "fuchsia", target_os = "linux", -- target_os = "redox")))] -+ target_os = "redox", target_os = "aero")))] - Signal::SIGEMT => "SIGEMT", - #[cfg(not(any(target_os = "android", target_os = "emscripten", - target_os = "fuchsia", target_os = "linux", -- target_os = "redox")))] -+ target_os = "redox", target_os = "aero")))] - Signal::SIGINFO => "SIGINFO", - } - } -@@ -242,7 +242,7 @@ impl fmt::Display for Signal { - #[cfg(feature = "signal")] - pub use self::Signal::*; + #[cfg(any(target_os = "android", target_os = "linux"))] +@@ -100,8 +104,10 @@ pub mod time; + + pub mod uio; + ++#[cfg(not(target_os = "aero"))] + pub mod utsname; + ++#[cfg(not(target_os = "aero"))] + pub mod wait; --#[cfg(target_os = "redox")] -+#[cfg(any(target_os = "redox", target_os = "aero"))] - #[cfg(feature = "signal")] - const SIGNALS: [Signal; 29] = [ - SIGHUP, -@@ -349,7 +349,7 @@ const SIGNALS: [Signal; 30] = [ - SIGSYS]; - #[cfg(not(any(target_os = "linux", target_os = "android", - target_os = "fuchsia", target_os = "emscripten", -- target_os = "redox")))] -+ target_os = "redox", target_os = "aero")))] - #[cfg(feature = "signal")] - const SIGNALS: [Signal; 31] = [ - SIGHUP, + #[cfg(any(target_os = "android", target_os = "linux"))] diff --git a/src/sys/socket/addr.rs b/src/sys/socket/addr.rs -index 4b8ab09..f23da26 100644 +index d486056..b367e18 100644 --- a/src/sys/socket/addr.rs +++ b/src/sys/socket/addr.rs -@@ -19,6 +19,7 @@ use std::os::unix::io::RawFd; +@@ -17,6 +17,7 @@ use std::os::unix::io::RawFd; use crate::sys::socket::addr::sys_control::SysControlAddr; #[cfg(any(target_os = "android", target_os = "dragonfly", @@ -492,7 +379,7 @@ index 4b8ab09..f23da26 100644 target_os = "freebsd", target_os = "ios", target_os = "linux", -@@ -76,6 +77,7 @@ pub enum AddressFamily { +@@ -46,6 +47,7 @@ pub enum AddressFamily { /// Low level packet interface (see [`packet(7)`](https://man7.org/linux/man-pages/man7/packet.7.html)) #[cfg(any(target_os = "android", target_os = "linux", @@ -500,7 +387,7 @@ index 4b8ab09..f23da26 100644 target_os = "illumos", target_os = "fuchsia", target_os = "solaris"))] -@@ -376,7 +378,7 @@ impl AddressFamily { +@@ -245,7 +247,7 @@ impl AddressFamily { libc::AF_NETLINK => Some(AddressFamily::Netlink), #[cfg(any(target_os = "macos", target_os = "macos"))] libc::AF_SYSTEM => Some(AddressFamily::System), @@ -509,45 +396,7 @@ index 4b8ab09..f23da26 100644 libc::AF_PACKET => Some(AddressFamily::Packet), #[cfg(any(target_os = "dragonfly", target_os = "freebsd", -@@ -707,7 +709,8 @@ pub struct UnixAddr { - #[cfg(any(target_os = "android", - target_os = "fuchsia", - target_os = "illumos", -- target_os = "linux" -+ target_os = "linux", -+ target_os = "aero" - ))] - sun_len: u8 - } -@@ -842,7 +845,8 @@ impl UnixAddr { - if #[cfg(any(target_os = "android", - target_os = "fuchsia", - target_os = "illumos", -- target_os = "linux" -+ target_os = "linux", -+ target_os = "aero" - ))] - { - UnixAddr { sun, sun_len } -@@ -900,7 +904,8 @@ impl UnixAddr { - if #[cfg(any(target_os = "android", - target_os = "fuchsia", - target_os = "illumos", -- target_os = "linux" -+ target_os = "linux", -+ target_os = "aero" - ))] - { - self.sun_len -@@ -940,6 +945,7 @@ impl SockaddrLike for UnixAddr { - cfg_if!{ - if #[cfg(any(target_os = "android", - target_os = "fuchsia", -+ target_os = "aero", - target_os = "illumos", - target_os = "linux" - ))] { -@@ -1817,6 +1823,7 @@ pub enum SockAddr { +@@ -653,6 +655,7 @@ pub enum SockAddr { /// Datalink address (MAC) #[cfg(any(target_os = "android", target_os = "dragonfly", @@ -555,64 +404,64 @@ index 4b8ab09..f23da26 100644 target_os = "freebsd", target_os = "ios", target_os = "linux", -@@ -1886,7 +1893,7 @@ impl SockAddr { - #[cfg(all(feature = "ioctl", - any(target_os = "ios", target_os = "macos")))] +@@ -705,7 +708,7 @@ impl SockAddr { + SockAddr::Alg(..) => AddressFamily::Alg, + #[cfg(any(target_os = "ios", target_os = "macos"))] SockAddr::SysControl(..) => AddressFamily::System, - #[cfg(any(target_os = "android", target_os = "linux"))] + #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - #[cfg(feature = "net")] SockAddr::Link(..) => AddressFamily::Packet, #[cfg(any(target_os = "dragonfly", -@@ -1923,7 +1930,7 @@ impl SockAddr { + target_os = "freebsd", +@@ -738,7 +741,7 @@ impl SockAddr { if addr.is_null() { None } else { - match AddressFamily::from_i32(i32::from((*addr).sa_family)) { + match AddressFamily::from_i32((*addr).sa_family as i32) { Some(AddressFamily::Unix) => None, - #[cfg(feature = "net")] Some(AddressFamily::Inet) => Some(SockAddr::Inet( -@@ -1938,7 +1945,7 @@ impl SockAddr { - any(target_os = "ios", target_os = "macos")))] + InetAddr::V4(*(addr as *const libc::sockaddr_in)))), +@@ -750,7 +753,7 @@ impl SockAddr { + #[cfg(any(target_os = "ios", target_os = "macos"))] Some(AddressFamily::System) => Some(SockAddr::SysControl( SysControlAddr(*(addr as *const libc::sockaddr_ctl)))), - #[cfg(any(target_os = "android", target_os = "linux"))] + #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - #[cfg(feature = "net")] Some(AddressFamily::Packet) => Some(SockAddr::Link( LinkAddr(*(addr as *const libc::sockaddr_ll)))), -@@ -2026,7 +2033,7 @@ impl SockAddr { + #[cfg(any(target_os = "dragonfly", +@@ -833,7 +836,7 @@ impl SockAddr { mem::size_of_val(sa) as libc::socklen_t ), - #[cfg(any(target_os = "android", target_os = "linux"))] + #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - #[cfg(feature = "net")] SockAddr::Link(LinkAddr(ref addr)) => ( // This cast is always allowed in C -@@ -2077,6 +2084,7 @@ impl fmt::Display for SockAddr { - any(target_os = "ios", target_os = "macos")))] + unsafe { +@@ -879,6 +882,7 @@ impl fmt::Display for SockAddr { + #[cfg(any(target_os = "ios", target_os = "macos"))] SockAddr::SysControl(ref sc) => sc.fmt(f), #[cfg(any(target_os = "android", + target_os = "aero", target_os = "dragonfly", target_os = "freebsd", target_os = "ios", -@@ -2381,7 +2389,7 @@ pub mod sys_control { +@@ -1064,7 +1068,7 @@ pub mod sys_control { } -#[cfg(any(target_os = "android", target_os = "linux", target_os = "fuchsia"))] -+#[cfg(any(target_os = "android", target_os = "linux", target_os = "fuchsia", target_os = "aero"))] - #[cfg_attr(docsrs, doc(cfg(all())))] ++#[cfg(any(target_os = "android", target_os = "linux", target_os = "aero", target_os = "fuchsia"))] mod datalink { - feature! { + use super::{fmt, AddressFamily}; + diff --git a/src/sys/socket/mod.rs b/src/sys/socket/mod.rs -index 3f26ccf..c83182b 100644 +index da5573c..3bac136 100644 --- a/src/sys/socket/mod.rs +++ b/src/sys/socket/mod.rs -@@ -344,6 +344,7 @@ libc_bitflags!{ +@@ -251,6 +251,7 @@ libc_bitflags!{ /// /// Only used in [`recvmsg`](fn.recvmsg.html) function. #[cfg(any(target_os = "android", @@ -620,15 +469,7 @@ index 3f26ccf..c83182b 100644 target_os = "dragonfly", target_os = "freebsd", target_os = "linux", -@@ -355,6 +356,7 @@ libc_bitflags!{ - /// (For more details, see [send(2)](https://linux.die.net/man/2/send)). - #[cfg(any(target_os = "android", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "haiku", -@@ -1139,13 +1141,13 @@ impl<'a> ControlMessage<'a> { +@@ -866,13 +867,13 @@ impl<'a> ControlMessage<'a> { /// The value of CMSG_LEN on this message. /// Safe because CMSG_LEN is always safe @@ -645,10 +486,10 @@ index 3f26ccf..c83182b 100644 fn cmsg_len(&self) -> libc::c_uint { unsafe{CMSG_LEN(self.len() as libc::c_uint)} diff --git a/src/sys/termios.rs b/src/sys/termios.rs -index a107f8b..6a9453e 100644 +index 36a3601..c7bddc3 100644 --- a/src/sys/termios.rs +++ b/src/sys/termios.rs -@@ -375,10 +375,19 @@ impl From for u32 { +@@ -467,10 +467,19 @@ impl From for u32 { } // TODO: Add TCSASOFT, which will require treating this as a bitfield. @@ -666,9 +507,9 @@ index a107f8b..6a9453e 100644 +#[cfg(not(target_os = "aero"))] +libc_enum! { #[repr(i32)] - #[non_exhaustive] pub enum SetArg { -@@ -391,10 +400,19 @@ libc_enum! { + /// The change will occur immediately +@@ -482,10 +491,19 @@ libc_enum! { } } @@ -686,9 +527,9 @@ index a107f8b..6a9453e 100644 +#[cfg(not(target_os = "aero"))] +libc_enum! { #[repr(i32)] - #[non_exhaustive] pub enum FlushArg { -@@ -426,8 +444,17 @@ libc_enum! { + /// Flush data that was received but not read +@@ -515,8 +533,17 @@ libc_enum! { } // TODO: Make this usable directly as a slice index. @@ -704,18 +545,17 @@ index a107f8b..6a9453e 100644 +#[cfg(not(target_os = "aero"))] +libc_enum! { #[repr(usize)] - #[non_exhaustive] pub enum SpecialCharacterIndices { -@@ -524,7 +551,7 @@ libc_bitflags! { + VDISCARD, +@@ -601,13 +628,22 @@ libc_bitflags! { + IXOFF; #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(all())))] IXANY; - #[cfg(not(target_os = "redox"))] + #[cfg(not(any(target_os = "redox", target_os = "aero")))] - #[cfg_attr(docsrs, doc(cfg(all())))] IMAXBEL; #[cfg(any(target_os = "android", target_os = "linux", target_os = "macos"))] -@@ -533,6 +560,15 @@ libc_bitflags! { + IUTF8; } } @@ -731,7 +571,7 @@ index a107f8b..6a9453e 100644 libc_bitflags! { /// Flags for configuring the output mode of a terminal pub struct OutputFlags: tcflag_t { -@@ -744,8 +780,16 @@ libc_bitflags! { +@@ -791,8 +827,16 @@ libc_bitflags! { } } @@ -748,7 +588,7 @@ index a107f8b..6a9453e 100644 pub struct ControlFlags: tcflag_t { #[cfg(any(target_os = "dragonfly", target_os = "freebsd", -@@ -824,8 +868,16 @@ libc_bitflags! { +@@ -859,8 +903,16 @@ libc_bitflags! { } } @@ -764,46 +604,12 @@ index a107f8b..6a9453e 100644 +libc_bitflags! { pub struct LocalFlags: tcflag_t { #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(all())))] -diff --git a/src/sys/time.rs b/src/sys/time.rs -index c1ab67b..f43cf63 100644 ---- a/src/sys/time.rs -+++ b/src/sys/time.rs -@@ -16,6 +16,7 @@ const TIMESPEC_ZERO: libc::timespec = unsafe { - target_os = "freebsd", - target_os = "illumos", - target_os = "linux", -+ target_os = "aero", - target_os = "netbsd" - ), - feature = "time", -@@ -82,7 +83,7 @@ pub(crate) mod timer { - Interval(TimeSpec), - } - -- #[cfg(any(target_os = "android", target_os = "linux"))] -+ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - bitflags! { - /// Flags that are used for arming the timer. - pub struct TimerSetTimeFlags: libc::c_int { -diff --git a/src/sys/timerfd.rs b/src/sys/timerfd.rs -index 18acbae..0005b24 100644 ---- a/src/sys/timerfd.rs -+++ b/src/sys/timerfd.rs -@@ -57,7 +57,7 @@ impl FromRawFd for TimerFd { - libc_enum! { - /// The type of the clock used to mark the progress of the timer. For more - /// details on each kind of clock, please refer to [timerfd_create(2)](https://man7.org/linux/man-pages/man2/timerfd_create.2.html). -- #[repr(i32)] -+ #[repr(i64)] - #[non_exhaustive] - pub enum ClockId { - /// A settable system-wide real-time clock. + ECHOKE; diff --git a/src/unistd.rs b/src/unistd.rs -index d6ccdf1..af3b4a0 100644 +index d94cb99..8e26266 100644 --- a/src/unistd.rs +++ b/src/unistd.rs -@@ -1132,6 +1132,7 @@ feature! { +@@ -1081,6 +1081,7 @@ pub fn pipe() -> std::result::Result<(RawFd, RawFd), Error> { /// See also [pipe(2)](https://man7.org/linux/man-pages/man2/pipe.2.html) #[cfg(any(target_os = "android", target_os = "dragonfly", @@ -811,7 +617,7 @@ index d6ccdf1..af3b4a0 100644 target_os = "emscripten", target_os = "freebsd", target_os = "illumos", -@@ -1550,6 +1551,7 @@ pub fn getgroups() -> Result> { +@@ -1478,6 +1479,7 @@ pub fn getgroups() -> Result> { pub fn setgroups(groups: &[Gid]) -> Result<()> { cfg_if! { if #[cfg(any(target_os = "dragonfly", @@ -819,7 +625,7 @@ index d6ccdf1..af3b4a0 100644 target_os = "freebsd", target_os = "illumos", target_os = "ios", -@@ -1886,6 +1888,14 @@ feature! { +@@ -1799,6 +1801,14 @@ pub fn mkstemp(template: &P) -> Result<(RawFd, PathBuf)> { /// - [pathconf(2)](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pathconf.html) /// - [limits.h](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html) /// - [unistd.h](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html) @@ -833,8 +639,8 @@ index d6ccdf1..af3b4a0 100644 +#[cfg(not(target_os = "aero"))] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] #[repr(i32)] - #[non_exhaustive] -@@ -2082,6 +2092,17 @@ feature! { + pub enum PathconfVar { +@@ -1978,6 +1988,17 @@ pub fn pathconf(path: &P, var: PathconfVar) -> Result for User { - gid: Gid::from_raw(pw.pw_gid), +@@ -2668,18 +2692,21 @@ impl From<&libc::passwd> for User { + gid: Gid::from_raw((*pw).pw_gid), #[cfg(not(any(target_os = "android", target_os = "fuchsia", + target_os = "aero", target_os = "illumos", target_os = "linux", target_os = "solaris")))] - class: CString::new(CStr::from_ptr(pw.pw_class).to_bytes()).unwrap(), + class: CString::new(CStr::from_ptr((*pw).pw_class).to_bytes()).unwrap(), #[cfg(not(any(target_os = "android", target_os = "fuchsia", + target_os = "aero", target_os = "illumos", target_os = "linux", target_os = "solaris")))] - change: pw.pw_change, + change: (*pw).pw_change, #[cfg(not(any(target_os = "android", target_os = "fuchsia", + target_os = "aero", target_os = "illumos", target_os = "linux", target_os = "solaris")))] -@@ -2960,18 +2987,21 @@ impl From for libc::passwd { - pw_gid: u.gid.0, - #[cfg(not(any(target_os = "android", - target_os = "fuchsia", -+ target_os = "aero", - target_os = "illumos", - target_os = "linux", - target_os = "solaris")))] - pw_class: u.class.into_raw(), - #[cfg(not(any(target_os = "android", - target_os = "fuchsia", -+ target_os = "aero", - target_os = "illumos", - target_os = "linux", - target_os = "solaris")))] - pw_change: u.change, - #[cfg(not(any(target_os = "android", - target_os = "fuchsia", -+ target_os = "aero", - target_os = "illumos", - target_os = "linux", - target_os = "solaris")))] -- -2.39.1 - +2.38.1 diff --git a/patches/webkitgtk/webkitgtk.patch b/patches/webkitgtk/0001-Initial-Aero-support.patch similarity index 95% rename from patches/webkitgtk/webkitgtk.patch rename to patches/webkitgtk/0001-Initial-Aero-support.patch index f80e91ec667..82db1c0a73e 100644 --- a/patches/webkitgtk/webkitgtk.patch +++ b/patches/webkitgtk/0001-Initial-Aero-support.patch @@ -1,7 +1,7 @@ -From 9c3401a68d96016e19aafc60897ae450db07ead7 Mon Sep 17 00:00:00 2001 +From 610aa0dbb9c661c87172c0cf93de06efb019f80b Mon Sep 17 00:00:00 2001 From: Dennis Bonke Date: Sun, 2 Jan 2022 00:19:17 +0100 -Subject: [PATCH] Initial Aero support +Subject: [PATCH 1/2] Initial Aero support Signed-off-by: Dennis Bonke --- @@ -18,7 +18,7 @@ Signed-off-by: Dennis Bonke 10 files changed, 27 insertions(+), 16 deletions(-) diff --git a/Source/JavaScriptCore/heap/BlockDirectory.cpp b/Source/JavaScriptCore/heap/BlockDirectory.cpp -index e2a3540f86..d58513333e 100644 +index e2a3540f86..8b14455772 100644 --- a/Source/JavaScriptCore/heap/BlockDirectory.cpp +++ b/Source/JavaScriptCore/heap/BlockDirectory.cpp @@ -60,7 +60,7 @@ void BlockDirectory::setSubspace(Subspace* subspace) @@ -31,7 +31,7 @@ index e2a3540f86..d58513333e 100644 ASSERT(!(MarkedBlock::blockSize % pageSize)); auto numberOfPagesInMarkedBlock = MarkedBlock::blockSize / pageSize; diff --git a/Source/JavaScriptCore/runtime/MachineContext.h b/Source/JavaScriptCore/runtime/MachineContext.h -index 7857bfc167..c14fbb5b6c 100644 +index 7857bfc167..4e396fa853 100644 --- a/Source/JavaScriptCore/runtime/MachineContext.h +++ b/Source/JavaScriptCore/runtime/MachineContext.h @@ -346,7 +346,7 @@ static inline void*& framePointerImpl(mcontext_t& machineContext) @@ -83,7 +83,7 @@ index e54387ef28..d159806731 100644 #include #include diff --git a/Source/ThirdParty/ANGLE/src/common/platform.h b/Source/ThirdParty/ANGLE/src/common/platform.h -index 41f3cf4ff7..77c4a91f29 100644 +index 41f3cf4ff7..745e1f4a56 100644 --- a/Source/ThirdParty/ANGLE/src/common/platform.h +++ b/Source/ThirdParty/ANGLE/src/common/platform.h @@ -28,7 +28,7 @@ @@ -96,7 +96,7 @@ index 41f3cf4ff7..77c4a91f29 100644 #else # error Unsupported platform. diff --git a/Source/WTF/wtf/InlineASM.h b/Source/WTF/wtf/InlineASM.h -index 8379a69659..8f7493769f 100644 +index 8379a69659..f2780b7947 100644 --- a/Source/WTF/wtf/InlineASM.h +++ b/Source/WTF/wtf/InlineASM.h @@ -43,11 +43,11 @@ @@ -132,7 +132,7 @@ index 8379a69659..8f7493769f 100644 // GNU as-compatible syntax. #define LOCAL_LABEL_STRING(name) ".L" #name diff --git a/Source/WTF/wtf/PlatformHave.h b/Source/WTF/wtf/PlatformHave.h -index 61f13c2b73..de93124ef8 100644 +index 61f13c2b73..c4ff4a6252 100644 --- a/Source/WTF/wtf/PlatformHave.h +++ b/Source/WTF/wtf/PlatformHave.h @@ -226,7 +226,7 @@ @@ -154,7 +154,7 @@ index 61f13c2b73..de93124ef8 100644 #endif diff --git a/Source/WTF/wtf/PlatformOS.h b/Source/WTF/wtf/PlatformOS.h -index e61715fb72..ed72f251a9 100644 +index e61715fb72..28cf97f28f 100644 --- a/Source/WTF/wtf/PlatformOS.h +++ b/Source/WTF/wtf/PlatformOS.h @@ -118,6 +118,11 @@ @@ -202,7 +202,7 @@ index 743ef3dc84..3a61bc1dc3 100644 } return SQLiteStatement { *this, sqlStatement.value() }; diff --git a/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp b/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp -index efcd663f84..11e5467c10 100644 +index efcd663f84..81a425a037 100644 --- a/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp +++ b/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp @@ -46,7 +46,7 @@ @@ -215,7 +215,7 @@ index efcd663f84..11e5467c10 100644 #else #if USE(GLIB) diff --git a/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp b/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp -index 998a2a7679..a490b3fb5f 100644 +index 998a2a7679..51c5d38573 100644 --- a/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp +++ b/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp @@ -47,8 +47,10 @@ @@ -239,5 +239,5 @@ index 998a2a7679..a490b3fb5f 100644 if (fileDescriptor != -1) -- -2.40.0 +2.42.0 diff --git a/patches/webkitgtk/0002-xxx.patch b/patches/webkitgtk/0002-xxx.patch new file mode 100644 index 00000000000..ae6402e7784 --- /dev/null +++ b/patches/webkitgtk/0002-xxx.patch @@ -0,0 +1,181 @@ +From 4a70595e159ee5cc7336ed10c78f7f34284506e1 Mon Sep 17 00:00:00 2001 +From: Anhad Singh +Date: Sat, 14 Oct 2023 16:58:18 +1100 +Subject: [PATCH 2/2] + +Signed-off-by: Anhad Singh +--- + .../ANGLE/include/GLSLANG/ShaderVars.h | 1 + + Source/WTF/wtf/MallocPtr.h | 1 + + .../WTF/wtf/text/IntegerToStringConversion.h | 25 ++++++++++--------- + .../WebCore/accessibility/AXObjectCache.cpp | 2 ++ + .../graphics/BifurcatedGraphicsContext.cpp | 2 ++ + .../platform/graphics/x11/XUniqueResource.h | 2 ++ + 6 files changed, 21 insertions(+), 12 deletions(-) + +diff --git a/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h b/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h +index 68dc7e2e32..e127de3373 100644 +--- a/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h ++++ b/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + + // This type is defined here to simplify ANGLE's integration with glslang for SPIRv. + using ShCompileOptions = uint64_t; +diff --git a/Source/WTF/wtf/MallocPtr.h b/Source/WTF/wtf/MallocPtr.h +index 2cbd861efd..57e8e66100 100644 +--- a/Source/WTF/wtf/MallocPtr.h ++++ b/Source/WTF/wtf/MallocPtr.h +@@ -25,6 +25,7 @@ + + #pragma once + ++#include + #include + #include + +diff --git a/Source/WTF/wtf/text/IntegerToStringConversion.h b/Source/WTF/wtf/text/IntegerToStringConversion.h +index 03f5861c33..666e53e564 100644 +--- a/Source/WTF/wtf/text/IntegerToStringConversion.h ++++ b/Source/WTF/wtf/text/IntegerToStringConversion.h +@@ -21,15 +21,17 @@ + + #pragma once + ++#include + #include + + namespace WTF { + +-enum PositiveOrNegativeNumber { PositiveNumber, NegativeNumber }; ++enum PositiveOrNegativeNumber { PositiveNumber, ++ NegativeNumber }; + +-template struct IntegerToStringConversionTrait; ++template struct IntegerToStringConversionTrait; + +-template ++template + static typename IntegerToStringConversionTrait::ReturnType numberToStringImpl(UnsignedIntegerType number, AdditionalArgumentType additionalArgument) + { + LChar buf[sizeof(UnsignedIntegerType) * 3 + 1]; +@@ -47,7 +49,7 @@ static typename IntegerToStringConversionTrait::ReturnType numberToStringImpl + return IntegerToStringConversionTrait::flush(p, static_cast(end - p), additionalArgument); + } + +-template ++template + inline typename IntegerToStringConversionTrait::ReturnType numberToStringSigned(SignedIntegerType number, typename IntegerToStringConversionTrait::AdditionalArgumentType* additionalArgument = nullptr) + { + if (number < 0) +@@ -55,13 +57,13 @@ inline typename IntegerToStringConversionTrait::ReturnType numberToStringSign + return numberToStringImpl, PositiveNumber>(number, additionalArgument); + } + +-template ++template + inline typename IntegerToStringConversionTrait::ReturnType numberToStringUnsigned(UnsignedIntegerType number, typename IntegerToStringConversionTrait::AdditionalArgumentType* additionalArgument = nullptr) + { + return numberToStringImpl(number, additionalArgument); + } + +-template ++template + static void writeIntegerToBufferImpl(UnsignedIntegerType number, CharacterType* destination) + { + static_assert(!std::is_same_v>, "'bool' not supported"); +@@ -76,12 +78,12 @@ static void writeIntegerToBufferImpl(UnsignedIntegerType number, CharacterType* + + if (NumberType == NegativeNumber) + *--p = '-'; +- ++ + while (p < end) + *destination++ = static_cast(*p++); + } + +-template ++template + inline void writeIntegerToBuffer(IntegerType integer, CharacterType* destination) + { + static_assert(std::is_integral_v); +@@ -95,7 +97,7 @@ inline void writeIntegerToBuffer(IntegerType integer, CharacterType* destination + return writeIntegerToBufferImpl(integer, destination); + } + +-template ++template + constexpr unsigned lengthOfIntegerAsStringImpl(UnsignedIntegerType number) + { + unsigned length = 0; +@@ -111,15 +113,14 @@ constexpr unsigned lengthOfIntegerAsStringImpl(UnsignedIntegerType number) + return length; + } + +-template ++template + constexpr unsigned lengthOfIntegerAsString(IntegerType integer) + { + static_assert(std::is_integral_v); + if constexpr (std::is_same_v) { + UNUSED_PARAM(integer); + return 1; +- } +- else if constexpr (std::is_signed_v) { ++ } else if constexpr (std::is_signed_v) { + if (integer < 0) + return lengthOfIntegerAsStringImpl, NegativeNumber>(-integer); + return lengthOfIntegerAsStringImpl, PositiveNumber>(integer); +diff --git a/Source/WebCore/accessibility/AXObjectCache.cpp b/Source/WebCore/accessibility/AXObjectCache.cpp +index a7a867f60d..a08ce5078d 100644 +--- a/Source/WebCore/accessibility/AXObjectCache.cpp ++++ b/Source/WebCore/accessibility/AXObjectCache.cpp +@@ -528,9 +528,11 @@ static bool isSimpleImage(const RenderObject& renderer) + || (is(node) && downcast(node)->hasAttributeWithoutSynchronization(usemapAttr))) + return false; + ++#if ENABLE(VIDEO) + // Exclude video and audio elements. + if (is(node)) + return false; ++#endif + + return true; + } +diff --git a/Source/WebCore/platform/graphics/BifurcatedGraphicsContext.cpp b/Source/WebCore/platform/graphics/BifurcatedGraphicsContext.cpp +index c0ce72c5ff..a2a58df7eb 100644 +--- a/Source/WebCore/platform/graphics/BifurcatedGraphicsContext.cpp ++++ b/Source/WebCore/platform/graphics/BifurcatedGraphicsContext.cpp +@@ -269,11 +269,13 @@ void BifurcatedGraphicsContext::drawPattern(NativeImage& nativeImage, const Floa + m_secondaryContext.drawPattern(nativeImage, imageSize, destRect, tileRect, patternTransform, phase, spacing, options); + } + ++#if ENABLE(VIDEO) + void BifurcatedGraphicsContext::paintFrameForMedia(MediaPlayer& player, const FloatRect& destination) + { + m_primaryContext.paintFrameForMedia(player, destination); + m_secondaryContext.paintFrameForMedia(player, destination); + } ++#endif + + void BifurcatedGraphicsContext::scale(const FloatSize& scale) + { +diff --git a/Source/WebCore/platform/graphics/x11/XUniqueResource.h b/Source/WebCore/platform/graphics/x11/XUniqueResource.h +index 0da8b0c9c0..9296efca23 100644 +--- a/Source/WebCore/platform/graphics/x11/XUniqueResource.h ++++ b/Source/WebCore/platform/graphics/x11/XUniqueResource.h +@@ -26,6 +26,8 @@ + #ifndef XUniqueResource_h + #define XUniqueResource_h + ++#include ++ + #if PLATFORM(X11) + + #if USE(GLX) +-- +2.42.0 + diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs index 579e1d9c860..315d0f65105 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs @@ -33,7 +33,24 @@ macro interrupt_exception(fn $name:ident() => $message:expr) { unwind::prepare_panic(); log::error!("EXCEPTION: {}", $message); + log::error!("FS={:#x}", unsafe { io::rdmsr(io::IA32_FS_BASE) },); + log::error!("GS={:#x}", unsafe { io::rdmsr(io::IA32_GS_BASE) }); log::error!("Stack: {:#x?}", stack); + dbg!( + scheduler::get_scheduler() + .current_task() + .arch_task() + .fpu_storage + ); + + if stack.stack.iret.rip != 0 { + unsafe { + log::error!( + "RIP={:?}", + core::slice::from_raw_parts(stack.stack.iret.rip as *const u8, 512) + ); + } + } unwind::unwind_stack_trace(); diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index b864b6269c7..d66038d474c 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -247,7 +247,9 @@ fn enable_xsave() { unsafe { controlregs::write_cr4(cr4) } let mut xcr0 = controlregs::read_xcr0(); - xcr0.insert(XCr0Flags::X87 | XCr0Flags::SSE); + xcr0.insert(XCr0Flags::X87 | XCr0Flags::SSE | XCr0Flags::AVX); + // xcr0.insert(XCr0Flags::BNDREG | XCr0Flags::BNDCSR); + // xcr0.insert(XCr0Flags::ZMM_HI256 | XCr0Flags::HI16_ZMM | XCr0Flags::OPMASK); unsafe { controlregs::write_xcr0(xcr0) } } diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index f6370fdbca8..c2aa7bfa6a5 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -126,7 +126,7 @@ pub struct ArchTask { fs_base: VirtAddr, gs_base: VirtAddr, - fpu_storage: Option>, + pub fpu_storage: Option, } impl ArchTask { @@ -212,14 +212,15 @@ impl ArchTask { let old_registers_frame = unsafe { old_stack.offset::() }; let registers_frame = unsafe { new_stack.offset::() }; - *registers_frame = InterruptErrorStack::default(); + *registers_frame = *old_registers_frame; - registers_frame.stack.iret.cs = old_registers_frame.stack.iret.cs; - registers_frame.stack.iret.ss = old_registers_frame.stack.iret.ss; + // registers_frame.stack.iret.cs = old_registers_frame.stack.iret.cs; + // registers_frame.stack.iret.ss = old_registers_frame.stack.iret.ss; + // registers_frame.stack.iret.rflags = old_registers_frame.stack.iret.rflags; registers_frame.stack.iret.rip = entry as _; registers_frame.stack.iret.rsp = usr_stack as _; - registers_frame.stack.iret.rflags = 0x200; + // registers_frame.stack.iret.rflags = 0x200; let context = unsafe { new_stack.offset::() }; @@ -231,8 +232,7 @@ impl ArchTask { context.rip = fork_init as _; context.cr3 = address_space.cr3().start_address().as_u64(); - let mut fpu_storage = alloc_boxed_buffer::(xsave_size() as usize); - fpu_storage.copy_from_slice(self.fpu_storage.as_ref().unwrap()); + let mut fpu_storage = self.fpu_storage.unwrap().clone(); Ok(Self { context: unsafe { Unique::new_unchecked(context) }, @@ -241,7 +241,7 @@ impl ArchTask { user: true, // The FS and GS bases are inherited from the parent process. - fs_base: self.fs_base, + fs_base: VirtAddr::new(1), gs_base: self.gs_base, fpu_storage: Some(fpu_storage), @@ -287,8 +287,7 @@ impl ArchTask { context.rip = fork_init as u64; context.cr3 = new_address_space.cr3().start_address().as_u64(); - let mut fpu_storage = alloc_boxed_buffer::(xsave_size() as usize); - fpu_storage.copy_from_slice(self.fpu_storage.as_ref().unwrap()); + let fpu_storage = self.fpu_storage.unwrap().clone(); Ok(Self { context: unsafe { Unique::new_unchecked(context) }, @@ -344,30 +343,30 @@ impl ArchTask { self.fs_base = VirtAddr::zero(); self.gs_base = VirtAddr::zero(); - let mut fpu_storage = alloc_boxed_buffer::(xsave_size() as usize); - - unsafe { - xrstor(&fpu_storage); - - // The x87 FPU control word is set to 0x37f (default), which masks all - // floating-point exceptions, sets rounding to nearest, and sets the x87 - // FPU precision to 64 bits (as documented in Intel SDM volume 1 section - // 8.1.5). - const DEFAULT_FPU_CWORD: u16 = 0x37f; - asm!("fldcw [{}]", in(reg) &DEFAULT_FPU_CWORD, options(nomem)); - - // Set the default MXCSR value at reset as documented in Intel SDM volume 2A. - controlregs::write_mxcsr( - MxCsr::INVALID_OPERATION_MASK - | MxCsr::DENORMAL_MASK - | MxCsr::DIVIDE_BY_ZERO_MASK - | MxCsr::OVERFLOW_MASK - | MxCsr::UNDERFLOW_MASK - | MxCsr::PRECISION_MASK, - ); - - xsave(&mut fpu_storage); - } + let mut fpu_storage = FpuState::default(); + + // unsafe { + // xrstor(&fpu_storage); + + // // The x87 FPU control word is set to 0x37f (default), which masks all + // // floating-point exceptions, sets rounding to nearest, and sets the x87 + // // FPU precision to 64 bits (as documented in Intel SDM volume 1 section + // // 8.1.5). + // const DEFAULT_FPU_CWORD: u16 = 0x37f; + // asm!("fldcw [{}]", in(reg) &DEFAULT_FPU_CWORD, options(nomem)); + + // // Set the default MXCSR value at reset as documented in Intel SDM volume 2A. + // controlregs::write_mxcsr( + // MxCsr::INVALID_OPERATION_MASK + // | MxCsr::DENORMAL_MASK + // | MxCsr::DIVIDE_BY_ZERO_MASK + // | MxCsr::OVERFLOW_MASK + // | MxCsr::UNDERFLOW_MASK + // | MxCsr::PRECISION_MASK, + // ); + + // xsave(&mut fpu_storage); + // } self.fpu_storage = Some(fpu_storage); @@ -446,11 +445,9 @@ impl ArchTask { /// Allocates a new context switch stack for the process and returns the stack /// top address. See the module level documentation for more information. fn alloc_switch_stack() -> Result> { - let frame: PhysFrame = FRAME_ALLOCATOR - .allocate_frame() - .ok_or(MapToError::FrameAllocationFailed)?; + let frame = FRAME_ALLOCATOR.alloc_zeroed(4096 * 4).unwrap(); - Ok(frame.start_address().as_hhdm_virt() + Size4KiB::SIZE) + Ok(frame.as_hhdm_virt() + (4096u64 * 4)) } fn unref_pt(&mut self) { @@ -500,6 +497,7 @@ impl ArchTask { /// belongs to. This is required since we also update the GS base register with the /// `base` immediately (not waiting for a switch). pub unsafe fn set_gs_base(&mut self, base: VirtAddr) { + self.gs_base = base; io::set_inactive_gsbase(base); } @@ -515,13 +513,14 @@ impl ArchTask { /// belongs to. This is required since we also update the FS base register with the /// `base` immediately (not waiting for a switch). pub unsafe fn set_fs_base(&mut self, base: VirtAddr) { + self.fs_base = base; io::set_fsbase(base); } } fn xsave_size() -> u32 { - static XSAVE_SIZE: Option = None; - XSAVE_SIZE.unwrap_or_else(|| { + static XSAVE_SIZE: spin::Once = spin::Once::new(); + *XSAVE_SIZE.call_once(|| { CpuId::new() .get_extended_state_info() .expect("xsave: cpuid extended state info unavailable") @@ -529,18 +528,91 @@ fn xsave_size() -> u32 { }) } -fn xsave(fpu: &mut Box<[u8]>) { - unsafe { - asm!("xsave [{}]", in(reg) fpu.as_ptr(), in("eax") 0xffffffffu32, in("edx") 0xffffffffu32) - } +#[derive(Debug, Copy, Clone)] +#[repr(C, align(16))] +pub struct FpuState { + /// x87 FPU Control Word (16 bits). See Figure 8-6 in the Intel® 64 and IA-32 Architectures + /// Software Developer’s Manual Volume 1, for the layout of the x87 FPU control word. + pub fcw: u16, + /// x87 FPU Status Word (16 bits). + pub fsw: u16, + /// x87 FPU Tag Word (8 bits) + reserved (8 bits). + pub ftw: u16, + /// x87 FPU Opcode (16 bits). + pub fop: u16, + /// x87 FPU Instruction Pointer Offset ([31:0]). The contents of this field differ depending on + /// the current addressing mode (32-bit, 16-bit, or 64-bit) of the processor when the + /// FXSAVE instruction was executed: 32-bit mode — 32-bit IP offset. 16-bit mode — low 16 + /// bits are IP offset; high 16 bits are reserved. 64-bit mode with REX.W — 64-bit IP + /// offset. 64-bit mode without REX.W — 32-bit IP offset. + pub fip: u32, + /// x87 FPU Instruction Pointer Selector (16 bits) + reserved (16 bits). + pub fcs: u32, + /// x87 FPU Instruction Operand (Data) Pointer Offset ([31:0]). The contents of this field + /// differ depending on the current addressing mode (32-bit, 16-bit, or 64-bit) of the + /// processor when the FXSAVE instruction was executed: 32-bit mode — 32-bit DP offset. + /// 16-bit mode — low 16 bits are DP offset; high 16 bits are reserved. 64-bit mode + /// with REX.W — 64-bit DP offset. 64-bit mode without REX.W — 32-bit DP offset. + pub fdp: u32, + /// x87 FPU Instruction Operand (Data) Pointer Selector (16 bits) + reserved. + pub fds: u32, + /// MXCSR Register State (32 bits). + pub mxcsr: u32, + /// This mask can be used to adjust values written to the MXCSR register, ensuring that + /// reserved bits are set to 0. Set the mask bits and flags in MXCSR to the mode of + /// operation desired for SSE and SSE2 SIMD floating-point instructions. + pub mxcsr_mask: u32, + /// x87 FPU or MMX technology registers. Layout: [12 .. 9 | 9 ... 0] LHS = reserved; RHS = mm. + pub mm: [u128; 8], + /// XMM registers (128 bits per field). + pub xmm: [u128; 16], + /// reserved. + pub _pad: [u64; 12], } -fn xrstor(fpu: &Box<[u8]>) { - unsafe { - asm!("xrstor [{}]", in(reg) fpu.as_ptr(), in("eax") 0xffffffffu32, in("edx") 0xffffffffu32); +impl Default for FpuState { + fn default() -> Self { + Self { + mxcsr: 0x1f80, + mxcsr_mask: 0x037f, + // rest are zeroed + fcw: 0, + fsw: 0, + ftw: 0, + fop: 0, + fip: 0, + fcs: 0, + fdp: 0, + fds: 0, + mm: [0; 8], + xmm: [u128::MAX; 16], + _pad: [0; 12], + } } } +fn xsave(fpu: &mut FpuState) { + // The implicit EDX:EAX register pair specifies a 64-bit instruction mask. The specific state + // components saved correspond to the bits set in the requested-feature bitmap (RFBM), which is + // the logical-AND of EDX:EAX and XCR0. + // unsafe { + // asm!("xsave64 [{}]", in(reg) fpu.as_ptr(), in("eax") u32::MAX, in("edx") u32::MAX, + // options(nomem, nostack)) } + + use core::arch::x86_64::_fxsave64; + + unsafe { _fxsave64(fpu as *mut FpuState as *mut _) } +} + +fn xrstor(fpu: &FpuState) { + // unsafe { + // asm!("xrstor [{}]", in(reg) fpu.as_ptr(), in("eax") u32::MAX, in("edx") u32::MAX, + // options(nomem, nostack)); } + use core::arch::x86_64::_fxrstor64; + + unsafe { _fxrstor64(fpu as *const FpuState as *const _) } +} + /// Check out the module level documentation for more information. pub fn arch_task_spinup(from: &mut ArchTask, to: &ArchTask) { extern "C" { @@ -548,6 +620,14 @@ pub fn arch_task_spinup(from: &mut ArchTask, to: &ArchTask) { } unsafe { + if let Some(fpu) = from.fpu_storage.as_mut() { + xsave(fpu); + } + + if let Some(fpu) = to.fpu_storage.as_ref() { + xrstor(fpu); + } + // Load the new thread's kernel stack pointer everywhere it's needed. let kstackp = to.context_switch_rsp.as_u64(); super::gdt::TSS.rsp[0] = kstackp; @@ -560,14 +640,6 @@ pub fn arch_task_spinup(from: &mut ArchTask, to: &ArchTask) { io::set_fsbase(to.fs_base); io::set_inactive_gsbase(to.gs_base); - if let Some(fpu) = from.fpu_storage.as_mut() { - xsave(fpu); - } - - if let Some(fpu) = to.fpu_storage.as_ref() { - xrstor(fpu); - } - task_spinup(&mut from.context, to.context.as_ref()); } } diff --git a/src/aero_kernel/src/mem/mod.rs b/src/aero_kernel/src/mem/mod.rs index 41f68d04780..ba75081a434 100644 --- a/src/aero_kernel/src/mem/mod.rs +++ b/src/aero_kernel/src/mem/mod.rs @@ -128,13 +128,5 @@ impl AddressSpace { } pub fn alloc_boxed_buffer(size: usize) -> Box<[T]> { - if size == 0 { - return >::default(); - } - - let layout = unsafe { Layout::from_size_align_unchecked(size, 8) }; - let ptr = unsafe { ::alloc::alloc::alloc_zeroed(layout) as *mut T }; - let slice_ptr = core::ptr::slice_from_raw_parts_mut(ptr, size); - - unsafe { Box::from_raw(slice_ptr) } + unsafe { Box::new_zeroed_slice(size).assume_init() } } diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index 169a01bd093..aa36e7eabe5 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -1190,10 +1190,10 @@ impl<'a> OffsetPageTable<'a> { let mut flags = entry.flags(); // Check if the mapping is shared. - if !flags.contains(PageTableFlags::BIT_10) { - // Setup copy on write page. - flags.remove(PageTableFlags::WRITABLE); - } + // if !flags.contains(PageTableFlags::BIT_10) { + // Setup copy on write page. + flags.remove(PageTableFlags::WRITABLE); + // } entry.set_flags(flags); n1[i].set_frame(entry.frame().unwrap(), flags); diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index 8b76e1fc5c0..826c8667dd1 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -61,7 +61,8 @@ pub fn uname(buffer: &mut Utsname) -> Result { let init_bytes = init.as_bytes(); let len = init.len(); - fixed[..len].copy_from_slice(init_bytes) + fixed[..len].copy_from_slice(init_bytes); + fixed[len..].fill(0); } init_array(&mut buffer.sysname, "Aero"); @@ -103,6 +104,8 @@ pub fn clone(entry: usize, stack: usize) -> Result { pub fn kill(pid: usize, signal: usize) -> Result { // If pid is positive, then signal is sent to the process with that pid. if pid > 0 { + crate::unwind::unwind_stack_trace(); + let task = scheduler::get_scheduler() .find_task(TaskId::new(pid)) .ok_or(SyscallError::ESRCH)?; diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index b0ffb6db0f1..a2387ff7d22 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -400,6 +400,7 @@ impl Task { pending_io: AtomicBool::new(false), children: Mutex::new(Default::default()), + // sus? fixme? parent: Mutex::new(None), cwd: RwLock::new(Some(self.cwd.read().as_ref().unwrap().fork())), diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 7fe895cc29a..1da5b1f0325 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -436,9 +436,9 @@ impl Mapping { | PageTableFlags::USER_ACCESSIBLE | self.protection.into(); - if self.flags.contains(MMapFlags::MAP_SHARED) { - flags |= PageTableFlags::BIT_10; - } + // if self.flags.contains(MMapFlags::MAP_SHARED) { + // flags |= PageTableFlags::BIT_10; + // } unsafe { offset_table.map_to(Page::containing_address(address), frame, flags) } .expect("failed to map allocated frame for private file read") @@ -784,45 +784,47 @@ impl VmProtected { ) -> Option { // Offset is required to be a multiple of page size. if (offset as u64 & (Size4KiB::SIZE - 1)) != 0 { + log::warn!("mmap: offset is not a multiple of page size"); return None; } // The provided size should be non-zero. if size == 0 { + log::warn!("mmap: size is zero"); return None; } if file.is_some() { - // SAFETY: We cannot mmap a file with the anonymous flag. if flags.contains(MMapFlags::MAP_ANONYOMUS) { + log::warn!("mmap: cannot map a file with the anonymous flag"); return None; } } else { - // SAFETY: Mappings not backed by a file must be anonymous. if !flags.contains(MMapFlags::MAP_ANONYOMUS) { + log::warn!("mmap: mappings not backed by a file cannot be anonymous"); return None; } - // SAFETY: We cannot have a shared and an anonymous mapping. if flags.contains(MMapFlags::MAP_SHARED) { + log::warn!("mmap: anonymous mappings cannot be shared"); return None; } } let size_aligned = align_up(size as _, Size4KiB::SIZE); - if address == VirtAddr::zero() { + let x = if address == VirtAddr::zero() { // We need to find a free mapping above 0x7000_0000_0000. self.find_any_above(VirtAddr::new(0x7000_0000_0000), size_aligned as _) } else if flags.contains(MMapFlags::MAP_FIXED) { // SAFETY: The provided address should be page aligned. if !address.is_aligned(Size4KiB::SIZE) { + log::warn!("mmap: fixed mapping address is not page aligned"); return None; } - // SAFETY: The provided (address + size) should be less then - // the userland max address. if (address + size_aligned) > userland_last_address() { + log::warn!("mmap: fixed mapping address is out of range"); return None; } @@ -857,7 +859,38 @@ impl VmProtected { }); addr - }) + }); + + if x.is_none() { + log::warn!("mmap failed"); + self.log(); + } + + x + } + + fn log(&self) { + for mmap in &self.mappings { + if let Some(file) = mmap.file.as_ref() { + log::debug!( + "{:?}..{:?} => {:?}, {:?} (offset={:#x}, size={:#x})", + mmap.start_addr, + mmap.end_addr, + mmap.protection, + mmap.flags, + file.offset, + file.size, + ); + } else { + log::debug!( + "{:?}..{:?} => {:?}, {:?}", + mmap.start_addr, + mmap.end_addr, + mmap.protection, + mmap.flags, + ); + } + } } fn load_bin<'header>( diff --git a/tools/cargo-inject-patches.py b/tools/cargo-inject-patches.py index 7d046383d9d..18be0cf7d05 100644 --- a/tools/cargo-inject-patches.py +++ b/tools/cargo-inject-patches.py @@ -11,7 +11,7 @@ "calloop": "0.9.3", "libc": "0.2.149", "getrandom": "0.2.9", - "libloading": "0.8.1", + "libloading": "0.7.3", "mio": ["0.6.23", "0.8.3"], "nix": "0.24.3", "num_cpus": "1.15.0", diff --git a/userland/apps/init/src/main.rs b/userland/apps/init/src/main.rs index fc30f33b071..ecbaef5d8c2 100644 --- a/userland/apps/init/src/main.rs +++ b/userland/apps/init/src/main.rs @@ -53,21 +53,21 @@ fn main() -> Result<(), Box> { let stdout = OpenOptions::new().write(true).open(TTY_PATH)?; // fd=1 let stderr = OpenOptions::new().write(true).open(TTY_PATH)?; // fd=2 - // { - let stdset = FileSet::new([stdin, stdout, stderr]); - stdset.remove_cloexec(); + { + let stdset = FileSet::new([stdin, stdout, stderr]); + stdset.remove_cloexec(); - Command::new("dhcpd").spawn()?; - // } + Command::new("dhcpd").spawn()?; + } - // // Swap the `/dev/tty` std{in,out,err} file descriptors with `/dev/null` to suppress the Xorg - // // server logs. - // let stdin = OpenOptions::new().read(true).open(DEV_NULL)?; // fd=0 - // let stdout = OpenOptions::new().write(true).open(DEV_NULL)?; // fd=1 - // let stderr = OpenOptions::new().write(true).open(DEV_NULL)?; // fd=2 + // Swap the `/dev/tty` std{in,out,err} file descriptors with `/dev/null` to suppress the Xorg + // server logs. + let stdin = OpenOptions::new().read(true).open(DEV_NULL)?; // fd=0 + let stdout = OpenOptions::new().write(true).open(DEV_NULL)?; // fd=1 + let stderr = OpenOptions::new().write(true).open(DEV_NULL)?; // fd=2 - // let stdset = FileSet::new([stdin, stdout, stderr]); - // stdset.remove_cloexec(); + let stdset = FileSet::new([stdin, stdout, stderr]); + stdset.remove_cloexec(); Command::new("startx") .env("RUST_BACKTRACE", "full") From 2b30079096dca239bab670ac5ead764c88e70200 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 19 Oct 2023 21:56:46 +1100 Subject: [PATCH 265/368] feat(bootstrap): upgrade llvm to 17.0.3 * Upgrade LLVM to 17.0.3 * Build LLVM, clang and clang-tools-extra Signed-off-by: Anhad Singh --- bootstrap.yml | 6 +- ...patch => 0001-feat-targets-add-aero.patch} | 343 ++++++++---------- 2 files changed, 163 insertions(+), 186 deletions(-) rename patches/llvm/{llvm.patch => 0001-feat-targets-add-aero.patch} (82%) diff --git a/bootstrap.yml b/bootstrap.yml index 90ef0bb5961..5754cdc09d2 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -80,8 +80,8 @@ sources: - name: llvm subdir: 'bundled' git: 'https://github.com/llvm/llvm-project.git' - tag: 'llvmorg-14.0.1' - version: '14.0.1' + tag: 'llvmorg-17.0.3' + version: '17.0.3' - name: glib subdir: 'bundled' @@ -595,7 +595,7 @@ tools: # Building it in debug mode produces tens of GiB of debugging info. - '-DCMAKE_BUILD_TYPE=Release' - '-DLLVM_TARGETS_TO_BUILD=X86' - - '-DLLVM_ENABLE_PROJECTS=llvm' + - '-DLLVM_ENABLE_PROJECTS=llvm;clang;clang-tools-extra' - '-DLLVM_ENABLE_Z3_SOLVER=OFF' # clang configuration options. - '-DDEFAULT_SYSROOT=@SYSROOT_DIR@' diff --git a/patches/llvm/llvm.patch b/patches/llvm/0001-feat-targets-add-aero.patch similarity index 82% rename from patches/llvm/llvm.patch rename to patches/llvm/0001-feat-targets-add-aero.patch index 17987cb2a11..d765ad6c9e7 100644 --- a/patches/llvm/llvm.patch +++ b/patches/llvm/0001-feat-targets-add-aero.patch @@ -1,66 +1,69 @@ -From 20cff6e42171169bd1b78d7ccffec0ab608e1eaa Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Thu, 16 Feb 2023 17:54:52 +1100 -Subject: [PATCH] targets: add aero +From bc36fc2f014463a6baa37512c708bca46dbd55c5 Mon Sep 17 00:00:00 2001 +From: Anhad Singh +Date: Thu, 19 Oct 2023 21:54:42 +1100 +Subject: [PATCH] feat(targets): add aero -Signed-off-by: Andy-Python-Programmer +Signed-off-by: Anhad Singh --- - clang/lib/Basic/Targets.cpp | 6 + - clang/lib/Basic/Targets/OSTargets.h | 28 ++ + clang/lib/Basic/Targets.cpp | 10 + + clang/lib/Basic/Targets/OSTargets.h | 31 ++ clang/lib/Driver/CMakeLists.txt | 1 + clang/lib/Driver/Driver.cpp | 4 + - clang/lib/Driver/ToolChains/Aero.cpp | 438 ++++++++++++++++++++++ + clang/lib/Driver/ToolChains/Aero.cpp | 432 ++++++++++++++++++++++ clang/lib/Driver/ToolChains/Aero.h | 49 +++ clang/lib/Driver/ToolChains/Gnu.cpp | 13 +- llvm/cmake/modules/CrossCompile.cmake | 4 +- - llvm/include/llvm/ADT/Triple.h | 5 +- llvm/include/llvm/Support/SwapByteOrder.h | 2 +- - llvm/lib/Support/Triple.cpp | 6 + + llvm/include/llvm/TargetParser/Triple.h | 5 +- llvm/lib/Support/Unix/Path.inc | 6 +- llvm/lib/Support/Unix/Program.inc | 1 + - llvm/tools/llvm-dwarfdump/Statistics.cpp | 2 + + llvm/lib/TargetParser/Triple.cpp | 6 + llvm/tools/llvm-shlib/CMakeLists.txt | 1 + - 15 files changed, 556 insertions(+), 10 deletions(-) + 14 files changed, 555 insertions(+), 10 deletions(-) create mode 100644 clang/lib/Driver/ToolChains/Aero.cpp create mode 100644 clang/lib/Driver/ToolChains/Aero.h diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp -index 994a491cdd..098b0d5fb7 100644 +index 636b59fd1..9e1e08ec5 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp -@@ -149,6 +149,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, - return new NetBSDTargetInfo(Triple, Opts); - case llvm::Triple::OpenBSD: - return new OpenBSDTargetInfo(Triple, Opts); +@@ -151,6 +151,10 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, + case llvm::Triple::Fuchsia: + return std::make_unique>(Triple, + Opts); + case llvm::Triple::Aero: -+ return new AeroTargetInfo(Triple, Opts); - case llvm::Triple::Win32: - switch (Triple.getEnvironment()) { - case llvm::Triple::GNU: -@@ -420,6 +422,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, - return new FuchsiaTargetInfo(Triple, Opts); ++ return std::make_unique>(Triple, ++ Opts); ++ case llvm::Triple::Linux: - return new LinuxTargetInfo(Triple, Opts); + switch (Triple.getEnvironment()) { + default: +@@ -455,6 +459,9 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, + case llvm::Triple::Fuchsia: + return std::make_unique>(Triple, + Opts); + case llvm::Triple::Aero: -+ return new AeroTargetInfo(Triple, Opts); - default: - return new RISCV64TargetInfo(Triple, Opts); - } -@@ -586,6 +590,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, - } - case llvm::Triple::Haiku: - return new HaikuTargetInfo(Triple, Opts); ++ return std::make_unique>(Triple, ++ Opts); + case llvm::Triple::Linux: + switch (Triple.getEnvironment()) { + default: +@@ -636,6 +643,9 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, + case llvm::Triple::Fuchsia: + return std::make_unique>(Triple, + Opts); + case llvm::Triple::Aero: -+ return new AeroTargetInfo(Triple, Opts); - case llvm::Triple::NaCl: - return new NaClTargetInfo(Triple, Opts); - case llvm::Triple::PS4: ++ return std::make_unique>(Triple, ++ Opts); + case llvm::Triple::KFreeBSD: + return std::make_unique>(Triple, + Opts); diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h -index 3c1830d5f8..2123019378 100644 +index 8f4331b02..bacb1e071 100644 --- a/clang/lib/Basic/Targets/OSTargets.h +++ b/clang/lib/Basic/Targets/OSTargets.h -@@ -338,6 +338,34 @@ public: - : OSTargetInfo(Triple, Opts) {} +@@ -278,6 +278,37 @@ public: + using OSTargetInfo::OSTargetInfo; }; +// Aero Target @@ -75,6 +78,8 @@ index 3c1830d5f8..2123019378 100644 + Builder.defineMacro("_REENTRANT"); + if (Opts.CPlusPlus) + Builder.defineMacro("_GNU_SOURCE"); ++ // if (this->HasFloat128) ++ // Builder.defineMacro("__FLOAT128__"); + } + +public: @@ -91,34 +96,35 @@ index 3c1830d5f8..2123019378 100644 + } +}; + - // Minix Target ++ + // Haiku Target template - class LLVM_LIBRARY_VISIBILITY MinixTargetInfo : public OSTargetInfo { + class LLVM_LIBRARY_VISIBILITY HaikuTargetInfo : public OSTargetInfo { diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt -index 78e8fd1852..8a53a0a7ab 100644 +index a6bd2d41e..132da8bbe 100644 --- a/clang/lib/Driver/CMakeLists.txt +++ b/clang/lib/Driver/CMakeLists.txt @@ -59,6 +59,7 @@ add_clang_library(clangDriver - ToolChains/Hexagon.cpp - ToolChains/Hurd.cpp - ToolChains/Linux.cpp + ToolChains/Flang.cpp + ToolChains/FreeBSD.cpp + ToolChains/Fuchsia.cpp + ToolChains/Aero.cpp - ToolChains/MipsLinux.cpp - ToolChains/MinGW.cpp - ToolChains/Minix.cpp + ToolChains/Gnu.cpp + ToolChains/Haiku.cpp + ToolChains/HIPUtility.cpp diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp -index 3bfddeefc7..9773e5efd1 100644 +index bdbdad936..bc194b1f5 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp -@@ -30,6 +30,7 @@ - #include "ToolChains/Hurd.h" - #include "ToolChains/Lanai.h" - #include "ToolChains/Linux.h" +@@ -24,6 +24,7 @@ + #include "ToolChains/DragonFly.h" + #include "ToolChains/FreeBSD.h" + #include "ToolChains/Fuchsia.h" +#include "ToolChains/Aero.h" - #include "ToolChains/MSP430.h" - #include "ToolChains/MSVC.h" - #include "ToolChains/MinGW.h" -@@ -5564,6 +5565,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, + #include "ToolChains/Gnu.h" + #include "ToolChains/HIPAMD.h" + #include "ToolChains/HIPSPV.h" +@@ -6225,6 +6226,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, case llvm::Triple::Fuchsia: TC = std::make_unique(*this, Target, Args); break; @@ -130,10 +136,10 @@ index 3bfddeefc7..9773e5efd1 100644 break; diff --git a/clang/lib/Driver/ToolChains/Aero.cpp b/clang/lib/Driver/ToolChains/Aero.cpp new file mode 100644 -index 0000000000..4cd7765aeb +index 000000000..580d85cde --- /dev/null +++ b/clang/lib/Driver/ToolChains/Aero.cpp -@@ -0,0 +1,438 @@ +@@ -0,0 +1,432 @@ +//===--- Aero.h - Aero ToolChain Implementations --------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure @@ -247,13 +253,13 @@ index 0000000000..4cd7765aeb + // to the link paths. + path_list &Paths = getFilePaths(); + -+ const std::string OSLibDir = getOSLibDir(Triple, Args); ++ const std::string OSLibDir = std::string(getOSLibDir(Triple, Args)); + const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot); + + // Add the multilib suffixed paths where they are available. + if (GCCInstallation.isValid()) { + const llvm::Triple &GCCTriple = GCCInstallation.getTriple(); -+ const std::string &LibPath = GCCInstallation.getParentLibPath(); ++ const std::string &LibPath = std::string(GCCInstallation.getParentLibPath()); + const Multilib &Multilib = GCCInstallation.getMultilib(); + const MultilibSet &Multilibs = GCCInstallation.getMultilibs(); + @@ -336,7 +342,7 @@ index 0000000000..4cd7765aeb + + // See comments above on the multilib variant for details of why this is + // included even from outside the sysroot. -+ const std::string &LibPath = GCCInstallation.getParentLibPath(); ++ const std::string &LibPath = std::string(GCCInstallation.getParentLibPath()); + const llvm::Triple &GCCTriple = GCCInstallation.getTriple(); + const Multilib &Multilib = GCCInstallation.getMultilib(); + addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" + @@ -495,11 +501,9 @@ index 0000000000..4cd7765aeb + getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot); + const GCCVersion &Version = GCCInstallation.getVersion(); + -+ // The primary search for libstdc++ supports multiarch variants. -+ if (addLibStdCXXIncludePaths(LibDir.str() + "/../include", -+ "/c++/" + Version.Text, TripleStr, -+ GCCMultiarchTriple, TargetMultiarchTriple, -+ Multilib.includeSuffix(), DriverArgs, CC1Args)) ++ // Try generic GCC detection first. ++ if (Generic_GCC::addGCCLibStdCxxIncludePaths(DriverArgs, CC1Args, ++ TripleStr)) + return; + + // Otherwise, fall back on a bunch of options which don't use multiarch @@ -519,10 +523,7 @@ index 0000000000..4cd7765aeb + }; + + for (const auto &IncludePath : LibStdCXXIncludePathCandidates) { -+ if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr, -+ /*GCCMultiarchTriple*/ "", -+ /*TargetMultiarchTriple*/ "", -+ Multilib.includeSuffix(), DriverArgs, CC1Args)) ++ if (addLibStdCXXIncludePaths(IncludePath, TripleStr, Multilib.includeSuffix(), DriverArgs, CC1Args)) + break; + } +} @@ -571,10 +572,9 @@ index 0000000000..4cd7765aeb + Res |= SanitizerKind::MemTag; + return Res; +} -+ diff --git a/clang/lib/Driver/ToolChains/Aero.h b/clang/lib/Driver/ToolChains/Aero.h new file mode 100644 -index 0000000000..e9016f4a81 +index 000000000..a7b0b4da2 --- /dev/null +++ b/clang/lib/Driver/ToolChains/Aero.h @@ -0,0 +1,49 @@ @@ -587,8 +587,8 @@ index 0000000000..e9016f4a81 +// +//===----------------------------------------------------------------------===// + -+#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MANAGARM_H -+#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MANAGARM_H ++#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AERO_H ++#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AERO_H + +#include "Gnu.h" +#include "clang/Driver/ToolChain.h" @@ -611,9 +611,9 @@ index 0000000000..e9016f4a81 + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; + SanitizerMask getSupportedSanitizers() const override; -+ virtual std::string computeSysRoot() const; + -+ virtual std::string getDynamicLinker(const llvm::opt::ArgList &Args) const; ++ virtual std::string computeSysRoot() const override; ++ virtual std::string getDynamicLinker(const llvm::opt::ArgList &Args) const override; + + std::vector ExtraOpts; + @@ -626,12 +626,12 @@ index 0000000000..e9016f4a81 +} // end namespace driver +} // end namespace clang + -+#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_MANAGARM_H ++#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AERO_H diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp -index 7a9570a686..8114baabb0 100644 +index 40038dce4..f9e92ba87 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp -@@ -246,6 +246,8 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) { +@@ -227,6 +227,8 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) { return "elf_iamcu"; return "elf_i386"; case llvm::Triple::aarch64: @@ -640,27 +640,27 @@ index 7a9570a686..8114baabb0 100644 return "aarch64linux"; case llvm::Triple::aarch64_be: return "aarch64linuxb"; -@@ -2073,7 +2075,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( +@@ -2298,7 +2300,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( static const char *const AArch64LibDirs[] = {"/lib64", "/lib"}; static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", - "aarch64-suse-linux"}; -+ "aarch64-suse-linux", "aarch64-aero", "aarch64-aero-system", ++ "aarch64-suse-linux", "aarch64-aero", "aarch64-aero-system", + "aarch64-aero-kernel"}; static const char *const AArch64beLibDirs[] = {"/lib"}; static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu", "aarch64_be-linux-gnu"}; -@@ -2099,7 +2102,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( +@@ -2328,7 +2331,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( "x86_64-redhat-linux", "x86_64-suse-linux", "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux", "x86_64-unknown-linux", - "x86_64-amazon-linux"}; -+ "x86_64-amazon-linux", "x86_64-aero", "x86_64-aero-system", -+ "x86_64-aero-kernel"}; ++ "x86_64-amazon-linux", "x86_64-aero", ++ "x86_64-aero-system", "x86_64-aero-kernel"}; static const char *const X32Triples[] = {"x86_64-linux-gnux32", "x86_64-pc-linux-gnux32"}; static const char *const X32LibDirs[] = {"/libx32", "/lib"}; -@@ -2171,7 +2175,10 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( +@@ -2404,7 +2408,10 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( static const char *const RISCV64LibDirs[] = {"/lib64", "/lib"}; static const char *const RISCV64Triples[] = {"riscv64-unknown-linux-gnu", "riscv64-linux-gnu", @@ -673,12 +673,12 @@ index 7a9570a686..8114baabb0 100644 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"}; static const char *const SPARCv8Triples[] = {"sparc-linux-gnu", diff --git a/llvm/cmake/modules/CrossCompile.cmake b/llvm/cmake/modules/CrossCompile.cmake -index 2a39b6a40a..ceceb2aab9 100644 +index 6af47b51d..78983fa16 100644 --- a/llvm/cmake/modules/CrossCompile.cmake +++ b/llvm/cmake/modules/CrossCompile.cmake @@ -17,8 +17,8 @@ function(llvm_create_cross_target project_name target_name toolchain buildtype) -DCMAKE_TOOLCHAIN_FILE=\"${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake\") - else() + elseif (NOT CMAKE_CROSSCOMPILING) set(CROSS_TOOLCHAIN_FLAGS_INIT - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} @@ -687,35 +687,12 @@ index 2a39b6a40a..ceceb2aab9 100644 ) endif() set(CROSS_TOOLCHAIN_FLAGS_${target_name} ${CROSS_TOOLCHAIN_FLAGS_INIT} -diff --git a/llvm/include/llvm/ADT/Triple.h b/llvm/include/llvm/ADT/Triple.h -index 42277c0130..35516ec5af 100644 ---- a/llvm/include/llvm/ADT/Triple.h -+++ b/llvm/include/llvm/ADT/Triple.h -@@ -181,6 +181,7 @@ public: - Linux, - Lv2, // PS3 - MacOSX, -+ Aero, - NetBSD, - OpenBSD, - Solaris, -@@ -232,7 +233,9 @@ public: - CoreCLR, - Simulator, // Simulator variants of other systems, e.g., Apple's iOS - MacABI, // Mac Catalyst variant of Apple's iOS deployment target. -- LastEnvironmentType = MacABI -+ Kernel, -+ System, -+ LastEnvironmentType = System - }; - enum ObjectFormatType { - UnknownObjectFormat, diff --git a/llvm/include/llvm/Support/SwapByteOrder.h b/llvm/include/llvm/Support/SwapByteOrder.h -index e8612ba665..7c4e941bd2 100644 +index 1bbc2e2f9..4b41da767 100644 --- a/llvm/include/llvm/Support/SwapByteOrder.h +++ b/llvm/include/llvm/Support/SwapByteOrder.h -@@ -22,7 +22,7 @@ - #endif +@@ -20,7 +20,7 @@ + #include #if defined(__linux__) || defined(__GNU__) || defined(__HAIKU__) || \ - defined(__Fuchsia__) || defined(__EMSCRIPTEN__) @@ -723,56 +700,31 @@ index e8612ba665..7c4e941bd2 100644 #include #elif defined(_AIX) #include -diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp -index a9afcc9db9..ccb0ca0601 100644 ---- a/llvm/lib/Support/Triple.cpp -+++ b/llvm/lib/Support/Triple.cpp -@@ -195,6 +195,7 @@ StringRef Triple::getOSTypeName(OSType Kind) { - case UnknownOS: return "unknown"; - - case AIX: return "aix"; -+ case Aero: return "aero"; - case AMDHSA: return "amdhsa"; - case AMDPAL: return "amdpal"; - case Ananas: return "ananas"; -@@ -251,6 +252,7 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { - case GNUX32: return "gnux32"; - case GNUILP32: return "gnu_ilp32"; - case Itanium: return "itanium"; -+ case Kernel: return "kernel"; - case MSVC: return "msvc"; - case MacABI: return "macabi"; - case Musl: return "musl"; -@@ -258,6 +260,7 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { - case MuslEABIHF: return "musleabihf"; - case MuslX32: return "muslx32"; - case Simulator: return "simulator"; -+ case System: return "system"; - } - - llvm_unreachable("Invalid EnvironmentType!"); -@@ -512,6 +515,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) { - - static Triple::OSType parseOS(StringRef OSName) { - return StringSwitch(OSName) -+ .StartsWith("aero", Triple::Aero) - .StartsWith("ananas", Triple::Ananas) - .StartsWith("cloudabi", Triple::CloudABI) - .StartsWith("darwin", Triple::Darwin) -@@ -570,9 +574,11 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { - .StartsWith("musl", Triple::Musl) - .StartsWith("msvc", Triple::MSVC) - .StartsWith("itanium", Triple::Itanium) -+ .StartsWith("kernel", Triple::Kernel) - .StartsWith("cygnus", Triple::Cygnus) - .StartsWith("coreclr", Triple::CoreCLR) - .StartsWith("simulator", Triple::Simulator) -+ .StartsWith("system", Triple::System) - .StartsWith("macabi", Triple::MacABI) - .Default(Triple::UnknownEnvironment); - } +diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h +index 79ccd644a..82520d0e0 100644 +--- a/llvm/include/llvm/TargetParser/Triple.h ++++ b/llvm/include/llvm/TargetParser/Triple.h +@@ -194,6 +194,7 @@ public: + IOS, + KFreeBSD, + Linux, ++ Aero, + Lv2, // PS3 + MacOSX, + NetBSD, +@@ -276,7 +277,9 @@ public: + Mesh, + Amplification, + OpenHOS, +- LastEnvironmentType = OpenHOS ++ Kernel, ++ System, ++ LastEnvironmentType = System + }; + enum ObjectFormatType { + UnknownObjectFormat, diff --git a/llvm/lib/Support/Unix/Path.inc b/llvm/lib/Support/Unix/Path.inc -index 788460d657..85d46701e2 100644 +index e2aece49c..cc19a25a4 100644 --- a/llvm/lib/Support/Unix/Path.inc +++ b/llvm/lib/Support/Unix/Path.inc @@ -74,7 +74,7 @@ extern char **environ; @@ -793,7 +745,7 @@ index 788460d657..85d46701e2 100644 #if defined(HAVE_LINUX_MAGIC_H) #include #else -@@ -478,7 +478,7 @@ std::error_code remove(const Twine &path, bool IgnoreNonExisting) { +@@ -472,7 +472,7 @@ std::error_code remove(const Twine &path, bool IgnoreNonExisting) { } static bool is_local_impl(struct STATVFS &Vfs) { @@ -803,7 +755,7 @@ index 788460d657..85d46701e2 100644 #define NFS_SUPER_MAGIC 0x6969 #endif diff --git a/llvm/lib/Support/Unix/Program.inc b/llvm/lib/Support/Unix/Program.inc -index 089342030b..0616096541 100644 +index 897e22711..02f74d7eb 100644 --- a/llvm/lib/Support/Unix/Program.inc +++ b/llvm/lib/Support/Unix/Program.inc @@ -41,6 +41,7 @@ @@ -814,31 +766,56 @@ index 089342030b..0616096541 100644 #ifdef HAVE_POSIX_SPAWN #include -diff --git a/llvm/tools/llvm-dwarfdump/Statistics.cpp b/llvm/tools/llvm-dwarfdump/Statistics.cpp -index 5c08e43b4b..a19c74e82c 100644 ---- a/llvm/tools/llvm-dwarfdump/Statistics.cpp -+++ b/llvm/tools/llvm-dwarfdump/Statistics.cpp -@@ -6,6 +6,8 @@ - // - //===----------------------------------------------------------------------===// +diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp +index a3d6a06af..3825a2a06 100644 +--- a/llvm/lib/TargetParser/Triple.cpp ++++ b/llvm/lib/TargetParser/Triple.cpp +@@ -205,6 +205,7 @@ StringRef Triple::getOSTypeName(OSType Kind) { + switch (Kind) { + case UnknownOS: return "unknown"; -+#include -+ - #include "llvm-dwarfdump.h" - #include "llvm/ADT/DenseMap.h" - #include "llvm/ADT/StringSet.h" ++ case Aero: return "aero"; + case AIX: return "aix"; + case AMDHSA: return "amdhsa"; + case AMDPAL: return "amdpal"; +@@ -270,6 +271,8 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { + case GNUX32: return "gnux32"; + case GNUILP32: return "gnu_ilp32"; + case Itanium: return "itanium"; ++ case Kernel: return "kernel"; ++ case System: return "system"; + case MSVC: return "msvc"; + case MacABI: return "macabi"; + case Musl: return "musl"; +@@ -575,6 +578,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) { + + static Triple::OSType parseOS(StringRef OSName) { + return StringSwitch(OSName) ++ .StartsWith("aero", Triple::Aero) + .StartsWith("ananas", Triple::Ananas) + .StartsWith("cloudabi", Triple::CloudABI) + .StartsWith("darwin", Triple::Darwin) +@@ -641,6 +645,8 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { + .StartsWith("musl", Triple::Musl) + .StartsWith("msvc", Triple::MSVC) + .StartsWith("itanium", Triple::Itanium) ++ .StartsWith("kernel", Triple::Kernel) ++ .StartsWith("system", Triple::System) + .StartsWith("cygnus", Triple::Cygnus) + .StartsWith("coreclr", Triple::CoreCLR) + .StartsWith("simulator", Triple::Simulator) diff --git a/llvm/tools/llvm-shlib/CMakeLists.txt b/llvm/tools/llvm-shlib/CMakeLists.txt -index 8e2b78f1b8..e1bd74eaf7 100644 +index 4f6a2cbfb..559a35ab9 100644 --- a/llvm/tools/llvm-shlib/CMakeLists.txt +++ b/llvm/tools/llvm-shlib/CMakeLists.txt -@@ -36,6 +36,7 @@ if(LLVM_BUILD_LLVM_DYLIB) - if(("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") OR (MINGW) OR (HAIKU) - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") +@@ -38,6 +38,7 @@ if(LLVM_BUILD_LLVM_DYLIB) OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "GNU") -+ OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "aero") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia") ++ OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "aero") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "DragonFly") + OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") + OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")) # FIXME: It should be "GNU ld for elf" -- -2.39.1 +2.42.0 From f198cd6149c45aaf7d337f7aa697cbe35f5c0796 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 19 Oct 2023 21:58:37 +1100 Subject: [PATCH 266/368] feat(rust): upgrade to 1.75.0-dev TODO: Update the Rust fork with the changes. Signed-off-by: Anhad Singh --- bootstrap.yml | 11 +- extra-files/rust/config.toml | 4 +- ...p-build-target-in-x.py-and-bootstrap.patch | 77 ++ patches/rust/rust.patch | 741 ------------------ 4 files changed, 85 insertions(+), 748 deletions(-) create mode 100644 patches/rust/0001-fix-bootstrap-build-target-in-x.py-and-bootstrap.patch delete mode 100644 patches/rust/rust.patch diff --git a/bootstrap.yml b/bootstrap.yml index 5754cdc09d2..1106bb426b2 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -73,9 +73,9 @@ sources: - name: rust subdir: 'bundled' - git: 'https://github.com/rust-lang/rust.git' + git: 'https://github.com/aero-os/rust.git' branch: 'master' - commit: '0416b1a6f6d5c42696494e1a3a33580fd3f669d8' + commit: 'dee2030a44019048171c03d7ddcb134b945df8c5' - name: llvm subdir: 'bundled' @@ -386,19 +386,20 @@ tools: compile: - args: | cat << EOF > config.toml - changelog-seen = 2 + change-id = 115898 [llvm] download-ci-llvm = false targets = "X86" [build] - target = ["x86_64-unknown-aero-system", "x86_64-unknown-linux-gnu"] + target = ["x86_64-unknown-aero", "x86_64-unknown-linux-gnu"] build-dir = "@THIS_BUILD_DIR@" docs = false [install] prefix = "@PREFIX@" + sysconfdir = "@PREFIX@/etc" [rust] codegen-tests = false @@ -407,7 +408,7 @@ tools: [target.x86_64-unknown-linux-gnu] llvm-config = "@BUILD_ROOT@/tools/host-llvm/bin/llvm-config" - [target.x86_64-unknown-aero-system] + [target.x86_64-unknown-aero] llvm-config = "@BUILD_ROOT@/tools/host-llvm/bin/llvm-config" EOF - args: ['python3', '@THIS_SOURCE_DIR@/x.py', 'build', '--stage', '2', '-j', '@PARALLELISM@'] diff --git a/extra-files/rust/config.toml b/extra-files/rust/config.toml index 40913d37e88..54f3a75dc53 100644 --- a/extra-files/rust/config.toml +++ b/extra-files/rust/config.toml @@ -3,10 +3,10 @@ patch-in-config = true [build] rustc = "@BUILD_ROOT@/tools/host-rust/bin/rustc" -target = "x86_64-unknown-aero-system" +target = "x86_64-unknown-aero" rustflags = ["-C", "link-args=-no-pie"] -[target.x86_64-unknown-aero-system] +[target.x86_64-unknown-aero] linker = "@BUILD_ROOT@/tools/host-gcc/bin/x86_64-aero-gcc" [patch.crates-io] diff --git a/patches/rust/0001-fix-bootstrap-build-target-in-x.py-and-bootstrap.patch b/patches/rust/0001-fix-bootstrap-build-target-in-x.py-and-bootstrap.patch new file mode 100644 index 00000000000..2a474c60f55 --- /dev/null +++ b/patches/rust/0001-fix-bootstrap-build-target-in-x.py-and-bootstrap.patch @@ -0,0 +1,77 @@ +From 1f0ded570575781c7e8dbd0d60c57a2ec72ec987 Mon Sep 17 00:00:00 2001 +From: Anhad Singh +Date: Wed, 18 Oct 2023 19:23:49 +1100 +Subject: [PATCH] fix(bootstrap): build target in x.py and bootstrap + +Signed-off-by: Anhad Singh +--- + src/bootstrap/bootstrap.py | 7 +++++-- + src/bootstrap/src/core/builder.rs | 6 ++++-- + 2 files changed, 9 insertions(+), 4 deletions(-) + +diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py +index 1a1125a107f..3f3171a9ddf 100644 +--- a/src/bootstrap/bootstrap.py ++++ b/src/bootstrap/bootstrap.py +@@ -881,7 +881,7 @@ class RustBuild(object): + ... "debug", "bootstrap") + True + """ +- return os.path.join(self.build_dir, "bootstrap", "debug", "bootstrap") ++ return os.path.join(self.build_dir, "bootstrap", self.build, "debug", "bootstrap") + + def build_bootstrap(self): + """Build bootstrap""" +@@ -903,7 +903,7 @@ class RustBuild(object): + build_dir = os.path.join(self.build_dir, "bootstrap") + if self.clean and os.path.exists(build_dir): + shutil.rmtree(build_dir) +- # `CARGO_BUILD_TARGET` breaks bootstrap build. ++ # `CARGO_BUILD_TARGET` and `build.target` breaks bootstrap build. + # See also: . + if "CARGO_BUILD_TARGET" in env: + del env["CARGO_BUILD_TARGET"] +@@ -987,6 +987,9 @@ class RustBuild(object): + except KeyError: + pass + ++ args.append("--target") ++ args.append(self.build) ++ + return args + + def build_triple(self): +diff --git a/src/bootstrap/src/core/builder.rs b/src/bootstrap/src/core/builder.rs +index 039a87e760d..cbbbce4f515 100644 +--- a/src/bootstrap/src/core/builder.rs ++++ b/src/bootstrap/src/core/builder.rs +@@ -1587,6 +1587,8 @@ pub fn cargo( + self.clear_if_dirty(&out_dir, &self.rustc(compiler)); + } + ++ let artifact_dir = self.out.join("bootstrap/").join(self.build.build.triple).join("debug/"); ++ + // Customize the compiler we're running. Specify the compiler to cargo + // as our shim and then pass it some various options used to configure + // how the actual compiler itself is called. +@@ -1599,7 +1601,7 @@ pub fn cargo( + .env("RUSTC_STAGE", stage.to_string()) + .env("RUSTC_SYSROOT", &sysroot) + .env("RUSTC_LIBDIR", &libdir) +- .env("RUSTDOC", self.bootstrap_out.join("rustdoc")) ++ .env("RUSTDOC", artifact_dir.join("rustdoc")) + .env( + "RUSTDOC_REAL", + if cmd == "doc" || cmd == "rustdoc" || (cmd == "test" && want_rustdoc) { +@@ -1613,7 +1615,7 @@ pub fn cargo( + // Clippy support is a hack and uses the default `cargo-clippy` in path. + // Don't override RUSTC so that the `cargo-clippy` in path will be run. + if cmd != "clippy" { +- cargo.env("RUSTC", self.bootstrap_out.join("rustc")); ++ cargo.env("RUSTC", artifact_dir.join("rustc")); + } + + // Dealing with rpath here is a little special, so let's go into some +-- +2.42.0 + diff --git a/patches/rust/rust.patch b/patches/rust/rust.patch deleted file mode 100644 index e8d5de44a4d..00000000000 --- a/patches/rust/rust.patch +++ /dev/null @@ -1,741 +0,0 @@ -From be8fa0845294e187d6f41004a6967c8ce299fbbe Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Fri, 17 Feb 2023 18:28:24 +1100 -Subject: [PATCH] update to latest nightly - -Signed-off-by: Andy-Python-Programmer ---- - Cargo.lock | 4 +- - Cargo.toml | 1 + - .../rustc_target/src/spec/aero_system_base.rs | 34 +++++ - compiler/rustc_target/src/spec/mod.rs | 3 + - .../src/spec/x86_64_unknown_aero_system.rs | 19 +++ - library/std/Cargo.toml | 2 +- - library/std/build.rs | 1 + - library/std/src/os/aero/fs.rs | 144 ++++++++++++++++++ - library/std/src/os/aero/mod.rs | 6 + - library/std/src/os/aero/raw.rs | 66 ++++++++ - library/std/src/os/mod.rs | 2 + - library/std/src/os/unix/mod.rs | 2 + - library/std/src/sys/unix/args.rs | 3 +- - library/std/src/sys/unix/env.rs | 11 ++ - library/std/src/sys/unix/fs.rs | 5 +- - library/std/src/sys/unix/os.rs | 34 ++++- - library/std/src/sys/unix/thread.rs | 7 + - library/std/src/sys/unix/thread_local_dtor.rs | 2 +- - library/unwind/build.rs | 18 +++ - src/bootstrap/Cargo.lock | 40 ++++- - src/bootstrap/bootstrap.py | 7 +- - src/bootstrap/builder.rs | 6 +- - 22 files changed, 399 insertions(+), 18 deletions(-) - create mode 100644 compiler/rustc_target/src/spec/aero_system_base.rs - create mode 100644 compiler/rustc_target/src/spec/x86_64_unknown_aero_system.rs - create mode 100644 library/std/src/os/aero/fs.rs - create mode 100644 library/std/src/os/aero/mod.rs - create mode 100644 library/std/src/os/aero/raw.rs - -diff --git a/Cargo.lock b/Cargo.lock -index 15f051d0cff..f3548683f44 100644 ---- a/Cargo.lock -+++ b/Cargo.lock -@@ -2326,9 +2326,7 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - - [[package]] - name = "libc" --version = "0.2.138" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" -+version = "0.2.139" - dependencies = [ - "rustc-std-workspace-core", - ] -diff --git a/Cargo.toml b/Cargo.toml -index 15cbb2659c9..098e8227659 100644 ---- a/Cargo.toml -+++ b/Cargo.toml -@@ -114,6 +114,7 @@ rustc-workspace-hack = { path = 'src/tools/rustc-workspace-hack' } - rustc-std-workspace-core = { path = 'library/rustc-std-workspace-core' } - rustc-std-workspace-alloc = { path = 'library/rustc-std-workspace-alloc' } - rustc-std-workspace-std = { path = 'library/rustc-std-workspace-std' } -+libc = { path = '../rust-libc' } - - [patch."https://github.com/rust-lang/rust-clippy"] - clippy_lints = { path = "src/tools/clippy/clippy_lints" } -diff --git a/compiler/rustc_target/src/spec/aero_system_base.rs b/compiler/rustc_target/src/spec/aero_system_base.rs -new file mode 100644 -index 00000000000..1237a432e76 ---- /dev/null -+++ b/compiler/rustc_target/src/spec/aero_system_base.rs -@@ -0,0 +1,34 @@ -+use crate::spec::{cvs, LinkArgs, LinkerFlavor, RelroLevel, TargetOptions, Cc, Lld}; -+ -+pub fn opts() -> TargetOptions { -+ let mut args = LinkArgs::new(); -+ args.insert( -+ LinkerFlavor::Gnu(Cc::Yes, Lld::No), -+ vec![ -+ // We want to be able to strip as much executable code as possible -+ // from the linker command line, and this flag indicates to the -+ // linker that it can avoid linking in dynamic libraries that don't -+ // actually satisfy any symbols up to that point (as with many other -+ // resolutions the linker does). This option only applies to all -+ // following libraries so we're sure to pass it as one of the first -+ // arguments. -+ "-Wl,--as-needed".into(), -+ // Always enable NX protection when it is available -+ "-Wl,-z,noexecstack".into(), -+ ], -+ ); -+ -+ TargetOptions { -+ os: "aero".into(), -+ dynamic_linking: true, -+ executables: true, -+ families: cvs!["unix"], -+ has_rpath: true, -+ pre_link_args: args, -+ position_independent_executables: true, -+ relro_level: RelroLevel::Full, -+ has_thread_local: true, -+ crt_static_respected: true, -+ ..Default::default() -+ } -+} -diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs -index bc1920e3424..d4d049a8631 100644 ---- a/compiler/rustc_target/src/spec/mod.rs -+++ b/compiler/rustc_target/src/spec/mod.rs -@@ -65,6 +65,7 @@ - mod freebsd_base; - mod fuchsia_base; - mod haiku_base; -+mod aero_system_base; - mod hermit_base; - mod illumos_base; - mod l4re_base; -@@ -1105,6 +1106,8 @@ fn $module() { - ("i686-unknown-haiku", i686_unknown_haiku), - ("x86_64-unknown-haiku", x86_64_unknown_haiku), - -+ ("x86_64-unknown-aero-system", x86_64_unknown_aero_system), -+ - ("aarch64-apple-darwin", aarch64_apple_darwin), - ("x86_64-apple-darwin", x86_64_apple_darwin), - ("i686-apple-darwin", i686_apple_darwin), -diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_aero_system.rs b/compiler/rustc_target/src/spec/x86_64_unknown_aero_system.rs -new file mode 100644 -index 00000000000..d4e4097fb4b ---- /dev/null -+++ b/compiler/rustc_target/src/spec/x86_64_unknown_aero_system.rs -@@ -0,0 +1,19 @@ -+use crate::spec::{LinkerFlavor, StackProbeType, Target, Cc, Lld}; -+ -+pub fn target() -> Target { -+ let mut base = super::aero_system_base::opts(); -+ base.cpu = "x86-64".into(); -+ base.max_atomic_width = Some(64); -+ base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); -+ // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. -+ base.stack_probes = StackProbeType::Call; -+ -+ Target { -+ llvm_target: "x86_64-unknown-aero-system".into(), -+ pointer_width: 64, -+ data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -+ .into(), -+ arch: "x86_64".into(), -+ options: base, -+ } -+} -diff --git a/library/std/Cargo.toml b/library/std/Cargo.toml -index 349cd91c89e..aa84feaec7b 100644 ---- a/library/std/Cargo.toml -+++ b/library/std/Cargo.toml -@@ -15,7 +15,7 @@ cfg-if = { version = "1.0", features = ['rustc-dep-of-std'] } - panic_unwind = { path = "../panic_unwind", optional = true } - panic_abort = { path = "../panic_abort" } - core = { path = "../core" } --libc = { version = "0.2.138", default-features = false, features = ['rustc-dep-of-std'] } -+libc = { path = "../../../rust-libc", default-features = false, features = ['rustc-dep-of-std'] } - compiler_builtins = { version = "0.1.87" } - profiler_builtins = { path = "../profiler_builtins", optional = true } - unwind = { path = "../unwind" } -diff --git a/library/std/build.rs b/library/std/build.rs -index 8b1a06ee750..683976b2a47 100644 ---- a/library/std/build.rs -+++ b/library/std/build.rs -@@ -24,6 +24,7 @@ fn main() { - || target.contains("l4re") - || target.contains("redox") - || target.contains("haiku") -+ || target.contains("aero") - || target.contains("vxworks") - || target.contains("wasm32") - || target.contains("wasm64") -diff --git a/library/std/src/os/aero/fs.rs b/library/std/src/os/aero/fs.rs -new file mode 100644 -index 00000000000..a3c953ca169 ---- /dev/null -+++ b/library/std/src/os/aero/fs.rs -@@ -0,0 +1,144 @@ -+#![stable(feature = "raw_ext", since = "1.1.0")] -+ -+use crate::fs::Metadata; -+use crate::sys_common::AsInner; -+ -+#[allow(deprecated)] -+use crate::os::aero::raw; -+ -+/// OS-specific extensions to [`fs::Metadata`]. -+/// -+/// [`fs::Metadata`]: crate::fs::Metadata -+#[stable(feature = "metadata_ext", since = "1.1.0")] -+pub trait MetadataExt { -+ /// Gain a reference to the underlying `stat` structure which contains -+ /// the raw information returned by the OS. -+ /// -+ /// The contents of the returned `stat` are **not** consistent across -+ /// Unix platforms. The `os::unix::fs::MetadataExt` trait contains the -+ /// cross-Unix abstractions contained within the raw stat. -+ #[stable(feature = "metadata_ext", since = "1.1.0")] -+ #[deprecated(since = "1.8.0", note = "other methods of this trait are now preferred")] -+ #[allow(deprecated)] -+ fn as_raw_stat(&self) -> &raw::stat; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_dev(&self) -> u64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_ino(&self) -> u64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_mode(&self) -> u32; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_nlink(&self) -> u64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_uid(&self) -> u32; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_gid(&self) -> u32; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_rdev(&self) -> u64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_size(&self) -> u64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_atime(&self) -> i64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_atime_nsec(&self) -> i64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_mtime(&self) -> i64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_mtime_nsec(&self) -> i64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_ctime(&self) -> i64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_ctime_nsec(&self) -> i64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_blksize(&self) -> u64; -+ -+ #[stable(feature = "metadata_ext2", since = "1.8.0")] -+ fn st_blocks(&self) -> u64; -+} -+ -+#[stable(feature = "metadata_ext", since = "1.1.0")] -+impl MetadataExt for Metadata { -+ #[allow(deprecated)] -+ fn as_raw_stat(&self) -> &raw::stat { -+ unsafe { &*(self.as_inner().as_inner() as *const libc::stat as *const raw::stat) } -+ } -+ -+ fn st_dev(&self) -> u64 { -+ self.as_inner().as_inner().st_dev as u64 -+ } -+ -+ fn st_ino(&self) -> u64 { -+ self.as_inner().as_inner().st_ino as u64 -+ } -+ -+ fn st_mode(&self) -> u32 { -+ self.as_inner().as_inner().st_mode as u32 -+ } -+ -+ fn st_nlink(&self) -> u64 { -+ self.as_inner().as_inner().st_nlink as u64 -+ } -+ -+ fn st_uid(&self) -> u32 { -+ self.as_inner().as_inner().st_uid as u32 -+ } -+ -+ fn st_gid(&self) -> u32 { -+ self.as_inner().as_inner().st_gid as u32 -+ } -+ -+ fn st_rdev(&self) -> u64 { -+ self.as_inner().as_inner().st_rdev as u64 -+ } -+ -+ fn st_size(&self) -> u64 { -+ self.as_inner().as_inner().st_size as u64 -+ } -+ -+ fn st_atime(&self) -> i64 { -+ self.as_inner().as_inner().st_atime as i64 -+ } -+ -+ fn st_atime_nsec(&self) -> i64 { -+ self.as_inner().as_inner().st_atime_nsec as i64 -+ } -+ -+ fn st_mtime(&self) -> i64 { -+ self.as_inner().as_inner().st_mtime as i64 -+ } -+ -+ fn st_mtime_nsec(&self) -> i64 { -+ self.as_inner().as_inner().st_mtime_nsec as i64 -+ } -+ -+ fn st_ctime(&self) -> i64 { -+ self.as_inner().as_inner().st_ctime as i64 -+ } -+ -+ fn st_ctime_nsec(&self) -> i64 { -+ self.as_inner().as_inner().st_ctime_nsec as i64 -+ } -+ -+ fn st_blksize(&self) -> u64 { -+ self.as_inner().as_inner().st_blksize as u64 -+ } -+ -+ fn st_blocks(&self) -> u64 { -+ self.as_inner().as_inner().st_blocks as u64 -+ } -+} -diff --git a/library/std/src/os/aero/mod.rs b/library/std/src/os/aero/mod.rs -new file mode 100644 -index 00000000000..ea3291a2f18 ---- /dev/null -+++ b/library/std/src/os/aero/mod.rs -@@ -0,0 +1,6 @@ -+//! Aero-specific definitions -+ -+#![stable(feature = "raw_ext", since = "1.1.0")] -+ -+pub mod fs; -+pub mod raw; -diff --git a/library/std/src/os/aero/raw.rs b/library/std/src/os/aero/raw.rs -new file mode 100644 -index 00000000000..c5e56b8b7b9 ---- /dev/null -+++ b/library/std/src/os/aero/raw.rs -@@ -0,0 +1,66 @@ -+#![stable(feature = "raw_ext", since = "1.1.0")] -+ -+#[stable(feature = "pthread_t", since = "1.8.0")] -+pub type pthread_t = usize; // TODO: This is completely wrong tbh -+ -+#[stable(feature = "raw_ext", since = "1.1.0")] -+pub type dev_t = libc::dev_t; -+ -+#[stable(feature = "raw_ext", since = "1.1.0")] -+pub type ino_t = libc::ino_t; -+ -+#[stable(feature = "raw_ext", since = "1.1.0")] -+pub type mode_t = libc::mode_t; -+ -+#[stable(feature = "raw_ext", since = "1.1.0")] -+pub type nlink_t = libc::nlink_t; -+ -+#[stable(feature = "raw_ext", since = "1.1.0")] -+pub type off_t = libc::off_t; -+ -+#[stable(feature = "raw_ext", since = "1.1.0")] -+pub type time_t = libc::time_t; -+ -+#[stable(feature = "raw_ext", since = "1.1.0")] -+pub type blkcnt_t = libc::blkcnt_t; -+ -+#[stable(feature = "raw_ext", since = "1.1.0")] -+pub type blksize_t = libc::blksize_t; -+ -+#[repr(C)] -+#[derive(Clone)] -+#[stable(feature = "raw_ext", since = "1.1.0")] -+pub struct stat { -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_dev: libc::dev_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_ino: libc::ino_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_mode: libc::mode_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_nlink: libc::nlink_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_uid: libc::uid_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_gid: libc::gid_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_rdev: libc::dev_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_size: libc::off_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_atime: libc::time_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_atime_nsec: libc::c_long, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_mtime: libc::time_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_mtime_nsec: libc::c_long, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_ctime: libc::time_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_ctime_nsec: libc::c_long, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_blksize: libc::blksize_t, -+ #[stable(feature = "raw_ext", since = "1.1.0")] -+ pub st_blocks: libc::blkcnt_t, -+} -diff --git a/library/std/src/os/mod.rs b/library/std/src/os/mod.rs -index 42773805cdb..24158d5da87 100644 ---- a/library/std/src/os/mod.rs -+++ b/library/std/src/os/mod.rs -@@ -133,6 +133,8 @@ pub mod windows {} - pub mod l4re; - #[cfg(target_os = "macos")] - pub mod macos; -+#[cfg(target_os = "aero")] -+pub mod aero; - #[cfg(target_os = "netbsd")] - pub mod netbsd; - #[cfg(target_os = "openbsd")] -diff --git a/library/std/src/os/unix/mod.rs b/library/std/src/os/unix/mod.rs -index f97fa0fb06f..9174b0da9a3 100644 ---- a/library/std/src/os/unix/mod.rs -+++ b/library/std/src/os/unix/mod.rs -@@ -37,6 +37,8 @@ - - #[cfg(not(doc))] - mod platform { -+ #[cfg(target_os = "aero")] -+ pub use crate::os::aero::*; - #[cfg(target_os = "android")] - pub use crate::os::android::*; - #[cfg(target_os = "dragonfly")] -diff --git a/library/std/src/sys/unix/args.rs b/library/std/src/sys/unix/args.rs -index a5ce6d5120d..3dfe759830f 100644 ---- a/library/std/src/sys/unix/args.rs -+++ b/library/std/src/sys/unix/args.rs -@@ -69,7 +69,8 @@ fn next_back(&mut self) -> Option { - target_os = "fuchsia", - target_os = "redox", - target_os = "vxworks", -- target_os = "horizon" -+ target_os = "horizon", -+ target_os = "aero" - ))] - mod imp { - use super::Args; -diff --git a/library/std/src/sys/unix/env.rs b/library/std/src/sys/unix/env.rs -index c9ba661c829..5894baf74f2 100644 ---- a/library/std/src/sys/unix/env.rs -+++ b/library/std/src/sys/unix/env.rs -@@ -217,3 +217,14 @@ pub mod os { - pub const EXE_SUFFIX: &str = ""; - pub const EXE_EXTENSION: &str = ""; - } -+ -+#[cfg(target_os = "aero")] -+pub mod os { -+ pub const FAMILY: &str = "unix"; -+ pub const OS: &str = "aero"; -+ pub const DLL_PREFIX: &str = "lib"; -+ pub const DLL_SUFFIX: &str = ".so"; -+ pub const DLL_EXTENSION: &str = "so"; -+ pub const EXE_SUFFIX: &str = ""; -+ pub const EXE_EXTENSION: &str = ""; -+} -diff --git a/library/std/src/sys/unix/fs.rs b/library/std/src/sys/unix/fs.rs -index 8e1f35d6cc9..18910365f20 100644 ---- a/library/std/src/sys/unix/fs.rs -+++ b/library/std/src/sys/unix/fs.rs -@@ -834,7 +834,8 @@ pub fn file_type(&self) -> io::Result { - target_os = "redox", - target_os = "vxworks", - target_os = "espidf", -- target_os = "horizon" -+ target_os = "horizon", -+ target_os = "aero" - ))] - pub fn ino(&self) -> u64 { - self.entry.d_ino as u64 -@@ -887,7 +888,7 @@ fn name_bytes(&self) -> &[u8] { - target_os = "solaris", - target_os = "illumos", - target_os = "fuchsia", -- target_os = "redox" -+ target_os = "redox", - )))] - fn name_cstr(&self) -> &CStr { - unsafe { CStr::from_ptr(self.entry.d_name.as_ptr()) } -diff --git a/library/std/src/sys/unix/os.rs b/library/std/src/sys/unix/os.rs -index 2f2663db607..5a4b2bc6b10 100644 ---- a/library/std/src/sys/unix/os.rs -+++ b/library/std/src/sys/unix/os.rs -@@ -41,7 +41,7 @@ - } - - extern "C" { -- #[cfg(not(any(target_os = "dragonfly", target_os = "vxworks")))] -+ #[cfg(not(any(target_os = "dragonfly", target_os = "vxworks", target_os = "aero")))] - #[cfg_attr( - any( - target_os = "linux", -@@ -71,13 +71,13 @@ - } - - /// Returns the platform-specific value of errno --#[cfg(not(any(target_os = "dragonfly", target_os = "vxworks")))] -+#[cfg(not(any(target_os = "dragonfly", target_os = "vxworks", target_os = "aero")))] - pub fn errno() -> i32 { - unsafe { (*errno_location()) as i32 } - } - - /// Sets the platform-specific value of errno --#[cfg(all(not(target_os = "dragonfly"), not(target_os = "vxworks")))] // needed for readdir and syscall! -+#[cfg(all(not(target_os = "dragonfly"), not(target_os = "vxworks"), not(target_os = "aero")))] // needed for readdir and syscall! - #[allow(dead_code)] // but not all target cfgs actually end up using it - pub fn set_errno(e: i32) { - unsafe { *errno_location() = e as c_int } -@@ -111,6 +111,29 @@ pub fn set_errno(e: i32) { - } - } - -+#[cfg(target_os = "aero")] -+pub fn errno() -> i32 { -+ extern "C" { -+ #[thread_local] -+ static __mlibc_errno: c_int; -+ } -+ -+ unsafe { __mlibc_errno as i32 } -+} -+ -+#[cfg(target_os = "aero")] -+#[allow(dead_code)] -+pub fn set_errno(e: i32) { -+ extern "C" { -+ #[thread_local] -+ static mut __mlibc_errno: c_int; -+ } -+ -+ unsafe { -+ __mlibc_errno = e; -+ } -+} -+ - /// Gets a detailed string description for the given error number. - pub fn error_string(errno: i32) -> String { - extern "C" { -@@ -471,6 +494,11 @@ pub fn current_exe() -> io::Result { - if !path.is_absolute() { getcwd().map(|cwd| cwd.join(path)) } else { Ok(path) } - } - -+#[cfg(target_os = "aero")] -+pub fn current_exe() -> io::Result { -+ unimplemented!() -+} -+ - pub struct Env { - iter: vec::IntoIter<(OsString, OsString)>, - } -diff --git a/library/std/src/sys/unix/thread.rs b/library/std/src/sys/unix/thread.rs -index cc0e5929569..b952e199aa2 100644 ---- a/library/std/src/sys/unix/thread.rs -+++ b/library/std/src/sys/unix/thread.rs -@@ -160,6 +160,13 @@ pub fn set_name(name: &CStr) { - } - } - -+ #[cfg(target_os = "aero")] -+ pub fn set_name(name: &CStr) { -+ unsafe { -+ libc::pthread_setname_np(libc::pthread_self(), name.as_ptr()); -+ } -+ } -+ - #[cfg(target_os = "netbsd")] - pub fn set_name(name: &CStr) { - unsafe { -diff --git a/library/std/src/sys/unix/thread_local_dtor.rs b/library/std/src/sys/unix/thread_local_dtor.rs -index 236d2f2ee29..30008fc151d 100644 ---- a/library/std/src/sys/unix/thread_local_dtor.rs -+++ b/library/std/src/sys/unix/thread_local_dtor.rs -@@ -11,7 +11,7 @@ - // Note, however, that we run on lots older linuxes, as well as cross - // compiling from a newer linux to an older linux, so we also have a - // fallback implementation to use as well. --#[cfg(any(target_os = "linux", target_os = "fuchsia", target_os = "redox"))] -+#[cfg(any(target_os = "linux", target_os = "fuchsia", target_os = "redox", target_os = "aero"))] - pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) { - use crate::mem; - use crate::sys_common::thread_local_dtor::register_dtor_fallback; -diff --git a/library/unwind/build.rs b/library/unwind/build.rs -index 5c3c02fb6ad..9071008e3b9 100644 ---- a/library/unwind/build.rs -+++ b/library/unwind/build.rs -@@ -21,5 +21,23 @@ fn main() { - if has_unwind { - println!("cargo:rustc-cfg=feature=\"system-llvm-libunwind\""); - } -+ } else if target.contains("solaris") { -+ println!("cargo:rustc-link-lib=gcc_s"); -+ } else if target.contains("illumos") { -+ println!("cargo:rustc-link-lib=gcc_s"); -+ } else if target.contains("dragonfly") { -+ println!("cargo:rustc-link-lib=gcc_pic"); -+ } else if target.contains("pc-windows-gnu") { -+ // This is handled in the target spec with late_link_args_[static|dynamic] -+ } else if target.contains("uwp-windows-gnu") { -+ println!("cargo:rustc-link-lib=unwind"); -+ } else if target.contains("fuchsia") { -+ println!("cargo:rustc-link-lib=unwind"); -+ } else if target.contains("haiku") { -+ println!("cargo:rustc-link-lib=gcc_s"); -+ } else if target.contains("redox") { -+ // redox is handled in lib.rs -+ } else if target.contains("aero") { -+ println!("cargo:rustc-link-lib=gcc_s"); - } - } -diff --git a/src/bootstrap/Cargo.lock b/src/bootstrap/Cargo.lock -index 4a0ba592577..d7b4d646308 100644 ---- a/src/bootstrap/Cargo.lock -+++ b/src/bootstrap/Cargo.lock -@@ -335,9 +335,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - - [[package]] - name = "libc" --version = "0.2.137" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" -+version = "0.2.139" - - [[package]] - name = "linux-raw-sys" -@@ -802,3 +800,39 @@ name = "yansi" - version = "0.5.1" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" -+ -+[[patch.unused]] -+name = "glutin" -+version = "0.28.0" -+ -+[[patch.unused]] -+name = "libloading" -+version = "0.7.3" -+ -+[[patch.unused]] -+name = "mio" -+version = "0.6.23" -+ -+[[patch.unused]] -+name = "mio" -+version = "0.8.3" -+ -+[[patch.unused]] -+name = "nix" -+version = "0.22.3" -+ -+[[patch.unused]] -+name = "num_cpus" -+version = "1.13.0" -+ -+[[patch.unused]] -+name = "shared_library" -+version = "0.1.9" -+ -+[[patch.unused]] -+name = "users" -+version = "0.11.0" -+ -+[[patch.unused]] -+name = "winit" -+version = "0.26.1" -diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py -index 013d1ab525b..624c8070fca 100644 ---- a/src/bootstrap/bootstrap.py -+++ b/src/bootstrap/bootstrap.py -@@ -717,7 +717,7 @@ class RustBuild(object): - ... "debug", "bootstrap") - True - """ -- return os.path.join(self.build_dir, "bootstrap", "debug", "bootstrap") -+ return os.path.join(self.build_dir, "bootstrap", self.build, "debug", "bootstrap") - - def build_bootstrap(self, color, verbose_count): - """Build bootstrap""" -@@ -726,7 +726,7 @@ class RustBuild(object): - if self.clean and os.path.exists(build_dir): - shutil.rmtree(build_dir) - env = os.environ.copy() -- # `CARGO_BUILD_TARGET` breaks bootstrap build. -+ # `CARGO_BUILD_TARGET` and 'build.target' break bootstrap build. - # See also: . - if "CARGO_BUILD_TARGET" in env: - del env["CARGO_BUILD_TARGET"] -@@ -791,6 +791,9 @@ class RustBuild(object): - elif color == "never": - args.append("--color=never") - -+ args.append("--target") -+ args.append(self.build) -+ - # Run this from the source directory so cargo finds .cargo/config - run(args, env=env, verbose=self.verbose, cwd=self.rust_root) - -diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs -index b4fc1d4f28d..7ef092488fe 100644 ---- a/src/bootstrap/builder.rs -+++ b/src/bootstrap/builder.rs -@@ -1479,6 +1479,8 @@ pub fn cargo( - self.clear_if_dirty(&out_dir, &self.rustc(compiler)); - } - -+ let artifact_dir = self.out.join("bootstrap/").join(self.build.build.triple).join("debug/"); -+ - // Customize the compiler we're running. Specify the compiler to cargo - // as our shim and then pass it some various options used to configure - // how the actual compiler itself is called. -@@ -1491,7 +1493,7 @@ pub fn cargo( - .env("RUSTC_STAGE", stage.to_string()) - .env("RUSTC_SYSROOT", &sysroot) - .env("RUSTC_LIBDIR", &libdir) -- .env("RUSTDOC", self.bootstrap_out.join("rustdoc")) -+ .env("RUSTDOC", artifact_dir.join("rustdoc")) - .env( - "RUSTDOC_REAL", - if cmd == "doc" || cmd == "rustdoc" || (cmd == "test" && want_rustdoc) { -@@ -1505,7 +1507,7 @@ pub fn cargo( - // Clippy support is a hack and uses the default `cargo-clippy` in path. - // Don't override RUSTC so that the `cargo-clippy` in path will be run. - if cmd != "clippy" { -- cargo.env("RUSTC", self.bootstrap_out.join("rustc")); -+ cargo.env("RUSTC", artifact_dir.join("rustc")); - } - - // Dealing with rpath here is a little special, so let's go into some --- -2.39.1 - From f4add34bfe1d914e92b2a2e7f2806c96e4cda2b1 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 19 Oct 2023 22:00:48 +1100 Subject: [PATCH 267/368] misc(aero.py): update to the new target triple * Update to the new target triple (`x86_64-unknown-aero-system` to `x86_64-unknown-aero`) Signed-off-by: Anhad Singh --- aero.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aero.py b/aero.py index 98ebbbd67d0..8dfee005dbc 100755 --- a/aero.py +++ b/aero.py @@ -341,13 +341,13 @@ def get_mlibc(): return os.path.join("..", pkg_dir, PACKAGE_MLIBC) command = 'build' # TODO: handle the unbased architectures. - cmd_args = ["--target", "x86_64-unknown-aero-system", + cmd_args = ["--target", "x86_64-unknown-aero", # cargo config "--config", f"build.rustc = '{get_rustc()}'", - "--config", "build.target = 'x86_64-unknown-aero-system'", + "--config", "build.target = 'x86_64-unknown-aero'", "--config", f"build.rustflags = ['-C', 'link-args=-no-pie -B {get_binutils()} --sysroot {get_mlibc()}', '-lc']", - "--config", f"target.x86_64-unknown-aero-system.linker = '{get_gcc()}'", + "--config", f"target.x86_64-unknown-aero.linker = '{get_gcc()}'", "-Z", "unstable-options"] From 4cbc29e02fd20a0f544fe02f69044a2e6e357d7e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 20 Oct 2023 19:51:12 +1100 Subject: [PATCH 268/368] misc: cleanups and minor fixes for webkitgtk * cleanup: remove the unused flags argument in INode::open() * cleanup: make `flags` on `FileHandle` private and use getter and setter functions to set the flags. * feat: add initial netlink socket support * feat(unix): implement get_{sockname, peername} * fix: the ABI for `MessageHeader` was wrong, i.e, {name_len, control_len} are supposed to be a u32 instead of a usize. Signed-off-by: Anhad Singh --- patches/mlibc/mlibc.patch | 183 ---------- src/Cargo.lock | 1 + src/aero_kernel/src/drivers/pty.rs | 6 +- src/aero_kernel/src/drivers/tty/vtty.rs | 1 - src/aero_kernel/src/fs/devfs.rs | 8 +- src/aero_kernel/src/fs/eventfd.rs | 47 ++- src/aero_kernel/src/fs/file_table.rs | 27 +- src/aero_kernel/src/fs/inode.rs | 2 +- src/aero_kernel/src/fs/pipe.rs | 15 +- src/aero_kernel/src/fs/ramfs.rs | 8 +- src/aero_kernel/src/socket/mod.rs | 7 + src/aero_kernel/src/socket/netlink.rs | 315 ++++++++++++++++++ src/aero_kernel/src/socket/tcp.rs | 8 +- src/aero_kernel/src/socket/udp.rs | 9 +- src/aero_kernel/src/socket/unix.rs | 37 +- src/aero_kernel/src/syscall/fs.rs | 29 +- src/aero_kernel/src/syscall/net.rs | 44 ++- src/aero_kernel/src/userland/scheduler/mod.rs | 4 + .../src/userland/scheduler/round_robin.rs | 1 + src/aero_kernel/src/userland/task/mod.rs | 48 ++- src/aero_syscall/Cargo.toml | 1 + src/aero_syscall/src/lib.rs | 1 + src/aero_syscall/src/netlink.rs | 230 +++++++++++++ src/aero_syscall/src/socket.rs | 10 +- userland/Cargo.lock | 7 + 25 files changed, 774 insertions(+), 275 deletions(-) delete mode 100644 patches/mlibc/mlibc.patch create mode 100644 src/aero_kernel/src/socket/netlink.rs create mode 100644 src/aero_syscall/src/netlink.rs diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch deleted file mode 100644 index a72e9f7fe37..00000000000 --- a/patches/mlibc/mlibc.patch +++ /dev/null @@ -1,183 +0,0 @@ -From ea350e347faaa97e0499d34582ff068510809542 Mon Sep 17 00:00:00 2001 -From: Anhad Singh -Date: Fri, 13 Oct 2023 22:50:34 +1100 -Subject: [PATCH] - -Signed-off-by: Anhad Singh ---- - options/glibc/generic/execinfo.cpp | 5 +++-- - options/posix/generic/posix_stdlib.cpp | 2 +- - options/rtdl/generic/linker.cpp | 2 +- - sysdeps/aero/generic/aero.cpp | 9 ++++++--- - sysdeps/aero/generic/filesystem.cpp | 10 ++++++++++ - sysdeps/aero/generic/signals.cpp | 19 +++++++------------ - sysdeps/aero/generic/sockets.cpp | 16 ++++++++++++++++ - sysdeps/aero/include/aero/syscall.h | 2 ++ - 8 files changed, 46 insertions(+), 19 deletions(-) - -diff --git a/options/glibc/generic/execinfo.cpp b/options/glibc/generic/execinfo.cpp -index 3474615..aaf593a 100644 ---- a/options/glibc/generic/execinfo.cpp -+++ b/options/glibc/generic/execinfo.cpp -@@ -1,9 +1,10 @@ - #include - #include -+#include - - int backtrace(void **, int) { -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ mlibc::infoLogger() << "backtrace: Not implemented" << frg::endlog; -+ return 0; - } - - char **backtrace_symbols(void *const *, int) { -diff --git a/options/posix/generic/posix_stdlib.cpp b/options/posix/generic/posix_stdlib.cpp -index 76b85dc..4b783b3 100644 ---- a/options/posix/generic/posix_stdlib.cpp -+++ b/options/posix/generic/posix_stdlib.cpp -@@ -464,7 +464,7 @@ int grantpt(int) { - } - - double strtod_l(const char *__restrict__ nptr, char ** __restrict__ endptr, locale_t) { -- mlibc::infoLogger() << "mlibc: strtod_l ignores locale!" << frg::endlog; -+ // mlibc::infoLogger() << "mlibc: strtod_l ignores locale!" << frg::endlog; - return strtod(nptr, endptr); - } - -diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp -index c604a50..eec0b7b 100644 ---- a/options/rtdl/generic/linker.cpp -+++ b/options/rtdl/generic/linker.cpp -@@ -18,7 +18,7 @@ uintptr_t libraryBase = 0x41000000; - - constexpr bool verbose = false; - constexpr bool stillSlightlyVerbose = false; --constexpr bool logBaseAddresses = false; -+constexpr bool logBaseAddresses = true; - constexpr bool logRpath = false; - constexpr bool eagerBinding = true; - -diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index e6bd277..a341fcf 100644 ---- a/sysdeps/aero/generic/aero.cpp -+++ b/sysdeps/aero/generic/aero.cpp -@@ -303,10 +303,13 @@ int sys_clone(void *tcb, pid_t *tid_out, void *stack) { - return 0; - } - --void sys_thread_exit() UNIMPLEMENTED("sys_thread_exit") -+void sys_thread_exit() { -+ syscall(SYS_EXIT); -+ __builtin_trap(); -+} - -- int sys_waitpid(pid_t pid, int *status, int flags, struct rusage *ru, -- pid_t *ret_pid) { -+int sys_waitpid(pid_t pid, int *status, int flags, struct rusage *ru, -+ pid_t *ret_pid) { - if (ru) { - mlibc::infoLogger() - << "mlibc: struct rusage in sys_waitpid is unsupported" -diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index fa5a369..33a11f4 100644 ---- a/sysdeps/aero/generic/filesystem.cpp -+++ b/sysdeps/aero/generic/filesystem.cpp -@@ -39,6 +39,16 @@ int sys_read(int fd, void *buf, size_t count, ssize_t *bytes_read) { - return 0; - } - -+int sys_fsync(int) { -+ mlibc::infoLogger() << "\e[35mmlibc: fsync is a stub\e[39m" << frg::endlog; -+ return 0; -+} -+ -+int sys_fdatasync(int) { -+ mlibc::infoLogger() << "\e[35mmlibc: fdatasync() is a no-op\e[39m" << frg::endlog; -+ return 0; -+} -+ - // clang-format off - int sys_pwrite(int fd, const void *buffer, size_t count, off_t off, - ssize_t *written) UNIMPLEMENTED("sys_pwrite") -diff --git a/sysdeps/aero/generic/signals.cpp b/sysdeps/aero/generic/signals.cpp -index a6f69ff..611db69 100644 ---- a/sysdeps/aero/generic/signals.cpp -+++ b/sysdeps/aero/generic/signals.cpp -@@ -29,25 +29,20 @@ int sys_sigaction(int how, const struct sigaction *__restrict action, - #endif - - auto sigreturn = (sc_word_t)__mlibc_signal_restore; -- -- auto res = syscall(SYS_SIGACTION, how, (sc_word_t)action, sigreturn, -+ auto ret = syscall(SYS_SIGACTION, how, (sc_word_t)action, sigreturn, - (sc_word_t)old_action); - -- if (res < 0) { -- return -res; -- } -- -+ if(int e = sc_error(ret); e) -+ return e; - return 0; - } - - int sys_sigprocmask(int how, const sigset_t *__restrict set, - sigset_t *__restrict retrieve) { -- auto result = syscall(SYS_SIGPROCMASK, how, set, retrieve); - -- if (result < 0) { -- return -result; -- } -- -- return 0; -+ auto ret = syscall(SYS_SIGPROCMASK, how, set, retrieve); -+ if(int e = sc_error(ret); e) -+ return e; -+ return 0; - } - } // namespace mlibc -\ No newline at end of file -diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp -index 0cce3c0..10af36a 100644 ---- a/sysdeps/aero/generic/sockets.cpp -+++ b/sysdeps/aero/generic/sockets.cpp -@@ -221,6 +221,22 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, - } - } - -+int sys_peername(int fd, struct sockaddr *addr_ptr, socklen_t max_addr_length, socklen_t *actual_length) { -+ auto ret = syscall(SYS_GETPEERNAME, fd, addr_ptr, &max_addr_length); -+ if (int e = sc_error(ret); e) -+ return e; -+ *actual_length = max_addr_length; -+ return 0; -+} -+ -+int sys_sockname(int fd, struct sockaddr *addr_ptr, socklen_t max_addr_length, socklen_t *actual_length) { -+ auto ret = syscall(SYS_GETSOCKNAME, fd, addr_ptr, &max_addr_length); -+ if (int e = sc_error(ret); e) -+ return e; -+ *actual_length = max_addr_length; -+ return 0; -+} -+ - int sys_shutdown(int sockfd, int how) { - auto ret = syscall(SYS_SOCK_SHUTDOWN, sockfd, how); - if(int e = sc_error(ret); e) -diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 3f36e4d..39c5b65 100644 ---- a/sysdeps/aero/include/aero/syscall.h -+++ b/sysdeps/aero/include/aero/syscall.h -@@ -80,6 +80,8 @@ - #define SYS_SETSID 73 - #define SYS_GETPGID 74 - #define SYS_SOCK_SHUTDOWN 75 -+#define SYS_GETPEERNAME 76 -+#define SYS_GETSOCKNAME 77 - - // Invalid syscall used to trigger a log error in the kernel (as a hint) - // so, that we can implement the syscall in the kernel. --- -2.42.0 - diff --git a/src/Cargo.lock b/src/Cargo.lock index 773f4b49eac..4cf67a98a94 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -52,6 +52,7 @@ dependencies = [ "byte_endian", "num-derive", "num-traits", + "static_assertions", ] [[package]] diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 9ecfb87709b..790765d49b4 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -330,11 +330,7 @@ impl devfs::Device for Ptmx { } impl INodeInterface for Ptmx { - fn open( - &self, - _flags: aero_syscall::OpenFlags, - _handle: Arc, - ) -> fs::Result> { + fn open(&self, _handle: Arc) -> fs::Result> { let master = Arc::new(Master::new()); let slave = Slave::new(master.clone()); let inode = DirEntry::from_inode(master, String::from("")); diff --git a/src/aero_kernel/src/drivers/tty/vtty.rs b/src/aero_kernel/src/drivers/tty/vtty.rs index 236714639a0..7edb0c53add 100644 --- a/src/aero_kernel/src/drivers/tty/vtty.rs +++ b/src/aero_kernel/src/drivers/tty/vtty.rs @@ -229,7 +229,6 @@ impl Tty { impl INodeInterface for Tty { fn open( &self, - _flags: aero_syscall::OpenFlags, _handle: Arc, ) -> fs::Result> { let connected = self.connected.fetch_add(1, Ordering::SeqCst); diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index 15d2f07bd4f..73b383b6fcf 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -129,12 +129,8 @@ impl INodeInterface for DevINode { self.0.inode().poll(table) } - fn open( - &self, - flags: aero_syscall::OpenFlags, - handle: Arc, - ) -> Result> { - self.0.inode().open(flags, handle) + fn open(&self, handle: Arc) -> Result> { + self.0.inode().open(handle) } } diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index 06dd3a78789..caea7aa24a7 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -15,14 +15,22 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use aero_syscall::OpenFlags; use alloc::sync::Arc; +use spin::Once; +use super::file_table::FileHandle; use super::inode::{INodeInterface, PollFlags, PollTable}; +use crate::fs::FileSystemError; use crate::utils::sync::{Mutex, WaitQueue}; pub struct EventFd { wq: WaitQueue, + /// Every write(2) on an eventfd, the value written is added to `count` and a wakeup + /// is performed on `wq`. count: Mutex, + // FIXME: https://github.com/Andy-Python-Programmer/aero/issues/113 + handle: Once>, } impl EventFd { @@ -30,11 +38,22 @@ impl EventFd { Arc::new(Self { wq: WaitQueue::new(), count: Mutex::new(0), + handle: Once::new(), }) } + + fn is_nonblock(&self) -> bool { + let handle = self.handle.get().expect("file handle is not initialized"); + handle.flags().contains(OpenFlags::O_NONBLOCK) + } } impl INodeInterface for EventFd { + fn open(&self, handle: Arc) -> super::Result> { + self.handle.call_once(|| handle); + Ok(None) + } + fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> super::Result { let size = core::mem::size_of::(); assert!(buffer.len() >= size); @@ -52,16 +71,28 @@ impl INodeInterface for EventFd { } fn write_at(&self, _offset: usize, buffer: &[u8]) -> super::Result { - let size = core::mem::size_of::(); - assert!(buffer.len() >= size); + let chunk_size = core::mem::size_of::(); + assert!(buffer.len() >= chunk_size); - // SAFETY: We have above verified that it is safe to dereference - // the value. - let value = unsafe { *(buffer.as_ptr() as *const u64) }; + // TODO: use bytemuck to remove the unsafe. + let target = unsafe { *(buffer.as_ptr() as *const u64) }; + + if target == u64::MAX { + return Err(FileSystemError::NotSupported); + } + + let mut count = self.count.lock(); + + if u64::MAX - *count > target { + *count += target; + } else if !self.is_nonblock() { + unimplemented!() + } else { + return Ok(0); + }; - *self.count.lock_irq() += value; self.wq.notify_all(); - Ok(size) + Ok(chunk_size) } fn poll(&self, table: Option<&mut PollTable>) -> super::Result { @@ -70,7 +101,7 @@ impl INodeInterface for EventFd { if let Some(e) = table { e.insert(&self.wq) - } // listen for changes + } if *count > 0 { events.insert(PollFlags::IN); diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index 05997abbc35..e1cbb04ef88 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -42,7 +42,7 @@ pub struct FileHandle { // We need to store the `offset` behind an Arc since when the file handle // is duplicated, the `offset` needs to be in sync with the parent. pub offset: Arc, - pub flags: RwLock, + flags: RwLock, } impl FileHandle { @@ -56,6 +56,14 @@ impl FileHandle { } } + pub fn flags(&self) -> OpenFlags { + *self.flags.read() + } + + pub fn set_flags(&self, flags: OpenFlags) { + *self.flags.write() = flags; + } + pub fn read(&self, buffer: &mut [u8]) -> super::Result { let offset = self.offset.load(Ordering::SeqCst); let new_offset = self.inode.inode().read_at(offset, buffer)?; @@ -126,7 +134,7 @@ impl FileHandle { flags: RwLock::new(flags), }); - new.inode.inode().open(flags, new.clone())?; + new.inode.inode().open(new.clone())?; Ok(new) } @@ -299,13 +307,18 @@ impl FileTable { handle .inode .inode() - .open(flags, handle.clone()) + .open(handle.clone()) .expect("FileTable::clone: failed to open file"); } Self(RwLock::new(files.clone())) } + pub fn debug_open_file(&self, dirent: DirCacheItem, flags: OpenFlags) -> super::Result { + self.log(); + self.open_file(dirent, flags) + } + pub fn open_file(&self, dentry: DirCacheItem, mut flags: OpenFlags) -> super::Result { let mut files = self.0.write(); @@ -317,7 +330,7 @@ impl FileTable { if let Some((i, f)) = files.iter_mut().enumerate().find(|e| e.1.is_none()) { let mut handle = Arc::new(FileHandle::new(i, dentry, flags)); - if let Some(inode) = handle.inode.inode().open(flags, handle.clone())? { + if let Some(inode) = handle.inode.inode().open(handle.clone())? { // TODO: should open be called on the inner file as well??? handle = Arc::new(FileHandle::new(i, inode, flags)) } @@ -329,7 +342,7 @@ impl FileTable { let fd = files.len(); let mut handle = Arc::new(FileHandle::new(fd, dentry, flags)); - if let Some(inode) = handle.inode.inode().open(flags, handle.clone())? { + if let Some(inode) = handle.inode.inode().open(handle.clone())? { // TODO: should open be called on the inner file as well??? handle = Arc::new(FileHandle::new(fd, inode, flags)) } @@ -346,6 +359,10 @@ impl FileTable { /// and can be reused. This function will return false if the provided file /// descriptor index was invalid. pub fn close_file(&self, fd: usize) -> bool { + // log::warn!("closing filedescriptor {fd} ---- START"); + // crate::unwind::unwind_stack_trace(); + // log::warn!("closing filedescriptor {fd} ---- END"); + let mut files = self.0.write(); if let Some(file) = files.get_mut(fd) { diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 5c03caf0471..0ad62ff6530 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -189,7 +189,7 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSupported) } - fn open(&self, _flags: OpenFlags, _handle: Arc) -> Result> { + fn open(&self, _handle: Arc) -> Result> { Ok(None) } diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index 5533a6bccef..9cf196b95db 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -45,13 +45,9 @@ impl Pipe { } impl INodeInterface for Pipe { - fn open( - &self, - flags: OpenFlags, - handle: Arc, - ) -> super::Result> { + fn open(&self, handle: Arc) -> super::Result> { // Write end of the pipe: - if flags.contains(OpenFlags::O_WRONLY) { + if handle.flags().contains(OpenFlags::O_WRONLY) { self.num_writers.fetch_add(1, Ordering::SeqCst); self.handle.call_once(|| handle); } @@ -72,12 +68,7 @@ impl INodeInterface for Pipe { } fn read_at(&self, _offset: usize, buf: &mut [u8]) -> super::Result { - let flags = *self - .handle - .get() - .expect("pipe: internal error") - .flags - .read(); + let flags = self.handle.get().expect("pipe: internal error").flags(); let nonblock = flags.contains(OpenFlags::O_NONBLOCK); if nonblock && !self.queue.lock_irq().has_data() { diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index d1542c5778f..c8835be0b78 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -302,11 +302,7 @@ impl INodeInterface for LockedRamINode { } } - fn open( - &self, - flags: aero_syscall::OpenFlags, - handle: Arc, - ) -> Result> { + fn open(&self, handle: Arc) -> Result> { let this = self.0.read(); match &this.contents { @@ -314,7 +310,7 @@ impl INodeInterface for LockedRamINode { let device = device.clone(); drop(this); - device.open(flags, handle) + device.open(handle) } _ => Ok(None), diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index 28f49589a11..2d7a9903de4 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -18,9 +18,11 @@ pub mod ipv4; pub mod tcp; // pub mod tcp2; +pub mod netlink; pub mod udp; pub mod unix; +use aero_syscall::netlink::sockaddr_nl; use aero_syscall::prelude::IfReq; use aero_syscall::*; @@ -29,12 +31,16 @@ use crate::mem::paging::VirtAddr; #[derive(Debug)] pub enum SocketAddr { Inet(SocketAddrInet), + Netlink(sockaddr_nl), + Unix(SocketAddrUnix), } #[derive(Debug)] pub enum SocketAddrRef<'a> { Unix(&'a SocketAddrUnix), INet(&'a SocketAddrInet), + // TODO: https://docs.huihoo.com/doxygen/linux/kernel/3.7/structsockaddr__nl.html + Netlink, } impl<'a> SocketAddrRef<'a> { @@ -42,6 +48,7 @@ impl<'a> SocketAddrRef<'a> { match family { AF_UNIX => Ok(SocketAddrRef::Unix(address.read_mut::()?)), AF_INET => Ok(SocketAddrRef::INet(address.read_mut::()?)), + AF_NETLINK => Ok(SocketAddrRef::Netlink), _ => Err(SyscallError::EINVAL), } diff --git a/src/aero_kernel/src/socket/netlink.rs b/src/aero_kernel/src/socket/netlink.rs new file mode 100644 index 00000000000..dc180e638cf --- /dev/null +++ b/src/aero_kernel/src/socket/netlink.rs @@ -0,0 +1,315 @@ +//! Netlink Sockets +//! +//! Netlink sockets are used for inter-process communication (IPC) between both the kernel and +//! userspace processes, and between different userspace processes, in a way similar to the Unix +//! domain sockets. +//! +//! Netlink is designed and used for transferring miscellaneous networking information between the +//! kernel space and userspace processes. Networking utilities, such as the `iproute2` family use +//! Netlink to communicate with the kernel from userspace. + +use aero_syscall::netlink::{MessageFlags, MessageType, RtAttrType}; +use aero_syscall::socket::{self, MessageHeader}; +use aero_syscall::{netlink, AF_INET, AF_NETLINK, AF_UNSPEC}; +use alloc::sync::Arc; +use alloc::vec::Vec; +use crabnet::network::Ipv4Addr; + +use crate::fs; +use crate::fs::cache::DirCacheImpl; +use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags, PollTable}; +use crate::utils::sync::{Mutex, WaitQueue}; + +use super::SocketAddrRef; + +// TODO(andypython): can we use crabnet to construct netlink packets(?) +struct NetlinkBuilder { + buffer: Vec, +} + +impl NetlinkBuilder { + fn new() -> Self { + // crate::scheduler::get_scheduler().for_each_task(|task| { + // if task + // .executable + // .lock() + // .as_ref() + // .map(|x| x.absolute_path_str().contains("kit")) + // .unwrap_or_default() + // { + // task.enable_systrace(); + // } + // }); + + Self { buffer: Vec::new() } + } + + fn header(&mut self, header: netlink::nlmsghdr) { + self.buffer.extend_from_slice(unsafe { + core::slice::from_raw_parts( + &header as *const _ as *const u8, + core::mem::size_of::(), + ) + }); + + self.buffer_align(); + } + + fn message(&mut self, message: netlink::rtmsg) { + self.buffer.extend_from_slice(unsafe { + core::slice::from_raw_parts( + &message as *const _ as *const u8, + core::mem::size_of::(), + ) + }); + + self.buffer_align(); + } + + fn rtattr(&mut self, ty: RtAttrType, data: T) { + let rta_len = netlink::rta_length(core::mem::size_of::() as u32); + + let attr = netlink::rtattr { + rta_len: rta_len.try_into().unwrap(), + rta_type: ty, + }; + + let padding = rta_len as usize - core::mem::size_of::(); + + self.buffer.extend_from_slice(unsafe { + core::slice::from_raw_parts( + &attr as *const _ as *const u8, + core::mem::size_of::(), + ) + }); + + self.buffer.extend_from_slice(unsafe { + core::slice::from_raw_parts(&data as *const _ as *const u8, core::mem::size_of::()) + }); + + self.buffer.resize(self.buffer.len() + padding, 0); + self.buffer_align(); + } + + /// Aligns the buffer to the netlink message alignment. + fn buffer_align(&mut self) { + let aligned_len = netlink::nlmsg_align(self.buffer.len() as u32); + + // Resize will not truncate the buffer since [`nlmsg_align`]` only rounds up. + self.buffer.resize(aligned_len as usize, 0); + } + + fn build(self) -> Vec { + let mut buffer = self.buffer; + + let msg_len = buffer.len(); + let msg_hdr = unsafe { &mut *buffer.as_mut_ptr().cast::() }; + + msg_hdr.nlmsg_len = msg_len as u32; + buffer + } +} + +pub struct NetLinkSocket { + recv_queue: Mutex>>, + recv_wq: WaitQueue, +} + +impl NetLinkSocket { + pub fn new() -> Arc { + Arc::new(Self { + recv_queue: Mutex::new(Vec::new()), + recv_wq: WaitQueue::new(), + }) + } + + fn validate_message<'a, T>(header: &'a netlink::nlmsghdr, payload: &'a [u8]) -> &'a T { + let hdr_len = core::mem::size_of::() as u32; + let msg_len = core::mem::size_of::() as u32; + + // TODO(andypython): send an error message instead of panicking. + assert!(header.nlmsg_len == hdr_len + msg_len); + + // FIXME(andypython): use bytemuck to cast the payload to T. + unsafe { &*payload.as_ptr().cast::() } + } + + fn send_route_packet(&self, header: &netlink::nlmsghdr) { + let mut builder = NetlinkBuilder::new(); + + builder.header(netlink::nlmsghdr { + nlmsg_type: MessageType::RtmNewRoute, + nlmsg_flags: MessageFlags::MULTI, + nlmsg_seq: header.nlmsg_seq, + nlmsg_pid: 0, + nlmsg_len: 0, + }); + + builder.message(netlink::rtmsg { + rtm_family: AF_INET as u8, + rtm_dst_len: 0, // FIXME + rtm_src_len: 0, + rtm_tos: 0, + rtm_table: netlink::RT_TABLE_MAIN, + + rtm_protocol: 0, + rtm_scope: 0, + rtm_type: 0, + rtm_flags: 0, + }); + + builder.rtattr(RtAttrType::Table, netlink::RT_TABLE_MAIN); + + // Qemu SLIRP + builder.rtattr(RtAttrType::Dst, Ipv4Addr::new(10, 0, 2, 15)); + builder.rtattr(RtAttrType::Gateway, Ipv4Addr::new(10, 0, 2, 2)); + + self.recv_queue.lock().push(builder.build()); + self.recv_wq.notify(); + } + + fn get_route(&self, header: &netlink::nlmsghdr, payload: &[u8]) { + assert!(header + .nlmsg_flags + .contains(MessageFlags::REQUEST | MessageFlags::DUMP)); + + let payload = Self::validate_message::(header, payload); + let rtgen_family = payload.rtgen_family as u32; + + assert!(rtgen_family == AF_UNSPEC || rtgen_family == AF_NETLINK); + + self.send_route_packet(header); + } +} + +impl INodeInterface for NetLinkSocket { + fn metadata(&self) -> fs::Result { + Ok(Metadata::with_file_type(FileType::Socket)) + } + + fn bind(&self, _addr: SocketAddrRef, _len: usize) -> fs::Result<()> { + Ok(()) + } + + fn connect(&self, _address: SocketAddrRef, _length: usize) -> fs::Result<()> { + unimplemented!() + } + + fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> fs::Result { + unimplemented!() + } + + fn write_at(&self, _offset: usize, _buffer: &[u8]) -> fs::Result { + unimplemented!() + } + + fn recv( + &self, + message_hdr: &mut MessageHeader, + flags: socket::MessageFlags, + ) -> fs::Result { + // FIXME(andypython): All of the message header and iovec logic should be moved to + // syscall::net::recvmsg() instead. + + if let Some(addr) = message_hdr.name_mut::() { + *addr = netlink::sockaddr_nl { + nl_family: AF_NETLINK, + nl_pad: 0, + nl_pid: 0, + nl_groups: 0, + }; + } + + let mut queue = self + .recv_wq + .block_on(&self.recv_queue, |queue| !queue.is_empty())?; + + let mut bytes_copied = 0; + dbg!(message_hdr.iovecs_mut()); + let mut iovecs = message_hdr.iovecs_mut().to_vec(); + + while let Some(data) = queue.pop() { + if let Some((index, ref mut iovec)) = iovecs + .iter_mut() + .enumerate() + .find(|(_, iovec)| iovec.len() >= data.len()) + { + let iovec = iovec.as_slice_mut(); + assert!(iovec.len() >= data.len()); + + let copy = core::cmp::min(iovec.len(), data.len()); + iovec[..copy].copy_from_slice(&data[..copy]); + + bytes_copied += copy; + iovecs.remove(index); + } else { + if flags.contains(socket::MessageFlags::TRUNC) && bytes_copied == 0 { + message_hdr.flags = socket::MessageFlags::TRUNC.bits() as i32; + return Ok(data.len()); + } else { + unimplemented!() + } + } + } + + Ok(bytes_copied) + } + + fn send( + &self, + message_hdr: &mut MessageHeader, + flags: socket::MessageFlags, + ) -> fs::Result { + log::warn!("netlink::send(flags={flags:?})"); + + // FIXME(andypython): figure out the message header stuff... + let data = message_hdr + .iovecs() + .iter() + .flat_map(|e| e.as_slice()) + .copied() + .collect::>(); + + let hdr_size = core::mem::size_of::(); + + let mut offset = 0; + + while offset + hdr_size <= data.len() { + let header = unsafe { &*(data.as_ptr().add(offset) as *const netlink::nlmsghdr) }; + let payload = &data[offset + hdr_size..]; + + match header.nlmsg_type { + MessageType::Done => break, + MessageType::Error => { + unimplemented!("netlink::send: error message received"); + } + + MessageType::RtmGetRoute => self.get_route(header, payload), + + ty => unimplemented!("netlink::send: unknown message type {ty:?}"), + } + + offset += header.nlmsg_len as usize; + } + + Ok(data.len()) + } + + fn poll(&self, _table: Option<&mut PollTable>) -> fs::Result { + unimplemented!() + } + + fn get_peername(&self) -> fs::Result { + unimplemented!() + } + + fn get_sockname(&self) -> fs::Result { + // TODO(andypython): fill in `nl_groups` and `nl_pid`. + Ok(super::SocketAddr::Netlink(netlink::sockaddr_nl { + nl_family: AF_NETLINK, + nl_pad: 0, + nl_pid: 0, + nl_groups: 0, + })) + } +} diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 34d29602714..05acb9700d7 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -79,7 +79,7 @@ impl TcpSocket { pub fn non_blocking(&self) -> bool { self.handle .get() - .map(|handle| handle.flags.read().contains(OpenFlags::O_NONBLOCK)) + .map(|handle| handle.flags().contains(OpenFlags::O_NONBLOCK)) .unwrap_or_default() } @@ -150,11 +150,7 @@ impl INodeInterface for TcpSocket { Ok(()) } - fn open( - &self, - _flags: aero_syscall::OpenFlags, - handle: Arc, - ) -> fs::Result> { + fn open(&self, handle: Arc) -> fs::Result> { self.handle.call_once(|| handle); Ok(None) } diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index 0409073d0bf..3d751466688 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -104,18 +104,13 @@ impl UdpSocket { self.handle .get() .expect("inet: not bound to an fd") - .flags - .read() + .flags() .contains(OpenFlags::O_NONBLOCK) } } impl INodeInterface for UdpSocket { - fn open( - &self, - _flags: aero_syscall::OpenFlags, - handle: Arc, - ) -> fs::Result> { + fn open(&self, handle: Arc) -> fs::Result> { self.handle.call_once(|| handle); Ok(None) } diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index f8d635e4e4e..3d0d0e64e90 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -232,8 +232,7 @@ impl UnixSocket { self.handle .get() .expect("unix: not bound to an fd") - .flags - .read() + .flags() .contains(OpenFlags::O_NONBLOCK) } } @@ -248,11 +247,7 @@ impl INodeInterface for UnixSocket { }) } - fn open( - &self, - _flags: aero_syscall::OpenFlags, - handle: Arc, - ) -> fs::Result> { + fn open(&self, handle: Arc) -> fs::Result> { self.handle.call_once(|| handle); Ok(None) } @@ -385,7 +380,7 @@ impl INodeInterface for UnixSocket { } fn recv(&self, header: &mut MessageHeader, flags: MessageFlags) -> fs::Result { - assert!(flags.is_empty()); + // assert!(flags.is_empty()); let inner = self.inner.lock_irq(); @@ -451,4 +446,30 @@ impl INodeInterface for UnixSocket { log::warn!("shutdown how={how}"); Ok(()) } + + fn get_sockname(&self) -> fs::Result { + let inner = self.inner.lock_irq(); + let address = inner.address.as_ref().cloned().unwrap_or(SocketAddrUnix { + family: AF_UNIX, + path: [0; 108], + }); + + Ok(super::SocketAddr::Unix(address.clone())) + } + + fn get_peername(&self) -> fs::Result { + let inner = self.inner.lock_irq(); + let peer = match &inner.state { + UnixSocketState::Connected(peer) => peer, + _ => return Err(FileSystemError::NotConnected), + }; + + let peer = peer.inner.lock_irq(); + let address = peer.address.as_ref().cloned().unwrap_or(SocketAddrUnix { + family: AF_UNIX, + path: [0; 108], + }); + + Ok(super::SocketAddr::Unix(address.clone())) + } } diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index a861e0f133f..3677d7bdb91 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -93,10 +93,9 @@ pub fn open(_fd: usize, path: &Path, mode: usize) -> Result inode.inode().truncate(0)?; } - Ok(scheduler::get_scheduler() - .current_task() + Ok(scheduler::current_thread() .file_table - .open_file(inode, flags)?) + .open_file(inode.clone(), flags)?) } #[syscall] @@ -234,12 +233,14 @@ pub fn ioctl(fd: usize, command: usize, argument: usize) -> Result { - handle.flags.write().insert(OpenFlags::O_CLOEXEC); + let flags = handle.flags(); + handle.set_flags(flags | OpenFlags::O_CLOEXEC); Ok(0) } FIONBIO => { - handle.flags.write().insert(OpenFlags::O_NONBLOCK); + let flags = handle.flags(); + handle.set_flags(flags | OpenFlags::O_NONBLOCK); Ok(0) } @@ -354,7 +355,7 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result scheduler::get_scheduler() .current_task() .file_table - .duplicate(fd, DuplicateHint::GreatorOrEqual(arg), *handle.flags.read()), + .duplicate(fd, DuplicateHint::GreatorOrEqual(arg), handle.flags()), aero_syscall::prelude::F_DUPFD_CLOEXEC => scheduler::get_scheduler() .current_task() @@ -362,12 +363,12 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result { - let flags = handle.flags.read(); + let flags = handle.flags(); let mut result = FdFlags::empty(); if flags.contains(OpenFlags::O_CLOEXEC) { @@ -379,7 +380,7 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result { - let mut flags = handle.flags.write(); + let mut flags = handle.flags(); let fd_flags = FdFlags::from_bits_truncate(arg); if fd_flags.contains(FdFlags::CLOEXEC) { @@ -388,19 +389,17 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result { - let flags = handle.flags.read().bits(); - Ok(flags) - } + aero_syscall::prelude::F_GETFL => Ok(handle.flags().bits()), aero_syscall::prelude::F_SETFL => { let flags = OpenFlags::from_bits_truncate(arg); - let old_flags = *handle.flags.read(); - *handle.flags.write() = (flags & SETFL_MASK) | (old_flags & !SETFL_MASK); + let old_flags = handle.flags(); + handle.set_flags((flags & SETFL_MASK) | (old_flags & !SETFL_MASK)); Ok(0) } diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index 4f864f20908..1e91ae7a8a5 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -1,3 +1,4 @@ +use aero_syscall::netlink::sockaddr_nl; use aero_syscall::socket::{MessageFlags, MessageHeader}; use aero_syscall::*; use alloc::sync::Arc; @@ -10,12 +11,14 @@ use crate::fs::inode::{DirEntry, INodeInterface}; use crate::mem::paging::VirtAddr; use crate::socket::ipv4::Ipv4Socket; +use crate::socket::netlink::NetLinkSocket; use crate::socket::tcp::TcpSocket; use crate::socket::udp::UdpSocket; use crate::socket::unix::*; use crate::socket::{SocketAddr, SocketAddrRef}; use crate::userland::scheduler; +use crate::userland::task::TaskId; /// Creates a [`SocketAddr`] from the provided userland socket structure address. This /// is done by looking at the family field present in every socket address structure. @@ -151,6 +154,8 @@ fn create_socket( } }, + AF_NETLINK => ("netlink", NetLinkSocket::new() as Arc), + _ => { log::warn!( "unsupported socket type: domain={domain}, socket_type={socket_type}, protocol={protocol:?}" @@ -159,6 +164,7 @@ fn create_socket( return Err(SyscallError::EINVAL); } }; + log::warn!("<{name}_socket> -EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"); let entry = DirEntry::from_inode(socket, alloc::format!("<{name}_socket>")); Ok(entry) @@ -171,7 +177,13 @@ pub fn socket(domain: usize, socket_type: usize, protocol: usize) -> Result Result unimplemented!("{:?}", peer), + SocketAddr::Unix(peer) => { + // let size = core::mem::size_of::() as u32; + // assert!(*len >= size); + + // let mut target = unsafe { UserRef::::new(VirtAddr::new(addr as u64)) + // }; *target = peer; + // *len = size; + return Err(SyscallError::ENOSYS); + } } Ok(0) @@ -242,6 +265,7 @@ pub fn get_sockname(fd: usize, addr: usize, len: &mut u32) -> Result { let size = core::mem::size_of::() as u32; @@ -251,6 +275,24 @@ pub fn get_sockname(fd: usize, addr: usize, len: &mut u32) -> Result { + let size = core::mem::size_of::() as u32; + assert!(*len >= size); + + let mut target = unsafe { UserRef::::new(VirtAddr::new(addr as u64)) }; + *target = name; + *len = size; + } + + SocketAddr::Unix(name) => { + let size = core::mem::size_of::() as u32; + assert!(*len >= size); + + let mut target = unsafe { UserRef::::new(VirtAddr::new(addr as u64)) }; + *target = name; + *len = size; + } } Ok(0) diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index c9272b551a6..3691ee879ac 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -139,6 +139,10 @@ impl Scheduler { }); } + pub fn for_each_task)>(&self, mut f: F) { + self.tasks.0.lock().iter().for_each(|(_, task)| f(task)); + } + /// Lookup a task by ID #[inline] pub fn find_task(&self, task_id: TaskId) -> Option> { diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index fe1f2e59375..a4d6d3d421a 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -124,6 +124,7 @@ impl RoundRobin { } else if let Some(task) = queue.dead.pop_front() { task.update_state(TaskState::Zombie); task.make_zombie(); + // TODO: assert strong count here } } diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index a2387ff7d22..2fa34574a1d 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -204,7 +204,7 @@ pub struct Task { sleep_duration: AtomicUsize, signals: Signals, - executable: Mutex>, + pub executable: Mutex>, pending_io: AtomicBool, pub(super) link: intrusive_collections::LinkedListLink, @@ -545,11 +545,47 @@ impl Task { pub(super) fn update_state(&self, state: TaskState) { if state == TaskState::Zombie { - self.file_table.0.read().iter().for_each(|file| { - if let Some(a) = file { - a.inode().close(*a.flags.read()); - } - }); + // [41] syscall/net.rs:178 (tid=33, pid=33) debug [aero_kernel/src/syscall/net.rs:178] + // current_task.file_table.open_file(entry, sockfd_flags) = Ok( 17, + // ) + // [41] syscall/process.rs:157 (tid=33, pid=33) debug mlibc: getsockopt() call with + // SOL_SOCKET and SO_TYPE is unimplemented, hardcoding SOCK_STREAM + // [41] syscall/process.rs:157 (tid=33, pid=33) debug mlibc: getsockopt() call with + // SOL_SOCKET and SO_KEEPALIVE is unimplemented, hardcoding 0 [41] syscall/ + // process.rs:157 (tid=33, pid=33) debug mlibc: setsockopt(SO_PASSCRED) is not + // implemented correctly [41] socket/netlink.rs:263 (tid=33, pid=33) warn + // netlink::send(flags=NOSIGNAL) [41] socket/netlink.rs:228 (tid=33, pid=33) + // debug [aero_kernel/src/socket/netlink.rs:228] message_hdr.iovecs_mut() = [ + // IoVec { + // base: 0x0000000000000000, + // len: 0, + // }, + // ] + // [42] syscall/process.rs:157 (tid=40, pid=40) debug mlibc: sys_setuid is a stub + // [42] syscall/process.rs:157 (tid=40, pid=40) debug In function mlock, file + // ../../../bundled/mlibc/options/posix/generic/sys-mman-stubs.cpp:22 + // __ensure(Library function fails due to missing sysdep) failed + // [42] syscall/process.rs:157 (tid=40, pid=40) debug mlibc: uselocale() is a no-op + // [42] syscall/process.rs:157 (tid=40, pid=40) debug mlibc: sys_setuid is a stub + // [42] syscall/process.rs:157 (tid=40, pid=40) debug mlibc: sys_seteuid is a stub + // [42] syscall/process.rs:157 (tid=40, pid=40) debug mlibc: sys_setgid is a stub + // [42] syscall/process.rs:157 (tid=40, pid=40) debug mlibc: sys_getegid is a stub + // [42] syscall/net.rs:178 (tid=40, pid=40) debug [aero_kernel/src/syscall/net.rs:178] + // current_task.file_table.open_file(entry, sockfd_flags) = Ok( 0, + // ) + // + // exit err 5 Input/output error + + // TODO: is_process_leader() && children.len() == 0 and then + // assert!(self.file_table.strong_count() == 1); + dbg!(Arc::strong_count(&self.file_table)); + if Arc::strong_count(&self.file_table) == 1 { + self.file_table.0.read().iter().for_each(|file| { + if let Some(handle) = file { + handle.inode().close(handle.flags()); + } + }); + } } // if state != TaskState::Runnable { diff --git a/src/aero_syscall/Cargo.toml b/src/aero_syscall/Cargo.toml index eab1f80e0aa..1aac85f20f0 100644 --- a/src/aero_syscall/Cargo.toml +++ b/src/aero_syscall/Cargo.toml @@ -9,3 +9,4 @@ bitflags = "1.2.1" num-derive = { version = "0.3", default-features = false } num-traits = { version = "0.2", default-features = false } byte_endian = { git = "https://github.com/aero-os/byte_endian" } +static_assertions = "1.1.0" diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 34699ab5764..58b5552d6e9 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -24,6 +24,7 @@ extern crate num_derive; pub mod consts; +pub mod netlink; pub mod signal; pub mod socket; pub mod syscall; diff --git a/src/aero_syscall/src/netlink.rs b/src/aero_syscall/src/netlink.rs new file mode 100644 index 00000000000..23e2029f0bc --- /dev/null +++ b/src/aero_syscall/src/netlink.rs @@ -0,0 +1,230 @@ +#![allow(non_camel_case_types)] + +use static_assertions::const_assert_eq; + +const NLMSG_ALIGNTO: u32 = 4; + +/// Aligns `len` to the netlink message alignment. +/// +/// **Note**: This function only rounds up. +pub const fn nlmsg_align(len: u32) -> u32 { + (len + NLMSG_ALIGNTO - 1) & !(NLMSG_ALIGNTO - 1) +} + +const RTA_ALIGNTO: u32 = 4; + +pub const fn rta_align(len: u32) -> u32 { + (len + RTA_ALIGNTO - 1) & !(RTA_ALIGNTO - 1) +} + +pub const fn rta_length(len: u32) -> u32 { + rta_align(core::mem::size_of::() as u32) + len +} + +#[derive(Debug, Copy, Clone, PartialEq)] +#[repr(u16)] +pub enum RtAttrType { + Unspec, + Dst, + Src, + Iif, + Oif, + Gateway, + Priority, + PrefSrc, + Metrics, + Multipath, + ProtoInfo, // no longer used + Flow, + CacheInfo, + Session, // no longer used + MpAlgo, // no longer used + Table, + // RtaMARK, + // RtaMFC_STATS, + // RtaVIA, + // RtaNEWDST, + // RtaPREF, + // RtaENCAP_TYPE, + // RtaENCAP, + // RtaEXPIRES, + // RtaPAD, + // RtaUID, + // RtaTTL_PROPAGATE, + // RtaIP_PROTO, + // RtaSPORT, + // RtaDPORT, + // RtaNH_ID, +} + +#[derive(Debug, Copy, Clone, PartialEq)] +#[repr(u16)] +pub enum MessageType { + Noop, + Error, + Done, // end of a dump + Overrun, // data lost + + // RTM + RtmNewLink = 16, + RtmDelLink, + RtmGetLink, + RtmSetLink, + RtmNewAddr, + RtmDelAddr, + RtmGetAddr, + RtmNewRoute = 24, + RtmDelRoute, + RtmGetRoute, + RtmNewNeigh = 28, + RtmDelNeigh, + RtmGetNeigh, + RtmNewRule = 32, + RtmDelRule, + RtmGetRule, + RtmNewQDisc = 36, + RtmDelQDisc, + RtmGetQDisc, + RtmNewTClass = 40, + RtmDelTClass, + RtmGetTClass, + RtmNewTFilter = 44, + RtmDelTFilter, + RtmGetTFilter, + RtmNewAction = 48, + RtmDelAction, + RtmGetAction, + RtmNewPrefix = 52, + RtmGetMulticast = 58, + RtmGetAnyCast = 62, + RtmNewNeighTbl = 64, + RtmGetNeighTbl = 66, + RtmSetNeighTbl = 67, + RtmNewNdUserOpt = 68, + RtmNewAddrLabel = 72, + RtmDelAddrLabel, + RtmGetAddrLabel, + RtmGetDcb = 78, + RtmSetDcb, + RtmNewNetConf = 80, + RtmDelNetConf, + RtmGetNetConf, + RtmNewMdb = 84, + RtmDelMdb, + RtmGetMdb, + RtmNewNsid = 88, + RtmDelNsid, + RtmGetNsid, + RtmNewStats = 92, + RtmGetStats = 94, + RtmSetStats = 95, + RtmNewCacheReport = 96, + RtmNewChain = 100, + RtmDelChain, + RtmGetChain, + RtmNewNextHop = 104, + RtmDelNextHop, + RtmGetNextHop, + RtmNewLinkProp = 108, + RtmDelLinkProp, + RtmGetLinkProp, + RtmNewVlan = 112, + RtmDelVlan, + RtmGetVlan, + RtmNewNextHopBucket = 116, + RtmDelNextHopBucket, + RtmGetNextHopBucket, + RtmNewTunnel = 120, + RtmDelTunnel, + RtmGetTunnel, + + Unknown = u16::MAX, +} + +bitflags::bitflags! { + #[repr(transparent)] + pub struct MessageFlags: u16 { + const REQUEST = 0x1; // It is a request message. + const MULTI = 0x2; // Multipart message, terminated by NLMSG_DONE. + const ACK = 0x4; // Reply with ack, with zero or error code. + const ECHO = 0x8; // Echo this request. + const DUMP_INTR = 0x10; // Dump was inconsistent due to sequence change. + const DUMP_FILTERED = 0x20; // Dump was filtered as requested. + + // Modifers to GET request. + const ROOT = 0x100; // specify tree root. + const MATCH = 0x200; // return all matching. + const ATOMIC = 0x400; // atomic GET. + const DUMP = MessageFlags::ROOT.bits() | MessageFlags::MATCH.bits(); + } +} + +#[derive(Debug)] +#[repr(C)] +pub struct sockaddr_nl { + pub nl_family: u32, // AF_NETLINK + pub nl_pad: u16, // zero + pub nl_pid: u32, // port ID + pub nl_groups: u32, // multicast groups mask +} + +impl super::SocketAddr for sockaddr_nl {} + +/// Fixed format metadata header of Netlink messages. +#[derive(Debug)] +#[repr(C)] +pub struct nlmsghdr { + /// Length of message including header. + pub nlmsg_len: u32, + /// Message content type. + pub nlmsg_type: MessageType, + // Additional flags. + pub nlmsg_flags: MessageFlags, + /// Sequence number. + pub nlmsg_seq: u32, + /// Sending process port ID. + pub nlmsg_pid: u32, +} + +const_assert_eq!(core::mem::size_of::(), 16); + +/// General form of address family dependent message. +#[derive(Debug)] +#[repr(C)] +pub struct rtgenmsg { + pub rtgen_family: u8, +} + +const_assert_eq!(core::mem::size_of::(), 1); + +#[repr(C)] +#[derive(Debug)] +pub struct rtmsg { + pub rtm_family: u8, + pub rtm_dst_len: u8, + pub rtm_src_len: u8, + pub rtm_tos: u8, + pub rtm_table: u8, + pub rtm_protocol: u8, + pub rtm_scope: u8, + pub rtm_type: u8, + pub rtm_flags: u32, +} + +const_assert_eq!(core::mem::size_of::(), 12); + +// FIXME(andypython): This should be an enum. +// +// Reserved table identifiers. +pub const RT_TABLE_UNSPEC: u8 = 0; +// User defined values. +pub const RT_TABLE_DEFAULT: u8 = 253; +pub const RT_TABLE_MAIN: u8 = 254; +pub const RT_TABLE_LOCAL: u8 = 255; + +// Generic structure for encapsulation of optional route information. It is reminiscent of sockaddr, +// but with sa_family replaced with attribute type. +pub struct rtattr { + pub rta_len: u16, + pub rta_type: RtAttrType, +} diff --git a/src/aero_syscall/src/socket.rs b/src/aero_syscall/src/socket.rs index cbe997300da..8e7022fec84 100644 --- a/src/aero_syscall/src/socket.rs +++ b/src/aero_syscall/src/socket.rs @@ -29,15 +29,15 @@ pub struct MessageHeader { /// Pointer to the socket address structure. name: *mut u8, /// Size of the socket address structure. - name_len: usize, + name_len: u32, iovec: *mut IoVec, // todo: use Option> iovec_len: i32, // todo: use ffi::c_int control: *const u8, - control_len: usize, + control_len: u32, - flags: i32, // todo: use ffi::c_int + pub flags: i32, // todo: use ffi::c_int } impl MessageHeader { @@ -46,7 +46,7 @@ impl MessageHeader { return None; } - assert!(self.name_len == core::mem::size_of::()); + assert!(self.name_len >= core::mem::size_of::() as u32); // SAFETY: We know that the `name` pointer is valid and we have an exclusive reference to // it. The size of name is checked above with the size of `T` and `T` is a `SocketAddr` so, @@ -67,7 +67,7 @@ impl MessageHeader { } // options/posix/include/bits/posix/iovec.h -#[derive(Debug)] +#[derive(Debug, Clone)] #[repr(C)] pub struct IoVec { base: *mut u8, // todo: use Option> diff --git a/userland/Cargo.lock b/userland/Cargo.lock index efee3926e62..a3b9233381b 100644 --- a/userland/Cargo.lock +++ b/userland/Cargo.lock @@ -21,6 +21,7 @@ dependencies = [ "byte_endian", "num-derive", "num-traits", + "static_assertions", ] [[package]] @@ -282,6 +283,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "syn" version = "1.0.107" From 48b92bbabfe2fb905baa2b96a2dce985d837c47a Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 20 Oct 2023 20:51:36 +1100 Subject: [PATCH 269/368] feat(open): make use of the provided dirfd Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/mod.rs | 10 ---------- src/aero_kernel/src/syscall/fs.rs | 18 +++++++++++++++--- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index 230b12a4532..d6f415aa526 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -291,16 +291,6 @@ pub fn lookup_path_with( Ok(cwd) } -pub fn lookup_path_with_mode(path: &Path, mode: LookupMode) -> Result { - let cwd = if !path.is_absolute() { - scheduler::get_scheduler().current_task().cwd_dirent() - } else { - root_dir().clone() - }; - - lookup_path_with(cwd, path, mode) -} - pub fn lookup_path(path: &Path) -> Result { let cwd = if !path.is_absolute() { scheduler::get_scheduler().current_task().cwd_dirent() diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 3677d7bdb91..024af8f6be2 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -17,7 +17,7 @@ use aero_syscall::prelude::*; use aero_syscall::signal::SigProcMask; -use aero_syscall::{OpenFlags, Stat, SyscallError, TimeSpec}; +use aero_syscall::{OpenFlags, Stat, SyscallError, TimeSpec, AT_FDCWD}; use crate::fs::cache::{self, DirCacheImpl}; use crate::fs::epoll::EPoll; @@ -70,7 +70,19 @@ pub fn read(fd: usize, buffer: &mut [u8]) -> Result { } #[syscall] -pub fn open(_fd: usize, path: &Path, mode: usize) -> Result { +pub fn open(fd: usize, path: &Path, mode: usize) -> Result { + let dir = match fd as isize { + AT_FDCWD => { + if !path.is_absolute() { + scheduler::get_scheduler().current_task().cwd_dirent() + } else { + crate::fs::root_dir().clone() + } + } + + _ => todo!(), + }; + let mut flags = OpenFlags::from_bits(mode).ok_or(SyscallError::EINVAL)?; if !flags.intersects(OpenFlags::O_RDONLY | OpenFlags::O_RDWR | OpenFlags::O_WRONLY) { @@ -83,7 +95,7 @@ pub fn open(_fd: usize, path: &Path, mode: usize) -> Result lookup_mode = LookupMode::Create; } - let inode = fs::lookup_path_with_mode(path, lookup_mode)?; + let inode = fs::lookup_path_with(dir, path, lookup_mode)?; if flags.contains(OpenFlags::O_DIRECTORY) && !inode.inode().metadata()?.is_directory() { return Err(SyscallError::ENOTDIR); From 4cd1ba48d50bdd3077dc8663e326e6a4d5d3e251 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 28 Oct 2023 13:16:07 +1100 Subject: [PATCH 270/368] stash Signed-off-by: Anhad Singh --- .gitignore | 3 + bootstrap/net.yml | 4 +- src/aero_kernel/src/main.rs | 3 +- src/aero_kernel/src/socket/unix.rs | 6 +- src/aero_kernel/src/syscall/mod.rs | 18 +++ src/aero_kernel/src/syscall/net.rs | 25 ++-- src/aero_kernel/src/unwind.rs | 23 ++++ src/aero_kernel/src/userland/task/mod.rs | 14 +++ src/aero_kernel/src/userland/vm.rs | 13 +++ src/aero_syscall/src/consts.rs | 1 + src/aero_syscall/src/lib.rs | 16 +++ tools/mkimage.sh | 13 +++ userland/tests/unix_sock.cc | 142 +++++++++++++++++++++++ 13 files changed, 264 insertions(+), 17 deletions(-) create mode 100644 userland/tests/unix_sock.cc diff --git a/.gitignore b/.gitignore index c75223baf8c..20b37a745f4 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ base-files/doom1.wad # Wayland test client and server executables: (todo: remove these) base-files/client base-files/server + +# todo: remove these +debug diff --git a/bootstrap/net.yml b/bootstrap/net.yml index fb8a47a2d2c..118868d86f5 100644 --- a/bootstrap/net.yml +++ b/bootstrap/net.yml @@ -724,10 +724,10 @@ packages: - '-DUSE_SOUP2=ON' - '-DUSE_LCMS=OFF' - '@THIS_SOURCE_DIR@' + environ: + CXXFLAGS: '-DLOG_DISABLED=0' build: - args: ['ninja', '-j6'] - # environ: - # CXXFLAGS: '-std=c++11' - args: ['ninja', 'install'] environ: DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 125db66fd92..4e32a73bf8f 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -48,7 +48,8 @@ trait_upcasting, // https://github.com/rust-lang/rust/issues/65991 naked_functions, // https://github.com/rust-lang/rust/issues/32408 cfg_match, // https://github.com/rust-lang/rust/issues/115585 - strict_provenance + strict_provenance, + offset_of )] // TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? // `lang_items` => is currently used for the personality function (`rust_eh_personality`). diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 3d0d0e64e90..063f8327d52 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -42,6 +42,7 @@ fn path_from_unix_sock(address: &SocketAddrUnix) -> fs::Result<&Path> { // connection which does not require a path to be created. let abstract_namespaced = address.path[0] == 0; assert!(!abstract_namespaced); + assert!(address.path[1] != 0, "unnamed UNIX socket"); let path_len = address .path @@ -351,6 +352,7 @@ impl INodeInterface for UnixSocket { let peer = queue.pop().expect("UnixSocket::accept(): backlog is empty"); let sock = Self::new(); + sock.inner.lock_irq().address = inner.address.clone(); { let mut sock_inner = sock.inner.lock_irq(); @@ -362,16 +364,18 @@ impl INodeInterface for UnixSocket { peer_data.state = UnixSocketState::Connected(sock.clone()); } + // THIS SHOULD NOT BE DONE HERE if let Some((address, length)) = address { let mut address = unsafe { UserRef::new(address) }; - if let Some(paddr) = peer.inner.lock_irq().address.as_ref() { + if let Some(paddr) = inner.address.as_ref() { *address = paddr.clone(); } else { *address = SocketAddrUnix::default(); address.family = AF_UNIX; } + // THIS IS WRONG use addr.name_len() + offset_of!(sockaddr_un, path) *length = core::mem::size_of::() as u32; } diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index db3ff553376..03eb64d8f1a 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -259,6 +259,8 @@ pub fn generic_do_syscall( // Syscall aliases (this should be handled in aero_syscall) SYS_MKDIR => fs::mkdirat(aero_syscall::AT_FDCWD as _, b, c), + SYS_DEBUG => tag_memory(b, c, d, e), + _ => { log::error!("invalid syscall: {:#x}", a); Err(SyscallError::ENOSYS) @@ -267,3 +269,19 @@ pub fn generic_do_syscall( aero_syscall::syscall_result_as_usize(result) } + +#[syscall] +pub fn tag_memory(ptr: *const u8, size: usize, tag: &str) -> Result { + use crate::userland::scheduler; + use alloc::string::ToString; + + let addr = ptr as usize; + + let thread = scheduler::current_thread(); + thread + .mem_tags + .lock() + .insert(addr..(addr + size), tag.to_string()); + + Ok(0) +} diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index 1e91ae7a8a5..ec2b8141eb6 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -178,12 +178,12 @@ pub fn socket(domain: usize, socket_type: usize, protocol: usize) -> Result Result unimplemented!("{:?}", peer), SocketAddr::Unix(peer) => { - // let size = core::mem::size_of::() as u32; - // assert!(*len >= size); + let size = core::mem::size_of::() as u32; + assert!(*len >= size); - // let mut target = unsafe { UserRef::::new(VirtAddr::new(addr as u64)) - // }; *target = peer; - // *len = size; - return Err(SyscallError::ENOSYS); + let mut target = unsafe { &mut *(addr as *mut SocketAddrUnix) }; + *len = peer.path_len() as u32 + core::mem::offset_of!(SocketAddrUnix, path) as u32; + *target = peer; } } @@ -290,8 +289,8 @@ pub fn get_sockname(fd: usize, addr: usize, len: &mut u32) -> Result= size); let mut target = unsafe { UserRef::::new(VirtAddr::new(addr as u64)) }; + *len = name.path_len() as u32 + core::mem::offset_of!(SocketAddrUnix, path) as u32; *target = name; - *len = size; } } diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index af3f49a7698..3416192d113 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -26,6 +26,7 @@ use xmas_elf::ElfFile; use crate::mem::paging::{Translate, VirtAddr}; use crate::mem::AddressSpace; +use crate::userland::scheduler; use crate::{logger, rendy}; use crate::arch::interrupts; @@ -145,6 +146,20 @@ pub fn unwind_stack_trace() { if let Some(name) = name { log::trace!("{:>2}: 0x{:016x} - {}", depth, rip, name); + } else if scheduler::is_initialized() { + if let Some((region, tag)) = scheduler::current_thread() + .mem_tags + .lock() + .iter() + .find(|(region, _tag)| region.contains(&rip)) + { + let resolved_addr = rip - region.start; + log::trace!( + "{depth:>2}: 0x{rip:016x} - " + ); + } else { + log::trace!("{depth:>2}: 0x{rip:016x} - "); + } } else { log::trace!("{:>2}: 0x{:016x} - ", depth, rip); } @@ -153,6 +168,14 @@ pub fn unwind_stack_trace() { break; } } + + let thread = scheduler::current_thread(); + let tags = thread.mem_tags.lock(); + let mut tags = tags.iter().collect::>(); + tags.sort_by(|x, y| x.0.start.cmp(&y.0.start)); + for (x, s) in tags.iter() { + log::trace!("{:#x}..{:#x} {s}", x.start, x.end); + } } #[cfg(feature = "ci")] diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 2fa34574a1d..95bc3125dbc 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -20,9 +20,11 @@ pub mod sessions; use aero_syscall::WaitPidFlags; use alloc::sync::{Arc, Weak}; +use hashbrown::HashMap; use spin::{Once, RwLock}; use core::cell::UnsafeCell; +use core::ops::Range; use core::sync::atomic::{AtomicBool, AtomicU8, AtomicUsize, Ordering}; use crate::fs::cache::{DirCacheImpl, DirCacheItem}; @@ -221,6 +223,9 @@ pub struct Task { controlling_terminal: Mutex>>, systrace: AtomicBool, + + // for debugging only. may remove in the future. + pub mem_tags: Mutex, String>>, } impl Task { @@ -265,6 +270,8 @@ impl Task { systrace: AtomicBool::new(false), controlling_terminal: Mutex::new(None), + + mem_tags: Mutex::new(HashMap::new()), }) } @@ -307,6 +314,8 @@ impl Task { systrace: AtomicBool::new(false), controlling_terminal: Mutex::new(None), + + mem_tags: Mutex::new(HashMap::new()), }) } @@ -345,6 +354,8 @@ impl Task { systrace: AtomicBool::new(self.systrace()), controlling_terminal: Mutex::new(self.controlling_terminal.lock_irq().clone()), + + mem_tags: Mutex::new(self.mem_tags.lock().clone()), }); self.add_child(this.clone()); @@ -413,6 +424,8 @@ impl Task { .lock_irq() .clone(), ), + + mem_tags: Mutex::new(self.mem_tags.lock().clone()), }); self.add_child(this.clone()); @@ -514,6 +527,7 @@ impl Task { *self.cwd.write() = Some(Cwd::new()) } + *self.mem_tags.lock() = HashMap::new(); self.file_table.close_on_exec(); self.file_table.log(); diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 1da5b1f0325..b3acbe53587 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -782,6 +782,8 @@ impl VmProtected { offset: usize, file: Option, ) -> Option { + let z = file.clone(); + // Offset is required to be a multiple of page size. if (offset as u64 & (Size4KiB::SIZE - 1)) != 0 { log::warn!("mmap: offset is not a multiple of page size"); @@ -864,6 +866,17 @@ impl VmProtected { if x.is_none() { log::warn!("mmap failed"); self.log(); + + dbg!( + address, + size, + protection, + flags, + offset, + z.map(|f| f.absolute_path_str()) + ); + + crate::unwind::unwind_stack_trace(); } x diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index cdffd395147..0b4aed56351 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -98,6 +98,7 @@ pub const SYS_GETPGID: usize = 74; pub const SYS_SOCK_SHUTDOWN: usize = 75; pub const SYS_GETPEERNAME: usize = 76; pub const SYS_GETSOCKNAME: usize = 77; +pub const SYS_DEBUG: usize = 78; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 58b5552d6e9..ac39331fbdf 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -529,6 +529,22 @@ pub struct SocketAddrUnix { pub path: [u8; 108], } +impl SocketAddrUnix { + pub fn path_len(&self) -> u8 { + if self.path[0] == 0 { + if self.path[1] == 0 { + // address is unnamed + return 0; + } else { + // abstract socket address + unimplemented!() + } + } + + (self.path.iter().position(|&c| c == 0).unwrap_or(108) as u8) + 1 + } +} + impl Default for SocketAddrUnix { fn default() -> Self { Self { diff --git a/tools/mkimage.sh b/tools/mkimage.sh index dbcb9dce484..79d5a761c9b 100755 --- a/tools/mkimage.sh +++ b/tools/mkimage.sh @@ -2,6 +2,19 @@ set -x -e +ANSI_CLEAR="\033[0m" +ANSI_YELLOW="\033[1;34m" + +function warn() { + echo -e "${ANSI_YELLOW}$1${ANSI_CLEAR}" +} + +# check if the pkg-build directory is not newer than the system-root +if [[ ./sysroot/pkg-build -nt ./sysroot/system-root]]; then + warn "mkimage: pkg-build is newer than system-root, run `xbstrap install --all`" + exit 1 +fi + # sync the sysroot echo "sysroot: syncing base-files" cp -r base-files/. sysroot/system-root/ diff --git a/userland/tests/unix_sock.cc b/userland/tests/unix_sock.cc new file mode 100644 index 00000000000..3730799bf48 --- /dev/null +++ b/userland/tests/unix_sock.cc @@ -0,0 +1,142 @@ +// test copied from managarm + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NAMED_PATH "/tmp/sockname" + +#define DEFINE_TEST(s, f) static test_case test_##s{#s, f}; + +struct abstract_test_case { +private: + static void register_case(abstract_test_case *tcp); + +public: + abstract_test_case(const char *name) : name_{name} { register_case(this); } + + abstract_test_case(const abstract_test_case &) = delete; + + virtual ~abstract_test_case() = default; + + abstract_test_case &operator=(const abstract_test_case &) = delete; + + const char *name() { return name_; } + + virtual void run() = 0; + +private: + const char *name_; +}; + +template struct test_case : abstract_test_case { + test_case(const char *name, F functor) + : abstract_test_case{name}, functor_{std::move(functor)} {} + + void run() override { functor_(); } + +private: + F functor_; +}; + +#define clean_errno() (errno == 0 ? "None" : strerror(errno)) + +#define log_error(M, ...) \ + fprintf(stderr, "[ERROR] %s:%d: errno: %s) " M "\n", __FILE__, __LINE__, \ + clean_errno(), ##__VA_ARGS__) + +#define assertf(A, M, ...) \ + if (!(A)) { \ + log_error(M, ##__VA_ARGS__); \ + assert(A); \ + } + +// clang-format off +DEFINE_TEST(unix_getname, ([] { + int server_fd = socket(AF_UNIX, SOCK_STREAM, 0); + if(server_fd == -1) + assert(!"server socket() failed"); + + struct sockaddr_un server_addr; + memset(&server_addr, 0, sizeof(struct sockaddr_un)); + server_addr.sun_family = AF_UNIX; + strncpy(server_addr.sun_path, NAMED_PATH, sizeof(server_addr.sun_path) - 1); + + if(bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un))) + assert(!"bind() failed"); + if(listen(server_fd, 50)) + assert(!"listen() failed"); + + pid_t child = fork(); + if(!child) { + int client_fd = socket(AF_UNIX, SOCK_STREAM, 0); + if(client_fd == -1) + assert(!"client socket() failed"); + if(connect(client_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un))) + assert(!"connect() to server failed"); + + char buf[1]; + if (recv(client_fd, buf, 1, 0) < 0) + assert(!"recv() failed"); + exit(0); + } else { + int peer_fd = accept(server_fd, nullptr, nullptr); + if(peer_fd == -1) + assert(!"accept() failed"); + + struct sockaddr_un peer_addr; + socklen_t peer_length = sizeof(struct sockaddr_un); + if(getsockname(server_fd, (struct sockaddr *)&peer_addr, &peer_length)) + assert(!"getsockname(server) failed"); + assert(peer_length == (offsetof(sockaddr_un, sun_path) + 14)); + assert(!strcmp(peer_addr.sun_path, NAMED_PATH)); + + memset(&peer_addr, 0, sizeof(struct sockaddr)); + peer_length = sizeof(struct sockaddr_un); + if(getsockname(peer_fd, (struct sockaddr *)&peer_addr, &peer_length)) + assert(!"getsockname(peer) failed"); + printf("peer_len=%d\n", peer_length); + printf("wanted=%d\n", offsetof(sockaddr_un, sun_path) + 14); + assert(peer_length == (offsetof(sockaddr_un, sun_path) + 14)); + assert(!strcmp(peer_addr.sun_path, NAMED_PATH)); + + memset(&peer_addr, 0, sizeof(struct sockaddr)); + peer_length = sizeof(struct sockaddr_un); + if(getpeername(peer_fd, (struct sockaddr *)&peer_addr, &peer_length)) + assert(!"getpeername(peer) failed"); + printf("peer_len=%d\n", peer_length); + printf("wanted=%d\n", offsetof(sockaddr_un, sun_path) ); + assert(peer_length == offsetof(sockaddr_un, sun_path)); + + char buf[1]{0}; + if (send(peer_fd, buf, 1, 0) < 0) + assert(!"send() failed"); + } + unlink(NAMED_PATH); +})); + +std::vector &test_case_ptrs() { + static std::vector singleton; + return singleton; +} + +void abstract_test_case::register_case(abstract_test_case *tcp) { + test_case_ptrs().push_back(tcp); +} + +int main() { + // Go through all tests and run them. + for(abstract_test_case *tcp : test_case_ptrs()) { + std::cout << "tests: Running " << tcp->name() << std::endl; + tcp->run(); + } +} \ No newline at end of file From 4a4b89923d7db431b18775a3fc4228b8a641b9ce Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 28 Oct 2023 13:55:58 +1100 Subject: [PATCH 271/368] misc(aero_proc): fix formatting Signed-off-by: Anhad Singh --- src/aero_proc/src/syscall.rs | 89 ++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 50 deletions(-) diff --git a/src/aero_proc/src/syscall.rs b/src/aero_proc/src/syscall.rs index cbd5089c522..876caaf81de 100644 --- a/src/aero_proc/src/syscall.rs +++ b/src/aero_proc/src/syscall.rs @@ -277,63 +277,52 @@ fn process_call_args(args: &Punctuated) -> Vec { match arg_type { ArgType::Slice(is_mut) => { let slice_expr: Expr = if is_mut { - syn::parse_quote! { - crate::utils::validate_slice_mut(#data_ident as *mut _, #len_ident)? - } + syn::parse_quote!(crate::utils::validate_slice_mut(#data_ident as *mut _, #len_ident)?) } else { - syn::parse_quote! { - crate::utils::validate_slice(#data_ident as *const _, #len_ident)? - } + syn::parse_quote!(crate::utils::validate_slice(#data_ident as *const _, #len_ident)?) }; result.push(slice_expr); } - + ArgType::Array(is_mut) => { let array_expr: Expr = if is_mut { - syn::parse_quote! { - crate::utils::validate_array_mut(#data_ident as *mut _)? - } - } else { - unimplemented!() - }; - - result.push(array_expr); - } - - ArgType::Pointer(is_mut) => { - let ptr_expr: Expr = if is_mut { - syn::parse_quote!(#ident as *mut _) - } else { - syn::parse_quote!(#ident as *const _) - }; - - result.push(ptr_expr); - } - ArgType::Reference(is_mut) => { - let ref_expr: Expr = if is_mut { - syn::parse_quote!({ - crate::utils::validate_mut_ptr(#ident as *mut _)? - }) - } else { - syn::parse_quote!({ - crate::utils::validate_ptr(#ident as *const _)? - }) - }; - - result.push(ref_expr); - } - ArgType::String => result.push(syn::parse_quote! { - crate::utils::validate_str(#data_ident as *const _, #len_ident)? - }), - ArgType::Path => result.push(syn::parse_quote! { - { - let string = crate::utils::validate_str(#data_ident as *const _, #len_ident)?; - let path = Path::new(string); - path - } - }), - } + syn::parse_quote!(crate::utils::validate_array_mut(#data_ident as *mut _)?) + } else { + unimplemented!() + }; + + result.push(array_expr); + } + + ArgType::Pointer(is_mut) => { + let ptr_expr: Expr = if is_mut { + syn::parse_quote!(#ident as *mut _) + } else { + syn::parse_quote!(#ident as *const _) + }; + + result.push(ptr_expr); + } + + ArgType::Reference(is_mut) => { + let ref_expr: Expr = if is_mut { + syn::parse_quote!(crate::utils::validate_mut_ptr(#ident as *mut _)?) + } else { + syn::parse_quote!(crate::utils::validate_ptr(#ident as *const _)?) + }; + + result.push(ref_expr); + } + + ArgType::String => result.push(syn::parse_quote!(crate::utils::validate_str(#data_ident as *const _, #len_ident)?)), + ArgType::Path => { + result.push(syn::parse_quote!({ + let string = crate::utils::validate_str(#data_ident as *const _, #len_ident)?; + Path::new(string) + })) + } + } } else { result.push(syn::parse_quote!(#ident)); } From 1d7b17106b969f522444947da3d56660b25e10e4 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 28 Oct 2023 14:34:05 +1100 Subject: [PATCH 272/368] feat(syscall): cleanup fd handling Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/ext2/mod.rs | 13 +- src/aero_kernel/src/socket/mod.rs | 4 +- src/aero_kernel/src/syscall/fs.rs | 170 ++++++++++----------- src/aero_kernel/src/syscall/mod.rs | 11 ++ src/aero_kernel/src/syscall/net.rs | 38 ++--- src/aero_kernel/src/syscall/process.rs | 58 ++++--- src/aero_proc/src/syscall.rs | 7 +- src/aero_syscall/src/lib.rs | 14 +- userland/servers/system_server/src/main.rs | 2 +- 9 files changed, 156 insertions(+), 161 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 2c0a22ae82e..01326f34f6a 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -477,8 +477,17 @@ impl INodeInterface for INode { Ok(()) } - fn truncate(&self, _size: usize) -> super::Result<()> { - log::warn!("ext2::truncate is a stub!"); + fn truncate(&self, size: usize) -> super::Result<()> { + let inode = self.inode.read(); + + if inode.size() > size { + // grow inode + log::warn!("ext2::truncate(at=grow) is a stub!"); + } else if inode.size() < size { + log::warn!("ext2::truncate(at=shrink) is a stub!"); + // shrink inode + } + Ok(()) } diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index 2d7a9903de4..1cb73d4c53f 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -44,7 +44,7 @@ pub enum SocketAddrRef<'a> { } impl<'a> SocketAddrRef<'a> { - pub fn from_family(address: VirtAddr, family: u32) -> Result { + pub fn from_family(address: VirtAddr, family: u32) -> Result { match family { AF_UNIX => Ok(SocketAddrRef::Unix(address.read_mut::()?)), AF_INET => Ok(SocketAddrRef::INet(address.read_mut::()?)), @@ -54,7 +54,7 @@ impl<'a> SocketAddrRef<'a> { } } - pub fn from_ifreq(ifreq: &IfReq) -> Result { + pub fn from_ifreq(ifreq: &IfReq) -> Result { // SAFETY??? let family = unsafe { ifreq.data.addr.sa_family }; SocketAddrRef::from_family( diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 024af8f6be2..3eb0e3ec295 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -15,14 +15,17 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use core::fmt; + use aero_syscall::prelude::*; use aero_syscall::signal::SigProcMask; use aero_syscall::{OpenFlags, Stat, SyscallError, TimeSpec, AT_FDCWD}; +use alloc::sync::Arc; use crate::fs::cache::{self, DirCacheImpl}; use crate::fs::epoll::EPoll; use crate::fs::eventfd::EventFd; -use crate::fs::file_table::DuplicateHint; +use crate::fs::file_table::{DuplicateHint, FileHandle}; use crate::fs::inode::{DirEntry, PollTable}; use crate::fs::pipe::Pipe; use crate::fs::{self, lookup_path, LookupMode}; @@ -30,40 +33,68 @@ use crate::userland::scheduler; use crate::fs::Path; -#[syscall] -pub fn write(fd: usize, buffer: &[u8]) -> Result { - let handle = scheduler::get_scheduler() - .current_task() - .file_table - .get_handle(fd) - .ok_or(SyscallError::EBADFD)?; +#[derive(Debug, Copy, Clone)] +pub struct FileDescriptor(usize); + +impl FileDescriptor { + /// Returns the file handle associated with this file descriptor. + /// + /// ## Errors + /// * `EBADFD`: The file descriptor is not a valid open file descriptor. + pub fn handle(&self) -> aero_syscall::Result> { + scheduler::current_thread() + .file_table + .get_handle(self.0) + .ok_or(SyscallError::EBADFD) + } +} + +impl fmt::Display for FileDescriptor { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + if let Ok(file_handle) = self.handle() { + let path = file_handle.inode.absolute_path_str(); + write!(f, "{{ {} -> {} }}", self.0, path) + } else { + // invalid file descriptor + write!(f, "{{ {} -> INVALID }}", self.0) + } + } +} +impl super::SysArg for FileDescriptor { + fn from_usize(value: usize) -> Self { + Self(value) + } +} + +impl Into for FileDescriptor { + fn into(self) -> usize { + self.0 + } +} + +#[syscall] +pub fn write(fd: FileDescriptor, buffer: &[u8]) -> Result { // FIXME(heck for xeyes): fnctl should update the open flags! // // if handle // .flags // .intersects(OpenFlags::O_WRONLY | OpenFlags::O_RDWR) // { - Ok(handle.write(buffer)?) + Ok(fd.handle()?.write(buffer)?) // } else { // Err(SyscallError::EACCES) // } } #[syscall] -pub fn read(fd: usize, buffer: &mut [u8]) -> Result { - let handle = scheduler::get_scheduler() - .current_task() - .file_table - .get_handle(fd) - .ok_or(SyscallError::EBADFD)?; - +pub fn read(fd: FileDescriptor, buffer: &mut [u8]) -> Result { // if handle // .flags // .read() // .intersects(OpenFlags::O_RDONLY | OpenFlags::O_RDWR) // { - Ok(handle.read(buffer)?) + Ok(fd.handle()?.read(buffer)?) // } else { // Err(SyscallError::EACCES) // } @@ -111,42 +142,37 @@ pub fn open(fd: usize, path: &Path, mode: usize) -> Result } #[syscall] -pub fn dup(fd: usize, flags: usize) -> Result { +pub fn dup(fd: FileDescriptor, flags: usize) -> Result { let task = scheduler::get_scheduler().current_task(); let flags = OpenFlags::from_bits(flags).ok_or(SyscallError::EINVAL)? & OpenFlags::O_CLOEXEC; - task.file_table.duplicate(fd, DuplicateHint::Any, flags) + task.file_table + .duplicate(fd.into(), DuplicateHint::Any, flags) } #[syscall] -pub fn dup2(fd: usize, new_fd: usize, flags: usize) -> Result { +pub fn dup2(fd: FileDescriptor, new_fd: usize, flags: usize) -> Result { let task = scheduler::get_scheduler().current_task(); let flags = OpenFlags::from_bits(flags).ok_or(SyscallError::EINVAL)? & OpenFlags::O_CLOEXEC; task.file_table - .duplicate(fd, DuplicateHint::Exact(new_fd), flags) + .duplicate(fd.into(), DuplicateHint::Exact(new_fd), flags) } #[syscall] -pub fn getdents(fd: usize, buffer: &mut [u8]) -> Result { - let handle = scheduler::get_scheduler() - .current_task() - .file_table - .get_handle(fd) - .ok_or(SyscallError::EBADFD)?; - - Ok(handle.get_dents(buffer)?) +pub fn getdents(fd: FileDescriptor, buffer: &mut [u8]) -> Result { + Ok(fd.handle()?.get_dents(buffer)?) } #[syscall] -pub fn close(fd: usize) -> Result { +pub fn close(fd: FileDescriptor) -> Result { let res = scheduler::get_scheduler() .current_task() .file_table - .close_file(fd); + .close_file(fd.into()); if res { - Ok(0x00) + Ok(0) } else { // FD isn't a valid open file descriptor. Err(SyscallError::EBADFD) @@ -163,7 +189,7 @@ pub fn chdir(path: &str) -> Result { } scheduler::get_scheduler().current_task().set_cwd(inode); - Ok(0x00) + Ok(0) } #[syscall] @@ -234,12 +260,8 @@ pub fn getcwd(buffer: &mut [u8]) -> Result { } #[syscall] -pub fn ioctl(fd: usize, command: usize, argument: usize) -> Result { - let handle = scheduler::get_scheduler() - .current_task() - .file_table - .get_handle(fd) - .ok_or(SyscallError::EBADFD)?; +pub fn ioctl(fd: FileDescriptor, command: usize, argument: usize) -> Result { + let handle = fd.handle()?; match command { // Sets the close-on-exec file descriptor flag. This is equivalent @@ -262,13 +284,8 @@ pub fn ioctl(fd: usize, command: usize, argument: usize) -> Result Result { - let handle = scheduler::get_scheduler() - .current_task() - .file_table - .get_handle(fd) - .ok_or(SyscallError::EBADFD)?; - +pub fn seek(fd: FileDescriptor, offset: usize, whence: usize) -> Result { + let handle = fd.handle()?; Ok(handle.seek(offset as isize, aero_syscall::SeekWhence::from(whence))?) } @@ -347,12 +364,8 @@ const SETFL_MASK: OpenFlags = OpenFlags::from_bits_truncate( ); #[syscall] -pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result { - let handle = scheduler::get_scheduler() - .current_task() - .file_table - .get_handle(fd) - .ok_or(SyscallError::EBADFD)?; +pub fn fcntl(fd: FileDescriptor, command: usize, arg: usize) -> Result { + let handle = fd.handle()?; match command { // F_DUPFD_CLOEXEC and F_DUPFD: @@ -364,19 +377,17 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result scheduler::get_scheduler() - .current_task() - .file_table - .duplicate(fd, DuplicateHint::GreatorOrEqual(arg), handle.flags()), - - aero_syscall::prelude::F_DUPFD_CLOEXEC => scheduler::get_scheduler() - .current_task() - .file_table - .duplicate( - fd, - DuplicateHint::GreatorOrEqual(arg), - handle.flags() | OpenFlags::O_CLOEXEC, - ), + aero_syscall::prelude::F_DUPFD => scheduler::current_thread().file_table.duplicate( + fd.into(), + DuplicateHint::GreatorOrEqual(arg), + handle.flags(), + ), + + aero_syscall::prelude::F_DUPFD_CLOEXEC => scheduler::current_thread().file_table.duplicate( + fd.into(), + DuplicateHint::GreatorOrEqual(arg), + handle.flags() | OpenFlags::O_CLOEXEC, + ), // Get the value of file descriptor flags. aero_syscall::prelude::F_GETFD => { @@ -429,24 +440,15 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result Result { - let file = scheduler::get_scheduler() - .current_task() - .file_table - .get_handle(fd) - .ok_or(SyscallError::EBADFD)?; - - *stat = file.inode().stat()?; - +pub fn fstat(fd: FileDescriptor, stat: &mut Stat) -> Result { + *stat = fd.handle()?.inode().stat()?; Ok(0) } #[syscall] pub fn stat(path: &Path, stat: &mut Stat) -> Result { let file = fs::lookup_path(path)?; - *stat = file.inode().stat()?; - Ok(0) } @@ -480,16 +482,12 @@ pub fn epoll_create(flags: usize) -> Result { /// the operation be performed for the target file descriptor. #[syscall] pub fn epoll_ctl( - epfd: usize, + epfd: FileDescriptor, mode: usize, fd: usize, event: &mut EPollEvent, ) -> Result { - let epfd = scheduler::get_scheduler() - .current_task() - .file_table - .get_handle(epfd) - .ok_or(SyscallError::EBADFD)?; + let epfd = epfd.handle()?; let epoll = epfd .inode() @@ -518,7 +516,7 @@ pub fn epoll_ctl( #[syscall] pub fn epoll_pwait( - epfd: usize, + epfd: FileDescriptor, event: &mut [EPollEvent], timeout: usize, sigmask: usize, @@ -528,11 +526,7 @@ pub fn epoll_pwait( let current_task = scheduler::get_scheduler().current_task(); let signals = current_task.signals(); - let epfd = current_task - .file_table - .get_handle(epfd) - .ok_or(SyscallError::EBADFD)?; - + let epfd = epfd.handle()?; let epfd = epfd .inode() .downcast_arc::() diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 03eb64d8f1a..7a3acd29ffa 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -17,6 +17,7 @@ //! System Calls are used to call a kernel service from userland. +use core::fmt::Display; use core::mem::MaybeUninit; use aero_syscall::prelude::*; @@ -98,6 +99,16 @@ pub fn exec_args_from_slice(args: usize, size: usize) -> ExecArgs { ExecArgs { inner: result } } +pub trait SysArg: Display { + fn from_usize(value: usize) -> Self; +} + +impl SysArg for usize { + fn from_usize(value: usize) -> Self { + value + } +} + pub(super) struct SysLog { name: &'static str, /// The result of the syscall. diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index ec2b8141eb6..35353225fe0 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -22,13 +22,13 @@ use crate::userland::task::TaskId; /// Creates a [`SocketAddr`] from the provided userland socket structure address. This /// is done by looking at the family field present in every socket address structure. -fn socket_addr_from_addr<'sys>(address: VirtAddr) -> Result, SyscallError> { +fn socket_addr_from_addr<'sys>(address: VirtAddr) -> Result> { let family = *address.read_mut::()?; SocketAddrRef::from_family(address, family) } #[syscall] -pub fn shutdown(fd: usize, how: usize) -> Result { +pub fn shutdown(fd: usize, how: usize) -> Result { let file_table = &scheduler::get_scheduler().current_task().file_table; let socket = file_table.get_handle(fd).ok_or(SyscallError::EINVAL)?; @@ -38,7 +38,7 @@ pub fn shutdown(fd: usize, how: usize) -> Result { /// Connects the socket to the specified address. #[syscall] -pub fn connect(fd: usize, address: usize, length: usize) -> Result { +pub fn connect(fd: usize, address: usize, length: usize) -> Result { let address = socket_addr_from_addr(VirtAddr::new(address as u64))?; let file = scheduler::get_scheduler() .current_task() @@ -52,7 +52,7 @@ pub fn connect(fd: usize, address: usize, length: usize) -> Result Result { +pub fn accept(fd: usize, address: usize, length: usize) -> Result { let file_table = scheduler::get_scheduler().current_task().file_table.clone(); let socket = file_table.get_handle(fd).ok_or(SyscallError::EINVAL)?; @@ -75,11 +75,7 @@ pub fn accept(fd: usize, address: usize, length: usize) -> Result Result { +pub fn sock_send(fd: usize, header: &mut MessageHeader, flags: usize) -> Result { let flags = MessageFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; let current_task = scheduler::get_scheduler().current_task(); @@ -92,11 +88,7 @@ pub fn sock_send( } #[syscall] -pub fn sock_recv( - sockfd: usize, - header: &mut MessageHeader, - flags: usize, -) -> Result { +pub fn sock_recv(sockfd: usize, header: &mut MessageHeader, flags: usize) -> Result { let flags = MessageFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; let current_task = scheduler::get_scheduler().current_task(); @@ -111,7 +103,7 @@ pub fn sock_recv( /// Marks the socket as a passive socket (i.e. as a socket that will be used to accept incoming /// connection requests). #[syscall] -pub fn listen(fd: usize, backlog: usize) -> Result { +pub fn listen(fd: usize, backlog: usize) -> Result { let file = scheduler::get_scheduler() .current_task() .file_table @@ -122,11 +114,7 @@ pub fn listen(fd: usize, backlog: usize) -> Result { Ok(0) } -fn create_socket( - domain: usize, - socket_type: usize, - protocol: usize, -) -> Result { +fn create_socket(domain: usize, socket_type: usize, protocol: usize) -> Result { let typ = SocketType::from_usize(socket_type & 0b1111).ok_or(SyscallError::EINVAL)?; let protocol = IpProtocol::from_usize(protocol).ok_or(SyscallError::EINVAL)?; @@ -171,7 +159,7 @@ fn create_socket( } #[syscall] -pub fn socket(domain: usize, socket_type: usize, protocol: usize) -> Result { +pub fn socket(domain: usize, socket_type: usize, protocol: usize) -> Result { let entry = create_socket(domain, socket_type, protocol)?; let current_task = scheduler::get_scheduler().current_task(); @@ -189,7 +177,7 @@ pub fn socket(domain: usize, socket_type: usize, protocol: usize) -> Result Result { +pub fn bind(fd: usize, address: usize, length: usize) -> Result { let address = socket_addr_from_addr(VirtAddr::new(address as u64))?; let current_task = scheduler::get_scheduler().current_task(); @@ -211,7 +199,7 @@ pub fn bind(fd: usize, address: usize, length: usize) -> Result Result { +pub fn get_peername(fd: usize, addr: usize, len: &mut u32) -> Result { let thread = scheduler::current_thread(); let file = thread .file_table @@ -250,7 +238,7 @@ pub fn get_peername(fd: usize, addr: usize, len: &mut u32) -> Result Result { +pub fn get_sockname(fd: usize, addr: usize, len: &mut u32) -> Result { let thread = scheduler::current_thread(); let file = thread .file_table @@ -307,7 +295,7 @@ pub fn socket_pair( type_and_flags: usize, protocol: usize, fds: &mut [i32; 2], -) -> Result { +) -> Result { let current_task = scheduler::get_scheduler().current_task(); let sockfd_flags = SocketFlags::from_bits_truncate(type_and_flags).into(); diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index 826c8667dd1..c943d437c78 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -38,7 +38,7 @@ fn hostname() -> &'static Mutex { } #[syscall(no_return)] -pub fn exit(status: usize) -> Result { +pub fn exit(status: usize) -> Result { #[cfg(all(test, feature = "ci"))] crate::emu::exit_qemu(crate::emu::ExitStatus::Success); @@ -56,7 +56,7 @@ pub fn exit(status: usize) -> Result { } #[syscall] -pub fn uname(buffer: &mut Utsname) -> Result { +pub fn uname(buffer: &mut Utsname) -> Result { fn init_array(fixed: &mut [u8; 65], init: &'static str) { let init_bytes = init.as_bytes(); let len = init.len(); @@ -83,7 +83,7 @@ pub fn uname(buffer: &mut Utsname) -> Result { } #[syscall] -pub fn fork() -> Result { +pub fn fork() -> Result { let scheduler = scheduler::get_scheduler(); let forked = scheduler.current_task().fork(); @@ -92,7 +92,7 @@ pub fn fork() -> Result { } #[syscall] -pub fn clone(entry: usize, stack: usize) -> Result { +pub fn clone(entry: usize, stack: usize) -> Result { let scheduler = scheduler::get_scheduler(); let cloned = scheduler.current_task().clone_process(entry, stack); @@ -101,7 +101,7 @@ pub fn clone(entry: usize, stack: usize) -> Result { } #[syscall] -pub fn kill(pid: usize, signal: usize) -> Result { +pub fn kill(pid: usize, signal: usize) -> Result { // If pid is positive, then signal is sent to the process with that pid. if pid > 0 { crate::unwind::unwind_stack_trace(); @@ -118,13 +118,7 @@ pub fn kill(pid: usize, signal: usize) -> Result { } #[syscall(no_return)] -pub fn exec( - path: &Path, - args: usize, - argc: usize, - envs: usize, - envc: usize, -) -> Result { +pub fn exec(path: &Path, args: usize, argc: usize, envs: usize, envc: usize) -> Result { let executable = fs::lookup_path(path)?; if executable.inode().metadata()?.is_directory() { @@ -153,14 +147,14 @@ pub fn exec( } #[syscall] -pub fn log(msg: &str) -> Result { +pub fn log(msg: &str) -> Result { log::debug!("{}", msg); Ok(0x00) } #[syscall] -pub fn waitpid(pid: usize, status: &mut u32, flags: usize) -> Result { +pub fn waitpid(pid: usize, status: &mut u32, flags: usize) -> Result { let flags = WaitPidFlags::from_bits_truncate(flags); let current_task = scheduler::get_scheduler().current_task(); @@ -175,7 +169,7 @@ pub fn mmap( flags: usize, fd: usize, offset: usize, -) -> Result { +) -> Result { let address = VirtAddr::new(address as u64); let protection = MMapProt::from_bits(protection).ok_or(SyscallError::EINVAL)?; let flags = MMapFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; @@ -205,7 +199,7 @@ pub fn mmap( } #[syscall] -pub fn munmap(address: usize, size: usize) -> Result { +pub fn munmap(address: usize, size: usize) -> Result { let address = VirtAddr::new(address as u64); if scheduler::get_scheduler() @@ -220,7 +214,7 @@ pub fn munmap(address: usize, size: usize) -> Result { } #[syscall] -pub fn mprotect(ptr: usize, size: usize, prot: usize) -> Result { +pub fn mprotect(ptr: usize, size: usize, prot: usize) -> Result { let ptr = VirtAddr::new(ptr as _); let prot = MMapProt::from_bits(prot).ok_or(SyscallError::EINVAL)?; @@ -231,7 +225,7 @@ pub fn mprotect(ptr: usize, size: usize, prot: usize) -> Result Result { +pub fn backtrace() -> Result { crate::unwind::unwind_stack_trace(); Ok(0) } @@ -241,18 +235,18 @@ pub fn backtrace() -> Result { /// When the tracer is enabled for a process, it also applies to any child processes spawned by the /// process. #[syscall] -pub fn trace() -> Result { +pub fn trace() -> Result { scheduler::get_scheduler().current_task().enable_systrace(); Ok(0) } #[syscall] -pub fn getpid() -> Result { +pub fn getpid() -> Result { Ok(scheduler::get_scheduler().current_task().pid().as_usize()) } #[syscall] -pub fn getppid() -> Result { +pub fn getppid() -> Result { Ok(scheduler::get_scheduler() .current_task() .parent_pid() @@ -260,12 +254,12 @@ pub fn getppid() -> Result { } #[syscall] -pub fn gettid() -> Result { +pub fn gettid() -> Result { Ok(scheduler::get_scheduler().current_task().tid().as_usize()) } #[syscall] -pub fn gethostname(buffer: &mut [u8]) -> Result { +pub fn gethostname(buffer: &mut [u8]) -> Result { let hostname = hostname().lock(); let bytes = hostname.as_bytes(); @@ -279,14 +273,14 @@ pub fn gethostname(buffer: &mut [u8]) -> Result { } #[syscall] -pub fn info(struc: &mut SysInfo) -> Result { +pub fn info(struc: &mut SysInfo) -> Result { struc.uptime = crate::arch::time::get_uptime_ticks() as i64; Ok(0x00) } #[syscall] -pub fn sethostname(name: &[u8]) -> Result { +pub fn sethostname(name: &[u8]) -> Result { match core::str::from_utf8(name) { Ok(name) => { *hostname().lock() = name.into(); @@ -298,7 +292,7 @@ pub fn sethostname(name: &[u8]) -> Result { } #[syscall] -pub fn sigprocmask(how: usize, set: *const u64, old_set: *mut u64) -> Result { +pub fn sigprocmask(how: usize, set: *const u64, old_set: *mut u64) -> Result { let set = if set.is_null() { None } else { @@ -327,7 +321,7 @@ pub fn sigaction( sigact: *mut SigAction, sigreturn: usize, old: *mut SigAction, -) -> Result { +) -> Result { let new = if sigact.is_null() { None } else { @@ -356,7 +350,7 @@ pub fn sigaction( } #[syscall(no_return)] -pub fn shutdown() -> Result { +pub fn shutdown() -> Result { fs::cache::dcache().log(); fs::cache::clear_inode_cache(); @@ -368,7 +362,7 @@ pub fn shutdown() -> Result { unreachable!("aml: failed to shutdown (enter state S5)") } -fn find_task_by_pid(pid: usize) -> Result, SyscallError> { +fn find_task_by_pid(pid: usize) -> Result> { let current_task = scheduler::get_scheduler().current_task(); // If `pid` is 0, the process ID of the calling process is used. @@ -382,7 +376,7 @@ fn find_task_by_pid(pid: usize) -> Result, SyscallError> { } #[syscall] -pub fn getpgid(pid: usize) -> Result { +pub fn getpgid(pid: usize) -> Result { let task = find_task_by_pid(pid)?; let group = SESSIONS.find_group(task).unwrap(); @@ -390,7 +384,7 @@ pub fn getpgid(pid: usize) -> Result { } #[syscall] -pub fn setpgid(pid: usize, pgid: usize) -> Result { +pub fn setpgid(pid: usize, pgid: usize) -> Result { let current_task = scheduler::get_scheduler().current_task(); let task = find_task_by_pid(pid)?; @@ -416,7 +410,7 @@ pub fn setpgid(pid: usize, pgid: usize) -> Result { } #[syscall] -pub fn setsid() -> Result { +pub fn setsid() -> Result { let current_task = scheduler::get_scheduler().current_task(); if current_task.is_group_leader() { return Err(SyscallError::EPERM); diff --git a/src/aero_proc/src/syscall.rs b/src/aero_proc/src/syscall.rs index 876caaf81de..935c48b6488 100644 --- a/src/aero_proc/src/syscall.rs +++ b/src/aero_proc/src/syscall.rs @@ -234,12 +234,9 @@ fn process_args(args: &Punctuated) -> Vec { result.push(syn::parse_quote!(#data: usize)); } - Some(ArgType::Pointer(_)) | Some(ArgType::Reference(_)) => { + _ => { result.push(syn::parse_quote!(#(#attrs)* #ident: usize)); } - None => { - result.push(syn::parse_quote!(#(#attrs)* #ident: #typ)); - } }; } _ => { @@ -324,7 +321,7 @@ fn process_call_args(args: &Punctuated) -> Vec { } } } else { - result.push(syn::parse_quote!(#ident)); + result.push(syn::parse_quote!(crate::syscall::SysArg::from_usize(#ident))); } } } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index ac39331fbdf..d7b20a878f6 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -30,6 +30,8 @@ pub mod socket; pub mod syscall; pub mod time; +pub type Result = core::result::Result; + use byte_endian::BigEndian; pub use crate::syscall::*; @@ -466,7 +468,7 @@ pub struct SysInfo { pub _f: [i8; 0], } -pub fn syscall_result_as_usize(result: Result) -> usize { +pub fn syscall_result_as_usize(result: Result) -> usize { match result { Ok(value) => value as _, Err(error) => -(error as isize) as _, @@ -475,7 +477,7 @@ pub fn syscall_result_as_usize(result: Result) -> usize { /// Inner helper function that converts the syscall result value into the /// Rust [`Result`] type. -pub fn isize_as_syscall_result(value: isize) -> Result { +pub fn isize_as_syscall_result(value: isize) -> Result { if value >= 0 { Ok(value as usize) } else { @@ -484,7 +486,7 @@ pub fn isize_as_syscall_result(value: isize) -> Result { } } -pub fn sys_ipc_send(pid: usize, message: &[u8]) -> Result<(), SyscallError> { +pub fn sys_ipc_send(pid: usize, message: &[u8]) -> Result<()> { let value = syscall3( prelude::SYS_IPC_SEND, pid, @@ -498,7 +500,7 @@ pub fn sys_ipc_recv<'a>( pid: &mut usize, message: &'a mut [u8], block: bool, -) -> Result<&'a mut [u8], SyscallError> { +) -> Result<&'a mut [u8]> { let value = syscall4( prelude::SYS_IPC_RECV, pid as *mut usize as usize, @@ -509,12 +511,12 @@ pub fn sys_ipc_recv<'a>( isize_as_syscall_result(value as _).map(|size| &mut message[0..size]) } -pub fn sys_ipc_discover_root() -> Result { +pub fn sys_ipc_discover_root() -> Result { let value = syscall0(prelude::SYS_IPC_DISCOVER_ROOT); isize_as_syscall_result(value as _) } -pub fn sys_ipc_become_root() -> Result<(), SyscallError> { +pub fn sys_ipc_become_root() -> Result<()> { let value = syscall0(prelude::SYS_IPC_BECOME_ROOT); isize_as_syscall_result(value as _).map(|_| ()) } diff --git a/userland/servers/system_server/src/main.rs b/userland/servers/system_server/src/main.rs index b0a24cf5d94..4f300419c33 100644 --- a/userland/servers/system_server/src/main.rs +++ b/userland/servers/system_server/src/main.rs @@ -24,7 +24,7 @@ use hashbrown::hash_map::Entry; use hashbrown::HashMap; use spin::RwLock; -fn main() -> Result<(), Box> { +fn main() -> core::result::Result<(), Box> { sys_ipc_become_root().unwrap(); aero_ipc::listen(SystemService::handler(SystemServer::new())); From 592f96a8fdbeb5046ad5d9d6b3d2477a65a4f52f Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 29 Oct 2023 20:16:10 +1100 Subject: [PATCH 273/368] feat: fix mmap memes * The end_address of a partial mapping needs to be set to the start address of the unmap range. * Similarly for unmap end, the end address needs to be set to the start address of the unmap range. Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/cache.rs | 8 + src/aero_kernel/src/socket/unix.rs | 4 +- src/aero_kernel/src/syscall/mod.rs | 1 + src/aero_kernel/src/syscall/net.rs | 37 +- src/aero_kernel/src/unwind.rs | 14 +- src/aero_kernel/src/userland/vm.rs | 9 +- src/aero_syscall/src/consts.rs | 2 + src/aero_syscall/src/socket.rs | 63 ++- tools/mkimage.sh | 22 +- userland/tests/test.cc | 619 +++++++++++++++++++++++++++++ userland/tests/unix_sock.cc | 142 ------- 11 files changed, 743 insertions(+), 178 deletions(-) create mode 100644 userland/tests/test.cc delete mode 100644 userland/tests/unix_sock.cc diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index 62f3f43764a..d20bd0fe4c7 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -314,6 +314,14 @@ pub type DirCacheKey = (usize, String); pub type DirCache = Cache; pub type DirCacheItem = CacheArc>; +impl Debug for DirCacheItem { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.debug_tuple("DirCacheItem") + .field(&self.absolute_path_str()) + .finish() + } +} + pub struct CachedINode(Arc); impl CachedINode { diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 063f8327d52..a7a91864aeb 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -410,9 +410,9 @@ impl INodeInterface for UnixSocket { .sum::()) } - fn send(&self, message_hdr: &mut MessageHeader, _flags: MessageFlags) -> fs::Result { + fn send(&self, header: &mut MessageHeader, _flags: MessageFlags) -> fs::Result { // FIXME(andyython): figure out the message header stuff... - let data = message_hdr + let data = header .iovecs() .iter() .flat_map(|e| e.as_slice()) diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 7a3acd29ffa..e47f24e906c 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -252,6 +252,7 @@ pub fn generic_do_syscall( SYS_SOCK_SHUTDOWN => net::shutdown(b, c), SYS_GETPEERNAME => net::get_peername(b, c, d), SYS_GETSOCKNAME => net::get_sockname(b, c, d), + SYS_SETSOCKOPT => net::setopt(a, b, c, d, e), SYS_GETTIME => time::gettime(b, c), SYS_SLEEP => time::sleep(b), diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index 35353225fe0..fb6adb6a25f 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -1,5 +1,5 @@ use aero_syscall::netlink::sockaddr_nl; -use aero_syscall::socket::{MessageFlags, MessageHeader}; +use aero_syscall::socket::{MessageFlags, MessageHeader, SocketOptionLevel}; use aero_syscall::*; use alloc::sync::Arc; use num_traits::cast::FromPrimitive; @@ -20,6 +20,8 @@ use crate::socket::{SocketAddr, SocketAddrRef}; use crate::userland::scheduler; use crate::userland::task::TaskId; +use super::FileDescriptor; + /// Creates a [`SocketAddr`] from the provided userland socket structure address. This /// is done by looking at the family field present in every socket address structure. fn socket_addr_from_addr<'sys>(address: VirtAddr) -> Result> { @@ -76,6 +78,8 @@ pub fn accept(fd: usize, address: usize, length: usize) -> Result { #[syscall] pub fn sock_send(fd: usize, header: &mut MessageHeader, flags: usize) -> Result { + dbg!(header.control()); + let flags = MessageFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; let current_task = scheduler::get_scheduler().current_task(); @@ -100,17 +104,32 @@ pub fn sock_recv(sockfd: usize, header: &mut MessageHeader, flags: usize) -> Res Ok(socket.inode().recv(header, flags)?) } +#[syscall] +pub fn setopt(fd: FileDescriptor, layer: usize, number: usize, buf: &[u8]) -> Result { + let layer = SocketOptionLevel::from_usize(layer).ok_or(SyscallError::EINVAL)?; + + match layer { + SocketOptionLevel::Socket => { + unimplemented!( + "setsockopt(fd={:?}, layer={:?}, number={:?}, buf={:?})", + fd, + layer, + number, + buf + ) + } + + _ => todo!(), + } + + Ok(0) +} + /// Marks the socket as a passive socket (i.e. as a socket that will be used to accept incoming /// connection requests). #[syscall] -pub fn listen(fd: usize, backlog: usize) -> Result { - let file = scheduler::get_scheduler() - .current_task() - .file_table - .get_handle(fd) - .ok_or(SyscallError::EINVAL)?; - - file.inode().listen(backlog)?; +pub fn listen(fd: FileDescriptor, backlog: usize) -> Result { + fd.handle()?.inode().listen(backlog)?; Ok(0) } diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index 3416192d113..7ae349e7938 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -169,13 +169,13 @@ pub fn unwind_stack_trace() { } } - let thread = scheduler::current_thread(); - let tags = thread.mem_tags.lock(); - let mut tags = tags.iter().collect::>(); - tags.sort_by(|x, y| x.0.start.cmp(&y.0.start)); - for (x, s) in tags.iter() { - log::trace!("{:#x}..{:#x} {s}", x.start, x.end); - } + // let thread = scheduler::current_thread(); + // let tags = thread.mem_tags.lock(); + // let mut tags = tags.iter().collect::>(); + // tags.sort_by(|x, y| x.0.start.cmp(&y.0.start)); + // for (x, s) in tags.iter() { + // log::trace!("{:#x}..{:#x} {s}", x.start, x.end); + // } } #[cfg(feature = "ci")] diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index b3acbe53587..884f870ad2d 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -319,7 +319,7 @@ pub struct LoadedBinary<'header> { pub envv: Option, } -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct MMapFile { offset: usize, file: DirCacheItem, @@ -333,7 +333,7 @@ impl MMapFile { } } -#[derive(Clone)] +#[derive(Debug, Clone)] struct Mapping { protection: MMapProt, flags: MMapFlags, @@ -584,8 +584,7 @@ impl Mapping { refresh_flags: true, }; - self.end_addr = end; - + self.end_addr = start; Ok(UnmapResult::Partial(new_mapping)) } else if start <= self.start_addr && end >= self.end_addr { // We are unmapping the whole region. @@ -610,7 +609,7 @@ impl Mapping { // Update the end address of the mapping since we have unmapped the // last chunk of the mapping. - self.end_addr = end; + self.end_addr = start; Ok(UnmapResult::End) } } diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 0b4aed56351..6a2f55d7824 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -99,6 +99,8 @@ pub const SYS_SOCK_SHUTDOWN: usize = 75; pub const SYS_GETPEERNAME: usize = 76; pub const SYS_GETSOCKNAME: usize = 77; pub const SYS_DEBUG: usize = 78; +pub const SYS_SETSOCKOPT: usize = 79; +pub const SYS_GETSOCKOPT: usize = 80; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; diff --git a/src/aero_syscall/src/socket.rs b/src/aero_syscall/src/socket.rs index 8e7022fec84..c1c13378a30 100644 --- a/src/aero_syscall/src/socket.rs +++ b/src/aero_syscall/src/socket.rs @@ -1,12 +1,31 @@ +#![allow(non_camel_case_types)] + use crate::SocketAddr; +mod c { + // This should be bindgened. + pub type socklen_t = u32; + + pub const SCM_RIGHTS: i32 = 1; + pub const SCM_CREDENTIALS: i32 = 2; + + pub const SOL_SOCKET: i32 = 1; + pub const SOL_IPV6: i32 = 41; + pub const SOL_PACKET: i32 = 263; + pub const SOL_NETLINK: i32 = 270; +} + bitflags::bitflags! { // mlibc/abis/mlibc/socket.h pub struct MessageFlags: usize { + /// Indicates that some control data was discarded due to lack of space in the + /// buffer for ancillary data. const CTRUNC = 0x1; const DONTROUTE = 0x2; const EOR = 0x4; const OOB = 0x8; + /// Requests not to send `SIGPIPE` on errors on stream oriented sockets when the + /// other end breaks the connection. The `EPIPE` error is still returned. const NOSIGNAL = 0x10; const PEEK = 0x20; const TRUNC = 0x40; @@ -29,13 +48,13 @@ pub struct MessageHeader { /// Pointer to the socket address structure. name: *mut u8, /// Size of the socket address structure. - name_len: u32, + name_len: c::socklen_t, iovec: *mut IoVec, // todo: use Option> iovec_len: i32, // todo: use ffi::c_int control: *const u8, - control_len: u32, + control_len: c::socklen_t, pub flags: i32, // todo: use ffi::c_int } @@ -48,22 +67,21 @@ impl MessageHeader { assert!(self.name_len >= core::mem::size_of::() as u32); - // SAFETY: We know that the `name` pointer is valid and we have an exclusive reference to - // it. The size of name is checked above with the size of `T` and `T` is a `SocketAddr` so, - // its safe to create a mutable reference of `T` from the ptr. unsafe { Some(&mut *(self.name as *mut T)) } } pub fn iovecs(&self) -> &[IoVec] { - // SAFETY: We know that the `iovec` pointer is valid, initialized. unsafe { core::slice::from_raw_parts(self.iovec, self.iovec_len as usize) } } pub fn iovecs_mut(&mut self) -> &mut [IoVec] { - // SAFETY: We know that the `iovec` pointer is valid, initialized and we have exclusive - // access so, its safe to construct a mutable slice from it. unsafe { core::slice::from_raw_parts_mut(self.iovec, self.iovec_len as usize) } } + + pub fn control(&self) -> &[ControlMessage] { + assert!(self.control_len == 0); + &[] + } } // options/posix/include/bits/posix/iovec.h @@ -91,3 +109,32 @@ impl IoVec { self.len } } + +/// Control Message Header (`struct cmsghdr`). +#[derive(Debug)] +#[repr(C)] +pub struct ControlMessage { + /// Data byte count, including the header. + pub cmsg_len: c::socklen_t, + /// Originating protocol. + pub cmsg_level: SocketOptionLevel, + /// Protocol-specific type. + pub cmsg_type: ControlMessageType, + // followed by cmsg_data: [u8; cmsg_len - sizeof(struct cmsghdr)] +} + +#[derive(Debug, Copy, Clone, PartialEq)] +#[repr(i32)] +pub enum ControlMessageType { + Rights = c::SCM_RIGHTS, + Credentials = c::SCM_CREDENTIALS, +} + +#[derive(Debug, Copy, Clone, PartialEq, FromPrimitive)] +#[repr(i32)] +pub enum SocketOptionLevel { + Socket = c::SOL_SOCKET, + Ipv6 = c::SOL_IPV6, + Packet = c::SOL_PACKET, + Netlink = c::SOL_NETLINK, +} diff --git a/tools/mkimage.sh b/tools/mkimage.sh index 79d5a761c9b..e2d66af35f3 100755 --- a/tools/mkimage.sh +++ b/tools/mkimage.sh @@ -3,15 +3,27 @@ set -x -e ANSI_CLEAR="\033[0m" -ANSI_YELLOW="\033[1;34m" +ANSI_RED="\033[1;31m" +ANSI_BOLD="\033[1m" function warn() { - echo -e "${ANSI_YELLOW}$1${ANSI_CLEAR}" + echo -e "${ANSI_RED}error${ANSI_CLEAR}: ${ANSI_BOLD}$1${ANSI_CLEAR}" } -# check if the pkg-build directory is not newer than the system-root -if [[ ./sysroot/pkg-build -nt ./sysroot/system-root]]; then - warn "mkimage: pkg-build is newer than system-root, run `xbstrap install --all`" +function newest_file() { + local latest file + for file; do + [[ $file && $file -nt $latest ]] || latest=$file + done +} + +function has_newer_files_than() { + [[ "$(newest_file "$1"/*)" -nt "$(newest_file "$2" "$2"/*)" ]] +} + +# check if the packages directory is not newer than the system-root +if has_newer_files_than "./sysroot/packages" "./system/system-root"; then + warn "\`./sysroot/packages\` is newer than \`./sysroot/system-root\`, run \`xbstrap install --all\`" exit 1 fi diff --git a/userland/tests/test.cc b/userland/tests/test.cc new file mode 100644 index 00000000000..e7a01c6b7f8 --- /dev/null +++ b/userland/tests/test.cc @@ -0,0 +1,619 @@ +// clang-format off +// +// xbstrap runtool host-gcc -- x86_64-aero-g++ ../userland/tests/test.cc -o system-root/torture + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NAMED_PATH "/tmp/sockname" + +#define DEFINE_TEST(s, f) static test_case test_##s{#s, f}; + +struct abstract_test_case { +private: + static void register_case(abstract_test_case *tcp); + +public: + abstract_test_case(const char *name) : name_{name} { register_case(this); } + + abstract_test_case(const abstract_test_case &) = delete; + + virtual ~abstract_test_case() = default; + + abstract_test_case &operator=(const abstract_test_case &) = delete; + + const char *name() { return name_; } + + virtual void run() = 0; + +private: + const char *name_; +}; + +template struct test_case : abstract_test_case { + test_case(const char *name, F functor) + : abstract_test_case{name}, functor_{std::move(functor)} {} + + void run() override { functor_(); } + +private: + F functor_; +}; + +#define clean_errno() (errno == 0 ? "None" : strerror(errno)) + +#define log_error(M, ...) \ + fprintf(stderr, "[ERROR] %s:%d: errno: %s) " M "\n", __FILE__, __LINE__, \ + clean_errno(), ##__VA_ARGS__) + +#define assertf(A, M, ...) \ + if (!(A)) { \ + log_error(M, ##__VA_ARGS__); \ + assert(A); \ + } + + +#define PAGE_SIZE 4096 + +void enable_systrace() { +#define SYS_TRACE 71 + long ret; + asm volatile("syscall" : "=a"(ret) : "a"(SYS_TRACE) : "rcx", "r11", "memory"); +} + +#define assert_errno(fail_func, expr) ((void)(((expr) ? 1 : 0) || (assert_errno_fail(fail_func, #expr, __FILE__, __PRETTY_FUNCTION__, __LINE__), 0))) + +inline void assert_errno_fail(const char *fail_func, const char *expr, + const char *file, const char *func, int line) { + int err = errno; + fprintf(stderr, "In function %s, file %s:%d: Function %s failed with error '%s'; failing assertion: '%s'\n", + func, file, line, fail_func, strerror(err), expr); + abort(); + __builtin_unreachable(); +} + +DEFINE_TEST(unix_getname, ([] { + int server_fd = socket(AF_UNIX, SOCK_STREAM, 0); + if(server_fd == -1) + assert(!"server socket() failed"); + + struct sockaddr_un server_addr; + memset(&server_addr, 0, sizeof(struct sockaddr_un)); + server_addr.sun_family = AF_UNIX; + strncpy(server_addr.sun_path, NAMED_PATH, sizeof(server_addr.sun_path) - 1); + + if(bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un))) + assert(!"bind() failed"); + if(listen(server_fd, 50)) + assert(!"listen() failed"); + + pid_t child = fork(); + if(!child) { + int client_fd = socket(AF_UNIX, SOCK_STREAM, 0); + if(client_fd == -1) + assert(!"client socket() failed"); + if(connect(client_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un))) + assert(!"connect() to server failed"); + + char buf[1]; + if (recv(client_fd, buf, 1, 0) < 0) + assert(!"recv() failed"); + exit(0); + } else { + int peer_fd = accept(server_fd, nullptr, nullptr); + if(peer_fd == -1) + assert(!"accept() failed"); + + struct sockaddr_un peer_addr; + socklen_t peer_length = sizeof(struct sockaddr_un); + if(getsockname(server_fd, (struct sockaddr *)&peer_addr, &peer_length)) + assert(!"getsockname(server) failed"); + assert(peer_length == (offsetof(sockaddr_un, sun_path) + 14)); + assert(!strcmp(peer_addr.sun_path, NAMED_PATH)); + + memset(&peer_addr, 0, sizeof(struct sockaddr)); + peer_length = sizeof(struct sockaddr_un); + if(getsockname(peer_fd, (struct sockaddr *)&peer_addr, &peer_length)) + assert(!"getsockname(peer) failed"); + assert(peer_length == (offsetof(sockaddr_un, sun_path) + 14)); + assert(!strcmp(peer_addr.sun_path, NAMED_PATH)); + + memset(&peer_addr, 0, sizeof(struct sockaddr)); + peer_length = sizeof(struct sockaddr_un); + if(getpeername(peer_fd, (struct sockaddr *)&peer_addr, &peer_length)) + assert(!"getpeername(peer) failed"); + assert(peer_length == offsetof(sockaddr_un, sun_path)); + + char buf[1]{0}; + if (send(peer_fd, buf, 1, 0) < 0) + assert(!"send() failed"); + } + unlink(NAMED_PATH); +})); + +DEFINE_TEST(epoll_mod_active, ([] { + int e; + int pending; + + int fd = eventfd(0, 0); + assert(fd >= 0); + + int epfd = epoll_create1(0); + assert(epfd >= 0); + + epoll_event evt; + + memset(&evt, 0, sizeof(epoll_event)); + evt.events = 0; + e = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &evt); + assert(!e); + + // Nothing should be pending. + memset(&evt, 0, sizeof(epoll_event)); + pending = epoll_wait(epfd, &evt, 1, 0); + assert(!pending); + + uint64_t n = 1; + auto written = write(fd, &n, sizeof(uint64_t)); + assert(written == sizeof(uint64_t)); + + memset(&evt, 0, sizeof(epoll_event)); + evt.events = EPOLLIN; + e = epoll_ctl(epfd, EPOLL_CTL_MOD, fd, &evt); + assert(!e); + + // The FD should be pending now. + memset(&evt, 0, sizeof(epoll_event)); + pending = epoll_wait(epfd, &evt, 1, 0); + assert(pending == 1); + assert(evt.events & EPOLLIN); + + close(epfd); + close(fd); +})) + +// Use mmap to change the protection flags instead of mprotect. +DEFINE_TEST(mmap_partial_remap, ([] { + enable_systrace(); + + const int bytes = PAGE_SIZE * 2; + + void *result = mmap(nullptr, bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + assert(result != MAP_FAILED); + + void *x = mmap(result, PAGE_SIZE, PROT_NONE, MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0); + assert(x != MAP_FAILED); + + void *y = mmap(static_cast(result) + bytes - PAGE_SIZE, PAGE_SIZE, PROT_NONE, MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0); + assert(y != MAP_FAILED); +})) + +namespace { + void *offsetBy(void *ptr, ptrdiff_t n) { + return reinterpret_cast( + reinterpret_cast(ptr) + + n); + } + + sigjmp_buf restoreEnv; + + void signalHandler(int, siginfo_t *, void *) { + siglongjmp(restoreEnv, 1); + } + + bool ensureReadable(void *ptr) { + if (sigsetjmp(restoreEnv, 1)) { + return false; + } + + (void)(*reinterpret_cast(ptr)); + + return true; + } + + bool ensureWritable(void *ptr) { + if (sigsetjmp(restoreEnv, 1)) { + return false; + } + + *reinterpret_cast(ptr) = 0; + + return true; + } + + bool ensureNotReadable(void *ptr) { + if (sigsetjmp(restoreEnv, 1)) { + return true; + } + + (void)(*reinterpret_cast(ptr)); + + return false; + } + + bool ensureNotWritable(void *ptr) { + if (sigsetjmp(restoreEnv, 1)) { + return true; + } + + *reinterpret_cast(ptr) = 0; + + return false; + } + + template + void runChecks(Func &&f) { + // pid_t pid = fork(); + // assert_errno("fork", pid >= 0); + + // struct sigaction sa, old_sa; + // sigemptyset(&sa.sa_mask); + // sa.sa_sigaction = signalHandler; + // sa.sa_flags = SA_SIGINFO; + + // int ret = sigaction(SIGSEGV, &sa, &old_sa); + // assert_errno("sigaction", ret != -1); + + // if (pid == 0) { + // f(); + // exit(0); + // } else { + // int status = 0; + // while (waitpid(pid, &status, 0) == -1) { + // if (errno == EINTR) continue; + // assert_errno("waitpid", false); + // } + + // if (WIFSIGNALED(status) || WEXITSTATUS(status) != 0) { + // fprintf(stderr, "Test failed on subprocess!\n"); + // abort(); + // } + + // f(); + // } + + // ret = sigaction(SIGSEGV, &old_sa, nullptr); + // assert_errno("sigaction", ret != -1); + } + + const size_t pageSize = sysconf(_SC_PAGESIZE); +} // namespace anonymous + +DEFINE_TEST(mmap_fixed_replace_middle, ([] { + void *mem = mmap(nullptr, pageSize * 3, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + + void *newPtr = mmap(offsetBy(mem, pageSize), pageSize, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0); + assert_errno("mmap", newPtr != MAP_FAILED); + assert(newPtr == offsetBy(mem, pageSize)); + + runChecks([&] { + assert(ensureReadable(mem)); + assert(ensureWritable(mem)); + + assert(ensureReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + + assert(ensureReadable(offsetBy(mem, pageSize * 2))); + assert(ensureWritable(offsetBy(mem, pageSize * 2))); + }); + + int ret = munmap(mem, pageSize * 3); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + + assert(ensureNotReadable(offsetBy(mem, pageSize * 2))); + assert(ensureNotWritable(offsetBy(mem, pageSize * 2))); + }); +})) + +DEFINE_TEST(mmap_fixed_replace_left, ([] { + void *mem = mmap(nullptr, pageSize * 2, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + + void *newPtr = mmap(mem, pageSize, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0); + assert_errno("mmap", newPtr != MAP_FAILED); + assert(newPtr == mem); + + runChecks([&] { + assert(ensureReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureReadable(offsetBy(mem, pageSize))); + assert(ensureWritable(offsetBy(mem, pageSize))); + }); + + int ret = munmap(mem, pageSize * 2); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + }); +})) + +DEFINE_TEST(mmap_fixed_replace_right, ([] { + void *mem = mmap(nullptr, pageSize * 2, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + + void *newPtr = mmap(offsetBy(mem, pageSize), pageSize, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0); + assert_errno("mmap", newPtr != MAP_FAILED); + assert(newPtr == offsetBy(mem, pageSize)); + + runChecks([&] { + assert(ensureReadable(mem)); + assert(ensureWritable(mem)); + + assert(ensureReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + }); + + int ret = munmap(mem, pageSize * 2); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + }); +})) + +DEFINE_TEST(mmap_partial_protect_middle, ([] { + void *mem = mmap(nullptr, pageSize * 3, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + + int ret = mprotect(offsetBy(mem, pageSize), pageSize, PROT_READ); + assert_errno("mprotect", ret != -1); + + runChecks([&] { + assert(ensureReadable(mem)); + assert(ensureWritable(mem)); + + assert(ensureReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + + assert(ensureReadable(offsetBy(mem, pageSize * 2))); + assert(ensureWritable(offsetBy(mem, pageSize * 2))); + }); + + ret = munmap(mem, pageSize * 3); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + + assert(ensureNotReadable(offsetBy(mem, pageSize * 2))); + assert(ensureNotWritable(offsetBy(mem, pageSize * 2))); + }); +})) + +DEFINE_TEST(mmap_partial_protect_left, ([] { + void *mem = mmap(nullptr, pageSize * 2, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + + int ret = mprotect(mem, pageSize, PROT_READ); + assert_errno("mprotect", ret != -1); + + runChecks([&] { + assert(ensureReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureReadable(offsetBy(mem, pageSize))); + assert(ensureWritable(offsetBy(mem, pageSize))); + }); + + ret = munmap(mem, pageSize * 2); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + }); +})) + +DEFINE_TEST(mmap_partial_protect_right, ([] { + void *mem = mmap(nullptr, pageSize * 2, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + + int ret = mprotect(offsetBy(mem, pageSize), pageSize, PROT_READ); + assert_errno("mprotect", ret != -1); + + runChecks([&] { + assert(ensureReadable(mem)); + assert(ensureWritable(mem)); + + assert(ensureReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + }); + + ret = munmap(mem, pageSize * 2); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + }); +})) + +DEFINE_TEST(mmap_partial_unmap_middle, ([] { + void *mem = mmap(nullptr, pageSize * 3, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + + int ret = munmap(offsetBy(mem, pageSize), pageSize); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureReadable(mem)); + assert(ensureWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + + assert(ensureReadable(offsetBy(mem, pageSize * 2))); + assert(ensureWritable(offsetBy(mem, pageSize * 2))); + }); + + ret = munmap(mem, pageSize * 3); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + + assert(ensureNotReadable(offsetBy(mem, pageSize * 2))); + assert(ensureNotWritable(offsetBy(mem, pageSize * 2))); + }); +})) + +DEFINE_TEST(mmap_partial_unmap_left, ([] { + void *mem = mmap(nullptr, pageSize * 2, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + + int ret = munmap(mem, pageSize); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureReadable(offsetBy(mem, pageSize))); + assert(ensureWritable(offsetBy(mem, pageSize))); + }); + + ret = munmap(mem, pageSize * 2); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + }); +})) + +DEFINE_TEST(mmap_partial_unmap_right, ([] { + void *mem = mmap(nullptr, pageSize * 2, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + + int ret = munmap(offsetBy(mem, pageSize), pageSize); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureReadable(mem)); + assert(ensureWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + }); + + ret = munmap(mem, pageSize * 2); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + + assert(ensureNotReadable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize))); + }); +})) + +DEFINE_TEST(mmap_unmap_range_before_first, ([] { + void *mem = mmap(reinterpret_cast(0x100000 + pageSize * 2), pageSize, + PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + + int ret = munmap(reinterpret_cast(0x100000 + pageSize), pageSize * 2); + assert_errno("munmap", ret != -1); + + runChecks([&] { + assert(ensureNotReadable(mem)); + assert(ensureNotWritable(mem)); + }); +})) + +DEFINE_TEST(mprotect_check_whether_split_mappings_get_protected_correctly, ([] { + void *mem = mmap(NULL, 0x6000, PROT_READ | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + int ret = mprotect(mem, 0x1000, PROT_READ | PROT_WRITE); + assert_errno("mprotect", ret != -1); + ret = mprotect(mem, 0x1000, PROT_READ | PROT_EXEC); + assert_errno("mprotect", ret != -1); + ret = mprotect(mem, 0x5000, PROT_READ | PROT_WRITE); + assert_errno("mprotect", ret != -1); + + runChecks([&] { + assert(ensureWritable(mem)); + }); +})) + +DEFINE_TEST(mprotect_check_whether_three_way_split_mappings_are_handled_correctly, ([] { + void *mem = mmap(NULL, pageSize * 3, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + assert_errno("mmap", mem != MAP_FAILED); + int ret = mprotect(offsetBy(mem, pageSize), pageSize, PROT_READ | PROT_WRITE); + assert_errno("mprotect", ret != -1); + + runChecks([&] { + assert(ensureNotWritable(mem)); + assert(ensureWritable(offsetBy(mem, pageSize))); + assert(ensureNotWritable(offsetBy(mem, pageSize * 2))); + }); +})) + +std::vector &test_case_ptrs() { + static std::vector singleton; + return singleton; +} + +void abstract_test_case::register_case(abstract_test_case *tcp) { + test_case_ptrs().push_back(tcp); +} + +int main() { + // Go through all tests and run them. + for(abstract_test_case *tcp : test_case_ptrs()) { + std::cout << "tests: Running " << tcp->name() << std::endl; + tcp->run(); + } +} diff --git a/userland/tests/unix_sock.cc b/userland/tests/unix_sock.cc deleted file mode 100644 index 3730799bf48..00000000000 --- a/userland/tests/unix_sock.cc +++ /dev/null @@ -1,142 +0,0 @@ -// test copied from managarm - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NAMED_PATH "/tmp/sockname" - -#define DEFINE_TEST(s, f) static test_case test_##s{#s, f}; - -struct abstract_test_case { -private: - static void register_case(abstract_test_case *tcp); - -public: - abstract_test_case(const char *name) : name_{name} { register_case(this); } - - abstract_test_case(const abstract_test_case &) = delete; - - virtual ~abstract_test_case() = default; - - abstract_test_case &operator=(const abstract_test_case &) = delete; - - const char *name() { return name_; } - - virtual void run() = 0; - -private: - const char *name_; -}; - -template struct test_case : abstract_test_case { - test_case(const char *name, F functor) - : abstract_test_case{name}, functor_{std::move(functor)} {} - - void run() override { functor_(); } - -private: - F functor_; -}; - -#define clean_errno() (errno == 0 ? "None" : strerror(errno)) - -#define log_error(M, ...) \ - fprintf(stderr, "[ERROR] %s:%d: errno: %s) " M "\n", __FILE__, __LINE__, \ - clean_errno(), ##__VA_ARGS__) - -#define assertf(A, M, ...) \ - if (!(A)) { \ - log_error(M, ##__VA_ARGS__); \ - assert(A); \ - } - -// clang-format off -DEFINE_TEST(unix_getname, ([] { - int server_fd = socket(AF_UNIX, SOCK_STREAM, 0); - if(server_fd == -1) - assert(!"server socket() failed"); - - struct sockaddr_un server_addr; - memset(&server_addr, 0, sizeof(struct sockaddr_un)); - server_addr.sun_family = AF_UNIX; - strncpy(server_addr.sun_path, NAMED_PATH, sizeof(server_addr.sun_path) - 1); - - if(bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un))) - assert(!"bind() failed"); - if(listen(server_fd, 50)) - assert(!"listen() failed"); - - pid_t child = fork(); - if(!child) { - int client_fd = socket(AF_UNIX, SOCK_STREAM, 0); - if(client_fd == -1) - assert(!"client socket() failed"); - if(connect(client_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un))) - assert(!"connect() to server failed"); - - char buf[1]; - if (recv(client_fd, buf, 1, 0) < 0) - assert(!"recv() failed"); - exit(0); - } else { - int peer_fd = accept(server_fd, nullptr, nullptr); - if(peer_fd == -1) - assert(!"accept() failed"); - - struct sockaddr_un peer_addr; - socklen_t peer_length = sizeof(struct sockaddr_un); - if(getsockname(server_fd, (struct sockaddr *)&peer_addr, &peer_length)) - assert(!"getsockname(server) failed"); - assert(peer_length == (offsetof(sockaddr_un, sun_path) + 14)); - assert(!strcmp(peer_addr.sun_path, NAMED_PATH)); - - memset(&peer_addr, 0, sizeof(struct sockaddr)); - peer_length = sizeof(struct sockaddr_un); - if(getsockname(peer_fd, (struct sockaddr *)&peer_addr, &peer_length)) - assert(!"getsockname(peer) failed"); - printf("peer_len=%d\n", peer_length); - printf("wanted=%d\n", offsetof(sockaddr_un, sun_path) + 14); - assert(peer_length == (offsetof(sockaddr_un, sun_path) + 14)); - assert(!strcmp(peer_addr.sun_path, NAMED_PATH)); - - memset(&peer_addr, 0, sizeof(struct sockaddr)); - peer_length = sizeof(struct sockaddr_un); - if(getpeername(peer_fd, (struct sockaddr *)&peer_addr, &peer_length)) - assert(!"getpeername(peer) failed"); - printf("peer_len=%d\n", peer_length); - printf("wanted=%d\n", offsetof(sockaddr_un, sun_path) ); - assert(peer_length == offsetof(sockaddr_un, sun_path)); - - char buf[1]{0}; - if (send(peer_fd, buf, 1, 0) < 0) - assert(!"send() failed"); - } - unlink(NAMED_PATH); -})); - -std::vector &test_case_ptrs() { - static std::vector singleton; - return singleton; -} - -void abstract_test_case::register_case(abstract_test_case *tcp) { - test_case_ptrs().push_back(tcp); -} - -int main() { - // Go through all tests and run them. - for(abstract_test_case *tcp : test_case_ptrs()) { - std::cout << "tests: Running " << tcp->name() << std::endl; - tcp->run(); - } -} \ No newline at end of file From ee33d34a5aa952f690e29ab07772960371a050c5 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 3 Nov 2023 19:36:39 +1100 Subject: [PATCH 274/368] misc: minor pty fixes Signed-off-by: Anhad Singh --- aero.py | 11 ++- src/aero_kernel/src/drivers/gdbstub.rs | 4 + src/aero_kernel/src/drivers/mod.rs | 2 + src/aero_kernel/src/drivers/pty.rs | 93 ++++++++++-------------- src/aero_kernel/src/fs/file_table.rs | 2 - src/aero_kernel/src/mem/mod.rs | 2 - src/aero_kernel/src/mem/paging/mod.rs | 2 +- src/aero_kernel/src/userland/terminal.rs | 84 +++++++++++++++++++-- src/aero_syscall/src/lib.rs | 1 + userland/tests/getchar.cc | 18 +++++ 10 files changed, 149 insertions(+), 70 deletions(-) create mode 100644 src/aero_kernel/src/drivers/gdbstub.rs create mode 100644 userland/tests/getchar.cc diff --git a/aero.py b/aero.py index 8dfee005dbc..48a7af35540 100755 --- a/aero.py +++ b/aero.py @@ -24,11 +24,8 @@ import shutil import subprocess import sys -import tarfile import time -from typing import List - def log_info(msg): """ @@ -598,6 +595,14 @@ def main(): run_command(['cargo', 'fmt'], cwd="src") return + if os.path.exists(BUILD_DIR): + system_root = os.path.join(SYSROOT_DIR, 'system-root') + sysroot_mod = max(os.path.getmtime(os.path.join(system_root, file)) for file in os.listdir(system_root)) + build_mod = os.path.getmtime(BUILD_DIR) + if sysroot_mod > build_mod: + log_info("sysroot modified, rebuilding") + os.rmdir(BUILD_DIR) + t0 = time.time() # arch-aero_os target_arch = args.target.split('-')[0] diff --git a/src/aero_kernel/src/drivers/gdbstub.rs b/src/aero_kernel/src/drivers/gdbstub.rs new file mode 100644 index 00000000000..1e82aea22b1 --- /dev/null +++ b/src/aero_kernel/src/drivers/gdbstub.rs @@ -0,0 +1,4 @@ +// TODO: Is it worth adding a GDB stub to facilitate userland debugging? +pub fn init() {} + +crate::module_init!(init, ModuleType::Other); diff --git a/src/aero_kernel/src/drivers/mod.rs b/src/aero_kernel/src/drivers/mod.rs index 795bdb8985d..7d11c0bb4c0 100644 --- a/src/aero_kernel/src/drivers/mod.rs +++ b/src/aero_kernel/src/drivers/mod.rs @@ -27,6 +27,8 @@ pub mod keyboard; pub mod lai; // FIXME: aarch64 port pub mod e1000; +// #[cfg(feature = "gdbstub")] +pub mod gdbstub; pub mod mouse; #[cfg(target_arch = "x86_64")] pub mod pci; diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 790765d49b4..40e0741ba70 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -35,7 +35,7 @@ use crate::mem::paging::VirtAddr; use crate::userland::scheduler; use crate::userland::scheduler::ExitStatus; use crate::userland::task::Task; -use crate::userland::terminal::{LineDiscipline, TerminalDevice}; +use crate::userland::terminal::{LineControl, LineDiscipline, TerminalDevice}; use crate::utils::sync::{Mutex, WaitQueue}; lazy_static::lazy_static! { @@ -50,8 +50,6 @@ struct Master { wq: WaitQueue, window_size: Mutex, buffer: Mutex>, - termios: Mutex, - discipline: LineDiscipline, } @@ -59,51 +57,14 @@ impl Master { pub fn new() -> Self { use aero_syscall::*; - // converts `^X` into `X` - let ctrl = |c| (c as u8 - 0x40); - - let mut termios = Termios { - c_iflag: aero_syscall::TermiosIFlag::empty(), - c_oflag: aero_syscall::TermiosOFlag::ONLCR, - c_cflag: aero_syscall::TermiosCFlag::empty(), - c_lflag: TermiosLFlag::ECHOKE - | TermiosLFlag::ECHOE - | TermiosLFlag::ECHOK - | TermiosLFlag::ECHO - | TermiosLFlag::ECHOCTL - | TermiosLFlag::ISIG - | TermiosLFlag::ICANON - | TermiosLFlag::IEXTEN, - c_line: 0, - c_cc: [0; 32], - c_ispeed: 0, - c_ospeed: 0, - }; - - termios.c_cc[VINTR] = ctrl('C'); - termios.c_cc[VQUIT] = ctrl('\\'); - termios.c_cc[VERASE] = 127; // DEL character - termios.c_cc[VKILL] = ctrl('U'); - termios.c_cc[VEOF] = ctrl('D'); - termios.c_cc[VMIN] = 1; - termios.c_cc[VSTART] = ctrl('Q'); - termios.c_cc[VSTOP] = ctrl('S'); - termios.c_cc[VSUSP] = ctrl('Z'); - Self { id: PTY_ID.fetch_add(1, Ordering::SeqCst), wq: WaitQueue::new(), window_size: Mutex::new(WinSize::default()), buffer: Mutex::new(Vec::new()), - termios: Mutex::new(termios), - discipline: LineDiscipline::new(), } } - - pub fn is_cooked(&self) -> bool { - self.termios.lock_irq().is_cooked() - } } impl INodeInterface for Master { @@ -120,7 +81,10 @@ impl INodeInterface for Master { } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { - self.discipline.write(buffer); + self.discipline.write(buffer, |ctrl| match ctrl { + LineControl::Echo(c) => self.buffer.lock_irq().push(c), + }); + self.wq.notify_all(); Ok(buffer.len()) } @@ -150,7 +114,7 @@ impl INodeInterface for Master { } _ => { - log::warn!("ptmx: unknown ioctl (command={command:#x})") + panic!("ptmx: unknown ioctl (command={command:#x})") } } @@ -168,13 +132,13 @@ impl TerminalDevice for Slave { use aero_syscall::signal::*; use aero_syscall::*; - if !self.master.is_cooked() { + if !self.master.discipline.termios.lock().is_cooked() { return; } if let ExitStatus::Signal(signo) = task.exit_status() { let mut buffer = self.master.buffer.lock_irq(); - let termios = self.master.termios.lock_irq(); + let termios = self.master.discipline.termios.lock(); // converts `X` into `^X` and pushes the result into the master PTY buffer. let mut ctrl = |c| { @@ -208,12 +172,7 @@ impl Slave { impl INodeInterface for Slave { fn metadata(&self) -> fs::Result { - Ok(fs::inode::Metadata { - id: 0, - file_type: FileType::Device, - children_len: 0, - size: 0, - }) + Ok(fs::inode::Metadata::with_file_type(FileType::Device)) } fn stat(&self) -> fs::Result { @@ -229,16 +188,32 @@ impl INodeInterface for Slave { Ok(0) } + aero_syscall::TIOCSWINSZ => { + *self.master.window_size.lock_irq() = *VirtAddr::new(arg as u64).read_mut()?; + Ok(0) + } + aero_syscall::TCGETS => { let termios = VirtAddr::new(arg as u64).read_mut::()?; - *termios = *self.master.termios.lock_irq(); + *termios = self.master.discipline.termios(); Ok(0) } aero_syscall::TCSETSF => { let termios = VirtAddr::new(arg as u64).read_mut::()?; - *self.master.termios.lock_irq() = *termios; + self.master.discipline.set_termios(termios.clone()); + + Ok(0) + } + + aero_syscall::TCSETSW => { + // TODO: Allow the output buffer to drain and then set the current serial port + // settings. + // + // Equivalent to tcsetattr(fd, TCSADRAIN, argp). + let termios = VirtAddr::new(arg as u64).read_mut::()?; + self.master.discipline.set_termios(termios.clone()); Ok(0) } @@ -251,7 +226,11 @@ impl INodeInterface for Slave { Ok(0) } - _ => Err(FileSystemError::NotSupported), + // TIOCGPGRP - Get the process group ID of the foreground process group on this + // terminal. + 0x540f => Err(FileSystemError::NotSupported), + + _ => panic!("pty: unknown ioctl: {command}"), } } @@ -271,14 +250,16 @@ impl INodeInterface for Slave { } fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { - Ok(self.master.discipline.read(buffer)?) + let x = self.master.discipline.read(buffer)?; + dbg!(core::str::from_utf8(&buffer[..x])); + Ok(x) } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { if self .master - .termios - .lock_irq() + .discipline + .termios() .c_oflag .contains(aero_syscall::TermiosOFlag::ONLCR) { diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index e1cbb04ef88..66ac73890a9 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -302,8 +302,6 @@ impl FileTable { let files = self.0.read(); for handle in files.iter().flatten() { - let flags = *handle.flags.read(); - handle .inode .inode() diff --git a/src/aero_kernel/src/mem/mod.rs b/src/aero_kernel/src/mem/mod.rs index ba75081a434..cde30ef70d0 100644 --- a/src/aero_kernel/src/mem/mod.rs +++ b/src/aero_kernel/src/mem/mod.rs @@ -21,8 +21,6 @@ pub mod pti; mod slab; mod vmalloc; -use core::alloc::Layout; - use ::alloc::boxed::Box; use crate::mem::paging::*; diff --git a/src/aero_kernel/src/mem/paging/mod.rs b/src/aero_kernel/src/mem/paging/mod.rs index 2733b5ffc88..64857cfd5b7 100644 --- a/src/aero_kernel/src/mem/paging/mod.rs +++ b/src/aero_kernel/src/mem/paging/mod.rs @@ -23,7 +23,7 @@ mod page_table; pub use self::addr::*; pub use self::frame::*; -pub use self::mapper::{MapperFlush, *}; +pub use self::mapper::*; pub use self::page::*; pub use self::page_table::*; diff --git a/src/aero_kernel/src/userland/terminal.rs b/src/aero_kernel/src/userland/terminal.rs index 18527995dc4..899e69b0061 100644 --- a/src/aero_kernel/src/userland/terminal.rs +++ b/src/aero_kernel/src/userland/terminal.rs @@ -15,7 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -use aero_syscall::signal; +use aero_syscall::{signal, Termios, TermiosIFlag, TermiosLFlag}; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; @@ -40,6 +40,11 @@ pub trait TerminalDevice: Send + Sync + INodeInterface { fn detach(&self, task: Arc); } +#[derive(Debug, Copy, Clone)] +pub enum LineControl { + Echo(u8), +} + /// Line Discipline /// /// The middle terminal subsystem layer, used to implement behavior common to terminal devices. @@ -51,21 +56,66 @@ pub struct LineDiscipline { wq: WaitQueue, buffer: Mutex>, foreground: RwLock>, + // TODO: Make this private. + pub termios: Mutex, } impl LineDiscipline { /// Creates a new line discipline. pub fn new() -> Self { + use aero_syscall::{TermiosCFlag, TermiosOFlag}; + + // converts `^X` into `X` + let ctrl = |c| (c as u8 - 0x40); + + let mut termios = Termios { + c_iflag: TermiosIFlag::ICRNL | TermiosIFlag::IXON, + c_oflag: TermiosOFlag::OPOST | TermiosOFlag::ONLCR, + c_cflag: TermiosCFlag::CS6 | TermiosCFlag::CS7 | TermiosCFlag::CREAD, + c_lflag: TermiosLFlag::ECHOKE + | TermiosLFlag::ECHOE + | TermiosLFlag::ECHOK + | TermiosLFlag::ECHO + | TermiosLFlag::ECHOCTL + | TermiosLFlag::ISIG + | TermiosLFlag::ICANON + | TermiosLFlag::IEXTEN, + c_line: 0, + c_cc: [0; 32], + c_ispeed: 0, + c_ospeed: 0, + }; + + termios.c_cc[aero_syscall::VINTR] = ctrl('C'); + termios.c_cc[aero_syscall::VQUIT] = ctrl('\\'); + termios.c_cc[aero_syscall::VERASE] = 127; // DEL character + termios.c_cc[aero_syscall::VKILL] = ctrl('U'); + termios.c_cc[aero_syscall::VEOF] = ctrl('D'); + termios.c_cc[aero_syscall::VMIN] = 1; + termios.c_cc[aero_syscall::VSTART] = ctrl('Q'); + termios.c_cc[aero_syscall::VSTOP] = ctrl('S'); + termios.c_cc[aero_syscall::VSUSP] = ctrl('Z'); + Self { wq: WaitQueue::new(), buffer: Mutex::new(Vec::new()), foreground: RwLock::new(Weak::default()), + termios: Mutex::new(termios), } } - /// Reads data from the line discipline buffer. + #[inline] + pub fn termios(&self) -> Termios { + self.termios.lock().clone() + } + + #[inline] + pub fn set_termios(&self, termios: Termios) { + *self.termios.lock() = termios; + } + pub fn read(&self, target: &mut [u8]) -> Result { - let mut buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; + let mut buffer = self.wq.block_on(&self.buffer, |buf| !buf.is_empty())?; let size = core::cmp::min(target.len(), buffer.len()); target[..size].copy_from_slice(&buffer.drain(..size).collect::>()); @@ -73,19 +123,41 @@ impl LineDiscipline { Ok(size) } - /// Writes data to the line discipline buffer. - pub fn write(&self, target: &[u8]) { + pub fn write(&self, target: &[u8], callback: F) + where + F: Fn(LineControl), + { let mut buffer = self.buffer.lock_irq(); + let termios = self.termios.lock(); + let should_echo = termios.c_lflag.contains(TermiosLFlag::ECHO); for byte in target { match byte { // ETX: End of Text (`Ctrl+C`) - 0x3 => { + 0x3 if termios.is_cooked() => { if let Some(foreground) = self.foreground() { foreground.signal(signal::SIGINT); } } + b'\r' if termios.c_iflag.contains(TermiosIFlag::ICRNL) => { + buffer.push(b'\n'); + + if should_echo { + callback(LineControl::Echo(b'\r')); + callback(LineControl::Echo(b'\n')); + } + } + + byte if termios.is_cooked() => { + buffer.push(*byte); + + if should_echo { + callback(LineControl::Echo(*byte)) + } + } + + // In raw mode: _ => buffer.push(*byte), } } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index d7b20a878f6..d74b44e85fa 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -294,6 +294,7 @@ impl From for SeekWhence { pub const TIOCGWINSZ: usize = 0x5413; pub const TIOCSWINSZ: usize = 0x5414; pub const TCGETS: usize = 0x5401; +pub const TCSETSW: usize = 0x5403; pub const TCSETSF: usize = 0x5404; pub const TIOCSCTTY: usize = 0x540e; pub const TIOCNOTTY: usize = 0x5422; diff --git a/userland/tests/getchar.cc b/userland/tests/getchar.cc new file mode 100644 index 00000000000..7b2ac57058e --- /dev/null +++ b/userland/tests/getchar.cc @@ -0,0 +1,18 @@ +#include +#include + +int main() { + std::string line; + char c; + + while ((c = getchar()) != EOF) { + std::cout << "Got: " << c << std::endl; + // FIXME: Should we also break on \r? + if (c == '\n') + break; + line.push_back(c); + } + + std::cout << line << std::endl; + return 0; +} From 83924ea70806b39ea09952e4c52b8cdc64c73056 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 4 Nov 2023 13:29:40 +1100 Subject: [PATCH 275/368] cleanup: Ioctl derive proc macro Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/user_copy.rs | 28 +++++ src/aero_kernel/src/drivers/pty.rs | 119 ++++++++++++------- src/aero_kernel/src/main.rs | 3 +- src/aero_proc/src/ioctl.rs | 57 +++++++++ src/aero_proc/src/lib.rs | 7 ++ src/aero_syscall/src/lib.rs | 3 +- 6 files changed, 171 insertions(+), 46 deletions(-) create mode 100644 src/aero_proc/src/ioctl.rs diff --git a/src/aero_kernel/src/arch/x86_64/user_copy.rs b/src/aero_kernel/src/arch/x86_64/user_copy.rs index bc632787009..18c0509fd34 100644 --- a/src/aero_kernel/src/arch/x86_64/user_copy.rs +++ b/src/aero_kernel/src/arch/x86_64/user_copy.rs @@ -15,11 +15,13 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use core::fmt::{Debug, Display}; use core::mem::MaybeUninit; use core::ops::{Deref, DerefMut}; use crate::interrupts::exceptions::PF_RESUME; use crate::mem::paging::VirtAddr; +use crate::syscall::SysArg; use super::task::user_access_ok; @@ -131,6 +133,13 @@ impl UserRef { val: unsafe { val.assume_init() }, } } + + pub fn take(self) -> T + where + T: Clone, + { + self.val.clone() + } } impl Deref for UserRef { @@ -152,3 +161,22 @@ impl Drop for UserRef { assert!(copy_to_user(self.ptr, &self.val)); } } + +impl Display for UserRef { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + self.val.fmt(f) + } +} + +impl Debug for UserRef { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "UserRef({:?})", self.val) + } +} + +impl SysArg for UserRef { + fn from_usize(value: usize) -> Self { + // TODO: SAFETY + unsafe { Self::new(VirtAddr::new(value.try_into().unwrap())) } + } +} diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 40e0741ba70..ae9b98d3148 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -17,7 +17,9 @@ use core::sync::atomic::{AtomicU32, Ordering}; +use aero_syscall as libc; use aero_syscall::{Termios, WinSize}; + use alloc::collections::BTreeMap; use alloc::string::ToString; use alloc::sync::{Arc, Weak}; @@ -26,6 +28,7 @@ use spin::{Once, RwLock}; use uapi::pty::*; +use crate::arch::user_copy::UserRef; use crate::fs::cache::*; use crate::fs::devfs::DEV_FILESYSTEM; use crate::fs::inode::{DirEntry, FileType, INodeInterface, PollFlags}; @@ -45,6 +48,55 @@ lazy_static::lazy_static! { static PTS_FS: Once> = Once::new(); static PTY_ID: AtomicU32 = AtomicU32::new(0); +#[derive(Debug, Ioctl)] +pub enum TermiosCmd { + /// Get window size. + #[command(libc::TIOCGWINSZ)] + GetWinSize(UserRef), + + /// Set window size. + #[command(libc::TIOCSWINSZ)] + SetWinSize(UserRef), + + /// Get the current serial port settings. + /// + /// Equivalent to `tcgetattr(fd, argp)`. + #[command(libc::TCGETS)] + TcGets(UserRef), + + /// Allow the output buffer to drain, discard pending input, and set the current serial + /// port settings. + /// + /// Equivalent to `tcsetattr(fd, TCSAFLUSH, argp)`. + #[command(libc::TCSETSF)] + TcSetsf(UserRef), + + /// Allow the output buffer to drain, and set the current serial port settings. + /// + /// Equivalent to `tcsetattr(fd, TCSADRAIN, argp)`. + #[command(libc::TCSETSW)] + TcSetsw(UserRef), + + /// Make the given terminal the controlling terminal of the calling process. The calling + /// process must be a session leader and not have a controlling terminal already. For this + /// case, arg should be specified as zero. + /// + /// If this terminal is already the controlling terminal of a different session group, then the + /// ioctl fails with EPERM, unless the caller has the CAP_SYS_ADMIN capability and arg equals + /// 1, in which case the terminal is stolen, and all processes that had it as controlling + /// terminal lose it. + // FIXME: argument usize + #[command(libc::TIOCSCTTY)] + SetCtrlTerm, + + /// Get the process group ID of the foreground process group on this terminal. + /// + /// When successful, equivalent to `*argp = tcgetpgrp(fd)`. + // FIXME: argument usize + #[command(libc::TIOCGPGRP)] + GetProcGroupId, +} + struct Master { id: u32, wq: WaitQueue, @@ -65,6 +117,16 @@ impl Master { discipline: LineDiscipline::new(), } } + + #[inline] + fn set_window_size(&self, size: WinSize) { + *self.window_size.lock_irq() = size; + } + + #[inline] + fn get_window_size(&self) -> WinSize { + *self.window_size.lock_irq() + } } impl INodeInterface for Master { @@ -180,58 +242,29 @@ impl INodeInterface for Slave { } fn ioctl(&self, command: usize, arg: usize) -> fs::Result { - match command { - aero_syscall::TIOCGWINSZ => { - let winsize = VirtAddr::new(arg as u64).read_mut::()?; - *winsize = *self.master.window_size.lock_irq(); - - Ok(0) - } - - aero_syscall::TIOCSWINSZ => { - *self.master.window_size.lock_irq() = *VirtAddr::new(arg as u64).read_mut()?; - Ok(0) - } - - aero_syscall::TCGETS => { - let termios = VirtAddr::new(arg as u64).read_mut::()?; - *termios = self.master.discipline.termios(); - - Ok(0) - } - - aero_syscall::TCSETSF => { - let termios = VirtAddr::new(arg as u64).read_mut::()?; - self.master.discipline.set_termios(termios.clone()); - - Ok(0) - } - - aero_syscall::TCSETSW => { + match TermiosCmd::from_command_arg(command, arg) { + TermiosCmd::GetWinSize(mut size) => *size = self.master.get_window_size(), + TermiosCmd::SetWinSize(size) => self.master.set_window_size(*size), + TermiosCmd::TcGets(mut termios) => *termios = self.master.discipline.termios(), + TermiosCmd::TcSetsf(termios) => self.master.discipline.set_termios(*termios), + TermiosCmd::TcSetsw(termios) => { // TODO: Allow the output buffer to drain and then set the current serial port // settings. - // - // Equivalent to tcsetattr(fd, TCSADRAIN, argp). - let termios = VirtAddr::new(arg as u64).read_mut::()?; - self.master.discipline.set_termios(termios.clone()); - - Ok(0) + self.master.discipline.set_termios(*termios) } - aero_syscall::TIOCSCTTY => { + TermiosCmd::SetCtrlTerm => { let current_task = scheduler::get_scheduler().current_task(); assert!(current_task.is_session_leader()); current_task.attach(self.sref()); - Ok(0) } - // TIOCGPGRP - Get the process group ID of the foreground process group on this - // terminal. - 0x540f => Err(FileSystemError::NotSupported), - - _ => panic!("pty: unknown ioctl: {command}"), + // FIXME: the following ioctls are not implemented. + TermiosCmd::GetProcGroupId => return Err(FileSystemError::NotSupported), } + + Ok(0) } fn poll(&self, table: Option<&mut fs::inode::PollTable>) -> fs::Result { @@ -250,9 +283,7 @@ impl INodeInterface for Slave { } fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { - let x = self.master.discipline.read(buffer)?; - dbg!(core::str::from_utf8(&buffer[..x])); - Ok(x) + Ok(self.master.discipline.read(buffer)?) } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 4e32a73bf8f..58967ac1b36 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -49,7 +49,8 @@ naked_functions, // https://github.com/rust-lang/rust/issues/32408 cfg_match, // https://github.com/rust-lang/rust/issues/115585 strict_provenance, - offset_of + offset_of, + associated_type_defaults )] // TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? // `lang_items` => is currently used for the personality function (`rust_eh_personality`). diff --git a/src/aero_proc/src/ioctl.rs b/src/aero_proc/src/ioctl.rs new file mode 100644 index 00000000000..38abcc1fdcc --- /dev/null +++ b/src/aero_proc/src/ioctl.rs @@ -0,0 +1,57 @@ +use proc_macro::TokenStream; +use syn::{Data, DeriveInput, Path}; + +fn make_command_enum(ast: &DeriveInput) -> TokenStream { + let name = &ast.ident; + let variants = match &ast.data { + Data::Enum(data) => &data.variants, + _ => panic!("`Ioctl` derive macro can only be used on enums."), + }; + + let mut pattern_match = vec![]; + + for variant in variants { + let attrs = &variant.attrs; + let ident = &variant.ident; + + for attr in attrs { + if attr.path.get_ident().unwrap() != "command" { + assert_eq!(attr.path.get_ident().unwrap(), "doc"); + continue; + } + + let path = attr.parse_args::().unwrap(); + + pattern_match.push(match &variant.fields { + syn::Fields::Unit => quote::quote!(#path => Self::#ident), + syn::Fields::Unnamed(fields) => { + assert!(fields.unnamed.len() == 1); + quote::quote!(#path => Self::#ident(crate::syscall::SysArg::from_usize(arg))) + } + + _ => panic!("`Ioctl` derive macro can only be used on enums with unit variants."), + }); + } + } + + // implement Ioctl::from_command_arg for the enum + + quote::quote! { + impl #name { + pub fn from_command_arg(cmd: usize, arg: usize) -> Self { + match cmd { + #(#pattern_match,)* + _ => unimplemented!("unknown command: {cmd:#x}") + } + } + } + } + .into() +} + +pub fn parse(item: TokenStream) -> TokenStream { + let ast: DeriveInput = syn::parse(item).unwrap(); + let cmd_enum = make_command_enum(&ast); + + cmd_enum +} diff --git a/src/aero_proc/src/lib.rs b/src/aero_proc/src/lib.rs index 2dfe0ac0c59..3809b200c32 100644 --- a/src/aero_proc/src/lib.rs +++ b/src/aero_proc/src/lib.rs @@ -23,6 +23,7 @@ extern crate proc_macro_error; mod cpu_local; mod downcastable; mod indirect; +mod ioctl; mod syscall; mod test; @@ -71,3 +72,9 @@ pub fn cpu_local(attr: TokenStream, item: TokenStream) -> TokenStream { pub fn indirect(attr: TokenStream, item: TokenStream) -> TokenStream { indirect::parse(attr, item) } + +#[proc_macro_derive(Ioctl, attributes(command))] +#[proc_macro_error] +pub fn ioctl(item: TokenStream) -> TokenStream { + ioctl::parse(item) +} diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index d74b44e85fa..fd0257445ff 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -298,8 +298,9 @@ pub const TCSETSW: usize = 0x5403; pub const TCSETSF: usize = 0x5404; pub const TIOCSCTTY: usize = 0x540e; pub const TIOCNOTTY: usize = 0x5422; +pub const TIOCGPGRP: usize = 0x540f; -#[derive(Default, Copy, Clone)] +#[derive(Default, Debug, Copy, Clone)] #[repr(C)] pub struct WinSize { pub ws_row: u16, From bcba90c05843aaea5caf54757682d14f4290a621 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 4 Nov 2023 15:08:39 +1100 Subject: [PATCH 276/368] feat(ports): add jq Signed-off-by: Anhad Singh --- bootstrap.yml | 1 + bootstrap/app-misc.yml | 31 +++++++++++++++++++++++++++++++ patches/jq/jq.patch | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 bootstrap/app-misc.yml create mode 100644 patches/jq/jq.patch diff --git a/bootstrap.yml b/bootstrap.yml index 1106bb426b2..89689e81971 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -5,6 +5,7 @@ imports: - file: bootstrap/vcs.yml - file: bootstrap/db.yml - file: bootstrap/editors.yml + - file: bootstrap/app-misc.yml general: cargo: diff --git a/bootstrap/app-misc.yml b/bootstrap/app-misc.yml new file mode 100644 index 00000000000..f8ca618882a --- /dev/null +++ b/bootstrap/app-misc.yml @@ -0,0 +1,31 @@ +packages: + # A lightweight and flexible command-line JSON processor + - name: jq + source: + url: 'https://github.com/jqlang/jq/releases/download/jq-1.7/jq-1.7.tar.gz' + format: 'tar.gz' + version: '1.7' + subdir: 'bundled' + patch-path-strip: 0 + tools_required: + - host-autoconf-v2.69 + - host-automake-v1.16 + - host-libtool + - host-gcc + pkgs_required: + - mlibc + configure: + - args: + - '@THIS_SOURCE_DIR@/jq-1.7/configure' + - '--disable-docs' + - '--disable-valgrind' + - '--disable-maintainer-mode' + - '--with-oniguruma=builtin' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/patches/jq/jq.patch b/patches/jq/jq.patch new file mode 100644 index 00000000000..48435b6e0b3 --- /dev/null +++ b/patches/jq/jq.patch @@ -0,0 +1,40 @@ +diff -crB jq-1.7-orig/config/config.sub jq-1.7/config/config.sub +*** jq-1.7-orig/config/config.sub 2023-11-04 14:43:08.915178973 +1100 +--- jq-1.7/config/config.sub 2023-11-04 14:43:43.691560304 +1100 +*************** +*** 1754,1760 **** + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ +! | fiwix* ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) +--- 1754,1760 ---- + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ +! | fiwix* | aero* ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) +diff -crB jq-1.7-orig/modules/oniguruma/config.sub jq-1.7/modules/oniguruma/config.sub +*** jq-1.7-orig/modules/oniguruma/config.sub 2023-11-04 14:43:08.921845585 +1100 +--- jq-1.7/modules/oniguruma/config.sub 2023-11-04 14:44:17.544620423 +1100 +*************** +*** 1722,1728 **** + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ +! | nsk* | powerunix* | genode* | zvmoe* ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) +--- 1722,1728 ---- + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ +! | nsk* | powerunix* | genode* | zvmoe* | aero* ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) From 1e921f6297c23bed7446f6e909fb01c421985424 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 22 Nov 2023 18:22:37 +1100 Subject: [PATCH 277/368] stash Signed-off-by: Anhad Singh --- bootstrap.yml | 39 +++- bootstrap/xorg.yml | 21 +-- patches/mlibc/mlibc.patch | 291 +++++++++++++++++++++++++++++ src/aero_kernel/src/fs/procfs.rs | 32 +++- src/aero_kernel/src/userland/vm.rs | 21 ++- 5 files changed, 378 insertions(+), 26 deletions(-) create mode 100644 patches/mlibc/mlibc.patch diff --git a/bootstrap.yml b/bootstrap.yml index 89689e81971..9b8c3f297d0 100644 --- a/bootstrap.yml +++ b/bootstrap.yml @@ -943,6 +943,7 @@ packages: - '-Ddisable_iconv_option=true' - '--buildtype=release' - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' + - '-Ddisable_intl_option=true' - '@THIS_SOURCE_DIR@' build: - args: ['ninja'] @@ -970,6 +971,7 @@ packages: - '-Ddisable_iconv_option=true' - '--buildtype=debug' - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' + - '-Ddisable_intl_option=true' - '@THIS_SOURCE_DIR@' build: - args: ['ninja'] @@ -2132,13 +2134,43 @@ packages: environ: DESTDIR: '@THIS_COLLECT_DIR@' + - name: gettext + from_source: gettext + tools_required: + - host-gcc + - host-autoconf-v2.69 + - host-automake-v1.16 + pkgs_required: + - mlibc + configure: + - args: + - '@THIS_SOURCE_DIR@/configure' + - '--host=x86_64-aero' + - '--prefix=/usr' + - '--docdir=/usr/share/doc/gettext-0.22.3' + - '--enable-static=no' + - '--enable-shared=yes' + - '--disable-java' + - '--disable-nls' + - '--disable-acl' + - '--without-emacs' + - '--without-git' + - '--without-bzip2' + - '--without-xz' + - '--disable-curses' + build: + - args: ['make', '-j@PARALLELISM@'] + - args: ['make', 'install'] + environ: + DESTDIR: '@THIS_COLLECT_DIR@' + - name: libintl source: subdir: 'bundled' - url: 'https://ftp.gnu.org/gnu/gettext/gettext-0.21.1.tar.xz' + url: 'https://ftp.gnu.org/gnu/gettext/gettext-0.22.tar.xz' format: 'tar.xz' - extract_path: 'gettext-0.21.1' - version: '0.21.1' + extract_path: 'gettext-0.22' + version: '0.22' tools_required: - host-autoconf-v2.69 - host-automake-v1.16 @@ -2148,6 +2180,7 @@ packages: tools_required: - host-gcc pkgs_required: + - mlibc - libiconv configure: - args: diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml index 2078bb2a9b1..3ce977b6aaf 100644 --- a/bootstrap/xorg.yml +++ b/bootstrap/xorg.yml @@ -32,18 +32,11 @@ sources: - name: gettext subdir: 'bundled' - git: 'https://git.savannah.gnu.org/git/gettext.git' - tag: 'v0.19.8' - version: '0.19.8' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' + url: 'https://ftp.gnu.org/pub/gnu/gettext/gettext-0.22.3.tar.gz' + checksum: blake2b:aebe85a82cb94c37ed81e9801acf1e89d150f5992fb9be42d53b3f2734c5c95804f0051fabc26b8d0892dfaf89d18df16d4bca6bcb2e9b95eef5d4ae93a64379 + extract_path: 'gettext-0.22.3' + format: 'tar.gz' + version: '0.22.3' - name: gobject-introspection subdir: 'bundled' @@ -2464,8 +2457,8 @@ packages: source: subdir: 'bundled' git: 'https://gitlab.gnome.org/GNOME/gtk.git' - tag: '3.24.23' - version: '3.24.23' + tag: '3.24.28' + version: '3.24.28' tools_required: - host-gcc - virtual: pkgconfig-for-target diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch new file mode 100644 index 00000000000..9177a8cd494 --- /dev/null +++ b/patches/mlibc/mlibc.patch @@ -0,0 +1,291 @@ +From ea30fe59e091c87eb09d24c20946ee7a90d371c2 Mon Sep 17 00:00:00 2001 +From: Anhad Singh +Date: Tue, 14 Nov 2023 17:51:25 +1100 +Subject: [PATCH] + +Signed-off-by: Anhad Singh + +diff --git a/options/intl/generic/libintl-stubs.cpp b/options/intl/generic/libintl-stubs.cpp +index 8d4b28f..94ab421 100644 +--- a/options/intl/generic/libintl-stubs.cpp ++++ b/options/intl/generic/libintl-stubs.cpp +@@ -1,73 +1,57 @@ + #include ++#include ++#include ++#include + #include + ++static char *current_domain; ++ + char *gettext(const char *msgid) { +- (void)msgid; +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ // (void)msgid; ++ // __ensure(!"Not implemented"); ++ // __builtin_unreachable(); ++ return (char*)""; + } + + char *dgettext(const char *domainname, const char *msgid) { +- (void)domainname; +- (void)msgid; +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ return (char*)""; + } + + char *dcgettext(const char *domainname, const char *msgid, + int category) { +- (void)domainname; +- (void)msgid; +- (void)category; +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ return (char*)""; ++ + } + + char *ngettext(const char *msgid, const char *msgid_plural, unsigned long int n) { +- (void)msgid; +- (void)msgid_plural; +- (void)n; +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ return (char*)""; ++ + } + + char *dngettext(const char *domainname, const char *msgid, + const char *msgid_plural, unsigned long int n) { +- (void)domainname; +- (void)msgid; +- (void)msgid_plural; +- (void)n; +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ return (char*)""; ++ + } + + char *dcngettext(const char *domainname, const char *msgid, + const char *msgid_plural, unsigned long int n, int category) { +- (void)domainname; +- (void)msgid; +- (void)msgid_plural; +- (void)n; +- (void)category; +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ return (char*)""; ++ + } + + char *textdomain(const char *domainname) { +- (void)domainname; +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ if(!domainname) ++ return current_domain ? current_domain : (char *)"messages"; ++ ++ return (char*)"messages"; + } + + char *bindtextdomain(const char *domainname, const char *dirname) { +- (void)domainname; +- (void)dirname; +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ return (char*)""; ++ + } + + char *bind_textdomain_codeset(const char *domainname, const char *codeset) { +- (void)domainname; +- (void)codeset; +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ return (char*)""; + } +diff --git a/options/posix/generic/pthread-stubs.cpp b/options/posix/generic/pthread-stubs.cpp +index 5618dc6..cd9350d 100644 +--- a/options/posix/generic/pthread-stubs.cpp ++++ b/options/posix/generic/pthread-stubs.cpp +@@ -299,7 +299,7 @@ int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr) { + if (!tcb->stackAddr || !tcb->stackSize) { + // allocate stack + +- attr->__mlibc_stackaddr = 0x00; ++ attr->__mlibc_stackaddr = (void*)0x7ffffff9a000; + attr->__mlibc_stacksize = 0x20000; + // get_own_stackinfo(&attr->__mlibc_stackaddr, &attr->__mlibc_stacksize); + } else { +diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp +index 50cca94..a095ab0 100644 +--- a/options/rtdl/generic/linker.cpp ++++ b/options/rtdl/generic/linker.cpp +@@ -438,6 +438,7 @@ void ObjectRepository::_fetchFromFile(SharedObject *object, int fd) { + + __ensure(!(object->baseAddress & (hugeSize - 1))); + ++ size_t tagSize = highest_address - object->baseAddress; + #if MLIBC_MMAP_ALLOCATE_DSO + void *mappedAddr = nullptr; + +@@ -457,9 +458,11 @@ void ObjectRepository::_fetchFromFile(SharedObject *object, int fd) { + libraryBase += (highest_address + (hugeSize - 1)) & ~(hugeSize - 1); + #endif + +- if(verbose || logBaseAddresses) ++ if(verbose || logBaseAddresses) { ++ mlibc::sys_tag_memory((void *)object->baseAddress, tagSize, object->name.data()); + mlibc::infoLogger() << "rtdl: Loading " << object->name + << " at " << (void *)object->baseAddress << frg::endlog; ++ } + + // Load all segments. + constexpr size_t pageSize = 0x1000; +diff --git a/options/rtdl/include/mlibc/rtdl-sysdeps.hpp b/options/rtdl/include/mlibc/rtdl-sysdeps.hpp +index c35271c..8a941b2 100644 +--- a/options/rtdl/include/mlibc/rtdl-sysdeps.hpp ++++ b/options/rtdl/include/mlibc/rtdl-sysdeps.hpp +@@ -6,6 +6,7 @@ namespace [[gnu::visibility("hidden")]] mlibc { + int sys_tcb_set(void *pointer); + + [[gnu::weak]] int sys_vm_readahead(void *pointer, size_t size); ++[[gnu::weak]] int sys_tag_memory(void *ptr, size_t size, char *tag); + + } // namespace mlibc + +diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp +index e19b159..e3c11a4 100644 +--- a/sysdeps/aero/generic/aero.cpp ++++ b/sysdeps/aero/generic/aero.cpp +@@ -62,6 +62,10 @@ static frg::vector create_slice(char *const arg[]) { + } + + namespace mlibc { ++int sys_tag_memory(void *ptr, size_t size, char *tag) { ++ return syscall(SYS_DEBUG, ptr, size, tag, strlen(tag)); ++} ++ + int sys_uname(struct utsname *buf) { + auto result = syscall(SYS_UNAME, buf); + +@@ -73,6 +77,8 @@ int sys_uname(struct utsname *buf) { + } + + int sys_futex_wait(int *pointer, int expected, const struct timespec *time) { ++ while (*pointer == expected) {} ++ + // auto result = syscall(SYS_FUTEX_WAIT, pointer, expected, time); + // + // if (result < 0) { +@@ -309,7 +315,7 @@ int sys_thread_setname(void *tcb, const char *name) { + } + + void sys_thread_exit() { +- syscall(SYS_EXIT); ++ syscall(SYS_EXIT, 0); + __builtin_trap(); + } + +diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp +index 33a11f4..4f64ba5 100644 +--- a/sysdeps/aero/generic/filesystem.cpp ++++ b/sysdeps/aero/generic/filesystem.cpp +@@ -68,15 +68,22 @@ int sys_seek(int fd, off_t offset, int whence, off_t *new_offset) { + return 0; + } + +-int sys_open(const char *filename, int flags, mode_t mode, int *fd) { +- auto result = syscall(SYS_OPEN, 0, filename, strlen(filename), flags); ++int sys_openat(int dirfd, const char *path, int flags, mode_t mode, int *fd) { ++ (void)mode; + +- if (result < 0) { +- return -result; +- } ++ auto ret = syscall(SYS_OPEN, dirfd, path, strlen(path), flags); ++ if (int e = sc_error(ret); e) ++ return e; ++ *fd = ret; ++ return 0; ++} + +- *fd = result; +- return 0; ++int sys_open(const char *path, int flags, mode_t mode, int *fd) { ++ return sys_openat(AT_FDCWD, path, flags, mode, fd); ++} ++ ++int sys_open_dir(const char *path, int *fd) { ++ return sys_open(path, O_DIRECTORY, 0, fd); + } + + int sys_close(int fd) { +@@ -256,10 +263,6 @@ int sys_read_entries(int handle, void *buffer, size_t max_size, + return 0; + } + +-int sys_open_dir(const char *path, int *handle) { +- return sys_open(path, O_DIRECTORY, 0, handle); +-} +- + int sys_rename(const char *path, const char *new_path) { + auto result = + syscall(SYS_RENAME, path, strlen(path), new_path, strlen(new_path)); +@@ -305,6 +308,13 @@ int sys_dup2(int fd, int flags, int newfd) { + } + + int sys_fcntl(int fd, int request, va_list args, int *result_value) { ++ if(request == F_GETLK) { ++ struct flock *lock = va_arg(args, struct flock *); ++ lock->l_type = F_UNLCK; ++ mlibc::infoLogger() << "\e[31mmlibc: F_GETLK is stubbed!\e[39m" << frg::endlog; ++ return 0; ++ } ++ + auto result = syscall(SYS_FCNTL, fd, request, va_arg(args, uint64_t)); + + if (result < 0) { +diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp +index 10af36a..bf2602f 100644 +--- a/sysdeps/aero/generic/sockets.cpp ++++ b/sysdeps/aero/generic/sockets.cpp +@@ -174,14 +174,10 @@ int sys_getsockopt(int fd, int layer, int number, void *__restrict buffer, + + int sys_setsockopt(int fd, int layer, int number, const void *buffer, + socklen_t size) { +- (void)fd; +- (void)buffer; +- (void)size; +- + if (layer == SOL_SOCKET && number == SO_PASSCRED) { +- mlibc::infoLogger() << "\e[31mmlibc: setsockopt(SO_PASSCRED) is not " +- "implemented correctly\e[39m" +- << frg::endlog; ++ auto ret = syscall(SYS_SETSOCKOPT, fd, layer, number, buffer, size); ++ if (int e = sc_error(ret); e) ++ return e; + return 0; + } else if (layer == SOL_SOCKET && number == SO_ATTACH_FILTER) { + mlibc::infoLogger() << "\e[31mmlibc: setsockopt(SO_ATTACH_FILTER) is " +diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h +index 39c5b65..bd2f489 100644 +--- a/sysdeps/aero/include/aero/syscall.h ++++ b/sysdeps/aero/include/aero/syscall.h +@@ -82,6 +82,9 @@ + #define SYS_SOCK_SHUTDOWN 75 + #define SYS_GETPEERNAME 76 + #define SYS_GETSOCKNAME 77 ++#define SYS_DEBUG 78 ++#define SYS_SETSOCKOPT 79 ++#define SYS_GETSOCKOPT 80 + + // Invalid syscall used to trigger a log error in the kernel (as a hint) + // so, that we can implement the syscall in the kernel. +-- +2.42.1 + diff --git a/src/aero_kernel/src/fs/procfs.rs b/src/aero_kernel/src/fs/procfs.rs index 31f9d4521f7..073d08744e0 100644 --- a/src/aero_kernel/src/fs/procfs.rs +++ b/src/aero_kernel/src/fs/procfs.rs @@ -1,5 +1,6 @@ use core::sync::atomic::{AtomicUsize, Ordering}; +use alloc::borrow::ToOwned; use alloc::collections::BTreeMap; use alloc::string::{String, ToString}; use alloc::sync::{Arc, Weak}; @@ -18,6 +19,9 @@ use super::FileSystemError; use super::inode::*; use super::*; +// TODO: put this mf in prelude +use alloc::vec; + fn push_string_if_some(map: &mut serde_json::Value, key: &str, value: Option) { if let Some(value) = value { map[key] = serde_json::Value::String(value); @@ -41,7 +45,6 @@ fn get_cpuinfo_cached() -> &'static str { static CACHED: Once = Once::new(); CACHED.call_once(|| { - use alloc::vec; use serde_json::*; let mut data = json!({ "processors": [] }); @@ -93,6 +96,7 @@ struct ProcINode { enum FileContents { CpuInfo, CmdLine, + SelfMaps, None, } @@ -166,8 +170,25 @@ impl INodeInterface for LockedProcINode { let this = self.0.read(); let data = match &this.contents { - FileContents::CpuInfo => Ok(get_cpuinfo_cached()), - FileContents::CmdLine => Ok(get_cmdline_cached()), + FileContents::CpuInfo => Ok(get_cpuinfo_cached().to_owned()), + FileContents::CmdLine => Ok(get_cmdline_cached().to_owned()), + + FileContents::SelfMaps => { + let current_thread = scheduler::current_thread(); + let mut result = serde_json::json!({ "maps": [] }); + let maps = result.get_mut("maps").unwrap().as_array_mut().unwrap(); + + current_thread.vm().for_each_mapping(|map| { + maps.push(serde_json::json!({ + "start": map.start_addr.as_u64(), + "end": map.end_addr.as_u64(), + "flags": map.flags.bits(), + "protection": map.protection.bits(), + })); + }); + + Ok(result.to_string()) + } _ => Err(FileSystemError::NotSupported), }?; @@ -277,6 +298,11 @@ impl ProcFs { inode.make_inode("cpuinfo", FileType::File, FileContents::CpuInfo)?; inode.make_inode("cmdline", FileType::File, FileContents::CmdLine)?; + let proc_self = inode.make_inode("self", FileType::Directory, FileContents::None)?; + let proc_self = proc_self.downcast_arc::().unwrap(); + + proc_self.make_inode("maps", FileType::File, FileContents::SelfMaps)?; + Ok(ramfs) } diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 884f870ad2d..4e8a69e427b 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -334,14 +334,14 @@ impl MMapFile { } #[derive(Debug, Clone)] -struct Mapping { - protection: MMapProt, - flags: MMapFlags, +pub struct Mapping { + pub protection: MMapProt, + pub flags: MMapFlags, - start_addr: VirtAddr, - end_addr: VirtAddr, + pub start_addr: VirtAddr, + pub end_addr: VirtAddr, - file: Option, + pub file: Option, refresh_flags: bool, } @@ -1237,4 +1237,13 @@ impl Vm { .lock() .handle_page_fault(reason, accessed_address) } + + pub fn for_each_mapping(&self, mut f: F) + where + F: FnMut(&Mapping), + { + for map in &self.inner.lock().mappings { + f(map); + } + } } From 04a856c95ae79b82346b3af8c32c897cbd183682 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 20 Dec 2023 14:29:37 +1100 Subject: [PATCH 278/368] misc(kernel): remove the `trait_upcasting` feature The feature now has been stabalized. Signed-off-by: Anhad Singh --- src/aero_kernel/src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 58967ac1b36..3a391441363 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -45,7 +45,6 @@ const_trait_impl, // https://github.com/rust-lang/rust/issues/67792 int_roundings, // https://github.com/rust-lang/rust/issues/88581 const_ptr_is_null, // https://github.com/rust-lang/rust/issues/74939 - trait_upcasting, // https://github.com/rust-lang/rust/issues/65991 naked_functions, // https://github.com/rust-lang/rust/issues/32408 cfg_match, // https://github.com/rust-lang/rust/issues/115585 strict_provenance, From 6d92cdc212acc5fb6c778f22a23f3c3681cec2ef Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 5 Jan 2024 23:59:59 +1100 Subject: [PATCH 279/368] misc(everywhere): update copyright year :^) Happy new year :^) Signed-off-by: Anhad Singh --- aero.py | 21 ++++++++++++------- src/aero_kernel/build.rs | 2 +- src/aero_kernel/src/acpi/fadt.rs | 2 +- src/aero_kernel/src/acpi/hpet.rs | 2 +- src/aero_kernel/src/acpi/madt.rs | 2 +- src/aero_kernel/src/acpi/mcfg.rs | 2 +- src/aero_kernel/src/acpi/mod.rs | 2 +- src/aero_kernel/src/acpi/rsdp.rs | 2 +- src/aero_kernel/src/acpi/sdt.rs | 2 +- src/aero_kernel/src/arch/aarch64/mod.rs | 2 +- src/aero_kernel/src/arch/aarch64/task.rs | 2 +- src/aero_kernel/src/arch/aarch64/time.rs | 2 +- src/aero_kernel/src/arch/aarch64/tls.rs | 2 +- src/aero_kernel/src/arch/mod.rs | 2 +- src/aero_kernel/src/arch/x86_64/apic.rs | 2 +- .../src/arch/x86_64/controlregs.rs | 2 +- src/aero_kernel/src/arch/x86_64/cpu_local.rs | 2 +- src/aero_kernel/src/arch/x86_64/gdt.rs | 2 +- .../src/arch/x86_64/interrupts/exceptions.rs | 2 +- .../src/arch/x86_64/interrupts/idt.rs | 2 +- .../src/arch/x86_64/interrupts/mod.rs | 2 +- src/aero_kernel/src/arch/x86_64/io.rs | 2 +- src/aero_kernel/src/arch/x86_64/mem.rs | 2 +- src/aero_kernel/src/arch/x86_64/mod.rs | 2 +- src/aero_kernel/src/arch/x86_64/signals.rs | 2 +- src/aero_kernel/src/arch/x86_64/task.rs | 2 +- src/aero_kernel/src/arch/x86_64/time.rs | 2 +- src/aero_kernel/src/arch/x86_64/tls.rs | 2 +- src/aero_kernel/src/arch/x86_64/user_copy.rs | 2 +- src/aero_kernel/src/cmdline.rs | 17 +++++++++++++++ src/aero_kernel/src/drivers/block/ahci.rs | 2 +- .../src/drivers/block/ide/channel.rs | 2 +- src/aero_kernel/src/drivers/block/ide/mod.rs | 2 +- .../src/drivers/block/ide/registers.rs | 2 +- .../src/drivers/block/nvme/command.rs | 2 +- src/aero_kernel/src/drivers/block/nvme/mod.rs | 2 +- src/aero_kernel/src/drivers/drm/mod.rs | 2 +- src/aero_kernel/src/drivers/drm/rawfb.rs | 2 +- src/aero_kernel/src/drivers/e1000.rs | 2 +- src/aero_kernel/src/drivers/keyboard.rs | 2 +- src/aero_kernel/src/drivers/lai.rs | 2 +- src/aero_kernel/src/drivers/mod.rs | 2 +- src/aero_kernel/src/drivers/mouse.rs | 2 +- src/aero_kernel/src/drivers/pci.rs | 2 +- src/aero_kernel/src/drivers/pty.rs | 2 +- src/aero_kernel/src/drivers/tty/ctty.rs | 2 +- src/aero_kernel/src/drivers/tty/mod.rs | 2 +- src/aero_kernel/src/drivers/tty/vtty.rs | 2 +- src/aero_kernel/src/drivers/uart_16550.rs | 2 +- src/aero_kernel/src/drivers/uart_pl011.rs | 2 +- src/aero_kernel/src/emu.rs | 17 +++++++++++++++ src/aero_kernel/src/fs/block/gpt.rs | 2 +- src/aero_kernel/src/fs/block/mod.rs | 2 +- src/aero_kernel/src/fs/cache.rs | 2 +- src/aero_kernel/src/fs/devfs.rs | 2 +- src/aero_kernel/src/fs/epoll.rs | 2 +- src/aero_kernel/src/fs/eventfd.rs | 2 +- src/aero_kernel/src/fs/ext2/disk.rs | 2 +- src/aero_kernel/src/fs/ext2/group_desc.rs | 2 +- src/aero_kernel/src/fs/ext2/mod.rs | 2 +- src/aero_kernel/src/fs/file_table.rs | 2 +- src/aero_kernel/src/fs/inode.rs | 2 +- src/aero_kernel/src/fs/mod.rs | 2 +- src/aero_kernel/src/fs/pipe.rs | 17 +++++++++++++++ src/aero_kernel/src/fs/procfs.rs | 17 +++++++++++++++ src/aero_kernel/src/fs/ramfs.rs | 2 +- src/aero_kernel/src/logger.rs | 2 +- src/aero_kernel/src/main.rs | 2 +- src/aero_kernel/src/mem/alloc.rs | 2 +- src/aero_kernel/src/mem/mod.rs | 2 +- src/aero_kernel/src/mem/paging/addr.rs | 2 +- src/aero_kernel/src/mem/paging/frame.rs | 2 +- src/aero_kernel/src/mem/paging/mapper.rs | 2 +- src/aero_kernel/src/mem/paging/mod.rs | 2 +- src/aero_kernel/src/mem/paging/page.rs | 2 +- src/aero_kernel/src/mem/paging/page_table.rs | 2 +- src/aero_kernel/src/mem/pti.rs | 2 +- src/aero_kernel/src/mem/slab.rs | 2 +- src/aero_kernel/src/mem/vmalloc.rs | 2 +- src/aero_kernel/src/modules.rs | 2 +- src/aero_kernel/src/net/arp.rs | 2 +- src/aero_kernel/src/net/loopback.rs | 2 +- src/aero_kernel/src/net/mod.rs | 2 +- src/aero_kernel/src/net/tcp.rs | 2 +- src/aero_kernel/src/net/udp.rs | 2 +- src/aero_kernel/src/rendy.rs | 2 +- src/aero_kernel/src/socket/ipv4.rs | 2 +- src/aero_kernel/src/socket/mod.rs | 2 +- src/aero_kernel/src/socket/netlink.rs | 17 +++++++++++++++ src/aero_kernel/src/socket/tcp.rs | 17 +++++++++++++++ src/aero_kernel/src/socket/udp.rs | 2 +- src/aero_kernel/src/socket/unix.rs | 2 +- src/aero_kernel/src/syscall/fs.rs | 2 +- src/aero_kernel/src/syscall/futex.rs | 2 +- src/aero_kernel/src/syscall/ipc.rs | 2 +- src/aero_kernel/src/syscall/mod.rs | 2 +- src/aero_kernel/src/syscall/net.rs | 17 +++++++++++++++ src/aero_kernel/src/syscall/process.rs | 2 +- src/aero_kernel/src/syscall/time.rs | 2 +- src/aero_kernel/src/tests.rs | 2 +- src/aero_kernel/src/unwind.rs | 2 +- src/aero_kernel/src/userland/mod.rs | 2 +- src/aero_kernel/src/userland/scheduler/mod.rs | 2 +- .../src/userland/scheduler/round_robin.rs | 2 +- src/aero_kernel/src/userland/signals.rs | 2 +- src/aero_kernel/src/userland/task/mod.rs | 2 +- src/aero_kernel/src/userland/task/sessions.rs | 2 +- src/aero_kernel/src/userland/terminal.rs | 2 +- src/aero_kernel/src/userland/vm.rs | 2 +- src/aero_kernel/src/utils/bitmap.rs | 17 +++++++++++++++ src/aero_kernel/src/utils/buffer.rs | 2 +- src/aero_kernel/src/utils/dma.rs | 2 +- src/aero_kernel/src/utils/mod.rs | 2 +- src/aero_kernel/src/utils/sync.rs | 17 +++++++++++++++ src/aero_proc/src/cpu_local.rs | 17 +++++++++++++++ src/aero_proc/src/downcastable.rs | 17 +++++++++++++++ src/aero_proc/src/indirect.rs | 17 +++++++++++++++ src/aero_proc/src/ioctl.rs | 17 +++++++++++++++ src/aero_proc/src/lib.rs | 2 +- src/aero_proc/src/syscall.rs | 2 +- src/aero_proc/src/test.rs | 2 +- src/aero_syscall/src/consts.rs | 2 +- src/aero_syscall/src/lib.rs | 2 +- src/aero_syscall/src/signal.rs | 2 +- src/aero_syscall/src/syscall.rs | 2 +- src/aero_syscall/src/time.rs | 2 +- userland/apps/window_test/src/main.rs | 2 +- userland/servers/system_server/src/main.rs | 2 +- userland/servers/window_server/src/main.rs | 2 +- 129 files changed, 349 insertions(+), 123 deletions(-) diff --git a/aero.py b/aero.py index 48a7af35540..a7123bee96f 100755 --- a/aero.py +++ b/aero.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# Copyright (C) 2021-2022 The Aero Project Developers. +# Copyright (C) 2021-2024 The Aero Project Developers. # # This file is part of The Aero Project. # @@ -90,6 +90,7 @@ def __init__(self, target_arch: str, args: argparse.Namespace): def get_userland_tool(): return os.path.join(SYSROOT_DIR, "tools") def get_userland_package(): return os.path.join(SYSROOT_DIR, "packages") + def remove_prefix(string: str, prefix: str): if string.startswith(prefix): return string[len(prefix):] @@ -295,7 +296,7 @@ def build_userland_sysroot(minimal): if not os.path.islink(blink): # symlink the bootstrap.yml file in the src root to sysroot/bootstrap.link symlink_rel('bootstrap.yml', blink) - + def run_xbstrap(args): try: return run_command(['xbstrap', *args], cwd=SYSROOT_DIR) @@ -310,7 +311,8 @@ def run_xbstrap(args): code, _, _ = run_xbstrap(command) if code != 0: - log_error(f"`xbstrap {' '.join(command)}` exited with a non-zero status code") + log_error( + f"`xbstrap {' '.join(command)}` exited with a non-zero status code") exit(1) @@ -320,7 +322,8 @@ def build_userland(args): host_cargo = os.path.join(SYSROOT_DIR, "tools/host-rust") if not os.path.exists(host_cargo): - log_error("host-rust not built as a part of the sysroot, skipping compilation of `userland/`") + log_error( + "host-rust not built as a part of the sysroot, skipping compilation of `userland/`") return [] HOST_RUST = "host-rust/bin/rustc" @@ -465,7 +468,7 @@ def run_in_emulator(build_info: BuildInfo, iso_path): '-serial', 'stdio', '-drive', 'file=build/disk.img,if=none,id=NVME1,format=raw', '-device', 'nvme,drive=NVME1,serial=nvme', # Specify the boot order (where `d` is the first CD-ROM drive) - '--boot', 'd', + '--boot', 'd', '-s'] if args.bios == 'uefi': @@ -503,7 +506,8 @@ def run_in_emulator(build_info: BuildInfo, iso_path): if not qemu_binary: qemu_binary = f'qemu-system-{build_info.target_arch}' else: - qemu_binary = os.path.join(qemu_binary, f'qemu-system-{build_info.target_arch}'); + qemu_binary = os.path.join( + qemu_binary, f'qemu-system-{build_info.target_arch}') log_info(f"{qemu_binary} {' '.join(qemu_args)}") run_command([qemu_binary, *qemu_args]) @@ -597,7 +601,8 @@ def main(): if os.path.exists(BUILD_DIR): system_root = os.path.join(SYSROOT_DIR, 'system-root') - sysroot_mod = max(os.path.getmtime(os.path.join(system_root, file)) for file in os.listdir(system_root)) + sysroot_mod = max(os.path.getmtime(os.path.join(system_root, file)) + for file in os.listdir(system_root)) build_mod = os.path.getmtime(BUILD_DIR) if sysroot_mod > build_mod: log_info("sysroot modified, rebuilding") @@ -649,7 +654,7 @@ def main(): if not kernel_bin or args.check: return - + if not user_bins: user_bins = [] diff --git a/src/aero_kernel/build.rs b/src/aero_kernel/build.rs index 7af6bbde842..6e10d97a25e 100644 --- a/src/aero_kernel/build.rs +++ b/src/aero_kernel/build.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/acpi/fadt.rs b/src/aero_kernel/src/acpi/fadt.rs index 96205d77a3e..7f77f57100e 100644 --- a/src/aero_kernel/src/acpi/fadt.rs +++ b/src/aero_kernel/src/acpi/fadt.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/acpi/hpet.rs b/src/aero_kernel/src/acpi/hpet.rs index 89e211f0ae8..af50003ff27 100644 --- a/src/aero_kernel/src/acpi/hpet.rs +++ b/src/aero_kernel/src/acpi/hpet.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/acpi/madt.rs b/src/aero_kernel/src/acpi/madt.rs index dfaada3a4fd..e75dc324850 100644 --- a/src/aero_kernel/src/acpi/madt.rs +++ b/src/aero_kernel/src/acpi/madt.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/acpi/mcfg.rs b/src/aero_kernel/src/acpi/mcfg.rs index 72202a0c50c..d24508260a8 100644 --- a/src/aero_kernel/src/acpi/mcfg.rs +++ b/src/aero_kernel/src/acpi/mcfg.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/acpi/mod.rs b/src/aero_kernel/src/acpi/mod.rs index 9199dd68e1f..5503c41f5ce 100644 --- a/src/aero_kernel/src/acpi/mod.rs +++ b/src/aero_kernel/src/acpi/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/acpi/rsdp.rs b/src/aero_kernel/src/acpi/rsdp.rs index 5baa2eae1df..0ddd290fafc 100644 --- a/src/aero_kernel/src/acpi/rsdp.rs +++ b/src/aero_kernel/src/acpi/rsdp.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/acpi/sdt.rs b/src/aero_kernel/src/acpi/sdt.rs index 3933d698754..8d1c9292314 100644 --- a/src/aero_kernel/src/acpi/sdt.rs +++ b/src/aero_kernel/src/acpi/sdt.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/aarch64/mod.rs b/src/aero_kernel/src/arch/aarch64/mod.rs index 2fa8cc4fa95..0a9d9c9f31c 100644 --- a/src/aero_kernel/src/arch/aarch64/mod.rs +++ b/src/aero_kernel/src/arch/aarch64/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/aarch64/task.rs b/src/aero_kernel/src/arch/aarch64/task.rs index 2189ff28bb9..fc0c5247f53 100644 --- a/src/aero_kernel/src/arch/aarch64/task.rs +++ b/src/aero_kernel/src/arch/aarch64/task.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/aarch64/time.rs b/src/aero_kernel/src/arch/aarch64/time.rs index 989ca06e0f3..950bfc34fd3 100644 --- a/src/aero_kernel/src/arch/aarch64/time.rs +++ b/src/aero_kernel/src/arch/aarch64/time.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/aarch64/tls.rs b/src/aero_kernel/src/arch/aarch64/tls.rs index b6fb352f528..68b8a48b63a 100644 --- a/src/aero_kernel/src/arch/aarch64/tls.rs +++ b/src/aero_kernel/src/arch/aarch64/tls.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/mod.rs b/src/aero_kernel/src/arch/mod.rs index 3c761a2b177..d218c34ae03 100644 --- a/src/aero_kernel/src/arch/mod.rs +++ b/src/aero_kernel/src/arch/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/apic.rs b/src/aero_kernel/src/arch/x86_64/apic.rs index 6b08befd45b..464f5116c93 100644 --- a/src/aero_kernel/src/arch/x86_64/apic.rs +++ b/src/aero_kernel/src/arch/x86_64/apic.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/controlregs.rs b/src/aero_kernel/src/arch/x86_64/controlregs.rs index 690f09ffa61..93516f60a22 100644 --- a/src/aero_kernel/src/arch/x86_64/controlregs.rs +++ b/src/aero_kernel/src/arch/x86_64/controlregs.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/cpu_local.rs b/src/aero_kernel/src/arch/x86_64/cpu_local.rs index f42b6372288..9e0a911ce0e 100644 --- a/src/aero_kernel/src/arch/x86_64/cpu_local.rs +++ b/src/aero_kernel/src/arch/x86_64/cpu_local.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index 8a651b6a2d7..272b732d626 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs index 315d0f65105..d5c66833a09 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/exceptions.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs index 319fed51093..3399dac4f5d 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs index ce3e0bfc055..fecaf75bbc3 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/io.rs b/src/aero_kernel/src/arch/x86_64/io.rs index cd8ea6bcc52..f32d66dabe4 100644 --- a/src/aero_kernel/src/arch/x86_64/io.rs +++ b/src/aero_kernel/src/arch/x86_64/io.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/mem.rs b/src/aero_kernel/src/arch/x86_64/mem.rs index 5871c7cf008..c89f15e0648 100644 --- a/src/aero_kernel/src/arch/x86_64/mem.rs +++ b/src/aero_kernel/src/arch/x86_64/mem.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index d66038d474c..113ba35123b 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/signals.rs b/src/aero_kernel/src/arch/x86_64/signals.rs index a6819abd49b..4582aa1eaf3 100644 --- a/src/aero_kernel/src/arch/x86_64/signals.rs +++ b/src/aero_kernel/src/arch/x86_64/signals.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index c2aa7bfa6a5..57851514a03 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/time.rs b/src/aero_kernel/src/arch/x86_64/time.rs index f9a6c86c8e5..b783ec7c465 100644 --- a/src/aero_kernel/src/arch/x86_64/time.rs +++ b/src/aero_kernel/src/arch/x86_64/time.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/tls.rs b/src/aero_kernel/src/arch/x86_64/tls.rs index e2cedfb0388..f202b64aa83 100644 --- a/src/aero_kernel/src/arch/x86_64/tls.rs +++ b/src/aero_kernel/src/arch/x86_64/tls.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/arch/x86_64/user_copy.rs b/src/aero_kernel/src/arch/x86_64/user_copy.rs index 18c0509fd34..630fd2a062a 100644 --- a/src/aero_kernel/src/arch/x86_64/user_copy.rs +++ b/src/aero_kernel/src/arch/x86_64/user_copy.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/cmdline.rs b/src/aero_kernel/src/cmdline.rs index d5299aac0c4..b64e1ad5648 100644 --- a/src/aero_kernel/src/cmdline.rs +++ b/src/aero_kernel/src/cmdline.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use core::num::ParseIntError; use limine::NonNullPtr; diff --git a/src/aero_kernel/src/drivers/block/ahci.rs b/src/aero_kernel/src/drivers/block/ahci.rs index bbe5b67c291..dab2c669946 100644 --- a/src/aero_kernel/src/drivers/block/ahci.rs +++ b/src/aero_kernel/src/drivers/block/ahci.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/block/ide/channel.rs b/src/aero_kernel/src/drivers/block/ide/channel.rs index a243b58faf1..a64340807c3 100644 --- a/src/aero_kernel/src/drivers/block/ide/channel.rs +++ b/src/aero_kernel/src/drivers/block/ide/channel.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/block/ide/mod.rs b/src/aero_kernel/src/drivers/block/ide/mod.rs index 688172d8909..f15d05ded6a 100644 --- a/src/aero_kernel/src/drivers/block/ide/mod.rs +++ b/src/aero_kernel/src/drivers/block/ide/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/block/ide/registers.rs b/src/aero_kernel/src/drivers/block/ide/registers.rs index 080ad60c905..3b22a83124d 100644 --- a/src/aero_kernel/src/drivers/block/ide/registers.rs +++ b/src/aero_kernel/src/drivers/block/ide/registers.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/block/nvme/command.rs b/src/aero_kernel/src/drivers/block/nvme/command.rs index 49e8353d090..c967885ebbc 100644 --- a/src/aero_kernel/src/drivers/block/nvme/command.rs +++ b/src/aero_kernel/src/drivers/block/nvme/command.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 706776e5149..e60e438b8b1 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/drm/mod.rs b/src/aero_kernel/src/drivers/drm/mod.rs index 757b2e3c5c5..2cbfbb7e35e 100644 --- a/src/aero_kernel/src/drivers/drm/mod.rs +++ b/src/aero_kernel/src/drivers/drm/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/drm/rawfb.rs b/src/aero_kernel/src/drivers/drm/rawfb.rs index d1dbe98ec34..0b7f06064ac 100644 --- a/src/aero_kernel/src/drivers/drm/rawfb.rs +++ b/src/aero_kernel/src/drivers/drm/rawfb.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index dfb58016563..7fc30e2cc6d 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index 1968a2e40fb..c5e819665f3 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/lai.rs b/src/aero_kernel/src/drivers/lai.rs index 02542e86b18..08c6a0114b4 100644 --- a/src/aero_kernel/src/drivers/lai.rs +++ b/src/aero_kernel/src/drivers/lai.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/mod.rs b/src/aero_kernel/src/drivers/mod.rs index 7d11c0bb4c0..8cbab02c810 100644 --- a/src/aero_kernel/src/drivers/mod.rs +++ b/src/aero_kernel/src/drivers/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs index eadf67f6eca..17c47f4f19d 100644 --- a/src/aero_kernel/src/drivers/mouse.rs +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2022 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index 08c53cae987..1b652d50623 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index ae9b98d3148..931b8db71be 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/tty/ctty.rs b/src/aero_kernel/src/drivers/tty/ctty.rs index 19976314f64..5ad2a3880b2 100644 --- a/src/aero_kernel/src/drivers/tty/ctty.rs +++ b/src/aero_kernel/src/drivers/tty/ctty.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/tty/mod.rs b/src/aero_kernel/src/drivers/tty/mod.rs index a98769fc943..ed6b630ad4d 100644 --- a/src/aero_kernel/src/drivers/tty/mod.rs +++ b/src/aero_kernel/src/drivers/tty/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/tty/vtty.rs b/src/aero_kernel/src/drivers/tty/vtty.rs index 7edb0c53add..11b8a16b68a 100644 --- a/src/aero_kernel/src/drivers/tty/vtty.rs +++ b/src/aero_kernel/src/drivers/tty/vtty.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/uart_16550.rs b/src/aero_kernel/src/drivers/uart_16550.rs index 39ea116cc3f..bcbed46d368 100644 --- a/src/aero_kernel/src/drivers/uart_16550.rs +++ b/src/aero_kernel/src/drivers/uart_16550.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/drivers/uart_pl011.rs b/src/aero_kernel/src/drivers/uart_pl011.rs index e5604826bd6..ecce06cfb5f 100644 --- a/src/aero_kernel/src/drivers/uart_pl011.rs +++ b/src/aero_kernel/src/drivers/uart_pl011.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/emu.rs b/src/aero_kernel/src/emu.rs index d4810f54560..bef1869d8d9 100644 --- a/src/aero_kernel/src/emu.rs +++ b/src/aero_kernel/src/emu.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use crate::utils::io; #[repr(u32)] diff --git a/src/aero_kernel/src/fs/block/gpt.rs b/src/aero_kernel/src/fs/block/gpt.rs index 3974338c853..b52473b7dd6 100644 --- a/src/aero_kernel/src/fs/block/gpt.rs +++ b/src/aero_kernel/src/fs/block/gpt.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index c7589fec014..6255ded512f 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index d20bd0fe4c7..b18cbee1ad9 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index 73b383b6fcf..83b59569542 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index d8ae513590d..ed967f6779f 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index caea7aa24a7..d7b257bcafb 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index f99f046c45c..0dbe5c4f5b1 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index d3552158ba2..beaca675e44 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 01326f34f6a..a3bf59bc773 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index 66ac73890a9..523487493da 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 0ad62ff6530..4cf721ceb8d 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index d6f415aa526..65400e1181d 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index 9cf196b95db..be0021f0de7 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use core::sync::atomic::{AtomicUsize, Ordering}; use aero_syscall::OpenFlags; diff --git a/src/aero_kernel/src/fs/procfs.rs b/src/aero_kernel/src/fs/procfs.rs index 073d08744e0..48f4dc19790 100644 --- a/src/aero_kernel/src/fs/procfs.rs +++ b/src/aero_kernel/src/fs/procfs.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use core::sync::atomic::{AtomicUsize, Ordering}; use alloc::borrow::ToOwned; diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index c8835be0b78..060fe214cb7 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/logger.rs b/src/aero_kernel/src/logger.rs index 0ff59ab1e73..988f0814786 100644 --- a/src/aero_kernel/src/logger.rs +++ b/src/aero_kernel/src/logger.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 3a391441363..7c08d2fd31f 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/alloc.rs b/src/aero_kernel/src/mem/alloc.rs index e46403e3eb2..e5239d72c82 100644 --- a/src/aero_kernel/src/mem/alloc.rs +++ b/src/aero_kernel/src/mem/alloc.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/mod.rs b/src/aero_kernel/src/mem/mod.rs index cde30ef70d0..a6d5adc3654 100644 --- a/src/aero_kernel/src/mem/mod.rs +++ b/src/aero_kernel/src/mem/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index b42ef95dd0f..75abdca7a08 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 31a50e8f08b..8333f2a6a7a 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index aa36e7eabe5..2efa178dd3d 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/paging/mod.rs b/src/aero_kernel/src/mem/paging/mod.rs index 64857cfd5b7..cffac2f2894 100644 --- a/src/aero_kernel/src/mem/paging/mod.rs +++ b/src/aero_kernel/src/mem/paging/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/paging/page.rs b/src/aero_kernel/src/mem/paging/page.rs index 790305cce6f..56e212786d4 100644 --- a/src/aero_kernel/src/mem/paging/page.rs +++ b/src/aero_kernel/src/mem/paging/page.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/paging/page_table.rs b/src/aero_kernel/src/mem/paging/page_table.rs index dd50070d5bd..5698a7c6d7a 100644 --- a/src/aero_kernel/src/mem/paging/page_table.rs +++ b/src/aero_kernel/src/mem/paging/page_table.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/pti.rs b/src/aero_kernel/src/mem/pti.rs index 6292f74d41b..edd5b867e66 100644 --- a/src/aero_kernel/src/mem/pti.rs +++ b/src/aero_kernel/src/mem/pti.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/slab.rs b/src/aero_kernel/src/mem/slab.rs index a291c347441..b92f46d8fdb 100644 --- a/src/aero_kernel/src/mem/slab.rs +++ b/src/aero_kernel/src/mem/slab.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/mem/vmalloc.rs b/src/aero_kernel/src/mem/vmalloc.rs index e1ec8f7a50b..656b7a9bdd7 100644 --- a/src/aero_kernel/src/mem/vmalloc.rs +++ b/src/aero_kernel/src/mem/vmalloc.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/modules.rs b/src/aero_kernel/src/modules.rs index c7ce92203a7..40686669825 100644 --- a/src/aero_kernel/src/modules.rs +++ b/src/aero_kernel/src/modules.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index ce804f5a789..879dc5c34a6 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/net/loopback.rs b/src/aero_kernel/src/net/loopback.rs index 6a43b41b0e7..f6bd8a036f2 100644 --- a/src/aero_kernel/src/net/loopback.rs +++ b/src/aero_kernel/src/net/loopback.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 1ef19dd290b..bd0bd163405 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs index 9ffb6f520cf..b6337dee38e 100644 --- a/src/aero_kernel/src/net/tcp.rs +++ b/src/aero_kernel/src/net/tcp.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/net/udp.rs b/src/aero_kernel/src/net/udp.rs index f90ea9d284c..1d4599df7d9 100644 --- a/src/aero_kernel/src/net/udp.rs +++ b/src/aero_kernel/src/net/udp.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 30a13e7c29d..2b773f09557 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/socket/ipv4.rs b/src/aero_kernel/src/socket/ipv4.rs index d27895816a3..44e0893610d 100644 --- a/src/aero_kernel/src/socket/ipv4.rs +++ b/src/aero_kernel/src/socket/ipv4.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/socket/mod.rs b/src/aero_kernel/src/socket/mod.rs index 1cb73d4c53f..81fbab5b26c 100644 --- a/src/aero_kernel/src/socket/mod.rs +++ b/src/aero_kernel/src/socket/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/socket/netlink.rs b/src/aero_kernel/src/socket/netlink.rs index dc180e638cf..85d22c40494 100644 --- a/src/aero_kernel/src/socket/netlink.rs +++ b/src/aero_kernel/src/socket/netlink.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + //! Netlink Sockets //! //! Netlink sockets are used for inter-process communication (IPC) between both the kernel and diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 05acb9700d7..1cb4c559dff 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use aero_syscall::socket::{MessageFlags, MessageHeader}; use aero_syscall::{InAddr, OpenFlags, SocketAddrInet, AF_INET}; use alloc::sync::{Arc, Weak}; diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index 3d751466688..453279e7398 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index a7a91864aeb..81067917b86 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 3eb0e3ec295..a9d6aeb45c1 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/syscall/futex.rs b/src/aero_kernel/src/syscall/futex.rs index ce419cfb73b..e0782114906 100644 --- a/src/aero_kernel/src/syscall/futex.rs +++ b/src/aero_kernel/src/syscall/futex.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/syscall/ipc.rs b/src/aero_kernel/src/syscall/ipc.rs index 662050f9bad..f6471c44bcd 100644 --- a/src/aero_kernel/src/syscall/ipc.rs +++ b/src/aero_kernel/src/syscall/ipc.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index e47f24e906c..2d57d128146 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index fb6adb6a25f..f54cf2bb3f9 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use aero_syscall::netlink::sockaddr_nl; use aero_syscall::socket::{MessageFlags, MessageHeader, SocketOptionLevel}; use aero_syscall::*; diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index c943d437c78..df60b8e6c43 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/syscall/time.rs b/src/aero_kernel/src/syscall/time.rs index cde62a4eeaa..0567da5bdb2 100644 --- a/src/aero_kernel/src/syscall/time.rs +++ b/src/aero_kernel/src/syscall/time.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/tests.rs b/src/aero_kernel/src/tests.rs index f0452b4e902..53230b24cc1 100644 --- a/src/aero_kernel/src/tests.rs +++ b/src/aero_kernel/src/tests.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index 7ae349e7938..7c2886a5560 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/userland/mod.rs b/src/aero_kernel/src/userland/mod.rs index 3568d557cc4..2954470514b 100644 --- a/src/aero_kernel/src/userland/mod.rs +++ b/src/aero_kernel/src/userland/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index 3691ee879ac..043e97d2dd7 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index a4d6d3d421a..8dcc68fefe4 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/userland/signals.rs b/src/aero_kernel/src/userland/signals.rs index cf9d7e849e7..a9a714863d0 100644 --- a/src/aero_kernel/src/userland/signals.rs +++ b/src/aero_kernel/src/userland/signals.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 95bc3125dbc..ab4cde12ce4 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/userland/task/sessions.rs b/src/aero_kernel/src/userland/task/sessions.rs index 9b3ce8f1c5e..c0502680ddd 100644 --- a/src/aero_kernel/src/userland/task/sessions.rs +++ b/src/aero_kernel/src/userland/task/sessions.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/userland/terminal.rs b/src/aero_kernel/src/userland/terminal.rs index 899e69b0061..d7fc67fc888 100644 --- a/src/aero_kernel/src/userland/terminal.rs +++ b/src/aero_kernel/src/userland/terminal.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 4e8a69e427b..21f8279bfb9 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/utils/bitmap.rs b/src/aero_kernel/src/utils/bitmap.rs index def9d3aca24..246646af959 100644 --- a/src/aero_kernel/src/utils/bitmap.rs +++ b/src/aero_kernel/src/utils/bitmap.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use core::alloc::Allocator; use alloc::vec::Vec; diff --git a/src/aero_kernel/src/utils/buffer.rs b/src/aero_kernel/src/utils/buffer.rs index 4b81e700ea9..2cb0358b419 100644 --- a/src/aero_kernel/src/utils/buffer.rs +++ b/src/aero_kernel/src/utils/buffer.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/utils/dma.rs b/src/aero_kernel/src/utils/dma.rs index e5b95d0642f..861d8f089ab 100644 --- a/src/aero_kernel/src/utils/dma.rs +++ b/src/aero_kernel/src/utils/dma.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index 081c8284836..8fdc0f6389c 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_kernel/src/utils/sync.rs b/src/aero_kernel/src/utils/sync.rs index 8adfd2b0459..7dbe1f53f9c 100644 --- a/src/aero_kernel/src/utils/sync.rs +++ b/src/aero_kernel/src/utils/sync.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use alloc::sync::Arc; use alloc::vec::Vec; diff --git a/src/aero_proc/src/cpu_local.rs b/src/aero_proc/src/cpu_local.rs index 244fee62336..e287505f92f 100644 --- a/src/aero_proc/src/cpu_local.rs +++ b/src/aero_proc/src/cpu_local.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use proc_macro::TokenStream; use syn::{Lit, Meta, MetaNameValue, NestedMeta}; diff --git a/src/aero_proc/src/downcastable.rs b/src/aero_proc/src/downcastable.rs index 9de451fb531..8ffdf27de3d 100644 --- a/src/aero_proc/src/downcastable.rs +++ b/src/aero_proc/src/downcastable.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use proc_macro::TokenStream; use syn::spanned::Spanned; diff --git a/src/aero_proc/src/indirect.rs b/src/aero_proc/src/indirect.rs index 6af4dad3b85..f4b4b1d6478 100644 --- a/src/aero_proc/src/indirect.rs +++ b/src/aero_proc/src/indirect.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use proc_macro::TokenStream; use proc_macro2::{Ident, Span}; use syn::spanned::Spanned; diff --git a/src/aero_proc/src/ioctl.rs b/src/aero_proc/src/ioctl.rs index 38abcc1fdcc..4867aec43b3 100644 --- a/src/aero_proc/src/ioctl.rs +++ b/src/aero_proc/src/ioctl.rs @@ -1,3 +1,20 @@ +// Copyright (C) 2021-2024 The Aero Project Developers. +// +// This file is part of The Aero Project. +// +// Aero is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Aero is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Aero. If not, see . + use proc_macro::TokenStream; use syn::{Data, DeriveInput, Path}; diff --git a/src/aero_proc/src/lib.rs b/src/aero_proc/src/lib.rs index 3809b200c32..75cafa90d69 100644 --- a/src/aero_proc/src/lib.rs +++ b/src/aero_proc/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_proc/src/syscall.rs b/src/aero_proc/src/syscall.rs index 935c48b6488..0651e41e642 100644 --- a/src/aero_proc/src/syscall.rs +++ b/src/aero_proc/src/syscall.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_proc/src/test.rs b/src/aero_proc/src/test.rs index 845f35dd17b..a009d741ab3 100644 --- a/src/aero_proc/src/test.rs +++ b/src/aero_proc/src/test.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index 6a2f55d7824..fb800d38f6e 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index fd0257445ff..98ce5533487 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_syscall/src/signal.rs b/src/aero_syscall/src/signal.rs index 3d6a2c4c4ef..fe814c5a5b8 100644 --- a/src/aero_syscall/src/signal.rs +++ b/src/aero_syscall/src/signal.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_syscall/src/syscall.rs b/src/aero_syscall/src/syscall.rs index 36e20f8389c..1b20e34f5e2 100644 --- a/src/aero_syscall/src/syscall.rs +++ b/src/aero_syscall/src/syscall.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/src/aero_syscall/src/time.rs b/src/aero_syscall/src/time.rs index 818c121ca2d..0d7a41a3985 100644 --- a/src/aero_syscall/src/time.rs +++ b/src/aero_syscall/src/time.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/userland/apps/window_test/src/main.rs b/userland/apps/window_test/src/main.rs index 2adf6124ad9..9a7496f9f34 100644 --- a/userland/apps/window_test/src/main.rs +++ b/userland/apps/window_test/src/main.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/userland/servers/system_server/src/main.rs b/userland/servers/system_server/src/main.rs index 4f300419c33..54ad8378cc4 100644 --- a/userland/servers/system_server/src/main.rs +++ b/userland/servers/system_server/src/main.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // diff --git a/userland/servers/window_server/src/main.rs b/userland/servers/window_server/src/main.rs index 42d0841859e..4f7d385e42e 100644 --- a/userland/servers/window_server/src/main.rs +++ b/userland/servers/window_server/src/main.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2021-2023 The Aero Project Developers. +// Copyright (C) 2021-2024 The Aero Project Developers. // // This file is part of The Aero Project. // From ab409b8162da7c047d06e2aaa170333811d13eeb Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 6 Jan 2024 15:54:25 +1100 Subject: [PATCH 280/368] misc(kernel): cleanup Signed-off-by: Anhad Singh --- patches/mlibc/mlibc.patch | 647 +++++++++++++++++++++++++- src/aero_kernel/src/fs/devfs.rs | 2 +- src/aero_kernel/src/socket/netlink.rs | 2 +- src/aero_kernel/src/utils/mod.rs | 2 +- 4 files changed, 638 insertions(+), 15 deletions(-) diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch index 9177a8cd494..4b4fe9f22b4 100644 --- a/patches/mlibc/mlibc.patch +++ b/patches/mlibc/mlibc.patch @@ -1,9 +1,21 @@ -From ea30fe59e091c87eb09d24c20946ee7a90d371c2 Mon Sep 17 00:00:00 2001 +From ff3ad2ec971fffda2a1f098d4e574361f14ab0d2 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Tue, 14 Nov 2023 17:51:25 +1100 Subject: [PATCH] Signed-off-by: Anhad Singh +--- + options/intl/generic/libintl-stubs.cpp | 66 ++- + options/posix/generic/pthread-stubs.cpp | 90 +++- + options/rtdl/generic/linker.cpp | 5 +- + options/rtdl/include/mlibc/rtdl-sysdeps.hpp | 1 + + sysdeps/aero/generic/aero.cpp | 28 +- + sysdeps/aero/generic/filesystem.cpp | 32 +- + sysdeps/aero/generic/sockets.cpp | 10 +- + sysdeps/aero/include/aero/syscall.h | 3 + + sysdeps/aero/include/mlibc/jsmn.h | 474 ++++++++++++++++++++ + 9 files changed, 632 insertions(+), 77 deletions(-) + create mode 100644 sysdeps/aero/include/mlibc/jsmn.h diff --git a/options/intl/generic/libintl-stubs.cpp b/options/intl/generic/libintl-stubs.cpp index 8d4b28f..94ab421 100644 @@ -109,18 +121,125 @@ index 8d4b28f..94ab421 100644 + return (char*)""; } diff --git a/options/posix/generic/pthread-stubs.cpp b/options/posix/generic/pthread-stubs.cpp -index 5618dc6..cd9350d 100644 +index 5618dc6..a5edec6 100644 --- a/options/posix/generic/pthread-stubs.cpp +++ b/options/posix/generic/pthread-stubs.cpp -@@ -299,7 +299,7 @@ int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr) { +@@ -1,4 +1,3 @@ +- + #include + #include + #include +@@ -265,6 +264,87 @@ int pthread_attr_setsigmask_np(pthread_attr_t *__restrict attr, + } + + namespace { ++#include ++#ifdef __aero__ ++ static bool jsoneq(const char *input, jsmntok_t tok, const char *expected) { ++ if (tok.type == JSMN_STRING && ++ (int)strlen(expected) == tok.end - tok.start && ++ strncmp(input + tok.start, expected, tok.end - tok.start) == 0) { ++ return true; ++ } ++ ++ return false; ++ } ++ ++ size_t string_to_usize(const char *string, size_t length) { ++ size_t ret = 0; ++ for (size_t i = 0; i < length; i++) { ++ ret = ret * 10 + (string[i] - '0'); ++ } ++ ++ return ret; ++ } ++ ++ void get_own_stackinfo(void **stack_addr, size_t *stack_size) { ++ auto fp = fopen("/proc/self/maps", "r"); ++ if (!fp) { ++ mlibc::infoLogger() << "mlibc pthreads: /proc/self/maps does not exist! Producing incorrect" ++ " stack results!" << frg::endlog; ++ return; ++ } ++ ++ auto sp = mlibc::get_sp(); ++ ++ char *INPUT = (char *)malloc(4096 * 4); ++ size_t INPUT_SIZE = fread(INPUT, 1, 4096 * 4, fp); ++ ++ jsmn_parser parser; ++ jsmn_init(&parser); ++ ++ int n = jsmn_parse(&parser, INPUT, INPUT_SIZE, nullptr, 0); ++ FRG_ASSERT(n > 0); ++ ++ jsmntok_t *tokens = static_cast(malloc(sizeof(jsmntok_t) * n)); ++ ++ jsmn_init(&parser); ++ int result = jsmn_parse(&parser, INPUT, INPUT_SIZE, tokens, n); ++ FRG_ASSERT(tokens[0].type == JSMN_OBJECT); ++ ++ FRG_ASSERT(jsoneq(INPUT, tokens[1], "maps")); ++ ++ size_t n_fields = tokens[3].size; ++ for (size_t i = 3; i < tokens[2].size * (n_fields * 2 + 1); i+=(n_fields * 2 + 1)) { ++ jsmntok_t *mapping = &tokens[i]; ++ FRG_ASSERT(mapping->type == JSMN_OBJECT); ++ ++ size_t start = SIZE_MAX; ++ size_t end = SIZE_MAX; ++ ++ for (size_t j = 1; j < mapping->size * 2; j += 2) { ++ jsmntok_t *value = &mapping[j + 1]; ++ ++ size_t val = string_to_usize(INPUT + value->start, value->end - value->start); ++ ++ if (jsoneq(INPUT, mapping[j], "start")) { ++ start = val; ++ } else if (jsoneq(INPUT, mapping[j], "end")) { ++ end = val; ++ } ++ } ++ ++ if (sp < end && sp > start) { ++ *stack_addr = reinterpret_cast(start); ++ *stack_size = end - start; ++ ++ fclose(fp); ++ free(INPUT); ++ return; ++ } ++ } ++ ++ FRG_ASSERT(!"reached unreachable code"); ++ } ++#else + void get_own_stackinfo(void **stack_addr, size_t *stack_size) { + auto fp = fopen("/proc/self/maps", "r"); + if (!fp) { +@@ -290,7 +370,8 @@ namespace { + + fclose(fp); + } +-} ++#endif ++} // namespace annonymous + + int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr) { + auto tcb = reinterpret_cast(thread); +@@ -299,9 +380,10 @@ int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr) { if (!tcb->stackAddr || !tcb->stackSize) { // allocate stack - attr->__mlibc_stackaddr = 0x00; + attr->__mlibc_stackaddr = (void*)0x7ffffff9a000; attr->__mlibc_stacksize = 0x20000; - // get_own_stackinfo(&attr->__mlibc_stackaddr, &attr->__mlibc_stacksize); +- // get_own_stackinfo(&attr->__mlibc_stackaddr, &attr->__mlibc_stacksize); ++ ++ get_own_stackinfo(&attr->__mlibc_stackaddr, &attr->__mlibc_stacksize); } else { + attr->__mlibc_stacksize = tcb->stackSize; + attr->__mlibc_stackaddr = tcb->stackAddr; diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp index 50cca94..a095ab0 100644 --- a/options/rtdl/generic/linker.cpp @@ -159,7 +278,7 @@ index c35271c..8a941b2 100644 } // namespace mlibc diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index e19b159..e3c11a4 100644 +index e19b159..a54b6d3 100644 --- a/sysdeps/aero/generic/aero.cpp +++ b/sysdeps/aero/generic/aero.cpp @@ -62,6 +62,10 @@ static frg::vector create_slice(char *const arg[]) { @@ -173,16 +292,40 @@ index e19b159..e3c11a4 100644 int sys_uname(struct utsname *buf) { auto result = syscall(SYS_UNAME, buf); -@@ -73,6 +77,8 @@ int sys_uname(struct utsname *buf) { +@@ -73,22 +77,20 @@ int sys_uname(struct utsname *buf) { } int sys_futex_wait(int *pointer, int expected, const struct timespec *time) { -+ while (*pointer == expected) {} +- // auto result = syscall(SYS_FUTEX_WAIT, pointer, expected, time); +- // +- // if (result < 0) { +- // return -result; +- // } +- // ++ auto ret = syscall(SYS_FUTEX_WAIT, pointer, expected, time); + - // auto result = syscall(SYS_FUTEX_WAIT, pointer, expected, time); - // - // if (result < 0) { -@@ -309,7 +315,7 @@ int sys_thread_setname(void *tcb, const char *name) { ++ if (int e = sc_error(ret); e) ++ return e; ++ + return 0; + } + + int sys_futex_wake(int *pointer) { +- // auto result = syscall(SYS_FUTEX_WAKE, pointer); +- // +- // if (result < 0) { +- // return -result; +- // } +- // ++ auto ret = syscall(SYS_FUTEX_WAKE, pointer); ++ ++ if (int e = sc_error(ret); e) ++ return e; ++ + return 0; + } + +@@ -309,7 +311,7 @@ int sys_thread_setname(void *tcb, const char *name) { } void sys_thread_exit() { @@ -286,6 +429,486 @@ index 39c5b65..bd2f489 100644 // Invalid syscall used to trigger a log error in the kernel (as a hint) // so, that we can implement the syscall in the kernel. +diff --git a/sysdeps/aero/include/mlibc/jsmn.h b/sysdeps/aero/include/mlibc/jsmn.h +new file mode 100644 +index 0000000..2d8f591 +--- /dev/null ++++ b/sysdeps/aero/include/mlibc/jsmn.h +@@ -0,0 +1,474 @@ ++/* ++ * MIT License ++ * ++ * Copyright (c) 2010 Serge Zaitsev ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to deal ++ * in the Software without restriction, including without limitation the rights ++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++ * copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. ++ */ ++#ifndef JSMN_H ++#define JSMN_H ++ ++#include ++ ++#define JSMN_PARENT_LINKS ++#define JSMN_STRICT ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifdef JSMN_STATIC ++#define JSMN_API static ++#else ++#define JSMN_API extern ++#endif ++ ++/** ++ * JSON type identifier. Basic types are: ++ * o Object ++ * o Array ++ * o String ++ * o Other primitive: number, boolean (true/false) or null ++ */ ++typedef enum { ++ JSMN_UNDEFINED = 0, ++ JSMN_OBJECT = 1 << 0, ++ JSMN_ARRAY = 1 << 1, ++ JSMN_STRING = 1 << 2, ++ JSMN_PRIMITIVE = 1 << 3 ++} jsmntype_t; ++ ++enum jsmnerr { ++ /* Not enough tokens were provided */ ++ JSMN_ERROR_NOMEM = -1, ++ /* Invalid character inside JSON string */ ++ JSMN_ERROR_INVAL = -2, ++ /* The string is not a full JSON packet, more bytes expected */ ++ JSMN_ERROR_PART = -3 ++}; ++ ++/** ++ * JSON token description. ++ * type type (object, array, string etc.) ++ * start start position in JSON data string ++ * end end position in JSON data string ++ */ ++typedef struct jsmntok { ++ jsmntype_t type; ++ int start; ++ int end; ++ int size; ++#ifdef JSMN_PARENT_LINKS ++ int parent; ++#endif ++} jsmntok_t; ++ ++/** ++ * JSON parser. Contains an array of token blocks available. Also stores ++ * the string being parsed now and current position in that string. ++ */ ++typedef struct jsmn_parser { ++ unsigned int pos; /* offset in the JSON string */ ++ unsigned int toknext; /* next token to allocate */ ++ int toksuper; /* superior token node, e.g. parent object or array */ ++} jsmn_parser; ++ ++/** ++ * Create JSON parser over an array of tokens ++ */ ++JSMN_API void jsmn_init(jsmn_parser *parser); ++ ++/** ++ * Run JSON parser. It parses a JSON data string into and array of tokens, each ++ * describing ++ * a single JSON object. ++ */ ++JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, ++ jsmntok_t *tokens, const unsigned int num_tokens); ++ ++#ifndef JSMN_HEADER ++/** ++ * Allocates a fresh unused token from the token pool. ++ */ ++static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, jsmntok_t *tokens, ++ const size_t num_tokens) { ++ jsmntok_t *tok; ++ if (parser->toknext >= num_tokens) { ++ return NULL; ++ } ++ tok = &tokens[parser->toknext++]; ++ tok->start = tok->end = -1; ++ tok->size = 0; ++#ifdef JSMN_PARENT_LINKS ++ tok->parent = -1; ++#endif ++ return tok; ++} ++ ++/** ++ * Fills token type and boundaries. ++ */ ++static void jsmn_fill_token(jsmntok_t *token, const jsmntype_t type, ++ const int start, const int end) { ++ token->type = type; ++ token->start = start; ++ token->end = end; ++ token->size = 0; ++} ++ ++/** ++ * Fills next available token with JSON primitive. ++ */ ++static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, ++ const size_t len, jsmntok_t *tokens, ++ const size_t num_tokens) { ++ jsmntok_t *token; ++ int start; ++ ++ start = parser->pos; ++ ++ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { ++ switch (js[parser->pos]) { ++#ifndef JSMN_STRICT ++ /* In strict mode primitive must be followed by "," or "}" or "]" */ ++ case ':': ++#endif ++ case '\t': ++ case '\r': ++ case '\n': ++ case ' ': ++ case ',': ++ case ']': ++ case '}': ++ goto found; ++ default: ++ /* to quiet a warning from gcc*/ ++ break; ++ } ++ if (js[parser->pos] < 32 || js[parser->pos] >= 127) { ++ parser->pos = start; ++ return JSMN_ERROR_INVAL; ++ } ++ } ++#ifdef JSMN_STRICT ++ /* In strict mode primitive must be followed by a comma/object/array */ ++ parser->pos = start; ++ return JSMN_ERROR_PART; ++#endif ++ ++found: ++ if (tokens == NULL) { ++ parser->pos--; ++ return 0; ++ } ++ token = jsmn_alloc_token(parser, tokens, num_tokens); ++ if (token == NULL) { ++ parser->pos = start; ++ return JSMN_ERROR_NOMEM; ++ } ++ jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); ++#ifdef JSMN_PARENT_LINKS ++ token->parent = parser->toksuper; ++#endif ++ parser->pos--; ++ return 0; ++} ++ ++/** ++ * Fills next token with JSON string. ++ */ ++static int jsmn_parse_string(jsmn_parser *parser, const char *js, ++ const size_t len, jsmntok_t *tokens, ++ const size_t num_tokens) { ++ jsmntok_t *token; ++ ++ int start = parser->pos; ++ ++ /* Skip starting quote */ ++ parser->pos++; ++ ++ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { ++ char c = js[parser->pos]; ++ ++ /* Quote: end of string */ ++ if (c == '\"') { ++ if (tokens == NULL) { ++ return 0; ++ } ++ token = jsmn_alloc_token(parser, tokens, num_tokens); ++ if (token == NULL) { ++ parser->pos = start; ++ return JSMN_ERROR_NOMEM; ++ } ++ jsmn_fill_token(token, JSMN_STRING, start + 1, parser->pos); ++#ifdef JSMN_PARENT_LINKS ++ token->parent = parser->toksuper; ++#endif ++ return 0; ++ } ++ ++ /* Backslash: Quoted symbol expected */ ++ if (c == '\\' && parser->pos + 1 < len) { ++ int i; ++ parser->pos++; ++ switch (js[parser->pos]) { ++ /* Allowed escaped symbols */ ++ case '\"': ++ case '/': ++ case '\\': ++ case 'b': ++ case 'f': ++ case 'r': ++ case 'n': ++ case 't': ++ break; ++ /* Allows escaped symbol \uXXXX */ ++ case 'u': ++ parser->pos++; ++ for (i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; ++ i++) { ++ /* If it isn't a hex character we have an error */ ++ if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ ++ (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ ++ (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ ++ parser->pos = start; ++ return JSMN_ERROR_INVAL; ++ } ++ parser->pos++; ++ } ++ parser->pos--; ++ break; ++ /* Unexpected symbol */ ++ default: ++ parser->pos = start; ++ return JSMN_ERROR_INVAL; ++ } ++ } ++ } ++ parser->pos = start; ++ return JSMN_ERROR_PART; ++} ++ ++/** ++ * Parse JSON string and fill tokens. ++ */ ++JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, ++ jsmntok_t *tokens, const unsigned int num_tokens) { ++ int r; ++ int i; ++ jsmntok_t *token; ++ int count = parser->toknext; ++ ++ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { ++ char c; ++ jsmntype_t type; ++ ++ c = js[parser->pos]; ++ switch (c) { ++ case '{': ++ case '[': ++ count++; ++ if (tokens == NULL) { ++ break; ++ } ++ token = jsmn_alloc_token(parser, tokens, num_tokens); ++ if (token == NULL) { ++ return JSMN_ERROR_NOMEM; ++ } ++ if (parser->toksuper != -1) { ++ jsmntok_t *t = &tokens[parser->toksuper]; ++#ifdef JSMN_STRICT ++ /* In strict mode an object or array can't become a key */ ++ if (t->type == JSMN_OBJECT) { ++ return JSMN_ERROR_INVAL; ++ } ++#endif ++ t->size++; ++#ifdef JSMN_PARENT_LINKS ++ token->parent = parser->toksuper; ++#endif ++ } ++ token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); ++ token->start = parser->pos; ++ parser->toksuper = parser->toknext - 1; ++ break; ++ case '}': ++ case ']': ++ if (tokens == NULL) { ++ break; ++ } ++ type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); ++#ifdef JSMN_PARENT_LINKS ++ if (parser->toknext < 1) { ++ return JSMN_ERROR_INVAL; ++ } ++ token = &tokens[parser->toknext - 1]; ++ for (;;) { ++ if (token->start != -1 && token->end == -1) { ++ if (token->type != type) { ++ return JSMN_ERROR_INVAL; ++ } ++ token->end = parser->pos + 1; ++ parser->toksuper = token->parent; ++ break; ++ } ++ if (token->parent == -1) { ++ if (token->type != type || parser->toksuper == -1) { ++ return JSMN_ERROR_INVAL; ++ } ++ break; ++ } ++ token = &tokens[token->parent]; ++ } ++#else ++ for (i = parser->toknext - 1; i >= 0; i--) { ++ token = &tokens[i]; ++ if (token->start != -1 && token->end == -1) { ++ if (token->type != type) { ++ return JSMN_ERROR_INVAL; ++ } ++ parser->toksuper = -1; ++ token->end = parser->pos + 1; ++ break; ++ } ++ } ++ /* Error if unmatched closing bracket */ ++ if (i == -1) { ++ return JSMN_ERROR_INVAL; ++ } ++ for (; i >= 0; i--) { ++ token = &tokens[i]; ++ if (token->start != -1 && token->end == -1) { ++ parser->toksuper = i; ++ break; ++ } ++ } ++#endif ++ break; ++ case '\"': ++ r = jsmn_parse_string(parser, js, len, tokens, num_tokens); ++ if (r < 0) { ++ return r; ++ } ++ count++; ++ if (parser->toksuper != -1 && tokens != NULL) { ++ tokens[parser->toksuper].size++; ++ } ++ break; ++ case '\t': ++ case '\r': ++ case '\n': ++ case ' ': ++ break; ++ case ':': ++ parser->toksuper = parser->toknext - 1; ++ break; ++ case ',': ++ if (tokens != NULL && parser->toksuper != -1 && ++ tokens[parser->toksuper].type != JSMN_ARRAY && ++ tokens[parser->toksuper].type != JSMN_OBJECT) { ++#ifdef JSMN_PARENT_LINKS ++ parser->toksuper = tokens[parser->toksuper].parent; ++#else ++ for (i = parser->toknext - 1; i >= 0; i--) { ++ if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) { ++ if (tokens[i].start != -1 && tokens[i].end == -1) { ++ parser->toksuper = i; ++ break; ++ } ++ } ++ } ++#endif ++ } ++ break; ++#ifdef JSMN_STRICT ++ /* In strict mode primitives are: numbers and booleans */ ++ case '-': ++ case '0': ++ case '1': ++ case '2': ++ case '3': ++ case '4': ++ case '5': ++ case '6': ++ case '7': ++ case '8': ++ case '9': ++ case 't': ++ case 'f': ++ case 'n': ++ /* And they must not be keys of the object */ ++ if (tokens != NULL && parser->toksuper != -1) { ++ const jsmntok_t *t = &tokens[parser->toksuper]; ++ if (t->type == JSMN_OBJECT || ++ (t->type == JSMN_STRING && t->size != 0)) { ++ return JSMN_ERROR_INVAL; ++ } ++ } ++#else ++ /* In non-strict mode every unquoted value is a primitive */ ++ default: ++#endif ++ r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); ++ if (r < 0) { ++ return r; ++ } ++ count++; ++ if (parser->toksuper != -1 && tokens != NULL) { ++ tokens[parser->toksuper].size++; ++ } ++ break; ++ ++#ifdef JSMN_STRICT ++ /* Unexpected char in strict mode */ ++ default: ++ return JSMN_ERROR_INVAL; ++#endif ++ } ++ } ++ ++ if (tokens != NULL) { ++ for (i = parser->toknext - 1; i >= 0; i--) { ++ /* Unmatched opened object or array */ ++ if (tokens[i].start != -1 && tokens[i].end == -1) { ++ return JSMN_ERROR_PART; ++ } ++ } ++ } ++ ++ return count; ++} ++ ++/** ++ * Creates a new parser based over a given buffer with an array of tokens ++ * available. ++ */ ++JSMN_API void jsmn_init(jsmn_parser *parser) { ++ parser->pos = 0; ++ parser->toknext = 0; ++ parser->toksuper = -1; ++} ++ ++#endif /* JSMN_HEADER */ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* JSMN_H */ -- -2.42.1 +2.43.0 diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index 83b59569542..819c17d212d 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -336,7 +336,7 @@ impl INodeInterface for DevFb { // This is a shared file mapping. let fb = lock.get_framebuffer(); - let fb_ptr = fb.as_ptr() as *const u8; + let fb_ptr = fb.as_ptr().cast::(); let fb_ptr = fb_ptr.add(offset); let fb_phys_ptr = fb_ptr.sub(crate::PHYSICAL_MEMORY_OFFSET.as_u64() as usize); diff --git a/src/aero_kernel/src/socket/netlink.rs b/src/aero_kernel/src/socket/netlink.rs index 85d22c40494..bc3588a3169 100644 --- a/src/aero_kernel/src/socket/netlink.rs +++ b/src/aero_kernel/src/socket/netlink.rs @@ -292,7 +292,7 @@ impl INodeInterface for NetLinkSocket { let mut offset = 0; while offset + hdr_size <= data.len() { - let header = unsafe { &*(data.as_ptr().add(offset) as *const netlink::nlmsghdr) }; + let header = unsafe { &*(data.as_ptr().cast::().byte_add(offset)) }; let payload = &data[offset + hdr_size..]; match header.nlmsg_type { diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index 8fdc0f6389c..d2cabaa058b 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -162,7 +162,7 @@ impl PerCpu { } pub fn slice_into_bytes(slice: &[T]) -> &[u8] { - let data = slice.as_ptr() as *const u8; + let data = slice.as_ptr().cast::(); let size = core::mem::size_of_val(slice); unsafe { core::slice::from_raw_parts(data, size) } From 53099256da593e6d6da928b5af4ac535f3e18204 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 6 Jan 2024 20:19:10 +1100 Subject: [PATCH 281/368] misc(config): unstable flags to improve compilation times Signed-off-by: Anhad Singh --- src/.cargo/config.toml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/.cargo/config.toml b/src/.cargo/config.toml index c6633f4e6a3..c583ec52b03 100644 --- a/src/.cargo/config.toml +++ b/src/.cargo/config.toml @@ -4,4 +4,14 @@ build-std-features = ["compiler-builtins-mem"] [build] target = "./.cargo/x86_64-aero_os.json" -rustflags = ["-Cforce-frame-pointers=yes"] +rustflags = [ + # Miscellaneous: + "-Cforce-frame-pointers=yes", + + # Unstable faster compilation time flags: + # + # https://blog.rust-lang.org/2023/11/09/parallel-rustc.html + "-Zthreads=8", + # https://blog.rust-lang.org/inside-rust/2023/12/22/trait-system-refactor-initiative.html + "-Znext-solver=coherence", +] From dd72c3dbd9514430e46b632c2a832798cbef29b8 Mon Sep 17 00:00:00 2001 From: Anhad Singh <62820092+Andy-Python-Programmer@users.noreply.github.com> Date: Tue, 9 Jan 2024 13:24:49 +1100 Subject: [PATCH 282/368] Create FUNDING.yml --- .github/FUNDING.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000000..0e38fe5a9c3 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: [Andy-Python-Programmer] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From 4b5f1082f3a3e3f15df143b62925d7aa235ae993 Mon Sep 17 00:00:00 2001 From: Anhad Singh <62820092+Andy-Python-Programmer@users.noreply.github.com> Date: Sun, 11 Feb 2024 13:31:09 +1100 Subject: [PATCH 283/368] switch to Jinx (#117) Signed-off-by: Anhad Singh --- .gitattributes | 6 +- .github/workflows/build.yml | 4 +- .gitignore | 9 + Makefile | 47 + base-files/bin | 1 + base-files/etc/X11/xinit/xinitrc | 2 + .../xorg => base-files/etc/X11}/xorg.conf | 0 base-files/lib | 1 + base-files/lib64 | 1 + base-files/sbin | 1 + build-support/cross-llvm-config | 95 ++ build-support/jwm/system.jwmrc | 228 +++++ build-support/limine.cfg | 12 + build-support/mkimage.sh | 33 + build-support/mkiso.sh | 24 + build-support/rust/config.toml | 22 + extra-files/rust/config.toml | 22 - host-recipes/autoconf | 16 + host-recipes/autoconf-2.69 | 16 + host-recipes/automake | 21 + host-recipes/binutils | 24 + host-recipes/cmake | 18 + host-recipes/gcc | 38 + host-recipes/gnulib | 3 + host-recipes/libgcc-binaries | 8 + host-recipes/libtool | 23 + host-recipes/limine | 24 + host-recipes/llvm | 27 + host-recipes/pkg-config | 28 + host-recipes/rust | 25 + improving-build-times.txt | 2 + jinx-config | 72 ++ patches/alacritty/alacritty.patch | 71 -- patches/alsa-lib/alsa-lib.patch | 124 --- patches/autoconf/jinx-working-patch.patch | 47 + patches/automake-v1.16/automake-v1.16.patch | 26 - patches/bash/bash.patch | 282 ------ patches/bash/jinx-working-patch.patch | 368 +++++++ patches/binutils/binutils.patch | 87 -- patches/binutils/jinx-working-patch.patch | 154 +++ patches/cairo/jinx-working-patch.patch | 33 + patches/coreutils/coreutils.patch | 13 - patches/dbus/jinx-working-patch.patch | 13 + patches/dmenu/dmenu.patch | 27 - patches/dwm/0001-uselessgaps.patch | 81 -- patches/dwm/dwm.patch | 71 -- ...001-fontconfig-aero-specific-changes.patch | 26 - patches/fontconfig/jinx-working-patch.patch | 13 + patches/gcc-host/jinx-working-patch.patch | 153 +++ patches/gcc/gcc.patch | 214 ---- patches/glib/0001-glib.patch | 51 - ...ch-out-assert-in-g_io_unix_get_flags.patch | 30 - patches/glib/jinx-working-patch.patch | 53 + .../gobject-introspection.patch | 29 - patches/gtk+-3/gtk+-3.patch | 77 -- patches/gtk+-3/jinx-working-patch.patch | 37 + patches/jq/jq.patch | 40 - patches/libdrm/libdrm.patch | 147 --- patches/libgcrypt/jinx-working-patch.patch | 23 + .../0001-libiconv-aero-specific-changes.patch | 50 - patches/libtasn/libtasn.patch | 25 - patches/libtool/jinx-working-patch.patch | 138 +++ patches/libtool/libtool.patch | 60 -- ...0001-libxfont2-aero-specific-changes.patch | 37 - ...dd-aero.patch => jinx-working-patch.patch} | 321 ++---- patches/mesa/jinx-working-patch.patch | 157 +++ patches/mesa/mesa.patch | 219 ----- patches/mlibc/jinx-working-patch.patch | 180 ++++ patches/mlibc/mlibc.patch | 914 ------------------ patches/ncurses/jinx-working-patch.patch | 15 + patches/ncurses/ncurses.patch | 41 - patches/neofetch/neofetch.patch | 34 - patches/nss/0001-Add-a-missing-include.patch | 24 - patches/nss/0002-NSS-Standalone-patch.patch | 258 ----- patches/nyancat/nyancat.patch | 42 - ...changes.patch => jinx-working-patch.patch} | 94 +- patches/python/python.patch | 81 -- patches/quickjs/quickjs.patch | 86 -- patches/readline/jinx-working-patch.patch | 22 + patches/readline/readline.patch | 48 - patches/rust-getrandom/rust-getrandom.patch | 53 - patches/rust-glutin/rust-glutin.patch | 331 ------- patches/rust-host/jinx-working-patch.patch | 531 ++++++++++ patches/rust-libloading/rust-libloading.patch | 50 - patches/rust-mio-0.6/rust-mio-0.6.patch | 94 -- patches/rust-mio-0.8/rust-mio-0.8.patch | 73 -- patches/rust-nix/rust-nix.patch | 708 -------------- patches/rust-num-cpus/rust-num-cpus.patch | 35 - .../rust-shared-library.patch | 45 - patches/rust-users/rust-users.patch | 40 - patches/rust-winit/rust-winit.patch | 122 --- ...p-build-target-in-x.py-and-bootstrap.patch | 77 -- patches/tcc/tcc.patch | 166 ---- patches/wayland/wayland.patch | 71 -- .../webkitgtk/0001-Initial-Aero-support.patch | 243 ----- patches/webkitgtk/0002-xxx.patch | 181 ---- ...eyboard.patch => jinx-working-patch.patch} | 68 +- ...t-mouse.patch => jinx-working-patch.patch} | 53 +- ...changes.patch => jinx-working-patch.patch} | 64 +- ...001-xorg-proto-aero-specific-changes.patch | 52 - patches/xorg-proto/jinx-working-patch.patch | 27 + ...-server.patch => jinx-working-patch.patch} | 212 ++-- patches/xorg-xinit/jinx-working-patch.patch | 13 + patches/xorg-xinit/xorg-xinit.patch | 25 - .../0001-zlib-aero-specific-changes.patch | 26 - recipes/at-spi2-core | 22 + recipes/autoconf-archive | 12 + recipes/base-files | 8 + recipes/bash | 30 + recipes/binutils | 40 + recipes/bzip2 | 66 ++ recipes/cairo | 24 + recipes/core-libs | 3 + recipes/coreutils | 40 + recipes/cxxshim | 21 + recipes/dbus | 39 + recipes/fontconfig | 29 + recipes/freeglut | 28 + recipes/freetype2 | 21 + recipes/fribidi | 25 + recipes/frigg | 22 + recipes/gcc | 48 + recipes/gdk-pixbuf | 22 + recipes/gettext | 41 + recipes/glib | 21 + recipes/glib-networking | 22 + recipes/glu | 21 + recipes/gmp | 26 + recipes/graphite2 | 25 + recipes/grep | 28 + recipes/gsettings-desktop-schemas | 28 + recipes/gtk+-3 | 29 + recipes/harfbuzz | 35 + recipes/icu | 36 + recipes/jwm | 29 + recipes/less | 24 + recipes/libepoxy | 22 + recipes/libexpat | 24 + recipes/libffi | 24 + recipes/libfontenc | 25 + recipes/libgcc | 35 + recipes/libgcrypt | 31 + recipes/libgpg-error | 30 + recipes/libice | 25 + recipes/libiconv | 32 + recipes/libintl | 39 + recipes/libjpeg-turbo | 29 + recipes/libnghttp2 | 27 + recipes/libpng | 24 + recipes/libpsl | 28 + recipes/libsm | 25 + recipes/libsoup | 27 + recipes/libstdc++ | 33 + recipes/libtasn | 29 + recipes/libtiff | 31 + recipes/libunistring | 24 + recipes/libwebp | 29 + recipes/libx11 | 28 + recipes/libxau | 25 + recipes/libxaw | 25 + recipes/libxcb | 27 + recipes/libxcomposite | 29 + recipes/libxcrypt | 27 + recipes/libxcursor | 25 + recipes/libxcvt | 20 + recipes/libxdamage | 25 + recipes/libxdmcp | 25 + recipes/libxext | 25 + recipes/libxfixes | 25 + recipes/libxfont2 | 28 + recipes/libxft | 25 + recipes/libxi | 25 + recipes/libxinerama | 25 + recipes/libxkbcommon | 25 + recipes/libxkbfile | 25 + recipes/libxml | 29 + recipes/libxmu | 25 + recipes/libxpm | 25 + recipes/libxrandr | 25 + recipes/libxrender | 25 + recipes/libxshmfence | 26 + recipes/libxslt | 36 + recipes/libxt | 27 + recipes/libxv | 25 + recipes/libxxf86vm | 25 + recipes/linux-headers | 21 + recipes/llvm | 33 + recipes/mesa | 25 + recipes/mesa-demos | 30 + recipes/mlibc | 28 + recipes/mlibc-headers | 25 + recipes/mpc | 26 + recipes/mpfr | 33 + recipes/ncurses | 51 + recipes/neofetch | 9 + recipes/nettle | 25 + recipes/openssl | 32 + recipes/pango | 21 + recipes/pcre2 | 31 + recipes/pixman | 24 + recipes/readline | 32 + recipes/sdl2 | 59 ++ recipes/sqlite | 27 + recipes/ttf-dejavu | 15 + recipes/tzdata | 57 ++ recipes/userland | 19 + recipes/xcb-proto | 25 + recipes/xf86-input-keyboard | 25 + recipes/xf86-input-mouse | 25 + recipes/xf86-video-fbdev | 27 + recipes/xkeyboard-config | 27 + recipes/xorg-font-util | 25 + recipes/xorg-proto | 25 + recipes/xorg-server | 52 + recipes/xorg-util-macros | 24 + recipes/xorg-xclock | 27 + recipes/xorg-xeyes | 26 + recipes/xorg-xfontsel | 26 + recipes/xorg-xinit | 25 + recipes/xorg-xkbcomp | 25 + recipes/xorg-xlsfonts | 24 + recipes/xtrans | 25 + recipes/xz | 24 + recipes/zlib | 27 + recipes/zstd | 29 + scripts/mkimage | 48 + source-recipes/autoconf | 4 + source-recipes/autoconf-2.69 | 4 + source-recipes/automake | 8 + source-recipes/cmake | 4 + source-recipes/gcc-host | 16 + source-recipes/gnulib | 4 + source-recipes/libgcc-binaries | 4 + source-recipes/libtool | 11 + source-recipes/limine | 12 + source-recipes/llvm-host | 11 + source-recipes/pkg-config | 9 + source-recipes/rust-host | 33 + source-recipes/rust-libc | 4 + src/Cargo.lock | 147 +-- src/aero_kernel/Cargo.toml | 12 +- .../src/arch/x86_64/interrupts/exceptions.rs | 1 + src/aero_kernel/src/fs/ext2/mod.rs | 2 + src/aero_kernel/src/fs/file_table.rs | 27 +- src/aero_kernel/src/fs/mod.rs | 10 +- src/aero_kernel/src/main.rs | 4 +- src/aero_kernel/src/rendy.rs | 10 + src/aero_kernel/src/syscall/fs.rs | 42 +- src/aero_kernel/src/syscall/mod.rs | 2 +- src/aero_kernel/src/userland/task/mod.rs | 13 +- src/aero_kernel/src/userland/vm.rs | 2 +- src/aero_proc/Cargo.toml | 4 +- src/aero_syscall/src/lib.rs | 13 +- src/aero_syscall/src/syscall.rs | 40 +- userland/CMakeToolchain-x86_64.cmake | 4 +- userland/Cargo.lock | 355 ------- userland/Cargo.toml | 6 - userland/Makefile | 37 + userland/aero.cmake | 1 - userland/apps/systrace/Cargo.toml | 2 +- userland/cross-file.ini | 2 +- userland/cross-llvm-config | 153 --- userland/init/init.c | 30 + userland/tests/getchar.cc | 18 - userland/tests/{test.cc => utest.cc} | 62 +- web/index.html | 2 +- 266 files changed, 6910 insertions(+), 6933 deletions(-) create mode 100644 Makefile create mode 120000 base-files/bin create mode 100644 base-files/etc/X11/xinit/xinitrc rename {extra-files/xorg => base-files/etc/X11}/xorg.conf (100%) create mode 120000 base-files/lib create mode 120000 base-files/lib64 create mode 120000 base-files/sbin create mode 100755 build-support/cross-llvm-config create mode 100644 build-support/jwm/system.jwmrc create mode 100644 build-support/limine.cfg create mode 100755 build-support/mkimage.sh create mode 100755 build-support/mkiso.sh create mode 100644 build-support/rust/config.toml delete mode 100644 extra-files/rust/config.toml create mode 100644 host-recipes/autoconf create mode 100644 host-recipes/autoconf-2.69 create mode 100644 host-recipes/automake create mode 100644 host-recipes/binutils create mode 100644 host-recipes/cmake create mode 100644 host-recipes/gcc create mode 100644 host-recipes/gnulib create mode 100644 host-recipes/libgcc-binaries create mode 100644 host-recipes/libtool create mode 100644 host-recipes/limine create mode 100644 host-recipes/llvm create mode 100644 host-recipes/pkg-config create mode 100644 host-recipes/rust create mode 100644 improving-build-times.txt create mode 100644 jinx-config delete mode 100644 patches/alacritty/alacritty.patch delete mode 100644 patches/alsa-lib/alsa-lib.patch create mode 100644 patches/autoconf/jinx-working-patch.patch delete mode 100644 patches/automake-v1.16/automake-v1.16.patch delete mode 100644 patches/bash/bash.patch create mode 100644 patches/bash/jinx-working-patch.patch delete mode 100644 patches/binutils/binutils.patch create mode 100644 patches/binutils/jinx-working-patch.patch create mode 100644 patches/cairo/jinx-working-patch.patch delete mode 100644 patches/coreutils/coreutils.patch create mode 100644 patches/dbus/jinx-working-patch.patch delete mode 100644 patches/dmenu/dmenu.patch delete mode 100644 patches/dwm/0001-uselessgaps.patch delete mode 100644 patches/dwm/dwm.patch delete mode 100644 patches/fontconfig/0001-fontconfig-aero-specific-changes.patch create mode 100644 patches/fontconfig/jinx-working-patch.patch create mode 100644 patches/gcc-host/jinx-working-patch.patch delete mode 100644 patches/gcc/gcc.patch delete mode 100644 patches/glib/0001-glib.patch delete mode 100644 patches/glib/0002-Patch-out-assert-in-g_io_unix_get_flags.patch create mode 100644 patches/glib/jinx-working-patch.patch delete mode 100644 patches/gobject-introspection/gobject-introspection.patch delete mode 100644 patches/gtk+-3/gtk+-3.patch create mode 100644 patches/gtk+-3/jinx-working-patch.patch delete mode 100644 patches/jq/jq.patch delete mode 100644 patches/libdrm/libdrm.patch create mode 100644 patches/libgcrypt/jinx-working-patch.patch delete mode 100644 patches/libiconv/0001-libiconv-aero-specific-changes.patch delete mode 100644 patches/libtasn/libtasn.patch create mode 100644 patches/libtool/jinx-working-patch.patch delete mode 100644 patches/libtool/libtool.patch delete mode 100644 patches/libxfont2/0001-libxfont2-aero-specific-changes.patch rename patches/llvm/{0001-feat-targets-add-aero.patch => jinx-working-patch.patch} (71%) create mode 100644 patches/mesa/jinx-working-patch.patch delete mode 100644 patches/mesa/mesa.patch create mode 100644 patches/mlibc/jinx-working-patch.patch delete mode 100644 patches/mlibc/mlibc.patch create mode 100644 patches/ncurses/jinx-working-patch.patch delete mode 100644 patches/ncurses/ncurses.patch delete mode 100644 patches/neofetch/neofetch.patch delete mode 100644 patches/nss/0001-Add-a-missing-include.patch delete mode 100644 patches/nss/0002-NSS-Standalone-patch.patch delete mode 100644 patches/nyancat/nyancat.patch rename patches/openssl/{0001-openssl-aero-specific-changes.patch => jinx-working-patch.patch} (58%) delete mode 100644 patches/python/python.patch delete mode 100644 patches/quickjs/quickjs.patch create mode 100644 patches/readline/jinx-working-patch.patch delete mode 100644 patches/readline/readline.patch delete mode 100644 patches/rust-getrandom/rust-getrandom.patch delete mode 100644 patches/rust-glutin/rust-glutin.patch create mode 100644 patches/rust-host/jinx-working-patch.patch delete mode 100644 patches/rust-libloading/rust-libloading.patch delete mode 100644 patches/rust-mio-0.6/rust-mio-0.6.patch delete mode 100644 patches/rust-mio-0.8/rust-mio-0.8.patch delete mode 100644 patches/rust-nix/rust-nix.patch delete mode 100644 patches/rust-num-cpus/rust-num-cpus.patch delete mode 100644 patches/rust-shared-library/rust-shared-library.patch delete mode 100644 patches/rust-users/rust-users.patch delete mode 100644 patches/rust-winit/rust-winit.patch delete mode 100644 patches/rust/0001-fix-bootstrap-build-target-in-x.py-and-bootstrap.patch delete mode 100644 patches/tcc/tcc.patch delete mode 100644 patches/wayland/wayland.patch delete mode 100644 patches/webkitgtk/0001-Initial-Aero-support.patch delete mode 100644 patches/webkitgtk/0002-xxx.patch rename patches/xf86-input-keyboard/{xf86-input-keyboard.patch => jinx-working-patch.patch} (70%) rename patches/xf86-input-mouse/{xf86-input-mouse.patch => jinx-working-patch.patch} (69%) rename patches/xf86-video-fbdev/{0001-fbdev-aero-specific-changes.patch => jinx-working-patch.patch} (54%) delete mode 100644 patches/xorg-proto/0001-xorg-proto-aero-specific-changes.patch create mode 100644 patches/xorg-proto/jinx-working-patch.patch rename patches/xorg-server/{xorg-server.patch => jinx-working-patch.patch} (53%) create mode 100644 patches/xorg-xinit/jinx-working-patch.patch delete mode 100644 patches/xorg-xinit/xorg-xinit.patch delete mode 100644 patches/zlib/0001-zlib-aero-specific-changes.patch create mode 100644 recipes/at-spi2-core create mode 100644 recipes/autoconf-archive create mode 100644 recipes/base-files create mode 100644 recipes/bash create mode 100644 recipes/binutils create mode 100644 recipes/bzip2 create mode 100644 recipes/cairo create mode 100644 recipes/core-libs create mode 100644 recipes/coreutils create mode 100644 recipes/cxxshim create mode 100644 recipes/dbus create mode 100644 recipes/fontconfig create mode 100644 recipes/freeglut create mode 100644 recipes/freetype2 create mode 100644 recipes/fribidi create mode 100644 recipes/frigg create mode 100644 recipes/gcc create mode 100644 recipes/gdk-pixbuf create mode 100644 recipes/gettext create mode 100644 recipes/glib create mode 100644 recipes/glib-networking create mode 100644 recipes/glu create mode 100644 recipes/gmp create mode 100644 recipes/graphite2 create mode 100644 recipes/grep create mode 100644 recipes/gsettings-desktop-schemas create mode 100644 recipes/gtk+-3 create mode 100644 recipes/harfbuzz create mode 100644 recipes/icu create mode 100644 recipes/jwm create mode 100644 recipes/less create mode 100644 recipes/libepoxy create mode 100644 recipes/libexpat create mode 100644 recipes/libffi create mode 100644 recipes/libfontenc create mode 100644 recipes/libgcc create mode 100644 recipes/libgcrypt create mode 100644 recipes/libgpg-error create mode 100644 recipes/libice create mode 100644 recipes/libiconv create mode 100644 recipes/libintl create mode 100644 recipes/libjpeg-turbo create mode 100644 recipes/libnghttp2 create mode 100644 recipes/libpng create mode 100644 recipes/libpsl create mode 100644 recipes/libsm create mode 100644 recipes/libsoup create mode 100644 recipes/libstdc++ create mode 100644 recipes/libtasn create mode 100644 recipes/libtiff create mode 100644 recipes/libunistring create mode 100644 recipes/libwebp create mode 100644 recipes/libx11 create mode 100644 recipes/libxau create mode 100644 recipes/libxaw create mode 100644 recipes/libxcb create mode 100644 recipes/libxcomposite create mode 100644 recipes/libxcrypt create mode 100644 recipes/libxcursor create mode 100644 recipes/libxcvt create mode 100644 recipes/libxdamage create mode 100644 recipes/libxdmcp create mode 100644 recipes/libxext create mode 100644 recipes/libxfixes create mode 100644 recipes/libxfont2 create mode 100644 recipes/libxft create mode 100644 recipes/libxi create mode 100644 recipes/libxinerama create mode 100644 recipes/libxkbcommon create mode 100644 recipes/libxkbfile create mode 100644 recipes/libxml create mode 100644 recipes/libxmu create mode 100644 recipes/libxpm create mode 100644 recipes/libxrandr create mode 100644 recipes/libxrender create mode 100644 recipes/libxshmfence create mode 100644 recipes/libxslt create mode 100644 recipes/libxt create mode 100644 recipes/libxv create mode 100644 recipes/libxxf86vm create mode 100644 recipes/linux-headers create mode 100644 recipes/llvm create mode 100644 recipes/mesa create mode 100644 recipes/mesa-demos create mode 100644 recipes/mlibc create mode 100644 recipes/mlibc-headers create mode 100644 recipes/mpc create mode 100644 recipes/mpfr create mode 100644 recipes/ncurses create mode 100644 recipes/neofetch create mode 100644 recipes/nettle create mode 100644 recipes/openssl create mode 100644 recipes/pango create mode 100644 recipes/pcre2 create mode 100644 recipes/pixman create mode 100644 recipes/readline create mode 100644 recipes/sdl2 create mode 100644 recipes/sqlite create mode 100644 recipes/ttf-dejavu create mode 100644 recipes/tzdata create mode 100644 recipes/userland create mode 100644 recipes/xcb-proto create mode 100644 recipes/xf86-input-keyboard create mode 100644 recipes/xf86-input-mouse create mode 100644 recipes/xf86-video-fbdev create mode 100644 recipes/xkeyboard-config create mode 100644 recipes/xorg-font-util create mode 100644 recipes/xorg-proto create mode 100644 recipes/xorg-server create mode 100644 recipes/xorg-util-macros create mode 100644 recipes/xorg-xclock create mode 100644 recipes/xorg-xeyes create mode 100644 recipes/xorg-xfontsel create mode 100644 recipes/xorg-xinit create mode 100644 recipes/xorg-xkbcomp create mode 100644 recipes/xorg-xlsfonts create mode 100644 recipes/xtrans create mode 100644 recipes/xz create mode 100644 recipes/zlib create mode 100644 recipes/zstd create mode 100755 scripts/mkimage create mode 100644 source-recipes/autoconf create mode 100644 source-recipes/autoconf-2.69 create mode 100644 source-recipes/automake create mode 100644 source-recipes/cmake create mode 100644 source-recipes/gcc-host create mode 100644 source-recipes/gnulib create mode 100644 source-recipes/libgcc-binaries create mode 100644 source-recipes/libtool create mode 100644 source-recipes/limine create mode 100644 source-recipes/llvm-host create mode 100644 source-recipes/pkg-config create mode 100644 source-recipes/rust-host create mode 100644 source-recipes/rust-libc delete mode 100644 userland/Cargo.lock delete mode 100644 userland/Cargo.toml create mode 100644 userland/Makefile delete mode 100644 userland/aero.cmake delete mode 100755 userland/cross-llvm-config create mode 100644 userland/init/init.c delete mode 100644 userland/tests/getchar.cc rename userland/tests/{test.cc => utest.cc} (95%) diff --git a/.gitattributes b/.gitattributes index 0b518af4199..5e472ae4bcc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,6 @@ * text=auto eol=lf -*.real linguist-language=Assembly \ No newline at end of file + +jinx-config linguist-language=Shell +host-recipes/* linguist-language=Shell +recipes/* linguist-language=Shell +source-recipes/* linguist-language=Shell diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b707ee4045b..af2d62b065b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,10 +24,10 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y nasm + sudo apt-get install -y nasm make python3 -m pip install requests xbstrap - name: Build Documentation - run: ./aero.py --document + run: make doc - name: Formatting Check run: | ./aero.py --fmt diff --git a/.gitignore b/.gitignore index 20b37a745f4..dd4aec68aa7 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,12 @@ base-files/server # todo: remove these debug + +# XXXXXXXXXXXXXXXX +3rdparty/ +.jinx-cache +sources/ +host-pkgs/ +host-builds/ +pkgs/ +builds/ diff --git a/Makefile b/Makefile new file mode 100644 index 00000000000..f5b44ca4165 --- /dev/null +++ b/Makefile @@ -0,0 +1,47 @@ +jinx: + if [ ! -d "target/jinx" ]; then \ + git clone https://github.com/mintsuki/jinx target/jinx; \ + fi + + # FIXME: autosync + mkdir -p target/cargo-home + cp build-support/rust/config.toml target/cargo-home/config.toml + +.PHONY: distro +distro: jinx + ./target/jinx/jinx build-all + +SOURCE_DIR := src +USERLAND_DIR := userland +USERLAND_TARGET := builds/userland/target/init +KERNEL_TARGET := src/target/x86_64-aero_os/release/aero_kernel + +.PHONY: clean +clean: + rm -rf src/target + +$(KERNEL_TARGET): $(shell find $(SOURCE_DIR) -type f -not -path '$(SOURCE_DIR)/target/*') + cd src && cargo build --package aero_kernel --target .cargo/x86_64-aero_os.json --release + @$(MAKE) iso + +$(USERLAND_TARGET): $(shell find $(USERLAND_DIR) -type f -not -path '$(USERLAND_DIR)/target/*') + ./target/jinx/jinx rebuild userland + @$(MAKE) distro-image + +.PHONY: iso +iso: $(KERNEL_TARGET) + ./build-support/mkiso.sh + +.PHONY: distro-image +distro-image: distro + ./build-support/mkimage.sh + +.PHONY: qemu +qemu: $(KERNEL_TARGET) $(USERLAND_TARGET) + ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -enable-kvm -cpu host -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme + +.PHONY: doc +doc: + rm -rf target/doc + cd src && cargo doc --package aero_kernel --target .cargo/x86_64-aero_os.json --release --target-dir=../target/doc/ + cp web/index.html target/doc/index.html diff --git a/base-files/bin b/base-files/bin new file mode 120000 index 00000000000..0b11bef6890 --- /dev/null +++ b/base-files/bin @@ -0,0 +1 @@ +/usr/bin \ No newline at end of file diff --git a/base-files/etc/X11/xinit/xinitrc b/base-files/etc/X11/xinit/xinitrc new file mode 100644 index 00000000000..0b6b361fd42 --- /dev/null +++ b/base-files/etc/X11/xinit/xinitrc @@ -0,0 +1,2 @@ +#!/usr/bin/sh +jwm & diff --git a/extra-files/xorg/xorg.conf b/base-files/etc/X11/xorg.conf similarity index 100% rename from extra-files/xorg/xorg.conf rename to base-files/etc/X11/xorg.conf diff --git a/base-files/lib b/base-files/lib new file mode 120000 index 00000000000..6c1836ebc71 --- /dev/null +++ b/base-files/lib @@ -0,0 +1 @@ +/usr/lib \ No newline at end of file diff --git a/base-files/lib64 b/base-files/lib64 new file mode 120000 index 00000000000..6c1836ebc71 --- /dev/null +++ b/base-files/lib64 @@ -0,0 +1 @@ +/usr/lib \ No newline at end of file diff --git a/base-files/sbin b/base-files/sbin new file mode 120000 index 00000000000..0b11bef6890 --- /dev/null +++ b/base-files/sbin @@ -0,0 +1 @@ +/usr/bin \ No newline at end of file diff --git a/build-support/cross-llvm-config b/build-support/cross-llvm-config new file mode 100755 index 00000000000..0a8bf851e4f --- /dev/null +++ b/build-support/cross-llvm-config @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 + +# This file was taken from Managarm and I have no clue what it does. + +import argparse +import sys +import os + +our_version = 17 + + +def do_version(): + return '{}.0.6'.format(our_version) + + +def do_components(): + return 'all all-targets analysis asmparser asmprinter binaryformat bitreader bitwriter codegen core coroutines coverage debuginfocodeview debuginfodwarf debuginfomsf debuginfopdb demangle dlltooldriver engine executionengine fuzzmutate globalisel gtest gtest_main instcombine instrumentation interpreter ipo irreader libdriver lineeditor linker lto mc mcdisassembler mcjit mcparser mirparser native nativecodegen objcarcopts object objectyaml option orcjit passes profiledata runtimedyld scalaropts selectiondag support symbolize tablegen target testingsupport transformutils vectorize windowsmanifest x86 x86asmparser x86asmprinter x86codegen x86desc x86disassembler x86info x86utils' + + +def do_targets_built(): + return 'X86' + + +def get_includedir(): + return '/sysroot/usr/include' + + +def get_libdir(): + return '/sysroot/usr/lib' + + +def do_has_rtti(): + return 'YES' + + +def do_shared_mode(): + return 'shared' + + +def do_libs(): + return f'-lLLVM-{our_version}' + + +def do_system_libs(): + return f'-lLLVM-{our_version}' + + +def do_cppflags(): + return '' + + +def do_cxxflags(): + return '' + + +def do_ldflags(): + return '-L' + get_libdir() + + +parser = argparse.ArgumentParser() +parser.add_argument('--version', action='append_const', + dest='command', const=do_version) +parser.add_argument('--targets-built', action='append_const', + dest='command', const=do_targets_built) +parser.add_argument('--components', action='append_const', + dest='command', const=do_components) +parser.add_argument('--includedir', action='append_const', + dest='command', const=get_includedir) +parser.add_argument('--libdir', action='append_const', + dest='command', const=get_libdir) +parser.add_argument('--has-rtti', action='append_const', + dest='command', const=do_has_rtti) +parser.add_argument('--shared-mode', action='append_const', + dest='command', const=do_shared_mode) +parser.add_argument('--link-shared', action='store_const', + dest='link', const='shared') +parser.add_argument('--cppflags', action='append_const', + dest='command', const=do_cppflags) +parser.add_argument('--cxxflags', action='append_const', + dest='command', const=do_cxxflags) +parser.add_argument('--ldflags', action='append_const', + dest='command', const=do_ldflags) +parser.add_argument('--libs', action='append_const', + dest='command', const=do_libs) +parser.add_argument('--system-libs', action='append_const', + dest='command', const=do_system_libs) +parser.add_argument('components', type=str, nargs='*') + +print("cross-llvm-config:", sys.argv, file=sys.stderr) + +args = parser.parse_args() +for command in args.command: + result = command() + print("cross-llvm-config yields:", result, file=sys.stderr) + print(result) diff --git a/build-support/jwm/system.jwmrc b/build-support/jwm/system.jwmrc new file mode 100644 index 00000000000..88cd55fdfe0 --- /dev/null +++ b/build-support/jwm/system.jwmrc @@ -0,0 +1,228 @@ + + + + + + + xterm + + audacious + xcalc + firefox + gimp + claws-mail + rox ~ + glxgears + gtk3-demo + + + xfontsel + + xprop | xmessage -file - + + + xwininfo | xmessage -file - + + + + + xscreensaver-command -lock + + + + + + + + + + + + xterm + + + + xclock + + + + + + + + root:1 + + showdesktop + + + + + + + + + + + + + + Sans-12:bold + 4 + 0 + #FFFFFF + #555555 + 0.5 + + #FFFFFF + #0077CC + 1.0 + + + + Sans-12 + #333333 + #FFFFFF + 0.75 + + + Sans-12 + + #FFFFFF + #555555 + + #FFFFFF + #333333 + + + #555555 + #333333 + #FFFFFF + + #0077CC + #004488 + + + + Sans-12 + #FFFFFF + #333333 + + #FFFFFF + #0077CC + + 0.85 + + + Sans-12 + #000000 + #999999 + + + + + /usr/local/share/icons/Tango/scalable/actions + + + /usr/local/share/icons/Tango/scalable/apps + + + /usr/local/share/icons/Tango/scalable/places + + + /usr/local/share/icons/Tango/scalable/status + + + /usr/local/share/icons/Tango/scalable/mimetypes + + + /usr/local/share/jwm + + + + + + + #111111 + + + + 400 + + + 2 + + + sloppy + + + border + + + opaque + + + opaque + + + up + down + right + left + left + down + up + right + select + escape + + nextstacked + close + desktop# + root:1 + window + maximize + rdesktop + ldesktop + udesktop + ddesktop + + + ldesktop + rdesktop + + move + move + window + shade + shade + maximize + + window + move + window + shade + shade + + resize + move + window + + close + move + close + + maximize + maxv + maxh + + minimize + move + shade + + diff --git a/build-support/limine.cfg b/build-support/limine.cfg new file mode 100644 index 00000000000..2ad5984fee2 --- /dev/null +++ b/build-support/limine.cfg @@ -0,0 +1,12 @@ +TIMEOUT=0 +VERBOSE=yes + +:aero +PROTOCOL=limine +KASLR=no +KERNEL_PATH=boot:///aero +CMDLINE=term-background=background theme-background=0x50000000 +#RESOLUTION=1920x1080 + +MODULE_PATH=boot:///term_background.bmp +MODULE_CMDLINE=background diff --git a/build-support/mkimage.sh b/build-support/mkimage.sh new file mode 100755 index 00000000000..ce7a8cbb9ce --- /dev/null +++ b/build-support/mkimage.sh @@ -0,0 +1,33 @@ +IMAGE_PATH=target/disk.img + +./target/jinx/jinx sysroot + +rm -rf $IMAGE_PATH + +dd if=/dev/zero of=$IMAGE_PATH bs=1G count=0 seek=512 +parted -s $IMAGE_PATH mklabel gpt +parted -s $IMAGE_PATH mkpart primary 2048s 100% + +# ensure loop kernel module is enabled +if ! lsmod | grep -q 'loop'; then + echo 'mkimage.sh: `loop` kernel module not found, attempting to load' + sudo modprobe loop +fi + +sudo losetup -Pf --show $IMAGE_PATH > loopback_dev +sudo mkfs.ext2 `cat loopback_dev`p1 -I128 + +rm -rf target/disk_image/ +mkdir target/disk_image +sudo mount `cat loopback_dev`p1 target/disk_image +sudo cp -r -v sysroot/. target/disk_image/ +pushd target/disk_image +sudo mkdir dev proc tmp +popd +sync +sudo umount target/disk_image/ +sudo losetup -d `cat loopback_dev` +sync + +rm -rf loopback_dev +rm -rf target/disk_image diff --git a/build-support/mkiso.sh b/build-support/mkiso.sh new file mode 100755 index 00000000000..46435fd04bf --- /dev/null +++ b/build-support/mkiso.sh @@ -0,0 +1,24 @@ +set -ex + +./target/jinx/jinx host-build limine + +rm -rf target/iso_root +mkdir -pv target/iso_root/boot + +cp src/target/x86_64-aero_os/release/aero_kernel target/iso_root/aero +cp build-support/limine.cfg src/.cargo/term_background.bmp target/iso_root/ + +# Install the limine binaries +cp host-pkgs/limine/usr/local/share/limine/limine-bios.sys target/iso_root/boot/ +cp host-pkgs/limine/usr/local/share/limine/limine-bios-cd.bin target/iso_root/boot/ +cp host-pkgs/limine/usr/local/share/limine/limine-uefi-cd.bin target/iso_root/boot/ +mkdir -pv target/iso_root/EFI/BOOT +cp host-pkgs/limine/usr/local/share/limine/BOOT*.EFI target/iso_root/EFI/BOOT/ + +# Create the disk image. +xorriso -as mkisofs -b boot/limine-bios-cd.bin -no-emul-boot -boot-load-size 4 \ + -boot-info-table --efi-boot boot/limine-uefi-cd.bin -efi-boot-part \ + --efi-boot-image --protective-msdos-label target/iso_root -o target/aero.iso + +# Install limine. +host-pkgs/limine/usr/local/bin/limine bios-install target/aero.iso diff --git a/build-support/rust/config.toml b/build-support/rust/config.toml new file mode 100644 index 00000000000..32c4c163307 --- /dev/null +++ b/build-support/rust/config.toml @@ -0,0 +1,22 @@ +# [unstable] +# patch-in-config = true + +[build] +rustc = "/base_dir/host-pkgs/rust/bin/rustc" +target = "x86_64-unknown-aero" +rustflags = ["-C", "link-args=-no-pie", "-C", "link-args=-lgcc_s"] + +[target.x86_64-unknown-aero] +linker = "/base_dir/host-pkgs/gcc/usr/local/bin/x86_64-aero-gcc" + +[patch.crates-io] +libc = { path = "/base_dir/sources/rust-libc" } +# num_cpus = { path = "@SOURCE_ROOT@/bundled/rust-num-cpus" } +# users = { path = "@SOURCE_ROOT@/bundled/rust-users" } +# winit = { path = "@SOURCE_ROOT@/bundled/rust-winit" } +# nix = { path = "@SOURCE_ROOT@/bundled/rust-nix" } +# mio-06 = { path = "@SOURCE_ROOT@/bundled/rust-mio-0.6", package = "mio" } +# mio-08 = { path = "@SOURCE_ROOT@/bundled/rust-mio-0.8", package = "mio" } +# glutin = { path = "@SOURCE_ROOT@/bundled/rust-glutin/glutin" } +# shared_library = { path = "@SOURCE_ROOT@/bundled/rust-shared-library" } +# libloading = { path = "@SOURCE_ROOT@/bundled/rust-libloading" } diff --git a/extra-files/rust/config.toml b/extra-files/rust/config.toml deleted file mode 100644 index 54f3a75dc53..00000000000 --- a/extra-files/rust/config.toml +++ /dev/null @@ -1,22 +0,0 @@ -[unstable] -patch-in-config = true - -[build] -rustc = "@BUILD_ROOT@/tools/host-rust/bin/rustc" -target = "x86_64-unknown-aero" -rustflags = ["-C", "link-args=-no-pie"] - -[target.x86_64-unknown-aero] -linker = "@BUILD_ROOT@/tools/host-gcc/bin/x86_64-aero-gcc" - -[patch.crates-io] -libc = { path = "@SOURCE_ROOT@/bundled/rust-libc" } -num_cpus = { path = "@SOURCE_ROOT@/bundled/rust-num-cpus" } -users = { path = "@SOURCE_ROOT@/bundled/rust-users" } -winit = { path = "@SOURCE_ROOT@/bundled/rust-winit" } -nix = { path = "@SOURCE_ROOT@/bundled/rust-nix" } -mio-06 = { path = "@SOURCE_ROOT@/bundled/rust-mio-0.6", package = "mio" } -mio-08 = { path = "@SOURCE_ROOT@/bundled/rust-mio-0.8", package = "mio" } -glutin = { path = "@SOURCE_ROOT@/bundled/rust-glutin/glutin" } -shared_library = { path = "@SOURCE_ROOT@/bundled/rust-shared-library" } -libloading = { path = "@SOURCE_ROOT@/bundled/rust-libloading" } diff --git a/host-recipes/autoconf b/host-recipes/autoconf new file mode 100644 index 00000000000..08a52ad8039 --- /dev/null +++ b/host-recipes/autoconf @@ -0,0 +1,16 @@ +name=autoconf +from_source=autoconf +revision=1 + +build() { + "${source_dir}"/configure --prefix="${prefix}" + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + strip_command=strip \ + post_package_strip +} diff --git a/host-recipes/autoconf-2.69 b/host-recipes/autoconf-2.69 new file mode 100644 index 00000000000..9593c60ac1d --- /dev/null +++ b/host-recipes/autoconf-2.69 @@ -0,0 +1,16 @@ +name=autoconf-2.69 +from_source=autoconf-2.69 +revision=1 + +build() { + "${source_dir}"/configure --prefix="${prefix}" + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + strip_command=strip \ + post_package_strip +} diff --git a/host-recipes/automake b/host-recipes/automake new file mode 100644 index 00000000000..ba10abce956 --- /dev/null +++ b/host-recipes/automake @@ -0,0 +1,21 @@ +name=automake +from_source=automake +revision=1 +hostdeps="autoconf" +imagedeps="gcc" + +build() { + "${source_dir}"/configure --prefix="${prefix}" + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + cp -pv /usr/local/share/autoconf/build-aux/config.sub "${dest_dir}${prefix}"/share/automake-1.16/ + cp -pv /usr/local/share/autoconf/build-aux/config.guess "${dest_dir}${prefix}"/share/automake-1.16/ + + strip_command=strip \ + post_package_strip +} diff --git a/host-recipes/binutils b/host-recipes/binutils new file mode 100644 index 00000000000..1fa8fb86e0d --- /dev/null +++ b/host-recipes/binutils @@ -0,0 +1,24 @@ +name=binutils +from_source=binutils +revision=1 +imagedeps="gcc" +hostdeps="autoconf-2.69 automake libtool pkg-config" + +build() { + "${source_dir}"/configure \ + --prefix="${prefix}" \ + --target=${OS_TRIPLET} \ + --with-sysroot="${sysroot_dir}" \ + --disable-nls \ + --disable-werror \ + --disable-dependency-tracking + + make -j${parallelism} all +} + +package() { + DESTDIR="${dest_dir}" make install + + strip_command=strip \ + post_package_strip +} diff --git a/host-recipes/cmake b/host-recipes/cmake new file mode 100644 index 00000000000..31536bc001b --- /dev/null +++ b/host-recipes/cmake @@ -0,0 +1,18 @@ +name=cmake +from_source=cmake +revision=1 +imagedeps="gcc" + +build() { + "${source_dir}"/configure --prefix="${prefix}" --parallel="${parallelism}" + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + echo 'include(Platform/UnixPaths)' > "${dest_dir}${prefix}/share/cmake-3.27/Modules/Platform/Aero.cmake" + + strip_command=strip \ + post_package_strip +} diff --git a/host-recipes/gcc b/host-recipes/gcc new file mode 100644 index 00000000000..a102d4ab4e4 --- /dev/null +++ b/host-recipes/gcc @@ -0,0 +1,38 @@ +name=gcc +from_source=gcc-host +revision=1 +imagedeps="gcc" +hostdeps="autoconf-2.69 automake libtool pkg-config" +hostrundeps="binutils" +deps="mlibc-headers" + +build() { + cp -rp "${source_dir}"/. ./ + + mkdir build && cd build + + CXXFLAGS_FOR_TARGET="$CFLAGS" \ + CFLAGS_FOR_TARGET="$CFLAGS" \ + ../configure \ + --prefix="${prefix}" \ + --target=${OS_TRIPLET} \ + --with-sysroot="${sysroot_dir}" \ + --disable-nls \ + --enable-languages=c,c++,lto \ + --disable-multilib \ + --enable-initfini-array \ + --enable-shared \ + --enable-host-shared + + make -j${parallelism} all-gcc +} + +package() { + cd build + DESTDIR="${dest_dir}" make install-gcc + + ln -s ${OS_TRIPLET}-gcc "${dest_dir}${prefix}/bin/${OS_TRIPLET}-cc" + + strip_command=strip \ + post_package_strip +} diff --git a/host-recipes/gnulib b/host-recipes/gnulib new file mode 100644 index 00000000000..a0711c37a7b --- /dev/null +++ b/host-recipes/gnulib @@ -0,0 +1,3 @@ +name=gnulib +from_source=gnulib +revision=1 diff --git a/host-recipes/libgcc-binaries b/host-recipes/libgcc-binaries new file mode 100644 index 00000000000..6328e669e67 --- /dev/null +++ b/host-recipes/libgcc-binaries @@ -0,0 +1,8 @@ +name=libgcc-binaries +from_source=libgcc-binaries +revision=1 + +package() { + mkdir -p ${dest_dir}${prefix}/libgcc-binaries + cp -rv ${source_dir}/. ${dest_dir}${prefix}/libgcc-binaries/ +} diff --git a/host-recipes/libtool b/host-recipes/libtool new file mode 100644 index 00000000000..3141fc5d9e3 --- /dev/null +++ b/host-recipes/libtool @@ -0,0 +1,23 @@ +name=libtool +from_source=libtool +revision=1 +hostdeps="autoconf automake" +imagedeps="help2man gcc" + +build() { + cp -rp "${source_dir}"/. ./ + ./configure \ + --prefix="${prefix}" + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + cp -pv /usr/local/share/autoconf/build-aux/config.sub "${dest_dir}${prefix}"/share/libtool/build-aux/ + cp -pv /usr/local/share/autoconf/build-aux/config.guess "${dest_dir}${prefix}"/share/libtool/build-aux/ + + strip_command=strip \ + post_package_strip +} diff --git a/host-recipes/limine b/host-recipes/limine new file mode 100644 index 00000000000..d93f3e397db --- /dev/null +++ b/host-recipes/limine @@ -0,0 +1,24 @@ +name=limine +from_source=limine +revision=1 +hostdeps="gcc pkg-config" +imagedeps="nasm gcc mtools" + +build() { + "${source_dir}"/configure \ + --enable-uefi-ia32 \ + --enable-uefi-x86-64 \ + --enable-uefi-cd \ + --enable-bios \ + --enable-bios-cd \ + --enable-bios-pxe + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + strip_command=strip \ + post_package_strip +} diff --git a/host-recipes/llvm b/host-recipes/llvm new file mode 100644 index 00000000000..6bfe5294b3b --- /dev/null +++ b/host-recipes/llvm @@ -0,0 +1,27 @@ +name=llvm +version=17.0.6 +revision=1 +from_source=llvm-host +imagedeps="gcc cmake ninja git" +source_deps="binutils" + +build() { + cmake \ + -GNinja \ + -DCMAKE_INSTALL_PREFIX="${prefix}" \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_TARGETS_TO_BUILD=X86 \ + -DLLVM_ENABLE_PROJECTS="llvm;clang;clang-tools-extra" \ + -DDEFAULT_SYSROOT="${sysroot_dir}" \ + -DLLVM_BINUTILS_INCDIR="${source_dir}/../binutils/include" \ + "${source_dir}/llvm" + + ninja -j ${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + strip_command=strip \ + post_package_strip +} diff --git a/host-recipes/pkg-config b/host-recipes/pkg-config new file mode 100644 index 00000000000..ee2b4f6a190 --- /dev/null +++ b/host-recipes/pkg-config @@ -0,0 +1,28 @@ +name=pkg-config +from_source=pkg-config +revision=1 +imagedeps="gcc" +hostdeps="automake autoconf libtool" + +build() { + "${source_dir}"/configure \ + --prefix="${prefix}" + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + mkdir -p "${dest_dir}${prefix}/share/pkgconfig/personality.d" + cat <"${dest_dir}${prefix}/share/pkgconfig/personality.d/${OS_TRIPLET}.personality" +Triplet: ${OS_TRIPLET} +SysrootDir: ${sysroot_dir} +DefaultSearchPaths: ${sysroot_dir}/usr/lib/pkgconfig:${sysroot_dir}/usr/share/pkgconfig +SystemIncludePaths: ${sysroot_dir}/usr/include +SystemLibraryPaths: ${sysroot_dir}/usr/lib +EOF + ln -s pkgconf "${dest_dir}${prefix}/bin/${OS_TRIPLET}-pkg-config" + + strip_command=strip \ + post_package_strip +} diff --git a/host-recipes/rust b/host-recipes/rust new file mode 100644 index 00000000000..9a7a03c1350 --- /dev/null +++ b/host-recipes/rust @@ -0,0 +1,25 @@ +name=rust +revision=1 +from_source=rust-host +hostdeps="llvm gcc" +source_deps="rust-libc" +imagedeps="python git wget gcc" +allow_network="yes" + +#unset CARGO_HOME + +build() { + # Rust memes. + # cp -rp "${source_dir}/." ./ + + ./x.py build --stage 2 -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ./x.py install -j${parallelism} + + find ${dest_dir} -name "*.old" -delete + + strip_command=strip + post_package_strip +} diff --git a/improving-build-times.txt b/improving-build-times.txt new file mode 100644 index 00000000000..6c4026a4d07 --- /dev/null +++ b/improving-build-times.txt @@ -0,0 +1,2 @@ +28.36s + diff --git a/jinx-config b/jinx-config new file mode 100644 index 00000000000..fe0d9974467 --- /dev/null +++ b/jinx-config @@ -0,0 +1,72 @@ +JINX_MAJOR_VER=0.2 + +export CFLAGS='-O2 -pipe' +export CXXFLAGS="${CFLAGS}" + +OS_TRIPLET=x86_64-aero +export CARGO_HOME="${base_dir}/target/cargo-home" + +# Required by scripts/mkimage +imagedeps="parted" + +autotools_recursive_regen() { + ACLOCAL_INCLUDE="" + if [ -d ${sysroot_dir}/usr/share/aclocal ]; then + ACLOCAL_INCLUDE="-I${sysroot_dir}/usr/share/aclocal" + fi + + for f in $(find . -name configure.ac -type f); do + echo "* autotools regen in '$(dirname $f)'..." + ( cd "$(dirname "$f")" && autoreconf -fvi "$@" $ACLOCAL_INCLUDE ) + done +} + +post_package_strip() { + if [ -z "$strip_command" ]; then + strip_command="${OS_TRIPLET}-strip" + fi + + for f in $(find "${dest_dir}"); do + if file "$f" | grep 'not stripped' >/dev/null; then + echo "* stripping '$f'..." + stripped_file="$(mktemp)" + ${strip_command} "$f" -o "$stripped_file" + chmod --reference="$f" "$stripped_file" + mv -f "$stripped_file" "$f" + fi + done +} + +autotools_configure() { + if [ -z "${configure_script_path}" ]; then + configure_script_path="${source_dir}/configure" + fi + + ${configure_script_path} \ + --host=${OS_TRIPLET} \ + --with-sysroot=${sysroot_dir} \ + --prefix=${prefix} \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --libdir=${prefix}/lib \ + --disable-static \ + --enable-shared \ + --disable-malloc0returnsnull \ + "$@" +} + +meson_configure() { + if [ -z "${meson_source_dir}" ]; then + meson_source_dir="${source_dir}" + fi + + # TODO(andypython): Move cross-file.ini to build-support/ + meson setup "${meson_source_dir}" \ + --cross-file "${base_dir}/userland/cross-file.ini" \ + --prefix=${prefix} \ + --sysconfdir=/etc \ + --libdir=lib \ + --buildtype=release \ + -Ddefault_library=shared \ + "$@" +} diff --git a/patches/alacritty/alacritty.patch b/patches/alacritty/alacritty.patch deleted file mode 100644 index 3921b7fa3eb..00000000000 --- a/patches/alacritty/alacritty.patch +++ /dev/null @@ -1,71 +0,0 @@ -From b194e3d72903f677f2aacf9293706ff2027a413b Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 11 Dec 2022 18:43:18 +1100 -Subject: [PATCH] - ---- - alacritty/src/display/window.rs | 8 ++++---- - alacritty_terminal/src/tty/unix.rs | 17 +++++++++-------- - 2 files changed, 13 insertions(+), 12 deletions(-) - -diff --git a/alacritty/src/display/window.rs b/alacritty/src/display/window.rs -index ee2e74f..d75996b 100644 ---- a/alacritty/src/display/window.rs -+++ b/alacritty/src/display/window.rs -@@ -128,9 +128,9 @@ fn create_gl_window( - } - - let windowed_context = ContextBuilder::new() -- .with_srgb(srgb) -- .with_vsync(vsync) -- .with_hardware_acceleration(None) -+ // .with_srgb(srgb) -+ // .with_vsync(vsync) -+ // .with_hardware_acceleration(None) - .build_windowed(window, event_loop)?; - - // Make the context current so OpenGL operations can run. -@@ -292,7 +292,7 @@ impl Window { - let builder = WindowBuilder::new() - .with_title(&identity.title) - .with_visible(false) -- .with_transparent(true) -+ .with_transparent(false) - .with_decorations(window_config.decorations != Decorations::None) - .with_maximized(window_config.maximized()) - .with_fullscreen(window_config.fullscreen()); -diff --git a/alacritty_terminal/src/tty/unix.rs b/alacritty_terminal/src/tty/unix.rs -index 206dbe8..cb172ab 100644 ---- a/alacritty_terminal/src/tty/unix.rs -+++ b/alacritty_terminal/src/tty/unix.rs -@@ -90,18 +90,19 @@ fn get_pw_entry(buf: &mut [i8; 1024]) -> Passwd<'_> { - die!("getpwuid_r failed"); - } - -- if res.is_null() { -- die!("pw not found"); -- } -+ // if res.is_null() { -+ // die!("pw not found"); -+ // } - -- // Sanity check. -- assert_eq!(entry.pw_uid, uid); -+ // // Sanity check. -+ // assert_eq!(entry.pw_uid, uid); - - // Build a borrowed Passwd struct. -+ // FIXME(mlibc): Assertion '!"slab_pool corruption. Possible write to unallocated object"' failed! - Passwd { -- name: unsafe { CStr::from_ptr(entry.pw_name).to_str().unwrap() }, -- dir: unsafe { CStr::from_ptr(entry.pw_dir).to_str().unwrap() }, -- shell: unsafe { CStr::from_ptr(entry.pw_shell).to_str().unwrap() }, -+ name: "root", -+ dir: "/", -+ shell: "/usr/bin/bash", - } - } - --- -2.38.1 - diff --git a/patches/alsa-lib/alsa-lib.patch b/patches/alsa-lib/alsa-lib.patch deleted file mode 100644 index 1ebb5b22abc..00000000000 --- a/patches/alsa-lib/alsa-lib.patch +++ /dev/null @@ -1,124 +0,0 @@ -From 3b4d643d6648ead86648e0033868f903af6aeb70 Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Wed, 2 Aug 2023 13:50:05 +0200 -Subject: [PATCH] Add Managarm support - -Signed-off-by: Dennis Bonke ---- - src/conf.c | 10 ++++++++++ - src/pcm/pcm_ladspa.c | 5 +++++ - src/ucm/main.c | 5 +++++ - src/ucm/parser.c | 8 ++++++++ - src/ucm/ucm_exec.c | 7 +++++++ - src/ucm/ucm_subs.c | 5 +++++ - 6 files changed, 40 insertions(+) - -diff --git a/src/conf.c b/src/conf.c -index da51182..743e4cd 100644 ---- a/src/conf.c -+++ b/src/conf.c -@@ -435,6 +435,16 @@ beginning:

- #include - #endif - -+#ifdef __aero__ -+#define stat64 stat -+#define dirent64 dirent -+#define lstat64 lstat -+#define readdir64 readdir -+#define scandir64 scandir -+#define versionsort64 versionsort -+typedef ino_t ino64_t; -+#endif -+ - #ifndef DOC_HIDDEN - - #ifdef HAVE_LIBPTHREAD -diff --git a/src/pcm/pcm_ladspa.c b/src/pcm/pcm_ladspa.c -index 9b2b32d..dde5d2a 100644 ---- a/src/pcm/pcm_ladspa.c -+++ b/src/pcm/pcm_ladspa.c -@@ -41,6 +41,11 @@ - - #include "ladspa.h" - -+#ifdef __aero__ -+#define readdir64 readdir -+#define dirent64 dirent -+#endif -+ - #ifndef PIC - /* entry for static linking */ - const char *_snd_module_pcm_ladspa = ""; -diff --git a/src/ucm/main.c b/src/ucm/main.c -index 66ffd00..7448963 100644 ---- a/src/ucm/main.c -+++ b/src/ucm/main.c -@@ -40,6 +40,11 @@ - #include - #include - -+#ifdef __aero__ -+#define stat64 stat -+#define fstat64 fstat -+#endif -+ - /* - * misc - */ -diff --git a/src/ucm/parser.c b/src/ucm/parser.c -index c111661..2115ac7 100644 ---- a/src/ucm/parser.c -+++ b/src/ucm/parser.c -@@ -36,6 +36,14 @@ - #include - #include - -+#ifdef __aero__ -+#define stat64 stat -+#define lstat64 lstat -+#define scandir64 scandir -+#define versionsort64 versionsort -+#define dirent64 dirent -+#endif -+ - static int filename_filter(const struct dirent64 *dirent); - - static int parse_sequence(snd_use_case_mgr_t *uc_mgr, -diff --git a/src/ucm/ucm_exec.c b/src/ucm/ucm_exec.c -index 276cf59..a6890dd 100644 ---- a/src/ucm/ucm_exec.c -+++ b/src/ucm/ucm_exec.c -@@ -42,6 +42,13 @@ extern char **environ; - #endif - #endif - -+#ifdef __aero__ -+#define stat64 stat -+#define dirent64 dirent -+#define lstat64 lstat -+#define readdir64 readdir -+#endif -+ - static pthread_mutex_t fork_lock = PTHREAD_MUTEX_INITIALIZER; - - /* -diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c -index e62290e..b4dbff2 100644 ---- a/src/ucm/ucm_subs.c -+++ b/src/ucm/ucm_subs.c -@@ -30,6 +30,11 @@ - #include - #include - -+#ifdef __aero__ -+#define stat64 stat -+#define lstat64 lstat -+#endif -+ - static char *rval_open_name(snd_use_case_mgr_t *uc_mgr) - { - const char *name; --- -2.40.1 - diff --git a/patches/autoconf/jinx-working-patch.patch b/patches/autoconf/jinx-working-patch.patch new file mode 100644 index 00000000000..b4e4be02eec --- /dev/null +++ b/patches/autoconf/jinx-working-patch.patch @@ -0,0 +1,47 @@ +diff --git autoconf-clean/build-aux/config.guess autoconf-workdir/build-aux/config.guess +index cdfc439..0e1b56a 100755 +--- autoconf-clean/build-aux/config.guess ++++ autoconf-workdir/build-aux/config.guess +@@ -4,7 +4,8 @@ + + # shellcheck disable=SC2006,SC2268 # see below for rationale + +-timestamp='2023-08-22' ++# timestamp it to always be newer ++timestamp='9999-99-99' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +@@ -933,6 +934,9 @@ EOF + i*:PW*:*) + GUESS=$UNAME_MACHINE-pc-pw32 + ;; ++ *:Aero:*:*) ++ GUESS=$UNAME_MACHINE-pc-aero ++ ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; +diff --git autoconf-clean/build-aux/config.sub autoconf-workdir/build-aux/config.sub +index defe52c..8600125 100755 +--- autoconf-clean/build-aux/config.sub ++++ autoconf-workdir/build-aux/config.sub +@@ -4,7 +4,8 @@ + + # shellcheck disable=SC2006,SC2268 # see below for rationale + +-timestamp='2023-09-19' ++# timestamp it to always be newer ++timestamp='9999-99-99' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +@@ -1749,7 +1750,7 @@ case $os in + | mirbsd* | netbsd* | dicos* | openedition* | ose* \ + | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ +- | bosx* | nextstep* | cxux* | oabi* \ ++ | bosx* | nextstep* | cxux* | oabi* | aero* \ + | ptx* | ecoff* | winnt* | domain* | vsta* \ + | udi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* | serenity* \ diff --git a/patches/automake-v1.16/automake-v1.16.patch b/patches/automake-v1.16/automake-v1.16.patch deleted file mode 100644 index d0760f5c71a..00000000000 --- a/patches/automake-v1.16/automake-v1.16.patch +++ /dev/null @@ -1,26 +0,0 @@ -From bd762227b35e7afac102348e88f1aee3cfcab9c9 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Thu, 30 Dec 2021 13:16:15 +1100 -Subject: [PATCH] config.sub: add aero target - -Signed-off-by: Andy-Python-Programmer ---- - lib/config.sub | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/config.sub b/lib/config.sub -index d74fb6d..194fc2c 100755 ---- a/lib/config.sub -+++ b/lib/config.sub -@@ -1723,7 +1723,7 @@ case $os in - | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ - | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ - | hiux* | abug | nacl* | netware* | windows* \ -- | os9* | macos* | osx* | ios* \ -+ | os9* | macos* | osx* | ios* | aero* \ - | mpw* | magic* | mmixware* | mon960* | lnews* \ - | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ - | aos* | aros* | cloudabi* | sortix* | twizzler* \ --- -2.25.1 - diff --git a/patches/bash/bash.patch b/patches/bash/bash.patch deleted file mode 100644 index ea6a0e0b730..00000000000 --- a/patches/bash/bash.patch +++ /dev/null @@ -1,282 +0,0 @@ -From 50a9f0c440ae12cb24316ae5397976ab83ea7e6a Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Tue, 18 Jan 2022 13:35:43 +1100 -Subject: [PATCH] bash: add aero port - -Signed-off-by: Andy-Python-Programmer ---- - .vscode/settings.json | 3 +++ - builtins/psize.c | 19 +++------------- - lib/readline/terminal.c | 2 +- - lib/termcap/termcap.c | 2 +- - mksyntax.c | 48 ++--------------------------------------- - shell.c | 4 ++-- - support/bashversion.c | 7 ++---- - support/config.sub | 2 +- - support/man2html.c | 5 +++-- - support/mksignames.c | 2 -- - support/signames.c | 2 -- - 11 files changed, 18 insertions(+), 78 deletions(-) - create mode 100644 .vscode/settings.json - -diff --git a/.vscode/settings.json b/.vscode/settings.json -new file mode 100644 -index 0000000..9792498 ---- /dev/null -+++ b/.vscode/settings.json -@@ -0,0 +1,3 @@ -+{ -+ "editor.formatOnSave": false -+} -\ No newline at end of file -diff --git a/builtins/psize.c b/builtins/psize.c -index 30881fb..be9c84b 100644 ---- a/builtins/psize.c -+++ b/builtins/psize.c -@@ -21,25 +21,12 @@ - /* Write output in 128-byte chunks until we get a sigpipe or write gets an - EPIPE. Then report how many bytes we wrote. We assume that this is the - pipe size. */ --#include -- --#if defined (HAVE_UNISTD_H) --# ifdef _MINIX --# include --# endif --# include --#endif - - #include --#ifndef _MINIX --#include "../bashtypes.h" --#endif -+#include - #include - #include -- --#include "../command.h" --#include "../general.h" --#include "../sig.h" -+#include - - #ifndef errno - extern int errno; -@@ -47,7 +34,7 @@ extern int errno; - - int nw; - --sighandler -+void - sigpipe (sig) - int sig; - { -diff --git a/lib/readline/terminal.c b/lib/readline/terminal.c -index 05415dc..a6b5307 100644 ---- a/lib/readline/terminal.c -+++ b/lib/readline/terminal.c -@@ -103,7 +103,7 @@ static char *term_string_buffer = (char *)NULL; - static int tcap_initialized; - - #if !defined (__linux__) && !defined (NCURSES_VERSION) --# if defined (__EMX__) || defined (NEED_EXTERN_PC) -+# if defined (__EMX__) || defined (__aero__) || defined (NEED_EXTERN_PC) - extern - # endif /* __EMX__ || NEED_EXTERN_PC */ - char PC, *BC, *UP; -diff --git a/lib/termcap/termcap.c b/lib/termcap/termcap.c -index ba3dab2..2882f0c 100644 ---- a/lib/termcap/termcap.c -+++ b/lib/termcap/termcap.c -@@ -627,7 +627,7 @@ scan_file (str, fd, bufp) - bufp->ateof = 0; - *bufp->ptr = '\0'; - -- lseek (fd, 0L, 0); -+ lseek (fd, 0L, SEEK_SET); - - while (!bufp->ateof) - { -diff --git a/mksyntax.c b/mksyntax.c -index 0385686..1a73eca 100644 ---- a/mksyntax.c -+++ b/mksyntax.c -@@ -20,16 +20,12 @@ - along with Bash. If not, see . - */ - --#include "config.h" -- - #include -+#include - #include "bashansi.h" - #include "chartypes.h" - #include -- --#ifdef HAVE_UNISTD_H --# include --#endif -+#include - - #include "syntax.h" - -@@ -40,9 +36,7 @@ extern char *optarg; - extern int errno; - #endif - --#ifndef HAVE_STRERROR - extern char *strerror(); --#endif - - struct wordflag { - int flag; -@@ -375,41 +369,3 @@ main(argc, argv) - fclose (fp); - exit (0); - } -- -- --#if !defined (HAVE_STRERROR) -- --#include --#if defined (HAVE_SYS_PARAM_H) --# include --#endif -- --#if defined (HAVE_UNISTD_H) --# include --#endif -- --/* Return a string corresponding to the error number E. From -- the ANSI C spec. */ --#if defined (strerror) --# undef strerror --#endif -- --char * --strerror (e) -- int e; --{ -- static char emsg[40]; --#if defined (HAVE_SYS_ERRLIST) -- extern int sys_nerr; -- extern char *sys_errlist[]; -- -- if (e > 0 && e < sys_nerr) -- return (sys_errlist[e]); -- else --#endif /* HAVE_SYS_ERRLIST */ -- { -- sprintf (emsg, "Unknown system error %d", e); -- return (&emsg[0]); -- } --} --#endif /* HAVE_STRERROR */ -diff --git a/shell.c b/shell.c -index ce8087f..b7475dd 100644 ---- a/shell.c -+++ b/shell.c -@@ -1614,7 +1614,7 @@ open_shell_script (script_name) - #endif - - /* Only do this with non-tty file descriptors we can seek on. */ -- if (fd_is_tty == 0 && (lseek (fd, 0L, 1) != -1)) -+ if (fd_is_tty == 0 && (lseek (fd, 0L, SEEK_CUR) != -1)) - { - /* Check to see if the `file' in `bash file' is a binary file - according to the same tests done by execute_simple_command (), -@@ -1651,7 +1651,7 @@ open_shell_script (script_name) - exit (EX_BINARY_FILE); - } - /* Now rewind the file back to the beginning. */ -- lseek (fd, 0L, 0); -+ lseek (fd, 0L, SEEK_SET); - } - - /* Open the script. But try to move the file descriptor to a randomly -diff --git a/support/bashversion.c b/support/bashversion.c -index 4f86b13..64779de 100644 ---- a/support/bashversion.c -+++ b/support/bashversion.c -@@ -18,15 +18,12 @@ - along with Bash. If not, see . - */ - --#include "config.h" -- - #include "stdc.h" - - #include -+#include - --#if defined (HAVE_UNISTD_H) --# include --#endif -+#include - - #include "bashansi.h" - -diff --git a/support/config.sub b/support/config.sub -index c874b7a..4ce3963 100755 ---- a/support/config.sub -+++ b/support/config.sub -@@ -1707,7 +1707,7 @@ case $os in - | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ - | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ - | udi* | lites* | ieee* | go32* | aux* | hcos* \ -- | chorusrdb* | cegcc* | glidix* \ -+ | chorusrdb* | cegcc* | glidix* | aero* \ - | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ - | midipix* | mingw32* | mingw64* | mint* \ - | uxpv* | beos* | mpeix* | udk* | moxiebox* \ -diff --git a/support/man2html.c b/support/man2html.c -index e6f441b..f02453d 100644 ---- a/support/man2html.c -+++ b/support/man2html.c -@@ -63,7 +63,7 @@ - * time to look through all the available manpages.) - */ - #ifdef HAVE_CONFIG_H --#include -+//#include - #endif - - #define NROFF 0 -@@ -123,7 +123,8 @@ char *manpage; - #define BD_LITERAL 1 - #define BD_INDENT 2 - --#ifndef HAVE_STRERROR -+//#ifndef HAVE_STRERROR -+#if (0) - static char * - strerror(int e) - { -diff --git a/support/mksignames.c b/support/mksignames.c -index ba87ae8..4b39787 100644 ---- a/support/mksignames.c -+++ b/support/mksignames.c -@@ -19,8 +19,6 @@ - along with Bash. If not, see . - */ - --#include -- - #include - #include - -diff --git a/support/signames.c b/support/signames.c -index aba4842..b4bbdc6 100644 ---- a/support/signames.c -+++ b/support/signames.c -@@ -18,8 +18,6 @@ - along with Bash. If not, see . - */ - --#include -- - #include - - #include --- -2.25.1 - diff --git a/patches/bash/jinx-working-patch.patch b/patches/bash/jinx-working-patch.patch new file mode 100644 index 00000000000..ff0943d4732 --- /dev/null +++ b/patches/bash/jinx-working-patch.patch @@ -0,0 +1,368 @@ +diff --git bash-clean/builtins/psize.c bash-workdir/builtins/psize.c +index 30881fb..6c99972 100644 +--- bash-clean/builtins/psize.c ++++ bash-workdir/builtins/psize.c +@@ -21,33 +21,36 @@ + /* Write output in 128-byte chunks until we get a sigpipe or write gets an + EPIPE. Then report how many bytes we wrote. We assume that this is the + pipe size. */ +-#include +- +-#if defined (HAVE_UNISTD_H) +-# ifdef _MINIX +-# include +-# endif +-# include +-#endif +- +-#include +-#ifndef _MINIX +-#include "../bashtypes.h" +-#endif ++// #include ++ ++// #if defined (HAVE_UNISTD_H) ++// # ifdef _MINIX ++// # include ++// # endif ++// # include ++// #endif ++ ++// #include ++// #ifndef _MINIX ++// #include "../bashtypes.h" ++// #endif + #include +-#include ++// #include + +-#include "../command.h" +-#include "../general.h" +-#include "../sig.h" ++// #include "../command.h" ++// #include "../general.h" ++// #include "../sig.h" + +-#ifndef errno +-extern int errno; +-#endif ++// #ifndef errno ++// extern int errno; ++// #endif ++#include ++#include ++#include + + int nw; + +-sighandler ++void + sigpipe (sig) + int sig; + { +diff --git bash-clean/lib/termcap/termcap.c bash-workdir/lib/termcap/termcap.c +index 87fae05..ed9d105 100644 +--- bash-clean/lib/termcap/termcap.c ++++ bash-workdir/lib/termcap/termcap.c +@@ -630,7 +630,7 @@ scan_file (str, fd, bufp) + bufp->ateof = 0; + *bufp->ptr = '\0'; + +- lseek (fd, 0L, 0); ++ lseek (fd, 0L, SEEK_SET); + + while (!bufp->ateof) + { +diff --git bash-clean/mksyntax.c bash-workdir/mksyntax.c +index 0385686..53011a2 100644 +--- bash-clean/mksyntax.c ++++ bash-workdir/mksyntax.c +@@ -20,29 +20,31 @@ + along with Bash. If not, see . + */ + +-#include "config.h" ++// #include "config.h" + ++#include + #include + #include "bashansi.h" + #include "chartypes.h" + #include + +-#ifdef HAVE_UNISTD_H +-# include +-#endif ++// #ifdef HAVE_UNISTD_H ++// # include ++// #endif ++#include + + #include "syntax.h" + + extern int optind; + extern char *optarg; + +-#ifndef errno +-extern int errno; +-#endif ++// #ifndef errno ++// extern int errno; ++// #endif + +-#ifndef HAVE_STRERROR +-extern char *strerror(); +-#endif ++// #ifndef HAVE_STRERROR ++// extern char *strerror(); ++// #endif + + struct wordflag { + int flag; +@@ -377,39 +379,39 @@ main(argc, argv) + } + + +-#if !defined (HAVE_STRERROR) +- +-#include +-#if defined (HAVE_SYS_PARAM_H) +-# include +-#endif +- +-#if defined (HAVE_UNISTD_H) +-# include +-#endif +- +-/* Return a string corresponding to the error number E. From +- the ANSI C spec. */ +-#if defined (strerror) +-# undef strerror +-#endif +- +-char * +-strerror (e) +- int e; +-{ +- static char emsg[40]; +-#if defined (HAVE_SYS_ERRLIST) +- extern int sys_nerr; +- extern char *sys_errlist[]; +- +- if (e > 0 && e < sys_nerr) +- return (sys_errlist[e]); +- else +-#endif /* HAVE_SYS_ERRLIST */ +- { +- sprintf (emsg, "Unknown system error %d", e); +- return (&emsg[0]); +- } +-} +-#endif /* HAVE_STRERROR */ ++// #if !defined (HAVE_STRERROR) ++ ++// #include ++// #if defined (HAVE_SYS_PARAM_H) ++// # include ++// #endif ++ ++// #if defined (HAVE_UNISTD_H) ++// # include ++// #endif ++ ++// /* Return a string corresponding to the error number E. From ++// the ANSI C spec. */ ++// #if defined (strerror) ++// # undef strerror ++// #endif ++ ++// char * ++// strerror (e) ++// int e; ++// { ++// static char emsg[40]; ++// #if defined (HAVE_SYS_ERRLIST) ++// extern int sys_nerr; ++// extern char *sys_errlist[]; ++ ++// if (e > 0 && e < sys_nerr) ++// return (sys_errlist[e]); ++// else ++// #endif /* HAVE_SYS_ERRLIST */ ++// { ++// sprintf (emsg, "Unknown system error %d", e); ++// return (&emsg[0]); ++// } ++// } ++// #endif /* HAVE_STRERROR */ +diff --git bash-clean/shell.c bash-workdir/shell.c +index ebd8965..05d6a85 100644 +--- bash-clean/shell.c ++++ bash-workdir/shell.c +@@ -1647,7 +1647,7 @@ open_shell_script (script_name) + #endif + + /* Only do this with non-tty file descriptors we can seek on. */ +- if (fd_is_tty == 0 && (lseek (fd, 0L, 1) != -1)) ++ if (fd_is_tty == 0 && (lseek (fd, 0L, SEEK_CUR) != -1)) + { + /* Check to see if the `file' in `bash file' is a binary file + according to the same tests done by execute_simple_command (), +@@ -1684,7 +1684,7 @@ open_shell_script (script_name) + exit (EX_BINARY_FILE); + } + /* Now rewind the file back to the beginning. */ +- lseek (fd, 0L, 0); ++ lseek (fd, 0L, SEEK_SET); + } + + /* Open the script. But try to move the file descriptor to a randomly +diff --git bash-clean/support/bashversion.c bash-workdir/support/bashversion.c +index ad02d46..1b8a4ae 100644 +--- bash-clean/support/bashversion.c ++++ bash-workdir/support/bashversion.c +@@ -18,15 +18,17 @@ + along with Bash. If not, see . + */ + +-#include "config.h" ++// #include "config.h" + + #include "stdc.h" + + #include ++#include + +-#if defined (HAVE_UNISTD_H) +-# include +-#endif ++// #if defined (HAVE_UNISTD_H) ++// # include ++// #endif ++#include + + #include "bashansi.h" + +diff --git bash-clean/support/man2html.c bash-workdir/support/man2html.c +index e6f441b..906e9f8 100644 +--- bash-clean/support/man2html.c ++++ bash-workdir/support/man2html.c +@@ -62,9 +62,9 @@ + * that all these features work on all manpages. (I didn't have the + * time to look through all the available manpages.) + */ +-#ifdef HAVE_CONFIG_H +-#include +-#endif ++// #ifdef HAVE_CONFIG_H ++// #include ++// #endif + + #define NROFF 0 + +@@ -123,26 +123,26 @@ char *manpage; + #define BD_LITERAL 1 + #define BD_INDENT 2 + +-#ifndef HAVE_STRERROR +-static char * +-strerror(int e) +-{ +- static char emsg[40]; +- +-#if defined (HAVE_SYS_ERRLIST) +- extern int sys_nerr; +- extern char *sys_errlist[]; +- +- if (e > 0 && e < sys_nerr) +- return (sys_errlist[e]); +- else +-#endif /* HAVE_SYS_ERRLIST */ +- { +- sprintf(emsg, "Unknown system error %d", e); +- return (&emsg[0]); +- } +-} +-#endif /* !HAVE_STRERROR */ ++// #ifndef HAVE_STRERROR ++// static char * ++// strerror(int e) ++// { ++// static char emsg[40]; ++ ++// #if defined (HAVE_SYS_ERRLIST) ++// extern int sys_nerr; ++// extern char *sys_errlist[]; ++ ++// if (e > 0 && e < sys_nerr) ++// return (sys_errlist[e]); ++// else ++// #endif /* HAVE_SYS_ERRLIST */ ++// { ++// sprintf(emsg, "Unknown system error %d", e); ++// return (&emsg[0]); ++// } ++// } ++// #endif /* !HAVE_STRERROR */ + + static char * + strgrow(char *old, int len) +diff --git bash-clean/support/mksignames.c bash-workdir/support/mksignames.c +index ba87ae8..bd13bab 100644 +--- bash-clean/support/mksignames.c ++++ bash-workdir/support/mksignames.c +@@ -19,17 +19,18 @@ + along with Bash. If not, see . + */ + +-#include ++// #include + + #include + #include + + #include +-#if defined (HAVE_STDLIB_H) +-# include +-#else +-# include "ansi_stdlib.h" +-#endif /* HAVE_STDLIB_H */ ++// #if defined (HAVE_STDLIB_H) ++// # include ++// #else ++// # include "ansi_stdlib.h" ++// #endif /* HAVE_STDLIB_H */ ++#include + + /* Duplicated from signames.c */ + #if !defined (NSIG) +diff --git bash-clean/support/signames.c bash-workdir/support/signames.c +index 84864fd..6b4e29f 100644 +--- bash-clean/support/signames.c ++++ bash-workdir/support/signames.c +@@ -18,18 +18,19 @@ + along with Bash. If not, see . + */ + +-#include ++// #include + + #include + + #include + #include + +-#if defined (HAVE_STDLIB_H) +-# include +-#else +-# include "ansi_stdlib.h" +-#endif /* HAVE_STDLIB_H */ ++// #if defined (HAVE_STDLIB_H) ++// # include ++// #else ++// # include "ansi_stdlib.h" ++// #endif /* HAVE_STDLIB_H */ ++#include + + #if !defined (NSIG) + # define NSIG 64 diff --git a/patches/binutils/binutils.patch b/patches/binutils/binutils.patch deleted file mode 100644 index 3e2580aa27f..00000000000 --- a/patches/binutils/binutils.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 23c517e8985baa0b4a788186d53e6299f72d48d0 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Tue, 31 Aug 2021 11:15:02 +1000 -Subject: [PATCH] targets: add aero target port - -Signed-off-by: Andy-Python-Programmer ---- - .vscode/settings.json | 6 ++++++ - bfd/config.bfd | 5 +++++ - config.sub | 2 +- - gas/configure.tgt | 1 + - ld/configure.tgt | 4 ++++ - 5 files changed, 17 insertions(+), 1 deletion(-) - create mode 100644 .vscode/settings.json - -diff --git a/.vscode/settings.json b/.vscode/settings.json -new file mode 100644 -index 00000000..7a72e53f ---- /dev/null -+++ b/.vscode/settings.json -@@ -0,0 +1,6 @@ -+{ -+ "editor.formatOnSave": false, -+ "files.associations": { -+ "inttypes.h": "c" -+ } -+} -\ No newline at end of file -diff --git a/bfd/config.bfd b/bfd/config.bfd -index 30087e3b..5f204466 100644 ---- a/bfd/config.bfd -+++ b/bfd/config.bfd -@@ -719,6 +719,11 @@ case "${targ}" in - targ_defvec=i386_elf32_vec - targ_selvecs="iamcu_elf32_vec i386_pe_vec i386_pei_vec" - ;; -+ x86_64-*-aero*) -+ targ_defvec=x86_64_elf64_vec -+ targ_selvecs=i386_elf32_vec -+ want64=true -+ ;; - i[3-7]86-*-interix*) - targ_defvec=i386_pei_vec - targ_selvecs="i386_pe_vec" -diff --git a/config.sub b/config.sub -index 7384e919..e1e5c644 100755 ---- a/config.sub -+++ b/config.sub -@@ -1704,7 +1704,7 @@ case $os in - | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ - | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ - | hiux* | abug | nacl* | netware* | windows* \ -- | os9* | macos* | osx* | ios* \ -+ | os9* | macos* | osx* | ios* | aero* \ - | mpw* | magic* | mmixware* | mon960* | lnews* \ - | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ - | aos* | aros* | cloudabi* | sortix* | twizzler* \ -diff --git a/gas/configure.tgt b/gas/configure.tgt -index 338892ad..d1a9ac68 100644 ---- a/gas/configure.tgt -+++ b/gas/configure.tgt -@@ -221,6 +221,7 @@ case ${generic_target} in - i386-*-beos*) fmt=elf ;; - i386-*-elfiamcu) fmt=elf arch=iamcu ;; - i386-*-elf*) fmt=elf ;; -+ i386-*-aero*) fmt=elf ;; - i386-*-fuchsia*) fmt=elf ;; - i386-*-genode*) fmt=elf ;; - i386-*-bsd*) fmt=aout em=386bsd ;; -diff --git a/ld/configure.tgt b/ld/configure.tgt -index 6205d7c9..5cd3f070 100644 ---- a/ld/configure.tgt -+++ b/ld/configure.tgt -@@ -323,6 +323,10 @@ i[3-7]86-*-linux-*) targ_emul=elf_i386 - targ64_extra_emuls="elf_x86_64 elf32_x86_64 elf_l1om elf_k1om" - targ64_extra_libpath="elf_x86_64 elf32_x86_64" - ;; -+x86_64-*-aero*) -+ targ_emul=elf_x86_64 -+ targ_extra_emuls=elf_i386 -+ ;; - i[3-7]86-*-redox*) targ_emul=elf_i386 - targ_extra_emuls=elf_x86_64 - ;; --- -2.25.1 - diff --git a/patches/binutils/jinx-working-patch.patch b/patches/binutils/jinx-working-patch.patch new file mode 100644 index 00000000000..2e63a00fa3d --- /dev/null +++ b/patches/binutils/jinx-working-patch.patch @@ -0,0 +1,154 @@ +diff --git binutils-clean/bfd/Makefile.am binutils-workdir/bfd/Makefile.am +index 5c5fdef..3c91651 100644 +--- binutils-clean/bfd/Makefile.am ++++ binutils-workdir/bfd/Makefile.am +@@ -778,7 +778,7 @@ ofiles: stamp-ofiles ; @true + libbfd_la_SOURCES = $(BFD32_LIBS_CFILES) + EXTRA_libbfd_la_SOURCES = $(CFILES) + libbfd_la_DEPENDENCIES = $(OFILES) ofiles ../libsframe/libsframe.la +-libbfd_la_LIBADD = `cat ofiles` @SHARED_LIBADD@ $(LIBDL) $(ZLIB) $(ZSTD_LIBS) ../libsframe/libsframe.la ++libbfd_la_LIBADD = `cat ofiles` @SHARED_LIBADD@ $(LIBDL) $(ZLIB) $(ZSTD_LIBS) $(SFRAME_LIB_PATH) ../libsframe/libsframe.la + libbfd_la_LDFLAGS += -release `cat libtool-soversion` @SHARED_LDFLAGS@ + + # This file holds an array associating configuration triplets and +diff --git binutils-clean/bfd/config.bfd binutils-workdir/bfd/config.bfd +index bdee539..48b2360 100644 +--- binutils-clean/bfd/config.bfd ++++ binutils-workdir/bfd/config.bfd +@@ -664,6 +664,11 @@ case "${targ}" in + targ_selvecs= + targ64_selvecs=x86_64_elf64_vec + ;; ++ i[3-7]86-*-aero*) ++ targ_defvec=i386_elf32_vec ++ targ_selvecs= ++ targ64_selvecs=x86_64_elf64_vec ++ ;; + #ifdef BFD64 + x86_64-*-cloudabi*) + targ_defvec=x86_64_elf64_cloudabi_vec +@@ -734,6 +739,11 @@ case "${targ}" in + targ_selvecs="i386_elf32_vec iamcu_elf32_vec x86_64_elf32_vec" + want64=true + ;; ++ x86_64-*-aero*) ++ targ_defvec=x86_64_elf64_vec ++ targ_selvecs=i386_elf32_vec ++ want64=true ++ ;; + #endif + i[3-7]86-*-lynxos*) + targ_defvec=i386_elf32_vec +diff --git binutils-clean/gas/configure.tgt binutils-workdir/gas/configure.tgt +index 3429f85..8fe03c1 100644 +--- binutils-clean/gas/configure.tgt ++++ binutils-workdir/gas/configure.tgt +@@ -227,6 +227,7 @@ case ${generic_target} in + i386-*-beos*) fmt=elf ;; + i386-*-elfiamcu) fmt=elf arch=iamcu ;; + i386-*-elf*) fmt=elf ;; ++ i386-*-aero*) fmt=elf em=gnu ;; + i386-*-fuchsia*) fmt=elf ;; + i386-*-haiku*) fmt=elf em=haiku ;; + i386-*-genode*) fmt=elf ;; +diff --git binutils-clean/gprofng/libcollector/configure.ac binutils-workdir/gprofng/libcollector/configure.ac +index 7af9581..c55e424 100644 +--- binutils-clean/gprofng/libcollector/configure.ac ++++ binutils-workdir/gprofng/libcollector/configure.ac +@@ -18,7 +18,7 @@ dnl . + + m4_include([../../bfd/version.m4]) + AC_INIT([gprofng], BFD_VERSION) +-AC_CONFIG_MACRO_DIRS([../../config ../..]) ++#AC_CONFIG_MACRO_DIRS([../../config ../..]) + AC_CONFIG_AUX_DIR(../..) + AC_CANONICAL_TARGET + AM_INIT_AUTOMAKE +diff --git binutils-clean/ld/configure.tgt binutils-workdir/ld/configure.tgt +index c62b958..3873c96 100644 +--- binutils-clean/ld/configure.tgt ++++ binutils-workdir/ld/configure.tgt +@@ -378,6 +378,9 @@ i[3-7]86-*-linux-*) targ_emul=elf_i386 + i[3-7]86-*-redox*) targ_emul=elf_i386 + targ_extra_emuls=elf_x86_64 + ;; ++i[3-7]86-*-aero*) targ_emul=elf_i386 ++ targ_extra_emuls=elf_x86_64 ++ ;; + i[3-7]86-*-solaris2*) targ_emul=elf_i386_sol2 + targ_extra_emuls="elf_i386_ldso elf_i386 elf_iamcu elf_x86_64_sol2 elf_x86_64" + targ_extra_libpath=$targ_extra_emuls +@@ -1011,6 +1014,9 @@ x86_64-*-linux-*) targ_emul=elf_x86_64 + x86_64-*-redox*) targ_emul=elf_x86_64 + targ_extra_emuls=elf_i386 + ;; ++x86_64-*-aero*) targ_emul=elf_x86_64 ++ targ_extra_emuls=elf_i386 ++ ;; + x86_64-*-solaris2*) targ_emul=elf_x86_64_sol2 + targ_extra_emuls="elf_x86_64 elf_i386_sol2 elf_i386_ldso elf_i386 elf_iamcu" + targ_extra_libpath=$targ_extra_emuls +diff --git binutils-clean/libiberty/configure.ac binutils-workdir/libiberty/configure.ac +index 0748c59..954e014 100644 +--- binutils-clean/libiberty/configure.ac ++++ binutils-workdir/libiberty/configure.ac +@@ -37,7 +37,7 @@ else + libiberty_topdir="${srcdir}/.." + fi + AC_SUBST(libiberty_topdir) +-AC_CONFIG_AUX_DIR($libiberty_topdir) ++AC_CONFIG_AUX_DIR([.]) + + dnl Very limited version of automake's enable-maintainer-mode + +diff --git binutils-workdir/multilib.am binutils-workdir/multilib.am +new file mode 100644 +index 0000000..5c98b69 +--- /dev/null ++++ binutils-workdir/multilib.am +@@ -0,0 +1,45 @@ ++## automake - create Makefile.in from Makefile.am ++ ++## Copyright (C) 1994-2017 Free Software Foundation, Inc. ++## This Makefile.in is free software; the Free Software Foundation ++## gives unlimited permission to copy and/or distribute it, ++## with or without modifications, as long as this notice is preserved. ++ ++## This program is distributed in the hope that it will be useful, ++## but WITHOUT ANY WARRANTY; without even the implied warranty of ++## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++## GNU General Public License for more details. ++ ++MULTISRCTOP = ++MULTIBUILDTOP = ++MULTIDIRS = ++MULTISUBDIR = ++MULTIDO = true ++MULTICLEAN = true ++ ++# GNU Make needs to see an explicit $(MAKE) variable in the command it ++# runs to enable its job server during parallel builds. Hence the ++# comments below. ++all-multi: ++ $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do # $(MAKE) ++install-multi: ++ $(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do # $(MAKE) ++mostlyclean-multi: ++ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean # $(MAKE) ++clean-multi: ++ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=clean multi-clean # $(MAKE) ++distclean-multi: ++ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean # $(MAKE) ++maintainer-clean-multi: ++ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean # $(MAKE) ++ ++.MAKE .PHONY: all-multi clean-multi distclean-multi install-am \ ++ install-multi maintainer-clean-multi mostlyclean-multi ++ ++install-exec-local: install-multi ++ ++all-local: all-multi ++mostlyclean-local: mostlyclean-multi ++clean-local: clean-multi ++distclean-local: distclean-multi ++maintainer-clean-local: maintainer-clean-multi diff --git a/patches/cairo/jinx-working-patch.patch b/patches/cairo/jinx-working-patch.patch new file mode 100644 index 00000000000..accf74eb94a --- /dev/null +++ b/patches/cairo/jinx-working-patch.patch @@ -0,0 +1,33 @@ +diff --git cairo-clean/meson.build cairo-workdir/meson.build +index 9100152..1b7e91d 100644 +--- cairo-clean/meson.build ++++ cairo-workdir/meson.build +@@ -374,18 +374,18 @@ if x11_dep.found() and xext_dep.found() + # between a set value (bool) or the fallback value (string), so convert to + # a string and check the string value. + prop_str = '@0@'.format(prop) +- if prop_str in ['true', 'false'] ++ #if prop_str in ['true', 'false'] + ipc_rmid_deferred_release = (prop_str == 'true') + message('IPC_RMID_DEFERRED_RELEASE:', ipc_rmid_deferred_release) +- elif prop_str == 'auto' +- res = cc.run(files('meson-cc-tests/ipc_rmid_deferred_release.c'), +- dependencies: [x11_dep, xext_dep], +- name: 'shmctl IPC_RMID allowes subsequent attaches') +- +- ipc_rmid_deferred_release = (res.returncode() == 0) +- else +- error('Unexpected value for external property ipc_rmid_deferred_release: @0@'.format(prop_str)) +- endif ++ #elif prop_str == 'auto' ++ # res = cc.run(files('meson-cc-tests/ipc_rmid_deferred_release.c'), ++ # dependencies: [x11_dep, xext_dep], ++ # name: 'shmctl IPC_RMID allowes subsequent attaches') ++ ++ # ipc_rmid_deferred_release = (res.returncode() == 0) ++ #else ++ # error('Unexpected value for external property ipc_rmid_deferred_release: @0@'.format(prop_str)) ++ #endif + + conf.set10('IPC_RMID_DEFERRED_RELEASE', ipc_rmid_deferred_release) + endif diff --git a/patches/coreutils/coreutils.patch b/patches/coreutils/coreutils.patch deleted file mode 100644 index da878672fc8..00000000000 --- a/patches/coreutils/coreutils.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/bundled/coreutils-orig/build-aux/config.sub b/bundled/coreutils-workdir/build-aux/config.sub -index f02d43a..06e0dab 100755 ---- a/bundled/coreutils-orig/build-aux/config.sub -+++ b/bundled/coreutils-workdir/build-aux/config.sub -@@ -1346,7 +1346,7 @@ case $os in - | aos* | aros* | cloudabi* | sortix* | twizzler* \ - | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ - | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ -- | knetbsd* | mirbsd* | netbsd* \ -+ | knetbsd* | mirbsd* | netbsd* | aero* \ - | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \ - | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ - | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ \ No newline at end of file diff --git a/patches/dbus/jinx-working-patch.patch b/patches/dbus/jinx-working-patch.patch new file mode 100644 index 00000000000..2daea44cafa --- /dev/null +++ b/patches/dbus/jinx-working-patch.patch @@ -0,0 +1,13 @@ +diff --git dbus-clean/dbus/dbus-sysdeps-unix.c dbus-workdir/dbus/dbus-sysdeps-unix.c +index dbc459c..6a3e851 100644 +--- dbus-clean/dbus/dbus-sysdeps-unix.c ++++ dbus-workdir/dbus/dbus-sysdeps-unix.c +@@ -4896,7 +4896,7 @@ _dbus_check_setuid (void) + + if (_DBUS_UNLIKELY (!check_setuid_initialised)) + { +-#ifdef HAVE_GETRESUID ++#if defined HAVE_GETRESUID && !defined(__aero__) + if (getresuid (&ruid, &euid, &suid) != 0 || + getresgid (&rgid, &egid, &sgid) != 0) + #endif /* HAVE_GETRESUID */ diff --git a/patches/dmenu/dmenu.patch b/patches/dmenu/dmenu.patch deleted file mode 100644 index 39f67ba2b98..00000000000 --- a/patches/dmenu/dmenu.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 919950798aa0175e18a12e3ab970d133ea0947c5 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sat, 12 Nov 2022 19:41:25 +1100 -Subject: [PATCH] - ---- - config.mk | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/config.mk b/config.mk -index 566348b..ae68b54 100644 ---- a/config.mk -+++ b/config.mk -@@ -9,8 +9,8 @@ X11INC = /usr/X11R6/include - X11LIB = /usr/X11R6/lib - - # Xinerama, comment if you don't want it --XINERAMALIBS = -lXinerama --XINERAMAFLAGS = -DXINERAMA -+# XINERAMALIBS = -lXinerama -+# XINERAMAFLAGS = -DXINERAMA - - # freetype - FREETYPELIBS = -lfontconfig -lXft --- -2.38.1 - diff --git a/patches/dwm/0001-uselessgaps.patch b/patches/dwm/0001-uselessgaps.patch deleted file mode 100644 index d9cacbecb6d..00000000000 --- a/patches/dwm/0001-uselessgaps.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 58a5ece9406ca6c90dc362617c065e4aac19417f Mon Sep 17 00:00:00 2001 -From: Cyril Cressent -Date: Wed, 3 Jul 2019 21:33:45 -0700 -Subject: [PATCH] Port the uselessgap patch to 6.2 - ---- - config.def.h | 1 + - dwm.c | 36 ++++++++++++++++++++++++++++++------ - 2 files changed, 31 insertions(+), 6 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 1c0b587..b11471d 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -2,6 +2,7 @@ - - /* appearance */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const unsigned int gappx = 6; /* gaps between windows */ - static const unsigned int snap = 32; /* snap pixel */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ -diff --git a/dwm.c b/dwm.c -index 4465af1..4545e05 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -52,8 +52,8 @@ - #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define MOUSEMASK (BUTTONMASK|PointerMotionMask) --#define WIDTH(X) ((X)->w + 2 * (X)->bw) --#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -+#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx) -+#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx) - #define TAGMASK ((1 << LENGTH(tags)) - 1) - #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -@@ -1276,12 +1276,36 @@ void - resizeclient(Client *c, int x, int y, int w, int h) - { - XWindowChanges wc; -+ unsigned int n; -+ unsigned int gapoffset; -+ unsigned int gapincr; -+ Client *nbc; - -- c->oldx = c->x; c->x = wc.x = x; -- c->oldy = c->y; c->y = wc.y = y; -- c->oldw = c->w; c->w = wc.width = w; -- c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; -+ -+ /* Get number of clients for the selected monitor */ -+ for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++); -+ -+ /* Do nothing if layout is floating */ -+ if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { -+ gapincr = gapoffset = 0; -+ } else { -+ /* Remove border and gap if layout is monocle or only one client */ -+ if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) { -+ gapoffset = 0; -+ gapincr = -2 * borderpx; -+ wc.border_width = 0; -+ } else { -+ gapoffset = gappx; -+ gapincr = 2 * gappx; -+ } -+ } -+ -+ c->oldx = c->x; c->x = wc.x = x + gapoffset; -+ c->oldy = c->y; c->y = wc.y = y + gapoffset; -+ c->oldw = c->w; c->w = wc.width = w - gapincr; -+ c->oldh = c->h; c->h = wc.height = h - gapincr; -+ - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); --- -2.22.0 - diff --git a/patches/dwm/dwm.patch b/patches/dwm/dwm.patch deleted file mode 100644 index 64e1887b23d..00000000000 --- a/patches/dwm/dwm.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 21113e6d56c83249371b8f57a9cd3128df2f2436 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Wed, 29 Mar 2023 12:17:14 +1100 -Subject: [PATCH] - ---- - config.def.h | 22 +++++++++++----------- - config.mk | 4 ++-- - 2 files changed, 13 insertions(+), 13 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 9efa774..1be6069 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -4,18 +4,18 @@ - static const unsigned int borderpx = 1; /* border pixel of windows */ - static const unsigned int snap = 32; /* snap pixel */ - static const int showbar = 1; /* 0 means no bar */ --static const int topbar = 1; /* 0 means bottom bar */ -+static const int topbar = 0; /* 0 means bottom bar */ - static const char *fonts[] = { "monospace:size=10" }; - static const char dmenufont[] = "monospace:size=10"; --static const char col_gray1[] = "#222222"; --static const char col_gray2[] = "#444444"; --static const char col_gray3[] = "#bbbbbb"; --static const char col_gray4[] = "#eeeeee"; --static const char col_cyan[] = "#005577"; -+static const char col_gray1[] = "#2e3440"; -+static const char col_gray2[] = "#434c5e"; -+static const char col_gray3[] = "#e5e9f0"; -+static const char col_gray4[] = "#d8dee9"; -+static const char col_cyan[] = "#88c0d0"; - static const char *colors[][3] = { -- /* fg bg border */ -- [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, -- [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -+ /* fg bg border */ -+ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, -+ [SchemeSel] = { col_gray1, col_cyan, col_cyan }, - }; - - /* tagging */ -@@ -57,8 +57,8 @@ static const Layout layouts[] = { - - /* commands */ - static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ --static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; --static const char *termcmd[] = { "st", NULL }; -+static const char *dmenucmd[] = { "dmenu_run", NULL }; -+static const char *termcmd[] = { "alacritty", NULL }; - - static const Key keys[] = { - /* modifier key function argument */ -diff --git a/config.mk b/config.mk -index ba64d3d..d360492 100644 ---- a/config.mk -+++ b/config.mk -@@ -11,8 +11,8 @@ X11INC = /usr/X11R6/include - X11LIB = /usr/X11R6/lib - - # Xinerama, comment if you don't want it --XINERAMALIBS = -lXinerama --XINERAMAFLAGS = -DXINERAMA -+# XINERAMALIBS = -lXinerama -+# XINERAMAFLAGS = -DXINERAMA - - # freetype - FREETYPELIBS = -lfontconfig -lXft --- -2.39.2 - diff --git a/patches/fontconfig/0001-fontconfig-aero-specific-changes.patch b/patches/fontconfig/0001-fontconfig-aero-specific-changes.patch deleted file mode 100644 index 31da2315c26..00000000000 --- a/patches/fontconfig/0001-fontconfig-aero-specific-changes.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 923dd34de98831460447a85a2786e7c7d6ff3a95 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Wed, 5 Oct 2022 19:43:23 +1100 -Subject: [PATCH] fontconfig: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - src/fcstat.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/fcstat.c b/src/fcstat.c -index 4f69eae..8a621dd 100644 ---- a/src/fcstat.c -+++ b/src/fcstat.c -@@ -386,7 +386,7 @@ FcFStatFs (int fd, FcStatFS *statb) - # endif - # if defined(HAVE_STRUCT_STATFS_F_FSTYPENAME) - p = buf.f_fstypename; --# elif defined(__linux__) || defined (__EMSCRIPTEN__) -+# elif defined(__linux__) || defined(__aero__) || defined (__EMSCRIPTEN__) - switch (buf.f_type) - { - case 0x6969: /* nfs */ --- -2.25.1 - diff --git a/patches/fontconfig/jinx-working-patch.patch b/patches/fontconfig/jinx-working-patch.patch new file mode 100644 index 00000000000..b1816e93eeb --- /dev/null +++ b/patches/fontconfig/jinx-working-patch.patch @@ -0,0 +1,13 @@ +diff --git fontconfig-clean/src/fcstat.c fontconfig-workdir/src/fcstat.c +index 4f69eae..519cf1d 100644 +--- fontconfig-clean/src/fcstat.c ++++ fontconfig-workdir/src/fcstat.c +@@ -386,7 +386,7 @@ FcFStatFs (int fd, FcStatFS *statb) + # endif + # if defined(HAVE_STRUCT_STATFS_F_FSTYPENAME) + p = buf.f_fstypename; +-# elif defined(__linux__) || defined (__EMSCRIPTEN__) ++# elif defined(__linux__) || defined (__aero__) || defined (__EMSCRIPTEN__) + switch (buf.f_type) + { + case 0x6969: /* nfs */ diff --git a/patches/gcc-host/jinx-working-patch.patch b/patches/gcc-host/jinx-working-patch.patch new file mode 100644 index 00000000000..d280068ea5f --- /dev/null +++ b/patches/gcc-host/jinx-working-patch.patch @@ -0,0 +1,153 @@ +diff --git gcc-host-clean/fixincludes/mkfixinc.sh gcc-host-workdir/fixincludes/mkfixinc.sh +index df90720..da6408a 100755 +--- gcc-host-clean/fixincludes/mkfixinc.sh ++++ gcc-host-workdir/fixincludes/mkfixinc.sh +@@ -12,6 +12,7 @@ target=fixinc.sh + # Check for special fix rules for particular targets + case $machine in + i?86-*-cygwin* | \ ++ x86_64-*-aero* | \ + i?86-*-mingw32* | \ + x86_64-*-mingw32* | \ + powerpc-*-eabisim* | \ +diff --git gcc-host-workdir/gcc/config/aero.h gcc-host-workdir/gcc/config/aero.h +new file mode 100644 +index 0000000..be79aae +--- /dev/null ++++ gcc-host-workdir/gcc/config/aero.h +@@ -0,0 +1,29 @@ ++#undef TARGET_AERO ++#define TARGET_AERO 1 ++ ++#undef LIB_SPEC ++#define LIB_SPEC "-lc" ++ ++#undef STARTFILE_SPEC ++#define STARTFILE_SPEC "%{!shared:crt0.o%s} crti.o%s %{shared:crtbeginS.o%s;:crtbegin.o%s}" ++ ++#undef ENDFILE_SPEC ++#define ENDFILE_SPEC "%{shared:crtendS.o%s;:crtend.o%s} crtn.o%s" ++ ++#define GNU_USER_LINK_EMULATION32 "elf_i386" ++#define GNU_USER_LINK_EMULATION64 "elf_x86_64" ++#define GNU_USER_LINK_EMULATIONX32 "elf32_x86_64" ++ ++#define GNU_USER_DYNAMIC_LINKER32 "/usr/lib/ld_i386.so" ++#define GNU_USER_DYNAMIC_LINKER64 "/usr/lib/ld.so" ++#define GNU_USER_DYNAMIC_LINKERX32 "/usr/lib/ld32.so" ++ ++#undef TARGET_OS_CPP_BUILTINS ++#define TARGET_OS_CPP_BUILTINS() \ ++ do { \ ++ builtin_define ("__aero__"); \ ++ builtin_define ("__unix__"); \ ++ builtin_assert ("system=aero"); \ ++ builtin_assert ("system=unix"); \ ++ builtin_assert ("system=posix"); \ ++ } while (0); +diff --git gcc-host-clean/gcc/config.gcc gcc-host-workdir/gcc/config.gcc +index 648b3dc..f2b0217 100644 +--- gcc-host-clean/gcc/config.gcc ++++ gcc-host-workdir/gcc/config.gcc +@@ -840,6 +840,15 @@ case ${target} in + tmake_file="${tmake_file} t-freebsd" + target_has_targetdm=yes + ;; ++*-*-aero*) ++ extra_options="$extra_options gnu-user.opt" ++ gas=yes ++ gnu_ld=yes ++ default_use_cxa_atexit=yes ++ use_gcc_stdint=wrap ++ tmake_file="${tmake_file} t-slibgcc" ++ thread_file='posix' ++ ;; + *-*-fuchsia*) + native_system_header_dir=/include + ;; +@@ -2214,6 +2223,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) + ;; + esac + ;; ++x86_64-*-aero*) ++ tm_file="${tm_file} i386/unix.h i386/att.h elfos.h gnu-user.h glibc-stdint.h i386/x86-64.h i386/gnu-user-common.h i386/gnu-user64.h aero.h" ++ ;; + x86_64-*-fuchsia*) + tmake_file="${tmake_file} i386/t-x86_64-elf" + tm_file="${tm_file} i386/unix.h i386/att.h elfos.h newlib-stdint.h i386/i386elf.h i386/x86-64.h fuchsia.h" +diff --git gcc-host-clean/libgcc/config.host gcc-host-workdir/libgcc/config.host +index 9d72120..b4e90ab 100644 +--- gcc-host-clean/libgcc/config.host ++++ gcc-host-workdir/libgcc/config.host +@@ -281,6 +281,11 @@ case ${host} in + tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-fuchsia" + extra_parts="crtbegin.o crtend.o" + ;; ++*-*-aero*) ++ extra_parts="$extra_parts crti.o crtbegin.o crtbeginS.o crtend.o crtendS.o crtn.o" ++ tmake_file="$tmake_file t-crtstuff-pic" ++ tmake_file="$tmake_file t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-libgcc-pic" ++ ;; + *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi) + tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-linux" + extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o" +@@ -715,6 +720,10 @@ x86_64-*-elf* | x86_64-*-rtems*) + x86_64-*-fuchsia*) + tmake_file="$tmake_file t-libgcc-pic" + ;; ++x86_64-*-aero*) ++ extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" ++ tmake_file="$tmake_file i386/t-crtpc t-crtfm i386/t-crtstuff t-dfprules" ++ ;; + i[34567]86-*-dragonfly*) + tmake_file="${tmake_file} i386/t-dragonfly i386/t-crtstuff" + md_unwind_header=i386/dragonfly-unwind.h +diff --git gcc-host-clean/libgcc/configure.ac gcc-host-workdir/libgcc/configure.ac +index 2fc9d5d..83d246e 100644 +--- gcc-host-clean/libgcc/configure.ac ++++ gcc-host-workdir/libgcc/configure.ac +@@ -46,7 +46,7 @@ else + libgcc_topdir="${srcdir}/.." + fi + AC_SUBST(libgcc_topdir) +-AC_CONFIG_AUX_DIR($libgcc_topdir) ++AC_CONFIG_AUX_DIR([.]) + AC_CONFIG_HEADER(auto-target.h:config.in) + + AC_ARG_ENABLE(shared, +diff --git gcc-host-clean/libiberty/configure.ac gcc-host-workdir/libiberty/configure.ac +index 28d996f..61ff752 100644 +--- gcc-host-clean/libiberty/configure.ac ++++ gcc-host-workdir/libiberty/configure.ac +@@ -37,7 +37,7 @@ else + libiberty_topdir="${srcdir}/.." + fi + AC_SUBST(libiberty_topdir) +-AC_CONFIG_AUX_DIR($libiberty_topdir) ++AC_CONFIG_AUX_DIR([.]) + + dnl Very limited version of automake's enable-maintainer-mode + +diff --git gcc-host-clean/libstdc++-v3/crossconfig.m4 gcc-host-workdir/libstdc++-v3/crossconfig.m4 +index b3269cb..a1d4a28 100644 +--- gcc-host-clean/libstdc++-v3/crossconfig.m4 ++++ gcc-host-workdir/libstdc++-v3/crossconfig.m4 +@@ -136,6 +136,18 @@ case "${host}" in + AC_CHECK_FUNCS(uselocale) + ;; + ++ *-aero*) ++ GLIBCXX_CHECK_COMPILER_FEATURES ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_MATH_SUPPORT ++ GLIBCXX_CHECK_STDLIB_SUPPORT ++ AC_DEFINE(_GLIBCXX_USE_DEV_RANDOM) ++ AC_DEFINE(_GLIBCXX_USE_RANDOM_TR1) ++ GCC_CHECK_TLS ++ AC_CHECK_FUNCS(aligned_alloc posix_memalign memalign _aligned_malloc) ++ AC_CHECK_FUNCS(timespec_get) ++ ;; ++ + *-fuchsia*) + SECTION_FLAGS='-ffunction-sections -fdata-sections' + AC_SUBST(SECTION_FLAGS) diff --git a/patches/gcc/gcc.patch b/patches/gcc/gcc.patch deleted file mode 100644 index 9465555f5b7..00000000000 --- a/patches/gcc/gcc.patch +++ /dev/null @@ -1,214 +0,0 @@ -From 4c867374622a04f29a5501dfc74f1057041cc0fc Mon Sep 17 00:00:00 2001 -From: Anhad Singh -Date: Thu, 3 Aug 2023 12:51:21 +1000 -Subject: [PATCH] gcc: add aero target - -Signed-off-by: Anhad Singh ---- - config.sub | 4 ++-- - fixincludes/mkfixinc.sh | 1 + - gcc/config.gcc | 12 ++++++++++++ - gcc/config/aero.h | 30 ++++++++++++++++++++++++++++++ - libgcc/config.host | 8 ++++++++ - libgcc/libgcov.h | 1 + - libstdc++-v3/crossconfig.m4 | 12 ++++++++++++ - libtool.m4 | 14 ++++++++++++++ - 8 files changed, 80 insertions(+), 2 deletions(-) - create mode 100644 gcc/config/aero.h - -diff --git a/config.sub b/config.sub -index 38f3d037a..956f31f08 100755 ---- a/config.sub -+++ b/config.sub -@@ -145,7 +145,7 @@ case $1 in - nto-qnx* | linux-* | uclinux-uclibc* \ - | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ - | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ -- | storm-chaos* | os2-emx* | rtmk-nova*) -+ | storm-chaos* | os2-emx* | rtmk-nova* | aero*) - basic_machine=$field1 - basic_os=$maybe_os - ;; -@@ -1749,7 +1749,7 @@ case $os in - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ -- | fiwix* ) -+ | fiwix* | aero*) - ;; - # This one is extra strict with allowed versions - sco3.2v2 | sco3.2v[4-9]* | sco5v6*) -diff --git a/fixincludes/mkfixinc.sh b/fixincludes/mkfixinc.sh -index df90720b7..e8c2b21c1 100755 ---- a/fixincludes/mkfixinc.sh -+++ b/fixincludes/mkfixinc.sh -@@ -11,6 +11,7 @@ target=fixinc.sh - - # Check for special fix rules for particular targets - case $machine in -+ x86_64-*-aero* | \ - i?86-*-cygwin* | \ - i?86-*-mingw32* | \ - x86_64-*-mingw32* | \ -diff --git a/gcc/config.gcc b/gcc/config.gcc -index 648b3dc21..4a13aceda 100644 ---- a/gcc/config.gcc -+++ b/gcc/config.gcc -@@ -840,6 +840,15 @@ case ${target} in - tmake_file="${tmake_file} t-freebsd" - target_has_targetdm=yes - ;; -+*-*-aero*) -+ extra_options="$extra_options gnu-user.opt" -+ gas=yes -+ gnu_ld=yes -+ default_use_cxa_atexit=yes -+ use_gcc_stdint=wrap -+ tmake_file="${tmake_file} t-slibgcc" -+ thread_file='posix' -+ ;; - *-*-fuchsia*) - native_system_header_dir=/include - ;; -@@ -2214,6 +2223,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) - ;; - esac - ;; -+x86_64-*-aero*) -+ tm_file="${tm_file} i386/unix.h i386/att.h elfos.h gnu-user.h glibc-stdint.h i386/x86-64.h i386/gnu-user-common.h i386/gnu-user64.h aero.h" -+ ;; - x86_64-*-fuchsia*) - tmake_file="${tmake_file} i386/t-x86_64-elf" - tm_file="${tm_file} i386/unix.h i386/att.h elfos.h newlib-stdint.h i386/i386elf.h i386/x86-64.h fuchsia.h" -diff --git a/gcc/config/aero.h b/gcc/config/aero.h -new file mode 100644 -index 000000000..e8c149e40 ---- /dev/null -+++ b/gcc/config/aero.h -@@ -0,0 +1,30 @@ -+#undef TARGET_AERO -+#define TARGET_AERO 1 -+ -+#undef LIB_SPEC -+#define LIB_SPEC "-lc -lm" -+ -+#undef STARTFILE_SPEC -+#define STARTFILE_SPEC "%{!shared:crt0.o%s} crti.o%s %{shared:crtbeginS.o%s;:crtbegin.o%s}" -+ -+#undef ENDFILE_SPEC -+#define ENDFILE_SPEC "%{shared:crtendS.o%s;:crtend.o%s} crtn.o%s" -+ -+#define GNU_USER_LINK_EMULATION32 "elf_i386" -+#define GNU_USER_LINK_EMULATION64 "elf_x86_64" -+#define GNU_USER_LINK_EMULATIONX32 "elf32_x86_64" -+ -+#define GNU_USER_DYNAMIC_LINKER32 "/usr/lib/ld_i386.so" -+#define GNU_USER_DYNAMIC_LINKER64 "/usr/lib/ld.so" -+#define GNU_USER_DYNAMIC_LINKERX32 "/usr/lib/ld32.so" -+ -+#undef TARGET_OS_CPP_BUILTINS -+#define TARGET_OS_CPP_BUILTINS() \ -+ do \ -+ { \ -+ builtin_define("__aero__"); \ -+ builtin_define("__unix__"); \ -+ builtin_assert("system=aero"); \ -+ builtin_assert("system=unix"); \ -+ builtin_assert("system=posix"); \ -+ } while (0); -diff --git a/libgcc/config.host b/libgcc/config.host -index 9d7212028..3724a1ac5 100644 ---- a/libgcc/config.host -+++ b/libgcc/config.host -@@ -281,6 +281,11 @@ case ${host} in - tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-fuchsia" - extra_parts="crtbegin.o crtend.o" - ;; -+*-*-aero*) -+ extra_parts="$extra_parts crti.o crtbegin.o crtbeginS.o crtend.o crtendS.o crtn.o" -+ tmake_file="$tmake_file t-crtstuff-pic" -+ tmake_file="$tmake_file t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-libgcc-pic" -+ ;; - *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi) - tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-linux" - extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o" -@@ -715,6 +720,9 @@ x86_64-*-elf* | x86_64-*-rtems*) - x86_64-*-fuchsia*) - tmake_file="$tmake_file t-libgcc-pic" - ;; -+x86_64-*-aero*) -+ tmake_file="$tmake_file i386/t-crtstuff" -+ ;; - i[34567]86-*-dragonfly*) - tmake_file="${tmake_file} i386/t-dragonfly i386/t-crtstuff" - md_unwind_header=i386/dragonfly-unwind.h -diff --git a/libgcc/libgcov.h b/libgcc/libgcov.h -index 92df440d4..320f3b500 100644 ---- a/libgcc/libgcov.h -+++ b/libgcc/libgcov.h -@@ -44,6 +44,7 @@ - #include "tm.h" - #include "libgcc_tm.h" - #include "gcov.h" -+#include - - #if HAVE_SYS_MMAN_H - #include -diff --git a/libstdc++-v3/crossconfig.m4 b/libstdc++-v3/crossconfig.m4 -index b3269cb88..4187dba89 100644 ---- a/libstdc++-v3/crossconfig.m4 -+++ b/libstdc++-v3/crossconfig.m4 -@@ -136,6 +136,18 @@ case "${host}" in - AC_CHECK_FUNCS(uselocale) - ;; - -+ *-aero*) -+ GLIBCXX_CHECK_COMPILER_FEATURES -+ GLIBCXX_CHECK_LINKER_FEATURES -+ GLIBCXX_CHECK_MATH_SUPPORT -+ GLIBCXX_CHECK_STDLIB_SUPPORT -+ AC_DEFINE(_GLIBCXX_USE_DEV_RANDOM) -+ AC_DEFINE(_GLIBCXX_USE_RANDOM_TR1) -+ GCC_CHECK_TLS -+ AC_CHECK_FUNCS(aligned_alloc posix_memalign memalign _aligned_malloc) -+ AC_CHECK_FUNCS(timespec_get) -+ ;; -+ - *-fuchsia*) - SECTION_FLAGS='-ffunction-sections -fdata-sections' - AC_SUBST(SECTION_FLAGS) -diff --git a/libtool.m4 b/libtool.m4 -index b92e284d9..491d24c54 100644 ---- a/libtool.m4 -+++ b/libtool.m4 -@@ -2491,6 +2491,16 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu* | uclinuxfdpiceabi) - dynamic_linker='GNU/Linux ld.so' - ;; - -+aero*) -+ version_type=linux -+ need_lib_prefix=no -+ need_version=no -+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' -+ soname_spec='${libname}${release}${shared_ext}$major' -+ shlibpath_var=LD_LIBRARY_PATH -+ hardcode_into_libs=yes -+ ;; -+ - netbsd*) - version_type=sunos - need_lib_prefix=no -@@ -3109,6 +3119,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi) - lt_cv_deplibs_check_method=pass_all - ;; - -+aero*) -+ lt_cv_deplibs_check_method=pass_all -+ ;; -+ - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' --- -2.41.0 - diff --git a/patches/glib/0001-glib.patch b/patches/glib/0001-glib.patch deleted file mode 100644 index 04bd02ecce8..00000000000 --- a/patches/glib/0001-glib.patch +++ /dev/null @@ -1,51 +0,0 @@ -From b8ace0ebfb751e7ae165aa3d52093c89801f37e5 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 16 Apr 2023 16:50:17 +1000 -Subject: [PATCH] - ---- - gio/gcredentialsprivate.h | 2 +- - glib/glib-init.c | 1 + - glib/gstrfuncs.c | 1 + - 3 files changed, 3 insertions(+), 1 deletion(-) - -diff --git a/gio/gcredentialsprivate.h b/gio/gcredentialsprivate.h -index c09f9ec..3942c48 100644 ---- a/gio/gcredentialsprivate.h -+++ b/gio/gcredentialsprivate.h -@@ -102,7 +102,7 @@ - */ - #undef G_CREDENTIALS_HAS_PID - --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - #define G_CREDENTIALS_SUPPORTED 1 - #define G_CREDENTIALS_USE_LINUX_UCRED 1 - #define G_CREDENTIALS_NATIVE_TYPE G_CREDENTIALS_TYPE_LINUX_UCRED -diff --git a/glib/glib-init.c b/glib/glib-init.c -index e7b4984..2e38538 100644 ---- a/glib/glib-init.c -+++ b/glib/glib-init.c -@@ -27,6 +27,7 @@ - #include "gmem.h" /* for g_mem_gc_friendly */ - - #include -+#include - #include - #include - #include -diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c -index 9273533..2e3b9b2 100644 ---- a/glib/gstrfuncs.c -+++ b/glib/gstrfuncs.c -@@ -33,6 +33,7 @@ - #include - #include - #include -+#include - #include - #include - #include --- -2.40.0 - diff --git a/patches/glib/0002-Patch-out-assert-in-g_io_unix_get_flags.patch b/patches/glib/0002-Patch-out-assert-in-g_io_unix_get_flags.patch deleted file mode 100644 index fa109fc2557..00000000000 --- a/patches/glib/0002-Patch-out-assert-in-g_io_unix_get_flags.patch +++ /dev/null @@ -1,30 +0,0 @@ -From fe2c4357d753d3a5baed7e2354f3542a1e87b46d Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Wed, 12 Oct 2022 02:54:15 +0200 -Subject: [PATCH 2/2] Patch out assert in g_io_unix_get_flags - -We don't implement the neccesary bits to fully support this, so in case of doubt, return readable and writeable. - -Signed-off-by: Dennis Bonke ---- - glib/giounix.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/glib/giounix.c b/glib/giounix.c -index ad3aba2..e0237fc 100644 ---- a/glib/giounix.c -+++ b/glib/giounix.c -@@ -436,7 +436,10 @@ g_io_unix_get_flags (GIOChannel *channel) - channel->is_writeable = TRUE; - break; - default: -- g_assert_not_reached (); -+ channel->is_readable = TRUE; -+ channel->is_writeable = TRUE; -+ break; -+ //g_assert_not_reached (); - } - - return flags; --- -2.37.2 diff --git a/patches/glib/jinx-working-patch.patch b/patches/glib/jinx-working-patch.patch new file mode 100644 index 00000000000..5469c6c890a --- /dev/null +++ b/patches/glib/jinx-working-patch.patch @@ -0,0 +1,53 @@ +diff --git glib-clean/gio/gcredentialsprivate.h glib-workdir/gio/gcredentialsprivate.h +index 0310a75..f967f90 100644 +--- glib-clean/gio/gcredentialsprivate.h ++++ glib-workdir/gio/gcredentialsprivate.h +@@ -104,7 +104,7 @@ + */ + #undef G_CREDENTIALS_HAS_PID + +-#ifdef __linux__ ++#if defined(__linux__) || defined(__aero__) + #define G_CREDENTIALS_SUPPORTED 1 + #define G_CREDENTIALS_USE_LINUX_UCRED 1 + #define G_CREDENTIALS_NATIVE_TYPE G_CREDENTIALS_TYPE_LINUX_UCRED +diff --git glib-clean/glib/giounix.c glib-workdir/glib/giounix.c +index 84e8135..5b68f25 100644 +--- glib-clean/glib/giounix.c ++++ glib-workdir/glib/giounix.c +@@ -440,7 +440,10 @@ g_io_unix_get_flags (GIOChannel *channel) + channel->is_writeable = TRUE; + break; + default: +- g_assert_not_reached (); ++ channel->is_readable = TRUE; ++ channel->is_writeable = TRUE; ++ break; ++ // g_assert_not_reached (); + } + + return flags; +diff --git glib-clean/glib/glib-init.c glib-workdir/glib/glib-init.c +index 933f891..393e51d 100644 +--- glib-clean/glib/glib-init.c ++++ glib-workdir/glib/glib-init.c +@@ -29,6 +29,7 @@ + #include "gmem.h" /* for g_mem_gc_friendly */ + + #include ++#include + #include + #include + #include +diff --git glib-clean/glib/gstrfuncs.c glib-workdir/glib/gstrfuncs.c +index 22a608d..29e123c 100644 +--- glib-clean/glib/gstrfuncs.c ++++ glib-workdir/glib/gstrfuncs.c +@@ -35,6 +35,7 @@ + #include + #include + #include ++#include + #include + #include + #include diff --git a/patches/gobject-introspection/gobject-introspection.patch b/patches/gobject-introspection/gobject-introspection.patch deleted file mode 100644 index 77521b645e8..00000000000 --- a/patches/gobject-introspection/gobject-introspection.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 4e30153d4e58f67d3cb040a75afa37cdc57cba33 Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Fri, 4 Feb 2022 02:24:50 +0100 -Subject: [PATCH] Disable tests as they are broken - -Signed-off-by: Dennis Bonke ---- - meson.build | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/meson.build b/meson.build -index bb4873e0..83931a4a 100644 ---- a/meson.build -+++ b/meson.build -@@ -234,9 +234,9 @@ subdir('docs') - - # The tests will also run, which is not possible if they - # were built for a different architecture. --if not meson.is_cross_build() -- subdir('tests') --endif -+#if not meson.is_cross_build() -+# subdir('tests') -+#endif - - install_data('Makefile.introspection', install_dir: join_paths(get_option('datadir'), 'gobject-introspection-1.0')) - install_data('m4/introspection.m4', install_dir: join_paths(get_option('datadir'), 'aclocal')) --- -2.34.1 diff --git a/patches/gtk+-3/gtk+-3.patch b/patches/gtk+-3/gtk+-3.patch deleted file mode 100644 index 0745b344f97..00000000000 --- a/patches/gtk+-3/gtk+-3.patch +++ /dev/null @@ -1,77 +0,0 @@ -From ce246ae059f136289ac1e1d65a406f724e5114a6 Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Sun, 3 Apr 2022 22:48:43 +0200 -Subject: [PATCH] Initial Aero support - -Signed-off-by: Dennis Bonke ---- - gdk/wayland/gdkdisplay-wayland.c | 1 - - gtk/a11y/gtkaccessibility.c | 5 +++++ - gtk/gtkmain.c | 5 +++++ - meson.build | 2 +- - 4 files changed, 11 insertions(+), 2 deletions(-) - -diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c -index d4503c2..0e2efc6 100644 ---- a/gdk/wayland/gdkdisplay-wayland.c -+++ b/gdk/wayland/gdkdisplay-wayland.c -@@ -28,7 +28,6 @@ - #endif - - #include --#include - - #include - #include "gdkwayland.h" -diff --git a/gtk/a11y/gtkaccessibility.c b/gtk/a11y/gtkaccessibility.c -index 7f0e520..543a78e 100644 ---- a/gtk/a11y/gtkaccessibility.c -+++ b/gtk/a11y/gtkaccessibility.c -@@ -974,6 +974,10 @@ do_window_event_initialization (void) - void - _gtk_accessibility_init (void) - { -+// We don't care about a11y at this point in time and dbus isn't working, so let's just not start that. -+#ifdef __aero__ -+ return; -+#else - if (initialized) - return; - -@@ -993,4 +997,5 @@ _gtk_accessibility_init (void) - #endif - - atk_misc_instance = g_object_new (GTK_TYPE_MISC_IMPL, NULL); -+#endif - } -diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c -index f7cbb34..8e035d4 100644 ---- a/gtk/gtkmain.c -+++ b/gtk/gtkmain.c -@@ -357,6 +357,11 @@ static gboolean - check_setugid (void) - { - /* this isn't at all relevant on MS Windows and doesn't compile ... --hb */ -+#ifdef __aero__ -+ /* Aero runs everything as root for the time being, this check is thus useless. */ -+ g_warning("Aero ignores the setugid check!\n"); -+ return TRUE; -+#endif - #ifndef G_OS_WIN32 - uid_t ruid, euid, suid; /* Real, effective and saved user ID's */ - gid_t rgid, egid, sgid; /* Real, effective and saved group ID's */ -diff --git a/meson.build b/meson.build -index a8f1383..32118df 100644 ---- a/meson.build -+++ b/meson.build -@@ -307,7 +307,7 @@ elif cc.get_id() == 'gcc' or cc.get_id() == 'clang' - '-Werror=sequence-point', - '-Werror=return-type', - '-Werror=trigraphs', -- '-Werror=array-bounds', -+ #'-Werror=array-bounds', - '-Werror=write-strings', - '-Werror=address', - '-Werror=int-to-pointer-cast', --- -2.39.0 diff --git a/patches/gtk+-3/jinx-working-patch.patch b/patches/gtk+-3/jinx-working-patch.patch new file mode 100644 index 00000000000..3dfbaf5c570 --- /dev/null +++ b/patches/gtk+-3/jinx-working-patch.patch @@ -0,0 +1,37 @@ +diff --git gtk+-3-clean/gtk/a11y/gtkaccessibility.c gtk+-3-workdir/gtk/a11y/gtkaccessibility.c +index 7f0e520..3bf670c 100644 +--- gtk+-3-clean/gtk/a11y/gtkaccessibility.c ++++ gtk+-3-workdir/gtk/a11y/gtkaccessibility.c +@@ -974,6 +974,10 @@ do_window_event_initialization (void) + void + _gtk_accessibility_init (void) + { ++// We don't care about a11y at this point in time and dbus isn't working, so let's just not start that. ++#ifdef __aero__ ++ return; ++#else + if (initialized) + return; + +@@ -993,4 +997,5 @@ _gtk_accessibility_init (void) + #endif + + atk_misc_instance = g_object_new (GTK_TYPE_MISC_IMPL, NULL); ++#endif + } +diff --git gtk+-3-clean/gtk/gtkmain.c gtk+-3-workdir/gtk/gtkmain.c +index ae64e18..2d43754 100644 +--- gtk+-3-clean/gtk/gtkmain.c ++++ gtk+-3-workdir/gtk/gtkmain.c +@@ -355,6 +355,11 @@ static gboolean + check_setugid (void) + { + /* this isn't at all relevant on MS Windows and doesn't compile ... --hb */ ++#ifdef __aero__ ++ /* Lyre runs everything as root for the time being, this check is thus useless. */ ++ g_warning("Lyre ignores the setugid check!\n"); ++ return TRUE; ++#endif + #ifndef G_OS_WIN32 + uid_t ruid, euid, suid; /* Real, effective and saved user ID's */ + gid_t rgid, egid, sgid; /* Real, effective and saved group ID's */ diff --git a/patches/jq/jq.patch b/patches/jq/jq.patch deleted file mode 100644 index 48435b6e0b3..00000000000 --- a/patches/jq/jq.patch +++ /dev/null @@ -1,40 +0,0 @@ -diff -crB jq-1.7-orig/config/config.sub jq-1.7/config/config.sub -*** jq-1.7-orig/config/config.sub 2023-11-04 14:43:08.915178973 +1100 ---- jq-1.7/config/config.sub 2023-11-04 14:43:43.691560304 +1100 -*************** -*** 1754,1760 **** - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ -! | fiwix* ) - ;; - # This one is extra strict with allowed versions - sco3.2v2 | sco3.2v[4-9]* | sco5v6*) ---- 1754,1760 ---- - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ -! | fiwix* | aero* ) - ;; - # This one is extra strict with allowed versions - sco3.2v2 | sco3.2v[4-9]* | sco5v6*) -diff -crB jq-1.7-orig/modules/oniguruma/config.sub jq-1.7/modules/oniguruma/config.sub -*** jq-1.7-orig/modules/oniguruma/config.sub 2023-11-04 14:43:08.921845585 +1100 ---- jq-1.7/modules/oniguruma/config.sub 2023-11-04 14:44:17.544620423 +1100 -*************** -*** 1722,1728 **** - | skyos* | haiku* | rdos* | toppers* | drops* | es* \ - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ -! | nsk* | powerunix* | genode* | zvmoe* ) - ;; - # This one is extra strict with allowed versions - sco3.2v2 | sco3.2v[4-9]* | sco5v6*) ---- 1722,1728 ---- - | skyos* | haiku* | rdos* | toppers* | drops* | es* \ - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ -! | nsk* | powerunix* | genode* | zvmoe* | aero* ) - ;; - # This one is extra strict with allowed versions - sco3.2v2 | sco3.2v[4-9]* | sco5v6*) diff --git a/patches/libdrm/libdrm.patch b/patches/libdrm/libdrm.patch deleted file mode 100644 index ff811a0bccd..00000000000 --- a/patches/libdrm/libdrm.patch +++ /dev/null @@ -1,147 +0,0 @@ -From c1dbfc87b74825c0f21b9031fc932d27908fcc71 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sat, 14 May 2022 14:42:38 +1000 -Subject: [PATCH] drm: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - .gitignore | 1 + - include/drm/drm.h | 4 ++-- - xf86drm.c | 20 ++++++++++---------- - xf86drm.h | 2 +- - 4 files changed, 14 insertions(+), 13 deletions(-) - -diff --git a/.gitignore b/.gitignore -index 0ec9e7f..e0c197e 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -1 +1,2 @@ - /build* -+.vscode -diff --git a/include/drm/drm.h b/include/drm/drm.h -index 398c396..3e35299 100644 ---- a/include/drm/drm.h -+++ b/include/drm/drm.h -@@ -35,10 +35,10 @@ - #ifndef _DRM_H_ - #define _DRM_H_ - --#if defined(__linux__) -+#if defined(__linux__) || defined(__aero__) - -+#include - #include --#include - typedef unsigned int drm_handle_t; - - #else /* One of the BSDs */ -diff --git a/xf86drm.c b/xf86drm.c -index 5933e4b..2b79641 100644 ---- a/xf86drm.c -+++ b/xf86drm.c -@@ -3346,7 +3346,7 @@ drm_public int drmCloseBufferHandle(int fd, uint32_t handle) - - static char *drmGetMinorNameForFD(int fd, int type) - { --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - DIR *sysdir; - struct dirent *ent; - struct stat sbuf; -@@ -3468,7 +3468,7 @@ drm_public char *drmGetRenderDeviceNameFromFd(int fd) - return drmGetMinorNameForFD(fd, DRM_NODE_RENDER); - } - --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - static char * DRM_PRINTFLIKE(2, 3) - sysfs_uevent_get(const char *path, const char *fmt, ...) - { -@@ -3515,7 +3515,7 @@ sysfs_uevent_get(const char *path, const char *fmt, ...) - /* Little white lie to avoid major rework of the existing code */ - #define DRM_BUS_VIRTIO 0x10 - --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - static int get_subsystem_type(const char *device_path) - { - char path[PATH_MAX + 1] = ""; -@@ -3581,7 +3581,7 @@ static int drmParseSubsystemType(int maj, int min) - #endif - } - --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - static void - get_pci_path(int maj, int min, char *pci_path) - { -@@ -3661,7 +3661,7 @@ static int get_sysctl_pci_bus_info(int maj, int min, drmPciBusInfoPtr info) - - static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info) - { --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - unsigned int domain, bus, dev, func; - char pci_path[PATH_MAX + 1], *value; - int num; -@@ -3770,7 +3770,7 @@ static int drmGetMaxNodeName(void) - 3 /* length of the node number */; - } - --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - static int parse_separate_sysfs_files(int maj, int min, - drmPciDeviceInfoPtr device, - bool ignore_revision) -@@ -3848,7 +3848,7 @@ static int drmParsePciDeviceInfo(int maj, int min, - drmPciDeviceInfoPtr device, - uint32_t flags) - { --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - if (!(flags & DRM_DEVICE_GET_PCI_REVISION)) - return parse_separate_sysfs_files(maj, min, device, true); - -@@ -4072,7 +4072,7 @@ free_device: - return ret; - } - --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - static int drm_usb_dev_path(int maj, int min, char *path, size_t len) - { - char *value, *tmp_path, *slash; -@@ -4160,7 +4160,7 @@ static int drmParseUsbBusInfo(int maj, int min, drmUsbBusInfoPtr info) - - static int drmParseUsbDeviceInfo(int maj, int min, drmUsbDeviceInfoPtr info) - { --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - char path[PATH_MAX + 1], *value; - unsigned int vendor, product; - int ret; -@@ -4760,7 +4760,7 @@ drm_public int drmGetDevices(drmDevicePtr devices[], int max_devices) - - drm_public char *drmGetDeviceNameFromFd2(int fd) - { --#ifdef __linux__ -+#if defined(__linux__) || defined(__aero__) - struct stat sbuf; - char path[PATH_MAX + 1], *value; - unsigned int maj, min; -diff --git a/xf86drm.h b/xf86drm.h -index 1631396..a2118f1 100644 ---- a/xf86drm.h -+++ b/xf86drm.h -@@ -47,7 +47,7 @@ extern "C" { - #define DRM_MAX_MINOR 16 - #endif - --#if defined(__linux__) -+#if defined(__linux__) || defined(__aero__) - - #define DRM_IOCTL_NR(n) _IOC_NR(n) - #define DRM_IOC_VOID _IOC_NONE --- -2.25.1 - diff --git a/patches/libgcrypt/jinx-working-patch.patch b/patches/libgcrypt/jinx-working-patch.patch new file mode 100644 index 00000000000..a86085ff566 --- /dev/null +++ b/patches/libgcrypt/jinx-working-patch.patch @@ -0,0 +1,23 @@ +diff --git a/random/rndunix.c b/random/rndunix.c +index fcb45b7..1e32242 100644 +--- a/random/rndunix.c ++++ b/random/rndunix.c +@@ -105,7 +105,7 @@ + #include + #include + #include +-#ifndef __QNX__ ++#if !defined __QNX__ && !defined (__aero__) + #include + #include + #endif /* __QNX__ */ +@@ -119,7 +119,9 @@ + #ifndef __QNX__ + #include + #include ++#ifndef __aero__ + #include ++#endif + #endif /* __QNX__ */ + #include + #include /* Verschiedene komische Typen */ diff --git a/patches/libiconv/0001-libiconv-aero-specific-changes.patch b/patches/libiconv/0001-libiconv-aero-specific-changes.patch deleted file mode 100644 index 6a7e24eaaf2..00000000000 --- a/patches/libiconv/0001-libiconv-aero-specific-changes.patch +++ /dev/null @@ -1,50 +0,0 @@ -From d29c791b1dfcd9459e7f9ee1101a035ee31daa75 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Wed, 29 Jun 2022 18:57:29 +1000 -Subject: [PATCH] libiconv: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - Makefile.devel | 8 ++++---- - libcharset/Makefile.devel | 6 +++--- - 2 files changed, 7 insertions(+), 7 deletions(-) - -diff --git a/Makefile.devel b/Makefile.devel -index 2a5e101..a179aaf 100644 ---- a/Makefile.devel -+++ b/Makefile.devel -@@ -4,10 +4,10 @@ - - SHELL = /bin/sh - MAKE = make --AUTOCONF = autoconf-2.69 --AUTOHEADER = autoheader-2.69 --AUTOMAKE = automake-1.16 --ACLOCAL = aclocal-1.16 -+AUTOCONF = autoconf -+AUTOHEADER = autoheader -+AUTOMAKE = automake -+ACLOCAL = aclocal - GPERF = gperf - CC = gcc -Wall - CFLAGS = -O -diff --git a/libcharset/Makefile.devel b/libcharset/Makefile.devel -index 04f4c7a..3e0e2ca 100644 ---- a/libcharset/Makefile.devel -+++ b/libcharset/Makefile.devel -@@ -3,9 +3,9 @@ - - SHELL = /bin/sh - MAKE = make --AUTOCONF = autoconf-2.69 --AUTOHEADER = autoheader-2.69 --ACLOCAL = aclocal-1.16 -+AUTOCONF = autoconf -+AUTOHEADER = autoheader -+ACLOCAL = aclocal - CP = cp - RM = rm -f - --- -2.25.1 - diff --git a/patches/libtasn/libtasn.patch b/patches/libtasn/libtasn.patch deleted file mode 100644 index 6650d9859cd..00000000000 --- a/patches/libtasn/libtasn.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 006807c2ec4429094c7bc0b1f54a7db462916df1 Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Wed, 14 Jul 2021 02:35:21 +0200 -Subject: [PATCH] Remove test directory as that can't be cross-compiled - -Signed-off-by: Dennis Bonke ---- - Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Makefile.am b/Makefile.am -index 86cca65..76b49b1 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -27,7 +27,7 @@ EXTRA_DIST = windows/asn1-parser/asn1-parser.vcproj \ - windows/test-tree/test-tree.vcproj windows/libtasn14win.mk - EXTRA_DIST += cfg.mk maint.mk CONTRIBUTING.md README.md - --SUBDIRS = lib src fuzz tests -+SUBDIRS = lib src fuzz - - if ENABLE_DOC - SUBDIRS += doc examples --- -2.32.0 diff --git a/patches/libtool/jinx-working-patch.patch b/patches/libtool/jinx-working-patch.patch new file mode 100644 index 00000000000..d2f5a84233a --- /dev/null +++ b/patches/libtool/jinx-working-patch.patch @@ -0,0 +1,138 @@ +diff --git libtool-clean/build-aux/ltmain.in libtool-workdir/build-aux/ltmain.in +index a5f21a1..c06d55c 100644 +--- libtool-clean/build-aux/ltmain.in ++++ libtool-workdir/build-aux/ltmain.in +@@ -6497,7 +6497,7 @@ func_mode_link () + fi + else + # We cannot seem to hardcode it, guess we'll fake it. +- add_dir=-L$libdir ++ add_dir=-L$lt_sysroot$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in +diff --git libtool-clean/libtoolize.in libtool-workdir/libtoolize.in +index 0c40fed..763619b 100644 +--- libtool-clean/libtoolize.in ++++ libtool-workdir/libtoolize.in +@@ -1891,7 +1891,7 @@ func_require_seen_libtool () + # Do not remove config.guess, config.sub or install-sh, we don't + # install them without --install, and the project may not be using + # Automake. Similarly, do not remove Gnulib files. +- all_pkgaux_files="compile depcomp missing ltmain.sh" ++ all_pkgaux_files="" + all_pkgmacro_files="libtool.m4 ltargz.m4 ltdl.m4 ltoptions.m4 ltsugar.m4 ltversion.in ltversion.m4 lt~obsolete.m4" + all_pkgltdl_files="COPYING.LIB Makefile Makefile.in Makefile.inc Makefile.am README acinclude.m4 aclocal.m4 argz_.h argz.c config.h.in config-h.in configure configure.ac configure.in libltdl/lt__alloc.h libltdl/lt__argz.h libltdl/lt__dirent.h libltdl/lt__glibc.h libltdl/lt__private.h libltdl/lt__strl.h libltdl/lt_dlloader.h libltdl/lt_error.h libltdl/lt_system.h libltdl/slist.h loaders/dld_link.c loaders/dlopen.c loaders/dyld.c loaders/load_add_on.c loaders/loadlibrary.c loaders/preopen.c loaders/shl_load.c lt__alloc.c lt__argz.c lt__dirent.c lt__strl.c lt_dlloader.c lt_error.c ltdl.c ltdl.h ltdl.mk slist.c" + +diff --git libtool-clean/m4/libtool.m4 libtool-workdir/m4/libtool.m4 +index 79a2451..b6e8ca4 100644 +--- libtool-clean/m4/libtool.m4 ++++ libtool-workdir/m4/libtool.m4 +@@ -1696,7 +1696,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + +- gnu*) ++ gnu* | aero*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever +@@ -2925,6 +2925,18 @@ netbsd*) + hardcode_into_libs=yes + ;; + ++aero*) ++ version_type=linux # correct to gnu/linux during the next big refactor ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ++ soname_spec='$libname$release$shared_ext$major' ++ dynamic_linker='mlibc ld.so' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ + newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' +@@ -3566,6 +3578,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++aero*) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' +@@ -4446,6 +4462,8 @@ m4_if([$1], [CXX], [ + ;; + netbsd*) + ;; ++ aero*) ++ ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. +@@ -4794,6 +4812,12 @@ m4_if([$1], [CXX], [ + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ++ aero*) ++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ++ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ++ ;; ++ + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. +@@ -5273,6 +5297,11 @@ _LT_EOF + fi + ;; + ++ aero*) ++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' ++ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' +@@ -5815,6 +5844,9 @@ _LT_EOF + esac + ;; + ++ aero*) ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out +@@ -7115,6 +7147,10 @@ if test yes != "$_lt_caught_CXX_error"; then + esac + ;; + ++ aero*) ++ _LT_TAGVAR(ld_shlibs, $1)=yes ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' +diff --git libtool-clean/m4/ltdl.m4 libtool-workdir/m4/ltdl.m4 +index 772c150..642966e 100644 +--- libtool-clean/m4/ltdl.m4 ++++ libtool-workdir/m4/ltdl.m4 +@@ -497,6 +497,9 @@ AC_CACHE_CHECK([whether deplibs are loaded by dlopen], + # at 6.2 and later dlopen does load deplibs. + lt_cv_sys_dlopen_deplibs=yes + ;; ++ aero*) ++ lt_cv_sys_dlopen_deplibs=yes ++ ;; + netbsd*) + lt_cv_sys_dlopen_deplibs=yes + ;; diff --git a/patches/libtool/libtool.patch b/patches/libtool/libtool.patch deleted file mode 100644 index ae10581cfd1..00000000000 --- a/patches/libtool/libtool.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 634f15ee7db8317cb39e1f13dbd1e4cd16f922e6 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Wed, 25 May 2022 16:43:44 +1000 -Subject: [PATCH] libtool: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - build-aux/ltmain.in | 2 +- - m4/libtool.m4 | 15 +++++++++++++++ - 2 files changed, 16 insertions(+), 1 deletion(-) - -diff --git a/build-aux/ltmain.in b/build-aux/ltmain.in -index d5cf07a..ce97a5f 100644 ---- a/build-aux/ltmain.in -+++ b/build-aux/ltmain.in -@@ -6449,7 +6449,7 @@ func_mode_link () - fi - else - # We cannot seem to hardcode it, guess we'll fake it. -- add_dir=-L$libdir -+ add_dir=-L$lt_sysroot$libdir - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in -diff --git a/m4/libtool.m4 b/m4/libtool.m4 -index a3bc337..9136171 100644 ---- a/m4/libtool.m4 -+++ b/m4/libtool.m4 -@@ -2905,6 +2905,17 @@ netbsd*) - hardcode_into_libs=yes - ;; - -+aero*) -+ version_type=linux # correct to gnu/linux during the next big refactor -+ need_lib_prefix=no -+ need_version=no -+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' -+ soname_spec='$libname$release$shared_ext$major' -+ shlibpath_var=LD_LIBRARY_PATH -+ shlibpath_overrides_runpath=no -+ hardcode_into_libs=yes -+ ;; -+ - newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' -@@ -3554,6 +3565,10 @@ netbsd*) - fi - ;; - -+aero*) -+ lt_cv_deplibs_check_method=pass_all -+ ;; -+ - newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file --- -2.25.1 - diff --git a/patches/libxfont2/0001-libxfont2-aero-specific-changes.patch b/patches/libxfont2/0001-libxfont2-aero-specific-changes.patch deleted file mode 100644 index e4453bba46f..00000000000 --- a/patches/libxfont2/0001-libxfont2-aero-specific-changes.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0da59aec1e86152858f47e12da033883e4b16852 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Thu, 30 Jun 2022 10:46:56 +1000 -Subject: [PATCH] libxfont2: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - .gitignore | 2 ++ - src/fc/fslibos.h | 2 +- - 2 files changed, 3 insertions(+), 1 deletion(-) - -diff --git a/.gitignore b/.gitignore -index 2efa153..4370b7e 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -79,3 +79,5 @@ core - *.sig - *.announce - TAGS -+# editor configs: -+.vscode -diff --git a/src/fc/fslibos.h b/src/fc/fslibos.h -index 1ef362d..a9935d1 100644 ---- a/src/fc/fslibos.h -+++ b/src/fc/fslibos.h -@@ -60,7 +60,7 @@ from The Open Group. - # endif - # endif - # ifndef OPEN_MAX --# if defined(SVR4) -+# if defined(SVR4) || defined(__aero__) - # define OPEN_MAX 256 - # else - # include --- -2.25.1 - diff --git a/patches/llvm/0001-feat-targets-add-aero.patch b/patches/llvm/jinx-working-patch.patch similarity index 71% rename from patches/llvm/0001-feat-targets-add-aero.patch rename to patches/llvm/jinx-working-patch.patch index d765ad6c9e7..24d4135b66b 100644 --- a/patches/llvm/0001-feat-targets-add-aero.patch +++ b/patches/llvm/jinx-working-patch.patch @@ -1,69 +1,9 @@ -From bc36fc2f014463a6baa37512c708bca46dbd55c5 Mon Sep 17 00:00:00 2001 -From: Anhad Singh -Date: Thu, 19 Oct 2023 21:54:42 +1100 -Subject: [PATCH] feat(targets): add aero - -Signed-off-by: Anhad Singh ---- - clang/lib/Basic/Targets.cpp | 10 + - clang/lib/Basic/Targets/OSTargets.h | 31 ++ - clang/lib/Driver/CMakeLists.txt | 1 + - clang/lib/Driver/Driver.cpp | 4 + - clang/lib/Driver/ToolChains/Aero.cpp | 432 ++++++++++++++++++++++ - clang/lib/Driver/ToolChains/Aero.h | 49 +++ - clang/lib/Driver/ToolChains/Gnu.cpp | 13 +- - llvm/cmake/modules/CrossCompile.cmake | 4 +- - llvm/include/llvm/Support/SwapByteOrder.h | 2 +- - llvm/include/llvm/TargetParser/Triple.h | 5 +- - llvm/lib/Support/Unix/Path.inc | 6 +- - llvm/lib/Support/Unix/Program.inc | 1 + - llvm/lib/TargetParser/Triple.cpp | 6 + - llvm/tools/llvm-shlib/CMakeLists.txt | 1 + - 14 files changed, 555 insertions(+), 10 deletions(-) - create mode 100644 clang/lib/Driver/ToolChains/Aero.cpp - create mode 100644 clang/lib/Driver/ToolChains/Aero.h - -diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp -index 636b59fd1..9e1e08ec5 100644 ---- a/clang/lib/Basic/Targets.cpp -+++ b/clang/lib/Basic/Targets.cpp -@@ -151,6 +151,10 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, - case llvm::Triple::Fuchsia: - return std::make_unique>(Triple, - Opts); -+ case llvm::Triple::Aero: -+ return std::make_unique>(Triple, -+ Opts); -+ - case llvm::Triple::Linux: - switch (Triple.getEnvironment()) { - default: -@@ -455,6 +459,9 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, - case llvm::Triple::Fuchsia: - return std::make_unique>(Triple, - Opts); -+ case llvm::Triple::Aero: -+ return std::make_unique>(Triple, -+ Opts); - case llvm::Triple::Linux: - switch (Triple.getEnvironment()) { - default: -@@ -636,6 +643,9 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, - case llvm::Triple::Fuchsia: - return std::make_unique>(Triple, - Opts); -+ case llvm::Triple::Aero: -+ return std::make_unique>(Triple, -+ Opts); - case llvm::Triple::KFreeBSD: - return std::make_unique>(Triple, - Opts); -diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h -index 8f4331b02..bacb1e071 100644 ---- a/clang/lib/Basic/Targets/OSTargets.h -+++ b/clang/lib/Basic/Targets/OSTargets.h -@@ -278,6 +278,37 @@ public: - using OSTargetInfo::OSTargetInfo; +diff --git llvm-clean/clang/lib/Basic/Targets/OSTargets.h llvm-workdir/clang/lib/Basic/Targets/OSTargets.h +index cf8cc8e..19984dc 100644 +--- llvm-clean/clang/lib/Basic/Targets/OSTargets.h ++++ llvm-workdir/clang/lib/Basic/Targets/OSTargets.h +@@ -922,6 +922,34 @@ public: + } }; +// Aero Target @@ -78,8 +18,6 @@ index 8f4331b02..bacb1e071 100644 + Builder.defineMacro("_REENTRANT"); + if (Opts.CPlusPlus) + Builder.defineMacro("_GNU_SOURCE"); -+ // if (this->HasFloat128) -+ // Builder.defineMacro("__FLOAT128__"); + } + +public: @@ -96,34 +34,46 @@ index 8f4331b02..bacb1e071 100644 + } +}; + -+ - // Haiku Target + // WebAssembly target template - class LLVM_LIBRARY_VISIBILITY HaikuTargetInfo : public OSTargetInfo { -diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt -index a6bd2d41e..132da8bbe 100644 ---- a/clang/lib/Driver/CMakeLists.txt -+++ b/clang/lib/Driver/CMakeLists.txt -@@ -59,6 +59,7 @@ add_clang_library(clangDriver - ToolChains/Flang.cpp - ToolChains/FreeBSD.cpp - ToolChains/Fuchsia.cpp + class LLVM_LIBRARY_VISIBILITY WebAssemblyOSTargetInfo +diff --git llvm-clean/clang/lib/Basic/Targets.cpp llvm-workdir/clang/lib/Basic/Targets.cpp +index 636b59f..98ef355 100644 +--- llvm-clean/clang/lib/Basic/Targets.cpp ++++ llvm-workdir/clang/lib/Basic/Targets.cpp +@@ -590,6 +590,8 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, + } + case llvm::Triple::Haiku: + return std::make_unique(Triple, Opts); ++ case llvm::Triple::Aero: ++ return std::make_unique>(Triple, Opts); + case llvm::Triple::RTEMS: + return std::make_unique(Triple, Opts); + case llvm::Triple::NaCl: +diff --git llvm-clean/clang/lib/Driver/CMakeLists.txt llvm-workdir/clang/lib/Driver/CMakeLists.txt +index a6bd2d4..81893cf 100644 +--- llvm-clean/clang/lib/Driver/CMakeLists.txt ++++ llvm-workdir/clang/lib/Driver/CMakeLists.txt +@@ -76,6 +76,7 @@ add_clang_library(clangDriver + ToolChains/Myriad.cpp + ToolChains/NaCl.cpp + ToolChains/NetBSD.cpp + ToolChains/Aero.cpp - ToolChains/Gnu.cpp - ToolChains/Haiku.cpp - ToolChains/HIPUtility.cpp -diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp -index bdbdad936..bc194b1f5 100644 ---- a/clang/lib/Driver/Driver.cpp -+++ b/clang/lib/Driver/Driver.cpp -@@ -24,6 +24,7 @@ + ToolChains/OHOS.cpp + ToolChains/OpenBSD.cpp + ToolChains/PS4CPU.cpp +diff --git llvm-clean/clang/lib/Driver/Driver.cpp llvm-workdir/clang/lib/Driver/Driver.cpp +index bdbdad9..1dd717e 100644 +--- llvm-clean/clang/lib/Driver/Driver.cpp ++++ llvm-workdir/clang/lib/Driver/Driver.cpp +@@ -20,6 +20,7 @@ + #include "ToolChains/Contiki.h" + #include "ToolChains/CrossWindows.h" + #include "ToolChains/Cuda.h" ++#include "ToolChains/Aero.h" + #include "ToolChains/Darwin.h" #include "ToolChains/DragonFly.h" #include "ToolChains/FreeBSD.h" - #include "ToolChains/Fuchsia.h" -+#include "ToolChains/Aero.h" - #include "ToolChains/Gnu.h" - #include "ToolChains/HIPAMD.h" - #include "ToolChains/HIPSPV.h" @@ -6225,6 +6226,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, case llvm::Triple::Fuchsia: TC = std::make_unique(*this, Target, Args); @@ -134,11 +84,11 @@ index bdbdad936..bc194b1f5 100644 case llvm::Triple::Solaris: TC = std::make_unique(*this, Target, Args); break; -diff --git a/clang/lib/Driver/ToolChains/Aero.cpp b/clang/lib/Driver/ToolChains/Aero.cpp +diff --git llvm-workdir/clang/lib/Driver/ToolChains/Aero.cpp llvm-workdir/clang/lib/Driver/ToolChains/Aero.cpp new file mode 100644 -index 000000000..580d85cde +index 0000000..580d85c --- /dev/null -+++ b/clang/lib/Driver/ToolChains/Aero.cpp ++++ llvm-workdir/clang/lib/Driver/ToolChains/Aero.cpp @@ -0,0 +1,432 @@ +//===--- Aero.h - Aero ToolChain Implementations --------*- C++ -*-===// +// @@ -572,11 +522,11 @@ index 000000000..580d85cde + Res |= SanitizerKind::MemTag; + return Res; +} -diff --git a/clang/lib/Driver/ToolChains/Aero.h b/clang/lib/Driver/ToolChains/Aero.h +diff --git llvm-workdir/clang/lib/Driver/ToolChains/Aero.h llvm-workdir/clang/lib/Driver/ToolChains/Aero.h new file mode 100644 -index 000000000..a7b0b4da2 +index 0000000..a7b0b4d --- /dev/null -+++ b/clang/lib/Driver/ToolChains/Aero.h ++++ llvm-workdir/clang/lib/Driver/ToolChains/Aero.h @@ -0,0 +1,49 @@ +//===--- Aero.h - Aero ToolChain Implementations --------*- C++ -*-===// +// @@ -627,55 +577,23 @@ index 000000000..a7b0b4da2 +} // end namespace clang + +#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AERO_H -diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp -index 40038dce4..f9e92ba87 100644 ---- a/clang/lib/Driver/ToolChains/Gnu.cpp -+++ b/clang/lib/Driver/ToolChains/Gnu.cpp -@@ -227,6 +227,8 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) { - return "elf_iamcu"; - return "elf_i386"; - case llvm::Triple::aarch64: -+ if (T.getOS() == llvm::Triple::Aero) -+ return "aarch64aero"; - return "aarch64linux"; - case llvm::Triple::aarch64_be: - return "aarch64linuxb"; -@@ -2298,7 +2300,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( - static const char *const AArch64LibDirs[] = {"/lib64", "/lib"}; - static const char *const AArch64Triples[] = { - "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", -- "aarch64-suse-linux"}; -+ "aarch64-suse-linux", "aarch64-aero", "aarch64-aero-system", -+ "aarch64-aero-kernel"}; - static const char *const AArch64beLibDirs[] = {"/lib"}; - static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu", - "aarch64_be-linux-gnu"}; -@@ -2328,7 +2331,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( +diff --git llvm-clean/clang/lib/Driver/ToolChains/Gnu.cpp llvm-workdir/clang/lib/Driver/ToolChains/Gnu.cpp +index 40038dc..86a5c53 100644 +--- llvm-clean/clang/lib/Driver/ToolChains/Gnu.cpp ++++ llvm-workdir/clang/lib/Driver/ToolChains/Gnu.cpp +@@ -2328,7 +2328,7 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( "x86_64-redhat-linux", "x86_64-suse-linux", "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux", "x86_64-unknown-linux", - "x86_64-amazon-linux"}; -+ "x86_64-amazon-linux", "x86_64-aero", -+ "x86_64-aero-system", "x86_64-aero-kernel"}; ++ "x86_64-amazon-linux", "x86_64-aero"}; static const char *const X32Triples[] = {"x86_64-linux-gnux32", "x86_64-pc-linux-gnux32"}; static const char *const X32LibDirs[] = {"/libx32", "/lib"}; -@@ -2404,7 +2408,10 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( - static const char *const RISCV64LibDirs[] = {"/lib64", "/lib"}; - static const char *const RISCV64Triples[] = {"riscv64-unknown-linux-gnu", - "riscv64-linux-gnu", -- "riscv64-unknown-elf"}; -+ "riscv64-unknown-elf", -+ "riscv64-aero", -+ "riscv64-aero-kernel", -+ "riscv64-aero-system"}; - - static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"}; - static const char *const SPARCv8Triples[] = {"sparc-linux-gnu", -diff --git a/llvm/cmake/modules/CrossCompile.cmake b/llvm/cmake/modules/CrossCompile.cmake -index 6af47b51d..78983fa16 100644 ---- a/llvm/cmake/modules/CrossCompile.cmake -+++ b/llvm/cmake/modules/CrossCompile.cmake +diff --git llvm-clean/llvm/cmake/modules/CrossCompile.cmake llvm-workdir/llvm/cmake/modules/CrossCompile.cmake +index 6af47b5..78983fa 100644 +--- llvm-clean/llvm/cmake/modules/CrossCompile.cmake ++++ llvm-workdir/llvm/cmake/modules/CrossCompile.cmake @@ -17,8 +17,8 @@ function(llvm_create_cross_target project_name target_name toolchain buildtype) -DCMAKE_TOOLCHAIN_FILE=\"${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake\") elseif (NOT CMAKE_CROSSCOMPILING) @@ -687,10 +605,10 @@ index 6af47b51d..78983fa16 100644 ) endif() set(CROSS_TOOLCHAIN_FLAGS_${target_name} ${CROSS_TOOLCHAIN_FLAGS_INIT} -diff --git a/llvm/include/llvm/Support/SwapByteOrder.h b/llvm/include/llvm/Support/SwapByteOrder.h -index 1bbc2e2f9..4b41da767 100644 ---- a/llvm/include/llvm/Support/SwapByteOrder.h -+++ b/llvm/include/llvm/Support/SwapByteOrder.h +diff --git llvm-clean/llvm/include/llvm/Support/SwapByteOrder.h llvm-workdir/llvm/include/llvm/Support/SwapByteOrder.h +index 1bbc2e2..4b41da7 100644 +--- llvm-clean/llvm/include/llvm/Support/SwapByteOrder.h ++++ llvm-workdir/llvm/include/llvm/Support/SwapByteOrder.h @@ -20,7 +20,7 @@ #include @@ -700,43 +618,33 @@ index 1bbc2e2f9..4b41da767 100644 #include #elif defined(_AIX) #include -diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h -index 79ccd644a..82520d0e0 100644 ---- a/llvm/include/llvm/TargetParser/Triple.h -+++ b/llvm/include/llvm/TargetParser/Triple.h -@@ -194,6 +194,7 @@ public: - IOS, - KFreeBSD, - Linux, -+ Aero, +diff --git llvm-clean/llvm/include/llvm/TargetParser/Triple.h llvm-workdir/llvm/include/llvm/TargetParser/Triple.h +index 79ccd64..ae3bfb0 100644 +--- llvm-clean/llvm/include/llvm/TargetParser/Triple.h ++++ llvm-workdir/llvm/include/llvm/TargetParser/Triple.h +@@ -197,6 +197,7 @@ public: Lv2, // PS3 MacOSX, NetBSD, -@@ -276,7 +277,9 @@ public: - Mesh, - Amplification, - OpenHOS, -- LastEnvironmentType = OpenHOS -+ Kernel, -+ System, -+ LastEnvironmentType = System - }; - enum ObjectFormatType { - UnknownObjectFormat, -diff --git a/llvm/lib/Support/Unix/Path.inc b/llvm/lib/Support/Unix/Path.inc -index e2aece49c..cc19a25a4 100644 ---- a/llvm/lib/Support/Unix/Path.inc -+++ b/llvm/lib/Support/Unix/Path.inc -@@ -74,7 +74,7 @@ extern char **environ; ++ Aero, + OpenBSD, + Solaris, + UEFI, +diff --git llvm-clean/llvm/lib/Support/Unix/Path.inc llvm-workdir/llvm/lib/Support/Unix/Path.inc +index e2aece4..72a6259 100644 +--- llvm-clean/llvm/lib/Support/Unix/Path.inc ++++ llvm-workdir/llvm/lib/Support/Unix/Path.inc +@@ -74,7 +74,8 @@ extern char **environ; #include #if !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(__FreeBSD__) && \ - !defined(__linux__) && !defined(__FreeBSD_kernel__) && !defined(_AIX) -+ !defined(__linux__) && !defined(__FreeBSD_kernel__) && !defined(_AIX) && !defined(__aero__) ++ !defined(__linux__) && !defined(__FreeBSD_kernel__) && !defined(_AIX) && \ ++ !defined(__aero__) #include #define STATVFS statvfs #define FSTATVFS fstatvfs -@@ -83,7 +83,7 @@ extern char **environ; +@@ -83,7 +84,7 @@ extern char **environ; #if defined(__OpenBSD__) || defined(__FreeBSD__) #include #include @@ -745,7 +653,7 @@ index e2aece49c..cc19a25a4 100644 #if defined(HAVE_LINUX_MAGIC_H) #include #else -@@ -472,7 +472,7 @@ std::error_code remove(const Twine &path, bool IgnoreNonExisting) { +@@ -472,7 +473,7 @@ std::error_code remove(const Twine &path, bool IgnoreNonExisting) { } static bool is_local_impl(struct STATVFS &Vfs) { @@ -754,10 +662,10 @@ index e2aece49c..cc19a25a4 100644 #ifndef NFS_SUPER_MAGIC #define NFS_SUPER_MAGIC 0x6969 #endif -diff --git a/llvm/lib/Support/Unix/Program.inc b/llvm/lib/Support/Unix/Program.inc -index 897e22711..02f74d7eb 100644 ---- a/llvm/lib/Support/Unix/Program.inc -+++ b/llvm/lib/Support/Unix/Program.inc +diff --git llvm-clean/llvm/lib/Support/Unix/Program.inc llvm-workdir/llvm/lib/Support/Unix/Program.inc +index 897e227..02f74d7 100644 +--- llvm-clean/llvm/lib/Support/Unix/Program.inc ++++ llvm-workdir/llvm/lib/Support/Unix/Program.inc @@ -41,6 +41,7 @@ #if HAVE_UNISTD_H #include @@ -766,28 +674,19 @@ index 897e22711..02f74d7eb 100644 #ifdef HAVE_POSIX_SPAWN #include -diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp -index a3d6a06af..3825a2a06 100644 ---- a/llvm/lib/TargetParser/Triple.cpp -+++ b/llvm/lib/TargetParser/Triple.cpp -@@ -205,6 +205,7 @@ StringRef Triple::getOSTypeName(OSType Kind) { - switch (Kind) { - case UnknownOS: return "unknown"; - +diff --git llvm-clean/llvm/lib/TargetParser/Triple.cpp llvm-workdir/llvm/lib/TargetParser/Triple.cpp +index a3d6a06..f431d74 100644 +--- llvm-clean/llvm/lib/TargetParser/Triple.cpp ++++ llvm-workdir/llvm/lib/TargetParser/Triple.cpp +@@ -219,6 +219,7 @@ StringRef Triple::getOSTypeName(OSType Kind) { + case Emscripten: return "emscripten"; + case FreeBSD: return "freebsd"; + case Fuchsia: return "fuchsia"; + case Aero: return "aero"; - case AIX: return "aix"; - case AMDHSA: return "amdhsa"; - case AMDPAL: return "amdpal"; -@@ -270,6 +271,8 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { - case GNUX32: return "gnux32"; - case GNUILP32: return "gnu_ilp32"; - case Itanium: return "itanium"; -+ case Kernel: return "kernel"; -+ case System: return "system"; - case MSVC: return "msvc"; - case MacABI: return "macabi"; - case Musl: return "musl"; -@@ -575,6 +578,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) { + case Haiku: return "haiku"; + case HermitCore: return "hermit"; + case Hurd: return "hurd"; +@@ -575,6 +576,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) { static Triple::OSType parseOS(StringRef OSName) { return StringSwitch(OSName) @@ -795,27 +694,15 @@ index a3d6a06af..3825a2a06 100644 .StartsWith("ananas", Triple::Ananas) .StartsWith("cloudabi", Triple::CloudABI) .StartsWith("darwin", Triple::Darwin) -@@ -641,6 +645,8 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { - .StartsWith("musl", Triple::Musl) - .StartsWith("msvc", Triple::MSVC) - .StartsWith("itanium", Triple::Itanium) -+ .StartsWith("kernel", Triple::Kernel) -+ .StartsWith("system", Triple::System) - .StartsWith("cygnus", Triple::Cygnus) - .StartsWith("coreclr", Triple::CoreCLR) - .StartsWith("simulator", Triple::Simulator) -diff --git a/llvm/tools/llvm-shlib/CMakeLists.txt b/llvm/tools/llvm-shlib/CMakeLists.txt -index 4f6a2cbfb..559a35ab9 100644 ---- a/llvm/tools/llvm-shlib/CMakeLists.txt -+++ b/llvm/tools/llvm-shlib/CMakeLists.txt -@@ -38,6 +38,7 @@ if(LLVM_BUILD_LLVM_DYLIB) - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "GNU") +diff --git llvm-clean/llvm/tools/llvm-shlib/CMakeLists.txt llvm-workdir/llvm/tools/llvm-shlib/CMakeLists.txt +index 8ace190..b79c68d 100644 +--- llvm-clean/llvm/tools/llvm-shlib/CMakeLists.txt ++++ llvm-workdir/llvm/tools/llvm-shlib/CMakeLists.txt +@@ -41,6 +41,7 @@ if(LLVM_BUILD_LLVM_DYLIB) OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD") - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia") -+ OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "aero") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "DragonFly") + OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia") ++ OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Aero") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")) # FIXME: It should be "GNU ld for elf" --- -2.42.0 - + configure_file( diff --git a/patches/mesa/jinx-working-patch.patch b/patches/mesa/jinx-working-patch.patch new file mode 100644 index 00000000000..3fdc866bcfa --- /dev/null +++ b/patches/mesa/jinx-working-patch.patch @@ -0,0 +1,157 @@ +diff --git mesa-clean/include/drm-uapi/drm.h mesa-workdir/include/drm-uapi/drm.h +index 0254024..c2ffd35 100644 +--- mesa-clean/include/drm-uapi/drm.h ++++ mesa-workdir/include/drm-uapi/drm.h +@@ -44,7 +44,7 @@ typedef unsigned int drm_handle_t; + #else /* One of the BSDs */ + + #include +-#include ++// #include + #include + typedef int8_t __s8; + typedef uint8_t __u8; +diff --git mesa-clean/src/compiler/spirv/spirv_to_nir.c mesa-workdir/src/compiler/spirv/spirv_to_nir.c +index 5f36118..a501802 100644 +--- mesa-clean/src/compiler/spirv/spirv_to_nir.c ++++ mesa-workdir/src/compiler/spirv/spirv_to_nir.c +@@ -39,6 +39,7 @@ + #include "util/u_debug.h" + + #include ++#include + + #ifndef NDEBUG + uint32_t mesa_spirv_debug = 0; +diff --git mesa-clean/src/egl/main/egllog.c mesa-workdir/src/egl/main/egllog.c +index 678bb75..016a70d 100644 +--- mesa-clean/src/egl/main/egllog.c ++++ mesa-workdir/src/egl/main/egllog.c +@@ -37,6 +37,7 @@ + #include + #include + #include ++#include + #include "c11/threads.h" + #include "util/macros.h" + #include "util/simple_mtx.h" +diff --git mesa-clean/src/gallium/drivers/llvmpipe/lp_texture.c mesa-workdir/src/gallium/drivers/llvmpipe/lp_texture.c +index 5c5a6cd..ae6c23d 100644 +--- mesa-clean/src/gallium/drivers/llvmpipe/lp_texture.c ++++ mesa-workdir/src/gallium/drivers/llvmpipe/lp_texture.c +@@ -1152,7 +1152,7 @@ llvmpipe_resource_get_param(struct pipe_screen *screen, + default: + break; + } +- assert(0); ++ // assert(0); + *value = 0; + return false; + } +diff --git mesa-clean/src/util/detect_os.h mesa-workdir/src/util/detect_os.h +index 6506948..93ce551 100644 +--- mesa-clean/src/util/detect_os.h ++++ mesa-workdir/src/util/detect_os.h +@@ -28,6 +28,11 @@ + #define DETECT_OS_ANDROID 1 + #endif + ++#if defined(__aero__) ++#define DETECT_OS_AERO 1 ++#define DETECT_OS_UNIX 1 ++#endif ++ + #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + #define DETECT_OS_FREEBSD 1 + #define DETECT_OS_BSD 1 +@@ -128,4 +133,8 @@ + #define DETECT_OS_WINDOWS 0 + #endif + ++#ifndef DETECT_OS_AERO ++#define DETECT_OS_AERO 0 ++#endif ++ + #endif /* DETECT_OS_H */ +diff --git mesa-clean/src/util/futex.h mesa-workdir/src/util/futex.h +index c397507..995c1e2 100644 +--- mesa-clean/src/util/futex.h ++++ mesa-workdir/src/util/futex.h +@@ -24,7 +24,7 @@ + #ifndef UTIL_FUTEX_H + #define UTIL_FUTEX_H + +-#if defined(HAVE_LINUX_FUTEX_H) ++#if defined(HAVE_LINUX_FUTEX_H) && defined(__linux__) + #define UTIL_FUTEX_SUPPORTED 1 + #elif defined(__FreeBSD__) + #define UTIL_FUTEX_SUPPORTED 1 +diff --git mesa-clean/src/util/os_misc.c mesa-workdir/src/util/os_misc.c +index c378a9e..64f6cff 100644 +--- mesa-clean/src/util/os_misc.c ++++ mesa-workdir/src/util/os_misc.c +@@ -57,7 +57,7 @@ + # include + # include + # include +-#elif DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD ++#elif DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD || DETECT_OS_AERO + # include + #elif DETECT_OS_OPENBSD || DETECT_OS_FREEBSD + # include +@@ -248,7 +248,7 @@ exit_mutex: + bool + os_get_total_physical_memory(uint64_t *size) + { +-#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD ++#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD || DETECT_OS_AERO + const long phys_pages = sysconf(_SC_PHYS_PAGES); + const long page_size = sysconf(_SC_PAGE_SIZE); + +diff --git mesa-clean/src/util/os_time.c mesa-workdir/src/util/os_time.c +index 7fb3134..38b6ade 100644 +--- mesa-clean/src/util/os_time.c ++++ mesa-workdir/src/util/os_time.c +@@ -65,7 +65,7 @@ os_time_get_nano(void) + void + os_time_sleep(int64_t usecs) + { +-#if DETECT_OS_LINUX ++#if DETECT_OS_LINUX || DETECT_OS_AERO + struct timespec time; + time.tv_sec = usecs / 1000000; + time.tv_nsec = (usecs % 1000000) * 1000; +diff --git mesa-clean/src/util/u_debug.c mesa-workdir/src/util/u_debug.c +index 61f628e..e390606 100644 +--- mesa-clean/src/util/u_debug.c ++++ mesa-workdir/src/util/u_debug.c +@@ -32,6 +32,7 @@ + #include "util/u_math.h" + #include + ++#include + #include + #include /* CHAR_BIT */ + #include /* isalnum */ +diff --git mesa-clean/src/util/u_thread.c mesa-workdir/src/util/u_thread.c +index 55b6b68..277ffbd 100644 +--- mesa-clean/src/util/u_thread.c ++++ mesa-workdir/src/util/u_thread.c +@@ -75,7 +75,7 @@ int u_thread_create(thrd_t *thrd, int (*routine)(void *), void *param) + void u_thread_setname( const char *name ) + { + #if defined(HAVE_PTHREAD) +-#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || defined(__GLIBC__) ++#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || defined(__GLIBC__) || DETECT_OS_AERO + int ret = pthread_setname_np(pthread_self(), name); + if (ret == ERANGE) { + char buf[16]; +@@ -154,7 +154,7 @@ util_set_thread_affinity(thrd_t thread, + int64_t + util_thread_get_time_nano(thrd_t thread) + { +-#if defined(HAVE_PTHREAD) && !defined(__APPLE__) && !defined(__HAIKU__) ++#if defined(HAVE_PTHREAD) && !defined(__APPLE__) && !defined(__HAIKU__) && !defined(__aero__) + struct timespec ts; + clockid_t cid; + diff --git a/patches/mesa/mesa.patch b/patches/mesa/mesa.patch deleted file mode 100644 index 05dab1ee953..00000000000 --- a/patches/mesa/mesa.patch +++ /dev/null @@ -1,219 +0,0 @@ -From 17fb4ad377b2cd0d43a62af25b8c8375909da019 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sat, 18 Feb 2023 14:31:17 +1100 -Subject: [PATCH] - ---- - include/drm-uapi/drm.h | 5 +++-- - meson.build | 2 +- - src/compiler/spirv/spirv_to_nir.c | 1 + - src/egl/main/egllog.c | 1 + - src/gallium/drivers/llvmpipe/lp_texture.c | 1 - - src/util/debug.c | 1 + - src/util/detect_os.h | 8 ++++++++ - src/util/futex.h | 2 +- - src/util/os_misc.c | 4 ++-- - src/util/os_time.c | 4 ++-- - src/util/u_printf.h | 2 ++ - src/util/u_thread.h | 4 ++-- - 12 files changed, 24 insertions(+), 11 deletions(-) - -diff --git a/include/drm-uapi/drm.h b/include/drm-uapi/drm.h -index 5e54c3a..be0e26d 100644 ---- a/include/drm-uapi/drm.h -+++ b/include/drm-uapi/drm.h -@@ -35,10 +35,11 @@ - #ifndef _DRM_H_ - #define _DRM_H_ - --#if defined(__linux__) -+#if defined(__linux__) || defined(__aero__) - -+#include - #include --#include -+//#include - typedef unsigned int drm_handle_t; - - #else /* One of the BSDs */ -diff --git a/meson.build b/meson.build -index 0aea312..6624be3 100644 ---- a/meson.build -+++ b/meson.build -@@ -164,7 +164,7 @@ with_any_opengl = with_opengl or with_gles1 or with_gles2 - # Only build shared_glapi if at least one OpenGL API is enabled - with_shared_glapi = with_shared_glapi and with_any_opengl - --system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'gnu/kfreebsd', 'dragonfly', 'linux', 'sunos'].contains(host_machine.system()) -+system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'gnu/kfreebsd', 'dragonfly', 'linux', 'aero', 'sunos'].contains(host_machine.system()) - - dri_drivers = get_option('dri-drivers') - if dri_drivers.contains('auto') -diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c -index 71cdc83..3d26705 100644 ---- a/src/compiler/spirv/spirv_to_nir.c -+++ b/src/compiler/spirv/spirv_to_nir.c -@@ -37,6 +37,7 @@ - #include "util/u_string.h" - - #include -+#include - - #ifndef NDEBUG - static enum nir_spirv_debug_level -diff --git a/src/egl/main/egllog.c b/src/egl/main/egllog.c -index 984dd5b..6a91952 100644 ---- a/src/egl/main/egllog.c -+++ b/src/egl/main/egllog.c -@@ -39,6 +39,7 @@ - #include - #include - #include -+#include - #include "c11/threads.h" - #include "util/macros.h" - #include "util/u_string.h" -diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c -index 5bfc8db..d2b31e1 100644 ---- a/src/gallium/drivers/llvmpipe/lp_texture.c -+++ b/src/gallium/drivers/llvmpipe/lp_texture.c -@@ -1102,7 +1102,6 @@ llvmpipe_resource_get_param(struct pipe_screen *screen, - default: - break; - } -- assert(0); - *value = 0; - return false; - } -diff --git a/src/util/debug.c b/src/util/debug.c -index 89ae613..fbf45f4 100644 ---- a/src/util/debug.c -+++ b/src/util/debug.c -@@ -23,6 +23,7 @@ - - #include - #include -+#include - #include "debug.h" - #include "u_string.h" - -diff --git a/src/util/detect_os.h b/src/util/detect_os.h -index 6506948..f5d49de 100644 ---- a/src/util/detect_os.h -+++ b/src/util/detect_os.h -@@ -81,6 +81,11 @@ - #define DETECT_OS_UNIX 1 - #endif - -+#if defined(__aero__) -+#define DETECT_OS_aero 1 -+#define DETECT_OS_UNIX 1 -+#endif -+ - - /* - * Make sure DETECT_OS_* are always defined, so that they can be used with #if -@@ -127,5 +132,8 @@ - #ifndef DETECT_OS_WINDOWS - #define DETECT_OS_WINDOWS 0 - #endif -+#ifndef DETECT_OS_aero -+#define DETECT_OS_aero 0 -+#endif - - #endif /* DETECT_OS_H */ -diff --git a/src/util/futex.h b/src/util/futex.h -index 43097f4..98af1db 100644 ---- a/src/util/futex.h -+++ b/src/util/futex.h -@@ -24,7 +24,7 @@ - #ifndef UTIL_FUTEX_H - #define UTIL_FUTEX_H - --#if defined(HAVE_LINUX_FUTEX_H) -+#if defined(HAVE_LINUX_FUTEX_H) && defined(__linux__) - #define UTIL_FUTEX_SUPPORTED 1 - - #include -diff --git a/src/util/os_misc.c b/src/util/os_misc.c -index 31f1c55..cd3e2c7 100644 ---- a/src/util/os_misc.c -+++ b/src/util/os_misc.c -@@ -57,7 +57,7 @@ - # include - # include - # include --#elif DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD -+#elif DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD || DETECT_OS_aero - # include - #elif DETECT_OS_OPENBSD || DETECT_OS_FREEBSD - # include -@@ -223,7 +223,7 @@ os_get_option(const char *name) - bool - os_get_total_physical_memory(uint64_t *size) - { --#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD -+#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD || DETECT_OS_aero - const long phys_pages = sysconf(_SC_PHYS_PAGES); - const long page_size = sysconf(_SC_PAGE_SIZE); - -diff --git a/src/util/os_time.c b/src/util/os_time.c -index d2edd88..47de02d 100644 ---- a/src/util/os_time.c -+++ b/src/util/os_time.c -@@ -53,7 +53,7 @@ - int64_t - os_time_get_nano(void) - { --#if DETECT_OS_LINUX || DETECT_OS_BSD -+#if DETECT_OS_LINUX || DETECT_OS_BSD || DETECT_OS_aero - - struct timespec tv; - clock_gettime(CLOCK_MONOTONIC, &tv); -@@ -92,7 +92,7 @@ os_time_get_nano(void) - void - os_time_sleep(int64_t usecs) - { --#if DETECT_OS_LINUX -+#if DETECT_OS_LINUX || DETECT_OS_aero - struct timespec time; - time.tv_sec = usecs / 1000000; - time.tv_nsec = (usecs % 1000000) * 1000; -diff --git a/src/util/u_printf.h b/src/util/u_printf.h -index 44dcce5..e9e23ba 100644 ---- a/src/util/u_printf.h -+++ b/src/util/u_printf.h -@@ -22,6 +22,8 @@ - #ifndef U_PRINTF_H - #define U_PRINTF_H - -+#include -+ - #ifdef __cplusplus - - #include -diff --git a/src/util/u_thread.h b/src/util/u_thread.h -index 013e8be..a30eada 100644 ---- a/src/util/u_thread.h -+++ b/src/util/u_thread.h -@@ -129,7 +129,7 @@ static inline thrd_t u_thread_create(int (*routine)(void *), void *param) - static inline void u_thread_setname( const char *name ) - { - #if defined(HAVE_PTHREAD) --#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS -+#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_aero - int ret = pthread_setname_np(pthread_self(), name); - if (ret == ERANGE) { - char buf[16]; -@@ -242,7 +242,7 @@ util_set_current_thread_affinity(const uint32_t *mask, - static inline int64_t - util_thread_get_time_nano(thrd_t thread) - { --#if defined(HAVE_PTHREAD) && !defined(__APPLE__) && !defined(__HAIKU__) -+#if defined(HAVE_PTHREAD) && !defined(__APPLE__) && !defined(__HAIKU__) && !defined(__aero__) - struct timespec ts; - clockid_t cid; - --- -2.39.1 - diff --git a/patches/mlibc/jinx-working-patch.patch b/patches/mlibc/jinx-working-patch.patch new file mode 100644 index 00000000000..dbb0969d0bb --- /dev/null +++ b/patches/mlibc/jinx-working-patch.patch @@ -0,0 +1,180 @@ +diff --git mlibc-clean/options/ansi/generic/time-stubs.cpp mlibc-workdir/options/ansi/generic/time-stubs.cpp +index 887a7d3..7fd46bc 100644 +--- mlibc-clean/options/ansi/generic/time-stubs.cpp ++++ mlibc-workdir/options/ansi/generic/time-stubs.cpp +@@ -242,6 +242,7 @@ size_t strftime(char *__restrict dest, size_t max_size, + c++; + break; + } ++ case 'l': + case 'I': { + int hour = tm->tm_hour; + if(!hour) +diff --git mlibc-clean/options/posix/generic/posix_stdlib.cpp mlibc-workdir/options/posix/generic/posix_stdlib.cpp +index 7128e16..14e1dd7 100644 +--- mlibc-clean/options/posix/generic/posix_stdlib.cpp ++++ mlibc-workdir/options/posix/generic/posix_stdlib.cpp +@@ -139,23 +139,34 @@ char *setstate(char *state) { + // ---------------------------------------------------------------------------- + + int mkostemp(char *pattern, int flags) { ++ return mkostemps(pattern, 0, flags); ++} ++ ++int mkstemp(char *path) { ++ return mkostemp(path, 0); ++} ++ ++int mkostemps(char *pattern, int suffixlen, int flags) { + flags &= ~O_WRONLY; + auto n = strlen(pattern); + __ensure(n >= 6); +- if(n < 6) { ++ ++ if(n < 6 || suffixlen > (n - 6)) { + errno = EINVAL; + return -1; + } +- for(size_t i = 0; i < 6; i++) { +- if(pattern[n - 6 + i] == 'X') +- continue; ++ ++ if (memcmp(pattern + (n - suffixlen - 6), "XXXXXX", 6)) { + errno = EINVAL; + return -1; + } + + // TODO: Do an exponential search. + for(size_t i = 0; i < 999999; i++) { +- __ensure(sprintf(pattern + (n - 6), "%06zu", i) == 6); ++ int x = i; ++ for (int j = 0; j < 6; j++, x >>= 5) { ++ pattern[(n - suffixlen - 6) + j] = 'A' + (x & 15) + (x & 16) * 2; ++ } + // mlibc::infoLogger() << "mlibc: mkstemp candidate is " + // << (const char *)pattern << frg::endlog; + +@@ -172,16 +183,6 @@ int mkostemp(char *pattern, int flags) { + return -1; + } + +-int mkstemp(char *path) { +- return mkostemp(path, 0); +-} +- +-int mkostemps(char *pattern, int suffixlen, int flags) { +- (void)suffixlen; +- mlibc::infoLogger() << "mlibc: mkostemps ignores suffixlen!" << frg::endlog; +- return mkostemp(pattern, flags); +-} +- + int mkstemps(char *pattern, int suffixlen) { + return mkostemps(pattern, suffixlen, 0); + } +diff --git mlibc-workdir/sysdeps/aero/crt-x86_64/crti.S mlibc-workdir/sysdeps/aero/crt-x86_64/crti.S +new file mode 100644 +index 0000000..f04679c +--- /dev/null ++++ mlibc-workdir/sysdeps/aero/crt-x86_64/crti.S +@@ -0,0 +1,10 @@ ++.section .init ++.global _init ++_init: ++ push %rax ++ ++.section .fini ++.global _fini ++_fini: ++ push %rax ++.section .note.GNU-stack,"",%progbits +diff --git mlibc-workdir/sysdeps/aero/crt-x86_64/crtn.S mlibc-workdir/sysdeps/aero/crt-x86_64/crtn.S +new file mode 100644 +index 0000000..1b61d5a +--- /dev/null ++++ mlibc-workdir/sysdeps/aero/crt-x86_64/crtn.S +@@ -0,0 +1,8 @@ ++.section .init ++ pop %rax ++ ret ++ ++.section .fini ++ pop %rax ++ ret ++.section .note.GNU-stack,"",%progbits +diff --git mlibc-clean/sysdeps/aero/generic/filesystem.cpp mlibc-workdir/sysdeps/aero/generic/filesystem.cpp +index 33a11f4..8795382 100644 +--- mlibc-clean/sysdeps/aero/generic/filesystem.cpp ++++ mlibc-workdir/sysdeps/aero/generic/filesystem.cpp +@@ -102,31 +102,24 @@ int sys_access(const char *filename, int mode) { + + int sys_stat(fsfd_target fsfdt, int fd, const char *path, int flags, + struct stat *statbuf) { +- auto result = 0; +- + switch (fsfdt) { +- case fsfd_target::path: { +- result = syscall(SYS_STAT, path, strlen(path), statbuf); ++ case fsfd_target::path: ++ fd = AT_FDCWD; + break; +- } +- +- case fsfd_target::fd: { +- result = syscall(SYS_FSTAT, fd, statbuf); ++ case fsfd_target::fd: ++ flags |= AT_EMPTY_PATH; ++ ++ case fsfd_target::fd_path: + break; +- } +- +- default: { +- mlibc::infoLogger() +- << "mlibc warning: sys_stat: unsupported fsfd target" +- << frg::endlog; +- return EINVAL; +- } +- } + +- if (result < 0) { +- return -result; ++ default: ++ __ensure(!"Invalid fsfd_target"); ++ __builtin_unreachable(); + } + ++ auto ret = syscall(SYS_FSTAT, fd, path, strlen(path), flags, statbuf); ++ if(int e = sc_error(ret); e) ++ return e; + return 0; + } + +diff --git mlibc-clean/sysdeps/aero/meson.build mlibc-workdir/sysdeps/aero/meson.build +index 9d10701..3d2a883 100644 +--- mlibc-clean/sysdeps/aero/meson.build ++++ mlibc-workdir/sysdeps/aero/meson.build +@@ -75,6 +75,24 @@ if not headers_only + install: true, + install_dir: get_option('libdir') + ) ++ ++ custom_target('crti', ++ build_by_default: true, ++ command: c_compiler.cmd_array() + ['-c', '-o', '@OUTPUT@', '@INPUT@'], ++ input: 'crt-x86_64/crti.S', ++ output: 'crti.o', ++ install: true, ++ install_dir: get_option('libdir') ++ ) ++ ++ custom_target('crtn', ++ build_by_default: true, ++ command: c_compiler.cmd_array() + ['-c', '-o', '@OUTPUT@', '@INPUT@'], ++ input: 'crt-x86_64/crtn.S', ++ output: 'crtn.o', ++ install: true, ++ install_dir: get_option('libdir') ++ ) + endif + + if host_machine.cpu_family() == 'x86_64' diff --git a/patches/mlibc/mlibc.patch b/patches/mlibc/mlibc.patch deleted file mode 100644 index 4b4fe9f22b4..00000000000 --- a/patches/mlibc/mlibc.patch +++ /dev/null @@ -1,914 +0,0 @@ -From ff3ad2ec971fffda2a1f098d4e574361f14ab0d2 Mon Sep 17 00:00:00 2001 -From: Anhad Singh -Date: Tue, 14 Nov 2023 17:51:25 +1100 -Subject: [PATCH] - -Signed-off-by: Anhad Singh ---- - options/intl/generic/libintl-stubs.cpp | 66 ++- - options/posix/generic/pthread-stubs.cpp | 90 +++- - options/rtdl/generic/linker.cpp | 5 +- - options/rtdl/include/mlibc/rtdl-sysdeps.hpp | 1 + - sysdeps/aero/generic/aero.cpp | 28 +- - sysdeps/aero/generic/filesystem.cpp | 32 +- - sysdeps/aero/generic/sockets.cpp | 10 +- - sysdeps/aero/include/aero/syscall.h | 3 + - sysdeps/aero/include/mlibc/jsmn.h | 474 ++++++++++++++++++++ - 9 files changed, 632 insertions(+), 77 deletions(-) - create mode 100644 sysdeps/aero/include/mlibc/jsmn.h - -diff --git a/options/intl/generic/libintl-stubs.cpp b/options/intl/generic/libintl-stubs.cpp -index 8d4b28f..94ab421 100644 ---- a/options/intl/generic/libintl-stubs.cpp -+++ b/options/intl/generic/libintl-stubs.cpp -@@ -1,73 +1,57 @@ - #include -+#include -+#include -+#include - #include - -+static char *current_domain; -+ - char *gettext(const char *msgid) { -- (void)msgid; -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ // (void)msgid; -+ // __ensure(!"Not implemented"); -+ // __builtin_unreachable(); -+ return (char*)""; - } - - char *dgettext(const char *domainname, const char *msgid) { -- (void)domainname; -- (void)msgid; -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ return (char*)""; - } - - char *dcgettext(const char *domainname, const char *msgid, - int category) { -- (void)domainname; -- (void)msgid; -- (void)category; -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ return (char*)""; -+ - } - - char *ngettext(const char *msgid, const char *msgid_plural, unsigned long int n) { -- (void)msgid; -- (void)msgid_plural; -- (void)n; -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ return (char*)""; -+ - } - - char *dngettext(const char *domainname, const char *msgid, - const char *msgid_plural, unsigned long int n) { -- (void)domainname; -- (void)msgid; -- (void)msgid_plural; -- (void)n; -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ return (char*)""; -+ - } - - char *dcngettext(const char *domainname, const char *msgid, - const char *msgid_plural, unsigned long int n, int category) { -- (void)domainname; -- (void)msgid; -- (void)msgid_plural; -- (void)n; -- (void)category; -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ return (char*)""; -+ - } - - char *textdomain(const char *domainname) { -- (void)domainname; -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ if(!domainname) -+ return current_domain ? current_domain : (char *)"messages"; -+ -+ return (char*)"messages"; - } - - char *bindtextdomain(const char *domainname, const char *dirname) { -- (void)domainname; -- (void)dirname; -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ return (char*)""; -+ - } - - char *bind_textdomain_codeset(const char *domainname, const char *codeset) { -- (void)domainname; -- (void)codeset; -- __ensure(!"Not implemented"); -- __builtin_unreachable(); -+ return (char*)""; - } -diff --git a/options/posix/generic/pthread-stubs.cpp b/options/posix/generic/pthread-stubs.cpp -index 5618dc6..a5edec6 100644 ---- a/options/posix/generic/pthread-stubs.cpp -+++ b/options/posix/generic/pthread-stubs.cpp -@@ -1,4 +1,3 @@ -- - #include - #include - #include -@@ -265,6 +264,87 @@ int pthread_attr_setsigmask_np(pthread_attr_t *__restrict attr, - } - - namespace { -+#include -+#ifdef __aero__ -+ static bool jsoneq(const char *input, jsmntok_t tok, const char *expected) { -+ if (tok.type == JSMN_STRING && -+ (int)strlen(expected) == tok.end - tok.start && -+ strncmp(input + tok.start, expected, tok.end - tok.start) == 0) { -+ return true; -+ } -+ -+ return false; -+ } -+ -+ size_t string_to_usize(const char *string, size_t length) { -+ size_t ret = 0; -+ for (size_t i = 0; i < length; i++) { -+ ret = ret * 10 + (string[i] - '0'); -+ } -+ -+ return ret; -+ } -+ -+ void get_own_stackinfo(void **stack_addr, size_t *stack_size) { -+ auto fp = fopen("/proc/self/maps", "r"); -+ if (!fp) { -+ mlibc::infoLogger() << "mlibc pthreads: /proc/self/maps does not exist! Producing incorrect" -+ " stack results!" << frg::endlog; -+ return; -+ } -+ -+ auto sp = mlibc::get_sp(); -+ -+ char *INPUT = (char *)malloc(4096 * 4); -+ size_t INPUT_SIZE = fread(INPUT, 1, 4096 * 4, fp); -+ -+ jsmn_parser parser; -+ jsmn_init(&parser); -+ -+ int n = jsmn_parse(&parser, INPUT, INPUT_SIZE, nullptr, 0); -+ FRG_ASSERT(n > 0); -+ -+ jsmntok_t *tokens = static_cast(malloc(sizeof(jsmntok_t) * n)); -+ -+ jsmn_init(&parser); -+ int result = jsmn_parse(&parser, INPUT, INPUT_SIZE, tokens, n); -+ FRG_ASSERT(tokens[0].type == JSMN_OBJECT); -+ -+ FRG_ASSERT(jsoneq(INPUT, tokens[1], "maps")); -+ -+ size_t n_fields = tokens[3].size; -+ for (size_t i = 3; i < tokens[2].size * (n_fields * 2 + 1); i+=(n_fields * 2 + 1)) { -+ jsmntok_t *mapping = &tokens[i]; -+ FRG_ASSERT(mapping->type == JSMN_OBJECT); -+ -+ size_t start = SIZE_MAX; -+ size_t end = SIZE_MAX; -+ -+ for (size_t j = 1; j < mapping->size * 2; j += 2) { -+ jsmntok_t *value = &mapping[j + 1]; -+ -+ size_t val = string_to_usize(INPUT + value->start, value->end - value->start); -+ -+ if (jsoneq(INPUT, mapping[j], "start")) { -+ start = val; -+ } else if (jsoneq(INPUT, mapping[j], "end")) { -+ end = val; -+ } -+ } -+ -+ if (sp < end && sp > start) { -+ *stack_addr = reinterpret_cast(start); -+ *stack_size = end - start; -+ -+ fclose(fp); -+ free(INPUT); -+ return; -+ } -+ } -+ -+ FRG_ASSERT(!"reached unreachable code"); -+ } -+#else - void get_own_stackinfo(void **stack_addr, size_t *stack_size) { - auto fp = fopen("/proc/self/maps", "r"); - if (!fp) { -@@ -290,7 +370,8 @@ namespace { - - fclose(fp); - } --} -+#endif -+} // namespace annonymous - - int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr) { - auto tcb = reinterpret_cast(thread); -@@ -299,9 +380,10 @@ int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr) { - if (!tcb->stackAddr || !tcb->stackSize) { - // allocate stack - -- attr->__mlibc_stackaddr = 0x00; -+ attr->__mlibc_stackaddr = (void*)0x7ffffff9a000; - attr->__mlibc_stacksize = 0x20000; -- // get_own_stackinfo(&attr->__mlibc_stackaddr, &attr->__mlibc_stacksize); -+ -+ get_own_stackinfo(&attr->__mlibc_stackaddr, &attr->__mlibc_stacksize); - } else { - attr->__mlibc_stacksize = tcb->stackSize; - attr->__mlibc_stackaddr = tcb->stackAddr; -diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp -index 50cca94..a095ab0 100644 ---- a/options/rtdl/generic/linker.cpp -+++ b/options/rtdl/generic/linker.cpp -@@ -438,6 +438,7 @@ void ObjectRepository::_fetchFromFile(SharedObject *object, int fd) { - - __ensure(!(object->baseAddress & (hugeSize - 1))); - -+ size_t tagSize = highest_address - object->baseAddress; - #if MLIBC_MMAP_ALLOCATE_DSO - void *mappedAddr = nullptr; - -@@ -457,9 +458,11 @@ void ObjectRepository::_fetchFromFile(SharedObject *object, int fd) { - libraryBase += (highest_address + (hugeSize - 1)) & ~(hugeSize - 1); - #endif - -- if(verbose || logBaseAddresses) -+ if(verbose || logBaseAddresses) { -+ mlibc::sys_tag_memory((void *)object->baseAddress, tagSize, object->name.data()); - mlibc::infoLogger() << "rtdl: Loading " << object->name - << " at " << (void *)object->baseAddress << frg::endlog; -+ } - - // Load all segments. - constexpr size_t pageSize = 0x1000; -diff --git a/options/rtdl/include/mlibc/rtdl-sysdeps.hpp b/options/rtdl/include/mlibc/rtdl-sysdeps.hpp -index c35271c..8a941b2 100644 ---- a/options/rtdl/include/mlibc/rtdl-sysdeps.hpp -+++ b/options/rtdl/include/mlibc/rtdl-sysdeps.hpp -@@ -6,6 +6,7 @@ namespace [[gnu::visibility("hidden")]] mlibc { - int sys_tcb_set(void *pointer); - - [[gnu::weak]] int sys_vm_readahead(void *pointer, size_t size); -+[[gnu::weak]] int sys_tag_memory(void *ptr, size_t size, char *tag); - - } // namespace mlibc - -diff --git a/sysdeps/aero/generic/aero.cpp b/sysdeps/aero/generic/aero.cpp -index e19b159..a54b6d3 100644 ---- a/sysdeps/aero/generic/aero.cpp -+++ b/sysdeps/aero/generic/aero.cpp -@@ -62,6 +62,10 @@ static frg::vector create_slice(char *const arg[]) { - } - - namespace mlibc { -+int sys_tag_memory(void *ptr, size_t size, char *tag) { -+ return syscall(SYS_DEBUG, ptr, size, tag, strlen(tag)); -+} -+ - int sys_uname(struct utsname *buf) { - auto result = syscall(SYS_UNAME, buf); - -@@ -73,22 +77,20 @@ int sys_uname(struct utsname *buf) { - } - - int sys_futex_wait(int *pointer, int expected, const struct timespec *time) { -- // auto result = syscall(SYS_FUTEX_WAIT, pointer, expected, time); -- // -- // if (result < 0) { -- // return -result; -- // } -- // -+ auto ret = syscall(SYS_FUTEX_WAIT, pointer, expected, time); -+ -+ if (int e = sc_error(ret); e) -+ return e; -+ - return 0; - } - - int sys_futex_wake(int *pointer) { -- // auto result = syscall(SYS_FUTEX_WAKE, pointer); -- // -- // if (result < 0) { -- // return -result; -- // } -- // -+ auto ret = syscall(SYS_FUTEX_WAKE, pointer); -+ -+ if (int e = sc_error(ret); e) -+ return e; -+ - return 0; - } - -@@ -309,7 +311,7 @@ int sys_thread_setname(void *tcb, const char *name) { - } - - void sys_thread_exit() { -- syscall(SYS_EXIT); -+ syscall(SYS_EXIT, 0); - __builtin_trap(); - } - -diff --git a/sysdeps/aero/generic/filesystem.cpp b/sysdeps/aero/generic/filesystem.cpp -index 33a11f4..4f64ba5 100644 ---- a/sysdeps/aero/generic/filesystem.cpp -+++ b/sysdeps/aero/generic/filesystem.cpp -@@ -68,15 +68,22 @@ int sys_seek(int fd, off_t offset, int whence, off_t *new_offset) { - return 0; - } - --int sys_open(const char *filename, int flags, mode_t mode, int *fd) { -- auto result = syscall(SYS_OPEN, 0, filename, strlen(filename), flags); -+int sys_openat(int dirfd, const char *path, int flags, mode_t mode, int *fd) { -+ (void)mode; - -- if (result < 0) { -- return -result; -- } -+ auto ret = syscall(SYS_OPEN, dirfd, path, strlen(path), flags); -+ if (int e = sc_error(ret); e) -+ return e; -+ *fd = ret; -+ return 0; -+} - -- *fd = result; -- return 0; -+int sys_open(const char *path, int flags, mode_t mode, int *fd) { -+ return sys_openat(AT_FDCWD, path, flags, mode, fd); -+} -+ -+int sys_open_dir(const char *path, int *fd) { -+ return sys_open(path, O_DIRECTORY, 0, fd); - } - - int sys_close(int fd) { -@@ -256,10 +263,6 @@ int sys_read_entries(int handle, void *buffer, size_t max_size, - return 0; - } - --int sys_open_dir(const char *path, int *handle) { -- return sys_open(path, O_DIRECTORY, 0, handle); --} -- - int sys_rename(const char *path, const char *new_path) { - auto result = - syscall(SYS_RENAME, path, strlen(path), new_path, strlen(new_path)); -@@ -305,6 +308,13 @@ int sys_dup2(int fd, int flags, int newfd) { - } - - int sys_fcntl(int fd, int request, va_list args, int *result_value) { -+ if(request == F_GETLK) { -+ struct flock *lock = va_arg(args, struct flock *); -+ lock->l_type = F_UNLCK; -+ mlibc::infoLogger() << "\e[31mmlibc: F_GETLK is stubbed!\e[39m" << frg::endlog; -+ return 0; -+ } -+ - auto result = syscall(SYS_FCNTL, fd, request, va_arg(args, uint64_t)); - - if (result < 0) { -diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp -index 10af36a..bf2602f 100644 ---- a/sysdeps/aero/generic/sockets.cpp -+++ b/sysdeps/aero/generic/sockets.cpp -@@ -174,14 +174,10 @@ int sys_getsockopt(int fd, int layer, int number, void *__restrict buffer, - - int sys_setsockopt(int fd, int layer, int number, const void *buffer, - socklen_t size) { -- (void)fd; -- (void)buffer; -- (void)size; -- - if (layer == SOL_SOCKET && number == SO_PASSCRED) { -- mlibc::infoLogger() << "\e[31mmlibc: setsockopt(SO_PASSCRED) is not " -- "implemented correctly\e[39m" -- << frg::endlog; -+ auto ret = syscall(SYS_SETSOCKOPT, fd, layer, number, buffer, size); -+ if (int e = sc_error(ret); e) -+ return e; - return 0; - } else if (layer == SOL_SOCKET && number == SO_ATTACH_FILTER) { - mlibc::infoLogger() << "\e[31mmlibc: setsockopt(SO_ATTACH_FILTER) is " -diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h -index 39c5b65..bd2f489 100644 ---- a/sysdeps/aero/include/aero/syscall.h -+++ b/sysdeps/aero/include/aero/syscall.h -@@ -82,6 +82,9 @@ - #define SYS_SOCK_SHUTDOWN 75 - #define SYS_GETPEERNAME 76 - #define SYS_GETSOCKNAME 77 -+#define SYS_DEBUG 78 -+#define SYS_SETSOCKOPT 79 -+#define SYS_GETSOCKOPT 80 - - // Invalid syscall used to trigger a log error in the kernel (as a hint) - // so, that we can implement the syscall in the kernel. -diff --git a/sysdeps/aero/include/mlibc/jsmn.h b/sysdeps/aero/include/mlibc/jsmn.h -new file mode 100644 -index 0000000..2d8f591 ---- /dev/null -+++ b/sysdeps/aero/include/mlibc/jsmn.h -@@ -0,0 +1,474 @@ -+/* -+ * MIT License -+ * -+ * Copyright (c) 2010 Serge Zaitsev -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a copy -+ * of this software and associated documentation files (the "Software"), to deal -+ * in the Software without restriction, including without limitation the rights -+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -+ * copies of the Software, and to permit persons to whom the Software is -+ * furnished to do so, subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice shall be included in -+ * all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+#ifndef JSMN_H -+#define JSMN_H -+ -+#include -+ -+#define JSMN_PARENT_LINKS -+#define JSMN_STRICT -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#ifdef JSMN_STATIC -+#define JSMN_API static -+#else -+#define JSMN_API extern -+#endif -+ -+/** -+ * JSON type identifier. Basic types are: -+ * o Object -+ * o Array -+ * o String -+ * o Other primitive: number, boolean (true/false) or null -+ */ -+typedef enum { -+ JSMN_UNDEFINED = 0, -+ JSMN_OBJECT = 1 << 0, -+ JSMN_ARRAY = 1 << 1, -+ JSMN_STRING = 1 << 2, -+ JSMN_PRIMITIVE = 1 << 3 -+} jsmntype_t; -+ -+enum jsmnerr { -+ /* Not enough tokens were provided */ -+ JSMN_ERROR_NOMEM = -1, -+ /* Invalid character inside JSON string */ -+ JSMN_ERROR_INVAL = -2, -+ /* The string is not a full JSON packet, more bytes expected */ -+ JSMN_ERROR_PART = -3 -+}; -+ -+/** -+ * JSON token description. -+ * type type (object, array, string etc.) -+ * start start position in JSON data string -+ * end end position in JSON data string -+ */ -+typedef struct jsmntok { -+ jsmntype_t type; -+ int start; -+ int end; -+ int size; -+#ifdef JSMN_PARENT_LINKS -+ int parent; -+#endif -+} jsmntok_t; -+ -+/** -+ * JSON parser. Contains an array of token blocks available. Also stores -+ * the string being parsed now and current position in that string. -+ */ -+typedef struct jsmn_parser { -+ unsigned int pos; /* offset in the JSON string */ -+ unsigned int toknext; /* next token to allocate */ -+ int toksuper; /* superior token node, e.g. parent object or array */ -+} jsmn_parser; -+ -+/** -+ * Create JSON parser over an array of tokens -+ */ -+JSMN_API void jsmn_init(jsmn_parser *parser); -+ -+/** -+ * Run JSON parser. It parses a JSON data string into and array of tokens, each -+ * describing -+ * a single JSON object. -+ */ -+JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, -+ jsmntok_t *tokens, const unsigned int num_tokens); -+ -+#ifndef JSMN_HEADER -+/** -+ * Allocates a fresh unused token from the token pool. -+ */ -+static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, jsmntok_t *tokens, -+ const size_t num_tokens) { -+ jsmntok_t *tok; -+ if (parser->toknext >= num_tokens) { -+ return NULL; -+ } -+ tok = &tokens[parser->toknext++]; -+ tok->start = tok->end = -1; -+ tok->size = 0; -+#ifdef JSMN_PARENT_LINKS -+ tok->parent = -1; -+#endif -+ return tok; -+} -+ -+/** -+ * Fills token type and boundaries. -+ */ -+static void jsmn_fill_token(jsmntok_t *token, const jsmntype_t type, -+ const int start, const int end) { -+ token->type = type; -+ token->start = start; -+ token->end = end; -+ token->size = 0; -+} -+ -+/** -+ * Fills next available token with JSON primitive. -+ */ -+static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, -+ const size_t len, jsmntok_t *tokens, -+ const size_t num_tokens) { -+ jsmntok_t *token; -+ int start; -+ -+ start = parser->pos; -+ -+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { -+ switch (js[parser->pos]) { -+#ifndef JSMN_STRICT -+ /* In strict mode primitive must be followed by "," or "}" or "]" */ -+ case ':': -+#endif -+ case '\t': -+ case '\r': -+ case '\n': -+ case ' ': -+ case ',': -+ case ']': -+ case '}': -+ goto found; -+ default: -+ /* to quiet a warning from gcc*/ -+ break; -+ } -+ if (js[parser->pos] < 32 || js[parser->pos] >= 127) { -+ parser->pos = start; -+ return JSMN_ERROR_INVAL; -+ } -+ } -+#ifdef JSMN_STRICT -+ /* In strict mode primitive must be followed by a comma/object/array */ -+ parser->pos = start; -+ return JSMN_ERROR_PART; -+#endif -+ -+found: -+ if (tokens == NULL) { -+ parser->pos--; -+ return 0; -+ } -+ token = jsmn_alloc_token(parser, tokens, num_tokens); -+ if (token == NULL) { -+ parser->pos = start; -+ return JSMN_ERROR_NOMEM; -+ } -+ jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); -+#ifdef JSMN_PARENT_LINKS -+ token->parent = parser->toksuper; -+#endif -+ parser->pos--; -+ return 0; -+} -+ -+/** -+ * Fills next token with JSON string. -+ */ -+static int jsmn_parse_string(jsmn_parser *parser, const char *js, -+ const size_t len, jsmntok_t *tokens, -+ const size_t num_tokens) { -+ jsmntok_t *token; -+ -+ int start = parser->pos; -+ -+ /* Skip starting quote */ -+ parser->pos++; -+ -+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { -+ char c = js[parser->pos]; -+ -+ /* Quote: end of string */ -+ if (c == '\"') { -+ if (tokens == NULL) { -+ return 0; -+ } -+ token = jsmn_alloc_token(parser, tokens, num_tokens); -+ if (token == NULL) { -+ parser->pos = start; -+ return JSMN_ERROR_NOMEM; -+ } -+ jsmn_fill_token(token, JSMN_STRING, start + 1, parser->pos); -+#ifdef JSMN_PARENT_LINKS -+ token->parent = parser->toksuper; -+#endif -+ return 0; -+ } -+ -+ /* Backslash: Quoted symbol expected */ -+ if (c == '\\' && parser->pos + 1 < len) { -+ int i; -+ parser->pos++; -+ switch (js[parser->pos]) { -+ /* Allowed escaped symbols */ -+ case '\"': -+ case '/': -+ case '\\': -+ case 'b': -+ case 'f': -+ case 'r': -+ case 'n': -+ case 't': -+ break; -+ /* Allows escaped symbol \uXXXX */ -+ case 'u': -+ parser->pos++; -+ for (i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; -+ i++) { -+ /* If it isn't a hex character we have an error */ -+ if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ -+ (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ -+ (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ -+ parser->pos = start; -+ return JSMN_ERROR_INVAL; -+ } -+ parser->pos++; -+ } -+ parser->pos--; -+ break; -+ /* Unexpected symbol */ -+ default: -+ parser->pos = start; -+ return JSMN_ERROR_INVAL; -+ } -+ } -+ } -+ parser->pos = start; -+ return JSMN_ERROR_PART; -+} -+ -+/** -+ * Parse JSON string and fill tokens. -+ */ -+JSMN_API int jsmn_parse(jsmn_parser *parser, const char *js, const size_t len, -+ jsmntok_t *tokens, const unsigned int num_tokens) { -+ int r; -+ int i; -+ jsmntok_t *token; -+ int count = parser->toknext; -+ -+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { -+ char c; -+ jsmntype_t type; -+ -+ c = js[parser->pos]; -+ switch (c) { -+ case '{': -+ case '[': -+ count++; -+ if (tokens == NULL) { -+ break; -+ } -+ token = jsmn_alloc_token(parser, tokens, num_tokens); -+ if (token == NULL) { -+ return JSMN_ERROR_NOMEM; -+ } -+ if (parser->toksuper != -1) { -+ jsmntok_t *t = &tokens[parser->toksuper]; -+#ifdef JSMN_STRICT -+ /* In strict mode an object or array can't become a key */ -+ if (t->type == JSMN_OBJECT) { -+ return JSMN_ERROR_INVAL; -+ } -+#endif -+ t->size++; -+#ifdef JSMN_PARENT_LINKS -+ token->parent = parser->toksuper; -+#endif -+ } -+ token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); -+ token->start = parser->pos; -+ parser->toksuper = parser->toknext - 1; -+ break; -+ case '}': -+ case ']': -+ if (tokens == NULL) { -+ break; -+ } -+ type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); -+#ifdef JSMN_PARENT_LINKS -+ if (parser->toknext < 1) { -+ return JSMN_ERROR_INVAL; -+ } -+ token = &tokens[parser->toknext - 1]; -+ for (;;) { -+ if (token->start != -1 && token->end == -1) { -+ if (token->type != type) { -+ return JSMN_ERROR_INVAL; -+ } -+ token->end = parser->pos + 1; -+ parser->toksuper = token->parent; -+ break; -+ } -+ if (token->parent == -1) { -+ if (token->type != type || parser->toksuper == -1) { -+ return JSMN_ERROR_INVAL; -+ } -+ break; -+ } -+ token = &tokens[token->parent]; -+ } -+#else -+ for (i = parser->toknext - 1; i >= 0; i--) { -+ token = &tokens[i]; -+ if (token->start != -1 && token->end == -1) { -+ if (token->type != type) { -+ return JSMN_ERROR_INVAL; -+ } -+ parser->toksuper = -1; -+ token->end = parser->pos + 1; -+ break; -+ } -+ } -+ /* Error if unmatched closing bracket */ -+ if (i == -1) { -+ return JSMN_ERROR_INVAL; -+ } -+ for (; i >= 0; i--) { -+ token = &tokens[i]; -+ if (token->start != -1 && token->end == -1) { -+ parser->toksuper = i; -+ break; -+ } -+ } -+#endif -+ break; -+ case '\"': -+ r = jsmn_parse_string(parser, js, len, tokens, num_tokens); -+ if (r < 0) { -+ return r; -+ } -+ count++; -+ if (parser->toksuper != -1 && tokens != NULL) { -+ tokens[parser->toksuper].size++; -+ } -+ break; -+ case '\t': -+ case '\r': -+ case '\n': -+ case ' ': -+ break; -+ case ':': -+ parser->toksuper = parser->toknext - 1; -+ break; -+ case ',': -+ if (tokens != NULL && parser->toksuper != -1 && -+ tokens[parser->toksuper].type != JSMN_ARRAY && -+ tokens[parser->toksuper].type != JSMN_OBJECT) { -+#ifdef JSMN_PARENT_LINKS -+ parser->toksuper = tokens[parser->toksuper].parent; -+#else -+ for (i = parser->toknext - 1; i >= 0; i--) { -+ if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) { -+ if (tokens[i].start != -1 && tokens[i].end == -1) { -+ parser->toksuper = i; -+ break; -+ } -+ } -+ } -+#endif -+ } -+ break; -+#ifdef JSMN_STRICT -+ /* In strict mode primitives are: numbers and booleans */ -+ case '-': -+ case '0': -+ case '1': -+ case '2': -+ case '3': -+ case '4': -+ case '5': -+ case '6': -+ case '7': -+ case '8': -+ case '9': -+ case 't': -+ case 'f': -+ case 'n': -+ /* And they must not be keys of the object */ -+ if (tokens != NULL && parser->toksuper != -1) { -+ const jsmntok_t *t = &tokens[parser->toksuper]; -+ if (t->type == JSMN_OBJECT || -+ (t->type == JSMN_STRING && t->size != 0)) { -+ return JSMN_ERROR_INVAL; -+ } -+ } -+#else -+ /* In non-strict mode every unquoted value is a primitive */ -+ default: -+#endif -+ r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); -+ if (r < 0) { -+ return r; -+ } -+ count++; -+ if (parser->toksuper != -1 && tokens != NULL) { -+ tokens[parser->toksuper].size++; -+ } -+ break; -+ -+#ifdef JSMN_STRICT -+ /* Unexpected char in strict mode */ -+ default: -+ return JSMN_ERROR_INVAL; -+#endif -+ } -+ } -+ -+ if (tokens != NULL) { -+ for (i = parser->toknext - 1; i >= 0; i--) { -+ /* Unmatched opened object or array */ -+ if (tokens[i].start != -1 && tokens[i].end == -1) { -+ return JSMN_ERROR_PART; -+ } -+ } -+ } -+ -+ return count; -+} -+ -+/** -+ * Creates a new parser based over a given buffer with an array of tokens -+ * available. -+ */ -+JSMN_API void jsmn_init(jsmn_parser *parser) { -+ parser->pos = 0; -+ parser->toknext = 0; -+ parser->toksuper = -1; -+} -+ -+#endif /* JSMN_HEADER */ -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* JSMN_H */ --- -2.43.0 - diff --git a/patches/ncurses/jinx-working-patch.patch b/patches/ncurses/jinx-working-patch.patch new file mode 100644 index 00000000000..7ebebf230b9 --- /dev/null +++ b/patches/ncurses/jinx-working-patch.patch @@ -0,0 +1,15 @@ +diff --git ncurses-clean/configure ncurses-workdir/configure +index d652dc0..1572ae3 100755 +--- ncurses-clean/configure ++++ ncurses-workdir/configure +@@ -6923,6 +6923,10 @@ CF_EOF + LINK_PROGS="$SHELL ${rel_builddir}/mk_prog.sh" + LINK_TESTS="$SHELL ${rel_builddir}/mk_prog.sh" + ;; ++ (aero*) ++ CC_SHARED_OPTS='-fPIC' ++ MK_SHARED_LIB='${CC} -shared -o $@' ++ ;; + (mingw*) + cf_cv_shlib_version=mingw + cf_cv_shlib_version_infix=mingw diff --git a/patches/ncurses/ncurses.patch b/patches/ncurses/ncurses.patch deleted file mode 100644 index daf6ac0a94a..00000000000 --- a/patches/ncurses/ncurses.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 4d53b6fbd2a90d69c153933c413ecf5a0598518a Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Fri, 2 Dec 2022 19:15:20 +1100 -Subject: [PATCH] - ---- - config.sub | 2 +- - configure | 4 ++++ - 2 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/config.sub b/config.sub -index 0f2234c..0cf7603 100755 ---- a/config.sub -+++ b/config.sub -@@ -1366,7 +1366,7 @@ case $os in - | skyos* | haiku* | rdos* | toppers* | drops* | es* \ - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ -- | nsk* | powerunix) -+ | nsk* | powerunix | aero*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - qnx*) -diff --git a/configure b/configure -index 06f344f..a008d88 100755 ---- a/configure -+++ b/configure -@@ -5961,6 +5961,10 @@ echo "${ECHO_T}$cf_cv_ldflags_search_paths_first" >&6 - - MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@' - ;; -+ (aero*) -+ CC_SHARED_OPTS='-fPIC' -+ MK_SHARED_LIB='${CC} -shared -o $@' -+ ;; - (mingw*) - cf_cv_shlib_version=mingw - cf_cv_shlib_version_infix=mingw --- -2.38.1 - diff --git a/patches/neofetch/neofetch.patch b/patches/neofetch/neofetch.patch deleted file mode 100644 index 6b2a9572e7d..00000000000 --- a/patches/neofetch/neofetch.patch +++ /dev/null @@ -1,34 +0,0 @@ -From f1fae2e54122bb1342dec30f218a4bdcdaf3c428 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Wed, 21 Dec 2022 17:37:50 +1100 -Subject: [PATCH] - ---- - neofetch | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/neofetch b/neofetch -index 9f2ba30..2d5c4de 100755 ---- a/neofetch -+++ b/neofetch -@@ -945,7 +945,7 @@ get_os() { - AIX) os=AIX ;; - IRIX*) os=IRIX ;; - FreeMiNT) os=FreeMiNT ;; -- aero) os=Aero;; -+ Aero) os=Aero;; - - Linux|GNU*) - os=Linux -@@ -8528,7 +8528,7 @@ EOF - # TODO: Add proper art - set_colors 2 1 3 5 - read -rd '' ascii_data <<'EOF' -- ,---, -+${c1} ,---, - ' .' \ - / ; '. - : : \ --- -2.38.1 - diff --git a/patches/nss/0001-Add-a-missing-include.patch b/patches/nss/0001-Add-a-missing-include.patch deleted file mode 100644 index eb71fcab2a5..00000000000 --- a/patches/nss/0001-Add-a-missing-include.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 8c7f96493b8706d43b30f49d56e0e84ee27fe65e Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Wed, 27 Apr 2022 20:27:21 +0200 -Subject: [PATCH 1/2] Add a missing include - -Signed-off-by: Dennis Bonke ---- - lib/dbm/src/h_page.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/lib/dbm/src/h_page.c b/lib/dbm/src/h_page.c -index d4e4ff6..7b3271e 100644 ---- a/lib/dbm/src/h_page.c -+++ b/lib/dbm/src/h_page.c -@@ -81,6 +81,7 @@ static char sccsid[] = "@(#)hash_page.c 8.7 (Berkeley) 8/16/94"; - #endif - - #include -+#include - - #include "mcom_db.h" - #include "hash.h" --- -2.36.0 diff --git a/patches/nss/0002-NSS-Standalone-patch.patch b/patches/nss/0002-NSS-Standalone-patch.patch deleted file mode 100644 index cd78732af8a..00000000000 --- a/patches/nss/0002-NSS-Standalone-patch.patch +++ /dev/null @@ -1,258 +0,0 @@ -From ee4b3e43e0143f94289c418c0db5f803119e8be6 Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Wed, 27 Apr 2022 20:35:40 +0200 -Subject: [PATCH 2/2] NSS Standalone patch - -Taken from Beyond Linux From Scratch (https://www.linuxfromscratch.org/patches/blfs/svn/nss-3.77-standalone-1.patch) - -Adds auto-generated nss.pc and nss-config script, and allows building without nspr in the source tree. -Minimum NSPR version is now read out from package, instead of hardcoded value in the patch. - -Signed-off-by: Dennis Bonke ---- - config/Makefile | 41 ++++++++++++ - config/nss-config.in | 152 +++++++++++++++++++++++++++++++++++++++++++ - config/nss.pc.in | 11 ++++ - manifest.mn | 2 +- - 4 files changed, 205 insertions(+), 1 deletion(-) - create mode 100644 config/Makefile - create mode 100644 config/nss-config.in - create mode 100644 config/nss.pc.in - -diff --git a/config/Makefile b/config/Makefile -new file mode 100644 -index 0000000..662020a ---- /dev/null -+++ b/config/Makefile -@@ -0,0 +1,41 @@ -+CORE_DEPTH = .. -+DEPTH = .. -+ -+include $(CORE_DEPTH)/coreconf/config.mk -+ -+NSS_MAJOR_VERSION = `grep "NSS_VMAJOR" ../lib/nss/nss.h | awk '{print $$3}'` -+NSS_MINOR_VERSION = `grep "NSS_VMINOR" ../lib/nss/nss.h | awk '{print $$3}'` -+NSS_PATCH_VERSION = `grep "NSS_VPATCH" ../lib/nss/nss.h | awk '{print $$3}'` -+NSS_NSPR_MINIMUM = `head -n1 ../automation/release/nspr-version.txt` -+PREFIX = /usr -+ -+all: export libs -+ -+export: -+ # Create the nss.pc file -+ mkdir -p $(DIST)/lib/pkgconfig -+ sed -e "s,@prefix@,$(PREFIX)," \ -+ -e "s,@exec_prefix@,\$${prefix}," \ -+ -e "s,@libdir@,\$${prefix}/lib," \ -+ -e "s,@includedir@,\$${prefix}/include/nss," \ -+ -e "s,@NSS_MAJOR_VERSION@,$(NSS_MAJOR_VERSION),g" \ -+ -e "s,@NSS_MINOR_VERSION@,$(NSS_MINOR_VERSION)," \ -+ -e "s,@NSS_PATCH_VERSION@,$(NSS_PATCH_VERSION)," \ -+ -e "s,@NSS_NSPR_MINIMUM@,$(NSS_NSPR_MINIMUM)," \ -+ nss.pc.in > nss.pc -+ chmod 0644 nss.pc -+ cp -v nss.pc $(DIST)/lib/pkgconfig -+ -+ # Create the nss-config script -+ mkdir -p $(DIST)/bin -+ sed -e "s,@prefix@,$(PREFIX)," \ -+ -e "s,@NSS_MAJOR_VERSION@,$(NSS_MAJOR_VERSION)," \ -+ -e "s,@NSS_MINOR_VERSION@,$(NSS_MINOR_VERSION)," \ -+ -e "s,@NSS_PATCH_VERSION@,$(NSS_PATCH_VERSION)," \ -+ nss-config.in > nss-config -+ chmod 0755 nss-config -+ cp -v nss-config $(DIST)/bin -+ -+libs: -+ -+dummy: all export libs -diff --git a/config/nss-config.in b/config/nss-config.in -new file mode 100644 -index 0000000..7e3750d ---- /dev/null -+++ b/config/nss-config.in -@@ -0,0 +1,152 @@ -+#!/bin/sh -+ -+prefix=@prefix@ -+ -+major_version=@NSS_MAJOR_VERSION@ -+minor_version=@NSS_MINOR_VERSION@ -+patch_version=@NSS_PATCH_VERSION@ -+ -+usage() -+{ -+ cat <&2 -+fi -+ -+lib_nss=yes -+lib_nssutil=yes -+lib_smime=yes -+lib_ssl=yes -+lib_softokn=yes -+ -+while test $# -gt 0; do -+ case "$1" in -+ -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; -+ *) optarg= ;; -+ esac -+ -+ case $1 in -+ --prefix=*) -+ prefix=$optarg -+ ;; -+ --prefix) -+ echo_prefix=yes -+ ;; -+ --exec-prefix=*) -+ exec_prefix=$optarg -+ ;; -+ --exec-prefix) -+ echo_exec_prefix=yes -+ ;; -+ --includedir=*) -+ includedir=$optarg -+ ;; -+ --includedir) -+ echo_includedir=yes -+ ;; -+ --libdir=*) -+ libdir=$optarg -+ ;; -+ --libdir) -+ echo_libdir=yes -+ ;; -+ --version) -+ echo ${major_version}.${minor_version}.${patch_version} -+ ;; -+ --cflags) -+ echo_cflags=yes -+ ;; -+ --libs) -+ echo_libs=yes -+ ;; -+ nss) -+ lib_nss=yes -+ ;; -+ nssutil) -+ lib_nssutil=yes -+ ;; -+ smime) -+ lib_smime=yes -+ ;; -+ ssl) -+ lib_ssl=yes -+ ;; -+ softokn) -+ lib_softokn=yes -+ ;; -+ *) -+ usage 1 1>&2 -+ ;; -+ esac -+ shift -+done -+ -+# Set variables that may be dependent upon other variables -+if test -z "$exec_prefix"; then -+ exec_prefix=`pkg-config --variable=exec_prefix nss` -+fi -+if test -z "$includedir"; then -+ includedir=`pkg-config --variable=includedir nss` -+fi -+if test -z "$libdir"; then -+ libdir=`pkg-config --variable=libdir nss` -+fi -+ -+if test "$echo_prefix" = "yes"; then -+ echo $prefix -+fi -+ -+if test "$echo_exec_prefix" = "yes"; then -+ echo $exec_prefix -+fi -+ -+if test "$echo_includedir" = "yes"; then -+ echo $includedir -+fi -+ -+if test "$echo_libdir" = "yes"; then -+ echo $libdir -+fi -+ -+if test "$echo_cflags" = "yes"; then -+ echo -I$includedir -+fi -+ -+if test "$echo_libs" = "yes"; then -+ libdirs="-L$libdir" -+ if test -n "$lib_nss"; then -+ libdirs="$libdirs -lnss${major_version}" -+ fi -+ if test -n "$lib_nssutil"; then -+ libdirs="$libdirs -lnssutil${major_version}" -+ fi -+ if test -n "$lib_smime"; then -+ libdirs="$libdirs -lsmime${major_version}" -+ fi -+ if test -n "$lib_ssl"; then -+ libdirs="$libdirs -lssl${major_version}" -+ fi -+ if test -n "$lib_softokn"; then -+ libdirs="$libdirs -lsoftokn${major_version}" -+ fi -+ echo $libdirs -+fi -diff --git a/config/nss.pc.in b/config/nss.pc.in -new file mode 100644 -index 0000000..c8c263d ---- /dev/null -+++ b/config/nss.pc.in -@@ -0,0 +1,11 @@ -+prefix=@prefix@ -+exec_prefix=@exec_prefix@ -+libdir=@libdir@ -+includedir=@includedir@ -+ -+Name: NSS -+Description: Network Security Services -+Version: @NSS_MAJOR_VERSION@.@NSS_MINOR_VERSION@.@NSS_PATCH_VERSION@ -+Requires: nspr >= @NSS_NSPR_MINIMUM@ -+Libs: -L@libdir@ -lnss@NSS_MAJOR_VERSION@ -lnssutil@NSS_MAJOR_VERSION@ -lsmime@NSS_MAJOR_VERSION@ -lssl@NSS_MAJOR_VERSION@ -lsoftokn@NSS_MAJOR_VERSION@ -+Cflags: -I${includedir} -diff --git a/manifest.mn b/manifest.mn -index fbc420a..b983d88 100644 ---- a/manifest.mn -+++ b/manifest.mn -@@ -10,7 +10,7 @@ IMPORTS = nspr20/v4.8 \ - - RELEASE = nss - --DIRS = coreconf lib cmd cpputil gtests -+DIRS = coreconf lib cmd cpputil gtests config - - HAVE_ALL_TARGET := 1 - --- -2.36.0 diff --git a/patches/nyancat/nyancat.patch b/patches/nyancat/nyancat.patch deleted file mode 100644 index abe6dc4956d..00000000000 --- a/patches/nyancat/nyancat.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 040f0506e6ba7093bd12a7c89fb90f99a67ad33d Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Thu, 23 Dec 2021 12:17:11 +1100 -Subject: [PATCH] targets: add aero target port - -Signed-off-by: Andy-Python-Programmer ---- - .vscode/settings.json | 6 ++++++ - src/nyancat.c | 2 -- - 2 files changed, 6 insertions(+), 2 deletions(-) - create mode 100644 .vscode/settings.json - -diff --git a/.vscode/settings.json b/.vscode/settings.json -new file mode 100644 -index 0000000..b5431d3 ---- /dev/null -+++ b/.vscode/settings.json -@@ -0,0 +1,6 @@ -+{ -+ "editor.formatOnSave": false, -+ "files.associations": { -+ "termios.h": "c" -+ }, -+} -\ No newline at end of file -diff --git a/src/nyancat.c b/src/nyancat.c -index 537225c..af77e5b 100644 ---- a/src/nyancat.c -+++ b/src/nyancat.c -@@ -67,9 +67,7 @@ - - #include - --#ifndef TIOCGWINSZ - #include --#endif - - #ifdef ECHO - #undef ECHO --- -2.25.1 - diff --git a/patches/openssl/0001-openssl-aero-specific-changes.patch b/patches/openssl/jinx-working-patch.patch similarity index 58% rename from patches/openssl/0001-openssl-aero-specific-changes.patch rename to patches/openssl/jinx-working-patch.patch index 46029c9a7f0..8f76a3937b7 100644 --- a/patches/openssl/0001-openssl-aero-specific-changes.patch +++ b/patches/openssl/jinx-working-patch.patch @@ -1,45 +1,20 @@ -From 1ddd02965f0a65b5c59e8b152229b2b88517ae2b Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Tue, 28 Jun 2022 17:33:52 +1000 -Subject: [PATCH] openssl: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - .gitignore | 3 +++ - Configurations/10-main.conf | 33 +++++++++++++++++++++++++++++++++ - Configure | 15 +-------------- - apps/speed.c | 2 ++ - test/rsa_complex.c | 4 +++- - 5 files changed, 42 insertions(+), 15 deletions(-) - -diff --git a/.gitignore b/.gitignore -index b7bee656..673368bd 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -184,3 +184,6 @@ pod2htmd.tmp - # Windows manifest files - *.manifest - doc-nits -+ -+# editor configs: -+.vscode -diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf -index 8ca8235e..414fe92b 100644 ---- a/Configurations/10-main.conf -+++ b/Configurations/10-main.conf -@@ -918,6 +918,39 @@ my %targets = ( +diff --git openssl-clean/Configurations/10-main.conf openssl-workdir/Configurations/10-main.conf +index f815a09..d403653 100644 +--- openssl-clean/Configurations/10-main.conf ++++ openssl-workdir/Configurations/10-main.conf +@@ -925,6 +925,40 @@ my %targets = ( ranlib => "true", }, -+#### Aero ++#### Aero + "aero-generic64" => { + inherit_from => [ "BASE_unix" ], + CFLAGS => picker(default => "-Wall", -+ debug => "-O0 -g", -+ release => "-O3"), ++ debug => "-O0 -g", ++ release => "-O3"), + CXXFLAGS => picker(default => "-Wall", -+ debug => "-O0 -g", -+ release => "-O3"), ++ debug => "-O0 -g", ++ release => "-O3"), + cxxflags => add("-std=c++11"), + lib_cppflags => combine("-DOPENSSL_USE_NODELETE", "-DL_ENDIAN"), + bn_ops => "SIXTY_FOUR_BIT_LONG RC4_CHAR", @@ -52,25 +27,26 @@ index 8ca8235e..414fe92b 100644 + }, + + # This breaks the usual configuration naming convention but it's more -+ # convenient for us, since it matches the target triples. ++ # convenient for us, since it matches the target triples + + "x86_64-aero" => { + inherit_from => [ "aero-generic64", asm("x86_64_asm") ], + perlasm_scheme => "elf", + + # Configure doesn't want to play nice and passes "--cross-compile-suffix" -+ # on to the GCC invocation. ++ # on to the GCC invocation + CC => "x86_64-aero-gcc", + CXX => "x86_64-aero-g++", ++ + }, + #### *BSD "BSD-generic32" => { # As for thread cflag. Idea is to maintain "collective" set of -diff --git a/Configure b/Configure -index 4bea49d7..964793fe 100755 ---- a/Configure -+++ b/Configure +diff --git openssl-clean/Configure openssl-workdir/Configure +index 78cc15d..2d3fb3e 100755 +--- openssl-clean/Configure ++++ openssl-workdir/Configure @@ -1549,20 +1549,7 @@ unless ($disabled{"crypto-mdebug-backtrace"}) unless ($disabled{afalgeng}) { $config{afalgeng}=""; @@ -93,10 +69,10 @@ index 4bea49d7..964793fe 100755 } else { disable('not-linux', 'afalgeng'); } -diff --git a/apps/speed.c b/apps/speed.c -index 89bf1848..74322241 100644 ---- a/apps/speed.c -+++ b/apps/speed.c +diff --git openssl-clean/apps/speed.c openssl-workdir/apps/speed.c +index 89bf184..7432224 100644 +--- openssl-clean/apps/speed.c ++++ openssl-workdir/apps/speed.c @@ -113,6 +113,8 @@ # define NO_FORK #endif @@ -106,21 +82,33 @@ index 89bf1848..74322241 100644 #define MAX_MISALIGNMENT 63 #define MAX_ECDH_SIZE 256 #define MISALIGN 64 -diff --git a/test/rsa_complex.c b/test/rsa_complex.c -index fac58125..4c7aeeef 100644 ---- a/test/rsa_complex.c -+++ b/test/rsa_complex.c +diff --git openssl-clean/crypto/mem_sec.c openssl-workdir/crypto/mem_sec.c +index 222c786..edb5192 100644 +--- openssl-clean/crypto/mem_sec.c ++++ openssl-workdir/crypto/mem_sec.c +@@ -492,8 +492,10 @@ static int sh_init(size_t size, int minsize) + ret = 2; + #endif + #ifdef MADV_DONTDUMP ++/* + if (madvise(sh.arena, sh.arena_size, MADV_DONTDUMP) < 0) + ret = 2; ++*/ + #endif + + return ret; +diff --git openssl-clean/test/rsa_complex.c openssl-workdir/test/rsa_complex.c +index fac5812..a23670d 100644 +--- openssl-clean/test/rsa_complex.c ++++ openssl-workdir/test/rsa_complex.c @@ -14,7 +14,9 @@ */ #if defined(__STDC_VERSION__) # if __STDC_VERSION__ >= 199901L -# include -+# if !defined(__aero) ++# if !defined(__aero__) +# include +# endif # endif #endif #include --- -2.25.1 - diff --git a/patches/python/python.patch b/patches/python/python.patch deleted file mode 100644 index b30d30cddac..00000000000 --- a/patches/python/python.patch +++ /dev/null @@ -1,81 +0,0 @@ -From d413109d47cba4c05c48ff959850bef39bd1630e Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 2 Jan 2022 13:01:40 +1100 -Subject: [PATCH] config: add aero target - -Signed-off-by: Andy-Python-Programmer ---- - config.sub | 2 +- - configure.ac | 15 ++++++++++++++- - 2 files changed, 15 insertions(+), 2 deletions(-) - -diff --git a/config.sub b/config.sub -index ba37cf9..cea962e 100755 ---- a/config.sub -+++ b/config.sub -@@ -1394,7 +1394,7 @@ case $os in - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ - | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ -- | -midnightbsd*) -+ | -midnightbsd* | -aero*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) -diff --git a/configure.ac b/configure.ac -index e57ef7c..d686b36 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -379,6 +379,9 @@ then - *-*-cygwin*) - ac_sys_system=Cygwin - ;; -+ *-*-aero*) -+ ac_sys_system=Aero -+ ;; - *-*-vxworks*) - ac_sys_system=VxWorks - ;; -@@ -431,6 +434,9 @@ if test "$cross_compiling" = yes; then - *-*-vxworks*) - _host_cpu=$host_cpu - ;; -+ *-*-aero*) -+ _host_cpu=$host_cpu -+ ;; - *) - # for now, limit cross builds to known configurations - MACHDEP="unknown" -@@ -2641,6 +2647,9 @@ then - CYGWIN*) - LDSHARED="gcc -shared -Wl,--enable-auto-image-base" - LDCXXSHARED="g++ -shared -Wl,--enable-auto-image-base";; -+ Aero*) -+ LDSHARED='$(CC) -shared' -+ LDCXXSHARED='$(CXX) -shared';; - *) LDSHARED="ld";; - esac - fi -@@ -2677,7 +2686,9 @@ then - else CCSHARED="-Kpic -belf" - fi;; - VxWorks*) -- CCSHARED="-fpic -D__SO_PICABILINUX__ -ftls-model=global-dynamic" -+ CCSHARED="-fpic -D__SO_PICABILINUX__ -ftls-model=global-dynamic";; -+ Aero*) -+ CCSHARED="-fPIC";; - esac - fi - AC_MSG_RESULT($CCSHARED) -@@ -2738,6 +2749,8 @@ then - LINKFORSHARED='-Wl,-E -N 2048K';; - VxWorks*) - LINKFORSHARED='--export-dynamic';; -+ Aero*) -+ LINKFORSHARED='-export-dynamic';; - esac - fi - AC_MSG_RESULT($LINKFORSHARED) --- -2.25.1 - diff --git a/patches/quickjs/quickjs.patch b/patches/quickjs/quickjs.patch deleted file mode 100644 index c348b716ebb..00000000000 --- a/patches/quickjs/quickjs.patch +++ /dev/null @@ -1,86 +0,0 @@ -From e6336a3d82e80205e1dd91dc08cf92e7d40393a5 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Thu, 13 Jan 2022 14:53:32 +1100 -Subject: [PATCH] aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - .vscode/settings.json | 3 +++ - qjs.c | 4 ++++ - quickjs-libc.c | 4 ++++ - quickjs.c | 4 ++++ - 4 files changed, 15 insertions(+) - create mode 100644 .vscode/settings.json - -diff --git a/.vscode/settings.json b/.vscode/settings.json -new file mode 100644 -index 0000000..560faaa ---- /dev/null -+++ b/.vscode/settings.json -@@ -0,0 +1,3 @@ -+{ -+ "editor.formatOnSave": false, -+} -\ No newline at end of file -diff --git a/qjs.c b/qjs.c -index d56b843..de8308a 100644 ---- a/qjs.c -+++ b/qjs.c -@@ -148,6 +148,8 @@ static inline size_t js_trace_malloc_usable_size(void *ptr) - return _msize(ptr); - #elif defined(EMSCRIPTEN) - return 0; -+#elif defined(__aero__) -+ return 0; // TODO: (Aero): This is totally wrong. - #elif defined(__linux__) - return malloc_usable_size(ptr); - #else -@@ -270,6 +272,8 @@ static const JSMallocFunctions trace_mf = { - (size_t (*)(const void *))_msize, - #elif defined(EMSCRIPTEN) - NULL, -+#elif defined(__aero__) -+ NULL, // TODO: (Aero): This is totally wrong. - #elif defined(__linux__) - (size_t (*)(const void *))malloc_usable_size, - #else -diff --git a/quickjs-libc.c b/quickjs-libc.c -index e180dd0..45313fd 100644 ---- a/quickjs-libc.c -+++ b/quickjs-libc.c -@@ -57,6 +57,10 @@ typedef sig_t sighandler_t; - - #endif - -+#if defined(__aero__) -+typedef void (*sighandler_t)(int); -+#endif -+ - #if !defined(_WIN32) - /* enable the os.Worker API. IT relies on POSIX threads */ - #define USE_WORKER -diff --git a/quickjs.c b/quickjs.c -index 48aeffc..8922b67 100644 ---- a/quickjs.c -+++ b/quickjs.c -@@ -1682,6 +1682,8 @@ static inline size_t js_def_malloc_usable_size(void *ptr) - return _msize(ptr); - #elif defined(EMSCRIPTEN) - return 0; -+#elif defined(__aero__) -+ return 0; // TODO: (Aero) this is totally wrong :^) - #elif defined(__linux__) - return malloc_usable_size(ptr); - #else -@@ -1756,6 +1758,8 @@ static const JSMallocFunctions def_malloc_funcs = { - (size_t (*)(const void *))_msize, - #elif defined(EMSCRIPTEN) - NULL, -+#elif defined(__aero__) -+ NULL, // TODO: (Aero) this is totally wrong :^) - #elif defined(__linux__) - (size_t (*)(const void *))malloc_usable_size, - #else --- -2.25.1 - diff --git a/patches/readline/jinx-working-patch.patch b/patches/readline/jinx-working-patch.patch new file mode 100644 index 00000000000..7de35244a74 --- /dev/null +++ b/patches/readline/jinx-working-patch.patch @@ -0,0 +1,22 @@ +diff --git readline-clean/support/shlib-install readline-workdir/support/shlib-install +index 661355d..cd7d659 100755 +--- readline-clean/support/shlib-install ++++ readline-workdir/support/shlib-install +@@ -71,7 +71,7 @@ fi + # Cygwin installs both a dll (which must go in $BINDIR) and an implicit + # link library (in $libdir) + case "$host_os" in +-hpux*|darwin*|macosx*|linux*|solaris2*) ++hpux*|darwin*|macosx*|linux*|solaris2*|aero*) + if [ -z "$uninstall" ]; then + chmod 755 ${INSTALLDIR}/${LIBNAME} + fi ;; +@@ -146,7 +146,7 @@ bsdi4*|*gnu*|darwin*|macosx*|netbsd*|mirbsd*) + fi + ;; + +-solaris2*|aix4.[2-9]*|aix[5-9]*|osf*|irix[56]*|sysv[45]*|dgux*|interix*) ++solaris2*|aix4.[2-9]*|aix[5-9]*|osf*|irix[56]*|sysv[45]*|dgux*|interix*|aero*) + # libname.so -> libname.so.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then diff --git a/patches/readline/readline.patch b/patches/readline/readline.patch deleted file mode 100644 index 0c24ca877c0..00000000000 --- a/patches/readline/readline.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 983b779d546a3e7657a46e46ec3946083420c14a Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Tue, 9 Feb 2021 22:36:49 +0100 -Subject: [PATCH] Add Aero support - -Signed-off-by: Dennis Bonke ---- - support/config.sub | 2 +- - support/shlib-install | 4 ++-- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/support/config.sub b/support/config.sub -index c874b7a..58e7639 100755 ---- a/support/config.sub -+++ b/support/config.sub -@@ -1720,7 +1720,7 @@ case $os in - | skyos* | haiku* | rdos* | toppers* | drops* | es* \ - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ -- | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*) -+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | aero*) - ;; - # This one is extra strict with allowed versions - sco3.2v2 | sco3.2v[4-9]* | sco5v6*) -diff --git a/support/shlib-install b/support/shlib-install -index 661355d..2d554f3 100755 ---- a/support/shlib-install -+++ b/support/shlib-install -@@ -71,7 +71,7 @@ fi - # Cygwin installs both a dll (which must go in $BINDIR) and an implicit - # link library (in $libdir) - case "$host_os" in --hpux*|darwin*|macosx*|linux*|solaris2*) -+hpux*|darwin*|macosx*|linux*|solaris2*|*aero*) - if [ -z "$uninstall" ]; then - chmod 755 ${INSTALLDIR}/${LIBNAME} - fi ;; -@@ -146,7 +146,7 @@ bsdi4*|*gnu*|darwin*|macosx*|netbsd*|mirbsd*) - fi - ;; - --solaris2*|aix4.[2-9]*|aix[5-9]*|osf*|irix[56]*|sysv[45]*|dgux*|interix*) -+solaris2*|aix4.[2-9]*|aix[5-9]*|osf*|irix[56]*|sysv[45]*|dgux*|interix*|*aero*) - # libname.so -> libname.so.M - ${echo} ${RM} ${INSTALLDIR}/$LINK1 - if [ -z "$uninstall" ]; then --- -2.30.0 diff --git a/patches/rust-getrandom/rust-getrandom.patch b/patches/rust-getrandom/rust-getrandom.patch deleted file mode 100644 index 9b244bc8249..00000000000 --- a/patches/rust-getrandom/rust-getrandom.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 7ffdb350f8bf10017165131c8433e8371df89754 Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Mon, 7 Aug 2023 16:07:20 +0200 -Subject: [PATCH] Add aero support - -Signed-off-by: Dennis Bonke ---- - src/lib.rs | 2 +- - src/use_file.rs | 1 + - src/util_libc.rs | 2 +- - 3 files changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/lib.rs b/src/lib.rs -index 931856f..e700572 100644 ---- a/src/lib.rs -+++ b/src/lib.rs -@@ -215,7 +215,7 @@ pub use crate::error::Error; - // The function MUST NOT ever write uninitialized bytes into `dest`, - // regardless of what value it returns. - cfg_if! { -- if #[cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix"))] { -+ if #[cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix", target_os = "aero"))] { - mod util_libc; - #[path = "use_file.rs"] mod imp; - } else if #[cfg(any(target_os = "android", target_os = "linux"))] { -diff --git a/src/use_file.rs b/src/use_file.rs -index a6ef0d2..ef9bf54 100644 ---- a/src/use_file.rs -+++ b/src/use_file.rs -@@ -33,6 +33,7 @@ const FILE_PATH: &str = "/dev/random\0"; - target_os = "haiku", - target_os = "macos", - target_os = "nto", -+ target_os = "aero", - ))] - const FILE_PATH: &str = "/dev/urandom\0"; - -diff --git a/src/util_libc.rs b/src/util_libc.rs -index de1455c..65bc1a6 100644 ---- a/src/util_libc.rs -+++ b/src/util_libc.rs -@@ -19,7 +19,7 @@ use libc::c_void; - cfg_if! { - if #[cfg(any(target_os = "netbsd", target_os = "openbsd", target_os = "android"))] { - use libc::__errno as errno_location; -- } else if #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "redox"))] { -+ } else if #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "redox", target_os = "aero"))] { - use libc::__errno_location as errno_location; - } else if #[cfg(any(target_os = "solaris", target_os = "illumos"))] { - use libc::___errno as errno_location; --- -2.42.0 - diff --git a/patches/rust-glutin/rust-glutin.patch b/patches/rust-glutin/rust-glutin.patch deleted file mode 100644 index b472d33e744..00000000000 --- a/patches/rust-glutin/rust-glutin.patch +++ /dev/null @@ -1,331 +0,0 @@ -From b9cdd46f1acb5a6dd84b08f782f1c01ea40eb23c Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 11 Dec 2022 16:27:48 +1100 -Subject: [PATCH] - ---- - glutin/Cargo.toml | 2 +- - glutin/src/api/dlloader.rs | 1 + - glutin/src/api/egl/mod.rs | 6 ++++++ - glutin/src/api/glx/mod.rs | 7 ++++++- - glutin/src/api/osmesa/mod.rs | 1 + - glutin/src/lib.rs | 16 ++++++++++------ - glutin/src/platform/mod.rs | 1 + - glutin/src/platform/unix.rs | 1 + - glutin/src/platform_impl/mod.rs | 1 + - glutin/src/platform_impl/unix/mod.rs | 1 + - glutin/src/windowed.rs | 2 ++ - glutin_egl_sys/build.rs | 1 + - glutin_egl_sys/src/lib.rs | 2 ++ - glutin_glx_sys/Cargo.toml | 2 +- - glutin_glx_sys/build.rs | 1 + - glutin_glx_sys/src/lib.rs | 1 + - 16 files changed, 37 insertions(+), 9 deletions(-) - -diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml -index ddd23ee..d3c2eac 100644 ---- a/glutin/Cargo.toml -+++ b/glutin/Cargo.toml -@@ -56,7 +56,7 @@ glutin_wgl_sys = { version = "0.1.5", path = "../glutin_wgl_sys" } - glutin_egl_sys = { version = "0.1.5", path = "../glutin_egl_sys" } - parking_lot = "0.11" - --[target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd"))'.dependencies] -+[target.'cfg(any(target_os = "linux", target_os = "aero", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd"))'.dependencies] - osmesa-sys = "0.1" - wayland-client = { version = "0.29", features = ["dlopen"], optional = true } - wayland-egl = { version = "0.29", optional = true } -diff --git a/glutin/src/api/dlloader.rs b/glutin/src/api/dlloader.rs -index 9cfba93..8b3d93e 100644 ---- a/glutin/src/api/dlloader.rs -+++ b/glutin/src/api/dlloader.rs -@@ -1,6 +1,7 @@ - #![cfg(any( - target_os = "windows", - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -diff --git a/glutin/src/api/egl/mod.rs b/glutin/src/api/egl/mod.rs -index d567678..de59a09 100644 ---- a/glutin/src/api/egl/mod.rs -+++ b/glutin/src/api/egl/mod.rs -@@ -1,6 +1,7 @@ - #![cfg(any( - target_os = "windows", - target_os = "linux", -+ target_os = "aero", - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", -@@ -121,6 +122,7 @@ use parking_lot::Mutex; - target_os = "android", - target_os = "windows", - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -@@ -773,6 +775,7 @@ pub struct ContextPrototype<'a> { - #[cfg(any( - target_os = "linux", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd", -@@ -804,6 +807,7 @@ impl<'a> ContextPrototype<'a> { - #[cfg(any( - target_os = "linux", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd", -@@ -829,6 +833,7 @@ impl<'a> ContextPrototype<'a> { - - #[cfg(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -@@ -847,6 +852,7 @@ impl<'a> ContextPrototype<'a> { - #[cfg(any( - target_os = "android", - target_os = "windows", -+ target_os = "aero", - target_os = "linux", - target_os = "dragonfly", - target_os = "freebsd", -diff --git a/glutin/src/api/glx/mod.rs b/glutin/src/api/glx/mod.rs -index 61968e6..e5876a3 100644 ---- a/glutin/src/api/glx/mod.rs -+++ b/glutin/src/api/glx/mod.rs -@@ -1,5 +1,6 @@ - #![cfg(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -@@ -409,7 +410,11 @@ impl<'a> ContextPrototype<'a> { - unsafe { - extra_functions.SwapIntervalSGI(swap_mode); - } -- } else { -+ } else if self.opengl.vsync { -+ // If vsync was not requested and it is not supported on the system, -+ // then this feature can safely be ignored. -+ // -+ // cc - return Err(CreationError::OsError( - "Couldn't find any available vsync extension".to_string(), - )); -diff --git a/glutin/src/api/osmesa/mod.rs b/glutin/src/api/osmesa/mod.rs -index 89c0765..80cc2cd 100644 ---- a/glutin/src/api/osmesa/mod.rs -+++ b/glutin/src/api/osmesa/mod.rs -@@ -1,5 +1,6 @@ - #![cfg(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -diff --git a/glutin/src/lib.rs b/glutin/src/lib.rs -index 7ee1522..ff9d6f0 100644 ---- a/glutin/src/lib.rs -+++ b/glutin/src/lib.rs -@@ -43,6 +43,7 @@ - #![cfg_attr( - not(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -@@ -56,6 +57,7 @@ - #![cfg_attr( - any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -@@ -73,6 +75,7 @@ - #[cfg(any( - target_os = "windows", - target_os = "linux", -+ target_os = "aero", - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", -@@ -298,6 +301,7 @@ pub enum CreationError { - impl CreationError { - #[cfg(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -@@ -598,16 +602,16 @@ impl Default for PixelFormatRequirements { - #[inline] - fn default() -> PixelFormatRequirements { - PixelFormatRequirements { -- hardware_accelerated: Some(true), -- color_bits: Some(24), -+ hardware_accelerated: None, -+ color_bits: None, - float_color_buffer: false, -- alpha_bits: Some(8), -- depth_bits: Some(24), -- stencil_bits: Some(8), -+ alpha_bits: None, -+ depth_bits: None, -+ stencil_bits: None, - double_buffer: None, - multisampling: None, - stereoscopy: false, -- srgb: true, -+ srgb: false, - release_behavior: ReleaseBehavior::Flush, - x11_visual_xid: None, - } -diff --git a/glutin/src/platform/mod.rs b/glutin/src/platform/mod.rs -index e508519..c83423b 100644 ---- a/glutin/src/platform/mod.rs -+++ b/glutin/src/platform/mod.rs -@@ -25,6 +25,7 @@ pub mod run_return { - target_os = "windows", - target_os = "macos", - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -diff --git a/glutin/src/platform/unix.rs b/glutin/src/platform/unix.rs -index 66aed2c..9128e23 100644 ---- a/glutin/src/platform/unix.rs -+++ b/glutin/src/platform/unix.rs -@@ -1,5 +1,6 @@ - #![cfg(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -diff --git a/glutin/src/platform_impl/mod.rs b/glutin/src/platform_impl/mod.rs -index 82affa7..7559367 100644 ---- a/glutin/src/platform_impl/mod.rs -+++ b/glutin/src/platform_impl/mod.rs -@@ -5,6 +5,7 @@ pub use self::platform_impl::*; - mod platform_impl; - #[cfg(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -diff --git a/glutin/src/platform_impl/unix/mod.rs b/glutin/src/platform_impl/unix/mod.rs -index 510ec9c..423fc85 100644 ---- a/glutin/src/platform_impl/unix/mod.rs -+++ b/glutin/src/platform_impl/unix/mod.rs -@@ -1,5 +1,6 @@ - #![cfg(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -diff --git a/glutin/src/windowed.rs b/glutin/src/windowed.rs -index b603918..00a1029 100644 ---- a/glutin/src/windowed.rs -+++ b/glutin/src/windowed.rs -@@ -57,6 +57,7 @@ pub type WindowedContext = ContextWrapper; - #[cfg_attr( - not(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -@@ -70,6 +71,7 @@ pub type WindowedContext = ContextWrapper; - any( - target_os = "linux", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd", -diff --git a/glutin_egl_sys/build.rs b/glutin_egl_sys/build.rs -index 2920f3b..6017f1d 100644 ---- a/glutin_egl_sys/build.rs -+++ b/glutin_egl_sys/build.rs -@@ -11,6 +11,7 @@ fn main() { - - if target.contains("linux") - || target.contains("dragonfly") -+ || target.contains("aero") - || target.contains("freebsd") - || target.contains("netbsd") - || target.contains("openbsd") -diff --git a/glutin_egl_sys/src/lib.rs b/glutin_egl_sys/src/lib.rs -index fac07d2..115899d 100644 ---- a/glutin_egl_sys/src/lib.rs -+++ b/glutin_egl_sys/src/lib.rs -@@ -3,6 +3,7 @@ - target_os = "linux", - target_os = "android", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd" -@@ -44,6 +45,7 @@ pub type EGLNativeWindowType = *const raw::c_void; - pub type EGLNativeWindowType = *const raw::c_void; - #[cfg(any( - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd" -diff --git a/glutin_glx_sys/Cargo.toml b/glutin_glx_sys/Cargo.toml -index a919dec..03f2d9f 100644 ---- a/glutin_glx_sys/Cargo.toml -+++ b/glutin_glx_sys/Cargo.toml -@@ -12,5 +12,5 @@ edition = "2018" - [build-dependencies] - gl_generator = "0.14" - --[target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os="dragonfly", target_os="netbsd", target_os="openbsd"))'.dependencies] -+[target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os = "aero", target_os="dragonfly", target_os="netbsd", target_os="openbsd"))'.dependencies] - x11-dl = "2.18.3" -diff --git a/glutin_glx_sys/build.rs b/glutin_glx_sys/build.rs -index 21e1cb3..dff1bfc 100644 ---- a/glutin_glx_sys/build.rs -+++ b/glutin_glx_sys/build.rs -@@ -11,6 +11,7 @@ fn main() { - - if target.contains("linux") - || target.contains("dragonfly") -+ || target.contains("aero") - || target.contains("freebsd") - || target.contains("netbsd") - || target.contains("openbsd") -diff --git a/glutin_glx_sys/src/lib.rs b/glutin_glx_sys/src/lib.rs -index fadb62a..6aa9cc2 100644 ---- a/glutin_glx_sys/src/lib.rs -+++ b/glutin_glx_sys/src/lib.rs -@@ -1,6 +1,7 @@ - #![cfg(any( - target_os = "linux", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd" --- -2.38.1 - diff --git a/patches/rust-host/jinx-working-patch.patch b/patches/rust-host/jinx-working-patch.patch new file mode 100644 index 00000000000..84643abf5f3 --- /dev/null +++ b/patches/rust-host/jinx-working-patch.patch @@ -0,0 +1,531 @@ +diff --git rust-host-clean/Cargo.toml rust-host-workdir/Cargo.toml +index 9b11ae8..2d310ce 100644 +--- rust-host-clean/Cargo.toml ++++ rust-host-workdir/Cargo.toml +@@ -110,6 +110,7 @@ object.debug = 0 + rustc-std-workspace-core = { path = 'library/rustc-std-workspace-core' } + rustc-std-workspace-alloc = { path = 'library/rustc-std-workspace-alloc' } + rustc-std-workspace-std = { path = 'library/rustc-std-workspace-std' } ++libc = { path = "/base_dir/sources/rust-libc" } + + [patch."https://github.com/rust-lang/rust-clippy"] + clippy_lints = { path = "src/tools/clippy/clippy_lints" } +diff --git rust-host-workdir/compiler/rustc_target/src/spec/base/aero.rs rust-host-workdir/compiler/rustc_target/src/spec/base/aero.rs +new file mode 100644 +index 0000000..1237a43 +--- /dev/null ++++ rust-host-workdir/compiler/rustc_target/src/spec/base/aero.rs +@@ -0,0 +1,34 @@ ++use crate::spec::{cvs, LinkArgs, LinkerFlavor, RelroLevel, TargetOptions, Cc, Lld}; ++ ++pub fn opts() -> TargetOptions { ++ let mut args = LinkArgs::new(); ++ args.insert( ++ LinkerFlavor::Gnu(Cc::Yes, Lld::No), ++ vec![ ++ // We want to be able to strip as much executable code as possible ++ // from the linker command line, and this flag indicates to the ++ // linker that it can avoid linking in dynamic libraries that don't ++ // actually satisfy any symbols up to that point (as with many other ++ // resolutions the linker does). This option only applies to all ++ // following libraries so we're sure to pass it as one of the first ++ // arguments. ++ "-Wl,--as-needed".into(), ++ // Always enable NX protection when it is available ++ "-Wl,-z,noexecstack".into(), ++ ], ++ ); ++ ++ TargetOptions { ++ os: "aero".into(), ++ dynamic_linking: true, ++ executables: true, ++ families: cvs!["unix"], ++ has_rpath: true, ++ pre_link_args: args, ++ position_independent_executables: true, ++ relro_level: RelroLevel::Full, ++ has_thread_local: true, ++ crt_static_respected: true, ++ ..Default::default() ++ } ++} +diff --git rust-host-clean/compiler/rustc_target/src/spec/base/mod.rs rust-host-workdir/compiler/rustc_target/src/spec/base/mod.rs +index d137aaa..6f52f4a 100644 +--- rust-host-clean/compiler/rustc_target/src/spec/base/mod.rs ++++ rust-host-workdir/compiler/rustc_target/src/spec/base/mod.rs +@@ -1,3 +1,4 @@ ++pub(crate) mod aero; + pub(crate) mod aix; + pub(crate) mod android; + pub(crate) mod apple; +diff --git rust-host-clean/compiler/rustc_target/src/spec/mod.rs rust-host-workdir/compiler/rustc_target/src/spec/mod.rs +index f047994..83be01f 100644 +--- rust-host-clean/compiler/rustc_target/src/spec/mod.rs ++++ rust-host-workdir/compiler/rustc_target/src/spec/mod.rs +@@ -1556,6 +1556,8 @@ supported_targets! { + ("x86_64-fuchsia", x86_64_fuchsia), + ("x86_64-unknown-fuchsia", x86_64_unknown_fuchsia), + ++ ("x86_64-unknown-aero", x86_64_unknown_aero), ++ + ("avr-unknown-gnu-atmega328", avr_unknown_gnu_atmega328), + + ("x86_64-unknown-l4re-uclibc", x86_64_unknown_l4re_uclibc), +diff --git rust-host-workdir/compiler/rustc_target/src/spec/targets/x86_64_unknown_aero.rs rust-host-workdir/compiler/rustc_target/src/spec/targets/x86_64_unknown_aero.rs +new file mode 100644 +index 0000000..b88491e +--- /dev/null ++++ rust-host-workdir/compiler/rustc_target/src/spec/targets/x86_64_unknown_aero.rs +@@ -0,0 +1,20 @@ ++use crate::spec::{base, LinkerFlavor, StackProbeType, Target, Cc, Lld}; ++ ++pub fn target() -> Target { ++ let mut base = base::aero::opts(); ++ base.cpu = "x86-64".into(); ++ base.max_atomic_width = Some(64); ++ base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); ++ // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. ++ base.stack_probes = StackProbeType::Call; ++ ++ Target { ++ // Should we use "aero" or "aero-mlibc" here? ++ llvm_target: "x86_64-aero".into(), ++ pointer_width: 64, ++ data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" ++ .into(), ++ arch: "x86_64".into(), ++ options: base, ++ } ++} +diff --git rust-host-clean/library/std/build.rs rust-host-workdir/library/std/build.rs +index ad0a82e..14488d7 100644 +--- rust-host-clean/library/std/build.rs ++++ rust-host-workdir/library/std/build.rs +@@ -4,6 +4,7 @@ fn main() { + println!("cargo:rerun-if-changed=build.rs"); + let target = env::var("TARGET").expect("TARGET was not set"); + if target.contains("linux") ++ || target.contains("aero") + || target.contains("netbsd") + || target.contains("dragonfly") + || target.contains("openbsd") +diff --git rust-host-workdir/library/std/src/os/aero/fs.rs rust-host-workdir/library/std/src/os/aero/fs.rs +new file mode 100644 +index 0000000..a3c953c +--- /dev/null ++++ rust-host-workdir/library/std/src/os/aero/fs.rs +@@ -0,0 +1,144 @@ ++#![stable(feature = "raw_ext", since = "1.1.0")] ++ ++use crate::fs::Metadata; ++use crate::sys_common::AsInner; ++ ++#[allow(deprecated)] ++use crate::os::aero::raw; ++ ++/// OS-specific extensions to [`fs::Metadata`]. ++/// ++/// [`fs::Metadata`]: crate::fs::Metadata ++#[stable(feature = "metadata_ext", since = "1.1.0")] ++pub trait MetadataExt { ++ /// Gain a reference to the underlying `stat` structure which contains ++ /// the raw information returned by the OS. ++ /// ++ /// The contents of the returned `stat` are **not** consistent across ++ /// Unix platforms. The `os::unix::fs::MetadataExt` trait contains the ++ /// cross-Unix abstractions contained within the raw stat. ++ #[stable(feature = "metadata_ext", since = "1.1.0")] ++ #[deprecated(since = "1.8.0", note = "other methods of this trait are now preferred")] ++ #[allow(deprecated)] ++ fn as_raw_stat(&self) -> &raw::stat; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_dev(&self) -> u64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_ino(&self) -> u64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_mode(&self) -> u32; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_nlink(&self) -> u64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_uid(&self) -> u32; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_gid(&self) -> u32; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_rdev(&self) -> u64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_size(&self) -> u64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_atime(&self) -> i64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_atime_nsec(&self) -> i64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_mtime(&self) -> i64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_mtime_nsec(&self) -> i64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_ctime(&self) -> i64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_ctime_nsec(&self) -> i64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_blksize(&self) -> u64; ++ ++ #[stable(feature = "metadata_ext2", since = "1.8.0")] ++ fn st_blocks(&self) -> u64; ++} ++ ++#[stable(feature = "metadata_ext", since = "1.1.0")] ++impl MetadataExt for Metadata { ++ #[allow(deprecated)] ++ fn as_raw_stat(&self) -> &raw::stat { ++ unsafe { &*(self.as_inner().as_inner() as *const libc::stat as *const raw::stat) } ++ } ++ ++ fn st_dev(&self) -> u64 { ++ self.as_inner().as_inner().st_dev as u64 ++ } ++ ++ fn st_ino(&self) -> u64 { ++ self.as_inner().as_inner().st_ino as u64 ++ } ++ ++ fn st_mode(&self) -> u32 { ++ self.as_inner().as_inner().st_mode as u32 ++ } ++ ++ fn st_nlink(&self) -> u64 { ++ self.as_inner().as_inner().st_nlink as u64 ++ } ++ ++ fn st_uid(&self) -> u32 { ++ self.as_inner().as_inner().st_uid as u32 ++ } ++ ++ fn st_gid(&self) -> u32 { ++ self.as_inner().as_inner().st_gid as u32 ++ } ++ ++ fn st_rdev(&self) -> u64 { ++ self.as_inner().as_inner().st_rdev as u64 ++ } ++ ++ fn st_size(&self) -> u64 { ++ self.as_inner().as_inner().st_size as u64 ++ } ++ ++ fn st_atime(&self) -> i64 { ++ self.as_inner().as_inner().st_atime as i64 ++ } ++ ++ fn st_atime_nsec(&self) -> i64 { ++ self.as_inner().as_inner().st_atime_nsec as i64 ++ } ++ ++ fn st_mtime(&self) -> i64 { ++ self.as_inner().as_inner().st_mtime as i64 ++ } ++ ++ fn st_mtime_nsec(&self) -> i64 { ++ self.as_inner().as_inner().st_mtime_nsec as i64 ++ } ++ ++ fn st_ctime(&self) -> i64 { ++ self.as_inner().as_inner().st_ctime as i64 ++ } ++ ++ fn st_ctime_nsec(&self) -> i64 { ++ self.as_inner().as_inner().st_ctime_nsec as i64 ++ } ++ ++ fn st_blksize(&self) -> u64 { ++ self.as_inner().as_inner().st_blksize as u64 ++ } ++ ++ fn st_blocks(&self) -> u64 { ++ self.as_inner().as_inner().st_blocks as u64 ++ } ++} +diff --git rust-host-workdir/library/std/src/os/aero/mod.rs rust-host-workdir/library/std/src/os/aero/mod.rs +new file mode 100644 +index 0000000..ea3291a +--- /dev/null ++++ rust-host-workdir/library/std/src/os/aero/mod.rs +@@ -0,0 +1,6 @@ ++//! Aero-specific definitions ++ ++#![stable(feature = "raw_ext", since = "1.1.0")] ++ ++pub mod fs; ++pub mod raw; +diff --git rust-host-workdir/library/std/src/os/aero/raw.rs rust-host-workdir/library/std/src/os/aero/raw.rs +new file mode 100644 +index 0000000..0569409 +--- /dev/null ++++ rust-host-workdir/library/std/src/os/aero/raw.rs +@@ -0,0 +1,76 @@ ++//! Aero-specific raw type definitions ++ ++#![stable(feature = "raw_ext", since = "1.1.0")] ++#![deprecated( ++ since = "1.8.0", ++ note = "these type aliases are no longer supported by \ ++ the standard library, the `libc` crate on \ ++ crates.io should be used instead for the correct \ ++ definitions" ++)] ++#![allow(deprecated)] ++ ++#[stable(feature = "pthread_t", since = "1.8.0")] ++pub type pthread_t = usize; // TODO: This is completely wrong tbh ++ ++#[stable(feature = "raw_ext", since = "1.1.0")] ++pub type dev_t = libc::dev_t; ++ ++#[stable(feature = "raw_ext", since = "1.1.0")] ++pub type ino_t = libc::ino_t; ++ ++#[stable(feature = "raw_ext", since = "1.1.0")] ++pub type mode_t = libc::mode_t; ++ ++#[stable(feature = "raw_ext", since = "1.1.0")] ++pub type nlink_t = libc::nlink_t; ++ ++#[stable(feature = "raw_ext", since = "1.1.0")] ++pub type off_t = libc::off_t; ++ ++#[stable(feature = "raw_ext", since = "1.1.0")] ++pub type time_t = libc::time_t; ++ ++#[stable(feature = "raw_ext", since = "1.1.0")] ++pub type blkcnt_t = libc::blkcnt_t; ++ ++#[stable(feature = "raw_ext", since = "1.1.0")] ++pub type blksize_t = libc::blksize_t; ++ ++#[repr(C)] ++#[derive(Clone)] ++#[stable(feature = "raw_ext", since = "1.1.0")] ++pub struct stat { ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_dev: libc::dev_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_ino: libc::ino_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_mode: libc::mode_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_nlink: libc::nlink_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_uid: libc::uid_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_gid: libc::gid_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_rdev: libc::dev_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_size: libc::off_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_atime: libc::time_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_atime_nsec: libc::c_long, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_mtime: libc::time_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_mtime_nsec: libc::c_long, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_ctime: libc::time_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_ctime_nsec: libc::c_long, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_blksize: libc::blksize_t, ++ #[stable(feature = "raw_ext", since = "1.1.0")] ++ pub st_blocks: libc::blkcnt_t, ++} +diff --git rust-host-clean/library/std/src/os/mod.rs rust-host-workdir/library/std/src/os/mod.rs +index 6e11b92..96ba192 100644 +--- rust-host-clean/library/std/src/os/mod.rs ++++ rust-host-workdir/library/std/src/os/mod.rs +@@ -113,6 +113,8 @@ pub mod fortanix_sgx; + pub mod freebsd; + #[cfg(target_os = "fuchsia")] + pub mod fuchsia; ++#[cfg(target_os = "aero")] ++pub mod aero; + #[cfg(target_os = "haiku")] + pub mod haiku; + #[cfg(target_os = "hermit")] +diff --git rust-host-clean/library/std/src/os/unix/mod.rs rust-host-workdir/library/std/src/os/unix/mod.rs +index 5ba8719..21d5e8d 100644 +--- rust-host-clean/library/std/src/os/unix/mod.rs ++++ rust-host-workdir/library/std/src/os/unix/mod.rs +@@ -37,6 +37,8 @@ use crate::os::linux as platform; + + #[cfg(not(doc))] + mod platform { ++ #[cfg(target_os = "aero")] ++ pub use crate::os::aero::*; + #[cfg(target_os = "aix")] + pub use crate::os::aix::*; + #[cfg(target_os = "android")] +@@ -95,7 +97,11 @@ pub mod process; + pub mod raw; + pub mod thread; + +-#[unstable(feature = "peer_credentials_unix_socket", issue = "42839", reason = "unstable")] ++#[unstable( ++ feature = "peer_credentials_unix_socket", ++ issue = "42839", ++ reason = "unstable" ++)] + #[cfg(any( + target_os = "android", + target_os = "linux", +diff --git rust-host-clean/library/std/src/sys/unix/args.rs rust-host-workdir/library/std/src/sys/unix/args.rs +index 2da17fa..a1bdb2c 100644 +--- rust-host-clean/library/std/src/sys/unix/args.rs ++++ rust-host-workdir/library/std/src/sys/unix/args.rs +@@ -73,6 +73,7 @@ impl DoubleEndedIterator for Args { + target_os = "aix", + target_os = "nto", + target_os = "hurd", ++ target_os = "aero", + ))] + mod imp { + use super::Args; +diff --git rust-host-clean/library/std/src/sys/unix/env.rs rust-host-workdir/library/std/src/sys/unix/env.rs +index 3bb492f..1a680fa 100644 +--- rust-host-clean/library/std/src/sys/unix/env.rs ++++ rust-host-workdir/library/std/src/sys/unix/env.rs +@@ -1,3 +1,14 @@ ++#[cfg(target_os = "aero")] ++pub mod os { ++ pub const FAMILY: &str = "unix"; ++ pub const OS: &str = "aero"; ++ pub const DLL_PREFIX: &str = "lib"; ++ pub const DLL_SUFFIX: &str = ".so"; ++ pub const DLL_EXTENSION: &str = ""; ++ pub const EXE_SUFFIX: &str = ""; ++ pub const EXE_EXTENSION: &str = ""; ++} ++ + #[cfg(target_os = "linux")] + pub mod os { + pub const FAMILY: &str = "unix"; +diff --git rust-host-clean/library/std/src/sys/unix/fs.rs rust-host-workdir/library/std/src/sys/unix/fs.rs +index 40eb910..994558c 100644 +--- rust-host-clean/library/std/src/sys/unix/fs.rs ++++ rust-host-workdir/library/std/src/sys/unix/fs.rs +@@ -954,6 +954,7 @@ impl DirEntry { + target_os = "aix", + target_os = "nto", + target_os = "hurd", ++ target_os = "aero", + ))] + pub fn ino(&self) -> u64 { + self.entry.d_ino as u64 +diff --git rust-host-clean/library/std/src/sys/unix/os.rs rust-host-workdir/library/std/src/sys/unix/os.rs +index dc3c037..0b405a8 100644 +--- rust-host-clean/library/std/src/sys/unix/os.rs ++++ rust-host-workdir/library/std/src/sys/unix/os.rs +@@ -40,7 +40,7 @@ cfg_if::cfg_if! { + } + + extern "C" { +- #[cfg(not(any(target_os = "dragonfly", target_os = "vxworks")))] ++ #[cfg(not(any(target_os = "dragonfly", target_os = "vxworks", target_os = "aero")))] + #[cfg_attr( + any( + target_os = "linux", +@@ -79,18 +79,46 @@ extern "C" { + } + + /// Returns the platform-specific value of errno +-#[cfg(not(any(target_os = "dragonfly", target_os = "vxworks")))] ++#[cfg(not(any(target_os = "dragonfly", target_os = "vxworks", target_os = "aero")))] + pub fn errno() -> i32 { + unsafe { (*errno_location()) as i32 } + } + + /// Sets the platform-specific value of errno +-#[cfg(all(not(target_os = "dragonfly"), not(target_os = "vxworks")))] // needed for readdir and syscall! ++#[cfg(all(not(target_os = "dragonfly"), not(target_os = "vxworks"), not(target_os = "aero")))] // needed for readdir and syscall! + #[allow(dead_code)] // but not all target cfgs actually end up using it + pub fn set_errno(e: i32) { + unsafe { *errno_location() = e as c_int } + } + ++#[cfg(target_os = "aero")] ++pub fn errno() -> i32 { ++ extern "C" { ++ #[thread_local] ++ static __mlibc_errno: c_int; ++ } ++ ++ unsafe { __mlibc_errno as i32 } ++} ++ ++#[cfg(target_os = "aero")] ++#[allow(dead_code)] ++pub fn set_errno(e: i32) { ++ extern "C" { ++ #[thread_local] ++ static mut __mlibc_errno: c_int; ++ } ++ ++ unsafe { ++ __mlibc_errno = e; ++ } ++} ++ ++#[cfg(target_os = "aero")] ++pub fn current_exe() -> io::Result { ++ unimplemented!() ++} ++ + #[cfg(target_os = "vxworks")] + pub fn errno() -> i32 { + unsafe { libc::errnoGet() } +diff --git rust-host-clean/library/std/src/sys/unix/thread.rs rust-host-workdir/library/std/src/sys/unix/thread.rs +index 29db946..d8b595d 100644 +--- rust-host-clean/library/std/src/sys/unix/thread.rs ++++ rust-host-workdir/library/std/src/sys/unix/thread.rs +@@ -116,6 +116,13 @@ impl Thread { + debug_assert_eq!(ret, 0); + } + ++ #[cfg(target_os = "aero")] ++ pub fn set_name(name: &CStr) { ++ unsafe { ++ libc::pthread_setname_np(libc::pthread_self(), name.as_ptr()); ++ } ++ } ++ + #[cfg(target_os = "android")] + pub fn set_name(name: &CStr) { + const PR_SET_NAME: libc::c_int = 15; +diff --git rust-host-clean/library/std/src/sys/unix/thread_local_dtor.rs rust-host-workdir/library/std/src/sys/unix/thread_local_dtor.rs +index 06399e8..297032e 100644 +--- rust-host-clean/library/std/src/sys/unix/thread_local_dtor.rs ++++ rust-host-workdir/library/std/src/sys/unix/thread_local_dtor.rs +@@ -12,7 +12,7 @@ + // compiling from a newer linux to an older linux, so we also have a + // fallback implementation to use as well. + #[allow(unexpected_cfgs)] +-#[cfg(any(target_os = "linux", target_os = "fuchsia", target_os = "redox", target_os = "hurd"))] ++#[cfg(any(target_os = "linux", target_os = "fuchsia", target_os = "redox", target_os = "hurd", target_os = "aero"))] + // FIXME: The Rust compiler currently omits weakly function definitions (i.e., + // __cxa_thread_atexit_impl) and its metadata from LLVM IR. + #[no_sanitize(cfi, kcfi)] diff --git a/patches/rust-libloading/rust-libloading.patch b/patches/rust-libloading/rust-libloading.patch deleted file mode 100644 index ac3ec05e6f1..00000000000 --- a/patches/rust-libloading/rust-libloading.patch +++ /dev/null @@ -1,50 +0,0 @@ -From f5fab150ee8fbfdef46888837b6e6d43fd3ec1c0 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 13:39:51 +1100 -Subject: [PATCH] - ---- - src/os/unix/consts.rs | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/src/os/unix/consts.rs b/src/os/unix/consts.rs -index dbe4df9..fbdd2e3 100644 ---- a/src/os/unix/consts.rs -+++ b/src/os/unix/consts.rs -@@ -58,7 +58,7 @@ mod posix { - use self::cfg_if::cfg_if; - use super::c_int; - cfg_if! { -- if #[cfg(target_os = "haiku")] { -+ if #[cfg(any(target_os = "haiku", target_os = "aero"))] { - pub(super) const RTLD_LAZY: c_int = 0; - } else if #[cfg(any( - target_os = "linux", -@@ -90,7 +90,7 @@ mod posix { - } - - cfg_if! { -- if #[cfg(target_os = "haiku")] { -+ if #[cfg(any(target_os = "haiku", target_os = "aero"))] { - pub(super) const RTLD_NOW: c_int = 1; - } else if #[cfg(any( - target_os = "linux", -@@ -126,6 +126,7 @@ mod posix { - cfg_if! { - if #[cfg(any( - target_os = "haiku", -+ target_os = "aero", - all(target_os = "android",target_pointer_width = "32"), - ))] { - pub(super) const RTLD_GLOBAL: c_int = 2; -@@ -193,6 +194,7 @@ mod posix { - - target_os = "fuchsia", - target_os = "redox", -+ target_os = "aero", - ))] { - pub(super) const RTLD_LOCAL: c_int = 0; - } else { --- -2.38.1 - diff --git a/patches/rust-mio-0.6/rust-mio-0.6.patch b/patches/rust-mio-0.6/rust-mio-0.6.patch deleted file mode 100644 index 7b37510c61e..00000000000 --- a/patches/rust-mio-0.6/rust-mio-0.6.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 1459849ab415fe1e9459b108a2908c22c8b1c029 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 13:08:41 +1100 -Subject: [PATCH] - ---- - src/event_imp.rs | 10 ++++++---- - src/sys/unix/mod.rs | 2 ++ - src/sys/unix/ready.rs | 7 +++++-- - 3 files changed, 13 insertions(+), 6 deletions(-) - -diff --git a/src/event_imp.rs b/src/event_imp.rs -index f93e1fd..0109f74 100644 ---- a/src/event_imp.rs -+++ b/src/event_imp.rs -@@ -512,8 +512,9 @@ impl ops::Sub for PollOpt { - } - } - --#[deprecated(since = "0.6.10", note = "removed")] --#[cfg(feature = "with-deprecated")] -+// Hack: causes errors for us since this isn't upstream. -+// #[deprecated(since = "0.6.10", note = "removed")] -+// #[cfg(feature = "with-deprecated")] - #[doc(hidden)] - impl ops::Not for PollOpt { - type Output = PollOpt; -@@ -999,8 +1000,9 @@ impl> ops::SubAssign for Ready { - } - } - --#[deprecated(since = "0.6.10", note = "removed")] --#[cfg(feature = "with-deprecated")] -+// Hack: causes errors for us since this isn't upstream. -+// #[deprecated(since = "0.6.10", note = "removed")] -+// #[cfg(feature = "with-deprecated")] - #[doc(hidden)] - impl ops::Not for Ready { - type Output = Ready; -diff --git a/src/sys/unix/mod.rs b/src/sys/unix/mod.rs -index c5726c0..b702d35 100644 ---- a/src/sys/unix/mod.rs -+++ b/src/sys/unix/mod.rs -@@ -6,6 +6,7 @@ pub mod dlsym; - #[cfg(any( - target_os = "android", - target_os = "illumos", -+ target_os = "aero", - target_os = "linux", - target_os = "solaris" - ))] -@@ -14,6 +15,7 @@ mod epoll; - #[cfg(any( - target_os = "android", - target_os = "illumos", -+ target_os = "aero", - target_os = "linux", - target_os = "solaris" - ))] -diff --git a/src/sys/unix/ready.rs b/src/sys/unix/ready.rs -index ef90147..50237e0 100644 ---- a/src/sys/unix/ready.rs -+++ b/src/sys/unix/ready.rs -@@ -276,6 +276,7 @@ impl UnixReady { - #[cfg(any( - target_os = "android", - target_os = "illumos", -+ target_os = "aero", - target_os = "linux", - target_os = "solaris" - ))] -@@ -407,6 +408,7 @@ impl UnixReady { - #[cfg(any( - target_os = "android", - target_os = "illumos", -+ target_os = "aero", - target_os = "linux", - target_os = "solaris" - ))] -@@ -477,8 +479,9 @@ impl ops::Sub for UnixReady { - } - } - --#[deprecated(since = "0.6.10", note = "removed")] --#[cfg(feature = "with-deprecated")] -+// Hack: causes errors for us since this isn't upstream. -+// #[deprecated(since = "0.6.10", note = "removed")] -+// #[cfg(feature = "with-deprecated")] - #[doc(hidden)] - impl ops::Not for UnixReady { - type Output = UnixReady; --- -2.38.1 - diff --git a/patches/rust-mio-0.8/rust-mio-0.8.patch b/patches/rust-mio-0.8/rust-mio-0.8.patch deleted file mode 100644 index e148c6f788f..00000000000 --- a/patches/rust-mio-0.8/rust-mio-0.8.patch +++ /dev/null @@ -1,73 +0,0 @@ -From de6c2d83e3db2040ca4933ca97006f1c2ad82a64 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 12:29:48 +1100 -Subject: [PATCH] - ---- - src/sys/unix/pipe.rs | 2 ++ - src/sys/unix/selector/mod.rs | 2 ++ - src/sys/unix/waker.rs | 4 ++-- - 3 files changed, 6 insertions(+), 2 deletions(-) - -diff --git a/src/sys/unix/pipe.rs b/src/sys/unix/pipe.rs -index b2865cd..df56531 100644 ---- a/src/sys/unix/pipe.rs -+++ b/src/sys/unix/pipe.rs -@@ -150,6 +150,7 @@ pub fn new() -> io::Result<(Sender, Receiver)> { - #[cfg(any( - target_os = "android", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "linux", - target_os = "netbsd", -@@ -189,6 +190,7 @@ pub fn new() -> io::Result<(Sender, Receiver)> { - target_os = "dragonfly", - target_os = "freebsd", - target_os = "linux", -+ target_os = "aero", - target_os = "netbsd", - target_os = "openbsd", - target_os = "ios", -diff --git a/src/sys/unix/selector/mod.rs b/src/sys/unix/selector/mod.rs -index 9ae4c14..cb1ce72 100644 ---- a/src/sys/unix/selector/mod.rs -+++ b/src/sys/unix/selector/mod.rs -@@ -3,6 +3,7 @@ - target_os = "illumos", - target_os = "linux", - target_os = "redox", -+ target_os = "aero", - ))] - mod epoll; - -@@ -11,6 +12,7 @@ mod epoll; - target_os = "illumos", - target_os = "linux", - target_os = "redox", -+ target_os = "aero", - ))] - pub(crate) use self::epoll::{event, Event, Events, Selector}; - -diff --git a/src/sys/unix/waker.rs b/src/sys/unix/waker.rs -index de88e31..714ac55 100644 ---- a/src/sys/unix/waker.rs -+++ b/src/sys/unix/waker.rs -@@ -1,4 +1,4 @@ --#[cfg(any(target_os = "linux", target_os = "android"))] -+#[cfg(any(target_os = "linux", target_os = "android", target_os = "aero"))] - mod eventfd { - use crate::sys::Selector; - use crate::{Interest, Token}; -@@ -58,7 +58,7 @@ mod eventfd { - } - } - --#[cfg(any(target_os = "linux", target_os = "android"))] -+#[cfg(any(target_os = "linux", target_os = "android", target_os = "aero"))] - pub use self::eventfd::Waker; - - #[cfg(any(target_os = "freebsd", target_os = "ios", target_os = "macos"))] --- -2.38.1 - diff --git a/patches/rust-nix/rust-nix.patch b/patches/rust-nix/rust-nix.patch deleted file mode 100644 index 32bf6442d21..00000000000 --- a/patches/rust-nix/rust-nix.patch +++ /dev/null @@ -1,708 +0,0 @@ -From 608f6dc307498272ec3a6317cac3bbbe2a8b74b1 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 12:21:43 +1100 -Subject: [PATCH] - ---- - src/errno.rs | 217 +++++++++++++++++++++++++++++++++++++++++ - src/lib.rs | 12 ++- - src/sys/mod.rs | 10 +- - src/sys/socket/addr.rs | 16 +-- - src/sys/socket/mod.rs | 5 +- - src/sys/termios.rs | 54 +++++++++- - src/unistd.rs | 27 +++++ - 7 files changed, 327 insertions(+), 14 deletions(-) - -diff --git a/src/errno.rs b/src/errno.rs -index 9c2dfe4..d26d63d 100644 ---- a/src/errno.rs -+++ b/src/errno.rs -@@ -22,6 +22,7 @@ cfg_if! { - } else if #[cfg(any(target_os = "linux", - target_os = "redox", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "fuchsia"))] { - unsafe fn errno_location() -> *mut c_int { - libc::__errno_location() -@@ -183,6 +184,9 @@ fn last() -> Errno { - - fn desc(errno: Errno) -> &'static str { - use self::Errno::*; -+ // TODO: This is completely broken on aero -+ #[allow(unreachable_patterns)] -+ #[allow(unused_variables)] - match errno { - UnknownErrno => "Unknown errno", - EPERM => "Operation not permitted", -@@ -1557,6 +1561,219 @@ mod consts { - } - } - -+#[cfg(target_os = "aero")] -+mod consts { -+ #[derive(Clone, Copy, Debug, Eq, PartialEq)] -+ #[repr(i32)] -+ pub enum Errno { -+ UnknownErrno = 0, -+ E2BIG = libc::E2BIG, -+ EACCES = libc::EACCES, -+ EADDRINUSE = libc::EADDRINUSE, -+ EADDRNOTAVAIL = libc::EADDRNOTAVAIL, -+ // EAFNOSUPPORT = libc::EAFNOSUPPORT, -+ EAGAIN = libc::EAGAIN, -+ // EALREADY = libc::EALREADY, -+ // EAUTH = libc::EAUTH, -+ EBADF = libc::EBADF, -+ // EBADMSG = libc::EBADMSG, -+ // EBADRPC = libc::EBADRPC, -+ // EBUSY = libc::EBUSY, -+ // ECANCELED = libc::ECANCELED, -+ // ECHILD = libc::ECHILD, -+ ECONNABORTED = libc::ECONNABORTED, -+ ECONNREFUSED = libc::ECONNREFUSED, -+ ECONNRESET = libc::ECONNRESET, -+ EDEADLK = libc::EDEADLK, -+ // EDESTADDRREQ = libc::EDESTADDRREQ, -+ // EDOM = libc::EDOM, -+ // EDQUOT = libc::EDQUOT, -+ EEXIST = libc::EEXIST, -+ // EFAULT = libc::EFAULT, -+ // EFBIG = libc::EFBIG, -+ // EFTYPE = libc::EFTYPE, -+ // EHOSTDOWN = libc::EHOSTDOWN, -+ // EHOSTUNREACH = libc::EHOSTUNREACH, -+ // EIDRM = libc::EIDRM, -+ // EILSEQ = libc::EILSEQ, -+ EINPROGRESS = libc::EINPROGRESS, -+ EINTR = libc::EINTR, -+ EINVAL = libc::EINVAL, -+ // EIO = libc::EIO, -+ // EISCONN = libc::EISCONN, -+ // EISDIR = libc::EISDIR, -+ // ELOOP = libc::ELOOP, -+ // EMFILE = libc::EMFILE, -+ // EMLINK = libc::EMLINK, -+ // EMSGSIZE = libc::EMSGSIZE, -+ // EMULTIHOP = libc::EMULTIHOP, -+ ENAMETOOLONG = libc::ENAMETOOLONG, -+ // ENEEDAUTH = libc::ENEEDAUTH, -+ // ENETDOWN = libc::ENETDOWN, -+ // ENETRESET = libc::ENETRESET, -+ // ENETUNREACH = libc::ENETUNREACH, -+ // ENFILE = libc::ENFILE, -+ // ENOATTR = libc::ENOATTR, -+ // ENOBUFS = libc::ENOBUFS, -+ // ENODATA = libc::ENODATA, -+ // ENODEV = libc::ENODEV, -+ ENOENT = libc::ENOENT, -+ // ENOEXEC = libc::ENOEXEC, -+ // ENOLCK = libc::ENOLCK, -+ // ENOLINK = libc::ENOLINK, -+ // ENOMEM = libc::ENOMEM, -+ // ENOMSG = libc::ENOMSG, -+ // ENOPROTOOPT = libc::ENOPROTOOPT, -+ // ENOSPC = libc::ENOSPC, -+ // ENOSR = libc::ENOSR, -+ // ENOSTR = libc::ENOSTR, -+ ENOSYS = libc::ENOSYS, -+ // ENOTBLK = libc::ENOTBLK, -+ ENOTCONN = libc::ENOTCONN, -+ // ENOTDIR = libc::ENOTDIR, -+ // ENOTEMPTY = libc::ENOTEMPTY, -+ // ENOTSOCK = libc::ENOTSOCK, -+ // ENOTSUP = libc::ENOTSUP, -+ ENOTTY = libc::ENOTTY, -+ // ENXIO = libc::ENXIO, -+ // EOPNOTSUPP = libc::EOPNOTSUPP, -+ // EOVERFLOW = libc::EOVERFLOW, -+ EPERM = libc::EPERM, -+ // EPFNOSUPPORT = libc::EPFNOSUPPORT, -+ EPIPE = libc::EPIPE, -+ // EPROCLIM = libc::EPROCLIM, -+ // EPROCUNAVAIL = libc::EPROCUNAVAIL, -+ // EPROGMISMATCH = libc::EPROGMISMATCH, -+ // EPROGUNAVAIL = libc::EPROGUNAVAIL, -+ EPROTO = libc::EPROTO, -+ // EPROTONOSUPPORT = libc::EPROTONOSUPPORT, -+ // EPROTOTYPE = libc::EPROTOTYPE, -+ ERANGE = libc::ERANGE, -+ // EREMOTE = libc::EREMOTE, -+ // EROFS = libc::EROFS, -+ // ERPCMISMATCH = libc::ERPCMISMATCH, -+ // ESHUTDOWN = libc::ESHUTDOWN, -+ // ESOCKTNOSUPPORT = libc::ESOCKTNOSUPPORT, -+ // ESPIPE = libc::ESPIPE, -+ // ESRCH = libc::ESRCH, -+ // ESTALE = libc::ESTALE, -+ // ETIME = libc::ETIME, -+ ETIMEDOUT = libc::ETIMEDOUT, -+ // ETOOMANYREFS = libc::ETOOMANYREFS, -+ // ETXTBSY = libc::ETXTBSY, -+ // EUSERS = libc::EUSERS, -+ // EXDEV = libc::EXDEV, -+ } -+ -+ // pub const ELAST: Errno = Errno::ENOTSUP; -+ pub const EWOULDBLOCK: Errno = Errno::EAGAIN; -+ -+ // pub const EL2NSYNC: Errno = Errno::UnknownErrno; -+ -+ pub fn from_i32(e: i32) -> Errno { -+ use self::Errno::*; -+ -+ match e { -+ // libc::E2BIG => E2BIG, -+ libc::EACCES => EACCES, -+ libc::EADDRINUSE => EADDRINUSE, -+ libc::EADDRNOTAVAIL => EADDRNOTAVAIL, -+ // libc::EAFNOSUPPORT => EAFNOSUPPORT, -+ libc::EAGAIN => EAGAIN, -+ // libc::EALREADY => EALREADY, -+ // libc::EAUTH => EAUTH, -+ libc::EBADF => EBADF, -+ // libc::EBADMSG => EBADMSG, -+ // libc::EBADRPC => EBADRPC, -+ // libc::EBUSY => EBUSY, -+ // libc::ECANCELED => ECANCELED, -+ // libc::ECHILD => ECHILD, -+ libc::ECONNABORTED => ECONNABORTED, -+ libc::ECONNREFUSED => ECONNREFUSED, -+ libc::ECONNRESET => ECONNRESET, -+ libc::EDEADLK => EDEADLK, -+ // libc::EDESTADDRREQ => EDESTADDRREQ, -+ // libc::EDOM => EDOM, -+ // libc::EDQUOT => EDQUOT, -+ libc::EEXIST => EEXIST, -+ // libc::EFAULT => EFAULT, -+ // libc::EFBIG => EFBIG, -+ // libc::EFTYPE => EFTYPE, -+ // libc::EHOSTDOWN => EHOSTDOWN, -+ // libc::EHOSTUNREACH => EHOSTUNREACH, -+ // libc::EIDRM => EIDRM, -+ // libc::EILSEQ => EILSEQ, -+ libc::EINPROGRESS => EINPROGRESS, -+ libc::EINTR => EINTR, -+ libc::EINVAL => EINVAL, -+ // libc::EIO => EIO, -+ // libc::EISCONN => EISCONN, -+ // libc::EISDIR => EISDIR, -+ // libc::ELOOP => ELOOP, -+ // libc::EMFILE => EMFILE, -+ // libc::EMLINK => EMLINK, -+ // libc::EMSGSIZE => EMSGSIZE, -+ // libc::EMULTIHOP => EMULTIHOP, -+ libc::ENAMETOOLONG => ENAMETOOLONG, -+ // libc::ENEEDAUTH => ENEEDAUTH, -+ // libc::ENETDOWN => ENETDOWN, -+ // libc::ENETRESET => ENETRESET, -+ // libc::ENETUNREACH => ENETUNREACH, -+ // libc::ENFILE => ENFILE, -+ // libc::ENOATTR => ENOATTR, -+ // libc::ENOBUFS => ENOBUFS, -+ // libc::ENODATA => ENODATA, -+ // libc::ENODEV => ENODEV, -+ libc::ENOENT => ENOENT, -+ // libc::ENOEXEC => ENOEXEC, -+ // libc::ENOLCK => ENOLCK, -+ // libc::ENOLINK => ENOLINK, -+ // libc::ENOMEM => ENOMEM, -+ // libc::ENOMSG => ENOMSG, -+ // libc::ENOPROTOOPT => ENOPROTOOPT, -+ // libc::ENOSPC => ENOSPC, -+ // libc::ENOSR => ENOSR, -+ // libc::ENOSTR => ENOSTR, -+ libc::ENOSYS => ENOSYS, -+ // libc::ENOTBLK => ENOTBLK, -+ libc::ENOTCONN => ENOTCONN, -+ // libc::ENOTDIR => ENOTDIR, -+ // libc::ENOTEMPTY => ENOTEMPTY, -+ // libc::ENOTSOCK => ENOTSOCK, -+ // libc::ENOTSUP => ENOTSUP, -+ // libc::ENOTTY => ENOTTY, -+ // libc::ENXIO => ENXIO, -+ // libc::EOPNOTSUPP => EOPNOTSUPP, -+ // libc::EOVERFLOW => EOVERFLOW, -+ libc::EPERM => EPERM, -+ // libc::EPFNOSUPPORT => EPFNOSUPPORT, -+ libc::EPIPE => EPIPE, -+ // libc::EPROCLIM => EPROCLIM, -+ // libc::EPROCUNAVAIL => EPROCUNAVAIL, -+ // libc::EPROGMISMATCH => EPROGMISMATCH, -+ // libc::EPROGUNAVAIL => EPROGUNAVAIL, -+ // libc::EPROTO => EPROTO, -+ // libc::EPROTONOSUPPORT => EPROTONOSUPPORT, -+ // libc::EPROTOTYPE => EPROTOTYPE, -+ libc::ERANGE => ERANGE, -+ // libc::EREMOTE => EREMOTE, -+ // libc::EROFS => EROFS, -+ // libc::ERPCMISMATCH => ERPCMISMATCH, -+ // libc::ESHUTDOWN => ESHUTDOWN, -+ // libc::ESOCKTNOSUPPORT => ESOCKTNOSUPPORT, -+ // libc::ESPIPE => ESPIPE, -+ // libc::ESRCH => ESRCH, -+ // libc::ESTALE => ESTALE, -+ // libc::ETIME => ETIME, -+ libc::ETIMEDOUT => ETIMEDOUT, -+ // libc::ETOOMANYREFS => ETOOMANYREFS, -+ // libc::ETXTBSY => ETXTBSY, -+ // libc::EUSERS => EUSERS, -+ // libc::EXDEV => EXDEV, -+ _ => UnknownErrno, -+ } -+ } -+} - - #[cfg(target_os = "dragonfly")] - mod consts { -diff --git a/src/lib.rs b/src/lib.rs -index 3b534a5..f7c8495 100644 ---- a/src/lib.rs -+++ b/src/lib.rs -@@ -5,12 +5,13 @@ - #![crate_name = "nix"] - #![cfg(unix)] - #![allow(non_camel_case_types)] -+#![allow(non_snake_case)] - // latest bitflags triggers a rustc bug with cross-crate macro expansions causing dead_code - // warnings even though the macro expands into something with allow(dead_code) - #![allow(dead_code)] - #![cfg_attr(test, deny(warnings))] - #![recursion_limit = "500"] --#![deny(unused)] -+// #![deny(unused)] - #![deny(unstable_features)] - #![deny(missing_copy_implementations)] - #![deny(missing_debug_implementations)] -@@ -22,11 +23,13 @@ pub use libc; - #[macro_use] mod macros; - - // Public crates --#[cfg(not(target_os = "redox"))] -+#[cfg(not(any(target_os = "redox", target_os = "aero")))] - pub mod dir; -+#[cfg(not(target_os = "aero"))] - pub mod env; - pub mod errno; - #[deny(missing_docs)] -+#[cfg(not(target_os = "aero"))] - pub mod features; - pub mod fcntl; - #[deny(missing_docs)] -@@ -54,15 +57,18 @@ pub mod mount; - target_os = "netbsd"))] - pub mod mqueue; - #[deny(missing_docs)] --#[cfg(not(target_os = "redox"))] -+#[cfg(not(any(target_os = "redox", target_os = "aero")))] - pub mod net; - #[deny(missing_docs)] -+#[cfg(not(target_os = "aero"))] - pub mod poll; - #[deny(missing_docs)] - #[cfg(not(any(target_os = "redox", target_os = "fuchsia")))] - pub mod pty; -+#[cfg(not(target_os = "aero"))] - pub mod sched; - pub mod sys; -+#[cfg(not(target_os = "aero"))] - pub mod time; - // This can be implemented for other platforms as soon as libc - // provides bindings for them. -diff --git a/src/sys/mod.rs b/src/sys/mod.rs -index 43877a1..20dd8e5 100644 ---- a/src/sys/mod.rs -+++ b/src/sys/mod.rs -@@ -6,7 +6,7 @@ - target_os = "netbsd"))] - pub mod aio; - --#[cfg(any(target_os = "android", target_os = "linux"))] -+#[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - pub mod epoll; - - #[cfg(any(target_os = "dragonfly", -@@ -42,6 +42,7 @@ pub mod mman; - #[cfg(target_os = "linux")] - pub mod personality; - -+#[cfg(not(target_os = "aero"))] - pub mod pthread; - - #[cfg(any(target_os = "android", -@@ -59,7 +60,8 @@ pub mod quota; - #[cfg(any(target_os = "linux"))] - pub mod reboot; - --#[cfg(not(target_os = "redox"))] -+// #[cfg(not(target_os = "redox"))] -+#[cfg(not(any(target_os = "redox", target_os = "aero")))] - pub mod select; - - #[cfg(any(target_os = "android", -@@ -69,6 +71,7 @@ pub mod select; - target_os = "macos"))] - pub mod sendfile; - -+#[cfg(not(target_os = "aero"))] - pub mod signal; - - #[cfg(any(target_os = "android", target_os = "linux"))] -@@ -89,6 +92,7 @@ pub mod stat; - ))] - pub mod statfs; - -+#[cfg(not(target_os = "aero"))] - pub mod statvfs; - - #[cfg(any(target_os = "android", target_os = "linux"))] -@@ -100,8 +104,10 @@ pub mod time; - - pub mod uio; - -+#[cfg(not(target_os = "aero"))] - pub mod utsname; - -+#[cfg(not(target_os = "aero"))] - pub mod wait; - - #[cfg(any(target_os = "android", target_os = "linux"))] -diff --git a/src/sys/socket/addr.rs b/src/sys/socket/addr.rs -index d486056..b367e18 100644 ---- a/src/sys/socket/addr.rs -+++ b/src/sys/socket/addr.rs -@@ -17,6 +17,7 @@ use std::os::unix::io::RawFd; - use crate::sys::socket::addr::sys_control::SysControlAddr; - #[cfg(any(target_os = "android", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "ios", - target_os = "linux", -@@ -46,6 +47,7 @@ pub enum AddressFamily { - /// Low level packet interface (see [`packet(7)`](https://man7.org/linux/man-pages/man7/packet.7.html)) - #[cfg(any(target_os = "android", - target_os = "linux", -+ target_os = "aero", - target_os = "illumos", - target_os = "fuchsia", - target_os = "solaris"))] -@@ -245,7 +247,7 @@ impl AddressFamily { - libc::AF_NETLINK => Some(AddressFamily::Netlink), - #[cfg(any(target_os = "macos", target_os = "macos"))] - libc::AF_SYSTEM => Some(AddressFamily::System), -- #[cfg(any(target_os = "android", target_os = "linux"))] -+ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - libc::AF_PACKET => Some(AddressFamily::Packet), - #[cfg(any(target_os = "dragonfly", - target_os = "freebsd", -@@ -653,6 +655,7 @@ pub enum SockAddr { - /// Datalink address (MAC) - #[cfg(any(target_os = "android", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "ios", - target_os = "linux", -@@ -705,7 +708,7 @@ impl SockAddr { - SockAddr::Alg(..) => AddressFamily::Alg, - #[cfg(any(target_os = "ios", target_os = "macos"))] - SockAddr::SysControl(..) => AddressFamily::System, -- #[cfg(any(target_os = "android", target_os = "linux"))] -+ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - SockAddr::Link(..) => AddressFamily::Packet, - #[cfg(any(target_os = "dragonfly", - target_os = "freebsd", -@@ -738,7 +741,7 @@ impl SockAddr { - if addr.is_null() { - None - } else { -- match AddressFamily::from_i32(i32::from((*addr).sa_family)) { -+ match AddressFamily::from_i32((*addr).sa_family as i32) { - Some(AddressFamily::Unix) => None, - Some(AddressFamily::Inet) => Some(SockAddr::Inet( - InetAddr::V4(*(addr as *const libc::sockaddr_in)))), -@@ -750,7 +753,7 @@ impl SockAddr { - #[cfg(any(target_os = "ios", target_os = "macos"))] - Some(AddressFamily::System) => Some(SockAddr::SysControl( - SysControlAddr(*(addr as *const libc::sockaddr_ctl)))), -- #[cfg(any(target_os = "android", target_os = "linux"))] -+ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - Some(AddressFamily::Packet) => Some(SockAddr::Link( - LinkAddr(*(addr as *const libc::sockaddr_ll)))), - #[cfg(any(target_os = "dragonfly", -@@ -833,7 +836,7 @@ impl SockAddr { - mem::size_of_val(sa) as libc::socklen_t - - ), -- #[cfg(any(target_os = "android", target_os = "linux"))] -+ #[cfg(any(target_os = "android", target_os = "linux", target_os = "aero"))] - SockAddr::Link(LinkAddr(ref addr)) => ( - // This cast is always allowed in C - unsafe { -@@ -879,6 +882,7 @@ impl fmt::Display for SockAddr { - #[cfg(any(target_os = "ios", target_os = "macos"))] - SockAddr::SysControl(ref sc) => sc.fmt(f), - #[cfg(any(target_os = "android", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "ios", -@@ -1064,7 +1068,7 @@ pub mod sys_control { - } - - --#[cfg(any(target_os = "android", target_os = "linux", target_os = "fuchsia"))] -+#[cfg(any(target_os = "android", target_os = "linux", target_os = "aero", target_os = "fuchsia"))] - mod datalink { - use super::{fmt, AddressFamily}; - -diff --git a/src/sys/socket/mod.rs b/src/sys/socket/mod.rs -index da5573c..3bac136 100644 ---- a/src/sys/socket/mod.rs -+++ b/src/sys/socket/mod.rs -@@ -251,6 +251,7 @@ libc_bitflags!{ - /// - /// Only used in [`recvmsg`](fn.recvmsg.html) function. - #[cfg(any(target_os = "android", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "linux", -@@ -866,13 +867,13 @@ impl<'a> ControlMessage<'a> { - - /// The value of CMSG_LEN on this message. - /// Safe because CMSG_LEN is always safe -- #[cfg(any(target_os = "android", -+ #[cfg(any(target_os = "android", target_os = "aero", - all(target_os = "linux", not(target_env = "musl"))))] - fn cmsg_len(&self) -> usize { - unsafe{CMSG_LEN(self.len() as libc::c_uint) as usize} - } - -- #[cfg(not(any(target_os = "android", -+ #[cfg(not(any(target_os = "android", target_os = "aero", - all(target_os = "linux", not(target_env = "musl")))))] - fn cmsg_len(&self) -> libc::c_uint { - unsafe{CMSG_LEN(self.len() as libc::c_uint)} -diff --git a/src/sys/termios.rs b/src/sys/termios.rs -index 36a3601..c7bddc3 100644 ---- a/src/sys/termios.rs -+++ b/src/sys/termios.rs -@@ -467,10 +467,19 @@ impl From for u32 { - } - - // TODO: Add TCSASOFT, which will require treating this as a bitfield. -+#[cfg(target_os = "aero")] - libc_enum! { - /// Specify when a port configuration change should occur. - /// - /// Used as an argument to `tcsetattr()` -+ #[repr(i32)] -+ pub enum SetArg { -+ TCSANOW, -+ } -+} -+ -+#[cfg(not(target_os = "aero"))] -+libc_enum! { - #[repr(i32)] - pub enum SetArg { - /// The change will occur immediately -@@ -482,10 +491,19 @@ libc_enum! { - } - } - -+#[cfg(target_os = "aero")] - libc_enum! { - /// Specify a combination of the input and output buffers to flush - /// - /// Used as an argument to `tcflush()`. -+ #[repr(i32)] -+ pub enum FlushArg { -+ TCIFLUSH, -+ } -+} -+ -+#[cfg(not(target_os = "aero"))] -+libc_enum! { - #[repr(i32)] - pub enum FlushArg { - /// Flush data that was received but not read -@@ -515,8 +533,17 @@ libc_enum! { - } - - // TODO: Make this usable directly as a slice index. -+#[cfg(target_os = "aero")] - libc_enum! { - /// Indices into the `termios.c_cc` array for special characters. -+ #[repr(usize)] -+ pub enum SpecialCharacterIndices { -+ VEOF, -+ } -+} -+ -+#[cfg(not(target_os = "aero"))] -+libc_enum! { - #[repr(usize)] - pub enum SpecialCharacterIndices { - VDISCARD, -@@ -601,13 +628,22 @@ libc_bitflags! { - IXOFF; - #[cfg(not(target_os = "redox"))] - IXANY; -- #[cfg(not(target_os = "redox"))] -+ #[cfg(not(any(target_os = "redox", target_os = "aero")))] - IMAXBEL; - #[cfg(any(target_os = "android", target_os = "linux", target_os = "macos"))] - IUTF8; - } - } - -+#[cfg(target_os = "aero")] -+libc_bitflags! { -+ /// Flags for configuring the output mode of a terminal -+ pub struct OutputFlags: tcflag_t { -+ OPOST; -+ } -+} -+ -+#[cfg(not(target_os = "aero"))] - libc_bitflags! { - /// Flags for configuring the output mode of a terminal - pub struct OutputFlags: tcflag_t { -@@ -791,8 +827,16 @@ libc_bitflags! { - } - } - -+#[cfg(target_os = "aero")] - libc_bitflags! { - /// Flags for setting the control mode of a terminal -+ pub struct ControlFlags: tcflag_t { -+ CS5; -+ } -+} -+ -+#[cfg(not(target_os = "aero"))] -+lib_bitflags! { - pub struct ControlFlags: tcflag_t { - #[cfg(any(target_os = "dragonfly", - target_os = "freebsd", -@@ -859,8 +903,16 @@ libc_bitflags! { - } - } - -+#[cfg(target_os = "aero")] - libc_bitflags! { - /// Flags for setting any local modes -+ pub struct LocalFlags: tcflag_t { -+ ECHO; -+ } -+} -+ -+#[cfg(not(target_os = "aero"))] -+libc_bitflags! { - pub struct LocalFlags: tcflag_t { - #[cfg(not(target_os = "redox"))] - ECHOKE; -diff --git a/src/unistd.rs b/src/unistd.rs -index d94cb99..8e26266 100644 ---- a/src/unistd.rs -+++ b/src/unistd.rs -@@ -1081,6 +1081,7 @@ pub fn pipe() -> std::result::Result<(RawFd, RawFd), Error> { - /// See also [pipe(2)](https://man7.org/linux/man-pages/man2/pipe.2.html) - #[cfg(any(target_os = "android", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "emscripten", - target_os = "freebsd", - target_os = "illumos", -@@ -1478,6 +1479,7 @@ pub fn getgroups() -> Result> { - pub fn setgroups(groups: &[Gid]) -> Result<()> { - cfg_if! { - if #[cfg(any(target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "illumos", - target_os = "ios", -@@ -1799,6 +1801,14 @@ pub fn mkstemp(template: &P) -> Result<(RawFd, PathBuf)> { - /// - [pathconf(2)](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pathconf.html) - /// - [limits.h](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html) - /// - [unistd.h](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html) -+#[cfg(target_os = "aero")] -+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] -+#[repr(i32)] -+pub enum PathconfVar { -+ NAME_MAX = libc::_PC_NAME_MAX, -+} -+ -+#[cfg(not(target_os = "aero"))] - #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] - #[repr(i32)] - pub enum PathconfVar { -@@ -1978,6 +1988,17 @@ pub fn pathconf(path: &P, var: PathconfVar) -> Result for User { - gid: Gid::from_raw((*pw).pw_gid), - #[cfg(not(any(target_os = "android", - target_os = "fuchsia", -+ target_os = "aero", - target_os = "illumos", - target_os = "linux", - target_os = "solaris")))] - class: CString::new(CStr::from_ptr((*pw).pw_class).to_bytes()).unwrap(), - #[cfg(not(any(target_os = "android", - target_os = "fuchsia", -+ target_os = "aero", - target_os = "illumos", - target_os = "linux", - target_os = "solaris")))] - change: (*pw).pw_change, - #[cfg(not(any(target_os = "android", - target_os = "fuchsia", -+ target_os = "aero", - target_os = "illumos", - target_os = "linux", - target_os = "solaris")))] --- -2.38.1 diff --git a/patches/rust-num-cpus/rust-num-cpus.patch b/patches/rust-num-cpus/rust-num-cpus.patch deleted file mode 100644 index 8ab20459c41..00000000000 --- a/patches/rust-num-cpus/rust-num-cpus.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 69bdbf9a09b403cac206f0dba50663ebf1e161d9 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Wed, 12 Jan 2022 17:19:55 +1100 -Subject: [PATCH] aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - src/lib.rs | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/lib.rs b/src/lib.rs -index 6c8280f..e87efa8 100644 ---- a/src/lib.rs -+++ b/src/lib.rs -@@ -331,7 +331,8 @@ fn get_num_physical_cpus() -> usize { - target_os = "android", - target_os = "solaris", - target_os = "illumos", -- target_os = "fuchsia") -+ target_os = "fuchsia", -+ target_os = "aero") - )] - fn get_num_cpus() -> usize { - // On ARM targets, processors could be turned off to save power. -@@ -420,6 +421,7 @@ fn get_num_cpus() -> usize { - target_os = "netbsd", - target_os = "haiku", - target_os = "hermit", -+ target_os = "aero", - windows, - )))] - fn get_num_cpus() -> usize { --- -2.25.1 - diff --git a/patches/rust-shared-library/rust-shared-library.patch b/patches/rust-shared-library/rust-shared-library.patch deleted file mode 100644 index ed2c8cf25a0..00000000000 --- a/patches/rust-shared-library/rust-shared-library.patch +++ /dev/null @@ -1,45 +0,0 @@ -From ccb5e182dc9d035f5ea8316643a5e7e4e966f2d5 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sun, 20 Nov 2022 13:23:56 +1100 -Subject: [PATCH] - ---- - Cargo.toml | 2 +- - src/dynamic_library.rs | 2 ++ - 2 files changed, 3 insertions(+), 1 deletion(-) - -diff --git a/Cargo.toml b/Cargo.toml -index e32011c..be74698 100644 ---- a/Cargo.toml -+++ b/Cargo.toml -@@ -1,6 +1,6 @@ - [package] - name = "shared_library" --version = "0.1.8" -+version = "0.1.9" - authors = ["Pierre Krieger "] - description = "Easily bind to and load shared libraries" - license = "Apache-2.0/MIT" -diff --git a/src/dynamic_library.rs b/src/dynamic_library.rs -index 753b632..d1398bb 100644 ---- a/src/dynamic_library.rs -+++ b/src/dynamic_library.rs -@@ -192,6 +192,7 @@ mod test { - #[test] - #[cfg(any(target_os = "linux", - target_os = "macos", -+ target_os = "aero", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "netbsd", -@@ -213,6 +214,7 @@ mod test { - //TODO: use `unix` shortcut? - #[cfg(any(target_os = "linux", - target_os = "android", -+ target_os = "aero", - target_os = "macos", - target_os = "ios", - target_os = "fuchsia", --- -2.38.1 - diff --git a/patches/rust-users/rust-users.patch b/patches/rust-users/rust-users.patch deleted file mode 100644 index da45496c7bc..00000000000 --- a/patches/rust-users/rust-users.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 0dcaffa14eb80d3a8d1236a09d0bd2f28326c6db Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Wed, 12 Jan 2022 17:23:53 +1100 -Subject: [PATCH] aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - src/base.rs | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/base.rs b/src/base.rs -index ece499a..fc5f3cb 100644 ---- a/src/base.rs -+++ b/src/base.rs -@@ -923,7 +923,7 @@ pub mod os { - /// Although the `passwd` struct is common among Unix systems, its actual - /// format can vary. See the definitions in the `base` module to check which - /// fields are actually present. -- #[cfg(any(target_os = "linux", target_os = "android", target_os = "macos", target_os = "freebsd", target_os = "dragonfly", target_os = "openbsd", target_os = "netbsd", target_os = "solaris"))] -+ #[cfg(any(target_os = "linux", target_os = "android", target_os = "macos", target_os = "freebsd", target_os = "dragonfly", target_os = "openbsd", target_os = "netbsd", target_os = "solaris", target_os = "aero"))] - pub mod unix { - use std::ffi::{OsStr, OsString}; - use std::path::{Path, PathBuf}; -@@ -1176,11 +1176,11 @@ pub mod os { - pub type UserExtras = bsd::UserExtras; - - /// Any extra fields on a `User` specific to the current platform. -- #[cfg(any(target_os = "linux", target_os = "android", target_os = "solaris"))] -+ #[cfg(any(target_os = "linux", target_os = "android", target_os = "solaris", target_os = "aero"))] - pub type UserExtras = unix::UserExtras; - - /// Any extra fields on a `Group` specific to the current platform. -- #[cfg(any(target_os = "linux", target_os = "android", target_os = "macos", target_os = "freebsd", target_os = "dragonfly", target_os = "openbsd", target_os = "netbsd", target_os = "solaris"))] -+ #[cfg(any(target_os = "linux", target_os = "android", target_os = "macos", target_os = "freebsd", target_os = "dragonfly", target_os = "openbsd", target_os = "netbsd", target_os = "solaris", target_os = "aero"))] - pub type GroupExtras = unix::GroupExtras; - } - --- -2.25.1 - diff --git a/patches/rust-winit/rust-winit.patch b/patches/rust-winit/rust-winit.patch deleted file mode 100644 index e5e449da31d..00000000000 --- a/patches/rust-winit/rust-winit.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 4e0723a7be1155a72b64eda807712460079a923e Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Thu, 1 Dec 2022 17:51:20 +1100 -Subject: [PATCH] - ---- - Cargo.toml | 2 +- - src/platform/run_return.rs | 1 + - src/platform/unix.rs | 1 + - src/platform_impl/linux/mod.rs | 8 ++++++++ - src/platform_impl/linux/wayland/mod.rs | 1 + - src/platform_impl/linux/x11/mod.rs | 1 + - src/platform_impl/mod.rs | 2 ++ - 7 files changed, 15 insertions(+), 1 deletion(-) - -diff --git a/Cargo.toml b/Cargo.toml -index b1e4159..08309aa 100644 ---- a/Cargo.toml -+++ b/Cargo.toml -@@ -84,7 +84,7 @@ features = [ - "timeapi" - ] - --[target.'cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd"))'.dependencies] -+[target.'cfg(any(target_os = "linux", target_os = "aero", target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd"))'.dependencies] - wayland-client = { version = "0.29", default_features = false, features = ["use_system_lib"], optional = true } - wayland-protocols = { version = "0.29", features = [ "staging_protocols"], optional = true } - sctk = { package = "smithay-client-toolkit", version = "0.15.1", default_features = false, features = ["calloop"], optional = true } -diff --git a/src/platform/run_return.rs b/src/platform/run_return.rs -index 932d9e3..4983c4c 100644 ---- a/src/platform/run_return.rs -+++ b/src/platform/run_return.rs -@@ -1,5 +1,6 @@ - #![cfg(any( - target_os = "windows", -+ target_os = "aero", - target_os = "macos", - target_os = "android", - target_os = "linux", -diff --git a/src/platform/unix.rs b/src/platform/unix.rs -index ba600b1..cfa1f03 100644 ---- a/src/platform/unix.rs -+++ b/src/platform/unix.rs -@@ -1,5 +1,6 @@ - #![cfg(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -diff --git a/src/platform_impl/linux/mod.rs b/src/platform_impl/linux/mod.rs -index 953fca1..4f9dbb0 100644 ---- a/src/platform_impl/linux/mod.rs -+++ b/src/platform_impl/linux/mod.rs -@@ -1,6 +1,7 @@ - #![cfg(any( - target_os = "linux", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd" -@@ -771,6 +772,13 @@ fn is_main_thread() -> bool { - unsafe { syscall(SYS_gettid) == getpid() as c_long } - } - -+#[cfg(any(target_os = "aero"))] -+fn is_main_thread() -> bool { -+ // This function is only used for assertions (to make sure that library consumers don't do -+ // anything wrong), but we don't currently implement gettid yet so just return true for now. -+ true -+} -+ - #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd"))] - fn is_main_thread() -> bool { - use libc::pthread_main_np; -diff --git a/src/platform_impl/linux/wayland/mod.rs b/src/platform_impl/linux/wayland/mod.rs -index 4ed564a..502545e 100644 ---- a/src/platform_impl/linux/wayland/mod.rs -+++ b/src/platform_impl/linux/wayland/mod.rs -@@ -1,6 +1,7 @@ - #![cfg(any( - target_os = "linux", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd" -diff --git a/src/platform_impl/linux/x11/mod.rs b/src/platform_impl/linux/x11/mod.rs -index 27c92c4..7b3d7e3 100644 ---- a/src/platform_impl/linux/x11/mod.rs -+++ b/src/platform_impl/linux/x11/mod.rs -@@ -1,5 +1,6 @@ - #![cfg(any( - target_os = "linux", -+ target_os = "aero", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", -diff --git a/src/platform_impl/mod.rs b/src/platform_impl/mod.rs -index 152065d..a0d471b 100644 ---- a/src/platform_impl/mod.rs -+++ b/src/platform_impl/mod.rs -@@ -6,6 +6,7 @@ mod platform; - #[cfg(any( - target_os = "linux", - target_os = "dragonfly", -+ target_os = "aero", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd" -@@ -32,6 +33,7 @@ mod platform; - not(target_os = "macos"), - not(target_os = "android"), - not(target_os = "dragonfly"), -+ not(target_os = "aero"), - not(target_os = "freebsd"), - not(target_os = "netbsd"), - not(target_os = "openbsd"), --- -2.38.1 - diff --git a/patches/rust/0001-fix-bootstrap-build-target-in-x.py-and-bootstrap.patch b/patches/rust/0001-fix-bootstrap-build-target-in-x.py-and-bootstrap.patch deleted file mode 100644 index 2a474c60f55..00000000000 --- a/patches/rust/0001-fix-bootstrap-build-target-in-x.py-and-bootstrap.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 1f0ded570575781c7e8dbd0d60c57a2ec72ec987 Mon Sep 17 00:00:00 2001 -From: Anhad Singh -Date: Wed, 18 Oct 2023 19:23:49 +1100 -Subject: [PATCH] fix(bootstrap): build target in x.py and bootstrap - -Signed-off-by: Anhad Singh ---- - src/bootstrap/bootstrap.py | 7 +++++-- - src/bootstrap/src/core/builder.rs | 6 ++++-- - 2 files changed, 9 insertions(+), 4 deletions(-) - -diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py -index 1a1125a107f..3f3171a9ddf 100644 ---- a/src/bootstrap/bootstrap.py -+++ b/src/bootstrap/bootstrap.py -@@ -881,7 +881,7 @@ class RustBuild(object): - ... "debug", "bootstrap") - True - """ -- return os.path.join(self.build_dir, "bootstrap", "debug", "bootstrap") -+ return os.path.join(self.build_dir, "bootstrap", self.build, "debug", "bootstrap") - - def build_bootstrap(self): - """Build bootstrap""" -@@ -903,7 +903,7 @@ class RustBuild(object): - build_dir = os.path.join(self.build_dir, "bootstrap") - if self.clean and os.path.exists(build_dir): - shutil.rmtree(build_dir) -- # `CARGO_BUILD_TARGET` breaks bootstrap build. -+ # `CARGO_BUILD_TARGET` and `build.target` breaks bootstrap build. - # See also: . - if "CARGO_BUILD_TARGET" in env: - del env["CARGO_BUILD_TARGET"] -@@ -987,6 +987,9 @@ class RustBuild(object): - except KeyError: - pass - -+ args.append("--target") -+ args.append(self.build) -+ - return args - - def build_triple(self): -diff --git a/src/bootstrap/src/core/builder.rs b/src/bootstrap/src/core/builder.rs -index 039a87e760d..cbbbce4f515 100644 ---- a/src/bootstrap/src/core/builder.rs -+++ b/src/bootstrap/src/core/builder.rs -@@ -1587,6 +1587,8 @@ pub fn cargo( - self.clear_if_dirty(&out_dir, &self.rustc(compiler)); - } - -+ let artifact_dir = self.out.join("bootstrap/").join(self.build.build.triple).join("debug/"); -+ - // Customize the compiler we're running. Specify the compiler to cargo - // as our shim and then pass it some various options used to configure - // how the actual compiler itself is called. -@@ -1599,7 +1601,7 @@ pub fn cargo( - .env("RUSTC_STAGE", stage.to_string()) - .env("RUSTC_SYSROOT", &sysroot) - .env("RUSTC_LIBDIR", &libdir) -- .env("RUSTDOC", self.bootstrap_out.join("rustdoc")) -+ .env("RUSTDOC", artifact_dir.join("rustdoc")) - .env( - "RUSTDOC_REAL", - if cmd == "doc" || cmd == "rustdoc" || (cmd == "test" && want_rustdoc) { -@@ -1613,7 +1615,7 @@ pub fn cargo( - // Clippy support is a hack and uses the default `cargo-clippy` in path. - // Don't override RUSTC so that the `cargo-clippy` in path will be run. - if cmd != "clippy" { -- cargo.env("RUSTC", self.bootstrap_out.join("rustc")); -+ cargo.env("RUSTC", artifact_dir.join("rustc")); - } - - // Dealing with rpath here is a little special, so let's go into some --- -2.42.0 - diff --git a/patches/tcc/tcc.patch b/patches/tcc/tcc.patch deleted file mode 100644 index 914fb2e4828..00000000000 --- a/patches/tcc/tcc.patch +++ /dev/null @@ -1,166 +0,0 @@ -From d6759f3711877792de6eae84616f0077c5089b1e Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Fri, 31 Dec 2021 17:14:30 +1100 -Subject: [PATCH] add support for aero - -Signed-off-by: Andy-Python-Programmer ---- - .vscode/settings.json | 3 +++ - configure | 2 +- - include/stdarg.h | 6 ++++++ - lib/Makefile | 8 ++++---- - libtcc.c | 4 ++-- - tcc.c | 4 +++- - tcc.h | 4 ++++ - tccelf.c | 2 ++ - 8 files changed, 25 insertions(+), 8 deletions(-) - create mode 100644 .vscode/settings.json - -diff --git a/.vscode/settings.json b/.vscode/settings.json -new file mode 100644 -index 0000000..560faaa ---- /dev/null -+++ b/.vscode/settings.json -@@ -0,0 +1,3 @@ -+{ -+ "editor.formatOnSave": false, -+} -\ No newline at end of file -diff --git a/configure b/configure -index 1ee3acb..cab20ed 100755 ---- a/configure -+++ b/configure -@@ -49,7 +49,7 @@ gcc_major=0 - gcc_minor=0 - - # OS specific --targetos=`uname` -+targetos=Aero - case $targetos in - Darwin) - confvars="$confvars OSX" -diff --git a/include/stdarg.h b/include/stdarg.h -index 10ce733..405ac68 100644 ---- a/include/stdarg.h -+++ b/include/stdarg.h -@@ -1,6 +1,10 @@ - #ifndef _STDARG_H - #define _STDARG_H - -+#ifdef __need___va_list -+typedef char *__gnuc_va_list; -+#else -+ - #ifdef __x86_64__ - #ifndef _WIN64 - -@@ -76,4 +80,6 @@ typedef char *va_list; - typedef va_list __gnuc_va_list; - #define _VA_LIST_DEFINED - -+#endif -+ - #endif /* _STDARG_H */ -diff --git a/lib/Makefile b/lib/Makefile -index 0c1ec54..c546dff 100644 ---- a/lib/Makefile -+++ b/lib/Makefile -@@ -20,18 +20,18 @@ XCFG = $(or $(findstring -win,$T),-unx) - # in order to use gcc, tyoe: make -libtcc1-usegcc=yes - arm-libtcc1-usegcc ?= no - --ifeq "$($(T)-libtcc1-usegcc)" "yes" -+#ifeq "$($(T)-libtcc1-usegcc)" "yes" - XCC = $(CC) - XAR = $(AR) - XFLAGS = $(CFLAGS) -fPIC --endif -+#endif - - # only for native compiler - $(X)BCHECK_O = bcheck.o - --ifeq ($(CONFIG_musl)$(CONFIG_uClibc),yes) -+#ifeq ($(CONFIG_musl)$(CONFIG_uClibc),yes) - BCHECK_O = --endif -+#endif - - ifdef CONFIG_OSX - XFLAGS += -D_ANSI_SOURCE -diff --git a/libtcc.c b/libtcc.c -index 1e9dd97..30d27f0 100644 ---- a/libtcc.c -+++ b/libtcc.c -@@ -975,8 +975,8 @@ LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type) - if ((output_type == TCC_OUTPUT_EXE || output_type == TCC_OUTPUT_DLL) && - !s->nostdlib) { - if (output_type != TCC_OUTPUT_DLL) -- tcc_add_crt(s, "crt1.o"); -- tcc_add_crt(s, "crti.o"); -+ tcc_add_crt(s, "crt0.o"); -+ //tcc_add_crt(s, "crti.o"); - } - #endif - return 0; -diff --git a/tcc.c b/tcc.c -index cd887d1..1bb0c24 100644 ---- a/tcc.c -+++ b/tcc.c -@@ -1,6 +1,6 @@ - /* - * TCC - Tiny C Compiler -- * -+ * - * Copyright (c) 2001-2004 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or -@@ -162,6 +162,8 @@ static const char version[] = - " Darwin" - #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) - " FreeBSD" -+#elif defined(__aero__) -+ " Aero" - #else - " Linux" - #endif -diff --git a/tcc.h b/tcc.h -index cd67973..e42f5fe 100644 ---- a/tcc.h -+++ b/tcc.h -@@ -162,6 +162,8 @@ extern long double strtold (const char *__nptr, char **__endptr); - # endif - #endif - -+#if 0 -+ - #if defined TCC_IS_NATIVE && !defined CONFIG_TCCBOOT - # define CONFIG_TCC_BACKTRACE - # if (defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64) \ -@@ -170,6 +172,8 @@ extern long double strtold (const char *__nptr, char **__endptr); - # endif - #endif - -+#endif -+ - /* ------------ path configuration ------------ */ - - #ifndef CONFIG_SYSROOT -diff --git a/tccelf.c b/tccelf.c -index 70d47e1..994ee59 100644 ---- a/tccelf.c -+++ b/tccelf.c -@@ -1202,8 +1202,10 @@ ST_FUNC void tcc_add_runtime(TCCState *s1) - #endif - tcc_add_support(s1, TCC_LIBTCC1); - /* add crt end if not memory output */ -+ /* - if (s1->output_type != TCC_OUTPUT_MEMORY) - tcc_add_crt(s1, "crtn.o"); -+ */ - } - } - --- -2.25.1 - diff --git a/patches/wayland/wayland.patch b/patches/wayland/wayland.patch deleted file mode 100644 index d0986504bd6..00000000000 --- a/patches/wayland/wayland.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 845a4f951b9165576f6b930385bfef82b61394fc Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Thu, 26 May 2022 19:09:39 +1000 -Subject: [PATCH] wayland: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - .gitignore | 2 ++ - src/wayland-os.c | 1 + - src/wayland-server.c | 2 ++ - tests/test-runner.c | 1 + - 4 files changed, 6 insertions(+) - -diff --git a/.gitignore b/.gitignore -index 4fefe5d..7013a49 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -6,3 +6,5 @@ - *~ - cscope.out - ctags -+ -+.vscode -\ No newline at end of file -diff --git a/src/wayland-os.c b/src/wayland-os.c -index 27c6035..43f7b00 100644 ---- a/src/wayland-os.c -+++ b/src/wayland-os.c -@@ -27,6 +27,7 @@ - - #include "../config.h" - -+#include - #include - #include - #include -diff --git a/src/wayland-server.c b/src/wayland-server.c -index 02f1365..d4cf79b 100644 ---- a/src/wayland-server.c -+++ b/src/wayland-server.c -@@ -1490,6 +1490,7 @@ wl_socket_lock(struct wl_socket *socket) - { - struct stat socket_stat; - -+ /* lockfiles are currently not supported on aero. - snprintf(socket->lock_addr, sizeof socket->lock_addr, - "%s%s", socket->addr.sun_path, LOCK_SUFFIX); - -@@ -1518,6 +1519,7 @@ wl_socket_lock(struct wl_socket *socket) - socket_stat.st_mode & S_IWGRP) { - unlink(socket->addr.sun_path); - } -+ */ - - return 0; - err_fd: -diff --git a/tests/test-runner.c b/tests/test-runner.c -index c0247b5..47280d1 100644 ---- a/tests/test-runner.c -+++ b/tests/test-runner.c -@@ -27,6 +27,7 @@ - #define _GNU_SOURCE - - #include -+#include - #include - #include - #include --- -2.25.1 - diff --git a/patches/webkitgtk/0001-Initial-Aero-support.patch b/patches/webkitgtk/0001-Initial-Aero-support.patch deleted file mode 100644 index 82db1c0a73e..00000000000 --- a/patches/webkitgtk/0001-Initial-Aero-support.patch +++ /dev/null @@ -1,243 +0,0 @@ -From 610aa0dbb9c661c87172c0cf93de06efb019f80b Mon Sep 17 00:00:00 2001 -From: Dennis Bonke -Date: Sun, 2 Jan 2022 00:19:17 +0100 -Subject: [PATCH 1/2] Initial Aero support - -Signed-off-by: Dennis Bonke ---- - Source/JavaScriptCore/heap/BlockDirectory.cpp | 2 +- - Source/JavaScriptCore/runtime/MachineContext.h | 8 ++++---- - Source/JavaScriptCore/runtime/Options.cpp | 1 + - Source/ThirdParty/ANGLE/src/common/platform.h | 2 +- - Source/WTF/wtf/InlineASM.h | 8 +++++--- - Source/WTF/wtf/PlatformHave.h | 4 ++-- - Source/WTF/wtf/PlatformOS.h | 6 ++++++ - Source/WebCore/platform/sql/SQLiteDatabase.cpp | 6 +++--- - Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp | 2 +- - Source/WebKit/Platform/unix/SharedMemoryUnix.cpp | 4 +++- - 10 files changed, 27 insertions(+), 16 deletions(-) - -diff --git a/Source/JavaScriptCore/heap/BlockDirectory.cpp b/Source/JavaScriptCore/heap/BlockDirectory.cpp -index e2a3540f86..8b14455772 100644 ---- a/Source/JavaScriptCore/heap/BlockDirectory.cpp -+++ b/Source/JavaScriptCore/heap/BlockDirectory.cpp -@@ -60,7 +60,7 @@ void BlockDirectory::setSubspace(Subspace* subspace) - void BlockDirectory::updatePercentageOfPagedOutPages(SimpleStats& stats) - { - // FIXME: We should figure out a solution for Windows. --#if OS(UNIX) -+#if OS(UNIX) && !OS(AERO) - size_t pageSize = WTF::pageSize(); - ASSERT(!(MarkedBlock::blockSize % pageSize)); - auto numberOfPagesInMarkedBlock = MarkedBlock::blockSize / pageSize; -diff --git a/Source/JavaScriptCore/runtime/MachineContext.h b/Source/JavaScriptCore/runtime/MachineContext.h -index 7857bfc167..4e396fa853 100644 ---- a/Source/JavaScriptCore/runtime/MachineContext.h -+++ b/Source/JavaScriptCore/runtime/MachineContext.h -@@ -346,7 +346,7 @@ static inline void*& framePointerImpl(mcontext_t& machineContext) - #error Unknown Architecture - #endif - --#elif OS(FUCHSIA) || OS(LINUX) -+#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) - - // The following sequence depends on glibc's sys/ucontext.h. - #if CPU(X86) -@@ -497,7 +497,7 @@ static inline void*& instructionPointerImpl(mcontext_t& machineContext) - #error Unknown Architecture - #endif - --#elif OS(FUCHSIA) || OS(LINUX) -+#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) - - // The following sequence depends on glibc's sys/ucontext.h. - #if CPU(X86) -@@ -655,7 +655,7 @@ inline void*& argumentPointer<1>(mcontext_t& machineContext) - #error Unknown Architecture - #endif - --#elif OS(FUCHSIA) || OS(LINUX) -+#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) - - // The following sequence depends on glibc's sys/ucontext.h. - #if CPU(X86) -@@ -772,7 +772,7 @@ inline void*& llintInstructionPointer(mcontext_t& machineContext) - #error Unknown Architecture - #endif - --#elif OS(FUCHSIA) || OS(LINUX) -+#elif OS(FUCHSIA) || OS(LINUX) || OS(AERO) - - // The following sequence depends on glibc's sys/ucontext.h. - #if CPU(X86) -diff --git a/Source/JavaScriptCore/runtime/Options.cpp b/Source/JavaScriptCore/runtime/Options.cpp -index e54387ef28..d159806731 100644 ---- a/Source/JavaScriptCore/runtime/Options.cpp -+++ b/Source/JavaScriptCore/runtime/Options.cpp -@@ -35,6 +35,7 @@ - #include - #include - #include -+#include - #include - #include - #include -diff --git a/Source/ThirdParty/ANGLE/src/common/platform.h b/Source/ThirdParty/ANGLE/src/common/platform.h -index 41f3cf4ff7..745e1f4a56 100644 ---- a/Source/ThirdParty/ANGLE/src/common/platform.h -+++ b/Source/ThirdParty/ANGLE/src/common/platform.h -@@ -28,7 +28,7 @@ - # define ANGLE_PLATFORM_POSIX 1 - #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || \ - defined(__DragonFly__) || defined(__sun) || defined(__GLIBC__) || defined(__GNU__) || \ -- defined(__QNX__) || defined(__Fuchsia__) || defined(__HAIKU__) -+ defined(__QNX__) || defined(__Fuchsia__) || defined(__HAIKU__) || defined(__aero__) - # define ANGLE_PLATFORM_POSIX 1 - #else - # error Unsupported platform. -diff --git a/Source/WTF/wtf/InlineASM.h b/Source/WTF/wtf/InlineASM.h -index 8379a69659..f2780b7947 100644 ---- a/Source/WTF/wtf/InlineASM.h -+++ b/Source/WTF/wtf/InlineASM.h -@@ -43,11 +43,11 @@ - #define THUMB_FUNC_PARAM(name) - #endif - --#if (OS(LINUX) || OS(FREEBSD)) && CPU(X86_64) -+#if (OS(LINUX) || OS(FREEBSD) || OS(AERO)) && CPU(X86_64) - #define GLOBAL_REFERENCE(name) #name "@plt" - #elif CPU(X86) && COMPILER(MINGW) - #define GLOBAL_REFERENCE(name) "@" #name "@4" --#elif OS(LINUX) && CPU(X86) && defined(__PIC__) -+#elif (OS(LINUX) || OS(AERO)) && CPU(X86) && defined(__PIC__) - #define GLOBAL_REFERENCE(name) SYMBOL_STRING(name) "@plt" - #else - #define GLOBAL_REFERENCE(name) SYMBOL_STRING(name) -@@ -70,7 +70,8 @@ - || OS(FUCHSIA) \ - || OS(OPENBSD) \ - || OS(HPUX) \ -- || OS(NETBSD) -+ || OS(NETBSD) \ -+ || OS(AERO) - // ELF platform - #define HIDE_SYMBOL(name) ".hidden " #name - #else -@@ -88,6 +89,7 @@ - || OS(OPENBSD) \ - || OS(HURD) \ - || OS(NETBSD) \ -+ || OS(AERO) \ - || COMPILER(MINGW) - // GNU as-compatible syntax. - #define LOCAL_LABEL_STRING(name) ".L" #name -diff --git a/Source/WTF/wtf/PlatformHave.h b/Source/WTF/wtf/PlatformHave.h -index 61f13c2b73..c4ff4a6252 100644 ---- a/Source/WTF/wtf/PlatformHave.h -+++ b/Source/WTF/wtf/PlatformHave.h -@@ -226,7 +226,7 @@ - #define HAVE_HOSTED_CORE_ANIMATION 1 - #endif - --#if OS(DARWIN) || OS(FUCHSIA) || ((OS(FREEBSD) || OS(LINUX)) && (CPU(X86) || CPU(X86_64) || CPU(ARM) || CPU(ARM64) || CPU(MIPS))) -+#if OS(DARWIN) || OS(FUCHSIA) || OS(AERO) || ((OS(FREEBSD) || OS(LINUX)) && (CPU(X86) || CPU(X86_64) || CPU(ARM) || CPU(ARM64) || CPU(MIPS))) - #define HAVE_MACHINE_CONTEXT 1 - #endif - -@@ -238,7 +238,7 @@ - #define HAVE_BACKTRACE_SYMBOLS 1 - #endif - --#if OS(DARWIN) || OS(LINUX) -+#if OS(DARWIN) || OS(LINUX) || OS(AERO) - #define HAVE_DLADDR 1 - #endif - -diff --git a/Source/WTF/wtf/PlatformOS.h b/Source/WTF/wtf/PlatformOS.h -index e61715fb72..28cf97f28f 100644 ---- a/Source/WTF/wtf/PlatformOS.h -+++ b/Source/WTF/wtf/PlatformOS.h -@@ -118,6 +118,11 @@ - #define WTF_OS_WINDOWS 1 - #endif - -+/* OS(AERO) - Aero */ -+#if defined(__aero__) -+#define WTF_OS_AERO 1 -+#endif -+ - - /* OS(UNIX) - Any Unix-like system */ - #if OS(AIX) \ -@@ -128,6 +133,7 @@ - || OS(LINUX) \ - || OS(NETBSD) \ - || OS(OPENBSD) \ -+ || OS(AERO) \ - || defined(unix) \ - || defined(__unix) \ - || defined(__unix__) -diff --git a/Source/WebCore/platform/sql/SQLiteDatabase.cpp b/Source/WebCore/platform/sql/SQLiteDatabase.cpp -index 743ef3dc84..3a61bc1dc3 100644 ---- a/Source/WebCore/platform/sql/SQLiteDatabase.cpp -+++ b/Source/WebCore/platform/sql/SQLiteDatabase.cpp -@@ -148,8 +148,8 @@ bool SQLiteDatabase::open(const String& filename, OpenMode openMode) - LOG_ERROR("SQLite database could not set temp_store to memory"); - } - -- if (openMode != OpenMode::ReadOnly) -- useWALJournalMode(); -+ // if (openMode != OpenMode::ReadOnly) -+ // useWALJournalMode(); - - auto shmFileName = makeString(filename, "-shm"_s); - if (FileSystem::fileExists(shmFileName)) { -@@ -727,7 +727,7 @@ Expected SQLiteDatabase::prepareStatement(ASCIILiteral que - { - auto sqlStatement = constructAndPrepareStatement(*this, query.characters(), query.length()); - if (!sqlStatement) { -- RELEASE_LOG_ERROR(SQLDatabase, "SQLiteDatabase::prepareStatement: Failed to prepare statement %{public}s", query.characters()); -+ RELEASE_LOG_ERROR(SQLDatabase, "SQLiteDatabase::prepareStatement: Failed to prepare statement %s" /*%{public}s"*/, query.characters()); - return makeUnexpected(sqlStatement.error()); - } - return SQLiteStatement { *this, sqlStatement.value() }; -diff --git a/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp b/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp -index efcd663f84..81a425a037 100644 ---- a/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp -+++ b/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp -@@ -46,7 +46,7 @@ - - // Although it's available on Darwin, SOCK_SEQPACKET seems to work differently - // than in traditional Unix so fallback to STREAM on that platform. --#if defined(SOCK_SEQPACKET) && !OS(DARWIN) -+#if defined(SOCK_SEQPACKET) && !OS(DARWIN) && !OS(AERO) - #define SOCKET_TYPE SOCK_SEQPACKET - #else - #if USE(GLIB) -diff --git a/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp b/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp -index 998a2a7679..51c5d38573 100644 ---- a/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp -+++ b/Source/WebKit/Platform/unix/SharedMemoryUnix.cpp -@@ -47,8 +47,10 @@ - - #if HAVE(LINUX_MEMFD_H) - #include -+#if !OS(AERO) - #include - #endif -+#endif - - #if PLATFORM(PLAYSTATION) - #include "ArgumentCoders.h" -@@ -132,7 +134,7 @@ static int createSharedMemory() - static bool isMemFdAvailable = true; - if (isMemFdAvailable) { - do { -- fileDescriptor = syscall(__NR_memfd_create, "WebKitSharedMemory", MFD_CLOEXEC); -+ fileDescriptor = memfd_create("WebKitSharedMemory", MFD_CLOEXEC); - } while (fileDescriptor == -1 && errno == EINTR); - - if (fileDescriptor != -1) --- -2.42.0 - diff --git a/patches/webkitgtk/0002-xxx.patch b/patches/webkitgtk/0002-xxx.patch deleted file mode 100644 index ae6402e7784..00000000000 --- a/patches/webkitgtk/0002-xxx.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 4a70595e159ee5cc7336ed10c78f7f34284506e1 Mon Sep 17 00:00:00 2001 -From: Anhad Singh -Date: Sat, 14 Oct 2023 16:58:18 +1100 -Subject: [PATCH 2/2] - -Signed-off-by: Anhad Singh ---- - .../ANGLE/include/GLSLANG/ShaderVars.h | 1 + - Source/WTF/wtf/MallocPtr.h | 1 + - .../WTF/wtf/text/IntegerToStringConversion.h | 25 ++++++++++--------- - .../WebCore/accessibility/AXObjectCache.cpp | 2 ++ - .../graphics/BifurcatedGraphicsContext.cpp | 2 ++ - .../platform/graphics/x11/XUniqueResource.h | 2 ++ - 6 files changed, 21 insertions(+), 12 deletions(-) - -diff --git a/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h b/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h -index 68dc7e2e32..e127de3373 100644 ---- a/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h -+++ b/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - - // This type is defined here to simplify ANGLE's integration with glslang for SPIRv. - using ShCompileOptions = uint64_t; -diff --git a/Source/WTF/wtf/MallocPtr.h b/Source/WTF/wtf/MallocPtr.h -index 2cbd861efd..57e8e66100 100644 ---- a/Source/WTF/wtf/MallocPtr.h -+++ b/Source/WTF/wtf/MallocPtr.h -@@ -25,6 +25,7 @@ - - #pragma once - -+#include - #include - #include - -diff --git a/Source/WTF/wtf/text/IntegerToStringConversion.h b/Source/WTF/wtf/text/IntegerToStringConversion.h -index 03f5861c33..666e53e564 100644 ---- a/Source/WTF/wtf/text/IntegerToStringConversion.h -+++ b/Source/WTF/wtf/text/IntegerToStringConversion.h -@@ -21,15 +21,17 @@ - - #pragma once - -+#include - #include - - namespace WTF { - --enum PositiveOrNegativeNumber { PositiveNumber, NegativeNumber }; -+enum PositiveOrNegativeNumber { PositiveNumber, -+ NegativeNumber }; - --template struct IntegerToStringConversionTrait; -+template struct IntegerToStringConversionTrait; - --template -+template - static typename IntegerToStringConversionTrait::ReturnType numberToStringImpl(UnsignedIntegerType number, AdditionalArgumentType additionalArgument) - { - LChar buf[sizeof(UnsignedIntegerType) * 3 + 1]; -@@ -47,7 +49,7 @@ static typename IntegerToStringConversionTrait::ReturnType numberToStringImpl - return IntegerToStringConversionTrait::flush(p, static_cast(end - p), additionalArgument); - } - --template -+template - inline typename IntegerToStringConversionTrait::ReturnType numberToStringSigned(SignedIntegerType number, typename IntegerToStringConversionTrait::AdditionalArgumentType* additionalArgument = nullptr) - { - if (number < 0) -@@ -55,13 +57,13 @@ inline typename IntegerToStringConversionTrait::ReturnType numberToStringSign - return numberToStringImpl, PositiveNumber>(number, additionalArgument); - } - --template -+template - inline typename IntegerToStringConversionTrait::ReturnType numberToStringUnsigned(UnsignedIntegerType number, typename IntegerToStringConversionTrait::AdditionalArgumentType* additionalArgument = nullptr) - { - return numberToStringImpl(number, additionalArgument); - } - --template -+template - static void writeIntegerToBufferImpl(UnsignedIntegerType number, CharacterType* destination) - { - static_assert(!std::is_same_v>, "'bool' not supported"); -@@ -76,12 +78,12 @@ static void writeIntegerToBufferImpl(UnsignedIntegerType number, CharacterType* - - if (NumberType == NegativeNumber) - *--p = '-'; -- -+ - while (p < end) - *destination++ = static_cast(*p++); - } - --template -+template - inline void writeIntegerToBuffer(IntegerType integer, CharacterType* destination) - { - static_assert(std::is_integral_v); -@@ -95,7 +97,7 @@ inline void writeIntegerToBuffer(IntegerType integer, CharacterType* destination - return writeIntegerToBufferImpl(integer, destination); - } - --template -+template - constexpr unsigned lengthOfIntegerAsStringImpl(UnsignedIntegerType number) - { - unsigned length = 0; -@@ -111,15 +113,14 @@ constexpr unsigned lengthOfIntegerAsStringImpl(UnsignedIntegerType number) - return length; - } - --template -+template - constexpr unsigned lengthOfIntegerAsString(IntegerType integer) - { - static_assert(std::is_integral_v); - if constexpr (std::is_same_v) { - UNUSED_PARAM(integer); - return 1; -- } -- else if constexpr (std::is_signed_v) { -+ } else if constexpr (std::is_signed_v) { - if (integer < 0) - return lengthOfIntegerAsStringImpl, NegativeNumber>(-integer); - return lengthOfIntegerAsStringImpl, PositiveNumber>(integer); -diff --git a/Source/WebCore/accessibility/AXObjectCache.cpp b/Source/WebCore/accessibility/AXObjectCache.cpp -index a7a867f60d..a08ce5078d 100644 ---- a/Source/WebCore/accessibility/AXObjectCache.cpp -+++ b/Source/WebCore/accessibility/AXObjectCache.cpp -@@ -528,9 +528,11 @@ static bool isSimpleImage(const RenderObject& renderer) - || (is(node) && downcast(node)->hasAttributeWithoutSynchronization(usemapAttr))) - return false; - -+#if ENABLE(VIDEO) - // Exclude video and audio elements. - if (is(node)) - return false; -+#endif - - return true; - } -diff --git a/Source/WebCore/platform/graphics/BifurcatedGraphicsContext.cpp b/Source/WebCore/platform/graphics/BifurcatedGraphicsContext.cpp -index c0ce72c5ff..a2a58df7eb 100644 ---- a/Source/WebCore/platform/graphics/BifurcatedGraphicsContext.cpp -+++ b/Source/WebCore/platform/graphics/BifurcatedGraphicsContext.cpp -@@ -269,11 +269,13 @@ void BifurcatedGraphicsContext::drawPattern(NativeImage& nativeImage, const Floa - m_secondaryContext.drawPattern(nativeImage, imageSize, destRect, tileRect, patternTransform, phase, spacing, options); - } - -+#if ENABLE(VIDEO) - void BifurcatedGraphicsContext::paintFrameForMedia(MediaPlayer& player, const FloatRect& destination) - { - m_primaryContext.paintFrameForMedia(player, destination); - m_secondaryContext.paintFrameForMedia(player, destination); - } -+#endif - - void BifurcatedGraphicsContext::scale(const FloatSize& scale) - { -diff --git a/Source/WebCore/platform/graphics/x11/XUniqueResource.h b/Source/WebCore/platform/graphics/x11/XUniqueResource.h -index 0da8b0c9c0..9296efca23 100644 ---- a/Source/WebCore/platform/graphics/x11/XUniqueResource.h -+++ b/Source/WebCore/platform/graphics/x11/XUniqueResource.h -@@ -26,6 +26,8 @@ - #ifndef XUniqueResource_h - #define XUniqueResource_h - -+#include -+ - #if PLATFORM(X11) - - #if USE(GLX) --- -2.42.0 - diff --git a/patches/xf86-input-keyboard/xf86-input-keyboard.patch b/patches/xf86-input-keyboard/jinx-working-patch.patch similarity index 70% rename from patches/xf86-input-keyboard/xf86-input-keyboard.patch rename to patches/xf86-input-keyboard/jinx-working-patch.patch index 3e5fd43a031..0a158a9547e 100644 --- a/patches/xf86-input-keyboard/xf86-input-keyboard.patch +++ b/patches/xf86-input-keyboard/jinx-working-patch.patch @@ -1,31 +1,7 @@ -From 43c032ed1ae85352eca634ed92132242eee99f87 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sat, 12 Nov 2022 19:22:14 +1100 -Subject: [PATCH] keydev: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - .gitignore | 2 + - configure.ac | 5 +++ - src/Makefile.am | 7 +++- - src/aero_kbd.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 122 insertions(+), 1 deletion(-) - create mode 100644 src/aero_kbd.c - -diff --git a/.gitignore b/.gitignore -index 5f04578..f10deba 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -76,3 +76,5 @@ core - # Edit the following section as needed - # For example, !report.pc overrides *.pc. See 'man gitignore' - # -+# editor configs: -+.vscode -diff --git a/configure.ac b/configure.ac -index c3ebdf3..33b36f9 100644 ---- a/configure.ac -+++ b/configure.ac +diff --git xf86-input-keyboard-clean/configure.ac xf86-input-keyboard-workdir/configure.ac +index 0f71ce3..60616eb 100644 +--- xf86-input-keyboard-clean/configure.ac ++++ xf86-input-keyboard-workdir/configure.ac @@ -69,6 +69,10 @@ case $host_os in IS_SOLARIS="yes" ;; @@ -37,26 +13,25 @@ index c3ebdf3..33b36f9 100644 gnu*) IS_HURD="yes" ;; -@@ -95,6 +99,7 @@ case $host_os in - esac - AC_SUBST([OS_FLAGS]) - -+AM_CONDITIONAL(AERO, [test "x$IS_AERO" = xyes]) - AM_CONDITIONAL(LINUX, [test "x$IS_LINUX" = xyes]) +@@ -98,6 +102,7 @@ AC_SUBST([OS_FLAGS]) AM_CONDITIONAL(BSD, [test "x$IS_BSD" = xyes]) AM_CONDITIONAL(SOLARIS, [test "x$IS_SOLARIS" = xyes]) -diff --git a/src/Makefile.am b/src/Makefile.am -index 8612c87..fac400e 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -26,11 +26,16 @@ kbd_drv_la_SOURCES = kbd.c xf86OSKbd.h xf86Keymap.h atKeynames.h + AM_CONDITIONAL(HURD, [test "x$IS_HURD" = xyes]) ++AM_CONDITIONAL(AERO, [test "x$IS_AERO" = xyes]) + + DRIVER_NAME=kbd + AC_SUBST([DRIVER_NAME]) +diff --git xf86-input-keyboard-clean/src/Makefile.am xf86-input-keyboard-workdir/src/Makefile.am +index 52f5f4d..19bf4cb 100644 +--- xf86-input-keyboard-clean/src/Makefile.am ++++ xf86-input-keyboard-workdir/src/Makefile.am +@@ -26,10 +26,15 @@ kbd_drv_la_SOURCES = kbd.c xf86OSKbd.h xf86Keymap.h atKeynames.h kbd_drv_la_LIBADD = $(XORG_LIBS) kbd_drv_ladir = @inputdir@ +AERO_SRCS = aero_kbd.c at_scancode.c BSD_SRCS = bsd_KbdMap.c bsd_kbd.c bsd_kbd.h at_scancode.c HURD_SRCS = hurd_kbd.c at_scancode.c - LINUX_SRCS = lnx_KbdMap.c lnx_kbd.c lnx_kbd.h at_scancode.c SOLARIS_SRCS = sun_kbd.c sun_kbd.h sun_kbdMap.c +if AERO @@ -66,17 +41,17 @@ index 8612c87..fac400e 100644 if BSD kbd_drv_la_SOURCES += $(BSD_SRCS) endif -@@ -47,4 +52,4 @@ if HURD +@@ -42,4 +47,4 @@ if HURD kbd_drv_la_SOURCES += $(HURD_SRCS) endif --EXTRA_DIST = $(BSD_SRCS) $(HURD_SRCS) $(LINUX_SRCS) $(SOLARIS_SRCS) -+EXTRA_DIST = $(AERO_SRCS) $(BSD_SRCS) $(HURD_SRCS) $(LINUX_SRCS) $(SOLARIS_SRCS) -diff --git a/src/aero_kbd.c b/src/aero_kbd.c +-EXTRA_DIST = $(BSD_SRCS) $(HURD_SRCS) $(SOLARIS_SRCS) ++EXTRA_DIST = $(AERO_SRCS) $(BSD_SRCS) $(HURD_SRCS) $(SOLARIS_SRCS) +diff --git xf86-input-keyboard-workdir/src/aero_kbd.c xf86-input-keyboard-workdir/src/aero_kbd.c new file mode 100644 index 0000000..c9cbc4e --- /dev/null -+++ b/src/aero_kbd.c ++++ xf86-input-keyboard-workdir/src/aero_kbd.c @@ -0,0 +1,109 @@ +#ifdef HAVE_CONFIG_H +#include @@ -187,6 +162,3 @@ index 0000000..c9cbc4e + + return TRUE; +} --- -2.38.1 - diff --git a/patches/xf86-input-mouse/xf86-input-mouse.patch b/patches/xf86-input-mouse/jinx-working-patch.patch similarity index 69% rename from patches/xf86-input-mouse/xf86-input-mouse.patch rename to patches/xf86-input-mouse/jinx-working-patch.patch index 3b7fae010a9..44e626272e1 100644 --- a/patches/xf86-input-mouse/xf86-input-mouse.patch +++ b/patches/xf86-input-mouse/jinx-working-patch.patch @@ -1,47 +1,22 @@ -From 560b74fa3e234dced21e0bbf03ea444197b7da15 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sat, 4 Feb 2023 13:21:25 +1100 -Subject: [PATCH xf86-input-mouse] - ---- - configure.ac | 3 ++ - src/Makefile.am | 2 +- - src/aero_mouse.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 119 insertions(+), 1 deletion(-) - create mode 100644 src/aero_mouse.c - -diff --git a/configure.ac b/configure.ac -index 6c453cd..a3dd16d 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -81,6 +81,9 @@ case $host_os in - solaris*) - OS_MOUSE_NAME=sun +diff --git xf86-input-mouse-clean/configure.ac xf86-input-mouse-workdir/configure.ac +index 1d871b2..63361c7 100644 +--- xf86-input-mouse-clean/configure.ac ++++ xf86-input-mouse-workdir/configure.ac +@@ -84,6 +84,9 @@ case $host_os in + gnu*) + OS_MOUSE_NAME=hurd ;; + aero*) + OS_MOUSE_NAME=aero + ;; - gnu*) - OS_MOUSE_NAME=hurd - ;; -diff --git a/src/Makefile.am b/src/Makefile.am -index aad8d0e..6de4354 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -32,7 +32,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/include $(XORG_CFLAGS) - - # We have to list all the mouse drivers here, even if we don't build them, so - # they get included in distcheck. --OS_SRCS = bsd_mouse.c hurd_mouse.c lnx_mouse.c sun_mouse.c -+OS_SRCS = bsd_mouse.c hurd_mouse.c lnx_mouse.c sun_mouse.c aero_mouse.c + esac + AC_SUBST([OS_MOUSE_NAME]) - @DRIVER_NAME@_drv_la_SOURCES = \ - mouse.c \ -diff --git a/src/aero_mouse.c b/src/aero_mouse.c +diff --git xf86-input-mouse-workdir/src/aero_mouse.c xf86-input-mouse-workdir/src/aero_mouse.c new file mode 100644 -index 0000000..de18985 +index 0000000..5247c21 --- /dev/null -+++ b/src/aero_mouse.c ++++ xf86-input-mouse-workdir/src/aero_mouse.c @@ -0,0 +1,115 @@ +#include "mouse.h" +#include @@ -158,7 +133,3 @@ index 0000000..de18985 + + return p; +} -\ No newline at end of file --- -2.39.1 - diff --git a/patches/xf86-video-fbdev/0001-fbdev-aero-specific-changes.patch b/patches/xf86-video-fbdev/jinx-working-patch.patch similarity index 54% rename from patches/xf86-video-fbdev/0001-fbdev-aero-specific-changes.patch rename to patches/xf86-video-fbdev/jinx-working-patch.patch index 8b91b6fd2f8..40f8d0a7575 100644 --- a/patches/xf86-video-fbdev/0001-fbdev-aero-specific-changes.patch +++ b/patches/xf86-video-fbdev/jinx-working-patch.patch @@ -1,43 +1,7 @@ -From 4a125d73f79cffc1edb41c4a9e9c0524bbc0abbd Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sat, 2 Jul 2022 18:40:03 +1000 -Subject: [PATCH] fbdev: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - .gitignore | 2 ++ - configure.ac | 8 +++++--- - src/Makefile.am | 2 +- - src/fbdev.c | 8 +++++--- - 4 files changed, 13 insertions(+), 7 deletions(-) - -diff --git a/.gitignore b/.gitignore -index 1c9de22..69be940 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -76,3 +76,5 @@ core - # Edit the following section as needed - # For example, !report.pc overrides *.pc. See 'man gitignore' - # -+# editor configs: -+.vscode -diff --git a/configure.ac b/configure.ac -index 27778cd..11f5e38 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -56,9 +56,9 @@ AC_ARG_ENABLE(pciaccess, AS_HELP_STRING([--enable-pciaccess], - [PCIACCESS=$enableval], [PCIACCESS=no]) - - # Store the list of server defined optional extensions in REQUIRED_MODULES --XORG_DRIVER_CHECK_EXT(RANDR, randrproto) --XORG_DRIVER_CHECK_EXT(RENDER, renderproto) --XORG_DRIVER_CHECK_EXT(XV, videoproto) -+# XORG_DRIVER_CHECK_EXT(RANDR, randrproto) -+# XORG_DRIVER_CHECK_EXT(RENDER, renderproto) -+# XORG_DRIVER_CHECK_EXT(XV, videoproto) - - # Obtain compiler/linker options for the driver dependencies - PKG_CHECK_MODULES(XORG, [xorg-server >= 1.0.99.901 xproto fontsproto $REQUIRED_MODULES]) +diff --git xf86-video-fbdev-clean/configure.ac xf86-video-fbdev-workdir/configure.ac +index 27778cd..67436db 100644 +--- xf86-video-fbdev-clean/configure.ac ++++ xf86-video-fbdev-workdir/configure.ac @@ -86,6 +86,8 @@ AC_SUBST([moduledir]) DRIVER_NAME=fbdev AC_SUBST([DRIVER_NAME]) @@ -47,23 +11,23 @@ index 27778cd..11f5e38 100644 AC_CONFIG_FILES([ Makefile src/Makefile -diff --git a/src/Makefile.am b/src/Makefile.am -index fbe420e..6e0779c 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am +diff --git xf86-video-fbdev-clean/src/Makefile.am xf86-video-fbdev-workdir/src/Makefile.am +index fbe420e..1ef5f49 100644 +--- xf86-video-fbdev-clean/src/Makefile.am ++++ xf86-video-fbdev-workdir/src/Makefile.am @@ -25,7 +25,7 @@ # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc. AM_CFLAGS = @XORG_CFLAGS@ fbdev_drv_la_LTLIBRARIES = fbdev_drv.la -fbdev_drv_la_LDFLAGS = -module -avoid-version -+fbdev_drv_la_LDFLAGS = -module -avoid-version -R@moduledir@ -L@SYSROOT@@moduledir@ -lfb -lfbdevhw -lshadow ++fbdev_drv_la_LDFLAGS = -module -avoid-version -R@moduledir@ -L@SYSROOT@@moduledir@ -lfbdevhw -lshadow fbdev_drv_ladir = @moduledir@/drivers fbdev_drv_la_SOURCES = \ -diff --git a/src/fbdev.c b/src/fbdev.c +diff --git xf86-video-fbdev-clean/src/fbdev.c xf86-video-fbdev-workdir/src/fbdev.c index f25ef72..7facb9f 100644 ---- a/src/fbdev.c -+++ b/src/fbdev.c +--- xf86-video-fbdev-clean/src/fbdev.c ++++ xf86-video-fbdev-workdir/src/fbdev.c @@ -339,7 +339,7 @@ FBDevProbe(DriverPtr drv, int flags) dev = xf86FindOptionValue(devSections[i]->options,"fbdev"); @@ -106,7 +70,3 @@ index f25ef72..7facb9f 100644 +#ifdef XV { XF86VideoAdaptorPtr *ptr; - --- -2.25.1 - diff --git a/patches/xorg-proto/0001-xorg-proto-aero-specific-changes.patch b/patches/xorg-proto/0001-xorg-proto-aero-specific-changes.patch deleted file mode 100644 index 853f1a8f78f..00000000000 --- a/patches/xorg-proto/0001-xorg-proto-aero-specific-changes.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 30656370d8418d469ed311fad84412d12fe0028e Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Tue, 28 Jun 2022 17:04:52 +1000 -Subject: [PATCH] xorg::proto: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - .gitignore | 3 +++ - include/X11/Xos.h | 2 +- - include/X11/Xos_r.h | 2 +- - 3 files changed, 5 insertions(+), 2 deletions(-) - -diff --git a/.gitignore b/.gitignore -index 1baa360..dc18465 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -18,3 +18,6 @@ man/Xprint.7 - missing - stamp-h1 - stamp-h2 -+ -+# editor configs: -+.vscode -diff --git a/include/X11/Xos.h b/include/X11/Xos.h -index 28dfc67..1c4092e 100644 ---- a/include/X11/Xos.h -+++ b/include/X11/Xos.h -@@ -60,7 +60,7 @@ in this Software without prior written authorization from The Open Group. - */ - - # include --# if defined(__SCO__) || defined(__UNIXWARE__) || defined(__sun) || defined(__CYGWIN__) || defined(_AIX) || defined(__APPLE__) -+# if defined(__SCO__) || defined(__UNIXWARE__) || defined(__sun) || defined(__CYGWIN__) || defined(_AIX) || defined(__APPLE__) || defined(__aero__) - # include - # else - # ifndef index -diff --git a/include/X11/Xos_r.h b/include/X11/Xos_r.h -index f963b64..19ef5f4 100644 ---- a/include/X11/Xos_r.h -+++ b/include/X11/Xos_r.h -@@ -318,7 +318,7 @@ static __inline__ void _Xpw_copyPasswd(_Xgetpwparams p) - (_Xos_processUnlock), \ - (p).pwp ) - --#elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(__APPLE__) -+#elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(__APPLE__) && !defined(__aero__) - # define X_NEEDS_PWPARAMS - typedef struct { - struct passwd pws; --- -2.25.1 - diff --git a/patches/xorg-proto/jinx-working-patch.patch b/patches/xorg-proto/jinx-working-patch.patch new file mode 100644 index 00000000000..9c44f9bb503 --- /dev/null +++ b/patches/xorg-proto/jinx-working-patch.patch @@ -0,0 +1,27 @@ +diff --git xorg-proto-clean/include/X11/Xos.h xorg-proto-workdir/include/X11/Xos.h +index 75cc5b7..9adf88d 100644 +--- xorg-proto-clean/include/X11/Xos.h ++++ xorg-proto-workdir/include/X11/Xos.h +@@ -60,7 +60,7 @@ in this Software without prior written authorization from The Open Group. + */ + + # include +-# if defined(__SCO__) || defined(__UNIXWARE__) || defined(__sun) || defined(__CYGWIN__) || defined(_AIX) || defined(__APPLE__) || defined(__FreeBSD__) ++# if defined(__SCO__) || defined(__UNIXWARE__) || defined(__sun) || defined(__CYGWIN__) || defined(_AIX) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__aero__) + # include + # else + # ifndef index +diff --git xorg-proto-clean/include/X11/Xos_r.h xorg-proto-workdir/include/X11/Xos_r.h +index f963b64..5ade17b 100644 +--- xorg-proto-clean/include/X11/Xos_r.h ++++ xorg-proto-workdir/include/X11/Xos_r.h +@@ -318,7 +318,7 @@ static __inline__ void _Xpw_copyPasswd(_Xgetpwparams p) + (_Xos_processUnlock), \ + (p).pwp ) + +-#elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(__APPLE__) ++#elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(__APPLE__) && !defined(__aero__) + # define X_NEEDS_PWPARAMS + typedef struct { + struct passwd pws; + diff --git a/patches/xorg-server/xorg-server.patch b/patches/xorg-server/jinx-working-patch.patch similarity index 53% rename from patches/xorg-server/xorg-server.patch rename to patches/xorg-server/jinx-working-patch.patch index 9dc515d75fd..11667724116 100644 --- a/patches/xorg-server/xorg-server.patch +++ b/patches/xorg-server/jinx-working-patch.patch @@ -1,33 +1,27 @@ -From 6f785e20e4034b9016aa7e6cebc204f95b7808d6 Mon Sep 17 00:00:00 2001 -From: mintsuki -Date: Sun, 20 Feb 2022 06:19:57 +0100 -Subject: [PATCH] Lyre specific changes - ---- - configure.ac | 2 ++ - hw/xfree86/common/xf86Bus.c | 2 ++ - hw/xfree86/common/xf86Config.c | 2 ++ - hw/xfree86/common/xf86Configure.c | 2 ++ - hw/xfree86/common/xf86Events.c | 2 ++ - hw/xfree86/common/xf86Helper.c | 2 ++ - hw/xfree86/common/xf86Init.c | 2 ++ - hw/xfree86/fbdevhw/fbdevhw.c | 26 +++++++++++------------- - hw/xfree86/fbdevhw/fbdevhw.h | 4 ++-- - hw/xfree86/os-support/shared/posix_tty.c | 3 +++ - hw/xfree86/os-support/shared/sigio.c | 3 +++ - include/os.h | 1 + - mi/mibitblt.c | 2 ++ - os/access.c | 2 +- - os/ospoll.c | 2 ++ - os/utils.c | 4 ++-- - 16 files changed, 42 insertions(+), 19 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 0909cc5..f551571 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1966,6 +1966,8 @@ if test "x$XORG" = xyes; then - if test "x$DRM" = xyes; then +diff --git xorg-server-clean/configure.ac xorg-server-workdir/configure.ac +index fad7b57..ed4445c 100644 +--- xorg-server-clean/configure.ac ++++ xorg-server-workdir/configure.ac +@@ -1341,7 +1341,7 @@ AM_CONDITIONAL(INT10MODULE, test "x$INT10MODULE" = xyes) + AC_DEFINE(SHAPE, 1, [Support SHAPE extension]) + + if test "x$XKBPATH" = "xauto"; then +- XKBPATH=$(pkg-config --variable datadir xkbcomp || echo ${datadir})/X11/xkb ++ XKBPATH=$($PKG_CONFIG --variable datadir xkbcomp || echo ${datadir})/X11/xkb + fi + + AC_DEFINE_DIR(XKB_BASE_DIRECTORY, XKBPATH, [Path to XKB data]) +@@ -1351,7 +1351,7 @@ AC_ARG_WITH(xkb-bin-directory, + [XKB_BIN_DIRECTORY="auto"]) + + if test "x$XKB_BIN_DIRECTORY" = "xauto"; then +- XKB_BIN_DIRECTORY=$(pkg-config --variable bindir xkbcomp) ++ XKB_BIN_DIRECTORY=$($PKG_CONFIG --variable bindir xkbcomp) + if test -z $XKB_BIN_DIRECTORY; then + XKB_BIN_DIRECTORY="$bindir" + fi +@@ -1946,6 +1946,8 @@ if test "x$XORG" = xyes; then + if test "x$DRM" = xyes -a "x$DRI2" = xyes; then XORG_DRIVER_MODESETTING=yes fi + @@ -35,11 +29,20 @@ index 0909cc5..f551571 100644 AC_SUBST([XORG_LIBS]) AC_SUBST([XORG_SYS_LIBS]) -diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c -index a8f1073..1b1120a 100644 ---- a/hw/xfree86/common/xf86Bus.c -+++ b/hw/xfree86/common/xf86Bus.c -@@ -536,6 +536,7 @@ xf86GetDevFromEntity(int entityIndex, int instance) +@@ -2127,7 +2129,7 @@ dnl XWin requires OpenGL spec files in order to generate wrapper code for native + AC_MSG_RESULT(yes) + if test "x$KHRONOS_SPEC_DIR" = "xauto" ; then + PKG_CHECK_MODULES([KHRONOS_OPENGL_REGISTRY], [khronos-opengl-registry]) +- KHRONOS_SPEC_DIR=`pkg-config khronos-opengl-registry --variable=specdir` ++ KHRONOS_SPEC_DIR=`$PKG_CONFIG khronos-opengl-registry --variable=specdir` + fi + AC_SUBST(KHRONOS_SPEC_DIR) + fi +diff --git xorg-server-clean/hw/xfree86/common/xf86Bus.c xorg-server-workdir/hw/xfree86/common/xf86Bus.c +index fd144db..6eb018c 100644 +--- xorg-server-clean/hw/xfree86/common/xf86Bus.c ++++ xorg-server-workdir/hw/xfree86/common/xf86Bus.c +@@ -556,6 +556,7 @@ xf86GetDevFromEntity(int entityIndex, int instance) void xf86PostProbe(void) { @@ -47,18 +50,18 @@ index a8f1073..1b1120a 100644 if (fbSlotClaimed && ( #if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__) sbusSlotClaimed || -@@ -551,6 +552,7 @@ xf86PostProbe(void) +@@ -571,6 +572,7 @@ xf86PostProbe(void) )) FatalError("Cannot run in framebuffer mode. Please specify busIDs " " for all framebuffer devices\n"); +*/ } - int -diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c -index 09d27ec..83be062 100644 ---- a/hw/xfree86/common/xf86Config.c -+++ b/hw/xfree86/common/xf86Config.c + Bool +diff --git xorg-server-clean/hw/xfree86/common/xf86Config.c xorg-server-workdir/hw/xfree86/common/xf86Config.c +index 5d814c1..14ebfe6 100644 +--- xorg-server-clean/hw/xfree86/common/xf86Config.c ++++ xorg-server-workdir/hw/xfree86/common/xf86Config.c @@ -49,6 +49,8 @@ #include #include @@ -68,10 +71,10 @@ index 09d27ec..83be062 100644 #include "xf86.h" #include "xf86Modes.h" #include "xf86Parser.h" -diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c -index 44e7591..86d48d5 100644 ---- a/hw/xfree86/common/xf86Configure.c -+++ b/hw/xfree86/common/xf86Configure.c +diff --git xorg-server-clean/hw/xfree86/common/xf86Configure.c xorg-server-workdir/hw/xfree86/common/xf86Configure.c +index 4347f6d..52594c6 100644 +--- xorg-server-clean/hw/xfree86/common/xf86Configure.c ++++ xorg-server-workdir/hw/xfree86/common/xf86Configure.c @@ -27,6 +27,8 @@ #include #endif @@ -81,10 +84,10 @@ index 44e7591..86d48d5 100644 #include "xf86.h" #include "xf86Config.h" #include "xf86_OSlib.h" -diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c -index 8a800bd..ec5d33d 100644 ---- a/hw/xfree86/common/xf86Events.c -+++ b/hw/xfree86/common/xf86Events.c +diff --git xorg-server-clean/hw/xfree86/common/xf86Events.c xorg-server-workdir/hw/xfree86/common/xf86Events.c +index 395bbc7..4bf86cb 100644 +--- xorg-server-clean/hw/xfree86/common/xf86Events.c ++++ xorg-server-workdir/hw/xfree86/common/xf86Events.c @@ -53,6 +53,8 @@ #include #endif @@ -94,10 +97,10 @@ index 8a800bd..ec5d33d 100644 #include #include #include -diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c -index 42a51dd..64af1dc 100644 ---- a/hw/xfree86/common/xf86Helper.c -+++ b/hw/xfree86/common/xf86Helper.c +diff --git xorg-server-clean/hw/xfree86/common/xf86Helper.c xorg-server-workdir/hw/xfree86/common/xf86Helper.c +index 0389945..b53b1a7 100644 +--- xorg-server-clean/hw/xfree86/common/xf86Helper.c ++++ xorg-server-workdir/hw/xfree86/common/xf86Helper.c @@ -38,6 +38,8 @@ #include #endif @@ -105,12 +108,12 @@ index 42a51dd..64af1dc 100644 +#include + #include + #include "mi.h" #include "os.h" - #include "servermd.h" -diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c -index 2ec6b2f..c1d9c24 100644 ---- a/hw/xfree86/common/xf86Init.c -+++ b/hw/xfree86/common/xf86Init.c +diff --git xorg-server-clean/hw/xfree86/common/xf86Init.c xorg-server-workdir/hw/xfree86/common/xf86Init.c +index 5695e71..96c2d15 100644 +--- xorg-server-clean/hw/xfree86/common/xf86Init.c ++++ xorg-server-workdir/hw/xfree86/common/xf86Init.c @@ -37,6 +37,8 @@ #include #include @@ -120,10 +123,10 @@ index 2ec6b2f..c1d9c24 100644 #undef HAS_UTSNAME #if !defined(WIN32) #define HAS_UTSNAME 1 -diff --git a/hw/xfree86/fbdevhw/fbdevhw.c b/hw/xfree86/fbdevhw/fbdevhw.c -index 9508951..bce130c 100644 ---- a/hw/xfree86/fbdevhw/fbdevhw.c -+++ b/hw/xfree86/fbdevhw/fbdevhw.c +diff --git xorg-server-clean/hw/xfree86/fbdevhw/fbdevhw.c xorg-server-workdir/hw/xfree86/fbdevhw/fbdevhw.c +index 3d8b92e..f7be685 100644 +--- xorg-server-clean/hw/xfree86/fbdevhw/fbdevhw.c ++++ xorg-server-workdir/hw/xfree86/fbdevhw/fbdevhw.c @@ -10,12 +10,12 @@ #include "xf86_OSproc.h" @@ -161,7 +164,7 @@ index 9508951..bce130c 100644 /* only touch non-PCI devices on this path */ +/* { - char buf[PATH_MAX]; + char buf[PATH_MAX] = {0}; char *sysfs_path = NULL; @@ -344,6 +347,7 @@ fbdev_open(int scrnIndex, const char *dev, char **namep) } @@ -227,10 +230,10 @@ index 9508951..bce130c 100644 goto RETRY; default: fPtr->unsupported_ioctls |= (1 << FBIOBLANK_UNSUPPORTED); -diff --git a/hw/xfree86/fbdevhw/fbdevhw.h b/hw/xfree86/fbdevhw/fbdevhw.h +diff --git xorg-server-clean/hw/xfree86/fbdevhw/fbdevhw.h xorg-server-workdir/hw/xfree86/fbdevhw/fbdevhw.h index 4984ccf..bb3e2f8 100644 ---- a/hw/xfree86/fbdevhw/fbdevhw.h -+++ b/hw/xfree86/fbdevhw/fbdevhw.h +--- xorg-server-clean/hw/xfree86/fbdevhw/fbdevhw.h ++++ xorg-server-workdir/hw/xfree86/fbdevhw/fbdevhw.h @@ -16,9 +16,9 @@ extern _X_EXPORT void fbdevHWFreeRec(ScrnInfoPtr pScrn); extern _X_EXPORT int fbdevHWGetFD(ScrnInfoPtr pScrn); @@ -243,10 +246,10 @@ index 4984ccf..bb3e2f8 100644 char *device); extern _X_EXPORT char *fbdevHWGetName(ScrnInfoPtr pScrn); -diff --git a/hw/xfree86/os-support/shared/posix_tty.c b/hw/xfree86/os-support/shared/posix_tty.c +diff --git xorg-server-clean/hw/xfree86/os-support/shared/posix_tty.c xorg-server-workdir/hw/xfree86/os-support/shared/posix_tty.c index 0cb9788..e8cac5d 100644 ---- a/hw/xfree86/os-support/shared/posix_tty.c -+++ b/hw/xfree86/os-support/shared/posix_tty.c +--- xorg-server-clean/hw/xfree86/os-support/shared/posix_tty.c ++++ xorg-server-workdir/hw/xfree86/os-support/shared/posix_tty.c @@ -56,6 +56,9 @@ #include #endif @@ -257,10 +260,10 @@ index 0cb9788..e8cac5d 100644 #include #include #include "xf86.h" -diff --git a/hw/xfree86/os-support/shared/sigio.c b/hw/xfree86/os-support/shared/sigio.c -index 247bec7..216e8cd 100644 ---- a/hw/xfree86/os-support/shared/sigio.c -+++ b/hw/xfree86/os-support/shared/sigio.c +diff --git xorg-server-clean/hw/xfree86/os-support/shared/sigio.c xorg-server-workdir/hw/xfree86/os-support/shared/sigio.c +index ad8af60..6f81278 100644 +--- xorg-server-clean/hw/xfree86/os-support/shared/sigio.c ++++ xorg-server-workdir/hw/xfree86/os-support/shared/sigio.c @@ -56,6 +56,9 @@ #include #endif @@ -271,22 +274,22 @@ index 247bec7..216e8cd 100644 #include #include #include "xf86.h" -diff --git a/include/os.h b/include/os.h -index 2a1c29e..2a7fc76 100644 ---- a/include/os.h -+++ b/include/os.h -@@ -51,6 +51,7 @@ SOFTWARE. - #include - #include +diff --git xorg-server-clean/include/os.h xorg-server-workdir/include/os.h +index 7db2408..8862645 100644 +--- xorg-server-clean/include/os.h ++++ xorg-server-workdir/include/os.h +@@ -54,6 +54,7 @@ SOFTWARE. + #include /* for reallocarray */ + #endif #include +#include #ifdef MONOTONIC_CLOCK #include #endif -diff --git a/mi/mibitblt.c b/mi/mibitblt.c -index 43d9bd9..740c0d2 100644 ---- a/mi/mibitblt.c -+++ b/mi/mibitblt.c +diff --git xorg-server-clean/mi/mibitblt.c xorg-server-workdir/mi/mibitblt.c +index 0b13e49..aff6539 100644 +--- xorg-server-clean/mi/mibitblt.c ++++ xorg-server-workdir/mi/mibitblt.c @@ -49,6 +49,8 @@ SOFTWARE. #include #endif @@ -296,12 +299,12 @@ index 43d9bd9..740c0d2 100644 #include #include -diff --git a/os/access.c b/os/access.c -index 9724616..3c4376a 100644 ---- a/os/access.c -+++ b/os/access.c -@@ -117,7 +117,7 @@ SOFTWARE. - #endif +diff --git xorg-server-clean/os/access.c xorg-server-workdir/os/access.c +index 61ee8e3..24cabae 100644 +--- xorg-server-clean/os/access.c ++++ xorg-server-workdir/os/access.c +@@ -120,7 +120,7 @@ SOFTWARE. + #include #endif -#if defined(SVR4) || (defined(SYSV) && defined(__i386__)) || defined(__GNU__) @@ -309,10 +312,10 @@ index 9724616..3c4376a 100644 #include #endif #if defined(SYSV) && defined(__i386__) -diff --git a/os/ospoll.c b/os/ospoll.c +diff --git xorg-server-clean/os/ospoll.c xorg-server-workdir/os/ospoll.c index c68aabc..a3217dc 100644 ---- a/os/ospoll.c -+++ b/os/ospoll.c +--- xorg-server-clean/os/ospoll.c ++++ xorg-server-workdir/os/ospoll.c @@ -45,11 +45,13 @@ #define HAVE_OSPOLL 1 #endif @@ -327,11 +330,11 @@ index c68aabc..a3217dc 100644 #if !HAVE_OSPOLL #include "xserver_poll.h" -diff --git a/os/utils.c b/os/utils.c -index 2ba1c80..63dedc6 100644 ---- a/os/utils.c -+++ b/os/utils.c -@@ -1402,7 +1402,7 @@ System(const char *command) +diff --git xorg-server-clean/os/utils.c xorg-server-workdir/os/utils.c +index 92a66e8..f29b359 100644 +--- xorg-server-clean/os/utils.c ++++ xorg-server-workdir/os/utils.c +@@ -1403,7 +1403,7 @@ System(const char *command) return -1; } @@ -340,7 +343,16 @@ index 2ba1c80..63dedc6 100644 } static struct pid { -@@ -1632,7 +1632,7 @@ Pclose(void *iop) +@@ -1475,7 +1475,7 @@ Popen(const char *command, const char *type) + } + close(pdes[1]); + } +- execl("/bin/sh", "sh", "-c", command, (char *) NULL); ++ execl("/usr/bin/sh", "sh", "-c", command, (char *) NULL); + _exit(127); + } + +@@ -1633,7 +1633,7 @@ Pclose(void *iop) } #endif @@ -349,5 +361,3 @@ index 2ba1c80..63dedc6 100644 } int --- -2.35.1 diff --git a/patches/xorg-xinit/jinx-working-patch.patch b/patches/xorg-xinit/jinx-working-patch.patch new file mode 100644 index 00000000000..b21b01acafb --- /dev/null +++ b/patches/xorg-xinit/jinx-working-patch.patch @@ -0,0 +1,13 @@ +diff --git xorg-xinit-clean/startx.cpp xorg-xinit-workdir/startx.cpp +index dfbebe1..99a0586 100644 +--- xorg-xinit-clean/startx.cpp ++++ xorg-xinit-workdir/startx.cpp +@@ -127,6 +127,8 @@ if defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read + defaultserverargs="$defaultserverargs -dpi `defaults read $X11_PREFS_DOMAIN dpi`" + fi + ++#elif defined(__aero__) ++enable_xauth=0 + #else + enable_xauth=1 + #endif diff --git a/patches/xorg-xinit/xorg-xinit.patch b/patches/xorg-xinit/xorg-xinit.patch deleted file mode 100644 index 800ec95d404..00000000000 --- a/patches/xorg-xinit/xorg-xinit.patch +++ /dev/null @@ -1,25 +0,0 @@ -From e071d54e12c9feaa8bfd19f52247d13d45e94ab2 Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Sat, 10 Dec 2022 19:17:27 +1100 -Subject: [PATCH] - ---- - startx.cpp | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/startx.cpp b/startx.cpp -index 1c6fce0..e42051c 100644 ---- a/startx.cpp -+++ b/startx.cpp -@@ -113,6 +113,8 @@ if defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read - defaultserverargs="$defaultserverargs -dpi `defaults read $X11_PREFS_DOMAIN dpi`" - fi - -+#elif defined(__aero__) -+enable_xauth=0 - #else - enable_xauth=1 - #endif --- -2.38.1 - diff --git a/patches/zlib/0001-zlib-aero-specific-changes.patch b/patches/zlib/0001-zlib-aero-specific-changes.patch deleted file mode 100644 index 4efc38d0efa..00000000000 --- a/patches/zlib/0001-zlib-aero-specific-changes.patch +++ /dev/null @@ -1,26 +0,0 @@ -From b0efeeaf9b78c440328295f17224fa3128d85d7d Mon Sep 17 00:00:00 2001 -From: Andy-Python-Programmer -Date: Tue, 28 Jun 2022 17:38:43 +1000 -Subject: [PATCH] zlib: aero specific changes - -Signed-off-by: Andy-Python-Programmer ---- - configure | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/configure b/configure -index 52ff4a0..6fbfb91 100755 ---- a/configure -+++ b/configure -@@ -218,7 +218,7 @@ if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then - uname=`(uname -s || echo unknown) 2>/dev/null` - fi - case "$uname" in -- Linux* | linux* | GNU | GNU/* | solaris*) -+ Linux* | linux* | GNU | GNU/* | solaris* | aero*) - LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"} ;; - *BSD | *bsd* | DragonFly) - LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"} --- -2.25.1 - diff --git a/recipes/at-spi2-core b/recipes/at-spi2-core new file mode 100644 index 00000000000..901136259c6 --- /dev/null +++ b/recipes/at-spi2-core @@ -0,0 +1,22 @@ +name=at-spi2-core +version=2.51.0 +revision=1 +tarball_url="https://download.gnome.org/sources/at-spi2-core/2.51/at-spi2-core-${version}.tar.xz" +tarball_blake2b="67a622f1ffba322183c6c04c8de6311bceb48f6ad6d34ad7bc33b22ab0c695a5395b5aad729eff699ab1c0525d1a4059c30899b03be8656e87204ec4333e432c" +imagedeps="meson ninja" +hostdeps="gcc pkg-config" +deps="core-libs dbus glib libxml" + +build() { + meson_configure \ + -Dsystemd_user_dir=/tmp \ + -Dintrospection=disabled + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/autoconf-archive b/recipes/autoconf-archive new file mode 100644 index 00000000000..5e70163b0cf --- /dev/null +++ b/recipes/autoconf-archive @@ -0,0 +1,12 @@ +name=autoconf-archive +version=2023.02.20 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/autoconf-archive/autoconf-archive-${version}.tar.xz" +tarball_blake2b="a72469e61a6ef702cbf4e30712c7dbe36369da7dad6e2312eb7026af41a989a47ded0a27975349486b69155f9e8199f89720dc57f98440b2766294a0f8755ee6" + +package() { + mkdir -p "${dest_dir}${prefix}"/share/aclocal + cp -r "${source_dir}"/m4/. "${dest_dir}${prefix}"/share/aclocal/ + + post_package_strip +} diff --git a/recipes/base-files b/recipes/base-files new file mode 100644 index 00000000000..b29669d9ad3 --- /dev/null +++ b/recipes/base-files @@ -0,0 +1,8 @@ +name=base-files +version=0.0 +revision=1 +source_dir="base-files" + +package() { + cp -rpv ${source_dir}/. "${dest_dir}"/ +} diff --git a/recipes/bash b/recipes/bash new file mode 100644 index 00000000000..82e670a674c --- /dev/null +++ b/recipes/bash @@ -0,0 +1,30 @@ +name=bash +version=5.2.21 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/bash/bash-${version}.tar.gz" +tarball_blake2b="6789c9a0d9eb1ad167d4199bf1438d77934a7bbeae9f9fdd7167cae006b17b3894852440248db1bb6e9cf6d930e8a18b6448a3bb4db8831b2e6d1445b56a2065" +source_hostdeps="autoconf automake libtool pkg-config" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs ncurses readline" + +regenerate() { + AUTOHEADER=true autoreconf -fvi +} + +build() { + autotools_configure \ + --with-curses \ + --enable-readline \ + --without-bash-malloc \ + --with-installed-readline="${sysroot}/usr/lib" + + make -j${parallelism} +} + +package() { + make install DESTDIR="${dest_dir}" + ln -s bash "${dest_dir}${prefix}"/bin/sh + + post_package_strip +} diff --git a/recipes/binutils b/recipes/binutils new file mode 100644 index 00000000000..5328b30c325 --- /dev/null +++ b/recipes/binutils @@ -0,0 +1,40 @@ +name=binutils +version=2.41 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/binutils/binutils-${version}.tar.xz" +tarball_blake2b="3bccec2b52f7e82a727121bf2a2e51a6249ba63dcd74c665fd834e858645c912ffd8245d848435288b938852830b482905606f55c40df4061215fd75c52ffc75" +source_hostdeps="autoconf-2.69 automake libtool pkg-config" +imagedeps="gcc" +hostdeps="gcc autoconf-2.69 automake libtool pkg-config" +deps="core-libs zlib gmp" + +regenerate() { + autotools_recursive_regen -I"$(realpath ./config)" + + cp -pv /usr/local/share/libtool/build-aux/{config.sub,config.guess,install-sh} libiberty/ +} + +build() { + autotools_configure \ + --target=${OS_TRIPLET} \ + --disable-werror \ + --disable-dependency-tracking \ + --enable-colored-disassembly \ + --with-system-zlib \ + --with-gmp=${sysroot_dir}/usr + + SFRAME_LIB_PATH="-L$(pwd -P)/libsframe/.libs" \ + make -j${parallelism} all +} + +package() { + DESTDIR="${dest_dir}" make install + + # Remove unnecessary directory + rm -rf "${dest_dir}${prefix}"/${OS_TRIPLET} + + # Remove static libraries + rm -rf "${dest_dir}${prefix}"/lib/*.a + + post_package_strip +} diff --git a/recipes/bzip2 b/recipes/bzip2 new file mode 100644 index 00000000000..f0f064df6af --- /dev/null +++ b/recipes/bzip2 @@ -0,0 +1,66 @@ +name=bzip2 +version=1.0.8 +revision=1 +tarball_url="https://sourceware.org/ftp/bzip2/bzip2-${version}.tar.gz" +tarball_blake2b="22ab3acd84f4db8c3d6f59340c252faedfd4447cea00dafbd652e65b6cf8a20adf6835c22e58563004cfafdb15348c924996230b4b23cae42da5e25eeac4bdad" +hostdeps="gcc pkg-config" +deps="core-libs" + +build() { + cp -r ${source_dir}/. . + sed -i 's/all: libbz2.a bzip2 bzip2recover test/all: libbz2.a bzip2 bzip2recover/g' Makefile + + make CC=${OS_TRIPLET}-gcc CFLAGS="$CFLAGS -fPIC" -f Makefile-libbz2_so + make clean + make CC=${OS_TRIPLET}-gcc AR=${OS_TRIPLET}-ar CFLAGS="$CFLAGS -fPIC" -j${parallelism} +} + +package() { + mkdir -p "${dest_dir}${prefix}/bin" "${dest_dir}${prefix}/lib" "${dest_dir}${prefix}/lib/pkgconfig" "${dest_dir}${prefix}/include" + install bzip2-shared "${dest_dir}${prefix}/bin/bzip2" + install bzip2recover "${dest_dir}${prefix}/bin/" + install bzdiff "${dest_dir}${prefix}/bin/" + install bzgrep "${dest_dir}${prefix}/bin/" + install bzmore "${dest_dir}${prefix}/bin/" + install libbz2.so.${version} "${dest_dir}${prefix}/lib/" + install -m 644 bzlib.h "${dest_dir}${prefix}/include/" + ln -sf libbz2.so.${version} "${dest_dir}${prefix}/lib/libbz2.so.1.0" + ln -sf libbz2.so.1.0 "${dest_dir}${prefix}/lib/libbz2.so.1" + ln -sf libbz2.so.1 "${dest_dir}${prefix}/lib/libbz2.so" + ln -sf bzdiff "${dest_dir}${prefix}/bin/bzcmp" + ln -sf bzgrep "${dest_dir}${prefix}/bin/bzegrep" + ln -sf bzgrep "${dest_dir}${prefix}/bin/bzfgrep" + ln -sf bzmore "${dest_dir}${prefix}/bin/bzless" + cat <"${dest_dir}${prefix}/lib/pkgconfig/bzip2.pc" +prefix=${prefix} +exec_prefix=${prefix}/bin +libdir=${prefix}/lib +sharedlibdir=${prefix}/lib +includedir=${prefix}/include + +Name: bzip2 +Description: BZip2 compression library +Version: ${version} + +Requires: +Libs: -L${prefix}/lib -lbz2 +Cflags: -I${prefix}/include +EOF + cat <"${dest_dir}${prefix}/lib/pkgconfig/libbz2.pc" +prefix=${prefix} +exec_prefix=${prefix}/bin +libdir=${prefix}/lib +sharedlibdir=${prefix}/lib +includedir=${prefix}/include + +Name: libbz2 +Description: BZip2 compression library +Version: ${version} + +Requires: +Libs: -L${prefix}/lib -lbz2 +Cflags: -I${prefix}/include +EOF + + post_package_strip +} diff --git a/recipes/cairo b/recipes/cairo new file mode 100644 index 00000000000..59ae52ed272 --- /dev/null +++ b/recipes/cairo @@ -0,0 +1,24 @@ +name=cairo +version=1.18.0 +revision=1 +tarball_url="https://cairographics.org/releases/cairo-${version}.tar.xz" +tarball_blake2b="6f6abedb2614e3dd1eed7fcb97cd11296584fb2072617ab3d532bee94e6a83db003ce770d39ba1df84c96a9f6880f4de357f78a22904daf1bb874c9570abd336" +imagedeps="meson ninja binutils" +hostdeps="gcc pkg-config" +deps="core-libs freetype2 fontconfig libpng pixman libxcb libx11 libxext mesa libxrender glib zlib" + +build() { + meson_configure \ + -Dxlib-xcb=enabled \ + -Dzlib=enabled \ + -Dtee=enabled \ + -Dtests=disabled + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/core-libs b/recipes/core-libs new file mode 100644 index 00000000000..32ab76cd3a8 --- /dev/null +++ b/recipes/core-libs @@ -0,0 +1,3 @@ +name=core-libs +revision=1 +deps="mlibc libgcc libstdc++ libintl libiconv libxcrypt" diff --git a/recipes/coreutils b/recipes/coreutils new file mode 100644 index 00000000000..0e228af75ef --- /dev/null +++ b/recipes/coreutils @@ -0,0 +1,40 @@ +name=coreutils +version=9.4 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/coreutils/coreutils-${version}.tar.xz" +tarball_blake2b="83d41c48804c1d470c0e5eed38e692bb6875436dda3f6e2c29784ad6ef563d86e8e066a050e222621b400f78ea4630b1e127d20fc9b76f12096528c42677e35d" +source_imagedeps="gcc gperf" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="gcc gperf" +hostdeps="gcc automake autoconf libtool pkg-config" +deps="core-libs tzdata" + +regenerate() { + autotools_recursive_regen + + # Huge hack: coreutils does not compile the build-machine binary make-prime-list + # using the build-machine compiler. Hence, build and invoke the binary manually here. + mkdir tmp_build_dir + pushd tmp_build_dir + + ../configure + make src/make-prime-list + ./src/make-prime-list 5000 > ../src/primes.h + + popd + rm -rf tmp_build_dir +} + +build() { + cp -rp "${source_dir}"/. ./ + + configure_script_path=./configure \ + CFLAGS="-DSLOW_BUT_NO_HACKS $CFLAGS" \ + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install-strip +} diff --git a/recipes/cxxshim b/recipes/cxxshim new file mode 100644 index 00000000000..b10c6bbc26c --- /dev/null +++ b/recipes/cxxshim @@ -0,0 +1,21 @@ +name=cxxshim +version=6f146a41dda736572879fc524cf729eb193dc0a6 +revision=1 +tarball_url="https://github.com/managarm/cxxshim/archive/${version}.tar.gz" +tarball_blake2b="05d8cbad3d46b4272c7e31b1c8041cc5e640cc66853dddf58af953aeba6697dcbc05decb01dc6d4669fec52acd18b3265706dbf710d11dd98e7c1771ac598a49" +imagedeps="meson ninja" +hostdeps="pkg-config" + +build() { + meson_configure \ + --includedir=share/cxxshim/include \ + -Dinstall_headers=true + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/dbus b/recipes/dbus new file mode 100644 index 00000000000..d1cc1b85d6e --- /dev/null +++ b/recipes/dbus @@ -0,0 +1,39 @@ +name=dbus +version=1.15.8 +revision=1 +tarball_url="https://dbus.freedesktop.org/releases/dbus/dbus-${version}.tar.xz" +tarball_blake2b="7c1962dfccc6a1b6250e80b0706d7f44536fabeff009013865ec4b1edaec6d4b47dcbe8f78caa61ef7aef4bac6b79f0e2027dd16bbb2baae328429e648bf8b8c" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="autoconf-archive" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs glib libexpat" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --runstatedir=/run \ + --disable-doxygen-docs \ + --disable-xml-docs \ + --with-systemdsystemunitdir=no \ + --with-systemduserunitdir=no \ + --with-system-pid-file=/run/dbus/pid \ + --with-system-socket=/run/dbus/system_bus_socket \ + --disable-selinux \ + --disable-apparmor \ + --disable-libaudit \ + --disable-kqueue \ + --disable-launchd \ + --disable-systemd \ + --disable-tests + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/fontconfig b/recipes/fontconfig new file mode 100644 index 00000000000..4e6189696c7 --- /dev/null +++ b/recipes/fontconfig @@ -0,0 +1,29 @@ +name=fontconfig +version=2.14.2 +revision=1 +tarball_url="https://www.freedesktop.org/software/fontconfig/release/fontconfig-${version}.tar.xz" +tarball_blake2b="4efeeb7f9a6705d493128d00b60e681a20a47556f4c0d7787a5c7a6d2cbbc22f150cad7988a9836a9e72aeb61e2b6a196c00a071c7042c62283c7720cdbb743d" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="python gperf" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs freetype2 libexpat libxml" + +regenerate() { + autotools_recursive_regen + + # Make sure we regenerate this file + rm -f src/fcobjshash.h +} + +build() { + autotools_configure \ + --enable-libxml2 + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/freeglut b/recipes/freeglut new file mode 100644 index 00000000000..ca4e5d1f5ae --- /dev/null +++ b/recipes/freeglut @@ -0,0 +1,28 @@ +name=freeglut +version=3.4.0 +revision=1 +tarball_url="https://github.com/FreeGLUTProject/freeglut/releases/download/v${version}/freeglut-${version}.tar.gz" +tarball_blake2b="47b073c4e81473417358452ede3891b6fc36e324f66eec42fcbbadebb2144680e3b52caded504135239e170fd8f30a1fe8b6666a746b06d48cd7226c98a8114e" +imagedeps="gcc ninja python git" +hostdeps="gcc cmake pkg-config" +deps="core-libs libxi mesa glu" + +build() { + cmake \ + -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=${base_dir}/userland/CMakeToolchain-x86_64.cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=ON \ + -DFREEGLUT_BUILD_DEMOS=OFF \ + -DFREEGLUT_BUILD_STATIC_LIBS=OFF \ + ${source_dir} + + ninja +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/freetype2 b/recipes/freetype2 new file mode 100644 index 00000000000..a330732f3aa --- /dev/null +++ b/recipes/freetype2 @@ -0,0 +1,21 @@ +name=freetype2 +version=2.13.2 +revision=1 +tarball_url="https://download.savannah.gnu.org/releases/freetype/freetype-${version}.tar.xz" +tarball_blake2b="cebc82180d9afaeb112a65ba78903d7bf7a9295a803166a033585ad2325add6023f05066852240c4665e56285345ba503b01ecd461d48f0478a8f3f56136988e" +source_hostdeps="pkg-config" +imagedeps="meson gcc" +hostdeps="gcc pkg-config" +deps="core-libs bzip2 libpng zlib" + +build() { + meson_configure + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/fribidi b/recipes/fribidi new file mode 100644 index 00000000000..a49d73a6d22 --- /dev/null +++ b/recipes/fribidi @@ -0,0 +1,25 @@ +name=fribidi +version=1.0.13 +revision=1 +tarball_url="https://github.com/fribidi/fribidi/releases/download/v${version}/fribidi-${version}.tar.xz" +tarball_blake2b="8cc31220304ddbdeb0047b30ed9084921920b32ad3f1bdcf29ecbb2fafbd430c391bc99bb7f205546ff8482aea1ef7ed369da71deb3474aa623fc2aeace1b62a" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/frigg b/recipes/frigg new file mode 100644 index 00000000000..84df948df6d --- /dev/null +++ b/recipes/frigg @@ -0,0 +1,22 @@ +name=frigg +version=a24e99eeb3125e7f48f657ff8afca26a9ac4aaae +revision=1 +tarball_url="https://github.com/managarm/frigg/archive/${version}.tar.gz" +tarball_blake2b="bb47eb23f4a0d6cc31d8d2345d424d713f4c0f7b02c28a5a17d937023e778961a9a3a553facfdd60ce58d45da2479e6018ecbb9b39f9bf87c30995bb19698666" +imagedeps="gcc meson ninja" +hostdeps="pkg-config" + +build() { + meson_configure \ + --includedir=share/frigg/include \ + --buildtype=debugoptimized \ + -Dbuild_tests=disabled + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/gcc b/recipes/gcc new file mode 100644 index 00000000000..9fe89c5f762 --- /dev/null +++ b/recipes/gcc @@ -0,0 +1,48 @@ +name=gcc +version=13.2.0 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/gcc/gcc-${version}/gcc-${version}.tar.xz" +tarball_blake2b="0034b29d3d6cc05821f0c4253ce077805943aff7b370729dd203bda57d89c107edd657eeddc2fb1e69ea15c7b0323b961f46516c7f4af89a3ccf7fea84701be2" +source_hostdeps="automake autoconf-2.69 libtool pkg-config" +source_imagedeps="git" +hostdeps="gcc autoconf-2.69 automake libtool pkg-config" +deps="core-libs binutils zlib gmp mpfr mpc" +imagedeps="gcc" + +regenerate() { + for i in "${base_dir}"/patches/gcc-host/*; do + patch -p1 < "$i" + done + + autotools_recursive_regen -I"$(realpath ./config)" + + cp -pv /usr/local/share/libtool/build-aux/{config.sub,config.guess,install-sh} libiberty/ +} + +build() { + CXXFLAGS_FOR_TARGET="$CFLAGS" \ + CFLAGS_FOR_TARGET="$CFLAGS" \ + autotools_configure \ + --target=${OS_TRIPLET} \ + --with-sysroot=/ \ + --with-build-sysroot=${sysroot_dir} \ + --enable-languages=c,c++,lto \ + --enable-initfini-array \ + --disable-multilib \ + --with-system-zlib \ + --enable-host-shared \ + --with-pkgversion=aero \ + --with-bugurl="https://github.com/Andy-Python-Programmer/aero/issues" + + make -j${parallelism} all-gcc +} + +package() { + DESTDIR="${dest_dir}" make install-gcc + + ln -s gcc "${dest_dir}${prefix}"/bin/cc + # Remove static libraries + rm -rf "${dest_dir}${prefix}"/lib/*.a + + post_package_strip +} diff --git a/recipes/gdk-pixbuf b/recipes/gdk-pixbuf new file mode 100644 index 00000000000..3991fd4537f --- /dev/null +++ b/recipes/gdk-pixbuf @@ -0,0 +1,22 @@ +name=gdk-pixbuf +version=2.42.10 +revision=1 +tarball_url="https://download.gnome.org/sources/gdk-pixbuf/2.42/gdk-pixbuf-${version}.tar.xz" +tarball_blake2b="b6bec388b70a971ea5b336001920fdf433bcbc539d54e62c7b6198e968f0bd3560ef9adc94215b64b01e7d5db69c95d5a1d32654b38b051fceb75e93666b3385" +imagedeps="meson ninja" +hostdeps="gcc pkg-config" +deps="core-libs glib libjpeg-turbo libpng libx11 libtiff" + +build() { + meson_configure \ + -Dgio_sniffing=false \ + -Dman=false + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/gettext b/recipes/gettext new file mode 100644 index 00000000000..bdceb9d1f3c --- /dev/null +++ b/recipes/gettext @@ -0,0 +1,41 @@ +name=gettext +version=0.22.4 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/gettext/gettext-${version}.tar.xz" +tarball_blake2b="3f93aa5aef8e40d2e01acaa5aeed11efefd0de43ea26d084a0b9e743019685f7584d8e1bf05c1fd5772a5576d21ee1f052b81366f52c7827b6d14bd4d9890edc" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + ( cd gettext-runtime/libasprintf && autoreconf -fvi ) + ( cd gettext-runtime/intl && autoreconf -fvi ) + ( cd gettext-runtime && autoreconf -fvi ) + ( cd gettext-tools && autoreconf -fvi ) + ( cd libtextstyle && autoreconf -fvi ) + autoreconf -fvi +} + +build() { + cp -rp ${source_dir}/. ./ + + ACLOCAL=true \ + AUTOCONF=true \ + AUTOMAKE=true \ + AUTOHEADER=true \ + configure_script_path=./configure \ + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + # Remove conflicting libintl files + rm -f "${dest_dir}${prefix}"/include/libintl.h + rm -f "${dest_dir}${prefix}"/lib/libintl.so* + rm -f "${dest_dir}${prefix}"/share/locale/locale.alias + + post_package_strip +} diff --git a/recipes/glib b/recipes/glib new file mode 100644 index 00000000000..665f67d72ea --- /dev/null +++ b/recipes/glib @@ -0,0 +1,21 @@ +name=glib +version=2.78.1 +revision=1 +tarball_url="https://download.gnome.org/sources/glib/2.78/glib-${version}.tar.xz" +tarball_blake2b="af8f2e83600dfb3ec84702399cb00a3aaedbc80087e35dc7cc2e2374d4fe5fdf82707ac8c911da1c53eb7b027c9da9ecfc1c0a8f56b39431fa4cf44cad5b10f7" +imagedeps="meson ninja" +hostdeps="gcc pkg-config" +deps="core-libs pcre2 libffi zlib" + +build() { + meson_configure \ + -Dxattr=false + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/glib-networking b/recipes/glib-networking new file mode 100644 index 00000000000..c36d6ab8ef0 --- /dev/null +++ b/recipes/glib-networking @@ -0,0 +1,22 @@ +name=glib-networking +version=2.78.0 +tarball_url="https://gitlab.gnome.org/GNOME/glib-networking/-/archive/${version}/glib-networking-${version}.tar.gz" +tarball_blake2b="a8b73a303f427c8069db9060f4037051b11a5bcc83f5c3673ac3ca630f22de31a911b9a31056e35e59ace52609718f2d4055aac08d1975a158d4a4a135a81204" +deps="core-libs glib openssl" +imagedeps="meson" +hostdeps="gcc pkg-config" + +build() { + meson_configure \ + -Dgnutls=disabled \ + -Dopenssl=enabled \ + -Dinstalled_tests=false \ + -Dlibproxy=disabled \ + -Dgnome_proxy=disabled + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install +} diff --git a/recipes/glu b/recipes/glu new file mode 100644 index 00000000000..70b3e68be9f --- /dev/null +++ b/recipes/glu @@ -0,0 +1,21 @@ +name=glu +version=9.0.3 +revision=1 +tarball_url="https://archive.mesa3d.org/glu/glu-${version}.tar.xz" +tarball_blake2b="a6fc842004dcca4243ef285e26806afdfb931d21985ad8f9a3f03f438e66b810718bf04e588044ed8db99990e49f806d346dc2ce69cfa91450f046a4dfa39136" +imagedeps="meson ninja" +hostdeps="gcc pkg-config" +deps="core-libs mesa" + +build() { + meson_configure \ + -Dgl_provider=gl + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/gmp b/recipes/gmp new file mode 100644 index 00000000000..7d8981748ff --- /dev/null +++ b/recipes/gmp @@ -0,0 +1,26 @@ +name=gmp +version=6.3.0 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/gmp/gmp-${version}.tar.xz" +tarball_blake2b="a865129e2b3f634ec5bad7f97ed89532e43f5662ac47a7d8ab7f0df8c9f8d0886bd984651422e2573c2163bca69c0547c248147ec90880accbd53db97dc0ddee" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure \ + --enable-cxx + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/graphite2 b/recipes/graphite2 new file mode 100644 index 00000000000..88e477d300c --- /dev/null +++ b/recipes/graphite2 @@ -0,0 +1,25 @@ +name=graphite2 +version=1.3.14 +revision=1 +tarball_url="https://github.com/silnrsi/graphite/releases/download/${version}/graphite2-${version}.tgz" +tarball_blake2b="72bf6736aaa8476a89e44ef53c5b6c94f45d815fe1a451ba6b3696bfe023971210975dee4a9c8cb3042f36442e4efecf5baf171ef4230ad2b10694a89865f918" +imagedeps="ninja python" +hostdeps="gcc cmake pkg-config" +deps="core-libs" + +build() { + cmake \ + -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=${base_dir}/userland/CMakeToolchain-x86_64.cmake \ + -DCMAKE_INSTALL_PREFIX=${prefix} \ + -DCMAKE_BUILD_TYPE=Release \ + ${source_dir} + + ninja +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/grep b/recipes/grep new file mode 100644 index 00000000000..6bc28b421fb --- /dev/null +++ b/recipes/grep @@ -0,0 +1,28 @@ +name=grep +version=3.11 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/grep/grep-${version}.tar.xz" +tarball_blake2b="e21785bca20b5a090d32bb5dc525fb298af30165106ed4c289b1518ea3d2acdcacfd6309b12f13be29a4b958f19588546119c695deb2b7500d49dcff86357bdc" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="gperf" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs pcre2" + +regenerate() { + autotools_recursive_regen +} + +build() { + cp -rp "${source_dir}"/. ./ + + configure_script_path=./configure \ + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/gsettings-desktop-schemas b/recipes/gsettings-desktop-schemas new file mode 100644 index 00000000000..f5d0e003206 --- /dev/null +++ b/recipes/gsettings-desktop-schemas @@ -0,0 +1,28 @@ +name=gsettings-desktop-schemas +version=45.0 +revision=1 +tarball_url="https://download.gnome.org/sources/gsettings-desktop-schemas/45/gsettings-desktop-schemas-${version}.tar.xz" +tarball_blake2b="b65c846654fac5a104ad9a7d67546c6fb3d54aada178d58c575d22a8c2adc0057c1f1dc177562740f7ae94d0e17743789ca902db7c2fcc42c844bb66e401eaec" +imagedeps="meson ninja" +hostdeps="gcc pkg-config" +deps="core-libs glib" + +regenerate() { + sed -i -r 's:"(/system):"/org/gnome\1:g' schemas/*.in +} + +build() { + meson_configure \ + -Dintrospection=false + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + glib-compile-schemas "${dest_dir}${prefix}"/share/glib-2.0/schemas + rm "${dest_dir}${prefix}"/share/glib-2.0/schemas/gschemas.compiled + + post_package_strip +} diff --git a/recipes/gtk+-3 b/recipes/gtk+-3 new file mode 100644 index 00000000000..6b39227fc57 --- /dev/null +++ b/recipes/gtk+-3 @@ -0,0 +1,29 @@ +name=gtk+-3 +version=3.24.41 +revision=1 +tarball_url="https://download.gnome.org/sources/gtk%2B/3.24/gtk%2B-${version}.tar.xz" +tarball_blake2b="fbded114fe2b5c1c7bffe79d0a22d559f97081eb972baf31b5c9bd7190bd1ea2875f1c632d3f3be8233377299f1df15bbffbe45d50cc7ff588e034eb41eb8f6e" +imagedeps="meson ninja gdk-pixbuf2" +hostdeps="gcc pkg-config" +deps="core-libs at-spi2-core cairo glib gdk-pixbuf libx11 libxext libxcb libxinerama libxrender libxrandr libxfixes libxdamage pango fribidi libepoxy libxkbcommon fontconfig freetype2 libxi harfbuzz libxcursor gsettings-desktop-schemas dbus" + +build() { + meson_configure \ + -Dprint_backends=file \ + -Dintrospection=false \ + -Dx11_backend=true \ + -Dbroadway_backend=true \ + -Dwayland_backend=false \ + -Dcolord=no + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + glib-compile-schemas "${dest_dir}${prefix}"/share/glib-2.0/schemas + rm "${dest_dir}${prefix}"/share/glib-2.0/schemas/gschemas.compiled + + post_package_strip +} diff --git a/recipes/harfbuzz b/recipes/harfbuzz new file mode 100644 index 00000000000..9de7c3b06ea --- /dev/null +++ b/recipes/harfbuzz @@ -0,0 +1,35 @@ +name=harfbuzz +version=8.3.0 +revision=1 +tarball_url="https://github.com/harfbuzz/harfbuzz/releases/download/${version}/harfbuzz-${version}.tar.xz" +tarball_blake2b="3749d2ff7955e135cf0d740bf6fe8b5c20a6bbf171480a29e6ae14fde8c26e1457506278b8c66e3b9630cbeb006874c19075c784a575e490c41297274a27fe59" +imagedeps="meson ninja" +hostdeps="gcc pkg-config" +deps="core-libs graphite2 glib zlib freetype2 cairo icu" + +build() { + cp -rp "${source_dir}"/. ./ + + mkdir build && cd build + + meson_source_dir=.. \ + meson_configure \ + -Dgraphite2=enabled \ + -Dglib=enabled \ + -Dgobject=disabled \ + -Dicu=enabled \ + -Dfreetype=enabled \ + -Dcairo=enabled \ + -Dintrospection=disabled \ + -Dtests=disabled + + ninja -j${parallelism} + + cd .. +} + +package() { + ( cd build && DESTDIR="${dest_dir}" ninja install ) + + post_package_strip +} diff --git a/recipes/icu b/recipes/icu new file mode 100644 index 00000000000..0471c276370 --- /dev/null +++ b/recipes/icu @@ -0,0 +1,36 @@ +name=icu +version=73.1 +revision=1 +tarball_url="https://github.com/unicode-org/icu/releases/download/release-73-1/icu4c-73_1-src.tgz" +tarball_blake2b="45de117efc4a49301c04a997963393967a70b8583abf1a9626331e275c5bc329cf2685de5c80b32f764c8ff2530b5594316d7119ce66503e5adba7842ca24424" +source_hostdeps="autoconf automake libtool pkg-config" +source_deps="autoconf-archive" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autotools_recursive_regen + cp source/config/{mh-linux,mh-unknown} +} + +build() { + mkdir cross-build + cd cross-build + ${source_dir}/source/configure \ + --prefix=/usr/local + make -j${parallelism} + cd .. + + configure_script_path=${source_dir}/source/configure \ + autotools_configure \ + --with-cross-build=$(realpath cross-build) + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/jwm b/recipes/jwm new file mode 100644 index 00000000000..ddf4baf9b91 --- /dev/null +++ b/recipes/jwm @@ -0,0 +1,29 @@ +name=jwm +version=2.4.3 +revision=1 +tarball_url="https://github.com/joewing/jwm/releases/download/v${version}/jwm-${version}.tar.xz" +tarball_blake2b="d0b0ff1088ab3390a90c054162ea2c2fe782b61f28b3fdb28464ace362143fdc94e25ec82f7f4178b86a26c9315cdfcf9a81bff2e76bb5e3d62f88968a4ee80b" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="gettext" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libx11 libxft libjpeg-turbo libxpm libxinerama libpng" + +regenerate() { + AUTOMAKE=true \ + autotools_recursive_regen +} + +build() { + cp -rp "${source_dir}"/. ./ + + autotools_configure \ + --disable-fribidi + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + cp -v "${base_dir}"/build-support/jwm/system.jwmrc "${dest_dir}"/etc/ + post_package_strip +} diff --git a/recipes/less b/recipes/less new file mode 100644 index 00000000000..8307c4b3e45 --- /dev/null +++ b/recipes/less @@ -0,0 +1,24 @@ +name=less +version=643 +revision=1 +tarball_url="https://www.greenwoodsoftware.com/less/less-${version}.tar.gz" +tarball_blake2b="6dc60dc2e8db05afdae466877a1d26a3008ff5378bbbf2fbdf9efc4f87c0fcfde5703d44a24d4355c98d3a5f438bdb51173150f2a69f801d9c8e4a7401d71b53" +source_hostdeps="autoconf automake libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs ncurses" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + make install DESTDIR="${dest_dir}" + + post_package_strip +} diff --git a/recipes/libepoxy b/recipes/libepoxy new file mode 100644 index 00000000000..cbe4ca7b8c1 --- /dev/null +++ b/recipes/libepoxy @@ -0,0 +1,22 @@ +name=libepoxy +version=1.5.10 +revision=1 +tarball_url="https://download.gnome.org/sources/libepoxy/1.5/libepoxy-${version}.tar.xz" +tarball_blake2b="105267b1b19acf8c86e5e9d23741dfc738e014de4f0b30f88e7ec22f98497cc8e006d729f17b5698780ca1dd782bad99f73ae685b2bf882b77670bb6c4b959c9" +imagedeps="meson ninja" +hostdeps="gcc pkg-config" +deps="core-libs mesa xorg-proto libx11" + +build() { + meson_configure \ + -Degl=no \ + -Dtests=false + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/libexpat b/recipes/libexpat new file mode 100644 index 00000000000..72c936cf16f --- /dev/null +++ b/recipes/libexpat @@ -0,0 +1,24 @@ +name=libexpat +version=2.5.0 +revision=1 +tarball_url="https://github.com/libexpat/libexpat/releases/download/R_2_5_0/expat-${version}.tar.xz" +tarball_blake2b="670298d076ff3b512a0212170d40cb04c601a11d6b152f215a5302ad3238c69c2386393d7a6c70bc284be35ce97bf27d87115c3391f4bc17406e509d739d3e31" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libffi b/recipes/libffi new file mode 100644 index 00000000000..646bc260f24 --- /dev/null +++ b/recipes/libffi @@ -0,0 +1,24 @@ +name=libffi +version=3.4.4 +revision=1 +tarball_url="https://github.com/libffi/libffi/releases/download/v${version}/libffi-${version}.tar.gz" +tarball_blake2b="189fe1ffe9507f204581b0ab09995dc7e7b761bb4eac7e338e9f5ff81431aebcef6c182c1839c9f9acb2706697a260c67e6d1351cf7e2aed7c4eb5d694f6f8fd" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libfontenc b/recipes/libfontenc new file mode 100644 index 00000000000..da6703de92c --- /dev/null +++ b/recipes/libfontenc @@ -0,0 +1,25 @@ +name=libfontenc +version=1.1.7 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libfontenc-${version}.tar.gz" +tarball_blake2b="538dc45801dd2fc3b18527b5716fd468089206728ce4704416eb0ecd2ed528f951d64e7bf2f779a5852363670724458c966538afcec813a9823f5d04303d1bbb" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-font-util xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto zlib" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libgcc b/recipes/libgcc new file mode 100644 index 00000000000..b635a352529 --- /dev/null +++ b/recipes/libgcc @@ -0,0 +1,35 @@ +name=libgcc +revision=1 +hostdeps="gcc autoconf-2.69 automake libtool pkg-config" +imagedeps="gcc" +deps="mlibc" + +build() { + cd "${base_dir}"/host-builds/gcc/build + + make -j${parallelism} all-target-libgcc +} + +package() { + cd "${base_dir}"/host-builds/gcc/build + + rm -rf tmp_libgcc_dir + mkdir tmp_libgcc_dir + + DESTDIR="$(realpath tmp_libgcc_dir)" make install-target-libgcc + + mkdir -p "${dest_dir}${prefix}" + + cp -r tmp_libgcc_dir/usr/local/lib "${dest_dir}${prefix}"/ + cp -r tmp_libgcc_dir/usr/local/${OS_TRIPLET}/* "${dest_dir}${prefix}"/ + + rm "${dest_dir}${prefix}"/lib/gcc/${OS_TRIPLET}/13.2.0/crti.o + rm "${dest_dir}${prefix}"/lib/gcc/${OS_TRIPLET}/13.2.0/crtn.o + + # Copy libgcc into GCC's tree else it will complain. + mkdir -p "${base_dir}"/host-pkgs/gcc/usr/local/lib + cp -r tmp_libgcc_dir/usr/local/lib/* "${base_dir}"/host-pkgs/gcc/usr/local/lib/ + + rm "${base_dir}"/host-pkgs/gcc/usr/local/lib/gcc/${OS_TRIPLET}/13.2.0/crti.o + rm "${base_dir}"/host-pkgs/gcc/usr/local/lib/gcc/${OS_TRIPLET}/13.2.0/crtn.o +} diff --git a/recipes/libgcrypt b/recipes/libgcrypt new file mode 100644 index 00000000000..f5d51bdd739 --- /dev/null +++ b/recipes/libgcrypt @@ -0,0 +1,31 @@ +name=libgcrypt +version=1.10.3 +revision=1 +tarball_url="https://www.gnupg.org/ftp/gcrypt/libgcrypt/libgcrypt-${version}.tar.gz" +tarball_blake2b="86636e88a96ed531718eeed7915e7ab4e359b17500f648a075853f575e7a50fbb7dc78d1f2dbf2a96a7c46ced6cafdbbb4b6b31dd2f34e663f05df30f1096c85" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libgpg-error" + +regenerate() { + autotools_recursive_regen +} + +build() { + cp -rp "${source_dir}"/. ./ + + configure_script_path=./configure \ + autotools_configure \ + --disable-dev-random \ + --disable-asm \ + --with-libgpg-error-prefix="${sysroot_dir}${prefix}" + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libgpg-error b/recipes/libgpg-error new file mode 100644 index 00000000000..26b81051a56 --- /dev/null +++ b/recipes/libgpg-error @@ -0,0 +1,30 @@ +name=libgpg-error +version=1.47 +revision=1 +tarball_url="https://www.gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-${version}.tar.gz" +tarball_blake2b="f1e185127192396cde5676030217471f31f46b5f8bde9314bfe74039297a608356f89208139245c9efce3cba1ba7609f230219c8c6cab9f24de05ad384c43c7d" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + cp -v src/syscfg/lock-obj-pub.x86_64-unknown-linux-gnu.h src/syscfg/lock-obj-pub.aero.h + + autotools_recursive_regen +} + +build() { + cp -rp "${source_dir}"/. ./ + + configure_script_path=./configure \ + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libice b/recipes/libice new file mode 100644 index 00000000000..b5d07585061 --- /dev/null +++ b/recipes/libice @@ -0,0 +1,25 @@ +name=libice +version=1.1.1 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libICE-${version}.tar.gz" +tarball_blake2b="1acb1cdb5b0fd49451b6e4498061c16fff35711a19a5da2c2de0046b6b3ed6bd6bdccf8d45f7adcdb7f2f685245176488f149b41087e562945754088f18c220b" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto xtrans" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libiconv b/recipes/libiconv new file mode 100644 index 00000000000..f0bfd9cfaaa --- /dev/null +++ b/recipes/libiconv @@ -0,0 +1,32 @@ +name=libiconv +version=1.17 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/libiconv/libiconv-${version}.tar.gz" +tarball_blake2b="1d317dd0655c680a2082c38561cdff51ac1a9181d4734a8bb1e86861dfd66f1a6c0846a90b5b88f3b38b1fa9983d9e563551f27e95a8e329896b71becceae52b" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="binutils" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="mlibc libgcc libstdc++" + +regenerate() { + cp /usr/local/share/aclocal/libtool.m4 ./m4/ + cp /usr/local/share/aclocal/libtool.m4 ./libcharset/m4/ + cp /usr/local/share/libtool/build-aux/ltmain.sh ./build-aux/ + cp /usr/local/share/libtool/build-aux/ltmain.sh ./libcharset/build-aux/ + cp /usr/local/share/aclocal/ltversion.m4 ./m4/ + cp /usr/local/share/aclocal/ltversion.m4 ./libcharset/m4/ + + autotools_recursive_regen -I"${source_dir}"/m4 -I"${source_dir}"/srcm4 +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libintl b/recipes/libintl new file mode 100644 index 00000000000..9ed0db0bac8 --- /dev/null +++ b/recipes/libintl @@ -0,0 +1,39 @@ +name=libintl +from_source=gettext +revision=1 +hostdeps="gcc automake autoconf libtool pkg-config" +deps="mlibc libgcc libstdc++ libiconv" + +build() { + ACLOCAL=true \ + AUTOCONF=true \ + AUTOMAKE=true \ + AUTOHEADER=true \ + autotools_configure \ + --without-emacs \ + --without-lispdir \ + `# Normally this controls nls behavior in general, but the libintl` \ + `# subdir is skipped unless this is explicitly set.` \ + --enable-nls \ + `# This magic flag enables libintl.` \ + --with-included-gettext \ + --disable-c++ \ + --disable-libasprintf \ + --disable-java \ + --enable-threads=posix \ + --disable-curses \ + --without-git \ + --without-cvs \ + --without-bzip2 \ + --without-xz + + sed -i 's/touch $@//g' gettext-runtime/intl/Makefile + + make -C gettext-runtime/intl -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make -C gettext-runtime/intl install + + post_package_strip +} diff --git a/recipes/libjpeg-turbo b/recipes/libjpeg-turbo new file mode 100644 index 00000000000..321b873253c --- /dev/null +++ b/recipes/libjpeg-turbo @@ -0,0 +1,29 @@ +name=libjpeg-turbo +version=2.1.5.1 +revision=1 +tarball_url="https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/${version}.tar.gz" +tarball_blake2b="44a6f61594f0d0cfac3e3a63ddfa9dcc940a5249fcd69e6d5324749d62e8a5e575bb2c5de9b651d63f27d6f03927146367cd8b8275aa1f4f51fd412ebac95797" +imagedeps="gcc ninja python git cmake nasm" +hostdeps="gcc pkg-config" +deps="core-libs" + +build() { + cmake \ + -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=${base_dir}/userland/CMakeToolchain-x86_64.cmake \ + -DCMAKE_INSTALL_PREFIX=${prefix} \ + -DCMAKE_BUILD_TYPE=Release \ + -DENABLE_STATIC=FALSE \ + -DCMAKE_INSTALL_DEFAULT_LIBDIR=lib \ + -DWITH_JPEGS=ON \ + -DCMAKE_SYSTEM_PROCESSOR=x86_64 \ + ${source_dir} + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/libnghttp2 b/recipes/libnghttp2 new file mode 100644 index 00000000000..bc08b96ed6f --- /dev/null +++ b/recipes/libnghttp2 @@ -0,0 +1,27 @@ +name=libnghttp2 +version=1.59.0 +tarball_url="https://github.com/nghttp2/nghttp2/releases/download/v${version}/nghttp2-${version}.tar.gz" +tarball_blake2b="167e973844131915ce8c50e8e4cfa6807ca56cdbacf0c5d03b0b9d8846c76020d7ffde492d62a9d5f91801024126f2ff52833a58e1458246dcbbafbf76b8b99c" +imagedeps="ninja python" +hostdeps="gcc cmake pkg-config" +deps="core-libs" + +build() { + cmake \ + -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=${base_dir}/userland/CMakeToolchain-x86_64.cmake \ + -DCMAKE_INSTALL_PREFIX=${prefix} \ + -DCMAKE_BUILD_TYPE=Release \ + -DENABLE_STATIC=FALSE \ + -DCMAKE_INSTALL_DEFAULT_LIBDIR=lib \ + -DCMAKE_SYSTEM_PROCESSOR=x86_64 \ + ${source_dir} + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/libpng b/recipes/libpng new file mode 100644 index 00000000000..f515dd626cf --- /dev/null +++ b/recipes/libpng @@ -0,0 +1,24 @@ +name=libpng +version=1.6.40 +revision=1 +tarball_url="https://download.sourceforge.net/libpng/libpng-${version}.tar.xz" +tarball_blake2b="4dd2df57791ca68cc31ba966b9176ecb37458572c60eef34e31ff0d3266d25ad6ea9d2e8cae6bfaf7932b5c7bc231047d3ed139b3464304c41cc4d89611f5ba8" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs zlib" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libpsl b/recipes/libpsl new file mode 100644 index 00000000000..53ed6a1333a --- /dev/null +++ b/recipes/libpsl @@ -0,0 +1,28 @@ +name=libpsl +version=0.21.5 +tarball_url="https://github.com/rockdaboot/libpsl/releases/download/${version}/libpsl-${version}.tar.gz" +tarball_blake2b="a0076f622b85df99f866de6707850ac216b764bdb68c6d516f4603da42dac8eae3ee4c53d68dbb6af6f779c2c7f1b9caab74c8b558209b1f6823f95c13fc3ceb" +deps="core-libs libunistring libiconv" +hostdeps="gcc pkg-config autoconf automake libtool" +source_hostdeps="automake autoconf libtool pkg-config" +source_imagedeps="gtk-doc" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --disable-asan \ + --disable-cfi \ + --disable-ubsan \ + --disable-man + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libsm b/recipes/libsm new file mode 100644 index 00000000000..570ea264f6a --- /dev/null +++ b/recipes/libsm @@ -0,0 +1,25 @@ +name=libsm +version=1.2.4 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libSM-${version}.tar.gz" +tarball_blake2b="9f05c36f933ddbe66e06a96c7b9f5c23a2b5218da724a838b42ef4b798195c24a2be13e1d5c61bccf7660a4880f78da8452fa93a668f483ce808ce840c2cfcfb" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libice" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libsoup b/recipes/libsoup new file mode 100644 index 00000000000..02838d6237b --- /dev/null +++ b/recipes/libsoup @@ -0,0 +1,27 @@ +name=libsoup +version=3.4.4 +tarball_url="https://gitlab.gnome.org/GNOME/libsoup/-/archive/${version}/libsoup-${version}.tar.gz" +tarball_blake2b="006af4bd6f9e5be63421b33bb5b0204d0013fe1312ce2392cbd7fc609d650dc07fa38849f0d179d7907568e9faa0843a74f54e86fe6803e665865d5fed4d3b36" +deps="core-libs glib glib-networking zlib libxml libpsl sqlite libnghttp2" +imagedeps="meson" +hostdeps="gcc pkg-config" + +build() { + meson_configure \ + -Dintrospection=disabled \ + -Dinstalled_tests=false \ + -Dsysprof=disabled \ + -Ddocs=disabled \ + -Dvapi=disabled \ + -Dtls_check=false \ + -Dbrotli=disabled \ + -Dntlm=disabled \ + -Dgssapi=disabled \ + -Dtests=false + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install +} diff --git a/recipes/libstdc++ b/recipes/libstdc++ new file mode 100644 index 00000000000..3f908ac205b --- /dev/null +++ b/recipes/libstdc++ @@ -0,0 +1,33 @@ +name=libstdc++ +revision=1 +hostdeps="gcc autoconf-2.69 automake libtool pkg-config" +imagedeps="gcc" +deps="mlibc libgcc" + +build() { + cd "${base_dir}"/host-builds/gcc/build + + make -j${parallelism} all-target-libstdc++-v3 +} + +package() { + cd "${base_dir}"/host-builds/gcc/build + + rm -rf tmp_libstdc++_dir + mkdir tmp_libstdc++_dir + + DESTDIR="$(realpath tmp_libstdc++_dir)" make install-target-libstdc++-v3 + + # For some reason this also installs libgcc even though it shouldn't... + # Remove it. + rm -fv tmp_libstdc++_dir/usr/local/${OS_TRIPLET}/lib/libgcc* + + mkdir -p "${dest_dir}${prefix}" + + cp -r tmp_libstdc++_dir/usr/local/share "${dest_dir}${prefix}"/ + cp -r tmp_libstdc++_dir/usr/local/${OS_TRIPLET}/* "${dest_dir}${prefix}"/ + + # Copy libstdc++ and headers into GCC's tree else it will complain. + mkdir -p "${base_dir}"/host-pkgs/gcc/usr/local/${OS_TRIPLET} + cp -r tmp_libstdc++_dir/usr/local/${OS_TRIPLET}/* "${base_dir}"/host-pkgs/gcc/usr/local/${OS_TRIPLET}/ +} diff --git a/recipes/libtasn b/recipes/libtasn new file mode 100644 index 00000000000..16ea5d3bcc3 --- /dev/null +++ b/recipes/libtasn @@ -0,0 +1,29 @@ +name=libtasn +version=4.19.0 +revision=1 +tarball_url="https://au.mirrors.cicku.me/gnu/libtasn1/libtasn1-${version}.tar.gz" +tarball_blake2b="6e8232590cd87da3bfd9182ed44eccdfbdfcc85e88d8cf19fffdb3d600e04694b77079b95bbd822d2c3fff29458ddae0f0440f9c1c19c711923a2507bd19270f" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs glib" +source_imagedeps="gtk-doc" + +regenerate() { + autotools_recursive_regen +} + +build() { + cp -rp "${source_dir}"/. ./ + + autotools_configure \ + --disable-doc + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libtiff b/recipes/libtiff new file mode 100644 index 00000000000..4c22e07b820 --- /dev/null +++ b/recipes/libtiff @@ -0,0 +1,31 @@ +name=libtiff +version=4.6.0 +revision=1 +tarball_url="https://download.osgeo.org/libtiff/tiff-${version}.tar.xz" +tarball_blake2b="3b508b02b0a536c5bc8e67fe4c1b09ae9c830252786ef4764202c14d673d1ef9634694de7a5893a3551dec684d00bad9d0442c7fea7bcd09238b9960d443cf62" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs freeglut libjpeg-turbo zlib zstd xz" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --without-x \ + --enable-zlib \ + --enable-zstd \ + --enable-jpeg \ + --enable-lzma \ + --disable-webp \ + --enable-cxx + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libunistring b/recipes/libunistring new file mode 100644 index 00000000000..14dce176227 --- /dev/null +++ b/recipes/libunistring @@ -0,0 +1,24 @@ +name=libunistring +version=1.1 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/libunistring/libunistring-${version}.tar.xz" +tarball_blake2b="721adc90884006480055b95d0fa06cd862417aa02b467f1e14688292ad9c11f1e33520b14ed5dc2d2724c6df8713d3af1e8032014259d8355156cb72edfcb983" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libwebp b/recipes/libwebp new file mode 100644 index 00000000000..dc99cfc2076 --- /dev/null +++ b/recipes/libwebp @@ -0,0 +1,29 @@ +name=libwebp +version=1.3.2 +revision=1 +tarball_url="https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${version}.tar.gz" +tarball_blake2b="12b3ff3aa9952dd32ce13656146556d5efb6a66860249a8676721980aee10253a1b0335685a769d995e9954cd305190a8ed1878ba4fefce9dcaf41a3976f9e3d" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libjpeg-turbo libpng freeglut sdl2 libtiff" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --enable-libwebpmux \ + --enable-libwebpdemux \ + --enable-libwebpdecoder \ + --enable-libwebpextras \ + --enable-swap-16bit-csp + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libx11 b/recipes/libx11 new file mode 100644 index 00000000000..97660737e5e --- /dev/null +++ b/recipes/libx11 @@ -0,0 +1,28 @@ +name=libx11 +version=1.8.7 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libX11-${version}.tar.xz" +tarball_blake2b="335d8af91c13aba11255c266c4687a7f66b021207a92485d723b4107601bbabb6a0e5535241a3bcff4ac9a99142730d2b3d2e2eaff86b507fee5b35a2590d792" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xtrans xorg-util-macros" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libxcb xtrans" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --disable-ipv6 \ + --with-keysymdefdir=${sysroot_dir}/usr/include/X11 + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxau b/recipes/libxau new file mode 100644 index 00000000000..8739b09e88a --- /dev/null +++ b/recipes/libxau @@ -0,0 +1,25 @@ +name=libxau +version=1.0.11 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXau-${version}.tar.gz" +tarball_blake2b="2c1066e40fe64ebd8b095bb7bac436d3b0d518080b80e93d1def040af390bd08ed3f4f49feb0b4b390a5733e74bf7429c96ddac5f8fbfb904eb25b496676618a" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxaw b/recipes/libxaw new file mode 100644 index 00000000000..bd172a1db7a --- /dev/null +++ b/recipes/libxaw @@ -0,0 +1,25 @@ +name=libxaw +version=1.0.15 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXaw-${version}.tar.gz" +tarball_blake2b="71d7b413f9a5178149871c810122589ec74fb4b1e78e884a1538871afd69ad775c3ff15e0c0b21115700f5c9c0965c65336b4c07c1d1069490e6c214ad0f3af0" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libxmu libxpm" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxcb b/recipes/libxcb new file mode 100644 index 00000000000..58a14a40a25 --- /dev/null +++ b/recipes/libxcb @@ -0,0 +1,27 @@ +name=libxcb +version=1.16 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libxcb-${version}.tar.xz" +tarball_blake2b="1ddd5c2e6be8400a0a77db4b5fbd4698996fd1a00984e370b1f712f6b9ce456c8ccfb6992f2973f5eaf8d5b6b75f39b9f51a1458c2432ddb41edd8199b91b3f9" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +imagedeps="python" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libxau libxdmcp xcb-proto" + +regenerate() { + autotools_recursive_regen + sed -i 's/pthread-stubs//' "${source_dir}"/configure +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxcomposite b/recipes/libxcomposite new file mode 100644 index 00000000000..3ef215498dc --- /dev/null +++ b/recipes/libxcomposite @@ -0,0 +1,29 @@ +name=libxcomposite +version=0.4.6 +revision=1 +tarball_url="https://gitlab.freedesktop.org/xorg/lib/libxcomposite/-/archive/libXcomposite-${version}/libxcomposite-libXcomposite-${version}.tar.gz" +tarball_blake2b="6603273ca9481e540478d13b37f0f1267d110dc911cfe02cfe6a22d544071e864821cdfc57dc1348d7f17a0004d2cafc8bca00d5b565e2c85fe8a1149ed50224" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libx11 libxfixes xorg-proto" +source_deps="xorg-util-macros" + +regenerate() { + autotools_recursive_regen +} + +build() { + cp -rp "${source_dir}"/. ./ + + autotools_configure \ + --disable-doc + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxcrypt b/recipes/libxcrypt new file mode 100644 index 00000000000..ff6307f100e --- /dev/null +++ b/recipes/libxcrypt @@ -0,0 +1,27 @@ +name=libxcrypt +version=4.4.36 +revision=1 +tarball_url="https://github.com/besser82/libxcrypt/releases/download/v${version}/libxcrypt-${version}.tar.xz" +tarball_blake2b="9f028e0fe2cb7bb4273f3f6d1e579e0fe93cd71eba21286aa7dc078c904ea3cdce38b2955bdcd618853f7657b01aea7e28c4d898680e69fdf75f812b5a304c1d" +source_hostdeps="autoconf automake libtool pkg-config" +imagedeps="python-passlib" +hostdeps="gcc automake autoconf libtool pkg-config" +deps="mlibc libgcc libstdc++" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure \ + --enable-obsolete-api=yes \ + --disable-xcrypt-compat-files + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxcursor b/recipes/libxcursor new file mode 100644 index 00000000000..7456af70e23 --- /dev/null +++ b/recipes/libxcursor @@ -0,0 +1,25 @@ +name=libxcursor +version=1.2.1 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXcursor-${version}.tar.gz" +tarball_blake2b="42ee1c77f9c976541f51044474b6bf60935ee62d3d95298ce9d71c92e612bc12c460c4161c148d7f9c99a9ea76f74b34ca4f4b8980af2ccabd78fdad4752f2f5" +source_hostdeps="autoconf automake libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libxrender libxfixes libx11" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxcvt b/recipes/libxcvt new file mode 100644 index 00000000000..90ecdf9bf53 --- /dev/null +++ b/recipes/libxcvt @@ -0,0 +1,20 @@ +name=libxcvt +version=0.1.2 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libxcvt-${version}.tar.xz" +tarball_blake2b="8a4803eb6790fd0ea1520fd31e335f7a363c3606e74837a959453be8819ce0d450af7bb651887a891aa657a5eeac3e4983041060fa5c87b1238c83354e425de7" +imagedeps="meson ninja" +hostdeps="gcc pkg-config" +deps="core-libs" + +build() { + meson_configure + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/libxdamage b/recipes/libxdamage new file mode 100644 index 00000000000..8523be15e47 --- /dev/null +++ b/recipes/libxdamage @@ -0,0 +1,25 @@ +name=libxdamage +version=1.1.6 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXdamage-${version}.tar.gz" +tarball_blake2b="e8fcdbb3b93b7f3a74b10adbb4ceaccc963c7f9ce4fe0edee5842fde7d26cbb2cf3061f073c9ca400baa8378d06ed83c8c751495febb1aeb86a27058d74b1543" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libxfixes" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxdmcp b/recipes/libxdmcp new file mode 100644 index 00000000000..98bb4e98b2e --- /dev/null +++ b/recipes/libxdmcp @@ -0,0 +1,25 @@ +name=libxdmcp +version=1.1.4 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXdmcp-${version}.tar.gz" +tarball_blake2b="83973212793c93253b06ee75902842873f1f322c53dc32f054954131243dcf5c31d6792dc5d216134c9536c142b4d5823c8fd998d048ec093383b4f7362fb066" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxext b/recipes/libxext new file mode 100644 index 00000000000..15f6708041c --- /dev/null +++ b/recipes/libxext @@ -0,0 +1,25 @@ +name=libxext +version=1.3.5 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXext-${version}.tar.gz" +tarball_blake2b="74ee5d3fc3832fc5d9774f7f1a8e0d30ab1af97c35f0e3da0b314c228f8f511cdb106c74eeeb1de56db16d4c2b8aaab34b7ca886f02530319fde1a7ae7788598" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libx11" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxfixes b/recipes/libxfixes new file mode 100644 index 00000000000..83eb909d284 --- /dev/null +++ b/recipes/libxfixes @@ -0,0 +1,25 @@ +name=libxfixes +version=6.0.1 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXfixes-${version}.tar.gz" +tarball_blake2b="22be454b2db230057204932ae75aacb2b56523b25b14e501d7e7a2a664e57ae6bcbfa56b6fac4d42d3f8ef770c41debe0eec25451dd70baa9cfc83b1a10e4649" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libx11" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxfont2 b/recipes/libxfont2 new file mode 100644 index 00000000000..12ba1a1319f --- /dev/null +++ b/recipes/libxfont2 @@ -0,0 +1,28 @@ +name=libxfont2 +version=2.0.6 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXfont2-${version}.tar.gz" +tarball_blake2b="1a871c6d7c81beadf1c9a5e864a2df186b6429337e86f4fee0c8969d158cf284f10019f69a2f7e0c9298d9f6fa842d5315932152b5e70cb068c5530360e578a0" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto xtrans freetype2 bzip2 libfontenc zlib" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --with-bzip2 \ + --disable-devel-docs \ + --disable-selective-werror + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxft b/recipes/libxft new file mode 100644 index 00000000000..18e526bf8f3 --- /dev/null +++ b/recipes/libxft @@ -0,0 +1,25 @@ +name=libxft +version=2.3.8 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXft-${version}.tar.gz" +tarball_blake2b="06d797ed53df793e5b9751bc7984a62a96c973e36d8aa99e4dc96a03e0e7013d6adc9e46f033e1ffcb4632cec2ac0318108ff2894beb4464d44d524254b15328" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libxrender fontconfig" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxi b/recipes/libxi new file mode 100644 index 00000000000..4d22d77d791 --- /dev/null +++ b/recipes/libxi @@ -0,0 +1,25 @@ +name=libxi +version=1.8.1 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXi-${version}.tar.gz" +tarball_blake2b="473bf5a80c86ef853dcf21b2292eb07818148302b051ca4fb9bfdf42053ae0ae6c53d588de7c027d1c72d7b5a9dba775111f4913b36e771380f4d0fcb823e345" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libxext libxfixes" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxinerama b/recipes/libxinerama new file mode 100644 index 00000000000..c0b0edcfd06 --- /dev/null +++ b/recipes/libxinerama @@ -0,0 +1,25 @@ +name=libxinerama +version=1.1.5 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXinerama-${version}.tar.gz" +tarball_blake2b="ac24af05ae483e7f8476cb5fdf901ae80c592a766387e9f662ceeae5906a55e8529b35fcd01b6893289007e30788fd9e3a507af95870acfa6b25b25b159024a5" +source_hostdeps="autoconf automake libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libxext xorg-proto" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxkbcommon b/recipes/libxkbcommon new file mode 100644 index 00000000000..41fff7493a3 --- /dev/null +++ b/recipes/libxkbcommon @@ -0,0 +1,25 @@ +name=libxkbcommon +version=1.6.0 +revision=1 +tarball_url="https://xkbcommon.org/download/libxkbcommon-${version}.tar.xz" +tarball_blake2b="ffd373161f12ea6448a9206f57710355ab65b81ebab5dce74e4dfcee1bdc9175406fc434560648f5933b83cac163099c8564c3add6f51d34856def39ab077850" +imagedeps="meson ninja doxygen" +hostdeps="gcc pkg-config" +deps="core-libs libxcb libxml xkeyboard-config" + +build() { + meson_configure \ + -Dxkb-config-root="$prefix"/share/X11/xkb \ + -Denable-x11=true \ + -Denable-wayland=false + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + mkdir -p "${dest_dir}${prefix}/share/X11/xkb" + + post_package_strip +} diff --git a/recipes/libxkbfile b/recipes/libxkbfile new file mode 100644 index 00000000000..ce39d6814a2 --- /dev/null +++ b/recipes/libxkbfile @@ -0,0 +1,25 @@ +name=libxkbfile +version=1.1.2 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libxkbfile-${version}.tar.gz" +tarball_blake2b="192c0d7a9e9c8f555ccd0a120e79f5d0fb4d9843fe0eb437b5ed5ce62bd65366a50649037aeed9112cd2ca11db4e088282049d4b799bb26d11d2d9b07384a8e1" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libx11" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxml b/recipes/libxml new file mode 100644 index 00000000000..b8b63d8339a --- /dev/null +++ b/recipes/libxml @@ -0,0 +1,29 @@ +name=libxml +version=2.12.3 +revision=1 +tarball_url="https://download.gnome.org/sources/libxml2/2.12/libxml2-${version}.tar.xz" +tarball_blake2b="12a7c25d2a13d839aac918268b0948a9bd3c352bc29dd09bb975a9b4ff99d299a0e157b1a90f01bdce8ddc36ede9a6834b0dc26635ac775a41bd28d9b2ad7cff" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs zlib icu readline" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure \ + --with-threads \ + --disable-ipv6 \ + --without-python \ + --with-history \ + --with-icu + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxmu b/recipes/libxmu new file mode 100644 index 00000000000..92065a47e65 --- /dev/null +++ b/recipes/libxmu @@ -0,0 +1,25 @@ +name=libxmu +version=1.1.4 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXmu-${version}.tar.gz" +tarball_blake2b="b95188ecd667ffa9d831e547803c16637a968199c4e20d11d8beaf8da19c327aeb655c886f21d6b7d1d2a2b9cce522a091ca791c2626ae74d77f838441fa4a90" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libxext libxt" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxpm b/recipes/libxpm new file mode 100644 index 00000000000..be321e49477 --- /dev/null +++ b/recipes/libxpm @@ -0,0 +1,25 @@ +name=libxpm +version=3.5.17 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXpm-${version}.tar.gz" +tarball_blake2b="0acc342fb0aebad04a2d68f60106ad8f52910b2ca65d402bfda09e5914ab92b2b2b9d57680bbb6c6f1c8767971e9cffc1315337f6645fb61940a9cb5ccdf80c0" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libxext libxt" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxrandr b/recipes/libxrandr new file mode 100644 index 00000000000..e808fffc200 --- /dev/null +++ b/recipes/libxrandr @@ -0,0 +1,25 @@ +name=libxrandr +version=1.5.4 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXrandr-${version}.tar.gz" +tarball_blake2b="d5dd5ef33c4452fac7d2c5f16afc15d9e2dcb4e721824ca6e412c6a990ab529003e1beea087afad9dedbcceab17953e066700dac7df0b2aac2cec404335ba93f" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libx11 libxrender libxext" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxrender b/recipes/libxrender new file mode 100644 index 00000000000..095c7f39bc9 --- /dev/null +++ b/recipes/libxrender @@ -0,0 +1,25 @@ +name=libxrender +version=0.9.11 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXrender-${version}.tar.gz" +tarball_blake2b="c8d5cf0c925ccf885634ac535b83b6280b49bc354a9c054375ed6db916350f1e5a1892f9937e0726d3d29fec0f531e787e03d76c3a0c0a22ca6c289c28f2287e" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libx11" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxshmfence b/recipes/libxshmfence new file mode 100644 index 00000000000..0563afddcb8 --- /dev/null +++ b/recipes/libxshmfence @@ -0,0 +1,26 @@ +name=libxshmfence +version=1.3.2 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libxshmfence-${version}.tar.gz" +tarball_blake2b="ae99fff03f94c5b001bd901e446f56e4ed2edbfb140ab92ec471ab910af92d45ceeb623718e65e0b8e9bd301aacf0c5d5d3a31dab0246c824aabe0664957e78e" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --disable-futex + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxslt b/recipes/libxslt new file mode 100644 index 00000000000..13286647680 --- /dev/null +++ b/recipes/libxslt @@ -0,0 +1,36 @@ +name=libxslt +version=1.1.39 +tarball_url="https://gitlab.gnome.org/GNOME/libxslt/-/archive/v${version}/libxslt-v${version}.tar.gz" +tarball_blake2b="c534663795335273fbb0abccaa4bf7df4bf86200fc52a36c4f7e71ab30158630496665c8886cfd6ecfa3d43bcc475c7b8a1f2839fb288c442063e4b2f0b86d77" +imagedeps="ninja python" +hostdeps="gcc cmake pkg-config" +deps="core-libs libxml" + +build() { + cmake \ + -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=${base_dir}/userland/CMakeToolchain-x86_64.cmake \ + -DCMAKE_INSTALL_PREFIX=${prefix} \ + -DCMAKE_BUILD_TYPE=Release \ + -DENABLE_STATIC=FALSE \ + -DCMAKE_INSTALL_DEFAULT_LIBDIR=lib \ + -DCMAKE_SYSTEM_PROCESSOR=x86_64 \ + -DLIBXSLT_WITH_DEBUGGER=OFF \ + -DLIBXSLT_WITH_CRYPTO=OFF \ + -DLIBXSLT_WITH_MEM_DEBUG=OFF \ + -DLIBXSLT_WITH_MODULES=ON \ + -DLIBXSLT_WITH_PROFILER=OFF \ + -DLIBXSLT_WITH_PYTHON=OFF \ + -DLIBXSLT_WITH_XSLT_DEBUG=OFF \ + -DLIBXSLT_WITH_TESTS=OFF \ + -DLIBXSLT_WITH_THREADS=ON \ + ${source_dir} + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/libxt b/recipes/libxt new file mode 100644 index 00000000000..e4dd3c0652b --- /dev/null +++ b/recipes/libxt @@ -0,0 +1,27 @@ +name=libxt +version=1.3.0 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXt-${version}.tar.gz" +tarball_blake2b="3fc41d02802ccfda270030bcad73c0ca14c5b986d7353d8395339053a4d34352addda83fa2766af3d340c96416361de6a941688aff6e9b5bbc769a34af40bf53" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libx11 libsm" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --with-appdefaultdir=/etc/X11/app-defaults + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxv b/recipes/libxv new file mode 100644 index 00000000000..9e35ba9c3b8 --- /dev/null +++ b/recipes/libxv @@ -0,0 +1,25 @@ +name=libxv +version=1.0.12 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXv-${version}.tar.gz" +tarball_blake2b="21d7d5f40391897d9731ca0772a918d5c33f7de8e3e1307d47e75a44009a74be73a2a47d7751f01e25eabdc6c6ab8889ecda4e266303968b5cec085c38c8edd8" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libxext" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/libxxf86vm b/recipes/libxxf86vm new file mode 100644 index 00000000000..285986bed16 --- /dev/null +++ b/recipes/libxxf86vm @@ -0,0 +1,25 @@ +name=libxxf86vm +version=1.1.5 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/libXxf86vm-${version}.tar.gz" +tarball_blake2b="396676748546bf2903a9d5ee8603babc04634d6547b38baed07134a7fea81f1691c064c07a9cc4990aeaf1edc911b586b5e11c449aa7872c1ea5b46879029f5e" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libxext" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/linux-headers b/recipes/linux-headers new file mode 100644 index 00000000000..08825729f00 --- /dev/null +++ b/recipes/linux-headers @@ -0,0 +1,21 @@ +name=linux-headers +version=6.6.12 +source_method=tarball +tarball_url="https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${version}.tar.xz" +tarball_sha512="bb48a1a40d4db13da075ec46420e5abb0a80b4259fedd65883bcf4a67cd11e2d89026a57c370a11f704e9a41973c8bcbc52be12aa10a0e28e17ead59c9d6c4df" +imagedeps="base-devel rsync" + +regenerate() { + true +} + +build() { + cp -rp "${source_dir}"/. ./ +} + +package() { + make headers_install ARCH=x86_64 INSTALL_HDR_PATH=${dest_dir}/${prefix}/ + + # remove this file, as mlibc will override this file with one suited to mlibc + rm -rf ${dest_dir}/${prefix}/include/linux/libc-compat.h +} diff --git a/recipes/llvm b/recipes/llvm new file mode 100644 index 00000000000..8800987df7d --- /dev/null +++ b/recipes/llvm @@ -0,0 +1,33 @@ +name=llvm +version=17.0.6 +revision=1 +tarball_url="https://github.com/llvm/llvm-project/releases/download/llvmorg-${version}/llvm-project-${version}.src.tar.xz" +tarball_blake2b="d6ede1a9fda8756995c3e0654111941649e15794179641806f18919f1dc68c41ca0cabd5693b5096d05dccc3a391cd20d34af1137bf8af92ed3117a1ce84d1b2" +imagedeps="gcc ninja python git" +hostdeps="gcc cmake pkg-config" +deps="core-libs zlib" + +build() { + cmake \ + -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=${base_dir}/userland/CMakeToolchain-x86_64.cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_LINK_LLVM_DYLIB=ON \ + -DLLVM_ENABLE_RTTI=ON \ + -DLLVM_TARGETS_TO_BUILD=X86 \ + -DLLVM_TARGET_ARCH=x86_64 \ + -DLLVM_DEFAULT_TARGET_TRIPLE=${OS_TRIPLET} \ + -DLLVM_HOST_TRIPLE=${OS_TRIPLET} \ + -DLLVM_ENABLE_TERMINFO=OFF \ + -Wno-dev \ + ${source_dir}/llvm + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/mesa b/recipes/mesa new file mode 100644 index 00000000000..863d6609b25 --- /dev/null +++ b/recipes/mesa @@ -0,0 +1,25 @@ +name=mesa +version=23.3.3 +revision=1 +tarball_url="https://archive.mesa3d.org/mesa-${version}.tar.xz" +tarball_blake2b="6b57e99356abccf398c5fb84953fc1490ddf516dbeed1feca8d16344a04c1c15183325752717447a34a61dd4cdda897147e3194f869d8dbadfa5c45a0c95dab5" +imagedeps="binutils meson ninja python-mako" +hostdeps="gcc pkg-config" +deps="core-libs llvm zlib libxshmfence libxrandr libxdamage libxxf86vm libxfixes libx11 libxext libxcb libexpat" + +build() { + meson_configure \ + -Dglx=xlib \ + -Dplatforms=x11 \ + -Dgallium-drivers=swrast \ + -Dvulkan-drivers= \ + -Dllvm=enabled + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/mesa-demos b/recipes/mesa-demos new file mode 100644 index 00000000000..b3eeaf95831 --- /dev/null +++ b/recipes/mesa-demos @@ -0,0 +1,30 @@ +name=mesa-demos +version=8.5.0 +revision=1 +tarball_url="https://archive.mesa3d.org/demos/${version}/mesa-demos-${version}.tar.gz" +tarball_blake2b="82ded42d845449d925809046d605a30d3f66b5aba57716fdfee99611750001a80aebbda5c66099c3ee9525b655d86e8cf4aeb43adbc939182705ba8fa2ab9c92" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs freetype2 mesa glu libx11 libxext" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --enable-autotools \ + --disable-gles1 \ + --disable-osmesa \ + --disable-libdrm \ + --with-system-data-files \ + --with-glut=no + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/mlibc b/recipes/mlibc new file mode 100644 index 00000000000..8c4ed720ee7 --- /dev/null +++ b/recipes/mlibc @@ -0,0 +1,28 @@ +name=mlibc +version=0dd4dbdd377dc776e6f7d698281ac6781d652922 +revision=1 +tarball_url="https://github.com/aero-os/mlibc/archive/${version}.tar.gz" +tarball_blake2b="a4886c2d6a85c781293db9139c0773469c3877e5db2a76f1a735e2cc04ee78fef5b8fc1693b724f9fc8879322464ddf48eac8c018ebfd4f8aa983141013d64e3" +imagedeps="meson ninja" +hostdeps="gcc pkg-config libgcc-binaries" +builddeps="cxxshim frigg linux-headers" +deps="mlibc-headers" + +build() { + LDFLAGS="-Wl,/usr/local/libgcc-binaries/libgcc-x86_64.a" \ + meson_configure \ + --buildtype=debugoptimized \ + -Dmlibc_no_headers=true \ + -Ddefault_library=both \ + -Ddisable_crypt_option=true \ + -Ddisable_iconv_option=true \ + -Ddisable_intl_option=true \ + -Ddisable_libgcc_dependency=true \ + -Dlinux_kernel_headers=${sysroot_dir}/${prefix}/include + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install +} diff --git a/recipes/mlibc-headers b/recipes/mlibc-headers new file mode 100644 index 00000000000..e5830247827 --- /dev/null +++ b/recipes/mlibc-headers @@ -0,0 +1,25 @@ +name=mlibc-headers +from_source=mlibc +revision=1 +hostdeps="pkg-config" +imagedeps="meson ninja" +deps="linux-headers" +builddeps="cxxshim frigg" + +build() { + meson setup \ + --cross-file ${base_dir}/userland/cross-file.ini \ + --prefix=${prefix} \ + -Dheaders_only=true \ + -Ddisable_crypt_option=true \ + -Ddisable_iconv_option=true \ + -Ddisable_intl_option=true \ + -Dlinux_kernel_headers=${sysroot_dir}/${prefix}/include \ + ${source_dir} + + ninja +} + +package() { + DESTDIR="${dest_dir}" ninja install +} diff --git a/recipes/mpc b/recipes/mpc new file mode 100644 index 00000000000..0358d280947 --- /dev/null +++ b/recipes/mpc @@ -0,0 +1,26 @@ +name=mpc +version=1.3.1 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/mpc/mpc-${version}.tar.gz" +tarball_blake2b="76434e6f8830af3571836d51576bfebbc9701e9bbb5c4686f134081cd96cd90ae02f7ff42bf9e3957c7a7ba92b6b2d9cdabe18f0269271147521cd7f6a2d551c" +source_imagedeps="git" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs gmp mpfr" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/mpfr b/recipes/mpfr new file mode 100644 index 00000000000..b702c670c62 --- /dev/null +++ b/recipes/mpfr @@ -0,0 +1,33 @@ +name=mpfr +version=4.2.1 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/mpfr/mpfr-${version}.tar.xz" +tarball_blake2b="ad69f53bc910294647523e7613b18a683f1d0f3dd994168ab2a46b66d0371ffa9b8e7cb59495f898470aea69d343e83fc722f11babe4af7b3a12665a1e65860c" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="autoconf-archive" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs gmp" + +regenerate() { + autoreconf -fvi +} + +build() { + cp -rp "${source_dir}"/. ./ + + configure_script_path=./configure \ + autotools_configure \ + --enable-static=no \ + --enable-shared=yes \ + --enable-thread-safe \ + --with-pic + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/ncurses b/recipes/ncurses new file mode 100644 index 00000000000..e11c0788c8b --- /dev/null +++ b/recipes/ncurses @@ -0,0 +1,51 @@ +name=ncurses +version=6.4.20231111 +revision=1 +tarball_url="https://github.com/ThomasDickey/ncurses-snapshots/archive/refs/tags/v6_4_20231111.tar.gz" +tarball_blake2b="0d7b490b50e58281250cc4ebdac8f35cbb3fbf0e13578524003ae4c26c10507d59fb8dd2a4d67102067df77d857c41e6c37c509d9a7cee8661dd3bb80f7cbfef" +source_hostdeps="autoconf automake libtool pkg-config" +imagedeps="gcc ncurses patchelf" +hostdeps="gcc automake autoconf libtool pkg-config" +deps="core-libs" + +regenerate() { + cp -pv /usr/local/share/libtool/build-aux/config.guess ./ + cp -pv /usr/local/share/libtool/build-aux/config.sub ./ +} + +build() { + cf_cv_func_nanosleep=yes \ + autotools_configure \ + --enable-widec \ + --enable-pc-files \ + --with-shared \ + --with-cxx-shared \ + --without-normal \ + --without-debug \ + --with-manpage-format=normal \ + --with-pkg-config-libdir=/usr/lib/pkgconfig \ + --with-termlib + + make -j${parallelism} +} + +package() { + make install DESTDIR="${dest_dir}" + + # As we build ncurses with wide character support, make some compatibility links + for lib in ncurses ncurses++ form panel menu tinfo ; do + rm -vf "${dest_dir}${prefix}"/lib/lib${lib}.so + echo "INPUT(-l${lib}w)" > "${dest_dir}${prefix}"/lib/lib${lib}.so + ln -sfv ${lib}w.pc "${dest_dir}${prefix}"/lib/pkgconfig/${lib}.pc + # Set library soname + patchelf --set-soname lib${lib}w.so "${dest_dir}${prefix}"/lib/lib${lib}w.so + done + rm -vf "${dest_dir}${prefix}"/lib/libcursesw.so + echo "INPUT(-lncursesw)" > "${dest_dir}${prefix}"/lib/libcursesw.so + ln -sfv libncurses.so "${dest_dir}${prefix}"/lib/libcurses.so + + # Remove static libraries + rm -rf "${dest_dir}${prefix}"/lib/*.a + + post_package_strip +} diff --git a/recipes/neofetch b/recipes/neofetch new file mode 100644 index 00000000000..b832d5ca503 --- /dev/null +++ b/recipes/neofetch @@ -0,0 +1,9 @@ +name=neofetch +version=534b1c8cdbda567066517aeb75d8bdde3641dab7 +tarball_url="https://github.com/Andy-Python-Programmer/neofetch/archive/${version}.tar.gz" +tarball_blake2b="9f9f49a941e70dfe764c38c039c69e21bdf33c72ffbc2cd64a0287c0f8220f8a5ed456ef227da6dc843ef55602f20c9e0ac181cee261e65c373f69ceb5951668" + +package() { + mkdir -p "${dest_dir}/usr/bin" + cp -f "${source_dir}"/neofetch "${dest_dir}"/usr/bin/neofetch +} diff --git a/recipes/nettle b/recipes/nettle new file mode 100644 index 00000000000..c9b60ffba02 --- /dev/null +++ b/recipes/nettle @@ -0,0 +1,25 @@ +name=nettle +version=3.9.1 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/nettle/nettle-${version}.tar.gz" +tarball_blake2b="e3ceaefa19491e58f26b900beaf8b4e746feb2357c7677f5c050f257f4a23c304773446b6283a42a82cf9640e16522b8a71c47f137759f1df23cdeee4625d142" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="gcc" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs gmp" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/openssl b/recipes/openssl new file mode 100644 index 00000000000..951693b31d8 --- /dev/null +++ b/recipes/openssl @@ -0,0 +1,32 @@ +name=openssl +version=1.1.1w +revision=1 +tarball_url="https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-${version}.tar.gz" +tarball_blake2b="2fdba6ca0188928ab2f74e606136afca66cfa0467170fa6298ef160b64ac6fdcad1e81e5dd14013ce0e9921d0f7417edec531cd0beaf1196fec704c2c6d48395" +hostdeps="gcc pkg-config" +deps="core-libs zlib" + +build() { + CC=${OS_TRIPLET}-gcc \ + CXX=${OS_TRIPLET}-g++ \ + AR=${OS_TRIPLET}-ar \ + ${source_dir}/Configure \ + --prefix=${prefix} \ + --openssldir=/etc/ssl \ + --libdir=lib \ + ${OS_TRIPLET} \ + shared \ + zlib-dynamic \ + no-afalgeng + + make -j${parallelism} +} + +package() { + # Disable installing static libraries. + sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile + + DESTDIR="${dest_dir}" make DESTDIR="${dest_dir}" MANSUFFIX=ssl install + + post_package_strip +} diff --git a/recipes/pango b/recipes/pango new file mode 100644 index 00000000000..2412c5c14e9 --- /dev/null +++ b/recipes/pango @@ -0,0 +1,21 @@ +name=pango +version=1.51.0 +revision=1 +tarball_url="https://download.gnome.org/sources/pango/1.51/pango-${version}.tar.xz" +tarball_blake2b="d7d343d5fb005b92dc70fc6f65c62d1d22cc81887185612d276e63614e622272117b64051f46aa1ae0348d4ccfbed0a473f9482703d51d5da7e81d1851b49071" +imagedeps="meson ninja" +hostdeps="gcc pkg-config" +deps="core-libs glib fontconfig freetype2 fribidi cairo xorg-proto libx11 xtrans libxext harfbuzz libxft" + +build() { + meson_configure \ + -Dintrospection=disabled + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + post_package_strip +} diff --git a/recipes/pcre2 b/recipes/pcre2 new file mode 100644 index 00000000000..baf6c779c99 --- /dev/null +++ b/recipes/pcre2 @@ -0,0 +1,31 @@ +name=pcre2 +version=10.42 +revision=1 +tarball_url="https://github.com/PCRE2Project/pcre2/releases/download/pcre2-${version}/pcre2-${version}.tar.gz" +tarball_blake2b="19233ee4a63d3bc0828f68c646ecbeb8161c242e52c9242976d80b805d5863699766a8f3a23946ac50ced75f48aad6d948bd9aa3fdc7540bd9193065ea7ee9d1" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs bzip2 ncurses readline zlib" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure \ + --enable-unicode \ + --enable-jit \ + --enable-pcre2-16 \ + --enable-pcre2-32 \ + --enable-pcre2grep-libz \ + --enable-pcre2grep-libbz2 \ + --enable-pcre2test-libreadline + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/pixman b/recipes/pixman new file mode 100644 index 00000000000..f1f294f5fa9 --- /dev/null +++ b/recipes/pixman @@ -0,0 +1,24 @@ +name=pixman +version=0.42.2 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/pixman-${version}.tar.xz" +tarball_blake2b="6286a9d064a5a24017fccbb0a6e9f6ef932077c2e33ec043826d4a7a6c707c9111d3de4b806cbcdb47fc2794f1f930d24d078de1ff2912061967db0890540957" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libpng" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/readline b/recipes/readline new file mode 100644 index 00000000000..2f72afa724c --- /dev/null +++ b/recipes/readline @@ -0,0 +1,32 @@ +name=readline +version=8.2 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/readline/readline-${version}.tar.gz" +tarball_blake2b="7974322b9c092a756a79e537df08e8532f8e0fcb598f77732e28287c33ebec9e9837ed88b43334c310892d56a871b423903f0f564def2fbe700a1004f2ae7b18" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="patchelf" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs ncurses" + +regenerate() { + AUTOHEADER=true autoreconf -fvi +} + +build() { + autotools_configure \ + --enable-multibyte \ + --with-curses + + make SHLIB_LIBS="-lncursesw" -j${parallelism} +} + +package() { + make SHLIB_LIBS="-lncursesw" install DESTDIR="${dest_dir}" + + # libraries are created without soname... fix that + for lib in libhistory.so.8 libreadline.so.8; do + patchelf --set-soname $lib "${dest_dir}${prefix}/lib/$lib" + done + + post_package_strip +} diff --git a/recipes/sdl2 b/recipes/sdl2 new file mode 100644 index 00000000000..1d571174de4 --- /dev/null +++ b/recipes/sdl2 @@ -0,0 +1,59 @@ +name=sdl2 +version=2.28.5 +revision=1 +tarball_url="https://github.com/libsdl-org/SDL/releases/download/release-${version}/SDL2-${version}.tar.gz" +tarball_blake2b="c96481bc02af6b6d077247238f7e46b0e3ec216664584add29cafb0a91d06dc6ddc637a01519dbd7182d4fa59cfaf26ad6733f72583021cf65849416f9c4b698" +imagedeps="gcc ninja git" +hostdeps="gcc cmake pkg-config" +deps="core-libs libx11 libxext libxcursor libxi libxfixes libxrandr libxrender libxxf86vm mesa" + +build() { + cmake \ + -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=${base_dir}/userland/CMakeToolchain-x86_64.cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DSDL_ALTIVEC=OFF \ + -DSDL_DISKAUDIO=OFF \ + -DSDL_DIRECTFB=ON \ + -DSDL_OPENGL=ON \ + -DSDL_OPENGLES=ON \ + -DSDL_PTHREADS=ON \ + -DSDL_PTHREADS_SEM=OFF \ + -DSDL_OSS=OFF \ + -DSDL_ALSA=OFF \ + -DSDL_JACK=OFF \ + -DSDL_ESD=OFF \ + -DSDL_PULSEAUDIO=OFF \ + -DSDL_ARTS=OFF \ + -DSDL_NAS=OFF \ + -DSDL_SNDIO=OFF \ + -DSDL_FUSIONSOUND=OFF \ + -DSDL_LIBSAMPLERATE=OFF \ + -DSDL_RPATH=OFF \ + -DSDL_X11=ON \ + -DSDL_WAYLAND=OFF \ + -DSDL_WAYLAND_QT_TOUCH=OFF \ + -DSDL_RPI=OFF \ + -DSDL_COCOA=OFF \ + -DSDL_DIRECTX=OFF \ + -DSDL_WASAPI=OFF \ + -DSDL_RENDER_D3D=OFF \ + -DSDL_VIVANTE=OFF \ + -DSDL_VULKAN=OFF \ + -DSDL_KMSDRM=OFF \ + -DSDL_HIDAPI=OFF \ + -DSDL_SHARED=ON \ + -DSDL_STATIC=OFF \ + ${source_dir} + + ninja -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" ninja install + + rm "${dest_dir}${prefix}"/lib/{libSDL2_test.a,libSDL2main.a} + + post_package_strip +} diff --git a/recipes/sqlite b/recipes/sqlite new file mode 100644 index 00000000000..3263142a692 --- /dev/null +++ b/recipes/sqlite @@ -0,0 +1,27 @@ +name=sqlite +version=3.45.0 +revision=1 +tarball_url="https://sqlite.org/2024/sqlite-autoconf-3450000.tar.gz" +tarball_blake2b="04ba8522be5fa8c0a0a101824f90030f83ad131b53dff622e0449d31b3ee3e50888ed0d8a663c5be3f7338d5d5b6efef1b828374fa599a675ab892bbbb3abec9" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs readline zlib" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --enable-readline \ + --enable-fts5 \ + CFLAGS="$CFLAGS -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS4=1 -DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_ENABLE_UNLOCK_NOTIFY=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_SECURE_DELETE=1 -DSQLITE_ENABLE_FTS3_TOKENIZER=1" + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/ttf-dejavu b/recipes/ttf-dejavu new file mode 100644 index 00000000000..8ea14bc4732 --- /dev/null +++ b/recipes/ttf-dejavu @@ -0,0 +1,15 @@ +name=ttf-dejavu +version=2.37 +revision=1 +tarball_url="https://sourceforge.net/projects/dejavu/files/dejavu/${version}/dejavu-fonts-ttf-${version}.tar.bz2" +tarball_blake2b="d8614907887f20967fc7c75cb33b636a0eb5c682a076ccc7aef09f4ac243507afc005ef90d0b2aeee6a4a6a1ff3d5ce4fac0d1722a382525b3883ef53cdec26a" +deps="core-libs" + +build() { + cp -r ${source_dir}/. ./ +} + +package() { + mkdir -p "${dest_dir}${prefix}/share/fonts/truetype" + cp -r ttf/* "${dest_dir}${prefix}/share/fonts/truetype/" +} diff --git a/recipes/tzdata b/recipes/tzdata new file mode 100644 index 00000000000..a550b3957c1 --- /dev/null +++ b/recipes/tzdata @@ -0,0 +1,57 @@ +name=tzdata +version=2023c +revision=1 +tarball_url="https://data.iana.org/time-zones/releases/tzdata${version}.tar.gz" +tarball_blake2b="8a50aa5f338565d86b8fa5428c138b251bd8dcc3ea66c144b49625d02c5c7aa27f1ace66babd36f10f75cf5eb832ec327b9c2e8adb0384c450130d1ee8c45562" +imagedeps="tzdata" +hostdeps="gcc binutils" +deps="core-libs" + +build() { + cp -r ${source_dir}/. ./ +} + +package() { + # Create the required directories + mkdir -p ${dest_dir}/etc + mkdir -p ${dest_dir}/usr/share/zoneinfo/posix + mkdir -p ${dest_dir}/usr/share/zoneinfo/right + + # Create the time zone files without leap seconds, convention puts these in both zoneinfo and zoneinfo/posix. + # After that. create time time zone files with leap seconds + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo etcetera + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo/posix etcetera + zic -L "${source_dir}"/leapseconds -d "${dest_dir}"/usr/share/zoneinfo/right etcetera + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo southamerica + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo/posix southamerica + zic -L "${source_dir}"/leapseconds -d "${dest_dir}"/usr/share/zoneinfo/right southamerica + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo northamerica + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo/posix northamerica + zic -L "${source_dir}"/leapseconds -d "${dest_dir}"/usr/share/zoneinfo/right northamerica + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo europe + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo/posix europe + zic -L "${source_dir}"/leapseconds -d "${dest_dir}"/usr/share/zoneinfo/right europe + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo africa + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo/posix africa + zic -L "${source_dir}"/leapseconds -d "${dest_dir}"/usr/share/zoneinfo/right africa + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo antarctica + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo/posix antarctica + zic -L "${source_dir}"/leapseconds -d "${dest_dir}"/usr/share/zoneinfo/right antarctica + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo asia + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo/posix asia + zic -L "${source_dir}"/leapseconds -d "${dest_dir}"/usr/share/zoneinfo/right asia + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo australasia + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo/posix australasia + zic -L "${source_dir}"/leapseconds -d "${dest_dir}"/usr/share/zoneinfo/right australasia + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo backward + zic -L /dev/null -d "${dest_dir}"/usr/share/zoneinfo/posix backward + zic -L "${source_dir}"/leapseconds -d "${dest_dir}"/usr/share/zoneinfo/right backward + + # Create the posixrules file, POSIX requires daylight saving rules to be in accordance with US rules, thus use New York + zic -d ${dest_dir}/usr/share/zoneinfo -p America/New_York + + # Default to UTC for localtime, this should be fixed, but that is pending xbstrap support. + ln -sf /usr/share/zoneinfo/UTC "${dest_dir}"/etc/localtime + + post_package_strip +} diff --git a/recipes/userland b/recipes/userland new file mode 100644 index 00000000000..042300a924f --- /dev/null +++ b/recipes/userland @@ -0,0 +1,19 @@ +name=userland +version=0.0 +revision=1 +source_dir="userland" +hostdeps="gcc binutils" +deps="core-libs" +imagedeps="rust" +allow_network=yes + +build() { + cp -r "${source_dir}"/. ./ + + make -j${parallelism} CC=x86_64-aero-gcc CXX=x86_64-aero-g++ +} + +package() { + make install PREFIX="${prefix}" DESTDIR="${dest_dir}" + post_package_strip +} diff --git a/recipes/xcb-proto b/recipes/xcb-proto new file mode 100644 index 00000000000..bee617424e3 --- /dev/null +++ b/recipes/xcb-proto @@ -0,0 +1,25 @@ +name=xcb-proto +version=1.16.0 +revision=1 +tarball_url="https://www.x.org/archive/individual/proto/xcb-proto-${version}.tar.xz" +tarball_blake2b="1c59ae4c71e697bd4f0298f6e0ea5235fc47baa9cf584e079258f1da8be538d1b67dc45f1325d82495247d0f8020d0244ca334de3794b410a1feaceabd6b285e" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="python libxml2" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xf86-input-keyboard b/recipes/xf86-input-keyboard new file mode 100644 index 00000000000..0bc813a7d52 --- /dev/null +++ b/recipes/xf86-input-keyboard @@ -0,0 +1,25 @@ +name=xf86-input-keyboard +version=2.0.0 +revision=1 +tarball_url="https://www.x.org/releases/individual/driver/xf86-input-keyboard-${version}.tar.gz" +tarball_blake2b="f3aa3fca15fc75f8314b7b7248ccb757d667b2c46b22c8e23278d144f30d56515d1aa4190ca82e0c15770550a16dd860fd98a81172dab2e97b04e65fceb2a333" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-server xorg-util-macros libx11" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xf86-input-mouse b/recipes/xf86-input-mouse new file mode 100644 index 00000000000..e9dc1dd7458 --- /dev/null +++ b/recipes/xf86-input-mouse @@ -0,0 +1,25 @@ +name=xf86-input-mouse +version=1.9.5 +revision=1 +tarball_url="https://xorg.freedesktop.org/archive/individual/driver/xf86-input-mouse-${version}.tar.gz" +tarball_blake2b="67f4de10424d640913fcafc2292f342a1e993d33e4ecc3c152e818953e19deaba796b96c29e0c07a4f4b74a1eb3bc1c41c3e5ab868cade02c21a90e2556da53f" +source_hostdeps="autoconf automake libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-server xorg-util-macros libx11" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xf86-video-fbdev b/recipes/xf86-video-fbdev new file mode 100644 index 00000000000..c4bed64eb79 --- /dev/null +++ b/recipes/xf86-video-fbdev @@ -0,0 +1,27 @@ +name=xf86-video-fbdev +version=0.5.0 +revision=1 +tarball_url="https://www.x.org/releases/individual/driver/xf86-video-fbdev-${version}.tar.gz" +tarball_blake2b="0e37c9145582d317c690c8adcfd5bf4b6046cc60e0b9a59382d1cb39878664e46a47d810d8d0d75c7c6b74630ae5e9f377217b51b23d6cfb2661d901a8bf41e2" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-server xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-server xorg-util-macros" + +regenerate() { + autotools_recursive_regen +} + +build() { + SYSROOT=${sysroot_dir} \ + autotools_configure \ + --disable-pciaccess + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xkeyboard-config b/recipes/xkeyboard-config new file mode 100644 index 00000000000..7089177e1f8 --- /dev/null +++ b/recipes/xkeyboard-config @@ -0,0 +1,27 @@ +name=xkeyboard-config +version=2.34 +revision=1 +tarball_url="https://www.x.org/archive/individual/data/xkeyboard-config/xkeyboard-config-${version}.tar.gz" +tarball_blake2b="dcd4e7b0b8daf146b92fbb56c64eb32b7d2f42d75a8716226e5bc13b30624aca3ac95e97541561ba2429d5089f6dad495111b1a3f4a76b02d10dbe249461f921" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +imagedeps="python" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-xkbcomp" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --with-xkb-rules-symlink=xorg + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xorg-font-util b/recipes/xorg-font-util new file mode 100644 index 00000000000..91d91bab718 --- /dev/null +++ b/recipes/xorg-font-util @@ -0,0 +1,25 @@ +name=xorg-font-util +version=1.4.1 +revision=1 +tarball_url="https://www.x.org/archive/individual/font/font-util-${version}.tar.xz" +tarball_blake2b="5a7cee52aa58cecc85f5168963038b65d921bc33615e86a833cba5aec007d61bb05fa3b200ed9b192d9ab9291d53065443711f8eac976242b2013cd7b9fc494a" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xorg-proto b/recipes/xorg-proto new file mode 100644 index 00000000000..c914cf0042a --- /dev/null +++ b/recipes/xorg-proto @@ -0,0 +1,25 @@ +name=xorg-proto +version=2023.2 +revision=1 +tarball_url="https://www.x.org/releases/individual/proto/xorgproto-${version}.tar.xz" +tarball_blake2b="ff255b91770ad11cdcc48d12815317285d8d16d28011a86166f3e07af18b30fdf35c2eb7b6537504eb4c0e9ca65b3116493422b6faebe04ee80e6aee92387675" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xorg-server b/recipes/xorg-server new file mode 100644 index 00000000000..ce2985cbc62 --- /dev/null +++ b/recipes/xorg-server @@ -0,0 +1,52 @@ +name=xorg-server +version=21.1.11 +revision=1 +tarball_url="https://www.x.org/releases/individual/xserver/xorg-server-${version}.tar.xz" +tarball_blake2b="0a18840979bb8b20b02eca9d737f20ddcf92a4771386074c38692df8a1c9b0f471af2211f3006f845ad0dd887b3844b7e7aac761bc12fc4e4177f1ada32ec503" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xtrans xorg-font-util xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto xcb-proto xtrans libxinerama libxcvt libxshmfence libx11 libxaw libxxf86vm libxkbfile libxmu libxfont2 libepoxy libxi libxv libxdamage libxrender libxrandr libxcb libxfixes libxext nettle xorg-xkbcomp xkeyboard-config pixman" + +regenerate() { + autotools_recursive_regen +} + +build() { + CFLAGS="-Wno-error=array-bounds ${common_flags}" \ + autotools_configure \ + --with-xkb-bin-directory=/usr/bin \ + --with-xkb-path=/usr/share/X11/xkb \ + --with-xkb-output=/var/lib/xkb \ + --with-fontrootdir=/usr/share/fonts/X11 \ + --enable-xorg \ + --enable-xv \ + --enable-xvfb \ + --disable-xephyr \ + --disable-xnest \ + --disable-suid-wrapper \ + --disable-pciaccess \ + --disable-dpms \ + --disable-screensaver \ + --disable-xres \ + --disable-xvmc \ + --disable-systemd-logind \ + --disable-secure-rpc \ + --disable-config-udev \ + --disable-dri \ + --disable-dri2 \ + --disable-dri3 \ + --disable-int10-module \ + --disable-vgahw \ + --disable-libdrm \ + --disable-glamor \ + --disable-glx + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xorg-util-macros b/recipes/xorg-util-macros new file mode 100644 index 00000000000..8d798f7f3fb --- /dev/null +++ b/recipes/xorg-util-macros @@ -0,0 +1,24 @@ +name=xorg-util-macros +version=1.20.0 +revision=1 +tarball_url="https://www.x.org/archive/individual/util/util-macros-${version}.tar.gz" +tarball_blake2b="4c79c7076281ede6a240be2a2a9ffd47edd523d4a1b839589301a21eeb73100f134eced7d81fbd5ad71516174d3d4c8ab9f63e53987cb0f9a59b4fe6496157d8" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autoreconf -fvi +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xorg-xclock b/recipes/xorg-xclock new file mode 100644 index 00000000000..1ddd738ffcf --- /dev/null +++ b/recipes/xorg-xclock @@ -0,0 +1,27 @@ +name=xorg-xclock +version=1.1.1 +revision=1 +tarball_url="https://xorg.freedesktop.org/archive/individual/app/xclock-${version}.tar.gz" +tarball_blake2b="4fd77b8f1f0962774dd0e6295f7482c05be8107e1606a9705ccd2864d2c9b37adda4a41a6704c6e1363edd2b7e704324799c4feaff39e218b326b66274b48187" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros gettext" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libx11 libxaw libxft libxkbfile libxmu libxrender" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --with-appdefaultdir=/etc/X11/app-defaults \ + --disable-selective-werror + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xorg-xeyes b/recipes/xorg-xeyes new file mode 100644 index 00000000000..bac153bb7f3 --- /dev/null +++ b/recipes/xorg-xeyes @@ -0,0 +1,26 @@ +name=xorg-xeyes +version=1.2.0 +revision=1 +tarball_url="https://xorg.freedesktop.org/archive/individual/app/xeyes-${version}.tar.gz" +tarball_blake2b="de152dff4bffb8ce43f7a8ae6b3362088f829acfa2a276b714cb5f92fb7af2935553f685a5cbe9d5f4362177fa71afc5b9e2aabe18010d247a16bad7892c8a7c" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libx11 libxcb libxext libxi libxmu libxrender libxt" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --disable-selective-werror + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xorg-xfontsel b/recipes/xorg-xfontsel new file mode 100644 index 00000000000..7ae92585b46 --- /dev/null +++ b/recipes/xorg-xfontsel @@ -0,0 +1,26 @@ +name=xorg-xfontsel +version=1.1.0 +revision=1 +tarball_url="https://www.x.org/pub/individual/app/xfontsel-${version}.tar.xz" +tarball_blake2b="e4cb8f25b64e1feb68cdf7ae7982c8e8e6086fb6ad31019b115986220cd9f347edbe738d8d43d0650fd783ef96d2e93a247e462611b0fb33a3aa0a6dc2d2529e" +source_hostdeps="autoconf automake libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libxmu libxaw" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure \ + --with-appdefaultdir=/etc/X11/app-defaults + + make -j${parallelism} +} + +package() { + make DESTDIR=${dest_dir} install + + post_package_strip +} diff --git a/recipes/xorg-xinit b/recipes/xorg-xinit new file mode 100644 index 00000000000..5272d84a92b --- /dev/null +++ b/recipes/xorg-xinit @@ -0,0 +1,25 @@ +name=xorg-xinit +version=1.4.2 +tarball_url="https://gitlab.freedesktop.org/xorg/app/xinit/-/archive/xinit-${version}/xinit-xinit-${version}.tar.gz" +tarball_blake2b="23a48ddee9eab2510fc3322dc203a994f886b765f49c3c92c34b75ed871c844e860ae47581167d905ae59822a8e69fcd1b94e680db933aea251596286d19617b" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libx11 xorg-proto" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure +} + +package() { + DESTDIR="${dest_dir}" make install + + # We have our own xinitrc. + rm -rf "${dest_dir}/etc/X11/xinit/xinitrc" + + post_package_strip +} diff --git a/recipes/xorg-xkbcomp b/recipes/xorg-xkbcomp new file mode 100644 index 00000000000..aa44578f23c --- /dev/null +++ b/recipes/xorg-xkbcomp @@ -0,0 +1,25 @@ +name=xorg-xkbcomp +version=1.4.6 +revision=1 +tarball_url="https://www.x.org/archive/individual/app/xkbcomp-${version}.tar.gz" +tarball_blake2b="bc0fe69ef4eb809ac9e82fdc40b990bf27b7dd3e358efdb87ab7e34be8ddd0d8bd54e57ab7473f9e22f2714964e2cfb3322ccc2006a64de10dd6f2fc4fa35017" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libxkbfile" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xorg-xlsfonts b/recipes/xorg-xlsfonts new file mode 100644 index 00000000000..8ec9a1452af --- /dev/null +++ b/recipes/xorg-xlsfonts @@ -0,0 +1,24 @@ +name=xorg-xlsfonts +version=1.0.7 +revision=1 +tarball_url="https://www.x.org/pub/individual/app/xlsfonts-${version}.tar.xz" +tarball_blake2b="13f2e2007c38f7d1724e6ffd0c7fe9a3b887a150f50107b892327c3620e4ffdbd4ae1191a9764cc4000d6422fe0f331dcbef11c0b50013ff2d94b699c0cba1ee" +source_hostdeps="autoconf automake libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libxmu libxaw" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + make DESTDIR=${dest_dir} install + post_package_strip +} diff --git a/recipes/xtrans b/recipes/xtrans new file mode 100644 index 00000000000..18e4de6fa62 --- /dev/null +++ b/recipes/xtrans @@ -0,0 +1,25 @@ +name=xtrans +version=1.5.0 +revision=1 +tarball_url="https://www.x.org/archive/individual/lib/xtrans-${version}.tar.gz" +tarball_blake2b="25a18ba2398e445a1fedec3f0f5a102aef733b621fb83a81d193a2e4a702b8090b70ccea1c6784293050fd26b20e2d4b2d433954c9740c3a94c53362dc88cc9b" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xz b/recipes/xz new file mode 100644 index 00000000000..861cea5478e --- /dev/null +++ b/recipes/xz @@ -0,0 +1,24 @@ +name=xz +version=5.4.6 +revision=1 +tarball_url="https://github.com/tukaani-project/xz/releases/download/v${version}/xz-${version}.tar.gz" +tarball_blake2b="f0bbd33ea7cd64d475c3501f6e76080c8c0080e377f23462f5f76459935f4e621538ddaa8452d2feaed278d62a596e38ed2aca18ed9e76512c4ec77fa2f4cc5f" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/zlib b/recipes/zlib new file mode 100644 index 00000000000..4591965f905 --- /dev/null +++ b/recipes/zlib @@ -0,0 +1,27 @@ +name=zlib +version=1.3 +revision=1 +tarball_url="https://github.com/madler/zlib/archive/refs/tags/v${version}.tar.gz" +tarball_blake2b="e663d8041a613b544d76313e61b6340adacb53322422d4b6392455627c80cbac430b9fd0fb4a69e59b0fa110f120d29a1e9513bb37888442cc1b9d5075f47ea6" +imagedeps="patchelf" +hostdeps="gcc pkg-config" +deps="core-libs" + +build() { + prefix="${prefix}" \ + CHOST="${OS_TRIPLET}" \ + ${source_dir}/configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + # Remove static libraries + rm -rf "${dest_dir}${prefix}"/lib/*.a + + # libz.so.${version} is created without soname... fix that + patchelf --set-soname libz.so.${version} "${dest_dir}${prefix}/lib/libz.so.${version}" + + post_package_strip +} diff --git a/recipes/zstd b/recipes/zstd new file mode 100644 index 00000000000..5633699c717 --- /dev/null +++ b/recipes/zstd @@ -0,0 +1,29 @@ +name=zstd +version=1.5.5 +revision=1 +tarball_url="https://github.com/facebook/zstd/releases/download/v${version}/zstd-${version}.tar.gz" +tarball_blake2b="7680e27a0adacfb809d9fc81e06d3f99bf74df30374d3b5cb2d58f667dd1b7d5c41697e608592709e17c0e32277f20a6d615edee409b5d7cdcb15da2799a2350" +hostdeps="gcc pkg-config" +deps="core-libs zlib xz" + +build() { + cp -rp "${source_dir}"/. ./ + + CC=${OS_TRIPLET}-gcc \ + CXX=${OS_TRIPLET}-g++ \ + AR=${OS_TRIPLET}-ar \ + PREFIX="${prefix}" \ + make -j${parallelism} +} + +package() { + CC=${OS_TRIPLET}-gcc \ + DESTDIR="${dest_dir}" \ + PREFIX="${prefix}" \ + make install + + # Remove static libraries. + rm -rf "${dest_dir}${prefix}"/lib/*.a + + post_package_strip +} diff --git a/scripts/mkimage b/scripts/mkimage new file mode 100755 index 00000000000..985c735ae2a --- /dev/null +++ b/scripts/mkimage @@ -0,0 +1,48 @@ +# set -x -e + +# IMAGE_PATH="$base_dir/target/disk.img" +# LOOPBACK_DEV_PATH="$base_dir/target/loopback_dev" + +# ls /dev + +# # echo $in_container +# # whoami + +# # # ls $base_dir + +IMAGE_PATH="./target/disk.img" + +dd if=/dev/zero bs=1G count=0 seek=512 of=$IMAGE_PATH +parted -s $IMAGE_PATH mklabel gpt +parted -s $IMAGE_PATH mkpart primary 2048s 100% + +# # # ensure loop kernel module is enabled +# # if ! lsmod | grep -q 'loop'; then +# # echo 'mkimage: `loop` kernel module not found, attempting to load' +# # modprobe loop +# # fi + +# # losetup -Pf --show $IMAGE_PATH > $LOOPBACK_DEV_PATH +# # losetup -d `cat $LOOPBACK_DEV_PATH` + +# # # echo $in_container +# # # ls /de + +# -L: volume-label +# -N: Overrides the default calculation of the number of inodes that should be reserved for the filesystem. +# -O: Features (disabled are prefixed with `^`) +# -d: root-directory +# -m: reserved-blocks-percentage +# -r: fs-revision-level +# # -t: filesystem-type +# mke2fs \ +# -L '' \ +# -N 0 \ +# -O ^64bit \ +# -d "./sysroot" \ +# -m 5 \ +# -r 1 \ +# -t ext2 \ +# "./target/disk.img" \ +# 5G \ +# ; diff --git a/source-recipes/autoconf b/source-recipes/autoconf new file mode 100644 index 00000000000..09be1b2004c --- /dev/null +++ b/source-recipes/autoconf @@ -0,0 +1,4 @@ +name=autoconf +version=2.72 +tarball_url="https://ftp.gnu.org/gnu/autoconf/autoconf-${version}.tar.gz" +tarball_blake2b="48fff54704176cbf2642230229c628b75c43ef3f810c39eea40cae91dd02e1203d04a544407de96f9172419a94b952865909d969d9e9b6c10879a9d9aeea5ad0" diff --git a/source-recipes/autoconf-2.69 b/source-recipes/autoconf-2.69 new file mode 100644 index 00000000000..3986c79acb4 --- /dev/null +++ b/source-recipes/autoconf-2.69 @@ -0,0 +1,4 @@ +name=autoconf-2.69 +version=2.69 +tarball_url="https://ftp.gnu.org/gnu/autoconf/autoconf-${version}.tar.gz" +tarball_blake2b="7e8a513bbfcabadad1577919c048cc05ca0a084788850b42570f88afc2fa9c25fb32277412f135b81ba1c0d8079465a6b581d2d78662c991d2183b739fac407c" diff --git a/source-recipes/automake b/source-recipes/automake new file mode 100644 index 00000000000..0c58eb68b0c --- /dev/null +++ b/source-recipes/automake @@ -0,0 +1,8 @@ +name=automake +version=1.16.5 +tarball_url="https://ftp.gnu.org/gnu/automake/automake-${version}.tar.gz" +tarball_blake2b="5ccdcbe2d3deb2b0baed4a8590b07714cd7098fbda251afebe83232ed03f4db84abbe023cf0544622dbc5137254347273247428eb5420564a167b86de95d113e" + +regenerate() { + true +} diff --git a/source-recipes/cmake b/source-recipes/cmake new file mode 100644 index 00000000000..1821d68b1a2 --- /dev/null +++ b/source-recipes/cmake @@ -0,0 +1,4 @@ +name=cmake +version=3.27.7 +tarball_url="https://github.com/Kitware/CMake/releases/download/v${version}/cmake-${version}.tar.gz" +tarball_blake2b="a20fac503ba54b4b7e85896056a614b67aa346ad2636e7ab1bf09a2660b92a52754485527f36101e59d47713e7445d27797577c1fa6a8ebe59acb4675227c6da" diff --git a/source-recipes/gcc-host b/source-recipes/gcc-host new file mode 100644 index 00000000000..38d73211c97 --- /dev/null +++ b/source-recipes/gcc-host @@ -0,0 +1,16 @@ +name=gcc-host +version=13.2.0 +tarball_url="https://ftp.gnu.org/gnu/gcc/gcc-${version}/gcc-${version}.tar.xz" +tarball_blake2b="0034b29d3d6cc05821f0c4253ce077805943aff7b370729dd203bda57d89c107edd657eeddc2fb1e69ea15c7b0323b961f46516c7f4af89a3ccf7fea84701be2" +hostdeps="automake autoconf-2.69 libtool pkg-config" +imagedeps="git" +allow_network="yes" + +regenerate() { + ./contrib/download_prerequisites + + autotools_recursive_regen -I"$(realpath ./config)" + + cp -pv /usr/local/share/libtool/build-aux/{config.sub,config.guess,install-sh} libiberty/ + cp -pv /usr/local/share/libtool/build-aux/{config.sub,config.guess,install-sh} libgcc/ +} diff --git a/source-recipes/gnulib b/source-recipes/gnulib new file mode 100644 index 00000000000..623e07de9e4 --- /dev/null +++ b/source-recipes/gnulib @@ -0,0 +1,4 @@ +name=gnulib +version=4f6545e79c4a7cd7feb2c8f23f1d5167e7165907 +tarball_url="https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-${version}.tar.gz" +tarball_blake2b="0206d3bdeb25bdc3562065dc1832d3ea2ac95920b84ed0461626efba83de3edfcdcbc257c493a9a3d6035d0edb09526248c2483f898110be774ac31caf650e58" diff --git a/source-recipes/libgcc-binaries b/source-recipes/libgcc-binaries new file mode 100644 index 00000000000..749340993f1 --- /dev/null +++ b/source-recipes/libgcc-binaries @@ -0,0 +1,4 @@ +name=libgcc-binaries +version=1e4b24ef15a7d9a2db7570d1c9283fc474dcbd73 +tarball_url="https://github.com/mintsuki/libgcc-binaries/archive/${version}.tar.gz" +tarball_blake2b="77b8af0466577ca5af9b16d968865d24d42fb422566de2f03dd5b2d984f70015da6b1bd28878855889ee665f0ace4419cee3c40d20ac1176b0c500a1e50302bd" diff --git a/source-recipes/libtool b/source-recipes/libtool new file mode 100644 index 00000000000..c5d13fc2df2 --- /dev/null +++ b/source-recipes/libtool @@ -0,0 +1,11 @@ +name=libtool +version=2.4.7 +tarball_url="https://ftp.gnu.org/gnu/libtool/libtool-${version}.tar.gz" +tarball_blake2b="3b7c66050237931443008d6be9c0c30f4938402bf68576cdf02f2248b216bb68c6b797bbfdb8a92caa5e12cb10208cd19771cdcb6b0d83572ad60bfc03e67e98" +hostdeps="autoconf automake gnulib" +imagedeps="help2man" + +regenerate() { + cp -r ${base_dir}/sources/gnulib ./ + ./bootstrap --force --skip-git --skip-po --gnulib-srcdir=`pwd`/gnulib +} diff --git a/source-recipes/limine b/source-recipes/limine new file mode 100644 index 00000000000..8f96cc8e020 --- /dev/null +++ b/source-recipes/limine @@ -0,0 +1,12 @@ +name=limine +version=7.0.0 +revision=1 +tarball_url="https://github.com/limine-bootloader/limine/releases/download/v${version}/limine-${version}.tar.xz" +tarball_blake2b="7986d948fe84c80b338e5cc66edca5f511d277d2e854484c87183666bf1b075480b61213c177b6e39a1145502cc9e07b9e1442c3dcf3171339af5b55ac9c184f" +hostdeps="gcc libtool pkg-config autoconf automake" +deps="core-libs" +imagedeps="mtools nasm" + +regenerate() { + autoreconf -fvi +} \ No newline at end of file diff --git a/source-recipes/llvm-host b/source-recipes/llvm-host new file mode 100644 index 00000000000..af821a6152f --- /dev/null +++ b/source-recipes/llvm-host @@ -0,0 +1,11 @@ +name=llvm-host +version=17.0.6 +tarball_url="https://github.com/llvm/llvm-project/releases/download/llvmorg-${version}/llvm-project-${version}.src.tar.xz" +tarball_blake2b="d6ede1a9fda8756995c3e0654111941649e15794179641806f18919f1dc68c41ca0cabd5693b5096d05dccc3a391cd20d34af1137bf8af92ed3117a1ce84d1b2" + +regenerate() { + echo "Regenerating LLVM..." + for i in "${base_dir}"/patches/llvm/*; do + patch -p1 < "$i" + done +} diff --git a/source-recipes/pkg-config b/source-recipes/pkg-config new file mode 100644 index 00000000000..1195750a296 --- /dev/null +++ b/source-recipes/pkg-config @@ -0,0 +1,9 @@ +name=pkg-config +version=2.1.0 +tarball_url="https://github.com/pkgconf/pkgconf/archive/refs/tags/pkgconf-${version}.tar.gz" +tarball_blake2b="ab0f03494c37659c18a882ff03e6bb746c3cfe0ad66b7a9d9d0b2de66bec89258b2374addd3eb3a571442d8bab3c1311410e296379b697d16aaebe2bc89b318c" +hostdeps="autoconf automake libtool" + +regenerate() { + autoreconf -fvi +} diff --git a/source-recipes/rust-host b/source-recipes/rust-host new file mode 100644 index 00000000000..80122e1c151 --- /dev/null +++ b/source-recipes/rust-host @@ -0,0 +1,33 @@ +name=rust-host +version=1.75.0 +tarball_url="https://static.rust-lang.org/dist/rustc-${version}-src.tar.xz" +tarball_blake2b="8937b80585eddaa3e1f1ef948899d14a170308518c6fef9fe569560cdd870053776956743f796055f2119399b9ca6c0df12fedd789ae46324d071e5126c4e495" + +regenerate() { + cat > ${source_dir}/config.toml < super::Result { + let offset = self.offset.load(Ordering::SeqCst); + let new_offset = self.inode.inode().write_at(offset, buffer)?; + self.offset.fetch_add(new_offset, Ordering::SeqCst); Ok(new_offset) @@ -108,15 +126,6 @@ impl FileHandle { } } - pub fn write(&self, buffer: &[u8]) -> super::Result { - let offset = self.offset.load(Ordering::SeqCst); - let new_offset = self.inode.inode().write_at(offset, buffer)?; - - self.offset.fetch_add(new_offset, Ordering::SeqCst); - - Ok(new_offset) - } - pub fn dirnode(&self) -> DirCacheItem { self.inode.clone() } diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index 65400e1181d..c0e64579de8 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -166,6 +166,11 @@ impl Path { unsafe { &*(path as *const str as *const Path) } } + #[inline] + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + /// Returns [`true`] if the path is absolute. pub fn is_absolute(&self) -> bool { self.0.starts_with('/') @@ -275,10 +280,11 @@ pub fn lookup_path_with( let resolved_path = Path::new(&resolved_path_str); if resolved_path.is_absolute() { - return lookup_path(resolved_path); + cwd = lookup_path(resolved_path)?; + continue; } - return lookup_path_with(parent, resolved_path, LookupMode::None); + cwd = lookup_path_with(parent, resolved_path, LookupMode::None)?; } else if metadata.is_directory() { if let Ok(mount_point) = MOUNT_MANAGER.find_mount(cwd.clone()) { cwd = mount_point.root_entry; diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 7c08d2fd31f..5baacc6178f 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -48,8 +48,8 @@ naked_functions, // https://github.com/rust-lang/rust/issues/32408 cfg_match, // https://github.com/rust-lang/rust/issues/115585 strict_provenance, - offset_of, - associated_type_defaults + associated_type_defaults, + trait_upcasting )] // TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? // `lang_items` => is currently used for the personality function (`rust_eh_personality`). diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 2b773f09557..027e70fa391 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -267,6 +267,15 @@ impl IndexMut for ColorList { } } +impl Index for ColorList { + type Output = u32; + + #[inline] + fn index(&self, idx: usize) -> &Self::Output { + &self.0[idx] + } +} + pub struct Inner<'this> { buffer: &'this mut [u32], info: RendyInfo, @@ -869,6 +878,7 @@ impl<'a> vte::ansi::Handler for Inner<'a> { Attr::Foreground(color) => { let code = match color { vte::ansi::Color::Named(c) => self.color_list[c], + vte::ansi::Color::Indexed(c) => self.color_list[c as usize], _ => unimplemented!(), }; diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index a9d6aeb45c1..2ba5633ca5c 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -19,7 +19,7 @@ use core::fmt; use aero_syscall::prelude::*; use aero_syscall::signal::SigProcMask; -use aero_syscall::{OpenFlags, Stat, SyscallError, TimeSpec, AT_FDCWD}; +use aero_syscall::{AtFlags, OpenFlags, Stat, SyscallError, TimeSpec, AT_FDCWD}; use alloc::sync::Arc; use crate::fs::cache::{self, DirCacheImpl}; @@ -29,6 +29,7 @@ use crate::fs::file_table::{DuplicateHint, FileHandle}; use crate::fs::inode::{DirEntry, PollTable}; use crate::fs::pipe::Pipe; use crate::fs::{self, lookup_path, LookupMode}; +use crate::syscall::SysArg; use crate::userland::scheduler; use crate::fs::Path; @@ -103,7 +104,7 @@ pub fn read(fd: FileDescriptor, buffer: &mut [u8]) -> Result Result { let dir = match fd as isize { - AT_FDCWD => { + 0 => { if !path.is_absolute() { scheduler::get_scheduler().current_task().cwd_dirent() } else { @@ -111,7 +112,9 @@ pub fn open(fd: usize, path: &Path, mode: usize) -> Result } } - _ => todo!(), + _ => { + todo!() + } }; let mut flags = OpenFlags::from_bits(mode).ok_or(SyscallError::EINVAL)?; @@ -253,9 +256,14 @@ pub fn rmdir(path: &str) -> Result { #[syscall] pub fn getcwd(buffer: &mut [u8]) -> Result { - let cwd = scheduler::get_scheduler().current_task().get_cwd(); + let cwd = scheduler::current_thread().get_cwd(); + log::debug!("getcwd: {}", cwd); + // FIXME: fix this before commiting + buffer.fill(0); buffer[..cwd.len()].copy_from_slice(cwd.as_bytes()); + + // TOOD: mlibc doesnt give a shit and will increase the buf size till it fits. make it smarter. Ok(cwd.len()) } @@ -440,8 +448,30 @@ pub fn fcntl(fd: FileDescriptor, command: usize, arg: usize) -> Result Result { - *stat = fd.handle()?.inode().stat()?; +pub fn fstat(fd: usize, path: &Path, flags: usize, stat: &mut Stat) -> Result { + let at = match fd as isize { + AT_FDCWD if !path.is_absolute() => scheduler::current_thread().cwd_dirent(), + _ if !path.is_absolute() => FileDescriptor::from_usize(fd).handle()?.inode.clone(), + _ => fs::root_dir().clone(), + }; + + // TODO: derive(SysArg) for bitflags. + let flags = AtFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; + dbg!(flags); + + if path.is_empty() { + if !flags.contains(AtFlags::EMPTY_PATH) { + return Err(SyscallError::EINVAL); + } + + *stat = at.inode().stat()?; + return Ok(0); + } + + log::debug!("{}", at.absolute_path_str()); + + let ent = fs::lookup_path_with(at, path, LookupMode::None)?; + *stat = ent.inode().stat()?; Ok(0) } diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 2d57d128146..b6275ec0949 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -229,7 +229,7 @@ pub fn generic_do_syscall( SYS_DUP2 => fs::dup2(b, c, d), SYS_FCNTL => fs::fcntl(b, c, d), SYS_STAT => fs::stat(b, c, d), - SYS_FSTAT => fs::fstat(b, c), + SYS_FSTAT => fs::fstat(b, c, d, e, f), SYS_READ_LINK => fs::read_link(b, c, d, e), SYS_EVENT_FD => fs::event_fd(b, c), SYS_LINK => fs::link(b, c, d, e), diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index ab4cde12ce4..86d60ba3723 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -527,6 +527,12 @@ impl Task { *self.cwd.write() = Some(Cwd::new()) } + // if executable.absolute_path_str().contains("gcc") + // || executable.absolute_path_str().contains("ls") + // { + // self.enable_systrace(); + // } + *self.mem_tags.lock() = HashMap::new(); self.file_table.close_on_exec(); @@ -625,7 +631,12 @@ impl Task { } pub fn parent_pid(&self) -> TaskId { - self.get_parent().unwrap().pid() + if let Some(parent) = self.get_parent() { + parent.pid() + } else { + // On top of the family tree. + self.pid() + } } pub fn tid(&self) -> TaskId { diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 21f8279bfb9..d3936622d24 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -1152,7 +1152,7 @@ impl VmProtected { } else { // end let mut mapping = map.clone(); - mapping.start_addr = end; + mapping.start_addr = start; mapping.protection = prot; map.end_addr = start; diff --git a/src/aero_proc/Cargo.toml b/src/aero_proc/Cargo.toml index 04f2a19be45..f13c4edc75c 100644 --- a/src/aero_proc/Cargo.toml +++ b/src/aero_proc/Cargo.toml @@ -12,9 +12,9 @@ default = [] proc-macro = true [dependencies] -proc-macro2 = "1.0.63" +proc-macro2 = "1.0.78" proc-macro-error = "1.0.4" -quote = "1.0.18" +quote = "1" [dependencies.syn] features = ["full"] diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 98ce5533487..10ed83e6d37 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -16,7 +16,7 @@ // along with Aero. If not, see . #![no_std] -#![feature(decl_macro)] +// #![feature(decl_macro)] // cc #![allow(clippy::bad_bit_mask)] @@ -713,3 +713,14 @@ pub struct Stat { pub st_blksize: u64, pub st_blocks: u64, } + +bitflags::bitflags! { + #[repr(transparent)] + pub struct AtFlags: usize { + const EMPTY_PATH = 1; + const SYMLINK_FOLLOW = 2; + const SYMLINK_NOFOLLOW = 4; + const REMOVEDIR = 8; + const EACCESS = 512; + } +} diff --git a/src/aero_syscall/src/syscall.rs b/src/aero_syscall/src/syscall.rs index 1b20e34f5e2..f699c6f03f6 100644 --- a/src/aero_syscall/src/syscall.rs +++ b/src/aero_syscall/src/syscall.rs @@ -17,27 +17,29 @@ use core::arch::asm; -macro define_syscall_fns($(pub fn $sys_fn:ident($a:ident $(,$b:ident $(,$c:ident $(,$d:ident $(,$e:ident $(,$f:ident $(,$g:ident)?)?)?)?)?)?) -> usize;)+) { - $( - pub fn $sys_fn(mut $a: usize, $($b: usize, $($c: usize, $($d: usize, $($e: usize, $($f: usize, $($g: usize)?)?)?)?)?)?) -> usize { - #[cfg(target_arch = "x86_64")] - unsafe { - asm!( - "syscall", - inout("rax") $a, - $(in("rdi") $b, $(in("rsi") $c, $(in("rdx") $d, $(in("r10") $e, $(in("r8") $f, $(in("r9") $g,)?)?)?)?)?)? - out("rcx") _, - out("r11") _, - options(nostack), - ); +macro_rules! define_syscall_fns{ + ($(pub fn $sys_fn:ident($a:ident $(,$b:ident $(,$c:ident $(,$d:ident $(,$e:ident $(,$f:ident $(,$g:ident)?)?)?)?)?)?) -> usize;)+) => { + $( + pub fn $sys_fn(mut $a: usize, $($b: usize, $($c: usize, $($d: usize, $($e: usize, $($f: usize, $($g: usize)?)?)?)?)?)?) -> usize { + #[cfg(target_arch = "x86_64")] + unsafe { + asm!( + "syscall", + inout("rax") $a, + $(in("rdi") $b, $(in("rsi") $c, $(in("rdx") $d, $(in("r10") $e, $(in("r8") $f, $(in("r9") $g,)?)?)?)?)?)? + out("rcx") _, + out("r11") _, + options(nostack), + ); - $a - } + $a + } - #[cfg(target_arch = "aarch64")] - unreachable!("aarch64 is not supported yet"); - } - )+ + #[cfg(target_arch = "aarch64")] + unreachable!("aarch64 is not supported yet"); + } + )+ + } } define_syscall_fns!( diff --git a/userland/CMakeToolchain-x86_64.cmake b/userland/CMakeToolchain-x86_64.cmake index 37b45861653..1e305c84a70 100644 --- a/userland/CMakeToolchain-x86_64.cmake +++ b/userland/CMakeToolchain-x86_64.cmake @@ -1,6 +1,6 @@ -set(CMAKE_SYSTEM_NAME aero) +set(CMAKE_SYSTEM_NAME Aero) -set(CMAKE_FIND_ROOT_PATH $ENV{XBSTRAP_SYSROOT_DIR}) +set(CMAKE_FIND_ROOT_PATH /sysroot) set(CMAKE_C_COMPILER x86_64-aero-gcc) set(CMAKE_CXX_COMPILER x86_64-aero-g++) diff --git a/userland/Cargo.lock b/userland/Cargo.lock deleted file mode 100644 index a3b9233381b..00000000000 --- a/userland/Cargo.lock +++ /dev/null @@ -1,355 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aero_ipc" -version = "0.1.0" -dependencies = [ - "aero_syscall", - "lazy_static", - "postcard", - "serde", - "spin 0.9.8", -] - -[[package]] -name = "aero_syscall" -version = "0.1.0" -dependencies = [ - "bitflags", - "byte_endian", - "num-derive", - "num-traits", - "static_assertions", -] - -[[package]] -name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "atomic-polyfill" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28" -dependencies = [ - "critical-section", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "byte_endian" -version = "0.1.0" -source = "git+https://github.com/aero-os/byte_endian#47cec808e9c2813563f3a103ac2da2106c65f755" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "critical-section" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52" - -[[package]] -name = "getrandom" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" -dependencies = [ - "cfg-if", - "libc 0.2.139 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi", -] - -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash", -] - -[[package]] -name = "heapless" -version = "0.7.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" -dependencies = [ - "atomic-polyfill", - "hash32", - "rustc_version", - "serde", - "spin 0.9.8", - "stable_deref_trait", -] - -[[package]] -name = "init" -version = "0.1.0" -dependencies = [ - "aero_syscall", - "libc 0.2.139 (git+https://github.com/Andy-Python-Programmer/libc)", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin 0.5.2", -] - -[[package]] -name = "libc" -version = "0.2.139" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" - -[[package]] -name = "libc" -version = "0.2.139" -source = "git+https://github.com/Andy-Python-Programmer/libc#0a8654ec90fe3940d4a1750fcf69cf67f49bc2b9" - -[[package]] -name = "lock_api" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" - -[[package]] -name = "postcard" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25c0b0ae06fcffe600ad392aabfa535696c8973f2253d9ac83171924c58a858" -dependencies = [ - "heapless", - "postcard-cobs", - "serde", -] - -[[package]] -name = "postcard-cobs" -version = "0.1.5-pre" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c68cb38ed13fd7bc9dd5db8f165b7c8d9c1a315104083a2b10f11354c2af97f" - -[[package]] -name = "proc-macro2" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "semver" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" - -[[package]] -name = "serde" -version = "1.0.152" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.152" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "syn" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "system_server" -version = "0.1.0" -dependencies = [ - "aero_ipc", - "aero_syscall", - "hashbrown", - "spin 0.9.8", -] - -[[package]] -name = "systrace" -version = "0.1.0" -dependencies = [ - "aero_syscall", -] - -[[package]] -name = "unicode-ident" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "window_server" -version = "0.1.0" -dependencies = [ - "aero_ipc", - "aero_syscall", - "hashbrown", - "libc 0.2.139 (git+https://github.com/Andy-Python-Programmer/libc)", - "spin 0.9.8", -] - -[[package]] -name = "window_test" -version = "0.1.0" -dependencies = [ - "aero_ipc", - "aero_syscall", -] diff --git a/userland/Cargo.toml b/userland/Cargo.toml deleted file mode 100644 index c2e6b521c9c..00000000000 --- a/userland/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[workspace] -resolver = "2" -members = ["apps/*", "servers/*"] - -[profile.release] -debug = true diff --git a/userland/Makefile b/userland/Makefile new file mode 100644 index 00000000000..efbbbf40bf8 --- /dev/null +++ b/userland/Makefile @@ -0,0 +1,37 @@ +.PHONY: all clean install + +override TARGET_DIR := target + +override SYSTRACE_DIR := apps/systrace +override SYSTRACE_TARGET := $(TARGET_DIR)/systrace + +override TEST_DIR := tests +override TEST_TARGET = $(TARGET_DIR)/utest + +override INIT_DIR := init +override INIT_TARGET := $(TARGET_DIR)/init + +all: $(INIT_TARGET) $(SYSTRACE_TARGET) $(TEST_TARGET) + +$(INIT_TARGET): $(INIT_DIR)/init.c + mkdir -p $(TARGET_DIR) + $(CC) -o $@ $^ + +$(SYSTRACE_TARGET): $(SYSTRACE_DIR) + mkdir -p $(TARGET_DIR) + cd $(SYSTRACE_DIR) && cargo build --release + cp $(SYSTRACE_DIR)/target/x86_64-unknown-aero/release/systrace $(SYSTRACE_TARGET) + +$(TEST_TARGET): $(TEST_DIR)/utest.cc + mkdir -p $(TARGET_DIR) + $(CXX) -o $@ $^ + +clean: + rm -rf $(INIT_TARGET) + rm -rf $(SYSTRACE_TARGET) + +install: + install -d "$(DESTDIR)$(PREFIX)/bin" + install $(INIT_TARGET) "$(DESTDIR)$(PREFIX)/bin/" + install $(SYSTRACE_TARGET) "$(DESTDIR)$(PREFIX)/bin/" + install $(TEST_TARGET) "$(DESTDIR)$(PREFIX)/bin/" diff --git a/userland/aero.cmake b/userland/aero.cmake deleted file mode 100644 index 4f11498b9d8..00000000000 --- a/userland/aero.cmake +++ /dev/null @@ -1 +0,0 @@ -include(Platform/UnixPaths) \ No newline at end of file diff --git a/userland/apps/systrace/Cargo.toml b/userland/apps/systrace/Cargo.toml index 88e5bf272f2..c9865830a45 100644 --- a/userland/apps/systrace/Cargo.toml +++ b/userland/apps/systrace/Cargo.toml @@ -4,4 +4,4 @@ version = "0.1.0" edition = "2021" [dependencies] -aero_syscall = { path = "../../../src/aero_syscall" } +aero_syscall = { path = "/base_dir/src/aero_syscall" } diff --git a/userland/cross-file.ini b/userland/cross-file.ini index 87deb26d1ee..08d220581b6 100644 --- a/userland/cross-file.ini +++ b/userland/cross-file.ini @@ -5,7 +5,7 @@ ar = 'x86_64-aero-ar' strip = 'x86_64-aero-strip' ld = 'x86_64-aero-ld' pkgconfig = 'x86_64-aero-pkg-config' -# sed adds binaries here. +llvm-config = '/base_dir/build-support/cross-llvm-config' [host_machine] system = 'aero' diff --git a/userland/cross-llvm-config b/userland/cross-llvm-config deleted file mode 100755 index e238874164b..00000000000 --- a/userland/cross-llvm-config +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import os -import sys - -our_version = 14 - - -def do_version(): - return "{}.0.1".format(our_version) - - -def do_components(): - return " ".join( - [ - "all", - "all-targets", - "analysis", - "asmparser", - "asmprinter", - "binaryformat", - "bitreader", - "bitwriter", - "codegen", - "core", - "coroutines", - "coverage", - "debuginfocodeview", - "debuginfodwarf", - "debuginfomsf", - "debuginfopdb", - "demangle", - "dlltooldriver", - "engine", - "executionengine", - "fuzzmutate", - "globalisel", - "gtest", - "gtest_main", - "instcombine", - "instrumentation", - "interpreter", - "ipo", - "irreader", - "libdriver", - "lineeditor", - "linker", - "lto", - "mc", - "mcdisassembler", - "mcjit", - "mcparser", - "mirparser", - "native", - "nativecodegen", - "objcarcopts", - "object", - "objectyaml", - "option", - "orcjit", - "passes", - "profiledata", - "runtimedyld", - "scalaropts", - "selectiondag", - "support", - "symbolize", - "tablegen", - "target", - "testingsupport", - "transformutils", - "vectorize", - "windowsmanifest", - "x86", - "x86asmparser", - "x86asmprinter", - "x86codegen", - "x86desc", - "x86disassembler", - "x86info", - "x86utils", - ] - ) - - -def do_targets_built(): - return "X86" - - -def get_includedir(): - sysroot = os.environ["XBSTRAP_SYSROOT_DIR"] - return sysroot + "/usr/include" - - -def get_libdir(): - sysroot = os.environ["XBSTRAP_SYSROOT_DIR"] - return sysroot + "/usr/lib" - - -def do_has_rtti(): - return "YES" - - -def do_shared_mode(): - return "shared" - - -def do_libs(): - return "-lLLVM-{}".format(our_version) - - -def do_system_libs(): - return "-lLLVM-{}".format(our_version) - - -def do_cppflags(): - return "" - - -def do_cxxflags(): - return "" - - -def do_ldflags(): - return "-L" + get_libdir() - - -parser = argparse.ArgumentParser() -parser.add_argument("--version", action="append_const", dest="command", const=do_version) -parser.add_argument( - "--targets-built", action="append_const", dest="command", const=do_targets_built -) -parser.add_argument("--components", action="append_const", dest="command", const=do_components) -parser.add_argument("--includedir", action="append_const", dest="command", const=get_includedir) -parser.add_argument("--libdir", action="append_const", dest="command", const=get_libdir) -parser.add_argument("--has-rtti", action="append_const", dest="command", const=do_has_rtti) -parser.add_argument("--shared-mode", action="append_const", dest="command", const=do_shared_mode) -parser.add_argument("--link-shared", action="store_const", dest="link", const="shared") -parser.add_argument("--cppflags", action="append_const", dest="command", const=do_cppflags) -parser.add_argument("--cxxflags", action="append_const", dest="command", const=do_cxxflags) -parser.add_argument("--ldflags", action="append_const", dest="command", const=do_ldflags) -parser.add_argument("--libs", action="append_const", dest="command", const=do_libs) -parser.add_argument("--system-libs", action="append_const", dest="command", const=do_system_libs) -parser.add_argument("components", type=str, nargs="*") - -print("cross-llvm-config:", sys.argv, file=sys.stderr) - -args = parser.parse_args() -for command in args.command: - result = command() - print("cross-llvm-config yields:", result, file=sys.stderr) - print(result) diff --git a/userland/init/init.c b/userland/init/init.c new file mode 100644 index 00000000000..2f7a6e78e70 --- /dev/null +++ b/userland/init/init.c @@ -0,0 +1,30 @@ +#include +#include +#include +#include +#include +#include + +int main() { + int fd_stdin = open("/dev/vtty", O_RDONLY); + int fd_stdout = open("/dev/vtty", O_WRONLY); + int fd_stderr = open("/dev/vtty", O_WRONLY); + + printf("Hello world\n"); + + setenv("TERM", "linux", 1); + setenv("USER", "root", 1); + setenv("PATH", "/usr/local/bin:/usr/bin", 1); + + int pid = fork(); + + if (!pid) { + char *args[] = {"/usr/bin/bash", "-l", NULL}; + execvp("/usr/bin/bash", args); + } else { + int status; + waitpid(pid, &status, 0); + } + + return 0; +} diff --git a/userland/tests/getchar.cc b/userland/tests/getchar.cc deleted file mode 100644 index 7b2ac57058e..00000000000 --- a/userland/tests/getchar.cc +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -int main() { - std::string line; - char c; - - while ((c = getchar()) != EOF) { - std::cout << "Got: " << c << std::endl; - // FIXME: Should we also break on \r? - if (c == '\n') - break; - line.push_back(c); - } - - std::cout << line << std::endl; - return 0; -} diff --git a/userland/tests/test.cc b/userland/tests/utest.cc similarity index 95% rename from userland/tests/test.cc rename to userland/tests/utest.cc index e7a01c6b7f8..47c700cc612 100644 --- a/userland/tests/test.cc +++ b/userland/tests/utest.cc @@ -259,37 +259,37 @@ namespace { template void runChecks(Func &&f) { - // pid_t pid = fork(); - // assert_errno("fork", pid >= 0); - - // struct sigaction sa, old_sa; - // sigemptyset(&sa.sa_mask); - // sa.sa_sigaction = signalHandler; - // sa.sa_flags = SA_SIGINFO; - - // int ret = sigaction(SIGSEGV, &sa, &old_sa); - // assert_errno("sigaction", ret != -1); - - // if (pid == 0) { - // f(); - // exit(0); - // } else { - // int status = 0; - // while (waitpid(pid, &status, 0) == -1) { - // if (errno == EINTR) continue; - // assert_errno("waitpid", false); - // } - - // if (WIFSIGNALED(status) || WEXITSTATUS(status) != 0) { - // fprintf(stderr, "Test failed on subprocess!\n"); - // abort(); - // } - - // f(); - // } - - // ret = sigaction(SIGSEGV, &old_sa, nullptr); - // assert_errno("sigaction", ret != -1); + pid_t pid = fork(); + assert_errno("fork", pid >= 0); + + struct sigaction sa, old_sa; + sigemptyset(&sa.sa_mask); + sa.sa_sigaction = signalHandler; + sa.sa_flags = SA_SIGINFO; + + int ret = sigaction(SIGSEGV, &sa, &old_sa); + assert_errno("sigaction", ret != -1); + + if (pid == 0) { + f(); + exit(0); + } else { + int status = 0; + while (waitpid(pid, &status, 0) == -1) { + if (errno == EINTR) continue; + assert_errno("waitpid", false); + } + + if (WIFSIGNALED(status) || WEXITSTATUS(status) != 0) { + fprintf(stderr, "Test failed on subprocess!\n"); + abort(); + } + + f(); + } + + ret = sigaction(SIGSEGV, &old_sa, nullptr); + assert_errno("sigaction", ret != -1); } const size_t pageSize = sysconf(_SC_PAGESIZE); diff --git a/web/index.html b/web/index.html index 6876844fbdf..3acaa6b29e7 100644 --- a/web/index.html +++ b/web/index.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 6e784a42024d530ea0cbdea650ff556461773f6f Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 24 Feb 2024 19:27:47 +1100 Subject: [PATCH 284/368] kernel: make syscall handlers naked functions Signed-off-by: Anhad Singh --- Makefile | 13 +- build-support/mkiso.sh | 2 +- improving-build-times.txt | 4 +- src/.cargo/config.toml | 5 +- src/.cargo/x86_64-aero_os.json | 21 --- src/aero_kernel/build.rs | 3 + src/aero_kernel/src/arch/x86_64/gdt.rs | 9 +- src/aero_kernel/src/arch/x86_64/registers.S | 40 +++++ src/aero_kernel/src/arch/x86_64/syscall.rs | 155 +++++++++++++++- .../src/arch/x86_64/syscall_handler.asm | 169 ------------------ src/aero_kernel/src/arch/x86_64/task.asm | 95 ---------- src/aero_kernel/src/arch/x86_64/task.rs | 121 ++++++++++--- src/aero_kernel/src/fs/block/mod.rs | 2 +- src/aero_kernel/src/main.rs | 3 +- src/aero_kernel/src/userland/task/mod.rs | 2 +- userland/tests/utest.cc | 122 ++++++++++++- 16 files changed, 435 insertions(+), 331 deletions(-) delete mode 100644 src/.cargo/x86_64-aero_os.json create mode 100644 src/aero_kernel/src/arch/x86_64/registers.S delete mode 100644 src/aero_kernel/src/arch/x86_64/syscall_handler.asm delete mode 100644 src/aero_kernel/src/arch/x86_64/task.asm diff --git a/Makefile b/Makefile index f5b44ca4165..4881d45424c 100644 --- a/Makefile +++ b/Makefile @@ -14,23 +14,22 @@ distro: jinx SOURCE_DIR := src USERLAND_DIR := userland USERLAND_TARGET := builds/userland/target/init -KERNEL_TARGET := src/target/x86_64-aero_os/release/aero_kernel +KERNEL_TARGET := src/target/x86_64-unknown-none/release/aero_kernel .PHONY: clean clean: rm -rf src/target $(KERNEL_TARGET): $(shell find $(SOURCE_DIR) -type f -not -path '$(SOURCE_DIR)/target/*') - cd src && cargo build --package aero_kernel --target .cargo/x86_64-aero_os.json --release - @$(MAKE) iso + cd src && cargo build --package aero_kernel --release + ./build-support/mkiso.sh $(USERLAND_TARGET): $(shell find $(USERLAND_DIR) -type f -not -path '$(USERLAND_DIR)/target/*') ./target/jinx/jinx rebuild userland @$(MAKE) distro-image .PHONY: iso -iso: $(KERNEL_TARGET) - ./build-support/mkiso.sh +iso: $(KERNEL_TARGET) .PHONY: distro-image distro-image: distro @@ -38,10 +37,10 @@ distro-image: distro .PHONY: qemu qemu: $(KERNEL_TARGET) $(USERLAND_TARGET) - ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -enable-kvm -cpu host -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme + ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -enable-kvm -cpu host,+vmx -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme .PHONY: doc doc: rm -rf target/doc - cd src && cargo doc --package aero_kernel --target .cargo/x86_64-aero_os.json --release --target-dir=../target/doc/ + cd src && cargo doc --package aero_kernel --release --target-dir=../target/doc/ cp web/index.html target/doc/index.html diff --git a/build-support/mkiso.sh b/build-support/mkiso.sh index 46435fd04bf..42b2fea86bf 100755 --- a/build-support/mkiso.sh +++ b/build-support/mkiso.sh @@ -5,7 +5,7 @@ set -ex rm -rf target/iso_root mkdir -pv target/iso_root/boot -cp src/target/x86_64-aero_os/release/aero_kernel target/iso_root/aero +cp src/target/x86_64-unknown-none/release/aero_kernel target/iso_root/aero cp build-support/limine.cfg src/.cargo/term_background.bmp target/iso_root/ # Install the limine binaries diff --git a/improving-build-times.txt b/improving-build-times.txt index 6c4026a4d07..856726f3ede 100644 --- a/improving-build-times.txt +++ b/improving-build-times.txt @@ -1,2 +1,2 @@ -28.36s - +total_build: 28.36s +rebuild: 8.27s diff --git a/src/.cargo/config.toml b/src/.cargo/config.toml index c583ec52b03..6b5e72fb681 100644 --- a/src/.cargo/config.toml +++ b/src/.cargo/config.toml @@ -3,7 +3,7 @@ build-std = ["core", "compiler_builtins", "alloc"] build-std-features = ["compiler-builtins-mem"] [build] -target = "./.cargo/x86_64-aero_os.json" +target = "x86_64-unknown-none" rustflags = [ # Miscellaneous: "-Cforce-frame-pointers=yes", @@ -14,4 +14,7 @@ rustflags = [ "-Zthreads=8", # https://blog.rust-lang.org/inside-rust/2023/12/22/trait-system-refactor-initiative.html "-Znext-solver=coherence", + + # Linker flags: + "-Clink-arg=--no-pie", ] diff --git a/src/.cargo/x86_64-aero_os.json b/src/.cargo/x86_64-aero_os.json deleted file mode 100644 index 3259a444b56..00000000000 --- a/src/.cargo/x86_64-aero_os.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "llvm-target": "x86_64-unknown-none", - "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128", - "arch": "x86_64", - "target-endian": "little", - "target-pointer-width": "64", - "target-c-int-width": "32", - "os": "none", - "executables": true, - "linker-flavor": "ld.lld", - "linker": "rust-lld", - "disable-redzone": true, - "features": "-mmx,-sse,+soft-float", - "code-model": "kernel", - "pre-link-args": { - "ld.lld": [ - "--gc-sections", - "--script=.cargo/kernel.ld" - ] - } -} \ No newline at end of file diff --git a/src/aero_kernel/build.rs b/src/aero_kernel/build.rs index 6e10d97a25e..aee21c04642 100644 --- a/src/aero_kernel/build.rs +++ b/src/aero_kernel/build.rs @@ -113,6 +113,9 @@ fn main() -> Result<(), Box> { } })?; + // Tell cargo to pass the linker script to the linker.. + println!("cargo:rustc-link-arg=-T.cargo/kernel.ld"); + // ..and to re-run if it changes. println!("cargo:rerun-if-changed=.cargo/kernel.ld"); Ok(()) diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index 272b732d626..dd3c197f8f8 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -54,6 +54,7 @@ bitflags::bitflags! { #[derive(Debug, Clone, Copy, PartialEq)] pub enum Ring { Ring0 = 0b00, + Ring3 = 0b11, } const BOOT_GDT_ENTRY_COUNT: usize = 4; @@ -175,10 +176,13 @@ impl GdtAccessFlags { pub struct GdtEntryType; +#[rustfmt::skip] impl GdtEntryType { pub const KERNEL_CODE: u16 = 1; pub const KERNEL_DATA: u16 = 2; pub const KERNEL_TLS: u16 = 3; + pub const USER_DATA: u16 = 4; + pub const USER_CODE: u16 = 5; pub const TSS: u16 = 8; pub const TSS_HI: u16 = 9; } @@ -266,7 +270,7 @@ pub struct Tss { /// The full 64-bit canonical forms of the stack pointers (RSP) for /// privilege levels 0-2. pub rsp: [u64; 3], // offset 0x04 - reserved2: u64, // offset 0x1C + pub reserved2: u64, // offset 0x1C /// The full 64-bit canonical forms of the interrupt stack table /// (IST) pointers. @@ -317,6 +321,9 @@ pub fn init_boot() { static STK: [u8; 4096 * 16] = [0; 4096 * 16]; +pub const USER_SS: SegmentSelector = SegmentSelector::new(GdtEntryType::USER_DATA, Ring::Ring3); +pub const USER_CS: SegmentSelector = SegmentSelector::new(GdtEntryType::USER_CODE, Ring::Ring3); + /// Initialize the *actual* GDT stored in TLS. /// /// ## Safety diff --git a/src/aero_kernel/src/arch/x86_64/registers.S b/src/aero_kernel/src/arch/x86_64/registers.S new file mode 100644 index 00000000000..91e38b91b15 --- /dev/null +++ b/src/aero_kernel/src/arch/x86_64/registers.S @@ -0,0 +1,40 @@ +.macro pop_preserved + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + pop rbx +.endm + +.macro pop_scratch + pop r11 + pop r10 + pop r9 + pop r8 + pop rsi + pop rdi + pop rdx + pop rcx + pop rax +.endm + +.macro push_scratch + push rcx + push rdx + push rdi + push rsi + push r8 + push r9 + push r10 + push r11 +.endm + +.macro push_preserved + push rbx + push rbp + push r12 + push r13 + push r14 + push r15 +.endm diff --git a/src/aero_kernel/src/arch/x86_64/syscall.rs b/src/aero_kernel/src/arch/x86_64/syscall.rs index 5cd9d9a7ac6..e0e672d8764 100644 --- a/src/aero_kernel/src/arch/x86_64/syscall.rs +++ b/src/aero_kernel/src/arch/x86_64/syscall.rs @@ -1,7 +1,7 @@ use aero_syscall::SyscallError; use raw_cpuid::CpuId; -use crate::arch::gdt::GdtEntryType; +use crate::arch::gdt::{GdtEntryType, Tss, USER_CS, USER_SS}; use crate::mem::paging::VirtAddr; use crate::userland::scheduler::{self, ExitStatus}; use crate::utils::sync::IrqGuard; @@ -9,16 +9,158 @@ use crate::utils::sync::IrqGuard; use super::interrupts::InterruptErrorStack; use super::io; -extern "C" { - fn x86_64_syscall_handler(); - fn x86_64_sysenter_handler(); -} +use core::mem::offset_of; const ARCH_SET_GS: usize = 0x1001; const ARCH_SET_FS: usize = 0x1002; const ARCH_GET_FS: usize = 0x1003; const ARCH_GET_GS: usize = 0x1004; +core::arch::global_asm!(include_str!("./registers.S")); + +/// 64-bit SYSCALL instruction entry point. +/// +/// The instruction supports to to 6 arguments in registers. +/// +/// Registers state on entry: +/// * `RAX` - system call number +/// * `RCX` - return address +/// * `R11` - saved flags (note: R11 is callee-clobbered register in C ABI) +/// * `RDI` - argument 1 +/// * `RSI` - argument 2 +/// * `RDX` - argument 3 +/// * `R10` - argument 4 (needs to be moved to RCX to conform to C ABI) +/// * `R8` - argument 5 +/// * `R9` - argument 6 +/// +/// (note: `R12`..`R15`, `RBP`, `RBX` are callee-preserved in C ABI) +/// +/// The instruction saves the `RIP` to `RCX`, clears `RFLAGS.RF` then saves `RFLAGS` to `R11`. +/// Followed by, it loads the new `SS`, `CS`, and `RIP` from previously programmed MSRs. +/// +/// The instruction also does not save anything on the stack and does *not* change the `RSP`. +#[naked] +unsafe extern "C" fn x86_64_syscall_handler() { + asm!( + // make the GS base point to the kernel TLS + "swapgs", + // save the user stack pointer + "mov qword ptr gs:{tss_temp_ustack_off}, rsp", + // restore kernel stack + "mov rsp, qword ptr gs:{tss_rsp0_off}", + "push {userland_ss}", + // push userspace stack ptr + "push qword ptr gs:{tss_temp_ustack_off}", + "push r11", + "push {userland_cs}", + "push rcx", + + "push rax", + "push_scratch", + "push_preserved", + + // push a fake error code to match with the layout of `InterruptErrorStack` + "push 0", + + "mov rdi, rsp", + + "cld", + "call {x86_64_do_syscall}", + "cli", + + // pop the fake error code + "add rsp, 8", + + "pop_preserved", + "pop_scratch", + + // cook the sysret frame + "pop rcx", + "add rsp, 8", + "pop r11", + "pop rsp", + + // restore user GS + "swapgs", + "sysretq", + + // constants: + userland_cs = const USER_CS.bits(), + userland_ss = const USER_SS.bits(), + // XXX: add 8 bytes to skip the x86_64 cpu local self ptr + tss_temp_ustack_off = const offset_of!(Tss, reserved2) + core::mem::size_of::(), + tss_rsp0_off = const offset_of!(Tss, rsp) + core::mem::size_of::(), + x86_64_do_syscall = sym x86_64_do_syscall, + options(noreturn) + ) +} + +/// 64-bit SYSENTER instruction entry point. +/// +/// The SYSENTER mechanism performs a fast transition to the kernel. +/// +/// The new `CS` is loaded from the `IA32_SYSENTER_CS` MSR, and the new instruction and stack +/// pointers are loaded from `IA32_SYSENTER_EIP` and `IA32_SYSENTER_ESP`, respectively. `RFLAGS.IF` +/// is cleared, but other flags are unchanged. +/// +/// As the instruction does not save *any* state, the user is required to provide the return `RIP` +/// and `RSP` in the `RCX` and `R11` registers, respectively. These addresses must be canonical. +/// +/// The instruction expects the call number and arguments in the same registers as for SYSCALL. +#[naked] +unsafe extern "C" fn x86_64_sysenter_handler() { + asm!( + "swapgs", + // Build the interrupt frame expected by the kernel. + "push {userland_ss}", + "push r11", + "pushfq", + "push {userland_cs}", + "push rcx", + // Mask the same flags as for SYSCALL. + // XXX: Up to this point the code can be single-stepped if the user sets TF. + "pushfq", + "and dword ptr [rsp], 0x300", + "popfq", + "push rax", + "push_scratch", + "push_preserved", + "push 0", + // Store the stack pointer (interrupt frame ptr) in `RBP` for safe keeping, and align the + // stack as specified by the SysV calling convention. + "mov rbp, rsp", + "and rsp, ~0xf", + "mov rdi, rbp", + "call {x86_64_check_sysenter}", + "mov rdi, rbp", + "call {x86_64_do_syscall}", + // Reload the stack pointer, skipping the error code. + "lea rsp, [rbp + 8]", + "pop_preserved", + "pop_scratch", + // Pop the `IRET` frame into the registers expected by `SYSEXIT`. + "pop rdx", // return `RIP` in `RDX` + "add rsp, 8", + "popfq", // restore saved `RFLAGS` + "pop rcx", // return `RSP` in `RCX` + // SAFETY: The above call to `x86_64_check_sysenter` is guarantees that we execute + // `sysexit` with canonical addresses in RCX and RDX. Otherwise we would fault in the + // kernel having already swapped back to the user's GS. + "swapgs", + // SYSEXIT does *not* restore `IF` to re-enable interrupts. + // This is done here, rather then when restoring `RFLAGS` above, since `STI` will keep + "sti", + // interrupts inhibited until after the *following* instruction executes. + "sysexitq", + // constants: + userland_cs = const USER_CS.bits(), + userland_ss = const USER_SS.bits(), + x86_64_check_sysenter = sym x86_64_check_sysenter, + x86_64_do_syscall = sym x86_64_do_syscall, + options(noreturn) + ) +} + fn arch_prctl(command: usize, address: usize) -> Result { match command { ARCH_SET_FS => unsafe { @@ -63,7 +205,6 @@ fn arch_prctl(command: usize, address: usize) -> Result { /// /// We cannot execute `sysexit` on return with non-canonical return addresses, or we /// will take a fault in the kernel with the user's GS base already swapped back. -#[no_mangle] pub(super) extern "sysv64" fn x86_64_check_sysenter(stack: &mut InterruptErrorStack) { let rip = stack.stack.iret.rip; let rsp = stack.stack.iret.rsp; @@ -77,7 +218,6 @@ pub(super) extern "sysv64" fn x86_64_check_sysenter(stack: &mut InterruptErrorSt } } -#[no_mangle] pub(super) extern "C" fn x86_64_do_syscall(stack: &mut InterruptErrorStack) { let stack = &mut stack.stack; @@ -156,6 +296,7 @@ pub(super) fn init() { .map_or(false, |i| i.has_sysenter_sysexit()); if has_sysenter { + log::info!("enabling support for sysenter"); unsafe { io::wrmsr( io::IA32_SYSENTER_CS, diff --git a/src/aero_kernel/src/arch/x86_64/syscall_handler.asm b/src/aero_kernel/src/arch/x86_64/syscall_handler.asm deleted file mode 100644 index e9a519d0c9c..00000000000 --- a/src/aero_kernel/src/arch/x86_64/syscall_handler.asm +++ /dev/null @@ -1,169 +0,0 @@ -; Copyright (C) 2021 The Aero Project Developers. -; -; This file is part of The Aero Project. -; -; Aero is free software: you can redistribute it and/or modify -; it under the terms of the GNU General Public License as published by -; the Free Software Foundation, either version 3 of the License, or -; (at your option) any later version. -; -; Aero is distributed in the hope that it will be useful, -; but WITHOUT ANY WARRANTY; without even the implied warranty of -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -; GNU General Public License for more details. -; -; You should have received a copy of the GNU General Public License -; along with Aero. If not, see . - -bits 64 - -%include "registers.inc" - -extern x86_64_do_syscall -extern x86_64_check_sysenter -global x86_64_syscall_handler - -%define TSS_TEMP_USTACK_OFF 0x24 -%define TSS_RSP0_OFF 0xc - -%define USERLAND_SS 0x23 -%define USERLAND_CS 0x2b - -%define FMASK 0x300 ; TF | DF - -; 64-bit SYSCALL instruction entry point. The instruction supports -; to to 6 arguments in registers. -; -; Registers state on entry: -; RAX - system call number -; RCX - return address -; R11 - saved flags (note: R11 is callee-clobbered register in C ABI) -; RDI - argument 1 -; RSI - argument 2 -; RDX - argument 3 -; R10 - argument 4 (needs to be moved to RCX to conform to C ABI) -; R8 - argument 5 -; R9 - argument 6 -; -; (note: R12..R15, RBP, RBX are callee-preserved in C ABI) -; -; The instruction saves the RIP to RCX, clears RFLAGS.RF then saves -; RFLAGS to R11. Followed by, it loads the new SS, CS, and RIP from -; previously programmed MSRs. -; -; The instruction also does not save anything on the stack and does -; *not* change the RSP. -x86_64_syscall_handler: - ; swap the GS base to ensure that it points to the - ; kernel PCR. - swapgs - - mov [gs:TSS_TEMP_USTACK_OFF], rsp ; save the user stack pointer - mov rsp, [gs:TSS_RSP0_OFF] ; restore the kernel stack pointer - push qword USERLAND_SS ; push userspace SS - push qword [gs:TSS_TEMP_USTACK_OFF] ; push userspace stack pointer - push r11 ; push RFLAGS - push qword USERLAND_CS ; push userspace CS - push rcx ; push userspace return pointer - - push rax - push_scratch - push_preserved - - ; push a "fake" error code to match with the layout of the - ; `InterruptErrorStack` structure. - push 0 - - mov rdi, rsp - - cld - call x86_64_do_syscall - cli - - ; pop the "fake" error code - add rsp, 8 - - pop_preserved - pop_scratch - - ; make the sysret frame - pop rcx - add rsp, 8 - pop r11 - - pop rsp - - swapgs - o64 sysret - -; 64-bit SYSENTER entry point -; -; The SYSENTER mechanism performs a fast transition to the kernel. -; The new CS is loaded from the IA32_SYSENTER_CS MSR, and the new instruction -; and stack pointers are loaded from IA32_SYSENTER_EIP and IA32_SYSENTER_ESP, -; respectively. RFLAGS.IF is cleared, but other flags are unchanged. -; -; As the instruction does not save *any* state, the user is required to provide -; the return RIP and RSP in the RCX and R11 registers, respectively. These -; addresses must be canonical. -; -; The instruction expects the call number and arguments in the same registers as -; for SYSCALL. -; -section .text.x86_64_sysenter_handler -global x86_64_sysenter_handler:function (x86_64_sysenter_handler.end - x86_64_sysenter_handler) -align 16 -x86_64_sysenter_handler: - swapgs - - ; Build the interrupt frame expected by the kernel. - push USERLAND_SS - push r11 - pushfq - push USERLAND_CS - push rcx - - ; Mask the same flags as for SYSCALL. - ; Note that up to this point the code can be single-stepped if the user sets TF. - pushfq - and dword [rsp], 0x300 - popfq - - push rax - push_scratch - push_preserved - push 0 - - ; Store the stack pointer (interrupt frame pointer) in RBP for safe keeping, - ; and align the stack as specified by the SysV calling convention. - mov rbp, rsp - and rsp, ~0xf - - mov rdi, rbp - call x86_64_check_sysenter - - mov rdi, rbp - call x86_64_do_syscall - - ; Reload the stack pointer, skipping the error code. - lea rsp, [rbp + 8] - pop_preserved - pop_scratch - - ; Pop the IRET frame into the registers expected by SYSEXIT. - pop rdx ; return RIP in RDX - add rsp, 8 - popfq ; restore saved RFLAGS - pop rcx ; return RSP in RCX - - ; SAFETY: The above call to `x86_64_check_sysenter` is guarantees that we - ; execute `sysexit` with canonical addresses in RCX and RDX. Otherwise we would - ; fault in the kernel having already swapped back to the user's GS. - swapgs - - ; SYSEXIT does *not* restore IF to re-enable interrupts. - ; This is done here, rather then when restoring RFLAGS above, since STI will - ; keep interrupts inhibited until after the *following* instruction executes. - sti - o64 sysexit -.end: diff --git a/src/aero_kernel/src/arch/x86_64/task.asm b/src/aero_kernel/src/arch/x86_64/task.asm deleted file mode 100644 index 029eb3d87d3..00000000000 --- a/src/aero_kernel/src/arch/x86_64/task.asm +++ /dev/null @@ -1,95 +0,0 @@ -; Copyright (C) 2021 The Aero Project Developers. -; -; This file is part of The Aero Project. -; -; Aero is free software: you can redistribute it and/or modify -; it under the terms of the GNU General Public License as published by -; the Free Software Foundation, either version 3 of the License, or -; (at your option) any later version. -; -; Aero is distributed in the hope that it will be useful, -; but WITHOUT ANY WARRANTY; without even the implied warranty of -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -; GNU General Public License for more details. -; -; You should have received a copy of the GNU General Public License -; along with Aero. If not, see . - -bits 64 - -%include "registers.inc" - -global jump_userland_exec -global task_spinup -global iretq_init -global fork_init - -jump_userland_exec: - push rdi ; Param: stack - push rsi ; Param: RIP - push rdx ; Param: RFLAGS - - cli - - pop r11 - pop rcx - pop rsp - - swapgs - o64 sysret - -iretq_init: - cli - - ; pop the error code - add rsp, 8 - - pop_preserved - pop_scratch - - iretq - -fork_init: - cli - - ; pop the error code - add rsp, 8 - - pop_preserved - pop_scratch - - swapgs - iretq - -; extern "C" fn task_spinup(prev: &mut Context, next: &mut Context) -; -; Saves the current context into `prev` and restore the context from `next`. -task_spinup: - ; save callee-saved registers and this must match - ; the ordering of the fields in the `Context` struct. - push rbp - push rbx - push r12 - push r13 - push r14 - push r15 - - mov rax, cr3 ; save CR3 - push rax - - mov [rdi], rsp ; update old context pointer with current stack pointer - mov rsp, rsi ; switch to new stack - - pop rax ; restore CR3 - mov cr3, rax - - ; restore callee-saved registers - pop r15 - pop r14 - pop r13 - pop r12 - pop rbx - pop rbp - - ; resume the next thread - ret diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 57851514a03..8102cc1f982 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -116,6 +116,107 @@ const USERLAND_STACK_SIZE: u64 = 0x64000; const USERLAND_STACK_TOP: VirtAddr = VirtAddr::new(0x7fffffffe000); const USERLAND_STACK_BOTTOM: VirtAddr = USERLAND_STACK_TOP.const_sub_u64(USERLAND_STACK_SIZE); +core::arch::global_asm!( + " + .macro pop_preserved + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + pop rbx + .endm + + .macro pop_scratch + pop r11 + pop r10 + pop r9 + pop r8 + pop rsi + pop rdi + pop rdx + pop rcx + pop rax + .endm + " +); + +#[naked] +unsafe extern "C" fn jump_userland_exec(stack: VirtAddr, rip: VirtAddr, rflags: u64) { + asm!( + "push rdi", // stack + "push rsi", // rip + "push rdx", // rflags + "cli", + "pop r11", + "pop rcx", + "pop rsp", + "swapgs", + "sysretq", + options(noreturn) + ); +} + +#[naked] +unsafe extern "C" fn task_spinup(prev: &mut Unique, next: &Context) { + asm!( + // save callee-saved registers + "push rbp", + "push rbx", + "push r12", + "push r13", + "push r14", + "push r15", + // save CR3 + "mov rax, cr3", + "push rax", + // update old context + "mov [rdi], rsp", + // switch to new stack + "mov rsp, rsi", + // restore CR3 + "pop rax", + "mov cr3, rax", + // restore callee-saved registers + "pop r15", + "pop r14", + "pop r13", + "pop r12", + "pop rbx", + "pop rbp", + // resume the next thread + "ret", + options(noreturn) + ); +} + +#[naked] +unsafe extern "C" fn iretq_init() { + asm!( + "cli", + // pop the error code + "add rsp, 8", + "pop_preserved", + "pop_scratch", + "iretq", + options(noreturn) + ) +} + +#[naked] +unsafe extern "C" fn fork_init() { + asm!( + "cli", + // pop the error code + "add rsp, 8", + "pop_preserved", + "pop_scratch", + "swapgs", + "iretq", + options(noreturn) + ) +} + pub struct ArchTask { context: Unique, @@ -168,10 +269,6 @@ impl ArchTask { kframe.stack.iret.rsp = task_stack as u64; kframe.stack.iret.rflags = if enable_interrupts { 0x200 } else { 0x00 }; - extern "C" { - fn iretq_init(); - } - let context = unsafe { stack.offset::() }; *context = Context::default(); @@ -224,10 +321,6 @@ impl ArchTask { let context = unsafe { new_stack.offset::() }; - extern "C" { - fn fork_init(); - } - *context = Context::default(); context.rip = fork_init as _; context.cr3 = address_space.cr3().start_address().as_u64(); @@ -279,10 +372,6 @@ impl ArchTask { // Prepare the trampoline... let context = unsafe { new_stack.offset::() }; - extern "C" { - fn fork_init(); - } - *context = Context::default(); context.rip = fork_init as u64; context.cr3 = new_address_space.cr3().start_address().as_u64(); @@ -370,10 +459,6 @@ impl ArchTask { self.fpu_storage = Some(fpu_storage); - extern "C" { - fn jump_userland_exec(stack: VirtAddr, rip: VirtAddr, rflags: u64); - } - let mut stack_addr = USERLAND_STACK_TOP.as_u64(); let mut stack = StackHelper::new(&mut stack_addr); @@ -615,10 +700,6 @@ fn xrstor(fpu: &FpuState) { /// Check out the module level documentation for more information. pub fn arch_task_spinup(from: &mut ArchTask, to: &ArchTask) { - extern "C" { - fn task_spinup(from: &mut Unique, to: &Context); - } - unsafe { if let Some(fpu) = from.fpu_storage.as_mut() { xsave(fpu); diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 6255ded512f..d74ad267fb9 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -241,7 +241,7 @@ pub trait CachedAccess: BlockDeviceInterface { let page_offset = offset % Size4KiB::SIZE as usize; let size = core::cmp::min(Size4KiB::SIZE as usize - page_offset, buffer.len() - loc); - MaybeUninit::write_slice( + MaybeUninit::copy_from_slice( &mut page.data_mut()[page_offset..page_offset + size], &buffer[loc..loc + size], ); diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 5baacc6178f..a7ccae9f2fc 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -49,7 +49,8 @@ cfg_match, // https://github.com/rust-lang/rust/issues/115585 strict_provenance, associated_type_defaults, - trait_upcasting + trait_upcasting, + asm_const )] // TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? // `lang_items` => is currently used for the personality function (`rust_eh_personality`). diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 86d60ba3723..10ddda4fe5c 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -530,7 +530,7 @@ impl Task { // if executable.absolute_path_str().contains("gcc") // || executable.absolute_path_str().contains("ls") // { - // self.enable_systrace(); + self.enable_systrace(); // } *self.mem_tags.lock() = HashMap::new(); diff --git a/userland/tests/utest.cc b/userland/tests/utest.cc index 47c700cc612..2fc71f96fcc 100644 --- a/userland/tests/utest.cc +++ b/userland/tests/utest.cc @@ -2,6 +2,7 @@ // // xbstrap runtool host-gcc -- x86_64-aero-g++ ../userland/tests/test.cc -o system-root/torture +#include #include #include #include @@ -21,6 +22,14 @@ #include #include +#if defined(__aero__) +#include +#elif defined(__linux__) +#include +#else +#error "unknown platform" +#endif + #define NAMED_PATH "/tmp/sockname" #define DEFINE_TEST(s, f) static test_case test_##s{#s, f}; @@ -601,6 +610,109 @@ DEFINE_TEST(mprotect_check_whether_three_way_split_mappings_are_handled_correctl }); })) +static inline bool cpuid(uint32_t leaf, uint32_t subleaf, + uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) { + uint32_t cpuid_max; + asm volatile ("cpuid" + : "=a" (cpuid_max) + : "a" (leaf & 0x80000000) : "rbx", "rcx", "rdx"); + if (leaf > cpuid_max) + return false; + asm volatile ("cpuid" + : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) + : "a" (leaf), "c" (subleaf)); + return true; +} + +// Returns [`true`] if the `SYSENTER` and `SYSEXIT` and associated MSRs are supported. +bool has_sysenter_sysexit() { + uint32_t eax, ebx, ecx, edx; + // LEAF 1: Processor and Processor Feature Identifiers + if (!cpuid(1, 0, &eax, &ebx, &ecx, &edx)) { + return false; + } + return edx & (1 << 11); +} + +#if defined(__aero__) +DEFINE_TEST(bad_sysenter, ([] { + if (!has_sysenter_sysexit()) { + printf("test skipped... sysenter not supported\n"); + return; + } + + int pid = fork(); + + if (!pid) { + register long r11 __asm__("r11") = (size_t)0xf0f0 << 48; + register long rcx __asm__("rcx") = (size_t)0xf0f0 << 48; + + asm volatile( + "sysenter\n" + : + : "r"(r11), "r"(rcx) + ); + + __builtin_unreachable(); + } else { + int status = 0; + if (!waitpid(pid, &status, 0)) + assert(!"waitpid() failed"); + + // FIXME: should we get killed with SIGSEGV instead? + assert(WIFEXITED(status)); + } +})) +#endif + +#if defined(__aero__) +DEFINE_TEST(sysenter_system_call, ([] { + if (!has_sysenter_sysexit()) { + printf("test skipped... sysenter not supported\n"); + return; + } + + int fds[2]; + if (pipe(fds) == -1) + assert(!"pipe() failed"); + + int pid = fork(); + + if (!pid) { + close(fds[0]); + + const char *buf = "Hello, world!\n"; + size_t buf_size = strlen(buf); + + __asm__ __volatile__ ( + "mov %%rsp, %%r11\n\t" + "lea 1f(%%rip), %%rcx\n\t" + "sysenter\n\t" + "1:" + : + : "a"(uint64_t(1)), "D"(uint64_t(fds[1])), "S"(buf), "d"(buf_size + 1) + : "rcx", "r11" + ); + + exit(0); + } else { + close(fds[1]); + + int status = 0; + if (!waitpid(pid, &status, 0)) + assert(!"waitpid() failed"); + + assert(WIFEXITED(status)); + + char tmp[15]; + ssize_t n = read(fds[0], tmp, sizeof(tmp)); + + assert(n == 15); + assert(!strcmp(tmp, "Hello, world!\n")); + } +})) +#endif + std::vector &test_case_ptrs() { static std::vector singleton; return singleton; @@ -612,8 +724,10 @@ void abstract_test_case::register_case(abstract_test_case *tcp) { int main() { // Go through all tests and run them. - for(abstract_test_case *tcp : test_case_ptrs()) { - std::cout << "tests: Running " << tcp->name() << std::endl; - tcp->run(); - } + // for(abstract_test_case *tcp : test_case_ptrs()) { + // std::cout << "tests: Running " << tcp->name() << std::endl; + // tcp->run(); + // } + test_bad_sysenter.run(); + test_sysenter_system_call.run(); } From 3af6b5548200c5a63bc3b3e0c13b5a0e2e2151c0 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 24 Feb 2024 19:35:19 +1100 Subject: [PATCH 285/368] fix: update README build instructions Signed-off-by: Anhad Singh --- README.md | 86 +++++++------------------------------------------------ 1 file changed, 11 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index 2dbc173adec..0adf36cfa1e 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,8 @@ No, Aero runs its own kernel that does *not* originate from Linux and does not s # How to Build and Run Aero -Please make sure you have a **unix-like** host system before building -Aero. If you are using windows, its highly recommended to use WSL 2. +Please make sure you have a Linux host system before building +Aero. If you are using windows, use WSL 2. ## Dependencies @@ -49,27 +49,12 @@ Before building Aero, you need the following things installed: - `rust` (should be the **latest nightly**) - `nasm` - `qemu` (optional: required if you want to run it in the Qemu emulator) - -If you are building Aero with sysroot, run the following helper script to install additional dependencies. -```sh -# make sure to run the script with root privileges! -./tools/deps.sh -``` -You can optionally set the environment variable `VERBOSE` to `true`, which will pass through the output of your package manager for troubleshooting. -```sh -VERBOSE=true ./tools/deps.sh -``` - -Note: If your host operating system is not in the list below, you will need to determine the dependency packages' names for your package manager (contributions to this tool are welcome!) -- Arch Linux/based (pacman) -- Debian Linux/based (apt) -- macOS (homebrew) - +- `make` ## Hardware The following are *not* requirements but are *recommendations*: -- ~15GB of free disk space +- ~15GB of free disk space (this will vary depending on the amount of packages you want to build) - \>= 8GB RAM - \>= 2 cores - Internet access @@ -86,63 +71,14 @@ $ cd aero ## Building Aero -Aero uses a custom build system, that wraps `cargo` and takes care of building the kernel and -userland for you. It also builds the initramfs and disk image for you. - -The main command we will focus on is `./aero.py`. The source code can be found in the -root of the repository and, as the file name states, it is written in Python. - -By default if you run `./aero.py` without any arguments it will build the kernel and userland -in release mode with debug symbols and run it in QEMU. You can configure the behavior of the -build system though. If you want to, you can use the `--help` option to read a brief description -of what it can do. - -The build system acknowledges few different build modes, which cannot be used together -and they are: `--clean`, `--check`, `--test` and `--document`. - -- `--clean` option will clean all the build outputs. -- `--check` will build the kernel and userland using cargo's `check` command, - this build mode will not produce a disk image, if you want one without actually - running Aero in the emulator read ahead -- `--test` will run the built-in Aero test suite -- `--document` will generate web-based docs using cargo's `doc` command -- `--sysroot` will build the full userland sysroot. If not passed, then the sysroot will only contain -the `aero_shell` and the `init` binaries. - - **Note**: This command will require a relatively large amount of storage -space. You may want to have upwards of 10 or 15 gigabytes available if building with full sysroot. - -Each of these modes can be used with additional flags, that will alter the behavior in different -ways, some of them will not work for some of these modes - for example: the `--la57` option -will not have any effect when you are simply checking or documenting the build. - -- `--debug` toggles off the release build flag when calling cargo. - - **Summary**: If the `--debug` flag is not passed then it will build Aero in release mode - and debug symbols will be available. On the other hand, if the debug flag is passed - then it will be built in debug mode and debug symbols will be still available. By default - Aero is built in release mode (with debug symbols) since it generates faster and smaller - binaries which are easier to test. -- `--no-run` prevents from running the built disk image in the emulator -- `--bios` lets you choose the firmware the emulator will use when booting Aero, - currently supported values are: `legacy` and `uefi` -- `--features` accepts a single comma-separated list of kernel crate features, please - keep in mind that there cannot be spaces in between the values -- `--target` lets you override the target architecture for which the kernel is built, - currently the default value is `x86_64-aero_os` -- `--la57` tells the emulator to use 5 level paging, if it supports it - -The built disk image is stored in the `build` directory under the name `aero.iso`. Both the -disk root and initramfs root are preserved in case you want to inspect them manually. - -## Running Aero in an emulator - -If you haven't used the `--no-run` option and you aren't using the `--check` or `--document` build -mode, the build system will run Aero in the emulator for you. - -## Nightly Images +```shell +make distro-image +make qemu -Want to give Aero a shot, without building it! You can go to the [latest job](https://github.com/Andy-Python-Programmer/aero/actions/workflows/build.yml?query=is%3Asuccess+branch%3Amaster) and download the latest nightly image (`aero.iso`), under artifacts. +# To build documentation run the following command. The documentation will be outputed to the `target/doc` directory. +make doc +# The documentation will be available in the `target/doc` directory. +``` # Contributing From f981b2ac63288c4f5397f415db12ce1388c3c468 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 24 Feb 2024 19:44:20 +1100 Subject: [PATCH 286/368] feat(makefile): add open option for doc * add open option for doc command * document this flag in readme Signed-off-by: Anhad Singh --- Makefile | 4 +++- README.md | 8 +++++--- web/index.html | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 4881d45424c..b21ee99701d 100644 --- a/Makefile +++ b/Makefile @@ -41,6 +41,8 @@ qemu: $(KERNEL_TARGET) $(USERLAND_TARGET) .PHONY: doc doc: - rm -rf target/doc cd src && cargo doc --package aero_kernel --release --target-dir=../target/doc/ cp web/index.html target/doc/index.html +ifeq ($(open),yes) + xdg-open target/doc/index.html +endif diff --git a/README.md b/README.md index 0adf36cfa1e..1c13f332d82 100644 --- a/README.md +++ b/README.md @@ -75,9 +75,11 @@ $ cd aero make distro-image make qemu -# To build documentation run the following command. The documentation will be outputed to the `target/doc` directory. -make doc -# The documentation will be available in the `target/doc` directory. +# To build documentation run the following command. The documentation will be outputed +# to the `target/doc` directory. +# +# Optionally you can pass `open=yes` to open the documentation in the default browser. +make doc open=yes ``` # Contributing diff --git a/web/index.html b/web/index.html index 3acaa6b29e7..acc3e9a4cd5 100644 --- a/web/index.html +++ b/web/index.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 97db318a62b4e2d71225ef41a79ea3a94d062ec2 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 24 Feb 2024 19:48:11 +1100 Subject: [PATCH 287/368] fix(recipes::userland): add rust as a dep Signed-off-by: Anhad Singh --- recipes/userland | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/userland b/recipes/userland index 042300a924f..f8ad9d22568 100644 --- a/recipes/userland +++ b/recipes/userland @@ -2,7 +2,7 @@ name=userland version=0.0 revision=1 source_dir="userland" -hostdeps="gcc binutils" +hostdeps="gcc binutils rust" deps="core-libs" imagedeps="rust" allow_network=yes From dd504bac72337940e0a11987afc1b097f78db81f Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 24 Feb 2024 22:19:49 +1100 Subject: [PATCH 288/368] fix(build): pin Jinx version Signed-off-by: Anhad Singh --- Makefile | 9 +++++---- build-support/mkimage.sh | 2 +- build-support/mkiso.sh | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index b21ee99701d..86fc4651f18 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ jinx: - if [ ! -d "target/jinx" ]; then \ - git clone https://github.com/mintsuki/jinx target/jinx; \ + if [ ! -f "target/jinx" ]; then \ + curl -Lo target/jinx https://github.com/mintsuki/jinx/raw/30e7d5487bff67a66dfba332113157a08a324820/jinx; \ + chmod +x target/jinx; \ fi # FIXME: autosync @@ -9,7 +10,7 @@ jinx: .PHONY: distro distro: jinx - ./target/jinx/jinx build-all + ./target/jinx build-all SOURCE_DIR := src USERLAND_DIR := userland @@ -25,7 +26,7 @@ $(KERNEL_TARGET): $(shell find $(SOURCE_DIR) -type f -not -path '$(SOURCE_DIR)/t ./build-support/mkiso.sh $(USERLAND_TARGET): $(shell find $(USERLAND_DIR) -type f -not -path '$(USERLAND_DIR)/target/*') - ./target/jinx/jinx rebuild userland + ./target/jinx rebuild userland @$(MAKE) distro-image .PHONY: iso diff --git a/build-support/mkimage.sh b/build-support/mkimage.sh index ce7a8cbb9ce..eb6bb7b792d 100755 --- a/build-support/mkimage.sh +++ b/build-support/mkimage.sh @@ -1,6 +1,6 @@ IMAGE_PATH=target/disk.img -./target/jinx/jinx sysroot +./target/jinx sysroot rm -rf $IMAGE_PATH diff --git a/build-support/mkiso.sh b/build-support/mkiso.sh index 42b2fea86bf..7e0a6ebecf9 100755 --- a/build-support/mkiso.sh +++ b/build-support/mkiso.sh @@ -1,6 +1,6 @@ set -ex -./target/jinx/jinx host-build limine +./target/jinx host-build limine rm -rf target/iso_root mkdir -pv target/iso_root/boot From da9661ab2327250311c8cef8b65c7efcf37cf56e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 15 Mar 2024 17:53:58 +1100 Subject: [PATCH 289/368] fix(host-rust): make it build Signed-off-by: Anhad Singh --- host-recipes/rust | 10 ++++------ host-recipes/rust-libc | 3 +++ source-recipes/rust-libc | 2 +- src/aero_kernel/src/main.rs | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 host-recipes/rust-libc diff --git a/host-recipes/rust b/host-recipes/rust index 9a7a03c1350..fcd627d46e4 100644 --- a/host-recipes/rust +++ b/host-recipes/rust @@ -1,22 +1,20 @@ name=rust revision=1 from_source=rust-host -hostdeps="llvm gcc" +hostdeps="llvm gcc rust-libc" source_deps="rust-libc" imagedeps="python git wget gcc" allow_network="yes" -#unset CARGO_HOME - build() { # Rust memes. - # cp -rp "${source_dir}/." ./ + cp -rp "${source_dir}/." ./ - ./x.py build --stage 2 -j${parallelism} + CARGO_HOME=/tmp/cargo ./x.py build --stage 2 -j${parallelism} } package() { - DESTDIR="${dest_dir}" ./x.py install -j${parallelism} + CARGO_HOME=/tmp/cargo DESTDIR="${dest_dir}" ./x.py install -j${parallelism} find ${dest_dir} -name "*.old" -delete diff --git a/host-recipes/rust-libc b/host-recipes/rust-libc new file mode 100644 index 00000000000..1b29226398a --- /dev/null +++ b/host-recipes/rust-libc @@ -0,0 +1,3 @@ +name=rust-libc +from_source=rust-libc +revision=1 diff --git a/source-recipes/rust-libc b/source-recipes/rust-libc index 48458aeb56f..ce25dcda481 100644 --- a/source-recipes/rust-libc +++ b/source-recipes/rust-libc @@ -1,4 +1,4 @@ name=rust-libc version=fe4e9cda46b0be8421b0f56df0b63b8c4dcaf5e6 tarball_url="https://github.com/Andy-Python-Programmer/libc/archive/${version}.tar.gz" -tarball_blake2b="xadfdf" +tarball_blake2b="7a97d83784dfb6cdfd189d880f367facd2e06e43468248b41aa0239d3043172dfb508eca0209a7adb0ec12fda06887bfbdc37f41ebcb65b1a48967754c940b8f" diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index a7ccae9f2fc..d2ec2b07b69 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -133,7 +133,7 @@ pub fn relocate_self() { for section in kernel_elf.section_iter() { if let Ok(SectionData::Rela64(rela)) = section.get_data(kernel_elf) { for item in rela { - if !item.get_type() == STT_GNU_IFUNC { + if item.get_type() != STT_GNU_IFUNC { continue; } From a6f265e6502a7b5a4dfe330a9b514fe5faa516e5 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 16 Mar 2024 13:31:57 +1100 Subject: [PATCH 290/368] misc(kernel): bump limine crate to v2 Signed-off-by: Anhad Singh --- src/Cargo.lock | 16 ++-- src/aero_kernel/Cargo.toml | 6 +- .../x86_64/{registers.S => asm_macros.rs} | 24 +++-- src/aero_kernel/src/arch/x86_64/mod.rs | 88 +++++++------------ src/aero_kernel/src/arch/x86_64/syscall.rs | 20 ++--- src/aero_kernel/src/arch/x86_64/task.rs | 35 ++------ src/aero_kernel/src/cmdline.rs | 13 ++- src/aero_kernel/src/main.rs | 3 +- src/aero_kernel/src/mem/paging/frame.rs | 25 +++--- src/aero_kernel/src/mem/paging/mod.rs | 6 +- src/aero_kernel/src/rendy.rs | 33 ++++--- src/aero_kernel/src/userland/task/mod.rs | 2 +- 12 files changed, 121 insertions(+), 150 deletions(-) rename src/aero_kernel/src/arch/x86_64/{registers.S => asm_macros.rs} (68%) diff --git a/src/Cargo.lock b/src/Cargo.lock index 2d039f2d091..7bb3e2773e4 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -110,9 +110,9 @@ source = "git+https://github.com/aero-os/byte_endian#540be6149cd9408088a9e45be2d [[package]] name = "bytemuck" -version = "1.14.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" [[package]] name = "cc" @@ -245,8 +245,12 @@ checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "limine" -version = "0.1.12" -source = "git+https://github.com/limine-bootloader/limine-rs#fd967c9fbb8545715842594f8ce0a01113170091" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "846c87e24d089e8717a61098cba72b378e3525c46a87cf75b71352dcf668e68c" +dependencies = [ + "bitflags 2.4.2", +] [[package]] name = "log" @@ -256,9 +260,9 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "lru" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ "hashbrown", ] diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index d12e3d35e24..bc94f6272ef 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -40,9 +40,9 @@ lai = { git = "https://github.com/aero-os/lai-rs" } uapi = { path = "../uapi" } cpio_reader = { git = "https://github.com/Andy-Python-Programmer/cpio_reader" } static_assertions = "1.1.0" -lru = "0.12.1" -bytemuck = "1.14.1" -limine = { git = "https://github.com/limine-bootloader/limine-rs" } +lru = "0.12.3" +bytemuck = "1.15.0" +limine = "0.2.0" num-traits = { version = "0.2", default-features = false } vte = { version = "0.13.0", features = ["ansi"] } diff --git a/src/aero_kernel/src/arch/x86_64/registers.S b/src/aero_kernel/src/arch/x86_64/asm_macros.rs similarity index 68% rename from src/aero_kernel/src/arch/x86_64/registers.S rename to src/aero_kernel/src/arch/x86_64/asm_macros.rs index 91e38b91b15..21c986e52b5 100644 --- a/src/aero_kernel/src/arch/x86_64/registers.S +++ b/src/aero_kernel/src/arch/x86_64/asm_macros.rs @@ -1,13 +1,16 @@ -.macro pop_preserved +pub macro pop_preserved() { + " pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx -.endm + " +} -.macro pop_scratch +pub macro pop_scratch() { + " pop r11 pop r10 pop r9 @@ -17,9 +20,11 @@ pop rdx pop rcx pop rax -.endm + " +} -.macro push_scratch +pub macro push_scratch() { + " push rcx push rdx push rdi @@ -28,13 +33,16 @@ push r9 push r10 push r11 -.endm + " +} -.macro push_preserved +pub macro push_preserved() { + " push rbx push rbp push r12 push r13 push r14 push r15 -.endm + " +} diff --git a/src/aero_kernel/src/arch/x86_64/mod.rs b/src/aero_kernel/src/arch/x86_64/mod.rs index 113ba35123b..928404c15b3 100644 --- a/src/aero_kernel/src/arch/x86_64/mod.rs +++ b/src/aero_kernel/src/arch/x86_64/mod.rs @@ -30,6 +30,9 @@ pub mod time; pub mod tls; pub mod user_copy; +mod asm_macros; + +use core::cell::SyncUnsafeCell; use core::sync::atomic::Ordering; use crate::acpi::aml; @@ -42,32 +45,31 @@ use crate::{drivers, logger, rendy}; use raw_cpuid::CpuId; -use limine::*; +use limine::request::*; +use limine::smp::Cpu; + use spin::Once; use self::interrupts::INTERRUPT_CONTROLLER; -static MEMMAP: MemmapRequest = MemmapRequest::new(0); -static SMP: SmpRequest = SmpRequest::new(0); -static KERNEL_FILE: KernelFileRequest = KernelFileRequest::new(0); -static MODULES: ModuleRequest = ModuleRequest::new(0); -static FRAMEBUFFER: FramebufferRequest = FramebufferRequest::new(0); -static RSDP: RsdpRequest = RsdpRequest::new(0); -static BOOT_TIME: BootTimeRequest = BootTimeRequest::new(0); -static STACK: StackSizeRequest = StackSizeRequest::new(0).stack_size(0x1000 * 32); // 16KiB of stack for both the BSP and the APs -static HHDM: HhdmRequest = HhdmRequest::new(0); +static SMP: SyncUnsafeCell = SyncUnsafeCell::new(SmpRequest::new()); +static MEMMAP: SyncUnsafeCell = SyncUnsafeCell::new(MemoryMapRequest::new()); + +static KERNEL_FILE: KernelFileRequest = KernelFileRequest::new(); +static MODULES: ModuleRequest = ModuleRequest::new(); +static FRAMEBUFFER: FramebufferRequest = FramebufferRequest::new(); +static RSDP: RsdpRequest = RsdpRequest::new(); +static BOOT_TIME: BootTimeRequest = BootTimeRequest::new(); +static STACK: StackSizeRequest = StackSizeRequest::new().with_size(0x1000 * 32); // 16KiB of stack for both the BSP and the APs +static HHDM: HhdmRequest = HhdmRequest::new(); #[no_mangle] extern "C" fn arch_aero_main() -> ! { let kernel_file_resp = KERNEL_FILE .get_response() - .get() .expect("limine: invalid kernel file response"); - let kernel_file = kernel_file_resp - .kernel_file - .get() - .expect("limine: invalid kernel file pointer"); + let kernel_file = kernel_file_resp.file(); // Before we start the initialization process, we need to make sure // the unwind info is available; just in case if there is a kernel @@ -76,13 +78,10 @@ extern "C" fn arch_aero_main() -> ! { use crate::unwind::UnwindInfo; use xmas_elf::ElfFile; - let start = kernel_file - .base - .as_ptr() - .expect("limine: invalid kernel file base"); + let start = kernel_file.addr(); // SAFETY: The bootloader will provide a valid pointer to the kernel file. - let elf_slice = unsafe { core::slice::from_raw_parts(start, kernel_file.length as usize) }; + let elf_slice = unsafe { core::slice::from_raw_parts(start, kernel_file.size() as usize) }; let elf = ElfFile::new(elf_slice).expect("limine: invalid kernel file"); UnwindInfo::new(elf) @@ -91,22 +90,18 @@ extern "C" fn arch_aero_main() -> ! { crate::relocate_self(); unsafe { - core::ptr::read_volatile(STACK.get_response().as_ptr().unwrap()); + core::ptr::read_volatile(STACK.get_response().unwrap()); } // SAFETY: We have exclusive access to the memory map. - let memmap = MEMMAP - .get_response() - .get_mut() - .expect("limine: invalid memmap response") - .memmap_mut(); + let memmap = unsafe { &mut *MEMMAP.get() }.get_response_mut().unwrap(); unsafe { interrupts::disable_interrupts(); } unsafe { - crate::PHYSICAL_MEMORY_OFFSET = VirtAddr::new(HHDM.get_response().get().unwrap().offset); + crate::PHYSICAL_MEMORY_OFFSET = VirtAddr::new(HHDM.get_response().unwrap().offset()); } // Now that we have unwind info, we can initialize the COM ports. This @@ -120,23 +115,11 @@ extern "C" fn arch_aero_main() -> ! { let modules = MODULES .get_response() - .get() .expect("limine: invalid modules response") .modules(); - // Now, we need to parse the kernel command line so we can - // setup the debug renderer. - // - // SAFETY: The `cmdline` is a valid, aligned, and NULL terminated string. - let command_line = kernel_file - .cmdline - .to_str() - .expect("limine: bad command line"); - - let command_line = cmdline::parse( - command_line.to_str().expect("cmdline: invalid utf8"), - modules, - ); + let command_line = core::str::from_utf8(kernel_file.cmdline()).unwrap(); + let command_line = cmdline::parse(command_line, modules); paging::init(memmap).unwrap(); log::info!("loaded paging"); @@ -145,17 +128,17 @@ extern "C" fn arch_aero_main() -> ! { log::info!("loaded heap"); // SMP initialization. - let smp_response = SMP.get_response().get_mut().unwrap(); - let bsp_lapic_id = smp_response.bsp_lapic_id; + let smp_response = unsafe { &mut *SMP.get() }.get_response_mut().unwrap(); + let bsp_lapic_id = smp_response.bsp_lapic_id(); - for cpu in smp_response.cpus().iter_mut() { + for cpu in smp_response.cpus_mut() { apic::CPU_COUNT.fetch_add(1, Ordering::SeqCst); if cpu.lapic_id == bsp_lapic_id { continue; } - cpu.goto_address = x86_64_aero_ap_main; + cpu.goto_address.write(x86_64_aero_ap_main); } gdt::init_boot(); @@ -165,10 +148,9 @@ extern "C" fn arch_aero_main() -> ! { let framebuffer = FRAMEBUFFER .get_response() - .get() .expect("limine: invalid framebuffer response") .framebuffers() - .first() + .next() .expect("limine: no framebuffer found!"); rendy::init(framebuffer, &command_line); @@ -180,7 +162,7 @@ extern "C" fn arch_aero_main() -> ! { apic::init(); log::info!("loaded APIC"); - let rsdp = VirtAddr::new(RSDP.get_response().get().unwrap().address.as_ptr().unwrap() as u64); + let rsdp = VirtAddr::new(RSDP.get_response().unwrap().address().addr() as u64); acpi::init(rsdp); log::info!("loaded ACPI"); @@ -196,18 +178,16 @@ extern "C" fn arch_aero_main() -> ! { syscall::init(); - let boot_time = BOOT_TIME.get_response().get().unwrap(); - time::EPOCH.store(boot_time.boot_time as _, Ordering::SeqCst); + let boot_time = BOOT_TIME.get_response().unwrap(); + time::EPOCH.store(boot_time.boot_time().as_secs() as usize, Ordering::SeqCst); // Architecture init is done. Now we can initialize and start the init // process in the non-architecture specific part of the kernel. crate::aero_main(); } -#[no_mangle] -extern "C" fn x86_64_aero_ap_main(boot_info: *const SmpInfo) -> ! { - let boot_info = unsafe { &*boot_info }; - let ap_id = boot_info.processor_id as usize; +extern "C" fn x86_64_aero_ap_main(cpu: &Cpu) -> ! { + let ap_id = cpu.id as usize; log::debug!("booting CPU {}", ap_id); diff --git a/src/aero_kernel/src/arch/x86_64/syscall.rs b/src/aero_kernel/src/arch/x86_64/syscall.rs index e0e672d8764..433ce0ef505 100644 --- a/src/aero_kernel/src/arch/x86_64/syscall.rs +++ b/src/aero_kernel/src/arch/x86_64/syscall.rs @@ -7,7 +7,7 @@ use crate::userland::scheduler::{self, ExitStatus}; use crate::utils::sync::IrqGuard; use super::interrupts::InterruptErrorStack; -use super::io; +use super::{asm_macros, io}; use core::mem::offset_of; @@ -16,8 +16,6 @@ const ARCH_SET_FS: usize = 0x1002; const ARCH_GET_FS: usize = 0x1003; const ARCH_GET_GS: usize = 0x1004; -core::arch::global_asm!(include_str!("./registers.S")); - /// 64-bit SYSCALL instruction entry point. /// /// The instruction supports to to 6 arguments in registers. @@ -56,8 +54,8 @@ unsafe extern "C" fn x86_64_syscall_handler() { "push rcx", "push rax", - "push_scratch", - "push_preserved", + asm_macros::push_scratch!(), + asm_macros::push_preserved!(), // push a fake error code to match with the layout of `InterruptErrorStack` "push 0", @@ -71,8 +69,8 @@ unsafe extern "C" fn x86_64_syscall_handler() { // pop the fake error code "add rsp, 8", - "pop_preserved", - "pop_scratch", + asm_macros::pop_preserved!(), + asm_macros::pop_scratch!(), // cook the sysret frame "pop rcx", @@ -123,8 +121,8 @@ unsafe extern "C" fn x86_64_sysenter_handler() { "and dword ptr [rsp], 0x300", "popfq", "push rax", - "push_scratch", - "push_preserved", + asm_macros::push_scratch!(), + asm_macros::push_preserved!(), "push 0", // Store the stack pointer (interrupt frame ptr) in `RBP` for safe keeping, and align the // stack as specified by the SysV calling convention. @@ -136,8 +134,8 @@ unsafe extern "C" fn x86_64_sysenter_handler() { "call {x86_64_do_syscall}", // Reload the stack pointer, skipping the error code. "lea rsp, [rbp + 8]", - "pop_preserved", - "pop_scratch", + asm_macros::pop_preserved!(), + asm_macros::pop_scratch!(), // Pop the `IRET` frame into the registers expected by `SYSEXIT`. "pop rdx", // return `RIP` in `RDX` "add rsp, 8", diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 8102cc1f982..94f91bd9ae1 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -49,7 +49,7 @@ use crate::syscall::ExecArgs; use crate::userland::vm::Vm; use crate::utils::StackHelper; -use super::{controlregs, io}; +use super::{asm_macros, controlregs, io}; use crate::mem::AddressSpace; @@ -116,31 +116,6 @@ const USERLAND_STACK_SIZE: u64 = 0x64000; const USERLAND_STACK_TOP: VirtAddr = VirtAddr::new(0x7fffffffe000); const USERLAND_STACK_BOTTOM: VirtAddr = USERLAND_STACK_TOP.const_sub_u64(USERLAND_STACK_SIZE); -core::arch::global_asm!( - " - .macro pop_preserved - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - .endm - - .macro pop_scratch - pop r11 - pop r10 - pop r9 - pop r8 - pop rsi - pop rdi - pop rdx - pop rcx - pop rax - .endm - " -); - #[naked] unsafe extern "C" fn jump_userland_exec(stack: VirtAddr, rip: VirtAddr, rflags: u64) { asm!( @@ -196,8 +171,8 @@ unsafe extern "C" fn iretq_init() { "cli", // pop the error code "add rsp, 8", - "pop_preserved", - "pop_scratch", + asm_macros::pop_preserved!(), + asm_macros::pop_scratch!(), "iretq", options(noreturn) ) @@ -209,8 +184,8 @@ unsafe extern "C" fn fork_init() { "cli", // pop the error code "add rsp, 8", - "pop_preserved", - "pop_scratch", + asm_macros::pop_preserved!(), + asm_macros::pop_scratch!(), "swapgs", "iretq", options(noreturn) diff --git a/src/aero_kernel/src/cmdline.rs b/src/aero_kernel/src/cmdline.rs index b64e1ad5648..cbcc33ef639 100644 --- a/src/aero_kernel/src/cmdline.rs +++ b/src/aero_kernel/src/cmdline.rs @@ -17,9 +17,10 @@ use core::num::ParseIntError; -use limine::NonNullPtr; use spin::Once; +use limine::file::File; + use crate::rendy; static RAW_CMDLINE_STR: Once<&'static str> = Once::new(); @@ -44,16 +45,14 @@ impl CommandLine { } } -fn resolve_module(modules: &[NonNullPtr], name: &str) -> &'static [u8] { +fn resolve_module(modules: &[&File], name: &str) -> &'static [u8] { modules .iter() .find(|m| { - let n = m.cmdline.to_str().unwrap().to_str().unwrap(); + let n = core::str::from_utf8(m.cmdline()).unwrap(); n == name }) - .map(|m| unsafe { - core::slice::from_raw_parts(m.base.as_ptr().unwrap(), m.length as usize) - }) + .map(|m| unsafe { core::slice::from_raw_parts(m.addr(), m.size() as usize) }) .expect("resolve_module: invalid operand") } @@ -72,7 +71,7 @@ fn parse_number(mut string: &str) -> Result { } } -pub fn parse(cmdline: &'static str, modules: &[NonNullPtr]) -> CommandLine { +pub fn parse(cmdline: &'static str, modules: &[&File]) -> CommandLine { RAW_CMDLINE_STR.call_once(|| cmdline); // Chew up the leading spaces. diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index d2ec2b07b69..c91fa84262a 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -50,7 +50,8 @@ strict_provenance, associated_type_defaults, trait_upcasting, - asm_const + asm_const, + sync_unsafe_cell )] // TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? // `lang_items` => is currently used for the personality function (`rust_eh_personality`). diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 8333f2a6a7a..6a310d4e4dc 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -20,7 +20,8 @@ use core::ptr::NonNull; use core::sync::atomic::{AtomicUsize, Ordering}; use alloc::vec::Vec; -use limine::{MemmapEntry, MemoryMapEntryType, NonNullPtr}; + +use limine::memory_map; use spin::Once; use super::mapper::*; @@ -72,7 +73,7 @@ impl LockedFrameAllocator { } /// Initializes the inner locked global frame allocator. - pub(super) fn init(&self, memory_map: &mut [NonNullPtr]) { + pub(super) fn init(&self, memory_map: &mut limine::response::MemoryMapResponse) { self.0 .call_once(|| Mutex::new(GlobalFrameAllocator::new(memory_map))); } @@ -134,7 +135,7 @@ unsafe impl FrameAllocator for LockedFrameAllocator { } struct RangeMemoryIter<'a> { - iter: core::slice::Iter<'a, NonNullPtr>, + iter: core::slice::Iter<'a, &'a memory_map::Entry>, cursor_base: PhysAddr, cursor_end: PhysAddr, @@ -150,12 +151,12 @@ impl<'a> Iterator for RangeMemoryIter<'a> { // the memory map and set the cursor to the start of it. let next = self.iter.next()?; - if next.typ == MemoryMapEntryType::Usable { + if next.entry_type == memory_map::EntryType::USABLE { break Some(next); } } { self.cursor_base = PhysAddr::new(entry.base).align_up(Size4KiB::SIZE); - self.cursor_end = PhysAddr::new(entry.base + entry.len); + self.cursor_end = PhysAddr::new(entry.base + entry.length); } else { // We reached the end of the memory map. return None; @@ -295,7 +296,9 @@ pub struct GlobalFrameAllocator { } impl GlobalFrameAllocator { - fn new(memory_map: &mut [NonNullPtr]) -> Self { + fn new(memory_map_resp: &mut limine::response::MemoryMapResponse) -> Self { + let memory_map = memory_map_resp.entries_mut(); + // Find a memory map entry that is big enough to fit all of the items in // range memory iter. let requested_size = (core::mem::size_of::() * memory_map.len()) as u64; @@ -305,16 +308,16 @@ impl GlobalFrameAllocator { let entry = &mut memory_map[i]; // Make sure that the memory map entry is marked as usable. - if entry.typ != MemoryMapEntryType::Usable { + if entry.entry_type != memory_map::EntryType::USABLE { continue; } // Found a big enough memory map entry. - if entry.len >= requested_size { + if entry.length >= requested_size { let base = entry.base; entry.base += requested_size; - entry.len -= requested_size; + entry.length -= requested_size; region = Some(PhysAddr::new(base)); @@ -322,7 +325,7 @@ impl GlobalFrameAllocator { } } - let mut iter = memory_map.iter(); + let mut iter = memory_map_resp.entries().iter(); let cursor = iter .next() @@ -341,7 +344,7 @@ impl GlobalFrameAllocator { iter, cursor_base: PhysAddr::new(cursor.base), - cursor_end: PhysAddr::new(cursor.base + cursor.len), + cursor_end: PhysAddr::new(cursor.base + cursor.length), }; // Lets goo! Now lets initialize the bootstrap allocator so we can initialize diff --git a/src/aero_kernel/src/mem/paging/mod.rs b/src/aero_kernel/src/mem/paging/mod.rs index cffac2f2894..f04e7f4021e 100644 --- a/src/aero_kernel/src/mem/paging/mod.rs +++ b/src/aero_kernel/src/mem/paging/mod.rs @@ -27,8 +27,6 @@ pub use self::mapper::*; pub use self::page::*; pub use self::page_table::*; -use limine::{MemmapEntry, NonNullPtr}; - pub use frame::LockedFrameAllocator; use crate::PHYSICAL_MEMORY_OFFSET; @@ -77,12 +75,12 @@ pub const fn level_5_paging_enabled() -> bool { /// Initialize paging. pub fn init( - memory_regions: &mut [NonNullPtr], + mmap_resp: &mut limine::response::MemoryMapResponse, ) -> Result, MapToError> { let active_level_4 = unsafe { active_level_4_table() }; let offset_table = unsafe { OffsetPageTable::new(active_level_4, PHYSICAL_MEMORY_OFFSET) }; - FRAME_ALLOCATOR.init(memory_regions); + FRAME_ALLOCATOR.init(mmap_resp); Ok(offset_table) } diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 027e70fa391..32829b49df2 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -23,7 +23,7 @@ use core::{fmt, u8}; use alloc::boxed::Box; -use limine::Framebuffer; +use limine::framebuffer::Framebuffer; use spin::Once; use vte::ansi::{Handler, NamedColor, Timeout}; @@ -1027,28 +1027,33 @@ pub unsafe fn force_unlock() { } } -pub fn init(framebuffer_tag: &Framebuffer, cmdline: &CommandLine) { +pub fn init(fb_info: Framebuffer, cmdline: &CommandLine) { + let stride = fb_info.pitch() as usize; + let height = fb_info.height() as usize; + let bits_per_pixel = fb_info.bpp() as usize; + let byte_len = stride * height * (bits_per_pixel / 8); + let framebuffer_info = RendyInfo { - byte_len: framebuffer_tag.size(), - bits_per_pixel: framebuffer_tag.bpp as usize, - horizontal_resolution: framebuffer_tag.width as usize, - vertical_resolution: framebuffer_tag.height as usize, + byte_len, + bits_per_pixel, + horizontal_resolution: fb_info.width() as usize, + vertical_resolution: height, pixel_format: PixelFormat::BGR, - stride: framebuffer_tag.pitch as usize, + stride, - red_mask_shift: framebuffer_tag.red_mask_shift, - red_mask_size: framebuffer_tag.red_mask_size, + red_mask_shift: fb_info.red_mask_shift(), + red_mask_size: fb_info.red_mask_size(), - green_mask_shift: framebuffer_tag.green_mask_shift, - green_mask_size: framebuffer_tag.green_mask_size, + green_mask_shift: fb_info.green_mask_shift(), + green_mask_size: fb_info.green_mask_size(), - blue_mask_shift: framebuffer_tag.blue_mask_shift, - blue_mask_size: framebuffer_tag.blue_mask_size, + blue_mask_shift: fb_info.blue_mask_shift(), + blue_mask_size: fb_info.blue_mask_size(), }; let framebuffer = unsafe { core::slice::from_raw_parts_mut::( - framebuffer_tag.address.as_ptr().unwrap().cast::(), + fb_info.addr().cast::(), framebuffer_info.byte_len, ) }; diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 10ddda4fe5c..86d60ba3723 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -530,7 +530,7 @@ impl Task { // if executable.absolute_path_str().contains("gcc") // || executable.absolute_path_str().contains("ls") // { - self.enable_systrace(); + // self.enable_systrace(); // } *self.mem_tags.lock() = HashMap::new(); From 2bfe5ad67f183261801c8bbdec18787986f63d37 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 16 Mar 2024 14:12:14 +1100 Subject: [PATCH 291/368] fix(kernel): fix warnings about any intermediate references created Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/cpu_local.rs | 14 ++++------ src/aero_kernel/src/arch/x86_64/gdt.rs | 3 ++- .../src/arch/x86_64/interrupts/idt.rs | 3 ++- src/aero_kernel/src/modules.rs | 27 +++++++++---------- src/aero_kernel/src/utils/mod.rs | 14 ++++++++-- 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/cpu_local.rs b/src/aero_kernel/src/arch/x86_64/cpu_local.rs index 9e0a911ce0e..245921105a9 100644 --- a/src/aero_kernel/src/arch/x86_64/cpu_local.rs +++ b/src/aero_kernel/src/arch/x86_64/cpu_local.rs @@ -18,16 +18,11 @@ use core::alloc::Layout; use core::ops::{Deref, DerefMut}; +use crate::extern_sym; use crate::mem::paging::VirtAddr; -use crate::utils::LinkerSymbol; use super::io; -extern "C" { - static __cpu_local_start: LinkerSymbol; - static __cpu_local_end: LinkerSymbol; -} - #[repr(C)] pub struct CpuLocal(T); @@ -49,7 +44,7 @@ impl CpuLocal { } let self_addr = VirtAddr::new(self as *const _ as u64); - let section_addr = VirtAddr::new(unsafe { &__cpu_local_start as *const _ as u64 }); + let section_addr = VirtAddr::new(extern_sym!(__cpu_local_start) as u64); let offset = self_addr - section_addr; VirtAddr::new(val) + offset @@ -81,9 +76,10 @@ static SELF_PTR: u64 = 0; static mut CPUID: usize = 0; pub fn init(cpu_id: usize) { + let start = VirtAddr::new(extern_sym!(__cpu_local_start).addr() as u64); + let end = VirtAddr::new(extern_sym!(__cpu_local_end).addr() as u64); + unsafe { - let start = VirtAddr::new(&__cpu_local_start as *const _ as u64); - let end = VirtAddr::new(&__cpu_local_end as *const _ as u64); let size = end - start; let layout = Layout::from_size_align_unchecked(size as _, 64); diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index dd3c197f8f8..e8dd2e467f8 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -26,6 +26,7 @@ use core::alloc::Layout; use core::mem; +use core::ptr::addr_of; use alloc::alloc::alloc_zeroed; @@ -302,7 +303,7 @@ pub fn init_boot() { unsafe { let gdt_descriptor = GdtDescriptor::new( (mem::size_of::<[GdtEntry; BOOT_GDT_ENTRY_COUNT]>() - 1) as u16, - (&BOOT_GDT as *const _) as u64, + addr_of!(BOOT_GDT).addr() as u64, ); load_gdt(&gdt_descriptor); diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs index 3399dac4f5d..457569238fb 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs @@ -24,6 +24,7 @@ const IDT_ENTRIES: usize = 256; pub(super) static mut IDT: [IdtEntry; IDT_ENTRIES] = [IdtEntry::NULL; IDT_ENTRIES]; use core::mem::size_of; +use core::ptr::addr_of; use crate::arch::gdt::SegmentSelector; use crate::utils::sync::Mutex; @@ -216,7 +217,7 @@ pub fn init() { unsafe { let idt_descriptor = IdtDescriptor::new( ((IDT.len() * size_of::()) - 1) as u16, - (&IDT as *const _) as u64, + addr_of!(IDT).addr() as u64, ); load_idt(&idt_descriptor); diff --git a/src/aero_kernel/src/modules.rs b/src/aero_kernel/src/modules.rs index 40686669825..8f809a01021 100644 --- a/src/aero_kernel/src/modules.rs +++ b/src/aero_kernel/src/modules.rs @@ -29,20 +29,22 @@ //! aero_kernel::module_exit!(hello_exit); //! ``` -use crate::{drivers, fs}; +use core::mem::size_of; + +use crate::{drivers, extern_sym, fs}; /// Inner helper function to make sure the function provided to the [module_init] macro /// has a valid function signature. This function returns the passed module init function as /// a const void pointer. -#[derive(Debug, PartialEq, PartialOrd, Eq, Ord)] +#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord)] #[repr(C)] pub enum ModuleType { Block = 0, Other = 1, } -#[derive(Debug)] +#[derive(Debug, Clone)] #[repr(C)] pub struct Module { pub init: *const (), @@ -69,20 +71,15 @@ macro_rules! module_init { /// we cannot read the ext2 root filesystem, we link all of the kernel modules into the kernel /// itself (this is temporary and modules will be loaded from the filesystem in the future). pub(crate) fn init() { - extern "C" { - static mut __kernel_modules_start: u8; - static mut __kernel_modules_end: u8; - } + let modules_start = extern_sym!(__kernel_modules_start).cast::(); + let modules_end = extern_sym!(__kernel_modules_end).cast::(); - unsafe { - let size = &__kernel_modules_end as *const u8 as usize - - &__kernel_modules_start as *const u8 as usize; - - let modules = core::slice::from_raw_parts_mut( - &mut __kernel_modules_start as *mut u8 as *mut Module, - size / core::mem::size_of::(), - ); + let size = (modules_end.addr() - modules_start.addr()) / size_of::(); + let modules = unsafe { core::slice::from_raw_parts(modules_start, size) }; + unsafe { + // TODO: refactor this out + let mut modules = modules.to_vec(); modules.sort_by(|e, a| e.ty.cmp(&a.ty)); let mut launched_fs = false; diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index d2cabaa058b..9281e7eaceb 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -223,5 +223,15 @@ impl<'a> StackHelper<'a> { } } -#[repr(transparent)] -pub struct LinkerSymbol(core::cell::UnsafeCell); +#[macro_export] +macro_rules! extern_sym { + ($sym:ident) => {{ + extern "C" { + static $sym: ::core::ffi::c_void; + } + + // SAFETY: The value is not accessed, we only take its address. The `addr_of!()` ensures + // that no intermediate references is created. + unsafe { ::core::ptr::addr_of!($sym) } + }}; +} From 27d18d618750fb0933a9bf721e0ec0ecc12c5e26 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 16 Mar 2024 14:36:12 +1100 Subject: [PATCH 292/368] misc(kernel): cleanup Signed-off-by: Anhad Singh --- .vscode/settings.json | 2 +- src/aero_kernel/src/arch/x86_64/gdt.rs | 2 +- src/aero_kernel/src/arch/x86_64/task.rs | 4 +-- src/aero_kernel/src/arch/x86_64/tls.rs | 2 +- src/aero_kernel/src/main.rs | 2 +- src/aero_kernel/src/mem/paging/frame.rs | 32 ++++++++---------------- src/aero_kernel/src/mem/paging/mapper.rs | 13 ++++------ src/aero_kernel/src/rendy.rs | 4 ++- src/aero_kernel/src/userland/vm.rs | 8 +++--- src/aero_kernel/src/utils/mod.rs | 2 +- 10 files changed, 29 insertions(+), 42 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 8cbe5c341c6..887a54e7cd9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,5 +16,5 @@ "termios.h": "c", "termios-c_iflag.h": "c" }, - // "rust-analyzer.check.command": "clippy", + "rust-analyzer.check.command": "clippy", } \ No newline at end of file diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index e8dd2e467f8..e3a1a5968dd 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -337,7 +337,7 @@ pub fn init() { let gdt_size = gdt_ent_size * GDT_ENTRY_COUNT; let layout = Layout::from_size_align_unchecked(gdt_size, gdt_ent_align); - let ptr = alloc_zeroed(layout) as *mut GdtEntry; + let ptr = alloc_zeroed(layout).cast::(); core::slice::from_raw_parts_mut::(ptr, GDT_ENTRY_COUNT) }; diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 94f91bd9ae1..6e269809608 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -661,7 +661,7 @@ fn xsave(fpu: &mut FpuState) { use core::arch::x86_64::_fxsave64; - unsafe { _fxsave64(fpu as *mut FpuState as *mut _) } + unsafe { _fxsave64((fpu as *mut FpuState).cast()) } } fn xrstor(fpu: &FpuState) { @@ -670,7 +670,7 @@ fn xrstor(fpu: &FpuState) { // options(nomem, nostack)); } use core::arch::x86_64::_fxrstor64; - unsafe { _fxrstor64(fpu as *const FpuState as *const _) } + unsafe { _fxrstor64((fpu as *const FpuState).cast()) } } /// Check out the module level documentation for more information. diff --git a/src/aero_kernel/src/arch/x86_64/tls.rs b/src/aero_kernel/src/arch/x86_64/tls.rs index f202b64aa83..d9bf49d81cf 100644 --- a/src/aero_kernel/src/arch/x86_64/tls.rs +++ b/src/aero_kernel/src/arch/x86_64/tls.rs @@ -119,7 +119,7 @@ pub fn init() { .map(|(name, _)| name) .collect::>() }) - .unwrap_or(Vec::new()); + .unwrap_or_default(); CPU_INFO.lock().push(CpuInfo { cpuid: 0, diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index c91fa84262a..54a6d418e72 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -63,7 +63,7 @@ #![no_std] #![no_main] #![reexport_test_harness_main = "test_main"] -// #![warn(clippy::pedantic)] +#![deny(clippy::ptr_as_ptr)] #[macro_use] extern crate aero_proc; diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 6a310d4e4dc..8cf3d583cbf 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -299,31 +299,19 @@ impl GlobalFrameAllocator { fn new(memory_map_resp: &mut limine::response::MemoryMapResponse) -> Self { let memory_map = memory_map_resp.entries_mut(); - // Find a memory map entry that is big enough to fit all of the items in - // range memory iter. let requested_size = (core::mem::size_of::() * memory_map.len()) as u64; - let mut region = None; - for i in 0..memory_map.len() { - let entry = &mut memory_map[i]; - - // Make sure that the memory map entry is marked as usable. - if entry.entry_type != memory_map::EntryType::USABLE { - continue; - } - - // Found a big enough memory map entry. - if entry.length >= requested_size { - let base = entry.base; - - entry.base += requested_size; - entry.length -= requested_size; + let entry = memory_map + .iter_mut() + .find(|entry| { + entry.entry_type == memory_map::EntryType::USABLE && entry.length >= requested_size + }) + .expect("OOM"); - region = Some(PhysAddr::new(base)); + let region = PhysAddr::new(entry.base); - break; - } - } + entry.base += requested_size; + entry.length -= requested_size; let mut iter = memory_map_resp.entries().iter(); @@ -332,7 +320,7 @@ impl GlobalFrameAllocator { .expect("stivale2: unexpected end of the memory map"); let ranges = unsafe { - let virt_addr = region.expect("stivale2: out of memory").as_hhdm_virt(); + let virt_addr = region.as_hhdm_virt(); core::slice::from_raw_parts_mut::( virt_addr.as_mut_ptr(), diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index 2efa178dd3d..2f3caaaba01 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -676,17 +676,14 @@ impl<'a, P: PageTableFrameMapping> Mapper for MappedPageTable<'a, P> { page: Page, flags: PageTableFlags, ) -> Result, FlagUpdateError> { - let p4; - - if self.level_5_paging_enabled { + let p4 = if self.level_5_paging_enabled { let p5 = &mut self.page_table; - p4 = self - .page_table_walker - .next_table_mut(&mut p5[page.p5_index()])?; + self.page_table_walker + .next_table_mut(&mut p5[page.p5_index()])? } else { - p4 = &mut self.page_table; - } + &mut self.page_table + }; let p3 = self .page_table_walker diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 32829b49df2..659dec79dda 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -371,7 +371,9 @@ impl<'a> Inner<'a> { for x in xstart..xend { let img_pixel = unsafe { - (image.image.as_ptr()).add(fixedp6_to_int(img_x) * col_size + off) as *const u32 + (image.image.as_ptr()) + .add(fixedp6_to_int(img_x) * col_size + off) + .cast::() }; let i = blender(x, y, unsafe { *img_pixel }); diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index d3936622d24..32d4e8ca459 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -65,7 +65,7 @@ fn parse_elf_header<'header>(file: DirCacheItem) -> Result, ElfL .read_at(0, pt1_hdr_slice) .map_err(ElfLoadError::IOError)?; - let pt1_header: &'header _ = unsafe { &*(pt1_hdr_slice.as_ptr() as *const HeaderPt1) }; + let pt1_header: &'header _ = unsafe { &*pt1_hdr_slice.as_ptr().cast::() }; // 2. Ensure that the header has the correct magic number: if pt1_header.magic != ELF_HEADER_MAGIC { @@ -82,7 +82,7 @@ fn parse_elf_header<'header>(file: DirCacheItem) -> Result, ElfL .map_err(ElfLoadError::IOError)?; let pt2_header_ptr = pt2_hdr_slice.as_ptr(); - let pt2_header: &'header _ = unsafe { &*(pt2_header_ptr as *const HeaderPt2_) }; + let pt2_header: &'header _ = unsafe { &*pt2_header_ptr.cast::>() }; Ok(HeaderPt2::Header64(pt2_header)) } @@ -130,13 +130,13 @@ fn parse_program_header<'pheader>( match header.pt1.class() { // 3. Cast and return the 64-bit program header: Class::SixtyFour => { - let phdr: &'pheader _ = unsafe { &*(phdr_ptr as *const ProgramHeader64) }; + let phdr: &'pheader _ = unsafe { &*phdr_ptr.cast::() }; Ok(ProgramHeader::Ph64(phdr)) } // 3. Cast and return the 32-bit program header: Class::ThirtyTwo => { - let phdr: &'pheader _ = unsafe { &*(phdr_ptr as *const ProgramHeader32) }; + let phdr: &'pheader _ = unsafe { &*phdr_ptr.cast::() }; Ok(ProgramHeader::Ph32(phdr)) } diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index 9281e7eaceb..7d143b05b7d 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -132,7 +132,7 @@ impl PerCpu { let cpu_count = get_cpu_count(); let size = mem::size_of::() * cpu_count; - let raw = unsafe { alloc_zeroed(Layout::from_size_align_unchecked(size, 8)) as *mut T }; + let raw = unsafe { alloc_zeroed(Layout::from_size_align_unchecked(size, 8)).cast::() }; unsafe { for i in 0..cpu_count { From 2b3de08c7cd9843531dfe61fb883ca52854be908 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 16 Mar 2024 17:16:53 +1100 Subject: [PATCH 293/368] misc(kernel): bump `bitflags` to 2.4.2 Signed-off-by: Anhad Singh --- src/Cargo.lock | 2 +- src/aero_kernel/Cargo.toml | 2 +- .../src/arch/x86_64/controlregs.rs | 1 + src/aero_kernel/src/arch/x86_64/gdt.rs | 139 ++++++++++++------ .../src/arch/x86_64/interrupts/idt.rs | 109 ++++++++------ src/aero_kernel/src/arch/x86_64/syscall.rs | 8 +- src/aero_kernel/src/drivers/block/ahci.rs | 16 +- .../src/drivers/block/ide/channel.rs | 2 +- src/aero_kernel/src/drivers/block/nvme/mod.rs | 1 + src/aero_kernel/src/drivers/e1000.rs | 14 +- src/aero_kernel/src/drivers/mouse.rs | 2 +- src/aero_kernel/src/drivers/uart_16550.rs | 1 + src/aero_kernel/src/mem/paging/mod.rs | 1 + src/aero_kernel/src/mem/paging/page_table.rs | 1 + 14 files changed, 192 insertions(+), 107 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index 7bb3e2773e4..7245802877d 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -9,7 +9,7 @@ dependencies = [ "aero_proc", "aero_syscall", "bit_field", - "bitflags 1.3.2", + "bitflags 2.4.2", "byte_endian", "bytemuck", "cpio_reader", diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index bc94f6272ef..9f3499b9593 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -26,7 +26,7 @@ spin = { version = "0.9.8", default-features = false, features = [ "rwlock", "once", ] } -bitflags = "1.2.1" +bitflags = "2.4.2" bit_field = "0.10.2" log = "0.4.20" xmas-elf = "0.9.1" diff --git a/src/aero_kernel/src/arch/x86_64/controlregs.rs b/src/aero_kernel/src/arch/x86_64/controlregs.rs index 93516f60a22..13edf5a06ed 100644 --- a/src/aero_kernel/src/arch/x86_64/controlregs.rs +++ b/src/aero_kernel/src/arch/x86_64/controlregs.rs @@ -184,6 +184,7 @@ bitflags::bitflags! { } bitflags::bitflags! { + #[derive(Debug)] pub struct MxCsr: u32 { const INVALID_OPERATION = 1 << 0; const DENORMAL = 1 << 1; diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index e3a1a5968dd..35e10f37e9e 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -30,32 +30,24 @@ use core::ptr::addr_of; use alloc::alloc::alloc_zeroed; -bitflags::bitflags! { - /// Specifies which element to load into a segment from - /// descriptor tables (i.e., is a index to LDT or GDT table - /// with some additional flags). - pub struct SegmentSelector: u16 { - const RPL_0 = 0b00; - const RPL_1 = 0b01; - const RPL_2 = 0b10; - const RPL_3 = 0b11; - const TI_GDT = 0 << 2; - const TI_LDT = 1 << 2; - } -} - bitflags::bitflags! { struct GdtEntryFlags: u8 { - const NULL = 0; const PROTECTED_MODE = 1 << 6; const LONG_MODE = 1 << 5; } } -#[derive(Debug, Clone, Copy, PartialEq)] -pub enum Ring { - Ring0 = 0b00, - Ring3 = 0b11, +#[derive(Debug, Copy, Clone, PartialEq)] +#[repr(u8)] +pub enum PrivilegeLevel { + Ring0 = 0, + Ring3 = 3, +} + +impl PrivilegeLevel { + pub fn is_user(&self) -> bool { + matches!(self, Self::Ring3) + } } const BOOT_GDT_ENTRY_COUNT: usize = 4; @@ -155,7 +147,7 @@ static GDT: [GdtEntry; GDT_ENTRY_COUNT] = [ // GDT TSS descriptor. GdtEntry::new( GdtAccessFlags::PRESENT | GdtAccessFlags::RING_3 | GdtAccessFlags::TSS_AVAIL, - GdtEntryFlags::NULL, + GdtEntryFlags::empty(), ), // GDT null descriptor as the TSS should be 16 bytes long // and twice the normal size. @@ -175,10 +167,10 @@ impl GdtAccessFlags { const TSS_AVAIL: u8 = 9; } -pub struct GdtEntryType; +pub struct GdtEntryIndex; #[rustfmt::skip] -impl GdtEntryType { +impl GdtEntryIndex { pub const KERNEL_CODE: u16 = 1; pub const KERNEL_DATA: u16 = 2; pub const KERNEL_TLS: u16 = 3; @@ -188,10 +180,32 @@ impl GdtEntryType { pub const TSS_HI: u16 = 9; } +#[derive(Debug, Copy, Clone)] +#[repr(transparent)] +pub struct SegmentSelector(u16); + impl SegmentSelector { - const fn new(index: u16, rpl: Ring) -> Self { - Self { - bits: index << 3 | (rpl as u16), + pub const fn empty() -> Self { + Self(0) + } + + pub const fn new(index: u16, privilege_level: PrivilegeLevel) -> Self { + Self(index << 3 | (privilege_level as u16)) + } + + pub const fn bits(&self) -> u16 { + self.0 + } + + pub const fn from_bits(value: u16) -> Self { + Self(value) + } + + pub const fn privilege_level(&self) -> PrivilegeLevel { + match self.bits() & 0b11 { + 0 => PrivilegeLevel::Ring0, + 3 => PrivilegeLevel::Ring3, + _ => unreachable!(), } } } @@ -230,7 +244,7 @@ pub(super) struct GdtEntry { } impl GdtEntry { - const NULL: Self = Self::new(GdtAccessFlags::NULL, GdtEntryFlags::NULL); + const NULL: Self = Self::new(GdtAccessFlags::NULL, GdtEntryFlags::empty()); const fn new(access_flags: u8, entry_flags: GdtEntryFlags) -> Self { Self { @@ -311,19 +325,45 @@ pub fn init_boot() { // Load the GDT segments. unsafe { - load_cs(SegmentSelector::new(GdtEntryType::KERNEL_CODE, Ring::Ring0)); - load_ds(SegmentSelector::new(GdtEntryType::KERNEL_DATA, Ring::Ring0)); - load_es(SegmentSelector::new(GdtEntryType::KERNEL_DATA, Ring::Ring0)); - load_fs(SegmentSelector::new(GdtEntryType::KERNEL_DATA, Ring::Ring0)); - load_gs(SegmentSelector::new(GdtEntryType::KERNEL_TLS, Ring::Ring0)); - load_ss(SegmentSelector::new(GdtEntryType::KERNEL_DATA, Ring::Ring0)); + load_cs(SegmentSelector::new( + GdtEntryIndex::KERNEL_CODE, + PrivilegeLevel::Ring0, + )); + + load_ds(SegmentSelector::new( + GdtEntryIndex::KERNEL_DATA, + PrivilegeLevel::Ring0, + )); + + load_es(SegmentSelector::new( + GdtEntryIndex::KERNEL_DATA, + PrivilegeLevel::Ring0, + )); + + load_fs(SegmentSelector::new( + GdtEntryIndex::KERNEL_DATA, + PrivilegeLevel::Ring0, + )); + + load_gs(SegmentSelector::new( + GdtEntryIndex::KERNEL_TLS, + PrivilegeLevel::Ring0, + )); + + load_ss(SegmentSelector::new( + GdtEntryIndex::KERNEL_DATA, + PrivilegeLevel::Ring0, + )); } } static STK: [u8; 4096 * 16] = [0; 4096 * 16]; -pub const USER_SS: SegmentSelector = SegmentSelector::new(GdtEntryType::USER_DATA, Ring::Ring3); -pub const USER_CS: SegmentSelector = SegmentSelector::new(GdtEntryType::USER_CODE, Ring::Ring3); +pub const USER_SS: SegmentSelector = + SegmentSelector::new(GdtEntryIndex::USER_DATA, PrivilegeLevel::Ring3); + +pub const USER_CS: SegmentSelector = + SegmentSelector::new(GdtEntryIndex::USER_CODE, PrivilegeLevel::Ring3); /// Initialize the *actual* GDT stored in TLS. /// @@ -347,9 +387,9 @@ pub fn init() { unsafe { let tss_ptr = TSS.addr().as_mut_ptr::(); - gdt[GdtEntryType::TSS as usize].set_offset(tss_ptr as u32); - gdt[GdtEntryType::TSS as usize].set_limit(mem::size_of::() as u32); - gdt[GdtEntryType::TSS_HI as usize].set_raw((tss_ptr as u64) >> 32); + gdt[GdtEntryIndex::TSS as usize].set_offset(tss_ptr as u32); + gdt[GdtEntryIndex::TSS as usize].set_limit(mem::size_of::() as u32); + gdt[GdtEntryIndex::TSS_HI as usize].set_raw((tss_ptr as u64) >> 32); TSS.rsp[0] = STK.as_ptr().offset(4096 * 16) as u64; @@ -361,13 +401,28 @@ pub fn init() { load_gdt(&gdt_descriptor); // Reload the GDT segments. - load_cs(SegmentSelector::new(GdtEntryType::KERNEL_CODE, Ring::Ring0)); - load_ds(SegmentSelector::new(GdtEntryType::KERNEL_DATA, Ring::Ring0)); - load_es(SegmentSelector::new(GdtEntryType::KERNEL_DATA, Ring::Ring0)); - load_ss(SegmentSelector::new(GdtEntryType::KERNEL_DATA, Ring::Ring0)); + load_cs(SegmentSelector::new( + GdtEntryIndex::KERNEL_CODE, + PrivilegeLevel::Ring0, + )); + load_ds(SegmentSelector::new( + GdtEntryIndex::KERNEL_DATA, + PrivilegeLevel::Ring0, + )); + load_es(SegmentSelector::new( + GdtEntryIndex::KERNEL_DATA, + PrivilegeLevel::Ring0, + )); + load_ss(SegmentSelector::new( + GdtEntryIndex::KERNEL_DATA, + PrivilegeLevel::Ring0, + )); // Load the Task State Segment. - load_tss(SegmentSelector::new(GdtEntryType::TSS, Ring::Ring0)); + load_tss(SegmentSelector::new( + GdtEntryIndex::TSS, + PrivilegeLevel::Ring0, + )); } // // Now we update the per-cpu storage to store a reference diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs index 457569238fb..57319b4a1d7 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs +++ b/src/aero_kernel/src/arch/x86_64/interrupts/idt.rs @@ -21,26 +21,15 @@ const IDT_ENTRIES: usize = 256; -pub(super) static mut IDT: [IdtEntry; IDT_ENTRIES] = [IdtEntry::NULL; IDT_ENTRIES]; +pub(super) static mut IDT: [IdtEntry; IDT_ENTRIES] = [IdtEntry::EMPTY; IDT_ENTRIES]; use core::mem::size_of; use core::ptr::addr_of; -use crate::arch::gdt::SegmentSelector; -use crate::utils::sync::Mutex; +use bit_field::BitField; -bitflags::bitflags! { - pub struct IDTFlags: u8 { - const PRESENT = 1 << 7; - const RING_0 = 0 << 5; - const RING_1 = 1 << 5; - const RING_2 = 2 << 5; - const RING_3 = 3 << 5; - const SS = 1 << 4; - const INTERRUPT = 0xE; - const TRAP = 0xF; - } -} +use crate::arch::gdt::{GdtEntryIndex, PrivilegeLevel, SegmentSelector}; +use crate::utils::sync::Mutex; #[repr(C, packed)] struct IdtDescriptor { @@ -56,47 +45,72 @@ impl IdtDescriptor { } } +#[derive(Debug, Copy, Clone)] +#[repr(C)] +struct EntryOptions { + cs: SegmentSelector, + bits: u16, +} + +impl EntryOptions { + #[inline] + const fn default() -> Self { + Self { + cs: SegmentSelector::empty(), + // bits 11:8 specify the gate-descriptor type, default to 64-bit interrupt gate (0xe). + bits: 0b1110_0000_0000, + } + } + + #[inline] + fn set_privilege_level(&mut self, dpl: PrivilegeLevel) { + self.bits.set_bits(13..15, dpl as u16); + } + + #[inline] + fn set_code_segment(&mut self, cs: SegmentSelector) { + self.cs = cs; + } + + #[inline] + fn set_present(&mut self, present: bool) { + self.bits.set_bit(15, present); + } +} + #[derive(Copy, Clone)] -#[repr(C, packed)] +#[repr(C)] pub(super) struct IdtEntry { - offset_low: u16, - selector: u16, - ist: u8, - type_attr: u8, - offset_middle: u16, - offset_hi: u32, + ptr_low: u16, + options: EntryOptions, + ptr_middle: u16, + ptr_high: u32, ignore: u32, } impl IdtEntry { - /// IDT entry with all values defaulted to 0, ie `null`. - const NULL: Self = Self { - offset_low: 0x00, - selector: 0x00, - ist: 0x00, - type_attr: 0x00, - offset_middle: 0x00, - offset_hi: 0x00, - ignore: 0x00, + const EMPTY: Self = Self { + ptr_low: 0, + options: EntryOptions::default(), + ptr_middle: 0, + ptr_high: 0, + ignore: 0, }; - /// Set the IDT entry flags. - fn set_flags(&mut self, flags: IDTFlags) { - self.type_attr = flags.bits; - } + pub(crate) fn set_function(&mut self, ptr: *const u8) { + self.options.set_privilege_level(PrivilegeLevel::Ring0); + self.options.set_code_segment(SegmentSelector::new( + GdtEntryIndex::KERNEL_CODE, + PrivilegeLevel::Ring0, + )); - /// Set the IDT entry offset. - fn set_offset(&mut self, selector: u16, base: usize) { - self.selector = selector; - self.offset_low = base as u16; - self.offset_middle = (base >> 16) as u16; - self.offset_hi = (base >> 32) as u32; - } + let addr = ptr.addr(); + + self.ptr_low = addr as u16; + self.ptr_middle = (addr >> 16) as u16; + self.ptr_high = (addr >> 32) as u32; - /// Set the handler function of the IDT entry. - pub(crate) fn set_function(&mut self, handler: *const u8) { - self.set_flags(IDTFlags::PRESENT | IDTFlags::RING_0 | IDTFlags::INTERRUPT); - self.set_offset(8, handler as usize); + self.options.set_present(true); } } @@ -137,7 +151,8 @@ pub struct IretRegisters { impl IretRegisters { pub fn is_user(&self) -> bool { - SegmentSelector::from_bits_truncate(self.cs as u16).contains(SegmentSelector::RPL_3) + let selector = SegmentSelector::from_bits(self.cs as u16); + selector.privilege_level().is_user() } } diff --git a/src/aero_kernel/src/arch/x86_64/syscall.rs b/src/aero_kernel/src/arch/x86_64/syscall.rs index 433ce0ef505..e8ed006ac7c 100644 --- a/src/aero_kernel/src/arch/x86_64/syscall.rs +++ b/src/aero_kernel/src/arch/x86_64/syscall.rs @@ -1,7 +1,7 @@ use aero_syscall::SyscallError; use raw_cpuid::CpuId; -use crate::arch::gdt::{GdtEntryType, Tss, USER_CS, USER_SS}; +use crate::arch::gdt::{GdtEntryIndex, Tss, USER_CS, USER_SS}; use crate::mem::paging::VirtAddr; use crate::userland::scheduler::{self, ExitStatus}; use crate::utils::sync::IrqGuard; @@ -267,8 +267,8 @@ pub(super) fn init() { unsafe { // Enable support for `syscall` and `sysret` instructions if the current // CPU supports them and the target pointer width is 64. - let syscall_base = GdtEntryType::KERNEL_CODE << 3; - let sysret_base = (GdtEntryType::KERNEL_TLS << 3) | 3; + let syscall_base = GdtEntryIndex::KERNEL_CODE << 3; + let sysret_base = (GdtEntryIndex::KERNEL_TLS << 3) | 3; let star_hi = syscall_base as u32 | ((sysret_base as u32) << 16); @@ -298,7 +298,7 @@ pub(super) fn init() { unsafe { io::wrmsr( io::IA32_SYSENTER_CS, - (GdtEntryType::KERNEL_CODE << 3) as u64, + (GdtEntryIndex::KERNEL_CODE << 3) as u64, ); io::wrmsr(io::IA32_SYSENTER_EIP, x86_64_sysenter_handler as u64); } diff --git a/src/aero_kernel/src/drivers/block/ahci.rs b/src/aero_kernel/src/drivers/block/ahci.rs index dab2c669946..02b05f04345 100644 --- a/src/aero_kernel/src/drivers/block/ahci.rs +++ b/src/aero_kernel/src/drivers/block/ahci.rs @@ -91,6 +91,7 @@ bitflags::bitflags! { } bitflags::bitflags! { + #[derive(Debug, Copy, Clone)] struct HbaHostCont: u32 { const HR = 1 << 0; // HBA Reset const IE = 1 << 1; // Interrupt Enable @@ -100,6 +101,7 @@ bitflags::bitflags! { } bitflags::bitflags! { + #[derive(Debug, Copy, Clone)] struct HbaPortIS: u32 { const DHRS = 1 << 0; // Device to Host Register FIS Interrupt const PSS = 1 << 1; // PIO Setup FIS Interrupt @@ -122,6 +124,7 @@ bitflags::bitflags! { } bitflags::bitflags! { + #[derive(Debug, Copy, Clone)] struct HbaPortIE: u32 { const DHRE = 1 << 0; // Device to Host Register FIS Interrupt const PSE = 1 << 1; // PIO Setup FIS Interrupt @@ -144,6 +147,7 @@ bitflags::bitflags! { } bitflags::bitflags! { + #[derive(Debug, Copy, Clone)] struct HbaPortCmd: u32 { const ST = 1 << 0; // Start const SUD = 1 << 1; // Spin-Up Device @@ -168,8 +172,12 @@ bitflags::bitflags! { } } +#[derive(Debug, Copy, Clone)] +#[repr(transparent)] +struct HbaCmdHeaderFlags(u16); + bitflags::bitflags! { - struct HbaCmdHeaderFlags: u16 { + impl HbaCmdHeaderFlags: u16 { const A = 1 << 5; // ATAPI const W = 1 << 6; // Write const P = 1 << 7; // Prefetchable @@ -180,11 +188,11 @@ bitflags::bitflags! { } impl HbaCmdHeaderFlags { - /// Sets the length of the command FIS. The HBA uses this field to know the - /// length of the FIS it shall send to the device. + /// Sets the length of the command FIS. The HBA uses this field to know the length of the FIS it + /// shall send to the device. #[inline] fn set_command_fis_size(&mut self, size: usize) { - self.bits.set_bits(0..=4, size as _); + self.0.set_bits(0..=4, size as _); } } diff --git a/src/aero_kernel/src/drivers/block/ide/channel.rs b/src/aero_kernel/src/drivers/block/ide/channel.rs index a64340807c3..420a2c45a8a 100644 --- a/src/aero_kernel/src/drivers/block/ide/channel.rs +++ b/src/aero_kernel/src/drivers/block/ide/channel.rs @@ -126,7 +126,7 @@ impl IdeChannelData { let status = self.base.status(); - if status == BaseStatusReg::empty() { + if status.is_empty() { return false; } diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index e60e438b8b1..01959e339d7 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -63,6 +63,7 @@ impl Version { } bitflags::bitflags! { + #[derive(Debug)] struct CommandSetsSupported: u8 { /// Controller supports the NVM command set. const NVM = 1 << 0; diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index 7fc30e2cc6d..fd9b6ff80be 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -123,8 +123,10 @@ bitflags::bitflags! { } } +struct TCtl(u32); + bitflags::bitflags! { - struct TCtl: u32 { + impl TCtl: u32 { const EN = 1 << 1; // Transmit Enable const PSP = 1 << 3; // Pad Short Packets const SWXOFF = 1 << 22; // Software XOFF Transmission @@ -136,13 +138,13 @@ impl TCtl { /// Sets the number of attempts at retransmission prior to giving /// up on the packet (not including the first transmission attempt). fn set_collision_threshold(&mut self, value: u8) { - self.bits |= (value as u32) << 4; + self.0 |= (value as u32) << 4; } /// Sets the minimum number of byte times which must elapse for /// proper CSMA/CD operation. fn set_collision_distance(&mut self, value: u8) { - self.bits |= (value as u32) << 12; + self.0 |= (value as u32) << 12; } } @@ -158,7 +160,7 @@ bitflags::bitflags! { const RDMTS_HALF = 0 << 8; // Free Buffer Threshold is 1/2 of RDLEN const RDMTS_QUARTER = 1 << 8; // Free Buffer Threshold is 1/4 of RDLEN const RDMTS_EIGHTH = 2 << 8; // Free Buffer Threshold is 1/8 of RDLEN - const MO_36 = 0 << 12; // Multicast Offset - bits 47:36 + // const MO_36 = 0 << 12; // Multicast Offset - bits 47:36 const MO_35 = 1 << 12; // Multicast Offset - bits 46:35 const MO_34 = 2 << 12; // Multicast Offset - bits 45:34 const MO_32 = 3 << 12; // Multicast Offset - bits 43:32 @@ -174,7 +176,7 @@ bitflags::bitflags! { const BSIZE_256 = 3 << 16; const BSIZE_512 = 2 << 16; const BSIZE_1024 = 1 << 16; - const BSIZE_2048 = 0 << 16; + // const BSIZE_2048 = 0 << 16; const BSIZE_4096 = (3 << 16) | (1 << 25); const BSIZE_8192 = (2 << 16) | (1 << 25); const BSIZE_16384 = (1 << 16) | (1 << 25); @@ -466,7 +468,7 @@ impl E1000 { self.write(Register::TxDescHead, 0); self.write(Register::TxDescTail, 0); - let mut flags = TCtl { bits: 1 << 28 } | TCtl::EN | TCtl::PSP | TCtl::RTLC; + let mut flags = TCtl(1 << 28) | TCtl::EN | TCtl::PSP | TCtl::RTLC; flags.set_collision_distance(64); flags.set_collision_threshold(15); diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs index 17c47f4f19d..bde3783c788 100644 --- a/src/aero_kernel/src/drivers/mouse.rs +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -27,7 +27,7 @@ use crate::utils::sync::{Mutex, WaitQueue}; bitflags::bitflags! { /// Represents the flags currently set for the mouse. - #[derive(Default)] + #[derive(Default, Debug, Copy, Clone)] pub struct MouseFlags: u8 { const LEFT_BUTTON = 0b0000_0001; const RIGHT_BUTTON = 0b0000_0010; diff --git a/src/aero_kernel/src/drivers/uart_16550.rs b/src/aero_kernel/src/drivers/uart_16550.rs index bcbed46d368..d644a7a1aa6 100644 --- a/src/aero_kernel/src/drivers/uart_16550.rs +++ b/src/aero_kernel/src/drivers/uart_16550.rs @@ -35,6 +35,7 @@ bitflags::bitflags! { } bitflags::bitflags! { + #[derive(Debug, Copy, Clone)] pub struct LineStatus: u8 { const INPUT_FULL = 1; const OUTPUT_EMPTY = 1 << 5; diff --git a/src/aero_kernel/src/mem/paging/mod.rs b/src/aero_kernel/src/mem/paging/mod.rs index f04e7f4021e..7ed5a571793 100644 --- a/src/aero_kernel/src/mem/paging/mod.rs +++ b/src/aero_kernel/src/mem/paging/mod.rs @@ -35,6 +35,7 @@ pub static FRAME_ALLOCATOR: LockedFrameAllocator = LockedFrameAllocator::new_uni bitflags::bitflags! { /// Describes an page fault error code. + #[derive(Debug, Copy, Clone)] #[repr(transparent)] pub struct PageFaultErrorCode: u64 { /// If this flag is set, the page fault was caused by a page-protection violation, diff --git a/src/aero_kernel/src/mem/paging/page_table.rs b/src/aero_kernel/src/mem/paging/page_table.rs index 5698a7c6d7a..90a3af6de88 100644 --- a/src/aero_kernel/src/mem/paging/page_table.rs +++ b/src/aero_kernel/src/mem/paging/page_table.rs @@ -182,6 +182,7 @@ impl fmt::Debug for PageTableEntry { bitflags! { /// Possible flags for a page table entry. + #[derive(Debug, Copy, Clone)] pub struct PageTableFlags: u64 { /// Specifies whether the mapped frame or page table is loaded in memory. const PRESENT = 1; From 028732cb2c8586e48bf378520b3ae82d98fd18e2 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 16 Mar 2024 19:36:00 +1100 Subject: [PATCH 294/368] misc(kernel): bump log Signed-off-by: Anhad Singh --- improving-build-times.txt | 5 ++++ src/Cargo.lock | 61 ++++++++++++++++---------------------- src/aero_kernel/Cargo.toml | 2 +- 3 files changed, 32 insertions(+), 36 deletions(-) diff --git a/improving-build-times.txt b/improving-build-times.txt index 856726f3ede..6b611793f40 100644 --- a/improving-build-times.txt +++ b/improving-build-times.txt @@ -1,2 +1,7 @@ total_build: 28.36s rebuild: 8.27s + +16/3/2024 +--------- +total_build: 27.29s +rebuild: 9.50s diff --git a/src/Cargo.lock b/src/Cargo.lock index 7245802877d..4c373e1600e 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -57,9 +57,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "once_cell", @@ -116,12 +116,9 @@ checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -190,9 +187,9 @@ checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "hashbrown" @@ -237,12 +234,6 @@ dependencies = [ "spin 0.5.2", ] -[[package]] -name = "libc" -version = "0.2.152" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" - [[package]] name = "limine" version = "0.2.0" @@ -254,9 +245,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lru" @@ -298,9 +289,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -337,9 +328,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -364,9 +355,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" dependencies = [ "either", "rayon-core", @@ -390,35 +381,35 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -456,9 +447,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -543,5 +534,5 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index 9f3499b9593..720e47c8360 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -28,7 +28,7 @@ spin = { version = "0.9.8", default-features = false, features = [ ] } bitflags = "2.4.2" bit_field = "0.10.2" -log = "0.4.20" +log = "0.4.21" xmas-elf = "0.9.1" hashbrown = "0.14.3" rustc-demangle = "0.1.23" From 0ca27da527fdd26ceeed7b9c8e079fce1f1e328f Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 28 Mar 2024 17:24:50 +1100 Subject: [PATCH 295/368] fix(host-rust): make it build Signed-off-by: Anhad Singh --- build-support/rust/host-config.toml | 2 ++ host-recipes/rust | 6 ++++-- source-recipes/rust-libc | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 build-support/rust/host-config.toml diff --git a/build-support/rust/host-config.toml b/build-support/rust/host-config.toml new file mode 100644 index 00000000000..2ab356d1e3e --- /dev/null +++ b/build-support/rust/host-config.toml @@ -0,0 +1,2 @@ +[patch.crates-io] +libc = { path = "/base_dir/sources/rust-libc" } diff --git a/host-recipes/rust b/host-recipes/rust index fcd627d46e4..f81ef8402f5 100644 --- a/host-recipes/rust +++ b/host-recipes/rust @@ -7,10 +7,12 @@ imagedeps="python git wget gcc" allow_network="yes" build() { - # Rust memes. + echo "Patching out rust memes..." cp -rp "${source_dir}/." ./ - CARGO_HOME=/tmp/cargo ./x.py build --stage 2 -j${parallelism} + mkdir /tmp/cargo + cp ${base_dir}/build-support/rust/host-config.toml /tmp/cargo/config.toml + CARGO_HOME=/tmp/cargo ./x.py build --stage 2 -j${parallelism} --verbose } package() { diff --git a/source-recipes/rust-libc b/source-recipes/rust-libc index ce25dcda481..f07f1d4cdef 100644 --- a/source-recipes/rust-libc +++ b/source-recipes/rust-libc @@ -1,4 +1,4 @@ name=rust-libc -version=fe4e9cda46b0be8421b0f56df0b63b8c4dcaf5e6 +version=cf112e9aab32267f6f92c519cb3ebe59f754059d tarball_url="https://github.com/Andy-Python-Programmer/libc/archive/${version}.tar.gz" -tarball_blake2b="7a97d83784dfb6cdfd189d880f367facd2e06e43468248b41aa0239d3043172dfb508eca0209a7adb0ec12fda06887bfbdc37f41ebcb65b1a48967754c940b8f" +tarball_blake2b="74427da3af0c4c7fcd7b178d8084556e4a8e5f7707918d96612d05e3713255da4cc2a55626eacf31a7b7400deedb0df9433ca563bcac1714accfa37f55ed2bc0" From 93a215b71dc2a580f804a67ec913508ab728cb2b Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 29 Mar 2024 15:24:03 +1100 Subject: [PATCH 296/368] feat(ports): add python Signed-off-by: Anhad Singh --- Makefile | 4 + .../python/python-config-site | 0 patches/python/jinx-working-patch.patch | 54 ++++++ recipes/python | 46 +++++ src/aero_kernel/src/arch/x86_64/task.rs | 3 - src/aero_kernel/src/arch/x86_64/time.rs | 2 +- src/aero_kernel/src/drivers/mouse.rs | 2 +- src/aero_kernel/src/fs/devfs.rs | 2 +- src/aero_kernel/src/fs/eventfd.rs | 4 +- src/aero_kernel/src/fs/ext2/mod.rs | 3 +- src/aero_kernel/src/fs/file_table.rs | 2 +- src/aero_kernel/src/fs/inode.rs | 3 +- src/aero_kernel/src/fs/mod.rs | 90 +++------- src/aero_kernel/src/fs/path.rs | 162 ++++++++++++++++++ src/aero_kernel/src/fs/procfs.rs | 24 +-- src/aero_kernel/src/fs/ramfs.rs | 2 +- src/aero_kernel/src/main.rs | 3 +- src/aero_kernel/src/mem/paging/mod.rs | 2 - src/aero_kernel/src/syscall/fs.rs | 32 +++- src/aero_kernel/src/syscall/mod.rs | 9 +- src/aero_kernel/src/syscall/net.rs | 3 +- src/aero_kernel/src/userland/signals.rs | 5 +- src/aero_kernel/src/userland/task/mod.rs | 3 +- 23 files changed, 354 insertions(+), 106 deletions(-) rename {extra-files => build-support}/python/python-config-site (100%) create mode 100644 patches/python/jinx-working-patch.patch create mode 100644 recipes/python create mode 100644 src/aero_kernel/src/fs/path.rs diff --git a/Makefile b/Makefile index 86fc4651f18..f31c027278c 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,10 @@ KERNEL_TARGET := src/target/x86_64-unknown-none/release/aero_kernel clean: rm -rf src/target +.PHONY: check +check: + cd src && cargo check + $(KERNEL_TARGET): $(shell find $(SOURCE_DIR) -type f -not -path '$(SOURCE_DIR)/target/*') cd src && cargo build --package aero_kernel --release ./build-support/mkiso.sh diff --git a/extra-files/python/python-config-site b/build-support/python/python-config-site similarity index 100% rename from extra-files/python/python-config-site rename to build-support/python/python-config-site diff --git a/patches/python/jinx-working-patch.patch b/patches/python/jinx-working-patch.patch new file mode 100644 index 00000000000..b26ff6d122b --- /dev/null +++ b/patches/python/jinx-working-patch.patch @@ -0,0 +1,54 @@ +diff --git python-clean/configure.ac python-workdir/configure.ac +index cd69f0e..74fc416 100644 +--- python-clean/configure.ac ++++ python-workdir/configure.ac +@@ -553,6 +553,9 @@ then + *-*-cygwin*) + ac_sys_system=Cygwin + ;; ++ *-*-aero*) ++ ac_sys_system=Aero ++ ;; + *-*-vxworks*) + ac_sys_system=VxWorks + ;; +@@ -619,6 +622,9 @@ if test "$cross_compiling" = yes; then + *-*-vxworks*) + _host_cpu=$host_cpu + ;; ++ *-*-aero*) ++ _host_cpu=$host_cpu ++ ;; + wasm32-*-* | wasm64-*-*) + _host_cpu=$host_cpu + ;; +@@ -3216,6 +3222,9 @@ then + CYGWIN*) + LDSHARED="gcc -shared -Wl,--enable-auto-image-base" + LDCXXSHARED="g++ -shared -Wl,--enable-auto-image-base";; ++ Aero*) ++ LDSHARED='$(CC) -shared' ++ LDCXXSHARED='$(CXX) - shared';; + *) LDSHARED="ld";; + esac + fi +@@ -3268,7 +3277,9 @@ then + else CCSHARED="-Kpic -belf" + fi;; + VxWorks*) +- CCSHARED="-fpic -D__SO_PICABILINUX__ -ftls-model=global-dynamic" ++ CCSHARED="-fpic -D__SO_PICABILINUX__ -ftls-model=global-dynamic";; ++ Aero*) ++ CCSHARED="-fPIC";; + esac + fi + AC_MSG_RESULT([$CCSHARED]) +@@ -3338,6 +3349,8 @@ then + LINKFORSHARED='-Wl,-E -N 2048K';; + VxWorks*) + LINKFORSHARED='-Wl,-export-dynamic';; ++ Aero*) ++ LINKFORSHARED='-export-dynamic';; + esac + fi + AC_MSG_RESULT([$LINKFORSHARED]) diff --git a/recipes/python b/recipes/python new file mode 100644 index 00000000000..e3dae6b0974 --- /dev/null +++ b/recipes/python @@ -0,0 +1,46 @@ +name=python +version=3.13.0 +tarball_url="https://www.python.org/ftp/python/${version}/Python-${version}a1.tar.xz" +tarball_blake2b="62612d22ce652f4b1d7ce93aa30bd5814dbf271dbe98e321b99d003d7da8f74798e55f556db75fc39b676295c1d1f7b31919c444fe3c667d2fbd2ea16799a211" +source_deps="autoconf-archive" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libexpat" + +regenerate() { + autotools_recursive_regen +} + +build() { + mkdir -p ./build + cd ./build + + # XXX make this a host dep + if ! [ -f built ]; then + ${source_dir}/configure + + make -j${parallelism} + touch built + fi + + cd - + + CONFIG_SITE=${base_dir}/build-support/python/python-config-site autotools_configure \ + --with-system-ffi \ + --with-system-expat \ + --disable-ipv6 \ + --without-ensurepip \ + --host=x86_64-aero \ + --build=x86_64-linux-gnu \ + --with-build-python="$(pwd -P)/build/python" \ + --with-pkg-config=yes + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + ln -sv python3 "${dest_dir}${prefix}/bin/python" + post_package_strip +} + diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 6e269809608..6d4d6f5960d 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -33,17 +33,14 @@ use alloc::alloc::alloc_zeroed; use aero_syscall::{MMapFlags, MMapProt}; -use alloc::boxed::Box; use alloc::vec::Vec; use raw_cpuid::CpuId; use core::alloc::Layout; use core::ptr::Unique; -use crate::arch::controlregs::MxCsr; use crate::arch::interrupts::InterruptErrorStack; use crate::fs::cache::DirCacheItem; -use crate::mem::alloc_boxed_buffer; use crate::mem::paging::*; use crate::syscall::ExecArgs; use crate::userland::vm::Vm; diff --git a/src/aero_kernel/src/arch/x86_64/time.rs b/src/aero_kernel/src/arch/x86_64/time.rs index b783ec7c465..4c5e5e82baf 100644 --- a/src/aero_kernel/src/arch/x86_64/time.rs +++ b/src/aero_kernel/src/arch/x86_64/time.rs @@ -109,7 +109,7 @@ fn pit_irq_handler(_stack: &mut InterruptStack) { if value % PIT_FREQUENCY_HZ == 0 { UPTIME_SEC.fetch_add(1, Ordering::Relaxed); // Increment uptime seconds - crate::syscall::check_timers(); + crate::syscall::time::check_timers(); } } diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs index bde3783c788..d761366881f 100644 --- a/src/aero_kernel/src/drivers/mouse.rs +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -147,7 +147,7 @@ impl INodeInterface for Mouse { assert_eq!(buffer.len(), size); unsafe { - *(buffer.as_mut_ptr() as *mut Packet) = packet; + *(buffer.as_mut_ptr().cast::()) = packet; } Ok(size) diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index 819c17d212d..d59c6dd3581 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -310,7 +310,7 @@ impl INodeInterface for DevFb { count = buffer.len() - ((offset + buffer.len()) - fb.len()); } - let raw = buffer.as_ptr() as *const u32; + let raw = buffer.as_ptr().cast::(); let src = unsafe { core::slice::from_raw_parts(raw, count) }; fb[offset..offset + count].copy_from_slice(src); diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index d7b257bcafb..a919f6d5c6f 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -60,7 +60,7 @@ impl INodeInterface for EventFd { // SAFETY: We have above verified that it is safe to dereference // the value. - let value = unsafe { &mut *(buffer.as_mut_ptr() as *mut u64) }; + let value = unsafe { &mut *(buffer.as_mut_ptr().cast::()) }; let mut count = self.wq.block_on(&self.count, |e| **e != 0)?; *value = *count; @@ -75,7 +75,7 @@ impl INodeInterface for EventFd { assert!(buffer.len() >= chunk_size); // TODO: use bytemuck to remove the unsafe. - let target = unsafe { *(buffer.as_ptr() as *const u64) }; + let target = unsafe { *(buffer.as_ptr().cast::()) }; if target == u64::MAX { return Err(FileSystemError::NotSupported); diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 78dbb06e434..4653ebfc6a2 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -40,6 +40,7 @@ use self::group_desc::GroupDescriptors; use super::block::{self, BlockDevice, CachedAccess}; use super::cache::{DirCacheItem, INodeCacheItem}; +use super::path::PathBuf; use super::{cache, FileSystemError}; use super::inode::{DirEntry, INodeInterface, Metadata, PollFlags, PollTable}; @@ -518,7 +519,7 @@ impl INodeInterface for INode { self.make_inode(name, FileType::Socket, Some(inode)) } - fn resolve_link(&self) -> super::Result { + fn resolve_link(&self) -> super::Result { if !self.metadata()?.is_symlink() { return Err(FileSystemError::NotSupported); } diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index 01448efa18f..c7e01b89e24 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -172,7 +172,7 @@ impl FileHandle { let file_type = entry.inode().metadata()?.file_type(); let file_type: aero_syscall::SysFileType = file_type.into(); - let sysd = unsafe { &mut *(buffer.as_mut_ptr() as *mut SysDirEntry) }; + let sysd = unsafe { &mut *(buffer.as_mut_ptr().cast::()) }; sysd.inode = entry.inode().metadata()?.id(); sysd.offset = reclen; diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 4cf721ceb8d..98a0a86898b 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -36,6 +36,7 @@ use crate::utils::sync::{BMutex, Mutex, WaitQueue}; use super::cache::{Cacheable, CachedINode, DirCacheItem, INodeCacheItem}; use super::devfs::DevINode; use super::file_table::FileHandle; +use super::path::PathBuf; use super::{cache, FileSystem, FileSystemError, Result}; static DIR_CACHE_MARKER: AtomicUsize = AtomicUsize::new(0x00); @@ -120,7 +121,7 @@ pub trait INodeInterface: Send + Sync { /// ## Errors /// - `FileSystemError::NotSupported` - If the inode is not a symbolic link or the filesystem /// does not support symbolic links. - fn resolve_link(&self) -> Result { + fn resolve_link(&self) -> Result { Err(FileSystemError::NotSupported) } diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index c0e64579de8..4cb64f4c8c1 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -17,6 +17,11 @@ use core::mem; +pub mod path; + +// TODO: Do not re-export this. +pub use path::Path; + use aero_syscall::SyscallError; use alloc::collections::BTreeMap; use alloc::sync::Arc; @@ -80,8 +85,8 @@ impl MountManager { let current_data = directory.data.lock(); let mut root_data = root_dir.data.lock(); - root_data.name = current_data.name.clone(); - root_data.parent = current_data.parent.clone(); + root_data.name.clone_from(¤t_data.name); + root_data.parent.clone_from(¤t_data.parent); mem::drop(root_data); mem::drop(current_data); @@ -157,53 +162,6 @@ impl From for SyscallError { } } -/// A slice of a path (akin to [str]). -#[derive(Debug)] -pub struct Path(str); - -impl Path { - pub fn new(path: &str) -> &Self { - unsafe { &*(path as *const str as *const Path) } - } - - #[inline] - pub fn is_empty(&self) -> bool { - self.0.is_empty() - } - - /// Returns [`true`] if the path is absolute. - pub fn is_absolute(&self) -> bool { - self.0.starts_with('/') - } - - /// Returns an iterator over the components of the path. - pub fn components(&self) -> impl Iterator { - self.0.split('/').filter(|e| !e.is_empty() && *e != ".") - } - - pub fn as_str(&self) -> &str { - &self.0 - } - - /// Helper function that returns the parent path and the base name - /// of the path. - pub fn parent_and_basename(&self) -> (&Self, &str) { - if let Some(slash_index) = self.0.rfind('/') { - let parent_dir = if slash_index == 0 { - Path::new("/") - } else { - Path::new(&self.0[..slash_index]) - }; - - let basename = &self.0[(slash_index + 1)..]; - (parent_dir, basename) - } else { - // A relative path without any slashes. - (Path::new(""), &self.0) - } - } -} - #[derive(Debug, Copy, Clone, PartialEq)] pub enum LookupMode { None, @@ -215,7 +173,10 @@ pub fn lookup_path_with( mut cwd: DirCacheItem, path: &Path, mode: LookupMode, + resolve_last: bool, ) -> Result { + let components_len = path.components().count(); + // Iterate and resolve each component. For example `a`, `b`, and `c` in `a/b/c`. for (i, component) in path.components().enumerate() { match component { @@ -249,7 +210,7 @@ pub fn lookup_path_with( if err == FileSystemError::EntryNotFound && mode == LookupMode::Create => { - if i == path.components().count() - 1 { + if i == components_len - 1 { cwd = cwd.inode().touch(cwd.clone(), component)?; } else { // todo: fix this shit @@ -258,6 +219,7 @@ pub fn lookup_path_with( cwd.clone(), Path::new(component), LookupMode::None, + resolve_last, ) { Ok(x) => x, Err(e) => { @@ -275,16 +237,19 @@ pub fn lookup_path_with( let inode = cwd.inode(); let metadata = inode.metadata()?; - if metadata.is_symlink() { - let resolved_path_str = inode.resolve_link()?; - let resolved_path = Path::new(&resolved_path_str); - - if resolved_path.is_absolute() { - cwd = lookup_path(resolved_path)?; - continue; - } - - cwd = lookup_path_with(parent, resolved_path, LookupMode::None)?; + if metadata.is_symlink() && resolve_last { + let resolved_path = inode.resolve_link()?; + + cwd = lookup_path_with( + if resolved_path.is_absolute() { + root_dir().clone() + } else { + parent + }, + resolved_path.as_ref(), + LookupMode::None, + resolve_last, + )?; } else if metadata.is_directory() { if let Ok(mount_point) = MOUNT_MANAGER.find_mount(cwd.clone()) { cwd = mount_point.root_entry; @@ -299,12 +264,13 @@ pub fn lookup_path_with( pub fn lookup_path(path: &Path) -> Result { let cwd = if !path.is_absolute() { - scheduler::get_scheduler().current_task().cwd_dirent() + scheduler::current_thread().cwd_dirent() } else { root_dir().clone() }; - lookup_path_with(cwd, path, LookupMode::None) + // TODO:Keep `resolve_last` set to true as a default? + lookup_path_with(cwd, path, LookupMode::None, true) } pub fn root_dir() -> &'static DirCacheItem { diff --git a/src/aero_kernel/src/fs/path.rs b/src/aero_kernel/src/fs/path.rs new file mode 100644 index 00000000000..a553befb74b --- /dev/null +++ b/src/aero_kernel/src/fs/path.rs @@ -0,0 +1,162 @@ +use core::borrow::Borrow; +use core::fmt::Display; +use core::ops::Deref; + +use alloc::borrow::ToOwned; +use alloc::vec::Vec; + +/// A slice of a path (akin to [str]). +#[derive(Debug)] +pub struct Path(str); + +impl Path { + pub fn new(path: &str) -> &Self { + unsafe { &*(path as *const str as *const Path) } + } + + #[inline] + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + /// Returns [`true`] if the path is absolute. + pub fn is_absolute(&self) -> bool { + self.0.starts_with('/') + } + + /// Returns an iterator over the components of the path. + pub fn components(&self) -> impl Iterator { + self.0.split('/').filter(|e| !e.is_empty() && *e != ".") + } + + pub fn as_str(&self) -> &str { + &self.0 + } + + /// Creates an owned [`PathBuf`] with `path` adjoined to `self`. + /// + /// If `path` is absolute, it replaces the current path. + /// + /// See [`PathBuf::push`] for more details on what it means to adjoin a path. + pub fn join>(&self, path: P) -> PathBuf { + let mut result = self.to_owned(); + result.push(path); + result + } + + /// Helper function that returns the parent path and the base name + /// of the path. + pub fn parent_and_basename(&self) -> (&Self, &str) { + if let Some(slash_index) = self.0.rfind('/') { + let parent_dir = if slash_index == 0 { + Path::new("/") + } else { + Path::new(&self.0[..slash_index]) + }; + + let basename = &self.0[(slash_index + 1)..]; + (parent_dir, basename) + } else { + // A relative path without any slashes. + (Path::new(""), &self.0) + } + } + + #[inline] + pub fn as_bytes(&self) -> &[u8] { + self.0.as_bytes() + } +} + +impl Borrow for PathBuf { + #[inline] + fn borrow(&self) -> &Path { + self.deref() + } +} + +impl ToOwned for Path { + type Owned = PathBuf; + + #[inline] + fn to_owned(&self) -> Self::Owned { + PathBuf(self.0.to_owned()) + } +} + +impl AsRef for Path { + #[inline] + fn as_ref(&self) -> &Path { + self + } +} + +/// An owned, mutable path (akin to [`String`]). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct PathBuf(String); + +impl PathBuf { + #[inline] + fn as_mut_vec(&mut self) -> &mut Vec { + // TODO: safety? + unsafe { self.0.as_mut_vec() } + } + + /// Extends `self` with `path`. + /// + /// If `path` is absolute, it replaces the current path. + pub fn push>(&mut self, path: P) { + let path = path.as_ref(); + + // absolute `path` replaces `self` + if path.is_absolute() { + self.as_mut_vec().truncate(0); + } + + let need_sep = self.0.chars().last().map(|c| c != '/').unwrap_or(false); + + // TODO: verbatim pahts need . and .. removed + + if need_sep { + self.0.push('/'); + } + + self.0.push_str(path.as_str()); + } +} + +impl From for PathBuf { + #[inline] + fn from(path: String) -> Self { + Self(path) + } +} + +impl From<&str> for PathBuf { + fn from(value: &str) -> Self { + Self(value.to_owned()) + } +} + +impl Deref for PathBuf { + type Target = Path; + + #[inline] + fn deref(&self) -> &Self::Target { + Path::new(&self.0) + } +} + +impl AsRef for PathBuf { + #[inline] + fn as_ref(&self) -> &Path { + self + } +} + +impl Display for PathBuf { + #[inline] + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + self.0.fmt(f) + } +} diff --git a/src/aero_kernel/src/fs/procfs.rs b/src/aero_kernel/src/fs/procfs.rs index 48f4dc19790..57a12bae572 100644 --- a/src/aero_kernel/src/fs/procfs.rs +++ b/src/aero_kernel/src/fs/procfs.rs @@ -19,23 +19,23 @@ use core::sync::atomic::{AtomicUsize, Ordering}; use alloc::borrow::ToOwned; use alloc::collections::BTreeMap; -use alloc::string::{String, ToString}; +use alloc::string::ToString; use alloc::sync::{Arc, Weak}; use spin::{Once, RwLock}; +use crate::fs; use crate::fs::inode::FileType; use crate::arch::tls; +use crate::userland::scheduler; -use super::cache; use super::cache::*; +use super::{cache, FileSystem, Path, MOUNT_MANAGER}; +use super::inode::{DirEntry, INodeInterface, Metadata}; use super::FileSystemError; -use super::inode::*; -use super::*; - // TODO: put this mf in prelude use alloc::vec; @@ -151,7 +151,7 @@ impl LockedProcINode { name: &str, file_type: FileType, contents: FileContents, - ) -> Result { + ) -> fs::Result { let icache = cache::icache(); let mut this = self.0.write(); @@ -183,7 +183,7 @@ impl LockedProcINode { } impl INodeInterface for LockedProcINode { - fn read_at(&self, offset: usize, buffer: &mut [u8]) -> Result { + fn read_at(&self, offset: usize, buffer: &mut [u8]) -> fs::Result { let this = self.0.read(); let data = match &this.contents { @@ -216,7 +216,7 @@ impl INodeInterface for LockedProcINode { Ok(count) } - fn lookup(&self, dir: DirCacheItem, name: &str) -> Result { + fn lookup(&self, dir: DirCacheItem, name: &str) -> fs::Result { let this = self.0.read(); let child = this .children @@ -226,7 +226,7 @@ impl INodeInterface for LockedProcINode { Ok(DirEntry::new(dir, child.clone(), String::from(name))) } - fn metadata(&self) -> Result { + fn metadata(&self) -> fs::Result { let this = self.0.read(); Ok(Metadata { @@ -237,7 +237,7 @@ impl INodeInterface for LockedProcINode { }) } - fn dirent(&self, parent: DirCacheItem, index: usize) -> Result> { + fn dirent(&self, parent: DirCacheItem, index: usize) -> fs::Result> { let this = self.0.read(); if this.file_type != FileType::Directory { @@ -282,7 +282,7 @@ struct ProcFs { } impl ProcFs { - pub fn new() -> Result> { + pub fn new() -> fs::Result> { let icache = cache::icache(); let root_node = Arc::new(LockedProcINode::new(ProcINode::default())); @@ -345,7 +345,7 @@ impl FileSystem for ProcFs { static PROC_FS: Once> = Once::new(); -pub fn init() -> Result<()> { +pub fn init() -> fs::Result<()> { let fs = ProcFs::new()?; let fs = PROC_FS.call_once(|| fs); diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index 060fe214cb7..822b3531aba 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -19,7 +19,7 @@ use core::sync::atomic::{AtomicUsize, Ordering}; use aero_syscall::MMapFlags; use alloc::collections::BTreeMap; -use alloc::string::{String, ToString}; +use alloc::string::ToString; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 54a6d418e72..72d802f5e33 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -69,12 +69,12 @@ extern crate aero_proc; mod prelude { + #[allow(unused)] pub mod rust_2021 { // Since asm is used almost all over the kernel, its a better idea // to add it to the prelude. pub use core::arch::asm; pub use core::prelude::rust_2021::*; - pub use core::prelude::v1::*; pub use alloc::string::String; @@ -83,6 +83,7 @@ mod prelude { } } +#[allow(unused)] #[prelude_import] pub use prelude::rust_2021::*; diff --git a/src/aero_kernel/src/mem/paging/mod.rs b/src/aero_kernel/src/mem/paging/mod.rs index 7ed5a571793..7e523182dbd 100644 --- a/src/aero_kernel/src/mem/paging/mod.rs +++ b/src/aero_kernel/src/mem/paging/mod.rs @@ -27,8 +27,6 @@ pub use self::mapper::*; pub use self::page::*; pub use self::page_table::*; -pub use frame::LockedFrameAllocator; - use crate::PHYSICAL_MEMORY_OFFSET; pub static FRAME_ALLOCATOR: LockedFrameAllocator = LockedFrameAllocator::new_uninit(); diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 2ba5633ca5c..d011dc7c37f 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -19,7 +19,8 @@ use core::fmt; use aero_syscall::prelude::*; use aero_syscall::signal::SigProcMask; -use aero_syscall::{AtFlags, OpenFlags, Stat, SyscallError, TimeSpec, AT_FDCWD}; +use aero_syscall::{AtFlags, OpenFlags, Stat, TimeSpec, AT_FDCWD}; +use alloc::borrow::ToOwned; use alloc::sync::Arc; use crate::fs::cache::{self, DirCacheImpl}; @@ -27,6 +28,7 @@ use crate::fs::epoll::EPoll; use crate::fs::eventfd::EventFd; use crate::fs::file_table::{DuplicateHint, FileHandle}; use crate::fs::inode::{DirEntry, PollTable}; +use crate::fs::path::PathBuf; use crate::fs::pipe::Pipe; use crate::fs::{self, lookup_path, LookupMode}; use crate::syscall::SysArg; @@ -129,7 +131,7 @@ pub fn open(fd: usize, path: &Path, mode: usize) -> Result lookup_mode = LookupMode::Create; } - let inode = fs::lookup_path_with(dir, path, lookup_mode)?; + let inode = fs::lookup_path_with(dir, path, lookup_mode, true)?; if flags.contains(OpenFlags::O_DIRECTORY) && !inode.inode().metadata()?.is_directory() { return Err(SyscallError::ENOTDIR); @@ -470,7 +472,7 @@ pub fn fstat(fd: usize, path: &Path, flags: usize, stat: &mut Stat) -> Result Result { #[syscall] pub fn read_link(path: &Path, buffer: &mut [u8]) -> Result { // XXX: lookup_path with automatically resolve the link. - let file = fs::lookup_path(path)?; - let resolved_path = file.absolute_path_str(); - let size = core::cmp::min(resolved_path.len(), buffer.len()); + let cwd = if !path.is_absolute() { + scheduler::current_thread().cwd_dirent() + } else { + fs::root_dir().clone() + }; + + let file = fs::lookup_path_with(cwd.clone(), path, LookupMode::None, false)?.inode(); + if !file.metadata()?.is_symlink() { + return Err(SyscallError::EINVAL); + } + + let resolved_path = file.resolve_link()?; + let resolved_path = if resolved_path.is_absolute() { + resolved_path + } else { + Path::new(&cwd.absolute_path_str()).join(resolved_path) + }; + + let size = core::cmp::min(resolved_path.as_str().len(), buffer.len()); + + log::warn!("Orig: {path:?} -> {resolved_path}"); buffer[..size].copy_from_slice(&resolved_path.as_bytes()[..size]); Ok(size) diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index b6275ec0949..70c76c10f33 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -24,19 +24,14 @@ use aero_syscall::prelude::*; mod fs; mod futex; -mod ipc; +pub mod ipc; mod net; mod process; -mod time; +pub mod time; use alloc::boxed::Box; use alloc::vec::Vec; -pub use fs::*; -pub use ipc::*; -pub use process::*; -pub use time::*; - use crate::utils::StackHelper; #[derive(Default)] diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index f54cf2bb3f9..d7375f73a40 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -35,9 +35,8 @@ use crate::socket::unix::*; use crate::socket::{SocketAddr, SocketAddrRef}; use crate::userland::scheduler; -use crate::userland::task::TaskId; -use super::FileDescriptor; +use crate::syscall::fs::FileDescriptor; /// Creates a [`SocketAddr`] from the provided userland socket structure address. This /// is done by looking at the family field present in every socket address structure. diff --git a/src/aero_kernel/src/userland/signals.rs b/src/aero_kernel/src/userland/signals.rs index a9a714863d0..0cf1cf56c96 100644 --- a/src/aero_kernel/src/userland/signals.rs +++ b/src/aero_kernel/src/userland/signals.rs @@ -360,7 +360,10 @@ impl Signals { handler: Option, old: Option<&mut SigAction>, ) { - assert!(signal < SIGNAL_COUNT); + if signal >= SIGNAL_COUNT { + log::warn!("signal index is out of bounds"); + return; + } if !can_override(signal) { return; diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 86d60ba3723..43913010e04 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -33,7 +33,8 @@ use crate::mem::paging::*; use crate::arch::task::ArchTask; use crate::fs::file_table::FileTable; -use crate::syscall::{ExecArgs, MessageQueue}; +use crate::syscall::ipc::MessageQueue; +use crate::syscall::ExecArgs; use crate::utils::sync::{Mutex, WaitQueue}; use crate::userland::signals::Signals; From ec720d2197814933c5993fb63624c3d1fbe24d43 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 29 Mar 2024 15:38:18 +1100 Subject: [PATCH 297/368] fix(base-files): do not set `PYTHONHOME` Signed-off-by: Anhad Singh --- base-files/{.bashrc => etc/bash/bash.bashrc} | 2 - base-files/etc/profile | 49 ++++++++++++++++++++ src/aero_kernel/src/acpi/mod.rs | 2 +- 3 files changed, 50 insertions(+), 3 deletions(-) rename base-files/{.bashrc => etc/bash/bash.bashrc} (93%) create mode 100644 base-files/etc/profile diff --git a/base-files/.bashrc b/base-files/etc/bash/bash.bashrc similarity index 93% rename from base-files/.bashrc rename to base-files/etc/bash/bash.bashrc index 3c47db12580..a9b77a9c70b 100644 --- a/base-files/.bashrc +++ b/base-files/etc/bash/bash.bashrc @@ -9,8 +9,6 @@ export TERM=xterm-256color alias ls="ls --color=auto" alias clear='printf "\e[2J\e[H"' -export PYTHONHOME="/usr/lib" - # todo: https://github.com/sharkdp/bat/blob/master/src/bin/bat/directories.rs panics if not set? export BAT_CONFIG_DIR="/cfg/bat" export BAT_CACHE_PATH="/cache/bat" diff --git a/base-files/etc/profile b/base-files/etc/profile new file mode 100644 index 00000000000..dcb78173695 --- /dev/null +++ b/base-files/etc/profile @@ -0,0 +1,49 @@ +# /etc/profile + +# This file was copied from my host Arch Linux installation. Credits to them :) + +# Append "$1" to $PATH when not already in. +# This function API is accessible to scripts in /etc/profile.d +append_path () { + case ":$PATH:" in + *:"$1":*) + ;; + *) + PATH="${PATH:+$PATH:}$1" + esac +} + +# Append our default paths +append_path '/usr/local/sbin' +append_path '/usr/local/bin' +append_path '/usr/bin' + +# Force PATH to be environment +export PATH + +# Load profiles from /etc/profile.d +if test -d /etc/profile.d/; then + for profile in /etc/profile.d/*.sh; do + test -r "$profile" && . "$profile" + done + unset profile +fi + +# Unload our profile API functions +unset -f append_path + +# Source global bash config, when interactive but not posix or sh mode +if test "$BASH" &&\ + test "$PS1" &&\ + test -z "$POSIXLY_CORRECT" &&\ + test "${0#-}" != sh &&\ + test -r /etc/bash.bashrc +then + . /etc/bash.bashrc +fi + +# Termcap is outdated, old, and crusty, kill it. +unset TERMCAP + +# Man is much better than us at figuring this out +unset MANPATH diff --git a/src/aero_kernel/src/acpi/mod.rs b/src/aero_kernel/src/acpi/mod.rs index 5503c41f5ce..f7f59d19708 100644 --- a/src/aero_kernel/src/acpi/mod.rs +++ b/src/aero_kernel/src/acpi/mod.rs @@ -86,7 +86,7 @@ impl AcpiTable { } } -#[repr(packed)] +#[repr(C, packed)] #[derive(Clone, Copy, Debug)] pub struct GenericAddressStructure { pub address_space: u8, From e276b6e65712c69b571728c6040a67e0b9920469 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 29 Mar 2024 16:17:04 +1100 Subject: [PATCH 298/368] misc(absolute_path): rename and return a `PathBuf` * Rename `absolute_path_str` -> `absolute_path` * Make it return a `PathBuf` Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/cache.rs | 20 ++++++++------- src/aero_kernel/src/fs/file_table.rs | 13 +--------- src/aero_kernel/src/fs/mod.rs | 2 +- src/aero_kernel/src/fs/path.rs | 25 +++++++++++++++++++ src/aero_kernel/src/syscall/fs.rs | 6 ++--- src/aero_kernel/src/userland/scheduler/mod.rs | 7 +++++- src/aero_kernel/src/userland/task/mod.rs | 12 ++++----- src/aero_kernel/src/userland/vm.rs | 8 +++--- 8 files changed, 56 insertions(+), 37 deletions(-) diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index b18cbee1ad9..55c23e649db 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -38,6 +38,7 @@ use spin::Once; use crate::fs::inode::{DirEntry, INodeInterface}; use crate::utils::sync::BMutex; +use super::path::PathBuf; use super::FileSystem; pub static INODE_CACHE: Once> = Once::new(); @@ -317,7 +318,7 @@ pub type DirCacheItem = CacheArc>; impl Debug for DirCacheItem { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { f.debug_tuple("DirCacheItem") - .field(&self.absolute_path_str()) + .field(&self.absolute_path()) .finish() } } @@ -367,14 +368,14 @@ impl Cacheable for DirEntry { } pub trait DirCacheImpl { - fn absolute_path_str(&self) -> String; + fn absolute_path(&self) -> PathBuf; } impl DirCacheImpl for DirCacheItem { - fn absolute_path_str(&self) -> String { + fn absolute_path(&self) -> PathBuf { let mut current_entry = Some(self.clone()); let mut path_nodes = Vec::new(); - let mut result = String::new(); + let mut result = PathBuf::new(); // We need to collect all of the path nodes, reverse them and then join them // with the path separator. @@ -384,12 +385,13 @@ impl DirCacheImpl for DirCacheItem { } for node in path_nodes.iter().rev() { - result.push_str(node); + result.push(node.as_str()); + // result.push_str(node); - // If we are not at the root node, we need to add the path separator. - if node != "/" { - result.push('/'); - } + // // If we are not at the root node, we need to add the path separator. + // if node != "/" { + // result.push('/'); + // } } result diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index c7e01b89e24..c4428f50f62 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -68,17 +68,7 @@ impl FileHandle { let offset = self.offset.load(Ordering::SeqCst); let new_offset = self.inode.inode().read_at(offset, buffer)?; - if self.inode.absolute_path_str().contains("/tmp/ccAAAAAA.s") { - log::debug!( - "read {} bytes from {} ----- hi mom ----- {:?}", - new_offset, - self.inode.absolute_path_str(), - buffer - ); - } - self.offset.fetch_add(new_offset, Ordering::SeqCst); - Ok(new_offset) } @@ -87,7 +77,6 @@ impl FileHandle { let new_offset = self.inode.inode().write_at(offset, buffer)?; self.offset.fetch_add(new_offset, Ordering::SeqCst); - Ok(new_offset) } @@ -223,7 +212,7 @@ impl FileTable { log::debug!( "file handle: (fd={}, path=`{}`)", handle.fd, - handle.inode.absolute_path_str() + handle.inode.absolute_path() ) } } diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index 4cb64f4c8c1..37a17c50345 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -223,7 +223,7 @@ pub fn lookup_path_with( ) { Ok(x) => x, Err(e) => { - dbg!(component, cwd.absolute_path_str()); + dbg!(component, cwd.absolute_path()); return Err(dbg!(e)); } }; diff --git a/src/aero_kernel/src/fs/path.rs b/src/aero_kernel/src/fs/path.rs index a553befb74b..40905999c9e 100644 --- a/src/aero_kernel/src/fs/path.rs +++ b/src/aero_kernel/src/fs/path.rs @@ -66,6 +66,11 @@ impl Path { pub fn as_bytes(&self) -> &[u8] { self.0.as_bytes() } + + /// Returns the byte length of the path. + pub fn len(&self) -> usize { + self.0.len() + } } impl Borrow for PathBuf { @@ -91,11 +96,24 @@ impl AsRef for Path { } } +impl AsRef for &str { + #[inline] + fn as_ref(&self) -> &Path { + Path::new(self) + } +} + /// An owned, mutable path (akin to [`String`]). #[derive(Debug, Clone, PartialEq, Eq)] pub struct PathBuf(String); impl PathBuf { + /// Allocates an empty `PathBuf`. + #[inline] + pub fn new() -> Self { + Self(String::new()) + } + #[inline] fn as_mut_vec(&mut self) -> &mut Vec { // TODO: safety? @@ -154,6 +172,13 @@ impl AsRef for PathBuf { } } +impl Into for PathBuf { + #[inline] + fn into(self) -> String { + self.0 + } +} + impl Display for PathBuf { #[inline] fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index d011dc7c37f..23d7d60a46a 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -55,7 +55,7 @@ impl FileDescriptor { impl fmt::Display for FileDescriptor { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if let Ok(file_handle) = self.handle() { - let path = file_handle.inode.absolute_path_str(); + let path = file_handle.inode.absolute_path(); write!(f, "{{ {} -> {} }}", self.0, path) } else { // invalid file descriptor @@ -470,7 +470,7 @@ pub fn fstat(fd: usize, path: &Path, flags: usize, stat: &mut Stat) -> Result Result let resolved_path = if resolved_path.is_absolute() { resolved_path } else { - Path::new(&cwd.absolute_path_str()).join(resolved_path) + cwd.absolute_path().join(resolved_path) }; let size = core::cmp::min(resolved_path.as_str().len(), buffer.len()); diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index 043e97d2dd7..8f5629bba49 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -131,9 +131,14 @@ impl Scheduler { pub fn log_ptable(&self) { self.tasks.0.lock().iter().for_each(|(pid, task)| { + let path: String = task + .path() + .map(|path| path.into()) + .unwrap_or("".into()); + log::info!( "task(pid={pid:?}, path={:?}, state={:?})", - task.path().unwrap_or(String::from("")), + path, task.state() ) }); diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index 43913010e04..c242e511759 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -28,6 +28,7 @@ use core::ops::Range; use core::sync::atomic::{AtomicBool, AtomicU8, AtomicUsize, Ordering}; use crate::fs::cache::{DirCacheImpl, DirCacheItem}; +use crate::fs::path::PathBuf; use crate::fs::{self, FileSystem}; use crate::mem::paging::*; @@ -510,11 +511,8 @@ impl Task { } } - pub fn path(&self) -> Option { - self.executable - .lock() - .as_ref() - .map(|e| e.absolute_path_str()) + pub fn path(&self) -> Option { + self.executable.lock().as_ref().map(|e| e.absolute_path()) } pub fn exec( @@ -648,8 +646,8 @@ impl Task { self.cwd.read().as_ref().unwrap().inode.clone() } - pub fn get_cwd(&self) -> String { - self.cwd.read().as_ref().unwrap().inode.absolute_path_str() + pub fn get_cwd(&self) -> PathBuf { + self.cwd.read().as_ref().unwrap().inode.absolute_path() } pub fn set_cwd(&self, cwd: DirCacheItem) { diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 32d4e8ca459..5bfef124bfd 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -872,7 +872,7 @@ impl VmProtected { protection, flags, offset, - z.map(|f| f.absolute_path_str()) + z.map(|f| f.absolute_path()) ); crate::unwind::unwind_stack_trace(); @@ -915,19 +915,19 @@ impl VmProtected { if let Some(shebang) = parse_shebang(bin.clone())? { log::debug!( "shebang: (interpreter={}, argument={})", - shebang.interpreter.absolute_path_str(), + shebang.interpreter.absolute_path(), shebang.argument ); let mut largv = ExecArgs::default(); - largv.push(shebang.interpreter.absolute_path_str().as_bytes()); + largv.push(shebang.interpreter.absolute_path().as_bytes()); if !shebang.argument.is_empty() { largv.push(shebang.argument.as_bytes()); } - largv.push(bin.absolute_path_str().as_bytes()); + largv.push(bin.absolute_path().as_bytes()); if let Some(argv) = argv { largv.extend(&argv.inner[1..]) From 7d054dba37c054c86ead1edd4c5ea3ecb3e18fe4 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 29 Mar 2024 20:23:13 +1100 Subject: [PATCH 299/368] misc(kernel): refactor and make clippy happier Signed-off-by: Anhad Singh --- .vscode/settings.json | 2 +- .../src/drivers/block/nvme/command.rs | 2 +- src/aero_kernel/src/drivers/block/nvme/queue.rs | 12 ++++++------ src/aero_kernel/src/drivers/drm/rawfb.rs | 5 +++-- src/aero_kernel/src/drivers/e1000.rs | 10 ++++++---- src/aero_kernel/src/fs/cache.rs | 2 +- src/aero_kernel/src/fs/ext2/disk.rs | 15 +++++++-------- src/aero_kernel/src/utils/dma.rs | 4 ++-- src/aero_kernel/src/utils/mod.rs | 17 +++++++++++++++++ 9 files changed, 44 insertions(+), 25 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 887a54e7cd9..f4cfcd3638f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { "rust-analyzer.linkedProjects": [ "./src/Cargo.toml", - "./userland/Cargo.toml" + // "./userland/Cargo.toml" ], "rust-analyzer.checkOnSave.allTargets": false, // "rust-analyzer.checkOnSave.extraArgs": [ diff --git a/src/aero_kernel/src/drivers/block/nvme/command.rs b/src/aero_kernel/src/drivers/block/nvme/command.rs index c967885ebbc..120e6cce68a 100644 --- a/src/aero_kernel/src/drivers/block/nvme/command.rs +++ b/src/aero_kernel/src/drivers/block/nvme/command.rs @@ -351,7 +351,7 @@ pub struct CompletionEntry { #[repr(C)] pub union Command { - common: CommonCommand, + pub(super) common: CommonCommand, identify: IdentifyCommand, rw: ReadWriteCommand, create_sq: CreateSQCommand, diff --git a/src/aero_kernel/src/drivers/block/nvme/queue.rs b/src/aero_kernel/src/drivers/block/nvme/queue.rs index 4ed0b4221db..fa45e47aa0f 100644 --- a/src/aero_kernel/src/drivers/block/nvme/queue.rs +++ b/src/aero_kernel/src/drivers/block/nvme/queue.rs @@ -1,11 +1,13 @@ use core::cell::UnsafeCell; +use core::ptr; use core::sync::atomic::{AtomicU16, Ordering}; use crate::mem::paging::PhysAddr; use crate::utils::dma::Dma; +use crate::utils::VolatileCell; use super::command::{Command, CompletionEntry}; -use super::*; +use super::{Error, Registers}; const fn calculate_doorbell_offset(queue_id: u16, multiplier: usize, dstrd: usize) -> usize { 0x1000 + ((((queue_id as usize) * 2) + multiplier) * (4 << dstrd)) @@ -136,11 +138,9 @@ impl<'a> QueuePair<'a> { let mut command = command.into(); unsafe { - // SAFETY: Command Layout: - // - opcode: u8 - // - flags: u8 - // - command_id: u16 (offset=2 bytes)) - *(&mut command as *mut Command as *mut u16).offset(1) = self.cid; + // SAFETY: The offset of the `command_id` field is the same, regardless of the command + // type. + command.common.command_id = self.cid; } self.cid += 1; diff --git a/src/aero_kernel/src/drivers/drm/rawfb.rs b/src/aero_kernel/src/drivers/drm/rawfb.rs index 0b7f06064ac..1020539df8b 100644 --- a/src/aero_kernel/src/drivers/drm/rawfb.rs +++ b/src/aero_kernel/src/drivers/drm/rawfb.rs @@ -16,12 +16,13 @@ // along with Aero. If not, see . use alloc::sync::Arc; +use uapi::drm::DrmModeConStatus; use crate::fs::{devfs, FileSystem}; use crate::mem::paging::*; -use super::*; +use super::{make_dmt_modes, BufferObject, Connector, Crtc, Drm, DrmDevice, Encoder}; use crate::rendy; struct RawFramebuffer {} @@ -54,7 +55,7 @@ impl DrmDevice for RawFramebuffer { unsafe { core::ptr::copy_nonoverlapping( frame.as_slice_mut::().as_mut_ptr(), - (fb.as_mut_ptr() as *mut u8) + (fb.as_mut_ptr().cast::()) .offset(i as isize * Size4KiB::SIZE as isize), 4096, ) diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index fd9b6ff80be..3b8975cd599 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -15,6 +15,8 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use core::ptr; + use alloc::boxed::Box; use alloc::sync::Arc; use spin::Once; @@ -570,14 +572,14 @@ impl E1000 { unsafe fn write_raw(&self, register: u32, value: u32) { unsafe { - let register = self.base.as_mut_ptr::().add(register as usize); - core::ptr::write_volatile(register as *mut u32, value); + let register = self.base.as_mut_ptr::().byte_add(register as usize); + ptr::write_volatile(register, value); } } unsafe fn read_raw(&self, register: u32) -> u32 { - let register = self.base.as_ptr::().add(register as usize); - core::ptr::read_volatile(register as *const u32) + let register = self.base.as_ptr::().byte_add(register as usize); + ptr::read_volatile(register) } } diff --git a/src/aero_kernel/src/fs/cache.rs b/src/aero_kernel/src/fs/cache.rs index 55c23e649db..64fa5c84837 100644 --- a/src/aero_kernel/src/fs/cache.rs +++ b/src/aero_kernel/src/fs/cache.rs @@ -351,7 +351,7 @@ impl Cacheable for CachedINode { impl INodeCacheItem { pub fn make_key(fs: Weak, id: usize) -> INodeCacheKey { - (Weak::as_ptr(&fs) as *const () as usize, id) + (Weak::as_ptr(&fs).addr(), id) } } diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index 0dbe5c4f5b1..faf9af574b6 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -15,11 +15,12 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use core::ptr; + use bit_field::BitField; use crate::fs::inode; - -trait Revsion {} +use crate::utils::IncompleteArrayField; #[derive(Debug, PartialEq)] pub enum Revision { @@ -142,13 +143,14 @@ pub struct GroupDescriptor { const_assert_eq!(core::mem::size_of::(), 32); -#[derive(Debug, Copy, Clone)] -#[repr(C, packed)] +#[derive(Debug)] +#[repr(C)] pub struct DirEntry { pub inode: u32, pub entry_size: u16, pub name_size: u8, pub file_type: u8, + name: IncompleteArrayField, } impl DirEntry { @@ -157,10 +159,7 @@ impl DirEntry { self.name_size = name.len() as u8; - // SAFETY: Above we have verified that the name will fit in the entry. - let name_ptr = unsafe { (self as *mut _ as *mut u8).add(core::mem::size_of::()) }; - let name_bytes = unsafe { core::slice::from_raw_parts_mut(name_ptr, name.len()) }; - + let name_bytes = unsafe { self.name.as_mut_slice(name.len()) }; name_bytes.copy_from_slice(name.as_bytes()); } } diff --git a/src/aero_kernel/src/utils/dma.rs b/src/aero_kernel/src/utils/dma.rs index 861d8f089ab..c3c1a19a667 100644 --- a/src/aero_kernel/src/utils/dma.rs +++ b/src/aero_kernel/src/utils/dma.rs @@ -19,7 +19,7 @@ use alloc::boxed::Box; use core::alloc::{AllocError, Allocator, Layout}; use core::mem::MaybeUninit; -use core::ptr::NonNull; +use core::ptr::{self, NonNull}; use crate::mem::paging::*; @@ -114,7 +114,7 @@ impl core::fmt::Debug for Dma { impl Dma { pub fn addr(&self) -> PhysAddr { unsafe { - let phys = (&*self.0 as *const T as *const u8) as u64; + let phys = ptr::addr_of!(*self.0).addr() as u64; PhysAddr::new(phys - crate::PHYSICAL_MEMORY_OFFSET.as_u64()) } } diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index 7d143b05b7d..58918037f88 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -20,6 +20,7 @@ use alloc::sync::Arc; use core::alloc::Layout; use core::any::Any; use core::cell::UnsafeCell; +use core::marker::PhantomData; use core::mem; use core::ptr::Unique; @@ -235,3 +236,19 @@ macro_rules! extern_sym { unsafe { ::core::ptr::addr_of!($sym) } }}; } + +#[repr(C)] +#[derive(Debug, Default)] +pub struct IncompleteArrayField(PhantomData, [T; 0]); + +impl IncompleteArrayField { + #[inline] + pub unsafe fn as_mut_ptr(&mut self) -> *mut T { + self as *mut _ as *mut T + } + + #[inline] + pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { + core::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + } +} From 4fc918bec99d0bd81f7721c80bc909a82f5e0261 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 29 Mar 2024 20:27:38 +1100 Subject: [PATCH 300/368] feat(kernel): add `symlink` systemcall Signed-off-by: Anhad Singh --- patches/mlibc/jinx-working-patch.patch | 39 ++++++++++++++++++-- src/aero_kernel/src/fs/ext2/mod.rs | 24 +++++++++++- src/aero_kernel/src/fs/inode.rs | 6 ++- src/aero_kernel/src/syscall/fs.rs | 30 +++++++++++++-- src/aero_kernel/src/syscall/mod.rs | 1 + src/aero_syscall/src/consts.rs | 1 + src/aero_syscall/src/lib.rs | 5 +++ userland/tests/utest.cc | 51 ++++++++++++++++++++++---- 8 files changed, 141 insertions(+), 16 deletions(-) diff --git a/patches/mlibc/jinx-working-patch.patch b/patches/mlibc/jinx-working-patch.patch index dbb0969d0bb..e948a5c0430 100644 --- a/patches/mlibc/jinx-working-patch.patch +++ b/patches/mlibc/jinx-working-patch.patch @@ -102,7 +102,7 @@ index 0000000..1b61d5a + ret +.section .note.GNU-stack,"",%progbits diff --git mlibc-clean/sysdeps/aero/generic/filesystem.cpp mlibc-workdir/sysdeps/aero/generic/filesystem.cpp -index 33a11f4..8795382 100644 +index 33a11f4..fe5773d 100644 --- mlibc-clean/sysdeps/aero/generic/filesystem.cpp +++ mlibc-workdir/sysdeps/aero/generic/filesystem.cpp @@ -102,31 +102,24 @@ int sys_access(const char *filename, int mode) { @@ -127,7 +127,7 @@ index 33a11f4..8795382 100644 + case fsfd_target::fd_path: break; - } -- + - default: { - mlibc::infoLogger() - << "mlibc warning: sys_stat: unsupported fsfd target" @@ -135,7 +135,7 @@ index 33a11f4..8795382 100644 - return EINVAL; - } - } - +- - if (result < 0) { - return -result; + default: @@ -149,6 +149,39 @@ index 33a11f4..8795382 100644 return 0; } +@@ -212,6 +205,17 @@ int sys_unlinkat(int fd, const char *path, int flags) { + return 0; + } + ++int sys_symlink(const char *target_path, const char *link_path) { ++ return sys_symlinkat(target_path, AT_FDCWD, link_path); ++} ++ ++int sys_symlinkat(const char *target_path, int dirfd, const char *link_path) { ++ auto ret = syscall(SYS_SYMLINK_AT, dirfd, target_path, strlen(target_path), link_path, strlen(link_path)); ++ if (int e = sc_error(ret); e) ++ return e; ++ return 0; ++} ++ + struct aero_dir_entry { + size_t inode; + size_t offset; +diff --git mlibc-clean/sysdeps/aero/include/aero/syscall.h mlibc-workdir/sysdeps/aero/include/aero/syscall.h +index 39c5b65..49533cc 100644 +--- mlibc-clean/sysdeps/aero/include/aero/syscall.h ++++ mlibc-workdir/sysdeps/aero/include/aero/syscall.h +@@ -82,6 +82,10 @@ + #define SYS_SOCK_SHUTDOWN 75 + #define SYS_GETPEERNAME 76 + #define SYS_GETSOCKNAME 77 ++#define SYS_DEBUG 78 ++#define SYS_SETSOCKOPT 79 ++#define SYS_GETSOCKOPT 80 ++#define SYS_SYMLINK_AT 81 + + // Invalid syscall used to trigger a log error in the kernel (as a hint) + // so, that we can implement the syscall in the kernel. diff --git mlibc-clean/sysdeps/aero/meson.build mlibc-workdir/sysdeps/aero/meson.build index 9d10701..3d2a883 100644 --- mlibc-clean/sysdeps/aero/meson.build diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 4653ebfc6a2..92d4f390ff3 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -41,7 +41,7 @@ use super::block::{self, BlockDevice, CachedAccess}; use super::cache::{DirCacheItem, INodeCacheItem}; use super::path::PathBuf; -use super::{cache, FileSystemError}; +use super::{cache, FileSystemError, Path}; use super::inode::{DirEntry, INodeInterface, Metadata, PollFlags, PollTable}; use super::FileSystem; @@ -529,6 +529,8 @@ impl INodeInterface for INode { let path_len = inode.size(); let data_bytes: &[u8] = bytemuck::cast_slice(&inode.data_ptr); + // XXX: Symlinks under 60 bytes store data within the inode to avoid allocating a full + // block. if path_len <= data_bytes.len() { let path_bytes = &data_bytes[..path_len]; let path = core::str::from_utf8(path_bytes).or(Err(FileSystemError::InvalidPath))?; @@ -545,6 +547,26 @@ impl INodeInterface for INode { } } + fn symlink(&self, target: &Path) -> super::Result<()> { + let mut inode = self.inode.write(); + inode.set_file_type(FileType::Symlink); + + let target_len = target.len(); + let data_bytes: &mut [u8] = bytemuck::cast_slice_mut(&mut inode.data_ptr); + + // XXX: Symlinks under 60 bytes store data within the inode to avoid allocating a full + // block. + if target_len <= data_bytes.len() { + data_bytes[..target_len].copy_from_slice(target.as_bytes()); + inode.set_size(target_len); + } else { + drop(inode); + assert_eq!(self.write(0, target.as_bytes())?, target_len); + } + + Ok(()) + } + fn mmap(&self, offset: usize, size: usize, flags: MMapFlags) -> super::Result { assert!(self.proxy.is_none()); diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 98a0a86898b..a3ae965c8b2 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -37,7 +37,7 @@ use super::cache::{Cacheable, CachedINode, DirCacheItem, INodeCacheItem}; use super::devfs::DevINode; use super::file_table::FileHandle; use super::path::PathBuf; -use super::{cache, FileSystem, FileSystemError, Result}; +use super::{cache, FileSystem, FileSystemError, Path, Result}; static DIR_CACHE_MARKER: AtomicUsize = AtomicUsize::new(0x00); @@ -279,6 +279,10 @@ pub trait INodeInterface: Send + Sync { fn link(&self, _name: &str, _src: DirCacheItem) -> Result<()> { Err(FileSystemError::NotSupported) } + + fn symlink(&self, _target: &Path) -> Result<()> { + Err(FileSystemError::NotSupported) + } } /// Structure representing the crucial, characteristics of an inode. The metadata diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 23d7d60a46a..5b543914053 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -459,7 +459,7 @@ pub fn fstat(fd: usize, path: &Path, flags: usize, stat: &mut Stat) -> Result Result Result { }); Ok(0) } + +#[syscall] +pub fn symlink(link_dirfd: usize, target: &Path, linkpath: &Path) -> Result { + // TODO(andypython): the following code is reused in a couple of places. Isolate this inside the + // syscall parsing for FileDescriptor with an argument as a generic specifing the allowance + // of this value. + // + // If the pathname given in `linkpath` is relative, then it is interpreted relative to the + // directory referred to by the file descriptor `link_dirfd`. + let at = match link_dirfd as isize { + AT_FDCWD if !linkpath.is_absolute() => scheduler::current_thread().cwd_dirent(), + _ if !linkpath.is_absolute() => FileDescriptor::from_usize(link_dirfd) + .handle()? + .inode + .clone(), + _ => fs::root_dir().clone(), + }; + + let ent = fs::lookup_path_with(at, linkpath, LookupMode::Create, false)?; + ent.inode().symlink(target)?; + + Ok(0) +} diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 70c76c10f33..54f7ab9c1b0 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -230,6 +230,7 @@ pub fn generic_do_syscall( SYS_LINK => fs::link(b, c, d, e), SYS_POLL => fs::poll(b, c, d, e), SYS_RENAME => fs::rename(b, c, d, e), + SYS_SYMLINK_AT => fs::symlink(b, c, d, e, f), // epoll calls: SYS_EPOLL_CREATE => fs::epoll_create(b), diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index fb800d38f6e..a08796a60b6 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -101,6 +101,7 @@ pub const SYS_GETSOCKNAME: usize = 77; pub const SYS_DEBUG: usize = 78; pub const SYS_SETSOCKOPT: usize = 79; pub const SYS_GETSOCKOPT: usize = 80; +pub const SYS_SYMLINK_AT: usize = 81; // constants for fcntl()'s command argument: pub const F_DUPFD: usize = 1; diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 10ed83e6d37..15e3e4514f4 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -717,10 +717,15 @@ pub struct Stat { bitflags::bitflags! { #[repr(transparent)] pub struct AtFlags: usize { + /// Allow empty relative pathname. const EMPTY_PATH = 1; + /// Follow symbolic links. const SYMLINK_FOLLOW = 2; + /// Do not follow symbolic links. const SYMLINK_NOFOLLOW = 4; + /// Remove directory instead of unlinking file. const REMOVEDIR = 8; + /// Test access permitted for effective IDs, not real IDs. const EACCESS = 512; } } diff --git a/userland/tests/utest.cc b/userland/tests/utest.cc index 2fc71f96fcc..2abea8f9189 100644 --- a/userland/tests/utest.cc +++ b/userland/tests/utest.cc @@ -4,7 +4,10 @@ #include #include +#include #include +#include +#include #include #include #include @@ -199,7 +202,7 @@ DEFINE_TEST(epoll_mod_active, ([] { // Use mmap to change the protection flags instead of mprotect. DEFINE_TEST(mmap_partial_remap, ([] { - enable_systrace(); + //enable_systrace(); const int bytes = PAGE_SIZE * 2; @@ -610,6 +613,42 @@ DEFINE_TEST(mprotect_check_whether_three_way_split_mappings_are_handled_correctl }); })) +DEFINE_TEST(stat, ([] { + // SYM_B -> SYM_A -> /tmp/SYM_REAL + + // TODO: make mknod() + FILE *sym_real = fopen("/tmp/SYM_REAL", "w"); + + if (symlink("/tmp/SYM_REAL", "/tmp/SYM_A") == -1) + assert(!"(1) symlink() failed"); + + if (symlink("/tmp/SYM_A", "/tmp/SYM_B") == -1) + assert(!"(2) symlink() failed"); + + struct stat statbuf; + if (fstatat(AT_FDCWD, "/tmp/SYM_B", &statbuf, AT_SYMLINK_NOFOLLOW) == -1) + assert(!"fstatat() failed"); + + // Check that the symlink is not followed. + assert(S_ISLNK(statbuf.st_mode)); + + if (fstatat(AT_FDCWD, "/tmp/SYM_B", &statbuf, 0) == -1) + assert(!"fstatat() failed"); + + // Check that the symlink is followed. + assert(S_ISREG(statbuf.st_mode)); + + if (unlink("/tmp/SYM_A") == -1) + assert(!"unlink() failed"); + + if (unlink("/tmp/SYM_B") == -1) + assert(!"unlink() failed"); + + fclose(sym_real); + if (unlink("/tmp/SYM_REAL") == -1) + assert(!"unlink() failed"); +})) + static inline bool cpuid(uint32_t leaf, uint32_t subleaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) { uint32_t cpuid_max; @@ -724,10 +763,8 @@ void abstract_test_case::register_case(abstract_test_case *tcp) { int main() { // Go through all tests and run them. - // for(abstract_test_case *tcp : test_case_ptrs()) { - // std::cout << "tests: Running " << tcp->name() << std::endl; - // tcp->run(); - // } - test_bad_sysenter.run(); - test_sysenter_system_call.run(); + for(abstract_test_case *tcp : test_case_ptrs()) { + std::cout << "tests: Running " << tcp->name() << std::endl; + tcp->run(); + } } From a1823a3ddc5f4ec5bbc7838b177f0d514ade5295 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 30 Mar 2024 12:52:10 +1100 Subject: [PATCH 301/368] fix(recipes): add `gcc` imagedep for python Signed-off-by: Anhad Singh --- recipes/python | 1 + 1 file changed, 1 insertion(+) diff --git a/recipes/python b/recipes/python index e3dae6b0974..5426ea68b76 100644 --- a/recipes/python +++ b/recipes/python @@ -2,6 +2,7 @@ name=python version=3.13.0 tarball_url="https://www.python.org/ftp/python/${version}/Python-${version}a1.tar.xz" tarball_blake2b="62612d22ce652f4b1d7ce93aa30bd5814dbf271dbe98e321b99d003d7da8f74798e55f556db75fc39b676295c1d1f7b31919c444fe3c667d2fbd2ea16799a211" +imagedeps="gcc" source_deps="autoconf-archive" source_hostdeps="automake autoconf libtool pkg-config" hostdeps="gcc autoconf automake libtool pkg-config" From 36028c7b0d4938f4659090920b7320dd51b37e39 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 30 Mar 2024 12:56:10 +1100 Subject: [PATCH 302/368] feat(ports): remove old xbstrap files and buildsys * Remove aero.py * Remove bootstrap/ and bootstrap.yml which were used in the past by xbstrap. Now since we have switched to Jinx, we do not need them. Signed-off-by: Anhad Singh --- Dockerfile | 53 - aero.py | 674 ---------- bootstrap.yml | 2647 -------------------------------------- bootstrap/app-misc.yml | 31 - bootstrap/db.yml | 38 - bootstrap/editors.yml | 60 - bootstrap/net.yml | 733 ----------- bootstrap/vcs.yml | 51 - bootstrap/x11-themes.yml | 49 - bootstrap/xorg.yml | 2635 ------------------------------------- 10 files changed, 6971 deletions(-) delete mode 100644 Dockerfile delete mode 100755 aero.py delete mode 100644 bootstrap.yml delete mode 100644 bootstrap/app-misc.yml delete mode 100644 bootstrap/db.yml delete mode 100644 bootstrap/editors.yml delete mode 100644 bootstrap/net.yml delete mode 100644 bootstrap/vcs.yml delete mode 100644 bootstrap/x11-themes.yml delete mode 100644 bootstrap/xorg.yml diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index a9d42f85791..00000000000 --- a/Dockerfile +++ /dev/null @@ -1,53 +0,0 @@ -FROM ubuntu:latest -WORKDIR /opt/workdir -# Cargo executables are installed here: -ENV PATH="$PATH:/home/workuser/.cargo/bin" -# Python executables are installed here: -ENV PATH="$PATH:/home/workuser/.local/bin" - -RUN apt-get update -RUN apt-get install -y \ - autopoint \ - bash \ - binutils \ - bison \ - cmake \ - coreutils \ - curl \ - expat \ - flex \ - gcc \ - gettext \ - git \ - gperf \ - groff \ - gzip \ - help2man \ - libgmp-dev \ - m4 \ - make \ - mercurial \ - meson \ - mtools \ - nasm \ - openssl \ - patch \ - perl \ - python3 \ - python3-mako \ - python3-pip \ - rsync \ - subversion \ - tar \ - texinfo \ - wget \ - xcb-proto \ - xorriso \ - xsltproc \ - xz-utils -RUN useradd -m workuser - -USER workuser -RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y -RUN python3 -m pip install requests xbstrap -ENTRYPOINT python3 aero.py --no-run \ No newline at end of file diff --git a/aero.py b/aero.py deleted file mode 100755 index a7123bee96f..00000000000 --- a/aero.py +++ /dev/null @@ -1,674 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (C) 2021-2024 The Aero Project Developers. -# -# This file is part of The Aero Project. -# -# Aero is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Aero is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Aero. If not, see . - -import argparse -import json -import os -import platform -import shutil -import subprocess -import sys -import time - - -def log_info(msg): - """ - Logs a message with info log level. - """ - print(f"\033[1m\033[92minfo\033[0m: {msg}") - - -def log_error(msg): - """ - Logs a message with error log level. - """ - print(f"\033[1m\033[91merror\033[0m: {msg}") - - -# Make sure requests is installed -try: - import requests - import xbstrap -except ImportError: - log_error('Please install required libraries using the following command:') - log_error(' - python3 -m pip install requests xbstrap') - - sys.exit(0) - - -OVMF_URL = 'https://github.com/aero-os/ovmf-prebuilt' -LIMINE_URL = 'https://github.com/limine-bootloader/limine' - -BUILD_DIR = 'build' -BUNDLED_DIR = 'bundled' -SYSROOT_DIR = 'sysroot' -EXTRA_FILES = 'extra-files' -SYSROOT_CARGO_HOME = os.path.join(SYSROOT_DIR, 'cargo-home') -BASE_FILES_DIR = 'base-files' - -LIMINE_TEMPLATE = """ -TIMEOUT=0 -VERBOSE=yes - -:aero -PROTOCOL=limine -KASLR=no -KERNEL_PATH=boot:///aero.elf -CMDLINE=term-background=background theme-background=0x50000000 -#RESOLUTION=1920x1080 - -MODULE_PATH=boot:///term_background.bmp -MODULE_CMDLINE=background -""" - - -class BuildInfo: - args: argparse.Namespace - target_arch: str - - def __init__(self, target_arch: str, args: argparse.Namespace): - self.target_arch = target_arch - self.args = args - - -def get_userland_tool(): return os.path.join(SYSROOT_DIR, "tools") -def get_userland_package(): return os.path.join(SYSROOT_DIR, "packages") - - -def remove_prefix(string: str, prefix: str): - if string.startswith(prefix): - return string[len(prefix):] - else: - return string[:] - - -def parse_args(): - parser = argparse.ArgumentParser( - description="utility used to build aero kernel and userland") - - check_test = parser.add_mutually_exclusive_group() - - check_test.add_argument('--clean', - default=False, - action='store_true', - help='removes the build artifacts') - - check_test.add_argument('--check', - default=False, - action='store_true', - help='checks if aero builds correctly without packaging and running it') - - check_test.add_argument('--test', - default=False, - action='store_true', - help='runs the aero test suite') - - check_test.add_argument('--document', - default=False, - action='store_true', - help='generates the documentation for the aero kernel') - - parser.add_argument('--debug', - default=False, - action='store_true', - help='builds the kernel and userland in debug mode') - - parser.add_argument('--no-run', - default=False, - action='store_true', - help='doesn\'t run the built image in emulator when applicable') - - parser.add_argument('--only-run', - default=False, - action='store_true', - help='runs aero without rebuilding. ignores any build-related flags') - - parser.add_argument('--bios', - type=str, - default='legacy', - choices=['legacy', 'uefi'], - help='run aero using the selected BIOS') - - parser.add_argument('--features', - type=lambda x: x.split(','), - default=[], - help='additional features to build the kernel with') - - parser.add_argument('--target', - default='x86_64-aero_os', - help='override the target triple the kernel will be built for') - - parser.add_argument('--la57', - default=False, - action='store_true', - help='run emulator with 5 level paging support') - - parser.add_argument('--sysroot', - default=False, - action='store_true', - help='build the full userland sysroot. If disabled, then the sysroot will only contain the aero_shell and the init binaries') - - parser.add_argument('--disable-kvm', - default=False, - action='store_true', - help='disable KVM acceleration even if its available') - - parser.add_argument('remaining', - nargs=argparse.REMAINDER, - help='additional arguments to pass as the emulator') - - parser.add_argument('--memory', - default='9800M', - help='amount of memory to allocate to QEMU') - - parser.add_argument('--fmt', - default=False, - action='store_true', - help='format the source code') - - return parser.parse_args() - - -def run_command(args, **kwargs): - output = subprocess.run(args, **kwargs) - - return output.returncode, output.stdout, output.stderr - - -def download_bundled(): - if not os.path.exists(BUNDLED_DIR): - os.makedirs(BUNDLED_DIR) - - ovmf_path = os.path.join(BUNDLED_DIR, 'ovmf') - limine_path = os.path.join(BUNDLED_DIR, 'limine') - - if not os.path.exists(ovmf_path): - run_command(['git', 'clone', '--depth', '1', OVMF_URL, ovmf_path]) - - if not os.path.exists(limine_path): - run_command(['git', 'clone', '--branch', 'v4.x-branch-binary', - '--depth', '1', LIMINE_URL, limine_path]) - - if not os.path.exists(SYSROOT_DIR): - log_info("building minimal sysroot") - build_userland_sysroot(True) - - -def extract_artifacts(stdout): - result = [] - lines = stdout.splitlines() - - for line in lines: - info = json.loads(line) - executable = info['executable'] if 'executable' in info else None - - if executable: - result.append(info['executable']) - - return result - - -def build_cargo_workspace(cwd, command, args, cargo="cargo"): - code, _, _ = run_command([cargo, command, *args], cwd=cwd) - - if code != 0: - return None - - _, stdout, _ = run_command([cargo, command, *args, '--message-format=json'], - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - cwd=cwd) - - return extract_artifacts(stdout) - - -def build_kernel(args): - command = 'build' - cmd_args = ['--package', 'aero_kernel', - '--target', f'.cargo/{args.target}.json'] - - if not args.debug: - cmd_args += ['--release'] - - if args.test: - command = 'test' - cmd_args += ['--no-run'] - elif args.check: - command = 'check' - elif args.document: - command = 'doc' - - if args.features: - cmd_args += ['--features', ','.join(args.features)] - - return build_cargo_workspace('src', command, cmd_args) - - -# Helper function for symlink since os.symlink uses path -# relative to the destination directory. -def symlink_rel(src, dst): - rel_path_src = os.path.relpath(src, os.path.dirname(dst)) - os.symlink(rel_path_src, dst) - - -def build_userland_sysroot(minimal): - if not os.path.exists(SYSROOT_DIR): - os.mkdir(SYSROOT_DIR) - - # FIXME(xbstrap): xbstrap does not copy over the extra-files/rust/config.toml - # file into the cargo home directory. - if not os.path.exists(SYSROOT_CARGO_HOME): - os.mkdir(SYSROOT_CARGO_HOME) - - cargo_sys_cfg = os.path.join(SYSROOT_CARGO_HOME, 'config.toml') - if not os.path.exists(cargo_sys_cfg): - cargo_cfg_fd = open(os.path.join( - EXTRA_FILES, 'rust', 'config.toml'), 'r') - cargo_cfg = cargo_cfg_fd.read() - cargo_cfg_fd.close() - - cargo_cfg = cargo_cfg.replace("@SOURCE_ROOT@", os.getcwd()) - cargo_cfg = cargo_cfg.replace( - "@BUILD_ROOT@", os.path.join(os.getcwd(), SYSROOT_DIR)) - - cargo_cfg_fd = open(cargo_sys_cfg, "w+") - cargo_cfg_fd.write(cargo_cfg) - cargo_cfg_fd.close() - - blink = os.path.join(SYSROOT_DIR, 'bootstrap.link') - - if not os.path.islink(blink): - # symlink the bootstrap.yml file in the src root to sysroot/bootstrap.link - symlink_rel('bootstrap.yml', blink) - - def run_xbstrap(args): - try: - return run_command(['xbstrap', *args], cwd=SYSROOT_DIR) - except FileNotFoundError: - return run_command([f'{os.environ["HOME"]}/.local/bin/xbstrap', *args], cwd=SYSROOT_DIR) - - command = ['install', '-u', '--all'] - - if minimal: - command = ['install', '-u', 'bash', 'coreutils'] - - code, _, _ = run_xbstrap(command) - - if code != 0: - log_error( - f"`xbstrap {' '.join(command)}` exited with a non-zero status code") - exit(1) - - -def build_userland(args): - # We need to check if we have host-rust in-order for us to build - # our rust userland applications in `userland/`. - host_cargo = os.path.join(SYSROOT_DIR, "tools/host-rust") - - if not os.path.exists(host_cargo): - log_error( - "host-rust not built as a part of the sysroot, skipping compilation of `userland/`") - return [] - - HOST_RUST = "host-rust/bin/rustc" - HOST_GCC = "host-gcc/bin/x86_64-aero-gcc" - HOST_BINUTILS = "host-binutils/x86_64-aero/bin" - PACKAGE_MLIBC = "mlibc" - - tool_dir = get_userland_tool() - pkg_dir = get_userland_package() - - def get_rustc(): return os.path.join('..', tool_dir, HOST_RUST) - def get_gcc(): return os.path.join('..', tool_dir, HOST_GCC) - def get_binutils(): return os.path.join("..", tool_dir, HOST_BINUTILS) - def get_mlibc(): return os.path.join("..", pkg_dir, PACKAGE_MLIBC) - - command = 'build' - # TODO: handle the unbased architectures. - cmd_args = ["--target", "x86_64-unknown-aero", - - # cargo config - "--config", f"build.rustc = '{get_rustc()}'", - "--config", "build.target = 'x86_64-unknown-aero'", - "--config", f"build.rustflags = ['-C', 'link-args=-no-pie -B {get_binutils()} --sysroot {get_mlibc()}', '-lc']", - "--config", f"target.x86_64-unknown-aero.linker = '{get_gcc()}'", - - "-Z", "unstable-options"] - - if not args.debug: - cmd_args += ['--release'] - - if args.check: - command = 'check' - - if args.test: - return build_cargo_workspace('userland', 'build', ['--package', 'utest', *cmd_args]) - else: - return build_cargo_workspace('userland', command, cmd_args) - - # TODO: Userland check - # elif args.check: - # command = 'check' - - -def generate_docs(args): - doc_dir = os.path.join('src', 'target', args.target, 'doc') - out_dir = os.path.join(BUILD_DIR, 'web') - - if os.path.exists(out_dir): - shutil.rmtree(out_dir) - - shutil.copytree('web', out_dir, dirs_exist_ok=True) - shutil.copytree(doc_dir, out_dir, dirs_exist_ok=True) - - -def prepare_iso(args, kernel_bin, user_bins): - log_info("preparing ISO") - - if not os.path.exists(BUILD_DIR): - os.makedirs(BUILD_DIR) - - iso_path = os.path.join(BUILD_DIR, 'aero.iso') - iso_root = os.path.join(BUILD_DIR, 'iso_root') - limine_path = os.path.join(BUNDLED_DIR, 'limine') - - if os.path.exists(iso_root): - shutil.rmtree(iso_root) - - os.makedirs(iso_root) - - shutil.copy(kernel_bin, os.path.join(iso_root, 'aero.elf')) - shutil.copy(os.path.join('src', '.cargo', 'term_background.bmp'), iso_root) - shutil.copy(os.path.join(limine_path, 'limine.sys'), iso_root) - shutil.copy(os.path.join(limine_path, 'limine-cd.bin'), iso_root) - shutil.copy(os.path.join(limine_path, 'limine-cd-efi.bin'), iso_root) - - efi_boot = os.path.join(iso_root, "EFI", "BOOT") - os.makedirs(efi_boot) - - shutil.copy(os.path.join(limine_path, 'BOOTAA64.EFI'), efi_boot) - shutil.copy(os.path.join(limine_path, 'BOOTX64.EFI'), efi_boot) - - sysroot_dir = os.path.join(SYSROOT_DIR, 'system-root') - for file in user_bins: - bin_name = os.path.basename(file) - dest_dir = os.path.join(sysroot_dir, "usr", "bin") - os.makedirs(dest_dir, exist_ok=True) - shutil.copy(file, os.path.join(dest_dir, bin_name)) - - with open(os.path.join(iso_root, 'limine.cfg'), 'w') as limine_cfg: - limine_cfg.write(LIMINE_TEMPLATE) - - code, _, xorriso_stderr = run_command([ - 'xorriso', '-as', 'mkisofs', '-b', 'limine-cd.bin', '-no-emul-boot', '-boot-load-size', '4', - '-boot-info-table', '--efi-boot', 'limine-cd-efi.bin', '-efi-boot-part', - '--efi-boot-image', '--protective-msdos-label', iso_root, '-o', iso_path - ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - if code != 0: - log_error('failed to create the ISO image') - log_error(xorriso_stderr.decode('utf-8')) - - return None - - limine_deploy = os.path.join(limine_path, 'limine-deploy') - - if not os.path.exists(limine_deploy): - code, _, limine_build_stderr = run_command(['make', '-C', limine_path], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - if code != 0: - log_error('failed to build `limine-deploy`') - log_error(limine_build_stderr.decode('utf8')) - exit(1) - - code, _, limine_deploy_stderr = run_command([limine_deploy, iso_path], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - - if code != 0: - log_error('failed to install Limine') - log_error(limine_deploy_stderr) - - return None - - # create the disk image - disk_path = os.path.join(BUILD_DIR, 'disk.img') - - if not os.path.exists(disk_path): - log_info('creating disk image') - os.system('bash ./tools/mkimage.sh') - - return iso_path - - -def run_in_emulator(build_info: BuildInfo, iso_path): - is_kvm_available = is_kvm_supported() - args = build_info.args - - qemu_args = ['-cdrom', iso_path, - '-m', args.memory, - '-smp', '1', - '-serial', 'stdio', - '-drive', 'file=build/disk.img,if=none,id=NVME1,format=raw', '-device', 'nvme,drive=NVME1,serial=nvme', - # Specify the boot order (where `d` is the first CD-ROM drive) - '--boot', 'd', - '-s'] - - if args.bios == 'uefi': - qemu_args += ['-bios', - f'bundled/ovmf/ovmf-{build_info.target_arch}/OVMF.fd'] - - cmdline = args.remaining - - if '--' in cmdline: - cmdline.remove('--') - - if cmdline: - qemu_args += cmdline - - if is_kvm_available and not args.disable_kvm: - log_info("running with KVM acceleration enabled") - - if platform.system() == 'Darwin': - qemu_args += ['-accel', 'hvf', '-cpu', - 'qemu64,+la57' if args.la57 else 'qemu64'] - else: - qemu_args += ['-enable-kvm', '-cpu', - 'host,+la57' if args.la57 else 'host'] - else: - if build_info.target_arch == "aarch64": - qemu_args += ['-device', 'ramfb', - '-M', 'virt', '-cpu', 'cortex-a72'] - elif build_info.target_arch == "x86_64": - qemu_args += ["-cpu", "qemu64,+la57" if args.la57 else "max"] - else: - log_error("unknown target architecture") - exit(1) - - qemu_binary = os.getenv("QEMU_PATH") - if not qemu_binary: - qemu_binary = f'qemu-system-{build_info.target_arch}' - else: - qemu_binary = os.path.join( - qemu_binary, f'qemu-system-{build_info.target_arch}') - - log_info(f"{qemu_binary} {' '.join(qemu_args)}") - run_command([qemu_binary, *qemu_args]) - - -def get_sysctl(name: str) -> str: - """ - Shell out to sysctl(1) - - Returns the value as a string. - Non-leaf nodes will return the value for each sub-node separated by newline characters. - """ - status, stdout, stderr = run_command(["sysctl", "-n", name], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - if status != 0: - print("`sysctl` failed: ", end="") - print(stderr.decode()) - - return stdout.strip().decode() - - -def is_kvm_supported() -> bool: - """ - Returns True if KVM is supported on this machine - """ - - platform = sys.platform - - if platform == "darwin": - # Check for VMX support - cpu_features = get_sysctl("machdep.cpu.features") - vmx_support = "VMX" in cpu_features.split(' ') - - # Check for HVF support - hv_support = get_sysctl("kern.hv_support") == "1" - - return hv_support and vmx_support - - if platform == "linux": - kvm_path = "/dev/kvm" - - # Check if the `/dev/kvm` device exists. - if not os.path.exists(kvm_path): - return False - - # Read out the cpuinfo from `/proc/cpuinfo` - fd = open("/proc/cpuinfo") - cpuinfo = fd.read() - - # Parse the cpuinfo - cpuinfo_array = cpuinfo.split("\n\n") - processors_info = [] - - for cpu in cpuinfo_array: - ret = {} - for line in cpu.split("\n"): - try: - name, value = line.split(":") - - name = name.strip() - value = value.strip() - - ret[name] = value - except ValueError: - pass - - processors_info.append(ret) - - for processor in processors_info: - if processor["processor"] == "0": - # KVM acceleration can be used - if "vmx" in processor["flags"]: - return True - # KVM acceleration cannot be used - else: - return False - - fd.close() - - # KVM is not available on Windows - return False - - -def main(): - args = parse_args() - - if args.fmt: - run_command(['cargo', 'fmt'], cwd="src") - return - - if os.path.exists(BUILD_DIR): - system_root = os.path.join(SYSROOT_DIR, 'system-root') - sysroot_mod = max(os.path.getmtime(os.path.join(system_root, file)) - for file in os.listdir(system_root)) - build_mod = os.path.getmtime(BUILD_DIR) - if sysroot_mod > build_mod: - log_info("sysroot modified, rebuilding") - os.rmdir(BUILD_DIR) - - t0 = time.time() - # arch-aero_os - target_arch = args.target.split('-')[0] - build_info = BuildInfo(target_arch, args) - - if build_info.target_arch == "aarch64" and not args.bios == "uefi": - log_error("aarch64 requires UEFI (help: run again with `--bios=uefi`)") - return - - if not args.document: - download_bundled() - - if args.only_run: - iso_path = os.path.join(BUILD_DIR, 'aero.iso') - - if not os.path.exists(iso_path): - user_bins = build_userland(args) - kernel_bin = build_kernel(args) - - if not kernel_bin or args.check: - return - - kernel_bin = kernel_bin[0] - iso_path = prepare_iso(args, kernel_bin, user_bins) - run_in_emulator(build_info, iso_path) - elif args.clean: - src_target = os.path.join('src', 'target', args.target) - userland_target = os.path.join('userland', 'target') - - if os.path.exists(src_target): - shutil.rmtree(src_target) - - if os.path.exists(userland_target): - shutil.rmtree(userland_target) - elif args.sysroot: - build_userland_sysroot(False) - elif args.document: - build_kernel(args) - - generate_docs(args) - else: - user_bins = build_userland(args) - kernel_bin = build_kernel(args) - - if not kernel_bin or args.check: - return - - if not user_bins: - user_bins = [] - - kernel_bin = kernel_bin[0] - iso_path = prepare_iso(args, kernel_bin, user_bins) - - t1 = time.time() - log_info(f"build completed in {t1 - t0:.2f} seconds") - if not args.no_run: - run_in_emulator(build_info, iso_path) - - -if __name__ == '__main__': - try: - main() - except KeyboardInterrupt: - pass diff --git a/bootstrap.yml b/bootstrap.yml deleted file mode 100644 index 9b8c3f297d0..00000000000 --- a/bootstrap.yml +++ /dev/null @@ -1,2647 +0,0 @@ -imports: - - file: bootstrap/xorg.yml - - file: bootstrap/x11-themes.yml - - file: bootstrap/net.yml - - file: bootstrap/vcs.yml - - file: bootstrap/db.yml - - file: bootstrap/editors.yml - - file: bootstrap/app-misc.yml - -general: - cargo: - config_toml: 'extra-files/rust/config.toml' - -sources: - - name: binutils - subdir: 'bundled' - git: 'git://sourceware.org/git/binutils-gdb.git' - tag: 'binutils-2_37' - version: '2.37' - patch-path-strip: 1 - - - name: gcc - subdir: 'bundled' - git: 'git://gcc.gnu.org/git/gcc.git' - tag: 'releases/gcc-13.2.0' - patch-path-strip: 1 - version: '13.2.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - regenerate: - # download_prerequisites should probably move to some "post_checkout" step. - - args: ['./contrib/download_prerequisites'] - workdir: '@THIS_SOURCE_DIR@' - - args: ['autoconf'] - workdir: '@THIS_SOURCE_DIR@/gcc' - - args: ['autoconf'] - workdir: '@THIS_SOURCE_DIR@/libstdc++-v3' - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/gmp-6.2.1/configfsf.sub'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/isl-0.24/config.sub'] - - args: ['cp', '-f', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/mpc-1.2.1/config.sub'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/mpfr-4.1.0/config.sub'] - - - name: mlibc - subdir: 'bundled' - git: 'https://github.com/aero-os/mlibc' - branch: 'master' - - - name: tzcode - subdir: 'bundled' - url: 'https://data.iana.org/time-zones/releases/tzcode2022a.tar.gz' - format: 'tar.gz' - version: '2022a' - - - name: tzdata - subdir: 'bundled' - sources_required: ['tzcode'] - url: 'https://data.iana.org/time-zones/releases/tzdata2022a.tar.gz' - format: 'tar.gz' - version: '2022a' - regenerate: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/../tzcode/.', '@THIS_SOURCE_DIR@/'] - - - name: rust - subdir: 'bundled' - git: 'https://github.com/aero-os/rust.git' - branch: 'master' - commit: 'dee2030a44019048171c03d7ddcb134b945df8c5' - - - name: llvm - subdir: 'bundled' - git: 'https://github.com/llvm/llvm-project.git' - tag: 'llvmorg-17.0.3' - version: '17.0.3' - - - name: glib - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/glib.git' - tag: '2.74.7' - version: '2.74.7' - - # --------------------------------------------------------------------------- - # Rust patched crates start - # --------------------------------------------------------------------------- - - name: rust-libc - subdir: 'bundled' - git: 'https://github.com/Andy-Python-Programmer/libc.git' - commit: 'fe4e9cda46b0be8421b0f56df0b63b8c4dcaf5e6' - branch: 'master' - - - name: rust-num-cpus - subdir: 'bundled' - git: 'https://github.com/seanmonstar/num_cpus.git' - tag: 'v1.15.0' - version: '1.15.0' - - - name: rust-users - subdir: 'bundled' - git: 'https://github.com/ogham/rust-users.git' - tag: 'v0.11.0' - version: '0.11.0' - - - name: rust-winit - subdir: 'bundled' - git: 'https://github.com/rust-windowing/winit.git' - tag: 'v0.26.1' - version: '0.26.1' - - - name: rust-mio-0.8 - subdir: 'bundled' - git: 'https://github.com/tokio-rs/mio.git' - tag: 'v0.8.3' - version: '0.8.3' - - - name: rust-nix - subdir: 'bundled' - git: 'https://github.com/nix-rust/nix.git' - tag: 'v0.22.3' - version: '0.22.3' - - - name: rust-mio-0.6 - subdir: 'bundled' - git: 'https://github.com/tokio-rs/mio.git' - tag: 'v0.6.23' - version: '0.6.23' - - - name: rust-glutin - subdir: 'bundled' - git: 'https://github.com/rust-windowing/glutin.git' - tag: 'v0.28.0' - version: '0.28.0' - - - name: rust-shared-library - subdir: 'bundled' - git: 'https://github.com/tomaka/shared_library.git' - commit: 'f09e038246a559650c8505b3b3831b820d1a5689' - branch: 'master' - version: '0.1.9' - - - name: rust-libloading - subdir: 'bundled' - git: 'https://github.com/nagisa/rust_libloading.git' - tag: '0.7.3' - version: '0.7.3' - - - name: rust-getrandom - subdir: 'bundled' - git: 'https://github.com/rust-random/getrandom.git' - tag: 'v0.2.9' - version: '0.2.9' - - - name: rust-rustix - subdir: 'bundled' - git: 'https://github.com/bytecodealliance/rustix' - branch: 'main' - # For some reason they do not have a release tag for the latest release. Bruh momento. - commit: '2eedbb2fa1e18a11f44df10fa41ef82a6756caf3' - - - name: rust-patched-libs - subdir: 'bundled' - sources_required: - - name: rust-libc - recursive: true - - name: rust-num-cpus - recursive: true - - name: rust-users - recursive: true - - name: rust-winit - recursive: true - - name: rust-shared-library - recursive: true - - name: rust-mio-0.8 - recursive: true - - name: rust-mio-0.6 - recursive: true - - name: rust-nix - recursive: true - - name: rust-glutin - recursive: true - - name: rust-libloading - recursive: true - - name: rust-getrandom - recursive: true - - name: rust-rustix - recursive: true - # --------------------------------------------------------------------------- - # Rust patched crates end - # --------------------------------------------------------------------------- - - - name: python - subdir: 'bundled' - patch-path-strip: 1 - git: 'https://github.com/python/cpython.git' - tag: 'v3.8.2' - version: '3.8.2' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - regenerate: - - args: ['autoreconf', '-f', '-i'] - - - name: 'pkg-config' - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/pkg-config/pkg-config.git' - tag: 'pkg-config-0.29.2' - version: '0.29.2' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - - # - name: wayland - # subdir: 'bundled' - # git: 'https://github.com/wayland-project/wayland.git' - # tag: '1.20.0' - # version: '1.20.0' - - - name: libxtrans - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxtrans.git' - tag: 'xtrans-1.4.0' - version: '1.4.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - - - name: icu - subdir: 'bundled' - git: 'https://github.com/unicode-org/icu.git' - tag: 'release-73-2' - version: '73.2' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/icu4c/source'] - -tools: - - name: host-glib - exports_aclocal: true - from_source: glib - configure: - - args: - - 'meson' - - '--prefix=@PREFIX@' - - '--libdir=lib' - - '@THIS_SOURCE_DIR@' - compile: - - args: ['ninja'] - install: - - args: ['ninja', 'install'] - - - name: host-cmake - source: - subdir: 'bundled' - git: 'https://gitlab.kitware.com/cmake/cmake.git' - tag: 'v3.24.2' - version: '3.24.2' - configure: - - args: - - '@THIS_SOURCE_DIR@/bootstrap' - - '--prefix=@PREFIX@' - - '--parallel=@PARALLELISM@' - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install'] - - args: ['ln', '-sf', '@SOURCE_ROOT@/userland/aero.cmake', '@PREFIX@/share/cmake-3.24/Modules/Platform/'] - - # We could run an external pkg-config; however, we need the aclocal files. - # The easiest way to ensure that they are available is to just install pkg-config. - - name: host-pkg-config - exports_aclocal: true - from_source: pkg-config - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - - '--with-internal-glib' - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install'] - - - name: host-autoconf-v2.69 - source: - name: autoconf-v2.69 - subdir: 'bundled' - url: 'https://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz' - format: 'tar.xz' - extract_path: 'autoconf-2.69' - patch-path-strip: 3 - version: '2.69' - configure: - - args: ['@THIS_SOURCE_DIR@/configure', '--prefix=@PREFIX@'] - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install'] - - - - name: host-autoconf-v2.13 - source: - name: autoconf-v2.13 - subdir: 'bundled' - url: 'https://ftp.gnu.org/gnu/autoconf/autoconf-2.13.tar.gz' - format: 'tar.gz' - extract_path: 'autoconf-2.13' - patch-path-strip: 3 - version: '2.13' - configure: - - args: ['@THIS_SOURCE_DIR@/configure', '--prefix=@PREFIX@'] - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install'] - - - name: host-automake-v1.16 - source: - name: automake-v1.16 - subdir: 'bundled' - git: 'https://github.com/autotools-mirror/automake' - tag: 'v1.16.5' - version: '1.16.5' - tools_required: - - host-autoconf-v2.69 - regenerate: - - args: ['./bootstrap'] - tools_required: - - host-autoconf-v2.69 - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - compile: - - args: | - set -e - export PATH="`pwd`/bin:$PATH" - make bin/aclocal-1.16 bin/automake-1.16 -j@PARALLELISM@ - make -j@PARALLELISM@ - install: - - args: ['make', 'install-strip'] - - args: ['ln', '-sf', '@PREFIX@/share/aclocal-1.16', '@PREFIX@/share/aclocal'] - - - name: host-autoconf-archive - exports_aclocal: true - source: - subdir: 'bundled' - git: 'https://github.com/autoconf-archive/autoconf-archive.git' - tag: 'v2019.01.06' - version: '2019.01.06' - install: - - args: ['mkdir', '-p', '@BUILD_ROOT@/tools/host-autoconf-archive/share/'] - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/m4', '@BUILD_ROOT@/tools/host-autoconf-archive/share/aclocal'] - - - name: host-rust - from_source: rust - tools_required: - - host-llvm - sources_required: - - rust-patched-libs - compile: - - args: | - cat << EOF > config.toml - change-id = 115898 - - [llvm] - download-ci-llvm = false - targets = "X86" - - [build] - target = ["x86_64-unknown-aero", "x86_64-unknown-linux-gnu"] - build-dir = "@THIS_BUILD_DIR@" - docs = false - - [install] - prefix = "@PREFIX@" - sysconfdir = "@PREFIX@/etc" - - [rust] - codegen-tests = false - deny-warnings = false # work around rust-num-cpus warning - - [target.x86_64-unknown-linux-gnu] - llvm-config = "@BUILD_ROOT@/tools/host-llvm/bin/llvm-config" - - [target.x86_64-unknown-aero] - llvm-config = "@BUILD_ROOT@/tools/host-llvm/bin/llvm-config" - EOF - - args: ['python3', '@THIS_SOURCE_DIR@/x.py', 'build', '--stage', '2', '-j', '@PARALLELISM@'] - install: - - args: ['python3', '@THIS_SOURCE_DIR@/x.py', 'install', '-j', '@PARALLELISM@'] - - # - name: host-cargo - # source: - # subdir: 'bundled' - # git: 'https://github.com/rust-lang/cargo.git' - # tag: '0.61.0' - # version: '0.61.0' - # tools_required: - # - tool: host-rust - # recursive: true - # - tool: host-gcc # GCC is used for linking - # recursive: true - # sources_required: - # # This cargo runs on the host, so we don't actually need any patches here. We just - # # add the sources used by cargo so that the dependency resolver doesn't complain. - # - rust-patched-libs - # - host-bootstrap-cargo - # compile: - # - args: - # - 'cargo' - # - 'install' - # - '--target' - # - 'x86_64-unknown-linux-gnu' - # - '--target-dir' - # - '@THIS_BUILD_DIR@' - # - '--path' - # - '@THIS_SOURCE_DIR@' - # - '-j@PARALLELISM@' - # - '--root' - # - '@PREFIX@' - - - name: host-python - from_source: python - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install'] - - - name: host-icu - from_source: icu - configure: - - args: - - '@THIS_SOURCE_DIR@/icu4c/source/configure' - - '--prefix=@PREFIX@' - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install'] - - - name: host-binutils - from_source: binutils - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - - '--target=x86_64-aero' - - '--with-sysroot=@SYSROOT_DIR@' - # On recent compilers, binutils 2.26 causes implicit-fallthrough warnings, among others. - - '--disable-werror' - - '--enable-targets=x86_64-elf,x86_64-pe' - # -g blows up the binary size. - - 'CFLAGS=-pipe' - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install'] - - - name: host-gcc - from_source: gcc - tools_required: - - tool: host-binutils - recursive: true - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - - '--target=x86_64-aero' - - '--with-sysroot=@SYSROOT_DIR@' - - '--enable-languages=c,c++' - - '--disable-multilib' - - '--enable-initfini-array' - # -g blows up GCC's binary size. - - 'CFLAGS=-O2 -pipe' - - 'CXXFLAGS=-O2 -pipe' - stages: - - name: compiler - pkgs_required: - - mlibc-headers - compile: - - args: ['make', '-j@PARALLELISM@', 'all-gcc'] - install: - - args: ['make', 'install-gcc'] - # GCC does *not* look for target-prefixed LD/AS. - # Instead, it searches a list of prefix directories. Link AS/LD to make it happy. - - args: ['mkdir', '-p', '@PREFIX@/x86_64-aero/bin'] - - args: ['ln', '-sf', '../../../host-binutils/x86_64-aero/bin/as', - '@PREFIX@/x86_64-aero/bin/as'] - - args: ['ln', '-sf', '../../../host-binutils/x86_64-aero/bin/ld', - '@PREFIX@/x86_64-aero/bin/ld'] - - name: libgcc - tools_required: - - tool: host-gcc - stage_dependencies: [compiler] - pkgs_required: - - mlibc - compile: - - args: ['make', '-j@PARALLELISM@', 'all-target-libgcc'] - install: - - args: ['make', 'install-strip-target-libgcc'] - - - name: libstdc++ - tools_required: - - tool: host-gcc - stage_dependencies: [libgcc] - compile: - - args: ['make', '-j@PARALLELISM@', 'all-target-libstdc++-v3'] - install: - - args: ['make', 'install-strip-target-libstdc++-v3'] - - - name: bootstrap-host-gcc - from_source: gcc - tools_required: - - tool: host-binutils - recursive: true - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - - '--target=x86_64-aero' - - '--with-sysroot=@SYSROOT_DIR@' - - '--enable-languages=c,c++' - - '--disable-multilib' - - '--disable-shared' - - '--enable-initfini-array' - # -g blows up GCC's binary size. - - 'CFLAGS=-O2' - - 'CXXFLAGS=-O2' - stages: - - name: compiler - pkgs_required: - - mlibc-headers - compile: - # GCC complains if the include directory is non-existant. - - args: ['mkdir', '-p', '@SYSROOT_DIR@/usr/include'] - - args: ['make', '-j@PARALLELISM@', 'inhibit_libc=true', 'all-gcc'] - install: - - args: ['make', 'install-gcc'] - # GCC does *not* look for target-prefixed LD/AS. - # Instead, it searches a list of prefix directories. Link AS/LD to make it happy. - - args: ['mkdir', '-p', '@PREFIX@/x86_64-aero/bin'] - - args: ['ln', '-sf', '../../../cross-binutils/x86_64-aero/bin/as', - '@PREFIX@/x86_64-aero/bin/as'] - - args: ['ln', '-sf', '../../../cross-binutils/x86_64-aero/bin/ld', - '@PREFIX@/x86_64-aero/bin/ld'] - - - name: libgcc - tools_required: - - tool: bootstrap-host-gcc - stage_dependencies: [compiler] - compile: - - args: ['make', '-j@PARALLELISM@', 'inhibit_libc=true', 'all-target-libgcc'] - install: - - args: ['make', 'install-target-libgcc'] - - - name: host-llvm - from_source: llvm - sources_required: - - binutils - configure: - - args: - - 'cmake' - - '-GNinja' - - '-DCMAKE_INSTALL_PREFIX=@PREFIX@' - # LLVM configuration options. - # We really have to build LLVM in Release mode. - # Building it in debug mode produces tens of GiB of debugging info. - - '-DCMAKE_BUILD_TYPE=Release' - - '-DLLVM_TARGETS_TO_BUILD=X86' - - '-DLLVM_ENABLE_PROJECTS=llvm;clang;clang-tools-extra' - - '-DLLVM_ENABLE_Z3_SOLVER=OFF' - # clang configuration options. - - '-DDEFAULT_SYSROOT=@SYSROOT_DIR@' - # Gold linker configuration options. - - '-DLLVM_BINUTILS_INCDIR=@SOURCE_ROOT@/bundled/binutils/include' - - '@THIS_SOURCE_DIR@/llvm' - compile: - - args: ['ninja', '-j@PARALLELISM@'] - # Build on a single CPU to prevent OOM on smaller systems. - #- args: ['ninja', '-j1'] - install: - - args: ['ninja', 'install', '-j@PARALLELISM@'] - # quiet: true - - - name: host-libtool - exports_aclocal: true - source: - name: libtool - subdir: 'bundled' - git: 'https://git.savannah.gnu.org/git/libtool.git' - tag: 'v2.4.6' - version: '2.4.6' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - regenerate: - # libtool's ./bootstrap does a shallow clone with insufficient depth. - - args: ['git', 'submodule', 'update', '--init'] - - args: ['./bootstrap'] - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install'] - - # - name: wayland-scanner - # from_source: wayland - # tools_required: - # - virtual: pkgconfig-for-host - # program_name: host-pkg-config - # configure: - # - args: - # - 'meson' - # - '--native-file' - # - '@SOURCE_ROOT@/userland/native-file.ini' - # - '--prefix=@PREFIX@' - # - '-Ddtd_validation=false' - # - '-Ddocumentation=false' - # - '-Dscanner=true' - # - '-Dlibraries=false' - # - '@THIS_SOURCE_DIR@' - # compile: - # - args: ['ninja'] - # install: - # - args: ['ninja', 'install'] - -packages: - - name: llvm - from_source: llvm - tools_required: - - host-cmake - - host-gcc - pkgs_required: - - mlibc - - zlib - configure: - - args: - - 'cmake' - - '-GNinja' - - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.cmake' - - '-DCMAKE_INSTALL_PREFIX=/usr' - # We really have to build LLVM in Release mode. - # Building it in debug mode produces tens of GiB of debugging info. - - '-DCMAKE_BUILD_TYPE=Release' - - '-DLLVM_LINK_LLVM_DYLIB=ON' - # RTTI affects the ABI. Hence, we enable it. - - '-DLLVM_ENABLE_RTTI=ON' - - '-DLLVM_TARGETS_TO_BUILD=X86' - - '-DLLVM_TARGET_ARCH=X86_64' - - '-DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-aero' - - '-DLLVM_HOST_TRIPLE=x86_64-aero' - # Disable linking against ncurses, which we do not build with -fPIC. - - '-DLLVM_ENABLE_TERMINFO=OFF' - # Suppress developer warnings - - '-Wno-dev' - - '@THIS_SOURCE_DIR@/llvm' - build: - - args: ['ninja', '-j@PARALLELISM@'] - - args: ['ninja', 'install/strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: alacritty - source: - subdir: 'bundled' - git: 'https://github.com/alacritty/alacritty' - tag: 'v0.10.1' - version: '0.10.1' - tools_required: - - host-rust - - host-gcc - sources_required: - - rust-patched-libs - pkgs_required: - - mlibc - - fontconfig - - freetype - - libx11 - configure: - - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] - build: - - args: ['install', '-D', '@THIS_SOURCE_DIR@/alacritty.yml', '@THIS_COLLECT_DIR@/root/.alacritty.yml'] - - args: - - 'cargo' - - 'install' - - '--no-default-features' - - '--features' - - 'x11' - - '--locked' - - '--target-dir' - - '@THIS_BUILD_DIR@' - - '--path' - - '@THIS_SOURCE_DIR@/alacritty' - - '--root' - - '@THIS_COLLECT_DIR@/usr' - - '-j@PARALLELISM@' - environ: - RUSTFLAGS: '-Cforce-frame-pointers=yes -Clink-args=-no-pie' - - - name: neofetch - source: - subdir: bundled - git: 'https://github.com/Andy-Python-Programmer/neofetch' - branch: 'master' - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - build: - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # - name: ripgrep - # source: - # subdir: bundled - # git: 'https://github.com/BurntSushi/ripgrep.git' - # tag: '12.1.1' - # version: '12.1.1' - # tools_required: - # - host-cargo - # sources_required: - # - rust-patched-libs - # pkgs_required: - # - mlibc - # configure: - # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - # # cc: https://github.com/rust-lang/cargo/issues/10283 - # # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] - # build: - # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', './Cargo.toml'] - # - args: - # - 'cargo' - # - 'install' - # - '--locked' - # - '--path' - # - '.' - # - '--root' - # - '@THIS_COLLECT_DIR@/usr' - # - '-j@PARALLELISM@' - - # - name: hex - # source: - # subdir: bundled - # git: 'https://github.com/sitkevij/hex' - # tag: 'v0.4.2' - # version: '0.4.2' - # tools_required: - # - host-cargo - # sources_required: - # - rust-patched-libs - # pkgs_required: - # - mlibc - # configure: - # # cc: https://github.com/rust-lang/cargo/issues/10283 - # # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] - # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - # build: - # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', './Cargo.toml'] - # - args: - # - 'cargo' - # - 'install' - # - '--locked' - # - '--path' - # - '.' - # - '--root' - # - '@THIS_COLLECT_DIR@/usr' - # - '-j@PARALLELISM@' - - # - name: bat - # source: - # subdir: 'bundled' - # git: 'https://github.com/sharkdp/bat' - # tag: 'v0.23.0' - # version: '0.23.0' - # tools_required: - # - host-rust - # - host-gcc - # sources_required: - # - rust-patched-libs - # pkgs_required: - # - mlibc - # configure: - # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] - # build: - # - args: - # - 'cargo' - # - 'install' - # - '--locked' - # - '--root' - # - '@THIS_COLLECT_DIR@/usr' - # - '-j@PARALLELISM@' - # - '--target-dir' - # - '@THIS_BUILD_DIR@' - # - '--path' - # - '@THIS_SOURCE_DIR@' - - - name: quickjs - source: - subdir: bundled - git: 'https://github.com/bellard/quickjs' - branch: master - commit: 'b5e62895c619d4ffc75c9d822c8d85f1ece77e5b' - tools_required: - - host-gcc - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - build: - - args: ['make', '-j@PARALLELISM@', 'CROSS_PREFIX=x86_64-aero-'] - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/bin'] - - args: ['cp', '@THIS_BUILD_DIR@/qjs', '@THIS_COLLECT_DIR@/usr/bin/qjs'] - - # - name: sd - # source: - # subdir: bundled - # git: 'https://github.com/chmln/sd' - # tag: 'v0.7.6' - # version: '0.7.6' - # tools_required: - # - host-cargo - # sources_required: - # - rust-patched-libs - # pkgs_required: - # - mlibc - # configure: - # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - # # cc: https://github.com/rust-lang/cargo/issues/10283 - # # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] - # build: - # - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', './Cargo.toml'] - # - args: - # - 'cargo' - # - 'install' - # - '--locked' - # - '--path' - # - '.' - # - '--root' - # - '@THIS_COLLECT_DIR@/usr' - # - '-j@PARALLELISM@' - - # - name: llvm - # from_source: llvm - # tools_required: - # - host-gcc - # - host-cmake - # pkgs_required: - # - mlibc - # - zlib - # revision: 3 - # configure: - # - args: - # - 'cmake' - # - '-GNinja' - # - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.txt' - # - '-DCMAKE_INSTALL_PREFIX=/usr' - # # We really have to build LLVM in Release mode. - # # Building it in debug mode produces tens of GiB of debugging info. - # - '-DCMAKE_BUILD_TYPE=Release' - # - '-DLLVM_LINK_LLVM_DYLIB=ON' - # # RTTI affects the ABI. Hence, we enable it. - # - '-DLLVM_ENABLE_RTTI=ON' - # - '-DLLVM_TARGETS_TO_BUILD=X86' - # - '-DLLVM_TARGET_ARCH=X86_64' - # - '-DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-aero' - # - '-DLLVM_HOST_TRIPLE=x86_64-aero' - # # Disable linking against ncurses, which we do not build with -fPIC. - # - '-DLLVM_ENABLE_TERMINFO=OFF' - # # Suppress developer warnings - # - '-Wno-dev' - # - '@THIS_SOURCE_DIR@/llvm' - # build: - # - args: ['ninja'] - # - args: ['ninja', 'install'] - # environ: - # DESTDIR: '@THIS_COLLECT_DIR@' - - - name: linux-headers - source: - subdir: 'bundled' - url: 'https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.8.tar.xz' - checksum: 'blake2b:1eeab95bf09757131031ebeaa3fb66f01626ecfe3b72d0044176613d027ac6643c688a0bb8f4493ae6faa3d3bf0c89fcdff3c28d7b8375e59ed6e8bd6d856e44' - extract_path: 'linux-6.1.8' - format: 'tar.xz' - version: '6.1.8' - implict_package: true - configure: - - args: ['cp', '-Tr', '@THIS_SOURCE_DIR@', '.'] - build: - - args: ['make', 'ARCH=x86_64', 'headers_install'] - - args: ['find', 'usr/include', '-type', 'f', '!', '-name', '*.h', '-delete'] - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr'] - # remove this file, as mlibc will override this file with one suited to mlibc - - args: ['rm', 'usr/include/linux/libc-compat.h'] - - args: ['cp', '-r', 'usr/include', '@THIS_COLLECT_DIR@/usr'] - - - name: mlibc-headers - from_source: mlibc - implict_package: true - pkgs_required: - - linux-headers - configure: - - args: - - 'meson' - - 'setup' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '-Dheaders_only=true' - - '-Ddisable_iconv_option=true' - - '--buildtype=release' - - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' - - '-Ddisable_intl_option=true' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: mlibc - from_source: mlibc - tools_required: - - bootstrap-host-gcc - implict_package: true - pkgs_required: - - mlibc-headers - - linux-headers - configure: - - args: - - 'meson' - - 'setup' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--libdir=lib' - - '-Dmlibc_no_headers=true' - - '-Ddisable_iconv_option=true' - - '--buildtype=debug' - - '-Dlinux_kernel_headers=@BUILD_ROOT@/packages/linux-headers/usr/include' - - '-Ddisable_intl_option=true' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libdrm - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/mesa/drm' - tag: 'libdrm-2.4.110' - version: '2.4.110' - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--libdir=lib' - - '--buildtype=debugoptimized' - - '-Dintel=false' - - '-Dvmwgfx=false' - - '-Dradeon=false' - - '-Damdgpu=false' - - '-Dnouveau=false' - - '-Dman-pages=false' - # We might want to build cairo with OpenGL support. - # Doing so would introduce a circular dependency here. - - '-Dcairo-tests=false' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: drm_test - source: - subdir: 'bundled' - # copied from https://github.com/dvdhrm/docs/tree/master/drm-howto - # - # changes: compile to the aero target instead of the linux one. - git: 'https://github.com/aero-os/drm_test' - branch: 'master' - tools_required: - - host-gcc - pkgs_required: - - libdrm - - mlibc - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - build: - - args: ['make'] - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/bin'] - - args: ['mv', 'drm', '@THIS_COLLECT_DIR@/usr/bin'] - - - name: nyancat - source: - subdir: 'bundled' - git: 'https://github.com/klange/nyancat.git' - tag: '1.5.2' - version: '1.5.2' - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - build: - - args: ['make', '-j@PARALLELISM@'] - environ: - CC: "x86_64-aero-gcc" - - args: ['mkdir', '-pv', '@THIS_COLLECT_DIR@/usr/bin'] - - args: ['mkdir', '-pv', '@THIS_COLLECT_DIR@/usr/share/man/man1'] - - args: ['cp', '-v', '@THIS_BUILD_DIR@/src/nyancat', '@THIS_COLLECT_DIR@/usr/bin'] - - args: ['cp', '-v', '@THIS_BUILD_DIR@/nyancat.1', '@THIS_COLLECT_DIR@/usr/share/man/man1'] - - - name: coreutils - source: - subdir: 'bundled' - url: 'https://ftp.gnu.org/gnu/coreutils/coreutils-8.32.tar.xz' - format: 'tar.xz' - extract_path: 'coreutils-8.32' - patch-path-strip: 3 - tools_required: - - host-gcc - configure: - # Huge hack: coreutils does not compile the build-machine binary make-prime-list - # using the build-machine compiler. Hence, build and invoke the binary manually here. - - args: - - '@THIS_SOURCE_DIR@/configure' - - args: ['make', 'src/make-prime-list'] - - args: | - ./src/make-prime-list 5000 > @THIS_SOURCE_DIR@/src/primes.h - - args: ['make', 'clean'] - # No compile coreutils for the correct target. - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - 'CFLAGS=-DSLOW_BUT_NO_HACKS -Wno-error' - - '--enable-install-program=hostname' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: tzdata - from_source: tzdata - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@/'] - build: - # Build and install support programs - - args: ['make', 'CC=x86_64-aero-gcc', 'AR=x86_64-aero-ar'] - - args: ['make', 'install', 'DESTDIR=@THIS_COLLECT_DIR@', 'ZIC=zic'] - # Create the required directories - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/etc'] - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/share/zoneinfo/posix'] - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/share/zoneinfo/right'] - # Create the time zone files without leap seconds, convention puts these in both zoneinfo and zoneinfo/posix. - # After that. create time time zone files with leap seconds - - args: | - set -e - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo "@THIS_BUILD_DIR@"/etcetera - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/posix "@THIS_BUILD_DIR@"/etcetera - zic -L "@THIS_SOURCE_DIR@"/leapseconds -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/right "@THIS_BUILD_DIR@"/etcetera - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo "@THIS_BUILD_DIR@"/southamerica - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/posix "@THIS_BUILD_DIR@"/southamerica - zic -L "@THIS_SOURCE_DIR@"/leapseconds -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/right "@THIS_BUILD_DIR@"/southamerica - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo "@THIS_BUILD_DIR@"/northamerica - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/posix "@THIS_BUILD_DIR@"/northamerica - zic -L "@THIS_SOURCE_DIR@"/leapseconds -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/right "@THIS_BUILD_DIR@"/northamerica - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo "@THIS_BUILD_DIR@"/europe - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/posix "@THIS_BUILD_DIR@"/europe - zic -L "@THIS_SOURCE_DIR@"/leapseconds -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/right "@THIS_BUILD_DIR@"/europe - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo "@THIS_BUILD_DIR@"/africa - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/posix "@THIS_BUILD_DIR@"/africa - zic -L "@THIS_SOURCE_DIR@"/leapseconds -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/right "@THIS_BUILD_DIR@"/africa - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo "@THIS_BUILD_DIR@"/antarctica - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/posix "@THIS_BUILD_DIR@"/antarctica - zic -L "@THIS_SOURCE_DIR@"/leapseconds -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/right "@THIS_BUILD_DIR@"/antarctica - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo "@THIS_BUILD_DIR@"/asia - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/posix "@THIS_BUILD_DIR@"/asia - zic -L "@THIS_SOURCE_DIR@"/leapseconds -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/right "@THIS_BUILD_DIR@"/asia - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo "@THIS_BUILD_DIR@"/australasia - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/posix "@THIS_BUILD_DIR@"/australasia - zic -L "@THIS_SOURCE_DIR@"/leapseconds -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/right "@THIS_BUILD_DIR@"/australasia - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo "@THIS_BUILD_DIR@"/backward - zic -L /dev/null -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/posix "@THIS_BUILD_DIR@"/backward - zic -L "@THIS_SOURCE_DIR@"/leapseconds -d "@THIS_COLLECT_DIR@"/usr/share/zoneinfo/right "@THIS_BUILD_DIR@"/backward - # Create the posixrules file, POSIX requires daylight saving rules to be in accordance with US rules, thus use New York - - args: ['zic', '-d', '@THIS_COLLECT_DIR@/usr/share/zoneinfo', '-p', 'America/New_York'] - # Default to UTC for localtime, this should be fixed, but that is pending xbstrap support. - - args: ['ln', '-sf', '/usr/share/zoneinfo/UTC', '@THIS_COLLECT_DIR@/etc/localtime'] - - - name: ncurses - source: - subdir: 'bundled' - git: 'https://github.com/ThomasDickey/ncurses-snapshots.git' - tag: 'v6_2' - version: '6.2' - tools_required: - - host-gcc - - host-pkg-config - pkgs_required: - - mlibc - revision: 4 - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--without-ada' - - '--enable-pc-files' - - '--with-shared' - - '--without-normal' - - '--with-manpage-format=normal' - - '--with-pkg-config-libdir=/usr/lib/pkgconfig' - - '--with-termlib' - - '--enable-widec' - - '--disable-stripping' - environ: - cf_cv_func_nanosleep: 'yes' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] - # As we build ncurses with wide character support, make some compatibility links - - args: | - for lib in ncurses form panel menu tinfo ; do - rm -vf @THIS_COLLECT_DIR@/usr/lib/lib${lib}.so - echo "INPUT(-l${lib}w)" > @THIS_COLLECT_DIR@/usr/lib/lib${lib}.so - ln -sfv ${lib}w.pc @THIS_COLLECT_DIR@/usr/lib/pkgconfig/${lib}.pc - done - rm -vf @THIS_COLLECT_DIR@/usr/lib/libcursesw.so - echo "INPUT(-lncursesw)" > @THIS_COLLECT_DIR@/usr/lib/libcursesw.so - ln -sfv libncurses.so @THIS_COLLECT_DIR@/usr/lib/libcurses.so - - - name: gcc - from_source: gcc - revision: 2 - tools_required: - - host-gcc - pkgs_required: - - mlibc - - binutils - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--target=x86_64-aero' - - '--with-sysroot=/' - - '--with-build-sysroot=@SYSROOT_DIR@' - - '--enable-languages=c,c++' - - '--enable-initfini-array' - - '--disable-multilib' - - '--disable-nls' - # -g blows up GCC's binary size. - - 'CFLAGS=-O2 -pipe' - - 'CXXFLAGS=-O2 -pipe' - build: - - args: ['make', '-j@PARALLELISM@', 'all-gcc', 'all-target-libgcc'] - - args: ['make', 'install-strip-gcc', 'install-strip-target-libgcc'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - args: ['sh', '-c', 'cp -rv @BUILD_ROOT@/tools/host-gcc/x86_64-aero/lib/* @THIS_COLLECT_DIR@/usr/lib/'] - - args: ['sh', '-c', 'cp -rv @BUILD_ROOT@/tools/host-gcc/x86_64-aero/include/* @THIS_COLLECT_DIR@/usr/include/'] - - args: ['ln', '-s', '/usr/bin/gcc', '@THIS_COLLECT_DIR@/usr/bin/cc'] - - - name: binutils - from_source: binutils - tools_required: - - host-gcc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--target=x86_64-aero' - - '--with-sysroot=/' - - '--disable-nls' - # On recent compilers, binutils 2.26 causes implicit-fallthrough warnings, among others. - - '--disable-werror' - - '--disable-gdb' - # -g blows up the binary size. - - 'CFLAGS=-pipe' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: bash - source: - git: 'https://github.com/bminor/bash' - # Checkout bash 5.1 - branch: 'master' - commit: '9439ce094c9aa7557a9d53ac7b412a23aa66e36b' - version: '5.1.16' - subdir: 'bundled' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--without-bash-malloc' - - '--disable-nls' - environ: - ac_cv_func_wcswidth: 'no' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] - - args: ['ln', '-sf', '/usr/bin/bash', '@THIS_COLLECT_DIR@/usr/bin/sh'] - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/bin'] - - args: ['ln', '-sf', '/usr/bin/bash', '@THIS_COLLECT_DIR@/bin/sh'] - - - name: tcc - source: - subdir: 'bundled' - git: 'https://github.com/aero-os/tcc' - branch: master - patch-path-strip: 3 - tools_required: - - host-gcc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--tccdir=/usr/lib/tcc' - - '--elfinterp=/usr/lib/ld.so' - - '--libpaths=/usr/lib' - - '--sysincludepaths=/usr/lib/tcc/include:/usr/include' - - '--cross-prefix=x86_64-aero-' - - '--cc=gcc' - - '--ar=ar' - - '--with-selinux' - - '--strip-binaries' - - '--prefix=/usr' - build: - - args: ['make'] - - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install-strip'] - - - name: nasm - source: - subdir: 'bundled' - url: 'http://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.xz' - format: 'tar.xz' - extract_path: 'nasm-2.14.02' - version: '2.14.02' - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - 'CFLAGS=-g -O0' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: python - from_source: python - tools_required: - - host-gcc - - host-python - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--build=x86_64-linux-gnu' - - '--prefix=/usr' - - '--enable-shared' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - - '--with-system-ffi' - - '--with-system-expat' - - '--disable-ipv6' - - '--without-ensurepip' - environ: - CONFIG_SITE: '@SOURCE_ROOT@/extra-files/python/python-config-site' - PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' - PKG_CONFIG_LIBDIR: '@BUILD_ROOT@/system-root/usr/lib/pkgconfig:@BUILD_ROOT@/system-root/usr/share/pkgconfig' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: doomgeneric - source: - subdir: 'bundled' - git: 'https://github.com/ozkl/doomgeneric.git' - branch: 'master' - commit: '2d9b24f07c78c36becf41d89db30fa99863463e5' - tools_required: - - host-gcc - pkgs_required: - - mlibc - build: - - args: ['make', '-C', '@THIS_SOURCE_DIR@/doomgeneric', '-f', 'Makefile', '-j@PARALLELISM@', 'CC=x86_64-aero-gcc'] - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/bin'] - - args: ['cp', '@THIS_SOURCE_DIR@/doomgeneric/doomgeneric', '@THIS_COLLECT_DIR@/usr/bin/doomgeneric'] - - - name: lua - source: - subdir: bundled - url: 'https://www.lua.org/ftp/lua-5.3.5.tar.gz' - format: 'tar.gz' - extract_path: 'lua-5.3.5' - version: '5.3.5' - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - - args: - - 'sed' - - '-i' - - 's|^#define LUA_ROOT "/usr/local/"$|#define LUA_ROOT "/usr/"|' - - 'src/luaconf.h' - build: - - args: - - 'make' - - 'generic' - - 'CC=x86_64-aero-gcc' - - 'AR=x86_64-aero-ar rcu' - - 'RANLIB=x86_64-aero-ranlib' - - '-j@PARALLELISM@' - - args: ['make', 'install', 'INSTALL_TOP=@THIS_COLLECT_DIR@/usr'] - - # -------------------- wayland -------------------- - # - name: wayland-protocols - # source: - # subdir: 'bundled' - # git: 'https://github.com/wayland-project/wayland-protocols.git' - # tag: '1.24' - # version: '1.24' - # tools_required: - # - host-gcc - # - wayland-scanner - # configure: - # - args: - # - 'meson' - # - '--cross-file' - # - '@SOURCE_ROOT@/userland/cross-file.ini' - # - '--prefix=/usr' - # - '--buildtype=release' - # - '-Dtests=false' - # - '@THIS_SOURCE_DIR@' - # build: - # - args: ['ninja'] - # - args: ['ninja', 'install'] - # environ: - # DESTDIR: '@THIS_COLLECT_DIR@' - # quiet: true - - - name: libexpat - source: - subdir: 'bundled' - git: 'https://github.com/libexpat/libexpat.git' - tag: 'R_2_4_1' - version: '2.4.1' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['./buildconf.sh'] - workdir: '@THIS_SOURCE_DIR@/expat' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-gcc - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/expat/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - # We disable xmlwf to avoid building its documentation. - - '--without-xmlwf' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - quiet: true - - - name: libffi - source: - subdir: 'bundled' - git: 'https://github.com/libffi/libffi.git' - tag: 'v3.4.2' - version: '3.4.2' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['./autogen.sh'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # - name: wayland - # from_source: wayland - # tools_required: - # - host-pkg-config - # - host-gcc - # - wayland-scanner - # - host-libtool - # - virtual: pkgconfig-for-target - # triple: "x86_64-aero" - # - virtual: pkgconfig-for-host - # program_name: host-pkg-config - # pkgs_required: - # - mlibc - # - libexpat - # - libffi - # configure: - # - args: - # - 'meson' - # - '--native-file' - # - '@SOURCE_ROOT@/userland/native-file.ini' - # - '--cross-file' - # - '@SOURCE_ROOT@/userland/cross-file.ini' - # - '--prefix=/usr' - # - '--buildtype=debugoptimized' - # - '-Ddtd_validation=false' - # - '-Ddocumentation=false' - # - '-Dscanner=false' - # - '@THIS_SOURCE_DIR@' - # environ: - # PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' - # build: - # - args: ['ninja'] - # - args: ['ninja', 'install'] - # environ: - # DESTDIR: '@THIS_COLLECT_DIR@' - - - name: zlib - source: - subdir: 'bundled' - git: 'https://github.com/madler/zlib.git' - tag: 'v1.2.12' - version: '1.2.12' - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - environ: - CHOST: 'x86_64-aero' - prefix: '/usr' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # zstd fast compression library - # - # This package provides the programs to interact with Zstandard compressed files. - - name: zstd - source: - subdir: bundled - git: 'https://github.com/facebook/zstd.git' - tag: 'v1.5.2' - version: '1.5.2' - tools_required: - - host-gcc - pkgs_required: - - mlibc - - zlib - - xz-utils - revision: 2 - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - build: - - args: ['make', '-j@PARALLELISM@'] - environ: - CC: 'x86_64-aero-gcc' - CXX: 'x86_64-aero-g++' - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - PREFIX: '/usr' - - # Utilities for managing LZMA compressed files - # - # This package provides the programs to compress and decompress lzma and - # xz compressed files. - - name: xz-utils - source: - subdir: 'bundled' - git: 'https://git.tukaani.org/xz.git' - tag: 'v5.2.5' - version: '5.2.5' - disable_shallow_fetch: true - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['./autogen.sh', '--no-po4a'] - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-gcc - pkgs_required: - - mlibc - - zlib - revision: 4 - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-static' - - '--disable-nls' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: openssl - source: - subdir: 'bundled' - git: 'https://github.com/openssl/openssl.git' - tag: 'OpenSSL_1_1_1o' - version: '1.1.1o' - tools_required: - - host-gcc - pkgs_required: - - mlibc - - zlib - configure: - - args: - - '@THIS_SOURCE_DIR@/Configure' - - '--prefix=/usr' - - '--openssldir=/etc/ssl' - - '--libdir=lib' - - 'x86_64-aero' - - 'shared' - - 'zlib-dynamic' - - 'no-afalgeng' - environ: - CC: 'x86_64-aero-gcc' - CXX: 'x86_64-aero-g++' - build: - - args: ['make', '-j@PARALLELISM@'] - # Disable installing static libraries - - args: ['sed', '-i', '/INSTALL_LIBS/s/libcrypto.a libssl.a//', '@THIS_BUILD_DIR@/Makefile'] - # Suffix all man pages with ssl - - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'MANSUFFIX=ssl', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - # Move the doc dir to a versioned directory - - args: ['mv', '@THIS_COLLECT_DIR@/usr/share/doc/openssl', '@THIS_COLLECT_DIR@/usr/share/doc/openssl-1.1.1o'] - - - name: libpng - source: - subdir: 'bundled' - git: 'https://git.code.sf.net/p/libpng/code' - tag: 'v1.6.37' - version: '1.6.37' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['git', 'clean', '-xf', '-e', '*.xbstrap'] - - args: ['autoreconf', '-fvi'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - - zlib - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: freetype - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/freetype/freetype.git' - tag: 'VER-2-13-0' - version: '2.13.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: '1' - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/builds/unix/'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - - libpng - - zlib - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-static' - - '--with-harfbuzz=no' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: fontconfig - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/fontconfig/fontconfig.git' - tag: '2.14.0' - version: '2.14.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - # Make sure we regenerate this file - - args: ['rm', '-f', 'src/fcobjshash.h'] - pkgs_required: - - mlibc - - freetype - - libxml - - libiconv - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-gcc - - host-libtool - - host-pkg-config - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-docs' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - - '--enable-libxml2' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libxml - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/libxml2.git' - tag: 'v2.9.14' - version: '2.9.14' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - pkgs_required: - - mlibc - - zlib - - python - - libiconv - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-python=@SYSROOT_DIR@/usr/bin/python3.8' - - '--disable-static' - - '--with-threads' - - '--disable-ipv6' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libiconv - source: - subdir: 'bundled' - git: 'https://git.savannah.gnu.org/git/libiconv.git' - # Last release tag is broken for us, use current master (07-12-2020) - branch: 'master' - commit: '0eb1068ceb77ba383c3ce2fc391ab40ef686c491' - version: '1.16' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./gitsub.sh', 'pull'] - # Gnulib broke on commit e3174b6d1fdbe6ea2297bf8c8333f65f9d9d9588, so check out the one before that. - - args: ['git', 'checkout', '766ec17a90f67e8cda78394e58a7fffb00f5a4b7'] - workdir: '@THIS_SOURCE_DIR@/gnulib' - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/build-aux/'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/libcharset/build-aux/'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-libtool/share/aclocal/libtool.m4', - '@THIS_SOURCE_DIR@/m4/'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-libtool/share/aclocal/libtool.m4', - '@THIS_SOURCE_DIR@/libcharset/m4/'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-libtool/share/libtool/build-aux/ltmain.sh', - '@THIS_SOURCE_DIR@/libcharset/build-aux/'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-libtool/share/libtool/build-aux/ltmain.sh', - '@THIS_SOURCE_DIR@/build-aux/'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-libtool/share/aclocal/ltversion.m4', - '@THIS_SOURCE_DIR@/m4/'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-libtool/share/aclocal/ltversion.m4', - '@THIS_SOURCE_DIR@/libcharset/m4/'] - - args: ['autoreconf', '-fvi', '-I@THIS_SOURCE_DIR@/m4', '-I@THIS_SOURCE_DIR@/srcm4'] - tools_required: - - host-gcc - - host-libtool - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - - '--disable-nls' - - '--enable-shared' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # Library for manipulating Unicode and C strings according to Unicode standard - # - # This package provides a library containing functions for manipulating Unicode - # strings and for manipulating C strings according to the Unicode standard. - - name: libunistring - source: - subdir: 'bundled' - url: 'https://ftp.gnu.org/gnu/libunistring/libunistring-1.0.tar.xz' - format: 'tar.xz' - checksum: blake2b:8208fe33d4ac2f015b0efb56b0c7dd87afc4bb1c6ca4eb3ded86d7e2101d7b7f68bfd8991af4b6dd408282ec73f134ee0b884e761ff6d52e8a1e398326aec420 - extract_path: 'libunistring-1.0' - version: '1.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['autoreconf', '-fvi'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - - '--disable-static' - - '--docdir=/usr/share/doc/libunistring-1.0' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # GTK+ & GNOME Accessibility Toolkit - # - # This package provides a set of accessibility interfaces used extensively througout GTK and GNOME. - - name: atk - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/atk.git' - tag: '2.38.0' - version: '2.38.0' - tools_required: - - host-gcc - - host-pkg-config - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - glib - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--libdir=lib' - - '--buildtype=debugoptimized' - - '-Dintrospection=false' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: cairo - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/cairo/cairo.git' - tag: '1.17.6' - version: '1.17.6' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - pkgs_required: - - mlibc - - freetype - - fontconfig - - libpng - - pixman - - libxcb - - libx11 - - libxext - - mesa - - libxrender - - glib - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - - '--enable-xlib-xcb' - - '--enable-xml' - - '--enable-tee' - - '--enable-gl' - environ: - # freetype-config does not support cross-compilation. - FREETYPE_CONFIG: 'no' - PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' - PKG_CONFIG_LIBDIR: '@BUILD_ROOT@/system-root/usr/lib/pkgconfig:@BUILD_ROOT@/system-root/usr/share/pkgconfig' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: at-spi2-atk - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/at-spi2-atk.git' - tag: 'AT_SPI2_ATK_2_38_0' - version: '2.38.0' - tools_required: - - host-pkg-config - - host-gcc - - virtual: pkgconfig-for-target - triple: 'x86_64-aero' - pkgs_required: - - mlibc - - at-spi2-core - - atk - - dbus - - glib - - libxml - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: at-spi2-core - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/at-spi2-core.git' - tag: 'AT_SPI2_CORE_2_38_0' - version: '2.38.0' - tools_required: - - host-pkg-config - - host-gcc - - virtual: pkgconfig-for-target - triple: 'x86_64-aero' - pkgs_required: - - mlibc - - dbus - - glib - - libxtst - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '-Dsystemd_user_dir=/tmp' - - '-Dintrospection=no' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: pcre - source: - subdir: 'bundled' - # Use a git mirror as pcre retired their svn repositories - git: 'https://github.com/vinix-os/pcre' - tag: '1767' - # Seems to be 8.45? - version: '8.45' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-autoconf-archive - regenerate: - - args: ['./autogen.sh'] - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - - '--enable-unicode-properties' - - '--enable-pcre8' - - '--enable-pcre16' - - '--enable-pcre32' - - '--disable-static' - environ: - PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' - PKG_CONFIG_LIBDIR: '@BUILD_ROOT@/system-root/usr/lib/pkgconfig:@BUILD_ROOT@/system-root/usr/share/pkgconfig' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] - - - name: dbus - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/dbus/dbus.git' - tag: 'dbus-1.12.20' - version: '1.12.20' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-autoconf-archive - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-python - - virtual: pkgconfig-for-target - triple: 'x86_64-aero' - pkgs_required: - - mlibc - - glib - - libexpat - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-doxygen-docs' - - '--disable-xml-docs' - - '--disable-static' - - '--enable-shared' - - '--enable-verbose-mode' - - '--with-systemdsystemunitdir=no' - - '--with-systemduserunitdir=no' - - '--docdir=/usr/share/doc/dbus-1.12.20' - - '--with-console-auth-dir=/run/console' - - '--with-system-pid-file=/run/dbus/pid' - - '--with-system-socket=/run/dbus/system_bus_socket' - - '--disable-selinux' - - '--disable-apparmor' - - '--disable-libaudit' - - '--disable-kqueue' - - '--disable-launchd' - - '--disable-systemd' - - '--disable-tests' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: gettext - from_source: gettext - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--docdir=/usr/share/doc/gettext-0.22.3' - - '--enable-static=no' - - '--enable-shared=yes' - - '--disable-java' - - '--disable-nls' - - '--disable-acl' - - '--without-emacs' - - '--without-git' - - '--without-bzip2' - - '--without-xz' - - '--disable-curses' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libintl - source: - subdir: 'bundled' - url: 'https://ftp.gnu.org/gnu/gettext/gettext-0.22.tar.xz' - format: 'tar.xz' - extract_path: 'gettext-0.22' - version: '0.22' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['autoreconf', '-fvi'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - - libiconv - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--without-emacs' - - '--without-lispdir' - # Normally this controls nls behavior in general, but the libintl - # subdir is skipped unless this is explicitly set. - - '--enable-nls' - # This magic flag enables libintl. - - '--with-included-gettext' - - '--disable-c++' - - '--disable-libasprintf' - - '--disable-java' - - '--enable-shared' - - '--disable-static' - - '--enable-threads=posix' - - '--disable-curses' - - '--without-git' - - '--without-cvs' - - '--without-bzip2' - - '--without-xz' - build: - - args: ['make', '-C', 'gettext-runtime/intl', '-j@PARALLELISM@'] - - args: ['make', '-C', 'gettext-runtime/intl', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: glib - from_source: glib - tools_required: - - host-gcc - - host-libtool - - host-pkg-config - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - pcre - - libffi - - zlib - - libiconv - - libintl - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--libdir=lib' - - '--buildtype=debugoptimized' - - '-Dxattr=false' - - '@THIS_SOURCE_DIR@' - environ: - # The warning is false positive and the more recent versions of GCC. Workaround and disable the warning. - # - # Bug 1744: https://gitlab.gnome.org/GNOME/glib/-/issues/1744 - CFLAGS: '-Wno-error=format-nonliteral' - PKG_CONFIG_SYSROOT_DIR: '@BUILD_ROOT@/system-root' - PKG_CONFIG_LIBDIR: '@BUILD_ROOT@/system-root/usr/lib/pkgconfig:@BUILD_ROOT@/system-root/usr/share/pkgconfig' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - scripts: - post_install: - - args: ['glib-compile-schemas /usr/share/glib-2.0/schemas'] - - args: ['gio-querymodules /usr/lib/gio/modules'] - - - name: libjpeg-turbo - source: - subdir: 'bundled' - git: 'https://github.com/libjpeg-turbo/libjpeg-turbo.git' - tag: '2.1.4' - version: '2.1.4' - tools_required: - - host-pkg-config - - host-gcc - - host-cmake - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - configure: - - args: - - 'cmake' - - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.cmake' - - '-DCMAKE_INSTALL_PREFIX=/usr' - - '-DCMAKE_BUILD_TYPE=RELEASE' - - '-DENABLE_STATIC=FALSE' - - '-DCMAKE_INSTALL_DOCDIR=/usr/share/doc/libjpeg-turbo-2.1.4' - - '-DCMAKE_INSTALL_DEFAULT_LIBDIR=lib' - - '-DWITH_JPEG8=ON' - - '-DCMAKE_SYSTEM_PROCESSOR=x86_64' - - '@THIS_SOURCE_DIR@/' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # A free implementation of the unicode bidirectional algorithm - # - # This package provides a library with an implementation of the Unicode - # Bidirectional Algorithm (BIDI). This is used for supporting Arabic and - # Hebrew alphabets in other packages. - - name: fribidi - source: - subdir: 'bundled' - git: 'https://github.com/fribidi/fribidi.git' - tag: 'v1.0.12' - version: '1.0.12' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - - args: 'sed -i s/"SUBDIRS = gen.tab lib bin doc test"/"SUBDIRS = gen.tab lib bin test"/ @THIS_SOURCE_DIR@/Makefile.am' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # Translation tool for XML documents that uses gettext files and ITS rules - # - # This package contains a program for translating XML with PO files using W3C - # Internationalization Tag Set rules. - - name: itstool - source: - subdir: 'bundled' - git: 'https://github.com/itstool/itstool.git' - tag: '2.0.7' - version: '2.0.7' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - tools_required: - - host-gcc - - host-python - pkgs_required: - - mlibc - - libxml - - python - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - environ: - 'PYTHON': '/usr/bin/python3' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: readline - source: - subdir: 'bundled' - git: 'https://git.savannah.gnu.org/git/readline.git' - tag: 'readline-8.1' - version: '8.1' - tools_required: - - host-gcc - pkgs_required: - - mlibc - - ncurses - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-static' - - '--enable-multibyte' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # General purpose crypto library based on the code used in GnuPG - # - # This package contains a general purpose crypto library based on the code used - # in GnuPG. The library provides a high level interface to cryptographic building - # blocks using an extendable and flexible API. - - name: libgcrypt - source: - subdir: 'bundled' - git: 'https://dev.gnupg.org/source/libgcrypt.git' - tag: 'libgcrypt-1.10.1' - version: '1.10.1' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['./autogen.sh'] - - args: ['autoreconf', '-fvi'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - - libgpg-error - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--enable-shared' - - '--disable-static' - - '--prefix=/usr' - - '--disable-nls' - - '--disable-doc' - - '--disable-dev-random' - - '--with-libgpg-error-prefix=@SYSROOT_DIR@/usr' - - '--disable-asm' - environ: - LIBS: '-lgpg-error' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # A lossy image compression format - # - # This package contains a library and support programs to encode and decode images in WebP format. - - name: libwebp - source: - subdir: 'bundled' - git: 'https://github.com/webmproject/libwebp.git' - tag: 'v1.3.0' - version: '1.3.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - - libjpeg-turbo - - libpng - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--enable-libwebpmux' - - '--enable-libwebpdemux' - - '--enable-libwebpdecoder' - - '--enable-libwebpextras' - - '--enable-swap-16bit-csp' - - '--disable-static' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libtasn - source: - subdir: 'bundled' - git: 'https://gitlab.com/gnutls/libtasn1.git' - tag: 'v4.18.0' - version: '4.18.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-libtool - regenerate: - - args: ['./bootstrap'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/build-aux/'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-static' - - '--disable-doc' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # Contains error handling functions used by GnuPG software - # - # This package contains a library that defines common error values for - # all GnuPG components. - - name: libgpg-error - source: - subdir: 'bundled' - git: 'https://dev.gnupg.org/source/libgpg-error.git' - tag: 'libgpg-error-1.45' - version: '1.45' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['./autogen.sh'] - - args: ['autoreconf', '-f', '-v', '-i'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - # libgpg-error does not know about managarm, teach it - - args: ['cp', '-v', '@THIS_SOURCE_DIR@/src/syscfg/lock-obj-pub.x86_64-unknown-linux-gnu.h', - '@THIS_SOURCE_DIR@/src/syscfg/lock-obj-pub.aero.h'] - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-nls' - - '--disable-doc' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: icu - from_source: icu - tools_required: - - host-gcc - - host-icu - pkgs_required: - - mlibc - configure: - - args: ['cp', - '@THIS_SOURCE_DIR@/icu4c/source/config/mh-linux', - '@THIS_SOURCE_DIR@/icu4c/source/config/mh-unknown'] - - args: - - '@THIS_SOURCE_DIR@/icu4c/source/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-cross-build=@BUILD_ROOT@/tool-builds/host-icu' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: graphite2 - source: - subdir: 'bundled' - git: 'https://github.com/silnrsi/graphite.git' - tag: '1.3.14' - version: '1.3.14' - tools_required: - - host-gcc - - host-python - - host-cmake - pkgs_required: - - mlibc - - gcc # Actually requires libstdc++.so in the system root, otherwise it links against the host libstdc++.so.6 - configure: - - args: - - 'cmake' - - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.cmake' - - '-DCMAKE_INSTALL_PREFIX=/usr' - - '@THIS_SOURCE_DIR@' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: harfbuzz - source: - subdir: 'bundled' - git: 'https://github.com/harfbuzz/harfbuzz.git' - tag: '3.1.2' - version: '3.1.2' - tools_required: - - host-gcc - - host-pkg-config - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - graphite2 - - glib - - zlib - - freetype - - cairo - - icu - configure: - - args: - - 'meson' - - '--native-file' - - '@SOURCE_ROOT@/userland/native-file.ini' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--libdir=lib' - - '--buildtype=debugoptimized' - - '-Dgraphite2=enabled' - - '-Dglib=enabled' - - '-Dgobject=disabled' - - '-Dicu=enabled' - - '-Dfreetype=enabled' - - '-Dcairo=enabled' - - '-Dintrospection=disabled' - - '-Ddocs=disabled' - - '-Dtests=disabled' # Disabled due to a linking error - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - -tasks: - - name: sysroot - pkgs_required: - - binutils - - coreutils - - nyancat - - gcc - - tcc - args: - - '@SOURCE_ROOT@/make-iso.sh' - - '@BUILD_ROOT@' - - '@SOURCE_ROOT@' - - '@SYSROOT_DIR@' - workdir: '@BUILD_ROOT@' diff --git a/bootstrap/app-misc.yml b/bootstrap/app-misc.yml deleted file mode 100644 index f8ca618882a..00000000000 --- a/bootstrap/app-misc.yml +++ /dev/null @@ -1,31 +0,0 @@ -packages: - # A lightweight and flexible command-line JSON processor - - name: jq - source: - url: 'https://github.com/jqlang/jq/releases/download/jq-1.7/jq-1.7.tar.gz' - format: 'tar.gz' - version: '1.7' - subdir: 'bundled' - patch-path-strip: 0 - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-gcc - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/jq-1.7/configure' - - '--disable-docs' - - '--disable-valgrind' - - '--disable-maintainer-mode' - - '--with-oniguruma=builtin' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/db.yml b/bootstrap/db.yml deleted file mode 100644 index b4a932c05c6..00000000000 --- a/bootstrap/db.yml +++ /dev/null @@ -1,38 +0,0 @@ -packages: - - name: sqlite - source: - subdir: 'bundled' - url: 'https://sqlite.org/2021/sqlite-autoconf-3370000.tar.gz' - format: 'tar.gz' - checksum: blake2b:35e72700f20c35701d26f7b66da126242ea1d253f710f299a9b6f180f0a53d417114af022161a6cd9ebf20b791f0645f7a30290210fac197d5fda3a647067fd0 - extract_path: 'sqlite-autoconf-3370000' - version: '3.37.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['autoreconf', '-fvi'] - tools_required: - - host-gcc - - host-libtool - - host-autoconf-v2.69 - - host-automake-v1.16 - pkgs_required: - - mlibc - - readline - - zlib - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-static' - - '--enable-readline' - - '--enable-fts5' - - 'CFLAGS=-g -O2 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS4=1 -DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_ENABLE_UNLOCK_NOTIFY=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_SECURE_DELETE=1 -DSQLITE_ENABLE_FTS3_TOKENIZER=1' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/editors.yml b/bootstrap/editors.yml deleted file mode 100644 index 5842bc33825..00000000000 --- a/bootstrap/editors.yml +++ /dev/null @@ -1,60 +0,0 @@ -packages: - - name: vim - source: - subdir: 'bundled' - git: 'https://github.com/vim/vim.git' - tag: 'v8.2.3704' - version: '8.2.3704' - tools_required: - - host-gcc - - host-pkg-config - - host-automake-v1.16 - pkgs_required: - - mlibc - - ncurses - - libiconv - revision: 4 - configure: - # vim does not seem to support out-of-tree builds, so we just copy - # the source tree into the build directory instead - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - - args: - - './configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-gtktest' - - '--disable-icon-cache-update' - - '--disable-desktop-database-update' - - '--disable-canberra' - - '--disable-selinux' - - '--disable-xsmp' - - '--disable-channel' - - '--disable-netbeans' - - '--enable-multibyte' - - '--disable-acl' - - '--disable-gpm' - - '--disable-sysmouse' - - '--disable-nls' - - '--with-tlib=tinfo' - - '--enable-gui=no' - - '--without-x' - environ: - ac_cv_small_wchar_t: 'no' - ac_cv_func_sigsetjmp: 'no' - vim_cv_toupper_broken: 'no' - vim_cv_terminfo: 'yes' - vim_cv_tgetent: 'zero' - vim_cv_tty_group: '' - vim_cv_tty_mode: '0620' - vim_cv_getcwd_broken: 'no' - vim_cv_stat_ignores_slash: 'no' - vim_cv_memmove_handles_overlap: 'yes' - vim_cv_bcopy_handles_overlap: 'yes' - vim_cv_memcpy_handles_overlap: 'yes' - STRIP: 'x86_64-aero-strip' - workdir: '@THIS_BUILD_DIR@/src/' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/net.yml b/bootstrap/net.yml deleted file mode 100644 index 118868d86f5..00000000000 --- a/bootstrap/net.yml +++ /dev/null @@ -1,733 +0,0 @@ -sources: - - name: nss - subdir: 'bundled' - git: 'https://github.com/nss-dev/nss.git' - tag: 'NSS_3_94_RTM' - version: '3.94.RTM' - -packages: - - name: dhcpd - source: - subdir: 'bundled' - git: 'https://github.com/Andy-Python-Programmer/dhcpd' - branch: 'main' - tools_required: - - host-rust - - host-gcc - sources_required: - - rust-patched-libs - pkgs_required: - - mlibc - configure: - - args: ['python3', '@SOURCE_ROOT@/tools/cargo-inject-patches.py', '@THIS_SOURCE_DIR@/Cargo.toml'] - build: - - args: - - 'cargo' - - 'install' - - '--locked' - - '--target-dir' - - '@THIS_BUILD_DIR@' - - '--path' - - '@THIS_SOURCE_DIR@' - - '--root' - - '@THIS_COLLECT_DIR@/usr' - - '-j@PARALLELISM@' - environ: - RUSTFLAGS: '-Cforce-frame-pointers=yes -Clink-args=-no-pie' - - # C library for the Public Suffix List - # - # This package provides a library for accessing and resolving information from the Public - # Suffix List (PSL). The PSL is a set of domain names beyond the standard suffixes, such - # as .com. - - name: libpsl - source: - subdir: 'bundled' - git: 'https://github.com/rockdaboot/libpsl.git' - tag: '0.21.1' - version: '0.21.1' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - - libidn2 - - libunistring - - libiconv - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-static' - - '--enable-builtin=libidn2' - - '--enable-runtime=libidn2' - # Gentoo disables asan, cfi and ubsan - - '--disable-asan' - - '--disable-cfi' - - '--disable-ubsan' - - '--disable-man' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libidn2 - source: - subdir: 'bundled' - git: 'https://gitlab.com/libidn/libidn2.git' - tag: 'v2.3.2' - version: '2.3.2' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./bootstrap'] - - args: ['autoreconf', '-fvi'] - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - pkgs_required: - - mlibc - - libunistring - - libiconv - configure: - # Remove some files from the source directory if they exist. - - args: | - if [ -f @THIS_SOURCE_DIR@/lib/gendata ]; then - rm -rv @THIS_SOURCE_DIR@/lib/gendata - fi - - args: | - if [ -f @THIS_SOURCE_DIR@/lib/gentr46map ]; then - rm -rv @THIS_SOURCE_DIR@/lib/gentr46map - fi - # Configure for the host, we need some files to be generated - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--disable-doc' - - '--disable-nls' - # Broken out of tree build, but also broken in tree for some reason, work around it - - args: ['cp', '-v', '@THIS_SOURCE_DIR@/lib/idna-tables-properties.csv', '@THIS_BUILD_DIR@/lib/'] - - args: ['cp', '-v', '@THIS_BUILD_DIR@/lib/idn2.h', '@THIS_SOURCE_DIR@/lib/'] - # Build it so we get our files - - args: ['make', '-j@PARALLELISM@'] - # Copy the files to the source dir, where libidn2 wants them - - args: ['cp', '-v', '@THIS_BUILD_DIR@/lib/gendata', '@THIS_SOURCE_DIR@/lib/gendata'] - - args: ['cp', '-v', '@THIS_BUILD_DIR@/lib/gentr46map', '@THIS_SOURCE_DIR@/lib/gentr46map'] - # Finally, configure for managarm - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - - '--disable-static' - - '--disable-doc' - - '--disable-nls' - # Again, copy the header, it might've changed due to configure. - - args: ['cp', '-v', '@THIS_BUILD_DIR@/lib/idn2.h', '@THIS_SOURCE_DIR@/lib/'] - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: curl - source: - subdir: 'bundled' - git: 'https://github.com/curl/curl.git' - tag: 'curl-7_84_0' - version: '7.84.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-autoconf-archive - regenerate: - - args: ['autoreconf', '-fiv'] - tools_required: - - host-pkg-config - - host-gcc - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - libidn2 - - libpsl - - openssl - - zlib - - zstd - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-static' - - '--with-ca-path=/etc/ssl/certs' - - '--enable-threaded-resolver' - - '--with-openssl' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: links - source: - subdir: 'bundled' - url: 'http://links.twibright.com/download/links-2.28.tar.gz' - format: 'tar.gz' - checksum: blake2b:5695cfa26fac30f021ef415e75edb9456ad0360b0edeefa02d2862b149f757a1f1f4d5e5a1e6f3f198696bf35129c93f0f46bdf06ab1b0eb6c91f22e08fffb07 - extract_path: 'links-2.28' - version: '2.28' - tools_required: - - host-pkg-config - - host-gcc - - virtual: pkgconfig-for-target - triple: x86_64-aero - pkgs_required: - - mlibc - - zlib - - openssl - - libpng - - zstd - - libxext - - freetype - - fontconfig - - xz-utils - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--mandir=/usr/share/man' - - '--enable-graphics' - - '--without-directfb' - - '--without-librsvg' - - '--with-bzip2' - - '--with-X' - - '--x-includes=@SYSROOT_DIR@/usr/include' - - '--x-libraries=@SYSROOT_DIR@/usr/lib' - - '--with-zlib' - - '--with-zstd' - - '--with-openssl' - - '--with-libjpeg' - - '--without-libtiff' - - '--without-openmp' - - '--with-lzma' - - '--with-freetype' - - '--without-ipv6' - environ: - # Configure doesn't set CC correctly and assumes gcc unless manually overridden. - CC: 'x86_64-aero-gcc' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'DESTDIR=@THIS_COLLECT_DIR@', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # Network-related giomodules for glib - # - # This package contains network related gio modules for GLib. - - name: glib-networking - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/glib-networking.git' - tag: '2.72.2' - version: '2.72.2' - tools_required: - - host-gcc - - host-pkg-config - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - glib - # - gnutls - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--buildtype=debugoptimized' - - '-Dgnutls=disabled' - - '-Dopenssl=enabled' - - '-Dinstalled_tests=false' - - '-Dstatic_modules=false' - - '-Dlibproxy=disabled' - - '-Dgnome_proxy=disabled' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - scripts: - post_install: - - args: ['gio-querymodules', '/usr/lib/gio/modules'] - - # This package is a HTTP client/server library for GNOME. It uses GObject and the GLib main - # loop to integrate with GNOME applications and it also has an asynchronous API for use in - # threaded applications. - - name: libsoup - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/libsoup.git' - tag: '2.74.2' - version: '2.74.2' - tools_required: - - host-gcc - - host-pkg-config - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - glib - - glib-networking - - zlib - - libxml - - libpsl - - sqlite - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--buildtype=debugoptimized' - - '-Dintrospection=disabled' - - '-Dinstalled_tests=false' - - '-Dsysprof=disabled' - - '-Dgtk_doc=false' - - '-Dvapi=disabled' - - '-Dgnome=false' - - '-Dtls_check=false' - - '-Dbrotli=disabled' - - '-Dntlm=disabled' - - '-Dgssapi=disabled' - - '-Dtests=false' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: alsa-lib - source: - subdir: 'bundled' - git: 'https://github.com/alsa-project/alsa-lib.git' - tag: 'v1.2.9' - version: '1.2.9' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - regenerate: - - args: ['autoreconf', '-fvi'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: nspr - source: - subdir: 'bundled' - hg: 'https://hg.mozilla.org/projects/nspr/' - tag: 'NSPR_4_35_RTM' - version: '4.35.1' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - regenerate: - - args: ['autoreconf', '-fvi'] - - args: ['cp', - '@BUILD_ROOT@/tools/host-automake-v1.16/share/automake-1.16/config.sub', - '@THIS_SOURCE_DIR@/build/autoconf/'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - # Disable installing two unneeded scripts. - - args: ['sed', '-ri', '/^RELEASE/s/^/#/', '@THIS_SOURCE_DIR@/pr/src/misc/Makefile.in'] - # Disable installing static libraries. - - args: ['sed', '-i', 's#$(LIBRARY) ##', '@THIS_SOURCE_DIR@/config/rules.mk'] - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-linux' - - '--build=x86_64-linux' - - '--prefix=/usr' - - '--with-mozilla' - - '--with-pthreads' - - '--enable-64bit' - environ: - CROSS_COMPILE: '1' - ac_cv_func_syscall: 'no' - build: - # We first build a native nsinstall that the build can use later on. - - args: ['make', 'CC=gcc', 'CXX=g++', '-C', '@THIS_BUILD_DIR@/config/'] - - args: ['mv', '-v', '@THIS_BUILD_DIR@/config/nsinstall', '@THIS_BUILD_DIR@/config/native-nsinstall'] - - args: ['sed', '-s', 's#/nsinstall$#/native-nsinstall#', '-i', '@THIS_BUILD_DIR@/config/autoconf.mk'] - - args: ['rm', '-v', '@THIS_BUILD_DIR@/config/nsinstall.o'] - # Then build the real deal - - args: ['make', 'CC=x86_64-aero-gcc', 'CXX=x86_64-aero-g++', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - quiet: true - - - name: nss - from_source: nss - tools_required: - - host-gcc - pkgs_required: - - mlibc - - nspr - - sqlite - - zlib - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - build: - # First, build a host version of nsinstall. - - args: ['make', '-C', '@THIS_BUILD_DIR@/coreconf/'] - environ: - CC: 'gcc' - BUILD_OPT: '1' - NSPR_INCLUDE_DIR: '/usr/include/nspr' - USE_SYSTEM_ZLIB: '1' - ZLIB_LIBS: '-lz' - NSS_ENABLE_WERROR: '0' - USE_64: '1' - NSS_USE_SYSTEM_SQLITE: '1' - NS_USE_GCC: '1' - CC_IS_GCC: '1' - NSDISTMODE: 'copy' - # Then, build some configuration items courtesy of BLFS (see the patches). - - args: | - make V=1 -C @THIS_BUILD_DIR@/config NSINSTALL=@THIS_BUILD_DIR@/$(find -type f -name nsinstall) -j1 - environ: - # Optimized builds. - BUILD_OPT: '1' - # NSPR is here. - NSPR_INCLUDE_DIR: '@SYSROOT_DIR@/usr/include/nspr' - # Use our zlib. - USE_SYSTEM_ZLIB: '1' - # Freestanding freebl yes please. - FREEBL_NO_DEPEND: '1' - FREEBL_LOWHASH: '1' - NSS_SEED_ONLY_DEV_URANDOM: '1' - # Link with zlib. - ZLIB_LIBS: '-lz' - # Do not enable Werror. - NSS_ENABLE_WERROR: '0' - # We are 64 bit. - USE_64: '1' - # Use system sqlite. - NSS_USE_SYSTEM_SQLITE: '1' - # We're using gcc. - NS_USE_GCC: '1' - CC_IS_GCC: '1' - # We're cross compiling. - CROSS_COMPILE: '1' - # Don't symlink files, copy them. - NSDISTMODE: 'copy' - # Do not build the tests. - NSS_DISABLE_GTESTS: '1' - # Put the libs and binaries here. - SOURCE_PREFIX: '@THIS_BUILD_DIR@/dist' - # Specify the compiler. - CC: 'x86_64-aero-gcc' - CXX: 'x86_64-aero-g++' - # Then build the main libraries and binaries. - - args: | - make V=1 -C @THIS_BUILD_DIR@/. NSINSTALL=@THIS_BUILD_DIR@/$(find -type f -name nsinstall) -j1 - environ: - BUILD_OPT: '1' - NSPR_INCLUDE_DIR: '@SYSROOT_DIR@/usr/include/nspr' - USE_SYSTEM_ZLIB: '1' - FREEBL_NO_DEPEND: '1' - FREEBL_LOWHASH: '1' - NSS_SEED_ONLY_DEV_URANDOM: '1' - ZLIB_LIBS: '-lz' - NSS_ENABLE_WERROR: '0' - USE_64: '1' - NSS_USE_SYSTEM_SQLITE: '1' - NS_USE_GCC: '1' - CC_IS_GCC: '1' - CROSS_COMPILE: '1' - NSDISTMODE: 'copy' - NSS_DISABLE_GTESTS: '1' - SOURCE_PREFIX: '@THIS_BUILD_DIR@/dist' - CC: 'x86_64-aero-gcc' - CXX: 'x86_64-aero-g++' - # Create some directories to install into. - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/lib/pkgconfig'] - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/bin'] - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/include'] - # And install everything, this _will_ break on a non Linux box, but unfortunately NSS hardcodes kernel names and versions. - # If someone wants to patch NSS to not do that, greatly appreciated. - # These install instructions are adapted from BLFS, and not Gentoo as I usually do. - - args: | - cd dist - install -v -m755 Linux*/lib/*.so @THIS_COLLECT_DIR@/usr/lib - install -v -m644 Linux*/lib/{*.chk,libcrmf.a} @THIS_COLLECT_DIR@/usr/lib - install -v -m755 -d @THIS_COLLECT_DIR@/usr/include/nss - cp -v -RL {public,private}/nss/* @THIS_COLLECT_DIR@/usr/include/nss - chmod -v 644 @THIS_COLLECT_DIR@/usr/include/nss/* - install -v -m755 Linux*/bin/{certutil,nss-config,pk12util} @THIS_COLLECT_DIR@/usr/bin - install -v -m644 Linux*/lib/pkgconfig/nss.pc @THIS_COLLECT_DIR@/usr/lib/pkgconfig - - - name: libevent - source: - subdir: bundled - git: 'https://github.com/libevent/libevent.git' - tag: 'release-2.1.12-stable' - version: '2.1.12' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - # Fix an issue that prevents event_rpcgen.py from working. - - args: ['sed', '-i', 's/python/&3/', '@THIS_SOURCE_DIR@/event_rpcgen.py'] - tools_required: - - host-gcc - pkgs_required: - - mlibc - - openssl - - zlib - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libvpx - source: - subdir: 'bundled' - git: 'https://chromium.googlesource.com/webm/libvpx.git' - tag: 'v1.11.0' - version: '1.11.0' - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - # Fix ownership and permission of installed files. - - args: ['sed', '-i', 's/cp -p/cp/', '@THIS_SOURCE_DIR@/build/make/Makefile'] - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=/usr' - - '--disable-static' - - '--enable-shared' - # Generic GNU target to disable optimizations - - '--force-target=generic-gnu' - - '--enable-pic' - - '--enable-vp8' - - '--enable-vp9' - - '--enable-multithread' - - '--enable-vp9-highbitdepth' - - '--disable-examples' - - '--disable-install-docs' - - '--disable-docs' - build: - - args: ['make', 'HAVE_GNU_STRIP=no', 'CC=x86_64-aero-gcc', 'LD=x86_64-aero-gcc', 'CXX=x86_64-aero-g++', 'AR=x86_64-aero-ar', 'NM=x86_64-aero-nm', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # - name: firefox - # source: - # subdir: 'bundled' - # git: 'https://github.com/mozilla/gecko-dev' - # commit: 7baa783763c946ff667c3faea292e91d3de1e459 - # branch: master - # configure: - # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - # - args: ['cp', '@SOURCE_ROOT@/extra-files/firefox/mozconfig', '@THIS_BUILD_DIR@/mozconfig'] - # tools_required: - # - host-gcc - # - host-rust - # - host-pkg-config - # # - virtual: pkgconfig-for-target - # # triple: "x86_64-aero" - # pkgs_required: - # - mlibc - # - alsa-lib - # - glib - # - gtk+-3 - # - gtk+-2 - # - icu - # - gcc - # - nspr - # - nss - # - libvpx - # - libevent - # sources_required: - # - rust-patched-libs - # build: - # - args: ['./mach', 'build'] - # environ: - # HOST_CC: 'gcc' - # HOST_CXX: 'g++' - # CC: 'x86_64-aero-gcc' - # CXX: 'x86_64-aero-g++' - # CARGOFLAGS: '--verbose' - # MOZ_RUST_TIER: '1' - # BINDGEN_EXTRA_CLANG_ARGS: '-isystem@SYSROOT_DIR/usr/include' - # # CROSS_SYSROOT: '@SYSROOT_DIR@'./system-root/usr/include/c++/11.2.0/memory - - # cargo install cbindgen - # - # pacman -S autoconf2.13 - # - name: firefox-esr - # source: - # subdir: 'bundled' - # git: 'https://github.com/mozilla/gecko-dev' - # branch: 'FIREFOX_ESR_68_0_X_RELBRANCH' - # configure: - # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - # - args: ['cp', '@SOURCE_ROOT@/extra-files/firefox/mozconfig', '@THIS_BUILD_DIR@/mozconfig'] - # tools_required: - # - host-gcc - # - host-rust - # - host-pkg-config - # # - virtual: pkgconfig-for-target - # # triple: "x86_64-aero" - # pkgs_required: - # - mlibc - # - alsa-lib - # - glib - # - gtk+-3 - # - gtk+-2 - # - gcc - # build: - # # python ~/work/aero/tools/cargo-inject-patches.py ./Cargo.toml - # - args: ['./mach', 'build'] - # environ: - # HOST_CC: 'clang' - # CC: 'x86_64-aero-gcc' - # CARGOFLAGS: '--verbose' - # # - args: ['./mach', 'install'] - # # environ: - # # DESTDIR: '@THIS_COLLECT_DIR@' - - # /home/andy/work/aero/bundled/webkitgtk/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp:313:14: error: ‘mkstemps’ was not declared in this scope; did you mean ‘mkstemp’? - # 313 | int fd = mkstemps(&tempFileTemplate[0], static_cast(extension.size())); - # | ^~~~~~~~ - # | mkstemp - - name: webkitgtk - source: - subdir: bundled - git: 'https://github.com/WebKit/WebKit.git' - # I think? Apple is weird with naming - tag: 'Safari-612.1.27.0.24' - version: '2.33.3' - tools_required: - - host-gcc - - host-cmake - pkgs_required: - - mlibc - - cairo - - fontconfig - - freetype - - libgcrypt - - glib - - harfbuzz - - icu - - libjpeg-turbo - - zlib - - sqlite - - libpng - - libxml - - atk - - libwebp - - gtk+-3 - - libsoup - - libxslt - - at-spi2-core - - libtasn - - libx11 - - libxcomposite - - libxdamage - - libxrender - - libxt - - mesa - configure: - - args: - - 'cmake' - - '-GNinja' - - '-DCMAKE_TOOLCHAIN_FILE=@SOURCE_ROOT@/userland/CMakeToolchain-x86_64.cmake' - - '-DCMAKE_INSTALL_PREFIX=/usr' - - '-DCMAKE_SYSTEM_PROCESSOR=x86_64' - - '-DCMAKE_BUILD_TYPE=Release' - - '-DCMAKE_SKIP_RPATH=ON' - - '-DPORT=GTK' - - '-DLIB_INSTALL_DIR=/usr/lib' - - '-DUSE_LIBHYPHEN=OFF' - - '-DENABLE_GAMEPAD=OFF' - - '-DENABLE_MINIBROWSER=ON' - - '-DUSE_WOFF2=OFF' - - '-DUSE_SYSTEMD=OFF' - - '-DENABLE_BUBBLEWRAP_SANDBOX=OFF' - - '-Wno-dev -G Ninja' - - '-DUSE_LIBNOTIFY=OFF' - - '-DUSE_SYSTEM_MALLOC=ON' - - '-DENABLE_GEOLOCATION=OFF' - - '-DENABLE_VIDEO=OFF' - - '-DENABLE_WEB_AUDIO=OFF' - - '-DENABLE_INTROSPECTION=OFF' - - '-DUSE_LIBSECRET=OFF' - - '-DUSE_OPENJPEG=OFF' - - '-DENABLE_SPELLCHECK=OFF' - - '-DENABLE_WAYLAND_TARGET=OFF' - - '-DENABLE_X11_TARGET=ON' - - '-DENABLE_WEBGL=ON' - - '-DUSE_WPE_RENDERER=OFF' - - '-DENABLE_WEBGL2=OFF' - - '-DUSE_SOUP2=ON' - - '-DUSE_LCMS=OFF' - - '@THIS_SOURCE_DIR@' - environ: - CXXFLAGS: '-DLOG_DISABLED=0' - build: - - args: ['ninja', '-j6'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/vcs.yml b/bootstrap/vcs.yml deleted file mode 100644 index 31b040ad96d..00000000000 --- a/bootstrap/vcs.yml +++ /dev/null @@ -1,51 +0,0 @@ -packages: - # The Git version control system - # - # Git is one of the most used version control systems designed to - # handle large projects efficiently. - # - name: git - # source: - # subdir: 'bundled' - # git: 'https://github.com/git/git.git' - # tag: 'v2.32.0' - # version: '2.32.0' - # tools_required: - # - host-autoconf-v2.69 - # - host-automake-v1.16 - # - host-libtool - # regenerate: - # - args: ['autoreconf'] - # tools_required: - # - host-pkg-config - # - host-gcc - # - virtual: pkgconfig-for-target - # triple: "x86_64-aero" - # pkgs_required: - # - mlibc - # - python - # - libexpat - # - zlib - # - openssl - # - curl - # - libiconv - # - pcre - # configure: - # - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - # - args: - # - './configure' - # - '--host=x86_64-aero' - # - '--prefix=/usr' - # - '--with-python=python3' - # - '--with-gitconfig=/etc/gitconfig' - # - '--with-curl=@SYSROOT_DIR@/usr' - # - '--without-iconv' - # - '--with-libpcre' - # - 'ac_cv_fread_reads_directories=1' - # - 'ac_cv_snprintf_returns_bogus=1' - # environ: - # CURL_CONFIG: '@SYSROOT_DIR@/usr/bin/curl-config' - # build: - # - args: ['make', 'NO_GETTEXT=YesPlease', '-j@PARALLELISM@'] - # - args: ['make', 'NO_GETTEXT=YesPlease', 'install'] - # environ: - # DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/x11-themes.yml b/bootstrap/x11-themes.yml deleted file mode 100644 index 09506dfd667..00000000000 --- a/bootstrap/x11-themes.yml +++ /dev/null @@ -1,49 +0,0 @@ -packages: - # This package contains a default fallback theme for implementations of the icon theme specification. - - name: hicolor-icon-theme - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xdg/default-icon-theme.git' - tag: '0.17' - version: '0.17' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - regenerate: - - args: ['./autogen.sh', '--no-configure'] - tools_required: - - host-gcc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: adwaita-icon-theme - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/adwaita-icon-theme.git' - tag: '45.0' - version: '45.0' - tools_required: - - host-gcc - pkgs_required: - - hicolor-icon-theme - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' diff --git a/bootstrap/xorg.yml b/bootstrap/xorg.yml deleted file mode 100644 index 3ce977b6aaf..00000000000 --- a/bootstrap/xorg.yml +++ /dev/null @@ -1,2635 +0,0 @@ -sources: - - name: xorg-util-macros - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/util/macros.git' - tag: 'util-macros-1.19.3' - version: '1.19.3' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - - - name: xorg-font-util - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/font/util.git' - tag: 'font-util-1.3.2' - version: '1.3.2' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - - - name: gettext - subdir: 'bundled' - url: 'https://ftp.gnu.org/pub/gnu/gettext/gettext-0.22.3.tar.gz' - checksum: blake2b:aebe85a82cb94c37ed81e9801acf1e89d150f5992fb9be42d53b3f2734c5c95804f0051fabc26b8d0892dfaf89d18df16d4bca6bcb2e9b95eef5d4ae93a64379 - extract_path: 'gettext-0.22.3' - format: 'tar.gz' - version: '0.22.3' - - - name: gobject-introspection - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/gobject-introspection.git' - tag: '1.76.1' - version: '1.76.1' - -tools: - - name: host-gobject-introspection - exports_aclocal: true - from_source: gobject-introspection - tools_required: - - host-python - - host-glib - - host-pkg-config - - virtual: pkgconfig-for-host - program_name: host-pkg-config - configure: - - args: - - 'meson' - - '--prefix=@PREFIX@' - - '--native-file' - - '@SOURCE_ROOT@/userland/native-file.ini' - - '-Dbuild_introspection_data=false' - - '@THIS_SOURCE_DIR@' - compile: - - args: ['ninja'] - install: - - args: ['ninja', 'install'] - - - name: host-xorg-macros - exports_aclocal: true - from_source: xorg-util-macros - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install-strip'] - - - name: host-xtrans - exports_aclocal: true - from_source: libxtrans - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install-strip'] - - - name: host-xorg-font-util - exports_aclocal: true - from_source: xorg-font-util - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--prefix=@PREFIX@' - compile: - - args: ['make', '-j@PARALLELISM@'] - install: - - args: ['make', 'install-strip'] - -packages: - # `xorg-util-macros` is a set of autoconf macros used by the configure.ac scripts in - # other Xorg modular packages, and is needed to generate new versions - # of their configure scripts with autoconf. - - name: xorg-util-macros - from_source: xorg-util-macros - tools_required: - - host-gcc - - host-xorg-macros - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `xorg-proto` provides the headers and specification documents defining the core protocol - # and extensions for the X Window System. - - name: xorg-proto - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/proto/xorgproto.git' - tag: 'xorgproto-2022.1' - version: '2022.1' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `xcb-proto` provides the XML-XCB protocol descriptions that libxcb uses to - # generate the majority of its code and API. - - name: xcb-proto - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/proto/xcbproto.git' - tag: 'xcb-proto-1.15' - version: '1.15' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-python - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libxau - - libxdmcp - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - environ: - PYTHON: '@BUILD_ROOT@/tools/host-python/bin/python3.8' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libxcb-image - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxcb-image' - tag: 'xcb-util-image-0.4.1' - version: '0.4.1' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['git', 'submodule', 'update', '--init'] - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libxcb-util - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libxcb-util - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxcb-util' - tag: 'xcb-util-0.4.1' - version: '0.4.1' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['git', 'submodule', 'update', '--init'] - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-python - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxdmcp` is X Display Manager Control Protocol library. - - name: libxdmcp - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxdmcp.git' - tag: 'libXdmcp-1.1.3' - version: '1.1.3' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libxau - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `xtrans` is a library of code that is shared among various X packages to - # handle network protocol transport in a modular fashion. - - name: libxtrans - from_source: libxtrans - tools_required: - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libxcb - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxau` is a sample authorization protocol for X - - name: libxau - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxau.git' - tag: 'libXau-1.0.9' - version: '1.0.9' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxcb` provides an interface to the X Window System protocol, which - # replaces the traditional Xlib interface. - - name: libxcb - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxcb.git' - tag: 'libxcb-1.15' - version: '1.15' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-python - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libxau - - libxdmcp - - xcb-proto - configure: - - args: ['sed', '-i', "s/pthread-stubs//", '@THIS_SOURCE_DIR@/configure'] - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--without-doxygen' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - environ: - PYTHON: '@BUILD_ROOT@/tools/host-python/bin/python3.8' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libx11` is core X11 protocol client library. - - name: libx11 - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libx11.git' - tag: 'libX11-1.8' - version: '1.8' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-xtrans - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libxcb - - libxtrans - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--disable-ipv6' - - '--disable-malloc0returnsnull' - - '--with-keysymdefdir=@SYSROOT_DIR@/usr/include/X11' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libxcursor - source: - subdir: bundled - git: 'https://gitlab.freedesktop.org/xorg/lib/libxcursor.git' - tag: 'libXcursor-1.2.1' - version: '1.2.1' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxfixes - - libxrender - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: glu - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/mesa/glu.git' - tag: 'glu-9.0.2' - version: '9.0.2' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: '1' - tools_required: - - host-gcc - pkgs_required: - - mlibc - - gcc # Actually requires libstdc++.so in the system root, otherwise it links against the host libstdc++.so.6 - - mesa - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # - name: mesa-demos - # source: - # subdir: 'bundled' - # git: 'https://gitlab.freedesktop.org/mesa/demos.git/' - # branch: 'master' - # tools_required: - # - host-autoconf-v2.69 - # - host-automake-v1.16 - # - host-libtool - # - host-pkg-config - # - host-xorg-macros - # regenerate: - # - args: ['./autogen.sh'] - # environ: - # 'NOCONFIGURE': 'yes' - # tools_required: - # - host-gcc - # pkgs_required: - # - mlibc - # - mesa - # configure: - # - args: - # - '@THIS_SOURCE_DIR@/configure' - # - '--host=x86_64-aero' - # - '--prefix=/usr' - # - '--sysconfdir=/etc' - # - '--localstatedir=/var' - # - '--disable-static' - # - '--disable-gles1' # Requires some linux header that we don't have - # - '--disable-vg' - # - '--disable-osmesa' - # - '--disable-rbug' - # - '--with-system-data-files' - # build: - # - args: ['make', '-j@PARALLELISM@'] - # - args: ['make', 'install'] - # environ: - # DESTDIR: '@THIS_COLLECT_DIR@' - - - name: mesa - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/mesa/mesa.git' - tag: 'mesa-21.3.5' - version: '21.3.5' - tools_required: - - host-pkg-config - tools_required: - - host-pkg-config - - host-gcc - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - - virtual: pkgconfig-for-host - program_name: host-pkg-config - pkgs_required: - - mlibc - - libdrm - - zlib - - libxrandr - - libxfixes - - libx11 - - libxext - - libxcb - - llvm - configure: - - args: ['cp', '@SOURCE_ROOT@/userland/cross-file.ini', 'meson.cross-file'] - - args: - - 'sed' - - '-i' - - "/^# sed adds binaries here.$/a llvm-config = '@SOURCE_ROOT@/userland/cross-llvm-config'" - - 'meson.cross-file' - - args: - - 'meson' - - 'setup' - - '--native-file' - - '@SOURCE_ROOT@/userland/native-file.ini' - - '--cross-file' - - 'meson.cross-file' - - '--prefix=/usr' - - '--libdir=lib' - # The debug build type enables some additional output from Mesa. - - '--buildtype=release' - #- '--buildtype=debug' - - '-Dglx=gallium-xlib' - - '-Dplatforms=x11' - # The Gallium swrast driver seems to be preferred over dri-swrast. - - '-Ddri-drivers=' - - '-Dgallium-drivers=swrast' - - '-Dvulkan-drivers=' - # Force Mesa to build with LLVM. - - '-Dllvm=enabled' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja', '-j@PARALLELISM@'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxkbfile` is used by the X servers and utilities to parse the XKB - # configuration data files. - - name: libxkbfile - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxkbfile.git' - tag: 'libxkbfile-1.1.0' - version: '1.1.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: xorg-font-util - from_source: xorg-font-util - tools_required: - - host-gcc - pkgs_required: - - mlibc - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libfontenc` is a font encoding library. - - name: libfontenc - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libfontenc.git' - tag: 'libfontenc-1.1.4' - version: '1.1.4' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-xorg-font-util - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - - xorg-font-util - - zlib - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: xf86-input-mouse - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/driver/xf86-input-mouse.git' - tag: 'xf86-input-mouse-1.9.4' - version: '1.9.4' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-server - - xorg-util-macros - - libx11 - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxfont` provides the core of the legacy X11 font system, handling the index - # files - - name: libxfont2 - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxfont.git' - tag: 'libXfont2-2.0.5' - version: '2.0.5' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-xtrans - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-xtrans - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - - freetype - - libfontenc - - fontconfig - - zlib - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--disable-devel-docs' - # strcasecmp is implicitly declared, probably an missing include somewhere, so disable -Werror for that - - '--disable-selective-werror' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `pixman` is a library that provides low-level pixel manipulation - # features such as image compositing and trapezoid rasterization. - - name: pixman - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/pixman/pixman.git' - tag: 'pixman-0.42.2' - version: '0.42.2' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - libpng - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libepoxy - source: - subdir: 'bundled' - git: 'https://github.com/anholt/libepoxy.git' - tag: '1.5.10' - version: '1.5.10' - tools_required: - - host-pkg-config - - host-gcc - - virtual: pkgconfig-for-target - triple: "@OPTION:x86_64-aero" - pkgs_required: - - mlibc - - mesa - - xorg-proto - - libx11 - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '-Degl=no' - - '-Dtests=false' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: xorg-xinit - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/app/xinit' - tag: 'xinit-1.3.4' - version: '1.3.4' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-xorg-font-util - - host-xtrans - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-gcc - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - xorg-server - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - args: ['cp', '@SOURCE_ROOT@/extra-files/xorg/xinitrc', '@THIS_COLLECT_DIR@/etc/X11/xinit/xinitrc'] - - # X.Org xcvt library and cvt program - # - # VESA CVT standard timing modeline generation library & utility. - - name: libxcvt - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxcvt.git' - tag: 'libxcvt-0.1.2' - version: '0.1.2' - tools_required: - - host-gcc - - host-pkg-config - pkgs_required: - - mlibc - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja', '-j@PARALLELISM@'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # The X server accepts requests from client applications to create windows, - # which are (normally rectangular) "virtual screens" that the client program - # can draw into. - - name: xorg-server - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/xserver.git' - tag: 'xorg-server-1.20.14' - version: '1.20.14' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-xorg-font-util - - host-xtrans - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - openssl - - libepoxy - - libxkbfile - - libxfont2 - - libxcvt - - pixman - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - - '--with-xkb-output=/var/lib/xkb' - - '--enable-xorg' - - '--enable-xv' - - '--enable-xvfb' - - '--disable-xephyr' - - '--disable-xwayland' - - '--disable-xnest' - - '--disable-dmx' - - '--disable-suid-wrapper' - - '--disable-pciaccess' - - '--disable-dpms' - - '--disable-screensaver' - - '--disable-xres' - - '--disable-xinerama' - - '--disable-xvmc' - - '--disable-systemd-logind' - - '--disable-secure-rpc' - - '--disable-config-udev' - - '--disable-dri' - - '--disable-dri2' - - '--disable-dri3' - - '--disable-vbe' - - '--disable-int10-module' - - '--disable-vgahw' - - '--disable-libdrm' - - '--disable-glamor' - - '--disable-glx' - environ: - CFLAGS: '-Wno-error=array-bounds -pipe' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/etc/X11'] - - args: ['cp', '@SOURCE_ROOT@/extra-files/xorg/xorg.conf', '@THIS_COLLECT_DIR@/etc/X11/'] - - # `libxext` is the historical libX11-based catchall library for the X11 - # extensions without their own libraries. - - name: libxext - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxext.git' - tag: 'libXext-1.3.4' - version: '1.3.4' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--disable-malloc0returnsnull' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libsm` is a X session management library. - - name: libsm - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libsm.git' - tag: 'libSM-1.2.3' - version: '1.2.3' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-xtrans - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-gcc - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - - libice - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libxt - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxt.git' - tag: 'libXt-1.2.1' - version: '1.2.1' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - - libsm - - libice - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--disable-malloc0returnsnull' - - '--with-appdefaultdir=/etc/X11/app-defaults' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxmu` contains miscellaneous utilities and is not part of the Xlib - # standard - - name: libxmu - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxmu.git' - tag: 'libXmu-1.1.3' - version: '1.1.3' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-xtrans - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxext - - libxtrans - - libxt - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libice` is a inter-client exchange library. - - name: libice - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libice.git' - tag: 'libICE-1.0.10' - version: '1.0.10' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-xtrans - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxaw` is the X athena widget set. - - name: libxaw - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxaw.git' - tag: 'libXaw-1.0.14' - version: '1.0.14' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxext - - libxt - - libxmu - - libxpm - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxpm` is X Pixmap (XPM) image file format library. - - name: libxpm - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxpm.git' - tag: 'libXpm-3.5.13' - version: '3.5.13' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxext - - libxt - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxrender` is a library for the Render Extension to the X11 protocol - - name: libxrender - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxrender.git' - tag: 'libXrender-0.9.10' - version: '0.9.10' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--disable-malloc0returnsnull' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxft` is X FreeType library. - - name: libxft - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxft.git' - tag: 'libXft-2.3.4' - version: '2.3.4' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxrender - - freetype - - fontconfig - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxi` is library for the X input extension. - - name: libxi - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxi.git' - tag: 'libXi-1.8' - version: '1.8' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - - libxext - - libxfixes - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--disable-malloc0returnsnull' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `libxfixes` is xfixes extension library. - - name: libxfixes - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxfixes.git' - tag: 'libXfixes-6.0.0' - version: '6.0.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # `xeyes` is a follow the mouse X demo, using the X shape extension. - - name: xeyes - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/app/xeyes.git' - tag: 'xeyes-1.2.0' - version: '1.2.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - libx11 - - libxmu - - libxaw - - libxrender - - libxft - - libxt - - libxkbfile - - libiconv - - libxi - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-selective-werror' # strncasecmp - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: limine-term - source: - subdir: 'bundled' - git: 'https://github.com/Andy-Python-Programmer/limine-term-emu' - branch: 'master' - regenerate: - - args: ['git', 'submodule', 'update', '--init'] - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - - virtual: pkgconfig-for-host - program_name: host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - libx11 - - libxmu - - libxaw - - libxrender - - libxft - - libxt - - libxkbfile - - libiconv - - libxi - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja', '-j@PARALLELISM@'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: dwm - source: - subdir: 'bundled' - git: 'https://git.suckless.org/dwm/' - branch: master - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - libx11 - - libxmu - - libxaw - - libxrender - - libxft - - libxt - - libxkbfile - - libiconv - - libxi - - dejavu - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - build: - - args: ['make', 'CC=x86_64-aero-gcc', 'CXX=x86_64-aero-g++'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: xwallpaper - source: - subdir: 'bundled' - git: 'https://github.com/stoeckmann/xwallpaper' - branch: 'master' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxcb-image - - libxcb-util - - libpng - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: dmenu - source: - subdir: 'bundled' - git: 'https://git.suckless.org/dmenu/' - branch: master - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - libx11 - - libxmu - - libxaw - - libxrender - - libxft - - libxt - - libxkbfile - - libiconv - - libxi - - dejavu - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/.', '@THIS_BUILD_DIR@'] - build: - - args: ['make', 'CC=x86_64-aero-gcc', 'CXX=x86_64-aero-g++'] - - args: ['make', 'install'] - environ: - PREFIX: '/usr' - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: dejavu - source: - subdir: bundled - url: 'https://sourceforge.net/projects/dejavu/files/dejavu/2.37/dejavu-fonts-ttf-2.37.tar.bz2' - format: 'tar.bz2' - checksum: blake2b:d8614907887f20967fc7c75cb33b636a0eb5c682a076ccc7aef09f4ac243507afc005ef90d0b2aeee6a4a6a1ff3d5ce4fac0d1722a382525b3883ef53cdec26a - extract_path: 'dejavu-fonts-ttf-2.37' - version: '2.37' - pkgs_required: - - freetype - - fontconfig - revision: 3 - configure: - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/ttf', '@THIS_SOURCE_DIR@/dejavu'] - - args: ['cp', '-r', '@THIS_SOURCE_DIR@/', '@THIS_BUILD_DIR@'] - build: - - args: ['mkdir', '-p', '@THIS_COLLECT_DIR@/usr/share/fonts/truetype/'] - - args: ['cp', '-r', '@THIS_BUILD_DIR@/dejavu/dejavu', '@THIS_COLLECT_DIR@/usr/share/fonts/truetype/'] - scripts: - post_install: - - args: 'echo "Running fc-cache; this may take a few seconds..."' - - args: ['fc-cache'] - - - name: libxv - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxv.git' - tag: 'libXv-1.0.11' - version: '1.0.11' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxext - - libxfixes - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--disable-malloc0returnsnull' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libxrandr - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxrandr.git' - tag: 'libXrandr-1.5.2' - version: '1.5.2' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - - libxrender - - libxext - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--disable-malloc0returnsnull' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: xkbcomp - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/app/xkbcomp.git' - tag: 'xkbcomp-1.4.5' - version: '1.4.5' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - libx11 - - libxkbfile - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libxkbcommon - source: - subdir: 'bundled' - git: 'https://github.com/xkbcommon/libxkbcommon.git' - tag: 'xkbcommon-1.4.0' - version: '1.4.0' - tools_required: - - host-pkg-config - - host-gcc - - virtual: pkgconfig-for-host - program_name: host-pkg-config - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - libxcb - - libxml - - xkeyboard-config - configure: - - args: - - 'meson' - - '--native-file' - - '@SOURCE_ROOT@/userland/native-file.ini' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--libdir=lib' - - '--buildtype=release' - - '-Denable-docs=false' - - '-Denable-x11=true' - - '-Denable-wayland=false' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - args: ['mkdir', '-p', "@THIS_COLLECT_DIR@/usr/share/X11/xkb"] - - - name: xkbutils - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/app/xkbutils.git' - tag: 'xkbutils-1.0.4' - version: '1.0.4' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['autoreconf', '-vfi'] - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxt - - libxaw - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: xkeyboard-config - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config.git' - tag: 'xkeyboard-config-2.34' - version: '2.34' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-gcc - pkgs_required: - - mlibc - - libx11 - - xorg-proto - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--with-xkb-rules-symlink=xorg' - - '--disable-nls' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: xf86-input-keyboard - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/driver/xf86-input-keyboard.git' - tag: 'xf86-input-keyboard-1.9.0' - version: '1.9.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-server - - xorg-util-macros - - libx11 - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: xf86-video-fbdev - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/driver/xf86-video-fbdev.git' - tag: 'xf86-video-fbdev-0.5.0' - version: '0.5.0' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - regenerate: - - args: ['./autogen.sh'] - environ: - NOCONFIGURE: 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-server - - xorg-util-macros - - libx11 - - libxrandr - - libxrender - - libxv - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - - '--disable-pciaccess' - environ: - SYSROOT: '@SYSROOT_DIR@' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install-strip'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libxtst - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxtst.git' - tag: 'libXtst-1.2.4' - version: '1.2.4' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-autoconf-archive - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - - libxext - - libxi - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - # X Damage Extension library - - name: libxdamage - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxdamage.git' - tag: 'libXdamage-1.1.5' - version: '1.1.5' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-autoconf-archive - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - tools_required: - - host-gcc - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-pkg-config - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxtrans - - libxfixes - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: pango - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/pango.git' - tag: '1.50.14' - version: '1.50.14' - tools_required: - - host-pkg-config - - host-gcc - - host-glib - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - glib - - fontconfig - - freetype - - fribidi - - cairo - - xorg-proto - - libx11 - - libxtrans - - libxext - - harfbuzz - - libxft - revision: 3 - configure: - # False positive with GCC 13 and -O3, see bug #903259 - # - # https://gitlab.gnome.org/GNOME/pango/-/issues/740 - - args: ['sed', '-i', '-e', '/\-Werror=array-bounds/d', '@THIS_SOURCE_DIR@/meson.build'] - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--buildtype=release' - - '-Dintrospection=disabled' - - '--wrap-mode=nofallback' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: gdk-pixbuf - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/gdk-pixbuf.git' - tag: '2.40.0' - version: '2.40.0' - tools_required: - - host-gcc - - host-libtool - - host-pkg-config - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - glib - - libjpeg-turbo - - libpng - - shared-mime-info - - libx11 - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '-Dgir=false' - - '-Dman=false' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - scripts: - post_install: - - args: ['gdk-pixbuf-query-loaders', '--update-cache'] - - - name: shared-mime-info - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xdg/shared-mime-info.git' - tag: 'Release-1-15' - version: '1.15' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - tools_required: - - host-gcc - - host-python - pkgs_required: - - mlibc - - glib - - libxml - - itstool - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-update-mimedb' - environ: - 'ITSTOOL': '/usr/bin/itstool' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - scripts: - post_install: - - args: 'echo "Running update-mime-database; this may take a minute or 2..."' - - args: '/usr/bin/update-mime-database /usr/share/mime/' - - # Collection of GSettings schemas for GNOME desktop - # - # This package contains a collection of GSettings schemas for - # settings shared by various components of a GNOME Desktop. - #- name: gsettings-desktop-schemas - # source: - # subdir: 'bundled' - # git: 'https://gitlab.gnome.org/GNOME/gsettings-desktop-schemas.git' - # tag: '42.0' - # version: '42.0' - # tools_required: - # - host-gcc - # - host-gobject-introspection - # - host-libtool - # - host-pkg-config - # - virtual: pkgconfig-for-target - # triple: "x86_64-aero" - # pkgs_required: - # - mlibc - # - glib - # configure: - # - args: | - # sed -i -r 's:"(/system):"/org/gnome\1:g' @THIS_SOURCE_DIR@/schemas/*.in - # - args: - # - 'meson' - # - '--cross-file' - # - '@SOURCE_ROOT@/userland/cross-file.ini' - # - '--prefix=/usr' - # - '-Dintrospection=false' - # - '@THIS_SOURCE_DIR@' - # build: - # - args: ['ninja'] - # - args: ['ninja', 'install'] - # environ: - # DESTDIR: '@THIS_COLLECT_DIR@' - # scripts: - # post_install: - # - args: 'glib-compile-schemas /usr/share/glib-2.0/schemas' - - # Deprecated, please don't depend on this anymore. Only here for gtklife and hexchat. - - name: gtk+-2 - source: - subdir: 'bundled' - url: 'https://download.gnome.org/sources/gtk+/2.24/gtk+-2.24.32.tar.xz' - format: 'tar.xz' - checksum: blake2b:03f4c0a8be98473f62bc8c86859937969c4169960a5f93d37ff6dcde00413215fa6c7125b15781bf50d67b40aa0056cb71b83fb50acb2c3467b5deb3c8d938f0 - extract_path: 'gtk+-2.24.32' - patch-path-strip: 1 - version: '2.24.32' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-glib - regenerate: - - args: ['autoreconf', '-fvi'] - tools_required: - - host-gcc - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - atk - - cairo - - glib - - gdk-pixbuf - - libx11 - - libxext - - libxcb - - pango - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - - '--disable-gtk-doc-html' - - '--disable-cups' - - '--disable-papi' - - '--disable-introspection' - - '--disable-glibtest' - - '--disable-test-print-backend' - - '--enable-xkb' - environ: - ac_cv_func_getresuid: 'no' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - quiet: true - # Rename a file to avoid conflicts, we will use gtk3 as default, so rename this one. - - args: ['mv', '-v', '@THIS_COLLECT_DIR@/usr/bin/gtk-update-icon-cache', '@THIS_COLLECT_DIR@/usr/bin/gtk2-update-icon-cache'] - scripts: - post_install: - - args: ['gtk-query-immodules-2.0', '--update-cache'] - - args: ['glib-compile-schemas', '/usr/share/glib-2.0/schemas'] - - # Collection of GSettings schemas for GNOME desktop - - name: gsettings-desktop-schemas - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/gsettings-desktop-schemas.git' - tag: '42.0' - version: '42.0' - tools_required: - - host-gcc - - host-gobject-introspection - - host-libtool - - host-pkg-config - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - glib - configure: - - args: | - sed -i -r 's:"(/system):"/org/gnome\1:g' @THIS_SOURCE_DIR@/schemas/*.in - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '-Dintrospection=false' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - scripts: - post_install: - - args: 'glib-compile-schemas /usr/share/glib-2.0/schemas' - - - name: gtk+-3 - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/gtk.git' - tag: '3.24.28' - version: '3.24.28' - tools_required: - - host-gcc - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - - host-glib - pkgs_required: - - mlibc - - atk - - at-spi2-atk - - cairo - - glib - - gdk-pixbuf - - libx11 - - libxext - - libxcb - - libxrender - - libxrandr - - libxfixes - - libxdamage - - pango - - fribidi - - libepoxy - - libxkbcommon - - fontconfig - - freetype - - libxi - - harfbuzz - - libxcursor - - gsettings-desktop-schemas - - dbus - configure: - - args: - - 'meson' - - '--native-file' - - '@SOURCE_ROOT@/userland/native-file.ini' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '--libdir=lib' - - '--buildtype=debugoptimized' - - '-Dprint_backends=file' - - '-Dintrospection=false' - - '-Dx11_backend=true' - - '-Dwayland_backend=false' - - '-Dbroadway_backend=true' - - '-Dgtk_doc=false' - - '-Dcolord=no' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - scripts: - post_install: - - args: ['gtk-query-immodules-3.0', '--update-cache'] - - args: ['glib-compile-schemas', '/usr/share/glib-2.0/schemas'] - - # X.Org Xcomposite library - - name: libxcomposite - source: - subdir: 'bundled' - git: 'https://gitlab.freedesktop.org/xorg/lib/libxcomposite.git' - tag: 'libXcomposite-0.4.5' - version: '0.4.5' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - - host-xorg-macros - - host-autoconf-archive - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - tools_required: - - host-gcc - pkgs_required: - - mlibc - - xorg-util-macros - - xorg-proto - - libx11 - - libxfixes - configure: - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--sysconfdir=/etc' - - '--localstatedir=/var' - - '--disable-static' - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: libxslt - source: - subdir: 'bundled' - git: 'https://gitlab.gnome.org/GNOME/libxslt.git' - tag: 'v1.1.34' - version: '1.1.34' - tools_required: - - host-autoconf-v2.69 - - host-automake-v1.16 - - host-libtool - - host-pkg-config - regenerate: - - args: ['./autogen.sh'] - environ: - 'NOCONFIGURE': 'yes' - tools_required: - - host-gcc - pkgs_required: - - mlibc - - libxml - configure: - # BLFS increases the recursion limit, apparently some packages need that to build their documentation. - - args: ['sed', '-i', 's/3000/5000/', '@THIS_SOURCE_DIR@/libxslt/transform.c'] - - args: ['sed', '-i', 's/3000/5000/', '@THIS_SOURCE_DIR@/doc/xsltproc.1'] - - args: ['sed', '-i', 's/3000/5000/', '@THIS_SOURCE_DIR@/doc/xsltproc.xml'] - - args: - - '@THIS_SOURCE_DIR@/configure' - - '--host=x86_64-aero' - - '--prefix=/usr' - - '--disable-static' - - '--without-crypto' - - '--without-debug' - - '--without-debugger' - - '--without-profiler' - - '--without-python' - - '--with-sysroot=@SYSROOT_DIR@' # Set libtool's lt_sysroot. - build: - - args: ['make', '-j@PARALLELISM@'] - - args: ['make', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - - - name: gdk-pixbuf-xlib - source: - subdir: 'bundled' - url: 'https://download.gnome.org/sources/gdk-pixbuf-xlib/2.40/gdk-pixbuf-xlib-2.40.2.tar.xz' - format: 'tar.xz' - checksum: blake2b:a515e86bc69f59910f61fe9c275ab89c0732f0aa2cfb614ac94e597de420d25708a11b9b21313c7cfe3763434f45a8318412ae5889c24c8ed57dac68e09c0227 - extract_path: 'gdk-pixbuf-xlib-2.40.2' - patch-path-strip: 1 - version: '2.40.2' - tools_required: - - host-gcc - - host-libtool - - host-pkg-config - - virtual: pkgconfig-for-target - triple: "x86_64-aero" - pkgs_required: - - mlibc - - gdk-pixbuf - - libx11 - configure: - - args: - - 'meson' - - '--cross-file' - - '@SOURCE_ROOT@/userland/cross-file.ini' - - '--prefix=/usr' - - '@THIS_SOURCE_DIR@' - build: - - args: ['ninja'] - - args: ['ninja', 'install'] - environ: - DESTDIR: '@THIS_COLLECT_DIR@' - scripts: - post_install: - - args: ['gdk-pixbuf-query-loaders', '--update-cache'] From ea9e66bedf906dfb2695ed2f71af5f41cdde06b8 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 30 Mar 2024 14:39:59 +1100 Subject: [PATCH 303/368] misc(kernel): make clippy happier! Signed-off-by: Anhad Singh --- src/Cargo.lock | 46 ++++---- src/aero_kernel/src/acpi/madt.rs | 8 +- .../src/arch/x86_64/controlregs.rs | 9 +- src/aero_kernel/src/arch/x86_64/gdt.rs | 1 + src/aero_kernel/src/arch/x86_64/task.rs | 2 +- src/aero_kernel/src/drivers/block/nvme/mod.rs | 100 ++++++++++-------- .../src/drivers/block/nvme/queue.rs | 1 - src/aero_kernel/src/drivers/e1000.rs | 2 +- src/aero_kernel/src/drivers/pty.rs | 6 +- src/aero_kernel/src/drivers/tty/vtty.rs | 4 +- src/aero_kernel/src/fs/block/mod.rs | 16 +-- src/aero_kernel/src/fs/ext2/disk.rs | 2 - src/aero_kernel/src/fs/ext2/group_desc.rs | 10 +- src/aero_kernel/src/fs/ext2/mod.rs | 12 +-- src/aero_kernel/src/fs/file_table.rs | 5 +- src/aero_kernel/src/fs/inode.rs | 18 ++-- src/aero_kernel/src/fs/mod.rs | 8 +- src/aero_kernel/src/fs/path.rs | 20 +++- src/aero_kernel/src/main.rs | 1 + src/aero_kernel/src/syscall/fs.rs | 17 ++- src/aero_kernel/src/syscall/futex.rs | 2 +- src/aero_kernel/src/syscall/process.rs | 6 +- src/aero_kernel/src/userland/mod.rs | 4 +- src/aero_kernel/src/userland/scheduler/mod.rs | 12 +-- src/aero_kernel/src/userland/task/mod.rs | 7 +- src/aero_kernel/src/userland/task/sessions.rs | 32 +++--- src/aero_kernel/src/userland/terminal.rs | 2 +- src/aero_kernel/src/userland/vm.rs | 32 +++--- src/aero_kernel/src/utils/sync.rs | 6 +- src/aero_syscall/src/lib.rs | 4 +- 30 files changed, 216 insertions(+), 179 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index 4c373e1600e..1e136f7b711 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -9,7 +9,7 @@ dependencies = [ "aero_proc", "aero_syscall", "bit_field", - "bitflags 2.4.2", + "bitflags 2.5.0", "byte_endian", "bytemuck", "cpio_reader", @@ -81,9 +81,9 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "bit_field" @@ -99,9 +99,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "byte_endian" @@ -137,10 +137,10 @@ dependencies = [ [[package]] name = "crabnet" version = "0.1.0" -source = "git+https://github.com/aero-os/crabnet#3e5d0a2041e0776bb637c294c8cb552e54b3a2e2" +source = "git+https://github.com/aero-os/crabnet#58a74ea76fb9586ac1c33fd0adbda497ebdaac43" dependencies = [ "bit_field", - "bitflags 2.4.2", + "bitflags 2.5.0", "byte_endian", "static_assertions", ] @@ -148,7 +148,7 @@ dependencies = [ [[package]] name = "crabnet_tcp" version = "0.1.0" -source = "git+https://github.com/aero-os/crabnet#3e5d0a2041e0776bb637c294c8cb552e54b3a2e2" +source = "git+https://github.com/aero-os/crabnet#58a74ea76fb9586ac1c33fd0adbda497ebdaac43" dependencies = [ "crabnet", "log", @@ -212,9 +212,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "lai" @@ -240,7 +240,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "846c87e24d089e8717a61098cba72b378e3525c46a87cf75b71352dcf668e68c" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", ] [[package]] @@ -260,9 +260,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -350,14 +350,14 @@ version = "11.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", ] [[package]] name = "rayon" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -402,14 +402,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.55", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -447,9 +447,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.52" +version = "2.0.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" dependencies = [ "proc-macro2", "quote", @@ -485,7 +485,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40eb22ae96f050e0c0d6f7ce43feeae26c348fc4dea56928ca81537cfaa6188b" dependencies = [ "arrayvec", - "bitflags 2.4.2", + "bitflags 2.5.0", "cursor-icon", "log", "utf8parse", @@ -534,5 +534,5 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.55", ] diff --git a/src/aero_kernel/src/acpi/madt.rs b/src/aero_kernel/src/acpi/madt.rs index e75dc324850..6ced67daed6 100644 --- a/src/aero_kernel/src/acpi/madt.rs +++ b/src/aero_kernel/src/acpi/madt.rs @@ -106,14 +106,14 @@ impl Iterator for MadtIterator { while self.current < self.limit { unsafe { let entry_pointer = self.current; - let header = *(self.current as *const EntryHeader); + let header = *self.current.cast::(); self.current = self.current.offset(header.length as isize); let item = match header.entry_type { - 0 => MadtEntry::LocalApic(&*(entry_pointer as *const MadtLocalApic)), - 1 => MadtEntry::IoApic(&*(entry_pointer as *const IoApicHeader)), - 2 => MadtEntry::IntSrcOverride(&*(entry_pointer as *const MadtIntSrcOverride)), + 0 => MadtEntry::LocalApic(&*entry_pointer.cast::()), + 1 => MadtEntry::IoApic(&*entry_pointer.cast::()), + 2 => MadtEntry::IntSrcOverride(&*entry_pointer.cast::()), 0x10..=0x7f => continue, 0x80..=0xff => continue, diff --git a/src/aero_kernel/src/arch/x86_64/controlregs.rs b/src/aero_kernel/src/arch/x86_64/controlregs.rs index 13edf5a06ed..601a192bae5 100644 --- a/src/aero_kernel/src/arch/x86_64/controlregs.rs +++ b/src/aero_kernel/src/arch/x86_64/controlregs.rs @@ -19,6 +19,8 @@ use crate::mem::paging::{PhysAddr, PhysFrame, VirtAddr}; bitflags::bitflags! { /// Controls cache settings for the level 4 page table. + #[derive(Debug, Copy, Clone)] + #[repr(transparent)] pub struct Cr3Flags: u64 { /// Use a writethrough cache policy for the P4 table (else a writeback policy is used). const PAGE_LEVEL_WRITETHROUGH = 1 << 3; @@ -29,6 +31,8 @@ bitflags::bitflags! { bitflags::bitflags! { /// Controls cache settings for the level 4 page table. + #[derive(Debug, Copy, Clone)] + #[repr(transparent)] pub struct Cr4Flags: u64 { /// Enables hardware-supported performance enhancements for software running in /// virtual-8086 mode. @@ -86,6 +90,8 @@ bitflags::bitflags! { bitflags::bitflags! { /// Configuration flags of the [`Cr0`] register. + #[derive(Debug, Copy, Clone)] + #[repr(transparent)] pub struct Cr0Flags: u64 { /// Enables protected mode. const PROTECTED_MODE_ENABLE = 1; @@ -184,7 +190,7 @@ bitflags::bitflags! { } bitflags::bitflags! { - #[derive(Debug)] + #[derive(Debug, Copy, Clone)] pub struct MxCsr: u32 { const INVALID_OPERATION = 1 << 0; const DENORMAL = 1 << 1; @@ -212,6 +218,7 @@ bitflags::bitflags! { /// For MPX, [`BNDREG`](XCr0Flags::BNDREG) and [`BNDCSR`](XCr0Flags::BNDCSR) must be set/unset simultaneously. /// For AVX-512, [`OPMASK`](XCr0Flags::OPMASK), [`ZMM_HI256`](XCr0Flags::ZMM_HI256), and [`HI16_ZMM`](XCr0Flags::HI16_ZMM) /// must be set/unset simultaneously. + #[derive(Debug, Copy, Clone)] #[repr(transparent)] pub struct XCr0Flags: u64 { /// Enables using the x87 FPU state diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index 35e10f37e9e..7e8df0e6707 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -31,6 +31,7 @@ use core::ptr::addr_of; use alloc::alloc::alloc_zeroed; bitflags::bitflags! { + #[derive(Debug, Copy, Clone)] struct GdtEntryFlags: u8 { const PROTECTED_MODE = 1 << 6; const LONG_MODE = 1 << 5; diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 6d4d6f5960d..a903d0fcdd8 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -367,7 +367,7 @@ impl ArchTask { pub fn exec( &mut self, vm: &Vm, - executable: DirCacheItem, + executable: &DirCacheItem, argv: Option, envv: Option, diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 01959e339d7..cebdb406be4 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -233,12 +233,13 @@ impl<'a> Namespace<'a> { assert!(size_bytes != 0); let blocks = size_bytes.div_ceil(self.block_size); - let mut read_cmd = ReadWriteCommand::default(); - - read_cmd.opcode = opcode as u8; - read_cmd.nsid = self.nsid; - read_cmd.start_lba = sector as u64; - read_cmd.length = (blocks - 1) as u16; + let mut read_cmd = ReadWriteCommand { + opcode: opcode as u8, + nsid: self.nsid, + start_lba: sector as u64, + length: (blocks - 1) as u16, + ..Default::default() + }; if size_bytes > Size4KiB::SIZE as usize { // The data cannot fit in 8KiB frames, so we need to use @@ -338,13 +339,18 @@ impl<'a> Controller<'a> { registers.set_enable(true)?; let identity = Dma::::zeroed(); - let mut identify_command = IdentifyCommand::default(); - identify_command.opcode = AdminOpcode::Identify as u8; - identify_command.cns = IdentifyCns::Controller as u8; - identify_command.data_ptr.prp1 = identity.addr().as_u64(); - - admin.submit_command(identify_command); + // TODO(andypython): builder pattern for building a command? We also shouldn't be required + // to manually fill in the `opcode` field. + admin.submit_command(IdentifyCommand { + opcode: AdminOpcode::Identify as u8, + cns: IdentifyCns::Controller as u8, + data_ptr: DataPointer { + prp1: identity.addr().as_u64(), + ..Default::default() + }, + ..Default::default() + }); log::trace!( "nvme: identifed controller (vendor={}, subsystem_vendor={})", @@ -355,27 +361,25 @@ impl<'a> Controller<'a> { // Create and initialize the I/O queues. let io_queue = QueuePair::new(registers, queue_size)?; - let mut io_cq_cmd = CreateCQCommand::default(); - - io_cq_cmd.opcode = AdminOpcode::CreateCq as u8; - io_cq_cmd.prp1 = io_queue.completion_addr().as_u64(); - io_cq_cmd.cqid = io_queue.id(); - io_cq_cmd.q_size = (io_queue.len() - 1) as u16; - io_cq_cmd.irq_vector = 0; - io_cq_cmd.cq_flags = CommandFlags::QUEUE_PHYS_CONTIG.bits(); - - admin.submit_command(io_cq_cmd); - - let mut io_sq_cmd = CreateSQCommand::default(); - - io_sq_cmd.opcode = AdminOpcode::CreateSq as u8; - io_sq_cmd.prp1 = io_queue.submission_addr().as_u64(); - io_sq_cmd.cqid = io_queue.id(); - io_sq_cmd.sqid = io_queue.id(); - io_sq_cmd.q_size = (io_queue.len() - 1) as u16; - io_sq_cmd.sq_flags = CommandFlags::QUEUE_PHYS_CONTIG.bits(); + admin.submit_command(CreateCQCommand { + opcode: AdminOpcode::CreateCq as u8, + prp1: io_queue.completion_addr().as_u64(), + cqid: io_queue.id(), + q_size: (io_queue.len() - 1) as u16, + irq_vector: 0, + cq_flags: CommandFlags::QUEUE_PHYS_CONTIG.bits(), + ..Default::default() + }); - admin.submit_command(io_sq_cmd); + admin.submit_command(CreateSQCommand { + opcode: AdminOpcode::CreateSq as u8, + prp1: io_queue.submission_addr().as_u64(), + cqid: io_queue.id(), + sqid: io_queue.id(), + q_size: (io_queue.len() - 1) as u16, + sq_flags: CommandFlags::QUEUE_PHYS_CONTIG.bits(), + ..Default::default() + }); let shift = 12 + registers.capability.mpsmin() as usize; let max_transfer_shift = if identity.mdts != 0 { @@ -395,13 +399,16 @@ impl<'a> Controller<'a> { // Discover and initialize the namespaces. let nsids = { let nsid_list = Dma::::new_uninit_slice(this.identity.nn as usize); - let mut nsid_command = IdentifyCommand::default(); - nsid_command.opcode = AdminOpcode::Identify as u8; - nsid_command.cns = IdentifyCns::ActivateList as u8; - nsid_command.data_ptr.prp1 = nsid_list.addr().as_u64(); - - this.admin.lock().submit_command(nsid_command); + this.admin.lock().submit_command(IdentifyCommand { + opcode: AdminOpcode::Identify as u8, + cns: IdentifyCns::ActivateList as u8, + data_ptr: DataPointer { + prp1: nsid_list.addr().as_u64(), + ..Default::default() + }, + ..Default::default() + }); // SAFETY: The list is initialized above. unsafe { nsid_list.assume_init() } @@ -416,14 +423,17 @@ impl<'a> Controller<'a> { } let identity = Dma::::zeroed(); - let mut identify_command = IdentifyCommand::default(); - - identify_command.opcode = AdminOpcode::Identify as u8; - identify_command.cns = IdentifyCns::Namespace as u8; - identify_command.nsid = nsid; - identify_command.data_ptr.prp1 = identity.addr().as_u64(); - this.admin.lock().submit_command(identify_command); + this.admin.lock().submit_command(IdentifyCommand { + opcode: AdminOpcode::Identify as u8, + cns: IdentifyCns::Namespace as u8, + nsid, + data_ptr: DataPointer { + prp1: identity.addr().as_u64(), + ..Default::default() + }, + ..Default::default() + }); let blocks = identity.nsze as usize; let block_size = 1 << identity.lbaf[(identity.flbas & 0b11111) as usize].ds; diff --git a/src/aero_kernel/src/drivers/block/nvme/queue.rs b/src/aero_kernel/src/drivers/block/nvme/queue.rs index fa45e47aa0f..6763564bb4c 100644 --- a/src/aero_kernel/src/drivers/block/nvme/queue.rs +++ b/src/aero_kernel/src/drivers/block/nvme/queue.rs @@ -1,5 +1,4 @@ use core::cell::UnsafeCell; -use core::ptr; use core::sync::atomic::{AtomicU16, Ordering}; use crate::mem::paging::PhysAddr; diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index 3b8975cd599..27cca5d9700 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -613,7 +613,7 @@ impl NetworkDriver for Device { loop { let mut e1000 = self.e1000.lock_irq(); if let Some(data) = e1000.recv() { - self.wq.remove(task); + self.wq.remove(&task); return data; } else { drop(e1000); diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 931b8db71be..711d9bfaa48 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -187,7 +187,7 @@ impl INodeInterface for Master { impl TerminalDevice for Slave { fn attach(&self, task: Arc) { assert!(task.is_session_leader()); - self.master.discipline.set_foreground(task); + self.master.discipline.set_foreground(&task); } fn detach(&self, task: Arc) { @@ -246,11 +246,11 @@ impl INodeInterface for Slave { TermiosCmd::GetWinSize(mut size) => *size = self.master.get_window_size(), TermiosCmd::SetWinSize(size) => self.master.set_window_size(*size), TermiosCmd::TcGets(mut termios) => *termios = self.master.discipline.termios(), - TermiosCmd::TcSetsf(termios) => self.master.discipline.set_termios(*termios), + TermiosCmd::TcSetsf(termios) => self.master.discipline.set_termios(termios.clone()), TermiosCmd::TcSetsw(termios) => { // TODO: Allow the output buffer to drain and then set the current serial port // settings. - self.master.discipline.set_termios(*termios) + self.master.discipline.set_termios(termios.clone()) } TermiosCmd::SetCtrlTerm => { diff --git a/src/aero_kernel/src/drivers/tty/vtty.rs b/src/aero_kernel/src/drivers/tty/vtty.rs index 11b8a16b68a..4174cc2ace9 100644 --- a/src/aero_kernel/src/drivers/tty/vtty.rs +++ b/src/aero_kernel/src/drivers/tty/vtty.rs @@ -320,7 +320,7 @@ impl INodeInterface for Tty { let lock = TERMIOS.lock_irq(); let this = &*lock; - *termios = *this; + *termios = this.clone(); Ok(0x00) } @@ -337,7 +337,7 @@ impl INodeInterface for Tty { let mut lock = TERMIOS.lock_irq(); let this = &mut *lock; - *this = *termios; + *this = termios.clone(); Ok(0x00) } diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index d74ad267fb9..870d3837d5f 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -76,8 +76,8 @@ impl CachedPage { self.page.start_address() } - fn make_key(device: Weak, offset: usize) -> PageCacheKey { - (device.as_ptr() as *const u8 as usize, offset) + fn make_key(device: &Weak, offset: usize) -> PageCacheKey { + (device.as_ptr().addr(), offset) } /// Returns whether the page has been marked dirty. @@ -116,7 +116,7 @@ impl Drop for CachedPage { impl Cacheable for CachedPage { fn cache_key(&self) -> PageCacheKey { - Self::make_key(self.device.clone(), self.offset) + Self::make_key(&self.device, self.offset) } } @@ -133,9 +133,9 @@ impl Cache { /// * `device` - The device to get the page from. /// * `offset` - The offset in bytes to the data. This will be rounded down to the nearest page /// boundary. - pub fn get_page(&self, device: Weak, offset: usize) -> PageCacheItem { + pub fn get_page(&self, device: &Weak, offset: usize) -> PageCacheItem { let cache_offset = offset / Size4KiB::SIZE as usize; - let cache_key = CachedPage::make_key(device.clone(), cache_offset); + let cache_key = CachedPage::make_key(device, cache_offset); if let Some(page) = PAGE_CACHE.get(cache_key) { return page; @@ -161,7 +161,7 @@ pub struct DirtyRef { } impl DirtyRef { - pub fn new(device: Weak, offset: usize) -> Self { + pub fn new(device: &Weak, offset: usize) -> Self { let cache = PAGE_CACHE.get_page(device, offset); let ptr_offset = offset % Size4KiB::SIZE as usize; @@ -209,7 +209,7 @@ pub trait CachedAccess: BlockDeviceInterface { let mut loc = 0; while loc < dest.len() { - let page = PAGE_CACHE.get_page(self.sref(), offset); + let page = PAGE_CACHE.get_page(&self.sref(), offset); let page_offset = offset % Size4KiB::SIZE as usize; let size = core::cmp::min(Size4KiB::SIZE as usize - page_offset, dest.len() - loc); @@ -236,7 +236,7 @@ pub trait CachedAccess: BlockDeviceInterface { let mut loc = 0; while loc < buffer.len() { - let page = PAGE_CACHE.get_page(self.sref(), offset); + let page = PAGE_CACHE.get_page(&self.sref(), offset); let page_offset = offset % Size4KiB::SIZE as usize; let size = core::cmp::min(Size4KiB::SIZE as usize - page_offset, buffer.len() - loc); diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index faf9af574b6..4f38aca74b4 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -15,8 +15,6 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -use core::ptr; - use bit_field::BitField; use crate::fs::inode; diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index beaca675e44..97c5ff113c8 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -47,7 +47,7 @@ impl GroupDescriptors { /// * `device` - Block device to read the group descriptors from. pub fn new( ext2: Weak, - device: Arc, + device: &BlockDevice, superblock: &disk::SuperBlock, ) -> Option { let bgdt_len = superblock.bgdt_len(); @@ -134,7 +134,7 @@ impl GroupDescriptors { let mut descriptors = self.descriptors.write(); let block_group = &mut descriptors[block_group_idx]; - let mut bitmap = Bitmap::new(fs, block_group.block_bitmap as usize)?; + let mut bitmap = Bitmap::new(&fs, block_group.block_bitmap as usize)?; let block_id = block_group_idx * blocks_per_group + bitmap.alloc()?; block_group.free_blocks_count -= 1; @@ -156,7 +156,7 @@ impl GroupDescriptors { let mut descriptors = self.descriptors.write(); let block_group = &mut descriptors[block_group_idx]; - let mut bitmap = Bitmap::new(fs, block_group.inode_bitmap as usize)?; + let mut bitmap = Bitmap::new(&fs, block_group.inode_bitmap as usize)?; // Since inode numbers start from 1 rather than 0, the first bit in the first block // group's inode bitmap represent inode number 1. Thus, we add 1 to the allocated // inode number. @@ -184,7 +184,7 @@ impl Bitmap { /// /// **Note**: Any changes to the bitmap will be written back to the disk when the /// bitmap has been dropped. - fn new(fs: Arc, block: usize) -> Option { + fn new(fs: &Arc, block: usize) -> Option { let block_size = fs.superblock.block_size(); let offset = block * block_size; @@ -198,7 +198,7 @@ impl Bitmap { Some(Self { bitmap, offset, - fs: Arc::downgrade(&fs), + fs: Arc::downgrade(fs), }) } diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 92d4f390ff3..18036123913 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -105,7 +105,7 @@ impl INode { let block_index = self.get_block(block).unwrap() as usize; - block::DirtyRef::new(filesystem.block.sref(), (block_index * block_size) + loc) + block::DirtyRef::new(&filesystem.block.sref(), (block_index * block_size) + loc) } pub fn read(&self, offset: usize, buffer: &mut [MaybeUninit]) -> super::Result { @@ -290,14 +290,14 @@ impl INode { } } - pub fn make_disk_dirent(&self, inode: Arc, file_type: u8, name: &str) { + pub fn make_disk_dirent(&self, inode: &INode, file_type: u8, name: &str) { // TODO: scan for unused directory entries and check if this can be // inserted into the existing block. let block = self.append_block().unwrap(); let fs = self.fs.upgrade().expect("ext2: filesystem was dropped"); let block_size = fs.superblock.block_size(); - let mut entry = DirtyRef::::new(fs.block.sref(), block * block_size); + let mut entry = DirtyRef::::new(&fs.block.sref(), block * block_size); entry.entry_size = block_size as _; entry.inode = inode.id as _; entry.file_type = file_type; @@ -338,7 +338,7 @@ impl INode { } // FIXME: Fix the filetype! - self.make_disk_dirent(ext2_inode, 2, name); + self.make_disk_dirent(&ext2_inode, 2, name); Ok(inode) } @@ -458,7 +458,7 @@ impl INodeInterface for INode { if let Some(_parent) = old.parent() { // FIXME: Remove the directory entry from the parent - self.make_disk_dirent(old.inode().downcast_arc().unwrap(), 2, dest); + self.make_disk_dirent(&old.inode().downcast_arc().unwrap(), 2, dest); return Ok(()); } @@ -719,7 +719,7 @@ impl Ext2 { ); Some(Arc::new_cyclic(|sref| Self { - bgdt: GroupDescriptors::new(sref.clone(), block.clone(), &superblock) + bgdt: GroupDescriptors::new(sref.clone(), &block, &superblock) .expect("ext2: failed to read group descriptors"), superblock, block, diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index c4428f50f62..ca86a505f58 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -30,6 +30,7 @@ use super::cache::{DirCacheItem, INodeCacheItem}; use super::inode::FileType; use super::FileSystemError; +#[derive(Debug, Copy, Clone)] pub enum DuplicateHint { Exact(usize), Any, @@ -270,7 +271,7 @@ impl FileTable { // Ensure the file descriptor is available. if files[new_fd].is_none() { files[new_fd] = Some(handle.duplicate(new_fd, flags)?); - Ok(0x00) + Ok(0) } else { // If the file descriptor is not available, then we close the // old one and set its handle to the new duplicate handle. @@ -280,7 +281,7 @@ impl FileTable { old.inode.inode().close(*old.flags.read()); files[new_fd] = Some(handle); - Ok(0x00) + Ok(0) } } diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index a3ae965c8b2..5b8d3c0261c 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -57,7 +57,7 @@ impl Drop for PollTable { fn drop(&mut self) { let ctask = scheduler::get_scheduler().current_task(); for queue in self.queues.iter() { - queue.remove(ctask.clone()); + queue.remove(&ctask); } } } @@ -419,10 +419,16 @@ impl DirEntry { // ".." (ie. we do not want to re-cache the current directory's, parent directory). let cache_me = ![".", ".."].contains(&name.as_str()); + let filesystem = if let Some(fs) = inode.weak_filesystem() { + Once::initialized(fs) + } else { + Once::new() + }; + let entry = Self { data: BMutex::new(DirProtectedData { parent: Some(parent), - inode: inode.clone(), + inode, name, }), @@ -432,11 +438,7 @@ impl DirEntry { 0x00 }, - filesystem: if let Some(filesystem) = inode.weak_filesystem() { - Once::initialized(filesystem) - } else { - Once::new() - }, + filesystem, }; if cache_me { @@ -540,7 +542,7 @@ impl DirEntry { /// Fetches a cached directory entry item from the directory cache. Returns if /// the provided entry exists in the given parent directory cache. -pub fn fetch_dir_entry(parent: DirCacheItem, name: String) -> Option { +pub fn fetch_dir_entry(parent: &DirCacheItem, name: String) -> Option { let dcache = cache::dcache(); let cache_key = (parent.cache_marker, name); diff --git a/src/aero_kernel/src/fs/mod.rs b/src/aero_kernel/src/fs/mod.rs index 37a17c50345..570dbfa5ec5 100644 --- a/src/aero_kernel/src/fs/mod.rs +++ b/src/aero_kernel/src/fs/mod.rs @@ -103,9 +103,9 @@ impl MountManager { Ok(()) } - fn find_mount(&self, directory: DirCacheItem) -> Result { + fn find_mount(&self, dir: &DirCacheItem) -> Result { let this = self.0.lock(); - let cache_key = directory.cache_key(); + let cache_key = dir.cache_key(); if let Some(mount_point) = this.get(&cache_key) { Ok(mount_point.clone()) @@ -197,7 +197,7 @@ pub fn lookup_path_with( _ => { // After we have resolved all of the special cases that might occur in a path, now // we have to resolve the directory entry itself. For example `a` in `./a/`. - let cache_entry = inode::fetch_dir_entry(cwd.clone(), String::from(component)); + let cache_entry = inode::fetch_dir_entry(&cwd, String::from(component)); let parent = cwd.clone(); if let Some(entry) = cache_entry { @@ -251,7 +251,7 @@ pub fn lookup_path_with( resolve_last, )?; } else if metadata.is_directory() { - if let Ok(mount_point) = MOUNT_MANAGER.find_mount(cwd.clone()) { + if let Ok(mount_point) = MOUNT_MANAGER.find_mount(&cwd) { cwd = mount_point.root_entry; } } diff --git a/src/aero_kernel/src/fs/path.rs b/src/aero_kernel/src/fs/path.rs index 40905999c9e..388b497d687 100644 --- a/src/aero_kernel/src/fs/path.rs +++ b/src/aero_kernel/src/fs/path.rs @@ -103,6 +103,13 @@ impl AsRef for &str { } } +impl AsRef for String { + #[inline] + fn as_ref(&self) -> &Path { + Path::new(self) + } +} + /// An owned, mutable path (akin to [`String`]). #[derive(Debug, Clone, PartialEq, Eq)] pub struct PathBuf(String); @@ -143,6 +150,13 @@ impl PathBuf { } } +impl Default for PathBuf { + #[inline] + fn default() -> Self { + PathBuf::new() + } +} + impl From for PathBuf { #[inline] fn from(path: String) -> Self { @@ -172,10 +186,10 @@ impl AsRef for PathBuf { } } -impl Into for PathBuf { +impl From for String { #[inline] - fn into(self) -> String { - self.0 + fn from(val: PathBuf) -> Self { + val.0 } } diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 72d802f5e33..d3a3e707252 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -63,6 +63,7 @@ #![no_std] #![no_main] #![reexport_test_harness_main = "test_main"] +#![warn(clippy::needless_pass_by_value)] #![deny(clippy::ptr_as_ptr)] #[macro_use] diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 5b543914053..f9b93a801be 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -20,15 +20,13 @@ use core::fmt; use aero_syscall::prelude::*; use aero_syscall::signal::SigProcMask; use aero_syscall::{AtFlags, OpenFlags, Stat, TimeSpec, AT_FDCWD}; -use alloc::borrow::ToOwned; -use alloc::sync::Arc; +use alloc::sync::{Arc, Weak}; use crate::fs::cache::{self, DirCacheImpl}; use crate::fs::epoll::EPoll; use crate::fs::eventfd::EventFd; use crate::fs::file_table::{DuplicateHint, FileHandle}; use crate::fs::inode::{DirEntry, PollTable}; -use crate::fs::path::PathBuf; use crate::fs::pipe::Pipe; use crate::fs::{self, lookup_path, LookupMode}; use crate::syscall::SysArg; @@ -70,9 +68,9 @@ impl super::SysArg for FileDescriptor { } } -impl Into for FileDescriptor { - fn into(self) -> usize { - self.0 +impl From for usize { + fn from(val: FileDescriptor) -> Self { + val.0 } } @@ -623,9 +621,10 @@ pub fn link(src_path: &Path, dest_path: &Path) -> Result { // strong references to it. // // TODO: Should this be moved to the inode impl? - if dest_dir.weak_filesystem().unwrap().as_ptr() - != src.inode().weak_filesystem().unwrap().as_ptr() - { + if !Weak::ptr_eq( + &dest_dir.weak_filesystem().unwrap(), + &src.inode().weak_filesystem().unwrap(), + ) { return Err(SyscallError::EINVAL); } diff --git a/src/aero_kernel/src/syscall/futex.rs b/src/aero_kernel/src/syscall/futex.rs index e0782114906..c7d6ec0a390 100644 --- a/src/aero_kernel/src/syscall/futex.rs +++ b/src/aero_kernel/src/syscall/futex.rs @@ -97,7 +97,7 @@ impl FutexContainer { futex.insert(current_task.clone()); scheduler.inner.await_io()?; - futex.remove(current_task); + futex.remove(¤t_task); if futex.is_empty() { self.futexes.lock().remove(&key); diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index df60b8e6c43..9682a54d834 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -140,7 +140,7 @@ pub fn exec(path: &Path, args: usize, argc: usize, envs: usize, envc: usize) -> scheduler::get_scheduler() .current_task() - .exec(executable, argv, envv) + .exec(&executable, argv, envv) .expect("task: failed to exec task"); unreachable!() @@ -378,7 +378,7 @@ fn find_task_by_pid(pid: usize) -> Result> { #[syscall] pub fn getpgid(pid: usize) -> Result { let task = find_task_by_pid(pid)?; - let group = SESSIONS.find_group(task).unwrap(); + let group = SESSIONS.find_group(&task).unwrap(); Ok(group.id()) } @@ -416,6 +416,6 @@ pub fn setsid() -> Result { return Err(SyscallError::EPERM); } - SESSIONS.isolate(current_task); + SESSIONS.isolate(¤t_task); Ok(0) } diff --git a/src/aero_kernel/src/userland/mod.rs b/src/aero_kernel/src/userland/mod.rs index 2954470514b..7b7853de708 100644 --- a/src/aero_kernel/src/userland/mod.rs +++ b/src/aero_kernel/src/userland/mod.rs @@ -28,7 +28,7 @@ pub fn run() -> fs::Result<()> { let init_path = Path::new("/usr/bin/init"); let init_inode = fs::lookup_path(init_path)?; - scheduler::get_scheduler().exec(init_inode, None, None); + scheduler::get_scheduler().exec(&init_inode, None, None); Ok(()) } @@ -37,6 +37,6 @@ pub fn run_tests() -> fs::Result<()> { let utest_path = Path::new("/usr/bin/utest"); let utest_inode = fs::lookup_path(utest_path)?; - scheduler::get_scheduler().exec(utest_inode, None, None); + scheduler::get_scheduler().exec(&utest_inode, None, None); Ok(()) } diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index 8f5629bba49..692bf81a06e 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -70,7 +70,7 @@ impl TaskContainer { self.0.lock().insert(task_id, task); } - fn remove_task(&self, task: Arc) { + fn remove_task(&self, task: &Task) { self.0.lock().remove(&task.pid()); } } @@ -104,12 +104,12 @@ impl Scheduler { /// Registers the provided task in the schedulers queue. pub fn register_task(&self, task: Arc) { self.tasks.register_task(task.pid(), task.clone()); - self.inner.register_task(task.clone()); - SESSIONS.register_task(task); + SESSIONS.register_task(task.clone()); + self.inner.register_task(task); } #[inline] - pub fn exec(&self, executable: DirCacheItem, argv: Option, envv: Option) { + pub fn exec(&self, executable: &DirCacheItem, argv: Option, envv: Option) { self.inner .current_task() .exec(executable, argv, envv) @@ -124,8 +124,8 @@ impl Scheduler { pub fn exit(&self, status: ExitStatus) -> ! { let current_task = self.inner.current_task(); - SESSIONS.remove_task(current_task.clone()); - self.tasks.remove_task(current_task); + SESSIONS.remove_task(¤t_task); + self.tasks.remove_task(¤t_task); self.inner.exit(status) } diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index c242e511759..f14abd89d8c 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -517,7 +517,7 @@ impl Task { pub fn exec( &self, - executable: DirCacheItem, + executable: &DirCacheItem, argv: Option, envv: Option, @@ -598,6 +598,11 @@ impl Task { // TODO: is_process_leader() && children.len() == 0 and then // assert!(self.file_table.strong_count() == 1); dbg!(Arc::strong_count(&self.file_table)); + log::warn!( + "HI MOM HI MOM HI MOM HI MOM: I HAVE {} STRONG AND {} WEAK REFERENCES", + Weak::strong_count(&self.sref), + Weak::weak_count(&self.sref) + ); if Arc::strong_count(&self.file_table) == 1 { self.file_table.0.read().iter().for_each(|file| { if let Some(handle) = file { diff --git a/src/aero_kernel/src/userland/task/sessions.rs b/src/aero_kernel/src/userland/task/sessions.rs index c0502680ddd..e6a8a003036 100644 --- a/src/aero_kernel/src/userland/task/sessions.rs +++ b/src/aero_kernel/src/userland/task/sessions.rs @@ -36,13 +36,15 @@ pub struct Group { impl Group { /// Creates a new process group. pub fn new(leader: Arc) -> Arc { - let mut tasks = HashMap::new(); - tasks.insert(leader.pid(), leader.clone()); - leader.set_group_id(leader.pid().as_usize()); + let id = leader.pid().as_usize(); + + let mut tasks = HashMap::new(); + tasks.insert(leader.pid(), leader); + Arc::new(Self { - id: leader.pid().as_usize(), + id, tasks: Mutex::new(tasks), }) } @@ -55,7 +57,7 @@ impl Group { assert!(self.tasks.lock_irq().insert(task.pid(), task).is_none()); } - pub fn remove_task(&self, task: Arc) { + pub fn remove_task(&self, task: &Arc) { assert!(self.tasks.lock_irq().remove(&task.pid()).is_some()); } @@ -80,17 +82,17 @@ pub struct Session { impl Session { /// Creates a new process session. pub fn new(leader: Arc) -> Arc { - let mut groups = HashMap::new(); - groups.insert(leader.pid().as_usize(), Group::new(leader.clone())); - leader.set_session_id(leader.pid().as_usize()); + let mut groups = HashMap::new(); + groups.insert(leader.pid().as_usize(), Group::new(leader)); + Arc::new(Self { groups: Mutex::new(groups), }) } - pub fn find(&self, target: Arc) -> Option> { + pub fn find(&self, target: &Arc) -> Option> { self.groups.lock_irq().get(&target.group_id()).cloned() } @@ -107,13 +109,13 @@ impl Session { } } - pub fn remove_task(&self, task: Arc) { + pub fn remove_task(&self, task: &Arc) { let mut groups = self.groups.lock(); let group = groups .get(&task.group_id()) .expect("Session::remove_task: ESRCH"); - group.remove_task(task.clone()); + group.remove_task(task); if group.is_empty() { assert!(task.is_group_leader()); @@ -136,7 +138,7 @@ impl SessionList { .insert(leader.pid().as_usize(), Session::new(leader)); } - pub fn find_group(&self, target: Arc) -> Option> { + pub fn find_group(&self, target: &Arc) -> Option> { self.0.lock_irq().get(&target.session_id())?.find(target) } @@ -153,13 +155,13 @@ impl SessionList { } } - pub fn remove_task(&self, task: Arc) { + pub fn remove_task(&self, task: &Arc) { let mut sessions = self.0.lock_irq(); let session = sessions .get(&task.session_id()) .expect("SessionList::remove_task: ESRCH"); - session.remove_task(task.clone()); + session.remove_task(task); if session.is_empty() { assert!(task.is_session_leader()); @@ -167,7 +169,7 @@ impl SessionList { } } - pub fn isolate(&self, task: Arc) { + pub fn isolate(&self, task: &Arc) { assert!(!task.is_group_leader() && !task.is_session_leader()); let leader = task.process_leader(); diff --git a/src/aero_kernel/src/userland/terminal.rs b/src/aero_kernel/src/userland/terminal.rs index d7fc67fc888..5d1313f3a81 100644 --- a/src/aero_kernel/src/userland/terminal.rs +++ b/src/aero_kernel/src/userland/terminal.rs @@ -170,7 +170,7 @@ impl LineDiscipline { self.foreground.read().upgrade() } - pub fn set_foreground(&self, task: Arc) { + pub fn set_foreground(&self, task: &Arc) { *self.foreground.write() = Arc::downgrade(&SESSIONS.find_group(task).unwrap()); } diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 5bfef124bfd..4f552704010 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -57,7 +57,7 @@ pub enum ElfLoadError { MemoryMapError, } -fn parse_elf_header<'header>(file: DirCacheItem) -> Result, ElfLoadError> { +fn parse_elf_header<'header>(file: &DirCacheItem) -> Result, ElfLoadError> { // 1. Read the ELF PT1 header: let pt1_hdr_slice = Box::leak(mem::alloc_boxed_buffer::(ELF_PT1_SIZE)); @@ -103,7 +103,7 @@ fn parse_elf_header<'header>(file: DirCacheItem) -> Result, ElfL } fn parse_program_header<'pheader>( - file: DirCacheItem, + file: &DirCacheItem, header: Header<'pheader>, index: u16, ) -> Result, ElfLoadError> { @@ -151,9 +151,8 @@ struct Shebang { } impl Shebang { - fn new(path: String, argument: String) -> Result { - let path = Path::new(&path); - let interpreter = fs::lookup_path(path).map_err(ElfLoadError::IOError)?; + fn new>(path: P, argument: String) -> Result { + let interpreter = fs::lookup_path(path.as_ref()).map_err(ElfLoadError::IOError)?; Ok(Self { interpreter, @@ -164,7 +163,7 @@ impl Shebang { /// Returns [`true`] if the provided executable (`bin`) contains a shebang /// at the start. -fn contains_shebang(bin: DirCacheItem) -> Result { +fn contains_shebang(bin: &DirCacheItem) -> Result { let shebang = &mut [0u8; 2]; bin.inode() @@ -174,8 +173,8 @@ fn contains_shebang(bin: DirCacheItem) -> Result { Ok(shebang[0] == b'#' && shebang[1] == b'!') } -fn parse_shebang(bin: DirCacheItem) -> Result, ElfLoadError> { - if !contains_shebang(bin.clone())? { +fn parse_shebang(bin: &DirCacheItem) -> Result, ElfLoadError> { + if !contains_shebang(bin)? { return Ok(None); } @@ -238,7 +237,7 @@ pub struct Elf<'this> { impl<'this> Elf<'this> { fn new(file: DirCacheItem) -> Result { - let header = parse_elf_header(file.clone())?; + let header = parse_elf_header(&file)?; Ok(Self { header, file }) } @@ -276,8 +275,7 @@ impl<'this> Iterator for ProgramHeaderIter<'this> { } // Parse and return the program header. - let result = - parse_program_header(self.file.clone(), self.header, self.next_index as u16).ok(); + let result = parse_program_header(&self.file, self.header, self.next_index as u16).ok(); // Increment the next index. self.next_index += 1; @@ -907,12 +905,12 @@ impl VmProtected { fn load_bin<'header>( &mut self, - bin: DirCacheItem, + bin: &DirCacheItem, argv: Option, envv: Option, ) -> Result, ElfLoadError> { // check for a shebang before proceeding. - if let Some(shebang) = parse_shebang(bin.clone())? { + if let Some(shebang) = parse_shebang(bin)? { log::debug!( "shebang: (interpreter={}, argument={})", shebang.interpreter.absolute_path(), @@ -933,7 +931,7 @@ impl VmProtected { largv.extend(&argv.inner[1..]) } - return self.load_bin(shebang.interpreter, Some(largv), envv); + return self.load_bin(&shebang.interpreter, Some(largv), envv); } let elf = Elf::new(bin.clone())?; @@ -1049,7 +1047,7 @@ impl VmProtected { } else if header_type == xmas_elf::program::Type::Interp { let ld = fs::lookup_path(fs::Path::new("/usr/lib/ld.so")).unwrap(); - let res = self.load_bin(ld, None, None)?; + let res = self.load_bin(&ld, None, None)?; entry_point = res.entry_point; } } @@ -1168,7 +1166,7 @@ impl VmProtected { let data = parent.inner.lock(); // Copy over all of the mappings from the parent into the child. - self.mappings = data.mappings.clone(); + self.mappings.clone_from(&data.mappings); } } @@ -1213,7 +1211,7 @@ impl Vm { /// Mapping the provided `bin` file into the VM. pub fn load_bin( &self, - bin: DirCacheItem, + bin: &DirCacheItem, argv: Option, envv: Option, ) -> Result { diff --git a/src/aero_kernel/src/utils/sync.rs b/src/aero_kernel/src/utils/sync.rs index 7dbe1f53f9c..c171ec7617d 100644 --- a/src/aero_kernel/src/utils/sync.rs +++ b/src/aero_kernel/src/utils/sync.rs @@ -64,7 +64,7 @@ impl WaitQueue { lock = mutex.lock_irq(); } - self.remove(task); + self.remove(&task); Ok(lock) } @@ -72,7 +72,7 @@ impl WaitQueue { self.queue.lock_irq().push(task); } - pub fn remove(&self, task: Arc) { + pub fn remove(&self, task: &Task) { let mut tasks = self.queue.lock_irq(); tasks @@ -163,7 +163,7 @@ impl BMutex { loop { if let Some(guard) = self.spin.inner.try_lock() { - self.wq.remove(task); + self.wq.remove(&task); return BMutexGuard { guard, mutex: self }; } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 15e3e4514f4..437fca0fdd6 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -273,7 +273,7 @@ pub struct TimeSpec { } #[repr(usize)] -#[derive(Debug)] +#[derive(Debug, Copy, Clone)] pub enum SeekWhence { SeekCur = 1, SeekEnd = 2, @@ -422,7 +422,7 @@ bitflags::bitflags! { } } -#[derive(Debug, Default, Copy, Clone)] +#[derive(Debug, Default, Clone)] #[repr(C)] pub struct Termios { pub c_iflag: TermiosIFlag, From 694e57fd2ad285a9ecb420b9a38f903833dc8482 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 30 Mar 2024 23:06:34 +1100 Subject: [PATCH 304/368] fix(nvme): map bar Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/block/nvme/mod.rs | 8 +-- src/aero_kernel/src/drivers/pci.rs | 49 +++++++++++++++++-- src/aero_kernel/src/mem/paging/page.rs | 6 +++ 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index cebdb406be4..6e87f6c9e82 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -29,7 +29,7 @@ use alloc::vec::Vec; use bit_field::BitField; use crate::arch::interrupts::{self, InterruptStack}; -use crate::drivers::pci::*; +use crate::drivers::pci::{self, *}; use crate::fs::block::{install_block_device, BlockDevice, BlockDeviceInterface}; use crate::mem::paging::*; @@ -281,11 +281,13 @@ impl<'a> Controller<'a> { let bar0 = header.get_bar(0).ok_or(Error::UnknownBar)?; // All NVMe registers are accessible via BAR0. - let registers_addr = match bar0 { - Bar::Memory64 { address, .. } => PhysAddr::new(address), + let (registers_addr, bar_size) = match bar0 { + Bar::Memory64 { address, size, .. } => (PhysAddr::new(address), size), _ => return Err(Error::UnknownBar), }; + pci::map_bar(&bar0); + let registers = registers_addr .as_hhdm_virt() .read_mut::() diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index 1b652d50623..dc95c07fb95 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -23,7 +23,7 @@ use crate::utils::bitmap::Bitmap; use crate::utils::sync::Mutex; use crate::acpi::mcfg; -use crate::mem::paging::OffsetPageTable; +use crate::mem::paging::{OffsetPageTable, PhysAddr}; use crate::utils::VolatileCell; use crate::arch::{apic, io}; @@ -116,16 +116,18 @@ impl<'a> Msix<'a> { .get_bar(bar_index) .expect("msix: table bar not present"); + map_bar(&bar); + let bar_address = match bar { - Bar::Memory64 { address, .. } => address, - Bar::Memory32 { address, .. } => address as u64, + Bar::Memory64 { address, .. } => PhysAddr::new(address), + Bar::Memory32 { address, .. } => PhysAddr::new(address as u64), _ => unreachable!(), }; // SAFETY: We have exclusive access to the BAR and the slice is in bounds. let messages = unsafe { core::slice::from_raw_parts_mut( - (bar_address + bar_offset as u64) as *mut Message, + (bar_address.as_hhdm_virt() + bar_offset as u64).as_mut_ptr::(), table_length as usize, ) }; @@ -788,6 +790,45 @@ impl PciTable { } } +pub fn map_bar(bar: &Bar) { + use crate::mem::paging::{Mapper, Page, PageTableFlags, PhysFrame, Size4KiB, UnmapError}; + + use crate::mem::AddressSpace; + + let mut address_space = AddressSpace::this(); + let mut offset_table = address_space.offset_page_table(); + + let (addr, size) = match bar { + Bar::Memory64 { address, size, .. } => (PhysAddr::new(*address), *size), + _ => unreachable!(), + }; + + for frame in PhysFrame::range( + PhysFrame::::from_start_address(addr).unwrap(), + PhysFrame::containing_address(addr + size), + ) { + let virt = frame.start_address().as_hhdm_virt(); + let page = Page::containing_address(virt); + + // Map will fail if the bar was partially mapped. + match offset_table.unmap(page) { + Ok((_, m)) => m.ignore(), + Err(UnmapError::PageNotMapped) => {} + Err(e) => unreachable!("{:?}", e), + } + + unsafe { + offset_table.map_to( + page, + frame, + PageTableFlags::PRESENT | PageTableFlags::WRITABLE | PageTableFlags::NO_EXECUTE, + ) + } + .unwrap() + .flush(); + } +} + pub fn register_device_driver(handle: Arc) { PCI_TABLE.lock().inner.push(PciDevice { handle }) } diff --git a/src/aero_kernel/src/mem/paging/page.rs b/src/aero_kernel/src/mem/paging/page.rs index 56e212786d4..84894fea5b5 100644 --- a/src/aero_kernel/src/mem/paging/page.rs +++ b/src/aero_kernel/src/mem/paging/page.rs @@ -249,6 +249,12 @@ impl PhysFrame { Ok(PhysFrame::containing_address(address)) } + /// Returns a range of pages, exclusive `end`. + #[inline] + pub const fn range(start: Self, end: Self) -> PhysFrameRange { + PhysFrameRange { start, end } + } + /// Returns the frame that contains the given physical address. #[inline] pub fn containing_address(address: PhysAddr) -> Self { From cc40294cf48323e2a295cd13b2788016436a4cca Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 30 Mar 2024 23:13:29 +1100 Subject: [PATCH 305/368] fix(makefile): unset `QEMU_PATH` workaround Signed-off-by: Anhad Singh --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index f31c027278c..aeea0b245b1 100644 --- a/Makefile +++ b/Makefile @@ -40,10 +40,16 @@ iso: $(KERNEL_TARGET) distro-image: distro ./build-support/mkimage.sh +QEMU_PATH ?= $(shell dirname $(shell which qemu-system-x86_64)) + .PHONY: qemu qemu: $(KERNEL_TARGET) $(USERLAND_TARGET) ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -enable-kvm -cpu host,+vmx -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme +# .PHONY: qemu_perf +# qemu_perf: +# ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -cpu host,+vmx -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme -plugin './target/kern-profile.so,out=raw-data,delay=1' + .PHONY: doc doc: cd src && cargo doc --package aero_kernel --release --target-dir=../target/doc/ From eaaf127e25b58cef45b759c11bbe9971c80d6311 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 31 Mar 2024 13:10:50 +1100 Subject: [PATCH 306/368] ports(xz): CVE-2024-3094 workaround Changes copied from Lyre. Signed-off-by: Anhad Singh --- recipes/xz | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/recipes/xz b/recipes/xz index 861cea5478e..5cfdcce1766 100644 --- a/recipes/xz +++ b/recipes/xz @@ -1,8 +1,8 @@ name=xz -version=5.4.6 +version=5.4.5 revision=1 -tarball_url="https://github.com/tukaani-project/xz/releases/download/v${version}/xz-${version}.tar.gz" -tarball_blake2b="f0bbd33ea7cd64d475c3501f6e76080c8c0080e377f23462f5f76459935f4e621538ddaa8452d2feaed278d62a596e38ed2aca18ed9e76512c4ec77fa2f4cc5f" +tarball_url="http://deb.debian.org/debian/pool/main/x/xz-utils/xz-utils_5.6.1+really5.4.5.orig.tar.xz" +tarball_blake2b="08d9afebd927ea5d155515a4c9eedda4d1a249f2b1ab6ada11f50e5b7a3c90b389b32378ab1c0872c7f4627de8dff37149d85e49f7f4d30614add37320ec4f3e" source_hostdeps="automake autoconf libtool pkg-config" hostdeps="gcc autoconf automake libtool pkg-config" deps="core-libs" From d6c5a666919d2d7e70aa3cb70146775d02191c1b Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Mon, 1 Apr 2024 20:39:10 +1100 Subject: [PATCH 307/368] perf(kernel): do not wrap allocator in `Once` Not required. Signed-off-by: Anhad Singh --- Makefile | 10 ++- src/aero_kernel/src/mem/paging/frame.rs | 83 +++++++++++--------- src/aero_kernel/src/mem/paging/page_table.rs | 1 + src/aero_kernel/src/utils/bitmap.rs | 2 +- 4 files changed, 54 insertions(+), 42 deletions(-) diff --git a/Makefile b/Makefile index aeea0b245b1..1317c92661b 100644 --- a/Makefile +++ b/Makefile @@ -46,9 +46,13 @@ QEMU_PATH ?= $(shell dirname $(shell which qemu-system-x86_64)) qemu: $(KERNEL_TARGET) $(USERLAND_TARGET) ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -enable-kvm -cpu host,+vmx -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme -# .PHONY: qemu_perf -# qemu_perf: -# ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -cpu host,+vmx -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme -plugin './target/kern-profile.so,out=raw-data,delay=1' +.PHONY: qemu_perf +qemu_perf: $(KERNEL_TARGET) $(USERLAND_TARGET) + ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme -plugin './target/kern-profile.so,out=raw-data,delay=30' -d plugin -cpu max + +.PHONY: qemu_p +qemu_p: + ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme -d plugin -cpu max -qmp unix:/tmp/qmp.sock,server,nowait .PHONY: doc doc: diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index 8cf3d583cbf..f2372a2995d 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -63,32 +63,52 @@ const fn order_from_size(size: u64) -> usize { unreachable!() } -pub struct LockedFrameAllocator(Once>); +pub struct LockedFrameAllocator(Mutex); impl LockedFrameAllocator { /// Constructs a new uninitialized and locked version of the global frame /// allocator. pub(super) const fn new_uninit() -> Self { - Self(Once::new()) + let bstrap_ref = BootAllocRef { + inner: core::ptr::null(), + }; + + Self(Mutex::new(GlobalFrameAllocator { + buddies: [ + Bitmap::empty(bstrap_ref), + Bitmap::empty(bstrap_ref), + Bitmap::empty(bstrap_ref), + Bitmap::empty(bstrap_ref), + Bitmap::empty(bstrap_ref), + Bitmap::empty(bstrap_ref), + Bitmap::empty(bstrap_ref), + Bitmap::empty(bstrap_ref), + Bitmap::empty(bstrap_ref), + Bitmap::empty(bstrap_ref), + ], + free: [0; 10], + + base: PhysAddr::zero(), + end: PhysAddr::zero(), + })) } /// Initializes the inner locked global frame allocator. pub(super) fn init(&self, memory_map: &mut limine::response::MemoryMapResponse) { - self.0 - .call_once(|| Mutex::new(GlobalFrameAllocator::new(memory_map))); + *self.0.lock_irq() = GlobalFrameAllocator::new(memory_map); } pub fn dealloc(&self, addr: PhysAddr, size_bytes: usize) { let order = order_from_size(size_bytes as u64); - let mut allocator = self.0.get().unwrap().lock_irq(); + let mut allocator = self.0.lock_irq(); allocator.deallocate_frame_inner(addr, order); } pub fn alloc(&self, size_bytes: usize) -> Option { let order = order_from_size(size_bytes as u64); - let mut allocator = self.0.get()?.lock_irq(); + let mut allocator = self.0.lock_irq(); allocator.allocate_frame_inner(order) } @@ -108,12 +128,8 @@ unsafe impl FrameAllocator for LockedFrameAllocator { fn deallocate_frame(&self, frame: PhysFrame) { self.0 - .get() - .map(|m| { - m.lock_irq() - .deallocate_frame_inner(frame.start_address(), order_from_size(Size4KiB::SIZE)) - }) - .unwrap() + .lock_irq() + .deallocate_frame_inner(frame.start_address(), order_from_size(Size4KiB::SIZE)) } } @@ -125,12 +141,8 @@ unsafe impl FrameAllocator for LockedFrameAllocator { fn deallocate_frame(&self, frame: PhysFrame) { self.0 - .get() - .map(|m| { - m.lock_irq() - .deallocate_frame_inner(frame.start_address(), order_from_size(Size2MiB::SIZE)) - }) - .unwrap() + .lock_irq() + .deallocate_frame_inner(frame.start_address(), order_from_size(Size2MiB::SIZE)) } } @@ -188,7 +200,7 @@ pub fn pmm_alloc(order: BuddyOrdering) -> PhysAddr { debug_assert!(order <= BUDDY_SIZE.len()); super::FRAME_ALLOCATOR - .alloc_zeroed(BUDDY_SIZE[order] as _) + .alloc(BUDDY_SIZE[order] as _) .unwrap() } @@ -232,13 +244,13 @@ impl BootAlloc { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Copy)] struct BootAllocRef { inner: *const BootAlloc, } impl BootAllocRef { - fn new(inner: &BootAlloc) -> Self { + const fn new(inner: &BootAlloc) -> Self { Self { inner: inner as *const _, } @@ -357,16 +369,16 @@ impl GlobalFrameAllocator { end, buddies: [ - Bitmap::empty(bref.clone()), - Bitmap::empty(bref.clone()), - Bitmap::empty(bref.clone()), - Bitmap::empty(bref.clone()), - Bitmap::empty(bref.clone()), - Bitmap::empty(bref.clone()), - Bitmap::empty(bref.clone()), - Bitmap::empty(bref.clone()), - Bitmap::empty(bref.clone()), - Bitmap::empty(bref.clone()), + Bitmap::empty(bref), + Bitmap::empty(bref), + Bitmap::empty(bref), + Bitmap::empty(bref), + Bitmap::empty(bref), + Bitmap::empty(bref), + Bitmap::empty(bref), + Bitmap::empty(bref), + Bitmap::empty(bref), + Bitmap::empty(bref), ], free: [0; 10], }; @@ -376,7 +388,7 @@ impl GlobalFrameAllocator { // Allocate the buddies using prealloc: for (i, bsize) in BUDDY_SIZE.iter().enumerate() { let chunk = size / bsize; - this.buddies[i] = Bitmap::new_in(bref.clone(), chunk as usize); + this.buddies[i] = Bitmap::new_in(bref, chunk as usize); } for region in bref.get_inner().memory_ranges.lock().iter() { @@ -545,12 +557,7 @@ impl GlobalFrameAllocator { pub fn init_vm_frames() { VM_FRAMES.call_once(|| { - let frame_count = super::FRAME_ALLOCATOR - .0 - .get() - .unwrap() - .lock_irq() - .frame_count(); + let frame_count = super::FRAME_ALLOCATOR.0.lock_irq().frame_count(); let mut frames = Vec::::new(); frames.resize_with(frame_count, VmFrame::new); diff --git a/src/aero_kernel/src/mem/paging/page_table.rs b/src/aero_kernel/src/mem/paging/page_table.rs index 90a3af6de88..4550d946bfc 100644 --- a/src/aero_kernel/src/mem/paging/page_table.rs +++ b/src/aero_kernel/src/mem/paging/page_table.rs @@ -57,6 +57,7 @@ impl PageTableEntry { } /// Returns whether this entry is zero. + #[inline] pub const fn is_unused(&self) -> bool { self.entry == 0 } diff --git a/src/aero_kernel/src/utils/bitmap.rs b/src/aero_kernel/src/utils/bitmap.rs index 246646af959..747112639f4 100644 --- a/src/aero_kernel/src/utils/bitmap.rs +++ b/src/aero_kernel/src/utils/bitmap.rs @@ -60,7 +60,7 @@ impl Bitmap
{ /// ```rust /// let bitmap = Bitmap::new(); /// ``` - pub fn empty(alloc: A) -> Self { + pub const fn empty(alloc: A) -> Self { Self { bitmap: Vec::new_in(alloc), } From fc41560a5a1464ddb7643ba942f4ee19a09d31e8 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Mon, 1 Apr 2024 20:50:12 +1100 Subject: [PATCH 308/368] perf(kernel::rendy): do not over-allocate Regresssion. In future, the `alloc_boxed_buffer` must be fully removed. The zeroing is also not required. Signed-off-by: Anhad Singh --- .gitignore | 1 + Makefile | 2 +- src/aero_kernel/src/rendy.rs | 15 ++++----------- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index dd4aec68aa7..d4638961943 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ host-pkgs/ host-builds/ pkgs/ builds/ +raw-data diff --git a/Makefile b/Makefile index 1317c92661b..85771d08d14 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ qemu: $(KERNEL_TARGET) $(USERLAND_TARGET) .PHONY: qemu_perf qemu_perf: $(KERNEL_TARGET) $(USERLAND_TARGET) - ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme -plugin './target/kern-profile.so,out=raw-data,delay=30' -d plugin -cpu max + ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme -plugin './target/kern-profile.so,out=raw-data,delay=25' -d plugin -cpu max .PHONY: qemu_p qemu_p: diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 659dec79dda..986f3706ed2 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -738,17 +738,10 @@ impl<'this> DebugRendy<'this> { let cols = (width - DEFAULT_MARGIN * 2) / FONT_WIDTH; let rows = (height - DEFAULT_MARGIN * 2) / FONT_HEIGHT; - let grid_size = rows * cols * core::mem::size_of::(); - let grid = mem::alloc_boxed_buffer::(grid_size); - - let queue_size = rows * cols * core::mem::size_of::(); - let queue = mem::alloc_boxed_buffer::(queue_size); - - let map_size = rows * cols * core::mem::size_of::>(); - let map = mem::alloc_boxed_buffer::>(map_size); - - let bg_canvas_size = width * height * core::mem::size_of::(); - let bg_canvas = mem::alloc_boxed_buffer::(bg_canvas_size); + let grid = mem::alloc_boxed_buffer::(rows * cols); + let queue = mem::alloc_boxed_buffer::(rows * cols); + let map = mem::alloc_boxed_buffer::>(rows * cols); + let bg_canvas = mem::alloc_boxed_buffer::(width * height); let mut this = Self { inner: Inner { From a758ca8600251871ebc7ab7a95de8fd0e86c0fe1 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Mon, 1 Apr 2024 21:15:12 +1100 Subject: [PATCH 309/368] misc(rendy): wrap queue character ptr in `NonNull` Signed-off-by: Anhad Singh --- src/aero_kernel/src/rendy.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 986f3706ed2..a88662088ae 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -18,6 +18,7 @@ use core::fmt::Write; use core::ops::{Index, IndexMut}; +use core::ptr::NonNull; use core::time::Duration; use core::{fmt, u8}; @@ -294,7 +295,7 @@ pub struct Inner<'this> { queue: Box<[QueueCharacter]>, grid: Box<[Character]>, - map: Box<[Option<*mut QueueCharacter>]>, + map: Box<[Option>]>, bg_canvas: Box<[u32]>, queue_cursor: usize, @@ -496,13 +497,13 @@ impl<'a> Inner<'a> { queue.x = x; queue.y = y; - self.map[i] = Some(queue as *mut _); + self.map[i] = Some(NonNull::from(queue)); } let item = self.map[i]; unsafe { - (*item.unwrap()).char = *char; + item.unwrap().as_mut().char = *char; } } @@ -529,7 +530,7 @@ impl<'a> Inner<'a> { if self.map[i].is_some() { unsafe { - char = (*self.map[i].unwrap()).char; + char = self.map[i].unwrap().as_ref().char; } } else { char = self.grid[i]; @@ -541,7 +542,7 @@ impl<'a> Inner<'a> { if self.map[i].is_some() { unsafe { - self.grid[i] = (*self.map[i].unwrap()).char; + self.grid[i] = self.map[i].unwrap().as_ref().char; } self.map[i] = None; @@ -686,7 +687,7 @@ impl<'a> Inner<'a> { if let Some(char) = queue { unsafe { - res = (*char).char; + res = char.as_ref().char; } } else { res = self.grid[i]; @@ -740,7 +741,7 @@ impl<'this> DebugRendy<'this> { let grid = mem::alloc_boxed_buffer::(rows * cols); let queue = mem::alloc_boxed_buffer::(rows * cols); - let map = mem::alloc_boxed_buffer::>(rows * cols); + let map = mem::alloc_boxed_buffer::>>(rows * cols); let bg_canvas = mem::alloc_boxed_buffer::(width * height); let mut this = Self { From e2ae63952fca163bac2e6e2b5721a8e915746470 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Mon, 1 Apr 2024 21:58:15 +1100 Subject: [PATCH 310/368] feat(ext2): fill in the timestamp fields for stat Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/apic.rs | 2 +- src/aero_kernel/src/fs/ext2/disk.rs | 23 ++++++++++++++++++++--- src/aero_kernel/src/fs/ext2/mod.rs | 6 +++++- src/aero_syscall/src/lib.rs | 12 ++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/apic.rs b/src/aero_kernel/src/arch/x86_64/apic.rs index 464f5116c93..31f126e3a67 100644 --- a/src/aero_kernel/src/arch/x86_64/apic.rs +++ b/src/aero_kernel/src/arch/x86_64/apic.rs @@ -450,7 +450,7 @@ pub fn init() -> ApicType { log::debug!("apic: detected APIC (addr={address_phys:?}, type={apic_type:?})"); - let address_virt = unsafe { PHYSICAL_MEMORY_OFFSET } + address_phys.as_u64(); + let address_virt = address_phys.as_hhdm_virt(); let mut local_apic = LocalApic::new(address_virt, apic_type); local_apic.init(); diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index 4f38aca74b4..341a2c057fb 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -15,6 +15,8 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use core::time::Duration; + use bit_field::BitField; use crate::fs::inode; @@ -199,10 +201,10 @@ impl From for inode::FileType { pub struct INode { type_and_perm: u16, pub user_id: u16, - pub size_lower: u32, - pub last_access: u32, + size_lower: u32, + last_access: u32, pub creation_time: u32, - pub last_modification: u32, + last_modification: u32, pub deletion_time: u32, pub group_id: u16, pub hl_count: u16, @@ -253,6 +255,21 @@ impl INode { _ => FileType::Unknown, } } + + #[inline] + pub fn last_access(&self) -> Duration { + Duration::from_secs(self.last_access as u64) + } + + #[inline] + pub fn last_modification(&self) -> Duration { + Duration::from_secs(self.last_modification as u64) + } + + #[inline] + pub fn creation_time(&self) -> Duration { + Duration::from_secs(self.creation_time as u64) + } } const_assert_eq!(core::mem::size_of::(), 128); diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 18036123913..66fcb0918f8 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -380,7 +380,7 @@ impl INodeInterface for INode { let inode = self.inode.read(); let filesystem = self.fs.upgrade().unwrap(); - let filetype = self.metadata()?.file_type(); + let filetype = inode.file_type().into(); let mut mode = Mode::empty(); @@ -401,6 +401,10 @@ impl INodeInterface for INode { st_size: inode.size() as _, st_mode: mode, + st_atim: inode.last_access().into(), + st_mtim: inode.last_modification().into(), + st_ctim: inode.creation_time().into(), + ..Default::default() }) } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 437fca0fdd6..d2ecd44102d 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -32,6 +32,8 @@ pub mod time; pub type Result = core::result::Result; +use core::time::Duration; + use byte_endian::BigEndian; pub use crate::syscall::*; @@ -272,6 +274,16 @@ pub struct TimeSpec { pub tv_nsec: isize, } +impl From for TimeSpec { + #[inline] + fn from(value: Duration) -> Self { + TimeSpec { + tv_sec: value.as_secs() as isize, + tv_nsec: value.subsec_nanos() as isize, + } + } +} + #[repr(usize)] #[derive(Debug, Copy, Clone)] pub enum SeekWhence { From d7f9d43a73a14f870720d4029ff7e8fae4086575 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Apr 2024 18:10:50 +1100 Subject: [PATCH 311/368] feat(makefile): add option to select build profile Signed-off-by: Anhad Singh --- Makefile | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 85771d08d14..9f77125313d 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,11 @@ +profile ?= release + +ifneq ($(filter $(profile), dev debug), ) + KERNEL_TARGET := src/target/x86_64-unknown-none/debug/aero_kernel +else + KERNEL_TARGET := src/target/x86_64-unknown-none/release/aero_kernel +endif + jinx: if [ ! -f "target/jinx" ]; then \ curl -Lo target/jinx https://github.com/mintsuki/jinx/raw/30e7d5487bff67a66dfba332113157a08a324820/jinx; \ @@ -15,7 +23,6 @@ distro: jinx SOURCE_DIR := src USERLAND_DIR := userland USERLAND_TARGET := builds/userland/target/init -KERNEL_TARGET := src/target/x86_64-unknown-none/release/aero_kernel .PHONY: clean clean: @@ -26,7 +33,7 @@ check: cd src && cargo check $(KERNEL_TARGET): $(shell find $(SOURCE_DIR) -type f -not -path '$(SOURCE_DIR)/target/*') - cd src && cargo build --package aero_kernel --release + cd src && cargo build --package aero_kernel --profile $(profile) ./build-support/mkiso.sh $(USERLAND_TARGET): $(shell find $(USERLAND_DIR) -type f -not -path '$(USERLAND_DIR)/target/*') From 0476db68a99170a59775db5a9177270dcd3c46f3 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Apr 2024 18:47:20 +1100 Subject: [PATCH 312/368] misc(kernel): cleanup Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/apic.rs | 1 - src/aero_kernel/src/drivers/block/nvme/mod.rs | 10 +++++----- src/aero_kernel/src/drivers/pci.rs | 6 +++--- src/aero_kernel/src/drivers/pty.rs | 8 +++----- src/aero_kernel/src/drivers/uart_16550.rs | 4 ++-- src/aero_kernel/src/fs/block/gpt.rs | 2 +- src/aero_kernel/src/fs/inode.rs | 4 ++-- src/aero_kernel/src/fs/path.rs | 2 +- src/aero_kernel/src/mem/mod.rs | 4 +--- src/aero_kernel/src/mem/paging/addr.rs | 18 ++++++------------ src/aero_kernel/src/mem/paging/frame.rs | 4 ++-- src/aero_kernel/src/mem/paging/page_table.rs | 2 +- src/aero_kernel/src/modules.rs | 2 +- src/aero_kernel/src/net/arp.rs | 4 +--- src/aero_kernel/src/net/loopback.rs | 4 ++-- src/aero_kernel/src/net/mod.rs | 1 - src/aero_kernel/src/socket/netlink.rs | 19 ++++++++----------- src/aero_kernel/src/socket/tcp.rs | 11 +++-------- src/aero_kernel/src/socket/unix.rs | 6 +++--- src/aero_kernel/src/userland/vm.rs | 12 ++++++------ src/aero_kernel/src/utils/buffer.rs | 2 +- src/aero_kernel/src/utils/sync.rs | 4 ++-- 22 files changed, 54 insertions(+), 76 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/apic.rs b/src/aero_kernel/src/arch/x86_64/apic.rs index 31f126e3a67..5330a9930b1 100644 --- a/src/aero_kernel/src/arch/x86_64/apic.rs +++ b/src/aero_kernel/src/arch/x86_64/apic.rs @@ -29,7 +29,6 @@ use crate::utils::sync::{Mutex, MutexGuard}; use super::{io, time}; use crate::acpi::madt; -use crate::PHYSICAL_MEMORY_OFFSET; const APIC_SPURIOUS_VECTOR: u32 = 0xFF; diff --git a/src/aero_kernel/src/drivers/block/nvme/mod.rs b/src/aero_kernel/src/drivers/block/nvme/mod.rs index 6e87f6c9e82..2462eedcbf9 100644 --- a/src/aero_kernel/src/drivers/block/nvme/mod.rs +++ b/src/aero_kernel/src/drivers/block/nvme/mod.rs @@ -21,7 +21,7 @@ mod queue; use core::mem::MaybeUninit; use command::*; -use queue::*; +use queue::QueuePair; use alloc::sync::Arc; use alloc::vec::Vec; @@ -281,8 +281,8 @@ impl<'a> Controller<'a> { let bar0 = header.get_bar(0).ok_or(Error::UnknownBar)?; // All NVMe registers are accessible via BAR0. - let (registers_addr, bar_size) = match bar0 { - Bar::Memory64 { address, size, .. } => (PhysAddr::new(address), size), + let registers_addr = match bar0 { + Bar::Memory64 { address, .. } => PhysAddr::new(address), _ => return Err(Error::UnknownBar), }; @@ -538,7 +538,7 @@ impl PciDeviceHandle for Handler<'static> { for device_name in devices { let device = BlockDevice::new(device_name, controller.clone()); - install_block_device(device).expect("nvme: failed to install the block device") + install_block_device(device).expect("nvme: failed to install the block device"); } self.controllers.lock().push(controller); @@ -551,7 +551,7 @@ fn irq_handler(_stack: &mut InterruptStack) { fn nvme_init() { // Register the NVMe device handler. - register_device_driver(Handler::new()) + register_device_driver(Handler::new()); } crate::module_init!(nvme_init, ModuleType::Block); diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index dc95c07fb95..c44dc4ee6f3 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -679,7 +679,9 @@ impl PciHeader { // bit 0:true - the BAR is in memory // bit 0:false - the BAR is in I/O - if !bar.get_bit(0) { + if bar.get_bit(0) { + Some(Bar::IO(bar.get_bits(2..32))) + } else { let prefetchable = bar.get_bit(3); let address = bar.get_bits(4..32) << 4; @@ -727,8 +729,6 @@ impl PciHeader { _ => None, } - } else { - Some(Bar::IO(bar.get_bits(2..32))) } } diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index 711d9bfaa48..d75dd81d7b1 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -26,7 +26,7 @@ use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use spin::{Once, RwLock}; -use uapi::pty::*; +use uapi::pty::TIOCGPTN; use crate::arch::user_copy::UserRef; use crate::fs::cache::*; @@ -107,8 +107,6 @@ struct Master { impl Master { pub fn new() -> Self { - use aero_syscall::*; - Self { id: PTY_ID.fetch_add(1, Ordering::SeqCst), wq: WaitQueue::new(), @@ -191,8 +189,8 @@ impl TerminalDevice for Slave { } fn detach(&self, task: Arc) { - use aero_syscall::signal::*; - use aero_syscall::*; + use aero_syscall::signal::SIGINT; + use aero_syscall::VINTR; if !self.master.discipline.termios.lock().is_cooked() { return; diff --git a/src/aero_kernel/src/drivers/uart_16550.rs b/src/aero_kernel/src/drivers/uart_16550.rs index d644a7a1aa6..328adaa134b 100644 --- a/src/aero_kernel/src/drivers/uart_16550.rs +++ b/src/aero_kernel/src/drivers/uart_16550.rs @@ -47,7 +47,7 @@ bitflags::bitflags! { pub struct SerialPort(u16); impl SerialPort { - #[inline(always)] + #[inline] pub const fn new(port: u16) -> Self { Self(port) } @@ -90,7 +90,7 @@ impl SerialPort { fn wait_for_line_status(&self, line_status: LineStatus) { while !self.line_status().contains(line_status) { - core::hint::spin_loop() + core::hint::spin_loop(); } } diff --git a/src/aero_kernel/src/fs/block/gpt.rs b/src/aero_kernel/src/fs/block/gpt.rs index b52473b7dd6..113a361ee26 100644 --- a/src/aero_kernel/src/fs/block/gpt.rs +++ b/src/aero_kernel/src/fs/block/gpt.rs @@ -23,7 +23,7 @@ use core::mem::MaybeUninit; use alloc::boxed::Box; use alloc::sync::Arc; -const GPT_TABLE_SIGNATURE: u64 = 0x5452415020494645; +const GPT_TABLE_SIGNATURE: u64 = 0x5452_4150_2049_4645; #[repr(C)] pub struct GptTableHeader { diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 5b8d3c0261c..01c621c00ec 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -286,7 +286,7 @@ pub trait INodeInterface: Send + Sync { } /// Structure representing the crucial, characteristics of an inode. The metadata -/// of an inode can be retrieved by invoking the [INodeInterface::metadata] function. +/// of an inode can be retrieved by invoking the [`INodeInterface::metadata`] function. #[derive(Debug, Copy, Clone)] pub struct Metadata { pub id: usize, @@ -345,7 +345,7 @@ pub enum FileContents { /// and is backed by a static byte buffer StaticContent(&'static [u8]), - /// If the file type of the inode is [FileType::Device], in that case this variant + /// If the file type of the inode is [`FileType::Device`], in that case this variant /// is used. Device(Arc), diff --git a/src/aero_kernel/src/fs/path.rs b/src/aero_kernel/src/fs/path.rs index 388b497d687..c7df40ffc18 100644 --- a/src/aero_kernel/src/fs/path.rs +++ b/src/aero_kernel/src/fs/path.rs @@ -138,7 +138,7 @@ impl PathBuf { self.as_mut_vec().truncate(0); } - let need_sep = self.0.chars().last().map(|c| c != '/').unwrap_or(false); + let need_sep = self.0.chars().last().is_some_and(|c| c != '/'); // TODO: verbatim pahts need . and .. removed diff --git a/src/aero_kernel/src/mem/mod.rs b/src/aero_kernel/src/mem/mod.rs index a6d5adc3654..f7eb4792567 100644 --- a/src/aero_kernel/src/mem/mod.rs +++ b/src/aero_kernel/src/mem/mod.rs @@ -23,9 +23,7 @@ mod vmalloc; use ::alloc::boxed::Box; -use crate::mem::paging::*; - -use self::paging::{active_level_4_table, FRAME_ALLOCATOR}; +use paging::*; /// Structure representing a *virtual* address space. The address space /// contains a reference of the page table allocated for this address space. diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 75abdca7a08..2d97f2592aa 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -97,19 +97,19 @@ impl VirtAddr { /// Converts the address to a raw pointer. #[cfg(target_pointer_width = "64")] #[inline] - pub fn as_ptr(self) -> *const T { + pub const fn as_ptr(self) -> *const T { self.as_u64() as *const T } /// Converts the address to a mutable raw pointer. #[cfg(target_pointer_width = "64")] #[inline] - pub fn as_mut_ptr(self) -> *mut T { - self.as_ptr::() as *mut T + pub const fn as_mut_ptr(self) -> *mut T { + self.as_ptr::().cast_mut() } #[inline] - pub fn is_zero(self) -> bool { + pub const fn is_zero(self) -> bool { self.0 == 0 } @@ -360,12 +360,6 @@ impl Step for VirtAddr { } } -/// A passed `u64` was not a valid physical address. -/// -/// This means that bits 52 to 64 were not all null. -#[derive(Debug)] -pub struct PhysAddrNotValid(u64); - impl PhysAddr { /// Creates a new physical address. /// @@ -570,7 +564,7 @@ pub fn align_down(addr: u64, align: u64) -> u64 { /// Panics if the alignment is not a power of two. Without the `const_fn` /// feature, the panic message will be "index out of bounds". #[inline] -pub fn align_up(addr: u64, align: u64) -> u64 { +pub const fn align_up(addr: u64, align: u64) -> u64 { let align_mask = align - 1; if addr & align_mask == 0 { @@ -581,7 +575,7 @@ pub fn align_up(addr: u64, align: u64) -> u64 { } #[inline] -pub fn is_aligned(addr: u64, align: u64) -> bool { +pub const fn is_aligned(addr: u64, align: u64) -> bool { align_up(addr, align) == addr } diff --git a/src/aero_kernel/src/mem/paging/frame.rs b/src/aero_kernel/src/mem/paging/frame.rs index f2372a2995d..b12b81d9d46 100644 --- a/src/aero_kernel/src/mem/paging/frame.rs +++ b/src/aero_kernel/src/mem/paging/frame.rs @@ -418,9 +418,9 @@ impl GlobalFrameAllocator { if mask & address.as_u64() != 0 { continue; - } else { - return order; } + + return order; } 0 diff --git a/src/aero_kernel/src/mem/paging/page_table.rs b/src/aero_kernel/src/mem/paging/page_table.rs index 4550d946bfc..bf20f8aa598 100644 --- a/src/aero_kernel/src/mem/paging/page_table.rs +++ b/src/aero_kernel/src/mem/paging/page_table.rs @@ -49,7 +49,7 @@ impl PageTableEntry { // page table entry counter. const COUNTER_MASK: u64 = 0x7ff0_0000_0000_0000; const COUNTER_SHIFT: u64 = 52; - const FLAGS_MASK: u64 = 0x80000000000001ff; + const FLAGS_MASK: u64 = 0x8000_0000_0000_01ff; /// Creates an unused page table entry. pub const fn new() -> Self { diff --git a/src/aero_kernel/src/modules.rs b/src/aero_kernel/src/modules.rs index 8f809a01021..133a8cc13ba 100644 --- a/src/aero_kernel/src/modules.rs +++ b/src/aero_kernel/src/modules.rs @@ -33,7 +33,7 @@ use core::mem::size_of; use crate::{drivers, extern_sym, fs}; -/// Inner helper function to make sure the function provided to the [module_init] macro +/// Inner helper function to make sure the function provided to the [`module_init`] macro /// has a valid function signature. This function returns the passed module init function as /// a const void pointer. diff --git a/src/aero_kernel/src/net/arp.rs b/src/aero_kernel/src/net/arp.rs index 879dc5c34a6..bed1a21598c 100644 --- a/src/aero_kernel/src/net/arp.rs +++ b/src/aero_kernel/src/net/arp.rs @@ -76,9 +76,7 @@ impl Cache { } fn request(&mut self, ip: Ipv4Addr, packet: RawPacket) { - if ip == Ipv4Addr::LOOPBACK { - panic!() - } + assert!(ip != Ipv4Addr::LOOPBACK); if self.0.get_mut(&ip).is_some() { todo!() diff --git a/src/aero_kernel/src/net/loopback.rs b/src/aero_kernel/src/net/loopback.rs index f6bd8a036f2..ff0aebc684e 100644 --- a/src/aero_kernel/src/net/loopback.rs +++ b/src/aero_kernel/src/net/loopback.rs @@ -49,12 +49,12 @@ impl NetworkDriver for Loopback { } lazy_static::lazy_static! { - pub static ref LOOPBACK: Arc = (|| { + pub static ref LOOPBACK: Arc = { let device = Arc::new(NetworkDevice::new(Arc::new(Loopback))); device.set_ip(Ipv4Addr::LOOPBACK); device.set_subnet_mask(Ipv4Addr::new(255, 0, 0, 0)); device - })(); + }; } diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index bd0bd163405..6425ca0917a 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -67,7 +67,6 @@ impl NetworkDevice { // What should the default be? Also this should really be handled inside dhcpd. default_gateway: Ipv4Addr::new(10, 0, 2, 2), subnet_mask: Ipv4Addr::new(255, 255, 255, 0), - ..Default::default() }; Self { diff --git a/src/aero_kernel/src/socket/netlink.rs b/src/aero_kernel/src/socket/netlink.rs index bc3588a3169..e91d5c3c7ff 100644 --- a/src/aero_kernel/src/socket/netlink.rs +++ b/src/aero_kernel/src/socket/netlink.rs @@ -33,7 +33,6 @@ use alloc::vec::Vec; use crabnet::network::Ipv4Addr; use crate::fs; -use crate::fs::cache::DirCacheImpl; use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags, PollTable}; use crate::utils::sync::{Mutex, WaitQueue}; @@ -61,7 +60,7 @@ impl NetlinkBuilder { Self { buffer: Vec::new() } } - fn header(&mut self, header: netlink::nlmsghdr) { + fn header(&mut self, header: &netlink::nlmsghdr) { self.buffer.extend_from_slice(unsafe { core::slice::from_raw_parts( &header as *const _ as *const u8, @@ -72,7 +71,7 @@ impl NetlinkBuilder { self.buffer_align(); } - fn message(&mut self, message: netlink::rtmsg) { + fn message(&mut self, message: &netlink::rtmsg) { self.buffer.extend_from_slice(unsafe { core::slice::from_raw_parts( &message as *const _ as *const u8, @@ -154,7 +153,7 @@ impl NetLinkSocket { fn send_route_packet(&self, header: &netlink::nlmsghdr) { let mut builder = NetlinkBuilder::new(); - builder.header(netlink::nlmsghdr { + builder.header(&netlink::nlmsghdr { nlmsg_type: MessageType::RtmNewRoute, nlmsg_flags: MessageFlags::MULTI, nlmsg_seq: header.nlmsg_seq, @@ -162,7 +161,7 @@ impl NetLinkSocket { nlmsg_len: 0, }); - builder.message(netlink::rtmsg { + builder.message(&netlink::rtmsg { rtm_family: AF_INET as u8, rtm_dst_len: 0, // FIXME rtm_src_len: 0, @@ -259,13 +258,11 @@ impl INodeInterface for NetLinkSocket { bytes_copied += copy; iovecs.remove(index); + } else if flags.contains(socket::MessageFlags::TRUNC) && bytes_copied == 0 { + message_hdr.flags = socket::MessageFlags::TRUNC.bits() as i32; + return Ok(data.len()); } else { - if flags.contains(socket::MessageFlags::TRUNC) && bytes_copied == 0 { - message_hdr.flags = socket::MessageFlags::TRUNC.bits() as i32; - return Ok(data.len()); - } else { - unimplemented!() - } + unimplemented!() } } diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 1cb4c559dff..1af0ec3b2a3 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -78,10 +78,7 @@ impl TcpSocket { pub fn on_packet(&self, tcp: &Tcp, options: TcpOptions, payload: &[u8]) { if let Some(socket) = self.tcp.lock_irq().as_mut() { // Ignore any invalid TCP options. - let options = options - .iter() - .filter_map(|option| option.ok()) - .collect::>(); + let options = options.iter().filter_map(Result::ok).collect::>(); socket.on_packet(tcp, &options, payload); self.wq.notify_all(); @@ -96,8 +93,7 @@ impl TcpSocket { pub fn non_blocking(&self) -> bool { self.handle .get() - .map(|handle| handle.flags().contains(OpenFlags::O_NONBLOCK)) - .unwrap_or_default() + .is_some_and(|handle| handle.flags().contains(OpenFlags::O_NONBLOCK)) } pub fn do_recv(&self, buf: &mut [u8]) -> Result { @@ -113,8 +109,7 @@ impl TcpSocket { let mut socket = self.wq.block_on(&self.tcp, |tcp| { tcp.as_ref() - .map(|socket| !socket.recv_queue.is_empty()) - .unwrap_or(true) + .map_or(true, |socket| !socket.recv_queue.is_empty()) })?; if let Some(socket) = socket.as_mut() { diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 81067917b86..bed1da1ae52 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -28,7 +28,7 @@ use crate::arch::user_copy::UserRef; use crate::fs; use crate::fs::cache::DirCacheItem; use crate::fs::file_table::FileHandle; -use crate::fs::inode::*; +use crate::fs::inode::{DirEntry, FileType, INodeInterface, Metadata, PollFlags, PollTable}; use crate::fs::{FileSystemError, Path}; @@ -342,7 +342,7 @@ impl INodeInterface for UnixSocket { fn accept(&self, address: Option<(VirtAddr, &mut u32)>) -> fs::Result> { let mut inner = self.wq.block_on(&self.inner, |e| { - e.state.queue().map(|x| !x.is_empty()).unwrap_or(false) + e.state.queue().is_some_and(|x| !x.is_empty()) })?; let queue = inner @@ -352,7 +352,7 @@ impl INodeInterface for UnixSocket { let peer = queue.pop().expect("UnixSocket::accept(): backlog is empty"); let sock = Self::new(); - sock.inner.lock_irq().address = inner.address.clone(); + sock.inner.lock_irq().address.clone_from(&inner.address); { let mut sock_inner = sock.inner.lock_irq(); diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 4f552704010..cd0d21fa2fd 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -327,7 +327,7 @@ pub struct MMapFile { impl MMapFile { #[inline] fn new(file: DirCacheItem, offset: usize, size: usize) -> Self { - Self { file, offset, size } + Self { offset, file, size } } } @@ -689,7 +689,7 @@ impl VmProtected { map.handle_pf_private_anon(&mut offset_table, reason, accessed_address) } - (true, false) | (false, false) => { + (true | false, false) => { map.handle_pf_file(&mut offset_table, reason, accessed_address) } @@ -751,10 +751,10 @@ impl VmProtected { if hole as usize >= size { return Some((start, cursor)); - } else { - // The hole is too small - cursor.move_next(); } + + // The hole is too small + cursor.move_next(); } else { let hole = map_start.as_u64() - address.as_u64(); @@ -939,7 +939,7 @@ impl VmProtected { let load_offset = VirtAddr::new( if header.pt2.type_().as_type() == header::Type::SharedObject { - 0x40000000u64 + 0x4000_0000_u64 } else { 0u64 }, diff --git a/src/aero_kernel/src/utils/buffer.rs b/src/aero_kernel/src/utils/buffer.rs index 2cb0358b419..01bb8b87b1a 100644 --- a/src/aero_kernel/src/utils/buffer.rs +++ b/src/aero_kernel/src/utils/buffer.rs @@ -122,7 +122,7 @@ impl + AsMut<[u8]>> RingBuffer { /// Appends the provided byte to the ring buffer. pub fn append_byte(&mut self, byte: u8) { self.storage.as_mut()[self.position] = byte; - self.position = (self.position + 1) % self.storage.as_mut().len() + self.position = (self.position + 1) % self.storage.as_mut().len(); } } diff --git a/src/aero_kernel/src/utils/sync.rs b/src/aero_kernel/src/utils/sync.rs index c171ec7617d..67ef642bd37 100644 --- a/src/aero_kernel/src/utils/sync.rs +++ b/src/aero_kernel/src/utils/sync.rs @@ -266,14 +266,14 @@ impl<'a, T: ?Sized> core::ops::Deref for MutexGuard<'a, T> { #[inline] fn deref(&self) -> &T { - self.guard.deref() + &self.guard } } impl<'a, T: ?Sized> core::ops::DerefMut for MutexGuard<'a, T> { #[inline] fn deref_mut(&mut self) -> &mut T { - self.guard.deref_mut() + &mut self.guard } } From e23b1da7305fe5441dcde95a34b5c0536e8f26b8 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Apr 2024 20:55:51 +1100 Subject: [PATCH 313/368] fix(rsdp): unaligned pointer deref * Use `read_unaligned` instead. Signed-off-by: Anhad Singh --- src/aero_kernel/src/acpi/rsdp.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aero_kernel/src/acpi/rsdp.rs b/src/aero_kernel/src/acpi/rsdp.rs index 0ddd290fafc..008282bc90b 100644 --- a/src/aero_kernel/src/acpi/rsdp.rs +++ b/src/aero_kernel/src/acpi/rsdp.rs @@ -114,7 +114,7 @@ impl Rsdt { for i in 0..self.entries_count() { let item_addr_virt = unsafe { let ptr = header_data_address.add(i); - PhysAddr::new(*ptr as u64).as_hhdm_virt() + PhysAddr::new(ptr.read_unaligned() as u64).as_hhdm_virt() }; let item = unsafe { Sdt::from_address(item_addr_virt) }; From 43aac1421d3742440f7ae3c750dd8b037fce6473 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Apr 2024 20:56:26 +1100 Subject: [PATCH 314/368] fix(rendy): unaligned pointer deref Signed-off-by: Anhad Singh --- src/aero_kernel/src/rendy.rs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index a88662088ae..9181e71417c 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -371,13 +371,9 @@ impl<'a> Inner<'a> { let mut img_x = ratio * xstart; for x in xstart..xend { - let img_pixel = unsafe { - (image.image.as_ptr()) - .add(fixedp6_to_int(img_x) * col_size + off) - .cast::() - }; - - let i = blender(x, y, unsafe { *img_pixel }); + let offset = fixedp6_to_int(img_x) * col_size + off; + let img_pixel: [u8; 4] = unsafe { *image.image.as_ptr().add(offset).cast() }; + let i = blender(x, y, u32::from_le_bytes(img_pixel)); unsafe { *self.buffer.as_mut_ptr().add(fb_off + x) = i as u32; From ada93a20d0cdcad92d0f89fa2ec284b2ee475299 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Apr 2024 20:56:53 +1100 Subject: [PATCH 315/368] misc(kernel): remove feature `pointer_is_aligned` * Remove the feature request for `pointer_is_aligned`, as it has now been stabilized. Signed-off-by: Anhad Singh --- src/aero_kernel/src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index d3a3e707252..d89e2e40737 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -41,7 +41,6 @@ maybe_uninit_write_slice, // https://github.com/rust-lang/rust/issues/79995 slice_ptr_get, // https://github.com/rust-lang/rust/issues/74265 maybe_uninit_as_bytes, // https://github.com/rust-lang/rust/issues/93092 - pointer_is_aligned, // https://github.com/rust-lang/rust/issues/96284 const_trait_impl, // https://github.com/rust-lang/rust/issues/67792 int_roundings, // https://github.com/rust-lang/rust/issues/88581 const_ptr_is_null, // https://github.com/rust-lang/rust/issues/74939 From b69e91bb07249af32bf8f04aff0b66a07cba4a90 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Apr 2024 20:58:14 +1100 Subject: [PATCH 316/368] misc(makefile): cleanup Signed-off-by: Anhad Singh --- Makefile | 14 +++++++++----- build-support/mkiso.sh | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 9f77125313d..1c5cd422d43 100644 --- a/Makefile +++ b/Makefile @@ -26,15 +26,15 @@ USERLAND_TARGET := builds/userland/target/init .PHONY: clean clean: - rm -rf src/target + rm -rf $(SOURCE_DIR)/target .PHONY: check check: - cd src && cargo check + cd $(SOURCE_DIR) && cargo check $(KERNEL_TARGET): $(shell find $(SOURCE_DIR) -type f -not -path '$(SOURCE_DIR)/target/*') - cd src && cargo build --package aero_kernel --profile $(profile) - ./build-support/mkiso.sh + cd $(SOURCE_DIR) && cargo build --package aero_kernel --profile $(profile) + ./build-support/mkiso.sh $(KERNEL_TARGET) $(USERLAND_TARGET): $(shell find $(USERLAND_DIR) -type f -not -path '$(USERLAND_DIR)/target/*') ./target/jinx rebuild userland @@ -53,9 +53,13 @@ QEMU_PATH ?= $(shell dirname $(shell which qemu-system-x86_64)) qemu: $(KERNEL_TARGET) $(USERLAND_TARGET) ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -enable-kvm -cpu host,+vmx -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme +# "qemu_perf" options: +# delay (default: 30) - the amount of microseconds between each sample. +delay ?= 30 + .PHONY: qemu_perf qemu_perf: $(KERNEL_TARGET) $(USERLAND_TARGET) - ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme -plugin './target/kern-profile.so,out=raw-data,delay=25' -d plugin -cpu max + ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme -plugin './target/kern-profile.so,out=raw-data,delay=$(delay)' -d plugin -cpu max .PHONY: qemu_p qemu_p: diff --git a/build-support/mkiso.sh b/build-support/mkiso.sh index 7e0a6ebecf9..4a0d021d9a9 100755 --- a/build-support/mkiso.sh +++ b/build-support/mkiso.sh @@ -5,7 +5,7 @@ set -ex rm -rf target/iso_root mkdir -pv target/iso_root/boot -cp src/target/x86_64-unknown-none/release/aero_kernel target/iso_root/aero +cp $1 target/iso_root/aero cp build-support/limine.cfg src/.cargo/term_background.bmp target/iso_root/ # Install the limine binaries From c1455ba113c13e5df601fb816e6be953f7471326 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Apr 2024 21:27:32 +1100 Subject: [PATCH 317/368] misc(kernel): cleanup Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/block/gpt.rs | 3 +-- src/aero_kernel/src/fs/block/mod.rs | 2 +- src/aero_kernel/src/net/mod.rs | 2 +- src/aero_kernel/src/net/tcp.rs | 2 +- src/aero_kernel/src/socket/tcp.rs | 2 +- src/aero_kernel/src/socket/unix.rs | 2 +- src/aero_kernel/src/syscall/net.rs | 2 +- 7 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/aero_kernel/src/fs/block/gpt.rs b/src/aero_kernel/src/fs/block/gpt.rs index 113a361ee26..ee94ad652be 100644 --- a/src/aero_kernel/src/fs/block/gpt.rs +++ b/src/aero_kernel/src/fs/block/gpt.rs @@ -21,7 +21,6 @@ use super::BlockDevice; use core::mem::MaybeUninit; use alloc::boxed::Box; -use alloc::sync::Arc; const GPT_TABLE_SIGNATURE: u64 = 0x5452_4150_2049_4645; @@ -121,7 +120,7 @@ pub struct Gpt { } impl Gpt { - pub fn new(controller: Arc) -> Option { + pub fn new(controller: &BlockDevice) -> Option { // Get the GPT header. let mut header = Box::::new_uninit(); diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 870d3837d5f..7c5b3f4beb0 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -398,7 +398,7 @@ pub fn launch() -> Result<()> { } for block in blocks_copy { - if let Some(gpt) = Gpt::new(block.clone()) { + if let Some(gpt) = Gpt::new(&block) { log::info!("block: found GPT on {}!", block.name()); for (i, entry) in gpt diff --git a/src/aero_kernel/src/net/mod.rs b/src/aero_kernel/src/net/mod.rs index 6425ca0917a..756b7fc9c85 100644 --- a/src/aero_kernel/src/net/mod.rs +++ b/src/aero_kernel/src/net/mod.rs @@ -153,7 +153,7 @@ fn packet_processor_thread() { let options = parser.next::(); let payload = &parser.payload()[..size]; - tcp::on_packet(tcp, options, payload) + tcp::on_packet(tcp, &options, payload) } } } diff --git a/src/aero_kernel/src/net/tcp.rs b/src/aero_kernel/src/net/tcp.rs index b6337dee38e..2889545cf1a 100644 --- a/src/aero_kernel/src/net/tcp.rs +++ b/src/aero_kernel/src/net/tcp.rs @@ -25,7 +25,7 @@ use crate::socket::tcp::TcpSocket; static HANDLERS: RwLock>> = RwLock::new(BTreeMap::new()); -pub fn on_packet(tcp: &Tcp, options: TcpOptions, payload: &[u8]) { +pub fn on_packet(tcp: &Tcp, options: &TcpOptions, payload: &[u8]) { let handlers = HANDLERS.read(); if let Some(handler) = handlers.get(&tcp.dest_port()) { diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 1af0ec3b2a3..6b79aa10976 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -75,7 +75,7 @@ impl TcpSocket { }) } - pub fn on_packet(&self, tcp: &Tcp, options: TcpOptions, payload: &[u8]) { + pub fn on_packet(&self, tcp: &Tcp, options: &TcpOptions, payload: &[u8]) { if let Some(socket) = self.tcp.lock_irq().as_mut() { // Ignore any invalid TCP options. let options = options.iter().filter_map(Result::ok).collect::>(); diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index bed1da1ae52..bc243f4f0dc 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -209,7 +209,7 @@ impl UnixSocket { }) } - pub fn connect_pair(a: DirCacheItem, b: DirCacheItem) -> fs::Result<()> { + pub fn connect_pair(a: &DirCacheItem, b: &DirCacheItem) -> fs::Result<()> { let a = a .inode() .downcast_arc::() diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index d7375f73a40..aecdd5af984 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -337,7 +337,7 @@ pub fn socket_pair( let a = create_socket(domain, type_and_flags, protocol)?; let b = create_socket(domain, type_and_flags, protocol)?; - UnixSocket::connect_pair(a.clone(), b.clone())?; + UnixSocket::connect_pair(&a, &b)?; fds[0] = current_task.file_table.open_file(a, sockfd_flags)? as i32; fds[1] = current_task.file_table.open_file(b, sockfd_flags)? as i32; From a1e09a5e6ef5d016e2bbcb1c9bd171384794bc6b Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Apr 2024 22:48:12 +1100 Subject: [PATCH 318/368] feat(ext2): optimize `DirEntryIter` * Read a block at a time since a directory entry cannot span between multiple data blocks. * Only allocate once, ie, on the creation of the iterator. * Reuse the same allocated chunk for the rest of the items. * Return a mutable reference instead of an owned allocated item (expensive). Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/ext2/disk.rs | 10 ++++ src/aero_kernel/src/fs/ext2/mod.rs | 81 ++++++++++++++++++----------- src/aero_kernel/src/utils/mod.rs | 14 ++++- 3 files changed, 73 insertions(+), 32 deletions(-) diff --git a/src/aero_kernel/src/fs/ext2/disk.rs b/src/aero_kernel/src/fs/ext2/disk.rs index 341a2c057fb..615a985ed18 100644 --- a/src/aero_kernel/src/fs/ext2/disk.rs +++ b/src/aero_kernel/src/fs/ext2/disk.rs @@ -162,6 +162,16 @@ impl DirEntry { let name_bytes = unsafe { self.name.as_mut_slice(name.len()) }; name_bytes.copy_from_slice(name.as_bytes()); } + + pub fn name(&self) -> &str { + unsafe { core::str::from_utf8_unchecked(self.name.as_slice(self.name_size as usize)) } + } + + #[inline] + pub fn is_used(&self) -> bool { + // value of 0 indicates that the entry is not used + self.inode != 0 + } } #[repr(u8)] diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 66fcb0918f8..74d70ccc821 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -43,7 +43,7 @@ use super::cache::{DirCacheItem, INodeCacheItem}; use super::path::PathBuf; use super::{cache, FileSystemError, Path}; -use super::inode::{DirEntry, INodeInterface, Metadata, PollFlags, PollTable}; +use super::inode::{self, INodeInterface, Metadata, PollFlags, PollTable}; use super::FileSystem; pub struct INode { @@ -301,6 +301,7 @@ impl INode { entry.entry_size = block_size as _; entry.inode = inode.id as _; entry.file_type = file_type; + // JSDJFKDSJFHJK CHECK THIS this is ub entry.set_name(name); } @@ -314,7 +315,7 @@ impl INode { return Err(FileSystemError::NotDirectory); } - if DirEntryIter::new(self.sref()).any(|(e, _)| e == name) { + if DirEntryIter::new(self.sref()).any(|entry| entry.name() == name) { return Err(FileSystemError::EntryExists); } @@ -349,7 +350,7 @@ impl INode { entry: &disk::DirEntry, ) -> Option { let inode = self.fs.upgrade()?.find_inode(entry.inode as usize, None)?; - Some(DirEntry::new(parent, inode, name.to_string())) + Some(inode::DirEntry::new(parent, inode, name.to_string())) } pub fn sref(&self) -> Arc { @@ -410,19 +411,19 @@ impl INodeInterface for INode { } fn dirent(&self, parent: DirCacheItem, index: usize) -> super::Result> { - if let Some((name, entry)) = DirEntryIter::new(self.sref()).nth(index) { - Ok(self.make_dirent(parent, &name, &entry)) + if let Some(entry) = DirEntryIter::new(self.sref()).nth(index) { + Ok(self.make_dirent(parent, entry.name(), entry)) } else { Ok(None) } } fn lookup(&self, parent: DirCacheItem, name: &str) -> super::Result { - let (name, entry) = DirEntryIter::new(self.sref()) - .find(|(ename, _)| ename == name) + let entry = DirEntryIter::new(self.sref()) + .find(|entry| entry.name() == name) .ok_or(FileSystemError::EntryNotFound)?; - Ok(self.make_dirent(parent, &name, &entry).unwrap()) + Ok(self.make_dirent(parent, entry.name(), entry).unwrap()) } fn read_at(&self, offset: usize, usr_buffer: &mut [u8]) -> super::Result { @@ -456,7 +457,7 @@ impl INodeInterface for INode { fn rename(&self, old: DirCacheItem, dest: &str) -> super::Result<()> { assert!(self.metadata()?.is_directory()); - if DirEntryIter::new(self.sref()).any(|(name, _)| name == dest) { + if DirEntryIter::new(self.sref()).any(|entry| entry.name() == dest) { return Err(FileSystemError::EntryExists); } @@ -504,7 +505,7 @@ impl INodeInterface for INode { } let inode = self.make_inode(name, FileType::File, None)?; - Ok(DirEntry::new(parent, inode, name.to_string())) + Ok(inode::DirEntry::new(parent, inode, name.to_string())) } fn mkdir(&self, name: &str) -> super::Result { @@ -645,46 +646,66 @@ impl INodeInterface for INode { } } -pub struct DirEntryIter { +pub struct DirEntryIter<'a> { inode: Arc, offset: usize, + + current_block: Box<[MaybeUninit]>, + block_size: usize, + _phantom: core::marker::PhantomData<&'a disk::DirEntry>, } -impl DirEntryIter { +impl<'a> DirEntryIter<'a> { pub fn new(inode: Arc) -> Self { - Self { inode, offset: 0 } + let block_size = inode.fs.upgrade().unwrap().superblock.block_size(); + let buf = Box::<[u8]>::new_uninit_slice(block_size); + + Self { + inode, + offset: 0, + current_block: buf, + block_size, + + _phantom: core::marker::PhantomData, + } } } -impl Iterator for DirEntryIter { - type Item = (String, block::DirtyRef); +impl<'a> Iterator for DirEntryIter<'a> { + type Item = &'a mut disk::DirEntry; fn next(&mut self) -> Option { + // Read 1 block at a time. + // + // XXX: A directory entry cannot span between multiple data blocks. let file_size = self.inode.inode.read().size(); if self.offset + core::mem::size_of::() > file_size { return None; } - let entry = unsafe { self.inode.read_mut::(self.offset) }; - if entry.inode == 0 { - return None; + let block_offset = self.offset % self.block_size; + if block_offset == 0 { + self.inode + .read(self.offset, &mut self.current_block) + .unwrap(); } - let mut name = Box::<[u8]>::new_uninit_slice(entry.name_size as usize); - self.inode - .read( - self.offset + core::mem::size_of::(), - MaybeUninit::slice_as_bytes_mut(&mut name), - ) - .ok()?; + // SAFETY: We have initialized the current block above. + let entry = unsafe { + &mut *self + .current_block + .as_mut_ptr() + .add(block_offset) + .cast::() + }; - // SAFETY: We have initialized the name above. - let name = unsafe { name.assume_init() }; - let name = unsafe { core::str::from_utf8_unchecked(&name) }; + if !entry.is_used() { + return None; + } self.offset += entry.entry_size as usize; - Some((name.to_string(), entry)) + Some(entry) } } @@ -747,6 +768,6 @@ impl FileSystem for Ext2 { .find_inode(Ext2::ROOT_INODE_ID, None) .expect("ext2: invalid filesystem (root inode not found)"); - DirEntry::new_root(inode, String::from("/")) + inode::DirEntry::new_root(inode, String::from("/")) } } diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index 58918037f88..e2ce5a60da5 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -21,8 +21,8 @@ use core::alloc::Layout; use core::any::Any; use core::cell::UnsafeCell; use core::marker::PhantomData; -use core::mem; use core::ptr::Unique; +use core::{mem, ptr}; use crate::mem::paging::{align_down, ReadErr, VirtAddr}; @@ -244,11 +244,21 @@ pub struct IncompleteArrayField(PhantomData, [T; 0]); impl IncompleteArrayField { #[inline] pub unsafe fn as_mut_ptr(&mut self) -> *mut T { - self as *mut _ as *mut T + ptr::from_mut(self).cast::() + } + + #[inline] + pub unsafe fn as_ptr(&self) -> *const T { + ptr::from_ref(self).cast::() } #[inline] pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { core::slice::from_raw_parts_mut(self.as_mut_ptr(), len) } + + #[inline] + pub unsafe fn as_slice(&self, len: usize) -> &[T] { + core::slice::from_raw_parts(self.as_ptr(), len) + } } From 37fdd4e196ec6dc127d5b7835226593c631bd1ca Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 4 Apr 2024 22:19:01 +1100 Subject: [PATCH 319/368] cleanup(base-files): reorganize Signed-off-by: Anhad Singh --- Makefile | 11 ++++++++++- base-files/etc/bash.bashrc | 13 +++++++++++++ base-files/etc/bash/bash.bashrc | 15 --------------- base-files/etc/hostname | 1 + base-files/hello.asm | 20 -------------------- base-files/{ => home/aero}/a | 0 base-files/home/aero/test.c | 6 ++++++ base-files/test.c | 6 ------ userland/init/init.c | 4 +++- 9 files changed, 33 insertions(+), 43 deletions(-) create mode 100644 base-files/etc/bash.bashrc delete mode 100644 base-files/etc/bash/bash.bashrc create mode 100644 base-files/etc/hostname delete mode 100644 base-files/hello.asm rename base-files/{ => home/aero}/a (100%) create mode 100644 base-files/home/aero/test.c delete mode 100644 base-files/test.c diff --git a/Makefile b/Makefile index 1c5cd422d43..87fdabf1684 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,16 @@ QEMU_PATH ?= $(shell dirname $(shell which qemu-system-x86_64)) .PHONY: qemu qemu: $(KERNEL_TARGET) $(USERLAND_TARGET) - ${QEMU_PATH}/qemu-system-x86_64 -cdrom target/aero.iso -m 8G -serial stdio --boot d -s -enable-kvm -cpu host,+vmx -drive file=target/disk.img,if=none,id=NVME1,format=raw -device nvme,drive=NVME1,serial=nvme + ${QEMU_PATH}/qemu-system-x86_64 \ + -cdrom target/aero.iso \ + -m 8G \ + -serial stdio \ + --boot d -s \ + -enable-kvm \ + -cpu host,+vmx \ + -drive file=target/disk.img,if=none,id=NVME1,format=raw \ + -device nvme,drive=NVME1,serial=nvme \ + ${QEMU_FLAGS} # "qemu_perf" options: # delay (default: 30) - the amount of microseconds between each sample. diff --git a/base-files/etc/bash.bashrc b/base-files/etc/bash.bashrc new file mode 100644 index 00000000000..a738e73f468 --- /dev/null +++ b/base-files/etc/bash.bashrc @@ -0,0 +1,13 @@ +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +alias ls='ls --color=auto' +alias grep='grep --color=auto' + +PS1='\[\033[01;32m\]root@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ ' + +HISTCONTROL=ignoredups +HISTSIZE=-1 +HISTFILESIZE=-1 + +export DISPLAY=:0 diff --git a/base-files/etc/bash/bash.bashrc b/base-files/etc/bash/bash.bashrc deleted file mode 100644 index a9b77a9c70b..00000000000 --- a/base-files/etc/bash/bash.bashrc +++ /dev/null @@ -1,15 +0,0 @@ -PS1='\[\033[01;32m\]root@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ ' - -HISTCONTROL=ignoredups -HISTSIZE=-1 -HISTFILESIZE=-1 - -export TERM=xterm-256color - -alias ls="ls --color=auto" -alias clear='printf "\e[2J\e[H"' - -# todo: https://github.com/sharkdp/bat/blob/master/src/bin/bat/directories.rs panics if not set? -export BAT_CONFIG_DIR="/cfg/bat" -export BAT_CACHE_PATH="/cache/bat" -export DISPLAY=:0 diff --git a/base-files/etc/hostname b/base-files/etc/hostname new file mode 100644 index 00000000000..b6e4a236707 --- /dev/null +++ b/base-files/etc/hostname @@ -0,0 +1 @@ +aero \ No newline at end of file diff --git a/base-files/hello.asm b/base-files/hello.asm deleted file mode 100644 index e29fca7d979..00000000000 --- a/base-files/hello.asm +++ /dev/null @@ -1,20 +0,0 @@ -global _start - -section .text -_start: - mov rdx, len - mov rcx, msg - mov rbx, 1 - mov rax, 1 ; SYS_WRITE - - syscall - - mov rbx, 0 - mov rax, 5 ; SYS_EXIT - syscall - - ud2 ; unreachable - -section .data -msg db "Hello, world!", 0xa -len equ $ - msg \ No newline at end of file diff --git a/base-files/a b/base-files/home/aero/a similarity index 100% rename from base-files/a rename to base-files/home/aero/a diff --git a/base-files/home/aero/test.c b/base-files/home/aero/test.c new file mode 100644 index 00000000000..a99e713a844 --- /dev/null +++ b/base-files/home/aero/test.c @@ -0,0 +1,6 @@ +#include + +int main() { + printf("Hello World, from Aero!\n"); + return 0; +} diff --git a/base-files/test.c b/base-files/test.c deleted file mode 100644 index f0f734d22fe..00000000000 --- a/base-files/test.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int main() { - printf("Hello World, from Aero!\n"); - return 0; -} \ No newline at end of file diff --git a/userland/init/init.c b/userland/init/init.c index 2f7a6e78e70..aaee4abff9d 100644 --- a/userland/init/init.c +++ b/userland/init/init.c @@ -15,11 +15,13 @@ int main() { setenv("TERM", "linux", 1); setenv("USER", "root", 1); setenv("PATH", "/usr/local/bin:/usr/bin", 1); + setenv("HOME", "/home/aero", 1); int pid = fork(); if (!pid) { - char *args[] = {"/usr/bin/bash", "-l", NULL}; + char *args[] = {"/usr/bin/bash", "--login", NULL}; + chdir(getenv("HOME")); execvp("/usr/bin/bash", args); } else { int status; From 46bf24c5846c57a4f68d66b7a337cd3e19cf54dc Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 4 Apr 2024 22:19:28 +1100 Subject: [PATCH 320/368] ports(mlibc): implement `faccessat` Signed-off-by: Anhad Singh --- patches/mlibc/jinx-working-patch.patch | 29 ++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/patches/mlibc/jinx-working-patch.patch b/patches/mlibc/jinx-working-patch.patch index e948a5c0430..f9c3c43ac5b 100644 --- a/patches/mlibc/jinx-working-patch.patch +++ b/patches/mlibc/jinx-working-patch.patch @@ -102,11 +102,32 @@ index 0000000..1b61d5a + ret +.section .note.GNU-stack,"",%progbits diff --git mlibc-clean/sysdeps/aero/generic/filesystem.cpp mlibc-workdir/sysdeps/aero/generic/filesystem.cpp -index 33a11f4..fe5773d 100644 +index 33a11f4..987dc8e 100644 --- mlibc-clean/sysdeps/aero/generic/filesystem.cpp +++ mlibc-workdir/sysdeps/aero/generic/filesystem.cpp -@@ -102,31 +102,24 @@ int sys_access(const char *filename, int mode) { +@@ -89,44 +89,38 @@ int sys_close(int fd) { + return 0; + } + +-int sys_access(const char *filename, int mode) { +- auto result = +- syscall(SYS_ACCESS, AT_FDCWD, filename, strlen(filename), mode, 0); +- +- if (result < 0) { +- return -result; +- } +- ++int sys_faccessat(int dirfd, const char *pathname, int mode, int flags) { ++ auto ret = syscall(SYS_ACCESS, dirfd, pathname, strlen(pathname), mode, flags); ++ if(int e = sc_error(ret); e) ++ return e; + return 0; + } ++int sys_access(const char *filename, int mode) { ++ return sys_faccessat(AT_FDCWD, filename, mode, 0); ++} ++ int sys_stat(fsfd_target fsfdt, int fd, const char *path, int flags, struct stat *statbuf) { - auto result = 0; @@ -118,7 +139,7 @@ index 33a11f4..fe5773d 100644 + fd = AT_FDCWD; break; - } -- + - case fsfd_target::fd: { - result = syscall(SYS_FSTAT, fd, statbuf); + case fsfd_target::fd: @@ -149,7 +170,7 @@ index 33a11f4..fe5773d 100644 return 0; } -@@ -212,6 +205,17 @@ int sys_unlinkat(int fd, const char *path, int flags) { +@@ -212,6 +206,17 @@ int sys_unlinkat(int fd, const char *path, int flags) { return 0; } From 8bd3110912dbb6bcc1902bf4b1b80d7af880d797 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 4 Apr 2024 22:19:55 +1100 Subject: [PATCH 321/368] fix(gethostname): null terminate the resulting str Signed-off-by: Anhad Singh --- src/aero_kernel/src/syscall/process.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index 9682a54d834..72e44389356 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -267,6 +267,7 @@ pub fn gethostname(buffer: &mut [u8]) -> Result { Err(SyscallError::ENAMETOOLONG) } else { buffer[0..bytes.len()].copy_from_slice(bytes); + buffer[bytes.len()] = b'\0'; Ok(bytes.len()) } From 4601c2fb0366d03285d9221a92f11111c41af220 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 4 Apr 2024 22:21:17 +1100 Subject: [PATCH 322/368] fix(nvme): zero the queue Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/block/nvme/queue.rs | 5 +++-- src/aero_kernel/src/utils/dma.rs | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/aero_kernel/src/drivers/block/nvme/queue.rs b/src/aero_kernel/src/drivers/block/nvme/queue.rs index 6763564bb4c..8ad65684161 100644 --- a/src/aero_kernel/src/drivers/block/nvme/queue.rs +++ b/src/aero_kernel/src/drivers/block/nvme/queue.rs @@ -1,4 +1,5 @@ use core::cell::UnsafeCell; +use core::ptr; use core::sync::atomic::{AtomicU16, Ordering}; use crate::mem::paging::PhysAddr; @@ -56,7 +57,7 @@ impl<'bell, T: QueueType> Queue<'bell, T> { Ok(Self { doorbell, - queue: unsafe { Dma::new_uninit_slice(size).assume_init() }, + queue: unsafe { Dma::new_zeroed_slice(size).assume_init() }, index: 0, phase: true, }) @@ -139,7 +140,7 @@ impl<'a> QueuePair<'a> { unsafe { // SAFETY: The offset of the `command_id` field is the same, regardless of the command // type. - command.common.command_id = self.cid; + *ptr::addr_of_mut!(command).cast::().add(1) = self.cid; } self.cid += 1; diff --git a/src/aero_kernel/src/utils/dma.rs b/src/aero_kernel/src/utils/dma.rs index c3c1a19a667..15a26587bd1 100644 --- a/src/aero_kernel/src/utils/dma.rs +++ b/src/aero_kernel/src/utils/dma.rs @@ -32,7 +32,7 @@ unsafe impl Allocator for DmaAllocator { fn allocate(&self, layout: Layout) -> Result, AllocError> { let size_bytes = layout.size(); - let phys = FRAME_ALLOCATOR.alloc_zeroed(size_bytes).ok_or(AllocError)?; + let phys = FRAME_ALLOCATOR.alloc(size_bytes).ok_or(AllocError)?; let virt = phys.as_hhdm_virt(); // SAFETY: The frame is aligned and non-null. @@ -78,6 +78,10 @@ impl Dma { pub fn new_uninit_slice(len: usize) -> Dma<[MaybeUninit]> { Dma(DmaBuffer::new_uninit_slice_in(len, DmaAllocator)) } + + pub fn new_zeroed_slice(len: usize) -> Dma<[MaybeUninit]> { + Dma(DmaBuffer::new_zeroed_slice_in(len, DmaAllocator)) + } } impl Dma<[MaybeUninit]> { From f37046fdbf5931d7f904a89db34b3cefac6b9084 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 4 Apr 2024 22:21:36 +1100 Subject: [PATCH 323/368] feat(access): more complete * Check the flags + check the FD Signed-off-by: Anhad Singh --- src/aero_kernel/src/syscall/fs.rs | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index f9b93a801be..f333d3527a0 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -28,7 +28,7 @@ use crate::fs::eventfd::EventFd; use crate::fs::file_table::{DuplicateHint, FileHandle}; use crate::fs::inode::{DirEntry, PollTable}; use crate::fs::pipe::Pipe; -use crate::fs::{self, lookup_path, LookupMode}; +use crate::fs::{self, LookupMode}; use crate::syscall::SysArg; use crate::userland::scheduler; @@ -353,14 +353,19 @@ pub fn unlink(_fd: usize, _path: &Path, _flags: usize) -> Result Result { - if fd as isize == aero_syscall::AT_FDCWD { - lookup_path(path)?; - Ok(0x00) - } else { - // TODO: Implement atfd access - unimplemented!() - } +pub fn access(fd: usize, path: &Path, _mode: usize, flags: usize) -> Result { + let at = match fd as isize { + AT_FDCWD if !path.is_absolute() => scheduler::current_thread().cwd_dirent(), + _ if !path.is_absolute() => FileDescriptor::from_usize(fd).handle()?.inode.clone(), + _ => fs::root_dir().clone(), + }; + + let flags = AtFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; + + let resolve_last = !flags.contains(AtFlags::SYMLINK_NOFOLLOW); + let _ = fs::lookup_path_with(at, path, LookupMode::None, resolve_last)?; + + Ok(0) } const SETFL_MASK: OpenFlags = OpenFlags::from_bits_truncate( From c5339bee9980f956dea5f87d854cfcaa0aeb7f58 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 17:45:50 +1000 Subject: [PATCH 324/368] ports(coreutils): strip the binaries Signed-off-by: Anhad Singh --- recipes/coreutils | 1 + 1 file changed, 1 insertion(+) diff --git a/recipes/coreutils b/recipes/coreutils index 0e228af75ef..9fd78fd6c79 100644 --- a/recipes/coreutils +++ b/recipes/coreutils @@ -37,4 +37,5 @@ build() { package() { DESTDIR="${dest_dir}" make install-strip + post_package_strip } From 6af5f914f715a3ad652462ef0596020d2bd38272 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 17:46:25 +1000 Subject: [PATCH 325/368] ports(mesa): define `GNU_SOURCE` to fix compilation Signed-off-by: Anhad Singh --- patches/mesa/jinx-working-patch.patch | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/patches/mesa/jinx-working-patch.patch b/patches/mesa/jinx-working-patch.patch index 3fdc866bcfa..20d43de4e12 100644 --- a/patches/mesa/jinx-working-patch.patch +++ b/patches/mesa/jinx-working-patch.patch @@ -11,6 +11,19 @@ index 0254024..c2ffd35 100644 #include typedef int8_t __s8; typedef uint8_t __u8; +diff --git mesa-clean/meson.build mesa-workdir/meson.build +index 2902c10..1da7605 100644 +--- mesa-clean/meson.build ++++ mesa-workdir/meson.build +@@ -959,7 +959,7 @@ if cc.has_function('fmemopen') + endif + + # TODO: this is very incomplete +-if ['linux', 'cygwin', 'gnu', 'freebsd', 'gnu/kfreebsd', 'haiku', 'android'].contains(host_machine.system()) ++if ['linux', 'cygwin', 'gnu', 'freebsd', 'gnu/kfreebsd', 'haiku', 'android', 'aero'].contains(host_machine.system()) + pre_args += '-D_GNU_SOURCE' + elif host_machine.system() == 'sunos' + pre_args += '-D__EXTENSIONS__' diff --git mesa-clean/src/compiler/spirv/spirv_to_nir.c mesa-workdir/src/compiler/spirv/spirv_to_nir.c index 5f36118..a501802 100644 --- mesa-clean/src/compiler/spirv/spirv_to_nir.c From 0001dae0b7d6026cf3dceda0eb64d5c1ca7f6514 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 17:46:51 +1000 Subject: [PATCH 326/368] ports(llvm): fix patch Signed-off-by: Anhad Singh --- patches/llvm/jinx-working-patch.patch | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/patches/llvm/jinx-working-patch.patch b/patches/llvm/jinx-working-patch.patch index 24d4135b66b..2ac261e9954 100644 --- a/patches/llvm/jinx-working-patch.patch +++ b/patches/llvm/jinx-working-patch.patch @@ -631,7 +631,7 @@ index 79ccd64..ae3bfb0 100644 Solaris, UEFI, diff --git llvm-clean/llvm/lib/Support/Unix/Path.inc llvm-workdir/llvm/lib/Support/Unix/Path.inc -index e2aece4..72a6259 100644 +index e2aece4..54741ac 100644 --- llvm-clean/llvm/lib/Support/Unix/Path.inc +++ llvm-workdir/llvm/lib/Support/Unix/Path.inc @@ -74,7 +74,8 @@ extern char **environ; @@ -653,7 +653,26 @@ index e2aece4..72a6259 100644 #if defined(HAVE_LINUX_MAGIC_H) #include #else -@@ -472,7 +473,7 @@ std::error_code remove(const Twine &path, bool IgnoreNonExisting) { +@@ -129,7 +130,7 @@ const file_t kInvalidFile = -1; + #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \ + defined(__minix) || defined(__FreeBSD_kernel__) || defined(__linux__) || \ + defined(__CYGWIN__) || defined(__DragonFly__) || defined(_AIX) || \ +- defined(__GNU__) || (defined(__sun__) && defined(__svr4__)) ++ defined(__GNU__) || (defined(__sun__) && defined(__svr4__)) || defined(__aero__) + static int test_dir(char ret[PATH_MAX], const char *dir, const char *bin) { + struct stat sb; + char fullpath[PATH_MAX]; +@@ -250,7 +251,8 @@ std::string getMainExecutable(const char *argv0, void *MainAddr) { + // If we don't have procfs mounted, fall back to argv[0] + if (getprogpath(exe_path, argv0) != NULL) + return exe_path; +-#elif defined(__linux__) || defined(__CYGWIN__) || defined(__gnu_hurd__) ++#elif defined(__linux__) || defined(__CYGWIN__) || defined(__gnu_hurd__) || \ ++ defined(__aero__) + char exe_path[PATH_MAX]; + const char *aPath = "/proc/self/exe"; + if (sys::fs::exists(aPath)) { +@@ -472,7 +474,7 @@ std::error_code remove(const Twine &path, bool IgnoreNonExisting) { } static bool is_local_impl(struct STATVFS &Vfs) { From cc0b4484b04523f1003179d1a6bc701cb3c9ad9e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 17:47:08 +1000 Subject: [PATCH 327/368] ports(xorg-proto): fix patch Signed-off-by: Anhad Singh --- patches/xorg-proto/jinx-working-patch.patch | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/patches/xorg-proto/jinx-working-patch.patch b/patches/xorg-proto/jinx-working-patch.patch index 9c44f9bb503..ddea30d9e82 100644 --- a/patches/xorg-proto/jinx-working-patch.patch +++ b/patches/xorg-proto/jinx-working-patch.patch @@ -1,5 +1,18 @@ +diff --git xorg-proto-clean/include/X11/Xfuncs.h xorg-proto-workdir/include/X11/Xfuncs.h +index b23c283..89dbbb5 100644 +--- xorg-proto-clean/include/X11/Xfuncs.h ++++ xorg-proto-workdir/include/X11/Xfuncs.h +@@ -44,7 +44,7 @@ void bcopy(); + # define bcmp(b1,b2,len) memcmp(b1, b2, len) + # else + # include +-# if defined(__SCO__) || defined(__sun) || defined(__UNIXWARE__) || defined(__CYGWIN__) || defined(_AIX) || defined(__APPLE__) ++# if defined(__SCO__) || defined(__sun) || defined(__UNIXWARE__) || defined(__CYGWIN__) || defined(_AIX) || defined(__APPLE__) || defined(__aero__) + # include + # endif + # define _XFUNCS_H_INCLUDED_STRING_H diff --git xorg-proto-clean/include/X11/Xos.h xorg-proto-workdir/include/X11/Xos.h -index 75cc5b7..9adf88d 100644 +index 75cc5b7..6c46e33 100644 --- xorg-proto-clean/include/X11/Xos.h +++ xorg-proto-workdir/include/X11/Xos.h @@ -60,7 +60,7 @@ in this Software without prior written authorization from The Open Group. @@ -12,7 +25,7 @@ index 75cc5b7..9adf88d 100644 # else # ifndef index diff --git xorg-proto-clean/include/X11/Xos_r.h xorg-proto-workdir/include/X11/Xos_r.h -index f963b64..5ade17b 100644 +index f963b64..542c19d 100644 --- xorg-proto-clean/include/X11/Xos_r.h +++ xorg-proto-workdir/include/X11/Xos_r.h @@ -318,7 +318,7 @@ static __inline__ void _Xpw_copyPasswd(_Xgetpwparams p) From 343106db14859831b3ec16d90029587fbd6d2707 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 17:47:24 +1000 Subject: [PATCH 328/368] ports(llvm): build clang and clang-tools Signed-off-by: Anhad Singh --- recipes/llvm | 1 + 1 file changed, 1 insertion(+) diff --git a/recipes/llvm b/recipes/llvm index 8800987df7d..c1f425d614e 100644 --- a/recipes/llvm +++ b/recipes/llvm @@ -20,6 +20,7 @@ build() { -DLLVM_DEFAULT_TARGET_TRIPLE=${OS_TRIPLET} \ -DLLVM_HOST_TRIPLE=${OS_TRIPLET} \ -DLLVM_ENABLE_TERMINFO=OFF \ + -DLLVM_ENABLE_PROJECTS="llvm;clang;clang-tools-extra" \ -Wno-dev \ ${source_dir}/llvm From d2dc8c09836386f26f4fd001eb8a57ad33f9f24c Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 18:00:05 +1000 Subject: [PATCH 329/368] ports(frigg): bump Signed-off-by: Anhad Singh --- recipes/frigg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/frigg b/recipes/frigg index 84df948df6d..4a303d3524b 100644 --- a/recipes/frigg +++ b/recipes/frigg @@ -1,8 +1,8 @@ name=frigg -version=a24e99eeb3125e7f48f657ff8afca26a9ac4aaae +version=dd9d1eab062e8168edafe8d6249524e4e2b157fe revision=1 tarball_url="https://github.com/managarm/frigg/archive/${version}.tar.gz" -tarball_blake2b="bb47eb23f4a0d6cc31d8d2345d424d713f4c0f7b02c28a5a17d937023e778961a9a3a553facfdd60ce58d45da2479e6018ecbb9b39f9bf87c30995bb19698666" +tarball_blake2b="7d77f563f604a590713733b2f0030d0465dd4abbc304c6e183895146ba57bc3cc73993edee898a7a43eadb97d731297b0fb76d3cfc7e5b2ec61d3ec360cc540d" imagedeps="gcc meson ninja" hostdeps="pkg-config" From 1f13576acbd0bb3d6c3eb5b596183d9c86aab611 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 18:01:21 +1000 Subject: [PATCH 330/368] ports(mlibc): bump WARNING: ABI-BREAK The whole sysroot is required to be recompiled. Run `make deep-clean` and `make distro-image`. Signed-off-by: Anhad Singh --- Makefile | 4 + patches/mlibc/jinx-working-patch.patch | 248 +++++------------------- recipes/mlibc | 6 +- src/aero_kernel/src/syscall/process.rs | 2 +- src/aero_kernel/src/userland/signals.rs | 2 +- src/aero_syscall/src/consts.rs | 46 +++-- src/aero_syscall/src/lib.rs | 85 ++++---- src/aero_syscall/src/signal.rs | 8 +- 8 files changed, 147 insertions(+), 254 deletions(-) diff --git a/Makefile b/Makefile index 87fdabf1684..547837bb7e3 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,10 @@ USERLAND_TARGET := builds/userland/target/init clean: rm -rf $(SOURCE_DIR)/target +.PHONY: deep-clean +deep-clean: clean + rm -rf target sysroot sources pkgs host-pkgs host-builds builds + .PHONY: check check: cd $(SOURCE_DIR) && cargo check diff --git a/patches/mlibc/jinx-working-patch.patch b/patches/mlibc/jinx-working-patch.patch index f9c3c43ac5b..f646dc2e747 100644 --- a/patches/mlibc/jinx-working-patch.patch +++ b/patches/mlibc/jinx-working-patch.patch @@ -1,111 +1,25 @@ -diff --git mlibc-clean/options/ansi/generic/time-stubs.cpp mlibc-workdir/options/ansi/generic/time-stubs.cpp -index 887a7d3..7fd46bc 100644 ---- mlibc-clean/options/ansi/generic/time-stubs.cpp -+++ mlibc-workdir/options/ansi/generic/time-stubs.cpp -@@ -242,6 +242,7 @@ size_t strftime(char *__restrict dest, size_t max_size, - c++; - break; - } -+ case 'l': - case 'I': { - int hour = tm->tm_hour; - if(!hour) -diff --git mlibc-clean/options/posix/generic/posix_stdlib.cpp mlibc-workdir/options/posix/generic/posix_stdlib.cpp -index 7128e16..14e1dd7 100644 ---- mlibc-clean/options/posix/generic/posix_stdlib.cpp -+++ mlibc-workdir/options/posix/generic/posix_stdlib.cpp -@@ -139,23 +139,34 @@ char *setstate(char *state) { - // ---------------------------------------------------------------------------- +diff --git mlibc-clean/options/glibc/generic/execinfo.cpp mlibc-workdir/options/glibc/generic/execinfo.cpp +index 3474615..d06f130 100644 +--- mlibc-clean/options/glibc/generic/execinfo.cpp ++++ mlibc-workdir/options/glibc/generic/execinfo.cpp +@@ -1,9 +1,10 @@ + #include + #include ++#include - int mkostemp(char *pattern, int flags) { -+ return mkostemps(pattern, 0, flags); -+} -+ -+int mkstemp(char *path) { -+ return mkostemp(path, 0); -+} -+ -+int mkostemps(char *pattern, int suffixlen, int flags) { - flags &= ~O_WRONLY; - auto n = strlen(pattern); - __ensure(n >= 6); -- if(n < 6) { -+ -+ if(n < 6 || suffixlen > (n - 6)) { - errno = EINVAL; - return -1; - } -- for(size_t i = 0; i < 6; i++) { -- if(pattern[n - 6 + i] == 'X') -- continue; -+ -+ if (memcmp(pattern + (n - suffixlen - 6), "XXXXXX", 6)) { - errno = EINVAL; - return -1; - } - - // TODO: Do an exponential search. - for(size_t i = 0; i < 999999; i++) { -- __ensure(sprintf(pattern + (n - 6), "%06zu", i) == 6); -+ int x = i; -+ for (int j = 0; j < 6; j++, x >>= 5) { -+ pattern[(n - suffixlen - 6) + j] = 'A' + (x & 15) + (x & 16) * 2; -+ } - // mlibc::infoLogger() << "mlibc: mkstemp candidate is " - // << (const char *)pattern << frg::endlog; - -@@ -172,16 +183,6 @@ int mkostemp(char *pattern, int flags) { - return -1; + int backtrace(void **, int) { +- __ensure(!"Not implemented"); +- __builtin_unreachable(); ++ mlibc::infoLogger() << "backtrace: Not implemented" << frg::endlog; ++ return 0; } --int mkstemp(char *path) { -- return mkostemp(path, 0); --} -- --int mkostemps(char *pattern, int suffixlen, int flags) { -- (void)suffixlen; -- mlibc::infoLogger() << "mlibc: mkostemps ignores suffixlen!" << frg::endlog; -- return mkostemp(pattern, flags); --} -- - int mkstemps(char *pattern, int suffixlen) { - return mkostemps(pattern, suffixlen, 0); - } -diff --git mlibc-workdir/sysdeps/aero/crt-x86_64/crti.S mlibc-workdir/sysdeps/aero/crt-x86_64/crti.S -new file mode 100644 -index 0000000..f04679c ---- /dev/null -+++ mlibc-workdir/sysdeps/aero/crt-x86_64/crti.S -@@ -0,0 +1,10 @@ -+.section .init -+.global _init -+_init: -+ push %rax -+ -+.section .fini -+.global _fini -+_fini: -+ push %rax -+.section .note.GNU-stack,"",%progbits -diff --git mlibc-workdir/sysdeps/aero/crt-x86_64/crtn.S mlibc-workdir/sysdeps/aero/crt-x86_64/crtn.S -new file mode 100644 -index 0000000..1b61d5a ---- /dev/null -+++ mlibc-workdir/sysdeps/aero/crt-x86_64/crtn.S -@@ -0,0 +1,8 @@ -+.section .init -+ pop %rax -+ ret -+ -+.section .fini -+ pop %rax -+ ret -+.section .note.GNU-stack,"",%progbits + char **backtrace_symbols(void *const *, int) { diff --git mlibc-clean/sysdeps/aero/generic/filesystem.cpp mlibc-workdir/sysdeps/aero/generic/filesystem.cpp -index 33a11f4..987dc8e 100644 +index b9a812b..95c49b9 100644 --- mlibc-clean/sysdeps/aero/generic/filesystem.cpp +++ mlibc-workdir/sysdeps/aero/generic/filesystem.cpp -@@ -89,44 +89,38 @@ int sys_close(int fd) { +@@ -89,23 +89,24 @@ int sys_close(int fd) { return 0; } @@ -130,105 +44,49 @@ index 33a11f4..987dc8e 100644 + int sys_stat(fsfd_target fsfdt, int fd, const char *path, int flags, struct stat *statbuf) { -- auto result = 0; -- switch (fsfdt) { -- case fsfd_target::path: { -- result = syscall(SYS_STAT, path, strlen(path), statbuf); -+ case fsfd_target::path: -+ fd = AT_FDCWD; - break; -- } - -- case fsfd_target::fd: { -- result = syscall(SYS_FSTAT, fd, statbuf); -+ case fsfd_target::fd: -+ flags |= AT_EMPTY_PATH; -+ -+ case fsfd_target::fd_path: + case fsfd_target::path: + fd = AT_FDCWD; break; -- } - -- default: { -- mlibc::infoLogger() -- << "mlibc warning: sys_stat: unsupported fsfd target" -- << frg::endlog; -- return EINVAL; -- } -- } -- -- if (result < 0) { -- return -result; -+ default: -+ __ensure(!"Invalid fsfd_target"); -+ __builtin_unreachable(); - } - -+ auto ret = syscall(SYS_FSTAT, fd, path, strlen(path), flags, statbuf); -+ if(int e = sc_error(ret); e) -+ return e; - return 0; - } - -@@ -212,6 +206,17 @@ int sys_unlinkat(int fd, const char *path, int flags) { - return 0; ++ + case fsfd_target::fd: + flags |= AT_EMPTY_PATH; + +@@ -199,14 +200,14 @@ int sys_rmdir(const char *path) { } -+int sys_symlink(const char *target_path, const char *link_path) { -+ return sys_symlinkat(target_path, AT_FDCWD, link_path); -+} -+ -+int sys_symlinkat(const char *target_path, int dirfd, const char *link_path) { -+ auto ret = syscall(SYS_SYMLINK_AT, dirfd, target_path, strlen(target_path), link_path, strlen(link_path)); + int sys_unlinkat(int fd, const char *path, int flags) { +- auto ret = syscall(SYS_UNLINK, fd, path, strlen(path), flags); +- if (int e = sc_error(ret); e) +- return e; +- return 0; ++ auto ret = syscall(SYS_UNLINK, fd, path, strlen(path), flags); + if (int e = sc_error(ret); e) + return e; + return 0; -+} -+ - struct aero_dir_entry { - size_t inode; - size_t offset; -diff --git mlibc-clean/sysdeps/aero/include/aero/syscall.h mlibc-workdir/sysdeps/aero/include/aero/syscall.h -index 39c5b65..49533cc 100644 ---- mlibc-clean/sysdeps/aero/include/aero/syscall.h -+++ mlibc-workdir/sysdeps/aero/include/aero/syscall.h -@@ -82,6 +82,10 @@ - #define SYS_SOCK_SHUTDOWN 75 - #define SYS_GETPEERNAME 76 - #define SYS_GETSOCKNAME 77 -+#define SYS_DEBUG 78 -+#define SYS_SETSOCKOPT 79 -+#define SYS_GETSOCKOPT 80 -+#define SYS_SYMLINK_AT 81 + } - // Invalid syscall used to trigger a log error in the kernel (as a hint) - // so, that we can implement the syscall in the kernel. -diff --git mlibc-clean/sysdeps/aero/meson.build mlibc-workdir/sysdeps/aero/meson.build -index 9d10701..3d2a883 100644 ---- mlibc-clean/sysdeps/aero/meson.build -+++ mlibc-workdir/sysdeps/aero/meson.build -@@ -75,6 +75,24 @@ if not headers_only - install: true, - install_dir: get_option('libdir') - ) -+ -+ custom_target('crti', -+ build_by_default: true, -+ command: c_compiler.cmd_array() + ['-c', '-o', '@OUTPUT@', '@INPUT@'], -+ input: 'crt-x86_64/crti.S', -+ output: 'crti.o', -+ install: true, -+ install_dir: get_option('libdir') -+ ) -+ -+ custom_target('crtn', -+ build_by_default: true, -+ command: c_compiler.cmd_array() + ['-c', '-o', '@OUTPUT@', '@INPUT@'], -+ input: 'crt-x86_64/crtn.S', -+ output: 'crtn.o', -+ install: true, -+ install_dir: get_option('libdir') -+ ) - endif + int sys_symlink(const char *target_path, const char *link_path) { +- return sys_symlinkat(target_path, AT_FDCWD, link_path); ++ return sys_symlinkat(target_path, AT_FDCWD, link_path); + } - if host_machine.cpu_family() == 'x86_64' + int sys_symlinkat(const char *target_path, int dirfd, const char *link_path) { +diff --git mlibc-clean/sysdeps/aero/include/abi-bits/fcntl.h mlibc-workdir/sysdeps/aero/include/abi-bits/fcntl.h +index ea5323a..463e2c9 120000 +--- mlibc-clean/sysdeps/aero/include/abi-bits/fcntl.h ++++ mlibc-workdir/sysdeps/aero/include/abi-bits/fcntl.h +@@ -1 +1 @@ +-../../../../abis/mlibc/fcntl.h +\ No newline at end of file ++../../../../abis/linux/fcntl.h +\ No newline at end of file +diff --git mlibc-clean/sysdeps/aero/include/abi-bits/stat.h mlibc-workdir/sysdeps/aero/include/abi-bits/stat.h +index 82642c3..1f63b41 120000 +--- mlibc-clean/sysdeps/aero/include/abi-bits/stat.h ++++ mlibc-workdir/sysdeps/aero/include/abi-bits/stat.h +@@ -1 +1 @@ +-../../../../abis/mlibc/stat.h +\ No newline at end of file ++../../../../abis/linux/stat.h +\ No newline at end of file diff --git a/recipes/mlibc b/recipes/mlibc index 8c4ed720ee7..db96777c229 100644 --- a/recipes/mlibc +++ b/recipes/mlibc @@ -1,8 +1,8 @@ name=mlibc -version=0dd4dbdd377dc776e6f7d698281ac6781d652922 +version=882fdd99b503ee1b567ccacb75cf4d7b7c9395e1 revision=1 -tarball_url="https://github.com/aero-os/mlibc/archive/${version}.tar.gz" -tarball_blake2b="a4886c2d6a85c781293db9139c0773469c3877e5db2a76f1a735e2cc04ee78fef5b8fc1693b724f9fc8879322464ddf48eac8c018ebfd4f8aa983141013d64e3" +tarball_url="https://github.com/Andy-Python-Programmer/mlibc/archive/${version}.tar.gz" +tarball_blake2b="3dcb34f3e2e2d8b1cbdd5d87e722fe03b23d9f460affd82ea888bcd6dabe96a475a2153f477360b78efcad421f83c534e308e6057c319c78c3bc666a03dbd6a7" imagedeps="meson ninja" hostdeps="gcc pkg-config libgcc-binaries" builddeps="cxxshim frigg linux-headers" diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index 72e44389356..f9a41c2fd14 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -330,7 +330,7 @@ pub fn sigaction( }; let entry = if let Some(new) = new { - Some(SignalEntry::from_sigaction(*new, sigreturn)?) + Some(SignalEntry::from_sigaction(&*new, sigreturn)?) } else { None }; diff --git a/src/aero_kernel/src/userland/signals.rs b/src/aero_kernel/src/userland/signals.rs index 0cf1cf56c96..5d3b2621e67 100644 --- a/src/aero_kernel/src/userland/signals.rs +++ b/src/aero_kernel/src/userland/signals.rs @@ -147,7 +147,7 @@ pub struct SignalEntry { impl SignalEntry { /// Create a new `SignalEntry` with the provided `sigaction` and `sigreturn`. pub fn from_sigaction( - sigaction: SigAction, + sigaction: &SigAction, sigreturn: usize, ) -> Result { Ok(SignalEntry { diff --git a/src/aero_syscall/src/consts.rs b/src/aero_syscall/src/consts.rs index a08796a60b6..e3196cdb41c 100644 --- a/src/aero_syscall/src/consts.rs +++ b/src/aero_syscall/src/consts.rs @@ -104,17 +104,41 @@ pub const SYS_GETSOCKOPT: usize = 80; pub const SYS_SYMLINK_AT: usize = 81; // constants for fcntl()'s command argument: -pub const F_DUPFD: usize = 1; -pub const F_DUPFD_CLOEXEC: usize = 2; -pub const F_GETFD: usize = 3; -pub const F_SETFD: usize = 4; -pub const F_GETFL: usize = 5; -pub const F_SETFL: usize = 6; -pub const F_GETLK: usize = 7; -pub const F_SETLK: usize = 8; -pub const F_SETLKW: usize = 9; -pub const F_GETOWN: usize = 10; -pub const F_SETOWN: usize = 11; +// mlibc/abis/linux/fcntl.h +pub const F_DUPFD: usize = 0; +pub const F_GETFD: usize = 1; +pub const F_SETFD: usize = 2; +pub const F_GETFL: usize = 3; +pub const F_SETFL: usize = 4; + +pub const F_SETOWN: usize = 8; +pub const F_GETOWN: usize = 9; +pub const F_SETSIG: usize = 10; +pub const F_GETSIG: usize = 11; + +pub const F_GETLK: usize = 5; +pub const F_SETLK: usize = 6; +pub const F_SETLKW: usize = 7; + +pub const F_SETOWN_EX: usize = 15; +pub const F_GETOWN_EX: usize = 16; + +pub const F_GETOWNER_UIDS: usize = 17; + +pub const F_DUPFD_CLOEXEC: usize = 1030; +pub const F_ADD_SEALS: usize = 1033; +pub const F_GET_SEALS: usize = 1034; + +pub const F_SEAL_SEAL: usize = 0x0001; +pub const F_SEAL_SHRINK: usize = 0x0002; +pub const F_SEAL_GROW: usize = 0x0004; +pub const F_SEAL_WRITE: usize = 0x0008; + +pub const F_RDLCK: usize = 0; +pub const F_WRLCK: usize = 1; +pub const F_UNLCK: usize = 2; + +pub const FD_CLOEXEC: usize = 1; // constants for fcntl()'s additional argument of F_GETFD and F_SETFD: bitflags::bitflags! { diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index d2ecd44102d..cfadcc9ce1e 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -32,6 +32,7 @@ pub mod time; pub type Result = core::result::Result; +use core::ffi; use core::time::Duration; use byte_endian::BigEndian; @@ -65,33 +66,33 @@ bitflags::bitflags! { bitflags::bitflags! { pub struct OpenFlags: usize { - // reserve 3 bits for the access mode - const O_ACCMODE = 0x0007; - const O_EXEC = 1; - const O_RDONLY = 2; - const O_RDWR = 3; - const O_SEARCH = 4; - const O_WRONLY = 5; - - // these flags get their own bit - const O_APPEND = 0x000008; - const O_CREAT = 0x000010; - const O_DIRECTORY = 0x000020; - const O_EXCL = 0x000040; - const O_NOCTTY = 0x000080; - const O_NOFOLLOW = 0x000100; - const O_TRUNC = 0x000200; - const O_NONBLOCK = 0x000400; - const O_DSYNC = 0x000800; - const O_RSYNC = 0x001000; - const O_SYNC = 0x002000; - const O_CLOEXEC = 0x004000; - const O_PATH = 0x008000; - const O_LARGEFILE = 0x010000; - const O_NOATIME = 0x020000; - const O_ASYNC = 0x040000; - const O_TMPFILE = 0x080000; - const O_DIRECT = 0x100000; + const O_PATH = 0o10000000; + + const O_ACCMODE = (0o3 | Self::O_PATH.bits()); + const O_RDONLY = 0o0; + const O_WRONLY = 0o1; + const O_RDWR = 0o2; + + const O_SEARCH = Self::O_PATH.bits(); + const O_EXEC = Self::O_PATH.bits(); + + const O_CREAT = 0o100; + const O_EXCL = 0o200; + const O_NOCTTY = 0o400; + const O_TRUNC = 0o1000; + const O_APPEND = 0o2000; + const O_NONBLOCK = 0o4000; + const O_DSYNC = 0o10000; + const O_ASYNC = 0o20000; + const O_DIRECT = 0o40000; + const O_DIRECTORY = 0o200000; + const O_NOFOLLOW = 0o400000; + const O_CLOEXEC = 0o2000000; + const O_SYNC = 0o4010000; + const O_RSYNC = 0o4010000; + const O_LARGEFILE = 0o100000; + const O_NOATIME = 0o1000000; + const O_TMPFILE = 0o20000000; } } @@ -672,7 +673,7 @@ pub const AF_UNSPEC: u32 = PF_UNSPEC; pub const AF_NETLINK: u32 = PF_NETLINK; pub const AF_BRIDGE: u32 = PF_BRIDGE; -// sysdeps/aero/include/abi-bits/stat.h +// mlibc/abis/linux/stat.h bitflags::bitflags! { #[derive(Default)] pub struct Mode: u32 { @@ -707,37 +708,43 @@ bitflags::bitflags! { } } -// sysdeps/aero/include/abi-bits/stat.h +// mlibc/abis/linux/stat.h +#[cfg(target_arch = "x86_64")] #[repr(C)] #[derive(Debug, Default)] pub struct Stat { pub st_dev: u64, pub st_ino: u64, - pub st_mode: Mode, pub st_nlink: u32, + pub st_mode: Mode, pub st_uid: u32, pub st_gid: u32, + // FIXME: make this private + pub __pad0: ffi::c_uint, pub st_rdev: u64, pub st_size: i64, + pub st_blksize: u64, + pub st_blocks: u64, pub st_atim: TimeSpec, pub st_mtim: TimeSpec, pub st_ctim: TimeSpec, - pub st_blksize: u64, - pub st_blocks: u64, + // FIXME: make this private + pub __unused: [ffi::c_long; 3], } bitflags::bitflags! { + // mlibc/abis/linux/fcntl.h #[repr(transparent)] pub struct AtFlags: usize { - /// Allow empty relative pathname. - const EMPTY_PATH = 1; - /// Follow symbolic links. - const SYMLINK_FOLLOW = 2; /// Do not follow symbolic links. - const SYMLINK_NOFOLLOW = 4; + const SYMLINK_NOFOLLOW = 0x100; /// Remove directory instead of unlinking file. - const REMOVEDIR = 8; + const REMOVEDIR = 0x200; + /// Follow symbolic links. + const SYMLINK_FOLLOW = 0x400; /// Test access permitted for effective IDs, not real IDs. - const EACCESS = 512; + const EACCESS = 0x200; + /// Allow empty relative pathname. + const EMPTY_PATH = 0x1000; } } diff --git a/src/aero_syscall/src/signal.rs b/src/aero_syscall/src/signal.rs index fe814c5a5b8..f0037aae990 100644 --- a/src/aero_syscall/src/signal.rs +++ b/src/aero_syscall/src/signal.rs @@ -110,18 +110,18 @@ impl From for u64 { #[derive(Copy, Clone, Debug)] pub struct SigAction { pub sa_handler: u64, - pub sa_mask: u64, - pub sa_flags: u32, + pub sa_flags: u64, pub sa_sigaction: u64, + pub sa_mask: u64, } impl SigAction { pub fn new(handler: SignalHandler, mask: u64, flags: SignalFlags) -> SigAction { SigAction { sa_handler: handler.into(), - sa_mask: mask, sa_flags: flags.bits(), sa_sigaction: 0, + sa_mask: mask, } } } @@ -129,7 +129,7 @@ impl SigAction { bitflags::bitflags! { // mlibc/abis/linux/signal.h #[derive(Default)] - pub struct SignalFlags: u32 { + pub struct SignalFlags: u64 { const SA_NOCLDSTOP = 1; const SA_NOCLDWAIT = 2; const SA_SIGINFO = 4; From 37153263a57740433046b688fed2d98c736339f3 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 18:02:10 +1000 Subject: [PATCH 331/368] feat(Makefile): bump Jinx Signed-off-by: Anhad Singh --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 547837bb7e3..15e3c534476 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,9 @@ else endif jinx: + mkdir -p target if [ ! -f "target/jinx" ]; then \ - curl -Lo target/jinx https://github.com/mintsuki/jinx/raw/30e7d5487bff67a66dfba332113157a08a324820/jinx; \ + curl -Lo target/jinx https://github.com/mintsuki/jinx/raw/353c468765dd9404bacba8e5626d0830528e4300/jinx; \ chmod +x target/jinx; \ fi From b2c3fbc63a871c7b2ef75f38fbda2b7863668560 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 18:27:27 +1000 Subject: [PATCH 332/368] ports(mlibc): bump Signed-off-by: Anhad Singh --- patches/mlibc/jinx-working-patch.patch | 75 -------------------------- recipes/mlibc | 6 +-- 2 files changed, 3 insertions(+), 78 deletions(-) diff --git a/patches/mlibc/jinx-working-patch.patch b/patches/mlibc/jinx-working-patch.patch index f646dc2e747..9dfbb982b29 100644 --- a/patches/mlibc/jinx-working-patch.patch +++ b/patches/mlibc/jinx-working-patch.patch @@ -15,78 +15,3 @@ index 3474615..d06f130 100644 } char **backtrace_symbols(void *const *, int) { -diff --git mlibc-clean/sysdeps/aero/generic/filesystem.cpp mlibc-workdir/sysdeps/aero/generic/filesystem.cpp -index b9a812b..95c49b9 100644 ---- mlibc-clean/sysdeps/aero/generic/filesystem.cpp -+++ mlibc-workdir/sysdeps/aero/generic/filesystem.cpp -@@ -89,23 +89,24 @@ int sys_close(int fd) { - return 0; - } - --int sys_access(const char *filename, int mode) { -- auto result = -- syscall(SYS_ACCESS, AT_FDCWD, filename, strlen(filename), mode, 0); -- -- if (result < 0) { -- return -result; -- } -- -+int sys_faccessat(int dirfd, const char *pathname, int mode, int flags) { -+ auto ret = syscall(SYS_ACCESS, dirfd, pathname, strlen(pathname), mode, flags); -+ if(int e = sc_error(ret); e) -+ return e; - return 0; - } - -+int sys_access(const char *filename, int mode) { -+ return sys_faccessat(AT_FDCWD, filename, mode, 0); -+} -+ - int sys_stat(fsfd_target fsfdt, int fd, const char *path, int flags, - struct stat *statbuf) { - switch (fsfdt) { - case fsfd_target::path: - fd = AT_FDCWD; - break; -+ - case fsfd_target::fd: - flags |= AT_EMPTY_PATH; - -@@ -199,14 +200,14 @@ int sys_rmdir(const char *path) { - } - - int sys_unlinkat(int fd, const char *path, int flags) { -- auto ret = syscall(SYS_UNLINK, fd, path, strlen(path), flags); -- if (int e = sc_error(ret); e) -- return e; -- return 0; -+ auto ret = syscall(SYS_UNLINK, fd, path, strlen(path), flags); -+ if (int e = sc_error(ret); e) -+ return e; -+ return 0; - } - - int sys_symlink(const char *target_path, const char *link_path) { -- return sys_symlinkat(target_path, AT_FDCWD, link_path); -+ return sys_symlinkat(target_path, AT_FDCWD, link_path); - } - - int sys_symlinkat(const char *target_path, int dirfd, const char *link_path) { -diff --git mlibc-clean/sysdeps/aero/include/abi-bits/fcntl.h mlibc-workdir/sysdeps/aero/include/abi-bits/fcntl.h -index ea5323a..463e2c9 120000 ---- mlibc-clean/sysdeps/aero/include/abi-bits/fcntl.h -+++ mlibc-workdir/sysdeps/aero/include/abi-bits/fcntl.h -@@ -1 +1 @@ --../../../../abis/mlibc/fcntl.h -\ No newline at end of file -+../../../../abis/linux/fcntl.h -\ No newline at end of file -diff --git mlibc-clean/sysdeps/aero/include/abi-bits/stat.h mlibc-workdir/sysdeps/aero/include/abi-bits/stat.h -index 82642c3..1f63b41 120000 ---- mlibc-clean/sysdeps/aero/include/abi-bits/stat.h -+++ mlibc-workdir/sysdeps/aero/include/abi-bits/stat.h -@@ -1 +1 @@ --../../../../abis/mlibc/stat.h -\ No newline at end of file -+../../../../abis/linux/stat.h -\ No newline at end of file diff --git a/recipes/mlibc b/recipes/mlibc index db96777c229..819d178384e 100644 --- a/recipes/mlibc +++ b/recipes/mlibc @@ -1,8 +1,8 @@ name=mlibc -version=882fdd99b503ee1b567ccacb75cf4d7b7c9395e1 +version=71d6b326e31b88796088690278ce31bb8e9fc994 revision=1 -tarball_url="https://github.com/Andy-Python-Programmer/mlibc/archive/${version}.tar.gz" -tarball_blake2b="3dcb34f3e2e2d8b1cbdd5d87e722fe03b23d9f460affd82ea888bcd6dabe96a475a2153f477360b78efcad421f83c534e308e6057c319c78c3bc666a03dbd6a7" +tarball_url="https://github.com/managarm/mlibc/archive/${version}.tar.gz" +tarball_blake2b="b2fc2178bf9a26191a78866272da2ff6cb2b547cb3fdd5fe28f4280d5bbf98a929e9920e5c05a25ed340af8d29d45265e148eba6d31490a7a6796adfcb2158d6" imagedeps="meson ninja" hostdeps="gcc pkg-config libgcc-binaries" builddeps="cxxshim frigg linux-headers" From f533ab82582ce8e1dda31f6a0ee7f6616fd7bc46 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 19:14:46 +1000 Subject: [PATCH 333/368] feat(ports): add xfe Signed-off-by: Anhad Singh --- build-support/jwm/system.jwmrc | 1 + host-recipes/intltool | 20 +++++ patches/fox/jinx-working-patch.patch | 25 ++++++ patches/xfe/jinx-working-patch.patch | 124 +++++++++++++++++++++++++++ recipes/fox | 27 ++++++ recipes/xcb-util | 26 ++++++ recipes/xfe | 30 +++++++ source-recipes/intltool | 9 ++ 8 files changed, 262 insertions(+) create mode 100644 host-recipes/intltool create mode 100644 patches/fox/jinx-working-patch.patch create mode 100644 patches/xfe/jinx-working-patch.patch create mode 100644 recipes/fox create mode 100644 recipes/xcb-util create mode 100644 recipes/xfe create mode 100644 source-recipes/intltool diff --git a/build-support/jwm/system.jwmrc b/build-support/jwm/system.jwmrc index 88cd55fdfe0..031c5c4a3fa 100644 --- a/build-support/jwm/system.jwmrc +++ b/build-support/jwm/system.jwmrc @@ -5,6 +5,7 @@ xterm + xfe audacious xcalc diff --git a/host-recipes/intltool b/host-recipes/intltool new file mode 100644 index 00000000000..3825495b4d0 --- /dev/null +++ b/host-recipes/intltool @@ -0,0 +1,20 @@ +name=intltool +from_source=intltool +revision=1 +hostdeps="autoconf automake libtool pkg-config" +imagedeps="gcc perl-xml-parser" + +build() { + #cp -rp "${source_dir}"/. ./ + ${source_dir}/configure \ + --prefix="${prefix}" + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + strip_command=strip \ + post_package_strip +} diff --git a/patches/fox/jinx-working-patch.patch b/patches/fox/jinx-working-patch.patch new file mode 100644 index 00000000000..faa04295413 --- /dev/null +++ b/patches/fox/jinx-working-patch.patch @@ -0,0 +1,25 @@ +diff --git fox-clean/configure.ac fox-workdir/configure.ac +index ce0f651..189b5e8 100644 +--- fox-clean/configure.ac ++++ fox-workdir/configure.ac +@@ -9,6 +9,8 @@ AC_INIT(fox,[fox_version],jeroen@fox-toolkit.com) + AC_CONFIG_SRCDIR([include/fx.h]) + AM_INIT_AUTOMAKE([foreign]) + ++PKG_PROG_PKG_CONFIG ++ + # Set version + FOX_MAJOR_VERSION=fox_major + FOX_MINOR_VERSION=fox_minor +@@ -190,8 +192,8 @@ AC_MSG_CHECKING(for Xft support) + AC_ARG_WITH(xft,[ --with-xft enable Xft support]) + AC_MSG_RESULT([$with_xft]) + if test "x$with_xft" != "xno"; then +-XFTCFLAGS="-I/usr/include/freetype2" +-XFTLIBS="-lfreetype -lfontconfig -lXft" ++XFTCFLAGS="$($PKG_CONFIG --cflags freetype2 fontconfig xft)" ++XFTLIBS="$($PKG_CONFIG --libs freetype2 fontconfig xft)" + saved_cppflags="${CXXFLAGS}" + CXXFLAGS="${CXXFLAGS} -DHAVE_XFT_H=1 $XFTCFLAGS" + X_BASE_LIBS="${X_BASE_LIBS} $XFTLIBS" + diff --git a/patches/xfe/jinx-working-patch.patch b/patches/xfe/jinx-working-patch.patch new file mode 100644 index 00000000000..a9b187463eb --- /dev/null +++ b/patches/xfe/jinx-working-patch.patch @@ -0,0 +1,124 @@ +diff --git xfe-clean/configure.ac xfe-workdir/configure.ac +index 0fa6dc9..ecaa037 100644 +--- xfe-clean/configure.ac ++++ xfe-workdir/configure.ac +@@ -69,9 +69,9 @@ AC_FUNC_GETGROUPS + AC_FUNC_GETMNTENT + AC_FUNC_LSTAT + AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK +-AC_FUNC_MALLOC ++#AC_FUNC_MALLOC + AC_FUNC_MKTIME +-AC_FUNC_REALLOC ++#AC_FUNC_REALLOC + AC_FUNC_STAT + AC_FUNC_UTIME_NULL + AC_CHECK_FUNCS([endgrent endpwent gethostname getmntent gettimeofday lchown memset mkdir mkfifo putenv rmdir setlocale sqrt strchr strdup strerror strstr strtol strtoul strtoull utime]) +@@ -87,25 +87,19 @@ AC_CHECK_LIB(FOX-1.6,fxfindfox,,AC_MSG_ERROR("libFOX-1.6 not found")) + + # Check for FOX 1.6 header files + AC_LANG([C++]) +-AC_CHECK_HEADER(fox-1.6/fx.h,,AC_MSG_ERROR("fox-1.6/fx.h not found")) ++#AC_CHECK_HEADER(fox-1.6/fx.h,,AC_MSG_ERROR("fox-1.6/fx.h not found")) + + +-# Check if fox-config exists +-AC_CHECK_PROGS(FOX_CONFIG,fox-config-1.6 fox-1.6-config fox-config) +-if test no"$FOX_CONFIG" = no ; then +- AC_MSG_ERROR("fox-config not found") +-fi +- + + # Include flags for the FOX library +-FOXCFLAGS=`$FOX_CONFIG --cflags` ++FOXCFLAGS=`$PKG_CONFIG --cflags fox` + CXXFLAGS="${CXXFLAGS} $FOXCFLAGS" + + + # Check if FOX was compiled with xft support +-TEST_XFT=`$FOX_CONFIG --libs | grep Xft` ++TEST_XFT=yes + if test "x$TEST_XFT" != "x" ; then +- ++ + echo "checking whether FOX was compiled with Xft support... yes" + + # Check for FreeType2 +@@ -135,7 +129,7 @@ if test "x$TEST_XFT" != "x" ; then + CXXFLAGS="$CXXFLAGS -DHAVE_XFT_H" + ], AC_MSG_ERROR("Xft not found")) + fi +- AC_CHECK_HEADER(X11/Xft/Xft.h,,AC_MSG_ERROR("Xft.h not found")) ++ #AC_CHECK_HEADER(X11/Xft/Xft.h,,AC_MSG_ERROR("Xft.h not found")) + + else + echo "checking whether FOX was compiled with Xft support... no" +@@ -149,28 +143,28 @@ else + echo " sudo make install" + echo "=============================================================================================" + echo "" +- AC_MSG_ERROR("missing Xft support in FOX") ++ AC_MSG_ERROR("missing Xft support in FOX") + fi + + + # Check for Xlib headers +-AC_CHECK_HEADER(X11/Xlib.h,,AC_MSG_ERROR("Xlib.h not found")) ++#AC_CHECK_HEADER(X11/Xlib.h,,AC_MSG_ERROR("Xlib.h not found")) + + # Check for XRandR support + AC_MSG_CHECKING(for xrandr extension) + AC_ARG_WITH(xrandr,[ --with-xrandr compile with XRandR support]) + AC_MSG_RESULT([$with_xrandr]) +-if test "x$with_xrandr" != "xno"; then +-AC_CHECK_HEADERS(X11/extensions/Xrandr.h,CXXFLAGS="${CXXFLAGS} -DHAVE_XRANDR_H=1"; LIBS="${LIBS} -lXrandr") +-fi ++#if test "x$with_xrandr" != "xno"; then ++#AC_CHECK_HEADERS(X11/extensions/Xrandr.h,CXXFLAGS="${CXXFLAGS} -DHAVE_XRANDR_H=1"; LIBS="${LIBS} -lXrandr") ++#fi + + # Check for libPNG + AC_CHECK_LIB(png, png_read_info,,AC_MSG_ERROR("libPNG not found")) +-AC_CHECK_HEADER(png.h,,AC_MSG_ERROR("png.h not found")) ++#AC_CHECK_HEADER(png.h,,AC_MSG_ERROR("png.h not found")) + + # Check for fontconfig + AC_CHECK_LIB(fontconfig, FcInit,, AC_MSG_ERROR("fontconfig not found")) +-AC_CHECK_HEADER(fontconfig/fontconfig.h,,AC_MSG_ERROR("fontconfig.h not found")) ++#AC_CHECK_HEADER(fontconfig/fontconfig.h,,AC_MSG_ERROR("fontconfig.h not found")) + + # Check for startup notification support + AC_MSG_CHECKING(for startup notification) +diff --git xfe-clean/src/ArchInputDialog.cpp xfe-workdir/src/ArchInputDialog.cpp +index f0314bb..4b6e170 100644 +--- xfe-clean/src/ArchInputDialog.cpp ++++ xfe-workdir/src/ArchInputDialog.cpp +@@ -1,5 +1,6 @@ + // Input dialog for the add to archive command + ++#include + #include "config.h" + #include "i18n.h" + +diff --git xfe-clean/src/Bookmarks.cpp xfe-workdir/src/Bookmarks.cpp +index 241ef32..113c503 100644 +--- xfe-clean/src/Bookmarks.cpp ++++ xfe-workdir/src/Bookmarks.cpp +@@ -1,5 +1,6 @@ + // Bookmarks list. Taken from the FOX library (FXRecentFiles) and slightly modified. + ++#include + #include "config.h" + #include "i18n.h" + +diff --git xfe-clean/src/BrowseInputDialog.cpp xfe-workdir/src/BrowseInputDialog.cpp +index 4c64e68..ff0c1ad 100644 +--- xfe-clean/src/BrowseInputDialog.cpp ++++ xfe-workdir/src/BrowseInputDialog.cpp +@@ -1,5 +1,6 @@ + // Input dialog with file browse icon + ++#include + #include "config.h" + #include "i18n.h" + diff --git a/recipes/fox b/recipes/fox new file mode 100644 index 00000000000..9e5eb762a7f --- /dev/null +++ b/recipes/fox @@ -0,0 +1,27 @@ +name=fox +version=1.6.57 +revision=1 +tarball_url="http://fox-toolkit.org/ftp/fox-${version}.tar.gz" +tarball_blake2b="3efbc6188225f9444fbd347359e8b4041a08fe654acb99c48e4966e501a2f72a44863f2e9b60ae810a259951f89cfc27b9a8b6341e029627066712e0dbf20e40" +source_hostdeps="automake autoconf libtool pkg-config" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs libx11 libxft libxext freetype2 glu" + +regenerate() { + autotools_recursive_regen +} + +build() { + cp -rp "${source_dir}"/. ./ + + configure_script_path=./configure \ + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xcb-util b/recipes/xcb-util new file mode 100644 index 00000000000..690bb6b1390 --- /dev/null +++ b/recipes/xcb-util @@ -0,0 +1,26 @@ +name=xcb-util +version=0.4.1 +revision=1 +tarball_url="https://xcb.freedesktop.org/dist/xcb-util-${version}.tar.xz" +tarball_blake2b="bcde73073590c56771af6233f1a04a692197a756ef9ce70b6e0bd3625ad6d61f99f4c671dcfae39c8dd66e3225f40f7e9b42dd115ffe83a561e48a9808bf00e3" +source_hostdeps="automake autoconf libtool pkg-config" +source_deps="xorg-util-macros" +imagedeps="python" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs xorg-proto libxcb" + +regenerate() { + autotools_recursive_regen +} + +build() { + autotools_configure + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} diff --git a/recipes/xfe b/recipes/xfe new file mode 100644 index 00000000000..67bc76c6b6f --- /dev/null +++ b/recipes/xfe @@ -0,0 +1,30 @@ +name=xfe +version=1.46 +revision=1 +tarball_url="https://downloads.sourceforge.net/sourceforge/xfe/xfe-${version}.tar.xz" +tarball_blake2b="d7b85e5280d1d9d6db3737f8ac14f4248ae4e99b52d843b51468299bdf71581003b21d0fb2be9949c7189481ed5f3fe88bbd146d2185c17dea3a4785edb876b7" +source_hostdeps="autoconf automake libtool pkg-config intltool" +source_deps="xorg-util-macros gettext" +imagedeps="perl-xml-parser" +hostdeps="gcc autoconf automake libtool pkg-config intltool" +deps="core-libs fox libx11 libxft libxcb xcb-util" + +regenerate() { + autotools_recursive_regen +} + +build() { + cp -rp "${source_dir}"/. ./ + + configure_script_path=./configure \ + autotools_configure \ + --with-x + + make -j${parallelism} +} + +package() { + make DESTDIR=${dest_dir} install + + post_package_strip +} diff --git a/source-recipes/intltool b/source-recipes/intltool new file mode 100644 index 00000000000..b0682a9ac59 --- /dev/null +++ b/source-recipes/intltool @@ -0,0 +1,9 @@ +name=intltool +version=0.51.0 +tarball_url="https://launchpad.net/intltool/trunk/${version}/+download/intltool-${version}.tar.gz" +tarball_blake2b="98fe40e4d669fdf65a777152ddee0a9656412b9cf5d1e682d1b4b7bd666f3e5aa623a50481b6df47e16a935550836c66c666229b0bb7ef143f7cde6893b97a69" +hostdeps="autoconf automake libtool pkg-config" + +regenerate() { + autotools_recursive_regen +} From d614cba943908cb53ae9fc76f83d4fca0ed2f785 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 7 Apr 2024 19:25:25 +1000 Subject: [PATCH 334/368] feat(atflags): append the statx flags Signed-off-by: Anhad Singh --- src/aero_syscall/src/lib.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index cfadcc9ce1e..1c45a870178 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -746,5 +746,12 @@ bitflags::bitflags! { const EACCESS = 0x200; /// Allow empty relative pathname. const EMPTY_PATH = 0x1000; + + const STATX_FORCE_SYNC = 0x2000; + const STATX_DONT_SYNC = 0x4000; + const STATX_SYNC_TYPE = 0x6000; + + const STATX_SYNC_AS_STAT = 0x0000; + const NO_AUTOMOUNT = 0x800; } } From 126af76fbc4644c704f434af03918b79c5896130 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 10 Apr 2024 19:10:32 +1000 Subject: [PATCH 335/368] feat(ports): add findutils Signed-off-by: Anhad Singh --- recipes/findutils | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 recipes/findutils diff --git a/recipes/findutils b/recipes/findutils new file mode 100644 index 00000000000..8cc615b705d --- /dev/null +++ b/recipes/findutils @@ -0,0 +1,30 @@ +name=findutils +version=4.9.0 +revision=1 +tarball_url="https://ftp.gnu.org/gnu/findutils/findutils-${version}.tar.xz" +tarball_blake2b="3ada8903fc552ad2e580a7b631a4b9d941935b3f4231029564c6f2b7b10ba6f2244e2de57f6d79268c5e0481a193f64edbbae637e7a51ae6f495e3eefabf52c9" +source_hostdeps="automake autoconf libtool pkg-config" +imagedeps="python" +hostdeps="gcc autoconf automake libtool pkg-config" +deps="core-libs" + +regenerate() { + autotools_recursive_regen +} + +build() { + cp -rp "${source_dir}"/. ./ + + configure_script_path=./configure \ + autotools_configure \ + --without-selinux + + make -j${parallelism} +} + +package() { + DESTDIR="${dest_dir}" make install + + post_package_strip +} + From 9105725c5d17206f8d0868bae64ca91b5e6f864b Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 10 Apr 2024 20:39:28 +1000 Subject: [PATCH 336/368] feat(syscall/fs): handle non-cwd fd {open,chdir} * Handle non-AT_FDCWD file descriptors for {open,chdir} system calls. The updated signature and behaviour has also been updated in the mlibc patches. Signed-off-by: Anhad Singh --- patches/mlibc/jinx-working-patch.patch | 55 ++++++++++++++++++++++++++ src/aero_kernel/src/syscall/fs.rs | 53 ++++++++++++++----------- src/aero_kernel/src/syscall/mod.rs | 4 +- 3 files changed, 88 insertions(+), 24 deletions(-) diff --git a/patches/mlibc/jinx-working-patch.patch b/patches/mlibc/jinx-working-patch.patch index 9dfbb982b29..4461b605fb4 100644 --- a/patches/mlibc/jinx-working-patch.patch +++ b/patches/mlibc/jinx-working-patch.patch @@ -15,3 +15,58 @@ index 3474615..d06f130 100644 } char **backtrace_symbols(void *const *, int) { +diff --git mlibc-clean/sysdeps/aero/generic/aero.cpp mlibc-workdir/sysdeps/aero/generic/aero.cpp +index 80f9c6f..897986d 100644 +--- mlibc-clean/sysdeps/aero/generic/aero.cpp ++++ mlibc-workdir/sysdeps/aero/generic/aero.cpp +@@ -200,14 +200,19 @@ int sys_getcwd(char *buffer, size_t size) { + return 0; + } + +-int sys_chdir(const char *path) { +- auto result = syscall(SYS_CHDIR, path, strlen(path)); ++static int sys_chdir_impl(int fd, const char *path) { ++ auto ret = syscall(SYS_CHDIR, fd, path, strlen(path)); ++ if(int e = sc_error(ret); e) ++ return e; ++ return 0; ++} + +- if (result < 0) { +- return -result; +- } ++int sys_chdir(const char *path) { ++ return sys_chdir_impl(AT_FDCWD, path); ++} + +- return 0; ++int sys_fchdir(int fd) { ++ return sys_chdir_impl(fd, ""); + } + + int sys_gethostname(char *buffer, size_t bufsize) { +diff --git mlibc-clean/sysdeps/aero/generic/filesystem.cpp mlibc-workdir/sysdeps/aero/generic/filesystem.cpp +index 95c49b9..9416be7 100644 +--- mlibc-clean/sysdeps/aero/generic/filesystem.cpp ++++ mlibc-workdir/sysdeps/aero/generic/filesystem.cpp +@@ -69,13 +69,14 @@ int sys_seek(int fd, off_t offset, int whence, off_t *new_offset) { + } + + int sys_open(const char *filename, int flags, mode_t mode, int *fd) { +- auto result = syscall(SYS_OPEN, 0, filename, strlen(filename), flags); +- +- if (result < 0) { +- return -result; +- } ++ return sys_openat(AT_FDCWD, filename, flags, mode, fd); ++} + +- *fd = result; ++int sys_openat(int dirfd, const char *path, int flags, mode_t mode, int *fd) { ++ auto ret = syscall(SYS_OPEN, dirfd, path, strlen(path), flags, mode); ++ if (int e = sc_error(ret); e) ++ return e; ++ *fd = ret; + return 0; + } + diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index f333d3527a0..88b975793f7 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -102,22 +102,19 @@ pub fn read(fd: FileDescriptor, buffer: &mut [u8]) -> Result Result { - let dir = match fd as isize { - 0 => { - if !path.is_absolute() { - scheduler::get_scheduler().current_task().cwd_dirent() - } else { - crate::fs::root_dir().clone() - } - } - - _ => { - todo!() +pub fn open(fd: usize, path: &Path, flags: usize, _mode: usize) -> Result { + let current_thread = scheduler::current_thread(); + let at = match fd as isize { + AT_FDCWD if !path.is_absolute() => current_thread.cwd_dirent(), + _ if !path.is_absolute() => { + let ent = FileDescriptor::from_usize(fd).handle()?.inode.clone(); + assert!(ent.inode().metadata()?.is_directory()); + ent } + _ => fs::root_dir().clone(), }; - let mut flags = OpenFlags::from_bits(mode).ok_or(SyscallError::EINVAL)?; + let mut flags = OpenFlags::from_bits(flags).ok_or(SyscallError::EINVAL)?; if !flags.intersects(OpenFlags::O_RDONLY | OpenFlags::O_RDWR | OpenFlags::O_WRONLY) { flags.insert(OpenFlags::O_RDONLY); @@ -129,7 +126,7 @@ pub fn open(fd: usize, path: &Path, mode: usize) -> Result lookup_mode = LookupMode::Create; } - let inode = fs::lookup_path_with(dir, path, lookup_mode, true)?; + let inode = fs::lookup_path_with(at, path, lookup_mode, true)?; if flags.contains(OpenFlags::O_DIRECTORY) && !inode.inode().metadata()?.is_directory() { return Err(SyscallError::ENOTDIR); @@ -139,9 +136,7 @@ pub fn open(fd: usize, path: &Path, mode: usize) -> Result inode.inode().truncate(0)?; } - Ok(scheduler::current_thread() - .file_table - .open_file(inode.clone(), flags)?) + Ok(current_thread.file_table.open_file(inode.clone(), flags)?) } #[syscall] @@ -183,15 +178,29 @@ pub fn close(fd: FileDescriptor) -> Result { } #[syscall] -pub fn chdir(path: &str) -> Result { - let inode = fs::lookup_path(Path::new(path))?; +pub fn chdir(fd: usize, path: &Path) -> Result { + let current_thread = scheduler::current_thread(); + let at = match fd as isize { + AT_FDCWD if !path.is_absolute() => current_thread.cwd_dirent(), + _ if !path.is_absolute() => { + let ent = FileDescriptor::from_usize(fd).handle()?.inode.clone(); + assert!(ent.inode().metadata()?.is_directory()); + ent + } + _ => fs::root_dir().clone(), + }; - if !inode.inode().metadata()?.is_directory() { - // A component of path is not a directory. + if path.is_empty() { + current_thread.set_cwd(at); + return Ok(0); + } + + let ent = fs::lookup_path_with(at, path, LookupMode::None, true)?; + if !ent.inode().metadata()?.is_directory() { return Err(SyscallError::ENOTDIR); } - scheduler::get_scheduler().current_task().set_cwd(inode); + current_thread.set_cwd(ent); Ok(0) } diff --git a/src/aero_kernel/src/syscall/mod.rs b/src/aero_kernel/src/syscall/mod.rs index 54f7ab9c1b0..492a6da5998 100644 --- a/src/aero_kernel/src/syscall/mod.rs +++ b/src/aero_kernel/src/syscall/mod.rs @@ -207,12 +207,12 @@ pub fn generic_do_syscall( SYS_GETPGID => process::getpgid(b), SYS_READ => fs::read(b, c, d), - SYS_OPEN => fs::open(b, c, d, e), + SYS_OPEN => fs::open(b, c, d, e, f), SYS_CLOSE => fs::close(b), SYS_WRITE => fs::write(b, c, d), SYS_GETDENTS => fs::getdents(b, c, d), SYS_GETCWD => fs::getcwd(b, c), - SYS_CHDIR => fs::chdir(b, c), + SYS_CHDIR => fs::chdir(b, c, d), SYS_MKDIR_AT => fs::mkdirat(b, c, d), SYS_RMDIR => fs::rmdir(b, c), SYS_IOCTL => fs::ioctl(b, c, d), From 31c26248033ac0bb87939e47a0dec70283494533 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 10 Apr 2024 20:59:41 +1000 Subject: [PATCH 337/368] feat(syscall/fs): cleanup rmdir Signed-off-by: Anhad Singh --- src/aero_kernel/src/syscall/fs.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index 88b975793f7..c3a527961b1 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -246,9 +246,7 @@ pub fn mkdirat(dfd: usize, path: &Path) -> Result { } #[syscall] -pub fn rmdir(path: &str) -> Result { - let path = Path::new(path); - +pub fn rmdir(path: &Path) -> Result { let (_, child) = path.parent_and_basename(); let inode = fs::lookup_path(path)?; From 045e378177636ad799164ae3cd7e083fe1330d79 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 11 Apr 2024 20:58:11 +1000 Subject: [PATCH 338/368] feat(syscall/process): fix setpgid regression Signed-off-by: Anhad Singh --- src/aero_kernel/src/syscall/process.rs | 51 +++++++++++++------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index f9a41c2fd14..97996c8ced5 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -17,7 +17,6 @@ use aero_syscall::signal::{SigAction, SigProcMask}; use aero_syscall::*; -use alloc::sync::Arc; use spin::{Mutex, Once}; use crate::acpi::aml; @@ -28,7 +27,7 @@ use crate::mem::paging::VirtAddr; use crate::userland::scheduler::{self, ExitStatus}; use crate::userland::signals::SignalEntry; use crate::userland::task::sessions::SESSIONS; -use crate::userland::task::{Task, TaskId}; +use crate::userland::task::TaskId; use crate::utils::sync::IrqGuard; static HOSTNAME: Once> = Once::new(); @@ -363,31 +362,43 @@ pub fn shutdown() -> Result { unreachable!("aml: failed to shutdown (enter state S5)") } -fn find_task_by_pid(pid: usize) -> Result> { - let current_task = scheduler::get_scheduler().current_task(); +#[syscall] +pub fn getpgid(pid: usize) -> Result { + let current_task = scheduler::current_thread(); // If `pid` is 0, the process ID of the calling process is used. - if pid == 0 || pid == current_task.pid().as_usize() { - Ok(current_task) + let task = if pid == 0 || pid == current_task.pid().as_usize() { + current_task } else { scheduler::get_scheduler() .find_task(TaskId::new(pid)) - .ok_or(SyscallError::ESRCH) - } -} + .ok_or(SyscallError::ESRCH)? + }; -#[syscall] -pub fn getpgid(pid: usize) -> Result { - let task = find_task_by_pid(pid)?; let group = SESSIONS.find_group(&task).unwrap(); - Ok(group.id()) } #[syscall] pub fn setpgid(pid: usize, pgid: usize) -> Result { - let current_task = scheduler::get_scheduler().current_task(); - let task = find_task_by_pid(pid)?; + let current_task = scheduler::current_thread(); + let task = if pid == 0 || pid == current_task.pid().as_usize() { + current_task.clone() + } else { + let task = scheduler::get_scheduler() + .find_task(TaskId::new(pid)) + .ok_or(SyscallError::ESRCH)?; + + if let Some(parent) = task.get_parent() { + if parent.tid() != current_task.tid() { + return Err(SyscallError::EPERM); + } + } else { + return Err(SyscallError::EPERM); + } + + task + }; if task.is_session_leader() || !task.is_process_leader() @@ -396,16 +407,6 @@ pub fn setpgid(pid: usize, pgid: usize) -> Result { return Err(SyscallError::EPERM); } - if let Some(parent) = task.get_parent() { - if parent.tid() != current_task.tid() { - return Err(SyscallError::EPERM); - } - } else { - return Err(SyscallError::EPERM); - } - - // If `pgid` is 0, the process ID of the process specified by the `pid` argument shall - // be used. log::error!("setpgid: is a stub! (pid={pid} pgid={pgid})"); Ok(0) } From 34390320f11ea737092bc779be2f1be2b1fd47bc Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 19 Apr 2024 21:08:07 +1000 Subject: [PATCH 339/368] fix(mouse): fix panic Before the read() function panicked when a buffer with a size > size_of() was provided. This is now fixed and rather returns an error only when the buffer is too small. Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/mouse.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs index d761366881f..cd49130391c 100644 --- a/src/aero_kernel/src/drivers/mouse.rs +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -139,13 +139,16 @@ impl Device for Mouse { impl INodeInterface for Mouse { fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { let size = core::mem::size_of::(); + + if buffer.len() < size { + return Err(fs::FileSystemError::NotSupported); + } + let packet = PACKETS .lock_irq() .pop() .ok_or(fs::FileSystemError::WouldBlock)?; - assert_eq!(buffer.len(), size); - unsafe { *(buffer.as_mut_ptr().cast::()) = packet; } @@ -161,7 +164,7 @@ impl INodeInterface for Mouse { if !PACKETS.lock_irq().is_empty() { Ok(PollFlags::IN) } else { - Ok(PollFlags::OUT) + Ok(PollFlags::empty()) } } } From 7dd50be8be91eb960bba7a4f23dd2a2e640dc203 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 21 Jun 2024 17:42:25 +1000 Subject: [PATCH 340/368] misc(unwind): fix compilation on latest rust Signed-off-by: Anhad Singh --- src/aero_kernel/src/unwind.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index 7c2886a5560..5c0cb72b024 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -161,7 +161,7 @@ pub fn unwind_stack_trace() { log::trace!("{depth:>2}: 0x{rip:016x} - "); } } else { - log::trace!("{:>2}: 0x{:016x} - ", depth, rip); + log::trace!("{depth:>2}: 0x{rip:016x} - "); } } else { // RBP has been overflowed... @@ -186,7 +186,7 @@ use crate::utils::sync::IrqGuard; fn rust_begin_unwind(info: &PanicInfo) -> ! { prepare_panic(); - let message = info.message().unwrap(); + let message = info.message(); let location = info.location().unwrap(); // Get the CPU ID where this panic happened and if PANIC_HOOK_READY is false From 15ca6281f2fdd867d526b9cbb1ec0419f3dca15e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 22 Jun 2024 13:29:01 +1000 Subject: [PATCH 341/368] ports(mlibc): tag memory locations on library load Signed-off-by: Anhad Singh --- patches/fox/jinx-working-patch.patch | 18 ++++- patches/mlibc/jinx-working-patch.patch | 98 +++++++++++++++++++++++++- recipes/mlibc | 4 +- userland/tests/utest.cc | 4 +- 4 files changed, 116 insertions(+), 8 deletions(-) diff --git a/patches/fox/jinx-working-patch.patch b/patches/fox/jinx-working-patch.patch index faa04295413..a163bd5781a 100644 --- a/patches/fox/jinx-working-patch.patch +++ b/patches/fox/jinx-working-patch.patch @@ -22,4 +22,20 @@ index ce0f651..189b5e8 100644 saved_cppflags="${CXXFLAGS}" CXXFLAGS="${CXXFLAGS} -DHAVE_XFT_H=1 $XFTCFLAGS" X_BASE_LIBS="${X_BASE_LIBS} $XFTLIBS" - +diff --git fox-clean/include/FXStream.h fox-workdir/include/FXStream.h +index 41fe97a..b483556 100644 +--- fox-clean/include/FXStream.h ++++ fox-workdir/include/FXStream.h +@@ -52,9 +52,9 @@ enum FXStreamStatus { + + /// Stream seeking + enum FXWhence { +- FXFromStart=0, /// Seek from start position +- FXFromCurrent=1, /// Seek from current position +- FXFromEnd=2 /// Seek from end position ++ FXFromStart=3, /// Seek from start position (SEEK_SET) ++ FXFromCurrent=1, /// Seek from current position (SEEK_CUR) ++ FXFromEnd=2 /// Seek from end position (SEEK_END) + }; + + diff --git a/patches/mlibc/jinx-working-patch.patch b/patches/mlibc/jinx-working-patch.patch index 4461b605fb4..e2ea7a45f2a 100644 --- a/patches/mlibc/jinx-working-patch.patch +++ b/patches/mlibc/jinx-working-patch.patch @@ -1,3 +1,16 @@ +diff --git mlibc-clean/meson.build mlibc-workdir/meson.build +index 905fbb9..6da45e0 100644 +--- mlibc-clean/meson.build ++++ mlibc-workdir/meson.build +@@ -213,7 +213,7 @@ elif host_machine.system() == 'aero' + rtld_include_dirs += include_directories('sysdeps/aero/include') + libc_include_dirs += include_directories('sysdeps/aero/include') + internal_conf.set10('MLIBC_MAP_DSO_SEGMENTS', true) +- internal_conf.set10('MLIBC_MAP_FILE_WINDOWS', true) ++ internal_conf.set10('MLIBC_MAP_FILE_WINDOWS', false) + subdir('sysdeps/aero') + elif host_machine.system() == 'managarm' + # TODO: Adopt the include_directories() commands from the managarm meson.build. diff --git mlibc-clean/options/glibc/generic/execinfo.cpp mlibc-workdir/options/glibc/generic/execinfo.cpp index 3474615..d06f130 100644 --- mlibc-clean/options/glibc/generic/execinfo.cpp @@ -15,11 +28,69 @@ index 3474615..d06f130 100644 } char **backtrace_symbols(void *const *, int) { +diff --git mlibc-clean/options/rtld/generic/linker.cpp mlibc-workdir/options/rtld/generic/linker.cpp +index b5f42af..569a8c2 100644 +--- mlibc-clean/options/rtld/generic/linker.cpp ++++ mlibc-workdir/options/rtld/generic/linker.cpp +@@ -27,7 +27,7 @@ uintptr_t libraryBase = 0x41000000; + + constexpr bool verbose = false; + constexpr bool stillSlightlyVerbose = false; +-constexpr bool logBaseAddresses = false; ++constexpr bool logBaseAddresses = true; + constexpr bool logRpath = false; + constexpr bool logLdPath = false; + constexpr bool eagerBinding = true; +@@ -470,6 +470,7 @@ frg::expected ObjectRepository::_fetchFromFile(SharedObject * + __ensure(!(object->baseAddress & (hugeSize - 1))); + + highest_address = (highest_address + mlibc::page_size - 1) & ~(mlibc::page_size - 1); ++ size_t tagSize = highest_address - object->baseAddress; + + #if MLIBC_MMAP_ALLOCATE_DSO + void *mappedAddr = nullptr; +@@ -492,9 +493,12 @@ frg::expected ObjectRepository::_fetchFromFile(SharedObject * + libraryBase += (highest_address + (hugeSize - 1)) & ~(hugeSize - 1); + #endif + +- if(verbose || logBaseAddresses) ++ if(verbose || logBaseAddresses) { ++ mlibc::sys_tag_memory((void *)object->baseAddress, tagSize, object->name.data()); ++ + mlibc::infoLogger() << "rtld: Loading " << object->name + << " at " << (void *)object->baseAddress << frg::endlog; ++ } + + // Load all segments. + constexpr size_t pageSize = 0x1000; +diff --git mlibc-clean/options/rtld/include/mlibc/rtld-sysdeps.hpp mlibc-workdir/options/rtld/include/mlibc/rtld-sysdeps.hpp +index 6f42d41..3e37a1d 100644 +--- mlibc-clean/options/rtld/include/mlibc/rtld-sysdeps.hpp ++++ mlibc-workdir/options/rtld/include/mlibc/rtld-sysdeps.hpp +@@ -5,6 +5,7 @@ namespace [[gnu::visibility("hidden")]] mlibc { + + int sys_tcb_set(void *pointer); + ++[[gnu::weak]] int sys_tag_memory(void *ptr, size_t size, char *tag); + [[gnu::weak]] int sys_vm_readahead(void *pointer, size_t size); + + } // namespace mlibc diff --git mlibc-clean/sysdeps/aero/generic/aero.cpp mlibc-workdir/sysdeps/aero/generic/aero.cpp -index 80f9c6f..897986d 100644 +index 80f9c6f..85031cd 100644 --- mlibc-clean/sysdeps/aero/generic/aero.cpp +++ mlibc-workdir/sysdeps/aero/generic/aero.cpp -@@ -200,14 +200,19 @@ int sys_getcwd(char *buffer, size_t size) { +@@ -62,6 +62,10 @@ static frg::vector create_slice(char *const arg[]) { + } + + namespace mlibc { ++int sys_tag_memory(void *ptr, size_t size, char *tag) { ++ return syscall(SYS_DEBUG, ptr, size, tag, strlen(tag)); ++} ++ + int sys_uname(struct utsname *buf) { + auto result = syscall(SYS_UNAME, buf); + +@@ -200,14 +204,19 @@ int sys_getcwd(char *buffer, size_t size) { return 0; } @@ -46,7 +117,7 @@ index 80f9c6f..897986d 100644 int sys_gethostname(char *buffer, size_t bufsize) { diff --git mlibc-clean/sysdeps/aero/generic/filesystem.cpp mlibc-workdir/sysdeps/aero/generic/filesystem.cpp -index 95c49b9..9416be7 100644 +index 95c49b9..8777468 100644 --- mlibc-clean/sysdeps/aero/generic/filesystem.cpp +++ mlibc-workdir/sysdeps/aero/generic/filesystem.cpp @@ -69,13 +69,14 @@ int sys_seek(int fd, off_t offset, int whence, off_t *new_offset) { @@ -70,3 +141,24 @@ index 95c49b9..9416be7 100644 return 0; } +@@ -124,6 +125,20 @@ int sys_stat(fsfd_target fsfdt, int fd, const char *path, int flags, + return 0; + } + ++int sys_statfs(const char *path, struct statfs *buf) { ++ __ensure(!syscall(SYS_BACKTRACE)); ++ __ensure(!"statfs"); ++ memset(buf, 0, sizeof(struct statfs)); ++ return 0; ++} ++ ++int sys_fstatfs(int fd, struct statfs *buf) { ++ __ensure(!syscall(SYS_BACKTRACE)); ++ mlibc::infoLogger() << "fstatfs" << frg::endlog; ++ memset(buf, 0, sizeof(struct statfs)); ++ return 0; ++} ++ + int sys_ioctl(int fd, unsigned long request, void *arg, int *result) { + auto sys_res = syscall(SYS_IOCTL, fd, request, arg); + diff --git a/recipes/mlibc b/recipes/mlibc index 819d178384e..50648456585 100644 --- a/recipes/mlibc +++ b/recipes/mlibc @@ -1,8 +1,8 @@ name=mlibc -version=71d6b326e31b88796088690278ce31bb8e9fc994 +version=7b67d09bde0be6d53284d1583058483e1687880c revision=1 tarball_url="https://github.com/managarm/mlibc/archive/${version}.tar.gz" -tarball_blake2b="b2fc2178bf9a26191a78866272da2ff6cb2b547cb3fdd5fe28f4280d5bbf98a929e9920e5c05a25ed340af8d29d45265e148eba6d31490a7a6796adfcb2158d6" +tarball_blake2b="a18b4fe6ab839088079f5cdcf1d35831ac9f3d25408118f5ddce280d595b730d1cbf7d4869a2da24f4df4edce7d250042acfea67f20266cc7a157db2e1d7c1ed" imagedeps="meson ninja" hostdeps="gcc pkg-config libgcc-binaries" builddeps="cxxshim frigg linux-headers" diff --git a/userland/tests/utest.cc b/userland/tests/utest.cc index 2abea8f9189..156ac20c6ca 100644 --- a/userland/tests/utest.cc +++ b/userland/tests/utest.cc @@ -762,8 +762,8 @@ void abstract_test_case::register_case(abstract_test_case *tcp) { } int main() { - // Go through all tests and run them. - for(abstract_test_case *tcp : test_case_ptrs()) { + // Go through all tests and run them. + for(abstract_test_case *tcp : test_case_ptrs()) { std::cout << "tests: Running " << tcp->name() << std::endl; tcp->run(); } From 9095737dd036ebf1560acfe221aa00de2e25e44d Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 27 Jun 2024 18:23:53 +1000 Subject: [PATCH 342/368] feat(fork): only copy necessary mappings Do not copy page table entries that can be mapped correctly on-demand when a page fault occurs. Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/task.rs | 8 +- src/aero_kernel/src/fs/file_table.rs | 12 ++ src/aero_kernel/src/fs/procfs.rs | 2 +- src/aero_kernel/src/main.rs | 3 +- src/aero_kernel/src/mem/paging/mapper.rs | 220 +++++------------------ src/aero_kernel/src/syscall/process.rs | 3 +- src/aero_kernel/src/userland/task/mod.rs | 77 ++++---- src/aero_kernel/src/userland/vm.rs | 213 ++++++++++++++++------ 8 files changed, 256 insertions(+), 282 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index a903d0fcdd8..e2bdcce9205 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -313,11 +313,9 @@ impl ArchTask { }) } - pub fn fork(&self) -> Result> { + pub fn fork(&self, address_space: AddressSpace) -> Result> { assert!(self.user, "cannot fork a kernel task"); - let new_address_space = AddressSpace::this().offset_page_table().fork()?; - // Since the fork function marks all of the userspace entries in both the forked // and the parent address spaces as read only, we will flush the page table of the // current process to trigger COW. @@ -346,14 +344,14 @@ impl ArchTask { *context = Context::default(); context.rip = fork_init as u64; - context.cr3 = new_address_space.cr3().start_address().as_u64(); + context.cr3 = address_space.cr3().start_address().as_u64(); let fpu_storage = self.fpu_storage.unwrap().clone(); Ok(Self { context: unsafe { Unique::new_unchecked(context) }, context_switch_rsp: VirtAddr::new(switch_stack as u64), - address_space: new_address_space, + address_space, user: true, // The FS and GS bases are inherited from the parent process. diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index ca86a505f58..b8fb2bffeff 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -57,6 +57,18 @@ impl FileHandle { } } + #[inline] + pub fn is_writable(&self) -> bool { + self.flags() + .intersects(OpenFlags::O_WRONLY | OpenFlags::O_RDWR) + } + + #[inline] + pub fn is_readable(&self) -> bool { + self.flags() + .intersects(OpenFlags::O_RDONLY | OpenFlags::O_RDWR) + } + pub fn flags(&self) -> OpenFlags { *self.flags.read() } diff --git a/src/aero_kernel/src/fs/procfs.rs b/src/aero_kernel/src/fs/procfs.rs index 57a12bae572..6d915b3c8ac 100644 --- a/src/aero_kernel/src/fs/procfs.rs +++ b/src/aero_kernel/src/fs/procfs.rs @@ -200,7 +200,7 @@ impl INodeInterface for LockedProcINode { "start": map.start_addr.as_u64(), "end": map.end_addr.as_u64(), "flags": map.flags.bits(), - "protection": map.protection.bits(), + "protection": map.protection().bits(), })); }); diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index d89e2e40737..ef030da1a4b 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -50,7 +50,8 @@ associated_type_defaults, trait_upcasting, asm_const, - sync_unsafe_cell + sync_unsafe_cell, + // effects )] // TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? // `lang_items` => is currently used for the personality function (`rust_eh_personality`). diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index 2f3caaaba01..715ba1af0e3 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -18,9 +18,7 @@ // Some code borrowed from the x86_64 crate (MIT + Apache) and add support for 5-level paging // and some kernel specific features that cannot be directly done in the crate itself. -use core::ops::Range; - -use crate::mem::AddressSpace; +use core::ops::{Range, RangeInclusive}; use super::addr::{PhysAddr, VirtAddr}; use super::page::{AddressNotAligned, Page, PageSize, PhysFrame, Size1GiB, Size2MiB, Size4KiB}; @@ -1139,187 +1137,53 @@ impl<'a> OffsetPageTable<'a> { Ok(()) } - pub fn fork(&mut self) -> Result> { - let mut address_space = AddressSpace::new()?; // Allocate the new address space - - let offset_table = address_space.offset_page_table(); - let make_next_level = |table: &mut PageTable, - i: usize| - -> Result<(bool, &mut PageTable), MapToError> { - let entry = &mut table[i]; - let created = if !entry.flags().contains(PageTableFlags::PRESENT) { - let frame = FRAME_ALLOCATOR - .allocate_frame() - .ok_or(MapToError::FrameAllocationFailed)?; - - entry.set_frame( - frame, - PageTableFlags::PRESENT - | PageTableFlags::WRITABLE - | PageTableFlags::USER_ACCESSIBLE, - ); - - true - } else { - entry.set_flags( - PageTableFlags::PRESENT - | PageTableFlags::WRITABLE - | PageTableFlags::USER_ACCESSIBLE, - ); - - false - }; - - let page_table_ptr = { - let addr = entry.frame().unwrap().start_address().as_hhdm_virt(); - addr.as_mut_ptr::() - }; - - let page_table: &mut PageTable = unsafe { &mut *page_table_ptr }; - if created { - page_table.zero(); + pub fn copy_page_range(&mut self, src: &mut OffsetPageTable, range: RangeInclusive) { + let mut map_to = |src: &mut OffsetPageTable, addr, frame, flags| match frame { + MappedFrame::Size4KiB(frame) => { + let page = Page::::containing_address(addr); + + unsafe { + self.map_to_with_table_flags( + page, + frame, + flags, + PageTableFlags::PRESENT + | PageTableFlags::USER_ACCESSIBLE + | PageTableFlags::WRITABLE, + ) + } + .unwrap() + // operating on an inactive page table + .ignore(); + + unsafe { src.update_flags(page, flags) } + .unwrap() + // caller is required to invalidate the TLB + .ignore(); } - - Ok((created, page_table)) + _ => todo!(), }; - let last_level_fork = |entry: &mut PageTableEntry, n1: &mut PageTable, i: usize| { - let mut flags = entry.flags(); + let mut addr = *range.start(); - // Check if the mapping is shared. - // if !flags.contains(PageTableFlags::BIT_10) { - // Setup copy on write page. - flags.remove(PageTableFlags::WRITABLE); - // } + while addr != *range.end() { + match src.translate(addr) { + TranslateResult::Mapped { + frame, + offset, + flags, + } => { + assert_eq!(offset, 0, "unaligned page range"); + map_to(src, addr, frame, flags & !PageTableFlags::WRITABLE); + } - entry.set_flags(flags); - n1[i].set_frame(entry.frame().unwrap(), flags); - }; + TranslateResult::NotMapped => {} + TranslateResult::InvalidFrameAddress(addr) => { + panic!("invalid frame address {:#x}", addr); + } + } - // We loop through each of the page table entries in the page table which are user - // accessible and we remove the writeable flag from the entry if present. This will - // make the page table entry copy on the first write. Then we clone the page table entry - // and place it in the new page table. - if self.inner.level_5_paging_enabled { - self.inner.page_table.for_entries_mut( - PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE, - |i, _, table| { - let (_, n4) = make_next_level(offset_table.inner.page_table, i)?; - let mut count_4 = 0; - - table.for_entries_mut( - PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE, - |j, _, table| { - let (w3, n3) = make_next_level(n4, j)?; - let mut count_3 = 0; - - if w3 { - count_4 += 1; - } - - table.for_entries_mut( - PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE, - |k, _, table| { - let (w2, n2) = make_next_level(n3, k)?; - let mut count_2 = 0; - - if w2 { - count_3 += 1; - } - - table.for_entries_mut( - PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE, - |l, _, table| { - let (w1, n1) = make_next_level(n2, l)?; - let mut count_1 = 0; - - if w1 { - count_2 += 1; - } - - table.for_entries_mut( - PageTableFlags::PRESENT - | PageTableFlags::USER_ACCESSIBLE, - |i, entry, _| { - last_level_fork(entry, n1, i); - - count_1 += 1; - Ok(()) - }, - )?; - - n2[l].set_entry_count(count_1); - Ok(()) - }, - )?; - - n3[k].set_entry_count(count_2); - Ok(()) - }, - )?; - - n4[j].set_entry_count(count_3); - Ok(()) - }, - )?; - - offset_table.inner.page_table[i].set_entry_count(count_4); - Ok(()) - }, - )?; - } else { - self.inner.page_table.for_entries_mut( - PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE, - |i, _, table| { - let (_, n3) = make_next_level(offset_table.inner.page_table, i)?; - let mut count_3 = 0; - - table.for_entries_mut( - PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE, - |k, _, table| { - let (w2, n2) = make_next_level(n3, k)?; - let mut count_2 = 0; - - if w2 { - count_3 += 1; - } - - table.for_entries_mut( - PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE, - |l, _, table| { - let (w1, n1) = make_next_level(n2, l)?; - let mut count_1 = 0; - - if w1 { - count_2 += 1; - } - - table.for_entries_mut( - PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE, - |i, entry, _| { - last_level_fork(entry, n1, i); - - count_1 += 1; - Ok(()) - }, - )?; - - n2[l].set_entry_count(count_1); - Ok(()) - }, - )?; - - n3[k].set_entry_count(count_2); - Ok(()) - }, - )?; - - offset_table.inner.page_table[i].set_entry_count(count_3); - Ok(()) - }, - )?; + addr += Size4KiB::SIZE; } - - Ok(address_space) } } diff --git a/src/aero_kernel/src/syscall/process.rs b/src/aero_kernel/src/syscall/process.rs index 97996c8ced5..f02fecb20ad 100644 --- a/src/aero_kernel/src/syscall/process.rs +++ b/src/aero_kernel/src/syscall/process.rs @@ -181,8 +181,7 @@ pub fn mmap( .current_task() .file_table .get_handle(fd) - .ok_or(SyscallError::EBADF)? - .dirnode(), + .ok_or(SyscallError::EBADF)?, ); } diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index f14abd89d8c..cd7d1d7d706 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -321,7 +321,25 @@ impl Task { }) } - fn make_child(&self, arch_task: UnsafeCell) -> Arc { + pub fn has_pending_io(&self) -> bool { + self.pending_io.load(Ordering::SeqCst) + } + + pub fn set_pending_io(&self, yes: bool) { + self.pending_io.store(yes, Ordering::SeqCst) + } + + pub fn signals(&self) -> &Signals { + &self.signals + } + + pub fn clone_process(&self, entry: usize, stack: usize) -> Arc { + let arch_task = UnsafeCell::new( + self.arch_task_mut() + .clone_process(entry, stack) + .expect("failed to fork arch task"), + ); + let pid = TaskId::allocate(); let this = Arc::new_cyclic(|sref| Self { @@ -329,9 +347,9 @@ impl Task { zombies: Zombies::new(), arch_task, - file_table: Arc::new(self.file_table.deep_clone()), + file_table: self.process_leader().file_table.clone(), message_queue: MessageQueue::new(), - vm: Arc::new(Vm::new()), + vm: self.process_leader().vm.clone(), state: AtomicU8::new(TaskState::Runnable as _), link: Default::default(), @@ -349,13 +367,19 @@ impl Task { pending_io: AtomicBool::new(false), children: Mutex::new(Default::default()), + // sus? fixme? parent: Mutex::new(None), cwd: RwLock::new(Some(self.cwd.read().as_ref().unwrap().fork())), signals: Signals::new(), - systrace: AtomicBool::new(self.systrace()), - controlling_terminal: Mutex::new(self.controlling_terminal.lock_irq().clone()), + systrace: AtomicBool::new(self.process_leader().systrace()), + controlling_terminal: Mutex::new( + self.process_leader() + .controlling_terminal + .lock_irq() + .clone(), + ), mem_tags: Mutex::new(self.mem_tags.lock().clone()), }); @@ -363,26 +387,16 @@ impl Task { self.add_child(this.clone()); this.signals().copy_from(self.signals()); - this.vm.fork_from(self.vm()); this } - pub fn has_pending_io(&self) -> bool { - self.pending_io.load(Ordering::SeqCst) - } - - pub fn set_pending_io(&self, yes: bool) { - self.pending_io.store(yes, Ordering::SeqCst) - } - - pub fn signals(&self) -> &Signals { - &self.signals - } + pub fn fork(&self) -> Arc { + let vm = Arc::new(Vm::new()); + let address_space = vm.fork_from(self.vm()); - pub fn clone_process(&self, entry: usize, stack: usize) -> Arc { let arch_task = UnsafeCell::new( self.arch_task_mut() - .clone_process(entry, stack) + .fork(address_space) .expect("failed to fork arch task"), ); @@ -393,9 +407,9 @@ impl Task { zombies: Zombies::new(), arch_task, - file_table: self.process_leader().file_table.clone(), + file_table: Arc::new(self.file_table.deep_clone()), message_queue: MessageQueue::new(), - vm: self.process_leader().vm.clone(), + vm, state: AtomicU8::new(TaskState::Runnable as _), link: Default::default(), @@ -413,39 +427,22 @@ impl Task { pending_io: AtomicBool::new(false), children: Mutex::new(Default::default()), - // sus? fixme? parent: Mutex::new(None), cwd: RwLock::new(Some(self.cwd.read().as_ref().unwrap().fork())), signals: Signals::new(), - systrace: AtomicBool::new(self.process_leader().systrace()), - controlling_terminal: Mutex::new( - self.process_leader() - .controlling_terminal - .lock_irq() - .clone(), - ), + systrace: AtomicBool::new(self.systrace()), + controlling_terminal: Mutex::new(self.controlling_terminal.lock_irq().clone()), mem_tags: Mutex::new(self.mem_tags.lock().clone()), }); self.add_child(this.clone()); this.signals().copy_from(self.signals()); - this } - pub fn fork(&self) -> Arc { - let arch_task = UnsafeCell::new( - self.arch_task_mut() - .fork() - .expect("failed to fork arch task"), - ); - - self.make_child(arch_task) - } - fn this(&self) -> Arc { self.sref.upgrade().unwrap() } diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index cd0d21fa2fd..c74e2e981e2 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -23,12 +23,14 @@ use alloc::boxed::Box; use alloc::collections::linked_list::CursorMut; use alloc::collections::LinkedList; +use alloc::sync::Arc; use xmas_elf::header::*; use xmas_elf::program::*; use xmas_elf::*; use crate::arch::task::userland_last_address; use crate::fs::cache::{DirCacheImpl, DirCacheItem}; +use crate::fs::file_table::FileHandle; use crate::fs::{FileSystemError, Path}; use crate::mem::paging::*; use crate::mem::AddressSpace; @@ -37,6 +39,47 @@ use crate::{fs, mem}; use crate::syscall::ExecArgs; use crate::utils::sync::BMutex; +bitflags::bitflags! { + #[derive(Debug, Copy, Clone, PartialEq)] + pub struct VmFlag: u8 { + // currently active flags + const READ = MMapProt::PROT_READ.bits() as _; + const WRITE = MMapProt::PROT_WRITE.bits() as _; + const EXEC = MMapProt::PROT_EXEC.bits() as _; + + // limits + const MAY_READ = 1 << 3; + const MAY_WRITE = 1 << 4; + const MAY_EXEC = 1 << 5; + } +} + +const VM_PROT_MASK: VmFlag = + VmFlag::from_bits_retain(VmFlag::READ.bits() | VmFlag::WRITE.bits() | VmFlag::EXEC.bits()); + +impl From for VmFlag { + #[inline] + fn from(value: MMapProt) -> Self { + Self::from_bits_retain(value.bits().try_into().unwrap()) + } +} + +impl From for PageTableFlags { + fn from(flags: VmFlag) -> Self { + let mut value = PageTableFlags::empty(); + + if !flags.contains(VmFlag::EXEC) { + value.insert(PageTableFlags::NO_EXECUTE); + } + + if flags.contains(VmFlag::WRITE) { + value.insert(PageTableFlags::WRITABLE); + } + + value + } +} + const ELF_HEADER_MAGIC: [u8; 4] = [0x7f, b'E', b'L', b'F']; const ELF_PT1_SIZE: usize = core::mem::size_of::(); @@ -283,22 +326,6 @@ impl<'this> Iterator for ProgramHeaderIter<'this> { } } -impl From for PageTableFlags { - fn from(e: MMapProt) -> Self { - let mut res = PageTableFlags::empty(); - - if !e.contains(MMapProt::PROT_EXEC) { - res.insert(PageTableFlags::NO_EXECUTE); - } - - if e.contains(MMapProt::PROT_WRITE) { - res.insert(PageTableFlags::WRITABLE); - } - - res - } -} - enum UnmapResult { None, Partial(Mapping), @@ -333,8 +360,8 @@ impl MMapFile { #[derive(Debug, Clone)] pub struct Mapping { - pub protection: MMapProt, pub flags: MMapFlags, + vm_flags: VmFlag, pub start_addr: VirtAddr, pub end_addr: VirtAddr, @@ -344,6 +371,25 @@ pub struct Mapping { } impl Mapping { + pub fn set_protection(&mut self, protection: MMapProt) -> aero_syscall::Result<()> { + if (protection.contains(MMapProt::PROT_READ) && !self.vm_flags.contains(VmFlag::MAY_READ)) + || (protection.contains(MMapProt::PROT_WRITE) + && !self.vm_flags.contains(VmFlag::MAY_WRITE)) + || (protection.contains(MMapProt::PROT_EXEC) + && !self.vm_flags.contains(VmFlag::MAY_EXEC)) + { + return Err(aero_syscall::SyscallError::EACCES); + } + + self.vm_flags = (self.vm_flags & !VM_PROT_MASK) | protection.into(); + Ok(()) + } + + #[inline] + pub fn protection(&self) -> VmFlag { + self.vm_flags & VM_PROT_MASK + } + /// Handler routine for private anonymous pages. Since its an anonymous page is not /// backed by a file, we have to alloctate a frame and map it at the faulted address. fn handle_pf_private_anon( @@ -367,7 +413,7 @@ impl Mapping { // the mapping gets copied on write. PageTableFlags::USER_ACCESSIBLE | PageTableFlags::PRESENT - | self.protection.into(), + | self.vm_flags.into(), ) } .expect("Failed to identity map userspace private mapping") @@ -390,7 +436,7 @@ impl Mapping { page, PageTableFlags::USER_ACCESSIBLE | PageTableFlags::PRESENT - | self.protection.into(), + | self.vm_flags.into(), ) .unwrap() .flush(); @@ -430,9 +476,9 @@ impl Mapping { .mmap(offset as _, size as _, self.flags) .expect("handle_pf_file: file does not support mmap"); - let mut flags = PageTableFlags::PRESENT + let flags = PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE - | self.protection.into(); + | self.vm_flags.into(); // if self.flags.contains(MMapFlags::MAP_SHARED) { // flags |= PageTableFlags::BIT_10; @@ -459,7 +505,7 @@ impl Mapping { fn map_copied( offset_table: &mut OffsetPageTable, page: Page, - protection: MMapProt, + flags: VmFlag, ) -> Result<(), MapToError> { // Allocate a new frame to hold the contents. let new_frame: PhysFrame = FRAME_ALLOCATOR @@ -486,7 +532,7 @@ impl Mapping { .map_to( page, new_frame, - PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE | protection.into(), + PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE | flags.into(), )? .flush(); } @@ -517,7 +563,7 @@ impl Mapping { if let Some(vm_frame) = phys_addr.as_vm_frame() { if vm_frame.ref_count() > 1 || copy { // This page is used by more then one process, so make it a private copy. - Self::map_copied(offset_table, page, self.protection).unwrap(); + Self::map_copied(offset_table, page, self.vm_flags).unwrap(); } else { // This page is used by only one process, so make it writable. unsafe { @@ -525,7 +571,7 @@ impl Mapping { page, PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE - | self.protection.into(), + | self.vm_flags.into(), ) } .unwrap() @@ -574,12 +620,12 @@ impl Mapping { }); let new_mapping = Mapping { - protection: self.protection, flags: self.flags, start_addr: end, end_addr: end + (self.end_addr - end), file: new_file, refresh_flags: true, + vm_flags: self.vm_flags, }; self.end_addr = start; @@ -662,18 +708,18 @@ impl VmProtected { .iter_mut() .find(|e| accessed_address >= e.start_addr && accessed_address < e.end_addr) { - if map.protection.is_empty() { + if map.protection().is_empty() { return false; } if reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) - && !map.protection.contains(MMapProt::PROT_WRITE) + && !map.vm_flags.contains(VmFlag::WRITE) { return false; } if reason.contains(PageFaultErrorCode::INSTRUCTION_FETCH) - && !map.protection.contains(MMapProt::PROT_EXEC) + && !map.vm_flags.contains(VmFlag::EXEC) { return false; } @@ -697,6 +743,7 @@ impl VmProtected { } } else { log::trace!("mapping not found for address: {:#x}", accessed_address); + self.log(); // else the mapping does not exist, so return false. false @@ -774,11 +821,14 @@ impl VmProtected { &mut self, address: VirtAddr, size: usize, - protection: MMapProt, flags: MMapFlags, offset: usize, file: Option, + vm_flags: VmFlag, ) -> Option { + // TODO: Check file permissions: + // * Do not allow writing to an {read, append}-only file. + let z = file.clone(); // Offset is required to be a multiple of page size. @@ -810,6 +860,7 @@ impl VmProtected { } } + // TODO: align_up may overflow. return if size_aligned == 0 let size_aligned = align_up(size as _, Size4KiB::SIZE); let x = if address == VirtAddr::zero() { @@ -837,7 +888,7 @@ impl VmProtected { if let Some(prev) = cursor.peek_prev() { if prev.end_addr == addr && prev.flags == flags - && prev.protection == protection + && prev.protection() == (vm_flags & VM_PROT_MASK) && prev.file.is_none() { prev.end_addr = addr + size_aligned; @@ -847,7 +898,6 @@ impl VmProtected { } cursor.insert_before(Mapping { - protection, flags, start_addr: addr, @@ -855,6 +905,7 @@ impl VmProtected { file: file.map(|f| MMapFile::new(f, offset, size)), refresh_flags: true, + vm_flags, }); addr @@ -867,7 +918,7 @@ impl VmProtected { dbg!( address, size, - protection, + vm_flags, flags, offset, z.map(|f| f.absolute_path()) @@ -886,7 +937,7 @@ impl VmProtected { "{:?}..{:?} => {:?}, {:?} (offset={:#x}, size={:#x})", mmap.start_addr, mmap.end_addr, - mmap.protection, + mmap.vm_flags, mmap.flags, file.offset, file.size, @@ -896,7 +947,7 @@ impl VmProtected { "{:?}..{:?} => {:?}, {:?}", mmap.start_addr, mmap.end_addr, - mmap.protection, + mmap.vm_flags, mmap.flags, ); } @@ -979,18 +1030,18 @@ impl VmProtected { let file_offset = align_down(header.offset(), Size4KiB::SIZE); - let mut prot = MMapProt::empty(); + let mut flags = VmFlag::MAY_READ | VmFlag::MAY_WRITE | VmFlag::MAY_EXEC; if header_flags.is_read() { - prot.insert(MMapProt::PROT_READ); + flags.insert(VmFlag::READ); } if header_flags.is_write() { - prot.insert(MMapProt::PROT_WRITE); + flags.insert(VmFlag::WRITE); } if header_flags.is_execute() { - prot.insert(MMapProt::PROT_EXEC); + flags.insert(VmFlag::EXEC); } #[rustfmt::skip] @@ -1021,10 +1072,10 @@ impl VmProtected { .mmap( virtual_start, data_size as usize, - prot, MMapFlags::MAP_PRIVATE | MMapFlags::MAP_FIXED, file_offset as usize, Some(bin.clone()), + flags ) .ok_or(ElfLoadError::MemoryMapError)?; @@ -1036,10 +1087,10 @@ impl VmProtected { self.mmap( virtual_fend, bss_size as usize, - prot, MMapFlags::MAP_PRIVATE | MMapFlags::MAP_ANONYOMUS | MMapFlags::MAP_FIXED, 0, None, + flags, ) .ok_or(ElfLoadError::MemoryMapError)?; } @@ -1112,7 +1163,12 @@ impl VmProtected { success } - fn mprotect(&mut self, addr: VirtAddr, size: usize, prot: MMapProt) -> bool { + fn mprotect( + &mut self, + addr: VirtAddr, + size: usize, + prot: MMapProt, + ) -> aero_syscall::Result<()> { let start = addr.align_up(Size4KiB::SIZE); let end = (addr + size).align_up(Size4KiB::SIZE); @@ -1127,7 +1183,7 @@ impl VmProtected { // The address we want to unmap is in the middle of the region. So we // will need to split the mapping and update the end address accordingly. let (left, mut mid, right) = map.split(start, end); - mid.protection = prot; + mid.set_protection(prot)?; cursor.insert_after(right); cursor.insert_after(mid); @@ -1136,13 +1192,13 @@ impl VmProtected { break; } else if start <= map.start_addr && end >= map.end_addr { // full - map.protection = prot; + map.set_protection(prot)?; cursor.move_next(); } else if start <= map.start_addr && end < map.end_addr { // start let mut mapping = map.clone(); mapping.end_addr = end; - mapping.protection = prot; + mapping.set_protection(prot)?; map.start_addr = end; cursor.insert_before(mapping); @@ -1151,7 +1207,7 @@ impl VmProtected { // end let mut mapping = map.clone(); mapping.start_addr = start; - mapping.protection = prot; + mapping.set_protection(prot)?; map.end_addr = start; cursor.insert_after(mapping); @@ -1159,14 +1215,30 @@ impl VmProtected { } } - true + Ok(()) } - fn fork_from(&mut self, parent: &Vm) { - let data = parent.inner.lock(); + #[must_use] + fn fork_from(&mut self, parent: &Vm) -> AddressSpace { + { + let parent = parent.inner.lock(); + self.mappings.clone_from(&parent.mappings); + } + + let mut address_space = AddressSpace::new().unwrap(); + let mut offset_table = address_space.offset_page_table(); + + let mut current = AddressSpace::this(); + let mut current = current.offset_page_table(); + + for map in self.mappings.iter().filter(|map| { + // Do not copy page table entries where a page fault can map them correctly. + !map.flags.contains(MMapFlags::MAP_SHARED) && map.vm_flags.contains(VmFlag::MAY_WRITE) + }) { + offset_table.copy_page_range(&mut current, map.start_addr..=map.end_addr); + } - // Copy over all of the mappings from the parent into the child. - self.mappings.clone_from(&data.mappings); + address_space } } @@ -1189,11 +1261,38 @@ impl Vm { protection: MMapProt, flags: MMapFlags, offset: usize, - file: Option, + file: Option>, ) -> Option { + let vm_flags = + VmFlag::from(protection) | VmFlag::MAY_READ | VmFlag::MAY_WRITE | VmFlag::MAY_EXEC; + + let map_type = flags & (MMapFlags::MAP_SHARED | MMapFlags::MAP_PRIVATE); + + match (map_type, file.as_ref()) { + (MMapFlags::MAP_SHARED, Some(file)) => { + if protection.contains(MMapProt::PROT_WRITE) && !file.is_writable() { + return None; // EACCES + } + + // TODO: check for append-only files. + } + + (MMapFlags::MAP_PRIVATE, Some(file)) => { + if !file.is_readable() { + // return None; // EACCES + } + + // TODO: * check if the filsystem is noexec mounted and remove the MAY_EXEC flag. + // * error out if prot contains PROT_EXEC & filesystem is noexec. + } + + _ => {} + } + + let file = file.map(|file| file.dirnode()); self.inner .lock() - .mmap(address, size, protection, flags, offset, file) + .mmap(address, size, flags, offset, file, vm_flags) } pub fn munmap(&self, address: VirtAddr, size: usize) -> bool { @@ -1201,13 +1300,17 @@ impl Vm { } pub fn mprotect(&self, ptr: VirtAddr, size: usize, prot: MMapProt) { - assert!(self.inner.lock().mprotect(ptr, size, prot)) + self.inner.lock().mprotect(ptr, size, prot).unwrap() } - pub(super) fn fork_from(&self, parent: &Vm) { + pub(super) fn fork_from(&self, parent: &Vm) -> AddressSpace { self.inner.lock().fork_from(parent) } + pub fn log(&self) { + self.inner.lock().log() + } + /// Mapping the provided `bin` file into the VM. pub fn load_bin( &self, From beb3cc5cffeb06238c63090dd71668deb91d5725 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 30 Jun 2024 13:08:05 +1000 Subject: [PATCH 343/368] feat(vm): handle shared files properly Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/block/mod.rs | 93 ++++++++--- src/aero_kernel/src/fs/devfs.rs | 26 ++- src/aero_kernel/src/fs/ext2/mod.rs | 26 ++- src/aero_kernel/src/fs/inode.rs | 14 ++ src/aero_kernel/src/fs/ramfs.rs | 17 +- src/aero_kernel/src/mem/paging/addr.rs | 2 +- src/aero_kernel/src/userland/vm.rs | 219 ++++++++++++++++++++----- userland/Makefile | 9 +- userland/tests/f.c | 47 ++++++ 9 files changed, 387 insertions(+), 66 deletions(-) create mode 100644 userland/tests/f.c diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 7c5b3f4beb0..049e8833ef5 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -32,32 +32,46 @@ use crate::fs::{FileSystem, Result}; use crate::fs::ext2::Ext2; use crate::mem::paging::*; +use crate::mem::AddressSpace; use crate::utils::sync::Mutex; use super::cache::{Cache, CacheArc, CacheItem, Cacheable}; use super::devfs::{alloc_device_marker, Device}; use super::inode::INodeInterface; -type PageCacheKey = (usize, usize); // (block device pointer, offset) -type PageCacheItem = CacheArc>; +type PageCacheKey = (usize, usize); // (owner ptr, index) +pub type PageCacheItem = CacheArc>; -struct CachedPage { - device: Weak, +struct DirtyMapping { + addr_space: AddressSpace, + addr: VirtAddr, +} + +pub struct CachedPage { + owner: Weak, offset: usize, page: PhysFrame, dirty: AtomicBool, + dirty_mappings: Mutex>, } impl CachedPage { - fn new(device: Weak, offset: usize) -> Self { - Self { - device, + fn new(owner: Weak, offset: usize) -> Self { + let k = Self { + owner, offset, page: FRAME_ALLOCATOR .allocate_frame() .expect("page_cache: out of memory"), dirty: AtomicBool::new(false), - } + dirty_mappings: Mutex::new(Vec::new()), + }; + // TODO: temporary hack. i mean this is fine but is there a cleaner way to do this. this is + // required since when the VM for the process umaps a page that contains a cached page, it + // will unmap this page which will decrease the refcnt to 0 and deallocate it. + get_vm_frames().unwrap()[k.page.start_address().as_u64() as usize / 4096usize] + .inc_ref_count(); + k } fn data_mut(&self) -> &mut [MaybeUninit] { @@ -72,10 +86,14 @@ impl CachedPage { unsafe { core::slice::from_raw_parts_mut(data_ptr, Size4KiB::SIZE as usize) } } - fn data_addr(&self) -> PhysAddr { + pub fn data_addr(&self) -> PhysAddr { self.page.start_address() } + pub fn page(&self) -> PhysFrame { + self.page + } + fn make_key(device: &Weak, offset: usize) -> PageCacheKey { (device.as_ptr().addr(), offset) } @@ -85,12 +103,13 @@ impl CachedPage { self.dirty.load(Ordering::SeqCst) } - fn mark_dirty(&self) { + pub fn mark_dirty(&self) { + log::error!("marking dirty --------------------------------------"); self.dirty.store(true, Ordering::SeqCst); } fn device(&self) -> Arc { - self.device.upgrade().unwrap() + self.owner.upgrade().unwrap() } fn sync(&self) { @@ -98,13 +117,21 @@ impl CachedPage { return; } - // Commit the changes made to the cache to the disk. - let disk = self.device(); - + // Commit the changes made to the cache to the owner. + let owner = self.device(); let offset_bytes = self.offset * Size4KiB::SIZE as usize; - let sector = offset_bytes / disk.block_size(); + owner.write_direct(offset_bytes, self.page); + + for mut mapping in self.dirty_mappings.lock_irq().drain(..) { + let mut offset_table = mapping.addr_space.offset_page_table(); + offset_table + .unmap(Page::::containing_address(mapping.addr)) + .unwrap() + .1 + .flush(); + } - disk.write_dma(sector, self.data_addr(), Size4KiB::SIZE as usize); + self.dirty.store(false, Ordering::SeqCst); } } @@ -116,12 +143,12 @@ impl Drop for CachedPage { impl Cacheable for CachedPage { fn cache_key(&self) -> PageCacheKey { - Self::make_key(&self.device, self.offset) + Self::make_key(&self.owner, self.offset) } } lazy_static::lazy_static! { - static ref PAGE_CACHE: Arc> = Cache::new(); + pub(in crate::fs) static ref PAGE_CACHE: Arc> = Cache::new(); } impl Cache { @@ -145,16 +172,16 @@ impl Cache { let device = device.upgrade().expect("page_cache: device dropped"); let aligned_offset = align_down(offset as u64, Size4KiB::SIZE) as usize; - let sector = aligned_offset / device.block_size(); - device - .read_dma(sector, page.data_addr(), Size4KiB::SIZE as usize) + .read_direct(aligned_offset, page.page()) .expect("page_cache: failed to read block"); PAGE_CACHE.make_item_cached(page) } } +// TODO: cache hit miss stats + pub struct DirtyRef { cache: PageCacheItem, ptr: *mut T, @@ -202,9 +229,12 @@ pub trait BlockDeviceInterface: Send + Sync { fn write_block(&self, sector: usize, buf: &[u8]) -> Option; } -pub trait CachedAccess: BlockDeviceInterface { +pub trait CachedAccess: Send + Sync { fn sref(&self) -> Weak; + fn read_direct(&self, offset: usize, dest: PhysFrame) -> Option; + fn write_direct(&self, offset: usize, src: PhysFrame) -> Option; + fn read(&self, mut offset: usize, dest: &mut [MaybeUninit]) -> Option { let mut loc = 0; @@ -236,6 +266,9 @@ pub trait CachedAccess: BlockDeviceInterface { let mut loc = 0; while loc < buffer.len() { + // TODO: If it is not found in the page cache, then, when the write perfectly falls on + // page size boundaries, the page is not even read from disk, but allocated and + // immediately marked dirty. let page = PAGE_CACHE.get_page(&self.sref(), offset); let page_offset = offset % Size4KiB::SIZE as usize; @@ -318,6 +351,22 @@ impl CachedAccess for BlockDevice { fn sref(&self) -> Weak { self.sref.clone() } + + fn read_direct(&self, offset: usize, dest: PhysFrame) -> Option { + self.dev.read_dma( + offset / self.dev.block_size(), + dest.start_address(), + Size4KiB::SIZE as _, + ) + } + + fn write_direct(&self, offset: usize, src: PhysFrame) -> Option { + self.dev.write_dma( + offset / self.dev.block_size(), + src.start_address(), + Size4KiB::SIZE as _, + ) + } } impl INodeInterface for BlockDevice {} diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index d59c6dd3581..39bf4cbde6a 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -31,7 +31,7 @@ use crate::mem::paging::*; use crate::rendy::RendyInfo; use super::cache::{DirCacheItem, INodeCacheItem}; -use super::inode::{INodeInterface, PollFlags, PollTable}; +use super::inode::{INodeInterface, MMapPage, PollFlags, PollTable}; use super::ramfs::RamFs; use super::{FileSystem, FileSystemError, Result, MOUNT_MANAGER}; @@ -132,6 +132,10 @@ impl INodeInterface for DevINode { fn open(&self, handle: Arc) -> Result> { self.0.inode().open(handle) } + + fn mmap_v2(&self, offset: usize) -> Result { + self.0.inode().mmap_v2(offset) + } } /// Implementation of dev filesystem. (See the module-level documentation for more @@ -357,6 +361,26 @@ impl INodeInterface for DevFb { .expect("/dev/fb: terminal not initialized") } + fn mmap_v2(&self, offset: usize) -> Result { + let rinfo = crate::rendy::get_rendy_info(); + + // Make sure we are in bounds. + if offset > rinfo.byte_len || offset + Size4KiB::SIZE as usize > rinfo.byte_len { + return Err(FileSystemError::NotSupported); + } + + let mut lock = crate::rendy::DEBUG_RENDY.get().unwrap().lock_irq(); + let fb = lock.get_framebuffer(); + + let fb_ptr = fb.as_ptr().cast::(); + let fb_ptr = unsafe { fb_ptr.add(offset) }; + let fb_phys_ptr = unsafe { fb_ptr.sub(crate::PHYSICAL_MEMORY_OFFSET.as_u64() as usize) }; + + Ok(MMapPage::Direct(PhysFrame::containing_address(unsafe { + PhysAddr::new_unchecked(fb_phys_ptr as u64) + }))) + } + fn ioctl(&self, command: usize, arg: usize) -> Result { match command { FBIOGET_VSCREENINFO => { diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 74d70ccc821..337fa3c4acf 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -37,13 +37,13 @@ use crate::socket::SocketAddrRef; use self::group_desc::GroupDescriptors; -use super::block::{self, BlockDevice, CachedAccess}; +use super::block::{self, BlockDevice, CachedAccess, PAGE_CACHE}; use super::cache::{DirCacheItem, INodeCacheItem}; use super::path::PathBuf; use super::{cache, FileSystemError, Path}; -use super::inode::{self, INodeInterface, Metadata, PollFlags, PollTable}; +use super::inode::{self, INodeInterface, MMapPage, Metadata, PollFlags, PollTable}; use super::FileSystem; pub struct INode { @@ -358,6 +358,20 @@ impl INode { } } +impl CachedAccess for INode { + fn sref(&self) -> Weak { + self.sref.clone() + } + + fn read_direct(&self, offset: usize, dest: PhysFrame) -> Option { + INodeInterface::read_at(self, offset, dest.as_slice_mut()).ok() + } + + fn write_direct(&self, offset: usize, src: PhysFrame) -> Option { + INodeInterface::write_at(self, offset, src.as_slice_mut()).ok() + } +} + impl INodeInterface for INode { fn weak_filesystem(&self) -> Option> { Some(self.fs.clone()) @@ -587,6 +601,14 @@ impl INodeInterface for INode { Ok(private_cp) } + // TODO: cleanup + fn mmap_v2(&self, offset: usize) -> super::Result { + Ok(MMapPage::PageCache(PAGE_CACHE.get_page( + &(self.sref.clone() as Weak), + offset, + ))) + } + fn listen(&self, backlog: usize) -> Result<(), SyscallError> { if let Some(proxy) = self.proxy.as_ref() { return proxy.listen(backlog); diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 01c621c00ec..930cb3eb3d8 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -33,6 +33,7 @@ use crate::socket::{SocketAddr, SocketAddrRef}; use crate::userland::scheduler; use crate::utils::sync::{BMutex, Mutex, WaitQueue}; +use super::block::PageCacheItem; use super::cache::{Cacheable, CachedINode, DirCacheItem, INodeCacheItem}; use super::devfs::DevINode; use super::file_table::FileHandle; @@ -109,6 +110,11 @@ impl From for PollEventFlags { } } +pub enum MMapPage { + Direct(PhysFrame), + PageCache(PageCacheItem), +} + /// An inode describes a file. An inode structure holds metadata of the /// inode which includes its type, size, the number of links referring to it, /// and the list of blocks holding the file's content. For example device files, @@ -234,6 +240,14 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSupported) } + fn mmap_v2(&self, _offset: usize) -> Result { + log::error!( + "{} does not support mmap_v2!", + core::any::type_name_of_val(self), + ); + Err(FileSystemError::NotSupported) + } + // Socket operations: fn bind(&self, _address: SocketAddrRef, _length: usize) -> Result<()> { Err(FileSystemError::NotSocket) diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index 822b3531aba..54d61d777f2 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -33,7 +33,7 @@ use super::cache::{ }; use super::devfs::DevINode; use super::inode::{ - DirEntry, FileContents, FileType, INodeInterface, Metadata, PollFlags, PollTable, + DirEntry, FileContents, FileType, INodeInterface, MMapPage, Metadata, PollFlags, PollTable, }; use super::{FileSystem, FileSystemError, Result}; @@ -384,6 +384,21 @@ impl INodeInterface for LockedRamINode { } } + fn mmap_v2(&self, offset: usize) -> Result { + let this = self.0.read(); + + match &this.contents { + FileContents::Device(dev) => { + let device = dev.clone(); + drop(this); + + device.mmap_v2(offset) + } + + _ => todo!(), + } + } + fn lookup(&self, dir: DirCacheItem, name: &str) -> Result { let this = self.0.read(); let child = this diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 2d97f2592aa..11713f48cc0 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -35,7 +35,7 @@ use bit_field::BitField; /// [`TryFrom`](https://doc.rust-lang.org/std/convert/trait.TryFrom.html) trait can be used for performing conversions /// between `u64` and `usize`. -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(transparent)] pub struct VirtAddr(u64); diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index c74e2e981e2..ea6b77d0102 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -24,13 +24,16 @@ use alloc::collections::linked_list::CursorMut; use alloc::collections::LinkedList; use alloc::sync::Arc; +use hashbrown::HashMap; use xmas_elf::header::*; use xmas_elf::program::*; use xmas_elf::*; use crate::arch::task::userland_last_address; +use crate::fs::block::PageCacheItem; use crate::fs::cache::{DirCacheImpl, DirCacheItem}; use crate::fs::file_table::FileHandle; +use crate::fs::inode::MMapPage; use crate::fs::{FileSystemError, Path}; use crate::mem::paging::*; use crate::mem::AddressSpace; @@ -344,21 +347,27 @@ pub struct LoadedBinary<'header> { pub envv: Option, } -#[derive(Debug, Clone)] +#[derive(Clone)] pub struct MMapFile { offset: usize, file: DirCacheItem, size: usize, + mappings: HashMap, } impl MMapFile { #[inline] fn new(file: DirCacheItem, offset: usize, size: usize) -> Self { - Self { offset, file, size } + Self { + offset, + file, + size, + mappings: HashMap::new(), + } } } -#[derive(Debug, Clone)] +#[derive(Clone)] pub struct Mapping { pub flags: MMapFlags, vm_flags: VmFlag, @@ -454,52 +463,189 @@ impl Mapping { &mut self, offset_table: &mut OffsetPageTable, reason: PageFaultErrorCode, - address: VirtAddr, + addr: VirtAddr, ) -> bool { - if let Some(mmap_file) = self.file.as_mut() { + if let Some(file) = self.file.as_ref() { let offset = align_down( - (address - self.start_addr) + mmap_file.offset as u64, + (addr - self.start_addr) + file.offset as u64, Size4KiB::SIZE, ); - let address = address.align_down(Size4KiB::SIZE); - let size = core::cmp::min( - Size4KiB::SIZE, - mmap_file.size as u64 - (address - self.start_addr), - ); + let addr = addr.align_down(Size4KiB::SIZE); + let size = Size4KiB::SIZE.min(file.size as u64 - (addr - self.start_addr)); - if !reason.contains(PageFaultErrorCode::PROTECTION_VIOLATION) { - // We are writing to private file mapping so copy the content of the page. - let frame = mmap_file - .file - .inode() - .mmap(offset as _, size as _, self.flags) - .expect("handle_pf_file: file does not support mmap"); + return if self.flags.contains(MMapFlags::MAP_SHARED) { + self.handle_pf_shared_file(offset_table, reason, addr, offset as _, size as _) + } else { + self.handle_pf_private_file(offset_table, reason, addr, offset as _, size as _) + }; + } - let flags = PageTableFlags::PRESENT - | PageTableFlags::USER_ACCESSIBLE - | self.vm_flags.into(); + false + } - // if self.flags.contains(MMapFlags::MAP_SHARED) { - // flags |= PageTableFlags::BIT_10; - // } + fn handle_pf_private_file( + &mut self, + offset_table: &mut OffsetPageTable, + reason: PageFaultErrorCode, - unsafe { offset_table.map_to(Page::containing_address(address), frame, flags) } - .expect("failed to map allocated frame for private file read") - .flush(); + addr: VirtAddr, + offset: usize, + size: usize, + ) -> bool { + let mmap_file = self.file.as_mut().unwrap(); + let page_cache = if let MMapPage::PageCache(page_cache) = + mmap_file.file.inode().mmap_v2(offset).unwrap() + { + page_cache + } else { + todo!() + }; - true - } else if reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) { - self.handle_cow(offset_table, address, true) + if !reason.contains(PageFaultErrorCode::PROTECTION_VIOLATION) + && !reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) + { + let frame = if size == Size4KiB::SIZE as usize { + page_cache.page() } else { - log::error!(" - present page read failed"); - false + // The end needs to be zeroed out so we cannot directly map the cached page. + let page: Page = Page::containing_address(page_cache.data_addr().as_hhdm_virt()); + + let new_frame: PhysFrame = PhysFrame::containing_address( + FRAME_ALLOCATOR + .alloc_zeroed(Size4KiB::SIZE as usize) + .unwrap(), + ); + + let new_slice = new_frame.as_slice_mut::(); + new_slice[..size].copy_from_slice(unsafe { + core::slice::from_raw_parts(page.start_address().as_ptr::(), size) + }); + + new_frame + }; + + unsafe { + offset_table.map_to( + Page::containing_address(addr), + frame, + PageTableFlags::PRESENT + | PageTableFlags::USER_ACCESSIBLE + | (self.vm_flags & !VmFlag::WRITE).into(), + ) + } + .expect("failed to map allocated frame for private file read") + .flush(); + + true + } else if !reason.contains(PageFaultErrorCode::PROTECTION_VIOLATION) + && reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) + { + // We are writing to private file mapping so copy the content of the page. + let frame = mmap_file + .file + .inode() + .mmap(offset, size, self.flags) + .expect("handle_pf_file: file does not support mmap"); + + unsafe { + offset_table.map_to( + Page::containing_address(addr), + frame, + PageTableFlags::PRESENT + | PageTableFlags::USER_ACCESSIBLE + | self.vm_flags.into(), + ) + } + .expect("failed to map allocated frame for private file read") + .flush(); + + assert!(mmap_file.mappings.get(&addr).is_none()); + true + } else if reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) + && reason.contains(PageFaultErrorCode::PROTECTION_VIOLATION) + { + if self.handle_cow(offset_table, addr, true) { + self.file.as_mut().unwrap().mappings.remove(&addr); + return true; } + + false } else { + log::error!(" - present page read failed"); false } } + fn handle_pf_shared_file( + &mut self, + offset_table: &mut OffsetPageTable, + reason: PageFaultErrorCode, + + addr: VirtAddr, + offset: usize, + _size: usize, + ) -> bool { + let mmap_file = self.file.as_mut().unwrap(); + let mmap_page = mmap_file.file.inode().mmap_v2(offset).unwrap(); + + if reason.contains(PageFaultErrorCode::PROTECTION_VIOLATION) { + if reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) { + return false; + } + } else if let MMapPage::PageCache(page_cache) = &mmap_page { + mmap_file.mappings.insert(addr, page_cache.clone()); + } + + match mmap_page { + MMapPage::PageCache(page_cache) => { + if reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) { + unsafe { + offset_table.map_to( + Page::containing_address(addr), + page_cache.page(), + PageTableFlags::PRESENT + | PageTableFlags::USER_ACCESSIBLE + | self.vm_flags.into(), + ) + } + .unwrap() + .flush(); + + page_cache.mark_dirty(); + } else { + unsafe { + offset_table.map_to( + Page::containing_address(addr), + page_cache.page(), + PageTableFlags::PRESENT + | PageTableFlags::USER_ACCESSIBLE + | (self.vm_flags & !VmFlag::WRITE).into(), + ) + } + .unwrap() + .flush(); + } + } + + MMapPage::Direct(frame) => { + unsafe { + offset_table.map_to( + Page::containing_address(addr), + frame, + PageTableFlags::PRESENT + | PageTableFlags::USER_ACCESSIBLE + | self.vm_flags.into(), + ) + } + .unwrap() + .flush(); + } + } + + true + } + /// Copies the contents of the `page` page to a newly allocated frame and maps it to /// the `page` page with the provided `protection` protection flags. fn map_copied( @@ -578,13 +724,11 @@ impl Mapping { .flush(); } - true - } else { - false + return true; } - } else { - false } + + false } fn unmap( @@ -867,7 +1011,6 @@ impl VmProtected { // We need to find a free mapping above 0x7000_0000_0000. self.find_any_above(VirtAddr::new(0x7000_0000_0000), size_aligned as _) } else if flags.contains(MMapFlags::MAP_FIXED) { - // SAFETY: The provided address should be page aligned. if !address.is_aligned(Size4KiB::SIZE) { log::warn!("mmap: fixed mapping address is not page aligned"); return None; diff --git a/userland/Makefile b/userland/Makefile index efbbbf40bf8..e38cbe8ba90 100644 --- a/userland/Makefile +++ b/userland/Makefile @@ -8,10 +8,12 @@ override SYSTRACE_TARGET := $(TARGET_DIR)/systrace override TEST_DIR := tests override TEST_TARGET = $(TARGET_DIR)/utest +override F_TARGET := $(TARGET_DIR)/f + override INIT_DIR := init override INIT_TARGET := $(TARGET_DIR)/init -all: $(INIT_TARGET) $(SYSTRACE_TARGET) $(TEST_TARGET) +all: $(INIT_TARGET) $(SYSTRACE_TARGET) $(TEST_TARGET) $(F_TARGET) $(INIT_TARGET): $(INIT_DIR)/init.c mkdir -p $(TARGET_DIR) @@ -26,6 +28,10 @@ $(TEST_TARGET): $(TEST_DIR)/utest.cc mkdir -p $(TARGET_DIR) $(CXX) -o $@ $^ +$(F_TARGET): $(TEST_DIR)/f.c + mkdir -p $(TARGET_DIR) + $(CC) -o $@ $^ + clean: rm -rf $(INIT_TARGET) rm -rf $(SYSTRACE_TARGET) @@ -35,3 +41,4 @@ install: install $(INIT_TARGET) "$(DESTDIR)$(PREFIX)/bin/" install $(SYSTRACE_TARGET) "$(DESTDIR)$(PREFIX)/bin/" install $(TEST_TARGET) "$(DESTDIR)$(PREFIX)/bin/" + install $(F_TARGET) "$(DESTDIR)$(PREFIX)/bin/" diff --git a/userland/tests/f.c b/userland/tests/f.c new file mode 100644 index 00000000000..b96bfc81526 --- /dev/null +++ b/userland/tests/f.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include +#include + +#define INITIAL_MSG "Hello, world!" +#define MSG_LEN (sizeof(INITIAL_MSG) - 1) + +#define NEXT_MSG "Bye, world!" + +int main() { + int fd = open("/tmp/shared_file", O_CREAT | O_RDWR, 0644); + write(fd, INITIAL_MSG, MSG_LEN); + + char *p = mmap(NULL, MSG_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + pid_t pid = fork(); + + if (!pid) { + strncpy(p, NEXT_MSG, MSG_LEN); + return EXIT_SUCCESS; + } + + int wstatus; + waitpid(pid, &wstatus, 0); + assert(WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == EXIT_SUCCESS); + + // ensure changes presist across processes + assert(!strncmp(p, NEXT_MSG, MSG_LEN)); + munmap(p, MSG_LEN); + + // synchronize mapped region with its underlying file + // msync(p, MSG_LEN, MS_SYNC); + + // ensure changes presist in the file + char buf[MSG_LEN]; + lseek(fd, 0, SEEK_SET); + read(fd, buf, MSG_LEN); + assert(!strncmp(buf, NEXT_MSG, MSG_LEN)); + + // cleanup + close(fd); + unlink("/tmp/shared_file"); + return EXIT_SUCCESS; +} From dc8a6f0e612eac219806de5f213f0974caba3524 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Jul 2024 14:22:38 +1000 Subject: [PATCH 344/368] misc(vm): collate mmap flags into vm flags Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/task.rs | 14 +++---- src/aero_kernel/src/fs/block/mod.rs | 1 - src/aero_kernel/src/fs/procfs.rs | 3 +- src/aero_kernel/src/mem/paging/addr.rs | 13 ++++++ src/aero_kernel/src/unwind.rs | 9 ++--- src/aero_kernel/src/userland/vm.rs | 53 +++++++++++++------------ 6 files changed, 54 insertions(+), 39 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index e2bdcce9205..4160e28f582 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -80,15 +80,15 @@ pub enum AuxvType { /// Returns the first address outside the user range. /// /// ## Notes -/// * On Intel CPUs, if a SYSCALL instruction is at the highest canonical address, then -/// that syscall will enter the kernel with a non-canonical return address, and SYSRET will -/// explode dangerously. We avoid this particular problem by preventing anything from -/// being mapped at the maximum canonical address. +/// * On Intel CPUs, if a SYSCALL instruction is at the highest canonical address, then that syscall +/// will enter the kernel with a non-canonical return address, and SYSRET will explode +/// dangerously. We avoid this particular problem by preventing anything from being mapped at the +/// maximum canonical address. /// /// * On AMD CPUs in the Ryzen family, there's a nasty bug in which the CPUs malfunction if they -/// execute code from the highest canonical page. They'll speculate right off the end of the -/// canonical space and bad things happen. This is worked around in the same way as the Intel -/// problem. +/// execute code from the highest canonical page. They'll speculate right off the end of the +/// canonical space and bad things happen. This is worked around in the same way as the Intel +/// problem. pub fn userland_last_address() -> VirtAddr { // Reference: https://elixir.bootlin.com/linux/latest/source/arch/x86/include/asm/page_64.h#L61 static CACHED: spin::Once = spin::Once::new(); diff --git a/src/aero_kernel/src/fs/block/mod.rs b/src/aero_kernel/src/fs/block/mod.rs index 049e8833ef5..de037d41a1e 100644 --- a/src/aero_kernel/src/fs/block/mod.rs +++ b/src/aero_kernel/src/fs/block/mod.rs @@ -104,7 +104,6 @@ impl CachedPage { } pub fn mark_dirty(&self) { - log::error!("marking dirty --------------------------------------"); self.dirty.store(true, Ordering::SeqCst); } diff --git a/src/aero_kernel/src/fs/procfs.rs b/src/aero_kernel/src/fs/procfs.rs index 6d915b3c8ac..e20cce54aa4 100644 --- a/src/aero_kernel/src/fs/procfs.rs +++ b/src/aero_kernel/src/fs/procfs.rs @@ -199,7 +199,8 @@ impl INodeInterface for LockedProcINode { maps.push(serde_json::json!({ "start": map.start_addr.as_u64(), "end": map.end_addr.as_u64(), - "flags": map.flags.bits(), + // "flags": map.flags.bits(), + // do we need to tell if is shared? "protection": map.protection().bits(), })); }); diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 11713f48cc0..5b46141cd80 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -113,6 +113,19 @@ impl VirtAddr { self.0 == 0 } + pub fn is_canonical(self) -> bool { + let virtual_mask_shift = if super::level_5_paging_enabled() { + 56 + } else { + 47 + }; + + let shift = 64 - (virtual_mask_shift + 1); + + // By doing the right shift as a signed operation will sign extend the value. + ((self.as_u64() << shift) as i64 >> shift) as u64 == self.as_u64() + } + /// Validate reads `sizeof(T)` bytes from the virtual address and returns a mutable /// reference to the value (`&mut T`). /// diff --git a/src/aero_kernel/src/unwind.rs b/src/aero_kernel/src/unwind.rs index 5c0cb72b024..a6e7a4e7d7d 100644 --- a/src/aero_kernel/src/unwind.rs +++ b/src/aero_kernel/src/unwind.rs @@ -112,15 +112,14 @@ pub fn unwind_stack_trace() { for depth in 0../*64*/16 { if let Some(rip_rbp) = rbp.checked_add(core::mem::size_of::()) { - if offset_table - .translate_addr(VirtAddr::new(rip_rbp as u64)) - .is_none() - { + let rip_rbp = VirtAddr::new(rip_rbp as u64); + + if offset_table.translate_addr(rip_rbp).is_none() || !rip_rbp.is_canonical() { log::trace!("{:>2}: ", depth); break; } - let rip = unsafe { *(rip_rbp as *const usize) }; + let rip = unsafe { *(rip_rbp.as_ptr::()) }; if rip == 0 { break; diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index ea6b77d0102..f109040fc9a 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -54,6 +54,8 @@ bitflags::bitflags! { const MAY_READ = 1 << 3; const MAY_WRITE = 1 << 4; const MAY_EXEC = 1 << 5; + + const SHARED = 1 << 6; } } @@ -369,7 +371,6 @@ impl MMapFile { #[derive(Clone)] pub struct Mapping { - pub flags: MMapFlags, vm_flags: VmFlag, pub start_addr: VirtAddr, @@ -474,7 +475,7 @@ impl Mapping { let addr = addr.align_down(Size4KiB::SIZE); let size = Size4KiB::SIZE.min(file.size as u64 - (addr - self.start_addr)); - return if self.flags.contains(MMapFlags::MAP_SHARED) { + return if self.vm_flags.contains(VmFlag::SHARED) { self.handle_pf_shared_file(offset_table, reason, addr, offset as _, size as _) } else { self.handle_pf_private_file(offset_table, reason, addr, offset as _, size as _) @@ -545,7 +546,7 @@ impl Mapping { let frame = mmap_file .file .inode() - .mmap(offset, size, self.flags) + .mmap(offset, size, MMapFlags::empty()) .expect("handle_pf_file: file does not support mmap"); unsafe { @@ -764,7 +765,6 @@ impl Mapping { }); let new_mapping = Mapping { - flags: self.flags, start_addr: end, end_addr: end + (self.end_addr - end), file: new_file, @@ -868,13 +868,10 @@ impl VmProtected { return false; } - let is_private = map.flags.contains(MMapFlags::MAP_PRIVATE); - let is_annon = map.flags.contains(MMapFlags::MAP_ANONYOMUS); - let mut address_space = AddressSpace::this(); let mut offset_table = address_space.offset_page_table(); - match (is_private, is_annon) { + match (!map.vm_flags.contains(VmFlag::SHARED), map.file.is_none()) { (true, true) => { map.handle_pf_private_anon(&mut offset_table, reason, accessed_address) } @@ -970,9 +967,6 @@ impl VmProtected { file: Option, vm_flags: VmFlag, ) -> Option { - // TODO: Check file permissions: - // * Do not allow writing to an {read, append}-only file. - let z = file.clone(); // Offset is required to be a multiple of page size. @@ -1030,19 +1024,16 @@ impl VmProtected { // Merge same mappings instead of creating a new one. if let Some(prev) = cursor.peek_prev() { if prev.end_addr == addr - && prev.flags == flags - && prev.protection() == (vm_flags & VM_PROT_MASK) + && prev.vm_flags == vm_flags && prev.file.is_none() + && file.is_none() { prev.end_addr = addr + size_aligned; - return addr; } } cursor.insert_before(Mapping { - flags, - start_addr: addr, end_addr: addr + size_aligned, @@ -1077,21 +1068,19 @@ impl VmProtected { for mmap in &self.mappings { if let Some(file) = mmap.file.as_ref() { log::debug!( - "{:?}..{:?} => {:?}, {:?} (offset={:#x}, size={:#x})", + "{:?}..{:?} => {:?} (offset={:#x}, size={:#x})", mmap.start_addr, mmap.end_addr, mmap.vm_flags, - mmap.flags, file.offset, file.size, ); } else { log::debug!( - "{:?}..{:?} => {:?}, {:?}", + "{:?}..{:?} => {:?}", mmap.start_addr, mmap.end_addr, mmap.vm_flags, - mmap.flags, ); } } @@ -1376,7 +1365,7 @@ impl VmProtected { for map in self.mappings.iter().filter(|map| { // Do not copy page table entries where a page fault can map them correctly. - !map.flags.contains(MMapFlags::MAP_SHARED) && map.vm_flags.contains(VmFlag::MAY_WRITE) + !map.vm_flags.contains(VmFlag::SHARED) && map.vm_flags.contains(VmFlag::MAY_WRITE) }) { offset_table.copy_page_range(&mut current, map.start_addr..=map.end_addr); } @@ -1406,18 +1395,31 @@ impl Vm { offset: usize, file: Option>, ) -> Option { - let vm_flags = + let mut vm_flags = VmFlag::from(protection) | VmFlag::MAY_READ | VmFlag::MAY_WRITE | VmFlag::MAY_EXEC; let map_type = flags & (MMapFlags::MAP_SHARED | MMapFlags::MAP_PRIVATE); match (map_type, file.as_ref()) { (MMapFlags::MAP_SHARED, Some(file)) => { - if protection.contains(MMapProt::PROT_WRITE) && !file.is_writable() { - return None; // EACCES + vm_flags.insert(VmFlag::SHARED); + + if !file.is_writable() { + if protection.contains(MMapProt::PROT_WRITE) { + return None; // EACCES + } + + // The mapping is going to be read-only forever so, it can be converted into a + // private mapping. + vm_flags.remove(VmFlag::MAY_WRITE | VmFlag::SHARED); } - // TODO: check for append-only files. + if !file.is_readable() { + // return None; // EACCES + } + + // TODO: * check if the filsystem is noexec mounted and remove the MAY_EXEC flag. + // * error out if prot contains PROT_EXEC & filesystem is noexec. } (MMapFlags::MAP_PRIVATE, Some(file)) => { @@ -1429,6 +1431,7 @@ impl Vm { // * error out if prot contains PROT_EXEC & filesystem is noexec. } + (MMapFlags::MAP_SHARED, None) => vm_flags.insert(VmFlag::SHARED), _ => {} } From c806cd2e88c81b028480476a70d110db7b8dc6f8 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Jul 2024 14:25:25 +1000 Subject: [PATCH 345/368] misc(main): panic_info_message has been stabilized Signed-off-by: Anhad Singh --- src/aero_kernel/src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index ef030da1a4b..8395b1186f2 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -29,7 +29,6 @@ custom_test_frameworks, // https://github.com/rust-lang/rust/issues/50297 alloc_error_handler, // https://github.com/rust-lang/rust/issues/51540 lang_items, // No tracking issue - panic_info_message, // https://github.com/rust-lang/rust/issues/66745 decl_macro, // https://github.com/rust-lang/rust/issues/39412 ptr_internals, // No tracking issue linked_list_cursors, // https://github.com/rust-lang/rust/issues/58533 From 773565fa5072cff67a710326b8e304ec0e30a87b Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Jul 2024 14:29:28 +1000 Subject: [PATCH 346/368] misc(docs): cleanup Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/apic.rs | 8 ++++---- src/aero_kernel/src/arch/x86_64/controlregs.rs | 10 ++++------ src/aero_kernel/src/cmdline.rs | 3 +-- src/aero_kernel/src/rendy.rs | 2 +- src/aero_kernel/src/userland/signals.rs | 9 +++------ 5 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/apic.rs b/src/aero_kernel/src/arch/x86_64/apic.rs index 5330a9930b1..eca596b90c7 100644 --- a/src/aero_kernel/src/arch/x86_64/apic.rs +++ b/src/aero_kernel/src/arch/x86_64/apic.rs @@ -288,11 +288,11 @@ impl LocalApic { /// This function works for both XAPIC and X2APIC. /// /// ## Safety - /// * The provided `register` must be a valid APIC register and the `value` must - /// be a valid value for the provided APIC register. + /// * The provided `register` must be a valid APIC register and the `value` must be a valid + /// value for the provided APIC register. /// - /// * If the `register` is 64-bit wide, then the [`Self::write_long`] function must - /// be used instead. + /// * If the `register` is 64-bit wide, then the [`Self::write_long`] function must be used + /// instead. unsafe fn write(&mut self, register: u32, value: u32) { match self.apic_type { ApicType::X2apic => { diff --git a/src/aero_kernel/src/arch/x86_64/controlregs.rs b/src/aero_kernel/src/arch/x86_64/controlregs.rs index 601a192bae5..204a7fc9861 100644 --- a/src/aero_kernel/src/arch/x86_64/controlregs.rs +++ b/src/aero_kernel/src/arch/x86_64/controlregs.rs @@ -335,9 +335,8 @@ pub unsafe fn write_xcr0(value: XCr0Flags) { /// Write the given set of CR4 flags. /// /// ## Safety -/// - This function does not preserve the current value of the CR4 flags and -/// reserved fields. -/// - Its possible to violate memory safety by swapping CR4 flags. +/// * This function does not preserve the current value of the CR4 flags and reserved fields. +/// * Its possible to violate memory safety by swapping CR4 flags. pub unsafe fn write_cr4(value: Cr4Flags) { asm!("mov cr4, {}", in(reg) value.bits(), options(nostack, preserves_flags)); } @@ -345,9 +344,8 @@ pub unsafe fn write_cr4(value: Cr4Flags) { /// Write the given set of CR0 flags. /// /// ## Safety -/// - This function does not preserve the current value of the CR0 flags and -/// reserved fields. -/// - Its possible to violate memory safety by swapping CR0 flags. +/// * This function does not preserve the current value of the CR0 flags and reserved fields. +/// * Its possible to violate memory safety by swapping CR0 flags. pub unsafe fn write_cr0(value: Cr0Flags) { asm!("mov cr0, {}", in(reg) value.bits(), options(nostack, preserves_flags)); } diff --git a/src/aero_kernel/src/cmdline.rs b/src/aero_kernel/src/cmdline.rs index cbcc33ef639..0cd47c1fe8e 100644 --- a/src/aero_kernel/src/cmdline.rs +++ b/src/aero_kernel/src/cmdline.rs @@ -126,8 +126,7 @@ pub fn parse(cmdline: &'static str, modules: &[&File]) -> CommandLine { /// Returns the raw kernel command line string. /// /// ## Panics -/// * If this function was invoked before the kernel command line was -/// parsed using [`self::parse`]. +/// * If this function was invoked before the kernel command line was parsed using [`self::parse`]. pub fn get_raw_cmdline() -> &'static str { RAW_CMDLINE_STR .get() diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 9181e71417c..4555cfa9122 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -17,10 +17,10 @@ use core::fmt::Write; +use core::fmt; use core::ops::{Index, IndexMut}; use core::ptr::NonNull; use core::time::Duration; -use core::{fmt, u8}; use alloc::boxed::Box; diff --git a/src/aero_kernel/src/userland/signals.rs b/src/aero_kernel/src/userland/signals.rs index 5d3b2621e67..52e030b7915 100644 --- a/src/aero_kernel/src/userland/signals.rs +++ b/src/aero_kernel/src/userland/signals.rs @@ -395,12 +395,9 @@ impl Signals { /// Used to update or read the signal mask of a task. /// /// ## Notes - /// * If `old_set` is not `None`, the previous value of the signal mask is - /// stored in oldset. - /// - /// * If `set` is `None`, then the signal mask is unchanged (i.e., `how` is - /// ignored), but the current value of the signal mask is returned in `old_set` - /// (if it is not `None`). + /// * If `old_set` is not `None`, the previous value of the signal mask is stored in oldset. + /// * If `set` is `None`, then the signal mask is unchanged (i.e., `how` is ignored), but the + /// current value of the signal mask is returned in `old_set` (if it is not `None`). pub fn set_mask(&self, how: SigProcMask, set: Option, old_set: Option<&mut u64>) { if let Some(old) = old_set { *old = self.blocked_mask.load(Ordering::SeqCst); From 08f1190df7ce841124febfc61f8dbd673b775ddc Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Jul 2024 14:29:51 +1000 Subject: [PATCH 347/368] misc(vm): `vm_flags` -> `flags` Signed-off-by: Anhad Singh --- src/aero_kernel/src/userland/vm.rs | 55 ++++++++++++++---------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index f109040fc9a..fe7ab496486 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -371,7 +371,7 @@ impl MMapFile { #[derive(Clone)] pub struct Mapping { - vm_flags: VmFlag, + flags: VmFlag, pub start_addr: VirtAddr, pub end_addr: VirtAddr, @@ -382,22 +382,21 @@ pub struct Mapping { impl Mapping { pub fn set_protection(&mut self, protection: MMapProt) -> aero_syscall::Result<()> { - if (protection.contains(MMapProt::PROT_READ) && !self.vm_flags.contains(VmFlag::MAY_READ)) + if (protection.contains(MMapProt::PROT_READ) && !self.flags.contains(VmFlag::MAY_READ)) || (protection.contains(MMapProt::PROT_WRITE) - && !self.vm_flags.contains(VmFlag::MAY_WRITE)) - || (protection.contains(MMapProt::PROT_EXEC) - && !self.vm_flags.contains(VmFlag::MAY_EXEC)) + && !self.flags.contains(VmFlag::MAY_WRITE)) + || (protection.contains(MMapProt::PROT_EXEC) && !self.flags.contains(VmFlag::MAY_EXEC)) { return Err(aero_syscall::SyscallError::EACCES); } - self.vm_flags = (self.vm_flags & !VM_PROT_MASK) | protection.into(); + self.flags = (self.flags & !VM_PROT_MASK) | protection.into(); Ok(()) } #[inline] pub fn protection(&self) -> VmFlag { - self.vm_flags & VM_PROT_MASK + self.flags & VM_PROT_MASK } /// Handler routine for private anonymous pages. Since its an anonymous page is not @@ -421,9 +420,7 @@ impl Mapping { // NOTE: We dont need to remove the writeable flag from this mapping, since // the writeable flag will be removed from the parent and child on fork so, // the mapping gets copied on write. - PageTableFlags::USER_ACCESSIBLE - | PageTableFlags::PRESENT - | self.vm_flags.into(), + PageTableFlags::USER_ACCESSIBLE | PageTableFlags::PRESENT | self.flags.into(), ) } .expect("Failed to identity map userspace private mapping") @@ -446,7 +443,7 @@ impl Mapping { page, PageTableFlags::USER_ACCESSIBLE | PageTableFlags::PRESENT - | self.vm_flags.into(), + | self.flags.into(), ) .unwrap() .flush(); @@ -475,7 +472,7 @@ impl Mapping { let addr = addr.align_down(Size4KiB::SIZE); let size = Size4KiB::SIZE.min(file.size as u64 - (addr - self.start_addr)); - return if self.vm_flags.contains(VmFlag::SHARED) { + return if self.flags.contains(VmFlag::SHARED) { self.handle_pf_shared_file(offset_table, reason, addr, offset as _, size as _) } else { self.handle_pf_private_file(offset_table, reason, addr, offset as _, size as _) @@ -532,7 +529,7 @@ impl Mapping { frame, PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE - | (self.vm_flags & !VmFlag::WRITE).into(), + | (self.flags & !VmFlag::WRITE).into(), ) } .expect("failed to map allocated frame for private file read") @@ -553,9 +550,7 @@ impl Mapping { offset_table.map_to( Page::containing_address(addr), frame, - PageTableFlags::PRESENT - | PageTableFlags::USER_ACCESSIBLE - | self.vm_flags.into(), + PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE | self.flags.into(), ) } .expect("failed to map allocated frame for private file read") @@ -607,7 +602,7 @@ impl Mapping { page_cache.page(), PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE - | self.vm_flags.into(), + | self.flags.into(), ) } .unwrap() @@ -621,7 +616,7 @@ impl Mapping { page_cache.page(), PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE - | (self.vm_flags & !VmFlag::WRITE).into(), + | (self.flags & !VmFlag::WRITE).into(), ) } .unwrap() @@ -636,7 +631,7 @@ impl Mapping { frame, PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE - | self.vm_flags.into(), + | self.flags.into(), ) } .unwrap() @@ -710,7 +705,7 @@ impl Mapping { if let Some(vm_frame) = phys_addr.as_vm_frame() { if vm_frame.ref_count() > 1 || copy { // This page is used by more then one process, so make it a private copy. - Self::map_copied(offset_table, page, self.vm_flags).unwrap(); + Self::map_copied(offset_table, page, self.flags).unwrap(); } else { // This page is used by only one process, so make it writable. unsafe { @@ -718,7 +713,7 @@ impl Mapping { page, PageTableFlags::PRESENT | PageTableFlags::USER_ACCESSIBLE - | self.vm_flags.into(), + | self.flags.into(), ) } .unwrap() @@ -769,7 +764,7 @@ impl Mapping { end_addr: end + (self.end_addr - end), file: new_file, refresh_flags: true, - vm_flags: self.vm_flags, + flags: self.flags, }; self.end_addr = start; @@ -857,13 +852,13 @@ impl VmProtected { } if reason.contains(PageFaultErrorCode::CAUSED_BY_WRITE) - && !map.vm_flags.contains(VmFlag::WRITE) + && !map.flags.contains(VmFlag::WRITE) { return false; } if reason.contains(PageFaultErrorCode::INSTRUCTION_FETCH) - && !map.vm_flags.contains(VmFlag::EXEC) + && !map.flags.contains(VmFlag::EXEC) { return false; } @@ -871,7 +866,7 @@ impl VmProtected { let mut address_space = AddressSpace::this(); let mut offset_table = address_space.offset_page_table(); - match (!map.vm_flags.contains(VmFlag::SHARED), map.file.is_none()) { + match (!map.flags.contains(VmFlag::SHARED), map.file.is_none()) { (true, true) => { map.handle_pf_private_anon(&mut offset_table, reason, accessed_address) } @@ -1024,7 +1019,7 @@ impl VmProtected { // Merge same mappings instead of creating a new one. if let Some(prev) = cursor.peek_prev() { if prev.end_addr == addr - && prev.vm_flags == vm_flags + && prev.flags == vm_flags && prev.file.is_none() && file.is_none() { @@ -1039,7 +1034,7 @@ impl VmProtected { file: file.map(|f| MMapFile::new(f, offset, size)), refresh_flags: true, - vm_flags, + flags: vm_flags, }); addr @@ -1071,7 +1066,7 @@ impl VmProtected { "{:?}..{:?} => {:?} (offset={:#x}, size={:#x})", mmap.start_addr, mmap.end_addr, - mmap.vm_flags, + mmap.flags, file.offset, file.size, ); @@ -1080,7 +1075,7 @@ impl VmProtected { "{:?}..{:?} => {:?}", mmap.start_addr, mmap.end_addr, - mmap.vm_flags, + mmap.flags, ); } } @@ -1365,7 +1360,7 @@ impl VmProtected { for map in self.mappings.iter().filter(|map| { // Do not copy page table entries where a page fault can map them correctly. - !map.vm_flags.contains(VmFlag::SHARED) && map.vm_flags.contains(VmFlag::MAY_WRITE) + !map.flags.contains(VmFlag::SHARED) && map.flags.contains(VmFlag::MAY_WRITE) }) { offset_table.copy_page_range(&mut current, map.start_addr..=map.end_addr); } From a35528bb2b76ae68508deef4b4c72b2e3cb54716 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Jul 2024 14:49:56 +1000 Subject: [PATCH 348/368] feat(mmap): ensure the file is readable Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/file_table.rs | 6 ++++-- src/aero_kernel/src/userland/vm.rs | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index b8fb2bffeff..fe76cf14e38 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -65,8 +65,10 @@ impl FileHandle { #[inline] pub fn is_readable(&self) -> bool { - self.flags() - .intersects(OpenFlags::O_RDONLY | OpenFlags::O_RDWR) + // FIXME: switch to Linux ABI for fcntl. mlibc defines O_RDONLY as 0 so, we have to infer + // the read-only flag. + let flags = self.flags(); + flags.contains(OpenFlags::O_RDWR) || !flags.contains(OpenFlags::O_WRONLY) } pub fn flags(&self) -> OpenFlags { diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index fe7ab496486..92ebb78032a 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -1410,7 +1410,7 @@ impl Vm { } if !file.is_readable() { - // return None; // EACCES + return None; // EACCES } // TODO: * check if the filsystem is noexec mounted and remove the MAY_EXEC flag. @@ -1419,7 +1419,7 @@ impl Vm { (MMapFlags::MAP_PRIVATE, Some(file)) => { if !file.is_readable() { - // return None; // EACCES + return None; // EACCES } // TODO: * check if the filsystem is noexec mounted and remove the MAY_EXEC flag. From beca7e7d7d6dba32d0fa8592c206f6ad753b551c Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 3 Jul 2024 17:05:07 +1000 Subject: [PATCH 349/368] fix(vm): fix unmap silently not fully unmapping Bug description: offset.unmap_range() bailed out if unmap() internally returned an error. The original intention was that the caller may choose to ignore the page not mapped errors as of demand paging. This obviously due to bad API design decision bailed out early instead of unmapping the rest of the address range aswell. Causing all sorts of bugs. Now its fixed, yay! (xfe also works now) Signed-off-by: Anhad Singh --- src/aero_kernel/src/mem/paging/mapper.rs | 9 --------- src/aero_kernel/src/userland/vm.rs | 20 +++++++++++--------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/aero_kernel/src/mem/paging/mapper.rs b/src/aero_kernel/src/mem/paging/mapper.rs index 715ba1af0e3..2c218a5e5d3 100644 --- a/src/aero_kernel/src/mem/paging/mapper.rs +++ b/src/aero_kernel/src/mem/paging/mapper.rs @@ -1128,15 +1128,6 @@ impl<'a> Translate for OffsetPageTable<'a> { } impl<'a> OffsetPageTable<'a> { - pub fn unmap_range(&mut self, range: Range, step: u64) -> Result<(), UnmapError> { - for addr in range.step_by(step as usize) { - let page: Page = Page::containing_address(addr); - self.inner.unmap(page)?.1.flush(); - } - - Ok(()) - } - pub fn copy_page_range(&mut self, src: &mut OffsetPageTable, range: RangeInclusive) { let mut map_to = |src: &mut OffsetPageTable, addr, frame, flags| match frame { MappedFrame::Size4KiB(frame) => { diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 92ebb78032a..8251431e557 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -16,6 +16,7 @@ // along with Aero. If not, see . use core::fmt::Write; +use core::ops::Range; use aero_syscall::{MMapFlags, MMapProt}; @@ -733,16 +734,17 @@ impl Mapping { start: VirtAddr, end: VirtAddr, ) -> Result { - let mut unmap_range_inner = |range| -> Result<(), UnmapError> { - match offset_table.unmap_range(range, Size4KiB::SIZE) { - Ok(_) => Ok(()), - - // its fine since technically we are not actually allocating the range - // and they are just allocated on faults. So there might be a chance where we - // try to unmap a region that is mapped but not actually allocated. - Err(UnmapError::PageNotMapped) => Ok(()), - Err(err) => Err(err), + let mut unmap_range_inner = |range: Range| -> Result<(), UnmapError> { + for addr in range.step_by(Size4KiB::SIZE as usize) { + let page: Page = Page::containing_address(addr); + match offset_table.unmap(page) { + Ok((_, flusher)) => flusher.flush(), + Err(UnmapError::PageNotMapped) => {} + Err(e) => return Err(e), + } } + + Ok(()) }; if end <= self.start_addr || start >= self.end_addr { From 6874ab39af93b39abe47f15768136d176cd0bb2a Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 4 Jul 2024 13:31:56 +1000 Subject: [PATCH 350/368] feat(kdbg): for serial debugging Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/uart_16550.rs | 72 +++++++++++++++++++---- src/aero_kernel/src/main.rs | 61 ++++++++++++++++++- 2 files changed, 118 insertions(+), 15 deletions(-) diff --git a/src/aero_kernel/src/drivers/uart_16550.rs b/src/aero_kernel/src/drivers/uart_16550.rs index 328adaa134b..b646c2d8635 100644 --- a/src/aero_kernel/src/drivers/uart_16550.rs +++ b/src/aero_kernel/src/drivers/uart_16550.rs @@ -20,10 +20,15 @@ use core::fmt::Write; use spin::Once; +use crate::arch::interrupts::{self, InterruptStack}; use crate::arch::io; +use crate::userland::task::Task; use crate::utils::sync::Mutex; -static COM_1: Once> = Once::new(); +use alloc::sync::Arc; +use alloc::vec::Vec; + +pub static COM_1: Once> = Once::new(); bitflags::bitflags! { pub struct InterruptEnable: u8 { @@ -95,25 +100,35 @@ impl SerialPort { } pub fn send_byte(&mut self, byte: u8) { - unsafe { - match byte { - 8 | 0x7F => { - self.wait_for_line_status(LineStatus::OUTPUT_EMPTY); + match byte { + 8 | 0x7F => { + self.wait_for_line_status(LineStatus::OUTPUT_EMPTY); + unsafe { io::outb(self.0, 8); + } - self.wait_for_line_status(LineStatus::OUTPUT_EMPTY); + self.wait_for_line_status(LineStatus::OUTPUT_EMPTY); + unsafe { io::outb(self.0, b' '); + } - self.wait_for_line_status(LineStatus::OUTPUT_EMPTY); + self.wait_for_line_status(LineStatus::OUTPUT_EMPTY); + unsafe { io::outb(self.0, 8); } - _ => { - self.wait_for_line_status(LineStatus::OUTPUT_EMPTY); - io::outb(self.0, byte) + } + _ => { + self.wait_for_line_status(LineStatus::OUTPUT_EMPTY); + unsafe { + io::outb(self.0, byte); } } } } + + pub fn read_byte(&mut self) -> u8 { + unsafe { io::inb(self.0) } + } } impl fmt::Write for SerialPort { @@ -126,15 +141,44 @@ impl fmt::Write for SerialPort { } } +fn irq_handler(_stack: &mut InterruptStack) { + if !unsafe { COM_1.get_unchecked() } + .lock_irq() + .line_status() + .contains(LineStatus::INPUT_FULL) + { + return; + } + + (*LISTENERS) + .lock_irq() + .iter() + .for_each(|task| task.wake_up()); +} + +lazy_static::lazy_static! { + static ref LISTENERS: Mutex>> = Mutex::new(Vec::new()); +} + +pub fn register_listener(task: Arc) { + (*LISTENERS).lock_irq().push(task); +} + /// Initialize the serial ports if available. pub fn init() { unsafe { - let com_1 = SerialPort::new(0x3F8).init(); - + let com_1 = SerialPort::new(0x3f8).init(); COM_1.call_once(move || Mutex::new(com_1)); } } +pub fn setup_interrupts() { + let vector = interrupts::allocate_vector(); + interrupts::register_handler(vector, irq_handler); + + crate::arch::apic::io_apic_setup_legacy_irq(4, vector, 1); +} + pub macro serial_print($($arg:tt)*) { crate::drivers::uart_16550::_serial_print(format_args!($($arg)*)) } @@ -147,6 +191,8 @@ pub macro serial_println { #[doc(hidden)] pub fn _serial_print(args: fmt::Arguments) { if let Some(c) = COM_1.get() { - c.lock().write_fmt(args).expect("failed to write to COM1") + c.lock_irq() + .write_fmt(args) + .expect("failed to write to COM1") } } diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 8395b1186f2..33dacc5ce39 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -49,8 +49,7 @@ associated_type_defaults, trait_upcasting, asm_const, - sync_unsafe_cell, - // effects + sync_unsafe_cell )] // TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? // `lang_items` => is currently used for the personality function (`rust_eh_personality`). @@ -171,7 +170,9 @@ fn aero_main() -> ! { // Now that all of the essential initialization is done we are going to schedule // the kernel main thread. let init = Task::new_kernel(kernel_main_thread, true); + let kdbg = Task::new_kernel(kernel_dbg_thread, true); scheduler::get_scheduler().register_task(init); + scheduler::get_scheduler().register_task(kdbg); unsafe { interrupts::enable_interrupts(); @@ -212,6 +213,62 @@ fn kernel_main_thread() { unreachable!() } +fn kernel_dbg_thread() { + use core::fmt::Write; + + use crate::drivers::uart::{self, LineStatus, COM_1}; + use crate::userland::task::TaskId; + use crate::utils::sync::WaitQueue; + + uart::setup_interrupts(); + + let input_wq = WaitQueue::new(); + let this_task = scheduler::current_thread(); + uart::register_listener(this_task.clone()); + + let com_1 = COM_1.get().unwrap(); + + loop { + let mut input = String::new(); + + loop { + let mut com_1 = input_wq + .block_on(com_1, |com_1| { + com_1.line_status().contains(LineStatus::INPUT_FULL) + }) + .unwrap(); + + let c = com_1.read_byte() as char; + + if c == '\r' { + writeln!(com_1).unwrap(); + break; + } + + input.push(c); + write!(com_1, "{c}").unwrap(); + } + + let mut commands = input.split_whitespace(); + + if let Some(name) = commands.next() { + match name { + "ps" => scheduler::get_scheduler().log_ptable(), + "wake" => { + log::warn!("kdbg: forcefully waking up task"); + let id = commands.next().unwrap().parse::().unwrap(); + scheduler::get_scheduler() + .find_task(TaskId::new(id)) + .unwrap() + .wake_up(); + } + + _ => log::warn!("kdbg: unknown command {name:?}"), + } + } + } +} + extern "C" fn aero_ap_main(ap_id: usize) -> ! { log::info!("AP{}: Loaded userland", ap_id); From 85c7cbdffb2f0a98004bf9f8b45bcb16e4445faa Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Wed, 3 Jul 2024 12:57:21 -0400 Subject: [PATCH 351/368] misc(kernel): use load fence before swapgs Avoid potential speculative execution issues with swapgs, such as swapgs being speculatively missed. Signed-off-by: Ian Moffett --- src/aero_kernel/src/arch/x86_64/interrupts/handlers.asm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/aero_kernel/src/arch/x86_64/interrupts/handlers.asm b/src/aero_kernel/src/arch/x86_64/interrupts/handlers.asm index 3e339fbaad0..2b1fa600ed7 100644 --- a/src/aero_kernel/src/arch/x86_64/interrupts/handlers.asm +++ b/src/aero_kernel/src/arch/x86_64/interrupts/handlers.asm @@ -39,6 +39,7 @@ interrupt_handler_%1: test qword [rsp + 16], 0x3 ; skip the SWAPGS instruction if CS & 0b11 == 0b00. jz .dont_swapgs + lfence swapgs .dont_swapgs: @@ -70,6 +71,7 @@ interrupt_handler_%1: test qword [rsp + 8], 0x3 ; skip the SWAPGS instruction if CS & 0b11 == 0b00. jz .dont_swapgs_again + lfence swapgs .dont_swapgs_again: From 27c2eb12df8173a5c313fb04f0852e7488fdfce7 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 14 Jul 2024 20:53:57 +1000 Subject: [PATCH 352/368] fix(actions): formatting check Signed-off-by: Anhad Singh --- .github/workflows/build.yml | 5 ++--- Makefile | 6 ++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index af2d62b065b..947ca175b6c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,13 +25,12 @@ jobs: run: | sudo apt-get update sudo apt-get install -y nasm make - python3 -m pip install requests xbstrap - name: Build Documentation run: make doc - name: Formatting Check run: | - ./aero.py --fmt - git diff-index --quiet HEAD -- || (printf "${RED}error${NOCOLOR}: formatting check failed, run \`./aero.py --fmt\`\n" && exit 1) + make check_fmt + git diff-index --quiet HEAD -- || (printf "${RED}error${NOCOLOR}: formatting check failed, run \`make fmt\`\n" && exit 1) - name: Deploy documentation uses: peaceiris/actions-gh-pages@v3 if: github.ref == 'refs/heads/master' && (github.event_name == 'push' || github.event_name == 'schedule') diff --git a/Makefile b/Makefile index 15e3c534476..f5146f3db34 100644 --- a/Makefile +++ b/Makefile @@ -86,3 +86,9 @@ doc: ifeq ($(open),yes) xdg-open target/doc/index.html endif + +fmt: + cd $(SOURCE_DIR) && cargo fmt + +check_fmt: + cd $(SOURCE_DIR) && cargo fmt -- --check From f275662af6e2128d92dcbe7c6df3e5f72c02e5cb Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sun, 14 Jul 2024 20:59:36 +1000 Subject: [PATCH 353/368] fix(actions): docs publish dir Signed-off-by: Anhad Singh --- .github/workflows/build.yml | 6 ++++-- Makefile | 4 ++-- web/CNAME | 1 - web/index.html | 1 - 4 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 web/CNAME delete mode 100644 web/index.html diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 947ca175b6c..6cd2246677d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,9 @@ jobs: sudo apt-get update sudo apt-get install -y nasm make - name: Build Documentation - run: make doc + run: | + make doc + find ./target -type d -name .git -prune -exec rm -rf {} \; - name: Formatting Check run: | make check_fmt @@ -36,4 +38,4 @@ jobs: if: github.ref == 'refs/heads/master' && (github.event_name == 'push' || github.event_name == 'schedule') with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./build/web/ + publish_dir: ./target/doc/ diff --git a/Makefile b/Makefile index f5146f3db34..990748f7183 100644 --- a/Makefile +++ b/Makefile @@ -65,7 +65,7 @@ qemu: $(KERNEL_TARGET) $(USERLAND_TARGET) -cpu host,+vmx \ -drive file=target/disk.img,if=none,id=NVME1,format=raw \ -device nvme,drive=NVME1,serial=nvme \ - ${QEMU_FLAGS} + ${QEMU_FLAGS} # "qemu_perf" options: # delay (default: 30) - the amount of microseconds between each sample. @@ -82,7 +82,7 @@ qemu_p: .PHONY: doc doc: cd src && cargo doc --package aero_kernel --release --target-dir=../target/doc/ - cp web/index.html target/doc/index.html + echo "" > target/doc/index.html ifeq ($(open),yes) xdg-open target/doc/index.html endif diff --git a/web/CNAME b/web/CNAME deleted file mode 100644 index f6dad86016f..00000000000 --- a/web/CNAME +++ /dev/null @@ -1 +0,0 @@ -aero.andypy.dev \ No newline at end of file diff --git a/web/index.html b/web/index.html deleted file mode 100644 index acc3e9a4cd5..00000000000 --- a/web/index.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From c5f81142d8996044730436349d3b005bbb0b9b9e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 7 Sep 2024 13:39:57 +1000 Subject: [PATCH 354/368] fix(kernel): unbreak compilation on latest nightly Signed-off-by: Anhad Singh --- src/aero_kernel/src/main.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 33dacc5ce39..0ed1fae7937 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -33,7 +33,6 @@ ptr_internals, // No tracking issue linked_list_cursors, // https://github.com/rust-lang/rust/issues/58533 extern_types, // https://github.com/rust-lang/rust/issues/43467 - new_uninit, // https://github.com/rust-lang/rust/issues/63291 step_trait, // https://github.com/rust-lang/rust/issues/42168 prelude_import, // No tracking issue allocator_api, // https://github.com/rust-lang/rust/issues/32838 @@ -48,7 +47,7 @@ strict_provenance, associated_type_defaults, trait_upcasting, - asm_const, + new_zeroed_alloc, // https://github.com/rust-lang/rust/issues/129396 sync_unsafe_cell )] // TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? From b83aa1d6d5735a0aa46deb9a2d51c2f8aa72568e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 2 Apr 2025 17:47:17 +1100 Subject: [PATCH 355/368] feat(kern): remove const_ptr_is_null, strict_provenance as they have been stabilised Signed-off-by: Anhad Singh --- src/aero_kernel/src/main.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 0ed1fae7937..816120f3a67 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -41,10 +41,8 @@ maybe_uninit_as_bytes, // https://github.com/rust-lang/rust/issues/93092 const_trait_impl, // https://github.com/rust-lang/rust/issues/67792 int_roundings, // https://github.com/rust-lang/rust/issues/88581 - const_ptr_is_null, // https://github.com/rust-lang/rust/issues/74939 naked_functions, // https://github.com/rust-lang/rust/issues/32408 cfg_match, // https://github.com/rust-lang/rust/issues/115585 - strict_provenance, associated_type_defaults, trait_upcasting, new_zeroed_alloc, // https://github.com/rust-lang/rust/issues/129396 From a42e74ce2bd84c1786d2ea71cf59cb1fe1685ddf Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 2 Apr 2025 17:58:06 +1100 Subject: [PATCH 356/368] fix: new cfg_match syntax Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aero_kernel/src/drivers/mod.rs b/src/aero_kernel/src/drivers/mod.rs index 8cbab02c810..edb23988a46 100644 --- a/src/aero_kernel/src/drivers/mod.rs +++ b/src/aero_kernel/src/drivers/mod.rs @@ -36,12 +36,12 @@ pub mod pty; pub mod tty; cfg_match! { - cfg(target_arch = "x86_64") => { + target_arch = "x86_64" => { pub mod uart_16550; pub use self::uart_16550 as uart; } - cfg(target_arch = "aarch64") => { + target_arch = "aarch64" => { pub mod uart_pl011; pub use self::uart_pl011 as uart; } From c877021155937bb7312c4a046a1c741a9b158d57 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 2 Apr 2025 17:59:33 +1100 Subject: [PATCH 357/368] fix: steps_between Signed-off-by: Anhad Singh --- src/aero_kernel/src/mem/paging/addr.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/aero_kernel/src/mem/paging/addr.rs b/src/aero_kernel/src/mem/paging/addr.rs index 5b46141cd80..b5193b30e63 100644 --- a/src/aero_kernel/src/mem/paging/addr.rs +++ b/src/aero_kernel/src/mem/paging/addr.rs @@ -354,11 +354,12 @@ impl Sub for VirtAddr { impl Step for VirtAddr { #[inline] - fn steps_between(start: &Self, end: &Self) -> Option { + fn steps_between(start: &Self, end: &Self) -> (usize, Option) { if start < end { - Some((end.as_u64() - start.as_u64()) as _) + let n = (end.as_u64() - start.as_u64()) as usize; + (n, Some(n)) } else { - None + (0, None) } } From fe38d28067f3964724220a223a3c3f92d879c23f Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 2 Apr 2025 18:00:34 +1100 Subject: [PATCH 358/368] fix: naked_asm! Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/mem.rs | 17 +++++++---------- src/aero_kernel/src/arch/x86_64/syscall.rs | 7 +++---- src/aero_kernel/src/arch/x86_64/task.rs | 16 +++++++--------- src/aero_kernel/src/arch/x86_64/user_copy.rs | 4 ++-- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/mem.rs b/src/aero_kernel/src/arch/x86_64/mem.rs index c89f15e0648..5f439f1d5c3 100644 --- a/src/aero_kernel/src/arch/x86_64/mem.rs +++ b/src/aero_kernel/src/arch/x86_64/mem.rs @@ -15,6 +15,8 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use core::arch::naked_asm; + fn should_store_by_byte() -> bool { let cpuid = raw_cpuid::CpuId::new(); if let Some(features) = cpuid.get_extended_feature_info() { @@ -32,7 +34,7 @@ unsafe extern "C" fn memcpy_movsq(dest: *mut u8, src: *const u8, len: usize) -> // %rdi = argument 1, `dest` // %rsi = argument 2, `src` // %rdx = argument 3, `len` - asm!( + naked_asm!( // Save the return value. "mov rax, rdi", // Copy in 8 byte chunks. @@ -44,7 +46,6 @@ unsafe extern "C" fn memcpy_movsq(dest: *mut u8, src: *const u8, len: usize) -> "and rcx, 0x7", "rep movsb", "ret", - options(noreturn) ); } @@ -55,14 +56,13 @@ unsafe extern "C" fn memcpy_movsb(dest: *mut u8, src: *const u8, len: usize) -> // %rdi = argument 1, `dest` // %rsi = argument 2, `src` // %rdx = argument 3, `len` - asm!( + naked_asm!( // Save the return value. "mov rax, rdi", // Copy! "mov rcx, rdx", "rep movsb", "ret", - options(noreturn) ) } @@ -82,7 +82,7 @@ unsafe extern "C" fn memset_stosq(dest: *mut u8, byte: i32, len: usize) -> *mut // %rdi = argument 1, `dest` // %rsi = argument 2, `byte` // %rdx = argument 3, `len` - asm!( + naked_asm!( // Save the return value. "mov r11, rdi", // Create an 8-byte copy of the pattern. @@ -101,7 +101,6 @@ unsafe extern "C" fn memset_stosq(dest: *mut u8, byte: i32, len: usize) -> *mut // Restore the return value. "mov rax, r11", "ret", - options(noreturn) ) } @@ -112,7 +111,7 @@ unsafe extern "C" fn memset_stosb(dest: *mut u8, byte: i32, len: usize) -> *mut // %rdi = argument 1, `dest` // %rsi = argument 2, `byte` // %rdx = argument 3, `len` - asm!( + naked_asm!( // Save the return value. "mov r11, rdi", "mov al, sil", @@ -120,7 +119,6 @@ unsafe extern "C" fn memset_stosb(dest: *mut u8, byte: i32, len: usize) -> *mut "rep stosb", "mov rax, r11", "ret", - options(noreturn) ) } @@ -141,7 +139,7 @@ unsafe extern "C" fn memmove_erms(dest: *mut u8, src: *const u8, len: usize) -> // %rdi = argument 1, `dest` // %rsi = argument 2, `src` // %rdx = argument 3, `len` - asm!( + naked_asm!( "mov rax, rdi", // Skip zero length. "test rdx, rdx", @@ -167,7 +165,6 @@ unsafe extern "C" fn memmove_erms(dest: *mut u8, src: *const u8, len: usize) -> "rep movsb", "cld", "ret", - options(noreturn) ) } diff --git a/src/aero_kernel/src/arch/x86_64/syscall.rs b/src/aero_kernel/src/arch/x86_64/syscall.rs index e8ed006ac7c..2391a3b3e8b 100644 --- a/src/aero_kernel/src/arch/x86_64/syscall.rs +++ b/src/aero_kernel/src/arch/x86_64/syscall.rs @@ -9,6 +9,7 @@ use crate::utils::sync::IrqGuard; use super::interrupts::InterruptErrorStack; use super::{asm_macros, io}; +use core::arch::naked_asm; use core::mem::offset_of; const ARCH_SET_GS: usize = 0x1001; @@ -39,7 +40,7 @@ const ARCH_GET_GS: usize = 0x1004; /// The instruction also does not save anything on the stack and does *not* change the `RSP`. #[naked] unsafe extern "C" fn x86_64_syscall_handler() { - asm!( + naked_asm!( // make the GS base point to the kernel TLS "swapgs", // save the user stack pointer @@ -89,7 +90,6 @@ unsafe extern "C" fn x86_64_syscall_handler() { tss_temp_ustack_off = const offset_of!(Tss, reserved2) + core::mem::size_of::(), tss_rsp0_off = const offset_of!(Tss, rsp) + core::mem::size_of::(), x86_64_do_syscall = sym x86_64_do_syscall, - options(noreturn) ) } @@ -107,7 +107,7 @@ unsafe extern "C" fn x86_64_syscall_handler() { /// The instruction expects the call number and arguments in the same registers as for SYSCALL. #[naked] unsafe extern "C" fn x86_64_sysenter_handler() { - asm!( + naked_asm!( "swapgs", // Build the interrupt frame expected by the kernel. "push {userland_ss}", @@ -155,7 +155,6 @@ unsafe extern "C" fn x86_64_sysenter_handler() { userland_ss = const USER_SS.bits(), x86_64_check_sysenter = sym x86_64_check_sysenter, x86_64_do_syscall = sym x86_64_do_syscall, - options(noreturn) ) } diff --git a/src/aero_kernel/src/arch/x86_64/task.rs b/src/aero_kernel/src/arch/x86_64/task.rs index 4160e28f582..fa57318ba88 100644 --- a/src/aero_kernel/src/arch/x86_64/task.rs +++ b/src/aero_kernel/src/arch/x86_64/task.rs @@ -37,6 +37,7 @@ use alloc::vec::Vec; use raw_cpuid::CpuId; use core::alloc::Layout; +use core::arch::naked_asm; use core::ptr::Unique; use crate::arch::interrupts::InterruptErrorStack; @@ -115,7 +116,8 @@ const USERLAND_STACK_BOTTOM: VirtAddr = USERLAND_STACK_TOP.const_sub_u64(USERLAN #[naked] unsafe extern "C" fn jump_userland_exec(stack: VirtAddr, rip: VirtAddr, rflags: u64) { - asm!( + #[rustfmt::skip] + naked_asm!( "push rdi", // stack "push rsi", // rip "push rdx", // rflags @@ -124,14 +126,13 @@ unsafe extern "C" fn jump_userland_exec(stack: VirtAddr, rip: VirtAddr, rflags: "pop rcx", "pop rsp", "swapgs", - "sysretq", - options(noreturn) + "sysretq" ); } #[naked] unsafe extern "C" fn task_spinup(prev: &mut Unique, next: &Context) { - asm!( + naked_asm!( // save callee-saved registers "push rbp", "push rbx", @@ -158,26 +159,24 @@ unsafe extern "C" fn task_spinup(prev: &mut Unique, next: &Context) { "pop rbp", // resume the next thread "ret", - options(noreturn) ); } #[naked] unsafe extern "C" fn iretq_init() { - asm!( + naked_asm!( "cli", // pop the error code "add rsp, 8", asm_macros::pop_preserved!(), asm_macros::pop_scratch!(), "iretq", - options(noreturn) ) } #[naked] unsafe extern "C" fn fork_init() { - asm!( + naked_asm!( "cli", // pop the error code "add rsp, 8", @@ -185,7 +184,6 @@ unsafe extern "C" fn fork_init() { asm_macros::pop_scratch!(), "swapgs", "iretq", - options(noreturn) ) } diff --git a/src/aero_kernel/src/arch/x86_64/user_copy.rs b/src/aero_kernel/src/arch/x86_64/user_copy.rs index 630fd2a062a..5922b3fb2ce 100644 --- a/src/aero_kernel/src/arch/x86_64/user_copy.rs +++ b/src/aero_kernel/src/arch/x86_64/user_copy.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use core::arch::naked_asm; use core::fmt::{Debug, Display}; use core::mem::MaybeUninit; use core::ops::{Deref, DerefMut}; @@ -52,7 +53,7 @@ unsafe extern "C" fn copy_to_from_user( // %rsi = argument 2, `src` // %rdx = argument 3, `size` // %rcx = argument 4, `fault_resume` (copied to %r10) - asm!( + naked_asm!( // Copy `fault_resume` out of %rcx because it will be utilized by `rep movsb` latter. "mov r10, rcx", // Setup the page fault resume. @@ -82,7 +83,6 @@ unsafe extern "C" fn copy_to_from_user( "1:", "xor eax, eax", "jmp 3b", - options(noreturn) ) } From 4e8013aeb131afcc5dfde79203d0a8de7c9a632d Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 2 Apr 2025 18:03:42 +1100 Subject: [PATCH 359/368] fix(scheduler): awaiting tasks * Correctly set a sleep duration of 0 for tasks that do not have a deadline. * Look in the `deadline_awaiting` queue if the task trying to wake up has a non-zero duration. Signed-off-by: Anhad Singh --- .../src/userland/scheduler/round_robin.rs | 8 +++++++- src/aero_kernel/src/utils/sync.rs | 12 ++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 8dcc68fefe4..1f592b5eb61 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -90,6 +90,8 @@ impl TaskQueue { debug_assert!(!task.link.is_linked()); // Make sure the task is not already linked task.update_state(TaskState::AwaitingIo); + task.set_sleep_duration(0); + self.awaiting.push_back(task); } } @@ -213,7 +215,11 @@ impl SchedulerInterface for RoundRobin { let queue = self.queue.get_mut(); if task.state() == TaskState::AwaitingIo { - let mut cursor = unsafe { queue.awaiting.cursor_mut_from_ptr(task.as_ref()) }; + let mut cursor = if task.load_sleep_duration() > 0 { + unsafe { queue.deadline_awaiting.cursor_mut_from_ptr(task.as_ref()) } + } else { + unsafe { queue.awaiting.cursor_mut_from_ptr(task.as_ref()) } + }; if let Some(task) = cursor.remove() { queue.push_runnable(task); diff --git a/src/aero_kernel/src/utils/sync.rs b/src/aero_kernel/src/utils/sync.rs index 67ef642bd37..3168ec27068 100644 --- a/src/aero_kernel/src/utils/sync.rs +++ b/src/aero_kernel/src/utils/sync.rs @@ -178,7 +178,7 @@ pub struct BMutexGuard<'a, T: ?Sized + 'a> { mutex: &'a BMutex, } -impl<'a, T: ?Sized> core::ops::Deref for BMutexGuard<'a, T> { +impl core::ops::Deref for BMutexGuard<'_, T> { type Target = T; #[inline] @@ -187,14 +187,14 @@ impl<'a, T: ?Sized> core::ops::Deref for BMutexGuard<'a, T> { } } -impl<'a, T: ?Sized> core::ops::DerefMut for BMutexGuard<'a, T> { +impl core::ops::DerefMut for BMutexGuard<'_, T> { #[inline] fn deref_mut(&mut self) -> &mut T { self.guard.deref_mut() } } -impl<'a, T: ?Sized> Drop for BMutexGuard<'a, T> { +impl Drop for BMutexGuard<'_, T> { fn drop(&mut self) { self.mutex.wq.notify(); } @@ -261,7 +261,7 @@ pub struct MutexGuard<'a, T: ?Sized + 'a> { irq_lock: bool, } -impl<'a, T: ?Sized> core::ops::Deref for MutexGuard<'a, T> { +impl core::ops::Deref for MutexGuard<'_, T> { type Target = T; #[inline] @@ -270,14 +270,14 @@ impl<'a, T: ?Sized> core::ops::Deref for MutexGuard<'a, T> { } } -impl<'a, T: ?Sized> core::ops::DerefMut for MutexGuard<'a, T> { +impl core::ops::DerefMut for MutexGuard<'_, T> { #[inline] fn deref_mut(&mut self) -> &mut T { &mut self.guard } } -impl<'a, T: ?Sized> Drop for MutexGuard<'a, T> { +impl Drop for MutexGuard<'_, T> { #[inline] fn drop(&mut self) { unsafe { From adbe0ad6e0f168111a0cda81fe48ef089727bc8a Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 2 Apr 2025 18:05:45 +1100 Subject: [PATCH 360/368] cleanup Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/pci.rs | 2 +- src/aero_kernel/src/drivers/pty.rs | 2 +- src/aero_kernel/src/rendy.rs | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/aero_kernel/src/drivers/pci.rs b/src/aero_kernel/src/drivers/pci.rs index c44dc4ee6f3..91851f76d29 100644 --- a/src/aero_kernel/src/drivers/pci.rs +++ b/src/aero_kernel/src/drivers/pci.rs @@ -184,7 +184,7 @@ impl<'a> CapabilityIter<'a> { } } -impl<'a> Iterator for CapabilityIter<'a> { +impl Iterator for CapabilityIter<'_> { type Item = (u32, Capability); fn next(&mut self) -> Option { diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index d75dd81d7b1..eac7ab4a899 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -297,7 +297,7 @@ impl INodeInterface for Slave { for b in buffer.iter() { if *b == b'\n' { // ONLCR: Convert NL to CR + NL - master.extend_from_slice(&[b'\r', b'\n']); + master.extend_from_slice(b"\r\n"); continue; } diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 4555cfa9122..24b85a97ff3 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -309,7 +309,7 @@ pub struct Inner<'this> { color_list: ColorList, } -impl<'a> Inner<'a> { +impl Inner<'_> { fn genloop( &mut self, image: &Image, @@ -793,13 +793,13 @@ impl<'a> core::ops::Deref for DebugRendy<'a> { } } -impl<'a> core::ops::DerefMut for DebugRendy<'a> { +impl core::ops::DerefMut for DebugRendy<'_> { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner } } -impl<'this> fmt::Write for DebugRendy<'this> { +impl fmt::Write for DebugRendy<'_> { fn write_str(&mut self, string: &str) -> fmt::Result { for b in string.bytes() { self.performer.advance(&mut self.inner, b); @@ -808,7 +808,7 @@ impl<'this> fmt::Write for DebugRendy<'this> { } } -impl<'a> vte::ansi::Handler for Inner<'a> { +impl vte::ansi::Handler for Inner<'_> { fn input(&mut self, c: char) { self.write_character(c); @@ -883,8 +883,8 @@ impl<'a> vte::ansi::Handler for Inner<'a> { } } -unsafe impl<'this> Send for DebugRendy<'this> {} -unsafe impl<'this> Sync for DebugRendy<'this> {} +unsafe impl Send for DebugRendy<'_> {} +unsafe impl Sync for DebugRendy<'_> {} pub static DEBUG_RENDY: Once> = Once::new(); From bf8121c682827deb240d8b059f12851ad9832e0e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 2 Apr 2025 18:15:51 +1100 Subject: [PATCH 361/368] fix(epoll): timeout Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/epoll.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index ed967f6779f..390ec60139f 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -15,6 +15,9 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +// TODO: The reason why XFE did not run was because of the FXSleep function which uses select() to +// sleep. + use aero_syscall::prelude::{EPollEvent, EPollEventFlags}; use aero_syscall::SyscallError; @@ -170,7 +173,7 @@ impl EPoll { } // If all events are ready, we can return now. - if n > 0 { + if n > 0 || fds.is_empty() { debug_assert!(fds.is_empty()); return Ok(n); } @@ -181,9 +184,22 @@ impl EPoll { return Ok(0); } + if timeout > 0 { + scheduler::get_scheduler() + .inner + .sleep(Some(timeout * 1_000_000))?; + } else { + scheduler::get_scheduler().inner.sleep(None)?; + } + 'search: loop { scheduler::get_scheduler().inner.await_io()?; + if current_task.load_sleep_duration() == 0 && timeout > 0 { + // Timeout has expired. + return Ok(0); + } + for (fd, event, flags) in fds.iter_mut() { // If the event mask does not contain any poll(2) events, the event // descriptor is disabled. From 2c46ee99d78144ff2a8cb56c6670b0d096c0c1f2 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 2 Apr 2025 18:17:32 +1100 Subject: [PATCH 362/368] cleanup: remove trait_upcasting as it is stable now Signed-off-by: Anhad Singh --- src/aero_kernel/src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index 816120f3a67..ec917a72daa 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -44,7 +44,6 @@ naked_functions, // https://github.com/rust-lang/rust/issues/32408 cfg_match, // https://github.com/rust-lang/rust/issues/115585 associated_type_defaults, - trait_upcasting, new_zeroed_alloc, // https://github.com/rust-lang/rust/issues/129396 sync_unsafe_cell )] From e045934978037590e2483d49999029884e774b54 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Wed, 2 Apr 2025 18:34:55 +1100 Subject: [PATCH 363/368] fix(epoll) TODO: Cleanup the task state enum. Signed-off-by: Anhad Singh --- src/aero_kernel/src/fs/epoll.rs | 10 +++++++--- src/aero_kernel/src/userland/scheduler/round_robin.rs | 6 +++--- src/aero_kernel/src/userland/task/mod.rs | 2 ++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index 390ec60139f..8cf37ceb333 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -25,6 +25,7 @@ use alloc::sync::Arc; use hashbrown::HashMap; use crate::userland::scheduler; +use crate::userland::task::TaskState; use crate::utils::sync::Mutex; use super::inode::{INodeInterface, PollTable}; @@ -193,9 +194,10 @@ impl EPoll { } 'search: loop { - scheduler::get_scheduler().inner.await_io()?; - - if current_task.load_sleep_duration() == 0 && timeout > 0 { + if current_task.state() == TaskState::AwaitingIoDeadline + && current_task.load_sleep_duration() == 0 + && timeout > 0 + { // Timeout has expired. return Ok(0); } @@ -224,6 +226,8 @@ impl EPoll { n = 1; break 'search; } + + scheduler::get_scheduler().inner.await_io()?; } } diff --git a/src/aero_kernel/src/userland/scheduler/round_robin.rs b/src/aero_kernel/src/userland/scheduler/round_robin.rs index 1f592b5eb61..2f61eebb4ba 100644 --- a/src/aero_kernel/src/userland/scheduler/round_robin.rs +++ b/src/aero_kernel/src/userland/scheduler/round_robin.rs @@ -80,7 +80,7 @@ impl TaskQueue { fn push_deadline_awaiting(&mut self, task: Arc, duration: usize) { debug_assert!(!task.link.is_linked()); // Make sure the task is not already linked - task.update_state(TaskState::AwaitingIo); + task.update_state(TaskState::AwaitingIoDeadline); task.set_sleep_duration(crate::arch::time::get_uptime_ticks() + duration); self.deadline_awaiting.push_back(task); @@ -214,8 +214,8 @@ impl SchedulerInterface for RoundRobin { let _guard = IrqGuard::new(); let queue = self.queue.get_mut(); - if task.state() == TaskState::AwaitingIo { - let mut cursor = if task.load_sleep_duration() > 0 { + if task.state() == TaskState::AwaitingIo || task.state() == TaskState::AwaitingIoDeadline { + let mut cursor = if task.state() == TaskState::AwaitingIoDeadline { unsafe { queue.deadline_awaiting.cursor_mut_from_ptr(task.as_ref()) } } else { unsafe { queue.awaiting.cursor_mut_from_ptr(task.as_ref()) } diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index cd7d1d7d706..b0b81e2f0ab 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -73,6 +73,7 @@ pub enum TaskState { Runnable, Zombie, AwaitingIo, + AwaitingIoDeadline, } impl From for TaskState { @@ -81,6 +82,7 @@ impl From for TaskState { 0 => TaskState::Runnable, 1 => TaskState::Zombie, 2 => TaskState::AwaitingIo, + 3 => TaskState::AwaitingIoDeadline, _ => panic!("invalid task state"), } } From 9d04caa36281e62f527d7ca7940e696662da7ad2 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 4 Apr 2025 17:29:04 +1100 Subject: [PATCH 364/368] fix: a few warnings Signed-off-by: Anhad Singh --- src/aero_kernel/src/arch/x86_64/gdt.rs | 4 ++-- src/aero_kernel/src/fs/ext2/group_desc.rs | 7 +------ src/aero_kernel/src/fs/ext2/mod.rs | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/aero_kernel/src/arch/x86_64/gdt.rs b/src/aero_kernel/src/arch/x86_64/gdt.rs index 7e8df0e6707..36c42f4c07c 100644 --- a/src/aero_kernel/src/arch/x86_64/gdt.rs +++ b/src/aero_kernel/src/arch/x86_64/gdt.rs @@ -25,8 +25,8 @@ //! * use core::alloc::Layout; -use core::mem; use core::ptr::addr_of; +use core::{mem, ptr}; use alloc::alloc::alloc_zeroed; @@ -271,7 +271,7 @@ impl GdtEntry { fn set_raw(&mut self, value: T) { unsafe { - *(self as *mut _ as *mut T) = value; + *(ptr::addr_of_mut!(*self).cast::()) = value; } } } diff --git a/src/aero_kernel/src/fs/ext2/group_desc.rs b/src/aero_kernel/src/fs/ext2/group_desc.rs index 97c5ff113c8..af3578d735d 100644 --- a/src/aero_kernel/src/fs/ext2/group_desc.rs +++ b/src/aero_kernel/src/fs/ext2/group_desc.rs @@ -15,8 +15,6 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . -use core::mem::MaybeUninit; - use alloc::boxed::Box; use alloc::sync::{Arc, Weak}; @@ -53,10 +51,7 @@ impl GroupDescriptors { let bgdt_len = superblock.bgdt_len(); let mut bgdt = Box::<[disk::GroupDescriptor]>::new_uninit_slice(bgdt_len); - device.read( - superblock.bgdt_block(), - MaybeUninit::slice_as_bytes_mut(&mut bgdt), - )?; + device.read(superblock.bgdt_block(), bgdt.as_bytes_mut())?; // SAFETY: We have initialized the BGD (Block Group Descriptor Table) above. let bgdt = unsafe { bgdt.assume_init() }; diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index 337fa3c4acf..d37189b80e0 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -557,7 +557,7 @@ impl INodeInterface for INode { Ok(path.into()) } else { let mut buffer = Box::<[u8]>::new_uninit_slice(path_len); - self.read(0, MaybeUninit::slice_as_bytes_mut(&mut buffer))?; + self.read(0, buffer.as_bytes_mut())?; let path_bytes = unsafe { buffer.assume_init() }; let path = core::str::from_utf8(&path_bytes).or(Err(FileSystemError::InvalidPath))?; From 3a42546a834c6be4d17e3ad56baeaffe6db75a47 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 4 Apr 2025 17:43:49 +1100 Subject: [PATCH 365/368] misc: bump crates Signed-off-by: Anhad Singh --- src/Cargo.lock | 299 ++++++++++++++++------------------- src/aero_kernel/Cargo.toml | 26 +-- src/aero_kernel/src/rendy.rs | 4 +- 3 files changed, 151 insertions(+), 178 deletions(-) diff --git a/src/Cargo.lock b/src/Cargo.lock index 1e136f7b711..0b3a1ec588b 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "aero_kernel" @@ -9,7 +9,7 @@ dependencies = [ "aero_proc", "aero_syscall", "bit_field", - "bitflags 2.5.0", + "bitflags 2.9.0", "byte_endian", "bytemuck", "cpio_reader", @@ -27,7 +27,7 @@ dependencies = [ "raw-cpuid", "rustc-demangle", "serde_json", - "spin 0.9.8", + "spin 0.10.0", "static_assertions", "uapi", "vte", @@ -55,35 +55,23 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "autocfg" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "bit_field" @@ -99,9 +87,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "byte_endian" @@ -110,15 +98,18 @@ source = "git+https://github.com/aero-os/byte_endian#540be6149cd9408088a9e45be2d [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" [[package]] name = "cc" -version = "1.0.90" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -140,7 +131,7 @@ version = "0.1.0" source = "git+https://github.com/aero-os/crabnet#58a74ea76fb9586ac1c33fd0adbda497ebdaac43" dependencies = [ "bit_field", - "bitflags 2.5.0", + "bitflags 2.9.0", "byte_endian", "static_assertions", ] @@ -155,66 +146,70 @@ dependencies = [ ] [[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "cursor-icon" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" [[package]] -name = "crossbeam-utils" -version = "0.8.19" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "cursor-icon" -version = "1.1.0" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "either" -version = "1.10.0" +name = "getrandom" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi", +] [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ - "ahash", "allocator-api2", + "equivalent", + "foldhash", ] [[package]] name = "intrusive-collections" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b694dc9f70c3bda874626d2aed13b780f137aab435f4e9814121955cf706122e" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" dependencies = [ "memoffset", ] [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom", + "libc", +] [[package]] name = "lai" @@ -227,37 +222,49 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin 0.9.8", ] +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + [[package]] name = "limine" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "846c87e24d089e8717a61098cba72b378e3525c46a87cf75b71352dcf668e68c" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.9.0", ] [[package]] name = "log" -version = "0.4.21" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lru" -version = "0.12.3" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" dependencies = [ "hashbrown", ] +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + [[package]] name = "memoffset" version = "0.9.1" @@ -269,11 +276,11 @@ dependencies = [ [[package]] name = "nasm-rs" -version = "0.2.5" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4d98d0065f4b1daf164b3eafb11974c94662e5e2396cf03f32d0bb5c17da51" +checksum = "12fcfa1bd49e0342ec1d07ed2be83b59963e7acbeb9310e1bb2c07b69dadd959" dependencies = [ - "rayon", + "jobserver", ] [[package]] @@ -289,19 +296,13 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -328,99 +329,86 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] -name = "raw-cpuid" -version = "11.0.1" +name = "r-efi" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" -dependencies = [ - "bitflags 2.5.0", -] +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" [[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" +name = "raw-cpuid" +version = "11.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "bitflags 2.9.0", ] [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[package]] -name = "spin" -version = "0.5.2" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "spin" @@ -428,6 +416,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" + [[package]] name = "static_assertions" version = "1.1.0" @@ -447,9 +441,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.55" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -462,77 +456,58 @@ version = "0.1.0" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vte" -version = "0.13.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40eb22ae96f050e0c0d6f7ce43feeae26c348fc4dea56928ca81537cfaa6188b" +checksum = "a5924018406ce0063cd67f8e008104968b74b563ee1b85dde3ed1f7cb87d3dbd" dependencies = [ "arrayvec", - "bitflags 2.5.0", + "bitflags 2.9.0", "cursor-icon", "log", - "utf8parse", - "vte_generate_state_changes", + "memchr", ] [[package]] -name = "vte_generate_state_changes" -version = "0.1.1" +name = "wasi" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ - "proc-macro2", - "quote", + "wit-bindgen-rt", ] [[package]] -name = "xmas-elf" -version = "0.9.1" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42c49817e78342f7f30a181573d82ff55b88a35f86ccaf07fc64b3008f56d1c6" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "zero", + "bitflags 2.9.0", ] [[package]] -name = "zero" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fe21bcc34ca7fe6dd56cc2cb1261ea59d6b93620215aefb5ea6032265527784" - -[[package]] -name = "zerocopy" -version = "0.7.32" +name = "xmas-elf" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "18245fcbb8b3de8dd198ce7944fdd4096986fd6cd306b0fcfa27df817bd545d6" dependencies = [ - "zerocopy-derive", + "zero", ] [[package]] -name = "zerocopy-derive" -version = "0.7.32" +name = "zero" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.55", -] +checksum = "2fe21bcc34ca7fe6dd56cc2cb1261ea59d6b93620215aefb5ea6032265527784" diff --git a/src/aero_kernel/Cargo.toml b/src/aero_kernel/Cargo.toml index 720e47c8360..8c6c5489d33 100644 --- a/src/aero_kernel/Cargo.toml +++ b/src/aero_kernel/Cargo.toml @@ -21,30 +21,30 @@ kmemleak = [] default = ["round-robin"] [dependencies] -spin = { version = "0.9.8", default-features = false, features = [ +spin = { version = "0.10.0", default-features = false, features = [ "spin_mutex", "rwlock", "once", ] } -bitflags = "2.4.2" +bitflags = "2.9.0" bit_field = "0.10.2" -log = "0.4.21" -xmas-elf = "0.9.1" -hashbrown = "0.14.3" -rustc-demangle = "0.1.23" +log = "0.4.27" +xmas-elf = "0.10.0" +hashbrown = "0.15.2" +rustc-demangle = "0.1.24" # intrusive-collections: # `nightly`: Get access to const variants of the functions. -intrusive-collections = { version = "0.9.6", features = ["nightly"] } +intrusive-collections = { version = "0.9.7", features = ["nightly"] } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } lai = { git = "https://github.com/aero-os/lai-rs" } uapi = { path = "../uapi" } cpio_reader = { git = "https://github.com/Andy-Python-Programmer/cpio_reader" } static_assertions = "1.1.0" -lru = "0.12.3" -bytemuck = "1.15.0" +lru = "0.13.0" +bytemuck = "1.22.0" limine = "0.2.0" num-traits = { version = "0.2", default-features = false } -vte = { version = "0.13.0", features = ["ansi"] } +vte = { version = "0.15.0", default-features = false, features = ["ansi"] } byte_endian = { git = "https://github.com/aero-os/byte_endian" } crabnet = { git = "https://github.com/aero-os/crabnet" } @@ -54,10 +54,10 @@ crabnet_tcp = { git = "https://github.com/aero-os/crabnet", default-features = f # X86_64 specific dependencies: [target.'cfg(target_arch = "x86_64")'.dependencies] -raw-cpuid = "11.0.1" +raw-cpuid = "11.5.0" [dependencies.lazy_static] -version = "1.4.0" +version = "1.5.0" features = ["spin_no_std"] [dependencies.aero_proc] @@ -67,4 +67,4 @@ path = "../aero_proc" path = "../aero_syscall" [build-dependencies] -nasm-rs = { version = "0.2", features = ["parallel"] } +nasm-rs = { version = "0.3", features = ["parallel"] } diff --git a/src/aero_kernel/src/rendy.rs b/src/aero_kernel/src/rendy.rs index 24b85a97ff3..29e3a8513e2 100644 --- a/src/aero_kernel/src/rendy.rs +++ b/src/aero_kernel/src/rendy.rs @@ -801,9 +801,7 @@ impl core::ops::DerefMut for DebugRendy<'_> { impl fmt::Write for DebugRendy<'_> { fn write_str(&mut self, string: &str) -> fmt::Result { - for b in string.bytes() { - self.performer.advance(&mut self.inner, b); - } + self.performer.advance(&mut self.inner, string.as_bytes()); Ok(()) } } From 515bd5ba0e45a417fac4225791054c39dbb0b23f Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 4 Apr 2025 17:49:32 +1100 Subject: [PATCH 366/368] misc: cleanup Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/e1000.rs | 2 +- src/aero_kernel/src/drivers/lai.rs | 1 - src/aero_kernel/src/fs/epoll.rs | 8 +++----- src/aero_kernel/src/logger.rs | 2 +- src/aero_kernel/src/syscall/fs.rs | 2 +- src/aero_kernel/src/syscall/futex.rs | 2 +- src/aero_kernel/src/syscall/time.rs | 2 +- src/aero_kernel/src/userland/scheduler/mod.rs | 12 +++++++++++- src/aero_kernel/src/userland/task/mod.rs | 2 +- src/aero_kernel/src/utils/sync.rs | 8 ++++---- 10 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/aero_kernel/src/drivers/e1000.rs b/src/aero_kernel/src/drivers/e1000.rs index 27cca5d9700..3c1dca5c2c5 100644 --- a/src/aero_kernel/src/drivers/e1000.rs +++ b/src/aero_kernel/src/drivers/e1000.rs @@ -617,7 +617,7 @@ impl NetworkDriver for Device { return data; } else { drop(e1000); - scheduler::get_scheduler().inner.await_io().unwrap(); + scheduler::get_scheduler().await_io().unwrap(); } } } diff --git a/src/aero_kernel/src/drivers/lai.rs b/src/aero_kernel/src/drivers/lai.rs index 08c6a0114b4..1d67c694d0b 100644 --- a/src/aero_kernel/src/drivers/lai.rs +++ b/src/aero_kernel/src/drivers/lai.rs @@ -51,7 +51,6 @@ impl lai::Host for LaiHost { fn sleep(&self, ms: u64) { scheduler::get_scheduler() - .inner .sleep(Some(ms as usize / 1000)) .expect("lai: unexpected signal during sleep") } diff --git a/src/aero_kernel/src/fs/epoll.rs b/src/aero_kernel/src/fs/epoll.rs index 8cf37ceb333..8cbf9675c67 100644 --- a/src/aero_kernel/src/fs/epoll.rs +++ b/src/aero_kernel/src/fs/epoll.rs @@ -186,11 +186,9 @@ impl EPoll { } if timeout > 0 { - scheduler::get_scheduler() - .inner - .sleep(Some(timeout * 1_000_000))?; + scheduler::get_scheduler().sleep(Some(timeout * 1_000_000))?; } else { - scheduler::get_scheduler().inner.sleep(None)?; + scheduler::get_scheduler().sleep(None)?; } 'search: loop { @@ -227,7 +225,7 @@ impl EPoll { break 'search; } - scheduler::get_scheduler().inner.await_io()?; + scheduler::get_scheduler().await_io()?; } } diff --git a/src/aero_kernel/src/logger.rs b/src/aero_kernel/src/logger.rs index 988f0814786..19d43533ec0 100644 --- a/src/aero_kernel/src/logger.rs +++ b/src/aero_kernel/src/logger.rs @@ -69,7 +69,7 @@ impl log::Log for AeroLogger { if scheduler::is_initialized() { // fetch the current task, grab the TID and PID. - if let Some(task) = scheduler::get_scheduler().inner.current_task_optional() { + if let Some(task) = scheduler::get_scheduler().current_task_optional() { serial_print!( "(tid={}, pid={}) ", task.tid().as_usize(), diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index c3a527961b1..bbd6839389d 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -697,7 +697,7 @@ fn do_poll(fds: &mut [PollFd], timeout: Option<&TimeSpec>) -> Result Result { let duration = (timespec.tv_nsec as usize).div_ceil(1000000000) + timespec.tv_sec as usize; - scheduler::get_scheduler().inner.sleep(Some(duration))?; + scheduler::get_scheduler().sleep(Some(duration))?; Ok(0x00) } diff --git a/src/aero_kernel/src/userland/scheduler/mod.rs b/src/aero_kernel/src/userland/scheduler/mod.rs index 692bf81a06e..3b7ce6adb22 100644 --- a/src/aero_kernel/src/userland/scheduler/mod.rs +++ b/src/aero_kernel/src/userland/scheduler/mod.rs @@ -18,6 +18,8 @@ #[cfg(feature = "round-robin")] pub mod round_robin; +use core::ops; + use alloc::sync::Arc; use crate::arch::interrupts::{self, InterruptStack}; @@ -86,7 +88,7 @@ pub enum ExitStatus { pub struct Scheduler { tasks: TaskContainer, - pub inner: Arc, + inner: Arc, } impl Scheduler { @@ -155,6 +157,14 @@ impl Scheduler { } } +impl ops::Deref for Scheduler { + type Target = dyn SchedulerInterface; + + fn deref(&self) -> &Self::Target { + &*self.inner + } +} + /// Get a reference to the active scheduler. pub fn get_scheduler() -> &'static Scheduler { SCHEDULER diff --git a/src/aero_kernel/src/userland/task/mod.rs b/src/aero_kernel/src/userland/task/mod.rs index b0b81e2f0ab..0da42760f96 100644 --- a/src/aero_kernel/src/userland/task/mod.rs +++ b/src/aero_kernel/src/userland/task/mod.rs @@ -667,7 +667,7 @@ impl Task { } pub fn wake_up(&self) { - scheduler::get_scheduler().inner.wake_up(self.this()) + scheduler::get_scheduler().wake_up(self.this()) } pub fn is_process_leader(&self) -> bool { diff --git a/src/aero_kernel/src/utils/sync.rs b/src/aero_kernel/src/utils/sync.rs index 3168ec27068..9914c885586 100644 --- a/src/aero_kernel/src/utils/sync.rs +++ b/src/aero_kernel/src/utils/sync.rs @@ -58,7 +58,7 @@ impl WaitQueue { // Wait until the future is completed. while !future(&mut lock) { core::mem::drop(lock); // Drop the IRQ lock and await for IO to complete. - scheduler.inner.await_io()?; + scheduler.await_io()?; // Re-acquire the lock. lock = mutex.lock_irq(); @@ -94,7 +94,7 @@ impl WaitQueue { let this = self.queue.lock_irq(); for task in this.iter() { - scheduler.inner.wake_up(task.clone()); + scheduler.wake_up(task.clone()); } } @@ -104,7 +104,7 @@ impl WaitQueue { let this: MutexGuard>> = self.queue.lock_irq(); if let Some(task) = this.first() { - scheduler.inner.wake_up(task.clone()); + scheduler.wake_up(task.clone()); } } @@ -168,7 +168,7 @@ impl BMutex { return BMutexGuard { guard, mutex: self }; } - let _ = scheduler::get_scheduler().inner.await_io(); + let _ = scheduler::get_scheduler().await_io(); } } } From bf0f4969f52eb61f5c6c32ec520e27649609f09e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Fri, 4 Apr 2025 19:31:54 +1100 Subject: [PATCH 367/368] fix: read and recv Handles were stored on open(). Obvious that this is wrong as with other fd pointing to the same file would be different. This was totally wrong. Pass open flags for now as thats what we need. May pass &fd or smth in the future. Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/keyboard.rs | 3 +- src/aero_kernel/src/drivers/mouse.rs | 3 +- src/aero_kernel/src/drivers/pty.rs | 7 ++--- src/aero_kernel/src/drivers/tty/ctty.rs | 6 ++-- src/aero_kernel/src/drivers/tty/vtty.rs | 3 +- src/aero_kernel/src/fs/devfs.rs | 12 ++++---- src/aero_kernel/src/fs/eventfd.rs | 7 ++++- src/aero_kernel/src/fs/ext2/mod.rs | 24 ++++++++++----- src/aero_kernel/src/fs/file_table.rs | 2 +- src/aero_kernel/src/fs/inode.rs | 9 ++++-- src/aero_kernel/src/fs/pipe.rs | 12 ++------ src/aero_kernel/src/fs/procfs.rs | 3 +- src/aero_kernel/src/fs/ramfs.rs | 8 ++--- src/aero_kernel/src/socket/netlink.rs | 5 ++-- src/aero_kernel/src/socket/tcp.rs | 39 +++++++++++-------------- src/aero_kernel/src/socket/udp.rs | 7 ++++- src/aero_kernel/src/socket/unix.rs | 34 +++++++++------------ src/aero_kernel/src/syscall/net.rs | 2 +- src/aero_kernel/src/userland/vm.rs | 14 +++++---- src/aero_kernel/src/utils/mod.rs | 4 +-- src/aero_syscall/src/lib.rs | 6 ++++ 21 files changed, 114 insertions(+), 96 deletions(-) diff --git a/src/aero_kernel/src/drivers/keyboard.rs b/src/aero_kernel/src/drivers/keyboard.rs index c5e819665f3..2379c934b3a 100644 --- a/src/aero_kernel/src/drivers/keyboard.rs +++ b/src/aero_kernel/src/drivers/keyboard.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use aero_syscall::OpenFlags; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; use spin::RwLock; @@ -228,7 +229,7 @@ impl KeyboardListener for KeyboardDevice { } impl INodeInterface for KeyboardDevice { - fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result { if self.buffer.lock_irq().is_empty() { return Ok(0); } diff --git a/src/aero_kernel/src/drivers/mouse.rs b/src/aero_kernel/src/drivers/mouse.rs index cd49130391c..591cbeabbdb 100644 --- a/src/aero_kernel/src/drivers/mouse.rs +++ b/src/aero_kernel/src/drivers/mouse.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use aero_syscall::OpenFlags; use alloc::sync::Arc; use alloc::vec::Vec; @@ -137,7 +138,7 @@ impl Device for Mouse { } impl INodeInterface for Mouse { - fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result { let size = core::mem::size_of::(); if buffer.len() < size { diff --git a/src/aero_kernel/src/drivers/pty.rs b/src/aero_kernel/src/drivers/pty.rs index eac7ab4a899..973740f2d49 100644 --- a/src/aero_kernel/src/drivers/pty.rs +++ b/src/aero_kernel/src/drivers/pty.rs @@ -17,8 +17,7 @@ use core::sync::atomic::{AtomicU32, Ordering}; -use aero_syscall as libc; -use aero_syscall::{Termios, WinSize}; +use aero_syscall::{self as libc, OpenFlags, Termios, WinSize}; use alloc::collections::BTreeMap; use alloc::string::ToString; @@ -128,7 +127,7 @@ impl Master { } impl INodeInterface for Master { - fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result { let mut pty_buffer = self.buffer.lock_irq(); if pty_buffer.is_empty() { @@ -280,7 +279,7 @@ impl INodeInterface for Slave { Ok(flags) } - fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result { Ok(self.master.discipline.read(buffer)?) } diff --git a/src/aero_kernel/src/drivers/tty/ctty.rs b/src/aero_kernel/src/drivers/tty/ctty.rs index 5ad2a3880b2..dfe8345909d 100644 --- a/src/aero_kernel/src/drivers/tty/ctty.rs +++ b/src/aero_kernel/src/drivers/tty/ctty.rs @@ -17,7 +17,7 @@ //! `/dev/tty`: Controlling terminal of the current process. -use aero_syscall::TIOCNOTTY; +use aero_syscall::{OpenFlags, TIOCNOTTY}; use alloc::sync::{Arc, Weak}; use crate::fs::devfs::Device; @@ -64,8 +64,8 @@ impl INodeInterface for Ctty { }) } - fn read_at(&self, offset: usize, buffer: &mut [u8]) -> fs::Result { - Self::controlling_terminal()?.read_at(offset, buffer) + fn read_at(&self, flags: OpenFlags, offset: usize, buffer: &mut [u8]) -> fs::Result { + Self::controlling_terminal()?.read_at(flags, offset, buffer) } fn write_at(&self, offset: usize, buffer: &[u8]) -> fs::Result { diff --git a/src/aero_kernel/src/drivers/tty/vtty.rs b/src/aero_kernel/src/drivers/tty/vtty.rs index 4174cc2ace9..489c7708fbd 100644 --- a/src/aero_kernel/src/drivers/tty/vtty.rs +++ b/src/aero_kernel/src/drivers/tty/vtty.rs @@ -19,6 +19,7 @@ use core::sync::atomic::{AtomicUsize, Ordering}; +use aero_syscall::OpenFlags; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; @@ -246,7 +247,7 @@ impl INodeInterface for Tty { self.connected.fetch_sub(1, Ordering::SeqCst); } - fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result { + fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result { self.block_queue .block_on(&self.stdin, |future| future.is_complete())?; diff --git a/src/aero_kernel/src/fs/devfs.rs b/src/aero_kernel/src/fs/devfs.rs index 39bf4cbde6a..016364ddb20 100644 --- a/src/aero_kernel/src/fs/devfs.rs +++ b/src/aero_kernel/src/fs/devfs.rs @@ -36,7 +36,7 @@ use super::ramfs::RamFs; use super::{FileSystem, FileSystemError, Result, MOUNT_MANAGER}; use aero_syscall::prelude::*; -use aero_syscall::MMapFlags; +use aero_syscall::{MMapFlags, OpenFlags}; lazy_static::lazy_static! { pub static ref DEV_FILESYSTEM: Arc = DevFs::new(); @@ -113,8 +113,8 @@ impl INodeInterface for DevINode { self.0.inode().write_at(offset, buffer) } - fn read_at(&self, offset: usize, buffer: &mut [u8]) -> Result { - self.0.inode().read_at(offset, buffer) + fn read_at(&self, flags: OpenFlags, offset: usize, buffer: &mut [u8]) -> Result { + self.0.inode().read_at(flags, offset, buffer) } fn mmap(&self, offset: usize, size: usize, flags: MMapFlags) -> Result { @@ -178,7 +178,7 @@ impl Device for DevNull { } impl INodeInterface for DevNull { - fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> Result { + fn read_at(&self, _flags: OpenFlags, _offset: usize, _buffer: &mut [u8]) -> Result { Ok(0x00) } @@ -214,7 +214,7 @@ impl Device for DevKmsg { } impl INodeInterface for DevKmsg { - fn read_at(&self, offset: usize, buffer: &mut [u8]) -> Result { + fn read_at(&self, _flags: OpenFlags, offset: usize, buffer: &mut [u8]) -> Result { let buf = logger::get_log_buffer(); let size = core::cmp::min(buffer.len(), buf.len()); @@ -448,7 +448,7 @@ impl Device for DevUrandom { } impl INodeInterface for DevUrandom { - fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> Result { + fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> Result { for (_, b) in buffer.iter_mut().enumerate() { *b = 0; } diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index a919f6d5c6f..ec8a11bd291 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -54,7 +54,12 @@ impl INodeInterface for EventFd { Ok(None) } - fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> super::Result { + fn read_at( + &self, + _flags: OpenFlags, + _offset: usize, + buffer: &mut [u8], + ) -> super::Result { let size = core::mem::size_of::(); assert!(buffer.len() >= size); diff --git a/src/aero_kernel/src/fs/ext2/mod.rs b/src/aero_kernel/src/fs/ext2/mod.rs index d37189b80e0..e4f5fa17f1d 100644 --- a/src/aero_kernel/src/fs/ext2/mod.rs +++ b/src/aero_kernel/src/fs/ext2/mod.rs @@ -21,7 +21,7 @@ mod group_desc; use core::mem::MaybeUninit; use aero_syscall::socket::{MessageFlags, MessageHeader}; -use aero_syscall::{MMapFlags, SyscallError}; +use aero_syscall::{MMapFlags, OpenFlags, SyscallError}; use alloc::boxed::Box; use alloc::string::ToString; use alloc::sync::{Arc, Weak}; @@ -364,7 +364,7 @@ impl CachedAccess for INode { } fn read_direct(&self, offset: usize, dest: PhysFrame) -> Option { - INodeInterface::read_at(self, offset, dest.as_slice_mut()).ok() + INodeInterface::read_at(self, OpenFlags::empty(), offset, dest.as_slice_mut()).ok() } fn write_direct(&self, offset: usize, src: PhysFrame) -> Option { @@ -440,9 +440,14 @@ impl INodeInterface for INode { Ok(self.make_dirent(parent, entry.name(), entry).unwrap()) } - fn read_at(&self, offset: usize, usr_buffer: &mut [u8]) -> super::Result { + fn read_at( + &self, + flags: OpenFlags, + offset: usize, + usr_buffer: &mut [u8], + ) -> super::Result { if let Some(proxy) = self.proxy.as_ref() { - return proxy.read_at(offset, usr_buffer); + return proxy.read_at(flags, offset, usr_buffer); } if !self.metadata()?.is_file() { @@ -596,7 +601,7 @@ impl INodeInterface for INode { private_cp.as_slice_mut().fill(0); let buffer = &mut private_cp.as_slice_mut()[..size]; - self.read_at(offset, buffer)?; + self.read_at(OpenFlags::empty(), offset, buffer)?; Ok(private_cp) } @@ -644,9 +649,14 @@ impl INodeInterface for INode { } } - fn recv(&self, message_hdr: &mut MessageHeader, flags: MessageFlags) -> super::Result { + fn recv( + &self, + fd_flags: OpenFlags, + message_hdr: &mut MessageHeader, + flags: MessageFlags, + ) -> super::Result { if let Some(proxy) = self.proxy.as_ref() { - proxy.recv(message_hdr, flags) + proxy.recv(fd_flags, message_hdr, flags) } else { Err(FileSystemError::NotSupported) } diff --git a/src/aero_kernel/src/fs/file_table.rs b/src/aero_kernel/src/fs/file_table.rs index fe76cf14e38..d8d0c84f9f1 100644 --- a/src/aero_kernel/src/fs/file_table.rs +++ b/src/aero_kernel/src/fs/file_table.rs @@ -81,7 +81,7 @@ impl FileHandle { pub fn read(&self, buffer: &mut [u8]) -> super::Result { let offset = self.offset.load(Ordering::SeqCst); - let new_offset = self.inode.inode().read_at(offset, buffer)?; + let new_offset = self.inode.inode().read_at(self.flags(), offset, buffer)?; self.offset.fetch_add(new_offset, Ordering::SeqCst); Ok(new_offset) diff --git a/src/aero_kernel/src/fs/inode.rs b/src/aero_kernel/src/fs/inode.rs index 930cb3eb3d8..68caab948f4 100644 --- a/src/aero_kernel/src/fs/inode.rs +++ b/src/aero_kernel/src/fs/inode.rs @@ -137,7 +137,7 @@ pub trait INodeInterface: Send + Sync { } /// Read at the provided `offset` to the given `buffer`. - fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> Result { + fn read_at(&self, _flags: OpenFlags, _offset: usize, _buffer: &mut [u8]) -> Result { Err(FileSystemError::NotSupported) } @@ -269,7 +269,12 @@ pub trait INodeInterface: Send + Sync { Err(FileSystemError::NotSupported) } - fn recv(&self, _message_hdr: &mut MessageHeader, _flags: MessageFlags) -> Result { + fn recv( + &self, + _fd_flags: OpenFlags, + _message_hdr: &mut MessageHeader, + _flags: MessageFlags, + ) -> Result { Err(FileSystemError::NotSocket) } diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index be0021f0de7..b47d458a7ee 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -37,8 +37,6 @@ pub struct Pipe { /// The number of writers currently connected to the pipe. num_writers: AtomicUsize, - - handle: Once>, } impl Pipe { @@ -50,8 +48,6 @@ impl Pipe { writers: WaitQueue::new(), num_writers: AtomicUsize::new(0), - - handle: Once::new(), }) } @@ -66,7 +62,6 @@ impl INodeInterface for Pipe { // Write end of the pipe: if handle.flags().contains(OpenFlags::O_WRONLY) { self.num_writers.fetch_add(1, Ordering::SeqCst); - self.handle.call_once(|| handle); } Ok(None) @@ -84,11 +79,8 @@ impl INodeInterface for Pipe { } } - fn read_at(&self, _offset: usize, buf: &mut [u8]) -> super::Result { - let flags = self.handle.get().expect("pipe: internal error").flags(); - - let nonblock = flags.contains(OpenFlags::O_NONBLOCK); - if nonblock && !self.queue.lock_irq().has_data() { + fn read_at(&self, flags: OpenFlags, _offset: usize, buf: &mut [u8]) -> super::Result { + if flags.is_nonblock() && !self.queue.lock_irq().has_data() { return Err(FileSystemError::WouldBlock); } diff --git a/src/aero_kernel/src/fs/procfs.rs b/src/aero_kernel/src/fs/procfs.rs index e20cce54aa4..35d4245e88d 100644 --- a/src/aero_kernel/src/fs/procfs.rs +++ b/src/aero_kernel/src/fs/procfs.rs @@ -17,6 +17,7 @@ use core::sync::atomic::{AtomicUsize, Ordering}; +use aero_syscall::OpenFlags; use alloc::borrow::ToOwned; use alloc::collections::BTreeMap; use alloc::string::ToString; @@ -183,7 +184,7 @@ impl LockedProcINode { } impl INodeInterface for LockedProcINode { - fn read_at(&self, offset: usize, buffer: &mut [u8]) -> fs::Result { + fn read_at(&self, _flags: OpenFlags, offset: usize, buffer: &mut [u8]) -> fs::Result { let this = self.0.read(); let data = match &this.contents { diff --git a/src/aero_kernel/src/fs/ramfs.rs b/src/aero_kernel/src/fs/ramfs.rs index 54d61d777f2..8db73c92cc8 100644 --- a/src/aero_kernel/src/fs/ramfs.rs +++ b/src/aero_kernel/src/fs/ramfs.rs @@ -17,7 +17,7 @@ use core::sync::atomic::{AtomicUsize, Ordering}; -use aero_syscall::MMapFlags; +use aero_syscall::{MMapFlags, OpenFlags}; use alloc::collections::BTreeMap; use alloc::string::ToString; use alloc::sync::{Arc, Weak}; @@ -261,7 +261,7 @@ impl INodeInterface for LockedRamINode { } } - fn read_at(&self, offset: usize, buffer: &mut [u8]) -> Result { + fn read_at(&self, flags: OpenFlags, offset: usize, buffer: &mut [u8]) -> Result { let this = self.0.read(); match &this.contents { @@ -294,10 +294,10 @@ impl INodeInterface for LockedRamINode { let device = device.clone(); drop(this); - device.read_at(offset, buffer) + device.read_at(flags, offset, buffer) } - FileContents::Socket(e) => e.read_at(offset, buffer), + FileContents::Socket(e) => e.read_at(flags, offset, buffer), FileContents::None => Err(FileSystemError::NotSupported), } } diff --git a/src/aero_kernel/src/socket/netlink.rs b/src/aero_kernel/src/socket/netlink.rs index e91d5c3c7ff..2113f5a4dfd 100644 --- a/src/aero_kernel/src/socket/netlink.rs +++ b/src/aero_kernel/src/socket/netlink.rs @@ -27,7 +27,7 @@ use aero_syscall::netlink::{MessageFlags, MessageType, RtAttrType}; use aero_syscall::socket::{self, MessageHeader}; -use aero_syscall::{netlink, AF_INET, AF_NETLINK, AF_UNSPEC}; +use aero_syscall::{netlink, OpenFlags, AF_INET, AF_NETLINK, AF_UNSPEC}; use alloc::sync::Arc; use alloc::vec::Vec; use crabnet::network::Ipv4Addr; @@ -211,7 +211,7 @@ impl INodeInterface for NetLinkSocket { unimplemented!() } - fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> fs::Result { + fn read_at(&self, _flags: OpenFlags, _offset: usize, _buffer: &mut [u8]) -> fs::Result { unimplemented!() } @@ -221,6 +221,7 @@ impl INodeInterface for NetLinkSocket { fn recv( &self, + _fd_flags: OpenFlags, message_hdr: &mut MessageHeader, flags: socket::MessageFlags, ) -> fs::Result { diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index 6b79aa10976..e1c9ba23093 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -27,7 +27,6 @@ use crabnet::data_link::{Eth, EthType, MacAddr}; use crabnet::transport::{Tcp, TcpOptions}; use crabnet_tcp::{Address, Error as TcpError, Packet as TcpPacket, State}; -use crate::fs::file_table::FileHandle; use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags, PollTable}; use crate::fs::{self, FileSystemError}; use crate::net; @@ -59,7 +58,6 @@ impl crabnet_tcp::NetworkDevice for DeviceShim { pub struct TcpSocket { tcp: Mutex>>, wq: WaitQueue, - handle: Once>, sref: Weak, peer: Once, } @@ -70,7 +68,6 @@ impl TcpSocket { tcp: Mutex::new(None), wq: WaitQueue::new(), sref: sref.clone(), - handle: Once::new(), peer: Once::new(), }) } @@ -89,27 +86,20 @@ impl TcpSocket { self.sref.upgrade().unwrap() } - /// Returns whether the socket is in non-blocking mode. - pub fn non_blocking(&self) -> bool { - self.handle - .get() - .is_some_and(|handle| handle.flags().contains(OpenFlags::O_NONBLOCK)) - } - - pub fn do_recv(&self, buf: &mut [u8]) -> Result { + pub fn do_recv(&self, flags: OpenFlags, buf: &mut [u8]) -> Result { let mut tcp = self.tcp.lock_irq(); let socket = tcp.as_mut().ok_or(FileSystemError::NotConnected)?; match socket.recv(buf) { Ok(bytes_read) => Ok(bytes_read), - Err(TcpError::WouldBlock) if self.non_blocking() => Err(FileSystemError::WouldBlock), + Err(TcpError::WouldBlock) if flags.is_nonblock() => Err(FileSystemError::WouldBlock), Err(TcpError::WouldBlock) => { drop(tcp); let mut socket = self.wq.block_on(&self.tcp, |tcp| { tcp.as_ref() - .map_or(true, |socket| !socket.recv_queue.is_empty()) + .is_none_or(|socket| !socket.recv_queue.is_empty()) })?; if let Some(socket) = socket.as_mut() { @@ -162,19 +152,19 @@ impl INodeInterface for TcpSocket { Ok(()) } - fn open(&self, handle: Arc) -> fs::Result> { - self.handle.call_once(|| handle); - Ok(None) - } - #[inline] fn metadata(&self) -> Result { Ok(Metadata::with_file_type(FileType::Socket)) } #[inline] - fn read_at(&self, _offset: usize, buf: &mut [u8]) -> Result { - self.do_recv(buf) + fn read_at( + &self, + flags: OpenFlags, + _offset: usize, + buf: &mut [u8], + ) -> Result { + self.do_recv(flags, buf) } #[inline] @@ -230,13 +220,18 @@ impl INodeInterface for TcpSocket { } } - fn recv(&self, message_hdr: &mut MessageHeader, _flags: MessageFlags) -> fs::Result { + fn recv( + &self, + fd_flags: OpenFlags, + message_hdr: &mut MessageHeader, + _flags: MessageFlags, + ) -> fs::Result { Ok(message_hdr .iovecs_mut() .iter_mut() .map(|iovec| { let iovec = iovec.as_slice_mut(); - self.do_recv(iovec).unwrap() + self.do_recv(fd_flags, iovec).unwrap() }) .sum::()) } diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index 453279e7398..c346255bc94 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -185,7 +185,12 @@ impl INodeInterface for UdpSocket { Ok(data.len()) } - fn recv(&self, message_hdr: &mut MessageHeader, _flags: MessageFlags) -> fs::Result { + fn recv( + &self, + _fd_flags: OpenFlags, + message_hdr: &mut MessageHeader, + _flags: MessageFlags, + ) -> fs::Result { // assert!(flags.is_empty()); if self.inner.lock_irq().incoming.is_empty() && self.is_non_block() { diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index bc243f4f0dc..97e766e1807 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -22,7 +22,6 @@ use aero_syscall::socket::{MessageFlags, MessageHeader}; use alloc::collections::VecDeque; use alloc::sync::{Arc, Weak}; use alloc::vec::Vec; -use spin::Once; use crate::arch::user_copy::UserRef; use crate::fs; @@ -194,7 +193,6 @@ pub struct UnixSocket { buffer: Mutex, wq: WaitQueue, weak: Weak, - handle: Once>, } impl UnixSocket { @@ -205,7 +203,6 @@ impl UnixSocket { buffer: Mutex::new(MessageQueue::default()), wq: WaitQueue::new(), weak: weak.clone(), - handle: Once::new(), }) } @@ -228,14 +225,6 @@ impl UnixSocket { pub fn sref(&self) -> Arc { self.weak.upgrade().unwrap() } - - pub fn is_non_block(&self) -> bool { - self.handle - .get() - .expect("unix: not bound to an fd") - .flags() - .contains(OpenFlags::O_NONBLOCK) - } } impl INodeInterface for UnixSocket { @@ -248,13 +237,13 @@ impl INodeInterface for UnixSocket { }) } - fn open(&self, handle: Arc) -> fs::Result> { - self.handle.call_once(|| handle); - Ok(None) - } - - fn read_at(&self, _offset: usize, user_buffer: &mut [u8]) -> fs::Result { - if self.buffer.lock_irq().is_empty() && self.is_non_block() { + fn read_at( + &self, + flags: OpenFlags, + _offset: usize, + user_buffer: &mut [u8], + ) -> fs::Result { + if self.buffer.lock_irq().is_empty() && flags.is_nonblock() { return Err(FileSystemError::WouldBlock); } @@ -383,7 +372,12 @@ impl INodeInterface for UnixSocket { Ok(sock) } - fn recv(&self, header: &mut MessageHeader, flags: MessageFlags) -> fs::Result { + fn recv( + &self, + fd_flags: OpenFlags, + header: &mut MessageHeader, + flags: MessageFlags, + ) -> fs::Result { // assert!(flags.is_empty()); let inner = self.inner.lock_irq(); @@ -393,7 +387,7 @@ impl INodeInterface for UnixSocket { _ => return Err(FileSystemError::NotConnected), }; - if self.buffer.lock_irq().is_empty() && self.is_non_block() { + if self.buffer.lock_irq().is_empty() && fd_flags.is_nonblock() { return Err(FileSystemError::WouldBlock); } diff --git a/src/aero_kernel/src/syscall/net.rs b/src/aero_kernel/src/syscall/net.rs index aecdd5af984..9f36d796db5 100644 --- a/src/aero_kernel/src/syscall/net.rs +++ b/src/aero_kernel/src/syscall/net.rs @@ -117,7 +117,7 @@ pub fn sock_recv(sockfd: usize, header: &mut MessageHeader, flags: usize) -> Res .get_handle(sockfd) .ok_or(SyscallError::EINVAL)?; - Ok(socket.inode().recv(header, flags)?) + Ok(socket.inode().recv(socket.flags(), header, flags)?) } #[syscall] diff --git a/src/aero_kernel/src/userland/vm.rs b/src/aero_kernel/src/userland/vm.rs index 8251431e557..458c3dc6142 100644 --- a/src/aero_kernel/src/userland/vm.rs +++ b/src/aero_kernel/src/userland/vm.rs @@ -18,7 +18,7 @@ use core::fmt::Write; use core::ops::Range; -use aero_syscall::{MMapFlags, MMapProt}; +use aero_syscall::{MMapFlags, MMapProt, OpenFlags}; use alloc::boxed::Box; use alloc::collections::linked_list::CursorMut; @@ -111,7 +111,7 @@ fn parse_elf_header<'header>(file: &DirCacheItem) -> Result, Elf let pt1_hdr_slice = Box::leak(mem::alloc_boxed_buffer::(ELF_PT1_SIZE)); file.inode() - .read_at(0, pt1_hdr_slice) + .read_at(OpenFlags::empty(), 0, pt1_hdr_slice) .map_err(ElfLoadError::IOError)?; let pt1_header: &'header _ = unsafe { &*pt1_hdr_slice.as_ptr().cast::() }; @@ -127,7 +127,7 @@ fn parse_elf_header<'header>(file: &DirCacheItem) -> Result, Elf let pt2_hdr_slice = Box::leak(mem::alloc_boxed_buffer::(ELF_PT2_64_SIZE)); file.inode() - .read_at(ELF_PT1_SIZE, pt2_hdr_slice) + .read_at(OpenFlags::empty(), ELF_PT1_SIZE, pt2_hdr_slice) .map_err(ElfLoadError::IOError)?; let pt2_header_ptr = pt2_hdr_slice.as_ptr(); @@ -171,7 +171,7 @@ fn parse_program_header<'pheader>( let phdr_buffer = Box::leak(mem::alloc_boxed_buffer::(size)); file.inode() - .read_at(start, phdr_buffer) + .read_at(OpenFlags::empty(), start, phdr_buffer) .map_err(ElfLoadError::IOError)?; let phdr_ptr = phdr_buffer.as_ptr(); @@ -216,7 +216,7 @@ fn contains_shebang(bin: &DirCacheItem) -> Result { let shebang = &mut [0u8; 2]; bin.inode() - .read_at(0, shebang) + .read_at(OpenFlags::empty(), 0, shebang) .map_err(ElfLoadError::IOError)?; Ok(shebang[0] == b'#' && shebang[1] == b'!') @@ -235,7 +235,9 @@ fn parse_shebang(bin: &DirCacheItem) -> Result, ElfLoadError> { let read_at_index = |idx: usize| -> Result { let c = &mut [0u8; 1]; - bin.inode().read_at(idx, c).map_err(ElfLoadError::IOError)?; + bin.inode() + .read_at(OpenFlags::empty(), idx, c) + .map_err(ElfLoadError::IOError)?; Ok(c[0] as char) }; diff --git a/src/aero_kernel/src/utils/mod.rs b/src/aero_kernel/src/utils/mod.rs index e2ce5a60da5..029d1457ee5 100644 --- a/src/aero_kernel/src/utils/mod.rs +++ b/src/aero_kernel/src/utils/mod.rs @@ -231,9 +231,9 @@ macro_rules! extern_sym { static $sym: ::core::ffi::c_void; } - // SAFETY: The value is not accessed, we only take its address. The `addr_of!()` ensures + // The value is not accessed, we only take its address. The `addr_of!()` ensures // that no intermediate references is created. - unsafe { ::core::ptr::addr_of!($sym) } + ::core::ptr::addr_of!($sym) }}; } diff --git a/src/aero_syscall/src/lib.rs b/src/aero_syscall/src/lib.rs index 1c45a870178..03c7132aaf5 100644 --- a/src/aero_syscall/src/lib.rs +++ b/src/aero_syscall/src/lib.rs @@ -96,6 +96,12 @@ bitflags::bitflags! { } } +impl OpenFlags { + pub fn is_nonblock(&self) -> bool { + self.contains(Self::O_NONBLOCK) + } +} + bitflags::bitflags! { pub struct WaitPidFlags: usize { const WNOHANG = 1; From be57ae00e122c5710d449314f828352bbc7164d2 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Mon, 7 Apr 2025 15:50:08 +1000 Subject: [PATCH 368/368] feat(wq): non interruptable and non blocking Signed-off-by: Anhad Singh --- src/aero_kernel/src/drivers/tty/vtty.rs | 13 +- src/aero_kernel/src/fs/eventfd.rs | 9 +- src/aero_kernel/src/fs/pipe.rs | 4 +- src/aero_kernel/src/main.rs | 7 +- src/aero_kernel/src/socket/netlink.rs | 4 +- src/aero_kernel/src/socket/tcp.rs | 7 +- src/aero_kernel/src/socket/udp.rs | 9 +- src/aero_kernel/src/socket/unix.rs | 29 +++-- src/aero_kernel/src/syscall/fs.rs | 11 +- src/aero_kernel/src/syscall/ipc.rs | 6 +- src/aero_kernel/src/userland/task/mod.rs | 8 +- src/aero_kernel/src/userland/terminal.rs | 9 +- src/aero_kernel/src/utils/sync.rs | 150 ++++++++++++++++++++--- 13 files changed, 186 insertions(+), 80 deletions(-) diff --git a/src/aero_kernel/src/drivers/tty/vtty.rs b/src/aero_kernel/src/drivers/tty/vtty.rs index 489c7708fbd..f86eb80de83 100644 --- a/src/aero_kernel/src/drivers/tty/vtty.rs +++ b/src/aero_kernel/src/drivers/tty/vtty.rs @@ -32,7 +32,7 @@ use crate::mem::paging::VirtAddr; use crate::userland::scheduler; use crate::userland::task::Task; use crate::userland::terminal::TerminalDevice; -use crate::utils::sync::{Mutex, WaitQueue}; +use crate::utils::sync::{Mutex, WaitQueue, WaitQueueFlags}; #[cfg(target_arch = "x86_64")] use crate::drivers::keyboard::KeyCode; @@ -247,11 +247,12 @@ impl INodeInterface for Tty { self.connected.fetch_sub(1, Ordering::SeqCst); } - fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result { - self.block_queue - .block_on(&self.stdin, |future| future.is_complete())?; - - let mut stdin = self.stdin.lock_irq(); + fn read_at(&self, flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result { + let mut stdin = self.block_queue.wait( + WaitQueueFlags::from(flags) | WaitQueueFlags::DISABLE_IRQ, + &self.stdin, + |future| future.is_complete(), + )?; // record the back buffer size before swapping stdin.swap_buffer(); diff --git a/src/aero_kernel/src/fs/eventfd.rs b/src/aero_kernel/src/fs/eventfd.rs index ec8a11bd291..46b1fdd0abe 100644 --- a/src/aero_kernel/src/fs/eventfd.rs +++ b/src/aero_kernel/src/fs/eventfd.rs @@ -54,19 +54,14 @@ impl INodeInterface for EventFd { Ok(None) } - fn read_at( - &self, - _flags: OpenFlags, - _offset: usize, - buffer: &mut [u8], - ) -> super::Result { + fn read_at(&self, flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> super::Result { let size = core::mem::size_of::(); assert!(buffer.len() >= size); // SAFETY: We have above verified that it is safe to dereference // the value. let value = unsafe { &mut *(buffer.as_mut_ptr().cast::()) }; - let mut count = self.wq.block_on(&self.count, |e| **e != 0)?; + let mut count = self.wq.wait(flags.into(), &self.count, |e| **e != 0)?; *value = *count; *count = 0; // reset the counter diff --git a/src/aero_kernel/src/fs/pipe.rs b/src/aero_kernel/src/fs/pipe.rs index b47d458a7ee..d55b4b5d3af 100644 --- a/src/aero_kernel/src/fs/pipe.rs +++ b/src/aero_kernel/src/fs/pipe.rs @@ -22,7 +22,7 @@ use alloc::sync::Arc; use spin::Once; use crate::utils::buffer::Buffer; -use crate::utils::sync::{Mutex, WaitQueue}; +use crate::utils::sync::{Mutex, WaitQueue, WaitQueueFlags}; use super::cache::DirCacheItem; use super::file_table::FileHandle; @@ -84,7 +84,7 @@ impl INodeInterface for Pipe { return Err(FileSystemError::WouldBlock); } - let mut buffer = self.readers.block_on(&self.queue, |lock| { + let mut buffer = self.readers.wait(flags.into(), &self.queue, |lock| { lock.has_data() || self.active_writers() == 0 })?; diff --git a/src/aero_kernel/src/main.rs b/src/aero_kernel/src/main.rs index ec917a72daa..4330c930589 100644 --- a/src/aero_kernel/src/main.rs +++ b/src/aero_kernel/src/main.rs @@ -45,7 +45,7 @@ cfg_match, // https://github.com/rust-lang/rust/issues/115585 associated_type_defaults, new_zeroed_alloc, // https://github.com/rust-lang/rust/issues/129396 - sync_unsafe_cell + sync_unsafe_cell, )] // TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"? // `lang_items` => is currently used for the personality function (`rust_eh_personality`). @@ -59,6 +59,7 @@ #![reexport_test_harness_main = "test_main"] #![warn(clippy::needless_pass_by_value)] #![deny(clippy::ptr_as_ptr)] +#![allow(binary_asm_labels)] #[macro_use] extern crate aero_proc; @@ -214,7 +215,7 @@ fn kernel_dbg_thread() { use crate::drivers::uart::{self, LineStatus, COM_1}; use crate::userland::task::TaskId; - use crate::utils::sync::WaitQueue; + use crate::utils::sync::{WaitQueue, WaitQueueFlags}; uart::setup_interrupts(); @@ -229,7 +230,7 @@ fn kernel_dbg_thread() { loop { let mut com_1 = input_wq - .block_on(com_1, |com_1| { + .wait(WaitQueueFlags::empty(), com_1, |com_1| { com_1.line_status().contains(LineStatus::INPUT_FULL) }) .unwrap(); diff --git a/src/aero_kernel/src/socket/netlink.rs b/src/aero_kernel/src/socket/netlink.rs index 2113f5a4dfd..55240f2adbf 100644 --- a/src/aero_kernel/src/socket/netlink.rs +++ b/src/aero_kernel/src/socket/netlink.rs @@ -221,7 +221,7 @@ impl INodeInterface for NetLinkSocket { fn recv( &self, - _fd_flags: OpenFlags, + fd_flags: OpenFlags, message_hdr: &mut MessageHeader, flags: socket::MessageFlags, ) -> fs::Result { @@ -239,7 +239,7 @@ impl INodeInterface for NetLinkSocket { let mut queue = self .recv_wq - .block_on(&self.recv_queue, |queue| !queue.is_empty())?; + .wait(fd_flags.into(), &self.recv_queue, |queue| !queue.is_empty())?; let mut bytes_copied = 0; dbg!(message_hdr.iovecs_mut()); diff --git a/src/aero_kernel/src/socket/tcp.rs b/src/aero_kernel/src/socket/tcp.rs index e1c9ba23093..f135fe7d3fa 100644 --- a/src/aero_kernel/src/socket/tcp.rs +++ b/src/aero_kernel/src/socket/tcp.rs @@ -32,7 +32,7 @@ use crate::fs::{self, FileSystemError}; use crate::net; use crate::net::shim::PacketSend; use crate::net::{tcp, NetworkDevice}; -use crate::utils::sync::{Mutex, WaitQueue}; +use crate::utils::sync::{Mutex, WaitQueue, WaitQueueFlags}; // ./aero.py -- -netdev user,id=mynet0 -device e1000,netdev=mynet0,id=ck_nic0 -object // filter-dump,id=mynet0,netdev=mynet0,file=qemulog.log @@ -97,7 +97,7 @@ impl TcpSocket { Err(TcpError::WouldBlock) => { drop(tcp); - let mut socket = self.wq.block_on(&self.tcp, |tcp| { + let mut socket = self.wq.wait(flags.into(), &self.tcp, |tcp| { tcp.as_ref() .is_none_or(|socket| !socket.recv_queue.is_empty()) })?; @@ -145,7 +145,8 @@ impl INodeInterface for TcpSocket { *tcp = Some(socket); } - let _ = self.wq.block_on(&self.tcp, |x| { + // FIXME: connect() should pass the fd. + let _ = self.wq.wait(WaitQueueFlags::empty(), &self.tcp, |x| { x.as_ref().unwrap().state() == State::Established }); diff --git a/src/aero_kernel/src/socket/udp.rs b/src/aero_kernel/src/socket/udp.rs index c346255bc94..83934c8484c 100644 --- a/src/aero_kernel/src/socket/udp.rs +++ b/src/aero_kernel/src/socket/udp.rs @@ -187,17 +187,16 @@ impl INodeInterface for UdpSocket { fn recv( &self, - _fd_flags: OpenFlags, + fd_flags: OpenFlags, message_hdr: &mut MessageHeader, _flags: MessageFlags, ) -> fs::Result { // assert!(flags.is_empty()); - if self.inner.lock_irq().incoming.is_empty() && self.is_non_block() { - return Err(FileSystemError::WouldBlock); - } + let mut this = self + .wq + .wait(fd_flags.into(), &self.inner, |e| !e.incoming.is_empty())?; - let mut this = self.wq.block_on(&self.inner, |e| !e.incoming.is_empty())?; let packet = this.incoming.pop().expect("recv: someone was greedy"); let mut data = packet.as_slice().to_vec(); diff --git a/src/aero_kernel/src/socket/unix.rs b/src/aero_kernel/src/socket/unix.rs index 97e766e1807..749cfce3e46 100644 --- a/src/aero_kernel/src/socket/unix.rs +++ b/src/aero_kernel/src/socket/unix.rs @@ -32,7 +32,7 @@ use crate::fs::inode::{DirEntry, FileType, INodeInterface, Metadata, PollFlags, use crate::fs::{FileSystemError, Path}; use crate::mem::paging::VirtAddr; -use crate::utils::sync::{Mutex, WaitQueue}; +use crate::utils::sync::{Mutex, WaitQueue, WaitQueueFlags}; use super::SocketAddrRef; @@ -243,14 +243,11 @@ impl INodeInterface for UnixSocket { _offset: usize, user_buffer: &mut [u8], ) -> fs::Result { - if self.buffer.lock_irq().is_empty() && flags.is_nonblock() { - return Err(FileSystemError::WouldBlock); - } - - let mut buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; + let mut buf = self + .wq + .wait(flags.into(), &self.buffer, |e| !e.is_empty())?; - let read = buffer.read(user_buffer); - Ok(read) + Ok(buf.read(user_buffer)) } fn write_at(&self, _offset: usize, buffer: &[u8]) -> fs::Result { @@ -325,12 +322,16 @@ impl INodeInterface for UnixSocket { target.wq.notify_all(); core::mem::drop(itarget); // release the lock - let _ = self.wq.block_on(&self.inner, |e| e.state.is_connected())?; + // FIXME: connect() should pass fd. + let _ = self.wq.wait(WaitQueueFlags::empty(), &self.inner, |e| { + e.state.is_connected() + })?; Ok(()) } fn accept(&self, address: Option<(VirtAddr, &mut u32)>) -> fs::Result> { - let mut inner = self.wq.block_on(&self.inner, |e| { + // TODO: accept + let mut inner = self.wq.wait(WaitQueueFlags::empty(), &self.inner, |e| { e.state.queue().is_some_and(|x| !x.is_empty()) })?; @@ -387,11 +388,9 @@ impl INodeInterface for UnixSocket { _ => return Err(FileSystemError::NotConnected), }; - if self.buffer.lock_irq().is_empty() && fd_flags.is_nonblock() { - return Err(FileSystemError::WouldBlock); - } - - let mut buffer = self.wq.block_on(&self.buffer, |e| !e.is_empty())?; + let mut buffer = self + .wq + .wait(fd_flags.into(), &self.buffer, |e| !e.is_empty())?; if let Some(addr) = header.name_mut::() { *addr = peer.inner.lock_irq().address.as_ref().cloned().unwrap(); diff --git a/src/aero_kernel/src/syscall/fs.rs b/src/aero_kernel/src/syscall/fs.rs index bbd6839389d..415ed0d3d30 100644 --- a/src/aero_kernel/src/syscall/fs.rs +++ b/src/aero_kernel/src/syscall/fs.rs @@ -56,7 +56,6 @@ impl fmt::Display for FileDescriptor { let path = file_handle.inode.absolute_path(); write!(f, "{{ {} -> {} }}", self.0, path) } else { - // invalid file descriptor write!(f, "{{ {} -> INVALID }}", self.0) } } @@ -164,10 +163,7 @@ pub fn getdents(fd: FileDescriptor, buffer: &mut [u8]) -> Result Result { - let res = scheduler::get_scheduler() - .current_task() - .file_table - .close_file(fd.into()); + let res = scheduler::current_thread().file_table.close_file(fd.into()); if res { Ok(0) @@ -218,11 +214,10 @@ pub fn mkdirat(dfd: usize, path: &Path) -> Result { // pathname is interpreted relative to the current working directory of the // calling task. if dfd as isize == aero_syscall::AT_FDCWD { - let cwd = scheduler::get_scheduler().current_task().cwd_dirent(); + let cwd = scheduler::current_thread().cwd_dirent(); (cwd.inode(), path.as_str()) } else { - let handle = scheduler::get_scheduler() - .current_task() + let handle = scheduler::current_thread() .file_table .get_handle(dfd) .ok_or(SyscallError::EBADFD)?; diff --git a/src/aero_kernel/src/syscall/ipc.rs b/src/aero_kernel/src/syscall/ipc.rs index f6471c44bcd..d1bede83519 100644 --- a/src/aero_kernel/src/syscall/ipc.rs +++ b/src/aero_kernel/src/syscall/ipc.rs @@ -18,7 +18,7 @@ use crate::userland::scheduler::get_scheduler; use crate::userland::task::TaskId; -use crate::utils::sync::{Mutex, WaitQueue}; +use crate::utils::sync::{Mutex, WaitQueue, WaitQueueFlags}; use aero_syscall::SyscallError; use alloc::collections::VecDeque; @@ -103,7 +103,9 @@ pub fn recv(pid_ptr: &mut usize, output: &mut [u8], block: usize) -> Result SignalResult { + ) -> Result { let mut captured = None; - self.block.block_on(&self.list, |l| { + self.block.wait(WaitQueueFlags::empty(), &self.list, |l| { let mut cursor = l.front_mut(); while let Some(t) = cursor.get() { @@ -488,7 +488,7 @@ impl Task { pid: isize, status: &mut u32, flags: WaitPidFlags, - ) -> SignalResult { + ) -> Result { if pid == -1 { // wait for any child process if no specific process is requested. // diff --git a/src/aero_kernel/src/userland/terminal.rs b/src/aero_kernel/src/userland/terminal.rs index 5d1313f3a81..7d568d788a3 100644 --- a/src/aero_kernel/src/userland/terminal.rs +++ b/src/aero_kernel/src/userland/terminal.rs @@ -22,8 +22,9 @@ use alloc::vec::Vec; use spin::RwLock; +use crate::fs; use crate::fs::inode::INodeInterface; -use crate::utils::sync::{Mutex, WaitQueue}; +use crate::utils::sync::{Mutex, WaitQueue, WaitQueueFlags}; use super::signals::SignalError; use super::task::sessions::{Group, SESSIONS}; @@ -114,8 +115,10 @@ impl LineDiscipline { *self.termios.lock() = termios; } - pub fn read(&self, target: &mut [u8]) -> Result { - let mut buffer = self.wq.block_on(&self.buffer, |buf| !buf.is_empty())?; + pub fn read(&self, target: &mut [u8]) -> fs::Result { + let mut buffer = self + .wq + .wait(WaitQueueFlags::empty(), &self.buffer, |buf| !buf.is_empty())?; let size = core::cmp::min(target.len(), buffer.len()); target[..size].copy_from_slice(&buffer.drain(..size).collect::>()); diff --git a/src/aero_kernel/src/utils/sync.rs b/src/aero_kernel/src/utils/sync.rs index 9914c885586..8254e338c9d 100644 --- a/src/aero_kernel/src/utils/sync.rs +++ b/src/aero_kernel/src/utils/sync.rs @@ -15,59 +15,163 @@ // You should have received a copy of the GNU General Public License // along with Aero. If not, see . +use aero_syscall::{OpenFlags, SyscallError}; use alloc::sync::Arc; use alloc::vec::Vec; use crate::arch::interrupts; +use crate::fs::FileSystemError; use crate::userland::scheduler; -use crate::userland::signals::SignalResult; +use crate::userland::signals::SignalError; use crate::userland::task::Task; -/// Used to manage and block threads that are waiting for a condition to be true. +bitflags::bitflags! { + #[derive(Debug, Copy, Clone)] + pub struct WaitQueueFlags: u32 { + const DISABLE_IRQ = 1 << 1; + const NON_BLOCK = 1 << 2; + } +} + +impl WaitQueueFlags { + pub const fn is_nonblock(&self) -> bool { + self.contains(WaitQueueFlags::NON_BLOCK) + } +} + +impl From for WaitQueueFlags { + fn from(flags: OpenFlags) -> Self { + let mut result = WaitQueueFlags::empty(); + if flags.contains(OpenFlags::O_NONBLOCK) { + result.insert(WaitQueueFlags::NON_BLOCK); + } + result + } +} + +#[derive(Debug, Copy, Clone)] +pub enum WaitQueueError { + Interrupted, + WouldBlock, +} + +impl From for FileSystemError { + fn from(err: WaitQueueError) -> Self { + match err { + WaitQueueError::Interrupted => FileSystemError::Interrupted, + WaitQueueError::WouldBlock => FileSystemError::WouldBlock, + } + } +} + +impl From for SyscallError { + fn from(err: WaitQueueError) -> Self { + match err { + WaitQueueError::Interrupted => SyscallError::EINTR, + WaitQueueError::WouldBlock => SyscallError::EAGAIN, + } + } +} + +/// Queue of tasks waiting for an event to occur. pub struct WaitQueue { queue: Mutex>>, } impl WaitQueue { - /// Creates a new block queue. + /// Create a new wait queue. pub const fn new() -> Self { Self { queue: Mutex::new(Vec::new()), } } - /// Run a future to completion on the current task. This function will block - /// the caller until the given future has completed. - pub fn block_on<'future, T, F: FnMut(&mut MutexGuard) -> bool>( + fn _wait<'a, T, F>( &self, - mutex: &'future Mutex, - mut future: F, - ) -> SignalResult> { - let mut lock = mutex.lock_irq(); + mutex: &'a Mutex, + mut cond: F, + interruptable: bool, + flags: WaitQueueFlags, + ) -> Result, WaitQueueError> + where + F: FnMut(&mut MutexGuard) -> bool, + { + let acquire = || { + if flags.contains(WaitQueueFlags::DISABLE_IRQ) { + mutex.lock() + } else { + mutex.lock_irq() + } + }; - // Check if the future was already completed. - if future(&mut lock) { + let mut lock = acquire(); + if cond(&mut lock) { + // Condition is already satisfied. return Ok(lock); } + if flags.is_nonblock() { + return Err(WaitQueueError::WouldBlock); + } + let scheduler = scheduler::get_scheduler(); - let task = scheduler.current_task(); + let task = scheduler::current_thread(); - self.queue.lock_irq().push(task.clone()); + // If no IRQs was requested, the above lock would have disabled them so, + // `lock_irq` is not required here. + self.queue.lock().push(task.clone()); - // Wait until the future is completed. - while !future(&mut lock) { - core::mem::drop(lock); // Drop the IRQ lock and await for IO to complete. - scheduler.await_io()?; + while !cond(&mut lock) { + drop(lock); - // Re-acquire the lock. - lock = mutex.lock_irq(); + match scheduler.await_io() { + Ok(()) => lock = mutex.lock_irq(), + Err(SignalError::Interrupted) if !interruptable => lock = acquire(), + + Err(SignalError::Interrupted) => { + self.remove(&task); + return Err(WaitQueueError::Interrupted); + } + } } self.remove(&task); Ok(lock) } + /// Sleeps until a condition is met. + /// + /// Should be used when waiting for events such as completion of disk I/O. Any signals sent + /// while waiting shall not be delivered until the condition is met and the wait is over. + pub fn wait_uninterruptible<'a, T, F>( + &self, + flags: WaitQueueFlags, + mutex: &'a Mutex, + cond: F, + ) -> MutexGuard<'a, T> + where + F: FnMut(&mut MutexGuard) -> bool, + { + unsafe { + self._wait(mutex, cond, false, flags) + // SAFETY: [`SignalError`] cannot occur on non-interruptible wait. + .unwrap_unchecked() + } + } + + /// Sleeps until a condition is met. + /// + /// Should be used when waiting for events such as data being written to a pipe. Returns + /// [`SignalError::Interrupted`] if the wait was interrupted by a signal. + pub fn wait<'a, T, F: FnMut(&mut MutexGuard) -> bool>( + &self, + flags: WaitQueueFlags, + mutex: &'a Mutex, + cond: F, + ) -> Result, WaitQueueError> { + self._wait(mutex, cond, true, flags) + } + pub fn insert(&self, task: Arc) { self.queue.lock_irq().push(task); } @@ -113,6 +217,12 @@ impl WaitQueue { } } +impl Default for WaitQueue { + fn default() -> Self { + Self::new() + } +} + /// Helper guard structure used to lock interrupts. When dropped, interrupts /// are enabled again. This is useful for volatile operations where we don't /// want to be interrupted.

Ty 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 G(3eS(&2kft)@LFosw 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

Running DWM, mesa-demos and Alacritty in Aero!

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