parent
b7d252e979
commit
86bb44b00d
@ -1,2 +1,3 @@
|
||||
build/
|
||||
target/
|
||||
.DS_Store
|
||||
|
@ -0,0 +1,66 @@
|
||||
# arch = {riscv32, riscv64, x86_64, aarch64}
|
||||
# mode = {debug, release}
|
||||
arch ?= riscv32
|
||||
mode ?= debug
|
||||
out_dir ?= build/$(arch)
|
||||
out_img ?= build/$(arch).img
|
||||
|
||||
rust_src_dir := rust/src/bin
|
||||
rust_bin_path := rust/target/$(arch)-rcore/$(mode)
|
||||
rust_bins := $(patsubst $(rust_src_dir)/%.rs, $(rust_bin_path)/%, $(wildcard $(rust_src_dir)/*.rs))
|
||||
ucore_bin_path := ucore/build/$(arch)
|
||||
biscuit_bin_path := biscuit/build/$(arch)
|
||||
|
||||
rust_build_args := --target targets/$(arch)-rcore.json
|
||||
cmake_build_args := -DARCH=$(arch)
|
||||
|
||||
ifeq ($(mode), release)
|
||||
rust_build_args += --release
|
||||
cmake_build_args += -DCMAKE_BUILD_TYPE=Release
|
||||
endif
|
||||
|
||||
|
||||
.PHONY: all clean build rust ucore biscuit bin
|
||||
|
||||
all: build
|
||||
|
||||
rust:
|
||||
@echo Building rust programs
|
||||
@cd rust && cargo xbuild $(rust_build_args)
|
||||
@rm -rf $(out_dir)/rust && mkdir -p $(out_dir)/rust
|
||||
@cp $(rust_bins) $(out_dir)/rust
|
||||
|
||||
ucore:
|
||||
ifneq ($(arch), x86_64)
|
||||
@echo Building ucore programs
|
||||
@mkdir -p ucore/build
|
||||
@cd ucore/build && cmake $(cmake_build_args) .. && make
|
||||
@rm -rf $(out_dir)/ucore && mkdir -p $(out_dir)/ucore
|
||||
@cp $(ucore_bin_path)/* $(out_dir)/ucore
|
||||
endif
|
||||
|
||||
biscuit:
|
||||
ifeq ($(arch), x86_64)
|
||||
@echo Building biscuit programs
|
||||
@mkdir -p biscuit/build
|
||||
@cd biscuit/build && cmake $(cmake_build_args) .. && make
|
||||
@rm -rf $(out_dir)/biscuit && mkdir -p $(out_dir)/biscuit
|
||||
@cp $(biscuit_bin_path)/* $(out_dir)/biscuit
|
||||
endif
|
||||
|
||||
build: rust ucore biscuit
|
||||
|
||||
sfsimg: $(out_img)
|
||||
|
||||
$(out_img): build mksfs
|
||||
@mksfs zip $(out_dir) $@
|
||||
|
||||
mksfs:
|
||||
ifeq ($(shell which mksfs),)
|
||||
@cargo install --git https://github.com/wangrunji0408/SimpleFileSystem-Rust --features="std"
|
||||
endif
|
||||
|
||||
clean:
|
||||
@cd rust && cargo clean
|
||||
@rm -rf biscuit/build ucore/build
|
||||
@rm -rf $(out_dir)
|
@ -0,0 +1,25 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "linked_list_allocator"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rcore-user"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"linked_list_allocator 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.4.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[metadata]
|
||||
"checksum linked_list_allocator 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "655d57c71827fe0891ce72231b6aa5e14033dae3f604609e6a6f807267c1678d"
|
||||
"checksum spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ceac490aa12c567115b40b7b7fceca03a6c9d53d5defea066123debc83c5dc1f"
|
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "rcore-user"
|
||||
version = "0.1.0"
|
||||
authors = ["Runji Wang <wangrunji0408@163.com>"]
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
linked_list_allocator = "0.6"
|
@ -0,0 +1,43 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rcore_user;
|
||||
|
||||
macro_rules! color_text {
|
||||
($text:expr, $color:expr) => {{
|
||||
format_args!("\x1b[{}m{}\x1b[0m", $color, $text)
|
||||
}};
|
||||
}
|
||||
|
||||
// IMPORTANT: Must define main() like this
|
||||
#[no_mangle]
|
||||
pub fn main() {
|
||||
println!(
|
||||
"{}{}{}{}{} {}{}{}{} {}{}{}{}{}{}",
|
||||
color_text!("H", 31),
|
||||
color_text!("e", 32),
|
||||
color_text!("l", 33),
|
||||
color_text!("l", 34),
|
||||
color_text!("o", 35),
|
||||
color_text!("R", 36),
|
||||
color_text!("u", 37),
|
||||
color_text!("s", 90),
|
||||
color_text!("t", 91),
|
||||
color_text!("u", 92),
|
||||
color_text!("C", 93),
|
||||
color_text!("o", 94),
|
||||
color_text!("r", 95),
|
||||
color_text!("e", 96),
|
||||
color_text!("!", 97),
|
||||
);
|
||||
|
||||
let text = "reguler \x1b[4munderline\x1b[24m \x1b[7mreverse\x1b[27m \x1b[9mstrikethrough\x1b[29m";
|
||||
println!("\x1b[47m{}\x1b[0m", color_text!(text, 30));
|
||||
for i in 31..38 {
|
||||
println!("{}", color_text!(text, i));
|
||||
}
|
||||
for i in 90..98 {
|
||||
println!("{}", color_text!(text, i));
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rcore_user;
|
||||
|
||||
// IMPORTANT: Must define main() like this
|
||||
#[no_mangle]
|
||||
pub fn main() {
|
||||
println!("Hello Rust uCore!");
|
||||
println!("I am process {}.", rcore_user::syscall::sys_getpid());
|
||||
println!("hello pass.");
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
#![feature(alloc)]
|
||||
|
||||
extern crate alloc;
|
||||
#[macro_use]
|
||||
extern crate rcore_user;
|
||||
|
||||
use alloc::vec::Vec;
|
||||
|
||||
use rcore_user::io::get_line;
|
||||
use rcore_user::syscall::{sys_exec, sys_fork, sys_wait};
|
||||
|
||||
// IMPORTANT: Must define main() like this
|
||||
#[no_mangle]
|
||||
pub fn main() -> i32 {
|
||||
println!("Rust user shell");
|
||||
loop {
|
||||
print!(">> ");
|
||||
let cmd = get_line();
|
||||
// split cmd, make argc & argv
|
||||
let cmd = cmd.replace(' ', "\0") + "\0";
|
||||
let ptrs: Vec<*const u8> = cmd.split('\0')
|
||||
.filter(|s| !s.is_empty()).map(|s| s.as_ptr()).collect();
|
||||
if ptrs.is_empty() {
|
||||
continue;
|
||||
}
|
||||
|
||||
let pid = sys_fork();
|
||||
assert!(pid >= 0);
|
||||
if pid == 0 {
|
||||
return sys_exec(ptrs[0], ptrs.len(), ptrs.as_ptr());
|
||||
} else {
|
||||
let mut code: i32 = 0;
|
||||
sys_wait(pid as usize, &mut code);
|
||||
println!("\n[Process exited with code {}]", code);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,92 @@
|
||||
use alloc::string::String;
|
||||
use core::fmt::{self, Write};
|
||||
use core::option::Option;
|
||||
|
||||
use crate::syscall::{sys_read, sys_write};
|
||||
|
||||
pub const STDIN: usize = 0;
|
||||
pub const STDOUT: usize = 1;
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! print {
|
||||
($($arg:tt)*) => ({
|
||||
$crate::io::print(format_args!($($arg)*));
|
||||
});
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! println {
|
||||
($fmt:expr) => (print!(concat!($fmt, "\n")));
|
||||
($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*));
|
||||
}
|
||||
|
||||
pub fn print(args: fmt::Arguments) {
|
||||
StdOut.write_fmt(args).unwrap();
|
||||
}
|
||||
|
||||
pub fn getc() -> Option<u8> {
|
||||
let mut c = 0u8;
|
||||
let ret = sys_read(STDIN, &mut c, 1);
|
||||
match ret {
|
||||
1 => Some(c),
|
||||
0 => None,
|
||||
_ => panic!(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_line() -> String {
|
||||
let mut s = String::new();
|
||||
loop {
|
||||
let ret = getc();
|
||||
match ret {
|
||||
None => return s,
|
||||
Some(byte) => {
|
||||
let c = byte as char;
|
||||
match c {
|
||||
'\x08' | '\x7f' /* '\b' */ => {
|
||||
if s.pop().is_some() {
|
||||
print!("\x08 \x08");
|
||||
}
|
||||
}
|
||||
' '...'\x7e' => {
|
||||
s.push(c);
|
||||
print!("{}", c);
|
||||
}
|
||||
'\n' | '\r' => {
|
||||
print!("\n");
|
||||
return s;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn putc(c: u8) {
|
||||
sys_write(STDOUT, &c, 1);
|
||||
}
|
||||
|
||||
struct StdOut;
|
||||
|
||||
impl fmt::Write for StdOut {
|
||||
fn write_str(&mut self, s: &str) -> fmt::Result {
|
||||
if sys_write(STDOUT, s.as_ptr(), s.len()) >= 0 {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(fmt::Error::default())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* VFS flags */
|
||||
// TODO: use bitflags
|
||||
// flags for open: choose one of these
|
||||
pub const O_RDONLY: usize = 0; // open for reading only
|
||||
pub const O_WRONLY: usize = 1; // open for writing only
|
||||
pub const O_RDWR: usize = 2; // open for reading and writing
|
||||
// then or in any of these:
|
||||
pub const O_CREAT: usize = 0x00000004; // create file if it does not exist
|
||||
pub const O_EXCL: usize = 0x00000008; // error if O_CREAT and the file exists
|
||||
pub const O_TRUNC: usize = 0x00000010; // truncate file upon open
|
||||
pub const O_APPEND: usize = 0x00000020; // append on each write
|
@ -0,0 +1,70 @@
|
||||
use crate::syscall::{sys_close, sys_dup2, sys_exit, sys_open};
|
||||
use crate::io::{O_RDONLY, O_WRONLY, STDIN, STDOUT};
|
||||
use crate::ALLOCATOR;
|
||||
|
||||
use core::alloc::Layout;
|
||||
use core::panic::PanicInfo;
|
||||
|
||||
#[linkage = "weak"]
|
||||
#[no_mangle]
|
||||
fn main() {
|
||||
panic!("No main() linked");
|
||||
}
|
||||
|
||||
fn initfd(fd2: usize, path: &str, open_flags: usize) -> i32 {
|
||||
let fd1 = sys_open(path, open_flags);
|
||||
if fd1 < 0 {
|
||||
return fd1;
|
||||
}
|
||||
let mut ret = fd1;
|
||||
let fd1 = fd1 as usize;
|
||||
if fd1 != fd2 {
|
||||
sys_close(fd2);
|
||||
ret = sys_dup2(fd1, fd2);
|
||||
sys_close(fd1);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
fn init_heap() {
|
||||
const HEAP_SIZE: usize = 0x1000;
|
||||
static mut HEAP: [u8; HEAP_SIZE] = [0; HEAP_SIZE];
|
||||
unsafe { ALLOCATOR.lock().init(HEAP.as_ptr() as usize, HEAP_SIZE); }
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn _start(_argc: isize, _argv: *const *const u8) -> ! {
|
||||
let fd = initfd(STDIN, "stdin:", O_RDONLY);
|
||||
if fd < 0 {
|
||||
panic!("open <stdin> failed: {}.", fd);
|
||||
}
|
||||
let fd = initfd(STDOUT, "stdout:", O_WRONLY);
|
||||
if fd < 0 {
|
||||
panic!("open <stdout> failed: {}.", fd);
|
||||
}
|
||||
|
||||
init_heap();
|
||||
main();
|
||||
sys_exit(0)
|
||||
}
|
||||
|
||||
#[lang = "eh_personality"]
|
||||
fn eh_personality() {}
|
||||
|
||||
#[panic_handler]
|
||||
fn panic(info: &PanicInfo) -> ! {
|
||||
let location = info.location().unwrap();
|
||||
let message = info.message().unwrap();
|
||||
println!("\n\nPANIC in {} at line {}\n {}", location.file(), location.line(), message);
|
||||
sys_exit(1)
|
||||
}
|
||||
|
||||
#[lang = "oom"]
|
||||
fn oom(_: Layout) -> ! {
|
||||
panic!("out of memory");
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn abort() -> ! {
|
||||
sys_exit(2)
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
#![no_std]
|
||||
#![feature(asm)]
|
||||
#![feature(alloc)]
|
||||
#![feature(lang_items)]
|
||||
#![feature(panic_info_message)]
|
||||
#![feature(linkage)]
|
||||
#![feature(compiler_builtins_lib)]
|
||||
|
||||
extern crate alloc;
|
||||
|
||||
#[macro_use]
|
||||
pub mod io;
|
||||
pub mod syscall;
|
||||
pub mod lang_items;
|
||||
|
||||
use linked_list_allocator::LockedHeap;
|
||||
|
||||
#[global_allocator]
|
||||
static ALLOCATOR: LockedHeap = LockedHeap::empty();
|
@ -0,0 +1,133 @@
|
||||
#[inline(always)]
|
||||
fn sys_call(syscall_id: SyscallId, arg0: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) -> i32 {
|
||||
let id = syscall_id as usize;
|
||||
let ret: i32;
|
||||
|
||||
unsafe {
|
||||
#[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
|
||||
asm!("ecall"
|
||||
: "={x10}" (ret)
|
||||
: "{x10}" (id), "{x11}" (arg0), "{x12}" (arg1), "{x13}" (arg2), "{x14}" (arg3), "{x15}" (arg4), "{x16}" (arg5)
|
||||
: "memory"
|
||||
: "volatile");
|
||||
#[cfg(target_arch = "x86")]
|
||||
asm!("int 0x80"
|
||||
: "={eax}" (ret)
|
||||
: "{eax}" (id), "{edx}" (arg0), "{ecx}" (arg1), "{ebx}" (arg2), "{edi}" (arg3), "{esi}" (arg4)
|
||||
: "memory"
|
||||
: "intel" "volatile");
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
asm!("syscall"
|
||||
: "={rax}" (ret)
|
||||
: "{rax}" (id), "{rdi}" (arg0), "{rsi}" (arg1), "{rdx}" (arg2), "{rcx}" (arg3), "{r8}" (arg4), "{r9}" (arg5)
|
||||
: "memory"
|
||||
: "intel" "volatile");
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
asm!("svc 0"
|
||||
: "={x0}" (ret)
|
||||
: "{x8}" (id), "{x0}" (arg0), "{x1}" (arg1), "{x2}" (arg2), "{x3}" (arg3), "{x4}" (arg4), "{x5}" (arg5)
|
||||
: "memory"
|
||||
: "volatile");
|
||||
}
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn sys_exit(code: usize) -> ! {
|
||||
sys_call(SyscallId::Exit, code, 0, 0, 0, 0, 0);
|
||||
unreachable!()
|
||||
}
|
||||
|
||||
|
||||
pub fn sys_exec(name: *const u8, argc: usize, argv: *const *const u8) -> i32 {
|
||||
sys_call(SyscallId::Exec, name as usize, argc, argv as usize, 0, 0, 0)
|
||||
}
|
||||
|
||||
pub fn sys_write(fd: usize, base: *const u8, len: usize) -> i32 {
|
||||
sys_call(SyscallId::Write, fd, base as usize, len, 0, 0, 0)
|
||||
}
|
||||
|
||||
pub fn sys_read(fd: usize, base: *mut u8, len: usize) -> i32 {
|
||||
sys_call(SyscallId::Read, fd, base as usize, len, 0, 0, 0)
|
||||
}
|
||||
|
||||
pub fn sys_open(path: &str, flags: usize) -> i32 {
|
||||
// UNSAFE: append '\0' to the string
|
||||
use core::mem::replace;
|
||||
let end = unsafe { &mut *(path.as_ptr().offset(path.len() as isize) as *mut u8) };
|
||||
let backup = replace(end, 0);
|
||||
let ret = sys_call(SyscallId::Open, path.as_ptr() as usize, flags, 0, 0, 0, 0);
|
||||
*end = backup;
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn sys_close(fd: usize) -> i32 {
|
||||
sys_call(SyscallId::Close, fd, 0, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
pub fn sys_dup2(fd1: usize, fd2: usize) -> i32 {
|
||||
sys_call(SyscallId::Dup2, fd1, fd2, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
/// Fork the current process. Return the child's PID.
|
||||
pub fn sys_fork() -> i32 {
|
||||
sys_call(SyscallId::Fork, 0, 0, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
/// Wait the process exit.
|
||||
/// Return the PID. Store exit code to `code` if it's not null.
|
||||
pub fn sys_wait(pid: usize, code: *mut i32) -> i32 {
|
||||
sys_call(SyscallId::Wait, pid, code as usize, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
pub fn sys_yield() -> i32 {
|
||||
sys_call(SyscallId::Yield, 0, 0, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
/// Kill the process
|
||||
pub fn sys_kill(pid: usize) -> i32 {
|
||||
sys_call(SyscallId::Kill, pid, 0, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
/// Get the current process id
|
||||
pub fn sys_getpid() -> i32 {
|
||||
sys_call(SyscallId::GetPid, 0, 0, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
pub fn sys_sleep(time: usize) -> i32 {
|
||||
sys_call(SyscallId::Sleep, time, 0, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
pub fn sys_get_time() -> i32 {
|
||||
sys_call(SyscallId::GetTime, 0, 0, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
pub fn sys_set_priority(priority: usize) -> i32 {
|
||||
sys_call(SyscallId::SetPriority, priority, 0, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
enum SyscallId {
|
||||
Exit = 60,
|
||||
Fork = 57,
|
||||
Wait = 61,
|
||||
Exec = 59,
|
||||
Clone = 56,
|
||||
Yield = 24,
|
||||
Sleep = 35,
|
||||
Kill = 62,
|
||||
GetTime = 96,
|
||||
GetPid = 39,
|
||||
Mmap = 9,
|
||||
Munmap = 11,
|
||||
Open = 2,
|
||||
Close = 3,
|
||||
Read = 0,
|
||||
Write = 1,
|
||||
Seek = 8,
|
||||
Fstat = 4,
|
||||
Fsync = 74,
|
||||
GetCwd = 79,
|
||||
GetDirEntry = 78,
|
||||
Dup2 = 33,
|
||||
SetPriority = 141,
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
{
|
||||
"abi-blacklist": [
|
||||
"stdcall",
|
||||
"fastcall",
|
||||
"vectorcall",
|
||||
"thiscall",
|
||||
"win64",
|
||||
"sysv64"
|
||||
],
|
||||
"arch": "aarch64",
|
||||
"data-layout": "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128",
|
||||
"executables": true,
|
||||
"linker": "rust-lld",
|
||||
"linker-flavor": "ld.lld",
|
||||
"linker-is-gnu": true,
|
||||
"pre-link-args": {
|
||||
"ld.lld": [
|
||||
"--image-base=0xffff000000000000"
|
||||
]
|
||||
},
|
||||
"llvm-target": "aarch64-unknown-none",
|
||||
"no-compiler-rt": true,
|
||||
"features": "+a53,+strict-align,-neon",
|
||||
"max-atomic-width": 128,
|
||||
"os": "none",
|
||||
"panic": "abort",
|
||||
"panic-strategy": "abort",
|
||||
"relocation-model": "static",
|
||||
"position-independent-executables": true,
|
||||
"target-c-int-width": "32",
|
||||
"target-endian": "little",
|
||||
"target-pointer-width": "64",
|
||||
"target-family": "unix",
|
||||
"disable-redzone": true
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
{
|
||||
"arch": "x86",
|
||||
"cpu": "i386",
|
||||
"data-layout": "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128",
|
||||
"executables": true,
|
||||
"linker-flavor": "ld.lld",
|
||||
"linker": "rust-lld",
|
||||
"llvm-target": "i386",
|
||||
"max-atomic-width": 64,
|
||||
"os": "none",
|
||||
"panic-strategy": "abort",
|
||||
"target-c-int-width": "32",
|
||||
"target-endian": "little",
|
||||
"target-pointer-width": "32",
|
||||
"features": "-mmx,-sse,+soft-float"
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
{
|
||||
"llvm-target": "riscv32",
|
||||
"data-layout": "e-m:e-p:32:32-i64:64-n32-S128",
|
||||
"target-endian": "little",
|
||||
"target-pointer-width": "32",
|
||||
"target-c-int-width": "32",
|
||||
"os": "none",
|
||||
"arch": "riscv32",
|
||||
"cpu": "generic-rv32",
|
||||
"features": "+m,+a,+c",
|
||||
"max-atomic-width": "32",
|
||||
"linker": "rust-lld",
|
||||
"linker-flavor": "ld.lld",
|
||||
"executables": true,
|
||||
"panic-strategy": "abort",
|
||||
"relocation-model": "static",
|
||||
"abi-blacklist": [
|
||||
"cdecl",
|
||||
"stdcall",
|
||||
"fastcall",
|
||||
"vectorcall",
|
||||
"thiscall",
|
||||
"aapcs",
|
||||
"win64",
|
||||
"sysv64",
|
||||
"ptx-kernel",
|
||||
"msp430-interrupt",
|
||||
"x86-interrupt"
|
||||
]
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
{
|
||||
"llvm-target": "riscv64",
|
||||
"data-layout": "e-m:e-p:64:64-i64:64-n64-S128",
|
||||
"target-endian": "little",
|
||||
"target-pointer-width": "64",
|
||||
"target-c-int-width": "32",
|
||||
"os": "none",
|
||||
"arch": "riscv64",
|
||||
"cpu": "generic-rv64",
|
||||
"features": "+m,+a,+c",
|
||||
"max-atomic-width": "64",
|
||||
"linker": "rust-lld",
|
||||
"linker-flavor": "ld.lld",
|
||||
"executables": true,
|
||||
"panic-strategy": "abort",
|
||||
"relocation-model": "static",
|
||||
"abi-blacklist": [
|
||||
"cdecl",
|
||||
"stdcall",
|
||||
"fastcall",
|
||||
"vectorcall",
|
||||
"thiscall",
|
||||
"aapcs",
|
||||
"win64",
|
||||
"sysv64",
|
||||
"ptx-kernel",
|
||||
"msp430-interrupt",
|
||||
"x86-interrupt"
|
||||
]
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
{
|
||||
"llvm-target": "x86_64-unknown-none",
|
||||
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
|
||||
"arch": "x86_64",
|
||||
"target-endian": "little",
|
||||
"target-pointer-width": "64",
|
||||
"target-c-int-width": "32",
|
||||
"os": "none",
|
||||
"executables": true,
|
||||
"linker": "rust-lld",
|
||||
"linker-flavor": "ld.lld",
|
||||
"panic-strategy": "abort",
|
||||
"disable-redzone": true,
|
||||
"features": "-mmx,-sse,+soft-float"
|
||||
}
|
Loading…
Reference in new issue