1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-18 05:28:40 +00:00

perf(core): share wire buffer between wire and debuglink

[no changelog]
This commit is contained in:
Martin Milata 2021-07-17 01:39:01 +02:00 committed by matejcik
parent 582e1318c4
commit 8da978981e
2 changed files with 81 additions and 54 deletions

View File

@ -130,8 +130,6 @@ DUMMY_CONTEXT = DummyContext()
PROTOBUF_BUFFER_SIZE = 8192 PROTOBUF_BUFFER_SIZE = 8192
WIRE_BUFFER = bytearray(PROTOBUF_BUFFER_SIZE) WIRE_BUFFER = bytearray(PROTOBUF_BUFFER_SIZE)
if __debug__:
WIRE_BUFFER_DEBUG = bytearray(PROTOBUF_BUFFER_SIZE)
class Context: class Context:
@ -378,11 +376,7 @@ async def _handle_single_message(
async def handle_session( async def handle_session(
iface: WireInterface, session_id: int, is_debug_session: bool = False iface: WireInterface, session_id: int, is_debug_session: bool = False
) -> None: ) -> None:
if __debug__ and is_debug_session: ctx = Context(iface, session_id, WIRE_BUFFER)
ctx_buffer = WIRE_BUFFER_DEBUG
else:
ctx_buffer = WIRE_BUFFER
ctx = Context(iface, session_id, ctx_buffer)
next_msg: codec_v1.Message | None = None next_msg: codec_v1.Message | None = None
if __debug__ and is_debug_session: if __debug__ and is_debug_session:

View File

@ -4,6 +4,8 @@ from micropython import const
from trezor import io, loop, utils from trezor import io, loop, utils
if False: if False:
from typing import Any
from trezorio import WireInterface from trezorio import WireInterface
_REP_LEN = const(64) _REP_LEN = const(64)
@ -17,6 +19,35 @@ _REP_CONT_DATA = const(1) # offset of data in the continuation report
SESSION_ID = const(0) SESSION_ID = const(0)
INVALID_TYPE = const(-1) INVALID_TYPE = const(-1)
# The wire buffer is shared between the main wire interface and debuglink
# (see __init__.py). There's no obvious guarantee that both interfaces won't
# use it at the same time, thus we check this at runtime in debug builds.
if __debug__:
class BufferLock(object):
def __init__(self) -> None:
self.in_use = False
def __enter__(self) -> None:
assert not self.in_use, "global buffer already used by another context"
self.in_use = True
def __exit__(self, type: Any, value: Any, traceback: Any) -> None:
self.in_use = False
else:
class BufferLock(object): # type: ignore
def __enter__(self) -> None:
pass
def __exit__(self, type: Any, value: Any, traceback: Any) -> None:
pass
buffer_lock = BufferLock()
class CodecError(Exception): class CodecError(Exception):
pass pass
@ -41,6 +72,7 @@ async def read_message(iface: WireInterface, buffer: utils.BufferType) -> Messag
read_and_throw_away = False read_and_throw_away = False
with buffer_lock:
if msize > len(buffer): if msize > len(buffer):
# allocate a new buffer to fit the message # allocate a new buffer to fit the message
try: try:
@ -76,6 +108,7 @@ async def read_message(iface: WireInterface, buffer: utils.BufferType) -> Messag
async def write_message(iface: WireInterface, mtype: int, mdata: bytes) -> None: async def write_message(iface: WireInterface, mtype: int, mdata: bytes) -> None:
write = loop.wait(iface.iface_num() | io.POLL_WRITE) write = loop.wait(iface.iface_num() | io.POLL_WRITE)
with buffer_lock:
# gather data from msg # gather data from msg
msize = len(mdata) msize = len(mdata)