From 0437e5cb178bbccae2341fd059093085266caeec Mon Sep 17 00:00:00 2001 From: WangRunji Date: Fri, 7 Sep 2018 12:44:40 +0800 Subject: [PATCH] Make it compile for bootimage toolchain * Revert to nightly-2018-08-27 due to its bug on macOS * Not build C code --- kernel/Cargo.lock | 130 ++++++++++++++++++ kernel/Cargo.toml | 15 +- kernel/build.rs | 10 +- kernel/src/arch/x86_64/driver/apic/lapic.rs | 25 ++-- kernel/src/arch/x86_64/driver/keyboard/mod.rs | 2 +- kernel/src/arch/x86_64/memory.rs | 2 +- kernel/src/arch/x86_64/mod.rs | 7 +- kernel/src/main.rs | 7 + kernel/x86_64-blog_os.json | 2 + 9 files changed, 172 insertions(+), 28 deletions(-) diff --git a/kernel/Cargo.lock b/kernel/Cargo.lock index 3c65055..57d4971 100644 --- a/kernel/Cargo.lock +++ b/kernel/Cargo.lock @@ -29,6 +29,17 @@ name = "bitflags" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bootloader" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fixedvec 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "usize_conversions 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "x86_64 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "xmas-elf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cc" version = "1.0.23" @@ -39,6 +50,36 @@ name = "cfg-if" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "fixedvec" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "skeptic 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "getopts" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "lazy_static" version = "1.1.0" @@ -48,6 +89,11 @@ dependencies = [ "version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libc" +version = "0.2.43" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "linked_list_allocator" version = "0.6.3" @@ -82,11 +128,37 @@ name = "os_bootinfo" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "pulldown-cmark" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "redox_syscall" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "remove_dir_all" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "riscv" version = "0.3.0" @@ -105,6 +177,15 @@ dependencies = [ "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "skeptic" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "pulldown-cmark 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "spin" version = "0.4.9" @@ -115,6 +196,15 @@ name = "static_assertions" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "tempdir" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "uart_16550" version = "0.1.0" @@ -132,6 +222,7 @@ dependencies = [ "bit-allocator 0.1.0", "bit_field 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bootloader 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "linked_list_allocator 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -161,6 +252,11 @@ dependencies = [ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "unicode-width" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "usize_conversions" version = "0.2.0" @@ -181,6 +277,25 @@ name = "volatile" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "x86_64" version = "0.2.11" @@ -211,23 +326,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum bit-vec 0.5.0 (git+https://github.com/AltSysrq/bit-vec.git)" = "" "checksum bit_field 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed8765909f9009617974ab6b7d332625b320b33c326b1e9321382ef1999b5d56" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" +"checksum bootloader 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f1721ced9efc102309bc218c7934d642f60567858faf8d5dd90c0cc6722d97b9" "checksum cc 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)" = "c37f0efaa4b9b001fa6f02d4b644dee4af97d3414df07c51e3e4f015f3a3e131" "checksum cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3" +"checksum fixedvec 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7c6c16d316ccdac21a4dd648e314e76facbbaf316e83ca137d0857a9c07419d0" +"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7292d30132fb5424b354f5dc02512a86e4c516fe544bb7a25e7f266951b797" "checksum lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca488b89a5657b0a2ecd45b95609b3e848cf1755da332a0da46e2b2b1cb371a7" +"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" "checksum linked_list_allocator 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "655d57c71827fe0891ce72231b6aa5e14033dae3f604609e6a6f807267c1678d" "checksum log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fcce5fa49cc693c312001daf1d13411c4a5283796bac1084299ea3e567113f" "checksum multiboot2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6ebbe89ab663a65cab341428d5fc7013b0eab5543ace92a401a86581e50fdd81" "checksum once 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "931fb7a4cf34610cf6cbe58d52a8ca5ef4c726d4e2e178abd0dc13a6551c6d73" "checksum os_bootinfo 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "66481dbeb5e773e7bd85b63cd6042c30786f834338288c5ec4f3742673db360a" +"checksum pulldown-cmark 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8361e81576d2e02643b04950e487ec172b687180da65c731c03cf336784e6c07" +"checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" +"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "checksum simple-filesystem 0.0.1 (git+https://github.com/wangrunji0408/SimpleFileSystem-Rust)" = "" +"checksum skeptic 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "061203a849117b0f7090baf8157aa91dac30545208fbb85166ac58b4ca33d89c" "checksum spin 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "37b5646825922b96b5d7d676b5bb3458a54498e96ed7b0ce09dc43a07038fea4" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" +"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum uart_16550 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "269f953d8de3226f7c065c589c7b4a3e83d10a419c7c3b5e2e0f197e6acc966e" +"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum usize_conversions 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f70329e2cbe45d6c97a5112daad40c34cd9a4e18edb5a2a18fefeb584d8d25e5" "checksum ux 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53d8df5dd8d07fedccd202de1887d94481fadaea3db70479f459e8163a1fab41" "checksum version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7716c242968ee87e5542f8021178248f267f295a5c4803beae8b8b7fd9bc6051" "checksum volatile 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37c5d76c0f40ba4f8ac10ec4717d4e98ce3e58c5607eea36e9464226fc5e0a95" +"checksum winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "773ef9dcc5f24b7d850d0ff101e542ff24c3b090a9768e03ff889fdef41f00fd" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum x86_64 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "466c2002e38edde7ebbaae6656793d4f71596634971c7e8cbf7afa4827968445" "checksum xmas-elf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "22678df5df766e8d1e5d609da69f0c3132d794edf6ab5e75e7abcd2270d4cf58" "checksum zero 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f1bc8a6b2005884962297587045002d8cfb8dcec9db332f4ca216ddc5de82c5" diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 6b615a9..86335ce 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -3,9 +3,6 @@ name = "ucore" version = "0.1.0" authors = ["Runji Wang "] -[lib] -crate-type = ["staticlib", "rlib"] - [features] use_apic = [] link_user_program = [] @@ -35,6 +32,7 @@ ucore-process = { path = "../crate/process" } simple-filesystem = { git = "https://github.com/wangrunji0408/SimpleFileSystem-Rust" } [target.'cfg(target_arch = "x86_64")'.dependencies] +bootloader = "0.3" multiboot2 = "0.7" x86_64 = "0.2.11" redox_syscall = "0.1" @@ -44,5 +42,16 @@ uart_16550 = "0.1" riscv = { path = "../crate/riscv" } bbl = { path = "../crate/bbl" } +[package.metadata.bootimage] +default-target = "x86_64-blog_os.json" +output = "bootimage.bin" # The output file name +minimum-image-size = 0 # The minimum output file size (in MiB) +# The command invoked on `bootimage run` +# (the "{}" will be replaced with the path to the bootable disk image) +run-command = ["qemu-system-x86_64", + "-drive", "format=raw,file={}", + "-serial", "mon:stdio" +] + [build-dependencies] cc = "1.0" diff --git a/kernel/build.rs b/kernel/build.rs index 6bbe313..af15f66 100644 --- a/kernel/build.rs +++ b/kernel/build.rs @@ -5,11 +5,11 @@ use std::io::{Write, Result}; fn main() { if std::env::var("TARGET").unwrap().find("x86_64").is_some() { - cc::Build::new() - .file("src/arch/x86_64/driver/apic/lapic.c") - .file("src/arch/x86_64/driver/keyboard/keyboard.c") - .flag("-mcmodel=large") - .compile("cobj"); +// cc::Build::new() +// .file("src/arch/x86_64/driver/apic/lapic.c") +// .file("src/arch/x86_64/driver/keyboard/keyboard.c") +// .flag("-mcmodel=large") +// .compile("cobj"); gen_vector_asm().unwrap(); } } diff --git a/kernel/src/arch/x86_64/driver/apic/lapic.rs b/kernel/src/arch/x86_64/driver/apic/lapic.rs index 2332e5f..0201d44 100644 --- a/kernel/src/arch/x86_64/driver/apic/lapic.rs +++ b/kernel/src/arch/x86_64/driver/apic/lapic.rs @@ -8,38 +8,39 @@ extern { pub fn set_addr(lapic_addr: *const ()) { unsafe { - lapic = lapic_addr; +// lapic = lapic_addr; } } pub fn init() { warn!("lapic::init use C lib"); unsafe { - lapicinit(); +// lapicinit(); } info!("lapic: init end"); } pub fn ack(_irq: u8) { unsafe { - lapiceoi(); +// lapiceoi(); } } pub fn start_ap(apicid: u8, addr: u32) { warn!("lapic::start_ap use C lib"); unsafe { - lapicstartap(apicid, addr); +// lapicstartap(apicid, addr); } } pub fn lapic_id() -> u8 { - unsafe{ - if lapic.is_null() { - warn!("lapic is null. return lapic id = 0"); - return 0; - } - let ptr = (lapic as *const u32).offset(0x0020 / 4); - (ptr.read_volatile() >> 24) as u8 - } + 0 +// unsafe{ +// if lapic.is_null() { +// warn!("lapic is null. return lapic id = 0"); +// return 0; +// } +// let ptr = (lapic as *const u32).offset(0x0020 / 4); +// (ptr.read_volatile() >> 24) as u8 +// } } \ No newline at end of file diff --git a/kernel/src/arch/x86_64/driver/keyboard/mod.rs b/kernel/src/arch/x86_64/driver/keyboard/mod.rs index 396d5d0..88012ba 100644 --- a/kernel/src/arch/x86_64/driver/keyboard/mod.rs +++ b/kernel/src/arch/x86_64/driver/keyboard/mod.rs @@ -7,7 +7,7 @@ pub fn init() { } pub fn get() -> i32 { - unsafe{ kbdgetc() } + 0 } extern { diff --git a/kernel/src/arch/x86_64/memory.rs b/kernel/src/arch/x86_64/memory.rs index b7e695e..1994487 100644 --- a/kernel/src/arch/x86_64/memory.rs +++ b/kernel/src/arch/x86_64/memory.rs @@ -13,7 +13,7 @@ pub fn init(boot_info: BootInformation) { assert_has_not_been_called!("memory::init must be called only once"); info!("{:?}", boot_info); init_frame_allocator(&boot_info); - remap_the_kernel(&boot_info); +// remap_the_kernel(&boot_info); init_heap(); } diff --git a/kernel/src/arch/x86_64/mod.rs b/kernel/src/arch/x86_64/mod.rs index 8ae4873..9d1ed17 100644 --- a/kernel/src/arch/x86_64/mod.rs +++ b/kernel/src/arch/x86_64/mod.rs @@ -14,12 +14,7 @@ pub mod io; pub fn init() { idt::init(); - // Load boot info address from stack_top. - // See `boot.asm` - extern { - fn stack_top(); - } - let boot_info_addr = unsafe { *(stack_top as *const u32).offset(-1) } as usize; + let boot_info_addr = unsafe { *(0 as *const u32).offset(-1) } as usize; let boot_info = unsafe { multiboot2::load(boot_info_addr) }; let rsdt_addr = boot_info.rsdp_v1_tag().unwrap().rsdt_address(); memory::init(boot_info); diff --git a/kernel/src/main.rs b/kernel/src/main.rs index 8f0dad8..22852b6 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -4,3 +4,10 @@ #[macro_use] extern crate ucore; + +#[cfg(not(test))] +#[cfg(target_arch = "x86_64")] +#[no_mangle] // don't mangle the name of this function +pub extern "C" fn _start() -> ! { + ucore::rust_main(); +} \ No newline at end of file diff --git a/kernel/x86_64-blog_os.json b/kernel/x86_64-blog_os.json index 023acb7..8643d15 100644 --- a/kernel/x86_64-blog_os.json +++ b/kernel/x86_64-blog_os.json @@ -7,6 +7,8 @@ "target-c-int-width": "32", "arch": "x86_64", "os": "none", + "executables": true, + "linker": "rust-lld", "disable-redzone": true, "features": "-mmx,-sse,+soft-float", "panic-strategy": "abort"