regs: add parse_packets
This commit is contained in:
parent
06f4c14181
commit
25c004dbe7
1
regs/.gitignore
vendored
1
regs/.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
pvs_dst.py
|
||||
pvs_src.py
|
||||
pvs_dst_bits.py
|
||||
registers_lookup.py
|
@ -1,4 +1,6 @@
|
||||
with open('3d_registers.txt') as f:
|
||||
import sys
|
||||
|
||||
with open(sys.argv[1]) as f:
|
||||
lines = f.read().split('\n')
|
||||
|
||||
def parse_reg_value(value):
|
||||
|
@ -2,4 +2,6 @@ set -eux
|
||||
|
||||
python parse_pvs.py PVS_DST pvs_opcode_and_destination_operand.txt > pvs_dst.py
|
||||
python parse_pvs.py PVS_SRC pvs_source_operand.txt > pvs_src.py
|
||||
python parse_pvs_bits.py regs/pvs_opcode_and_destination_operand_bits.txt > pvs_dst_bits.py
|
||||
python parse_pvs_bits.py pvs_opcode_and_destination_operand_bits.txt > pvs_dst_bits.py
|
||||
|
||||
python 3d_registers.py 3d_registers.txt > registers_lookup.py
|
||||
|
91
regs/parse_packets.py
Normal file
91
regs/parse_packets.py
Normal file
@ -0,0 +1,91 @@
|
||||
import sys
|
||||
from registers_lookup import registers_lookup
|
||||
|
||||
with open(sys.argv[1]) as f:
|
||||
values = [
|
||||
int(s.strip(), 16)
|
||||
for s in f.read().strip().split(",")
|
||||
]
|
||||
|
||||
undocumented_registers = {
|
||||
0x1720: "RADEON_WAIT_UNTIL",
|
||||
0x2184: "VAP_VSM_VTX_ASSM",
|
||||
}
|
||||
|
||||
class Parser:
|
||||
def __init__(self, values):
|
||||
self.ix = 0
|
||||
self.values = values
|
||||
|
||||
def peek(self):
|
||||
return self.values[self.ix]
|
||||
|
||||
def consume(self):
|
||||
value = self.peek()
|
||||
self.ix += 1
|
||||
return value
|
||||
|
||||
def skip(self):
|
||||
self.ix += 1
|
||||
|
||||
def packet_type_0(self):
|
||||
header = self.consume()
|
||||
count = (header >> 16) & 0x3fff
|
||||
one_reg = (header >> 15) & 0b1
|
||||
reserved = (header >> 13) & 0b11
|
||||
base_index = (header >> 0) & 0x1fff
|
||||
assert reserved == 0, header
|
||||
if one_reg:
|
||||
print(f"type 0: {base_index:04x} {count} ONE_REG")
|
||||
else:
|
||||
print(f"type 0: {base_index:04x} {count}")
|
||||
while count >= 0:
|
||||
address = base_index << 2
|
||||
value = self.consume()
|
||||
#print(f" {address:04x} = {value:08x}")
|
||||
if address in registers_lookup:
|
||||
print(f" {registers_lookup[address]} = {value:08x}")
|
||||
else:
|
||||
print(f" {undocumented_registers[address]} = {value:08x}")
|
||||
count -= 1
|
||||
if not one_reg:
|
||||
base_index += 1
|
||||
|
||||
def packet_type_1(self):
|
||||
header = self.consume()
|
||||
assert False, header
|
||||
|
||||
def packet_type_2(self):
|
||||
print("type 2")
|
||||
self.skip()
|
||||
|
||||
def packet_type_3(self):
|
||||
header = self.consume()
|
||||
reserved = (header >> 0) & 0xff
|
||||
assert reserved == 0, header
|
||||
it_opcode = (header >> 8) & 0xff
|
||||
count = (header >> 16) & 0x3fff
|
||||
|
||||
print(f"type 3: op:{it_opcode:02x} count:{count:04x}")
|
||||
while count >= 0:
|
||||
value = self.consume()
|
||||
print(f" {value:08x}")
|
||||
count -= 1
|
||||
|
||||
def packet(self):
|
||||
value = self.peek()
|
||||
packet_type = (value >> 30) & 0b11
|
||||
if packet_type == 0:
|
||||
self.packet_type_0()
|
||||
elif packet_type == 1:
|
||||
self.packet_type_1()
|
||||
elif packet_type == 2:
|
||||
self.packet_type_2()
|
||||
elif packet_type == 3:
|
||||
self.packet_type_3()
|
||||
else:
|
||||
assert False
|
||||
|
||||
parser = Parser(values)
|
||||
while parser.ix < len(values):
|
||||
parser.packet()
|
Loading…
x
Reference in New Issue
Block a user