Get a syscall SimProcedure from an address.

        :param addr: The address to convert to a syscall SimProcedure
        :param allow_unsupported: Whether to return a dummy procedure for an unsupported syscall instead of raising an
                                  exception.
        :return: The SimProcedure for the syscall, or None if the address is not a syscall address.

def syscall_from_addr(self, addr, allow_unsupported=True):
        """
        Get a syscall SimProcedure from an address.

        :param addr: The address to convert to a syscall SimProcedure
        :param allow_unsupported: Whether to return a dummy procedure for an unsupported syscall instead of raising an
                                  exception.
        :return: The SimProcedure for the syscall, or None if the address is not a syscall address.
        """
        if not self.is_syscall_addr(addr):
            return None

        number = (addr - self.kernel_base) // self.syscall_addr_alignment
        for abi in self.syscall_abis:
            baseno, minno, maxno = self.syscall_abis[abi]
            if baseno <= number <= baseno + maxno - minno:
                number += minno
                number -= baseno
                break
        else:
            abi = None
        return self.syscall_from_number(number, allow_unsupported=allow_unsupported, abi=abi)