Allow compiling both livedisk and harddrive
This commit is contained in:
parent
98d6be210f
commit
41811ad98d
|
@ -26,6 +26,10 @@ arch_arm = { path = "arch/arm" }
|
||||||
[target.'cfg(target_arch = "x86_64")'.dependencies]
|
[target.'cfg(target_arch = "x86_64")'.dependencies]
|
||||||
arch_x86_64 = { path = "arch/x86_64" }
|
arch_x86_64 = { path = "arch/x86_64" }
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = []
|
||||||
|
live = []
|
||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
panic = "unwind"
|
panic = "unwind"
|
||||||
|
|
||||||
|
|
116
Makefile
116
Makefile
|
@ -19,9 +19,11 @@ CARGO=RUSTC="$(RUSTC)" RUSTDOC="$(RUSTDOC)" cargo
|
||||||
CARGOFLAGS=--target $(TARGET).json --release --
|
CARGOFLAGS=--target $(TARGET).json --release --
|
||||||
|
|
||||||
# Default targets
|
# Default targets
|
||||||
.PHONY: all clean doc ref test update qemu bochs drivers schemes binutils coreutils extrautils netutils userutils wireshark FORCE
|
.PHONY: all live clean doc ref test update qemu bochs drivers schemes binutils coreutils extrautils netutils userutils wireshark FORCE
|
||||||
|
|
||||||
all: $(KBUILD)/harddrive.bin
|
all: build/harddrive.bin
|
||||||
|
|
||||||
|
live: build/livedisk.bin
|
||||||
|
|
||||||
FORCE:
|
FORCE:
|
||||||
|
|
||||||
|
@ -56,7 +58,7 @@ clean:
|
||||||
cargo clean --manifest-path schemes/redoxfs/Cargo.toml
|
cargo clean --manifest-path schemes/redoxfs/Cargo.toml
|
||||||
cargo clean --manifest-path schemes/tcpd/Cargo.toml
|
cargo clean --manifest-path schemes/tcpd/Cargo.toml
|
||||||
cargo clean --manifest-path schemes/udpd/Cargo.toml
|
cargo clean --manifest-path schemes/udpd/Cargo.toml
|
||||||
-$(FUMOUNT) $(BUILD)/filesystem/
|
-$(FUMOUNT) build/filesystem/
|
||||||
rm -rf initfs/bin
|
rm -rf initfs/bin
|
||||||
rm -rf filesystem/bin
|
rm -rf filesystem/bin
|
||||||
rm -rf build
|
rm -rf build
|
||||||
|
@ -155,10 +157,10 @@ ifeq ($(ARCH),arm)
|
||||||
%.list: %
|
%.list: %
|
||||||
$(ARCH)-none-eabi-objdump -C -D $< > $@
|
$(ARCH)-none-eabi-objdump -C -D $< > $@
|
||||||
|
|
||||||
$(KBUILD)/harddrive.bin: $(KBUILD)/kernel
|
build/harddrive.bin: $(KBUILD)/kernel
|
||||||
cp $< $@
|
cp $< $@
|
||||||
|
|
||||||
qemu: $(KBUILD)/harddrive.bin
|
qemu: build/harddrive.bin
|
||||||
$(QEMU) $(QEMUFLAGS) -kernel $<
|
$(QEMU) $(QEMUFLAGS) -kernel $<
|
||||||
else
|
else
|
||||||
QEMUFLAGS+=-smp 4 -m 1024
|
QEMUFLAGS+=-smp 4 -m 1024
|
||||||
|
@ -170,16 +172,11 @@ else
|
||||||
ifeq ($(net),no)
|
ifeq ($(net),no)
|
||||||
QEMUFLAGS+=-net none
|
QEMUFLAGS+=-net none
|
||||||
else
|
else
|
||||||
QEMUFLAGS+=-net nic,model=e1000 -net user -net dump,file=$(KBUILD)/network.pcap
|
QEMUFLAGS+=-net nic,model=e1000 -net user -net dump,file=build/network.pcap
|
||||||
ifeq ($(net),redir)
|
ifeq ($(net),redir)
|
||||||
QEMUFLAGS+=-redir tcp:8080::8080
|
QEMUFLAGS+=-redir tcp:8080::8080
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(storage),usb)
|
|
||||||
QEMUFLAGS+=-device usb-ehci,id=flash_bus -drive id=flash_drive,file=$(KBUILD)/harddrive.bin,format=raw,if=none -device usb-storage,drive=flash_drive,bus=flash_bus.0
|
|
||||||
else
|
|
||||||
QEMUFLAGS+=-drive file=$(KBUILD)/harddrive.bin,format=raw
|
|
||||||
endif
|
|
||||||
ifeq ($(vga),no)
|
ifeq ($(vga),no)
|
||||||
QEMUFLAGS+=-nographic -vga none
|
QEMUFLAGS+=-nographic -vga none
|
||||||
endif
|
endif
|
||||||
|
@ -217,20 +214,30 @@ else
|
||||||
%.list: %
|
%.list: %
|
||||||
objdump -C -M intel -D $< > $@
|
objdump -C -M intel -D $< > $@
|
||||||
|
|
||||||
$(KBUILD)/harddrive.bin: $(KBUILD)/kernel bootloader/$(ARCH)/** $(BUILD)/filesystem.bin
|
build/harddrive.bin: $(KBUILD)/kernel bootloader/$(ARCH)/** build/filesystem.bin
|
||||||
nasm -f bin -o $@ -D ARCH_$(ARCH) -ibootloader/$(ARCH)/ bootloader/$(ARCH)/harddrive.asm
|
nasm -f bin -o $@ -D ARCH_$(ARCH) -ibootloader/$(ARCH)/ bootloader/$(ARCH)/harddrive.asm
|
||||||
|
|
||||||
qemu: $(KBUILD)/harddrive.bin
|
build/livedisk.bin: $(KBUILD)/kernel_live bootloader/$(ARCH)/**
|
||||||
$(QEMU) $(QEMUFLAGS)
|
nasm -f bin -o $@ -D ARCH_$(ARCH) -ibootloader/$(ARCH)/ bootloader/$(ARCH)/livedisk.asm
|
||||||
|
|
||||||
|
qemu: build/harddrive.bin
|
||||||
|
$(QEMU) $(QEMUFLAGS) -drive file=$<,format=raw
|
||||||
|
|
||||||
qemu_no_build:
|
qemu_no_build:
|
||||||
$(QEMU) $(QEMUFLAGS)
|
$(QEMU) $(QEMUFLAGS) -drive file=build/harddrive.bin,format=raw
|
||||||
|
|
||||||
|
qemu_live: build/livedisk.bin
|
||||||
|
$(QEMU) $(QEMUFLAGS) -device usb-ehci,id=flash_bus -drive id=flash_drive,file=$<,format=raw,if=none -device usb-storage,drive=flash_drive,bus=flash_bus.0
|
||||||
|
|
||||||
|
qemu_live_no_build:
|
||||||
|
$(QEMU) $(QEMUFLAGS) -device usb-ehci,id=flash_bus -drive id=flash_drive,file=build/livedisk.bin,format=raw,if=none -device usb-storage,drive=flash_drive,bus=flash_bus.0
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
bochs: $(KBUILD)/harddrive.bin
|
bochs: build/harddrive.bin
|
||||||
bochs -f bochs.$(ARCH)
|
bochs -f bochs.$(ARCH)
|
||||||
|
|
||||||
virtualbox: $(KBUILD)/harddrive.bin
|
virtualbox: build/harddrive.bin
|
||||||
echo "Delete VM"
|
echo "Delete VM"
|
||||||
-$(VBM) unregistervm Redox --delete; \
|
-$(VBM) unregistervm Redox --delete; \
|
||||||
if [ $$? -ne 0 ]; \
|
if [ $$? -ne 0 ]; \
|
||||||
|
@ -252,19 +259,19 @@ virtualbox: $(KBUILD)/harddrive.bin
|
||||||
$(VBM) modifyvm Redox --nictype1 82540EM
|
$(VBM) modifyvm Redox --nictype1 82540EM
|
||||||
$(VBM) modifyvm Redox --cableconnected1 on
|
$(VBM) modifyvm Redox --cableconnected1 on
|
||||||
$(VBM) modifyvm Redox --nictrace1 on
|
$(VBM) modifyvm Redox --nictrace1 on
|
||||||
$(VBM) modifyvm Redox --nictracefile1 $(KBUILD)/network.pcap
|
$(VBM) modifyvm Redox --nictracefile1 build/network.pcap
|
||||||
$(VBM) modifyvm Redox --uart1 0x3F8 4
|
$(VBM) modifyvm Redox --uart1 0x3F8 4
|
||||||
$(VBM) modifyvm Redox --uartmode1 file $(KBUILD)/serial.log
|
$(VBM) modifyvm Redox --uartmode1 file build/serial.log
|
||||||
$(VBM) modifyvm Redox --usb off # on
|
$(VBM) modifyvm Redox --usb off # on
|
||||||
$(VBM) modifyvm Redox --keyboard ps2
|
$(VBM) modifyvm Redox --keyboard ps2
|
||||||
$(VBM) modifyvm Redox --mouse ps2
|
$(VBM) modifyvm Redox --mouse ps2
|
||||||
$(VBM) modifyvm Redox --audio $(VB_AUDIO)
|
$(VBM) modifyvm Redox --audio $(VB_AUDIO)
|
||||||
$(VBM) modifyvm Redox --audiocontroller ac97
|
$(VBM) modifyvm Redox --audiocontroller ac97
|
||||||
echo "Create Disk"
|
echo "Create Disk"
|
||||||
$(VBM) convertfromraw $< $(KBUILD)/harddrive.vdi
|
$(VBM) convertfromraw $< build/harddrive.vdi
|
||||||
echo "Attach Disk"
|
echo "Attach Disk"
|
||||||
$(VBM) storagectl Redox --name ATA --add sata --controller IntelAHCI --bootable on --portcount 1
|
$(VBM) storagectl Redox --name ATA --add sata --controller IntelAHCI --bootable on --portcount 1
|
||||||
$(VBM) storageattach Redox --storagectl ATA --port 0 --device 0 --type hdd --medium $(KBUILD)/harddrive.vdi
|
$(VBM) storageattach Redox --storagectl ATA --port 0 --device 0 --type hdd --medium build/harddrive.vdi
|
||||||
echo "Run VM"
|
echo "Run VM"
|
||||||
$(VBM) startvm Redox
|
$(VBM) startvm Redox
|
||||||
|
|
||||||
|
@ -288,9 +295,15 @@ $(KBUILD)/libcollections.rlib: rust/src/libcollections/lib.rs $(KBUILD)/libcore.
|
||||||
$(KBUILD)/libkernel.a: kernel/** $(KBUILD)/libcore.rlib $(KBUILD)/liballoc.rlib $(KBUILD)/libcollections.rlib $(BUILD)/initfs.rs
|
$(KBUILD)/libkernel.a: kernel/** $(KBUILD)/libcore.rlib $(KBUILD)/liballoc.rlib $(KBUILD)/libcollections.rlib $(BUILD)/initfs.rs
|
||||||
$(KCARGO) rustc $(KCARGOFLAGS) -C lto -o $@
|
$(KCARGO) rustc $(KCARGOFLAGS) -C lto -o $@
|
||||||
|
|
||||||
|
$(KBUILD)/libkernel_live.a: kernel/** $(KBUILD)/libcore.rlib $(KBUILD)/liballoc.rlib $(KBUILD)/libcollections.rlib $(BUILD)/initfs.rs build/filesystem.bin
|
||||||
|
$(KCARGO) rustc --lib $(KCARGOFLAGS) --cfg 'feature="live"' -C lto --emit obj=$@
|
||||||
|
|
||||||
$(KBUILD)/kernel: $(KBUILD)/libkernel.a
|
$(KBUILD)/kernel: $(KBUILD)/libkernel.a
|
||||||
$(LD) $(LDFLAGS) -z max-page-size=0x1000 -T arch/$(ARCH)/src/linker.ld -o $@ $<
|
$(LD) $(LDFLAGS) -z max-page-size=0x1000 -T arch/$(ARCH)/src/linker.ld -o $@ $<
|
||||||
|
|
||||||
|
$(KBUILD)/kernel_live: $(KBUILD)/libkernel_live.a
|
||||||
|
$(LD) $(LDFLAGS) -z max-page-size=0x1000 -T arch/$(ARCH)/src/linker.ld -o $@ $<
|
||||||
|
|
||||||
# Userspace recipes
|
# Userspace recipes
|
||||||
$(BUILD)/libcore.rlib: rust/src/libcore/lib.rs
|
$(BUILD)/libcore.rlib: rust/src/libcore/lib.rs
|
||||||
mkdir -p $(BUILD)
|
mkdir -p $(BUILD)
|
||||||
|
@ -337,11 +350,7 @@ initfs/bin/%: schemes/%/Cargo.toml schemes/%/src/** $(BUILD)/libstd.rlib
|
||||||
strip $@
|
strip $@
|
||||||
rm $@.d
|
rm $@.d
|
||||||
|
|
||||||
initfs/filesystem.bin: $(BUILD)/filesystem.bin
|
|
||||||
cp $< $@
|
|
||||||
|
|
||||||
$(BUILD)/initfs.rs: \
|
$(BUILD)/initfs.rs: \
|
||||||
initfs/filesystem.bin \
|
|
||||||
initfs/bin/init \
|
initfs/bin/init \
|
||||||
initfs/bin/ahcid \
|
initfs/bin/ahcid \
|
||||||
initfs/bin/pcid \
|
initfs/bin/pcid \
|
||||||
|
@ -413,7 +422,6 @@ filesystem/bin/%: programs/pkgutils/Cargo.toml programs/pkgutils/src/%/**.rs $(B
|
||||||
strip $@
|
strip $@
|
||||||
rm $@.d
|
rm $@.d
|
||||||
|
|
||||||
|
|
||||||
filesystem/bin/%: programs/userutils/Cargo.toml programs/userutils/src/bin/%.rs $(BUILD)/libstd.rlib
|
filesystem/bin/%: programs/userutils/Cargo.toml programs/userutils/src/bin/%.rs $(BUILD)/libstd.rlib
|
||||||
mkdir -p filesystem/bin
|
mkdir -p filesystem/bin
|
||||||
$(CARGO) rustc --manifest-path $< --bin $* $(CARGOFLAGS) -o $@
|
$(CARGO) rustc --manifest-path $< --bin $* $(CARGOFLAGS) -o $@
|
||||||
|
@ -527,7 +535,7 @@ schemes: \
|
||||||
filesystem/bin/tcpd \
|
filesystem/bin/tcpd \
|
||||||
filesystem/bin/udpd
|
filesystem/bin/udpd
|
||||||
|
|
||||||
$(BUILD)/filesystem.bin: \
|
build/filesystem.bin: \
|
||||||
drivers \
|
drivers \
|
||||||
coreutils \
|
coreutils \
|
||||||
extrautils \
|
extrautils \
|
||||||
|
@ -542,45 +550,45 @@ $(BUILD)/filesystem.bin: \
|
||||||
filesystem/bin/sh \
|
filesystem/bin/sh \
|
||||||
filesystem/bin/smith \
|
filesystem/bin/smith \
|
||||||
filesystem/bin/tar
|
filesystem/bin/tar
|
||||||
-$(FUMOUNT) $(BUILD)/filesystem/
|
-$(FUMOUNT) build/filesystem/
|
||||||
rm -rf $@ $(BUILD)/filesystem/
|
rm -rf $@ build/filesystem/
|
||||||
echo exit | cargo run --manifest-path schemes/redoxfs/Cargo.toml --bin redoxfs-utility $@ 64
|
echo exit | cargo run --manifest-path schemes/redoxfs/Cargo.toml --bin redoxfs-utility $@ 64
|
||||||
mkdir -p $(BUILD)/filesystem/
|
mkdir -p build/filesystem/
|
||||||
cargo build --manifest-path schemes/redoxfs/Cargo.toml --bin redoxfs-fuse --release
|
cargo build --manifest-path schemes/redoxfs/Cargo.toml --bin redoxfs-fuse --release
|
||||||
schemes/redoxfs/target/release/redoxfs-fuse $@ $(BUILD)/filesystem/ &
|
schemes/redoxfs/target/release/redoxfs-fuse $@ build/filesystem/ &
|
||||||
sleep 2
|
sleep 2
|
||||||
pgrep redoxfs-fuse
|
pgrep redoxfs-fuse
|
||||||
cp -RL filesystem/* $(BUILD)/filesystem/
|
cp -RL filesystem/* build/filesystem/
|
||||||
chown -R 0:0 $(BUILD)/filesystem
|
chown -R 0:0 build/filesystem
|
||||||
chown -R 1000:1000 $(BUILD)/filesystem/home/user
|
chown -R 1000:1000 build/filesystem/home/user
|
||||||
chmod -R uog+rX $(BUILD)/filesystem
|
chmod -R uog+rX build/filesystem
|
||||||
chmod -R u+w $(BUILD)/filesystem
|
chmod -R u+w build/filesystem
|
||||||
chmod -R og-w $(BUILD)/filesystem
|
chmod -R og-w build/filesystem
|
||||||
chmod -R 755 $(BUILD)/filesystem/bin
|
chmod -R 755 build/filesystem/bin
|
||||||
chmod -R u+rwX $(BUILD)/filesystem/root
|
chmod -R u+rwX build/filesystem/root
|
||||||
chmod -R og-rwx $(BUILD)/filesystem/root
|
chmod -R og-rwx build/filesystem/root
|
||||||
chmod -R u+rwX $(BUILD)/filesystem/home/user
|
chmod -R u+rwX build/filesystem/home/user
|
||||||
chmod -R og-rwx $(BUILD)/filesystem/home/user
|
chmod -R og-rwx build/filesystem/home/user
|
||||||
chmod +s $(BUILD)/filesystem/bin/passwd
|
chmod +s build/filesystem/bin/passwd
|
||||||
chmod +s $(BUILD)/filesystem/bin/su
|
chmod +s build/filesystem/bin/su
|
||||||
chmod +s $(BUILD)/filesystem/bin/sudo
|
chmod +s build/filesystem/bin/sudo
|
||||||
mkdir $(BUILD)/filesystem/tmp
|
mkdir build/filesystem/tmp
|
||||||
chmod 1777 $(BUILD)/filesystem/tmp
|
chmod 1777 build/filesystem/tmp
|
||||||
sync
|
sync
|
||||||
-$(FUMOUNT) $(BUILD)/filesystem/
|
-$(FUMOUNT) build/filesystem/
|
||||||
rm -rf $(BUILD)/filesystem/
|
rm -rf build/filesystem/
|
||||||
|
|
||||||
mount: FORCE
|
mount: FORCE
|
||||||
mkdir -p $(BUILD)/filesystem/
|
mkdir -p build/filesystem/
|
||||||
cargo build --manifest-path schemes/redoxfs/Cargo.toml --bin redoxfs-fuse --release
|
cargo build --manifest-path schemes/redoxfs/Cargo.toml --bin redoxfs-fuse --release
|
||||||
schemes/redoxfs/target/release/redoxfs-fuse $(KBUILD)/harddrive.bin $(BUILD)/filesystem/ &
|
schemes/redoxfs/target/release/redoxfs-fuse build/harddrive.bin build/filesystem/ &
|
||||||
sleep 2
|
sleep 2
|
||||||
pgrep redoxfs-fuse
|
pgrep redoxfs-fuse
|
||||||
|
|
||||||
unmount: FORCE
|
unmount: FORCE
|
||||||
sync
|
sync
|
||||||
-$(FUMOUNT) $(BUILD)/filesystem/
|
-$(FUMOUNT) build/filesystem/
|
||||||
rm -rf $(BUILD)/filesystem/
|
rm -rf build/filesystem/
|
||||||
|
|
||||||
wireshark: FORCE
|
wireshark: FORCE
|
||||||
wireshark $(KBUILD)/network.pcap
|
wireshark build/network.pcap
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
ata0-master: type=disk, path="build/kernel/harddrive.bin", mode=flat
|
ata0-master: type=disk, path="build/harddrive.bin", mode=flat
|
||||||
boot: disk
|
boot: disk
|
||||||
com1: enabled=1, mode=file, dev=build/kernel/serial.log
|
com1: enabled=1, mode=file, dev=build/serial.log
|
||||||
megs: 1024
|
megs: 1024
|
||||||
|
|
||||||
magic_break: enabled=1
|
magic_break: enabled=1
|
||||||
|
|
|
@ -18,4 +18,4 @@ kernel_file:
|
||||||
.length equ kernel_file.end - kernel_file
|
.length equ kernel_file.end - kernel_file
|
||||||
.length_sectors equ .length / 512
|
.length_sectors equ .length / 512
|
||||||
|
|
||||||
;incbin "build/userspace/filesystem.bin"
|
incbin "build/filesystem.bin"
|
||||||
|
|
19
bootloader/x86_64/livedisk.asm
Normal file
19
bootloader/x86_64/livedisk.asm
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
%include "bootsector.asm"
|
||||||
|
|
||||||
|
startup_start:
|
||||||
|
%ifdef ARCH_i386
|
||||||
|
%include "startup-i386.asm"
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%ifdef ARCH_x86_64
|
||||||
|
%include "startup-x86_64.asm"
|
||||||
|
%endif
|
||||||
|
align 512, db 0
|
||||||
|
startup_end:
|
||||||
|
|
||||||
|
kernel_file:
|
||||||
|
incbin "build/kernel/kernel_live"
|
||||||
|
align 512, db 0
|
||||||
|
.end:
|
||||||
|
.length equ kernel_file.end - kernel_file
|
||||||
|
.length_sectors equ .length / 512
|
|
@ -2,7 +2,7 @@ initfs:bin/vesad T T T G
|
||||||
stdio display:1
|
stdio display:1
|
||||||
initfs:bin/ps2d
|
initfs:bin/ps2d
|
||||||
initfs:bin/pcid initfs:etc/pcid.toml
|
initfs:bin/pcid initfs:etc/pcid.toml
|
||||||
initfs:bin/redoxfs initfs:filesystem.bin
|
initfs:bin/redoxfs disk:0
|
||||||
cd file:
|
cd file:
|
||||||
export PATH file:bin
|
export PATH file:bin
|
||||||
run file:etc/init.rc
|
run file:etc/init.rc
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
use alloc::arc::Arc;
|
use collections::BTreeMap;
|
||||||
use collections::{BTreeMap, Vec};
|
|
||||||
use core::{cmp, str};
|
use core::{cmp, str};
|
||||||
use core::sync::atomic::{AtomicUsize, Ordering};
|
use core::sync::atomic::{AtomicUsize, Ordering};
|
||||||
use spin::RwLock;
|
use spin::RwLock;
|
||||||
|
@ -21,27 +20,22 @@ mod gen;
|
||||||
|
|
||||||
struct Handle {
|
struct Handle {
|
||||||
path: &'static [u8],
|
path: &'static [u8],
|
||||||
data: Arc<RwLock<Vec<u8>>>,
|
data: &'static [u8],
|
||||||
mode: u16,
|
mode: u16,
|
||||||
seek: usize
|
seek: usize
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct InitFsScheme {
|
pub struct InitFsScheme {
|
||||||
next_id: AtomicUsize,
|
next_id: AtomicUsize,
|
||||||
files: BTreeMap<&'static [u8], (Arc<RwLock<Vec<u8>>>, bool)>,
|
files: BTreeMap<&'static [u8], (&'static [u8], bool)>,
|
||||||
handles: RwLock<BTreeMap<usize, Handle>>
|
handles: RwLock<BTreeMap<usize, Handle>>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl InitFsScheme {
|
impl InitFsScheme {
|
||||||
pub fn new() -> InitFsScheme {
|
pub fn new() -> InitFsScheme {
|
||||||
let mut files = BTreeMap::new();
|
|
||||||
for (path, (data, folder)) in gen::gen() {
|
|
||||||
files.insert(path, (Arc::new(RwLock::new(data.to_vec())), folder));
|
|
||||||
}
|
|
||||||
|
|
||||||
InitFsScheme {
|
InitFsScheme {
|
||||||
next_id: AtomicUsize::new(0),
|
next_id: AtomicUsize::new(0),
|
||||||
files: files,
|
files: gen::gen(),
|
||||||
handles: RwLock::new(BTreeMap::new())
|
handles: RwLock::new(BTreeMap::new())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,12 +52,12 @@ impl Scheme for InitFsScheme {
|
||||||
let id = self.next_id.fetch_add(1, Ordering::SeqCst);
|
let id = self.next_id.fetch_add(1, Ordering::SeqCst);
|
||||||
self.handles.write().insert(id, Handle {
|
self.handles.write().insert(id, Handle {
|
||||||
path: entry.0,
|
path: entry.0,
|
||||||
data: (entry.1).0.clone(),
|
data: (entry.1).0,
|
||||||
mode: if (entry.1).1 { MODE_DIR | 0o755 } else { MODE_FILE | 0o744 },
|
mode: if (entry.1).1 { MODE_DIR | 0o755 } else { MODE_FILE | 0o744 },
|
||||||
seek: 0
|
seek: 0
|
||||||
});
|
});
|
||||||
|
|
||||||
return Ok(id)
|
return Ok(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +68,7 @@ impl Scheme for InitFsScheme {
|
||||||
let (path, data, mode, seek) = {
|
let (path, data, mode, seek) = {
|
||||||
let handles = self.handles.read();
|
let handles = self.handles.read();
|
||||||
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
||||||
(handle.path, handle.data.clone(), handle.mode, handle.seek)
|
(handle.path, handle.data, handle.mode, handle.seek)
|
||||||
};
|
};
|
||||||
|
|
||||||
let id = self.next_id.fetch_add(1, Ordering::SeqCst);
|
let id = self.next_id.fetch_add(1, Ordering::SeqCst);
|
||||||
|
@ -91,26 +85,10 @@ impl Scheme for InitFsScheme {
|
||||||
fn read(&self, id: usize, buffer: &mut [u8]) -> Result<usize> {
|
fn read(&self, id: usize, buffer: &mut [u8]) -> Result<usize> {
|
||||||
let mut handles = self.handles.write();
|
let mut handles = self.handles.write();
|
||||||
let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
||||||
let data = handle.data.read();
|
|
||||||
|
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
while i < buffer.len() && handle.seek < data.len() {
|
while i < buffer.len() && handle.seek < handle.data.len() {
|
||||||
buffer[i] = data[handle.seek];
|
buffer[i] = handle.data[handle.seek];
|
||||||
i += 1;
|
|
||||||
handle.seek += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write(&self, id: usize, buffer: &[u8]) -> Result<usize> {
|
|
||||||
let mut handles = self.handles.write();
|
|
||||||
let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
|
||||||
let mut data = handle.data.write();
|
|
||||||
|
|
||||||
let mut i = 0;
|
|
||||||
while i < buffer.len() && handle.seek < data.len() {
|
|
||||||
data[handle.seek] = buffer[i];
|
|
||||||
i += 1;
|
i += 1;
|
||||||
handle.seek += 1;
|
handle.seek += 1;
|
||||||
}
|
}
|
||||||
|
@ -121,12 +99,11 @@ impl Scheme for InitFsScheme {
|
||||||
fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> {
|
fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> {
|
||||||
let mut handles = self.handles.write();
|
let mut handles = self.handles.write();
|
||||||
let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
||||||
let data = handle.data.read();
|
|
||||||
|
|
||||||
handle.seek = match whence {
|
handle.seek = match whence {
|
||||||
SEEK_SET => cmp::min(data.len(), pos),
|
SEEK_SET => cmp::min(handle.data.len(), pos),
|
||||||
SEEK_CUR => cmp::max(0, cmp::min(data.len() as isize, handle.seek as isize + pos as isize)) as usize,
|
SEEK_CUR => cmp::max(0, cmp::min(handle.data.len() as isize, handle.seek as isize + pos as isize)) as usize,
|
||||||
SEEK_END => cmp::max(0, cmp::min(data.len() as isize, data.len() as isize + pos as isize)) as usize,
|
SEEK_END => cmp::max(0, cmp::min(handle.data.len() as isize, handle.data.len() as isize + pos as isize)) as usize,
|
||||||
_ => return Err(Error::new(EINVAL))
|
_ => return Err(Error::new(EINVAL))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -158,20 +135,16 @@ impl Scheme for InitFsScheme {
|
||||||
fn fstat(&self, id: usize, stat: &mut Stat) -> Result<usize> {
|
fn fstat(&self, id: usize, stat: &mut Stat) -> Result<usize> {
|
||||||
let handles = self.handles.read();
|
let handles = self.handles.read();
|
||||||
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
||||||
let data = handle.data.read();
|
|
||||||
|
|
||||||
stat.st_mode = handle.mode;
|
stat.st_mode = handle.mode;
|
||||||
stat.st_uid = 0;
|
stat.st_uid = 0;
|
||||||
stat.st_gid = 0;
|
stat.st_gid = 0;
|
||||||
stat.st_size = data.len() as u64;
|
stat.st_size = handle.data.len() as u64;
|
||||||
|
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fsync(&self, id: usize) -> Result<usize> {
|
fn fsync(&self, _id: usize) -> Result<usize> {
|
||||||
let handles = self.handles.read();
|
|
||||||
let _handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
|
||||||
|
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
160
kernel/scheme/live.rs
Normal file
160
kernel/scheme/live.rs
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
/// Disk scheme replacement when making live disk
|
||||||
|
|
||||||
|
use alloc::arc::Arc;
|
||||||
|
use collections::{BTreeMap, Vec};
|
||||||
|
use core::{cmp, str};
|
||||||
|
use core::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
use spin::RwLock;
|
||||||
|
|
||||||
|
use syscall::data::Stat;
|
||||||
|
use syscall::error::*;
|
||||||
|
use syscall::flag::{MODE_DIR, MODE_FILE, SEEK_SET, SEEK_CUR, SEEK_END};
|
||||||
|
use syscall::scheme::Scheme;
|
||||||
|
|
||||||
|
static FILESYSTEM: &'static [u8] = include_bytes!("../../build/filesystem.bin");
|
||||||
|
|
||||||
|
struct Handle {
|
||||||
|
path: &'static [u8],
|
||||||
|
data: Arc<RwLock<Vec<u8>>>,
|
||||||
|
mode: u16,
|
||||||
|
seek: usize
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct DiskScheme {
|
||||||
|
next_id: AtomicUsize,
|
||||||
|
data: Arc<RwLock<Vec<u8>>>,
|
||||||
|
handles: RwLock<BTreeMap<usize, Handle>>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DiskScheme {
|
||||||
|
pub fn new() -> DiskScheme {
|
||||||
|
DiskScheme {
|
||||||
|
next_id: AtomicUsize::new(0),
|
||||||
|
data: Arc::new(RwLock::new(FILESYSTEM.to_vec())),
|
||||||
|
handles: RwLock::new(BTreeMap::new())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Scheme for DiskScheme {
|
||||||
|
fn open(&self, _path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
|
||||||
|
let id = self.next_id.fetch_add(1, Ordering::SeqCst);
|
||||||
|
self.handles.write().insert(id, Handle {
|
||||||
|
path: b"0",
|
||||||
|
data: self.data.clone(),
|
||||||
|
mode: MODE_FILE | 0o744,
|
||||||
|
seek: 0
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dup(&self, id: usize, _buf: &[u8]) -> Result<usize> {
|
||||||
|
let (path, data, mode, seek) = {
|
||||||
|
let handles = self.handles.read();
|
||||||
|
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
||||||
|
(handle.path, handle.data.clone(), handle.mode, handle.seek)
|
||||||
|
};
|
||||||
|
|
||||||
|
let id = self.next_id.fetch_add(1, Ordering::SeqCst);
|
||||||
|
self.handles.write().insert(id, Handle {
|
||||||
|
path: path,
|
||||||
|
data: data,
|
||||||
|
mode: mode,
|
||||||
|
seek: seek
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read(&self, id: usize, buffer: &mut [u8]) -> Result<usize> {
|
||||||
|
let mut handles = self.handles.write();
|
||||||
|
let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
||||||
|
let data = handle.data.read();
|
||||||
|
|
||||||
|
let mut i = 0;
|
||||||
|
while i < buffer.len() && handle.seek < data.len() {
|
||||||
|
buffer[i] = data[handle.seek];
|
||||||
|
i += 1;
|
||||||
|
handle.seek += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn write(&self, id: usize, buffer: &[u8]) -> Result<usize> {
|
||||||
|
let mut handles = self.handles.write();
|
||||||
|
let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
||||||
|
let mut data = handle.data.write();
|
||||||
|
|
||||||
|
let mut i = 0;
|
||||||
|
while i < buffer.len() && handle.seek < data.len() {
|
||||||
|
data[handle.seek] = buffer[i];
|
||||||
|
i += 1;
|
||||||
|
handle.seek += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> {
|
||||||
|
let mut handles = self.handles.write();
|
||||||
|
let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
||||||
|
let data = handle.data.read();
|
||||||
|
|
||||||
|
handle.seek = match whence {
|
||||||
|
SEEK_SET => cmp::min(data.len(), pos),
|
||||||
|
SEEK_CUR => cmp::max(0, cmp::min(data.len() as isize, handle.seek as isize + pos as isize)) as usize,
|
||||||
|
SEEK_END => cmp::max(0, cmp::min(data.len() as isize, data.len() as isize + pos as isize)) as usize,
|
||||||
|
_ => return Err(Error::new(EINVAL))
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(handle.seek)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fpath(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
|
||||||
|
let handles = self.handles.read();
|
||||||
|
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
||||||
|
|
||||||
|
//TODO: Copy scheme part in kernel
|
||||||
|
let mut i = 0;
|
||||||
|
let scheme_path = b"disk:";
|
||||||
|
while i < buf.len() && i < scheme_path.len() {
|
||||||
|
buf[i] = scheme_path[i];
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut j = 0;
|
||||||
|
while i < buf.len() && j < handle.path.len() {
|
||||||
|
buf[i] = handle.path[j];
|
||||||
|
i += 1;
|
||||||
|
j += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fstat(&self, id: usize, stat: &mut Stat) -> Result<usize> {
|
||||||
|
let handles = self.handles.read();
|
||||||
|
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
||||||
|
let data = handle.data.read();
|
||||||
|
|
||||||
|
stat.st_mode = handle.mode;
|
||||||
|
stat.st_uid = 0;
|
||||||
|
stat.st_gid = 0;
|
||||||
|
stat.st_size = data.len() as u64;
|
||||||
|
|
||||||
|
Ok(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fsync(&self, id: usize) -> Result<usize> {
|
||||||
|
let handles = self.handles.read();
|
||||||
|
let _handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
||||||
|
|
||||||
|
Ok(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn close(&self, id: usize) -> Result<usize> {
|
||||||
|
self.handles.write().remove(&id).ok_or(Error::new(EBADF)).and(Ok(0))
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,6 +41,10 @@ pub mod initfs;
|
||||||
/// `irq:` - allows userspace handling of IRQs
|
/// `irq:` - allows userspace handling of IRQs
|
||||||
pub mod irq;
|
pub mod irq;
|
||||||
|
|
||||||
|
/// When compiled with "live" feature - `disk:` - embedded filesystem for live disk
|
||||||
|
#[cfg(feature="live")]
|
||||||
|
pub mod live;
|
||||||
|
|
||||||
/// `null:` - a scheme that will discard all writes, and read no bytes
|
/// `null:` - a scheme that will discard all writes, and read no bytes
|
||||||
pub mod null;
|
pub mod null;
|
||||||
|
|
||||||
|
@ -111,6 +115,7 @@ impl SchemeList {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Initialize the root namespace
|
/// Initialize the root namespace
|
||||||
|
#[cfg(not(feature="live"))]
|
||||||
fn new_root(&mut self) {
|
fn new_root(&mut self) {
|
||||||
// Do common namespace initialization
|
// Do common namespace initialization
|
||||||
let ns = self.new_ns();
|
let ns = self.new_ns();
|
||||||
|
@ -122,6 +127,20 @@ impl SchemeList {
|
||||||
self.insert(ns, Box::new(*b"pipe"), |scheme_id| Arc::new(Box::new(PipeScheme::new(scheme_id)))).unwrap();
|
self.insert(ns, Box::new(*b"pipe"), |scheme_id| Arc::new(Box::new(PipeScheme::new(scheme_id)))).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Initialize the root namespace - with live disk
|
||||||
|
#[cfg(feature="live")]
|
||||||
|
fn new_root(&mut self) {
|
||||||
|
// Do common namespace initialization
|
||||||
|
let ns = self.new_ns();
|
||||||
|
|
||||||
|
// Debug, Disk, Initfs and IRQ are only available in the root namespace. Pipe is special
|
||||||
|
self.insert(ns, Box::new(*b"debug"), |scheme_id| Arc::new(Box::new(DebugScheme::new(scheme_id)))).unwrap();
|
||||||
|
self.insert(ns, Box::new(*b"disk"), |scheme_id| Arc::new(Box::new(self::live::DiskScheme::new()))).unwrap();
|
||||||
|
self.insert(ns, Box::new(*b"initfs"), |_| Arc::new(Box::new(InitFsScheme::new()))).unwrap();
|
||||||
|
self.insert(ns, Box::new(*b"irq"), |scheme_id| Arc::new(Box::new(IrqScheme::new(scheme_id)))).unwrap();
|
||||||
|
self.insert(ns, Box::new(*b"pipe"), |scheme_id| Arc::new(Box::new(PipeScheme::new(scheme_id)))).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
pub fn setns(&mut self, from: SchemeNamespace, names: &[&[u8]]) -> Result<SchemeNamespace> {
|
pub fn setns(&mut self, from: SchemeNamespace, names: &[&[u8]]) -> Result<SchemeNamespace> {
|
||||||
// Create an empty namespace
|
// Create an empty namespace
|
||||||
let to = self.new_ns();
|
let to = self.new_ns();
|
||||||
|
|
Loading…
Reference in a new issue