diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs index 112b8f75494..8d7b88a4d65 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs @@ -1270,6 +1270,7 @@ supported_targets! { ("armv7-unknown-linux-ohos", armv7_unknown_linux_ohos), ("aarch64-unknown-yggdrasil", aarch64_unknown_yggdrasil), + ("x86_64-unknown-yggdrasil", x86_64_unknown_yggdrasil), } /// Cow-Vec-Str: Cow<'static, [Cow<'static, str>]> diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_yggdrasil.rs b/compiler/rustc_target/src/spec/x86_64_unknown_yggdrasil.rs new file mode 100644 index 00000000000..c552fd8392c --- /dev/null +++ b/compiler/rustc_target/src/spec/x86_64_unknown_yggdrasil.rs @@ -0,0 +1,21 @@ +use crate::spec::{PanicStrategy, Target}; + +// Have specific requirements about how segments are aligned +const LINKER_SCRIPT: &str = include_str!("./x86_64_unknown_yggdrasil_linker_script.ld"); + +pub fn target() -> Target { + let mut base = super::yggdrasil_base::opts(); + + base.disable_redzone = true; + base.panic_strategy = PanicStrategy::Abort; + base.link_script = Some(LINKER_SCRIPT.into()); + + Target { + llvm_target: "x86_64-unknown-linux-gnu".into(), + pointer_width: 64, + arch: "x86_64".into(), + data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + .into(), + options: base, + } +} diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_yggdrasil_linker_script.ld b/compiler/rustc_target/src/spec/x86_64_unknown_yggdrasil_linker_script.ld new file mode 100644 index 00000000000..89b9096ff2e --- /dev/null +++ b/compiler/rustc_target/src/spec/x86_64_unknown_yggdrasil_linker_script.ld @@ -0,0 +1,32 @@ +ENTRY(runtime_entry) + +BASE_ADDR = 0x400000; + +SECTIONS { + . = BASE_ADDR; + + .text : { + *(.text*) + *(.plt*) + } + + . = ALIGN(4K); + + .rodata : { + *(.rodata*) + } + + . = ALIGN(4K); + + .data : { + *(.data*) + *(.got*) + } + + . = ALIGN(4K); + + .bss : { + *(COMMON) + *(.bss*) + } +} diff --git a/library/std/src/sys/yggdrasil/mod.rs b/library/std/src/sys/yggdrasil/mod.rs index fbe1226817d..9705a3cbc40 100644 --- a/library/std/src/sys/yggdrasil/mod.rs +++ b/library/std/src/sys/yggdrasil/mod.rs @@ -133,6 +133,7 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind { Ok(OsError::NotADirectory) => ErrorKind::NotADirectory, Ok(OsError::DirectoryNotEmpty) => ErrorKind::DirectoryNotEmpty, Ok(OsError::Interrupted) => ErrorKind::Interrupted, + Ok(OsError::WouldBlock) => ErrorKind::WouldBlock, // Memory and general Ok(OsError::OutOfMemory) => ErrorKind::OutOfMemory, diff --git a/yggdrasil-rt b/yggdrasil-rt index adfc37dde41..ed2cf05838e 160000 --- a/yggdrasil-rt +++ b/yggdrasil-rt @@ -1 +1 @@ -Subproject commit adfc37dde413ca413bf9b2bded45dd32456ce9ab +Subproject commit ed2cf05838e96adf48defad1c1f4e1d5451b0bbd