Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add kernel target for RustyHermit #92670

Merged
merged 8 commits into from
Feb 10, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions compiler/rustc_target/src/spec/aarch64_unknown_hermit.rs
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@ use crate::spec::Target;
pub fn target() -> Target {
let mut base = super::hermit_base::opts();
base.max_atomic_width = Some(128);
base.features = "+strict-align,+neon,+fp-armv8".to_string();

Target {
llvm_target: "aarch64-unknown-hermit".to_string(),
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
use crate::spec::Target;

pub fn target() -> Target {
let mut base = super::hermit_kernel_base::opts();
base.max_atomic_width = Some(128);
base.abi = "softfloat".to_string();
base.features = "+strict-align,-neon,-fp-armv8".to_string();

Target {
llvm_target: "aarch64-unknown-hermit".to_string(),
pointer_width: 64,
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".to_string(),
arch: "aarch64".to_string(),
options: base,
}
}
1 change: 1 addition & 0 deletions compiler/rustc_target/src/spec/mod.rs
Original file line number Diff line number Diff line change
@@ -964,6 +964,7 @@ supported_targets! {
("aarch64-unknown-hermit", aarch64_unknown_hermit),
("x86_64-unknown-hermit", x86_64_unknown_hermit),

("aarch64-unknown-none-hermitkernel", aarch64_unknown_none_hermitkernel),
("x86_64-unknown-none-hermitkernel", x86_64_unknown_none_hermitkernel),

("riscv32i-unknown-none-elf", riscv32i_unknown_none_elf),
1 change: 1 addition & 0 deletions src/doc/rustc/src/SUMMARY.md
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@
- [aarch64-apple-ios-sim](platform-support/aarch64-apple-ios-sim.md)
- [armv7-unknown-linux-uclibceabi](platform-support/armv7-unknown-linux-uclibceabi.md)
- [armv7-unknown-linux-uclibceabihf](platform-support/armv7-unknown-linux-uclibceabihf.md)
- [aarch64-unknown-none-hermitkernel](platform-support/aarch64-unknown-none-hermitkernel.md)
- [\*-kmc-solid_\*](platform-support/kmc-solid.md)
- [*-unknown-openbsd](platform-support/openbsd.md)
- [x86_64-unknown-none](platform-support/x86_64-unknown-none.md)
7 changes: 4 additions & 3 deletions src/doc/rustc/src/platform-support.md
Original file line number Diff line number Diff line change
@@ -204,7 +204,8 @@ target | std | host | notes
`aarch64-apple-tvos` | * | | ARM64 tvOS
[`aarch64-kmc-solid_asp3`](platform-support/kmc-solid.md) | ✓ | | ARM64 SOLID with TOPPERS/ASP3
`aarch64-unknown-freebsd` | ✓ | ✓ | ARM64 FreeBSD
`aarch64-unknown-hermit` | ? | |
`aarch64-unknown-hermit` | ✓ | | ARM64 HermitCore
[`aarch64-unknown-none-hermitkernel`](platform-support/aarch64-unknown-none-hermitkernel.md) | * | | ARM64 HermitCore kernel
`aarch64-unknown-uefi` | * | | ARM64 UEFI
`aarch64-unknown-linux-gnu_ilp32` | ✓ | ✓ | ARM64 Linux (ILP32 ABI)
`aarch64-unknown-netbsd` | ✓ | ✓ |
@@ -286,10 +287,10 @@ target | std | host | notes
`x86_64-sun-solaris` | ? | | Deprecated target for 64-bit Solaris 10/11, illumos
`x86_64-unknown-dragonfly` | ✓ | ✓ | 64-bit DragonFlyBSD
`x86_64-unknown-haiku` | ✓ | ✓ | 64-bit Haiku
`x86_64-unknown-hermit` | ? | |
`x86_64-unknown-hermit` | | | HermitCore
`x86_64-unknown-l4re-uclibc` | ? | |
[`x86_64-unknown-none`](platform-support/x86_64-unknown-none.md) | * | | Freestanding/bare-metal x86_64, softfloat
`x86_64-unknown-none-hermitkernel` | ? | | HermitCore kernel
`x86_64-unknown-none-hermitkernel` | * | | HermitCore kernel
`x86_64-unknown-none-linuxkernel` | * | | Linux kernel modules
[`x86_64-unknown-openbsd`](platform-support/openbsd.md) | ✓ | ✓ | 64-bit OpenBSD
`x86_64-unknown-uefi` | * | | 64-bit UEFI
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# `aarch64-unknown-none-hermitkernel`

**Tier: 3**

Required to build the kernel for [HermitCore](https://github.com/hermitcore/hermit-playground)
or [RustyHermit](https://github.com/hermitcore/rusty-hermit).
The result is a bare-metal aarch64 binary in ELF format.

## Target maintainers

- Stefan Lankes, https://github.com/stlankes

## Requirements

This target is cross-compiled. There is no support for `std`, but the
library operating system provides a simple allocator to use `alloc`.

By default, Rust code generated for this target does not use any vector or
floating-point registers. This allows the generated code to build the library
operaring system, which may need to avoid the use of such
registers or which may have special considerations about the use of such
registers (e.g. saving and restoring them to avoid breaking userspace code
using the same registers). In contrast to `aarch64-unknown-none-softfloat`,
the target is completly relocatable, which is a required feature of RustyHermit.

By default, code generated with this target should run on any `aarch64`
hardware; enabling additional target features may raise this baseline.
On `aarch64-unknown-none-hermitkernel`, `extern "C"` uses the [standard System V calling
convention](https://github.com/ARM-software/abi-aa/releases/download/2021Q3/sysvabi64.pdf),
without red zones.

This target generated binaries in the ELF format.

## Building the target

Typical you should not use the target directly. The target `aarch64-unknown-hermit`
builds the _user space_ of RustyHermit and supports red zones and floating-point
operations.
To build and link the kernel to the application, the crate
[hermit-sys](https://github.com/hermitcore/rusty-hermit/tree/master/hermit-sys)
should be used by adding the following lines to the `Cargo.toml` file of
your application.

```toml
[target.'cfg(target_os = "hermit")'.dependencies]
hermit-sys = "0.1.*"
```

The crate `hermit-sys` uses the target `aarch64-unknown-none-hermitkernel`
to build the kernel.

## Building Rust programs

Rust does not yet ship pre-compiled artifacts for this target. To compile for
this target, you need to build the crate `hermit-sys` (see
"Building the target" above).

## Testing

As `aarch64-unknown-none-hermitkernel` does not support `std`
and does not support running any Rust testsuite.

## Cross-compilation toolchains and C code

If you want to compile C code along with Rust you will need an
appropriate `aarch64` toolchain.

Rust *may* be able to use an `aarch64-linux-gnu-` toolchain with appropriate
standalone flags to build for this toolchain (depending on the assumptions of
that toolchain, see below), or you may wish to use a separate
`aarch64-unknown-none` (or `aarch64-elf-`) toolchain.

On some `aarch64` hosts that use ELF binaries, you *may* be able to use the host
C toolchain, if it does not introduce assumptions about the host environment
that don't match the expectations of a standalone environment. Otherwise, you
may need a separate toolchain for standalone/freestanding development, just as
when cross-compiling from a non-`aarch64` platform.