Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/artiq
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 43cd97010043
Choose a base ref
...
head repository: m-labs/artiq
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: c1e6d4b67c16
Choose a head ref
  • 2 commits
  • 7 files changed
  • 1 contributor

Commits on Nov 1, 2016

  1. gateware: rewrite mailbox to use bits_for.

    whitequark committed Nov 1, 2016
    Copy the full SHA
    636d4ef View commit details
  2. runtime: fix multiple async RPC bugs.

    whitequark committed Nov 1, 2016
    Copy the full SHA
    c1e6d4b View commit details
27 changes: 17 additions & 10 deletions artiq/coredevice/comm_generic.py
Original file line number Diff line number Diff line change
@@ -141,6 +141,9 @@ def _read_float64(self):
(value, ) = struct.unpack(">d", self._read_chunk(8))
return value

def _read_bool(self):
return True if self._read_int8() else False

def _read_bytes(self):
return self._read_chunk(self._read_int32())

@@ -177,6 +180,9 @@ def _write_int64(self, value):
def _write_float64(self, value):
self.write(struct.pack(">d", value))

def _write_bool(self, value):
self.write(struct.pack("B", value))

def _write_bytes(self, value):
self._write_int32(len(value))
self.write(value)
@@ -405,24 +411,25 @@ def check(cond, expected):
raise IOError("Unknown RPC value tag: {}".format(repr(tag)))

def _serve_rpc(self, embedding_map):
service_id = self._read_int32()
if service_id == 0:
service = lambda obj, attr, value: setattr(obj, attr, value)
else:
service = embedding_map.retrieve_object(service_id)

async = self._read_bool()
service_id = self._read_int32()
service = embedding_map.retrieve_object(service_id)
args, kwargs = self._receive_rpc_args(embedding_map)
return_tags = self._read_bytes()
logger.debug("rpc service: [%d]%r %r %r -> %s", service_id, service, args, kwargs, return_tags)
logger.debug("rpc service: [%d]%r%s %r %r -> %s", service_id, service,
(" (async)" if async else ""), args, kwargs, return_tags)

try:
result = service(*args, **kwargs)
logger.debug("rpc service: %d %r %r == %r", service_id, args, kwargs, result)

if service_id != 0:
if async:
return
else:
self._write_header(_H2DMsgType.RPC_REPLY)
self._write_bytes(return_tags)
self._send_rpc_value(bytearray(return_tags), result, result, service)

logger.debug("rpc service: %d %r %r = %r", service_id, args, kwargs, result)

except Exception as exn:
logger.debug("rpc service: %d %r %r ! %r", service_id, args, kwargs, exn)

1 change: 1 addition & 0 deletions artiq/coredevice/core.py
Original file line number Diff line number Diff line change
@@ -103,6 +103,7 @@ def compile(self, function, args, kwargs, set_result=None, with_attr_writeback=T

def run(self, function, args, kwargs):
result = None
@rpc(flags={"async"})
def set_result(new_result):
nonlocal result
result = new_result
4 changes: 2 additions & 2 deletions artiq/gateware/amp/mailbox.py
Original file line number Diff line number Diff line change
@@ -12,10 +12,10 @@ def __init__(self, size=1):
values = Array([Signal(32) for _ in range(size)])
for i in self.i1, self.i2:
self.sync += [
i.dat_r.eq(values[i.adr & 0xff]),
i.dat_r.eq(values[i.adr[:bits_for(size-1)]]),
i.ack.eq(0),
If(i.cyc & i.stb & ~i.ack,
i.ack.eq(1),
If(i.we, values[i.adr & 0xff].eq(i.dat_w))
If(i.we, values[i.adr[:bits_for(size-1)]].eq(i.dat_w))
)
]
3 changes: 3 additions & 0 deletions artiq/runtime.rs/src/kernel.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use core::ptr;
use board::csr;
use mailbox;
use rpc_queue;

use kernel_proto::{KERNELCPU_EXEC_ADDRESS, KERNELCPU_LAST_ADDRESS, KSUPPORT_HEADER_SIZE};

@@ -16,6 +17,8 @@ pub unsafe fn start() {
ptr::copy_nonoverlapping(ksupport_image.as_ptr(), ksupport_addr, ksupport_image.len());

csr::kernel_cpu::reset_write(0);

rpc_queue::init();
}

pub fn stop() {
2 changes: 1 addition & 1 deletion artiq/runtime.rs/src/rpc_queue.rs
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@ const QUEUE_CHUNK: usize = 0x1000;

pub unsafe fn init() {
write_volatile(SEND_MAILBOX, QUEUE_BEGIN);
write_volatile(RECV_MAILBOX, QUEUE_END);
write_volatile(RECV_MAILBOX, QUEUE_BEGIN);
}

fn next(mut addr: usize) -> usize {
4 changes: 2 additions & 2 deletions artiq/runtime.rs/src/session.rs
Original file line number Diff line number Diff line change
@@ -389,7 +389,7 @@ fn process_kern_message(waiter: Waiter,
match stream {
None => unexpected!("unexpected RPC in flash kernel"),
Some(ref mut stream) => {
try!(host_write(stream, host::Reply::RpcRequest));
try!(host_write(stream, host::Reply::RpcRequest { async: async }));
try!(rpc::send_args(&mut BufWriter::new(stream), service, tag, data));
if !async {
session.kernel_state = KernelState::RpcWait
@@ -470,7 +470,7 @@ fn process_kern_queued_rpc(stream: &mut TcpStream,
rpc_queue::dequeue(|slice| {
trace!("comm<-kern (async RPC)");
let length = NetworkEndian::read_u32(slice) as usize;
try!(host_write(stream, host::Reply::RpcRequest));
try!(host_write(stream, host::Reply::RpcRequest { async: true }));
try!(stream.write(&slice[4..][..length]));
Ok(())
})
5 changes: 3 additions & 2 deletions artiq/runtime.rs/src/session_proto.rs
Original file line number Diff line number Diff line change
@@ -107,7 +107,7 @@ pub enum Reply<'a> {
backtrace: &'a [usize]
},

RpcRequest,
RpcRequest { async: bool },

FlashRead(&'a [u8]),
FlashOk,
@@ -170,8 +170,9 @@ impl<'a> Reply<'a> {
}
},

Reply::RpcRequest => {
Reply::RpcRequest { async } => {
try!(write_u8(writer, 10));
try!(write_u8(writer, async as u8));
},

Reply::FlashRead(ref bytes) => {