Jan C. Willems

91 papers B 1C 1Journal 48Unranked 39
YearRankTypeTitle / Venue / Authors
2014 J jnl
IEEE Trans. Autom. Control.
Jochen Trumpf, Harry L. Trentelman, Jan C. Willems
2013 J jnl
IEEE Trans. Autom. Control.
Jan C. Willems
2013 conf
CDC
Jan C. Willems
2013 conf
CDC
Jan C. Willems
2012 B conf
ISIT
Jan C. Willems
2012 conf
CDC
Stephan Trenn, Jan C. Willems
2011 J jnl
Syst. Control. Lett.
Timo Reis, Jan C. Willems
2011 conf
CDC/ECC
Jochen Trumpf, Harry L. Trentelman, Jan C. Willems
2011 J jnl
Multidimens. Syst. Signal Process.
Paula Rocha, Jan C. Willems
2011 conf
CDC/ECC
Paula Rocha, Jan C. Willems, Paolo Rapisarda, Diego Napp
2011 conf
CDC/ECC
Jan C. Willems
2011 conf
CDC/ECC
José Carlos Aleixo, Paula Rocha, Jan C. Willems
2011 J jnl
IEEE Trans. Autom. Control.
Roland Tóth, Jan C. Willems, Peter S. C. Heuberger, Paul M. J. Van den Hof
2010 J jnl
Eur. J. Control
Sanjoy K. Mitter, Arkadi Nemirovski, Jan C. Willems
2010 conf
CDC
Masaki Ogura, Yutaka Yamamoto, Jan C. Willems
2010 C conf
ISCAS
Jan C. Willems
2010 conf
CDC
Erik I. Verriest, Jan C. Willems
2009 conf
ECC
Roland Tóth, Jan C. Willems, Peter S. C. Heuberger, Paul M. J. Van den Hof
2009 conf
CDC
Paul William Coote, Jochen Trumpf, Robert E. Mahony, Jan C. Willems
2009 conf
CDC
Yutaka Yamamoto, Jan C. Willems
2009 conf
CDC
Jan C. Willems, Erik I. Verriest
2008 conf
CDC
Yutaka Yamamoto, Jan C. Willems
2008 ch.
Recent Advances in Learning and Control
Jan C. Willems, Yutaka Yamamoto
2008 J jnl
Syst. Control. Lett.
Bart Vanluyten, Jan C. Willems, Bart De Moor
2007 conf
CDC
Bart Vanluyten, Jan C. Willems, Bart De Moor
2007 J jnl
Eur. J. Control
Jan C. Willems
2007 J jnl
Eur. J. Control
Jan C. Willems
2007 conf
CDC
Jan C. Willems, Yutaka Yamamoto
2006 J jnl
IEEE Trans. Autom. Control.
Mauro Bisiacco, Maria Elena Valcher, Jan C. Willems
2006 conf
CDC
Jan C. Willems, Yutaka Yamamoto
2006 J jnl
Syst. Control. Lett.
Paula Rocha, Jan C. Willems
2006 conf
CDC
Bart Vanluyten, Jan C. Willems, Bart De Moor
2006 conf
POSTA
Bart Vanluyten, Jan C. Willems, Bart De Moor
2006 conf
CDC
Ivan Markovsky, Jan C. Willems, Bart De Moor
2005 J jnl
Syst. Control. Lett.
Jan C. Willems, Paolo Rapisarda, Ivan Markovsky, Bart De Moor
2005 J jnl
Autom.
Ivan Markovsky, Jan C. Willems, Paolo Rapisarda, Bart De Moor
2005 J jnl
IEEE Trans. Autom. Control.
Ivan Markovsky, Jan C. Willems, Sabine Van Huffel, Bart De Moor, Rik Pintelon
2005 J jnl
Math. Control. Signals Syst.
Paolo Rapisarda, Jan C. Willems
2005 conf
CDC/ECC
Bart Vanluyten, Jan C. Willems, Bart De Moor
2005 conf
CDC/ECC
Jan C. Willems, Maria Elena Valcher
2005 conf
CDC/ECC
Ivan Markovsky, Jan C. Willems, Sabine Van Huffel, Bart De Moor
2005 conf
CDC/ECC
Ivan Markovsky, Jan C. Willems, Bart De Moor
2005 J jnl
Syst. Control. Lett.
A. Agung Julius, Jan C. Willems, Madhu N. Belur, Harry L. Trentelman
2004 conf
CDC
Jan C. Willems, Ivan Markovsky, Paolo Rapisarda, Bart De Moor
2004 conf
CDC
Ivan Markovsky, Jan C. Willems, Sabine Van Huffel, Bart De Moor, Rik Pintelon
2003 conf
CDC
Paolo Rapisarda, Jan C. Willems
2003 ch.
Mathematical Systems Theory in Biology, Communications, Computation, and Finance
Jan C. Willems, Harish K. Pillai
2003 conf
CDC
M. Kanat Camlibel, Jan C. Willems, Madhu N. Belur
2003 J jnl
Eur. J. Control
Harry L. Trentelman, Jan C. Willems
2003 conf
CDC
Jan C. Willems, A. Agung Julius, Madhu N. Belur, Harry L. Trentelman
2003 J jnl
Appl. Math. Comput.
Tommaso Cotroneo, Jan C. Willems
2002 conf
CDC
Ivan Markovsky, Jan C. Willems, Bart De Moor
2002 J jnl
SIAM J. Control. Optim.
Harish K. Pillai, Jan C. Willems
2002 conf
CDC
Jan C. Willems
2002 J jnl
IEEE Trans. Autom. Control.
Jan C. Willems, Harry L. Trentelman
2002 J jnl
IEEE Trans. Autom. Control.
Harry L. Trentelman, Jan C. Willems
2002 J jnl
Syst. Control. Lett.
Amol J. Sasane, Erik G. F. Thomas, Jan C. Willems
2001 J jnl
IEEE Trans. Autom. Control.
Yufan Zheng, Jan C. Willems, Cishen Zhang
2001 conf
ECC
Kiyotsugu Takaba, Jan C. Willems
2001 conf
CDC
Kiyotsugu Takaba, Jan C. Willems
2001 conf
CDC
Madhu N. Belur, Harry L. Trentelman, Jan C. Willems
2001 conf
ECC
Tommaso Cotroneo, Jan C. Willems, Paolo Rapisarda
2000 J jnl
Eur. J. Control
Brian D. O. Anderson, Petar V. Kokotovic, Ioan Doré Landau, Jan C. Willems
2000 conf
CDC
Harish K. Pillai, Jan C. Willems
1999 J jnl
IEEE Trans. Autom. Control.
Harry L. Trentelman, Jan C. Willems
1999 conf
System Modelling and Optimization
Tommaso Cotroneo, Jan C. Willems
1999 J jnl
IEEE Trans. Autom. Control.
Maria Elena Valcher, Jan C. Willems
1999 conf
ECC
Harish K. Pillai, Jan C. Willems
1999 J jnl
IEEE Trans. Autom. Control.
Jan C. Willems, Roberto Tempo
1999 conf
ECC
Tommaso Cotroneo, Jan C. Willems
1997 J jnl
IEEE Trans. Autom. Control.
Margreta Kuijper, Jan C. Willems
1997 J jnl
IEEE Trans. Autom. Control.
Jan C. Willems
1997 J jnl
IEEE Trans. Autom. Control.
A. A. Tonny ten Dam, K. F. Dwarshuis, Jan C. Willems
1996 J jnl
Eur. J. Control
Jan C. Willems
1995 J jnl
Autom.
Jan C. Willems
1995 J jnl
Eur. J. Control
Jan C. Willems
1995 J jnl
IEEE Trans. Autom. Control.
Karen Rudie, Jan C. Willems
1994 J jnl
Math. Control. Signals Syst.
Fabio Fagnani, Jan C. Willems
1993 J jnl
IEEE Trans. Autom. Control.
Athanasios C. Antoulas, Jan C. Willems
1992 J jnl
Math. Control. Signals Syst.
J. W. Nieuwenhuis, Jan C. Willems
1991 J jnl
Kybernetika
J. W. Nieuwenhuis, Jan C. Willems
1991 J jnl
Kybernetika
Paula Rocha, Jan C. Willems
1990 J jnl
Multidimens. Syst. Signal Process.
Paula Rocha, Jan C. Willems
1988 J jnl
Math. Control. Signals Syst.
J. W. Nieuwenhuis, Jan C. Willems
1987 J jnl
Autom.
Jan C. Willems
1986 J jnl
Autom.
Jan C. Willems
1986 J jnl
Autom.
Jan C. Willems
1985 J jnl
Autom.
Jan C. Willems
1982 J jnl
Autom.
Jan C. Willems
1976 J jnl
Autom.
Jacques L. Willems, Jan C. Willems
1976 J jnl
Autom.
Jan C. Willems
redb/extractors/decompiler/bninja/arch/x86.py
← Index redb/extractors/decompiler/bninja/arch/x86.py python
from binaryninja.enums import (
    InstructionTextTokenType,
)

# Support both package and standalone imports
try:
    from .architecture import Architecture
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.arch.architecture import Architecture


class Arch_x86(Architecture):
    """The concrete class for architecture-dependent details for x86_64"""

    def __init__(self):
        # general purpose registers for 64bits
        self.gpr_64 = [
            "RAX",
            "RBX",
            "RCX",
            "RDX",
            "RSI",
            "RDIR9",
            "R10",
            "R11",
            "R12",
            "R13",
            "R14",
            "R15",
        ]

        self.gpr_32 = [
            "EAX",
            "EBX",
            "ECX",
            "EDX",
            "ESI",
            "EDI",
            "R8D",
            "R9D",
            "R10D",
            "R11D",
            "R12D",
            "R13D",
            "R14D",
            "R15D",
        ]

        self.gpr_16 = [
            "AX",
            "BX",
            "CX",
            "DX",
            "SI",
            "DI",
            "R8W",
            "R9W",
            "R10W",
            "R11W",
            "R12W",
            "R13W",
            "R14W",
            "R15W",
        ]

        self.gpr_8 = [
            "AL",
            "BL",
            "CL",
            "DL",
            "SIL",
            "DIL",
            "R8B",
            "R9B",
            "R10B",
            "R11B",
            "R12B",
            "R13B",
            "R14B",
            "R15B",
        ]

        self.fpu_x87 = ["ST0", "ST1", "ST2", "ST3", "ST4", "ST5", "ST6", "ST7"]

        self.sse_xmm = [
            "XMM0",
            "XMM1",
            "XMM2",
            "XMM3",
            "XMM4",
            "XMM5",
            "XMM6",
            "XMM7",
            "XMM8",
            "XMM9",
            "XMM10",
            "XMM11",
            "XMM12",
            "XMM13",
            "XMM14",
            "XMM15",
        ]

        self.avx_ymm = [
            "YMM0",
            "YMM1",
            "YMM2",
            "YMM3",
            "YMM4",
            "YMM5",
            "YMM6",
            "YMM7",
            "YMM8",
            "YMM9",
            "YMM10",
            "YMM11",
            "YMM12",
            "YMM13",
            "YMM14",
            "YMM15",
        ]
        self.flags = ["FLAGS", "EFLAGS", "RFLAGS"]
        self.stack_registers = ["RBP", "RSP", "SP", "BP"]
        self.size = 8
        self.global_registers = (
            self.gpr_64
            + self.gpr_32
            + self.gpr_16
            + self.gpr_8
            + self.fpu_x87
            + self.sse_xmm
            + self.avx_ymm
        )
        self.opcode_categories = self._initialize_opcode_categories()

        ## instructions
        self.instructions = []

    def is_register(self, register):
        register = register.upper()
        return register in self.global_registers

    def is_general_purpose_register(self, register):
        register = register.upper()
        return (
            register in self.gpr_64
            or register in self.gpr_32
            or register in self.gpr_16
            or register in self.gpr_8
        )

    def is_stack_register(self, register):
        register = register.upper()
        return register in self.stack_registers

    def is_xmm_register(self, register):
        register = register.upper()
        return register in self.sse_xmm

    def is_control_flow(self, instr_tokens):
        return False

    def is_control_flow_instruction(self, instr_tokens):
        """Check if an instruction is a control flow instruction (jump, call, return, loop)."""
        try:
            # Extract the mnemonic from the instruction tokens
            mnemonic = None
            for token in instr_tokens:
                if token.type == InstructionTextTokenType.InstructionToken:
                    mnemonic = token.text.upper()
                    break

            if not mnemonic:
                return False

            # Check if it's a jump, call, return, or loop instruction
            return (
                mnemonic.startswith("J")  # All jumps (JMP, JE, JNE, etc.)
                or mnemonic == "CALL"  # Function calls
                or mnemonic == "RET"  # Return
                or mnemonic == "RETN"  # Another form of return
                or mnemonic.startswith("LOOP")
            )  # Loop instructions

        except Exception as e:
            print(e)
            # If we can't determine, assume it's not a control flow instruction
            return False

    def is_control_flow_instruction_by_mnemonic(self, mnemonic):
        """Check if an instruction is a control flow instruction based on its mnemonic."""
        if not mnemonic:
            return False

        mnemonic = mnemonic.upper()
        return (
            mnemonic.startswith("J")  # All jumps (JMP, JE, JNE, etc.)
            or mnemonic == "CALL"  # Function calls
            or mnemonic == "RET"  # Return
            or mnemonic == "RETN"  # Another form of return
            or mnemonic.startswith("LOOP")
        )

    def _initialize_opcode_categories(self):
        """Initialize mapping of opcodes to categories similar to Ghidra's implementation."""
        opcode_categories = {}
        opcode_index = {}  # Add this to mimic Ghidra's opcodeIndex

        # Define common opcodes array similar to Ghidra's COMMON_OPCODES
        COMMON_OPCODES = [
            # Core instructions (tracked individually)
            "MOV",
            "PUSH",
            "POP",
            "LEA",
            "CALL",
            "RET",  # Data movement and control
            "ADD",
            "SUB",
            "MUL",
            "DIV",  # Basic arithmetic
            "AND",
            "OR",
            "XOR",
            "NOT",  # Logical operations
            "JMP",
            "JE",
            "JNE",  # Basic jumps
            "TEST",
            "CMP",  # Comparisons
            # Grouped categories (aggregated tracking)
            "SIMD_MOVE",  # MOVAPS, MOVDQA, MOVDQU, etc.
            "COND_JUMP_EXT",  # Other conditional jumps (JG, JL, JGE, etc.)
            "STRING_OP",  # MOVS, STOS, LODS, SCAS, CMPS
            "STACK_ADV",  # ENTER, LEAVE, PUSHA, POPA
            "ARITHMETIC_ADV",  # IMUL, IDIV, ADC, SBB
            "BIT_OP",  # SHL, SHR, SAR, ROL, ROR, etc.
            "FPU_OP",  # FLD, FST, FADD, etc.
            "SYSTEM_OP",  # SYSCALL, INT, SYSENTER
            "CRYPTO_OP",  # AES*, SHA* instructions
            "MISC_OP",  # Rare but interesting (CPUID, RDTSC, etc.)
        ]

        # Create index map like Ghidra
        for i, opcode in enumerate(COMMON_OPCODES):
            opcode_index[opcode] = i

        # Now categorize opcodes using if/elif/else structure like in Ghidra
        for opcode in COMMON_OPCODES:
            # String Operations (checking these first to avoid MOV confusion)
            if opcode.startswith("MOVS") or opcode in [
                "STOS",
                "LODS",
                "SCAS",
                "CMPS",
                "REP",
                "REPE",
                "REPNE",
            ]:
                opcode_categories[opcode] = "STRING_MANIPULATION"

            # Data Movement (after string ops to avoid MOVS confusion)
            elif opcode.startswith("MOV") or opcode in ["LEA", "XCHG"]:
                opcode_categories[opcode] = "DATA_MOVEMENT"

            # Stack Operations
            elif opcode in ["PUSH", "POP", "ENTER", "LEAVE", "PUSHA", "POPA"]:
                opcode_categories[opcode] = "STACK_MANAGEMENT"

            # Control Flow (non-conditional)
            elif opcode in ["JMP", "CALL", "RET"]:
                opcode_categories[opcode] = "CONTROL_FLOW"

            # Conditional Jumps and Loops
            elif opcode.startswith("J") or opcode.startswith("LOOP"):
                opcode_categories[opcode] = "CONDITIONAL_JUMP"

            # Arithmetic
            elif opcode in [
                "ADD",
                "SUB",
                "MUL",
                "DIV",
                "IMUL",
                "IDIV",
                "ADC",
                "SBB",
                "INC",
                "DEC",
                "NEG",
            ]:
                opcode_categories[opcode] = "ARITHMETIC"

            # Logical
            elif opcode in ["AND", "OR", "XOR", "NOT", "TEST", "CMP"]:
                opcode_categories[opcode] = "LOGICAL"

            # Shifts & Rotates
            elif opcode in ["SHL", "SHR", "SAR", "SAL", "ROL", "ROR", "RCL", "RCR"]:
                opcode_categories[opcode] = "SHIFT_ROTATE"

            # System & Interrupts
            elif opcode in [
                "SYSCALL",
                "INT",
                "SYSENTER",
                "SYSEXIT",
                "SGDT",
                "SIDT",
                "SLDT",
                "WRMSR",
                "RDMSR",
            ]:
                opcode_categories[opcode] = "SYSTEM_CALLS"

            # Floating Point
            elif opcode.startswith("F"):
                opcode_categories[opcode] = "FPU_ARITHMETIC"

            # System Information and Random Number Generation
            elif opcode in ["PUSHF", "POPF", "CPUID", "RDTSC", "RDRAND", "RDSEED"]:
                opcode_categories[opcode] = "CPU_FEATURES"

            # Cryptography
            elif opcode.startswith("AES") or opcode.startswith("SHA"):
                opcode_categories[opcode] = "CRYPTOGRAPHIC"

            # Miscellaneous (including flag operations)
            else:
                opcode_categories[opcode] = "MISC"

        # Additional categorization for opcodes not in COMMON_OPCODES
        # This can be used in the normalize_opcode method

        # Store both maps as instance variables
        # self.opcode_categories = opcode_categories
        self.opcode_index = opcode_index

        return opcode_categories

    def is_simd_register(self, register):
        return register in self.sse_xmm