Add rv64IM
This commit is contained in:
parent
693f365667
commit
1fe0a85df7
6 changed files with 95 additions and 0 deletions
|
|
@ -1686,6 +1686,7 @@ supported_targets! {
|
|||
("riscv32imac-unknown-xous-elf", riscv32imac_unknown_xous_elf),
|
||||
("riscv32gc-unknown-linux-gnu", riscv32gc_unknown_linux_gnu),
|
||||
("riscv32gc-unknown-linux-musl", riscv32gc_unknown_linux_musl),
|
||||
("riscv64im-unknown-none-elf", riscv64im_unknown_none_elf),
|
||||
("riscv64imac-unknown-none-elf", riscv64imac_unknown_none_elf),
|
||||
("riscv64gc-unknown-none-elf", riscv64gc_unknown_none_elf),
|
||||
("riscv64gc-unknown-linux-gnu", riscv64gc_unknown_linux_gnu),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
use crate::spec::{
|
||||
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target, TargetMetadata,
|
||||
TargetOptions,
|
||||
};
|
||||
|
||||
pub(crate) fn target() -> Target {
|
||||
Target {
|
||||
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
|
||||
llvm_target: "riscv64".into(),
|
||||
metadata: TargetMetadata {
|
||||
description: Some("Bare RISC-V (RV64IM ISA)".into()),
|
||||
tier: Some(3),
|
||||
host_tools: Some(false),
|
||||
std: Some(false),
|
||||
},
|
||||
pointer_width: 64,
|
||||
arch: Arch::RiscV64,
|
||||
|
||||
options: TargetOptions {
|
||||
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
|
||||
linker: Some("rust-lld".into()),
|
||||
cpu: "generic-rv64".into(),
|
||||
max_atomic_width: Some(64),
|
||||
atomic_cas: false,
|
||||
features: "+m,+forced-atomics".into(),
|
||||
llvm_abiname: "lp64".into(),
|
||||
panic_strategy: PanicStrategy::Abort,
|
||||
relocation_model: RelocModel::Static,
|
||||
code_model: Some(CodeModel::Medium),
|
||||
emit_debug_gdb_scripts: false,
|
||||
eh_frame_header: false,
|
||||
..Default::default()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
@ -112,6 +112,7 @@
|
|||
- [riscv32i\*-unknown-none-elf](platform-support/riscv32-unknown-none-elf.md)
|
||||
- [riscv32im-risc0-zkvm-elf](platform-support/riscv32im-risc0-zkvm-elf.md)
|
||||
- [riscv32imac-unknown-xous-elf](platform-support/riscv32imac-unknown-xous-elf.md)
|
||||
- [riscv64im-unknown-none-elf](platform-support/riscv64im-unknown-none-elf.md)
|
||||
- [riscv64gc-unknown-linux-gnu](platform-support/riscv64gc-unknown-linux-gnu.md)
|
||||
- [riscv64gc-unknown-linux-musl](platform-support/riscv64gc-unknown-linux-musl.md)
|
||||
- [riscv64a23-unknown-linux-gnu](platform-support/riscv64a23-unknown-linux-gnu.md)
|
||||
|
|
|
|||
|
|
@ -184,6 +184,7 @@ target | std | notes
|
|||
[`riscv32imc-unknown-none-elf`](platform-support/riscv32-unknown-none-elf.md) | * | Bare RISC-V (RV32IMC ISA)
|
||||
[`riscv64gc-unknown-linux-musl`](platform-support/riscv64gc-unknown-linux-musl.md) | ✓ |RISC-V Linux (kernel 4.20+, musl 1.2.5)
|
||||
`riscv64gc-unknown-none-elf` | * | Bare RISC-V (RV64IMAFDC ISA)
|
||||
[`riscv64im-unknown-none-elf`](platform-support/riscv64im-unknown-none-elf.md) | * | Bare RISC-V (RV64IM ISA)
|
||||
`riscv64imac-unknown-none-elf` | * | Bare RISC-V (RV64IMAC ISA)
|
||||
`sparc64-unknown-linux-gnu` | ✓ | SPARC Linux (kernel 4.4+, glibc 2.23)
|
||||
[`thumbv6m-none-eabi`](platform-support/thumbv6m-none-eabi.md) | * | Bare Armv6-M
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
# `riscv64im-unknown-none-elf`
|
||||
|
||||
**Tier: 3**
|
||||
|
||||
Bare-metal target for RISC-V CPUs with the RV64IM ISA.
|
||||
|
||||
## Target maintainers
|
||||
|
||||
* Rust Embedded Working Group, [RISC-V team](https://github.com/rust-embedded/wg#the-risc-v-team)
|
||||
|
||||
## Requirements
|
||||
|
||||
This target is cross-compiled and uses static linking. The target supports `core` and `alloc`, but not `std`.
|
||||
|
||||
The target does not support atomic compare-and-swap operations, as the RV64IM ISA lacks the "A" (Atomics) extension. Atomic operations are emulated using the `+forced-atomics` feature.
|
||||
|
||||
No external toolchain is required and the default `rust-lld` linker works, but you must specify a linker script. The [`riscv-rt`] crate provides suitable linker scripts. The [`riscv-rust-quickstart`] repository gives examples of RISC-V bare-metal projects.
|
||||
|
||||
[`riscv-rt`]: https://crates.io/crates/riscv-rt
|
||||
[`riscv-rust-quickstart`]: https://github.com/riscv-rust/riscv-rust-quickstart
|
||||
|
||||
## Building the target
|
||||
|
||||
This target is included in Rust and can be installed via `rustup`:
|
||||
|
||||
```bash
|
||||
rustup target add riscv64im-unknown-none-elf
|
||||
```
|
||||
|
||||
## Building Rust programs
|
||||
|
||||
Build using the standard Cargo workflow:
|
||||
|
||||
```bash
|
||||
cargo build --target riscv64im-unknown-none-elf
|
||||
```
|
||||
|
||||
You will need to provide a linker script. The [`riscv-rt`] crate handles this automatically when used as a dependency.
|
||||
|
||||
## Testing
|
||||
|
||||
This is a cross-compiled `no-std` target, which must be run either in a simulator or by programming onto suitable hardware. It is not possible to run the Rust test-suite on this target.
|
||||
|
||||
You can test the target in QEMU with:
|
||||
|
||||
```bash
|
||||
qemu-system-riscv64 -machine virt -cpu rv64,a=false,c=false -nographic -semihosting -kernel your-binary
|
||||
```
|
||||
|
||||
Note: You must explicitly disable the 'a' (atomics) and 'c' (compressed) extensions when using QEMU to accurately emulate an RV64IM-only CPU.
|
||||
|
||||
## Cross-compilation toolchains and C code
|
||||
|
||||
This target supports C code. If interlinking with C or C++, you may need to use `riscv64-unknown-elf-gcc` with the appropriate `-march=rv64im -mabi=lp64` flags as a linker instead of `rust-lld`.
|
||||
|
|
@ -520,6 +520,9 @@
|
|||
//@ revisions: riscv64gc_unknown_redox
|
||||
//@ [riscv64gc_unknown_redox] compile-flags: --target riscv64gc-unknown-redox
|
||||
//@ [riscv64gc_unknown_redox] needs-llvm-components: riscv
|
||||
//@ revisions: riscv64im_unknown_none_elf
|
||||
//@ [riscv64im_unknown_none_elf] compile-flags: --target riscv64im-unknown-none-elf
|
||||
//@ [riscv64im_unknown_none_elf] needs-llvm-components: riscv
|
||||
//@ revisions: riscv64imac_unknown_none_elf
|
||||
//@ [riscv64imac_unknown_none_elf] compile-flags: --target riscv64imac-unknown-none-elf
|
||||
//@ [riscv64imac_unknown_none_elf] needs-llvm-components: riscv
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue