| #!/usr/bin/env python3 | 
 | # | 
 | # Copyright (c) 2024 STMicroelectronics | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | """ | 
 | This file implements the Symbol Link Identifer (SLID) | 
 | generation code, for use by the LLEXT subsystem. | 
 | SLID-based linking is enabled by the Kconfig | 
 | option 'CONFIG_LLEXT_EXPORT_BUILTINS_BY_SLID'. | 
 |  | 
 | When executed as a script, this file can be used as | 
 | an interactive prompt to calculate the SLID of arbitrary | 
 | symbols, which can be useful for debugging purposes. | 
 |  | 
 | IMPLEMENTATION NOTES: | 
 |   Currently, SLIDs are generated by taking the first | 
 |   [pointer size] bytes of the symbol name's SHA-256 | 
 |   hash, taken in big-endian order. | 
 |  | 
 |   This ordering provides one advantage: the 32-bit | 
 |   SLID for an export is present in the top 32 bits of | 
 |   the 64-bit SLID for the same export. | 
 | """ | 
 |  | 
 | from hashlib import sha256 | 
 |  | 
 | def generate_slid(symbol_name: str, slid_size: int) -> int: | 
 |     """ | 
 |     Generates the Symbol Link Identifier (SLID) for a symbol. | 
 |  | 
 |         symbol_name: Name of the symbol for which to generate a SLID | 
 |         slid_side: Size of the SLID in bytes (4/8) | 
 |     """ | 
 |     if slid_size not in (4, 8): | 
 |         raise AssertionError(f"Invalid SLID size {slid_size}") | 
 |  | 
 |     m = sha256() | 
 |     m.update(symbol_name.encode("utf-8")) | 
 |     hash = m.digest() | 
 |     return int.from_bytes(hash[0:slid_size], byteorder='big', signed=False) | 
 |  | 
 | def format_slid(slid: int, slid_size: int) -> str: | 
 |     if slid_size == 4: | 
 |         fmt = f"0x{slid:08X}" | 
 |     elif slid_size == 8: | 
 |         fmt = f"0x{slid:016X}" | 
 |     return fmt | 
 |  | 
 | def repl(): | 
 |     while True: | 
 |         sym_name = input("Symbol name? ") | 
 |         slid32 = generate_slid(sym_name, 4) | 
 |         slid64 = generate_slid(sym_name, 8) | 
 |         print(f"  32-bit SLID for '{sym_name}': {format_slid(slid32, 4)}") | 
 |         print(f"  64-bit SLID for '{sym_name}': {format_slid(slid64, 8)}") | 
 |         print() | 
 |  | 
 | if __name__ == "__main__": | 
 |     print("LLEXT SLID calculation REPL") | 
 |     print("Press ^C to exit.") | 
 |     try: | 
 |         repl() | 
 |     except KeyboardInterrupt: | 
 |         print() |