Compare commits
No commits in common. "d508c5c6f81b7877b77bf80ac5a911d365599d38" and "20181e9915427d90c62cfeb3ef0e073a7a87a9cb" have entirely different histories.
d508c5c6f8
...
20181e9915
|
@ -15,7 +15,7 @@
|
||||||
use core::mem;
|
use core::mem;
|
||||||
|
|
||||||
use core_io::Error as ReadError;
|
use core_io::Error as ReadError;
|
||||||
use cslice::{AsCSlice, CSlice};
|
use cslice::CSlice;
|
||||||
use dwarf::eh::{self, EHAction, EHContext};
|
use dwarf::eh::{self, EHAction, EHContext};
|
||||||
use io::{Cursor, ProtoRead};
|
use io::{Cursor, ProtoRead};
|
||||||
use libc::{c_int, c_void, uintptr_t};
|
use libc::{c_int, c_void, uintptr_t};
|
||||||
|
@ -222,6 +222,8 @@ pub unsafe fn artiq_personality(
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe extern "C" fn raise(exception: *const Exception) -> ! {
|
pub unsafe extern "C" fn raise(exception: *const Exception) -> ! {
|
||||||
|
use cslice::AsCSlice;
|
||||||
|
|
||||||
let count = EXCEPTION_BUFFER.exception_count;
|
let count = EXCEPTION_BUFFER.exception_count;
|
||||||
let stack = &mut EXCEPTION_BUFFER.exception_stack;
|
let stack = &mut EXCEPTION_BUFFER.exception_stack;
|
||||||
let diff = exception as isize - EXCEPTION_BUFFER.exceptions.as_ptr() as isize;
|
let diff = exception as isize - EXCEPTION_BUFFER.exceptions.as_ptr() as isize;
|
||||||
|
@ -475,28 +477,20 @@ extern "C" fn stop_fn(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Must be kept in sync with preallocate_runtime_exception_names() in `artiq.compiler.embedding`
|
// Must be kept in sync with preallocate_runtime_exception_names() in artiq/language/embedding_map.py
|
||||||
static EXCEPTION_ID_LOOKUP: [(&str, u32); 20] = [
|
static EXCEPTION_ID_LOOKUP: [(&str, u32); 12] = [
|
||||||
("RTIOUnderflow", 0),
|
("RuntimeError", 0),
|
||||||
("RTIOOverflow", 1),
|
("RTIOUnderflow", 1),
|
||||||
("RTIODestinationUnreachable", 2),
|
("RTIOOverflow", 2),
|
||||||
("DMAError", 3),
|
("RTIODestinationUnreachable", 3),
|
||||||
("I2CError", 4),
|
("DMAError", 4),
|
||||||
("CacheError", 5),
|
("I2CError", 5),
|
||||||
("SPIError", 6),
|
("CacheError", 6),
|
||||||
("SubkernelError", 7),
|
("SPIError", 7),
|
||||||
("AssertionError", 8),
|
("ZeroDivisionError", 8),
|
||||||
("AttributeError", 9),
|
("IndexError", 9),
|
||||||
("IndexError", 10),
|
("UnwrapNoneError", 10),
|
||||||
("IOError", 11),
|
("SubkernelError", 11),
|
||||||
("KeyError", 12),
|
|
||||||
("NotImplementedError", 13),
|
|
||||||
("OverflowError", 14),
|
|
||||||
("RuntimeError", 15),
|
|
||||||
("TimeoutError", 16),
|
|
||||||
("TypeError", 17),
|
|
||||||
("ValueError", 18),
|
|
||||||
("ZeroDivisionError", 19),
|
|
||||||
];
|
];
|
||||||
|
|
||||||
pub fn get_exception_id(name: &str) -> u32 {
|
pub fn get_exception_id(name: &str) -> u32 {
|
||||||
|
@ -531,29 +525,3 @@ macro_rules! artiq_raise {
|
||||||
}};
|
}};
|
||||||
($name:expr, $message:expr) => {{ artiq_raise!($name, $message, 0, 0, 0) }};
|
($name:expr, $message:expr) => {{ artiq_raise!($name, $message, 0, 0, 0) }};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Takes as input exception id from host
|
|
||||||
/// Generates a new exception with:
|
|
||||||
/// * `id` set to `exn_id`
|
|
||||||
/// * `message` set to corresponding exception name from `EXCEPTION_ID_LOOKUP`
|
|
||||||
///
|
|
||||||
/// The message is matched on host to ensure correct exception is being referred
|
|
||||||
/// This test checks the synchronization of exception ids for runtime errors
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn test_exception_id_sync(exn_id: u32) {
|
|
||||||
let message = EXCEPTION_ID_LOOKUP
|
|
||||||
.iter()
|
|
||||||
.find_map(|&(name, id)| if id == exn_id { Some(name) } else { None })
|
|
||||||
.unwrap_or("unallocated internal exception id");
|
|
||||||
|
|
||||||
let exn = Exception {
|
|
||||||
id: exn_id,
|
|
||||||
file: file!().as_c_slice(),
|
|
||||||
line: 0,
|
|
||||||
column: 0,
|
|
||||||
function: "test_exception_id_sync".as_c_slice(),
|
|
||||||
message: message.as_c_slice(),
|
|
||||||
param: [0, 0, 0],
|
|
||||||
};
|
|
||||||
unsafe { raise(&exn) };
|
|
||||||
}
|
|
||||||
|
|
|
@ -332,13 +332,6 @@ pub fn resolve(required: &[u8]) -> Option<u32> {
|
||||||
api!(sp_linalg_schur = linalg::sp_linalg_schur),
|
api!(sp_linalg_schur = linalg::sp_linalg_schur),
|
||||||
api!(sp_linalg_hessenberg = linalg::sp_linalg_hessenberg),
|
api!(sp_linalg_hessenberg = linalg::sp_linalg_hessenberg),
|
||||||
|
|
||||||
/*
|
|
||||||
* syscall for unit tests
|
|
||||||
* Used in `artiq.tests.coredevice.test_exceptions.ExceptionTest.test_raise_exceptions_kernel`
|
|
||||||
* This syscall checks that the exception IDs used in the Python `EmbeddingMap` (in `artiq.language.embedding`)
|
|
||||||
* match the `EXCEPTION_ID_LOOKUP` defined in the firmware (`libksupport::src::eh_artiq`)
|
|
||||||
*/
|
|
||||||
api!(test_exception_id_sync = eh_artiq::test_exception_id_sync)
|
|
||||||
];
|
];
|
||||||
api.iter()
|
api.iter()
|
||||||
.find(|&&(exported, _)| exported.as_bytes() == required)
|
.find(|&&(exported, _)| exported.as_bytes() == required)
|
||||||
|
|
Loading…
Reference in New Issue