68 lines
1.6 KiB
Python
68 lines
1.6 KiB
Python
#!/usr/bin/env python3
|
|
#
|
|
# Copyright (c) 2021 Intel Corporation
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
"""
|
|
Utilities for Dictionary-based Logging Parser
|
|
"""
|
|
|
|
import binascii
|
|
|
|
|
|
def convert_hex_file_to_bin(hexfile):
|
|
"""This converts a file in hexadecimal to binary"""
|
|
bin_data = b''
|
|
|
|
with open(hexfile, "r", encoding="iso-8859-1") as hfile:
|
|
for line in hfile.readlines():
|
|
hex_str = line.strip()
|
|
|
|
bin_str = binascii.unhexlify(hex_str)
|
|
bin_data += bin_str
|
|
|
|
return bin_data
|
|
|
|
|
|
def extract_one_string_in_section(section, str_ptr):
|
|
"""Extract one string in an ELF section"""
|
|
data = section['data']
|
|
max_offset = section['size']
|
|
offset = str_ptr - section['start']
|
|
|
|
if offset < 0 or offset >= max_offset:
|
|
return None
|
|
|
|
ret_str = ""
|
|
|
|
while (offset < max_offset) and (data[offset] != 0):
|
|
ret_str += chr(data[offset])
|
|
offset += 1
|
|
|
|
return ret_str
|
|
|
|
|
|
def find_string_in_mappings(string_mappings, str_ptr):
|
|
"""
|
|
Find string pointed by string_ptr in the string mapping
|
|
list. Return None if not found.
|
|
"""
|
|
if string_mappings is None:
|
|
return None
|
|
|
|
if len(string_mappings) == 0:
|
|
return None
|
|
|
|
if str_ptr in string_mappings:
|
|
return string_mappings[str_ptr]
|
|
|
|
# No direct match on pointer value.
|
|
# This may be a combined string. So check for that.
|
|
for ptr, string in string_mappings.items():
|
|
if ptr <= str_ptr < (ptr + len(string)):
|
|
whole_str = string_mappings[ptr]
|
|
return whole_str[str_ptr - ptr:]
|
|
|
|
return None
|