Skip to content

Commit

Permalink
Add a Rust component in the runtime.
Browse files Browse the repository at this point in the history
whitequark committed Aug 17, 2016
1 parent 6c2ca69 commit 4c6cad2
Showing 13 changed files with 243 additions and 6 deletions.
18 changes: 18 additions & 0 deletions artiq/runtime.rs/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions artiq/runtime.rs/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[package]
authors = ["The ARTIQ Project Developers"]
name = "runtime"
version = "0.0.0"

[lib]
name = "artiq_rust"
crate-type = ["staticlib"]
path = "src/lib.rs"

[dependencies]
std_artiq = { path = "libstd_artiq" }

[profile.dev]
panic = 'abort'
opt-level = 2
8 changes: 8 additions & 0 deletions artiq/runtime.rs/liballoc_artiq/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
authors = ["The ARTIQ Project Developers"]
name = "alloc_artiq"
version = "0.0.0"

[lib]
name = "alloc_artiq"
path = "lib.rs"
86 changes: 86 additions & 0 deletions artiq/runtime.rs/liballoc_artiq/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#![feature(allocator, libc)]
#![no_std]
#![allocator]

// The minimum alignment guaranteed by the architecture.
const MIN_ALIGN: usize = 8;

#[no_mangle]
pub extern "C" fn __rust_allocate(size: usize, align: usize) -> *mut u8 {
unsafe { imp::allocate(size, align) }
}

#[no_mangle]
pub extern "C" fn __rust_deallocate(ptr: *mut u8, old_size: usize, align: usize) {
unsafe { imp::deallocate(ptr, old_size, align) }
}

#[no_mangle]
pub extern "C" fn __rust_reallocate(ptr: *mut u8,
old_size: usize,
size: usize,
align: usize)
-> *mut u8 {
unsafe { imp::reallocate(ptr, old_size, size, align) }
}

#[no_mangle]
pub extern "C" fn __rust_reallocate_inplace(ptr: *mut u8,
old_size: usize,
size: usize,
align: usize)
-> usize {
unsafe { imp::reallocate_inplace(ptr, old_size, size, align) }
}

#[no_mangle]
pub extern "C" fn __rust_usable_size(size: usize, align: usize) -> usize {
imp::usable_size(size, align)
}

mod imp {
extern crate libc;

use core::cmp;
use core::ptr;
use MIN_ALIGN;

pub unsafe fn allocate(size: usize, align: usize) -> *mut u8 {
if align <= MIN_ALIGN {
libc::malloc(size as libc::size_t) as *mut u8
} else {
aligned_malloc(size, align)
}
}

unsafe fn aligned_malloc(_size: usize, _align: usize) -> *mut u8 {
panic!("aligned_malloc not implemented")
}

pub unsafe fn reallocate(ptr: *mut u8, old_size: usize,
size: usize, align: usize) -> *mut u8 {
if align <= MIN_ALIGN {
libc::realloc(ptr as *mut libc::c_void, size as libc::size_t) as *mut u8
} else {
let new_ptr = allocate(size, align);
if !new_ptr.is_null() {
ptr::copy(ptr, new_ptr, cmp::min(size, old_size));
deallocate(ptr, old_size, align);
}
new_ptr
}
}

pub unsafe fn reallocate_inplace(_ptr: *mut u8, old_size: usize,
_size: usize, _align: usize) -> usize {
old_size
}

pub unsafe fn deallocate(ptr: *mut u8, _old_size: usize, _align: usize) {
libc::free(ptr as *mut libc::c_void)
}

pub fn usable_size(size: usize, _align: usize) -> usize {
size
}
}
11 changes: 11 additions & 0 deletions artiq/runtime.rs/libstd_artiq/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[package]
authors = ["The ARTIQ Project Developers"]
name = "std_artiq"
version = "0.0.0"

[lib]
name = "std_artiq"
path = "lib.rs"

[dependencies]
alloc_artiq = { path = "../liballoc_artiq" }
64 changes: 64 additions & 0 deletions artiq/runtime.rs/libstd_artiq/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#![feature(lang_items, asm, collections, libc, needs_panic_runtime)]
#![no_std]
#![needs_panic_runtime]

extern crate alloc_artiq;
extern crate collections;
extern crate libc;

pub mod prelude {
pub mod v1 {
pub use core::prelude::v1::*;
pub use collections::*;
}
}

use core::fmt::Write;

#[macro_export]
macro_rules! print {
($($arg:tt)*) => ($crate::print_fmt(format_args!($($arg)*)));
}

#[macro_export]
macro_rules! println {
($fmt:expr) => (print!(concat!($fmt, "\n")));
($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*));
}

extern {
fn putchar(c: libc::c_int) -> libc::c_int;
fn readchar() -> libc::c_char;
}

pub struct Console;

impl core::fmt::Write for Console {
fn write_str(&mut self, s: &str) -> Result<(), core::fmt::Error> {
for c in s.bytes() { unsafe { putchar(c as i32); } }
Ok(())
}
}

pub fn print_fmt(args: self::core::fmt::Arguments) {
let _ = Console.write_fmt(args);
}

#[lang = "panic_fmt"]
extern fn panic_fmt(args: self::core::fmt::Arguments, file: &'static str, line: u32) -> ! {
let _ = write!(Console, "panic at {}:{}: ", file, line);
let _ = Console.write_fmt(args);
let _ = write!(Console, "\nwaiting for debugger...\n");
unsafe {
let _ = readchar();
loop { asm!("l.trap 0") }
}
}

// Allow linking with crates that are built as -Cpanic=unwind even when the root crate
// is built with -Cpanic=abort.
#[allow(non_snake_case)]
#[no_mangle]
pub extern "C" fn _Unwind_Resume() -> ! {
loop {}
}
11 changes: 11 additions & 0 deletions artiq/runtime.rs/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#![no_std]

#[macro_use]
extern crate std_artiq as std;

use std::prelude::v1::*;

#[no_mangle]
pub extern "C" fn rust_main() {
println!("hello from rust!");
}
14 changes: 12 additions & 2 deletions artiq/runtime/Makefile
Original file line number Diff line number Diff line change
@@ -27,8 +27,9 @@ all: runtime.bin runtime.fbi
%.fbi: %.bin
@echo " MSCIMG " $@ && $(PYTHON) -m misoc.tools.mkmscimg -f -o $@ $<

runtime.elf: $(OBJECTS)
runtime.elf: $(OBJECTS) libartiq_rust.a
$(LD) $(LDFLAGS) \
--gc-sections \
-T $(RUNTIME_DIRECTORY)/runtime.ld \
-N -o $@ \
../libbase/crt0-$(CPU).o \
@@ -38,7 +39,8 @@ runtime.elf: $(OBJECTS)
-L../libm \
-L../liballoc \
-L../liblwip \
-lbase -lm -lcompiler-rt -lalloc -llwip
-Lcargo/or1k-unknown-none/debug/ \
-lartiq_rust -lbase -lm -lcompiler-rt -lalloc -llwip
@chmod -x $@

ksupport.elf: $(OBJECTS_KSUPPORT)
@@ -58,6 +60,14 @@ ksupport.elf: $(OBJECTS_KSUPPORT)
ksupport_data.o: ksupport.elf
$(LD) -r -b binary -o $@ $<

libartiq_rust.a:
CARGO_TARGET_DIR="./cargo" \
cargo rustc --verbose \
--manifest-path $(RUNTIME_DIRECTORY)/../runtime.rs/Cargo.toml \
--target=or1k-unknown-none -- \
-C target-feature=+mul,+div,+ffl1,+cmov,+addc -C opt-level=s \
-L../libcompiler-rt

%.o: $(RUNTIME_DIRECTORY)/%.c
$(compile)

5 changes: 5 additions & 0 deletions artiq/runtime/main.c
Original file line number Diff line number Diff line change
@@ -262,6 +262,8 @@ static int check_test_mode(void)

extern void _fheap, _eheap;

extern void rust_main();

int main(void)
{
irq_setmask(0);
@@ -276,6 +278,9 @@ int main(void)
puts("Press 't' to enter test mode...");
blink_led();

puts("Calling Rust...");
rust_main();

if(check_test_mode()) {
puts("Entering test mode.");
test_main();
4 changes: 3 additions & 1 deletion conda/artiq-kc705-nist_clock/meta.yaml
Original file line number Diff line number Diff line change
@@ -15,7 +15,9 @@ requirements:
- migen 0.2
- misoc 0.2
- llvm-or1k
- binutils-or1k-linux
- binutils-or1k-linux >=2.27
- rust-core-or1k
- cargo
run:
- artiq {{ "{tag} py_{number}+git{hash}".format(tag=environ.get("GIT_DESCRIBE_TAG"), number=environ.get("GIT_DESCRIBE_NUMBER"), hash=environ.get("GIT_DESCRIBE_HASH")[1:]) if "GIT_DESCRIBE_TAG" in environ else "" }}

4 changes: 3 additions & 1 deletion conda/artiq-kc705-nist_qc1/meta.yaml
Original file line number Diff line number Diff line change
@@ -15,7 +15,9 @@ requirements:
- migen 0.2
- misoc 0.2
- llvm-or1k
- binutils-or1k-linux
- binutils-or1k-linux >=2.27
- rust-core-or1k
- cargo
run:
- artiq {{ "{tag} py_{number}+git{hash}".format(tag=environ.get("GIT_DESCRIBE_TAG"), number=environ.get("GIT_DESCRIBE_NUMBER"), hash=environ.get("GIT_DESCRIBE_HASH")[1:]) if "GIT_DESCRIBE_TAG" in environ else "" }}

4 changes: 3 additions & 1 deletion conda/artiq-kc705-nist_qc2/meta.yaml
Original file line number Diff line number Diff line change
@@ -15,7 +15,9 @@ requirements:
- migen 0.2
- misoc 0.2
- llvm-or1k
- binutils-or1k-linux
- binutils-or1k-linux >=2.27
- rust-core-or1k
- cargo
run:
- artiq {{ "{tag} py_{number}+git{hash}".format(tag=environ.get("GIT_DESCRIBE_TAG"), number=environ.get("GIT_DESCRIBE_NUMBER"), hash=environ.get("GIT_DESCRIBE_HASH")[1:]) if "GIT_DESCRIBE_TAG" in environ else "" }}

4 changes: 3 additions & 1 deletion conda/artiq-pipistrello-nist_qc1/meta.yaml
Original file line number Diff line number Diff line change
@@ -15,7 +15,9 @@ requirements:
- migen 0.2
- misoc 0.2
- llvm-or1k
- binutils-or1k-linux
- binutils-or1k-linux >=2.27
- rust-core-or1k
- cargo
run:
- artiq {{ "{tag} py_{number}+git{hash}".format(tag=environ.get("GIT_DESCRIBE_TAG"), number=environ.get("GIT_DESCRIBE_NUMBER"), hash=environ.get("GIT_DESCRIBE_HASH")[1:]) if "GIT_DESCRIBE_TAG" in environ else "" }}

0 comments on commit 4c6cad2

Please sign in to comment.