forked from M-Labs/artiq
firmware: restructure to avoid #[path = "..."] mod ...;
Such code is fragile, introduces mess in dependencies, and inflates compile times.
This commit is contained in:
parent
d04e611232
commit
2a81819eb0
23
artiq/firmware/Cargo.lock
generated
23
artiq/firmware/Cargo.lock
generated
@ -10,6 +10,13 @@ version = "0.0.0"
|
|||||||
name = "alloc_none"
|
name = "alloc_none"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "amp"
|
||||||
|
version = "0.0.0"
|
||||||
|
dependencies = [
|
||||||
|
"board 0.0.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "board"
|
name = "board"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
@ -93,11 +100,13 @@ name = "ksupport"
|
|||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"alloc_none 0.0.0",
|
"alloc_none 0.0.0",
|
||||||
|
"amp 0.0.0",
|
||||||
"board 0.0.0",
|
"board 0.0.0",
|
||||||
"build_artiq 0.0.0",
|
"build_artiq 0.0.0",
|
||||||
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cslice 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cslice 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"dyld 0.0.0",
|
"dyld 0.0.0",
|
||||||
|
"proto 0.0.0",
|
||||||
"std_artiq 0.0.0",
|
"std_artiq 0.0.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -130,21 +139,33 @@ name = "managed"
|
|||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proto"
|
||||||
|
version = "0.0.0"
|
||||||
|
dependencies = [
|
||||||
|
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"cslice 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"dyld 0.0.0",
|
||||||
|
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"std_artiq 0.0.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "runtime"
|
name = "runtime"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"alloc_artiq 0.0.0",
|
"alloc_artiq 0.0.0",
|
||||||
|
"amp 0.0.0",
|
||||||
"board 0.0.0",
|
"board 0.0.0",
|
||||||
"build_artiq 0.0.0",
|
"build_artiq 0.0.0",
|
||||||
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"compiler_builtins 0.1.0 (git+https://github.com/rust-lang-nursery/compiler-builtins?rev=631b568)",
|
"compiler_builtins 0.1.0 (git+https://github.com/rust-lang-nursery/compiler-builtins?rev=631b568)",
|
||||||
"cslice 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cslice 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"drtioaux 0.0.0",
|
"drtioaux 0.0.0",
|
||||||
"dyld 0.0.0",
|
|
||||||
"fringe 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fringe 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"logger_artiq 0.0.0",
|
"logger_artiq 0.0.0",
|
||||||
|
"proto 0.0.0",
|
||||||
"smoltcp 0.2.1 (git+https://github.com/m-labs/smoltcp?rev=e8ece3e)",
|
"smoltcp 0.2.1 (git+https://github.com/m-labs/smoltcp?rev=e8ece3e)",
|
||||||
"std_artiq 0.0.0",
|
"std_artiq 0.0.0",
|
||||||
]
|
]
|
||||||
|
@ -13,9 +13,11 @@ crate-type = ["staticlib"]
|
|||||||
build_artiq = { path = "../libbuild_artiq" }
|
build_artiq = { path = "../libbuild_artiq" }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
alloc_none = { path = "../liballoc_none" }
|
|
||||||
std_artiq = { path = "../libstd_artiq" }
|
|
||||||
board = { path = "../libboard" }
|
|
||||||
dyld = { path = "../libdyld" }
|
|
||||||
byteorder = { version = "1.0", default-features = false }
|
byteorder = { version = "1.0", default-features = false }
|
||||||
cslice = { version = "0.3" }
|
cslice = { version = "0.3" }
|
||||||
|
alloc_none = { path = "../liballoc_none" }
|
||||||
|
std_artiq = { path = "../libstd_artiq" }
|
||||||
|
dyld = { path = "../libdyld" }
|
||||||
|
board = { path = "../libboard" }
|
||||||
|
proto = { path = "../libproto" }
|
||||||
|
amp = { path = "../libamp" }
|
||||||
|
@ -23,7 +23,7 @@ $(RUSTOUT)/libksupport.a:
|
|||||||
|
|
||||||
ksupport.elf: $(RUSTOUT)/libksupport.a glue.o
|
ksupport.elf: $(RUSTOUT)/libksupport.a glue.o
|
||||||
$(LD) $(LDFLAGS) -T $(KSUPPORT_DIRECTORY)/ksupport.ld -o $@ $^ \
|
$(LD) $(LDFLAGS) -T $(KSUPPORT_DIRECTORY)/ksupport.ld -o $@ $^ \
|
||||||
-lbase -lm -lcompiler-rt -lunwind
|
-lunwind -lcompiler-rt -lbase -lm
|
||||||
@chmod -x $@
|
@chmod -x $@
|
||||||
|
|
||||||
%.o: $(KSUPPORT_DIRECTORY)/%.c
|
%.o: $(KSUPPORT_DIRECTORY)/%.c
|
||||||
|
@ -433,3 +433,28 @@ pub unsafe extern fn reraise() -> ! {
|
|||||||
uw::_Unwind_Resume(&mut INFLIGHT.uw_exception)
|
uw::_Unwind_Resume(&mut INFLIGHT.uw_exception)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stub implementations for the functions the panic_unwind crate expects to be provided.
|
||||||
|
// These all do nothing in libunwind, but aren't built for OR1K.
|
||||||
|
pub mod stubs {
|
||||||
|
#![allow(bad_style, unused_variables)]
|
||||||
|
|
||||||
|
use super::{uw, c_int};
|
||||||
|
|
||||||
|
#[export_name="_Unwind_GetIPInfo"]
|
||||||
|
pub unsafe extern fn _Unwind_GetIPInfo(ctx: *mut uw::_Unwind_Context,
|
||||||
|
ip_before_insn: *mut c_int) -> uw::_Unwind_Word {
|
||||||
|
*ip_before_insn = 0;
|
||||||
|
uw::_Unwind_GetIP(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[export_name="_Unwind_GetTextRelBase"]
|
||||||
|
pub unsafe extern fn _Unwind_GetTextRelBase(ctx: *mut uw::_Unwind_Context) -> uw::_Unwind_Ptr {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[export_name="_Unwind_GetDataRelBase"]
|
||||||
|
pub unsafe extern fn _Unwind_GetDataRelBase(ctx: *mut uw::_Unwind_Context) -> uw::_Unwind_Ptr {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,54 +1,26 @@
|
|||||||
#![feature(lang_items, asm, libc, panic_unwind, unwind_attributes)]
|
#![feature(lang_items, asm, libc, panic_unwind, unwind_attributes)]
|
||||||
#![no_std]
|
#![no_std]
|
||||||
|
|
||||||
extern crate alloc_none;
|
|
||||||
#[macro_use]
|
|
||||||
extern crate std_artiq as std;
|
|
||||||
extern crate unwind;
|
extern crate unwind;
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
extern crate byteorder;
|
extern crate byteorder;
|
||||||
extern crate board;
|
|
||||||
extern crate cslice;
|
extern crate cslice;
|
||||||
|
|
||||||
|
extern crate alloc_none;
|
||||||
|
extern crate std_artiq as std;
|
||||||
|
|
||||||
|
extern crate board;
|
||||||
extern crate dyld;
|
extern crate dyld;
|
||||||
|
extern crate proto;
|
||||||
#[path = "../runtime/mailbox.rs"]
|
extern crate amp;
|
||||||
mod mailbox;
|
|
||||||
|
|
||||||
#[path = "../runtime/proto.rs"]
|
|
||||||
mod proto;
|
|
||||||
#[path = "../runtime/kernel_proto.rs"]
|
|
||||||
mod kernel_proto;
|
|
||||||
#[path = "../runtime/rpc_proto.rs"]
|
|
||||||
mod rpc_proto;
|
|
||||||
|
|
||||||
mod api;
|
|
||||||
|
|
||||||
use core::{mem, ptr, slice, str};
|
use core::{mem, ptr, slice, str};
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
use cslice::{CSlice, AsCSlice};
|
use cslice::{CSlice, AsCSlice};
|
||||||
use kernel_proto::*;
|
|
||||||
use dyld::Library;
|
use dyld::Library;
|
||||||
|
use proto::{kernel_proto, rpc_proto};
|
||||||
macro_rules! artiq_raise {
|
use proto::kernel_proto::*;
|
||||||
($name:expr, $message:expr, $param0:expr, $param1:expr, $param2:expr) => ({
|
use amp::{mailbox, rpc_queue};
|
||||||
use cslice::AsCSlice;
|
|
||||||
let exn = $crate::eh::Exception {
|
|
||||||
name: concat!("0:artiq.coredevice.exceptions.", $name).as_bytes().as_c_slice(),
|
|
||||||
file: file!().as_bytes().as_c_slice(),
|
|
||||||
line: line!(),
|
|
||||||
column: column!(),
|
|
||||||
// https://github.com/rust-lang/rfcs/pull/1719
|
|
||||||
function: "(Rust function)".as_bytes().as_c_slice(),
|
|
||||||
message: $message.as_bytes().as_c_slice(),
|
|
||||||
param: [$param0, $param1, $param2]
|
|
||||||
};
|
|
||||||
#[allow(unused_unsafe)]
|
|
||||||
unsafe { $crate::eh::raise(&exn) }
|
|
||||||
});
|
|
||||||
($name:expr, $message:expr) => ({
|
|
||||||
artiq_raise!($name, $message, 0, 0, 0)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
fn send(request: &Message) {
|
fn send(request: &Message) {
|
||||||
unsafe { mailbox::send(request as *const _ as usize) }
|
unsafe { mailbox::send(request as *const _ as usize) }
|
||||||
@ -75,6 +47,14 @@ macro_rules! recv {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
#[lang = "panic_fmt"]
|
||||||
|
pub extern fn panic_fmt(args: core::fmt::Arguments, file: &'static str, line: u32) -> ! {
|
||||||
|
send(&Log(format_args!("panic at {}:{}: {}", file, line, args)));
|
||||||
|
send(&RunAborted);
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! print {
|
macro_rules! print {
|
||||||
($($arg:tt)*) => ($crate::send(&$crate::kernel_proto::Log(format_args!($($arg)*))));
|
($($arg:tt)*) => ($crate::send(&$crate::kernel_proto::Log(format_args!($($arg)*))));
|
||||||
}
|
}
|
||||||
@ -84,19 +64,31 @@ macro_rules! println {
|
|||||||
($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*));
|
($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[path = "../runtime/rpc_queue.rs"]
|
macro_rules! raise {
|
||||||
mod rpc_queue;
|
($name:expr, $message:expr, $param0:expr, $param1:expr, $param2:expr) => ({
|
||||||
mod rtio;
|
use cslice::AsCSlice;
|
||||||
mod eh;
|
let exn = $crate::eh::Exception {
|
||||||
|
name: concat!("0:artiq.coredevice.exceptions.", $name).as_bytes().as_c_slice(),
|
||||||
#[no_mangle]
|
file: file!().as_bytes().as_c_slice(),
|
||||||
#[lang = "panic_fmt"]
|
line: line!(),
|
||||||
pub extern fn panic_fmt(args: core::fmt::Arguments, file: &'static str, line: u32) -> ! {
|
column: column!(),
|
||||||
println!("panic at {}:{}: {}", file, line, args);
|
// https://github.com/rust-lang/rfcs/pull/1719
|
||||||
send(&RunAborted);
|
function: "(Rust function)".as_bytes().as_c_slice(),
|
||||||
loop {}
|
message: $message.as_bytes().as_c_slice(),
|
||||||
|
param: [$param0, $param1, $param2]
|
||||||
|
};
|
||||||
|
#[allow(unused_unsafe)]
|
||||||
|
unsafe { $crate::eh::raise(&exn) }
|
||||||
|
});
|
||||||
|
($name:expr, $message:expr) => ({
|
||||||
|
raise!($name, $message, 0, 0, 0)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub mod eh;
|
||||||
|
mod api;
|
||||||
|
mod rtio;
|
||||||
|
|
||||||
static mut NOW: u64 = 0;
|
static mut NOW: u64 = 0;
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
@ -115,12 +107,6 @@ pub extern fn send_to_rtio_log(timestamp: i64, text: CSlice<u8>) {
|
|||||||
rtio::log(timestamp, text.as_ref())
|
rtio::log(timestamp, text.as_ref())
|
||||||
}
|
}
|
||||||
|
|
||||||
extern fn abort() -> ! {
|
|
||||||
println!("kernel called abort()");
|
|
||||||
send(&RunAborted);
|
|
||||||
loop {}
|
|
||||||
}
|
|
||||||
|
|
||||||
extern fn rpc_send(service: u32, tag: CSlice<u8>, data: *const *const ()) {
|
extern fn rpc_send(service: u32, tag: CSlice<u8>, data: *const *const ()) {
|
||||||
while !rpc_queue::empty() {}
|
while !rpc_queue::empty() {}
|
||||||
send(&RpcSend {
|
send(&RpcSend {
|
||||||
@ -139,7 +125,7 @@ extern fn rpc_send_async(service: u32, tag: CSlice<u8>, data: *const *const ())
|
|||||||
rpc_proto::send_args(&mut writer, service, tag.as_ref(), data)?;
|
rpc_proto::send_args(&mut writer, service, tag.as_ref(), data)?;
|
||||||
writer.position()
|
writer.position()
|
||||||
};
|
};
|
||||||
proto::write_u32(&mut slice, length as u32)
|
proto::io::write_u32(&mut slice, length as u32)
|
||||||
}).unwrap_or_else(|err| {
|
}).unwrap_or_else(|err| {
|
||||||
assert!(err.kind() == std::io::ErrorKind::WriteZero);
|
assert!(err.kind() == std::io::ErrorKind::WriteZero);
|
||||||
|
|
||||||
@ -202,7 +188,7 @@ fn terminate(exception: &eh::Exception, mut backtrace: &mut [usize]) -> ! {
|
|||||||
|
|
||||||
extern fn watchdog_set(ms: i64) -> i32 {
|
extern fn watchdog_set(ms: i64) -> i32 {
|
||||||
if ms < 0 {
|
if ms < 0 {
|
||||||
artiq_raise!("ValueError", "cannot set a watchdog with a negative timeout")
|
raise!("ValueError", "cannot set a watchdog with a negative timeout")
|
||||||
}
|
}
|
||||||
|
|
||||||
send(&WatchdogSetRequest { ms: ms as u64 });
|
send(&WatchdogSetRequest { ms: ms as u64 });
|
||||||
@ -227,7 +213,7 @@ extern fn cache_put(key: CSlice<u8>, list: CSlice<i32>) {
|
|||||||
});
|
});
|
||||||
recv!(&CachePutReply { succeeded } => {
|
recv!(&CachePutReply { succeeded } => {
|
||||||
if !succeeded {
|
if !succeeded {
|
||||||
artiq_raise!("CacheError", "cannot put into a busy cache row")
|
raise!("CacheError", "cannot put into a busy cache row")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -329,6 +315,11 @@ pub unsafe fn main() {
|
|||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn exception_handler(vect: u32, _regs: *const u32, pc: u32, ea: u32) {
|
pub extern fn exception_handler(vect: u32, _regs: *const u32, pc: u32, ea: u32) {
|
||||||
println!("exception {:?} at PC 0x{:x}, EA 0x{:x}", vect, pc, ea);
|
panic!("exception {:?} at PC 0x{:x}, EA 0x{:x}", vect, pc, ea)
|
||||||
send(&RunAborted)
|
}
|
||||||
|
|
||||||
|
// We don't export this because libbase does.
|
||||||
|
// #[no_mangle]
|
||||||
|
pub extern fn abort() {
|
||||||
|
panic!("aborted")
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,3 @@
|
|||||||
#[path = "../runtime/kernel_proto.rs"]
|
|
||||||
mod kernel_proto;
|
|
||||||
|
|
||||||
use core::ptr::{read_volatile, write_volatile};
|
use core::ptr::{read_volatile, write_volatile};
|
||||||
use cslice::CSlice;
|
use cslice::CSlice;
|
||||||
use board::csr;
|
use board::csr;
|
||||||
@ -46,25 +43,25 @@ unsafe fn process_exceptional_status(timestamp: i64, channel: i32, status: u32)
|
|||||||
}
|
}
|
||||||
if status & RTIO_O_STATUS_UNDERFLOW != 0 {
|
if status & RTIO_O_STATUS_UNDERFLOW != 0 {
|
||||||
csr::rtio::o_underflow_reset_write(1);
|
csr::rtio::o_underflow_reset_write(1);
|
||||||
artiq_raise!("RTIOUnderflow",
|
raise!("RTIOUnderflow",
|
||||||
"RTIO underflow at {0} mu, channel {1}, slack {2} mu",
|
"RTIO underflow at {0} mu, channel {1}, slack {2} mu",
|
||||||
timestamp, channel as i64, timestamp - get_counter())
|
timestamp, channel as i64, timestamp - get_counter())
|
||||||
}
|
}
|
||||||
if status & RTIO_O_STATUS_SEQUENCE_ERROR != 0 {
|
if status & RTIO_O_STATUS_SEQUENCE_ERROR != 0 {
|
||||||
csr::rtio::o_sequence_error_reset_write(1);
|
csr::rtio::o_sequence_error_reset_write(1);
|
||||||
artiq_raise!("RTIOSequenceError",
|
raise!("RTIOSequenceError",
|
||||||
"RTIO sequence error at {0} mu, channel {1}",
|
"RTIO sequence error at {0} mu, channel {1}",
|
||||||
timestamp, channel as i64, 0)
|
timestamp, channel as i64, 0)
|
||||||
}
|
}
|
||||||
if status & RTIO_O_STATUS_COLLISION != 0 {
|
if status & RTIO_O_STATUS_COLLISION != 0 {
|
||||||
csr::rtio::o_collision_reset_write(1);
|
csr::rtio::o_collision_reset_write(1);
|
||||||
artiq_raise!("RTIOCollision",
|
raise!("RTIOCollision",
|
||||||
"RTIO collision at {0} mu, channel {1}",
|
"RTIO collision at {0} mu, channel {1}",
|
||||||
timestamp, channel as i64, 0)
|
timestamp, channel as i64, 0)
|
||||||
}
|
}
|
||||||
if status & RTIO_O_STATUS_BUSY != 0 {
|
if status & RTIO_O_STATUS_BUSY != 0 {
|
||||||
csr::rtio::o_busy_reset_write(1);
|
csr::rtio::o_busy_reset_write(1);
|
||||||
artiq_raise!("RTIOBusy",
|
raise!("RTIOBusy",
|
||||||
"RTIO busy on channel {0}",
|
"RTIO busy on channel {0}",
|
||||||
channel as i64, 0, 0)
|
channel as i64, 0, 0)
|
||||||
}
|
}
|
||||||
@ -122,7 +119,7 @@ pub extern fn input_timestamp(timeout: i64, channel: i32) -> u64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if status & RTIO_I_STATUS_OVERFLOW != 0 {
|
if status & RTIO_I_STATUS_OVERFLOW != 0 {
|
||||||
artiq_raise!("RTIOOverflow",
|
raise!("RTIOOverflow",
|
||||||
"RTIO input overflow on channel {0}",
|
"RTIO input overflow on channel {0}",
|
||||||
channel as i64, 0, 0);
|
channel as i64, 0, 0);
|
||||||
}
|
}
|
||||||
@ -145,7 +142,7 @@ pub extern fn input_data(channel: i32) -> i32 {
|
|||||||
|
|
||||||
if status & RTIO_I_STATUS_OVERFLOW != 0 {
|
if status & RTIO_I_STATUS_OVERFLOW != 0 {
|
||||||
csr::rtio::i_overflow_reset_write(1);
|
csr::rtio::i_overflow_reset_write(1);
|
||||||
artiq_raise!("RTIOOverflow",
|
raise!("RTIOOverflow",
|
||||||
"RTIO input overflow on channel {0}",
|
"RTIO input overflow on channel {0}",
|
||||||
channel as i64, 0, 0);
|
channel as i64, 0, 0);
|
||||||
}
|
}
|
||||||
|
11
artiq/firmware/libamp/Cargo.toml
Normal file
11
artiq/firmware/libamp/Cargo.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
authors = ["M-Labs"]
|
||||||
|
name = "amp"
|
||||||
|
version = "0.0.0"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "amp"
|
||||||
|
path = "lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
board = { path = "../libboard" }
|
6
artiq/firmware/libamp/lib.rs
Normal file
6
artiq/firmware/libamp/lib.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#![no_std]
|
||||||
|
|
||||||
|
extern crate board;
|
||||||
|
|
||||||
|
pub mod mailbox;
|
||||||
|
pub mod rpc_queue;
|
@ -1,5 +1,3 @@
|
|||||||
#![allow(dead_code)]
|
|
||||||
|
|
||||||
use core::ptr::{read_volatile, write_volatile};
|
use core::ptr::{read_volatile, write_volatile};
|
||||||
use core::slice;
|
use core::slice;
|
||||||
use board::{mem, cache};
|
use board::{mem, cache};
|
15
artiq/firmware/libproto/Cargo.toml
Normal file
15
artiq/firmware/libproto/Cargo.toml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
authors = ["M-Labs"]
|
||||||
|
name = "proto"
|
||||||
|
version = "0.0.0"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "proto"
|
||||||
|
path = "lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
byteorder = { version = "1.0", default-features = false }
|
||||||
|
cslice = { version = "0.3" }
|
||||||
|
log = { version = "0.3", default-features = false, optional = true }
|
||||||
|
std_artiq = { path = "../libstd_artiq", features = ["alloc"] }
|
||||||
|
dyld = { path = "../libdyld" }
|
@ -1,5 +1,5 @@
|
|||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
use proto::*;
|
use io::*;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Header {
|
pub struct Header {
|
@ -1,5 +1,3 @@
|
|||||||
#![allow(dead_code)]
|
|
||||||
|
|
||||||
use std::io::{self, Read, Write};
|
use std::io::{self, Read, Write};
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
use std::string::String;
|
use std::string::String;
|
||||||
@ -55,7 +53,8 @@ pub fn write_u64(writer: &mut Write, value: u64) -> io::Result<()> {
|
|||||||
|
|
||||||
pub fn read_bytes(reader: &mut Read) -> io::Result<Vec<u8>> {
|
pub fn read_bytes(reader: &mut Read) -> io::Result<Vec<u8>> {
|
||||||
let length = read_u32(reader)?;
|
let length = read_u32(reader)?;
|
||||||
let mut value = vec![0; length as usize];
|
let mut value = Vec::new();
|
||||||
|
value.resize(length as usize, 0);
|
||||||
reader.read_exact(&mut value)?;
|
reader.read_exact(&mut value)?;
|
||||||
Ok(value)
|
Ok(value)
|
||||||
}
|
}
|
@ -1,5 +1,3 @@
|
|||||||
#![allow(dead_code)]
|
|
||||||
|
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use dyld;
|
use dyld;
|
||||||
|
|
21
artiq/firmware/libproto/lib.rs
Normal file
21
artiq/firmware/libproto/lib.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#![no_std]
|
||||||
|
|
||||||
|
extern crate byteorder;
|
||||||
|
extern crate cslice;
|
||||||
|
#[cfg(feature = "log")]
|
||||||
|
#[macro_use]
|
||||||
|
extern crate log;
|
||||||
|
|
||||||
|
extern crate dyld;
|
||||||
|
extern crate std_artiq as std;
|
||||||
|
|
||||||
|
pub mod io;
|
||||||
|
|
||||||
|
// Internal protocols.
|
||||||
|
pub mod kernel_proto;
|
||||||
|
|
||||||
|
// External protocols.
|
||||||
|
pub mod analyzer_proto;
|
||||||
|
pub mod moninj_proto;
|
||||||
|
pub mod session_proto;
|
||||||
|
pub mod rpc_proto;
|
@ -1,5 +1,5 @@
|
|||||||
use std::io::{self, Read, Write};
|
use std::io::{self, Read, Write};
|
||||||
use proto::*;
|
use io::*;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum TtlMode {
|
pub enum TtlMode {
|
@ -1,9 +1,7 @@
|
|||||||
#![allow(dead_code)]
|
|
||||||
|
|
||||||
use core::str;
|
|
||||||
use std::io::{self, Read, Write};
|
use std::io::{self, Read, Write};
|
||||||
|
use std::str;
|
||||||
use cslice::{CSlice, CMutSlice};
|
use cslice::{CSlice, CMutSlice};
|
||||||
use proto::*;
|
use io::*;
|
||||||
use self::tag::{Tag, TagIterator, split_tag};
|
use self::tag::{Tag, TagIterator, split_tag};
|
||||||
|
|
||||||
unsafe fn recv_value(reader: &mut Read, tag: Tag, data: &mut *mut (),
|
unsafe fn recv_value(reader: &mut Read, tag: Tag, data: &mut *mut (),
|
||||||
@ -76,7 +74,7 @@ unsafe fn recv_value(reader: &mut Read, tag: Tag, data: &mut *mut (),
|
|||||||
pub fn recv_return(reader: &mut Read, tag_bytes: &[u8], data: *mut (),
|
pub fn recv_return(reader: &mut Read, tag_bytes: &[u8], data: *mut (),
|
||||||
alloc: &Fn(usize) -> io::Result<*mut ()>) -> io::Result<()> {
|
alloc: &Fn(usize) -> io::Result<*mut ()>) -> io::Result<()> {
|
||||||
let mut it = TagIterator::new(tag_bytes);
|
let mut it = TagIterator::new(tag_bytes);
|
||||||
#[cfg(not(ksupport))]
|
#[cfg(feature = "log")]
|
||||||
trace!("recv ...->{}", it);
|
trace!("recv ...->{}", it);
|
||||||
|
|
||||||
let tag = it.next().expect("truncated tag");
|
let tag = it.next().expect("truncated tag");
|
||||||
@ -162,7 +160,7 @@ pub fn send_args(writer: &mut Write, service: u32, tag_bytes: &[u8],
|
|||||||
let (arg_tags_bytes, return_tag_bytes) = split_tag(tag_bytes);
|
let (arg_tags_bytes, return_tag_bytes) = split_tag(tag_bytes);
|
||||||
|
|
||||||
let mut args_it = TagIterator::new(arg_tags_bytes);
|
let mut args_it = TagIterator::new(arg_tags_bytes);
|
||||||
#[cfg(not(ksupport))]
|
#[cfg(feature = "log")]
|
||||||
{
|
{
|
||||||
let return_it = TagIterator::new(return_tag_bytes);
|
let return_it = TagIterator::new(return_tag_bytes);
|
||||||
trace!("send<{}>({})->{}", service, args_it, return_it);
|
trace!("send<{}>({})->{}", service, args_it, return_it);
|
@ -1,6 +1,7 @@
|
|||||||
use std::prelude::v1::*;
|
|
||||||
use std::io::{self, Read, Write};
|
use std::io::{self, Read, Write};
|
||||||
use proto::*;
|
use std::vec::Vec;
|
||||||
|
use std::string::String;
|
||||||
|
use io::*;
|
||||||
|
|
||||||
fn read_sync(reader: &mut Read) -> io::Result<()> {
|
fn read_sync(reader: &mut Read) -> io::Result<()> {
|
||||||
let mut sync = [0; 4];
|
let mut sync = [0; 4];
|
@ -13,16 +13,17 @@ path = "lib.rs"
|
|||||||
build_artiq = { path = "../libbuild_artiq" }
|
build_artiq = { path = "../libbuild_artiq" }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
byteorder = { version = "1.0", default-features = false }
|
||||||
|
cslice = { version = "0.3" }
|
||||||
|
log = { version = "0.3", default-features = false, features = ["max_level_debug"] }
|
||||||
|
fringe = { version = "= 1.1.0", default-features = false, features = ["alloc"] }
|
||||||
alloc_artiq = { path = "../liballoc_artiq" }
|
alloc_artiq = { path = "../liballoc_artiq" }
|
||||||
std_artiq = { path = "../libstd_artiq", features = ["alloc"] }
|
std_artiq = { path = "../libstd_artiq", features = ["alloc"] }
|
||||||
logger_artiq = { path = "../liblogger_artiq" }
|
logger_artiq = { path = "../liblogger_artiq" }
|
||||||
cslice = { version = "0.3" }
|
|
||||||
log = { version = "0.3", default-features = false, features = ["max_level_debug"] }
|
|
||||||
board = { path = "../libboard", features = ["uart_console"] }
|
board = { path = "../libboard", features = ["uart_console"] }
|
||||||
dyld = { path = "../libdyld" }
|
proto = { path = "../libproto", features = ["log"] }
|
||||||
|
amp = { path = "../libamp" }
|
||||||
drtioaux = { path = "../libdrtioaux" }
|
drtioaux = { path = "../libdrtioaux" }
|
||||||
fringe = { version = "= 1.1.0", default-features = false, features = ["alloc"] }
|
|
||||||
byteorder = { version = "1.0", default-features = false }
|
|
||||||
|
|
||||||
[dependencies.compiler_builtins]
|
[dependencies.compiler_builtins]
|
||||||
git = "https://github.com/rust-lang-nursery/compiler-builtins"
|
git = "https://github.com/rust-lang-nursery/compiler-builtins"
|
||||||
|
@ -2,24 +2,28 @@
|
|||||||
#![feature(compiler_builtins_lib, repr_simd, const_fn)]
|
#![feature(compiler_builtins_lib, repr_simd, const_fn)]
|
||||||
|
|
||||||
extern crate compiler_builtins;
|
extern crate compiler_builtins;
|
||||||
extern crate alloc_artiq;
|
|
||||||
#[macro_use]
|
|
||||||
extern crate std_artiq as std;
|
|
||||||
extern crate cslice;
|
extern crate cslice;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate log;
|
extern crate log;
|
||||||
extern crate logger_artiq;
|
|
||||||
extern crate byteorder;
|
extern crate byteorder;
|
||||||
extern crate fringe;
|
extern crate fringe;
|
||||||
extern crate smoltcp;
|
extern crate smoltcp;
|
||||||
|
|
||||||
|
extern crate alloc_artiq;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate std_artiq as std;
|
||||||
|
extern crate logger_artiq;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate board;
|
extern crate board;
|
||||||
|
extern crate proto;
|
||||||
|
extern crate amp;
|
||||||
#[cfg(has_drtio)]
|
#[cfg(has_drtio)]
|
||||||
extern crate drtioaux;
|
extern crate drtioaux;
|
||||||
extern crate dyld;
|
|
||||||
|
|
||||||
use std::boxed::Box;
|
use std::boxed::Box;
|
||||||
use smoltcp::wire::{EthernetAddress, IpAddress};
|
use smoltcp::wire::{EthernetAddress, IpAddress};
|
||||||
|
use proto::{analyzer_proto, moninj_proto, rpc_proto, session_proto, kernel_proto};
|
||||||
|
use amp::{mailbox, rpc_queue};
|
||||||
|
|
||||||
macro_rules! borrow_mut {
|
macro_rules! borrow_mut {
|
||||||
($x:expr) => ({
|
($x:expr) => ({
|
||||||
@ -33,22 +37,11 @@ macro_rules! borrow_mut {
|
|||||||
mod config;
|
mod config;
|
||||||
mod ethmac;
|
mod ethmac;
|
||||||
mod rtio_mgt;
|
mod rtio_mgt;
|
||||||
mod mailbox;
|
|
||||||
mod rpc_queue;
|
|
||||||
|
|
||||||
mod urc;
|
mod urc;
|
||||||
mod sched;
|
mod sched;
|
||||||
mod cache;
|
mod cache;
|
||||||
|
|
||||||
mod proto;
|
|
||||||
mod kernel_proto;
|
|
||||||
mod session_proto;
|
|
||||||
#[cfg(has_rtio_moninj)]
|
|
||||||
mod moninj_proto;
|
|
||||||
#[cfg(has_rtio_analyzer)]
|
|
||||||
mod analyzer_proto;
|
|
||||||
mod rpc_proto;
|
|
||||||
|
|
||||||
mod kernel;
|
mod kernel;
|
||||||
mod session;
|
mod session;
|
||||||
#[cfg(has_rtio_moninj)]
|
#[cfg(has_rtio_moninj)]
|
||||||
|
Loading…
Reference in New Issue
Block a user