diff --git a/glm_ucode_disasm/glm_ucode_disasm.py b/glm_ucode_disasm/glm_ucode_disasm.py index d3a0813..6552ae0 100644 --- a/glm_ucode_disasm/glm_ucode_disasm.py +++ b/glm_ucode_disasm/glm_ucode_disasm.py @@ -112,6 +112,7 @@ g_dst_mnem += g_idq_src_dst_mnem g_uop_lables = {} g_uop_cregs = {} g_uop_fscp_regs = {} +g_uop_ioregs = {} def glm_ucode_disasm_init(): global g_opcodes @@ -294,6 +295,11 @@ def is_uop_uret(uop): opcode = get_uop_opcode(uop) return opcode in uret_opcodes +def is_uop_rw_ioport(uop): + rwio_opcodes = [0xd0b, 0xd0f] + opcode = get_uop_opcode(uop) + return (opcode & 0xf3f) in rwio_opcodes + def get_str_uop_phys_stg_buf_ldstad_special_imms(uop, uaddr): str_special_imms = () @@ -684,6 +690,21 @@ def get_str_uop_uret_special_imms(uop, uaddr): str_special_imms += "0x%02x" % uret_idx, return str_special_imms +def get_str_uop_rw_ioport_special_imms(uop, uaddr): + src0_sel = get_src0_sel(uop) + src1_sel = get_src1_sel(uop) + is_src0_imm = is_src_imm_sel(src0_sel) + is_src1_imm = is_src_imm_sel(src1_sel) + assert(not is_src1_imm) + + str_special_imms = () + if is_src0_imm: + assert((src0_sel & 0x10) == 0) + special_imm = ((src0_sel & 0x07) << 13) | ((uop & 0x7c0000) >> 10) | ((uop & 0xff000000) >> 24) + str_special_imms += get_str_ioreg(special_imm), "$" + + return str_special_imms + def get_str_uop_common_special_imms(uop, uaddr): special_imm = (uop & 0xff000000) >> 24 str_special_imms = "0x%08x" % special_imm, @@ -703,6 +724,7 @@ g_uop_special_imms_process_funcs = ( \ (is_uop_rw_segfield, get_str_uop_rw_segfield_special_imms), \ (is_uop_aet_trace, get_str_uop_aet_trace_special_imms), \ (is_uop_uret, get_str_uop_uret_special_imms), \ + (is_uop_rw_ioport, get_str_uop_rw_ioport_special_imms), \ (is_uop_common_special_imm, get_str_uop_common_special_imms)) def is_uop_special_imms(uop): @@ -841,6 +863,11 @@ def get_str_uram_addr(uram_addr): return g_uop_fscp_regs[uram_addr] return "0x%04x" % uram_addr +def get_str_ioreg(ioreg): + if ioreg in g_uop_ioregs: + return g_uop_ioregs[ioreg] + return "0x%04x" % ioreg + def uop_disassemble(uop, uaddr): src0_sel = get_src0_sel(uop) src1_sel = get_src1_sel(uop) @@ -1112,9 +1139,11 @@ def msrom_disasm(arrays_dump_dir): global g_uop_cregs global g_uop_lables global g_uop_fscp_regs + global g_uop_ioregs g_uop_lables = load_id_names_str_data("lables.txt") g_uop_cregs = load_id_names_str_data("cregs.txt") g_uop_fscp_regs = load_id_names_str_data("fscp.txt") + g_uop_ioregs = load_id_names_str_data("ioregs.txt") ucode = load_ms_array_str_data(arrays_dump_dir + "\\ms_array0.txt") msrom_seqwords = load_ms_array_str_data(arrays_dump_dir + "\\ms_array1.txt") assert(len(ucode) == len(msrom_seqwords)) diff --git a/glm_ucode_disasm/ioregs.txt b/glm_ucode_disasm/ioregs.txt new file mode 100644 index 0000000..39c1a10 --- /dev/null +++ b/glm_ucode_disasm/ioregs.txt @@ -0,0 +1,4 @@ +d4: PCU_CR_PCODE_UCODE_Mailbox_Interface +d8: PCU_CR_PCODE_UCODE_Mailbox_Data +4900: PCU_CR_MICROCONTROLLER_CONFIGURATION + diff --git a/glm_ucode_disasm/lables.txt b/glm_ucode_disasm/lables.txt index 29762ae..7cf8c17 100644 --- a/glm_ucode_disasm/lables.txt +++ b/glm_ucode_disasm/lables.txt @@ -13,6 +13,7 @@ 0738: sysexit_xlat 0788: rdtscp_xlat 0794: clear_aflags_uend0 +07b5: send_op_pcu_mailbox 0818: hlt_xlat 0890: mov_cr0_r64_xlat 08c0: rsm_xlat @@ -69,6 +70,7 @@ 556a: calc_fast_sha256_start 5795: rsa_signing_error 5c01: probe_mode_force_smm_xlat +5c62: send_op_data_pcu_mailbox 5e68: fit_process_error 5ed5: rc4_decrypt 608a: fit_load_end