#!/usr/bin/env python3

import sys

from elftools.elf.elffile import ELFFile


services = [
    ("syscalls", [
        ("now_init", "now_init"),
        ("now_save", "now_save"),

        ("watchdog_set", "watchdog_set"),
        ("watchdog_clear", "watchdog_clear"),

        ("rpc", "rpc"),

        ("rtio_get_counter", "rtio_get_counter"),

        ("ttl_set_o", "ttl_set_o"),
        ("ttl_set_oe", "ttl_set_oe"),
        ("ttl_set_sensitivity", "ttl_set_sensitivity"),
        ("ttl_get", "ttl_get"),

        ("dds_init", "dds_init"),
        ("dds_batch_enter", "dds_batch_enter"),
        ("dds_batch_exit", "dds_batch_exit"),
        ("dds_set", "dds_set"),
    ]),

    ("eh", [
        ("setjmp", "exception_setjmp"),
        ("push", "exception_push"),
        ("pop", "exception_pop"),
        ("getid", "exception_getid"),
        ("raise", "exception_raise"),
    ])
]


def print_service_table(ksupport_elf_filename):
    with open(ksupport_elf_filename, "rb") as f:
        elf = ELFFile(f)
        symtab = elf.get_section_by_name(b".symtab")
        symbols = {symbol.name: symbol.entry.st_value
                   for symbol in symtab.iter_symbols()}
    for name, contents in services:
        print("static const struct symbol {}[] = {{".format(name))
        for name, value in contents:
            print("    {{\"{}\", (void *)0x{:08x}}},"
                  .format(name, symbols[bytes(value, "ascii")]))
        print("    {NULL, NULL}")
        print("};")


def main():
    if len(sys.argv) == 2:
        print_service_table(sys.argv[1])
    else:
        print("Incorrect number of command line arguments")
        sys.exit(1)

if __name__ == "__main__":
    main()