From 5cd3c3d3dc0fda48c1983e55ef191691159e9301 Mon Sep 17 00:00:00 2001
From: John Hodge <tpg@mutabah.net>
Date: Sun, 17 Mar 2019 17:07:59 +0800
Subject: [PATCH] Kernel - Working xargo kernel build (all modules I think)

---
 Kernel/Cargo.toml                      | 27 +++++++++
 Kernel/Core/Cargo.toml                 | 10 +++
 Kernel/Makefile-xargo                  | 84 ++++++++++++++++++++++++++
 Kernel/Modules/block_cache/Cargo.toml  | 10 +++
 Kernel/Modules/blockcache/Cargo.toml   | 11 ++++
 Kernel/Modules/fs_extN/Cargo.toml      | 10 +++
 Kernel/Modules/fs_fat/Cargo.toml       | 13 ++++
 Kernel/Modules/fs_iso9660/Cargo.toml   | 11 ++++
 Kernel/Modules/gui/Cargo.toml          | 11 ++++
 Kernel/Modules/input_ps2/Cargo.toml    | 11 ++++
 Kernel/Modules/network/Cargo.toml      | 12 ++++
 Kernel/Modules/network/lib.rs          |  1 -
 Kernel/Modules/nic_rtl8139/Cargo.toml  | 11 ++++
 Kernel/Modules/shared_map/Cargo.toml   | 10 +++
 Kernel/Modules/storage_ahci/Cargo.toml | 11 ++++
 Kernel/Modules/storage_ata/Cargo.toml  | 11 ++++
 Kernel/Modules/storage_scsi/Cargo.toml |  9 +++
 Kernel/Modules/syscalls/Cargo.toml     | 12 ++++
 Kernel/Modules/usb_core/Cargo.toml     | 12 ++++
 Kernel/Modules/usb_ohci/Cargo.toml     | 11 ++++
 Kernel/Modules/utf16/Cargo.toml        | 10 +++
 Kernel/Modules/video_vga/Cargo.toml    | 10 +++
 Kernel/Modules/virtio/Cargo.toml       | 10 +++
 Kernel/Modules/virtio/devices/mod.rs   |  7 ++-
 Kernel/rundir/Makefile                 | 23 +++----
 25 files changed, 345 insertions(+), 13 deletions(-)
 create mode 100644 Kernel/Cargo.toml
 create mode 100644 Kernel/Core/Cargo.toml
 create mode 100644 Kernel/Makefile-xargo
 create mode 100644 Kernel/Modules/block_cache/Cargo.toml
 create mode 100644 Kernel/Modules/blockcache/Cargo.toml
 create mode 100644 Kernel/Modules/fs_extN/Cargo.toml
 create mode 100644 Kernel/Modules/fs_fat/Cargo.toml
 create mode 100644 Kernel/Modules/fs_iso9660/Cargo.toml
 create mode 100644 Kernel/Modules/gui/Cargo.toml
 create mode 100644 Kernel/Modules/input_ps2/Cargo.toml
 create mode 100644 Kernel/Modules/network/Cargo.toml
 create mode 100644 Kernel/Modules/nic_rtl8139/Cargo.toml
 create mode 100644 Kernel/Modules/shared_map/Cargo.toml
 create mode 100644 Kernel/Modules/storage_ahci/Cargo.toml
 create mode 100644 Kernel/Modules/storage_ata/Cargo.toml
 create mode 100644 Kernel/Modules/storage_scsi/Cargo.toml
 create mode 100644 Kernel/Modules/syscalls/Cargo.toml
 create mode 100644 Kernel/Modules/usb_core/Cargo.toml
 create mode 100644 Kernel/Modules/usb_ohci/Cargo.toml
 create mode 100644 Kernel/Modules/utf16/Cargo.toml
 create mode 100644 Kernel/Modules/video_vga/Cargo.toml
 create mode 100644 Kernel/Modules/virtio/Cargo.toml

diff --git a/Kernel/Cargo.toml b/Kernel/Cargo.toml
new file mode 100644
index 00000000..1017b5fb
--- /dev/null
+++ b/Kernel/Cargo.toml
@@ -0,0 +1,27 @@
+[package]
+name = "main"
+version = "0.0.0"
+
+[lib]
+path = "main/main.rs"
+crate-type = ["staticlib"]
+
+[dependencies]
+kernel = { path = "Core" }
+syscalls = { path = "Modules/syscalls" }
+network = { path = "Modules/network" }
+usb-core = { path = "Modules/usb_core" }
+
+fs_fat = { path = "Modules/fs_fat" }
+fs_iso9660 = { path = "Modules/fs_iso9660" }
+fs_extN = { path = "Modules/fs_extN" }
+
+virtio = { path = "Modules/virtio" }
+storage-ata = { path = "Modules/storage_ata" }
+storage-ahci = { path = "Modules/storage_ahci" }
+input_ps2 = { path = "Modules/input_ps2" }
+nic-rtl8139 = { path = "Modules/nic_rtl8139" }
+usb-ohci = { path = "Modules/usb_ohci" }
+
+[target.'cfg(target_arch = "x86_64")'.dependencies]
+#video-vga = { path = "Modules/video_vga" }
diff --git a/Kernel/Core/Cargo.toml b/Kernel/Core/Cargo.toml
new file mode 100644
index 00000000..e6902005
--- /dev/null
+++ b/Kernel/Core/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "kernel"
+version = "0.0.0"
+
+[lib]
+path = "main.rs"
+
+[dependencies]
+stack_dst = { path = "../../externals/crates.io/stack_dst", default-features = false }
+tag_safe = "0.2"
diff --git a/Kernel/Makefile-xargo b/Kernel/Makefile-xargo
new file mode 100644
index 00000000..2cb7ab01
--- /dev/null
+++ b/Kernel/Makefile-xargo
@@ -0,0 +1,84 @@
+#
+#
+#
+V ?= @
+-include ../common.mk
+
+-include BuildNum.$(ARCH).mk
+BUILDNUM ?= 1
+
+OBJDIR := .obj/$(ARCH)/
+OBJS := $(addprefix $(OBJDIR),start.ao log_cfg.ao libmain.a)
+
+ENV := RUST_VERSION="$(shell $(RUSTC) --version)"
+ENV += TK_GITSPEC="$(shell git log -n 1 | head -n 1 | awk '{print $$2}')"
+ENV += TK_VERSION="0.1"
+ENV += TK_BUILD="$(shell hostname --fqdn):$(BUILDNUM)"
+
+LINKFLAGS := -T Core/arch/$(ARCH)/link.ld -Map $(OBJDIR)map.txt -g
+LINKFLAGS += -z max-page-size=0x1000	# Reduces binary size
+LINKFLAGS += --gc-sections	# Prevents complaining about floating point methods
+#LINKFLAGS += --print-gc-sections
+
+EXCLUDE_FEATURES :=
+ifeq ($(ARCH),amd64)
+EXCLUDE_FEATURES := 3dnow avx avx2 sse sse2 sse3 sse4.1 sse4.2 mmx
+endif
+
+XARGO := RUST_TARGET_PATH=$(abspath targets) $(XARGO)
+
+.PHONY: all dsm PHONY
+
+all: bin/kernel-$(ARCH).bin
+dsm: bin/kernel-$(ARCH).bin.dsm
+
+# 
+# Final linking stage
+# 
+bin/kernel-$(ARCH).bin: $(OBJS) Core/arch/$(ARCH)/link.ld
+	@mkdir -p bin/
+	@echo [LD] -o $@
+	$V$(LD) -o $@ $(OBJS) --no-whole-archive $(LINKFLAGS)
+ifeq ($(ARCH),amd64)
+	$Vobjcopy $@ --only-keep-debug $@.debug
+	$Vobjcopy $@ -F elf32-i386 $@.elf32
+	$V$(TRIPLE)-strip -g $@.elf32
+else
+	#$V$(TRIPLE)-strip $@
+endif
+	@echo "BUILDNUM := $$(( $(BUILDNUM) + 1 ))" > BuildNum.$(ARCH).mk
+
+#
+# Disassembly
+#
+%.dsm: %
+	@echo "[OBJDUMP] >" $*.dsm
+	$V$(OBJDUMP) -s -C -S $* > $*.dsm
+
+#
+# Invoke xargo to build the main part of the kernel
+# - This includes all modules enabled in ./Cargo.toml
+#
+$(OBJDIR)libmain.a: PHONY targets/target-$(ARCH).json
+	@echo "[XARGO] . > $@"
+	$V$(ENV) $(XARGO) rustc --target=target-$(ARCH) --release -- -C target-feature=$(subst $(space),$(comma),$(EXCLUDE_FEATURES:%=-%))
+	@mkdir -p $(dir $@)
+	@cp target/target-$(ARCH)/release/libmain.a $@
+
+targets/target-$(ARCH).json: Core/arch/$(ARCH)/target.json
+	@mkdir -p $(dir $@)
+	$Vcp $< $@
+
+$(OBJDIR)%.ao: Core/arch/$(ARCH)/%.asm
+	@echo [AS] -o $@
+	@mkdir -p $(dir $@)
+	$Vnasm -o $@ $< -f elf64 -MD $@.d -MP
+$(OBJDIR)%.ao: Core/arch/$(ARCH)/%.S
+	@echo [AS] -o $@
+	@mkdir -p $(dir $@)
+	$V$(CC) -o $@ -c $<
+# Log configuration
+$(OBJDIR)log_cfg.ao: Core/log_cfg.S
+	@echo [AS] -o $@
+	@mkdir -p $(dir $@)
+	$V$(CC) -o $@ -c $<
diff --git a/Kernel/Modules/block_cache/Cargo.toml b/Kernel/Modules/block_cache/Cargo.toml
new file mode 100644
index 00000000..d93265a7
--- /dev/null
+++ b/Kernel/Modules/block_cache/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "block_cache"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
diff --git a/Kernel/Modules/blockcache/Cargo.toml b/Kernel/Modules/blockcache/Cargo.toml
new file mode 100644
index 00000000..b24b0e3a
--- /dev/null
+++ b/Kernel/Modules/blockcache/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "blockcache"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
+
diff --git a/Kernel/Modules/fs_extN/Cargo.toml b/Kernel/Modules/fs_extN/Cargo.toml
new file mode 100644
index 00000000..d99482e1
--- /dev/null
+++ b/Kernel/Modules/fs_extN/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "fs_extN"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+block_cache = { path = "../block_cache" }
diff --git a/Kernel/Modules/fs_fat/Cargo.toml b/Kernel/Modules/fs_fat/Cargo.toml
new file mode 100644
index 00000000..5ea64edc
--- /dev/null
+++ b/Kernel/Modules/fs_fat/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "fs_fat"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+blockcache = { path = "../blockcache" }
+block_cache = { path = "../block_cache" }
+utf16 = { path = "../utf16" }
+
diff --git a/Kernel/Modules/fs_iso9660/Cargo.toml b/Kernel/Modules/fs_iso9660/Cargo.toml
new file mode 100644
index 00000000..36065422
--- /dev/null
+++ b/Kernel/Modules/fs_iso9660/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "fs_iso9660"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+block_cache = { path = "../block_cache" }
+
diff --git a/Kernel/Modules/gui/Cargo.toml b/Kernel/Modules/gui/Cargo.toml
new file mode 100644
index 00000000..e8b241ea
--- /dev/null
+++ b/Kernel/Modules/gui/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "gui"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+tag_safe = "*"
+
diff --git a/Kernel/Modules/input_ps2/Cargo.toml b/Kernel/Modules/input_ps2/Cargo.toml
new file mode 100644
index 00000000..f8d2b9b0
--- /dev/null
+++ b/Kernel/Modules/input_ps2/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "input_ps2"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+gui = { path = "../gui" }
+
diff --git a/Kernel/Modules/network/Cargo.toml b/Kernel/Modules/network/Cargo.toml
new file mode 100644
index 00000000..337c8adf
--- /dev/null
+++ b/Kernel/Modules/network/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "network"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+stack_dst = { path = "../../../externals/crates.io/stack_dst", default-features = false }
+shared_map = { path = "../shared_map" }
+
diff --git a/Kernel/Modules/network/lib.rs b/Kernel/Modules/network/lib.rs
index 1d286c9a..6531675a 100644
--- a/Kernel/Modules/network/lib.rs
+++ b/Kernel/Modules/network/lib.rs
@@ -7,7 +7,6 @@
 #![feature(linkage)]
 #![feature(const_fn)] 
 #![feature(no_more_cas)]	// AtomicUsize::fetch_update
-#![feature(crate_in_paths)]
 
 #[cfg(test)] #[macro_use] extern crate /**/ std;
 
diff --git a/Kernel/Modules/nic_rtl8139/Cargo.toml b/Kernel/Modules/nic_rtl8139/Cargo.toml
new file mode 100644
index 00000000..f8e4dda2
--- /dev/null
+++ b/Kernel/Modules/nic_rtl8139/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "nic-rtl8139"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+network = { path = "../network" }
+
diff --git a/Kernel/Modules/shared_map/Cargo.toml b/Kernel/Modules/shared_map/Cargo.toml
new file mode 100644
index 00000000..b176d0fb
--- /dev/null
+++ b/Kernel/Modules/shared_map/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "shared_map"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
diff --git a/Kernel/Modules/storage_ahci/Cargo.toml b/Kernel/Modules/storage_ahci/Cargo.toml
new file mode 100644
index 00000000..13579ba1
--- /dev/null
+++ b/Kernel/Modules/storage_ahci/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "storage-ahci"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+storage-ata = { path = "../storage_ata" }
+storage-scsi = { path = "../storage_scsi" }
diff --git a/Kernel/Modules/storage_ata/Cargo.toml b/Kernel/Modules/storage_ata/Cargo.toml
new file mode 100644
index 00000000..8cccf700
--- /dev/null
+++ b/Kernel/Modules/storage_ata/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "storage-ata"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+storage-scsi = { path = "../storage_scsi" }
+
diff --git a/Kernel/Modules/storage_scsi/Cargo.toml b/Kernel/Modules/storage_scsi/Cargo.toml
new file mode 100644
index 00000000..83ad9f11
--- /dev/null
+++ b/Kernel/Modules/storage_scsi/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "storage-scsi"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
diff --git a/Kernel/Modules/syscalls/Cargo.toml b/Kernel/Modules/syscalls/Cargo.toml
new file mode 100644
index 00000000..764935eb
--- /dev/null
+++ b/Kernel/Modules/syscalls/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "syscalls"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+stack_dst = { path = "../../../externals/crates.io/stack_dst", default-features = false }
+kernel = { path = "../../Core" }
+gui = { path = "../gui" }
+
diff --git a/Kernel/Modules/usb_core/Cargo.toml b/Kernel/Modules/usb_core/Cargo.toml
new file mode 100644
index 00000000..dcc6d6eb
--- /dev/null
+++ b/Kernel/Modules/usb_core/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "usb-core"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+stack_dst = { path = "../../../externals/crates.io/stack_dst", default-features = false }
+
+
diff --git a/Kernel/Modules/usb_ohci/Cargo.toml b/Kernel/Modules/usb_ohci/Cargo.toml
new file mode 100644
index 00000000..0226cda6
--- /dev/null
+++ b/Kernel/Modules/usb_ohci/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "usb-ohci"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+usb-core = { path = "../usb_core" }
+
diff --git a/Kernel/Modules/utf16/Cargo.toml b/Kernel/Modules/utf16/Cargo.toml
new file mode 100644
index 00000000..b7423b95
--- /dev/null
+++ b/Kernel/Modules/utf16/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "utf16"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
diff --git a/Kernel/Modules/video_vga/Cargo.toml b/Kernel/Modules/video_vga/Cargo.toml
new file mode 100644
index 00000000..70aa9a7f
--- /dev/null
+++ b/Kernel/Modules/video_vga/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "video-vga"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
diff --git a/Kernel/Modules/virtio/Cargo.toml b/Kernel/Modules/virtio/Cargo.toml
new file mode 100644
index 00000000..fb79c7a7
--- /dev/null
+++ b/Kernel/Modules/virtio/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "virtio"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
diff --git a/Kernel/Modules/virtio/devices/mod.rs b/Kernel/Modules/virtio/devices/mod.rs
index a347888e..aab64f47 100644
--- a/Kernel/Modules/virtio/devices/mod.rs
+++ b/Kernel/Modules/virtio/devices/mod.rs
@@ -23,7 +23,12 @@ pub fn new_boxed<T: Interface+Send+Sync+'static>(dev_id: u32, int: T) -> Box<dev
 		}
 	2 => Box::new( block::BlockDevice::new(int) ),	// 2 = Block device
 	// DISABLED: Changing video modes breaks stuff currently...
-	//16 => Box::new( video::VideoDevice::new(int) ),	// 16 = Graphics Adapter
+	16 => if false { 	// 16 = Graphics Adapter
+		Box::new( video::VideoDevice::new(int) )
+		}
+		else {
+			Box::new(NullDevice)
+		},
 	dev @ _ => {
 		log_error!("VirtIO device has unknown device ID {:#x}", dev);
 		Box::new(NullDevice)
diff --git a/Kernel/rundir/Makefile b/Kernel/rundir/Makefile
index a9763282..8679262d 100644
--- a/Kernel/rundir/Makefile
+++ b/Kernel/rundir/Makefile
@@ -25,6 +25,8 @@ ifneq ($(QEMU_STALL),)
 endif
 CMDLINE := SYSROOT=/system/Tifflin
 
+#QEMU_ARGS += -tcg-plugin $(shell dirname $(shell type -P qemu-system-x86_64))/../libexec/tcg-plugin-oprofile.so -singlestep
+
 ifneq ($(TIFFLIN_INIT),)
 	CMDLINE += INIT=$(TIFFLIN_INIT)
 endif
@@ -38,19 +40,23 @@ endif
 
 IMGDIR := DiskImages/$(ARCH)/
 
+ifneq ($(ENABLE_TRACE),)
+  QEMU_ARGS += --trace events=.qemu_trace,file=qemu_trace_events
+endif
+
 #
 # --- AMD64 ---
 #
 ifeq ($(ARCH),amd64)
 CMDLINE += SYSDISK=ATA-0p0
-QEMU_ARGS += -net nic,model=rtl8139 -net dump
+QEMU_ARGS += -vga virtio
+QEMU_ARGS += -net nic,model=rtl8139
+# -net dump
 QEMU_ARGS += -drive if=ide,index=0,file=$(IMGDIR)hda.img,format=raw
 QEMU_ARGS += -cdrom $(IMGDIR)test.iso
 QEMU_ARGS += -device ahci,id=ahci
 QEMU_ARGS += -drive if=none,id=sata1,file=$(IMGDIR)hdb.img,format=raw -device ide-hd,drive=sata1,bus=ahci.0
 QEMU_ARGS += -drive if=none,id=sata2,file=$(IMGDIR)test.iso,format=raw -device ide-cd,drive=sata2,bus=ahci.1
-#QEMU_ARGS += -trace file=qemu_trace
-#QEMU_OPTS += -trace events=.qemu_trace,file=qemu_trace
 
 MODE ?= pxe
 ifeq ($(MODE),iso)
@@ -142,14 +148,9 @@ $(IMGDIR)hdb.img: Makefile $(IMGDIR)hdb_0.img $(IMGDIR)hdb_1.img
 	@echo "$(shell echo $$((1*1024*2)),+,0x83)" | /sbin/sfdisk --no-reread $@ -u S -f -q > /dev/null
 
 .qemu_trace: Makefile
-	echo "" 
 	echo "" > $@
-	#echo "apic_deliver_irq" >> $@
-	#echo "apic_local_deliver" >> $@
-	#echo "apic_mem_readl" >> $@
-	echo "bdrv_aio_readv" >> $@
-	echo "bdrv_aio_writev" >> $@
-	echo "bdrv_co_readv" >> $@
-	echo "bdrv_co_do_copy_on_readv" >> $@
+	echo pci_* >> $@
+	echo virtio_* >> $@
+	echo virtqueue_* >> $@
 
 
-- 
GitLab