1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
# SPDX-License-Identifier: MIT
from .base import *
from ...utils import *
class IOReportingMessage(Register64):
TYPE = 63, 52
class IOReporting_GetBuf(IOReportingMessage):
TYPE = 63, 52, Constant(1)
SIZE = 51, 44
DVA = 43, 0
class IOReporting_Start(IOReportingMessage):
TYPE = 63, 52, Constant(0xc)
class IOReporting_Report(IOReportingMessage):
TYPE = 63, 52, Constant(0x8)
class ASCIOReportingEndpoint(ASCBaseEndpoint):
BASE_MESSAGE = IOReportingMessage
SHORT = "iorep"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.iobuffer = None
self.iobuffer_dva = None
@msg_handler(1, IOReporting_GetBuf)
def GetBuf(self, msg):
if self.iobuffer:
self.log("WARNING: trying to reset iobuffer!")
self.bufsize = align(0x1000 * msg.SIZE, 0x4000)
if msg.DVA != 0:
self.iobuffer = self.iobuffer_dva = msg.DVA
self.log(f"buf {self.iobuffer:#x} / {self.iobuffer_dva:#x}")
else:
self.iobuffer, self.iobuffer_dva = self.asc.ioalloc(self.bufsize)
self.log(f"buf {self.iobuffer:#x} / {self.iobuffer_dva:#x}")
self.send(IOReporting_GetBuf(DVA=self.iobuffer_dva, SIZE=self.bufsize // 0x1000))
return True
@msg_handler(0xc, IOReporting_Start)
def Start(self, msg):
self.log("start")
return True
@msg_handler(8, IOReporting_Report)
def Init(self, msg):
self.log("report!")
buf = self.asc.iface.readmem(self.iobuffer, self.bufsize)
#chexdump(buf)
self.send(IOReporting_Report())
return True
|