| 62 | |
| 63 | @msg(None, DIR.RX, Register64) |
| 64 | def RXMsg(self, msg): |
| 65 | if self.state.sram_addr is None: |
| 66 | self.log(f"SRAM address: {msg.value:#x}") |
| 67 | self.state.sram_addr = msg.value |
| 68 | return True |
| 69 | |
| 70 | msg = SMCResult(msg.value) |
| 71 | if msg.RESULT != 0: |
| 72 | self.log(f"[{msg.ID:x}] <Err: 0x{msg.RESULT:02x}") |
| 73 | return True |
| 74 | |
| 75 | if msg.ID in self.state.rb: |
| 76 | msgtype, key, size = self.state.rb.pop(msg.ID) |
| 77 | if msgtype in (SMC_READ_KEY, SMC_RW_KEY): |
| 78 | if size <= 4: |
| 79 | data = hex(msg.VALUE) |
| 80 | else: |
| 81 | data = self.hv.iface.readmem(self.state.sram_addr, msg.SIZE).hex() |
| 82 | self.log(f"[{msg.ID:x}] <R: <{key}> = {data}") |
| 83 | return True |
| 84 | |
| 85 | elif msgtype == SMC_GET_KEY_INFO: |
| 86 | data = self.hv.iface.readmem(self.state.sram_addr, 6) |
| 87 | size, type, flags = struct.unpack("B4sB", data) |
| 88 | self.log(f"[{msg.ID:x}] <Info: <{key}>: size={size} type={type.decode('ascii')} flags={flags:#x}") |
| 89 | return True |
| 90 | |
| 91 | elif msgtype == SMC_GET_KEY_BY_INDEX: |
| 92 | kname = msg.VALUE.to_bytes(4, byteorder="little").decode("ascii") |
| 93 | self.log(f"[{msg.ID:x}] <Key @{key}: <{kname}>") |
| 94 | return True |
| 95 | |
| 96 | self.log(f"[{msg.ID:x}] <OK {msg!r}") |
| 97 | return True |
| 98 | |
| 99 | class SMCTracer(ASCTracer): |
| 100 | ENDPOINTS = { |