forked from M-Labs/artiq
In case of a load error, pass the reason to host interpreter.
Fixes #654.
This commit is contained in:
parent
609fd3d902
commit
74b910e97d
@ -59,6 +59,9 @@ class _D2HMsgType(Enum):
|
|||||||
class UnsupportedDevice(Exception):
|
class UnsupportedDevice(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class LoadError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
class RPCReturnValueError(ValueError):
|
class RPCReturnValueError(ValueError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -265,7 +268,11 @@ class CommGeneric:
|
|||||||
self._write_header(_H2DMsgType.LOAD_KERNEL)
|
self._write_header(_H2DMsgType.LOAD_KERNEL)
|
||||||
self._write_bytes(kernel_library)
|
self._write_bytes(kernel_library)
|
||||||
|
|
||||||
self._read_empty(_D2HMsgType.LOAD_COMPLETED)
|
self._read_header()
|
||||||
|
if self._read_type == _D2HMsgType.LOAD_FAILED:
|
||||||
|
raise LoadError(self._read_string())
|
||||||
|
else:
|
||||||
|
self._read_expect(_D2HMsgType.LOAD_COMPLETED)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self._write_empty(_H2DMsgType.RUN_KERNEL)
|
self._write_empty(_H2DMsgType.RUN_KERNEL)
|
||||||
|
@ -2,6 +2,7 @@ use std::prelude::v1::*;
|
|||||||
use std::{mem, str};
|
use std::{mem, str};
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::io::{self, Read, Write};
|
use std::io::{self, Read, Write};
|
||||||
|
use std::error::Error;
|
||||||
use std::btree_set::BTreeSet;
|
use std::btree_set::BTreeSet;
|
||||||
use {config, rtio_mgt, mailbox, rpc_queue, kernel};
|
use {config, rtio_mgt, mailbox, rpc_queue, kernel};
|
||||||
use logger_artiq::BufferLogger;
|
use logger_artiq::BufferLogger;
|
||||||
@ -179,8 +180,10 @@ unsafe fn kern_load(io: &Io, session: &mut Session, library: &[u8]) -> io::Resul
|
|||||||
session.kernel_state = KernelState::Loaded;
|
session.kernel_state = KernelState::Loaded;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
&kern::LoadReply(Err(error)) =>
|
&kern::LoadReply(Err(error)) => {
|
||||||
unexpected!("cannot load kernel: {}", error),
|
Err(io::Error::new(io::ErrorKind::Other,
|
||||||
|
format!("cannot load kernel: {}", error)))
|
||||||
|
}
|
||||||
other =>
|
other =>
|
||||||
unexpected!("unexpected reply from kernel CPU: {:?}", other)
|
unexpected!("unexpected reply from kernel CPU: {:?}", other)
|
||||||
}
|
}
|
||||||
@ -259,9 +262,9 @@ fn process_host_message(io: &Io,
|
|||||||
host::Request::LoadKernel(kernel) =>
|
host::Request::LoadKernel(kernel) =>
|
||||||
match unsafe { kern_load(io, session, &kernel) } {
|
match unsafe { kern_load(io, session, &kernel) } {
|
||||||
Ok(()) => host_write(stream, host::Reply::LoadCompleted),
|
Ok(()) => host_write(stream, host::Reply::LoadCompleted),
|
||||||
Err(_) => {
|
Err(error) => {
|
||||||
try!(kern_acknowledge());
|
host_write(stream, host::Reply::LoadFailed(error.description()));
|
||||||
host_write(stream, host::Reply::LoadFailed)
|
kern_acknowledge()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ pub enum Reply<'a> {
|
|||||||
ClockSwitchFailed,
|
ClockSwitchFailed,
|
||||||
|
|
||||||
LoadCompleted,
|
LoadCompleted,
|
||||||
LoadFailed,
|
LoadFailed(&'a str),
|
||||||
|
|
||||||
KernelFinished,
|
KernelFinished,
|
||||||
KernelStartupFailed,
|
KernelStartupFailed,
|
||||||
@ -141,8 +141,9 @@ impl<'a> Reply<'a> {
|
|||||||
Reply::LoadCompleted => {
|
Reply::LoadCompleted => {
|
||||||
try!(write_u8(writer, 5));
|
try!(write_u8(writer, 5));
|
||||||
},
|
},
|
||||||
Reply::LoadFailed => {
|
Reply::LoadFailed(reason) => {
|
||||||
try!(write_u8(writer, 6));
|
try!(write_u8(writer, 6));
|
||||||
|
try!(write_string(writer, reason));
|
||||||
},
|
},
|
||||||
|
|
||||||
Reply::KernelFinished => {
|
Reply::KernelFinished => {
|
||||||
|
Loading…
Reference in New Issue
Block a user