diff --git a/Makefile b/Makefile index 2e28226..b43b5bb 100644 --- a/Makefile +++ b/Makefile @@ -63,6 +63,8 @@ CFLAGS += -MD CFLAGS += -mcmodel=medany CFLAGS += -ffreestanding -fno-common -nostdlib -mno-relax CFLAGS += -I. +CFLAGS += -march=rv64gc +CFLAGS += -mabi=lp64d CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) TARGET_TRIPLE = riscv64gc-unknown-none-elf @@ -77,7 +79,7 @@ endif LDFLAGS = -z max-page-size=4096 $K/kernel: $(OBJS) $K/kernel.ld $U/initcode $R/src - cargo +nightly -Z unstable-options -C $R build + CC="$(CC)" CFLAGS="$(CFLAGS)" cargo +nightly -Z unstable-options -C $R build $(LD) $(LDFLAGS) -T $K/kernel.ld -o $K/kernel $(OBJS) $R/target/$(TARGET_TRIPLE)/debug/librustkernel.a $(OBJDUMP) -S $K/kernel > $K/kernel.asm $(OBJDUMP) -t $K/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $K/kernel.sym diff --git a/kernel/rustkernel/.cargo/config.toml b/kernel/rustkernel/.cargo/config.toml index 7f9fa99..487ca48 100644 --- a/kernel/rustkernel/.cargo/config.toml +++ b/kernel/rustkernel/.cargo/config.toml @@ -1,3 +1,3 @@ [build] target = "riscv64gc-unknown-none-elf" -rustflags = ["-Csoft-float=n"] +rustflags = ["-C", "soft-float=n"] diff --git a/kernel/rustkernel/Cargo.lock b/kernel/rustkernel/Cargo.lock index 516fd1e..b53563c 100644 --- a/kernel/rustkernel/Cargo.lock +++ b/kernel/rustkernel/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "cc" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" + [[package]] name = "rustkernel" version = "0.1.0" +dependencies = [ + "cc", +] diff --git a/kernel/rustkernel/Cargo.toml b/kernel/rustkernel/Cargo.toml index 25087f9..feec2b8 100644 --- a/kernel/rustkernel/Cargo.toml +++ b/kernel/rustkernel/Cargo.toml @@ -5,5 +5,8 @@ edition = "2021" [dependencies] +[build-dependencies] +cc = "1.0" + [lib] crate-type = ["staticlib"] diff --git a/kernel/rustkernel/build.rs b/kernel/rustkernel/build.rs new file mode 100644 index 0000000..43edcab --- /dev/null +++ b/kernel/rustkernel/build.rs @@ -0,0 +1,45 @@ +fn main() { + cc::Build::new() + .compiler("riscv64-unknown-elf-gcc") + .flag("-Wall") + .flag("-Werror") + .flag("-O") + .flag("-fno-omit-frame-pointer") + .flag("-ggdb") + .flag("-gdwarf-2") + .flag("-MD") + .flag("-mcmodel=medany") + .flag("-ffreestanding") + .flag("-fno-common") + .flag("-nostdlib") + .flag("-mno-relax") + .flag("-I.") + .flag("-march=rv64gc") + .flag("-mabi=lp64d") + .flag_if_supported("-fno-stack-protector") + .flag_if_supported("-fno-pie") + .flag_if_supported("-no-pie") + .file("src/c/layered.c") + .compile("layered"); +} + +/* +Wall -Werror -O -fno-omit-frame-pointer -ggdb -gdwarf-2 +-MD +-mcmodel=medany +-ffreestanding -fno-common -nostdlib -mno-relax +-I. + + +-fno-stack-protector +-fno-pie -no-pie + +TARGET_TRIPLE = riscv64gc-unknown-none-elf + +# Disable PIE when possible (for Ubuntu 16.10 toolchain) +ifneq ($(shell $(CC) -dumpspecs 2>/dev/null | grep -e '[^f]no-pie'),) +endif +ifneq ($(shell $(CC) -dumpspecs 2>/dev/null | grep -e '[^f]nopie'),) +CFLAGS += -fno-pie -nopie +endif +*/ diff --git a/kernel/rustkernel/src/c/layered.c b/kernel/rustkernel/src/c/layered.c new file mode 100644 index 0000000..43ef55f --- /dev/null +++ b/kernel/rustkernel/src/c/layered.c @@ -0,0 +1,3 @@ +char *test_layered() { + return "Hello from layered C!"; +} diff --git a/kernel/rustkernel/src/lib.rs b/kernel/rustkernel/src/lib.rs index 60e595b..7ab684a 100644 --- a/kernel/rustkernel/src/lib.rs +++ b/kernel/rustkernel/src/lib.rs @@ -6,6 +6,7 @@ use core::ffi::{c_char, CStr}; extern "C" { pub fn print(message: *const c_char); fn panic(panic_message: *const c_char) -> !; + fn test_layered() -> *const c_char; } #[no_mangle] @@ -16,6 +17,7 @@ pub extern "C" fn rust_main() { .unwrap() .as_ptr(), ); + print(test_layered()); } }