|
5 | 5 | ## OSLog endpoint |
6 | 6 |
|
7 | 7 | class OSLogMessage(Register64): |
8 | | - TYPE = 63, 56 |
| 8 | + TYPE = 63, 56 |
9 | 9 |
|
10 | | -class OSLog_Init(OSLogMessage): |
11 | | - TYPE = 63, 56, Constant(1) |
12 | | - UNK = 51, 0 |
13 | | - |
14 | | -class OSLog_Ack(OSLogMessage): |
15 | | - TYPE = 63, 56, Constant(3) |
| 10 | +class OSLog_GetBuf(OSLogMessage): |
| 11 | + TYPE = 63, 56, Constant(1) |
| 12 | + SIZE = 55, 48 |
| 13 | + DVA = 47, 0 |
16 | 14 |
|
17 | 15 | class ASCOSLogEndpoint(ASCBaseEndpoint): |
18 | 16 | BASE_MESSAGE = OSLogMessage |
19 | | - SHORT = "oslog" |
| 17 | + SHORT = "iorep" |
20 | 18 |
|
21 | 19 | def __init__(self, *args, **kwargs): |
22 | 20 | super().__init__(*args, **kwargs) |
23 | | - self.started = False |
| 21 | + self.iobuffer = None |
| 22 | + self.iobuffer_dva = None |
| 23 | + |
| 24 | + @msg_handler(1, OSLog_GetBuf) |
| 25 | + def GetBuf(self, msg): |
| 26 | + if self.iobuffer: |
| 27 | + self.log("WARNING: trying to reset iobuffer!") |
| 28 | + |
| 29 | + |
| 30 | + if msg.DVA != 0: |
| 31 | + self.bufsize = 0x1000 * msg.SIZE |
| 32 | + self.iobuffer = self.iobuffer_dva = msg.DVA << 12 |
| 33 | + self.log(f"buf prealloc {self.iobuffer:#x} / {self.iobuffer_dva:#x}") |
| 34 | + else: |
| 35 | + self.bufsize = align(0x1000 * msg.SIZE, 0x4000) |
| 36 | + self.iobuffer, self.iobuffer_dva = self.asc.ioalloc(self.bufsize) |
| 37 | + self.log(f"buf {self.iobuffer:#x} / {self.iobuffer_dva:#x}") |
| 38 | + self.send(OSLog_GetBuf(DVA=self.iobuffer_dva >> 12, SIZE=self.bufsize // 0x1000)) |
24 | 39 |
|
25 | | - @msg_handler(1, OSLog_Init) |
26 | | - def Init(self, msg): |
27 | | - self.log(f"oslog init: {msg.UNK:#x}") |
28 | | - self.send(OSLog_Ack()) |
29 | | - self.started = True |
30 | 40 | return True |
0 commit comments