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