From 733c129868322719788b350132d9ab7d9ebdf6e4 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jackpot51@gmail.com> Date: Tue, 22 Feb 2022 10:41:14 -0700 Subject: [PATCH] Use redoxfs 0.5.0 branch --- Cargo.lock | 83 +++++++++++++++++++++++++++-- Cargo.toml | 2 +- asm/x86-unknown-none/bootloader.asm | 4 +- src/main.rs | 31 +++++------ src/os/bios/disk.rs | 4 +- src/os/bios/mod.rs | 2 +- src/os/uefi/disk.rs | 4 +- src/os/uefi/mod.rs | 2 +- 8 files changed, 103 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6cb11f4..c88915a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,18 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "opaque-debug", +] + [[package]] name = "bit_field" version = "0.10.1" @@ -20,11 +32,39 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "libc" -version = "0.2.118" +version = "0.2.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e509672465a0504304aa87f9f176f2b2b716ed8fb105ebe5c02dc6dce96a94" +checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" [[package]] name = "linked_list_allocator" @@ -53,6 +93,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "raw-cpuid" version = "10.2.0" @@ -112,12 +158,16 @@ dependencies = [ [[package]] name = "redoxfs" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcc31de09215010802574e370fce8534be7f3453ca76c4369e527b6924dafaa" +version = "0.5.0" +source = "git+https://gitlab.redox-os.org/redox-os/redoxfs.git?branch=0.5.0#1ca00b6dd684bd21880dbaac7ede4e5c133ba5e3" dependencies = [ + "aes", + "generic-array", "libc", + "log", "redox_syscall", + "seahash", + "simple_endian", "uuid", ] @@ -127,6 +177,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "simple_endian" +version = "0.2.1" +source = "git+https://github.com/michalfita/simple-endian-rs.git?rev=7210f40881d16f7f2e3d8d40f6381fa222843caa#7210f40881d16f7f2e3d8d40f6381fa222843caa" + [[package]] name = "spin" version = "0.9.2" @@ -145,12 +206,24 @@ dependencies = [ "lock_api", ] +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + [[package]] name = "uuid" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcc7e3b898aa6f6c08e5295b6c89258d1331e9ac578cc992fb818759951bdc22" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "x86" version = "0.43.0" diff --git a/Cargo.toml b/Cargo.toml index fae7668..69bdd6c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ crate-type = ["staticlib"] linked_list_allocator = "0.9.1" log = "0.4.14" redox_syscall = "0.2.10" -redoxfs = { version = "0.4.4", default-features = false } +redoxfs = { git = "https://gitlab.redox-os.org/redox-os/redoxfs.git", branch = "0.5.0", default-features = false } spin = "0.9.2" [target.'cfg(target_os = "uefi")'.dependencies] diff --git a/asm/x86-unknown-none/bootloader.asm b/asm/x86-unknown-none/bootloader.asm index d616e55..45a9460 100644 --- a/asm/x86-unknown-none/bootloader.asm +++ b/asm/x86-unknown-none/bootloader.asm @@ -17,5 +17,5 @@ stage3: align 512, db 0 .end: -; the maximum size of the boot loader portion is 128 KiB -times 131072-($-$$) db 0 +; the maximum size of the boot loader portion is 256 KiB +times 262144-($-$$) db 0 diff --git a/src/main.rs b/src/main.rs index 94b6386..00ab2eb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -239,14 +239,14 @@ fn main< let mut fs = os.filesystem(); print!("RedoxFS "); - for i in 0..fs.header.1.uuid.len() { + for i in 0..fs.header.uuid().len() { if i == 4 || i == 6 || i == 8 || i == 10 { print!("-"); } - print!("{:>02x}", fs.header.1.uuid[i]); + print!("{:>02x}", fs.header.uuid()[i]); } - println!(": {} MiB", fs.header.1.size / MIBI as u64); + println!(": {} MiB", fs.header.size() / MIBI as u64); let mode_opt = select_mode(os); @@ -256,12 +256,11 @@ fn main< panic!("Failed to allocate memory for stack"); } - let kernel = { - let node = fs.find_node("kernel", fs.header.1.root) + let kernel = fs.tx(|tx| { + let node = tx.find_node(redoxfs::TreePtr::root(), "kernel") .expect("Failed to find kernel file"); - let size = fs.node_len(node.0) - .expect("Failed to read kernel size"); + let size = node.data().size(); print!("Kernel: 0/{} MiB", size / MIBI as u64); @@ -277,7 +276,7 @@ fn main< let mut i = 0; for chunk in kernel.chunks_mut(MIBI) { print!("\rKernel: {}/{} MiB", i / MIBI as u64, size / MIBI as u64); - i += fs.read_node(node.0, i, chunk, 0, 0) + i += tx.read_node_inner(&node, i, chunk) .expect("Failed to read kernel file") as u64; } println!("\rKernel: {}/{} MiB", i / MIBI as u64, size / MIBI as u64); @@ -287,15 +286,15 @@ fn main< panic!("Kernel has invalid magic number {:#X?}", magic); } - kernel - }; + Ok(kernel) + }).expect("RedoxFS transaction failed"); let page_phys = unsafe { paging_create(os, kernel.as_ptr() as usize, kernel.len()) } .expect("Failed to set up paging"); //TODO: properly reserve page table allocations so kernel does not re-use them let live_opt = if cfg!(feature = "live") { - let size = fs.header.1.size; + let size = fs.header.size(); print!("Live: 0/{} MiB", size / MIBI as u64); @@ -311,8 +310,10 @@ fn main< let mut i = 0; for chunk in live.chunks_mut(MIBI) { print!("\rLive: {}/{} MiB", i / MIBI as u64, size / MIBI as u64); - i += fs.disk.read_at(fs.block + i / redoxfs::BLOCK_SIZE, chunk) - .expect("Failed to read live disk") as u64; + i += unsafe { + fs.disk.read_at(fs.block + i / redoxfs::BLOCK_SIZE, chunk) + .expect("Failed to read live disk") as u64 + }; } println!("\rLive: {}/{} MiB", i / MIBI as u64, size / MIBI as u64); @@ -344,12 +345,12 @@ fn main< writeln!(w, "REDOXFS_BLOCK={:016x}", fs.block).unwrap(); } write!(w, "REDOXFS_UUID=").unwrap(); - for i in 0..fs.header.1.uuid.len() { + for i in 0..fs.header.uuid().len() { if i == 4 || i == 6 || i == 8 || i == 10 { write!(w, "-").unwrap(); } - write!(w, "{:>02x}", fs.header.1.uuid[i]).unwrap(); + write!(w, "{:>02x}", fs.header.uuid()[i]).unwrap(); } writeln!(w).unwrap(); diff --git a/src/os/bios/disk.rs b/src/os/bios/disk.rs index a6dc3f9..add79bb 100644 --- a/src/os/bios/disk.rs +++ b/src/os/bios/disk.rs @@ -42,7 +42,7 @@ impl DiskBios { } impl Disk for DiskBios { - fn read_at(&mut self, block: u64, buffer: &mut [u8]) -> Result<usize> { + unsafe fn read_at(&mut self, block: u64, buffer: &mut [u8]) -> Result<usize> { for (i, chunk) in buffer.chunks_mut(BLOCK_SIZE as usize).enumerate() { unsafe { let mut dap = DiskAddressPacket::from_block(block + i as u64); @@ -68,7 +68,7 @@ impl Disk for DiskBios { Ok(buffer.len()) } - fn write_at(&mut self, block: u64, buffer: &[u8]) -> Result<usize> { + unsafe fn write_at(&mut self, block: u64, buffer: &[u8]) -> Result<usize> { log::error!( "DiskBios::write_at(0x{:X}, 0x{:X}:0x{:X}) not allowed", block, diff --git a/src/os/bios/mod.rs b/src/os/bios/mod.rs index a0e2146..40902f6 100644 --- a/src/os/bios/mod.rs +++ b/src/os/bios/mod.rs @@ -90,7 +90,7 @@ impl Os< //TODO: get block from partition table let block = crate::MIBI as u64 / redoxfs::BLOCK_SIZE; - redoxfs::FileSystem::open(disk, Some(block)) + redoxfs::FileSystem::open(disk, Some(block), false) .expect("Failed to open RedoxFS") } diff --git a/src/os/uefi/disk.rs b/src/os/uefi/disk.rs index 2e58d03..5a52355 100644 --- a/src/os/uefi/disk.rs +++ b/src/os/uefi/disk.rs @@ -18,7 +18,7 @@ impl Protocol<UefiBlockIo> for DiskEfi { } impl Disk for DiskEfi { - fn read_at(&mut self, block: u64, buffer: &mut [u8]) -> Result<usize> { + unsafe fn read_at(&mut self, block: u64, buffer: &mut [u8]) -> Result<usize> { let block_size = self.0.Media.BlockSize as u64; let lba = block * BLOCK_SIZE / block_size; @@ -32,7 +32,7 @@ impl Disk for DiskEfi { } } - fn write_at(&mut self, block: u64, _buffer: &[u8]) -> Result<usize> { + unsafe fn write_at(&mut self, block: u64, _buffer: &[u8]) -> Result<usize> { println!("DiskEfi::write_at 0x{:X} not implemented", block); Err(Error::new(EIO)) } diff --git a/src/os/uefi/mod.rs b/src/os/uefi/mod.rs index 0e8179e..c1d2283 100644 --- a/src/os/uefi/mod.rs +++ b/src/os/uefi/mod.rs @@ -88,7 +88,7 @@ impl Os< continue; } - match redoxfs::FileSystem::open(block_io, Some(0)) { + match redoxfs::FileSystem::open(block_io, Some(0), false) { Ok(ok) => return ok, Err(err) => match err.errno { // Ignore header not found error -- GitLab