1#!/usr/bin/env python3 2# 3# Copyright (c) 2022 - 2023 Intel Corporation 4# 5# SPDX-License-Identifier: Apache-2.0 6 7""" 8Utilities for MIPI Sys-T Collateral XML data 9""" 10 11from xml.sax.saxutils import escape 12 13XML_HEADER = """ 14<?xml version="1.0" encoding="utf-8"?> 15<syst:Collateral xmlns:syst="http://www.mipi.org/1.0/sys-t" 16 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 17 xsi:schemaLocation="http://www.mipi.org/1.0/sys-t 18 https://www.mipi.org/schema/sys-t/sys-t_1-0.xsd"> 19 20 <syst:Client Name="Zephyr"> 21""" 22 23XML_FOOTER = """ 24 </syst:Client> 25 26</syst:Collateral> 27""" 28 29XML_MODULE_HEADER = """ 30 <syst:Modules>""" 31 32XML_MODULE_EACH = """ 33 <syst:Module ID="{0}"><![CDATA[{1}]]></syst:Module>""" 34 35XML_MODULE_FOOTER = """ 36 </syst:Modules> 37""" 38 39XML_CATALOG32_HEADER = """ 40 <syst:Catalog32>""" 41 42XML_CATALOG32_EACH = """ 43 <syst:Format ID="0x{0:08x}"><![CDATA[{1}]]></syst:Format>""" 44 45XML_CATALOG32_FOOTER = """ 46 </syst:Catalog32> 47""" 48 49XML_CATALOG64_HEADER = """ 50 <syst:Catalog64>""" 51 52XML_CATALOG64_EACH = """ 53 <syst:Format ID="0x{0:016x}"><![CDATA[{1}]]></syst:Format>""" 54 55XML_CATALOG64_FOOTER = """ 56 </syst:Catalog64> 57""" 58 59XML_GUIDS = """ 60 <syst:Guids> 61 <syst:Guid ID="{00000000-0000-0000-0000-000000000000}" 62 Mask="{00000000-0000-0000-FF00-000000000000}"><![CDATA[Zephyr]]></syst:Guid> 63 </syst:Guids> 64""" 65 66 67def __gen_syst_modules(database): 68 """ 69 Generate syst:Modules, which corresponds to log source ID and name 70 """ 71 if 'log_subsys' not in database.database: 72 return "" 73 74 if 'log_instances' not in database.database['log_subsys']: 75 return "" 76 77 instances = database.database['log_subsys']['log_instances'] 78 79 if not instances: 80 # Empty dictionary: no instances 81 return "" 82 83 xml = XML_MODULE_HEADER 84 85 for _, one_inst in instances.items(): 86 xml += XML_MODULE_EACH.format(one_inst['source_id'], escape(one_inst['name'])) 87 88 xml += XML_MODULE_FOOTER 89 90 return xml 91 92 93def __gen_syst_catalog(database): 94 """ 95 Generate syst:Catalog, which corresponds to log strings 96 """ 97 if not database.has_string_mappings(): 98 return "" 99 100 if database.is_tgt_64bit(): 101 xml = XML_CATALOG64_HEADER 102 fmt = XML_CATALOG64_EACH 103 else: 104 xml = XML_CATALOG32_HEADER 105 fmt = XML_CATALOG32_EACH 106 107 for addr, one_str in database.get_string_mappings().items(): 108 xml += fmt.format(addr, one_str) 109 110 if database.is_tgt_64bit(): 111 xml += XML_CATALOG64_FOOTER 112 else: 113 xml += XML_CATALOG32_FOOTER 114 115 return xml 116 117 118def gen_syst_xml_file(database): 119 """ 120 Generate MIPI Sys-T Collateral XML data 121 """ 122 xml = XML_HEADER 123 124 xml += XML_GUIDS 125 126 xml += __gen_syst_modules(database) 127 128 xml += __gen_syst_catalog(database) 129 130 xml += XML_FOOTER 131 132 return xml 133