[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nindent_style = tab\nindent_size = 4\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.md]\nindent_style = unset\n\n[*.yml]\nindent_style = space\nindent_size = 2\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Exclude assembly from linguist code stats (prevents GitHub from marking the\n# repository as >50% assembly).\n*.s linguist-vendored\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "name: Publish to PyPI\n\non:\n  release:\n    types:\n      - published\n\n# Allow only one concurrent job\nconcurrency:\n  group: publish\n  cancel-in-progress: false\n\njobs:\n  test-before-publish:\n    uses: ./.github/workflows/test.yml\n  publish:\n    needs: [test-before-publish]\n    runs-on: ubuntu-latest\n    environment:\n      name: hatch\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Ensure matching version and release tag\n        run: test v\"$(python3 src/systrack/version.py)\" = \"${{github.ref_name}}\"\n      - name: Install build dependencies\n        run: python3 -m pip install --upgrade build hatch\n      - name: Build wheel and sdist\n        run: hatch build\n      - name: Publish to PyPI\n        run: hatch publish --no-prompt\n        env:\n          HATCH_INDEX_USER: __token__\n          HATCH_INDEX_AUTH: ${{secrets.HATCH_INDEX_AUTH}}\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: Test\n\non:\n  push:\n    branches:\n      - main\n      - dev\n  workflow_call:\n\njobs:\n  test:\n    runs-on: ubuntu-22.04\n    strategy:\n      matrix:\n        python-version: [\"3.8\", \"3.9\", \"3.10\", \"3.11\", \"3.12\"]\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Setup Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: ${{ matrix.python-version }}\n      - name: Install test dependencies\n        run: python3 -m pip install --upgrade build hatch pytest\n      - name: Run tests\n        run: hatch test\n"
  },
  {
    "path": ".gitignore",
    "content": "dist\nsystrack.egg-info\n__pycache__\n.pytest_cache\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "Systrack changelog\n==================\n\n\nv0.8\n----\n\nNew arch support: IBM Z-Architecture S390 64-bit and compat 32-bit, tested on\nv4.0+ kernels. Thanks to Ilya Leoshkevich ([@iii-i](https://github.com/iii-i))\nfor the initial implementation (#3).\n\n**Improvements**:\n\n- Produce lighter builds (hopefully) stripping apparmor and USB support as they\n  do not affect syscalls.\n- Reduce possibility of build errors disabling `-Werror` where possible.\n- Detect and deprioritize symbols coming from interprocedural optimization\n  (`xxx.localalias`) implemented in recent compiler versions for more precise\n  syscall symbol and name detection.\n- Improve Kconfig parsing, sanity checks and warnings about Kconfig options.\n- arm64: new arch-specific dummy syscall implementation detection helper.\n\n**Bug fixes**:\n\n- Fix internal `Versioned{Dict,List}` caching implementation, used for Kconfig\n  options mostly.\n- Fix command formatting in debug logs, which should be now correctly\n  copy-pasteable into a shell as is.\n- arm64: fix broken pkey syscalls detection. Implemented in v6.12 under\n  `ARM64_POE` config, but was wrongly detected as present on earlier kernels.\n- powerpc, riscv: fix some imprecise/incorrect Kconfig option versioning and\n  dependenceis.\n\n**Internal changes**:\n\n- Move kconfig parsing logic into own `Kconfig` class.\n- Improve `Kernel` exception semantics: throw exceptions at analysis time\n  instead of causing program exit.\n- Improve `Arch` subclass method overrides and implement unit test to perform\n  sanity checks around abstract methods.\n\n\nv0.7\n----\n\nNew arch support: RISC-V 32-bit and 64-bit, tested on v4.15+ kernels (i.e.,\nsince the first Linux version supporting RISC-V).\n\n**Improvements**:\n\n- Improve dummy syscall implementation detection: try to first match known\n  \"ni_syscall\" code.\n- Improve error messages and debug/info logs, pretty printing command-line\n  arguments and executed commands instead of dumping their tuple/list\n  representation.\n- mips: implement simple arch-specific dummy syscall detection.\n- arm64: remove \"arm64_\" arch-specific prefix from syscall names.\n\n**Bug fixes**:\n\n- mips: new dummy syscall detection now correctly identifies some dummy syscalls\n  that were previously missed (notably `cachestat`).\n\n**Internal changes**:\n\n- Archs can now specify multiple kernel Makefile config targets to run one after\n  the other as a \"base\" config.\n\n\nv0.6\n----\n\n**Improvements**:\n\n- More robust and comprehensive syscall definition location search.\n\n**Bug fixes**:\n\n- Fix broken syscall definition location search and subsequent signature\n  extraction. Some syscalls were incorrectly reported as defined in place of\n  others, also causing the wrong signature to be extracted. Do not fully trust\n  the output of `addr2line` and perform full syscall name matching to fix this.\n  PowerPC was notably affected the most by this issue.\n\n\nv0.5.1\n------\n\n**Improvements**:\n\n- x86: improve x86 syscall extraction code fixing undetected CALL targets.\n\n**Internal changes**:\n\n- x86: add some tests for syscall extraction based on v6.11 kernel build.\n\n\nv0.5\n----\n\nWe tried so hard, and got so far, but in the end, we need a disassembler! x86\nmitigations have defeated us, we no longer have syscall tables to rely on.\nKernel developers were kind enough to write very simple ABI-specific\nswitch-based handlers to dispach syscalls, so analysis is still possible... just\nsignificantly more complicated.\n\n**Breaking changes**:\n\n- Drop support for Python 3.6 and 3.7. Systrack now requires Python 3.8+. This\n  is because of the new dependency on\n  [`iced-x86`](https://pypi.org/project/iced-x86/).\n\n**Improvements**:\n\n- x86: support new kernels (6.9+) with no syscall tables.\n- Remove unnecessary spaces between asterisks for double pointers in function\n  signatures.\n- Avoid KFCI `__{cfi,pfx}_` symbols when looking for `ni_syscall` symbols.\n\n**Internal changes**:\n\n- Depend on [`iced-x86`](https://pypi.org/project/iced-x86/) for disassembling\n  x86 instructions and on [`jinja2`](https://pypi.org/project/jinja2/) for HTML\n  output directly. Remove optional dependencies and only build one package.\n- Rename `test` folder to `tests` to use the `hatch test` as test commnad\n- Improve logging reproducibility by sorting more debugging log output.\n- Improve broken Python package metadata (Python packaging moment).\n\n\nv0.4\n----\n\nNew arch support: PowerPC 32-bit, tested on v5.0+ kernels.\n\n**Improvements**:\n\n- Improve kconfig dependency checking logic for better warning/error messages.\n- PowerPC PPC64: improve esoteric fast switch_endian syscall detection.\n- Better (narrower) emoji spacing in HTML output.\n\n**Bug fixes**:\n\n- Correctly report `delete_module` depending on `CONFIG_MODULE_UNLOAD=y`.\n- Fix incorrectly handled shared syscall table in x86-64 x32 ABI resulting in\n  duplicated and unwanted entries in the output for kernels older than v5.4.\n- Fix chance of building kernels without `memfd_create`, `memfd_secret`,\n  `delete_module` (and possibly others) by always enabling `MEMFD_CREATE`,\n  `MODULE_UNLOAD`, `NET` and `SECRETMEM` when available.\n- Fix wrong handling of relative `--kdir` path (e.g., `.`) in some cases.\n- Fix missed detection of non-implemented syscalls pointing to `kernel/sys_ni.c`\n  when DWARF debug info contains relative paths.\n- x86 x32: fix some x64 syscalls reported twice because both the x64 number and\n  the historycally misnumbered x32 numbers (512-547) were being considered\n  valid.\n\n**Internal changes**:\n\n- Ignore `sound/` and `user/` dirs to speed up grepping syscall definitions.\n- Implement some basic unit tests for powerpc dummy/esoteric syscall detection.\n\n\nv0.3.3\n------\n\n**Improvements**:\n\n- Correctly report `lsm_{list_modules,get_self_attr,set_self_attr}` depending on\n  `CONFIG_SECURITY=y`.\n\n\nv0.3.2\n------\n\n**Improvements**:\n\n- Correctly report `futex_{wait,wake,requeue}` depending on `CONFIG_FUTEX=y`.\n- Use unicorn emoji (cuter) instead of test tube for esoteric syscalls in HTML\n  output.\n\n\nv0.3.1\n------\n\n**Improvements**:\n\n- x86: Add build support for `map_shadow_stack`.\n- Prefer `compat_sys_` over `__se_compat_sys_` and other longer symbol synonyms;\n  same for `.compat_sys_` on PowerPC.\n\n**Bug fixes**:\n\n- Fix broken naive grepping of syscall definitions when no ripgrep is available.\n- Correctly report `cachestat` depending on `CACHESTAT_SYSCALL=y`.\n\n**Internal changes**:\n\n- Sort stderr logs for reproducible output and easier diffing.\n- Skip `lib/` directory in kernel sources to improve grepping performance.\n\n\nv0.3\n----\n\nNew arch support: PowerPC 64-bit, all ABIs, tested on v5.0+ kernels.\n\n**Improvements:**\n\n- Add ABI `bits` (integer) and `compat` (boolean) fields to JSON output.\n- Support ELF symbols with weird names (special chars in the name).\n- Support function descriptors for syscall table entries (useful for PowerPC64\n  and Itanium 64).\n- Support weird arch-specific `SYSCALL_DEFINEn` macros.\n- Building kernels now generates relative paths in DWARF debug symbols through\n  `-fdebug-prefix-map`.\n- Improve stdout output and add a table header.\n- Use `null` instead of `??`/`?` for unknown file/line info in JSON output.\n- x86: improve dummy syscall implementation detection (handling endbr64/32\n  instructions).\n- ARM OABI: output syscall number location for the calling convention\n  (`swi <NR>`).\n\n**Bug fixes**:\n\n- Correctly report `socketcall` depending on `CONFIG_NET=y`.\n- Correctly strip more syscall symbol prefixes for more accurate syscall names.\n- Fix bad symbol prefix detection in some weird edge cases, leading to wrong\n  syscall names.\n- x86: fix wrong register names for x86-64 compat 32-bit ABI (IA-32).\n\n**Internal changes**:\n\n- Reorganize arch-specific code.\n- Handle SIGINT for more graceful termination.\n- Auto-remap definition locations relative to KDIR for ease of use.\n\n\nv0.2.1\n------\n\n**Improvements**:\n\n- Make syscall symbol preference more consistent (in particular, stop mixing\n  `__se_sys_xxx` and `sys_xxx` when possible).\n- Achieve W3C compliance for HTML output format.\n\n**Bug fixes**:\n\n- x86: correct wrong syscall numbers for x32 ABI, they should all be ORed with\n  `0x40000000` (`__X32_SYSCALL_BIT`).\n\n\nv0.2\n----\n\n**Improvements**:\n\n- Improve existing MIPS build and analysis support: use `ip27_defconfig` for\n  64-bit for NUMA support and strip more symbol prefixes.\n- Improve dummy syscall implementation detection (x86-64, ARM).\n\n**Bug fixes**:\n\n- Fix help text for `--arch`: building with `--arch arm` creates an\n  EABI-only kernel.\n- Fix a logging bug that caused not loging syscalls' `.origname` for not-found\n  locations after grepping.\n- x86: use the right Kconfig option for vm86 and vm86old\n\n\nv0.1\n----\n\nFirst release.\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>."
  },
  {
    "path": "README.md",
    "content": "Systrack\n========\n\n[![License][license-badge]](./LICENSE)\n[![GitHub actions workflow status][actions-badge]][actions-link]\n[![PyPI version][pypi-badge]][pypi-systrack]\n[![PyPI downloads][pypi-badge2]][pypistats-systrack]\n\n<img align=\"left\" width=\"150\" height=\"150\" src=\"https://raw.githubusercontent.com/mebeim/systrack/master/assets/logo.png\" alt=\"Systrack logo\"></img>\n\n**See [mebeim/linux-syscalls](https://github.com/mebeim/linux-syscalls) for live syscall tables powered by Systrack**.\n\nSystrack is a tool to analyze Linux kernel images (`vmlinux`) and extract\ninformation about implemented syscalls. Given a `vmlinux` image, Systrack can\nextract syscall numbers, names, symbol names, definition locations within kernel\nsources, function signatures, and more.\n\nSystrack can configure and build kernels for all its\n[supported architectures](#supported-architectures-and-abis), and works best at\nanalyzing kernels that it has configured and built by itself.\n\n\nInstallation\n------------\n\nSystrack is [available on PyPI][pypi-systrack], it requires Python 3.8+ and is\ninstallable through Pip:\n\n```bash\npip install systrack\n```\n\nBuilding and installaing from source requires [`hatch`][pypi-hatch]:\n\n```bash\nhatch build\npip install dist/systrack-XXX.whl\n```\n\nUsage\n-----\n\nSystrack can mainly be used for two purposes: analyzing or building Linux\nkernels. See also [Command line help](#command-line-help) (`systrack --help`)\nand [Supported architectures and ABIs](#supported-architectures-and-abis)\n(`systrack --arch help`) below.\n\n- **Analyzing** a kernel image can be done given a `vmlinux` ELF with symbols,\n  and optionally also a kernel source directory (`--kdir`). Systrack will\n  extract information about implemented syscalls from the symbol table present\n  in the given `vmlinux` ELF, and if debugging information is present, it will\n  also extract file and line number information for syscall definitions.\n  Supplying a `--kdir` pointing Systrack to the checked-out sources for the\n  right kernel version (the same as the one to analyze) will help refine and/or\n  correct the location of the definitions.\n\n  Systrack can guess the architecture and ABI to analyze, but if the given\n  kernel was built with support for multiple ABIs, the right one can be selected\n  through `--arch`.\n\n  ```none\n  systrack path/to/vmlinux\n  systrack --format json path/to/vmlinux\n  systrack --format html path/to/vmlinux\n  systrack --kdir path/to/linux_git_repo path/to/vmlinux\n  systrack --kdir path/to/linux_git_repo --arch x86-64-ia32 path/to/vmlinux\n  ```\n\n- **Building** can be done through the `--build` option. You will need to\n  provide a kernel source directory (`--kdir`) and an architecture/ABI\n  combination to build for (`--arch`).\n\n  ```none\n  systrack --build --kdir path/to/linux_source_dir --arch x86-64\n  ```\n\n  When building, kernel sources are configured to enable all syscalls available\n  for the selected architecture/ABI as to produce a `vmlinux` with a \"complete\"\n  syscall table.\n\n  Cross-compilation with GCC is possible specifying the correct toolchain prefix\n  with the `--cross` option, which will set the `CROSS_COMPILE` variable for the\n  kernel's `Makefile`. Other environment variables can also be used as usual and\n  are passed as is to `make`, so LLVM [cross]-compilation and custom toolchain\n  usage is also possible.\n\n  ```none\n  systrack --build --kdir path/to/linux_source --arch arm64 --cross aarch64-linux-gnu-\n  ```\n\n\nSupported architectures and ABIs\n--------------------------------\n\nHere's a list of supported arch/ABI combinations accepted via `--arch` (values\nare case-insensitive). This information is also available running\n`systrack --arch help`.\n\n| Value           | Aliases            | Arch    | Kernel | Syscall ABI    | Build based on                | Notes   |\n|:----------------|:-------------------|:--------|:-------|:---------------|:------------------------------|:--------|\n| `arm`           | `arm-eabi`, `eabi` | ARM     | 32-bit | 32-bit EABI    | `multi_v7_defconfig`          | *[2]*   |\n| `arm-oabi`      | `oabi`             | ARM     | 32-bit | 32-bit OABI    | `multi_v7_defconfig`          | *[2,4]* |\n| `arm64`         | `aarch64`          | ARM     | 64-bit | 64-bit AArch64 | `defconfig`                   |         |\n| `arm64-aarch32` | `aarch32`          | ARM     | 64-bit | 32-bit AArch32 | `defconfig`                   | *[1]*   |\n| `mips`          | `mips32`, `o32`    | MIPS    | 32-bit | 32-bit O32     | `defconfig`                   |         |\n| `mips64`        | `n64`              | MIPS    | 64-bit | 64-bit N64     | `ip27_defconfig`              | *[1]*   |\n| `mips64-n32`    | `n32`              | MIPS    | 64-bit | 64-bit N32     | `ip27_defconfig`              | *[1]*   |\n| `mips64-o32`    | `o32-64`           | MIPS    | 64-bit | 32-bit O32     | `ip27_defconfig`              | *[1]*   |\n| `powerpc`       | `ppc`, `ppc32`     | PowerPC | 32-bit | 32-bit PPC32   | `ppc64_defconfig`             |         |\n| `powerpc64`     | `ppc64`            | PowerPC | 64-bit | 64-bit PPC64   | `ppc64_defconfig`             | *[1]*   |\n| `powerpc64-32`  | `ppc64-32`         | PowerPC | 64-bit | 32-bit PPC32   | `ppc64_defconfig`             | *[1]*   |\n| `powerpc64-spu` | `ppc64-spu`, `spu` | PowerPC | 64-bit | 64-bit \"SPU\"   | `ppc64_defconfig`             | *[1,5]* |\n| `riscv`         | `riscv32`, `rv32`  | RISC-V  | 32-bit | 32-bit \"RV32\"  | `defconfig` + `32-bit.config` | *[3,6]* |\n| `riscv64`       | `rv64`             | RISC-V  | 64-bit | 64-bit \"RV64\"  | `defconfig`                   | *[1,6]* |\n| `riscv64-32`    | `rv64-32`          | RISC-V  | 64-bit | 32-bit \"RV32\"  | `defconfig`                   | *[1,6]* |\n| `s390x`         |                    | IBM Z   | 64-bit | 64-bit s390x   | `defconfig`                   | *[1]*   |\n| `s390`          |                    | IBM Z   | 64-bit | 32-bit s390    | `defconfig`                   | *[1]*   |\n| `x86`           | `i386`, `ia32`     | x86     | 32-bit | 32-bit IA32    | `i386_defconfig`              |         |\n| `x86-64`        | `x64`              | x86     | 64-bit | 64-bit x86-64  | `x86_64_defconfig`            | *[1]*   |\n| `x86-64-x32`    | `x32`              | x86     | 64-bit | 64-bit x32     | `x86_64_defconfig`            | *[1]*   |\n| `x86-64-ia32`   | `ia32-64`          | x86     | 64-bit | 32-bit IA32    | `x86_64_defconfig`            | *[1]*   |\n\nNotes:\n\n1. Building creates a kernel supporting all ABIs for this architecture.\n2. Build based on `defconfig` for Linux <= v3.7.\n3. Build based on `rv32_defconfig` for Linux <= v6.7 and `defconfig` for\n   Linux <= v5.0.\n4. Building creates an EABI kernel with compat OABI support. Building an\n   OABI-only kernel is NOT supported. The seccomp filter system will be missing.\n5. \"SPU\" is not a real ABI. It indicates a Cell processor SPU (Synergistic\n   Processing Unit). The ABI is really PPC64, but SPUs can only use a subset of\n   syscalls.\n6. \"RV32\" and \"RV64\" are not real ABIs, but rather ISAs. The RISC-V syscall\n   ABI is the same for 32-bit and 64-bit (only register size differs). These\n   names are only used for clarity.\n\nRuntime dependencies\n--------------------\n\nExternal (non-Python) runtime dependencies are:\n\n- **Required**: `readelf` (from GNU binutils) is used to parse and extract ELF\n  metadata such as symbols and sections. This is currently the only *compulsory*\n  external dependency of Systrack.\n- Optional: `addr2line` (from GNU binutils) is used to extract location\n  information from DWARF debug info. Without this program, Systrack will not\n  output any information about syscall definition locations.\n- Optional: `rg` ([ripgrep][ripgrep]) is used for much faster recursive\n  grepping of syscall definition locations within kernel sources when needed.\n  Otherwise, a slower pure-Python implementation is used.\n- Optional: a working compiler toolchain and\n  [kernel build dependencies](https://www.kernel.org/doc/html/latest/process/changes.html)\n  are obviously needed if you want Systrack to *build* kernels from source.\n\n\nLimitations\n-----------\n\n- Supported kernel images: Systrack works with regular *uncompressed* `vmlinux`\n  ELF images and *needs* ELF symbols. Compressed and stripped kernel images are\n  not supported. Tools such as\n  [`vmlinux-to-elf`](https://github.com/marin-m/vmlinux-to-elf) can be used to\n  uncompress and unstrip kernel images, after which Systrack will be able to\n  analyze them.\n- Old kernel versions: Systrack was mainly designed for and tested on modern\n  kernels (>= v4.0) and has not been tested on older kernels. It should still\n  *somewhat* work on older kernels, but without the same level of guarantee on\n  the correctness of the output. Support for old kernels may come gradually in\n  the future.\n- Relocatable kernels: Systrack does not currently parse and apply ELF\n  relocations. This means that Systrack does not support kernels using\n  relocation entries for the syscall table. On some architectures (notably MIPS)\n  if the kernel is relocatable the syscall table is relocated at startup and\n  does not contain valid virtual addresses: Systrack will currently fail to\n  analyze such kernels.\n- Building kernels: when building kernels fot you, Systrack does not aim at\n  building usable or sane kernel images. In fact, a lot of unneeded features are\n  disabled at build time (e.g., USB support). The goal is only to correctly\n  include all syscalls in the syscall table for later extraction.\n  *Do not run kernels built with Systrack.*\n\n\nCommand line help\n-----------------\n\n```none\n$ systrack --help\n\nusage: systrack [OPTIONS...] [VMLINUX]\n\nAnalyze a Linux kernel image and extract information about implemented syscalls\n\npositional arguments:\n  VMLINUX               path to vmlinux, if not inside KDIR or no KDIR supplied\n\noptions:\n  -h, --help            show this help message and exit\n  -k KDIR, --kdir KDIR  kernel source directory\n  -a ARCH, --arch ARCH  kernel architecture/ABI combination; pass \"help\" for a list\n                        (default: autodetect)\n  -b, --build           configure and build kernel and exit\n  -c, --config          configure kernel and exit\n  -C, --clean           clean kernel sources (make distclean) and exit\n  -x PREFIX, --cross PREFIX\n                        toolchain prefix for cross-compilation; use with -b/-c/-C\n  -o OUTDIR, --out OUTDIR\n                        output directory for out-of-tree kernel build (make O=...); only\n                        meaningful with -b/-c/-C\n  -f FMT, --format FMT  output format: text, json or html (default: text)\n  --absolute-paths      output absolute paths instead of paths relative to KDIR\n  --remap ORIG_KDIR     replace ORIG_KDIR with the KDIR provided with -k/--kdir for paths\n                        obtained from ELF debug information; needed if the kernel was\n                        built with ORIG_KDIR as source directory instead of KDIR, and\n                        debug info contains absolute paths to ORIG_KDIR\n  --checkout REF        git checkout to REF inside KDIR before doing anything; the\n                        special value \"auto\" can be used to checkout to the tag\n                        corresponding to the detected kernel version from VMLINUX\n  --disable-opt         try building kernel with reduced/disabled optimizations for more\n                        reliable location results; only meaningful with -b\n  -q, --quiet           quietness level:\n                          -q = no info, -qq = no warnings, -qqq = no errors\n                          -qqqq = no standard error output whatsoever\n  -v, --verbose         verbosity level:\n                          -v = info, -vv = debug, -vvv = more debug\n  -V, --version         show version information and exit\n```\n\n---\n\n*Copyright &copy; 2023-2025 Marco Bonelli. Licensed under the GNU General Public License v3.0.*\n\n[license-badge]:      https://img.shields.io/github/license/mebeim/systrack?color=blue\n[actions-badge]:      https://img.shields.io/github/actions/workflow/status/mebeim/systrack/publish.yml?event=release&label=publish\n[actions-link]:       https://github.com/mebeim/systrack/actions/workflows/publish.yml\n[pypi-badge]:         https://img.shields.io/pypi/v/systrack\n[pypi-badge2]:        https://img.shields.io/pypi/dm/systrack\n[pypi-systrack]:      https://pypi.org/project/systrack/\n[pypistats-systrack]: https://pypistats.org/packages/systrack\n[pypi-hatch]:         https://pypi.org/project/hatch\n[ripgrep]:            https://github.com/BurntSushi/ripgrep\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[project]\nname = 'systrack'\ndescription = 'Linux kernel syscall implementation tracker'\nauthors = [{name = 'Marco Bonelli'}, {name = 'Marco Bonelli', email = 'marco@mebeim.net'}]\nmaintainers = [{name = 'Marco Bonelli'}, {name = 'Marco Bonelli', email = 'marco@mebeim.net'}]\nlicense = {text = 'GNU General Public License v3 (GPLv3)'}\nreadme = 'README.md'\nplatforms = 'any'\nrequires-python = '>=3.8'\ndynamic = ['version']\nkeywords = ['systrack', 'linux', 'kernel', 'syscall', 'kconfig', 'elf', 'abi']\nclassifiers = [\n\t'Development Status :: 4 - Beta',\n\t'Environment :: Console',\n\t'Intended Audience :: Developers',\n\t'Intended Audience :: Science/Research',\n\t'Intended Audience :: System Administrators',\n\t'License :: OSI Approved :: GNU General Public License v3 (GPLv3)',\n\t'Natural Language :: English',\n\t'Operating System :: OS Independent',\n\t'Programming Language :: Python :: 3',\n\t'Topic :: Security',\n\t'Topic :: Software Development :: Embedded Systems',\n\t'Topic :: Software Development :: Testing',\n\t'Topic :: System :: Operating System Kernels :: Linux',\n\t'Topic :: Utilities',\n]\ndependencies = [\n\t'iced-x86~=1.21.0',\n\t'jinja2~=3.1.2'\n]\n\n[project.urls]\nHomepage = 'https://github.com/mebeim/systrack'\nRepository = 'https://github.com/mebeim/systrack.git'\nChangelog = 'https://github.com/mebeim/systrack/blob/master/CHANGELOG.md'\n\n[project.scripts]\nsystrack = 'systrack.__main__:main'\n\n[build-system]\nrequires = ['hatchling']\nbuild-backend = 'hatchling.build'\n\n[tool.hatch.version]\npath = 'src/systrack/version.py'\n\n[tool.hatch.build]\nignore-vcs = true\ninclude = ['src/systrack/templates/*']\n\n[tool.hatch.build.targets.wheel]\npackages = ['src/systrack']\n\n[tool.hatch.build.targets.sdist]\ninclude = ['src', 'CHANGELOG.md']\n\n[tool.hatch.envs.default]\npython = '3'\n\n[tool.hatch.envs.test]\ndependencies = ['pytest']\n\n[tool.ruff.lint]\n# Don't warn for multi-line statements\nignore = ['E701']\n\n[tool.ruff.lint.per-file-ignores]\n# Don't warn for star imports in these files\n'arch/__init__.py' = ['F403', 'F405']\n'tests/*' = ['F403', 'F405']\n"
  },
  {
    "path": "src/systrack/__init__.py",
    "content": ""
  },
  {
    "path": "src/systrack/__main__.py",
    "content": "import argparse\nimport logging\nimport os\nimport signal\nimport sys\n\nfrom pathlib import Path\nfrom textwrap import TextWrapper\n\nfrom .arch import SUPPORTED_ARCHS, SUPPORTED_ARCHS_HELP\nfrom .kernel import Kernel, KernelError, KernelArchError, KernelMultiABIError\nfrom .kernel import KernelVersionError, KernelWithoutSymbolsError\nfrom .log import log_setup, eprint\nfrom .output import output_syscalls\nfrom .utils import command_argv_to_string, command_available\nfrom .utils import gcc_version, git_checkout, maybe_rel, format_duration\nfrom .version import VERSION, VERSION_HELP\n\ndef sigint_handler(_, __):\n\tsys.stderr.write('Caught SIGINT, stopping\\n')\n\tsys.exit(1)\n\ndef wrap_help(body: str) -> str:\n\t'''Wrap a string to 65 columns without breaking words for a nice --help\n\toutput of the tool.\n\t'''\n\ttx = TextWrapper(65, break_long_words=False, replace_whitespace=False)\n\treturn '\\n'.join(tx.fill(line) for line in body.splitlines() if line.strip())\n\ndef parse_args() -> argparse.Namespace:\n\t'''Parse and partially validate command line arguments through argparse.\n\t'''\n\tap = argparse.ArgumentParser(\n\t\tprog='systrack',\n\t\tusage='systrack [OPTIONS...] [VMLINUX]',\n\t\tdescription='Analyze a Linux kernel image and extract information about implemented syscalls',\n\t\tformatter_class=argparse.RawTextHelpFormatter\n\t)\n\n\tap.add_argument('vmlinux', metavar='VMLINUX', nargs='?',\n\t\thelp=wrap_help('path to vmlinux, if not inside KDIR or no KDIR supplied'))\n\tap.add_argument('-k', '--kdir', metavar='KDIR',\n\t\thelp=wrap_help('kernel source directory'))\n\tap.add_argument('-a', '--arch', metavar='ARCH',\n\t\thelp=wrap_help('kernel architecture/ABI combination; pass \"help\" for a '\n\t\t\t'list (default: autodetect)'))\n\tap.add_argument('-b', '--build', action='store_true',\n\t\thelp=wrap_help('configure and build kernel and exit'))\n\tap.add_argument('-c', '--config', action='store_true',\n\t\thelp=wrap_help('configure kernel and exit'))\n\tap.add_argument('-C', '--clean', action='store_true',\n\t\thelp=wrap_help('clean kernel sources (make distclean) and exit'))\n\tap.add_argument('-x', '--cross', metavar='PREFIX',\n\t\thelp=wrap_help('toolchain prefix for cross-compilation; use with -b/-c/-C'))\n\tap.add_argument('-o', '--out', metavar='OUTDIR',\n\t\thelp=wrap_help('output directory for out-of-tree kernel build (make '\n\t\t\t'O=...); only meaningful with -b/-c/-C'))\n\tap.add_argument('-f', '--format', metavar='FMT',\n\t\tchoices=('text', 'json', 'html'), default='text',\n\t\thelp=wrap_help('output format: text, json or html (default: text)'))\n\tap.add_argument('--absolute-paths', action='store_true',\n\t\thelp=wrap_help('output absolute paths instead of paths relative to KDIR'))\n\tap.add_argument('--remap', metavar='ORIG_KDIR',\n\t\thelp=wrap_help('replace ORIG_KDIR with the KDIR provided with '\n\t\t\t'-k/--kdir for paths obtained from ELF debug information; needed '\n\t\t\t'if the kernel was built with ORIG_KDIR as source directory '\n\t\t\t'instead of KDIR, and debug info contains absolute paths to '\n\t\t\t'ORIG_KDIR'))\n\tap.add_argument('--checkout', metavar='REF',\n\t\thelp=wrap_help('git checkout to REF inside KDIR before doing anything; '\n\t\t\t'the special value \"auto\" can be used to checkout to the tag '\n\t\t\t'corresponding to the detected kernel version from VMLINUX'))\n\tap.add_argument('--disable-opt', action='store_true',\n\t\thelp=wrap_help('try building kernel with reduced/disabled '\n\t\t'optimizations for more reliable location results; only meaningful '\n\t\t'with -b'))\n\tap.add_argument('-q', '--quiet', action='count', default=0,\n\t\thelp=wrap_help('quietness level:\\n'\n\t\t'  -q: no info; -qq: no warnings; -qqq: no errors;\\n'\n\t\t'  -qqqq: no standard error output whatsoever'))\n\tap.add_argument('-v', '--verbose', action='count', default=0,\n\t\thelp=wrap_help('verbosity level:\\n'\n\t\t\t'  -v: info; -vv: debug; -vvv: more debug;\\n'\n\t\t\t'  -vvvv: also pass V=1 to make when building'))\n\tap.add_argument('-V', '--version', action='version', version=VERSION_HELP,\n\t\thelp=wrap_help('show version information and exit'))\n\n\treturn ap.parse_args()\n\ndef instantiate_kernel(*a, **kwa) -> Kernel:\n\t'''Instantiate the Kernel class with the given parameters, handling and\n\tprinting possible errors.\n\t'''\n\ttry:\n\t\treturn Kernel(*a, **kwa)\n\texcept KernelArchError as e:\n\t\teprint(str(e))\n\t\tsys.exit(f\"See '{sys.argv[0]} --arch help' for more information\")\n\texcept KernelMultiABIError as e:\n\t\tarch_class, abis = e.args[1:]\n\t\tsys.exit(\n\t\t\tf'Detected architecture: {arch_class.name}\\n'\n\t\t\tf'Detected ABIs: {\", \".join(abis)}\\n'\n\t\t\t'This kernel was built with support for multiple syscall ABIs.\\n'\n\t\t\t'Select one using --arch NAME (see --arch HELP for more info).'\n\t\t)\n\texcept KernelVersionError:\n\t\tsys.exit(\n\t\t\t'Unable to determine kernel version!\\n',\n\t\t\t'Did you specify a valid kernel source directory (--kdir) or vmlinux path?'\n\t\t)\n\texcept KernelWithoutSymbolsError:\n\t\tsys.exit(\n\t\t\t'The provided kernel image has no symbols, which are necessary for Systrack to work.\\n',\n\t\t\t'You can try unstripping the image with tools such as \"vmlinux-to-elf\".'\n\t\t)\n\texcept KernelError as e:\n\t\teprint(str(e))\n\t\tsys.exit(1)\n\ndef main() -> int:\n\tsignal.signal(signal.SIGINT, sigint_handler)\n\n\targs = parse_args()\n\tlog_setup(args.quiet, args.verbose, os.isatty(sys.stderr.fileno()))\n\n\tlogging.debug('Systrack v%s', VERSION)\n\tlogging.debug('Command line: systrack %s', command_argv_to_string(sys.argv[1:]))\n\n\tarch_name = args.arch\n\n\tif arch_name is not None:\n\t\tarch_name = arch_name.lower()\n\n\t\tif arch_name not in SUPPORTED_ARCHS:\n\t\t\tif arch_name not in ('help', '?'):\n\t\t\t\teprint(f'Unsupported architecture/ABI combination: {arch_name}')\n\t\t\t\teprint('See --arch HELP for a list')\n\t\t\t\treturn 1\n\n\t\t\teprint(SUPPORTED_ARCHS_HELP)\n\t\t\treturn 0\n\n\tif not args.kdir and not args.vmlinux:\n\t\teprint('Need to specify a kernel source direcory and/or path to vmlinux')\n\t\teprint('See --help for more information')\n\t\treturn 1\n\n\tif not args.kdir and (args.checkout or args.config or args.build):\n\t\teprint('Need to specify a kernel source direcory (--kdir)')\n\t\treturn 1\n\n\tif not arch_name and (args.config or args.build):\n\t\teprint('Need to specify an architecture/ABI combination (--arch)')\n\t\teprint('See --arch HELP for a list')\n\t\treturn 1\n\n\tcross   = args.cross or ''\n\tvmlinux = Path(args.vmlinux) if args.vmlinux else None\n\tkdir    = Path(args.kdir)    if args.kdir    else None\n\toutdir  = Path(args.out)     if args.out     else None\n\trdir    = Path(args.remap)   if args.remap   else None\n\n\t# Checkout before building only if not set to auto\n\tif args.checkout and args.checkout != 'auto':\n\t\teprint('Checking out to', args.checkout)\n\t\tgit_checkout(kdir, args.checkout)\n\n\tif args.clean or args.config or args.build:\n\t\tif args.out:\n\t\t\tout = Path(args.out)\n\n\t\t\ttry:\n\t\t\t\tif out.exists() and not out.is_dir():\n\t\t\t\t\teprint(f'Output directory \"{args.out}\" already exists and is not a directory')\n\t\t\t\t\treturn 1\n\n\t\t\t\tout.mkdir(exist_ok=True)\n\t\t\texcept Exception as e:\n\t\t\t\teprint(f'Failed to create output directory \"{args.out}\": {str(e)}')\n\t\t\t\treturn 1\n\n\t\t# Check that GCC is available and log its version for our own sanity to\n\t\t# avoid mixing up toolchains\n\t\tgcc_cmd = cross + 'gcc'\n\n\t\tif not command_available(gcc_cmd):\n\t\t\teprint(f'Command \"{gcc_cmd}\" not found')\n\t\t\teprint('Make sure your cross-compilation toolchain is in $PATH')\n\t\t\treturn 127\n\n\t\tif args.config or args.build:\n\t\t\teprint('Compiler:', gcc_version(gcc_cmd))\n\n\t\tkernel = instantiate_kernel(arch_name, kdir=kdir, outdir=outdir, toolchain_prefix=cross)\n\n\t\tif args.build:\n\t\t\teprint('Cleaning kernel sources')\n\t\t\tkernel.clean()\n\t\t\teprint('Detected kernel version:', kernel.version_str)\n\t\t\teprint('Configuring kernel')\n\t\t\tkernel.configure()\n\t\t\teprint('Building kernel (might take a while)')\n\t\t\telapsed = kernel.build(args.disable_opt)\n\t\t\teprint('Build took', format_duration(elapsed))\n\t\telif args.config:\n\t\t\teprint('Cleaning kernel sources')\n\t\t\tkernel.clean()\n\t\t\teprint('Detected kernel version:', kernel.version_str)\n\t\t\teprint('Configuring kernel')\n\t\t\tkernel.configure()\n\t\t\teprint('Done')\n\t\telif args.clean:\n\t\t\teprint('Cleaning kernel sources')\n\t\t\tkernel.clean()\n\t\t\teprint('Done')\n\n\t\treturn 0\n\n\t# Auto-checkout to the correct tag is only possible if we already have a\n\t# vmlinux to extract the version from\n\tif args.checkout == 'auto' and not vmlinux:\n\t\teprint('Cannot perform auto-checkout without a vmlinux image!')\n\t\treturn 1\n\n\tif not vmlinux:\n\t\tvmlinux = kdir / 'vmlinux'\n\n\tif not vmlinux.is_file():\n\t\teprint(f'Unable to find vmlinux at \"{vmlinux}\".')\n\t\teprint('Build the kernel or provide a valid path.')\n\t\treturn 1\n\n\tif not command_available('readelf'):\n\t\teprint('Command \"readelf\" unavailable, can\\'t do much without it!')\n\t\treturn 127\n\n\tkernel = instantiate_kernel(arch_name, vmlinux, kdir, outdir, rdir)\n\teprint('Detected kernel version:', kernel.version_str)\n\n\tif args.checkout == 'auto':\n\t\tassert kernel.version_source == 'vmlinux'\n\t\teprint('Checking out to', kernel.version_tag)\n\t\tgit_checkout(kdir, kernel.version_tag)\n\n\tif not kernel.syscalls:\n\t\treturn 1\n\n\t# Apply a couple of transformations that are independent of the chosen\n\t# output format, and also check how many syscalls do not have location or\n\t# signature information.\n\n\tsyscalls  = kernel.syscalls\n\tkdir      = kernel.kdir\n\tabs_paths = args.absolute_paths\n\tn_no_loc  = 0\n\tn_no_sig  = 0\n\tn_grepped = 0\n\n\tfor sc in kernel.syscalls:\n\t\tif sc.file is None:\n\t\t\tn_no_loc += 1\n\t\telse:\n\t\t\tif kdir and not abs_paths:\n\t\t\t\tsc.file = maybe_rel(sc.file, kdir)\n\n\t\tif kdir and sc.signature is None:\n\t\t\tn_no_sig += 1\n\n\t\tif sc.grepped_location:\n\t\t\tn_grepped += 1\n\n\teprint('Found', len(syscalls), 'implemented syscalls')\n\n\tif n_grepped:\n\t\teprint('Found', n_grepped, 'definition location' + ('s' if n_grepped > 1 else ''), 'through grepping')\n\tif n_no_loc:\n\t\teprint('Could not find definition location for', n_no_loc, 'syscall' + ('s' if n_no_loc > 1 else ''))\n\tif n_no_sig:\n\t\teprint('Could not extract signature for', n_no_sig, 'syscall' + ('s' if n_no_sig > 1 else ''))\n\n\teprint()\n\toutput_syscalls(kernel, args.format)\n\treturn 0\n\n# NOTE: this is NOT executed in a normal install, because the `systrack` command\n# will point to a script that imports and directly calls the main() function\n# above.\nif __name__ == '__main__':\n\tsys.exit(main())\n"
  },
  {
    "path": "src/systrack/arch/__init__.py",
    "content": "import logging\nfrom typing import Optional, Type, Tuple, List\n\nfrom ..elf import ELF\nfrom ..type_hints import KernelVersion\n\nfrom .arch_base import Arch\nfrom .arm import ArchArm\nfrom .arm64 import ArchArm64\nfrom .mips import ArchMips\nfrom .powerpc import ArchPowerPC\nfrom .riscv import ArchRiscV\nfrom .s390 import ArchS390\nfrom .x86 import ArchX86\n\nARCH_CLASSES = (\n\tArchArm,\n\tArchArm64,\n\tArchMips,\n\tArchPowerPC,\n\tArchRiscV,\n\tArchS390,\n\tArchX86,\n)\n\n# NOTE: For the sake of mental sanity, try keeping abi= the same name as the one\n# in the *.tbl files in the kernel sources.\nSUPPORTED_ARCHS = {\n\t'x86'          : lambda v: ArchX86(v, abi='ia32', bits32=True), # \"i386\" ABI\n\t'x86-64'       : lambda v: ArchX86(v, abi='x64'),               # \"64\" ABI\n\t'x86-64-x32'   : lambda v: ArchX86(v, abi='x32'),\n\t'x86-64-ia32'  : lambda v: ArchX86(v, abi='ia32'),\n\t'arm'          : lambda v: ArchArm(v, abi='eabi'),\n\t'arm-oabi'     : lambda v: ArchArm(v, abi='oabi'),\n\t'arm64'        : lambda v: ArchArm64(v, abi='aarch64'),\n\t'arm64-aarch32': lambda v: ArchArm64(v, abi='aarch32'),\n\t'mips'         : lambda v: ArchMips(v, abi='o32', bits32=True),\n\t'mips64'       : lambda v: ArchMips(v, abi='n64'),\n\t'mips64-n32'   : lambda v: ArchMips(v, abi='n32'),\n\t'mips64-o32'   : lambda v: ArchMips(v, abi='o32'),\n\t'powerpc'      : lambda v: ArchPowerPC(v, abi='ppc32', bits32=True), # \"32\" ABI\n\t'powerpc64'    : lambda v: ArchPowerPC(v, abi='ppc64'),              # \"64\" ABI\n\t'powerpc64-32' : lambda v: ArchPowerPC(v, abi='ppc32'),              # \"32\" ABI\n\t'powerpc64-spu': lambda v: ArchPowerPC(v, abi='spu'),\n\t'riscv'        : lambda v: ArchRiscV(v, abi='rv32', bits32=True),\n\t'riscv64'      : lambda v: ArchRiscV(v, abi='rv64'),\n\t'riscv64-32'   : lambda v: ArchRiscV(v, abi='rv32'),\n\t's390x'        : lambda v: ArchS390(v, abi='s390x'),\n\t's390'         : lambda v: ArchS390(v, abi='s390'),\n}\n\nARCH_ALIASES = (\n\t# name            alias\n\t('x86'          , 'i386'      ),\n\t('x86'          , 'ia32'      ),\n\t('x86-64'       , 'x64'       ),\n\t('x86-64-x32'   , 'x32'       ),\n\t('x86-64-ia32'  , 'ia32-64'   ),\n\t('arm'          , 'arm-eabi'  ),\n\t('arm'          , 'eabi'      ),\n\t('arm-oabi'     , 'oabi'      ),\n\t('arm64'        , 'aarch64'   ),\n\t('arm64-aarch32', 'aarch32'   ),\n\t('mips'         , 'mips32'    ),\n\t('mips'         , 'o32'       ),\n\t('mips64'       , 'n64'       ),\n\t('mips64-n32'   , 'n32'       ),\n\t('mips64-o32'   , 'o32-64'    ),\n\t('powerpc'      , 'ppc'       ),\n\t('powerpc'      , 'ppc32'     ),\n\t('powerpc64'    , 'ppc64'     ),\n\t('powerpc64-32' , 'ppc64-32'  ),\n\t('powerpc64-spu', 'ppc64-spu' ),\n\t('powerpc64-spu', 'spu'       ),\n\t('riscv'        , 'riscv32'   ),\n\t('riscv'        , 'rv32'      ),\n\t('riscv64'      , 'rv64'      ),\n\t('riscv64-32'   , 'rv64-32'   ),\n)\n\nSUPPORTED_ARCHS.update({alias: SUPPORTED_ARCHS[arch] for arch, alias in ARCH_ALIASES})\n\nSUPPORTED_ARCHS_HELP = '''\\\nSupported architectures and ABIs (values are case-insensitive):\n\n    Value          Aliases         Arch     Kernel  Syscall ABI     Build based on             Notes\n    ------------------------------------------------------------------------------------------------\n    arm            arm-eabi, eabi  ARM      32-bit  32-bit EABI     multi_v7_defconfig         [2]\n    arm-oabi       oabi            ARM      32-bit  32-bit OABI     multi_v7_defconfig         [2,4]\n    ------------------------------------------------------------------------------------------------\n    arm64          aarch64         ARM      64-bit  64-bit AArch64  defconfig\n    arm64-aarch32  aarch32         ARM      64-bit  32-bit AArch32  defconfig                  [1]\n    ------------------------------------------------------------------------------------------------\n    mips           mips32, o32     MIPS     32-bit  32-bit O32      defconfig\n    mips64         n64             MIPS     64-bit  64-bit N64      ip27_defconfig             [1]\n    mips64-n32     n32             MIPS     64-bit  64-bit N32      ip27_defconfig             [1]\n    mips64-o32     o32-64          MIPS     64-bit  32-bit O32      ip27_defconfig             [1]\n    ------------------------------------------------------------------------------------------------\n    powerpc        ppc, ppc32      PowerPC  32-bit  32-bit PPC32    ppc64_defconfig\n    powerpc64      ppc64           PowerPC  64-bit  64-bit PPC64    ppc64_defconfig            [1]\n    powerpc64-32   ppc64-32        PowerPC  64-bit  32-bit PPC32    ppc64_defconfig            [1]\n    powerpc64-spu  ppc64-spu, spu  PowerPC  64-bit  64-bit \"SPU\"    ppc64_defconfig            [1,5]\n    ------------------------------------------------------------------------------------------------\n    riscv          riscv32, rv32   RISC-V   32-bit  32-bit \"RV32\"   defconfig + 32-bit.config  [3,6]\n    riscv64        rv64            RISC-V   64-bit  64-bit \"RV64\"   defconfig                  [1,6]\n    riscv64-32     rv64-32         RISC-V   64-bit  32-bit \"RV32\"   defconfig                  [1,6]\n    ------------------------------------------------------------------------------------------------\n    s390x                          IBM Z    64-bit  64-bit s390x    defconfig                  [1]\n    s390                           IBM Z    64-bit  32-bit s390     defconfig                  [1]\n    ------------------------------------------------------------------------------------------------\n    x86            i386, ia32      x86      32-bit  32-bit IA32     i386_defconfig\n    x86-64         x64             x86      64-bit  64-bit x86-64   x86_64_defconfig           [1]\n    x86-64-x32     x32             x86      64-bit  64-bit x32      x86_64_defconfig           [1]\n    x86-64-ia32    ia32-64         x86      64-bit  32-bit IA32     x86_64_defconfig           [1]\n\n    [1] Building creates a kernel supporting all ABIs for this architecture.\n    [2] Build based on \"defconfig\" for Linux <= v3.7.\n    [3] Build based on \"rv32_defconfig\" for Linux <= v6.7 and \"defconfig\" for Linux <= v5.0.\n    [4] Building creates an EABI kernel with compat OABI support. Building an OABI-only kernel is\n        NOT supported. The seccomp filter system will be missing.\n    [5] \"SPU\" is not a real ABI. It indicates a Cell processor SPU (Synergistic Processing Unit).\n        The ABI is really PPC64, but SPUs can only use a subset of syscalls.\n    [6] \"RV32\" and \"RV64\" are not real ABIs, but rather ISAs. The RISC-V syscall ABI is the same\n        for 32-bit and 64-bit (only register size differs). These names are only used for clarity.\n'''\n\ndef arch_from_name(name: str, kernel_version: KernelVersion) -> Arch:\n\t'''Instantiate and return the right Arch subclass given a human-friendly\n\tname (--arch). The name should be already validated.\n\t'''\n\treturn SUPPORTED_ARCHS[name](kernel_version)\n\ndef arch_from_vmlinux(vmlinux: ELF) -> Optional[Tuple[Type[Arch],bool,List[str]]]:\n\t'''Determine architecture and supported ABIs from vmlinux ELF. Returns the\n\tcorrect Arch subclass, the bitness and a list of detected ABIs.\n\t'''\n\tfor klass in ARCH_CLASSES:\n\t\tmatch = klass.match(vmlinux)\n\t\tif match:\n\t\t\treturn klass, *match\n\n\tlogging.fatal('Unknown or unsupported architecture: e_machine = %d, '\n\t\t'e_flags = 0x%x', vmlinux.e_machine, vmlinux.e_flags)\n\treturn None\n"
  },
  {
    "path": "src/systrack/arch/arch_base.py",
    "content": "import logging\n\nfrom abc import ABC, abstractmethod\nfrom typing import Tuple, List, Dict, Optional, final\n\nfrom ..elf import Symbol, ELF\nfrom ..syscall import Syscall\nfrom ..type_hints import KernelVersion, EsotericSyscall\nfrom ..utils import VersionedDict, anysuffix, noprefix, nosuffix\n\nclass Arch(ABC):\n\t# Directory name for this arch in the kernel source, under arch/\n\tname: Optional[str] = None\n\n\t# Whether this arch is 32-bits or not\n\tbits32: bool = False\n\n\t# Selected ABI to inspect/build for\n\tabi: Optional[str] = None\n\n\t# Whether the selected ABI is 32-bits or not\n\tabi_bits32: bool = False\n\n\t# Whether this architecture makes use of function descriptors for function\n\t# pointers or not\n\tuses_function_descriptors: bool = False\n\n\t# Are we looking for compat syscalls (COMPACT_SYSCALL_DEFINEn)? Or, in other\n\t# words, is this not the \"main\" ABI of the kernel we're analyzing?\n\tcompat: bool = False\n\n\t# Kernel version that we are intersted in analyzing\n\tkernel_version: Optional[KernelVersion] = None\n\n\t# Make targets to run (one by one in the specified order) to obtain the base\n\t# config to build the kernel with\n\tconfig_targets: Tuple[str,...] = ('defconfig',)\n\n\t# Name of the syscall table symbol to look for\n\tsyscall_table_name: Optional[str] = 'sys_call_table'\n\n\t# Base syscall number (actual syscall number is base + idx in syscall table)\n\t# NOTE: easiest way to check this is to just compile a binary that makes a\n\t# raw syscall for the right arch/ABI. The arch_syscall_addr() kernel\n\t# function can also be useful to inspect.\n\tsyscall_num_base: int = 0\n\n\t# Syscall number destination (register name, None if no register is used,\n\t# e.g. arm/OABI where the instruction is swi <nr>). Subclasses must override\n\t# this.\n\tsyscall_num_reg: Optional[str] = None\n\n\t# Registers for syscall arguments. Subclasses must override this.\n\tsyscall_arg_regs: Optional[Tuple[str, ...]] = None\n\n\t# Additional kconfig options to set\n\tkconfig: VersionedDict = VersionedDict()\n\n\t# Arch-specific syscall kconfig options dependency (supersedes global\n\t# arch-agnostic KCONFIG_SYSCALL_DEPS (see the comment in kconfig_options.py\n\t# to know how to fill this)\n\tkconfig_syscall_deps: VersionedDict = VersionedDict()\n\n\tdef __init__(self, kernel_version: KernelVersion, abi: str, bits32: bool):\n\t\tself.kernel_version = kernel_version\n\t\tself.bits32 = bits32\n\t\tself.abi = abi\n\n\tdef __repr__(s):\n\t\treturn (f'{s.__class__.__name__}(name={s.name!r}, '\n\t\t\tf'bits32={s.bits32}, abi={s.abi!r}, compat={s.compat!r}, ...)')\n\n\t@staticmethod\n\t@abstractmethod\n\tdef match(vmlinux: ELF) -> Optional[Tuple[bool,List[str]]]:\n\t\t'''Determine if the given vmlinux ELF was built for this architecture,\n\t\tand if so return the bitness as boolean (True if 32-bit) and a list of\n\t\tdetected ABIs. This is useful to determine which Arch subclass to\n\t\tinstantiate (if any).\n\t\t'''\n\t\tpass\n\n\t@abstractmethod\n\tdef matches(self, vmlinux: ELF) -> bool:\n\t\t'''Determine whether this architecture matches the one of the provided\n\t\tvmlinux (machine and bits). This is useful as a sanity check, e.g. if\n\t\ta subclass is instantiated and then we want to use it on an unknown\n\t\tvmlinux (or multiple ones).\n\t\t'''\n\t\tpass\n\n\tdef adjust_abi(self, vmlinux: ELF):\n\t\t'''Adjust internal ABI-specific attributes that can be ambiguous for a\n\t\tcertain ABI selection (e.g. syscall_table_name) to the correct value\n\t\tbased on the provided vmlinux.\n\t\t'''\n\t\tpass\n\n\tdef _preferred_symbol(self, a: Symbol, b: Symbol) -> Optional[Symbol]:\n\t\t'''Arch-specific choices for preferred_symbol(). Returns None if no\n\t\tpreference can be determined.'''\n\t\treturn None\n\n\t# NOTE: subclasses should only override _preferred_symbol() above\n\t@final\n\tdef preferred_symbol(self, a: Symbol, b: Symbol) -> Symbol:\n\t\t'''Decide which symbol should be preferred when multiple syscall symbols\n\t\tpoint to the same virtual address.\n\n\t\tThis does not have any meaningful effect on the correctness of the\n\t\toutput, since at the end of the day if multiple symbols point to the\n\t\tsame vaddr, they are in fact the same function, and the location\n\t\tinformation will also be correct regardless of which one is picked.\n\t\t'''\n\t\t# If only one symbol is compat, pick the most relevant one based on\n\t\t# self.compat\n\t\txa = 'compat' in a.name\n\t\txb = 'compat' in b.name\n\t\tif xa ^ xb:\n\t\t\tif self.compat:\n\t\t\t\treturn a if xa else b\n\t\t\treturn b if xa else a\n\n\t\t# Deprioritize symbols generated by interprocedural optimization\n\t\txa = '.localalias' in a.name\n\t\txb = '.localalias' in b.name\n\t\tif xa ^ xb:\n\t\t\treturn a if xb else b\n\n\t\t# Let subclasses have a say before falling back to generic criteria\n\t\tp = self._preferred_symbol(a, b)\n\t\tif p is not None:\n\t\t\treturn p\n\n\t\tif a.name.startswith('sys_'): return a\n\t\tif b.name.startswith('sys_'): return b\n\t\treturn a if a.name.startswith('compat_sys_') else b\n\n\tdef symbol_is_ni_syscall(self, sym: Symbol) -> bool:\n\t\t'''Determine whether the symbol name identifies the special\n\t\t\"not implemented\" syscall a.k.a. ni_syscall.\n\n\t\tThere can be multiple ni_syscall implementations with different\n\t\tprefixes and at different vaddrs (go figure). Make sure to get all of\n\t\tthem (readelf -s vmlinux | grep ni_syscall).\n\n\t\tFor example on x86 v5.0+:\n\n\t\t    sys_ni_syscall\n\t\t    __x64_sys_ni_syscall\n\t\t    __ia32_sys_ni_syscall\n\n\t\tBy default, also avoid ftrace-related _eil_addr_XXX symbols generated\n\t\twith CONFIG_FTRACE_SYSCALLS=y.\n\t\t'''\n\t\t# This generic approach should be good enough\n\t\treturn (\n\t\t\tsym.type == 'FUNC'\n\t\t\tand anysuffix(sym.name, 'sys_ni_syscall', 'compat_ni_syscall')\n\t\t\t# Avoid ftrace-related symbols\n\t\t\tand not sym.name.startswith('_eil_addr_')\n\t\t\t# Avoid KCFI-related symbols\n\t\t\tand not sym.name.startswith('__cfi_')\n\t\t\tand not sym.name.startswith('__pfx_')\n\t\t)\n\n\tdef skip_syscall(self, sc: Syscall) -> bool:\n\t\t'''Determine whether to skip this syscall.\n\n\t\tKernels compiled with support for multiple ABIs might share the same\n\t\tsyscall table between two or more ABIs, and in such case we want to\n\t\tfilter out syscalls that aren't for the ABI we are currently inspecting.\n\n\t\tE.G. on x86-64 the 64 and x32 ABI share the same syscall table\n\t\t(sys_call_table) before v5.4, which also holds some x32 compat syscalls\n\t\tthat are only available for applications using the x32 ABI.\n\t\t'''\n\t\treturn False\n\n\tdef _translate_syscall_symbol_name(self, sym_name: str) -> str:\n\t\t'''Arch-specific choices for translate_syscall_symbol_name().'''\n\t\treturn sym_name\n\n\t# NOTE: subclasses should only override _translate_syscall_symbol_name() above\n\t@final\n\tdef translate_syscall_symbol_name(self, sym_name: str) -> str:\n\t\t'''Translate symbol name into syscall name, potentially stripping or\n\t\treplacing arch-specific suffixes/prefixes from the symbol name, in order\n\t\tto be able to correctly identify a syscall. Overriding this shouldn't be\n\t\tneeded in most cases.\n\n\t\tThis default implementation just removes prefixes/suffixes that are not\n\t\tcommon enough to be indentified as common prefixes and stripped\n\t\tautomatically.\n\t\t'''\n\t\treturn noprefix(self._translate_syscall_symbol_name(sym_name),\n\t\t\t'ptregs_sys_', 'ptregs_compat_sys_', '__se_compat_sys_',\n\t\t\t'__se_sys_', '__sys_', 'compat_sys_')\n\n\tdef _normalize_syscall_name(self, name: str) -> str:\n\t\t'''Normalize a syscall name possibly stripping unneeded arch-specific\n\t\tprefixes/suffixes (e.g., \"ia32_\", \"aarch32_\", \"oabi_\", \"ppc_\" etc.).\n\t\tThese are prefixes/suffixes that are ACTUALLY PRESENT IN THE SOURCE,\n\t\tand not just in the symbol name.\n\t\t'''\n\t\treturn name\n\n\t# NOTE: subclasses should only override _normalize_syscall_name() above\n\t@final\n\tdef normalize_syscall_name(self, name: str) -> str:\n\t\t'''Normalize a syscall name removing unneeded prefixes and suffixes.\n\t\tThese are prefixes/suffixes that are ACTUALLY PRESENT IN THE SOURCE,\n\t\tand not just in the symbol name.\n\t\t'''\n\t\t# In theory we could also remove the trailing \"16\" from 16-bit UID\n\t\t# syscalls (setuid16, chown16, etc.) since it's not the real syscall\n\t\t# name, but that'd make the output a bit confusing because we'd have\n\t\t# both 16-bit and 32-bit UID syscalls with the same names, so let's\n\t\t# avoid it.\n\t\t#name = nosuffix(name, '16')\n\n\t\t# Y2038 patches rename syscalls that deal with time adding a \"_time64\"\n\t\t# or \"_time32\" suffix to distinguish whether they use 64-bit time\n\t\t# structs (e.g. `struct __kernel_timespec`) or 32-bit time structs (e.g.\n\t\t# `struct old_timespec32`). The suffix is shortened to just \"64\" or \"32\"\n\t\t# if the syscall name already ends in \"time\". This suffix is independent\n\t\t# of the arch, so strip it regardless.\n\t\t#\n\t\t# In v5.1 a bunch of 64-bit time syscalls were added to 32-bit archs\n\t\t# with some exceptions (notably riscv).\n\t\t#\n\t\t#     SYSCALL_DEFINE5(recvmmsg_time32, ...) -> recvmmsg\n\t\t#     SYSCALL_DEFINE2(clock_adjtime32, ...) -> clock_adjtime\n\t\t#\n\t\tname = nosuffix(name, '_time32', '_time64')\n\t\tif name.endswith('time32') or name.endswith('time64'):\n\t\t\tname = name[:-2]\n\n\t\t# Some architectures have a \"sys32_\" or \"32_\" prefix for... whatever\n\t\t# annoying reason (e.g. v5.1 MIPS 64bit o32). Stripping it regardless of\n\t\t# arch seems fine, so do it.\n\t\t#\n\t\t#     asmlinkage long sys32_sync_file_range(...) -> sync_file_range\n\t\t#     SYSCALL_DEFINE4(32_truncate64, ...)        -> truncate64\n\t\t#\n\t\tname = noprefix(name, '32_', 'sys32_')\n\n\t\t# Some architectures have an \"old_\" prefix for old syscalls which have\n\t\t# been superseded by new ones. There is also stuff like \"oldumount\"\n\t\t# (v5.18 ARM), but that's actually a different syscall and the kernel\n\t\t# also has \"umount\" under a different number, so leave it be.\n\t\t#\n\t\t#     SYSCALL_DEFINE2(old_getrlimit, ...) -> getrlimit\n\t\t#     SYSCALL_DEFINE1(oldumount, ...)     -> oldumount (leave it be)\n\t\t#\n\t\tname = noprefix(name, 'old_')\n\t\treturn self._normalize_syscall_name(name)\n\n\tdef _dummy_syscall_code(self, sc: Syscall, vmlinux: ELF) -> Optional[bytes]:\n\t\t'''Determine whether a syscall has a dummy implementation (e.g. one that\n\t\tonly does `return -ENOSYS/-EINVAL`). If this is the case, return the\n\t\tmachine code of the syscall, otherwise None.\n\t\t'''\n\t\treturn None\n\n\t# NOTE: subclasses should only override _dummy_syscall_code() above\n\t@final\n\tdef is_dummy_syscall(self, sc: Syscall, vmlinux: ELF,\n\t\t\tni_sym: Optional[bytes]=None, ni_code: Optional[bytes]=None) -> bool:\n\t\t'''Determine whether a syscall has a dummy implementation (e.g. one that\n\t\tonly does `return -ENOSYS/-EINVAL`). Try matching the vaddr or code of a\n\t\tknown ni_syscall symbol first, otherwise fall back to arch-specific\n\t\tlogic.\n\t\t'''\n\t\tif ni_sym is not None:\n\t\t\tif sc.symbol.real_vaddr == ni_sym.real_vaddr:\n\t\t\t\tlogging.info('Syscall %s (%s) is not really implemented: '\n\t\t\t\t\t'vaddr matches %s', sc.name, sc.symbol.name,\n\t\t\t\t\tni_sym.name)\n\t\t\t\treturn True\n\n\t\t# Cache ni_syscall code for speed as this function will definitely\n\t\t# be called multiple times for the same ni_syscall.\n\t\tif ni_code is not None:\n\t\t\tcode = vmlinux.vaddr_read(sc.symbol.real_vaddr, len(ni_code))\n\t\t\tif code == ni_code:\n\t\t\t\tlogging.info('Syscall %s (%s) is not really implemented: '\n\t\t\t\t\t'code matches %s', sc.name, sc.symbol.name,\n\t\t\t\t\tni_sym.name)\n\t\t\t\treturn True\n\n\t\tcode = self._dummy_syscall_code(sc, vmlinux)\n\t\tif code is None:\n\t\t\treturn False\n\n\t\tlogging.info('Syscall %s (%s) is not really implemented: dummy '\n\t\t\t'implementation: %s', sc.name, sc.symbol.name, code.hex())\n\t\treturn True\n\n\tdef adjust_syscall_number(self, number: int) -> int:\n\t\t'''Adjust the number for the given syscall according to any\n\t\tarch-specific quirk there might be (e.g. PowerPC with its interleaved\n\t\tsyscall numbers).\n\t\t'''\n\t\treturn number\n\n\tdef have_syscall_table(self) -> bool:\n\t\t'''Return whether the standard method of extracting virtual addresses\n\t\tof syscall functions via syscall table works.'''\n\t\treturn self.syscall_table_name is not None\n\n\tdef extract_syscall_vaddrs(self, vmlinux: ELF) -> Dict[int,int]:\n\t\t'''Extract virtual addresses of syscall functions. Implemented in case\n\t\tthis isn't just as simple as looking at the addresses in the syscall\n\t\ttable (e.g., there might not be one to begin with).\n\t\t'''\n\t\tlogging.error(\"Sorry, don't know how to extract syscall vaddrs for this arch!\")\n\t\treturn {}\n\n\tdef extract_esoteric_syscalls(self, vmlinux: ELF) -> List[EsotericSyscall]:\n\t\t'''Extract weird arch-specific syscalls not in the syscall table: there\n\t\tisn't much else to do except either manually list these (if they are\n\t\talways present) or perform static binary analysis.\n\n\t\tThe returned value is a list of tuples of the form: (number, name,\n\t\tsymbol_name, signature, kconfig_opts).\n\n\t\tNOTE: the symbol_name that is returned needs to exist in the given\n\t\tvmlinux.\n\t\t'''\n\t\treturn []\n\n\tdef syscall_def_regexp(self, syscall_name: Optional[str]=None) -> Optional[str]:\n\t\t'''Return a regexp capable of matching syscall definitions using\n\t\tarch-specific SYSCALL_DEFINEx macros with weird names or arch-specific\n\t\tadsmlinkage function name prefixes. If syscall_name is given, return a\n\t\tregexp to match this syscall definition exactly, otherwise just a\n\t\tgeneric one.\n\n\t\tWith syscall_name: the returned regexp should match a macro call up to\n\t\tand **including** the syscall name plus a word boundary or any useful\n\t\tdelimiter after the name to match it completely.\n\t\tE.g.: r'SYSCALL_DEFINE\\\\d\\\\(name\\\\b' or r'asmlinkage long sys_name\\\\('.\n\n\t\tWithout syscall_name: the returned regexp should match the macro call up\n\t\tto and **including** the first open parenthesis.\n\t\tE.g.: r'SYSCALL_DEFINE\\\\d\\\\(' or r'asmlinkage long sys_\\\\w+\\\\('.\n\t\t'''\n\t\t# Dev note: the \\\\ above are because that's a docstring (lol), you\n\t\t# obviously only need one in the regexp itself with the r'' syntax.\n\t\treturn None\n"
  },
  {
    "path": "src/systrack/arch/arm.py",
    "content": "from typing import Tuple, List, Optional\n\nfrom ..elf import ELF, E_MACHINE, E_FLAGS\nfrom ..kconfig_options import VERSION_INF\nfrom ..syscall import Syscall\nfrom ..type_hints import KernelVersion, EsotericSyscall\nfrom ..utils import VersionedDict, noprefix, nosuffix\n\nfrom .arch_base import Arch\n\nclass ArchArm(Arch):\n\tname             = 'arm'\n\tbits32           = True\n\tabi_bits32       = True\n\tsyscall_arg_regs = ('r0', 'r1', 'r2', 'r3', 'r4', 'r5', 'r6')\n\n\tkconfig = VersionedDict((\n\t\t# kexec_load\n\t\t((2,6,21), VERSION_INF, 'KEXEC=y'  , ['PM_SLEEP_SMP=y', 'MMU=y']),\n\t\t# seccomp\n\t\t((2,6,37), (5,10)     , 'SECCOMP=y', []),\n\t\t# No NUMA support => no mbind, migrate_pages, {get,set}_mempolicy\n\t))\n\n\tdef __init__(self, kernel_version: KernelVersion, abi: str, bits32: bool = True):\n\t\tassert bits32, f'{self.__class__.__name__} is 32-bit only'\n\t\tsuper().__init__(kernel_version, abi, True)\n\t\tassert self.bits32 and self.abi_bits32\n\t\tassert self.abi in ('eabi', 'oabi')\n\n\t\tif self.kernel_version >= (3,7):\n\t\t\t# We want a modern-enough processor for which SMP=y by default\n\t\t\tself.config_targets = ('multi_v7_defconfig',)\n\t\telse:\n\t\t\t# TODO: not sure which config is best for < 3.7, but defconfig\n\t\t\t# definitely isn't that good, we might be missing some syscalls e.g.\n\t\t\t# kexec if SMP=n, so warn about it. This is something to think about\n\t\t\t# when we get around supporting such kernel versions.\n\t\t\tself.config_targets = ('defconfig',)\n\n\t\tif self.abi == 'eabi':\n\t\t\t# Apparently OABI_COMPAT is on by default on old kernels (e.g. 4.0),\n\t\t\t# so disable it if not needed, or we're gonna build a kernel with\n\t\t\t# no seccomp.\n\t\t\tself.kconfig.add((2,6,16), VERSION_INF, 'OABI_COMPAT=n', [])\n\t\t\tself.syscall_num_reg = 'r7'\n\t\telif self.abi == 'oabi':\n\t\t\tself.syscall_num_base = 0x900000\n\t\t\t# No register, number passed as immediate to the SWI instruction\n\t\t\tself.syscall_num_reg = 'swi <NR>'\n\n\t\t\t# Building an old OABI-only kernel is annoying. Assume EABI + compat\n\t\t\t# OABI (OABI_COMPAT=y) and just build with support for both ABIs.\n\t\t\t# FIXME: this will disable the seccomp syscall. Configure for an\n\t\t\t# OABI-only kernel here in the future...\n\t\t\tself.kconfig.add((2,6,16), VERSION_INF, 'OABI_COMPAT=y', ['AEABI=y', 'THUMB2_KERNEL=n'])\n\n\t@staticmethod\n\tdef match(vmlinux: ELF) -> Optional[Tuple[bool,List[str]]]:\n\t\tif vmlinux.e_machine != E_MACHINE.EM_ARM:\n\t\t\treturn None\n\n\t\tassert vmlinux.bits32, 'EM_ARM 64-bit? WAT'\n\n\t\tif 'sys_oabi_call_table' in vmlinux.symbols:\n\t\t\tabis = ['eabi', 'oabi']\n\t\telse:\n\t\t\t# For EABI, e_flags in the ELF header should tell us the EABI\n\t\t\t# version (assuming it is set).\n\t\t\tif (vmlinux.e_flags & E_FLAGS.EF_ARM_EABI_MASK) != 0:\n\t\t\t\tabis = ['eabi']\n\t\t\tabis = ['oabi']\n\n\t\treturn True, abis\n\n\tdef matches(self, vmlinux: ELF) -> bool:\n\t\treturn vmlinux.bits32 and vmlinux.e_machine == E_MACHINE.EM_ARM\n\n\tdef adjust_abi(self, vmlinux: ELF):\n\t\t# We could be dealing with an EABI + compat OABI kernel or an\n\t\t# EABI/OABI-only kernel. In the former case, we'll need to select the\n\t\t# compat syscall table.\n\t\tif self.abi == 'oabi' and 'sys_oabi_call_table' in vmlinux.symbols:\n\t\t\t# EABI + compat OABI\n\t\t\tself.compat = True\n\t\t\tself.syscall_table_name = 'sys_oabi_call_table'\n\t\telse:\n\t\t\t# EABI/OABI only\n\t\t\tself.compat = False\n\t\t\tself.syscall_table_name = 'sys_call_table'\n\n\tdef _translate_syscall_symbol_name(self, sym_name: str) -> str:\n\t\t# For some reason some syscalls are wrapped in assembly at the entry\n\t\t# point e.g. sys_sigreturn_wrapper v5.18 arch/arm/kernel/entry-common.S.\n\t\t# Stripping the \"_wrapper\" suffix can help locate them through source\n\t\t# code grepping.\n\t\treturn nosuffix(sym_name, '_wrapper')\n\n\tdef _normalize_syscall_name(self, name: str) -> str:\n\t\tif self.abi == 'oabi':\n\t\t\t# E.g. v5.18 asmlinkage long sys_oabi_connect(...)\n\t\t\tname = noprefix(name, 'oabi_')\n\t\t# E.g. v5.18 asmlinkage long sys_arm_fadvise64_64(...)\n\t\treturn noprefix(name, 'arm_')\n\n\tdef _dummy_syscall_code(self, sc: Syscall, vmlinux: ELF) -> Optional[bytes]:\n\t\t# Match the following code exactly with either #21 (EINVAL - 1) or #37\n\t\t# (ENOSYS - 1) as immediate for MVN:\n\t\t#\n\t\t#     f06f 0015    mvn.w   r0, #21\n\t\t#     4770         bx      lr\n\t\t#\n\t\t# Taken from sys_fork on v5.0 multi_v7_defconfig with MMU=n.\n\t\t#\n\t\tif sc.symbol.size != 6:\n\t\t\treturn None\n\n\t\tcode = vmlinux.read_symbol(sc.symbol)\n\t\tif code in (b'\\x6f\\xf0\\x15\\x00\\x70\\x47', b'\\x6f\\xf0\\x25\\x00\\x70\\x47'):\n\t\t\treturn code\n\t\treturn None\n\n\tdef extract_esoteric_syscalls(self, vmlinux: ELF) -> List[EsotericSyscall]:\n\t\t# ARM-specific syscalls that are outside the syscall table, with numbers\n\t\t# in the range 0x0f0000-0x0fffff for EABI and 0x9f0000-0x9fffff for\n\t\t# OABI. These are all implemented in arm_syscall()\n\t\t# (arch/arm/kernel/traps.c) with a switch statement. WEEEIRD!\n\t\t#\n\t\tif 'arm_syscall' not in vmlinux.functions:\n\t\t\treturn []\n\n\t\tbase = self.syscall_num_base + 0x0f0000\n\t\tres = [\n\t\t\t(base + 1, 'breakpoint', 'arm_syscall', (), None),\n\t\t\t(base + 2, 'cacheflush', 'arm_syscall', ('unsigned long start', 'unsigned long end', 'int flags'), None),\n\t\t\t(base + 3, 'usr26'     , 'arm_syscall', (), None),\n\t\t\t(base + 4, 'usr32'     , 'arm_syscall', (), None),\n\t\t\t(base + 5, 'set_tls'   , 'arm_syscall', ('unsigned long val',), None),\n\t\t]\n\n\t\tif self.kernel_version >= (4,15):\n\t\t\tres.append((base + 6, 'get_tls', 'arm_syscall', (), None))\n\n\t\treturn res\n\n\tdef syscall_def_regexp(self, syscall_name: Optional[str]=None) -> Optional[str]:\n\t\tif self.abi != 'oabi':\n\t\t\treturn None\n\n\t\tif syscall_name is not None:\n\t\t\tif syscall_name.startswith('sys_oabi_'):\n\t\t\t\treturn rf'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*{syscall_name}\\s*\\('\n\t\t\treturn rf'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*sys_oabi_{syscall_name}\\s*\\('\n\t\treturn r'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*sys_oabi_\\w+\\s*\\('\n"
  },
  {
    "path": "src/systrack/arch/arm64.py",
    "content": "from typing import Tuple, List, Optional\n\nfrom ..elf import Symbol, ELF, E_MACHINE\nfrom ..kconfig_options import VERSION_INF\nfrom ..syscall import Syscall\nfrom ..type_hints import KernelVersion\nfrom ..utils import VersionedDict, noprefix\n\nfrom .arch_base import Arch\n\nclass ArchArm64(Arch):\n\tname             = 'arm64'\n\tbits32           = False\n\tsyscall_num_reg  = 'w8'\n\tsyscall_arg_regs = ('x0', 'x1', 'x2', 'x3', 'x4', 'x5')\n\n\tkconfig = VersionedDict((\n\t\t# Enable aarch32 ABI regardless, should be =y by default, but better safe than sorry\n\t\t((3,7) , VERSION_INF, 'COMPAT=y'       , ['ARM64_4K_PAGES=y', 'EXPERT=y']),\n\t\t# kexec[_file]_load\n\t\t((4,8) , VERSION_INF, 'KEXEC=y'        , ['PM_SLEEP_SMP=y']),\n\t\t((5,0) , VERSION_INF, 'KEXEC_FILE=y'   , []),\n\t\t# seccomp\n\t\t((3,19), (5,10)     , 'SECCOMP=y'      , []),\n\t\t# mbind, migrate_pages, {get,set}_mempolicy\n\t\t((4,7) , VERSION_INF, 'NUMA=y'         , []),\n\t\t# pkey syscalls, technically defaults to =y\n\t\t((6,12), VERSION_INF, 'ARM64_POE=y'    , []),\n\t\t# map_shadow_stack (needs UPROBES=n disabled via UPROBE_EVENTS=n)\n\t\t((6,13), VERSION_INF, 'UPROBE_EVENTS=n', []),\n\t\t((6,13), VERSION_INF, 'ARM64_GCS=y'    , ['UPROBES=n']),\n\t))\n\n\tkconfig_syscall_deps = VersionedDict((\n\t\t((6,13), VERSION_INF, 'map_shadow_stack', 'ARM64_GCS'),\n\t\t((6,12), VERSION_INF, 'pkey_alloc'      , 'ARM64_POE'),\n\t\t((6,12), VERSION_INF, 'pkey_free'       , 'ARM64_POE'),\n\t\t((6,12), VERSION_INF, 'pkey_mprotect'   , 'ARM64_POE'),\n\t))\n\n\tdef __init__(self, kernel_version: KernelVersion, abi: str, bits32: bool = False):\n\t\tassert not bits32, f'{self.__class__.__name__} is 64-bit only'\n\t\tassert kernel_version >= (3,7), 'Linux only supports arm64 from v3.7'\n\t\tsuper().__init__(kernel_version, abi, False)\n\t\tassert not self.bits32\n\t\tassert self.abi in ('aarch64', 'aarch32')\n\n\t\tif self.abi == 'aarch32':\n\t\t\tself.compat = True\n\t\t\tself.abi_bits32 = True\n\t\t\tself.syscall_table_name = 'compat_sys_call_table'\n\n\t@staticmethod\n\tdef match(vmlinux: ELF) -> Optional[Tuple[bool,List[str]]]:\n\t\tif vmlinux.e_machine != E_MACHINE.EM_AARCH64:\n\t\t\treturn None\n\n\t\tassert not vmlinux.bits32, 'EM_AARCH64 32-bit? WAT'\n\n\t\tif 'compat_sys_call_table' in vmlinux.symbols:\n\t\t\tabis = ['aarch64', 'aarch32']\n\t\telse:\n\t\t\tabis = ['aarch64']\n\n\t\treturn False, abis\n\n\tdef matches(self, vmlinux: ELF) -> bool:\n\t\treturn not vmlinux.bits32 and vmlinux.e_machine == E_MACHINE.EM_AARCH64\n\n\tdef _preferred_symbol(self, a: Symbol, b: Symbol) -> Optional[Symbol]:\n\t\t# See commit 4378a7d4be30ec6994702b19936f7d1465193541\n\t\tif a.name.startswith('__arm64_'):\n\t\t\treturn a\n\t\tif b.name.startswith('__arm64_'):\n\t\t\treturn b\n\t\treturn None\n\n\tdef _normalize_syscall_name(self, name: str) -> str:\n\t\t# E.g. v5.18 COMPAT_SYSCALL_DEFINE6(aarch32_mmap2, ...)\n\t\t# E.g. v5.2-v6.13+ SYSCALL_DEFINE1(arm64_personality, ...)\n\t\treturn noprefix(name, 'aarch32_', 'arm64_')\n\n\tdef _dummy_syscall_code(self, sc: Syscall, vmlinux: ELF) -> Optional[bytes]:\n\t\t# Match the following code exactly with either -22 (EINVAL) or -38\n\t\t# (-ENOSYS) as immediate for MOV:\n\t\t#\n\t\t#     928004a0    mov  x0, #0xffffffffffffffda // #-38\n\t\t#     d65f03c0    ret\n\t\t#\n\t\t# Taken from __arm64_sys_pkey_alloc on v6.11.\n\t\t#\n\t\tif sc.symbol.size > 8 or sc.symbol.size == 4:\n\t\t\treturn None\n\n\t\tassert not vmlinux.big_endian\n\n\t\tcode = vmlinux.read_symbol(sc.symbol)\n\t\tif not code.endswith(b'\\xc0\\x03\\x5f\\xd6'): # ret\n\t\t\treturn None\n\n\t\t# MOVN <Xd>, #<imm>{, LSL #<shift>}\n\t\tmov = int.from_bytes(code[:4], 'little')\n\t\tif mov & 0xff80001f != 0x92800000:\n\t\t\treturn None\n\n\t\thw = (mov >> 20) & 0x3\n\t\timm = ~(((mov >> 5) & 0xffff) << (hw * 16))\n\t\tif imm == -38 or imm == -22:\n\t\t\treturn code\n\n\t\treturn None\n"
  },
  {
    "path": "src/systrack/arch/mips.py",
    "content": "from typing import Tuple, List, Optional\n\nfrom ..elf import ELF, E_MACHINE\nfrom ..kconfig_options import VERSION_ZERO, VERSION_INF\nfrom ..syscall import Syscall\nfrom ..type_hints import KernelVersion\nfrom ..utils import VersionedDict, anyprefix, noprefix\n\nfrom .arch_base import Arch\n\nclass ArchMips(Arch):\n\tname            = 'mips'\n\tsyscall_num_reg = 'v0'\n\n\tkconfig = VersionedDict((\n\t\t# kexec[_file]_load\n\t\t((2,6,20), (3,9)      , 'KEXEC=y'  , ['EXPERIMENTAL=y']),\n\t\t((3,9)   , VERSION_INF, 'KEXEC=y'  , []),\n\t\t# seccomp\n\t\t((2,6,15), (5,10)     , 'SECCOMP=y', []),\n\t))\n\n\tdef __init__(self, kernel_version: KernelVersion, abi: str, bits32: bool = False):\n\t\tsuper().__init__(kernel_version, abi, bits32)\n\t\tassert self.abi in ('o32', 'n32', 'n64')\n\n\t\tif self.abi == 'o32':\n\t\t\tself.abi_bits32 = True\n\t\t\t# Interestingly, man 2 syscall states: \"The mips/o32 system call\n\t\t\t# convention passes arguments 5 through 8 on the user stack\".\n\t\t\t# What syscall takes 8 arguments on MIPS o32? WTF.\n\t\t\tself.syscall_num_base = 4000\n\t\t\tself.syscall_arg_regs = ('a0', 'a1', 'a2', 'a3', 'stack', 'stack', 'stack', 'stack')\n\n\t\t\tif not self.bits32:\n\t\t\t\tself.syscall_table_name = 'sys32_call_table'\n\t\telse:\n\t\t\tself.abi_bits32 = False\n\t\t\tself.syscall_arg_regs = ('a0', 'a1', 'a2', 'a3', 'a4', 'a5')\n\n\t\t\tif self.abi == 'n64':\n\t\t\t\tself.syscall_num_base = 5000\n\t\t\telse: # n32\n\t\t\t\tself.syscall_num_base = 6000\n\t\t\t\tself.syscall_table_name = 'sysn32_call_table'\n\n\t\tif self.bits32:\n\t\t\t# MIPS 32bit means o32 ABI.\n\t\t\tassert self.abi == 'o32'\n\n\t\t\t# Just to be clear: for 32-bit we are ok with defconfig\n\t\t\tself.config_targets = ('defconfig',)\n\n\t\t\tself.kconfig.add(VERSION_ZERO, VERSION_INF, '32BIT=y', [])\n\t\t\tself.kconfig.add(VERSION_ZERO, VERSION_INF, '64BIT=n', [])\n\n\t\t\t# Select CPU release. It does not seem to matter much, so select R2,\n\t\t\t# which has the best kernel version compatibility (along with R1).\n\t\t\t# These are a multiple choice menu, so better set all of them.\n\t\t\tself.kconfig.add((2,6,15), VERSION_INF, 'CPU_MIPS32_R1=n', [])\n\t\t\tself.kconfig.add((2,6,15), VERSION_INF, 'CPU_MIPS32_R2=y', ['SYS_HAS_CPU_MIPS32_R2=y'])\n\t\t\tself.kconfig.add((4,0)   , VERSION_INF, 'CPU_MIPS32_R6=n', [])\n\t\telse:\n\t\t\tself.compat = self.abi != 'n64'\n\n\t\t\t# Grab SGI IP27 (Origin200/2000), which apparently is one of the\n\t\t\t# only two MIPS machine with NUMA support along with Longsoon64\n\t\t\t# (loongson3_defconfig), as the latter is more of a pain in the ass\n\t\t\t# to build. No need to select CPU release for this, it's R10000.\n\t\t\tself.config_targets = ('ip27_defconfig',)\n\n\t\t\tself.kconfig.add(VERSION_ZERO, VERSION_INF, '32BIT=n', [])\n\t\t\tself.kconfig.add(VERSION_ZERO, VERSION_INF, '64BIT=y', [])\n\n\t\t\t# 32-bit has no NUMA support (apparently), but 64-bit does and\n\t\t\t# ip27_defconfig should include it. Make sure an error is raised in\n\t\t\t# case of no NUMA. Needed for mbind, migrate_pages,\n\t\t\t# {get,set}_mempolicy.\n\t\t\tself.kconfig.add(VERSION_ZERO, VERSION_INF, 'NUMA=y', ['SYS_SUPPORTS_NUMA=y'])\n\n\t\t\t# MIPS 64bit supports all ABIs: 32bit o32, 64bit n32, 64bit n64.\n\t\t\t# Enable all of them regardless, we will be able to extract the\n\t\t\t# right syscall table anyway.\n\t\t\tself.kconfig.add(VERSION_ZERO, VERSION_INF, 'MIPS32_O32=y', [])\n\t\t\tself.kconfig.add(VERSION_ZERO, VERSION_INF, 'MIPS32_N32=y', [])\n\n\t@staticmethod\n\tdef match(vmlinux: ELF) -> Optional[Tuple[bool,List[str]]]:\n\t\tif vmlinux.e_machine != E_MACHINE.EM_MIPS:\n\t\t\treturn None\n\n\t\tif vmlinux.bits32:\n\t\t\tabis = ['o32']\n\t\telse:\n\t\t\tabis = ['n64']\n\n\t\t\tif 'sys32_call_table' in vmlinux.symbols:\n\t\t\t\tabis.append('o32')\n\t\t\tif 'sysn32_call_table' in vmlinux.symbols:\n\t\t\t\tabis.append('n32')\n\n\t\treturn vmlinux.bits32, abis\n\n\tdef matches(self, vmlinux: ELF) -> bool:\n\t\treturn (\n\t\t\tvmlinux.e_machine == E_MACHINE.EM_MIPS\n\t\t\tand vmlinux.bits32 == self.bits32\n\t\t)\n\n\tdef _normalize_syscall_name(self, name: str) -> str:\n\t\t# E.G. v5.1 asmlinkage int sysm_pipe(void) for weird historical reasons\n\t\t# E.G. v5.18 SYSCALL_DEFINE6(mips_mmap, ...)\n\t\t# E.G. v5.0-6.13+ asmlinkage long mipsmt_sys_sched_setaffinity(...)\n\t\treturn noprefix(name, 'sysm_', 'mips_', 'mipsmt_sys_')\n\n\tdef _dummy_syscall_code(self, sc: Syscall, vmlinux: ELF) -> Optional[bytes]:\n\t\t# Match the following code exactly with either -22 (EINVAL) or -89\n\t\t# (-ENOSYS), which of course is different than normalon MIPS) as\n\t\t# immediate for LI:\n\t\t#\n\t\t#     03e00008    jr  ra\n\t\t#     2402ffa7    li  v0,-89\n\t\t#\n\t\t# Taken from __se_sys_cachectl on v6.9 64-bit ip27_defconfig.\n\t\t#\n\t\tif sc.symbol.size != 8:\n\t\t\treturn None\n\n\t\tcode = vmlinux.read_symbol(sc.symbol)\n\n\t\tif vmlinux.big_endian:\n\t\t\tif not code.startswith(b'\\x03\\xe0\\x00\\x08\\x24\\x02'):\n\t\t\t\treturn None\n\n\t\t\timm = int.from_bytes(code[6:], 'big', signed=True)\n\t\telse:\n\t\t\tif not (code.startswith(b'\\x08\\x00\\xe0\\x03') and code.endswith(b'\\x02\\x24')):\n\t\t\t\treturn None\n\n\t\t\timm = int.from_bytes(code[4:6], 'little', signed=True)\n\n\t\tif imm == -22 or imm == -89:\n\t\t\treturn code\n\t\treturn None\n\n\tdef syscall_def_regexp(self, syscall_name: Optional[str]=None) -> Optional[str]:\n\t\t# Absolutely insane old-style prefixes on MIPS...\n\t\texps = []\n\n\t\tif syscall_name is not None:\n\t\t\tif anyprefix(syscall_name, 'sysm_', 'mipsmt_sys_'):\n\t\t\t\texps.append(rf'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*{syscall_name}\\s*\\(')\n\t\t\telse:\n\t\t\t\texps.append(rf'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*(sysm|mipsmt_sys)_{syscall_name}\\s*\\(')\n\n\t\t\tif self.abi == 'n32':\n\t\t\t\tif anyprefix(syscall_name, 'sysn32_'):\n\t\t\t\t\texps.append(rf'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*{syscall_name}\\s*\\(')\n\t\t\t\telse:\n\t\t\t\t\texps.append(rf'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*sysn32_{syscall_name}\\s*\\(')\n\t\telse:\n\t\t\texps.append(r'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*(sysm|mipsmt_sys)_\\w+\\s*\\(')\n\n\t\t\tif self.abi == 'n32':\n\t\t\t\texps.append(r'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*sysn32_\\w+\\s*\\(')\n\n\t\treturn '|'.join(exps)\n"
  },
  {
    "path": "src/systrack/arch/powerpc.py",
    "content": "from struct import iter_unpack\nfrom typing import Tuple, List, Optional\nfrom operator import itemgetter\n\nfrom ..elf import Symbol, ELF, E_MACHINE\nfrom ..kconfig_options import VERSION_ZERO, VERSION_INF\nfrom ..syscall import Syscall\nfrom ..type_hints import KernelVersion, EsotericSyscall\nfrom ..utils import VersionedDict, noprefix\n\nfrom .arch_base import Arch\n\nclass ArchPowerPC(Arch):\n\tname = 'powerpc'\n\tsyscall_num_base = 0\n\tsyscall_num_reg = 'r0'\n\n\t# NOTE: We treat \"SPU\" as an ABI, even though it's not a real ABI. It stands\n\t# for \"Synergistic Processor Unit\", one of the CPUs composing a Cell\n\t# processor: https://en.wikipedia.org/wiki/Cell_(processor). SPUs are quite\n\t# peculiar: as the comment in arch/powerpc/platforms/cell/spu_callbacks.c\n\t# (v5.0) explains, they can only use a subset of the syscalls defined for\n\t# the \"64\" ABI.\n\n\t# NOTE: we are assuming to have PPC_BOOK3S=y (and therefore PPC_BOOK3S_32=y\n\t# for 32-bit or PPC_BOOK3S_64=y for 64-bit)\n\tkconfig = VersionedDict((\n\t\t# These are needed for RELOCATABLE=n, we do not really need to list\n\t\t# dependencies since we are disabling them.\n\t\t((2,6,30)    , VERSION_INF, 'PPC_OF_BOOT_TRAMPOLINE=n', []),\n\t\t((2,6,16)    , (2,6,27)   , 'CRASH_DUMP=n'            , []),\n\t\t((2,6,27)    , VERSION_INF, 'CRASH_DUMP=n'            , []),\n\t\t((4,12)      , VERSION_INF, 'CRASH_DUMP=n'            , []),\n\t\t((3,4)       , VERSION_INF, 'FA_DUMP=n'               , []),\n\t\t# Needs to be set here too because arch-specific kconfigs are applied\n\t\t# after those listed in KCONFIG_DEBUGGING (kconfig_options.py)\n\t\t(VERSION_ZERO, VERSION_INF, 'RELOCATABLE=n', ['PPC_OF_BOOT_TRAMPOLINE=n', 'CRASH_DUMP=n', 'FA_DUMP=n']),\n\t\t# kexec_load\n\t\t((2,6,15)    , (3,9)      , 'KEXEC=y', ['PPC_BOOK3S=y', 'EXPERIMENTAL=y']),\n\t\t((3,9)       , VERSION_INF, 'KEXEC=y', ['PPC_BOOK3S=y']),\n\t\t# seccomp\n\t\t((2,6,15)    , (5,10)     , 'SECCOMP=y', ['PROC_FS=y']),\n\t\t# rtas\n\t\t((2,6,15)    , VERSION_INF, 'PPC_RTAS=y', []),\n\t))\n\n\t# FIXME: more like a curiosity, but why the hell do migrate_pages and\n\t# move_pages look like they depend on MIGRATION and not necessarily on NUMA,\n\t# but then aren't available for PPC 32-bit which has NUMA=n???\n\n\tkconfig_syscall_deps = VersionedDict((\n\t\t(VERSION_ZERO, VERSION_INF, 'pkey_alloc'   , 'PPC_MEM_KEYS'),\n\t\t(VERSION_ZERO, VERSION_INF, 'pkey_free'    , 'PPC_MEM_KEYS'),\n\t\t(VERSION_ZERO, VERSION_INF, 'pkey_mprotect', 'PPC_MEM_KEYS'),\n\t))\n\n\tdef __init__(self, kernel_version: KernelVersion, abi: str, bits32: bool = False):\n\t\tsuper().__init__(kernel_version, abi, bits32)\n\t\tassert self.abi in ('ppc32', 'ppc64', 'spu')\n\n\t\t# The \"powerpc\" directory was added under arch in v2.6.15 and it weirdly\n\t\t# coexisted with \"ppc\" until v2.6.27, when the latter was removed.\n\t\tassert self.kernel_version >= (2,6,15), 'kernel too old, sorry!'\n\n\t\tif self.abi == 'spu':\n\t\t\t# spu_syscall_table only exists since v2.6.16, I have no idea how\n\t\t\t# things were handled before then. This is a rather old kernel\n\t\t\t# version, we'll worry about it in the future (if ever).\n\t\t\tassert self.kernel_version >= (2,6,16), 'kernel too old, sorry!'\n\n\t\tif self.abi == 'ppc32':\n\t\t\tself.syscall_arg_regs = ('r3', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9')\n\t\t\tself.abi_bits32 = True\n\t\telse:\n\t\t\tself.syscall_arg_regs = ('r3', 'r4', 'r5', 'r6', 'r7', 'r8')\n\t\t\tself.abi_bits32 = False\n\n\t\tif self.bits32:\n\t\t\tself.compat = False\n\t\t\tself.uses_function_descriptors = False\n\t\t\tself.syscall_table_name = 'sys_call_table'\n\n\t\t\t# PPC_BOOK3S_32 was introduced in v2.6.31. We'll worry about\n\t\t\t# older kernels in the future (if ever).\n\t\t\tassert self.kernel_version >= (2,6,31), 'kernel too old, sorry!'\n\n\t\t\t# Apparently there isn't a nice 32-bit defconfig and one needs\n\t\t\t# to manually disable 64-bit??? What in tarnation >:( lame!\n\t\t\t# There's ppc_defconfig from v5.2, which also takes half the time to\n\t\t\t# build so it'd be nice to use... but using it as is without tweaks\n\t\t\t# compiles a kernel without memfd_create.\n\t\t\tself.config_targets = ('ppc64_defconfig',)\n\t\t\tself.kconfig.add(VERSION_ZERO, VERSION_INF, 'PPC64=n', [])\n\t\t\tself.kconfig.add(VERSION_ZERO, VERSION_INF, 'PPC_BOOK3S_32=y', [])\n\t\telse:\n\t\t\tself.compat = self.abi != 'ppc64'\n\t\t\tself.abi_bits32 = self.abi == 'ppc32'\n\t\t\tself.config_targets = ('ppc64_defconfig',)\n\t\t\tself.uses_function_descriptors = True\n\n\t\t\tif self.abi == 'spu':\n\t\t\t\tself.syscall_table_name = 'spu_syscall_table'\n\t\t\telif self.abi == 'ppc32' and self.kernel_version >= (5,0):\n\t\t\t\t# 32-bit and 64-bit syscalls before v5.0 share the same table\n\t\t\t\t# (see skip_syscall() below), they are split in two tables only\n\t\t\t\t# from v5.0.\n\t\t\t\tself.syscall_table_name = 'compat_sys_call_table'\n\n\t\t\t# PowerPC64 supports all ABIs: 64, 32, \"spu\". Enable all of them, we\n\t\t\t# will be able to extract the right syscall table regardless.\n\t\t\tself.kconfig.add((2,6,15), (5,7)      , 'COMPAT=y', ['PPC64=y'])\n\t\t\tself.kconfig.add((5,7)   , VERSION_INF, 'COMPAT=y', ['PPC64=y', 'CPU_LITTLE_ENDIAN=n', 'CC_IS_CLANG=n'])\n\n\t\t\t# Needed for NUMA=y\n\t\t\tself.kconfig.add((2,6,15), (2,6,22)   , 'PPC_PSERIES=y', ['PPC64=y', 'PPC_MULTIPLATFORM=y']),\n\t\t\tself.kconfig.add((2,6,22), VERSION_INF, 'PPC_PSERIES=y', ['PPC64=y', 'PPC_BOOK3S=y']),\n\t\t\t# mbind, migrate_pages, {get,set}_mempolicy\n\t\t\t#   NOTE: in theory depends on (PPC_PSERIES || PPC_POWERNV) after\n\t\t\t#   5.10, but we are assuming PPC_PSERIES=y\n\t\t\tself.kconfig.add((2,6,15), VERSION_INF, 'NUMA=y', ['PPC64=y', 'SMP=y', 'PPC_PSERIES=y'])\n\t\t\t# kexec_file_load\n\t\t\tself.kconfig.add((4,10)  , VERSION_INF, 'KEXEC_FILE=y', ['PPC64=y', 'CRYPTO=y', 'CRYPTO_SHA256=y'])\n\t\t\t# Needed for PPC_SUBPAGE_PROT=y\n\t\t\t#   NOTE: in theory depends on (44x || PPC_BOOK3S_64), but we are\n\t\t\t#   assuming PPC_BOOK3S_64=y\n\t\t\tself.kconfig.add((2,6,15), VERSION_INF, 'PPC_64K_PAGES=y', ['PPC_BOOK3S_64=y'])\n\t\t\t# subpage_prot (ppc only, 64-bit only)\n\t\t\tself.kconfig.add((2,6,25), (5,17)     , 'PPC_SUBPAGE_PROT=y', ['PPC_64K_PAGES=y', 'PPC_BOOK3S_64=y'])\n\t\t\tself.kconfig.add((5,17)  , VERSION_INF, 'PPC_SUBPAGE_PROT=y', ['PPC_64K_PAGES=y', 'PPC_64S_HASH_MMU=y'])\n\t\t\t# pkey_alloc, pkey_free, pkey_mprotect\n\t\t\tself.kconfig.add((4,16) , (5,17)     , 'PPC_MEM_KEYS=y', ['PPC_BOOK3S_64=y'])\n\t\t\tself.kconfig.add((5,17) , VERSION_INF, 'PPC_MEM_KEYS=y', ['PPC_BOOK3S_64=y', 'PPC_64S_HASH_MMU=y'])\n\t\t\t# switch_endian (esoteric fast version)\n\t\t\tself.kconfig.add((4,15)  , (6,12)     , 'PPC_FAST_ENDIAN_SWITCH=y', []),\n\t\t\t# spu_run, spu_create\n\t\t\tself.kconfig.add((2,6,16), VERSION_INF, 'SPU_FS=y'  , ['PPC_CELL=y', 'COREDUMP=y']),\n\t\t\tself.kconfig.add((2,6,18), VERSION_INF, 'SPU_BASE=y', []),\n\n\t@staticmethod\n\tdef match(vmlinux: ELF) -> Optional[Tuple[bool,List[str]]]:\n\t\tif vmlinux.e_machine == E_MACHINE.EM_PPC:\n\t\t\tassert vmlinux.bits32, 'EM_PPC 64-bit? WAT'\n\t\telif vmlinux.e_machine == E_MACHINE.EM_PPC64:\n\t\t\tassert not vmlinux.bits32, 'EM_PPC64 32-bit? WAT'\n\t\telse:\n\t\t\treturn None\n\n\t\tif vmlinux.bits32:\n\t\t\tabis = ['ppc32']\n\t\telse:\n\t\t\tabis = ['ppc64']\n\n\t\t\t# v5.0+ has a separate compat table and can be built with COMPAT=n.\n\t\t\t# Before v5.0 64-bit and 32-bit syscalls share a single table and\n\t\t\t# apparently it's always COMPAT=y. If none of these match, we must\n\t\t\t# be dealing with a v5.0+ COMPAT=n kernel, which is the only case\n\t\t\t# where there's no 32-bit syscall table.\n\t\t\tif 'compat_sys_call_table' in vmlinux.symbols \\\n\t\t\t\t\tor 'compat_sys_execve' in vmlinux.symbols \\\n\t\t\t\t\tor '.compat_sys_execve' in vmlinux.symbols:\n\t\t\t\tabis.append('ppc32')\n\n\t\t\tif 'spu_syscall_table' in vmlinux.symbols:\n\t\t\t\tabis.append('spu')\n\n\t\treturn vmlinux.bits32, abis\n\n\tdef matches(self, vmlinux: ELF) -> bool:\n\t\t# Linux PPC 32-bit should be big-endian only\n\t\tassert vmlinux.big_endian, 'Little-endian PowerPC 32-bit kernel? WAT'\n\t\treturn (\n\t\t\tvmlinux.e_machine == (E_MACHINE.EM_PPC64, E_MACHINE.EM_PPC)[self.bits32]\n\t\t\tand vmlinux.bits32 == self.bits32\n\t\t)\n\n\tdef _preferred_symbol(self, a: Symbol, b: Symbol) -> Optional[Symbol]:\n\t\t# Function descriptors take the \"nice\" symbol name, while the actual\n\t\t# functions have a goofy dot prefix.\n\t\tadot = a.name.startswith('.')\n\t\tbdot = b.name.startswith('.')\n\n\t\tif adot or bdot:\n\t\t\tif not adot: return b\n\t\t\tif not bdot: return a\n\t\t\tif a.name.startswith('.sys_'): return a\n\t\t\tif b.name.startswith('.sys_'): return b\n\t\t\treturn a if a.name.startswith('.compat_sys_') else b\n\n\t\treturn None\n\n\tdef skip_syscall(self, sc: Syscall) -> bool:\n\t\tif self.bits32 or self.kernel_version >= (5,0):\n\t\t\treturn False\n\n\t\t# On PowerPC 64-bit before v5.0, 64-bit and 32-bit syscalls are\n\t\t# *interleaved* in the same syscall table, with 64-bit syscalls at even\n\t\t# indexes. This means that we need to ignore half the syscall table! :')\n\t\tif self.abi == 'ppc32':\n\t\t\treturn sc.index % 2 == 0\n\t\t# 'ppc64' or 'spu'\n\t\treturn sc.index % 2 == 1\n\n\tdef _translate_syscall_symbol_name(self, sym_name: str) -> str:\n\t\treturn noprefix(sym_name, '.sys_', '.')\n\n\tdef _normalize_syscall_name(self, name: str) -> str:\n\t\treturn noprefix(name, 'ppc64_', 'ppc32_', 'ppc_')\n\n\tdef _dummy_syscall_code(self, sc: Syscall, vmlinux: ELF) -> Optional[bytes]:\n\t\t# Check for `li r3,-ENOSYS; blr` optionally accompained by some other\n\t\t# known non-branching instructions along the way:\n\t\t#\n\t\t#   - {mflr,mtlr} r0\n\t\t#   - {stw,std,lwz,ld} r0,X(r1)\n\t\t#   - matching stwu/stdu and addi on r1 (stack pointer)\n\t\t#   - bl (to call _mcount() or other func, which *has* to return)\n\t\t#   - nop (ori 0,0,0)\n\t\t#\n\t\t# TODO: relies on the symbol having a valid size (!= 0), improve?\n\t\tif sc.symbol.size < 8:\n\t\t\treturn None\n\n\t\tcode = vmlinux.read_symbol(sc.symbol)\n\t\tr1_dec = r1_inc = None\n\t\tinsns = []\n\n\t\tfor insn in map(itemgetter(0), iter_unpack('<>'[vmlinux.big_endian] + 'L', code)):\n\t\t\thi = insn >> 16\n\n\t\t\t# mflr r0 / mtlr r0 / nop (ori 0,0,0)\n\t\t\tif insn in (0x7c0802a6, 0x7c0803a6, 0x60000000):\n\t\t\t\tcontinue\n\t\t\t# bl X\n\t\t\tif (hi >> 8) == 0x4b:\n\t\t\t\tcontinue\n\t\t\t# stw r0,X(r1) / std r0,X(r1) / lwz r0,X(r1) / ld r0,X(r1)\n\t\t\tif hi in (0x9001, 0xf801, 0xe801, 0x8001):\n\t\t\t\tcontinue\n\t\t\t# stdu r1,X(r1)\n\t\t\tif insn & 0xffff0003 == 0xf8210001:\n\t\t\t\tr1_dec = 0x10000 - (insn & 0xfffc)\n\t\t\t\tcontinue\n\t\t\t# stwu r1,X(r1)\n\t\t\tif hi in (0x9421, 0xf821):\n\t\t\t\tr1_dec = 0x10000 - (insn & 0xffff)\n\t\t\t\tcontinue\n\t\t\t# addi r1,r1,X (after stwu/stdu)\n\t\t\tif hi == 0x3821 and r1_dec is not None:\n\t\t\t\tr1_inc = insn & 0xffff\n\t\t\t\tcontinue\n\n\t\t\tif len(insns) > 2:\n\t\t\t\treturn None\n\n\t\t\tinsns.append(insn)\n\n\t\t# Stack pointer decrement/increment must match\n\t\tif (r1_dec is not None or r1_inc is not None) and r1_dec != r1_inc:\n\t\t\treturn None\n\n\t\t# li r3,-ENOSYS; blr\n\t\tif insns == [0x3860ffda, 0x4e800020]:\n\t\t\treturn code\n\n\t\treturn None\n\n\tdef adjust_syscall_number(self, number: int) -> int:\n\t\tif self.bits32 or self.kernel_version >= (5,0):\n\t\t\treturn number\n\n\t\t# See comment in skip_syscall() above.\n\t\treturn number // 2\n\n\tdef extract_esoteric_syscalls(self, vmlinux: ELF) -> List[EsotericSyscall]:\n\t\t# This is currently only used for fast switch_endian, which is only\n\t\t# implemented for ppc64 and was killed in v6.12. Save some time here.\n\t\tif self.abi != 'ppc64' or self.kernel_version >= (6,12):\n\t\t\treturn []\n\n\t\t# The switch_endian syscall has a \"fast\" version implemented with a\n\t\t# branch at syscall entry point (arch/powerpc/kernel/exceptions-64s.S).\n\t\t#\n\t\t# The symbol to look at is exc_real_0xc00_system_call, where we should\n\t\t# find `cmpdi r0,0x1ebe` followed by a `beq-` to code that updates the\n\t\t# saved LE bit in SRR1. The same code has been there since at least\n\t\t# v2.6.31.\n\t\t#\n\t\t#   2c 20 1e be     cmpdi    r0,7870\n\t\t#   41 c2 00 20     beq      X\n\t\t#   ...\n\t\t#   7d 9b 02 a6  X: mfsrr1   r12\n\t\t#   69 8c 00 01     xori     r12,r12,1\n\t\t#   7d 9b 03 a6     mtsrr1   r12\n\t\t#   4c 00 00 24     rfid\n\t\t#\n\t\t# This \"fast\" implementation depends on PPC_FAST_ENDIAN_SWITCH from\n\t\t# v4.15 onwards. It was removed in v6.12. Old kernels only had this fast\n\t\t# version and no switch_endian syscall in the syscall table, which was\n\t\t# added in v4.1 (529d235a0e190ded1d21ccc80a73e625ebcad09b).\n\t\t#\n\t\t# FIXME: on older kernels (< v5.0) the associated syscall entry symbol\n\t\t# may be different.\n\t\t#\n\t\texc = vmlinux.symbols.get('exc_real_0xc00_system_call')\n\t\tif exc is None:\n\t\t\treturn []\n\n\t\t# Unfortunately we cannot rely on the symbol having a good size, so just\n\t\t# find the next symbol after it and use it as a boundary.\n\t\tboundary = vmlinux.next_symbol(exc)\n\t\tboundary = boundary.vaddr if boundary else exc.vaddr + 0x80\n\t\tcode     = vmlinux.vaddr_read(exc.vaddr, boundary - exc.vaddr)\n\t\tinsns    = iter_unpack('<>'[vmlinux.big_endian] + 'L', code)\n\t\tinsns    = list(map(itemgetter(0), insns))\n\n\t\ttry:\n\t\t\tidx_cmpdi = insns.index(0x2c201ebe)\n\t\t\tbeq = insns[idx_cmpdi + 1]\n\t\texcept (IndexError, ValueError):\n\t\t\treturn []\n\n\t\tidx_mfsrr1 = idx_cmpdi + 1\t + (beq & 0xffff) // 4\n\t\tif idx_mfsrr1 >= len(insns) or insns[idx_mfsrr1] != 0x7d9b02a6:\n\t\t\treturn []\n\n\t\t# Match the branch after the cmpdi. Technically it should be a `beq-`\n\t\t# (beq with not taken branch prediction), but also accept others.\n\t\t#                      beq-    beq+    beq     beq\n\t\tif (beq >> 16) not in (0x41c2, 0x41e2, 0x4182, 0x41a2):\n\t\t\treturn []\n\n\t\ttry:\n\t\t\tidx_xori   = insns.index(0x698c0001, idx_mfsrr1 + 1)\n\t\t\tidx_mtsrr1 = insns.index(0x7d9b03a6, idx_xori + 1)\n\t\t\tinsns.index(0x4c000024, idx_mtsrr1 + 1)\n\t\texcept ValueError:\n\t\t\treturn []\n\n\t\t# We have the syscall\n\t\tkconf = 'PPC_FAST_ENDIAN_SWITCH' if self.kernel_version >= (4,15) else None\n\t\treturn [(0x1ebe, 'switch_endian', exc.name, (), kconf)]\n\n\tdef syscall_def_regexp(self, syscall_name: Optional[str]=None) -> Optional[str]:\n\t\tif self.abi != 'ppc32':\n\t\t\treturn None\n\n\t\tif syscall_name is not None:\n\t\t\treturn rf'\\bPPC32_SYSCALL_DEFINE\\d\\s*\\({syscall_name}\\b'\n\t\treturn r'\\bPPC32_SYSCALL_DEFINE\\d\\s*\\('\n"
  },
  {
    "path": "src/systrack/arch/riscv.py",
    "content": "from typing import Tuple, List, Optional\n\nfrom ..elf import Symbol, ELF, E_MACHINE\nfrom ..kconfig_options import VERSION_INF\nfrom ..type_hints import KernelVersion\nfrom ..utils import VersionedDict\n\nfrom .arch_base import Arch\n\nclass ArchRiscV(Arch):\n\tname = 'riscv'\n\tsyscall_num_reg = 'a7'\n\tsyscall_arg_regs = ('a0', 'a1', 'a2', 'a3', 'a4', 'a5')\n\n\tkconfig = VersionedDict((\n\t\t# kexec_load\n\t\t((5,13), VERSION_INF, 'KEXEC=y', ['MMU=y']),\n\t\t# seccomp\n\t\t((5,5) , (5,10)     , 'SECCOMP=y', []),\n\t\t# mbind, {migrate.move}_pages, {get,set}_mempolicy\n\t\t((5,12), VERSION_INF, 'NUMA=y', ['SMP=y', 'MMU=y']),\n\t))\n\n\tdef __init__(self, kernel_version: KernelVersion, abi: str, bits32: bool=False):\n\t\tsuper().__init__(kernel_version, abi, bits32)\n\t\tassert kernel_version >= (4,15), 'Linux only supports RISC-V from v4.15'\n\t\tassert self.abi in ('rv32', 'rv64')\n\n\t\tif self.abi == 'rv32':\n\t\t\tself.abi_bits32 = True\n\n\t\t\tif not self.bits32:\n\t\t\t\tassert self.kernel_version >= (5,19), 'Linux only supports compat RV32 from v5.19'\n\t\t\t\tself.compat = True\n\t\t\t\tself.syscall_table_name = 'compat_sys_call_table'\n\n\t\tif self.bits32:\n\t\t\tif self.kernel_version >= (6,8):\n\t\t\t\t# rv32_defconfig removed in v6.8\n\t\t\t\tself.config_targets = ('defconfig', '32-bit.config')\n\t\t\telif self.kernel_version >= (5,1):\n\t\t\t\tself.config_targets = ('rv32_defconfig',)\n\t\t\telse:\n\t\t\t\tself.config_targets = ('defconfig',)\n\n\t\t\t# No \"easy\" make target for 32-bit before 5.1. Need manual config.\n\t\t\tself.kconfig.add((4,15), (5,1) , '32BIT=y', [])\n\t\t\tself.kconfig.add((4,15), (5,1) , '64BIT=n', [])\n\t\t\tself.kconfig.add((4,15), (5,1) , 'ARCH_RV32I=y', [])\n\t\t\tself.kconfig.add((4,15), (5,1) , 'ARCH_RV64I=n', [])\n\t\t\tself.kconfig.add((4,15), (4,18), 'CPU_SUPPORTS_32BIT_KERNEL=y', [])\n\t\t\tself.kconfig.add((4,15), (4,18), 'CPU_SUPPORTS_64BIT_KERNEL=n', [])\n\t\telse:\n\t\t\tself.config_targets = ('defconfig',)\n\n\t\t\t# Enable compat ABI regardless (should be =y by default, but better\n\t\t\t# safe than sorry)\n\t\t\tself.kconfig.add((5,19), VERSION_INF, 'COMPAT=y', ['64BIT=y', 'MMU=y']),\n\t\t\t# kexec_file_load\n\t\t\tself.kconfig.add((5,19), (6,2)      , 'KEXEC_FILE=y', ['64BIT=y'])\n\t\t\tself.kconfig.add((5,19), (6,7)      , 'KEXEC_FILE=y', ['64BIT=y','MMU=y'])\n\t\t\tself.kconfig.add((6,7) , VERSION_INF, 'KEXEC_FILE=y', ['64BIT=y'])\n\n\n\t@staticmethod\n\tdef match(vmlinux: ELF) -> Optional[Tuple[bool,List[str]]]:\n\t\tif vmlinux.e_machine != E_MACHINE.EM_RISCV:\n\t\t\treturn None\n\n\t\tif vmlinux.bits32:\n\t\t\tabis = ['rv32']\n\t\telse:\n\t\t\tabis = ['rv64']\n\n\t\t\tif 'compat_sys_call_table' in vmlinux.symbols:\n\t\t\t\tabis.append('rv32')\n\n\t\treturn vmlinux.bits32, abis\n\n\tdef matches(self, vmlinux: ELF) -> bool:\n\t\treturn (\n\t\t\tvmlinux.e_machine == E_MACHINE.EM_RISCV\n\t\t\tand vmlinux.bits32 == self.bits32\n\t\t)\n\n\tdef _preferred_symbol(self, a: Symbol, b: Symbol) -> Optional[Symbol]:\n\t\tif a.name.startswith('__riscv_'):\n\t\t\treturn a\n\t\tif b.name.startswith('__riscv_'):\n\t\t\treturn b\n\t\treturn None\n"
  },
  {
    "path": "src/systrack/arch/s390.py",
    "content": "import re\nimport struct\nfrom typing import Tuple, List, Optional, Dict\n\nfrom ..elf import Symbol, ELF, E_MACHINE\nfrom ..kconfig_options import VERSION_INF\nfrom ..type_hints import KernelVersion\nfrom ..utils import VersionedDict, noprefix\n\nfrom .arch_base import Arch\n\nclass ArchS390(Arch):\n\tname               = 's390'\n\tsyscall_table_name = 'sys_call_table'\n\tsyscall_num_reg    = 'r1'\n\tsyscall_arg_regs   = ('r2', 'r3', 'r4', 'r5', 'r6', 'r7')\n\n\tkconfig = VersionedDict((\n\t\t# TODO: validate and see which ones of these (if any) may make sense to\n\t\t# move in global kconfig options.\n\t\t# 32-bit abi\n\t\t((2,6,12), VERSION_INF, 'COMPAT=y', []),\n\t\t# error: invalid hard register usage between output operands\n\t\t((2,6,19), VERSION_INF, 'ZCRYPT=n', []),\n\t\t# Error: junk at end of line\n\t\t((2,6,37), VERSION_INF, 'JUMP_LABEL=n', []),\n\t\t# s390-specific pci syscalls implemented in\n\t\t# commit cd24834130ac (\"s390/pci: base support\")\n\t\t((3,8), VERSION_INF, 'PCI=y', []),\n\t\t# misaligned symbol `__nospec_call_start'\n\t\t((4,16), VERSION_INF, 'EXPOLINE=n', []),\n\t\t# load BTF from vmlinux: Invalid argument\n\t\t((5,16), (6,0), 'DEBUG_INFO_BTF=n', []),\n\t))\n\n\tdef __init__(self, kernel_version: KernelVersion, abi: str, bits32: bool = False):\n\t\tassert not bits32, f'{self.__class__.__name__} is 64-bit only'\n\t\tsuper().__init__(kernel_version, abi, False)\n\n\t\tassert self.abi in ('s390', 's390x')\n\t\tif self.abi == 's390':\n\t\t\tself.compat = True\n\t\t\tself.abi_bits32 = True\n\t\t\tself.syscall_table_name = 'sys_call_table_emu'\n\n\t@staticmethod\n\tdef match(vmlinux: ELF) -> Optional[Tuple[bool,List[str]]]:\n\t\tif vmlinux.e_machine != E_MACHINE.EM_S390:\n\t\t\treturn None\n\n\t\tassert not vmlinux.bits32, 'EM_S390 32-bit? WAT'\n\n\t\tif 'sys_call_table_emu' in vmlinux.symbols:\n\t\t\tabis = ['s390', 's390x']\n\t\telse:\n\t\t\tabis = ['s390x']\n\n\t\treturn False, abis\n\n\tdef matches(self, vmlinux: ELF) -> bool:\n\t\treturn not vmlinux.bits32 and vmlinux.e_machine == E_MACHINE.EM_S390\n\n\tdef _preferred_symbol(self, a: Symbol, b: Symbol) -> Optional[Symbol]:\n\t\t# See commit aa0d6e70d3b34e710a6a57a53a3096cb2e0ea99f\n\t\tif a.name.startswith('__s390x_'):\n\t\t\treturn a\n\t\tif b.name.startswith('__s390x_'):\n\t\t\treturn b\n\t\treturn None\n\n\tdef _translate_syscall_symbol_name(self, sym_name: str) -> str:\n\t\tif self.abi == 's390':\n\t\t\t# sys_ prefix is used for compat syscalls with 0 arguments, which\n\t\t\t# do not need wrapping. It is not common enough to be detected by\n\t\t\t# common_syscall_symbol_prefixes().\n\t\t\treturn noprefix(sym_name, 'sys_')\n\t\treturn sym_name\n\n\tdef _normalize_syscall_name(self, name: str) -> str:\n\t\t# Unlike most other archs where there is an arch-specific prefix for a\n\t\t# significant number of (or nearly all) syscalls, in S390 this prefix\n\t\t# is actually part of the syscall name for some arch-specific syscalls.\n\t\t# Use a whitelist approach instead of blindly stripping it. These\n\t\t# syscalls are also named using the prefix in man section 2.\n\t\tknown = {\n\t\t\t's390_guarded_storage',\n\t\t\t's390_pci_mmio_read',\n\t\t\t's390_pci_mmio_write',\n\t\t\t's390_runtime_instr',\n\t\t\t's390_sthyi',\n\t\t}\n\n\t\tif name.startswith('s390_') and name not in known:\n\t\t\treturn noprefix(name, 's390_')\n\t\treturn name\n\n\tdef have_syscall_table(self) -> bool:\n\t\t# FIXME: This is not true, we do have a table, it just requires custom\n\t\t# parsing. Move parsing logic in Arch class?\n\t\treturn False\n\n\tdef extract_syscall_vaddrs(self, vmlinux: ELF) -> Dict[int, int]:\n\t\tsymbol = vmlinux.symbols[self.syscall_table_name]\n\t\tsize = symbol.size\n\t\tif size == 0:\n\t\t\t# FIXME: In case of 32-bit (abi=='s390') we calculate the size of\n\t\t\t# sys_call_table, but then look at sys_call_table_emu. Can we do any\n\t\t\t# better?\n\t\t\t# sys_call_table_emu immediately follows sys_call_table.\n\t\t\t# See arch/s390/kernel/entry.S.\n\t\t\tsize = (vmlinux.symbols['sys_call_table_emu'].vaddr -\n\t\t\t\t\tvmlinux.symbols['sys_call_table'].vaddr)\n\t\tentry_size, format = 8, \"Q\"\n\t\tentry0 = vmlinux.vaddr_read(symbol.vaddr, entry_size)\n\t\tvaddr0, = struct.unpack(f\">{format}\", entry0)\n\t\ttext = vmlinux.sections[\".text\"]\n\t\tif not (text.vaddr <= vaddr0 < text.vaddr + text.size):\n\t\t\t# s390 before commit ff4a742dde3c stored vaddrs as ints, because\n\t\t\t# they were guaranteed to be < 4G before relocatable kernel support\n\t\t\t# was added.\n\t\t\tentry_size, format = 4, \"I\"\n\t\tcount = size // entry_size\n\t\ttable = vmlinux.vaddr_read(symbol.vaddr, size)\n\t\tvaddrs = struct.unpack(\">\" + format * count, table)\n\t\treturn dict(enumerate(vaddrs))\n\n\tdef syscall_def_regexp(self, syscall_name: Optional[str]=None) -> Optional[str]:\n\t\tif self.abi == 's390':\n\t\t\tif syscall_name is None:\n\t\t\t\treturn r'\\bCOMPAT_SYSCALL_WRAP\\d\\s*\\('\n\t\t\telse:\n\t\t\t\treturn rf'\\bCOMPAT_SYSCALL_WRAP\\d\\s*\\({syscall_name}\\b'\n\t\telse:\n\t\t\treturn None\n"
  },
  {
    "path": "src/systrack/arch/x86.py",
    "content": "import logging\nfrom collections import defaultdict\nfrom operator import itemgetter\nfrom typing import Tuple, List, Dict, DefaultDict, Set, FrozenSet, Optional\n\nfrom iced_x86 import Decoder, Instruction\nfrom iced_x86.Mnemonic import Mnemonic, RET, CMP, TEST, JA, JAE, JB, JBE, JE, JNE\nfrom iced_x86.OpKind import REGISTER\n\nfrom ..elf import Symbol, ELF, E_MACHINE\nfrom ..kconfig_options import VERSION_ZERO, VERSION_INF\nfrom ..syscall import Syscall\nfrom ..type_hints import KernelVersion\nfrom ..utils import VersionedDict, noprefix\n\nfrom .arch_base import Arch\n\nclass ArchX86(Arch):\n\tname = 'x86'\n\n\tkconfig = VersionedDict((\n\t\t# Disable retpoline mitigations for better compiler compatibility\n\t\t((4,15)  , VERSION_INF, 'RETPOLINE=n'         , []),\n\t\t# kexec_load\n\t\t((2,6,13), (2,6,19)   , 'KEXEC=y'             , ['EXPERIMENTAL=y']),\n\t\t((2,6,19), VERSION_INF, 'KEXEC=y'             , []),\n\t\t# seccomp\n\t\t((2,6,12), (2,6,24)   , 'SECCOMP=y'           , ['PROC_FS=y']),\n\t\t((2,6,24), (5,10)     , 'SECCOMP=y'           , []),\n\t\t# iopl, ioperm (x86 only)\n\t\t((5,5)   , VERSION_INF, 'X86_IOPL_IOPERM=y'   , []),\n\t\t# modify_ldt\n\t\t((4,3)   , VERSION_INF, 'MODIFY_LDT_SYSCALL=y', []),\n\t\t((4,3)   , VERSION_INF, 'MODIFY_LDT_SYSCALL=y', []),\n\t))\n\n\tkconfig_syscall_deps = VersionedDict((\n\t\t(VERSION_ZERO, VERSION_INF, 'map_shadow_stack', 'X86_USER_SHADOW_STACK'           ),\n\t\t(VERSION_ZERO, VERSION_INF, 'pkey_alloc'      , 'X86_INTEL_MEMORY_PROTECTION_KEYS'),\n\t\t(VERSION_ZERO, VERSION_INF, 'pkey_free'       , 'X86_INTEL_MEMORY_PROTECTION_KEYS'),\n\t\t(VERSION_ZERO, VERSION_INF, 'pkey_mprotect'   , 'X86_INTEL_MEMORY_PROTECTION_KEYS'),\n\t))\n\n\t# Numbers marked as \"64\" in syscall_64.tbl before v5.4 (when x64 and x32\n\t# still shared the same table), which should therefore NOT be used in x32\n\t# mode. These also include the (lower) x64 numbers for the misnumbered\n\t# 512-547 syscalls.\n\t#\n\t#     cat arch/x86/entry/syscalls/syscall_64.tbl | rg '\\t64' | cut -f1\n\t#\n\t__bad_x32_numbers = {\n\t\t13, 15, 16, 19, 20, 45, 46, 47, 54, 55, 59, 101, 127, 128, 129, 131,\n\t\t134, 156, 174, 177, 178, 180, 205, 206, 209, 211, 214, 215, 222, 236,\n\t\t244, 246, 247, 273, 274, 278, 279, 295, 296, 297, 299, 307, 310, 311,\n\t\t322, 327, 328\n\t}\n\n\tdef __init__(self, kernel_version: KernelVersion, abi: str, bits32: bool = False):\n\t\tsuper().__init__(kernel_version, abi, bits32)\n\t\tassert self.abi in ('x64', 'ia32', 'x32')\n\n\t\t# i386_defconfig and x86_64_defconfig don't exist before v2.6.24: need\n\t\t# a different configuration in such case. We'll think about it when (if)\n\t\t# we ever get to supporting such old kernels. Additionally, there were\n\t\t# two directories under arch before v2.6.24 (\"i386\" and \"x86_64\"), so\n\t\t# self.name should reflect that too too.\n\t\tassert self.kernel_version >= (2,6,24), 'kernel too old, sorry!'\n\n\t\t# Syscall tables are no longer guaranteed to exists since v6.9\n\t\t# (see commit 1e3ad78334a69b36e107232e337f9d693dcc9df2). We will\n\t\t# determine later in adjust_abi() if we actually have a table for the\n\t\t# selected ABI (in case of FTRACE_SYSCALLS=y we may have one).\n\t\tif self.kernel_version < (6,9):\n\t\t\tself.syscall_table_name = 'sys_call_table'\n\n\t\t\tif not self.bits32:\n\t\t\t\tif self.abi == 'ia32':\n\t\t\t\t\tself.syscall_table_name = 'ia32_sys_call_table'\n\t\t\t\telif self.abi == 'x32' and self.kernel_version >= (5,4):\n\t\t\t\t\tself.syscall_table_name = 'x32_sys_call_table'\n\t\telse:\n\t\t\tself.syscall_table_name = None\n\n\t\tif self.abi == 'ia32':\n\t\t\tself.syscall_num_reg  = 'eax'\n\t\t\tself.syscall_arg_regs = ('ebx', 'ecx', 'edx', 'esi', 'edi', 'ebp')\n\t\telse:\n\t\t\tself.syscall_num_reg  = 'rax'\n\t\t\tself.syscall_arg_regs = ('rdi', 'rsi', 'rdx', 'r10', 'r8', 'r9')\n\n\t\tif self.bits32:\n\t\t\tassert self.abi == 'ia32'\n\t\t\tself.abi_bits32     = True\n\t\t\tself.config_targets = ('i386_defconfig',)\n\n\t\t\t# vm86 (x86 only, 32-bit only, no compat support in 64-bit kernels)\n\t\t\tself.kconfig.add((2,6,16), (2,6,18)   , 'VM86=y'           , ['X86=y', 'EMBEDDED=y']),\n\t\t\tself.kconfig.add((2,6,18), (2,6,24)   , 'VM86=y'           , ['EMBEDDED=y']),\n\t\t\tself.kconfig.add((2,6,24), (4,3)      , 'VM86=y'           , ['X86_32=y', 'EXPERT=y']),\n\t\t\tself.kconfig.add((4,3)   , VERSION_INF, 'X86_LEGACY_VM86=y', ['X86_32=y']),\n\t\t\tself.kconfig.add((4,3)   , VERSION_INF, 'X86_LEGACY_VM86=y', ['X86_32=y']),\n\t\t\t# Needed for NUMA=y (NUMA support dropped in v6.15)\n\t\t\tself.kconfig.add(VERSION_ZERO, (6,15), 'NOHIGHMEM=n', [])\n\t\t\tself.kconfig.add(VERSION_ZERO, (6,15), 'HIGHMEM4G=n', [])\n\t\t\tself.kconfig.add(VERSION_ZERO, (6,15), 'HIGHMEM64G=y', [])\n\t\t\tself.kconfig.add(VERSION_ZERO, (6,15), 'X86_BIGSMP=y', ['SMP=y'])\n\t\t\t# mbind, migrate_pages, {get,set}_mempolicy\n\t\t\t#   NOTE: before v2.6.29 NUMA actually also needs more options in\n\t\t\t#   OR, but we don't support checking kconfig expressions\n\t\t\tself.kconfig.add(VERSION_ZERO, (2,6,23), 'NUMA=y', ['SMP=y', 'HIGHMEM64G=y'])\n\t\t\tself.kconfig.add((2,6,23)    , (2,6,29), 'NUMA=y', ['SMP=y', 'HIGHMEM64G=y', 'EXPERIMENTAL=y'])\n\t\t\tself.kconfig.add((2,6,29)    , (6,15)  , 'NUMA=y', ['SMP=y', 'HIGHMEM64G=y', 'X86_BIGSMP=y'])\n\t\telse:\n\t\t\tself.abi_bits32       = self.abi == 'ia32'\n\t\t\tself.compat           = self.abi != 'x64'\n\t\t\tself.config_targets   = ('x86_64_defconfig',)\n\n\t\t\tif self.abi == 'x32':\n\t\t\t\t# x32 syscalls have this bit set (__X32_SYSCALL_BIT)\n\t\t\t\tself.syscall_num_base = 0x40000000\n\n\t\t\t# x86-64 supports all ABIs: ia32, x64, x32. Enable all of them, we\n\t\t\t# will be able to extract the right syscall table regardless.\n\t\t\tself.kconfig.add(VERSION_ZERO, VERSION_INF, 'IA32_EMULATION=y', [])\n\t\t\tself.kconfig.add((3,4)       , (3,9)      , 'X86_X32=y'       , ['EXPERIMENTAL=y'])\n\t\t\tself.kconfig.add((3,9)       , (5,18)     , 'X86_X32=y'       , [])\n\t\t\tself.kconfig.add((5,18)      , VERSION_INF, 'X86_X32_ABI=y'   , [])\n\n\t\t\t# kexec_file_load\n\t\t\tself.kconfig.add((3,17)      , VERSION_INF, 'KEXEC_FILE=y', ['X86_64=y', 'CRYPTO=y', 'CRYPTO_SHA256=y'])\n\t\t\t# mbind, migrate_pages, {get,set}_mempolicy\n\t\t\tself.kconfig.add(VERSION_ZERO, (2,6,15)   , 'NUMA=y', [])\n\t\t\tself.kconfig.add((2,6,15)    , (2,6,29)   , 'NUMA=y', ['SMP=y'])\n\t\t\tself.kconfig.add((2,6,29)    , VERSION_INF, 'NUMA=y', ['SMP=y'])\n\t\t\t# pkey_alloc, pkey_free, pkey_mprotect\n\t\t\t#   NOTE: in theory depends on (CPU_SUP_INTEL || CPU_SUP_AMD) but we\n\t\t\t#   are pretty sure that CPU_SUP_INTEL will be =y\n\t\t\tself.kconfig.add((4,6)       , VERSION_INF, 'X86_INTEL_MEMORY_PROTECTION_KEYS=y', ['X86_64=y', 'CPU_SUP_INTEL=y'])\n\t\t\t# map_shadow_stack\n\t\t\t#   NOTE: depends on assembler support for WRUSS instruction\n\t\t\t#   (GNU binutils >= 2.31)\n\t\t\tself.kconfig.add((6,6)       , VERSION_INF, 'X86_USER_SHADOW_STACK=y', ['AS_WRUSS=y'])\n\n\t@staticmethod\n\tdef match(vmlinux: ELF) -> Optional[Tuple[bool,List[str]]]:\n\t\tif vmlinux.e_machine == E_MACHINE.EM_386:\n\t\t\tassert vmlinux.bits32, 'EM_386 64-bit? WAT'\n\t\telif vmlinux.e_machine == E_MACHINE.EM_X86_64:\n\t\t\tassert not vmlinux.bits32, 'EM_X86_64 32-bit? WAT'\n\t\telse:\n\t\t\treturn None\n\n\t\tif vmlinux.bits32:\n\t\t\tabis = ['ia32']\n\t\telse:\n\t\t\tabis = ['x64']\n\n\t\t\tif 'ia32_sys_call_table' in vmlinux.symbols:\n\t\t\t\tabis.append('ia32')\n\t\t\telif 'ia32_sys_call' in vmlinux.symbols:\n\t\t\t\t# Since v6.9 no more tables, but we have this function instead\n\t\t\t\tabis.append('ia32')\n\n\t\t\tif 'x32_sys_call_table' in vmlinux.symbols:\n\t\t\t\tabis.append('x32')\n\t\t\telif 'x32_sys_call' in vmlinux.symbols:\n\t\t\t\t# Since v6.9 no more tables, but we have this function instead\n\t\t\t\tabis.append('x32')\n\t\t\telif any('x32_compat_sys' in s for s in vmlinux.symbols):\n\t\t\t\t# Before v5.4 x32 did NOT have its own table\n\t\t\t\tabis.append('x32')\n\n\t\treturn vmlinux.bits32, abis\n\n\tdef matches(self, vmlinux: ELF) -> bool:\n\t\treturn (\n\t\t\tvmlinux.e_machine == (E_MACHINE.EM_X86_64, E_MACHINE.EM_386)[self.bits32]\n\t\t\tand vmlinux.bits32 == self.bits32\n\t\t)\n\n\tdef adjust_abi(self, vmlinux: ELF):\n\t\tif self.kernel_version < (6,9):\n\t\t\treturn\n\n\t\t# Figure out if we have a syscall table (FTRACE_SYSCALLS=y) or not. The\n\t\t# sys_call_table symbol represents the x64 table for 64-bit and the ia32\n\t\t# table for 32-bit. There is no ia32 nor x32 table for 64-bit kernels.\n\t\tif 'sys_call_table' in vmlinux.symbols and not self.compat:\n\t\t\tself.syscall_table_name = 'sys_call_table'\n\n\t__is_ia32_name = staticmethod(lambda n: n.startswith('__ia32_')) # __ia32_[compat_]sys_xxx\n\t__is_x64_name  = staticmethod(lambda n: n.startswith('__x64_'))  # __x64_[compat_]sys_xxx\n\t__is_x32_name  = staticmethod(lambda n: n.startswith('__x32_'))  # __x32_compat_sys_xxx\n\n\tdef _preferred_symbol(self, a: Symbol, b: Symbol) -> Optional[Symbol]:\n\t\t# Try preferring the symbol with the right ABI in its prefix.\n\t\tna, nb = a.name, b.name\n\n\t\tif self.abi == 'ia32':\n\t\t\tif self.__is_ia32_name(na): return a\n\t\t\tif self.__is_ia32_name(nb): return b\n\t\t\tif self.__is_x64_name(na): return a\n\t\t\tif self.__is_x64_name(nb): return b\n\t\t\tif not na.islower(): return b\n\t\t\tif not nb.islower(): return a\n\t\t\treturn None\n\n\t\tif self.abi == 'x32':\n\t\t\tif self.__is_x32_name(na): return a\n\t\t\tif self.__is_x32_name(nb): return b\n\n\t\tif self.__is_x64_name(na): return a\n\t\tif self.__is_x64_name(nb): return b\n\t\tif self.__is_ia32_name(na): return b\n\t\tif self.__is_ia32_name(nb): return a\n\t\tif not na.islower(): return b\n\t\tif not nb.islower(): return a\n\t\treturn None\n\n\tdef skip_syscall(self, sc: Syscall) -> bool:\n\t\t# Syscalls 512 through 547 are historically misnumbered and x32 only,\n\t\t# see comment in v5.10 arch/x86/entry/syscalls/syscall_64.tbl.\n\t\t#\n\t\t# x32 should only use the x32 numbers (512-547) ORed with the special\n\t\t# __X32_SYSCALL_BIT, and NOT the x64 numbers for the same syscalls.\n\t\t# x64 should use the x64 numbers and NOT the x32 numbers (512-547) for\n\t\t# the same syscalls.\n\t\t#\n\t\t# The checks performed by the kernel (mostly in do_syscall_64() under\n\t\t# arch/x86/entry/common.c) however are completely idiotic, and the fact\n\t\t# that before v5.4 there is only one syscall table for both x64 and x32\n\t\t# does not help: this makes it technically possible to mix up the\n\t\t# numbers in funny ways.\n\t\t#\n\t\t# In fact, in v5.3, execve can be called using *four* different numbers\n\t\t# from both x64 and x32 mode (determining which number/mode combination\n\t\t# will result in rax=-EFAULT is left as an exercise to the reader):\n\t\t#\n\t\t#   1. 0x3b      : the x64 number\n\t\t#                  (techincally only correct for x64 mode)\n\t\t#   2. 0x208     : the x32 number without __X32_SYSCALL_BIT set\n\t\t#                  (techincally incorrect in both modes)\n\t\t#   3. 0x4000003b: the x64 number with __X32_SYSCALL_BIT set\n\t\t#                  (techincally incorrect in both modes)\n\t\t#   4. 0x40000208: the x32 number with __X32_SYSCALL_BIT set\n\t\t#                  (techincally only correct for x32 mode)\n\t\t#\n\t\t# In v5.4 (commit 6365b842aae4490ebfafadfc6bb27a6d3cc54757) a separate\n\t\t# x32 syscall table was introduced to try and make things less\n\t\t# confusing. After this commit, options 2 and 3 above give -ENOSYS,\n\t\t# while 1 and 4 both work (again, try to guess which number/mode combo\n\t\t# will result in rax=-EFAULT).\n\t\t#\n\t\tif self.abi == 'x64' and 512 <= sc.number <= 547:\n\t\t\t# x64 cannot use x32 numbers even though they are in the table\n\t\t\treturn True\n\n\t\tif self.abi == 'x32':\n\t\t\tif self.kernel_version >= (5,4):\n\t\t\t\t# We have our own table, anything we find there is acceptable\n\t\t\t\treturn False\n\n\t\t\tif (sc.number & ~0x40000000) in self.__bad_x32_numbers:\n\t\t\t\t# x32 should NOT use these!\n\t\t\t\treturn True\n\n\t\tif self.abi == 'ia32':\n\t\t\t# vm86 and vm86old are only available in 32-bit kernels, but might\n\t\t\t# still be implemented as simple wrappers that print a warning to\n\t\t\t# dmesg and return -ENOSYS in 64-bit kernels, so ignore them\n\t\t\tif not self.bits32 and sc.number in (113, 166):\n\t\t\t\treturn True\n\n\t\t\t# pkey_{alloc,free,mprotect} are available for compat ia32 on\n\t\t\t# 64-bit, but not for 32-bit kernels (on x86 they depend X86_64=y),\n\t\t\t# so avoid wasting time with these\n\t\t\tif self.bits32 and sc.number in (380, 381, 382):\n\t\t\t\treturn True\n\n\t\treturn False\n\n\tdef _translate_syscall_symbol_name(self, sym_name: str) -> str:\n\t\t# For whatever reason some syscalls are wrapped in assembly at the entry\n\t\t# point e.g. in v4.0 stub_execve in arch/x86/kernel/entry_64.S or\n\t\t# stub32_execve in arch/x86/ia32/ia32entry.S. These stubs with prefix\n\t\t# \"stub[32]_\" make calls to the actual syscall function.\n\t\t#\n\t\t# Removing the prefix helps locate the actual syscall definition through\n\t\t# source code grepping IFF they do not have any other prefix/suffix in\n\t\t# the source (stub_fork -> fork -> easily find SYSCALL_DEFINE0(fork)).\n\t\t#\n\t\t# In some cases this is not enough though, because the actual function\n\t\t# has another prefix: e.g. stub_rt_sigreturn, which calls\n\t\t# sys_rt_sigreturn, defined as `asmlinkage long sys_rt_sigreturn`\n\t\t# and not `asmlinkage long rt_sigreturn` or\n\t\t# `SYSCALL_DEFINE0(rt_sigreturn)`. Kind of a bummer, but I don't really\n\t\t# want to become insane to accomodate all these quirks.\n\t\treturn noprefix(sym_name, 'stub32_', 'stub_')\n\n\tdef _normalize_syscall_name(self, name: str) -> str:\n\t\t# E.g. v5.18 COMPAT_SYSCALL_DEFINE1(ia32_mmap, ...)\n\t\treturn noprefix(name, 'ia32_', 'x86_', 'x32_')\n\n\tdef _dummy_syscall_code(self, sc: Syscall, vmlinux: ELF) -> Optional[bytes]:\n\t\t# Check if the code of the syscall only consists of\n\t\t# `MOV rax/eax, -ENOSYS/-EINVAL` followed by a RET or relative JMP and\n\t\t# optionally preceded by an ENDBR64/32. E.G., lookup_dcookie in v6.3:\n\t\t#\n\t\t# <__x64_sys_lookup_dcookie>:\n\t\t#        f3 0f 1e fa             endbr64\n\t\t#        48 c7 c0 da ff ff ff    mov    rax,0xffffffffffffffda\n\t\t#        e9 74 8d 90 00          jmp    ffffffff819b8b84 <__x86_return_thunk>\n\t\t#\n\t\t# TODO: relies on the symbol having a valid size (!= 0), improve?\n\t\tsz = sc.symbol.size\n\t\tif sz < 6 or sz > 16:\n\t\t\treturn None\n\n\t\torig = code = vmlinux.read_symbol(sc.symbol)\n\t\tbad_imm = (b'\\xda\\xff\\xff\\xff', b'\\xea\\xff\\xff\\xff')\n\n\t\t# endbr64/endbr32\n\t\tif code.startswith(b'\\xf3\\x0f\\x1e\\xfa') or code.startswith(b'\\xf3\\x0f\\x1e\\xfb'):\n\t\t\tcode = code[4:]\n\t\t\tsz -= 4\n\n\t\t# 32-bit kernel\n\t\tif code[:1] == b'\\xb8' and code[1:5] in bad_imm: # mov eax, -ENOSYS/-EINVAL\n\t\t\tif sz == 6  and code[5] == 0xc3: return orig # ret\n\t\t\tif sz == 7  and code[5] == 0xeb: return orig # jmp rel8\n\t\t\tif sz == 10 and code[5] == 0xe9: return orig # jmp rel32\n\n\t\t# 64-bit kernel\n\t\tif code[:3] == b'\\x48\\xc7\\xc0' and code[3:7] in bad_imm: # mov rax, -ENOSYS/-EINVAL\n\t\t\tif sz == 8  and code[7] == 0xc3: return orig # ret\n\t\t\tif sz == 9  and code[7] == 0xeb: return orig # jmp rel8\n\t\t\tif sz == 12 and code[7] == 0xe9: return orig # jmp rel32\n\n\t\treturn None\n\n\tdef __emulate_syscall_switch(self, func: Symbol, func_code: bytes) -> Optional[Tuple[DefaultDict[int,Set[int]],Set[Instruction]]]:\n\t\tstart = func.real_vaddr\n\t\tend   = func.real_vaddr + func.size\n\t\tinsns = list(Decoder(32 if self.bits32 else 64, func_code, ip=start))\n\n\t\t# Register used to hold syscall number\n\t\tnr_reg = None\n\n\t\t# Assume first compared register holds syscall number\n\t\tfor insn in insns:\n\t\t\tif insn.op_code().mnemonic in (CMP, TEST):\n\t\t\t\tfor i in range(insn.op_count):\n\t\t\t\t\tif insn.op_kind(i) == REGISTER:\n\t\t\t\t\t\tnr_reg = insn.op_register(i)\n\t\t\t\t\t\tbreak\n\n\t\t\t\tif nr_reg is not None:\n\t\t\t\t\tbreak\n\n\t\tif nr_reg is None:\n\t\t\tlogging.error('Could not find syscall number register')\n\t\t\treturn None\n\n\t\t# Supported Jcc instructions\n\t\tjccs = {JA, JAE, JB, JBE, JE, JNE}\n\t\t# Maximum syscall number supported plus 1\n\t\tnr_max = 0x1000\n\t\t# Possible syscall numbers at a given address (instruction pointer)\n\t\tnrs: DefaultDict[int,FrozenSet[int]] = defaultdict(frozenset, {start: frozenset(range(nr_max))})\n\t\t# Candidate branches to syscall functions\n\t\tcandidate_insns: Set[Instruction] = set()\n\t\t# Accumulate non-NOP skipped insns for logging/debugging purposes\n\t\tskipped_insns: DefaultDict[Instruction,int] = defaultdict(int)\n\n\t\tkeep_going = True\n\t\titeration = 0\n\n\t\t# Symbolically trace the function code to determine the possible syscall\n\t\t# numbers and the instructions that lead to them\n\t\twhile keep_going:\n\t\t\titeration += 1\n\t\t\tkeep_going = False\n\n\t\t\tinvert_condition = False\n\t\t\tmnemonic: Optional[Mnemonic] = None\n\t\t\tlast_cmp_immediate: Optional[int] = None\n\n\t\t\tfor insn in insns:\n\t\t\t\tip            = insn.ip\n\t\t\t\tnext_ip       = insn.next_ip\n\t\t\t\tprev_mnemonic = mnemonic\n\t\t\t\tmnemonic      = insn.op_code().mnemonic\n\t\t\t\tcur_nrs       = nrs[ip]\n\n\t\t\t\t# Only support a TEST that appears right before JE/JNE, which is\n\t\t\t\t# functionally equal to a CMP with 0.\n\t\t\t\tif prev_mnemonic == TEST and mnemonic not in (JE, JNE):\n\t\t\t\t\tlogging.error('Unsupported instruction after TEST: %#x: %r', ip, insn)\n\t\t\t\t\treturn None\n\n\t\t\t\tif mnemonic == RET:\n\t\t\t\t\tcontinue\n\n\t\t\t\tif mnemonic == TEST:\n\t\t\t\t\tif insn.op0_kind != REGISTER or insn.op1_kind != REGISTER:\n\t\t\t\t\t\tlogging.error('Unsupported TEST instruction %#x: %r', ip, insn)\n\t\t\t\t\t\treturn None\n\n\t\t\t\t\t# Treat `TEST reg, reg` as `CMP reg, 0`. We make sure that\n\t\t\t\t\t# this is the only possible case above.\n\t\t\t\t\tlast_cmp_immediate = 0\n\t\t\t\t\tnrs[next_ip] |= cur_nrs\n\t\t\t\t\tcontinue\n\n\t\t\t\tif mnemonic == CMP:\n\t\t\t\t\tif insn.op0_kind == REGISTER:\n\t\t\t\t\t\treg = insn.op0_register\n\t\t\t\t\t\timm_op_idx = 1\n\t\t\t\t\t\tinvert_condition = False\n\t\t\t\t\telif insn.op1_kind == REGISTER:\n\t\t\t\t\t\treg = insn.op1_register\n\t\t\t\t\t\timm_op_idx = 0\n\t\t\t\t\t\tinvert_condition = True\n\t\t\t\t\telse:\n\t\t\t\t\t\t# Should not happen, but guard against it anyway.\n\t\t\t\t\t\timm_op_idx = None\n\n\t\t\t\t\ttry:\n\t\t\t\t\t\tlast_cmp_immediate = insn.immediate(imm_op_idx)\n\t\t\t\t\texcept (ValueError, TypeError):\n\t\t\t\t\t\tlogging.error('Unsupported CMP instruction %#x: %r', ip, insn)\n\t\t\t\t\t\treturn None\n\n\t\t\t\t\tif reg != nr_reg:\n\t\t\t\t\t\tlogging.error('Unexpected register in CMP instruction '\n\t\t\t\t\t\t\t'%#x: %r', ip, insn)\n\t\t\t\t\t\treturn None\n\n\t\t\t\t\tnrs[next_ip] |= cur_nrs\n\t\t\t\t\tcontinue\n\n\t\t\t\tnew_taken_nrs = frozenset()\n\t\t\t\tnew_not_taken_nrs = frozenset()\n\n\t\t\t\tif insn.is_jmp_short_or_near:\n\t\t\t\t\ttarget_ip = insn.near_branch_target\n\t\t\t\t\tnew_taken_nrs = cur_nrs\n\t\t\t\telif insn.is_jcc_short_or_near:\n\t\t\t\t\tif mnemonic not in jccs:\n\t\t\t\t\t\tlogging.error('Unsupported Jcc instruction %#x: %r', ip, insn)\n\t\t\t\t\t\treturn None\n\t\t\t\t\tif last_cmp_immediate is None:\n\t\t\t\t\t\tlogging.error('No previous CMP/TEST instruction for Jcc: '\n\t\t\t\t\t\t\t'%#x: %r', ip, insn)\n\t\t\t\t\t\treturn None\n\n\t\t\t\t\ttarget_ip = insn.near_branch_target\n\n\t\t\t\t\tif mnemonic == JA:\n\t\t\t\t\t\ttaken_filter = frozenset(range(last_cmp_immediate + 1, nr_max))\n\t\t\t\t\telif mnemonic == JAE:\n\t\t\t\t\t\ttaken_filter = frozenset(range(last_cmp_immediate, nr_max))\n\t\t\t\t\telif mnemonic == JB:\n\t\t\t\t\t\ttaken_filter = frozenset(range(last_cmp_immediate))\n\t\t\t\t\telif mnemonic == JBE:\n\t\t\t\t\t\ttaken_filter = frozenset(range(last_cmp_immediate + 1))\n\t\t\t\t\telif mnemonic == JE:\n\t\t\t\t\t\ttaken_filter = frozenset((last_cmp_immediate,))\n\t\t\t\t\telif mnemonic == JNE:\n\t\t\t\t\t\ttaken_filter = frozenset(range(0, last_cmp_immediate))\n\t\t\t\t\t\ttaken_filter |= frozenset(range(last_cmp_immediate + 1, nr_max))\n\n\t\t\t\t\tnew_taken_nrs = cur_nrs & taken_filter\n\t\t\t\t\tnew_not_taken_nrs = cur_nrs - taken_filter\n\n\t\t\t\t\tif invert_condition:\n\t\t\t\t\t\tnew_taken_nrs, new_not_taken_nrs = new_not_taken_nrs, new_taken_nrs\n\t\t\t\telif insn.is_call_near:\n\t\t\t\t\ttarget_ip = insn.near_branch_target\n\t\t\t\t\tnew_taken_nrs = cur_nrs\n\t\t\t\t\tif start <= target_ip < end:\n\t\t\t\t\t\tlogging.error('%s calling itself??? %r', func.name, insn)\n\t\t\t\t\t\treturn None\n\t\t\t\telse:\n\t\t\t\t\tif iteration == 1 and not insn.op_code().is_nop:\n\t\t\t\t\t\tskipped_insns[insn] += 1\n\n\t\t\t\t\t# YOLO\n\t\t\t\t\tnrs[next_ip] |= cur_nrs\n\t\t\t\t\tcontinue\n\n\t\t\t\t# We get here for JMP, Jcc and CALL near\n\t\t\t\tif start <= target_ip < end:\n\t\t\t\t\t# Branch target inside function\n\t\t\t\t\tif target_ip < ip:\n\t\t\t\t\t\t# Backward branch: new numbers may be added to the\n\t\t\t\t\t\t# target instruction, but we are already past it. In\n\t\t\t\t\t\t# such case, we'll need an additional iteration to\n\t\t\t\t\t\t# propagate the information.\n\t\t\t\t\t\tif not new_taken_nrs.issubset(nrs[target_ip]):\n\t\t\t\t\t\t\tkeep_going = True\n\t\t\t\telse:\n\t\t\t\t\t# Branch target outside function, assume it's a branch to a\n\t\t\t\t\t# syscall function\n\t\t\t\t\tcandidate_insns.add(insn)\n\n\t\t\t\tnrs[target_ip] |= new_taken_nrs\n\t\t\t\tnrs[next_ip] |= new_not_taken_nrs\n\n\t\tlogging.info('Symbolic emulation done in %d iteration%s', iteration,\n\t\t\t's'[:iteration ^ 1])\n\n\t\tif skipped_insns:\n\t\t\tn_skipped = sum(skipped_insns.values())\n\t\t\tskipped = sorted(skipped_insns.items(), key=itemgetter(1, 0), reverse=True)\n\t\t\tskipped = '; '.join((f'{i:r} (x{n})' for i, n in skipped))\n\t\t\tlogging.debug('Skipped %d instruction%s: %s', n_skipped,\n\t\t\t\t's'[:n_skipped ^ 1], skipped)\n\n\t\treturn nrs, candidate_insns\n\n\tdef extract_syscall_vaddrs(self, vmlinux: ELF) -> Dict[int,int]:\n\t\t# We need to go through a painful examination of the switch statement\n\t\t# implemented by {x64,x32,ia32}_sys_call():\n\t\t#\n\t\t#    #define __SYSCALL(nr, sym) case nr: return __x64_##sym(regs);\n\t\t#\n\t\t#    long x64_sys_call(const struct pt_regs *regs, unsigned int nr)\n\t\t#    {\n\t\t#        switch (nr) {\n\t\t#        #include <asm/syscalls_64.h>\n\t\t#        default: return __x64_sys_ni_syscall(regs);\n\t\t#        }\n\t\t#    }\n\t\t#\n\t\t# The switch statement on the second argument is implemented as a binary\n\t\t# search. Therefore, the generated instructions should simply be a bunch\n\t\t# of CMP/Jcc/JMP. No other implementation is supported right now.\n\t\t#\n\t\tassert self.syscall_table_name is None\n\n\t\tfunc_name = f'{self.abi}_sys_call'\n\t\tsym = vmlinux.functions.get(func_name)\n\t\tif sym is None:\n\t\t\tlogging.error('Could not find function %s', func_name)\n\t\t\treturn {}\n\n\t\tif sym.size < 0x10:\n\t\t\tlogging.error('%s is too small (%d bytes)', sym.name, sym.size)\n\t\t\treturn {}\n\n\t\tlogging.info('Extracting syscalls from code of %s() at %#x', sym.name,\n\t\t\tsym.real_vaddr)\n\n\t\tres = self.__emulate_syscall_switch(sym, vmlinux.read_symbol(sym))\n\t\tif res is None:\n\t\t\treturn {}\n\n\t\tnrs, candidate_insns = res\n\t\tvaddrs: Dict[int,int] = {}\n\t\tfound_default_case = False\n\n\t\tfor insn in candidate_insns:\n\t\t\t# Guaranteed to have .near_branch_target by the code in\n\t\t\t# __emulate_syscall_switch() above\n\t\t\tvaddr = insn.near_branch_target\n\t\t\tnumbers = nrs[vaddr]\n\n\t\t\tif len(numbers) == 0:\n\t\t\t\t# This should never happen, bail out\n\t\t\t\tlogging.error('Empty set of syscall numbers for %#x (target of '\n\t\t\t\t\t'%r). Unreachable!?', vaddr, insn)\n\t\t\t\treturn {}\n\n\t\t\tif len(numbers) > 100:\n\t\t\t\tlogging.debug('Default switch case at %#x (reachable %d '\n\t\t\t\t\t'times): %r => %#x is ni_syscall', insn.ip,\n\t\t\t\t\tlen(numbers), insn, vaddr)\n\n\t\t\t\tif found_default_case:\n\t\t\t\t\tlogging.error('Multiple default switch cases!?')\n\t\t\t\t\treturn {}\n\n\t\t\t\tfound_default_case = True\n\t\t\t\tcontinue\n\n\t\t\t# Let the caller handle de-duplication in case a single vaddr can be\n\t\t\t# reached by multiple syscall numbers\n\t\t\tfor nr in numbers:\n\t\t\t\tif nr in vaddrs:\n\t\t\t\t\tif vaddrs[nr] != vaddr:\n\t\t\t\t\t\tlogging.error('Number %d leads to multiple vaddrs!? '\n\t\t\t\t\t\t\t'Got %#x and %#x. Bailing out!', nr, vaddrs[nr], vaddr)\n\t\t\t\t\t\treturn {}\n\t\t\t\t\tcontinue\n\n\t\t\t\tvaddrs[nr] = vaddr\n\n\t\treturn vaddrs\n\n\tdef syscall_def_regexp(self, syscall_name: Optional[str]=None) -> Optional[str]:\n\t\tif self.abi != 'x32':\n\t\t\treturn None\n\n\t\tif syscall_name is not None:\n\t\t\tif syscall_name.startswith('sys32_x32_'):\n\t\t\t\treturn rf'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*{syscall_name}\\s*\\('\n\t\t\treturn rf'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*sys32_x32_{syscall_name}\\s*\\('\n\n\t\treturn r'\\basmlinkage\\s*(unsigned\\s+)?\\w+\\s*sys32_x32_\\w+\\s*\\('\n"
  },
  {
    "path": "src/systrack/elf.py",
    "content": "import re\n\nfrom enum import IntEnum\nfrom functools import lru_cache\nfrom pathlib import Path\nfrom struct import unpack\nfrom operator import attrgetter\nfrom collections import namedtuple\nfrom typing import Union, Dict, Optional\n\nfrom .utils import ensure_command\n\n# Only EM_* macros relevant for vmlinux ELFs\nclass E_MACHINE(IntEnum):\n\tEM_386     = 3   # x86\n\tEM_MIPS    = 8   # MIPS R3000 (32 or 64 bit)\n\tEM_PPC     = 20  # PowerPC 32-bit\n\tEM_PPC64   = 21\t # PowerPC 64-bit\n\tEM_S390    = 22  # IBM S/390\n\tEM_ARM     = 40  # ARM 32-bit\n\tEM_X86_64  = 62  # x86-64\n\tEM_AARCH64 = 183 # ARM 64-bit\n\tEM_RISCV   = 243 # RISC-V\n\n# Only EF_* macros that we actually use\nclass E_FLAGS(IntEnum):\n\tEF_ARM_EABI_MASK = 0xff000000\n\nSection = namedtuple('Section', ('name', 'vaddr', 'off', 'size'))\n_Symbol = namedtuple('_Symbol', ('vaddr', 'real_vaddr', 'size', 'type', 'name'))\n\n# NOTE: other code may assume that Symbol acts like a tuple. Think twice about\n# making this a full-fledged class and not a subclass of namedtuple. Classes are\n# not hashable and two classes only compare equal if they are both the exact\n# same instance.\nclass Symbol(_Symbol):\n\t'''Class representing an ELF symbol.\n\t'''\n\tdef __repr__(s):\n\t\tif s.real_vaddr == s.vaddr:\n\t\t\treturn f'Symbol(\"{s.name}\" at 0x{s.vaddr:x}, type={s.type}, size=0x{s.size:x})'\n\t\telse:\n\t\t\treturn f'Symbol(\"{s.name}\" at 0x{s.vaddr:x} (real 0x{s.real_vaddr:x}), type={s.type}, size=0x{s.size:x})'\n\nclass ELF:\n\t__slots__ = (\n\t\t'path', 'file', 'bits32', 'big_endian', 'e_machine', 'e_flags',\n\t\t'__sections', '__symbols', '__functions'\n\t)\n\n\tdef __init__(self, path: Union[str,Path]):\n\t\tself.path = Path(path)\n\t\tself.file        = self.path.open('rb')\n\t\tself.__sections  = None\n\t\tself.__symbols   = None\n\t\tself.__functions = None\n\n\t\tmagic, ei_class, ei_data = unpack('<4sBB', self.file.read(6))\n\n\t\tif magic != b'\\x7fELF':\n\t\t\traise ValueError(f'Invalid ELF magic: {magic!r}')\n\n\t\tif ei_class == 1:\n\t\t\tself.bits32 = True\n\t\telif ei_class == 2:\n\t\t\tself.bits32 = False\n\t\telse:\n\t\t\traise ValueError(f'Invalid ELF e_ident[EI_CLASS]: {ei_class}')\n\n\t\tif ei_data == 1:\n\t\t\tself.big_endian = False\n\t\telif ei_data == 2:\n\t\t\tself.big_endian = True\n\t\telse:\n\t\t\traise ValueError(f'Invalid ELF e_ident[EI_DATA]: {ei_data}')\n\n\t\tunpack_endian = '<>'[self.big_endian]\n\n\t\tassert self.file.seek(0x12) == 0x12\n\t\tself.e_machine = unpack(unpack_endian + 'H', self.file.read(2))[0]\n\n\t\tassert self.file.seek(0x24) == 0x24\n\t\tself.e_flags = unpack(unpack_endian + 'L', self.file.read(4))[0]\n\n\t@property\n\tdef sections(self) -> Dict[str,Section]:\n\t\tif self.__sections is not None:\n\t\t\treturn self.__sections\n\n\t\t# We actually only really care about SHT_PROGBITS or SHT_NOBITS\n\t\texp = re.compile(r'\\s([.\\w]+)\\s+(PROGBITS|NOBITS)\\s+([0-9a-fA-F]+)\\s+([0-9a-fA-F]+)\\s+([0-9a-fA-F]+)')\n\t\tout = ensure_command(['readelf', '-WS', self.path])\n\t\tsecs = {}\n\n\t\tfor match in exp.finditer(out):\n\t\t\tname, _, va, off, sz = match.groups()\n\t\t\tsecs[name] = Section(name, int(va, 16), int(off, 16), int(sz, 16))\n\n\t\tself.__sections = secs\n\t\treturn secs\n\n\t@property\n\tdef symbols(self) -> Dict[str, Symbol]:\n\t\tif self.__symbols is None:\n\t\t\tself.__extract_symbols()\n\t\treturn self.__symbols\n\n\t@property\n\tdef functions(self) -> Dict[str, Symbol]:\n\t\tif self.__functions is None:\n\t\t\tself.__extract_symbols()\n\t\treturn self.__functions\n\n\t@property\n\tdef has_debug_info(self) -> bool:\n\t\treturn '.debug_line' in self.sections\n\n\tdef __extract_symbols(self):\n\t\texp = re.compile(r'\\d+:\\s+([0-9a-fA-F]+)\\s+(\\d+)\\s+(\\w+).+\\s+(\\S+)$')\n\t\tout = ensure_command(['readelf', '-Ws', self.path]).splitlines()\n\t\tsyms = {}\n\t\tfuncs = {}\n\n\t\tfor line in out:\n\t\t\tmatch = exp.search(line)\n\t\t\tif not match:\n\t\t\t\tcontinue\n\n\t\t\tvaddr, sz, typ, name = match.groups()\n\t\t\tvaddr = real_vaddr = int(vaddr, 16)\n\n\t\t\t# Unaligned vaddr on ARM 32-bit means the function code is in\n\t\t\t# Thumb mode. Nonetheless, the actual code is aligned, so the\n\t\t\t# real vaddr is a multiple of 2.\n\t\t\tif self.e_machine == E_MACHINE.EM_ARM and typ == 'FUNC' and vaddr & 1:\n\t\t\t\treal_vaddr &= 0xfffffffe\n\n\t\t\tsym = Symbol(vaddr, real_vaddr, int(sz), typ, name)\n\t\t\tsyms[sym.name] = sym\n\n\t\t\tif typ == 'FUNC':\n\t\t\t\tfuncs[sym.name] = sym\n\n\t\tself.__symbols = syms\n\t\tself.__functions = funcs\n\n\tdef vaddr_to_file_offset(self, vaddr: int) -> int:\n\t\tfor sec in self.sections.values():\n\t\t\tif sec.vaddr <= vaddr < sec.vaddr + sec.size:\n\t\t\t\treturn sec.off + vaddr - sec.vaddr\n\t\traise ValueError('vaddr not in range of any known section')\n\n\tdef vaddr_read_string(self, vaddr: int) -> str:\n\t\toff = self.vaddr_to_file_offset(vaddr)\n\t\tassert self.file.seek(off) == off\n\n\t\tdata = self.file.read(1)\n\t\twhile data[-1]:\n\t\t\tdata += self.file.read(1)\n\t\treturn data[:-1].decode()\n\n\tdef vaddr_read(self, vaddr: int, size: int) -> bytes:\n\t\toff = self.vaddr_to_file_offset(vaddr)\n\t\tassert self.file.seek(off) == off\n\t\treturn self.file.read(size)\n\n\tdef read_symbol(self, sym: Union[str,Symbol]) -> bytes:\n\t\tif not isinstance(sym, Symbol):\n\t\t\tsym = self.symbols[sym]\n\n\t\treturn self.vaddr_read(sym.real_vaddr, sym.size)\n\n\t@lru_cache(maxsize=128)\n\tdef next_symbol(self, sym: Symbol) -> Optional[Symbol]:\n\t\t'''Find and return the symbol (if any) with the lowest real virtual\n\t\taddress higher than the one of sym.\n\t\t'''\n\t\tcandidates = filter(lambda s: s.real_vaddr > sym.real_vaddr, self.symbols.values())\n\n\t\ttry:\n\t\t\treturn min(candidates, key=attrgetter('vaddr'))\n\t\texcept ValueError:\n\t\t\treturn None\n"
  },
  {
    "path": "src/systrack/kconfig.py",
    "content": "#\n# Automatic kernel Kconfig configuration.\n#\n# This module contains utility functions to edit configuration options through\n# the kernel's `scripts/config` script, plus all arch-agnostig Kconfig options\n# needed.\n#\n\nimport logging\n\nfrom pathlib import Path\nfrom typing import List, Dict, Iterable, Optional\n\nfrom .arch import Arch\nfrom .kconfig_options import *\nfrom .type_hints import KernelVersion\nfrom .utils import anyprefix, ensure_command\n\ndef kconfig_debugging(kernel_version: KernelVersion) -> List[str]:\n\treturn KCONFIG_DEBUGGING[kernel_version]\n\ndef kconfig_compatibility(kernel_version: KernelVersion) -> List[str]:\n\treturn KCONFIG_COMPATIBILITY[kernel_version]\n\ndef kconfig_more_syscalls(kernel_version: KernelVersion) -> Dict[str,List[str]]:\n\treturn KCONFIG_MORE_SYSCALLS[kernel_version]\n\ndef kconfig_syscall_deps(syscall_name: str, kernel_version: KernelVersion, arch: Arch) -> str:\n\topt = arch.kconfig_syscall_deps[kernel_version].get(syscall_name)\n\topt = opt or KCONFIG_SYSCALL_DEPS[kernel_version].get(syscall_name)\n\treturn ('CONFIG_' + opt) if opt else None\n\ndef run_config_script(kdir: Path, config_file: Path, args: List[str]):\n\treturn ensure_command(['./scripts/config', '--file', config_file] + args, cwd=kdir)\n\nclass Kconfig:\n\tfile: Path\n\tkdir: Path\n\tconfig: Dict[str,Optional[str]]\n\t__slots__ = ['file', 'kdir', 'config']\n\n\tdef __init__(self, file: Path, kdir: Path):\n\t\tself.file = file\n\t\tself.kdir = kdir\n\t\tself.config = {}\n\t\tlines = map(str.strip, self.file.open().readlines())\n\n\t\tfor line in lines:\n\t\t\t# Unset is equivalent to =n, but keep track of it with None\n\t\t\tif line.startswith('# CONFIG_') and line.endswith(' is not set'):\n\t\t\t\tname = line[9:-11]\n\t\t\t\tself.config[name] = None\n\t\t\t\tcontinue\n\n\t\t\t# Skip empty lines and comments\n\t\t\tif not line or line.startswith('#'):\n\t\t\t\tcontinue\n\n\t\t\tname, val = line.split('=', 1)\n\t\t\tassert name.startswith('CONFIG_')\n\t\t\tself.config[name[7:]] = val\n\n\tdef get(self, name: str) -> Optional[str]:\n\t\t'''Get the value of a config option given its name. Query scripts/config\n\t\tin case it is not present in the config file. Return None if not set.\n\t\t'''\n\t\ttry:\n\t\t\treturn self.config[name]\n\t\texcept KeyError:\n\t\t\t# Option not explicitly set: try getting its default value\n\t\t\tval = run_config_script(self.kdir, self.file, ['-s', name]).strip()\n\t\t\tif val == 'undef':\n\t\t\t\tval = None\n\n\t\t\tself.config[name] = val\n\t\t\treturn val\n\n\tdef check(self, name: str, wanted: str) -> bool:\n\t\t'''Check if two values are equal accounting for unset values and\n\t\ttreating them as =n.\n\t\t'''\n\t\tactual = self.get(name)\n\t\treturn wanted == ('n' if actual is None else actual)\n\n\tdef human_readable(self, name: str) -> str:\n\t\t'''Return a human-readable representation for a config option and its\n\t\tactual value.'''\n\t\tval = self.get(name)\n\t\tif val is None:\n\t\t\treturn f'CONFIG_{name} is undef'\n\t\treturn f'CONFIG_{name}={val}'\n\n# TODO: auto check for choice menus to enable only one opt and disable others?\ndef kconfig_edit(config_file: Path, kdir: Path, options: Iterable[str]):\n\tif not options:\n\t\treturn\n\n\targs = []\n\tfor opt in options:\n\t\tname, val = opt.split('=', 1)\n\n\t\tif val == 'y':\n\t\t\targs += ['-e', name]\n\t\telif val == 'n':\n\t\t\targs += ['-d', name]\n\t\telif val == 'm':\n\t\t\targs += ['-m', name]\n\t\telse:\n\t\t\targs += ['--set-val', name, val]\n\n\trun_config_script(kdir, config_file, args)\n\n# TODO: actually check deps parsing Kconfig instead of taking an hardcoded\n#   dictionary {opt: deps} which is error prone and very annoying to maintain.\ndef kconfig_check_with_deps(config_file: Path, kdir: Path, options: Dict[str,List[str]]):\n\tconfig = Kconfig(config_file, kdir)\n\n\t# TODO: check options that are set even though deps not set as intended?\n\tfor opt, deps in options.items():\n\t\topt_name, opt_wanted = opt.split('=', 1)\n\t\tif config.check(opt_name, opt_wanted):\n\t\t\tcontinue\n\n\t\tbad_deps: List[str] = []\n\t\tunsupported = False\n\n\t\t# Something is not right, check dependencies for more insight...\n\t\tfor dep in deps:\n\t\t\tdep_name, dep_wanted = dep.split('=', 1)\n\t\t\tif config.check(dep_name, dep_wanted):\n\t\t\t\tcontinue\n\n\t\t\t# It's ok if we want to enable some config, but we cannot do it\n\t\t\t# because the arch we are building for doesn't declare support\n\t\t\t# for one of its dependencies\n\t\t\tdep_actual = config.get(dep_name)\n\t\t\tif dep_wanted != 'n' and (dep_actual is None or dep_actual == 'n'):\n\t\t\t\tif anyprefix(dep_name, 'HAVE_', 'ARCH_HAS_', 'ARCH_SUPPORTS_'):\n\t\t\t\t\tunsupported = True\n\t\t\t\t\tlogging.warning(config.human_readable(opt_name)\n\t\t\t\t\t\t+ f' instead of ={opt_wanted}, likely because '\n\t\t\t\t\t\t+ config.human_readable(dep_name))\n\t\t\t\t\tcontinue\n\n\t\t\tbad_deps.append(dep_name)\n\n\t\tif unsupported:\n\t\t\tcontinue\n\n\t\tif bad_deps:\n\t\t\t# Config does not match, likely because of deps\n\t\t\tlogging.error(config.human_readable(opt_name)\n\t\t\t\t+ f' instead of ={opt_wanted}, likely because '\n\t\t\t\t+ ', '.join(map(config.human_readable, bad_deps)))\n\t\telse:\n\t\t\t# Config does not match, but deps are ok (weird!)\n\t\t\tlogging.error(config.human_readable(opt_name)\n\t\t\t\t+ f' instead of ={opt_wanted} (deps ok)')\n\ndef kconfig_debug_check(config_file: Path, kdir: Path, options: Iterable[str]):\n\tconfig = Kconfig(config_file, kdir)\n\n\tfor opt in options:\n\t\topt_name, opt_wanted = opt.split('=', 1)\n\t\tif config.check(opt_name, opt_wanted):\n\t\t\tcontinue\n\n\t\t# As of now we are quite lax here. We only use this to check for configs\n\t\t# that we apply for compatibility or debugging and are not vital. Unlike\n\t\t# kconfig_check_with_deps() above, encountering a mismatch is usually\n\t\t# not an error.\n\t\tlogging.debug(config.human_readable(opt_name) + f' instead of ={opt_wanted}')\n"
  },
  {
    "path": "src/systrack/kconfig_options.py",
    "content": "#\n# Kernels built by Systrack need to be configured with debug information (for\n# file/line info) and with the most complete syscall table possible. In order to\n# do this a lot of Kconfig options need to be set to the right value depending\n# on the kernel version.\n#\n# Only arch-agnostic Kconfig options are present here. Arch-specific Kconfig\n# options are defined separately in each `Arch` subclass in `arch/`.\n#\n# Versions for Kconfig options can be looked up using the online LKDDB:\n# https://cateee.net/lkddb/web-lkddb/ - seriously a godsend for this job.\n#\n\nfrom .utils import VersionedList, VersionedDict\n\n__all__ = [\n\t'VERSION_ZERO', 'VERSION_INF',\n\t'KCONFIG_DEBUGGING', 'KCONFIG_COMPATIBILITY',\n\t'KCONFIG_MORE_SYSCALLS', 'KCONFIG_SYSCALL_DEPS'\n]\n\n# We will probably never get even close to v2.6.12 (first tag in the main repo)\nVERSION_ZERO = (2,6,12,)\nVERSION_INF  = (9999999999,)\n\n# Kconfig options that help Systrack do its job. We don't check dependencies on\n# other Kconfig options for these as they are all global and dependency-free.\n# We can add another different VersionedDict in the future if the need arises.\n#\n# Motivations behind these:\n#\n# - DEBUG_INFO=y is obviously essential to have file and line number information\n#   in the vmlinux ELF. In v5.12 a multiple choice menu for the DWARF version\n#   was added, and in v5.18 the choice DEBUG_INFO_NONE was added, making\n#   DEBUG_INFO no longer selectable by hand, but only automatically enabled when\n#   the choice is not DEBUG_INFO_NONE.\n# - RELOCATABLE=n is essential to avoid relocations, which could result in the\n#   entire syscall table being relocatable, making it significantly more\n#   annoying to recover syscall symbols (don't really want to parse and apply\n#   relocations to be honest).\n# - EXPERT=y is needed for various stuff incl. some arch-specific kconfigs\n# - EXPERIMENTAL=y might also be useful for arch-specific stuff, though it's old\n#   so I haven't really *experimented* with it yet (lol)\n# - FTRACE_SYSCALLS=y adds `__syscall_meta_xxx` structs for each syscall, which\n#   are very useful to extract signature info. It also helps on x86 since v6.9\n#   as syscall tables are not used anymore and `sys_call_table` is only\n#   generated for ftrace.\n# - FTRACE=y is needed for FTRACE_SYSCALLS\n#\n# TODO: version for RELOCATABLE and RANDOMIZE_BASE depends on arch\n# TODO: is optimizing for size and not performance useful?\n#       Enable CC_OPTIMIZE_FOR_SIZE (since 2.6.1) and disable\n#       CC_OPTIMIZE_FOR_PERFORMANCE (since 4.7) for that.\n# TODO: Enable DEBUG_INFO_BTF? It generates BTF typeinfo, which may be useful.\n# TODO: Enable NO_AUTO_INLINE?\n#\nKCONFIG_DEBUGGING = VersionedList((\n\t# since        removed in   list of name=value\n\t(VERSION_ZERO, (3,8)      , ['EXPERIMENTAL=y']),\n\t(VERSION_ZERO, VERSION_INF, ['DEBUG_KERNEL=y', 'DEBUG_INFO=y']),\n\t(VERSION_ZERO, VERSION_INF, ['RELOCATABLE=n', 'RANDOMIZE_BASE=n']),\n\t((2, 6, 30)  , VERSION_INF, ['FTRACE_SYSCALLS=y']),\n\t((2, 6, 31)  , VERSION_INF, ['FTRACE=y']),\n\t((2, 6, 36)  , VERSION_INF, ['DEBUG_INFO_REDUCED=n']),\n\t((2, 6, 38)  , VERSION_INF, ['EXPERT=y']),\n\t((5, 12)     , VERSION_INF, ['DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y']),\n\t((5, 18)     , VERSION_INF, ['DEBUG_INFO_NONE=n']),\n))\n\n# Kconfig options that are not strictly needed for building or improving\n# Systrack analysis, but which ease the build process by improving\n# compiler/toolchain compatibility, removing unneeded build dependencies and\n# disabling unneeded pieces of kernel code.\n#\n# Some of these are arch-specific, but we don't care as they will simply be\n# ignored on the wrong arch.\n#\nKCONFIG_COMPATIBILITY = VersionedList((\n\t# since        removed in   list of name=value\n\t(VERSION_ZERO, VERSION_INF, ['USB=n']),\n\t(VERSION_ZERO, (6,6)      , ['EMBEDDED=n']),\n\t((2,6,28)    , VERSION_INF, ['WIRELESS=n']),\n\t((2,6,32)    , VERSION_INF, ['USB_SUPPORT=n', 'WLAN=n', 'NETDEVICES=n']),\n\t((2,6,36)    , VERSION_INF, ['SECURITY_APPARMOR=n']),\n\t((3,7)       , VERSION_INF, ['MODULE_SIG=n']),\n\t((3,13)      , VERSION_INF, ['SYSTEM_TRUSTED_KEYRING=n']),\n\t((4,6)       , VERSION_INF, ['STACK_VALIDATION=n']),\n\t((4,14)      , (4,15)     , ['GUESS_UNWINDER=y', 'ORC_UNWINDER=n', 'FRAME_POINTER_UNWINDER=n']),\n\t((4,15)      , VERSION_INF, ['UNWINDER_GUESS=y', 'UNWINDER_ORC=n', 'UNWINDER_FRAME_POINTER=n']),\n\t((5,2)       , VERSION_INF, ['DEBUG_INFO_BTF=n']),\n\t((5,15)      , VERSION_INF, ['WERROR=n']),\n))\n\n# Kconfig options to enable optional syscalls. We want to build a kernel with as\n# many syscalls as possible. These are some arch-agnostic config options to set\n# in order to enable more syscalls. Arch-specific configs (or configs that are\n# present in different kernel versions depending on the arch) are uner `arch/`.\n#\n# Notes on some of these:\n#\n# - CRYPTO_SHA256=y is needed for KEXEC_FILE\n# - INOTIFY=y is needed for INOTIFY_USER (only from v2.6.18 to v2.6.28)\n# - PCI=y is needed for pci syscalls and is arch-specific before v5.0 (with\n#   different dependencies too), but we can enable it here regardless as a\n#   sanity check\n# - PROFILING=y is needed for PERF_EVENTS\n# - QUOTA=y is needed for QUOTACTL, which should be auto-selected by QUOTA=y\n# - SECCOMP was arch-specific before v5.10, then became arch-agnostic\n# - SECURITY=y is needed for SECURITY_LANDLOCK\n# - UID16 is technically arch-dependent before v2.6.16, but it's practically\n#   useless to differentiate between archs for this, the kernel Makefile will\n#   just remove it if unneeded\n#\nKCONFIG_MORE_SYSCALLS = VersionedDict((\n\t# since        removed in   name=value               dependencies\n\t((3,18)      , VERSION_INF, 'ADVISE_SYSCALLS=y'    , []),\n\t((2,6,28)    , VERSION_INF, 'AIO=y'                , []),\n\t((2,6,19)    , VERSION_INF, 'BLOCK=y'              , ['EXPERT=y']),\n\t((3,18)      , VERSION_INF, 'BPF_SYSCALL=y'        , []),\n\t(VERSION_ZERO, (4,1)      , 'BSD_PROCESS_ACCT=y'   , []),\n\t((4,1)       , VERSION_INF, 'BSD_PROCESS_ACCT=y'   , ['MULTIUSER=y']),\n\t((3,3)       , VERSION_INF, 'CHECKPOINT_RESTORE=y' , []),\n\t((3,15)      , VERSION_INF, 'CROSS_MEMORY_ATTACH=y', ['MMU=y']),\n\t(VERSION_ZERO, VERSION_INF, 'CRYPTO_SHA256=y'      , []),\n\t((2,6,36)    , VERSION_INF, 'FANOTIFY=y'           , []),\n\t((2,6,39)    , VERSION_INF, 'FHANDLE=y'            , []),\n\t# TODO: FUTEX depends on !(SPARC32 && SMP), but we do not support\n\t# expressions to check kconfig dependencies :(\n\t(VERSION_ZERO, VERSION_INF, 'FUTEX=y'              , []),\n\t(VERSION_ZERO, VERSION_INF, 'INET=y'               , []),\n\t((2,6,13)    , (2,6,29)   , 'INOTIFY=y'            , []),\n\t((2,6,18)    , VERSION_INF, 'INOTIFY_USER=y'       , []),\n\t((5,1)       , VERSION_INF, 'IO_URING=y'           , ['EXPERT=y']),\n\t((5,12)      , VERSION_INF, 'KCMP=y'               , ['EXPERT=y']),\n\t(VERSION_ZERO, VERSION_INF, 'KEYS=y'               , []),\n\t((4,3)       , VERSION_INF, 'MEMBARRIER=y'         , []),\n\t((4,18)      , (6,6)      , 'MEMFD_CREATE=y'       , []),\n\t((6,6)       , VERSION_INF, 'MEMFD_CREATE=y'       , ['EXPERT=y']),\n\t# TODO: MIGRATION depends on (NUMA || ARCH_ENABLE_MEMORY_HOTREMOVE || COMPACTION || CMA) && MMU\n\t# but we do not support expressions to check kconfig dependencies :(\n\t((2,6,16)    , VERSION_INF, 'MIGRATION=y'          , ['MMU=y']),\n\t(VERSION_ZERO, VERSION_INF, 'MODULE_UNLOAD=y'      , []),\n\t(VERSION_ZERO, VERSION_INF, 'MODULES=y'            , []),\n\t(VERSION_ZERO, VERSION_INF, 'NET=y'                , []),\n\t(VERSION_ZERO, (2,6,29)   , 'NFSD=y'               , ['INET=y']),\n\t# Though NSFD still exists, nfsservctl was removed in 3.1, so it's pointless\n\t# to enable it past that\n\t((2,6,29)    , (3,1)      , 'NFSD=y'               , ['INET=y', 'FILE_LOCKING=y', 'FSNOTIFY=y']),\n\t((2,6,32)    , VERSION_INF, 'PROFILING=y'          , []),\n\t(VERSION_ZERO, VERSION_INF, 'PERF_EVENTS=y'        , ['HAVE_PERF_EVENTS=y']),\n\t(VERSION_ZERO, (5,0)      , 'PCI=y'                , []),\n\t((5,0)       , VERSION_INF, 'PCI=y'                , ['HAVE_PCI=y']),\n\t(VERSION_ZERO, VERSION_INF, 'POSIX_MQUEUE=y'       , ['NET=y']),\n\t((4,10)      , VERSION_INF, 'POSIX_TIMERS=y'       , ['EXPERT=y']),\n\t((2,6,30)    , VERSION_INF, 'QUOTA=y'              , []),\n\t((4,18)      , VERSION_INF, 'RSEQ=y'               , ['HAVE_RSEQ=y']),\n\t((5,10)      , VERSION_INF, 'SECCOMP=y'            , ['HAVE_ARCH_SECCOMP=y']),\n\t((5,14)      , (6,2)      , 'SECRETMEM=y'          , ['ARCH_HAS_SET_DIRECT_MAP=y', 'EMBEDDED=n']),\n\t((6,2)       , VERSION_INF, 'SECRETMEM=y'          , ['ARCH_HAS_SET_DIRECT_MAP=y']),\n\t(VERSION_ZERO, (4,1)      , 'SECURITY=y'           , ['SYSFS=y']),\n\t((4,1)       , VERSION_INF, 'SECURITY=y'           , ['SYSFS=y', 'MULTIUSER=y']),\n\t((5,13)      , (6,5)      , 'SECURITY_LANDLOCK=y'  , ['SECURITY=y', 'ARCH_EPHEMERAL_INODES=n']),\n\t((6,5)       , VERSION_INF, 'SECURITY_LANDLOCK=y'  , ['SECURITY=y']),\n\t((3,16)      , VERSION_INF, 'SGETMASK_SYSCALL=y'   , []),\n\t((2,6,22)    , VERSION_INF, 'SIGNALFD=y'           , ['EXPERT=y']),\n\t(VERSION_ZERO, (5,5)      , 'SYSCTL_SYSCALL=y'     , ['PROC_SYSCTL=y']),\n\t((3,15)      , VERSION_INF, 'SYSFS_SYSCALL=y'      , []),\n\t(VERSION_ZERO, VERSION_INF, 'SYSVIPC=y'            , []),\n\t(VERSION_ZERO, (2,6,16)   , 'UID16=y'              , []),\n\t((2,6,16)    , (4,1)      , 'UID16=y'              , ['EXPERT=y', 'HAVE_UID16=y']),\n\t((4,1)       , VERSION_INF, 'UID16=y'              , ['EXPERT=y', 'HAVE_UID16=y', 'MULTIUSER=y']),\n\t((4,3)       , VERSION_INF, 'USERFAULTFD=y'        , ['MMU=y']),\n\t((3,15)      , (6,16)     , 'USELIB=y'             , []),\n))\n\n# Keep track of which syscall depends on which config option. Since syscalls are\n# uniquely named there is no issue in keeping track of arch-specific syscalls\n# here too.\n#\n# NOTE: for syscalls that are gated behind different configs depending on arch,\n# the .kconfig_syscall_deps attr of Arch subclasses overrides the entries here.\n#\n# This info is only to give a richer output (namely list the kconfig options\n# needed to enable a certain syscall), it is not functional to the tool.\n#\n# 1. Most optional syscalls exist IF AND ONLY IF the corresponding config\n#    exists, so just set \"since\" VERSION_ZERO and \"removed in\" VERSION_INF for\n#    those.\n# 2. If a certain syscall existed prior to it being put behind a config,\n#    set \"since\" to the first appearence of the config.\n# 3. If a certain syscall was behind a config, but then the config was removed\n#    (while keeping the syscall), set \"removed in\" to the version the config was\n#    removed in.\n# 4. If both point 2 and 3 above apply, then add 2+ entries for such a syscall.\n#\nKCONFIG_SYSCALL_DEPS = VersionedDict((\n\t# since        removed in   syscall name               depends on\n\t(VERSION_ZERO, VERSION_INF, 'fadvise64'              , 'ADVISE_SYSCALLS'    ),\n\t(VERSION_ZERO, VERSION_INF, 'fadvise64_64'           , 'ADVISE_SYSCALLS'    ), # 32-bit only\n\t(VERSION_ZERO, VERSION_INF, 'madvise'                , 'ADVISE_SYSCALLS'    ),\n\t(VERSION_ZERO, VERSION_INF, 'process_madvise'        , 'ADVISE_SYSCALLS'    ),\n\t(VERSION_ZERO, VERSION_INF, 'io_setup'               , 'AIO'                ),\n\t(VERSION_ZERO, VERSION_INF, 'io_destroy'             , 'AIO'                ),\n\t(VERSION_ZERO, VERSION_INF, 'io_getevents'           , 'AIO'                ),\n\t(VERSION_ZERO, VERSION_INF, 'io_submit'              , 'AIO'                ),\n\t(VERSION_ZERO, VERSION_INF, 'io_cancel'              , 'AIO'                ),\n\t(VERSION_ZERO, VERSION_INF, 'io_pgetevents'          , 'AIO'                ),\n\t(VERSION_ZERO, VERSION_INF, 'ioprio_get'             , 'BLOCK'              ),\n\t(VERSION_ZERO, VERSION_INF, 'ioprio_set'             , 'BLOCK'              ),\n\t(VERSION_ZERO, VERSION_INF, 'bpf'                    , 'BPF_SYSCALL'        ),\n\t(VERSION_ZERO, VERSION_INF, 'acct'                   , 'BSD_PROCESS_ACCT'   ),\n\t((6,5)       , VERSION_INF, 'cachestat'              , 'CACHESTAT_SYSCALL'  ),\n\t(VERSION_ZERO, (5,12)     , 'kcmp'                   , 'CHECKPOINT_RESTORE' ),\n\t(VERSION_ZERO, VERSION_INF, 'process_vm_readv'       , 'CROSS_MEMORY_ATTACH'),\n\t(VERSION_ZERO, VERSION_INF, 'process_vm_writev'      , 'CROSS_MEMORY_ATTACH'),\n\t(VERSION_ZERO, VERSION_INF, 'epoll_create'           , 'EPOLL'              ),\n\t(VERSION_ZERO, VERSION_INF, 'epoll_create1'          , 'EPOLL'              ),\n\t(VERSION_ZERO, VERSION_INF, 'epoll_ctl'              , 'EPOLL'              ),\n\t(VERSION_ZERO, VERSION_INF, 'epoll_pwait'            , 'EPOLL'              ),\n\t(VERSION_ZERO, VERSION_INF, 'epoll_pwait2'           , 'EPOLL'              ),\n\t(VERSION_ZERO, VERSION_INF, 'epoll_wait'             , 'EPOLL'              ),\n\t(VERSION_ZERO, VERSION_INF, 'name_to_handle_at'      , 'FHANDLE'            ),\n\t(VERSION_ZERO, VERSION_INF, 'open_by_handle_at'      , 'FHANDLE'            ),\n\t(VERSION_ZERO, VERSION_INF, 'fanotify_init'          , 'FANOTIFY'           ),\n\t(VERSION_ZERO, VERSION_INF, 'fanotify_mark'          , 'FANOTIFY'           ),\n\t(VERSION_ZERO, VERSION_INF, 'fork'                   , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'futex'                  , 'FUTEX'              ),\n\t(VERSION_ZERO, VERSION_INF, 'futex_wait'             , 'FUTEX'              ),\n\t(VERSION_ZERO, VERSION_INF, 'futex_waitv'            , 'FUTEX'              ),\n\t(VERSION_ZERO, VERSION_INF, 'futex_wake'             , 'FUTEX'              ),\n\t(VERSION_ZERO, VERSION_INF, 'futex_requeue'          , 'FUTEX'              ),\n\t(VERSION_ZERO, VERSION_INF, 'get_robust_list'        , 'FUTEX'              ),\n\t(VERSION_ZERO, VERSION_INF, 'set_robust_list'        , 'FUTEX'              ),\n\t(VERSION_ZERO, VERSION_INF, 'inotify_add_watch'      , 'INOTIFY_USER'       ),\n\t(VERSION_ZERO, VERSION_INF, 'inotify_init'           , 'INOTIFY_USER'       ),\n\t(VERSION_ZERO, VERSION_INF, 'inotify_init1'          , 'INOTIFY_USER'       ),\n\t(VERSION_ZERO, VERSION_INF, 'inotify_rm_watch'       , 'INOTIFY_USER'       ),\n\t(VERSION_ZERO, VERSION_INF, 'io_uring_enter'         , 'IO_URING'           ),\n\t(VERSION_ZERO, VERSION_INF, 'io_uring_setup'         , 'IO_URING'           ),\n\t(VERSION_ZERO, VERSION_INF, 'io_uring_register'      , 'IO_URING'           ),\n\t((5,12)      , VERSION_INF, 'kcmp'                   , 'KCMP'               ),\n\t(VERSION_ZERO, VERSION_INF, 'kexec_load'             , 'KEXEC'              ),\n\t(VERSION_ZERO, VERSION_INF, 'kexec_file_load'        , 'KEXEC_FILE'         ),\n\t(VERSION_ZERO, VERSION_INF, 'add_key'                , 'KEYS'               ),\n\t(VERSION_ZERO, VERSION_INF, 'keyctl'                 , 'KEYS'               ),\n\t(VERSION_ZERO, VERSION_INF, 'request_key'            , 'KEYS'               ),\n\t(VERSION_ZERO, VERSION_INF, 'membarrier'             , 'MEMBARRIER'         ),\n\t((4,18)      , VERSION_INF, 'memfd_create'           , 'MEMFD_CREATE'       ),\n\t(VERSION_ZERO, VERSION_INF, 'mincore'                , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'mlock'                  , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'mlock2'                 , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'mlockall'               , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'mprotect'               , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'mseal'                  , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'msync'                  , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'munlock'                , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'munlockall'             , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'pkey_alloc'             , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'pkey_free'              , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'pkey_mprotect'          , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'process_mrelease'       , 'MMU'                ),\n\t(VERSION_ZERO, VERSION_INF, 'remap_file_pages'       , 'MMU'                ), # obsolete\n\t((4,3)       , VERSION_INF, 'modify_ldt'             , 'MODIFY_LDT_SYSCALL' ), # x86 only\n\t(VERSION_ZERO, VERSION_INF, 'delete_module'          , 'MODULE_UNLOAD'      ),\n\t(VERSION_ZERO, VERSION_INF, 'init_module'            , 'MODULES'            ),\n\t(VERSION_ZERO, VERSION_INF, 'finit_module'           , 'MODULES'            ),\n\t((4,1)       , VERSION_INF, 'capget'                 , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'capset'                 , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'setuid'                 , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'setgid'                 , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'setreuid'               , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'setregid'               , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'getresuid'              , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'setresuid'              , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'getresgid'              , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'setresgid'              , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'setfsuid'               , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'setfsgid'               , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'getgroups'              , 'MULTIUSER'          ),\n\t((4,1)       , VERSION_INF, 'setgroups'              , 'MULTIUSER'          ),\n\t(VERSION_ZERO, VERSION_INF, 'accept'                 , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'accept4'                , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'bind'                   , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'connect'                , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'listen'                 , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'getpeername'            , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'getsockname'            , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'getsockopt'             , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'recv'                   , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'recvfrom'               , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'recvmsg'                , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'recvmmsg'               , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'send'                   , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'sendmmsg'               , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'sendmsg'                , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'sendto'                 , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'setsockopt'             , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'shutdown'               , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'socket'                 , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'socketcall'             , 'NET'                ),\n\t(VERSION_ZERO, VERSION_INF, 'socketpair'             , 'NET'                ),\n\t(VERSION_ZERO, (3, 1)     , 'nfsservctl'             , 'NFSD'               ), # dead\n\t(VERSION_ZERO, VERSION_INF, 'mbind'                  , 'NUMA'               ),\n\t(VERSION_ZERO, VERSION_INF, 'migrate_pages'          , 'MIGRATION'          ),\n\t(VERSION_ZERO, VERSION_INF, 'move_pages'             , 'MIGRATION'          ),\n\t(VERSION_ZERO, VERSION_INF, 'get_mempolicy'          , 'NUMA'               ),\n\t(VERSION_ZERO, VERSION_INF, 'set_mempolicy'          , 'NUMA'               ),\n\t(VERSION_ZERO, VERSION_INF, 'set_mempolicy_home_node', 'NUMA'               ),\n\t(VERSION_ZERO, VERSION_INF, 'pciconfig_read'         , 'PCI'                ),\n\t(VERSION_ZERO, VERSION_INF, 'pciconfig_write'        , 'PCI'                ),\n\t(VERSION_ZERO, VERSION_INF, 'pciconfig_iobase'       , 'PCI'                ),\n\t(VERSION_ZERO, VERSION_INF, 'perf_event_open'        , 'PERF_EVENTS'        ),\n\t(VERSION_ZERO, VERSION_INF, 'mq_notify'              , 'POSIX_MQUEUE'       ),\n\t(VERSION_ZERO, VERSION_INF, 'mq_open'                , 'POSIX_MQUEUE'       ),\n\t(VERSION_ZERO, VERSION_INF, 'mq_timedreceive'        , 'POSIX_MQUEUE'       ),\n\t(VERSION_ZERO, VERSION_INF, 'mq_timedsend'           , 'POSIX_MQUEUE'       ),\n\t(VERSION_ZERO, VERSION_INF, 'mq_unlink'              , 'POSIX_MQUEUE'       ),\n\t(VERSION_ZERO, VERSION_INF, 'mq_getsetattr'          , 'POSIX_MQUEUE'       ),\n\t(VERSION_ZERO, VERSION_INF, 'timer_create'           , 'POSIX_TIMERS'       ),\n\t(VERSION_ZERO, VERSION_INF, 'timer_delete'           , 'POSIX_TIMERS'       ),\n\t(VERSION_ZERO, VERSION_INF, 'timer_getoverrun'       , 'POSIX_TIMERS'       ),\n\t(VERSION_ZERO, VERSION_INF, 'timer_gettime'          , 'POSIX_TIMERS'       ),\n\t(VERSION_ZERO, VERSION_INF, 'timer_settime'          , 'POSIX_TIMERS'       ),\n\t(VERSION_ZERO, VERSION_INF, 'rtas'                   , 'PPC_RTAS'           ), # powerpc only\n\t(VERSION_ZERO, VERSION_INF, 'subpage_prot'           , 'PPC_SUBPAGE_PROT'   ), # powerpc 64-bit only\n\t(VERSION_ZERO, VERSION_INF, 'quotactl'               , 'QUOTACTL'           ),\n\t(VERSION_ZERO, VERSION_INF, 'quotactl_fd'            , 'QUOTACTL'           ),\n\t(VERSION_ZERO, VERSION_INF, 'rseq'                   , 'RSEQ'               ),\n\t(VERSION_ZERO, VERSION_INF, 'lsm_get_self_attr'      , 'SECURITY'           ),\n\t(VERSION_ZERO, VERSION_INF, 'lsm_list_modules'       , 'SECURITY'           ),\n\t(VERSION_ZERO, VERSION_INF, 'lsm_set_self_attr'      , 'SECURITY'           ),\n\t(VERSION_ZERO, VERSION_INF, 'landlock_create_ruleset', 'SECURITY_LANDLOCK'  ),\n\t(VERSION_ZERO, VERSION_INF, 'landlock_add_rule'      , 'SECURITY_LANDLOCK'  ),\n\t(VERSION_ZERO, VERSION_INF, 'landlock_restrict_self' , 'SECURITY_LANDLOCK'  ),\n\t(VERSION_ZERO, VERSION_INF, 'seccomp'                , 'SECCOMP'            ),\n\t(VERSION_ZERO, VERSION_INF, 'memfd_secret'           , 'SECRETMEM'          ),\n\t(VERSION_ZERO, VERSION_INF, 'sgetmask'               , 'SGETMASK_SYSCALL'   ), # obsolete\n\t(VERSION_ZERO, VERSION_INF, 'ssetmask'               , 'SGETMASK_SYSCALL'   ), # obsolete\n\t(VERSION_ZERO, VERSION_INF, 'signalfd'               , 'SIGNALFD'           ),\n\t(VERSION_ZERO, VERSION_INF, 'signalfd4'              , 'SIGNALFD'           ),\n\t(VERSION_ZERO, VERSION_INF, 'spu_create'             , 'SPU_FS'             ), # powerpc only\n\t(VERSION_ZERO, VERSION_INF, 'spu_run'                , 'SPU_FS'             ), # powerpc only\n\t(VERSION_ZERO, VERSION_INF, 'swapon'                 , 'SWAP'               ),\n\t(VERSION_ZERO, VERSION_INF, 'swapoff'                , 'SWAP'               ),\n\t(VERSION_ZERO, (5, 5)     , 'sysctl'                 , 'SYSCTL_SYSCALL'     ), # dead since v5.9\n\t(VERSION_ZERO, VERSION_INF, 'sysfs'                  , 'SYSFS_SYSCALL'      ), # obsolete\n\t(VERSION_ZERO, VERSION_INF, 'ipc'                    , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'msgctl'                 , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'msgget'                 , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'msgrcv'                 , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'msgsnd'                 , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'semctl'                 , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'semget'                 , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'semop'                  , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'semtimedop'             , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'shmat'                  , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'shmctl'                 , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'shmdt'                  , 'SYSVIPC'            ),\n\t(VERSION_ZERO, VERSION_INF, 'shmget'                 , 'SYSVIPC'            ),\n\t((3,17)      , (4,18)     , 'memfd_create'           , 'TMPFS'              ),\n\t(VERSION_ZERO, VERSION_INF, 'chown16'                , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'fchown16'               , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'lchown16'               , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'getuid16'               , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'getgid16'               , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'geteuid16'              , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'getegid16'              , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'getresuid16'            , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'getresgid16'            , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'getgroups16'            , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'setuid16'               , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'setgid16'               , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'setreuid16'             , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'setregid16'             , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'setfsuid16'             , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'setfsgid16'             , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'setresuid16'            , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'setresgid16'            , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'setgroups16'            , 'UID16'              ), # legacy\n\t(VERSION_ZERO, VERSION_INF, 'userfaultfd'            , 'USERFAULTFD'        ),\n\t(VERSION_ZERO, VERSION_INF, 'uselib'                 , 'USELIB'             ), # obsolete (32bit only?)\n\t(VERSION_ZERO, (4,3)      , 'vm86old'                , 'VM86'               ), # x86 32-bit only\n\t(VERSION_ZERO, (4,3)      , 'vm86'                   , 'VM86'               ), # x86 32-bit only\n\t((4,3)       , VERSION_INF, 'vm86old'                , 'X86_LEGACY_VM86'    ), # x86 32-bit only, legacy\n\t((4,3)       , VERSION_INF, 'vm86'                   , 'X86_LEGACY_VM86'    ), # x86 32-bit only, legacy\n\t((5,5)       , VERSION_INF, 'ioperm'                 , 'X86_IOPL_IOPERM'    ), # x86 only\n\t((5,5)       , VERSION_INF, 'iopl'                   , 'X86_IOPL_IOPERM'    ), # x86 only\n))\n"
  },
  {
    "path": "src/systrack/kernel.py",
    "content": "import re\nimport logging\nimport struct\nimport atexit\nfrom pathlib import Path\nfrom time import monotonic\nfrom os import sched_getaffinity\nfrom operator import itemgetter, attrgetter\nfrom collections import defaultdict, Counter\nfrom typing import Tuple, List, Dict, Iterable, Iterator, Union, Any, Optional\n\nfrom .arch import arch_from_name, arch_from_vmlinux\nfrom .elf import ELF, Symbol, Section\nfrom .kconfig import kconfig_edit, kconfig_check_with_deps, kconfig_debug_check\nfrom .kconfig import kconfig_more_syscalls, kconfig_debugging\nfrom .kconfig import kconfig_compatibility, kconfig_syscall_deps\nfrom .location import extract_syscall_locations\nfrom .log import log_verbosity\nfrom .signature import extract_syscall_signatures\nfrom .syscall import Syscall, common_syscall_symbol_prefixes\nfrom .type_hints import KernelVersion\nfrom .utils import ensure_command, maybe_rel, noprefix, run_command\n\n\nclass KernelError(RuntimeError):\n\tpass\n\nclass KernelArchError(KernelError):\n\tpass\n\nclass KernelELFError(KernelError):\n\tpass\n\nclass KernelMultiABIError(KernelError):\n\tpass\n\nclass KernelVersionError(KernelError):\n\tpass\n\nclass KernelWithoutSymbolsError(KernelError):\n\tpass\n\n\nclass Kernel:\n\t__version         = None\n\t__version_source  = None\n\t__syscalls        = None\n\t__backup_makefile = None\n\t__long_size       = None\n\t__long_pack_fmt   = None\n\n\tdef __init__(self, arch_name: Optional[str] = None,\n\t\t\tvmlinux: Optional[Path] = None, kdir: Optional[Path] = None,\n\t\t\toutdir: Optional[Path] = None, rdir: Optional[Path] = None,\n\t\t\ttoolchain_prefix: Optional[str] = None):\n\t\tif not kdir and not vmlinux:\n\t\t\traise ValueError('at least one of vmlinux or kdir is needed')\n\t\tif arch_name is None and vmlinux is None:\n\t\t\traise ValueError('need vmlinux to determine arch if not supplied')\n\n\t\tif vmlinux:\n\t\t\ttry:\n\t\t\t\tself.vmlinux = ELF(vmlinux)\n\t\t\texcept ValueError as e:\n\t\t\t\traise KernelELFError(f'Bad vmlinux ELF: {e}') from e\n\t\telse:\n\t\t\tself.vmlinux = None\n\n\t\tself.kdir             = kdir\n\t\tself.outdir           = outdir\n\t\tself.rdir             = rdir\n\t\tself.arch_name        = arch_name\n\t\tself.toolchain_prefix = toolchain_prefix\n\n\t\tif self.vmlinux and not self.vmlinux.symbols:\n\t\t\traise KernelWithoutSymbolsError('Provided vmlinux ELF has no symbols')\n\n\t\tif self.arch_name is None:\n\t\t\tm = arch_from_vmlinux(self.vmlinux)\n\t\t\tif m is None:\n\t\t\t\traise KernelArchError('Failed to detect kernel architecture/ABI')\n\n\t\t\tarch_class, bits32, abis = m\n\t\t\tif len(abis) > 1:\n\t\t\t\traise KernelMultiABIError('Multiple ABIs supported, need to '\n\t\t\t\t\t'select one', arch_class, abis)\n\n\t\t\tself.arch = arch_class(self.version, abis[0], bits32)\n\t\telse:\n\t\t\tself.arch = arch_from_name(self.arch_name, self.version)\n\n\t\tif self.vmlinux:\n\t\t\tif not self.arch.matches(self.vmlinux):\n\t\t\t\traise KernelArchError(f'Architecture {arch_name} does not '\n\t\t\t\t\t'match provided vmlinux')\n\n\t\t\tself.__long_size     = (8, 4)[self.vmlinux.bits32]\n\t\t\tself.__long_pack_fmt = '<>'[self.vmlinux.big_endian] + 'QL'[self.vmlinux.bits32]\n\n\t@staticmethod\n\tdef version_from_str(s: str) -> KernelVersion:\n\t\tm = re.match(r'(\\d+)\\.(\\d+)(\\.(\\d+))?', s)\n\t\tif not m:\n\t\t\treturn None\n\n\t\ta, b, c = int(m.group(1)), int(m.group(2)), m.group(4)\n\t\treturn (a, b) if c is None else (a, b, int(c))\n\n\t@staticmethod\n\tdef version_from_banner(banner: Union[str,bytes]) -> KernelVersion:\n\t\tif isinstance(banner, bytes):\n\t\t\tbanner = banner.decode()\n\n\t\tif not banner.startswith('Linux version '):\n\t\t\treturn None\n\t\treturn Kernel.version_from_str(banner[14:])\n\n\tdef __version_from_vmlinux(self) -> KernelVersion:\n\t\tbanner = self.vmlinux.symbols.get('linux_banner')\n\t\tif banner is None:\n\t\t\treturn None\n\n\t\tif banner.size:\n\t\t\tbanner = self.vmlinux.read_symbol(banner)\n\t\telse:\n\t\t\tbanner = self.vmlinux.vaddr_read_string(banner.vaddr)\n\n\t\treturn self.version_from_banner(banner)\n\n\tdef __version_from_make(self) -> KernelVersion:\n\t\tv = ensure_command('make kernelversion', self.kdir)\n\t\treturn self.version_from_str(v)\n\n\t@property\n\tdef version(self) -> KernelVersion:\n\t\tif self.__version is None:\n\t\t\tif self.vmlinux:\n\t\t\t\tself.__version = self.__version_from_vmlinux()\n\t\t\t\tself.__version_source = 'vmlinux'\n\t\t\telif self.kdir:\n\t\t\t\t# This could in theory be tried even if __version_from_vmlinux()\n\t\t\t\t# fails... but if that fails there are probably bigger problems.\n\t\t\t\tself.__version = self.__version_from_make()\n\t\t\t\tself.__version_source = 'make'\n\n\t\tif self.__version is None:\n\t\t\traise KernelVersionError('unable to determine kernel version')\n\t\treturn self.__version\n\n\t@property\n\tdef version_str(self) -> str:\n\t\treturn '.'.join(map(str, self.version)) + f' (from {self.__version_source})'\n\n\t@property\n\tdef version_tag(self) -> str:\n\t\ta, b, c = self.version\n\t\tif c == 0:\n\t\t\treturn f'v{a}.{b}'\n\t\treturn f'v{a}.{b}.{c}'\n\n\t@property\n\tdef version_source(self) -> str:\n\t\tif self.__version_source or self.version:\n\t\t\treturn self.__version_source\n\t\treturn None\n\n\t@property\n\tdef can_extract_location_info(self):\n\t\treturn self.vmlinux.has_debug_info\n\n\t@property\n\tdef can_extract_signature_info(self):\n\t\treturn (\n\t\t\t'__start_syscalls_metadata' in self.vmlinux.symbols\n\t\t\tor self.vmlinux.has_debug_info\n\t\t)\n\n\t@property\n\tdef syscalls(self) -> List[Syscall]:\n\t\tif self.__syscalls is None:\n\t\t\tself.__syscalls = self.__extract_syscalls()\n\t\treturn self.__syscalls\n\n\tdef __rel(self, path: Path) -> Path:\n\t\treturn maybe_rel(path, self.kdir)\n\n\tdef __unpack_long(self, vaddr: int) -> int:\n\t\treturn struct.unpack(self.__long_pack_fmt, self.vmlinux.vaddr_read(vaddr, self.__long_size))[0]\n\n\tdef __iter_unpack_vmlinux(self, fmt: str, off: int, size: int = None) -> Iterator[Tuple[Any, ...]]:\n\t\tf = self.vmlinux.file\n\t\tassert f.seek(off) == off\n\n\t\tif size is None:\n\t\t\tchunk_size = struct.calcsize(fmt)\n\t\t\twhile 1:\n\t\t\t\tyield struct.unpack(fmt, f.read(chunk_size))\n\t\telse:\n\t\t\tyield from struct.iter_unpack(fmt, f.read(size))\n\n\tdef __iter_unpack_vmlinux_long(self, off: int, size: int = None) -> Iterator[int]:\n\t\tyield from map(itemgetter(0), self.__iter_unpack_vmlinux(self.__long_pack_fmt, off, size))\n\n\tdef __unpack_syscall_table(self, tbl: Symbol, target_section: Section) -> List[int]:\n\t\ttbl_file_off = self.vmlinux.vaddr_to_file_offset(tbl.vaddr)\n\n\t\t# This is the section we would like the function pointers to point to,\n\t\t# we'll warn or halt in case we find fptrs pointing outside\n\t\tvstart = target_section.vaddr\n\t\tvend   = vstart + target_section.size\n\n\t\tif tbl.size > 0x80:\n\t\t\tlogging.info('Syscall table (%s) is %d bytes, %d entries', tbl.name,\n\t\t\t\ttbl.size, tbl.size // self.__long_size)\n\n\t\t\tvaddrs = list(self.__iter_unpack_vmlinux_long(tbl_file_off, tbl.size))\n\n\t\t\t# Sanity check: ensure all vaddrs are within the target section\n\t\t\tfor idx, vaddr in enumerate(vaddrs):\n\t\t\t\tif not (vstart <= vaddr < vend):\n\t\t\t\t\tlogging.warning('Virtual address 0x%x idx %d is outside %s: '\n\t\t\t\t\t\t'something is off!', vaddr, tbl.name, idx, target_section.name)\n\t\telse:\n\t\t\t# Apparently on some archs (e.g. MIPS, PPC) the syscall table symbol\n\t\t\t# can have size 0. In this case we'll just warn the user and keep\n\t\t\t# extracting vaddrs as long as they are valid, stopping at the first\n\t\t\t# invalid one or at the next symbol we encounter.\n\t\t\tlogging.warning('Syscall table (%s) has bad size (%d), doing my '\n\t\t\t\t' best to figure out when to stop', tbl.name, tbl.size)\n\n\t\t\tcur_idx_vaddr = tbl.vaddr\n\t\t\tboundary = self.vmlinux.next_symbol(tbl)\n\t\t\tboundary = boundary.vaddr if boundary else float('inf')\n\t\t\tvaddrs = []\n\n\t\t\tfor vaddr in self.__iter_unpack_vmlinux_long(tbl_file_off):\n\t\t\t\t# Stop at the first vaddr pointing outside target_section\n\t\t\t\tif not (vstart <= vaddr < vend):\n\t\t\t\t\tbreak\n\n\t\t\t\t# Stop if we collide with another symbol right after the syscall\n\t\t\t\t# table (may be another syscall table e.g. the compat one)\n\t\t\t\tif cur_idx_vaddr >= boundary:\n\t\t\t\t\tbreak\n\n\t\t\t\tvaddrs.append(vaddr)\n\t\t\t\tcur_idx_vaddr += self.__long_size\n\n\t\t\tlogging.info('Syscall table seems to be %d bytes, %d entries',\n\t\t\t\tcur_idx_vaddr - tbl.vaddr, len(vaddrs))\n\n\t\treturn vaddrs\n\n\tdef __syscall_vaddrs_from_syscall_table(self) -> Dict[int,int]:\n\t\ttbl = self.vmlinux.symbols.get(self.arch.syscall_table_name)\n\t\tif not tbl:\n\t\t\tlogging.critical('Unable to find %s symbol!',\n\t\t\t\tself.arch.syscall_table_name)\n\t\t\treturn {}\n\n\t\tlogging.debug('Syscall table: %r', tbl)\n\n\t\t# Read and parse the syscall table unpacking all virtual addresses it\n\t\t# contains. Depending on arch, we might need to parse function\n\t\t# descriptors for the function pointers in the syscall table.\n\n\t\ttext   = self.vmlinux.sections['.text']\n\t\tvaddrs = {}\n\n\t\tif self.arch.uses_function_descriptors:\n\t\t\ttext_vstart = text.vaddr\n\t\t\ttext_vend   = text_vstart + text.size\n\n\t\t\t# Even if this arch uses function descriptors, we don't know if they\n\t\t\t# are effectively used for function pointers in the syscall table.\n\t\t\t# This needs to be tested, and in case they aren't used, we can\n\t\t\t# fallback to \"normal\" parsing instead.\n\t\t\tif not (text_vstart <= self.__unpack_long(tbl.vaddr) < text_vend):\n\t\t\t\tlogging.debug('Syscall table uses function descriptors')\n\n\t\t\t\topd = self.vmlinux.sections.get('.opd')\n\t\t\t\tif not opd:\n\t\t\t\t\tlogging.critical('Arch uses function descriptors, but '\n\t\t\t\t\t\t'vmlinux has no .opd section!')\n\t\t\t\t\treturn {}\n\n\t\t\t\tdescriptors = self.__unpack_syscall_table(tbl, opd)\n\n\t\t\t\t# Translate function descriptors (one more level of indirection)\n\t\t\t\tfor i, desc_vaddr in enumerate(descriptors):\n\t\t\t\t\tvaddr = self.vmlinux.vaddr_read(desc_vaddr, self.__long_size)\n\t\t\t\t\tvaddr = struct.unpack(self.__long_pack_fmt, vaddr)[0]\n\n\t\t\t\t\tif not (text_vstart <= vaddr < text_vend):\n\t\t\t\t\t\tlogging.warning('Function descriptor at 0x%x points '\n\t\t\t\t\t\t\t'outside .text: something is off!', desc_vaddr)\n\n\t\t\t\t\tvaddrs[i] = vaddr\n\t\t\telse:\n\t\t\t\tlogging.debug('Syscall table does NOT use function descriptors')\n\n\t\tif not vaddrs:\n\t\t\tvaddrs = dict(enumerate(self.__unpack_syscall_table(tbl, text)))\n\n\t\tif not vaddrs:\n\t\t\tlogging.critical('Could not extract any valid function pointer '\n\t\t\t\t'from %s, giving up!', self.arch.syscall_table_name)\n\t\t\tlogging.critical('Is the kernel relocatable? Relocation entries '\n\t\t\t\t'for the syscall table are not supported.')\n\t\t\treturn {}\n\n\t\treturn vaddrs\n\n\tdef __extract_syscalls(self) -> List[Syscall]:\n\t\tif self.arch.bits32 != self.vmlinux.bits32:\n\t\t\ta, b = (32, 64) if self.arch.bits32 else (64, 32)\n\t\t\tlogging.critical('Selected arch is %d-bit, but kernel is %d-bit', a, b)\n\t\t\treturn []\n\n\t\tself.arch.adjust_abi(self.vmlinux)\n\t\tlogging.debug('Arch: %r', self.arch)\n\n\t\thave_syscall_table = self.arch.have_syscall_table()\n\n\t\tif have_syscall_table:\n\t\t\tvaddrs = self.__syscall_vaddrs_from_syscall_table()\n\t\telse:\n\t\t\tlogging.warning('No syscall table available! Trying my best...')\n\t\t\tvaddrs = self.arch.extract_syscall_vaddrs(self.vmlinux)\n\n\t\tif not vaddrs:\n\t\t\tlogging.critical('Unable to extract any syscall vaddr, giving up!')\n\t\t\treturn []\n\n\t\t# Find all ni_syscall symbols (there might be multiple) and keep track\n\t\t# of them for later in order to detect non-implemented syscalls.\n\t\tni_syscalls = set()\n\n\t\tfor sym in self.vmlinux.functions.values():\n\t\t\tif self.arch.symbol_is_ni_syscall(sym):\n\t\t\t\tni_syscalls.add(sym)\n\n\t\tfor sym in sorted(ni_syscalls, key=attrgetter('name')):\n\t\t\tlogging.debug('Found ni_syscall: %r', sym)\n\n\t\tif not ni_syscalls:\n\t\t\tlogging.critical('No ni_syscall found!')\n\t\t\treturn []\n\n\t\tseen = set(vaddrs.values())\n\t\tsymbols_by_vaddr = {sym.vaddr: sym for sym in ni_syscalls}\n\t\tdiscarded_logs = []\n\t\tpreferred_logs = []\n\n\t\t# Create a mapping vaddr -> symbol for every vaddr in the syscall table\n\t\t# for convenience. Sort symbols by name for reproducible results. We\n\t\t# look at .symbols instead of .functions here because (of course) some\n\t\t# of these symbols may not be classified as FUNC.\n\t\tfor sym in sorted(self.vmlinux.symbols.values(), key=attrgetter('name')):\n\t\t\tvaddr = sym.vaddr\n\t\t\tif vaddr not in seen:\n\t\t\t\tcontinue\n\n\t\t\tother = symbols_by_vaddr.get(vaddr)\n\t\t\tif sym == other:\n\t\t\t\tcontinue\n\n\t\t\tif other is not None:\n\t\t\t\tif other in ni_syscalls and sym not in ni_syscalls:\n\t\t\t\t\t# Don't allow other symbols to \"override\" a ni_syscall\n\t\t\t\t\tif logging.root.isEnabledFor(logging.DEBUG):\n\t\t\t\t\t\tdiscarded_logs.append((sym.name, other.name))\n\t\t\t\t\tcontinue\n\n\t\t\t\tpref = self.arch.preferred_symbol(sym, other)\n\t\t\t\tsym, other = pref, (other if pref is sym else sym)\n\n\t\t\t\tif log_verbosity() >= 3:\n\t\t\t\t\tpreferred_logs.append((pref.name, other.name))\n\n\t\t\tsymbols_by_vaddr[vaddr] = sym\n\n\t\t# Sort logs for reproducible output (the above sorting does not\n\t\t# guarantee that these are sorted as well).\n\t\tdiscarded_logs.sort()\n\t\tpreferred_logs.sort()\n\n\t\tfor sym, other in discarded_logs:\n\t\t\tlogging.debug('Discarding %s as alias for %s', sym, other)\n\n\t\tfor sym, other in preferred_logs:\n\t\t\tlogging.debug('Preferring %s over %s', sym, other)\n\n\t\tdel discarded_logs\n\t\tdel preferred_logs\n\t\tdel seen\n\n\t\tif not symbols_by_vaddr:\n\t\t\tlogging.critical('Unable to find any symbol in the syscall table, giving up!')\n\t\t\tlogging.critical('Is \"%s\" the correct arch/ABI combination for '\n\t\t\t\t'this kernel?', self.arch_name)\n\t\t\treturn []\n\n\t\t# Sanity check: the only repeated vaddrs in the syscall table should be\n\t\t# the ones for *_ni_syscall. Warn in case there are others.\n\t\tcounts = Counter(vaddrs.values()).items()\n\t\tcounts = filter(lambda c: c[1] > 1, counts)\n\t\tcounts = sorted(counts, key=itemgetter(1), reverse=True)\n\n\t\tif counts:\n\t\t\t# In case of no syscall table, ni_syscalls may have already been\n\t\t\t# filtered by arch-specific extraction code, so don't sweat it.\n\t\t\tif any(sym in ni_syscalls for sym in vaddrs.values()):\n\t\t\t\tbest = symbols_by_vaddr[counts[0][0]]\n\n\t\t\t\tif best not in ni_syscalls:\n\t\t\t\t\tlogging.error('Interesting! I was expecting *_ni_syscall to be the '\n\t\t\t\t\t\t'most frequent symbol in the syscall table, but %s is ('\n\t\t\t\t\t\t'appearing %d times).', best.name, counts[0][1])\n\n\t\tfor va, n in counts:\n\t\t\tsym = symbols_by_vaddr.get(va, f'{va:#x} <unknown symbol!>')\n\t\t\tif sym not in ni_syscalls:\n\t\t\t\tlogging.warning('Interesting! Vaddr found %d times: %s', n, sym)\n\n\t\tsymbols      = []\n\t\tsymbol_names = []\n\t\tni_count     = defaultdict(int)\n\n\t\t# Filter out only defined syscalls\n\t\tfor idx, vaddr in sorted(vaddrs.items()):\n\t\t\tsym = symbols_by_vaddr.get(vaddr)\n\t\t\tif sym is None:\n\t\t\t\tif have_syscall_table:\n\t\t\t\t\tlogging.error('Unable to find symbol for %s[%d]: 0x%x',\n\t\t\t\t\t\tself.arch.syscall_table_name, idx, vaddr)\n\t\t\t\telse:\n\t\t\t\t\tlogging.error('Unable to find symbol for #%d 0x%x', idx,\n\t\t\t\t\t\tvaddr)\n\t\t\t\tcontinue\n\n\t\t\tif log_verbosity() >= 3:\n\t\t\t\tif have_syscall_table:\n\t\t\t\t\tlogging.debug('%s[%d]: %s', self.arch.syscall_table_name,\n\t\t\t\t\t\tidx, sym)\n\t\t\t\telse:\n\t\t\t\t\tlogging.debug('#%d: %s', idx, sym)\n\n\t\t\tif sym in ni_syscalls:\n\t\t\t\tni_count[sym] += 1\n\t\t\t\tcontinue\n\n\t\t\tsymbols.append((idx, sym))\n\t\t\tsymbol_names.append(sym.name)\n\n\t\t# Find common syscall symbol prefixes (e.g. \"__x64_sys_\") in order to be\n\t\t# able to strip them later to obtain the actual syscall name\n\t\tprefixes = common_syscall_symbol_prefixes(symbol_names, 20)\n\t\tif prefixes:\n\t\t\tlogging.info('Common syscall symbol prefixes: %s', ', '.join(prefixes))\n\t\telse:\n\t\t\tlogging.warning('No common syscall symbol prefixes found (weird!)')\n\n\t\tsyscalls  = []\n\t\tn_skipped = 0\n\n\t\t# Build list of syscalls (with prefixes stripped from the names) and\n\t\t# skip uneeded ones (e.g. implemented for other ABIs)\n\t\tfor idx, sym in symbols:\n\t\t\tnum      = self.arch.syscall_num_base + idx\n\t\t\torigname = self.arch.translate_syscall_symbol_name(sym.name)\n\t\t\torigname = noprefix(origname, *prefixes)\n\t\t\tname     = self.arch.normalize_syscall_name(origname)\n\t\t\tkdeps    = kconfig_syscall_deps(name, self.version, self.arch)\n\n\t\t\t# We could need the original name to differentiate some syscalls\n\t\t\t# in order to understand if they need some Kconfig or not\n\t\t\tif not kdeps:\n\t\t\t\tkdeps = kconfig_syscall_deps(origname, self.version, self.arch)\n\n\t\t\tnum = self.arch.adjust_syscall_number(num)\n\t\t\tsc = Syscall(idx, num, name, origname, sym, kdeps)\n\n\t\t\tif self.arch.skip_syscall(sc):\n\t\t\t\tlogging.debug('Skipping %s', sym.name)\n\t\t\t\tn_skipped += 1\n\t\t\t\tcontinue\n\n\t\t\tsyscalls.append(sc)\n\n\t\tni_total = 0\n\t\tfor sym, n in sorted(ni_count.items(), key=itemgetter(1), reverse=True):\n\t\t\tlogging.info('%d entries point to %s', n, sym.name)\n\t\t\tni_total += n\n\n\t\t# Add esoteric syscalls to the list, if any. These do not need any name\n\t\t# translation or signature search. Some may need tailored static binary\n\t\t# analysis. Very fun.\n\t\tesoteric   = self.arch.extract_esoteric_syscalls(self.vmlinux)\n\t\tn_esoteric = len(esoteric)\n\n\t\t# Log these, they are interesting\n\t\tif esoteric:\n\t\t\tlogging.info('Found %d esoteric syscall%s: %s', n_esoteric,\n\t\t\t\t's'[:n_esoteric ^ 1], ', '.join(map(itemgetter(1), esoteric)))\n\n\t\tfor num, name, sym_name, sig, kconf in esoteric:\n\t\t\tsym = self.vmlinux.symbols[sym_name]\n\t\t\tsyscalls.append(Syscall(None, num, name, name, sym, kconf, signature=sig, esoteric=True))\n\n\t\tassert len(syscalls) == len(vaddrs) - ni_total - n_skipped + n_esoteric\n\n\t\t# Extract the most common ni_syscall symbol we found (if any) and its\n\t\t# code to use it as a reference to detect other non-implemented syscalls\n\t\t# (whose handlers could simply be inlined ni_syscall code).\n\t\tni_ref_sym = max(ni_count, key=ni_count.get) if ni_count else None\n\t\tni_ref_code = self.vmlinux.read_symbol(ni_ref_sym) if ni_ref_sym else None\n\n\t\t# Some syscalls are just a dummy function that does `return -ENOSYS` or\n\t\t# some other error, meaning that the syscall is not actually\n\t\t# implemented, even if present in the syscall table. We can filter those\n\t\t# out using .is_dummy_syscall() by either exactly matching the reference\n\t\t# ni_syscall code extracted above or invoking arch-specific logic (if\n\t\t# any).\n\t\t#\n\t\t# We are however not guaranteed to catch everything. For example,\n\t\t# .is_dummy_syscall() may be useless if the symbol has bad/zero size or\n\t\t# if the compiler does something funny and uses weird instructions.\n\t\t# Unless we check sources, we can always have false positives even after\n\t\t# this step.\n\t\tsyscalls = list(filter(\n\t\t\tlambda s: not self.arch.is_dummy_syscall(s, self.vmlinux, ni_ref_sym, ni_ref_code),\n\t\t\tsyscalls\n\t\t))\n\n\t\t# Find locations and signatures for all the syscalls we found (except\n\t\t# esoteric ones).\n\t\textract_syscall_locations(syscalls, self.vmlinux, self.arch, self.kdir, self.rdir)\n\t\textract_syscall_signatures(syscalls, self.vmlinux, self.kdir is not None)\n\n\t\t# Second pass to extract only implemented syscalls: warn for potentially\n\t\t# bad matches and filter out invalid ones.\n\t\timplemented  = []\n\t\tbad_loc_info = []\n\t\tno_loc_info  = []\n\t\tno_sig_info  = []\n\n\t\tfor sc in syscalls:\n\t\t\tfile, line, good = sc.file, sc.line, sc.good_location\n\n\t\t\tif not sc.esoteric and not good and file is not None:\n\t\t\t\tif self.__rel(file).match('kernel/sys_ni.c'):\n\t\t\t\t\t# If we got to this point the location is still not\n\t\t\t\t\t# \"good\" and points to sys_ni.c even after\n\t\t\t\t\t# adjusting/grepping. Assume the syscall is not\n\t\t\t\t\t# implemented. Granted, this could in theory lead to\n\t\t\t\t\t# false negatives, but I did not encounter one yet.\n\t\t\t\t\t# Since we are grepping the source code this should NOT\n\t\t\t\t\t# happen for implemented syscalls. Nonetheless warn\n\t\t\t\t\t# about it, so we can double check and make sure\n\t\t\t\t\t# everything is fine.\n\t\t\t\t\tlogging.warning('Assuming %s is not implemented as it '\n\t\t\t\t\t\t'points to %s:%d after adjustments', sc.name,\n\t\t\t\t\t\tself.__rel(file), line)\n\t\t\t\t\tcontinue\n\n\t\t\t\tif self.kdir:\n\t\t\t\t\tif file.match('*.S'):\n\t\t\t\t\t\thint = ' (implemented in asm?)'\n\t\t\t\t\telif file.match('*.c'):\n\t\t\t\t\t\thint = ' (normal function w/o asmlinkage?)'\n\t\t\t\t\telse:\n\t\t\t\t\t\thint = ''\n\n\t\t\t\t\tbad_loc_info.append((\n\t\t\t\t\t\tsc.name,\n\t\t\t\t\t\tsc.symbol.name,\n\t\t\t\t\t\tself.__rel(file),\n\t\t\t\t\t\tstr(line),\n\t\t\t\t\t\thint\n\t\t\t\t\t))\n\n\t\t\tif file is None and self.can_extract_location_info:\n\t\t\t\tno_loc_info.append((sc.name, sc.symbol.name))\n\n\t\t\tif sc.signature is None and self.can_extract_signature_info:\n\t\t\t\tno_sig_info.append((sc.name, sc.symbol.name))\n\n\t\t\timplemented.append(sc)\n\n\t\tfor info in bad_loc_info:\n\t\t\tlogging.warning('Potentially bad location for %s (%s): %s:%s%s', *info)\n\n\t\tfor info in no_loc_info:\n\t\t\tlogging.error('Unable to find location for %s (%s)', *info)\n\n\t\tfor info in no_sig_info:\n\t\t\tlogging.error('Unable to extract signature for %s (%s)', *info)\n\n\t\treturn implemented\n\n\tdef __try_set_optimization_level(self, lvl: int) -> bool:\n\t\t# Might be the most ignorant thing in this whole codebase :')\n\n\t\twith (self.kdir / 'Makefile').open('r+') as f:\n\t\t\tself.__backup_makefile = data = f.read()\n\t\t\tassert f.seek(0) == 0\n\n\t\t\tmatch = re.search(r'^KBUILD_CFLAGS\\s*\\+=\\s*-O(2)\\n', data, re.MULTILINE)\n\t\t\tif not match:\n\t\t\t\treturn False\n\n\t\t\tstart, end = match.span(1)\n\t\t\tf.write(data[:start] + str(lvl) + data[end:])\n\t\t\tf.truncate()\n\n\t\treturn True\n\n\tdef __restore_makefile(self):\n\t\tif self.__backup_makefile:\n\t\t\twith (self.kdir / 'Makefile').open('w') as f:\n\t\t\t\tf.write(self.__backup_makefile)\n\t\telse:\n\t\t\tlogging.error('Restoring Makefile without backing it up first???')\n\n\t\tatexit.unregister(self.__restore_makefile)\n\n\tdef __edit_config(self, options: Iterable[str]):\n\t\tif not options:\n\t\t\treturn\n\n\t\t# TODO: this is annoying, can we find a better way to do it?\n\t\t#   make olddefconfig only works with the .config file in the source\n\t\t#   tree, so can't move the \"sync config\" functionality out of here...\n\t\tconfig_file = (self.outdir or self.kdir) / '.config'\n\t\tkconfig_edit(config_file, self.kdir, options)\n\t\tself.sync_config()\n\t\tkconfig_debug_check(config_file, self.kdir, options)\n\n\tdef __edit_config_with_deps(self, options: Dict[str,List[str]]):\n\t\tif not options:\n\t\t\treturn\n\n\t\t# TODO: ditto (see above)\n\t\tconfig_file = (self.outdir or self.kdir) / '.config'\n\t\tkconfig_edit(config_file, self.kdir, options)\n\t\tself.sync_config()\n\t\tkconfig_check_with_deps(config_file, self.kdir, options)\n\n\tdef make(self, target: str, stdin=None, ensure=True) -> int:\n\t\tj = max(len(sched_getaffinity(0)) - 1, 1)\n\t\tcmd = ['make', f'-j{j}', f'ARCH={self.arch.name}']\n\n\t\t# Generate debug info with relative paths to make our life easier for\n\t\t# later analysis.\n\t\tcmd.append(f'KCFLAGS=-fdebug-prefix-map={self.kdir.absolute()}=.')\n\n\t\tif self.toolchain_prefix:\n\t\t\tcmd.append(f'CROSS_COMPILE={self.toolchain_prefix}')\n\t\tif self.outdir:\n\t\t\tcmd.append(f'O={self.outdir}')\n\n\t\t# 5.15+ has CONFIG_WERROR, which we set =n, but older kernels seem to\n\t\t# accept WERROR=X.\n\t\tif self.version < (5,15):\n\t\t\tcmd.append('WERROR=0')\n\n\t\tif log_verbosity() >= 4:\n\t\t\tcmd.append('V=1')\n\n\t\tif ensure:\n\t\t\tensure_command(cmd + [target], self.kdir, stdin, False, log_verbosity() >= 3)\n\t\t\treturn 0\n\n\t\treturn run_command(cmd + [target], self.kdir, stdin, log_verbosity() >= 3)\n\n\tdef sync_config(self):\n\t\t'''Set any config that was \"unlocked\" by others to its default value.\n\t\tThe make target for this depends on the kernel version.\n\t\t'''\n\t\tif self.version >= (3, 7):\n\t\t\tself.make('olddefconfig')\n\t\telse:\n\t\t\t# Ugly, but oldconfig can error out if no input is given.\n\t\t\tself.make('oldconfig', stdin='\\n' * 1000)\n\n\tdef clean(self):\n\t\tself.__version = None\n\t\tself.make('distclean')\n\n\tdef configure(self):\n\t\tself.__version = None\n\n\t\tlogging.info('Configuring for Arch: %r', self.arch)\n\t\tlogging.info('Base config target(s): %s', ', '.join(self.arch.config_targets))\n\n\t\tfor target in self.arch.config_targets:\n\t\t\tself.make(target)\n\n\t\tlogging.info('Applying debugging configs')\n\t\tself.__edit_config(kconfig_debugging(self.version))\n\n\t\tlogging.info('Applying compatibility configs')\n\t\tself.__edit_config(kconfig_compatibility(self.version))\n\n\t\tlogging.info('Enabling more syscalls')\n\t\tself.__edit_config_with_deps(kconfig_more_syscalls(self.version))\n\n\t\tlogging.info('Applying arch-specific configs')\n\t\tself.__edit_config_with_deps(self.arch.kconfig[self.version])\n\n\tdef build(self, try_disable_opt: bool = False) -> float:\n\t\tstart = monotonic()\n\t\tself.__version = None\n\n\t\tif try_disable_opt:\n\t\t\tlogging.info('Trying to build with optimizations disabled (-O0)')\n\n\t\t\t# This will either work or fail for any level. If it fails, just\n\t\t\t# do a normal build with ensure=True, which will exit in case of\n\t\t\t# failure.\n\t\t\tif self.__try_set_optimization_level(0):\n\t\t\t\tatexit.register(self.__restore_makefile)\n\t\t\t\tres = self.make('vmlinux', ensure=False)\n\t\t\t\tself.__restore_makefile()\n\n\t\t\t\tif res == 0:\n\t\t\t\t\treturn monotonic() - start\n\n\t\t\t\tlogging.error('Failed to build with -O0, trying -O1')\n\n\t\t\t\tself.__try_set_optimization_level(1)\n\t\t\t\tres = self.make('vmlinux', ensure=False)\n\t\t\t\tself.__restore_makefile()\n\n\t\t\t\tif res == 0:\n\t\t\t\t\treturn monotonic() - start\n\n\t\t\t\tlogging.error('Failed to build with -O1, doing a normal build')\n\t\t\telse:\n\t\t\t\tlogging.warning('Unable to patch Makefile to disable '\n\t\t\t\t\t'optimizations, doing a normal build instead')\n\n\t\tself.make('vmlinux')\n\t\treturn monotonic() - start\n"
  },
  {
    "path": "src/systrack/location.py",
    "content": "import logging\nimport re\nimport sys\n\nfrom operator import attrgetter\nfrom pathlib import Path\nfrom typing import Tuple, List, Set, Iterable, Iterator, Optional\n\nfrom .arch import Arch\nfrom .elf import ELF\nfrom .syscall import Syscall\nfrom .utils import ensure_command, command_available, maybe_rel\n\ndef addr2line(elf: Path, addrs: Iterable[int]) -> Iterator[Tuple[Optional[Path],Optional[int]]]:\n\tout = ensure_command(['addr2line', '-e', elf, *map(hex, addrs)])\n\n\tfor file, line in map(lambda d: d.split(':'), out.splitlines()):\n\t\tif file == '??':\n\t\t\tyield None, None\n\t\t\tcontinue\n\n\t\tline = int(line) if line.isdigit() else None\n\t\tyield Path(file), line\n\ndef smart_addr2line(elf: Path, addrs: Iterable[int], srcdir: Path = None) -> Iterator[Tuple[Optional[Path],Optional[int]]]:\n\t'''Run addr2line on the given elf for the given virtual addresses remapping\n\tany returned paths to the given srcdir.\n\n\taddr2line will always output absolute paths. In case the paths in the ELF\n\tDWARF sections are relative (i.e. don't start with \"/\"), the directory\n\tcontaining the ELF is taken as base. This is problematic because if the ELF\n\tis moved from the original source directory the paths returned by addr2line\n\twill be invalid.\n\n\tTo avoid this problem, whenever we know a different source directory, this\n\tfunction remaps the paths returned by addr2line to that directory instead.\n\t'''\n\tlocs = addr2line(elf, addrs)\n\tif srcdir is None:\n\t\tyield from locs\n\n\telfdir = elf.parent\n\tfor file, line in locs:\n\t\tif file is not None and file.is_relative_to(elfdir):\n\t\t\tyield srcdir / file.relative_to(elfdir), line\n\t\telse:\n\t\t\tyield file, line\n\ndef grep_file(root: Path, exp: re.Pattern, file: Path) -> Iterator[str]:\n\t# Use binary mode since some kernel source files may contain weird\n\t# non-unicode chars and break everything (go figure). Decode a line only in\n\t# case of a match.\n\twith file.open('rb') as f:\n\t\tfor lineno, line in enumerate(f, 1):\n\t\t\tif exp.search(line):\n\t\t\t\tyield f'{file.relative_to(root)}:{lineno}:{line.rstrip().decode()}'\n\ndef grep_recursive(root: Path, exp: re.Pattern, exclude: Set[str],\n\t\tcurdir: Path = None) -> Iterator[str]:\n\tif curdir is None:\n\t\tcurdir = root\n\n\tfor path in curdir.iterdir():\n\t\tif path.match('.*'):\n\t\t\tcontinue\n\n\t\tif path.is_file() and path.match('*.c'):\n\t\t\tyield from grep_file(root, exp, path)\n\t\telif path.is_dir() and path.resolve() not in exclude:\n\t\t\tyield from grep_recursive(root, exp, exclude, path)\n\ndef grep_kernel_sources(kdir: Path, arch: Arch, syscalls: List[Syscall]) -> Iterator[Tuple[Syscall,Path,int]]:\n\tif arch.compat:\n\t\tbase_exp = r'\\b(COMPAT_)?SYSCALL(32)?_DEFINE\\d\\s*\\('\n\telif arch.bits32:\n\t\tbase_exp = r'\\bSYSCALL(32)?_DEFINE\\d\\s*\\('\n\telse:\n\t\tbase_exp = r'\\bSYSCALL_DEFINE\\d\\s*\\('\n\n\toddstyle = arch.syscall_def_regexp()\n\tif oddstyle is not None:\n\t\texp = fr'({base_exp}|{oddstyle})\\s*\\w+'\n\telse:\n\t\texp = base_exp + r'\\s*\\w+'\n\n\tif not command_available('rg'):\n\t\tlogging.debug('No ripgrep available :( falling back to slow python implementation')\n\n\t\texclude = {\n\t\t\t(kdir / 'Documentation').resolve(),\n\t\t\t(kdir / 'drivers').resolve(),\n\t\t\t(kdir / 'lib').resolve(),\n\t\t\t(kdir / 'samples').resolve(),\n\t\t\t(kdir / 'sound').resolve(),\n\t\t\t(kdir / 'tools').resolve(),\n\t\t\t(kdir / 'usr').resolve(),\n\t\t}\n\n\t\t# Ignore other architectures\n\t\tfor path in (kdir / 'arch').iterdir():\n\t\t\tif not path.match(arch.name):\n\t\t\t\texclude.add(path.resolve())\n\n\t\tout = list(grep_recursive(kdir, re.compile(exp.encode()), exclude))\n\telse:\n\t\tout = ensure_command((\n\t\t\t'rg', '--line-number',\n\t\t\t'--glob', '!Documentation/*',\n\t\t\t'--glob', '!drivers/*',\n\t\t\t'--glob', '!lib/*',\n\t\t\t'--glob', '!samples/*',\n\t\t\t'--glob', '!sound/*',\n\t\t\t'--glob', '!tools/*',\n\t\t\t'--glob', '!usr/*',\n\t\t\t'--glob', '!arch/*',           # ignore other architectures (important)\n\t\t\t'--glob', f'arch/{arch.name}', # include the correct one\n\t\t\t'--glob', '*.c',\n\t\t\texp\n\t\t), cwd=kdir).splitlines()\n\n\texps = {s: re.compile(rf':{base_exp}{s.origname}[,)]') for s in syscalls}\n\n\tif arch.compat:\n\t\tkey = lambda l: (l.startswith('arch'), ('COMPAT' in l) + ('SYSCALL32' in l))\n\telif arch.bits32:\n\t\tkey = lambda l: (l.startswith('arch'), 'SYSCALL32' in l)\n\telse:\n\t\tkey = lambda l: l.startswith('arch')\n\n\t# Prioritize files under arch/ and prefer compat/32bit syscalls if needed\n\tout.sort(key=key, reverse=True)\n\n\tfor line in out:\n\t\tfor sc, exp in exps.items():\n\t\t\tif exp.search(line):\n\t\t\t\tfile, line = line.split(':')[:2]\n\t\t\t\tyield sc, kdir / file, int(line)\n\t\t\t\tdel exps[sc]\n\t\t\t\tbreak\n\n\t# Report failed matches\n\tfor sc in exps:\n\t\tyield sc, None, None\n\ndef good_definition(arch: Arch, definition: str, syscall_name: str) -> bool:\n\t# There are a lot of legacy/weird syscall definitions and some symbols can\n\t# therefore point (addr2line output) to old-style `asmlinkage` functions\n\tnewstyle  = ('^(COMPAT_)?' if arch.compat else '^')\n\tnewstyle += rf'SYSCALL(32)?_DEFINE\\d\\s*\\({syscall_name}\\b'\n\toldstyle  = rf'^asmlinkage\\s*(unsigned\\s+)?\\w+\\s*sys(32)?_{syscall_name}\\('\n\n\tif re.match(f'{newstyle}|{oldstyle}', definition) is not None:\n\t\treturn True\n\n\t# Also try matching old-style name if equal to full function name\n\tif syscall_name.startswith('sys_') and re.match(r'^asmlinkage\\s*'\n\t\t\trf'(unsigned\\s+)?\\w+\\s*{syscall_name}\\s*\\(', definition) is not None:\n\t\treturn True\n\n\t# Some archs use weirdly named SYSCALL_DEFINEn macros, e.g. PPC32 ABI on\n\t# PowerPC 64-bit with its \"PPC32_SYSCALL_DEFINEn\", or weirdly named sys_xxx\n\t# functions, e.g. ARM oabi with its \"asmlinkage int sys_oabi_xxx(...)\".\n\toddstyle = arch.syscall_def_regexp(syscall_name)\n\treturn oddstyle is not None and re.match(oddstyle, definition) is not None\n\ndef good_location(file: Path, line: int, arch: Arch, sc: Syscall) -> bool:\n\twith file.open('rb') as f:\n\t\tfor _ in range(line - 1):\n\t\t\tnext(f)\n\n\t\tdefinition = f.readline().decode()\n\n\treturn good_definition(arch, definition, sc.origname) \\\n\t\tor good_definition(arch, definition, sc.name)\n\ndef adjust_line(file: Path, line: int, sc: Syscall) -> int:\n\t'''Adjust the given line number by looking for the start (signature) of a\n\tfunction. The sc argument is only used for error logging prposes.\n\t'''\n\ttry:\n\t\twith file.open('rb') as f:\n\t\t\tlines = f.readlines()\n\texcept FileNotFoundError:\n\t\t# This will happen if we mismatch vmlinux and kernel sources. There's no\n\t\t# way we can keep going if kernel sources do not match the kernel we are\n\t\t# analyzing. It'd be nice to detect this and abort earlier, but without\n\t\t# make or git we have no good way of knowing what's the version for the\n\t\t# source code we are inspecting, and we will only realize something's\n\t\t# wrong if we encounter a missing file or a file that is too short.\n\t\tlogging.critical('Broken location info for %r', sc)\n\t\tlogging.critical('File \"%s\" does not exist!', file)\n\t\tlogging.critical('Do you have the correct source code version for this kernel?')\n\t\tsys.exit(1)\n\n\t# line is 1-based\n\tline_0 = line - 1\n\n\t# Try gettint up to the top of the current function body\n\tfor i in range(line_0, -1, -1):\n\t\ttry:\n\t\t\tl = lines[i].rstrip()\n\t\texcept IndexError:\n\t\t\t# This will happen if we mismatch vmlinux and kernel sources. Same\n\t\t\t# reasoning as above applies.\n\t\t\tlogging.critical('Broken location info for %r', sc)\n\t\t\tlogging.critical('File \"%s\" does not have enough lines of code: '\n\t\t\t\t'expected %d+, have %d!', file, line, len(lines))\n\t\t\tlogging.critical('Do you have the correct source code version for this kernel?')\n\t\t\tsys.exit(1)\n\n\t\tif i < line_0 and l == b'}':\n\t\t\t# We went up at least one line and found a '}': this means we were\n\t\t\t# not inside a function, give up\n\t\t\tbreak\n\n\t\tif l == b'{':\n\t\t\tfor j in range(i - 1, -1, -1):\n\t\t\t\tchar = lines[j][0:1]\n\n\t\t\t\tif not char.isspace():\n\t\t\t\t\tif char == b'#':\n\t\t\t\t\t\t# SYSCALL_DEFINE macro wrapped in preprocessor guards,\n\t\t\t\t\t\t# annoying but it can happen (e.g., clone in v5.0 at\n\t\t\t\t\t\t# kernel/fork.c:2328). Just skip the directive.\n\t\t\t\t\t\tcontinue\n\n\t\t\t\t\t# Found function signature\n\t\t\t\t\treturn j + 1\n\n\t\t\t# Found start of function body (weird)\n\t\t\tlogging.debug('Found start of function body, but not the actual '\n\t\t\t\t'signature: %s:%d', file, i + 1)\n\t\t\treturn i + 1\n\n\treturn line\n\ndef extract_syscall_locations(syscalls: List[Syscall], vmlinux: ELF, arch: Arch,\n\t\tkdir: Optional[Path], rdir: Optional[Path]):\n\tif not command_available('addr2line'):\n\t\tlogging.warning('Command \"addr2line\" unavailable, skipping location info extraction')\n\t\treturn\n\n\t# STEP 1: Ask addr2line for file/lineno info. Most of the times this will\n\t# work with at most a simple line adjustment.\n\n\tvmlinux = vmlinux.path\n\tlocs = smart_addr2line(vmlinux, map(lambda s: s.symbol.real_vaddr, syscalls), kdir)\n\tlocs = list(locs)\n\n\tif not kdir:\n\t\tfor sc, (file, line) in zip(syscalls, locs):\n\t\t\tsc.file = file\n\t\t\tsc.line = line\n\t\t\tsc.good_location = False\n\n\t\tif any(map(attrgetter('file'), syscalls)):\n\t\t\tlogging.warning('No kernel source available, trusting addr2line output for location info')\n\t\telse:\n\t\t\tlogging.warning('No kernel source available and no addr2line output, cannot extract location info')\n\n\t\treturn\n\n\trel = lambda p: maybe_rel(p, kdir)\n\tbad_paths = False\n\tto_adjust: List[Syscall] = []\n\tto_retry: List[Syscall] = []\n\tto_grep: List[Syscall] = []\n\n\tif rdir:\n\t\tremap = lambda p: kdir / maybe_rel(p, rdir) if p is not None else None\n\telse:\n\t\tremap = lambda p: kdir / p if p is not None else None\n\n\t# Try a simple line adjustment: lineno might point inside a function, but we\n\t# want the function signature.\n\n\tfor sc, loc in zip(syscalls, locs):\n\t\tfile, line = loc\n\t\tsc.file = file = remap(file)\n\t\tsc.good_location = False\n\n\t\tif file is None or not file.is_file() or line is None:\n\t\t\tif sc.symbol.size > 1:\n\t\t\t\tto_adjust.append(sc)\n\t\t\t\tlogging.debug('Location needs adjustment (invalid): %s (%s) -> '\n\t\t\t\t\t'%s:%s', sc.origname, sc.symbol.name, *loc)\n\t\t\telse:\n\t\t\t\tto_grep.append(sc)\n\t\t\t\tlogging.debug('Location needs grepping (invalid and sz <= 0): '\n\t\t\t\t\t'%s (%s) -> %s:%s', sc.origname, sc.symbol.name, *loc)\n\t\t\tcontinue\n\n\t\tif not file.is_relative_to(kdir.resolve()):\n\t\t\tbad_paths = True\n\n\t\tsc.line = line = adjust_line(file, line, sc)\n\n\t\t# For esoteric syscalls, only find a decent location for the symbol,\n\t\t# it's pointless to go deeper\n\t\tif sc.esoteric:\n\t\t\tcontinue\n\n\t\tif good_location(file, line, arch, sc):\n\t\t\tsc.good_location = True\n\t\telif sc.symbol.size > 1:\n\t\t\tto_adjust.append(sc)\n\t\t\tlogging.debug('Location needs adjustment (bad): %s (%s) -> %s:%d',\n\t\t\t\tsc.origname, sc.symbol.name, rel(file), line)\n\t\telse:\n\t\t\tto_grep.append(sc)\n\t\t\tlogging.debug('Location needs grepping (bad and sz <= 0): %s (%s) '\n\t\t\t\t'-> %s:%d', sc.origname, sc.symbol.name, rel(file), line)\n\n\t# STEP 2: Simple adjustment for bad/invalid locations: ask addr2line again\n\t# for vaddr + sz - 1 (except for symbols with sz <= 1).\n\t#\n\t# Rationale: The debug info for some syscall symbols points to the wrong\n\t# file/line, however the last few instructions of the function have a\n\t# better chance of pointing to the correct place. This is because in simple\n\t# syscalls (e.g. getuid, which only extracts a field from current) there is\n\t# no prolog/epilog, and since function calls like get_current() are\n\t# inlined, almost all instructions in the function body come from a macro or\n\t# function defined somewhere else. The final RET instruction is basically\n\t# the only one that truly belongs to the function. The workaround is to also\n\t# try checking vaddr + symbol_size - 1 with addr2line.\n\tto_adjust.sort(key=attrgetter('name'))\n\n\tif to_adjust:\n\t\tif len(to_adjust) == len(locs):\n\t\t\t# If we need to adjust every single location it's very likely that\n\t\t\t# the user gave us a wrong path as KDIR. This will make us attempt\n\t\t\t# full adjustment and grepping for every single syscall, which is\n\t\t\t# very slow. Warn so that the user figures this out without having\n\t\t\t# to wait for everything to complete.\n\t\t\tlogging.warning('All the locations obtained from addr2line look '\n\t\t\t\t'bad, did you provide the correct KDIR?')\n\t\t\tlogging.warning('You may want to try using --remap ORIG_KDIR')\n\t\t\tlogging.warning('Skipping location information extraction')\n\t\t\treturn\n\n\t\tvaddrs = tuple(map(lambda s: s.symbol.real_vaddr + s.symbol.size - 1, to_adjust))\n\t\tnew_locs = smart_addr2line(vmlinux, vaddrs, kdir)\n\n\t\tfor sc, loc in zip(to_adjust, new_locs):\n\t\t\tfile, line = loc\n\t\t\tfile = remap(file)\n\n\t\t\tif file is None or not file.is_file() or line is None:\n\t\t\t\tif sc.symbol.size > 2:\n\t\t\t\t\tto_retry.append(sc)\n\t\t\t\t\tlogging.debug('Location needs full-range adjustment '\n\t\t\t\t\t\t'(invalid): %s (%s+0x%x) -> %s:%s', sc.origname,\n\t\t\t\t\t\tsc.symbol.name, sc.symbol.size - 1, *loc)\n\t\t\t\telse:\n\t\t\t\t\tto_grep.append(sc)\n\t\t\t\t\tlogging.debug('Location needs grepping (invalid and sz <= '\n\t\t\t\t\t\t'1): %s (%s+0x%x) -> %s:%s', sc.origname, sc.symbol.name,\n\t\t\t\t\t\tsc.symbol.size - 1, *loc)\n\t\t\t\tcontinue\n\n\t\t\tline = adjust_line(file, line, sc)\n\n\t\t\tif good_location(file, line, arch, sc):\n\t\t\t\tsc.file = file\n\t\t\t\tsc.line = line\n\t\t\t\tsc.good_location = True\n\t\t\telse:\n\t\t\t\tif sc.symbol.size > 2:\n\t\t\t\t\tto_retry.append(sc)\n\t\t\t\t\tlogging.debug('Location needs full-range adjustment (bad): '\n\t\t\t\t\t\t'%s (%s+0x%x) -> %s:%d', sc.origname, sc.symbol.name,\n\t\t\t\t\t\tsc.symbol.size - 1, rel(file), line)\n\t\t\t\telse:\n\t\t\t\t\tto_grep.append(sc)\n\t\t\t\t\tlogging.debug('Location needs grepping (bad and sz <= 1): '\n\t\t\t\t\t\t'%s (%s+0x%x) -> %s:%s', sc.origname, sc.symbol.name,\n\t\t\t\t\t\tsc.symbol.size - 1, rel(file), line)\n\n\t# STEP 3: Full-range adjustment for locations that are still bad/invalid:\n\t# ask addr2line again for ALL addresses from vaddr + 1 to vaddr + sz - 2\n\t# (except for symbols with sz <= 1).\n\t#\n\t# Reasoning: not much, just being optimistic. This is unlikely to work if\n\t# addr2line didn't find anything for vaddr nor for vaddr + sz - 1. If we get\n\t# to this point, there is probably no file/line debug info for it at all.\n\tto_retry.sort(key=attrgetter('name'))\n\n\tfor sc in to_retry:\n\t\taddrs = range(sc.symbol.real_vaddr + 1, sc.symbol.real_vaddr + sc.symbol.size - 2)\n\t\tinvalid = True\n\n\t\tfor offset, loc in enumerate(smart_addr2line(vmlinux, addrs, kdir), 1):\n\t\t\tfile, line = loc\n\t\t\tfile = remap(file)\n\n\t\t\tif file is None or not file.is_file() or line is None:\n\t\t\t\tcontinue\n\n\t\t\tinvalid = False\n\t\t\tline = adjust_line(file, int(line), sc)\n\n\t\t\tif good_location(file, line, arch, sc):\n\t\t\t\tsc.file = file\n\t\t\t\tsc.line = line\n\t\t\t\tsc.good_location = True\n\t\t\t\tlogging.debug('Location found through full-range adjustment: %s'\n\t\t\t\t\t' (%s+0x%x) -> %s:%d', sc.origname, sc.symbol.name, offset,\n\t\t\t\t\trel(file), line)\n\t\t\t\tbreak\n\t\telse:\n\t\t\tif invalid:\n\t\t\t\tlogging.debug('Location needs grepping (invalid): %s (%s) -> '\n\t\t\t\t\t'%s:%s', sc.origname, sc.symbol.name, *loc)\n\t\t\telse:\n\t\t\t\tlogging.debug('Location needs grepping (bad): %s (%s) -> %s:%d',\n\t\t\t\t\tsc.origname, sc.symbol.name, rel(file),\n\t\t\t\t\t-1 if line is None else line)\n\n\t\t\tto_grep.append(sc)\n\n\tif bad_paths:\n\t\tlogging.error('Cannot grep source code, debug info points outside '\n\t\t\t'provided kernel source directory')\n\t\tlogging.warning('You may want to try using --remap ORIG_KDIR')\n\t\treturn\n\n\t# STEP 4: Still bad? Use the big hammer: recursively grep kernel sources.\n\t#\n\t# Rationale: On x86 (and maybe others) some syscalls wrongly point to the\n\t# first COND_SYSCALL() macro found in kernel/sys_ni.c (e.g. userfaultfd).\n\t# Clang gives a slightly better location than gcc: still in this file, but\n\t# at the right line and not just pointing to the first COND_SYSCALL().\n\t# Still, this is not the real location for the actual syscall code. The\n\t# symbols for these syscalls are also marked WEAK for some reason (as can be\n\t# seen from `readelf -Ws`). The only real workaround I can think of in this\n\t# case is to just grep the source code for definitions of the form\n\t# \"SYSCALL_DEFINEx(name, ...\".\n\t#\n\t# Disabling compiler optimizations could help, but the kernel does not have\n\t# a CONFIG_ option for that, and generally highly relies on optimizations.\n\t# Granted, the point here is not to build a runnable kernel, but still.\n\t#\n\t# In any case, even if they look legitimate, we cannot be sure of the\n\t# correctness of definitions found through grepping. For example, we could\n\t# be working with a 64-bit kernel with compat 32-bit support and find two\n\t# definitions using the exact same SYSCALL_DEFINEx macro guarded by some\n\t# preprocessor guards: we cannot know which one is correct in such case, the\n\t# only way would be to manually analyze the code or magically invoke the\n\t# preprocessor (which we are not even going to bother trying).\n\n\t# Sort by syscall name, group not found first\n\tgrepped = grep_kernel_sources(kdir, arch, to_grep)\n\tgrepped = sorted(grepped, key=lambda x: (x[1] is not None, x[0].name))\n\n\tfor sc, file, line in grepped:\n\t\tif file is None:\n\t\t\tlogging.info('Location could not be found through grepping: %s '\n\t\t\t\t'(orig name %s)', sc.name, sc.origname)\n\t\t\tcontinue\n\n\t\tif good_location(file, line, arch, sc):\n\t\t\tsc.file = file\n\t\t\tsc.line = line\n\t\t\tsc.good_location = True\n\t\t\tsc.grepped_location = True\n\n\t\t\tlogging.warning('Location found through grepping: %s -> %s:%d',\n\t\t\t\tsc.origname, rel(file), line)\n"
  },
  {
    "path": "src/systrack/log.py",
    "content": "import logging\nimport sys\n\n\n__all__ = ['log_setup', 'log_verbosity', 'eprint']\n\nSETUP_DONE = False\nVERBOSITY = 0\nSILENT_EPRINT = False\n\n\ndef log_setup(quietness: int, verbosity: int, colors: bool = True):\n\t'''Setup logging verbosity on the root logger based on the given quietness\n\tand verbosity levels from command line arguments (number of -q and -v\n\toptions given). Enable colored logs with ANSI escape codes if color=True.\n\t'''\n\tglobal SETUP_DONE, VERBOSITY, SILENT_EPRINT\n\n\tassert not SETUP_DONE, 'log_setup() called multiple times'\n\tSETUP_DONE = True\n\n\tVERBOSITY = verbosity\n\torig_factory = logging.getLogRecordFactory()\n\n\tif verbosity > 0:\n\t\tquietness = 0\n\n\tif quietness >= 1:\n\t\tquietness -= 1\n\t\tSILENT_EPRINT = True\n\n\tif colors:\n\t\tfmt = '%(color)s[%(levelname)s] %(message)s\\x1b[0m'\n\t\tlevel_colors = {\n\t\t\tlogging.CRITICAL: '\\x1b[1;31m',\n\t\t\tlogging.ERROR   : '\\x1b[31m',\n\t\t\tlogging.WARNING : '\\x1b[33m',\n\t\t\tlogging.INFO    : '\\x1b[32m',\n\t\t\tlogging.DEBUG   : '\\x1b[34m',\n\t\t}\n\n\t\tdef record_factory(*args, **kwargs):\n\t\t\trecord = orig_factory(*args, **kwargs)\n\t\t\tlvl = record.levelno\n\t\t\trecord.color = level_colors.get(lvl, '')\n\t\t\trecord.levelname = 'FATAL' if lvl == logging.CRITICAL else record.levelname[0]\n\t\t\treturn record\n\telse:\n\t\tfmt = '[%(levelname)s] %(message)s'\n\n\t\tdef record_factory(*args, **kwargs):\n\t\t\trecord = orig_factory(*args, **kwargs)\n\t\t\trecord.levelname = 'FATAL' if record.levelno == logging.CRITICAL else record.levelname[0]\n\t\t\treturn record\n\n\tadj = quietness - verbosity\n\tlogging.basicConfig(level=max(30 + 10 * adj, 0), format=fmt)\n\tlogging.setLogRecordFactory(record_factory)\n\ndef log_verbosity() -> bool:\n\t'''Return whether high verbosity is enabled (True if a lot of -v are given).\n\t'''\n\treturn VERBOSITY\n\ndef eprint(*a, **kwa):\n\t'''print() wrapper that prints on standard error and flushes after printing,\n\tonly if not in silent mode.\n\t'''\n\tif not SILENT_EPRINT:\n\t\tprint(*a, **kwa, file=sys.stderr, flush=True)\n"
  },
  {
    "path": "src/systrack/output.py",
    "content": "import sys\n\nfrom itertools import starmap\nfrom json import JSONEncoder, dump\nfrom pathlib import Path\nfrom typing import Iterable\n\nfrom .kernel import Kernel\nfrom .log import eprint\nfrom .utils import noprefix\nfrom .syscall import Syscall\nfrom .version import VERSION, VERSION_COPY\n\nclass SyscallJSONEncoder(JSONEncoder):\n\tdef default(self, o):\n\t\tif isinstance(o, Syscall):\n\t\t\tdikt = {k: getattr(o, k) for k in o.__slots__}\n\t\t\t# Symbol is a namedtuple subclass, but we only care about its .name\n\t\t\tdikt['symbol'] = o.symbol.name\n\t\t\t# Let's not waste space and remove CONFIG_ prefixes\n\t\t\tif o.kconfig:\n\t\t\t\tdikt['kconfig'] = noprefix(o.kconfig, 'CONFIG_')\n\t\t\treturn dikt\n\n\t\tif isinstance(o, Path):\n\t\t\treturn str(o)\n\n\t\treturn super().default(o)\n\ndef output_syscalls_text(syscalls: Iterable[Syscall], spacing: int = 2):\n\tprevnum  = syscalls[0].number\n\ttable    = [(\n\t\t'INDEX', 'NUMBER', 'NAME', 'ORIG NAME', 'SYMBOL', 'LOCATION', 'KCONFIG',\n\t\t'SIGNATURE'\n\t)]\n\n\tfor sc in syscalls:\n\t\tif sc.number - prevnum > 1:\n\t\t\t# Blank line to separate groups of contiguous syscall numbers\n\t\t\ttable.append(None)\n\n\t\tprevnum = sc.number\n\n\t\tif sc.file and sc.line:\n\t\t\tloc = f'{sc.file}:{sc.line}'\n\t\telif sc.file:\n\t\t\tloc = str(sc.file)\n\t\telse:\n\t\t\tloc = ''\n\n\t\tif loc and not sc.good_location:\n\t\t\tloc = '(?) ' + loc\n\n\t\ttable.append((\n\t\t\tf'{sc.index:-3d}' if sc.index is not None else '-  ',\n\t\t\thex(sc.number),\n\t\t\tsc.name,\n\t\t\tsc.origname if sc.origname != sc.name else '',\n\t\t\tsc.symbol.name,\n\t\t\tloc,\n\t\t\tsc.kconfig.replace('CONFIG_', '') if sc.kconfig else '',\n\t\t\t', '.join(sc.signature) if sc.signature else '?' if sc.signature is None else 'void'\n\t\t))\n\n\twidths = [max(map(lambda row: len(row[i]) if row else 0, table)) for i in range(len(table[0]))]\n\tsep = ' ' * spacing\n\n\tfor row in table:\n\t\tif row:\n\t\t\tprint(sep.join(starmap(lambda c, w: c.ljust(w), zip(row, widths))))\n\t\telse:\n\t\t\tprint()\n\n\tsys.stdout.flush()\n\ndef output_syscalls_json(kernel: Kernel):\n\tdata = {\n\t\t'systrack_version': VERSION,\n\t\t'kernel': {\n\t\t\t'version': kernel.version_tag,\n\t\t\t'version_source': kernel.version_source,\n\t\t\t'architecture': {\n\t\t\t\t'name': kernel.arch.name,\n\t\t\t\t'bits': 32 if kernel.arch.bits32 else 64\n\t\t\t},\n\t\t\t'abi': {\n\t\t\t\t'name': kernel.arch.abi,\n\t\t\t\t'compat': kernel.arch.compat,\n\t\t\t\t'bits': 32 if kernel.arch.abi_bits32 else 64,\n\t\t\t\t'calling_convention': {\n\t\t\t\t\t'syscall_nr': kernel.arch.syscall_num_reg,\n\t\t\t\t\t'parameters': kernel.arch.syscall_arg_regs\n\t\t\t\t}\n\t\t\t},\n\t\t\t'syscall_table_symbol': kernel.arch.syscall_table_name\n\t\t},\n\t\t'syscalls': kernel.syscalls\n\t}\n\n\tdump(data, sys.stdout, cls=SyscallJSONEncoder, sort_keys=True, indent='\\t')\n\ndef output_syscalls_html(kernel: Kernel):\n\ttry:\n\t\tfrom jinja2 import Environment, PackageLoader\n\texcept ImportError:\n\t\teprint('HTML output not supported, could not import needed dependencies.')\n\t\teprint('Install the systrack[html] or systrack[full] package through pip.')\n\t\tsys.exit(1)\n\n\tenv = Environment(loader=PackageLoader('systrack'), line_statement_prefix='#', autoescape=True)\n\ttemplate = env.get_template('syscall_table.html')\n\tmax_args = max(len(s.signature) for s in kernel.syscalls if s.signature is not None)\n\n\ttemplate.stream(\n\t\tkernel_version_tag=kernel.version_tag,\n\t\tarch=kernel.arch.name,\n\t\tbits=32 if kernel.arch.bits32 else 64,\n\t\tabi=kernel.arch.abi,\n\t\tabi_bits=32 if kernel.arch.abi_bits32 else 64,\n\t\tcompat=kernel.arch.compat,\n\t\tnum_reg=kernel.arch.syscall_num_reg,\n\t\targ_regs=kernel.arch.syscall_arg_regs,\n\t\tmax_args=max_args,\n\t\tsyscalls=kernel.syscalls,\n\t\tsystrack_version=VERSION,\n\t\tsystrack_copy=VERSION_COPY.strip().replace('\\n', ' \\u2014 ')\n\t).dump(sys.stdout)\n\ndef output_syscalls(kernel: Kernel, fmt: str):\n\tif fmt == 'text':\n\t\toutput_syscalls_text(kernel.syscalls)\n\telif fmt == 'json':\n\t\toutput_syscalls_json(kernel)\n\telif fmt == 'html':\n\t\toutput_syscalls_html(kernel)\n\telse:\n\t\tsys.exit('Output format not implemented!')\n"
  },
  {
    "path": "src/systrack/signature.py",
    "content": "import logging\n\nfrom operator import itemgetter\nfrom pathlib import Path\nfrom struct import unpack, iter_unpack\nfrom typing import Tuple, List, Iterable, Iterator\n\nfrom .elf import ELF\nfrom .syscall import Syscall\nfrom .utils import noprefix\n\ndef expand_macros(sig: Iterable[str], big_endian: bool) -> Iterator[str]:\n\tfor field in sig:\n\t\tnewfield = noprefix(field, 'SC_ARG64(', 'arg_u32p(', 'compat_arg_u64_dual(', 'compat_arg_u64(')\n\n\t\tif newfield == field:\n\t\t\tyield field\n\t\t\tcontinue\n\n\t\tassert newfield[-1] == ')'\n\t\tfield = newfield[:-1]\n\n\t\tif big_endian:\n\t\t\tyield from ('u32', f'{field}_hi', 'u32', f'{field}_lo')\n\t\telse:\n\t\t\tyield from ('u32', f'{field}_lo', 'u32', f'{field}_hi')\n\ndef parse_signature(sig: str, big_endian: bool) -> Tuple[str, ...]:\n\tsplit_sig = map(str.strip, sig.split(','))\n\n\t# SC_ARG64 is standard for all archs\n\t# arg_u32p is arm64-specific\n\t# compat_arg_u64[_dual] is riscv-specific\n\tif all(x not in sig for x in ('SC_ARG64', 'arg_u32p', 'compat_arg_u64')):\n\t\t# Make sure it doesn't contain any other macros that we don't know about\n\t\tassert '(' not in sig and ')' not in sig, f'Unexpected parentheses in signature: {sig!r}'\n\t\treturn tuple(split_sig)\n\n\treturn tuple(expand_macros(split_sig, big_endian))\n\ndef syscall_signature_from_source(file: Path, line: int, big_endian: bool) -> Tuple[str, ...]:\n\tsig = b''\n\n\twith file.open('r') as f:\n\t\tfor _ in range(line - 1):\n\t\t\tnext(f)\n\n\t\tsig = f.readline().strip()\n\t\twhile len(sig) == 0 or sig[-1] not in ');':\n\t\t\tsig += f.readline().strip()\n\n\t# We only handle two scenarios here:\n\t#\n\t#     SYSCALL_DEFINEx(name, type1, arg1, type2, arg2, ...)\n\t#     asmlinkage xxx sys_xxx(type1 arg1, type2 arg2, ...)\n\n\tnewsig = noprefix(sig, 'SYSCALL_DEFINE', 'SYSCALL32_DEFINE',\n\t\t'COMPAT_SYSCALL_DEFINE', 'COMPAT_SYSCALL32_DEFINE',\n\t\t'PPC32_SYSCALL_DEFINE', 'COMPAT_SYSCALL_WRAP')\n\n\tif sig != newsig:\n\t\tsig = newsig\n\t\tstart = sig.find(',') + 1\n\t\tnargs = int(sig[0])\n\t\tassert nargs <= 6, f'SYSCALL_DEFINE{nargs}? {file}:{line}'\n\n\t\tif start == 0:\n\t\t\tassert nargs == 0, f'Expected {nargs} arguments, but found 0: {file}:{line}'\n\t\t\treturn () # no arguments\n\n\t\tsig = sig[start:sig.rfind(')')]\n\t\t# Remove __user annotation, collapse multiple spaces into one and remove\n\t\t# spaces between double pointers\n\t\tsig = ' '.join(sig.replace(' __user', '').split()).replace('* *', '**')\n\t\tsig = parse_signature(sig, big_endian)\n\n\t\tassert len(sig) % 2 == 0 and len(sig) // 2 == nargs, f'Bad signature after parsing: {file}:{line}'\n\t\tsig = tuple(f'{t}{\" \" * (t[-1] != \"*\")}{n}' for t, n in zip(sig[::2], sig[1::2]))\n\telif sig.startswith('asmlinkage'):\n\t\tstart = sig.find('(') + 1\n\t\tsig = sig[start:sig.rfind(')')].strip()\n\t\tif not sig or sig == 'void':\n\t\t\treturn () # no arguments\n\n\t\t# Remove __user annotation, collapse multiple spaces into one and remove\n\t\t# spaces between asterisks of pointers\n\t\tsig = ' '.join(sig.replace(' __user', '').split()).replace('* *', '**')\n\n\t\t# We are assuming macros like arg_u32p are only used for SYSCALL_DEFINEx\n\t\tassert '(' not in sig and ')' not in sig, f'Unexpected parentheses in signature: {file}:{line}'\n\t\tsig = tuple(map(str.strip, sig.split(',')))\n\t\tassert len(sig) <= 7, f'Syscall with {len(sig)} arguments? {file}:{line}'\n\telse:\n\t\tlogging.error(\"This doesn't look like a syscall signature: %s:%d\", file, line)\n\t\treturn None\n\n\treturn sig\n\ndef extract_syscall_signatures(syscalls: List[Syscall], vmlinux: ELF, have_source: bool):\n\thave_syscall_metadata = '__start_syscalls_metadata' in vmlinux.symbols\n\tmeta = {}\n\tres = []\n\n\t# TODO: could we also extract signatures from DWARF or BTF even if we have\n\t# no ftrace metadata and no KDIR? How?\n\n\t# First extract signatures from ftrace metadata. If the kernel was compiled\n\t# with CONFIG_FTRACE_SYSCALLS=y we have signature information available in a\n\t# bunch of `struct syscall_metadata` objects.\n\tif have_syscall_metadata:\n\t\tlogging.info('Kernel has ftrace syscall metadata from FTRACE_SYSCALLS=y')\n\n\t\tstart    = vmlinux.symbols['__start_syscalls_metadata'].real_vaddr\n\t\tstop     = vmlinux.symbols['__stop_syscalls_metadata'].real_vaddr\n\t\tptr_fmt  = '<>'[vmlinux.big_endian] + 'QL'[vmlinux.bits32]\n\t\tmeta_fmt = '<>'[vmlinux.big_endian] + ('QllQQ', 'LllLL')[vmlinux.bits32]\n\t\tptr_sz   = 4 if vmlinux.bits32 else 8\n\t\tmeta_sz  = 8 + 3 * ptr_sz\n\t\tptrs     = map(itemgetter(0), iter_unpack(ptr_fmt, vmlinux.vaddr_read(start, stop - start)))\n\n\t\t# Sanity check\n\t\topen_meta = vmlinux.symbols.get('__syscall_meta__open')\n\t\tif open_meta and open_meta.size:\n\t\t\tassert open_meta.size >= meta_sz\n\n\t\tfor ptr in ptrs:\n\t\t\t# Number (second field) is filled at boot and always -1\n\t\t\tname, _, nargs, types, args = unpack(meta_fmt, vmlinux.vaddr_read(ptr, meta_sz))\n\t\t\t# Sanity check: nargs > 0 => types != NULL and args != NULL\n\t\t\tassert nargs >= 0 and (nargs == 0 or (types and args))\n\n\t\t\tname = vmlinux.vaddr_read_string(name).strip()\n\t\t\tname = noprefix(name, 'sys_')\n\t\t\tsig = []\n\n\t\t\tfor i in range(nargs):\n\t\t\t\ttyp = unpack(ptr_fmt, vmlinux.vaddr_read(types + i * ptr_sz, ptr_sz))[0]\n\t\t\t\targ = unpack(ptr_fmt, vmlinux.vaddr_read(args + i * ptr_sz, ptr_sz))[0]\n\t\t\t\ttyp = vmlinux.vaddr_read_string(typ).strip()\n\t\t\t\targ = vmlinux.vaddr_read_string(arg).strip()\n\t\t\t\t# Double pointers can have spaces between asterisks\n\t\t\t\ttyp = typ.replace('* *', '**')\n\t\t\t\tsig.append(f'{typ}{\" \" * (typ[-1] != \"*\")}{arg}')\n\n\t\t\tmeta[name] = tuple(sig)\n\telse:\n\t\tlogging.info('Kernel DOES NOT have ftrace syscall metadata')\n\n\t# Now extract signatures from the source code based on the location info we\n\t# [should] already have\n\tfor sc in filter(lambda s: not s.esoteric, syscalls):\n\t\tif sc.good_location:\n\t\t\t# We know that this location points to a `SYSCALL_DEFINEx` or an\n\t\t\t# `asmlinkage` function: extract signature right from source code\n\t\t\tassert have_source, 'good location with no kernel source? WHAT'\n\t\t\tsc.signature = syscall_signature_from_source(sc.file, sc.line, vmlinux.big_endian)\n\t\telif have_syscall_metadata:\n\t\t\t# Weird/bad location, fallback to FTRACE_SYSCALLS metadata if\n\t\t\t# possible\n\t\t\tsig = meta.get(sc.origname)\n\t\t\tif sig is None:\n\t\t\t\tsig = meta.get(sc.name)\n\t\t\t\tif sig is None:\n\t\t\t\t\tlogging.debug('Signature NOT found in ftrace metadata: %s', sc.name)\n\t\t\t\t\tcontinue\n\n\t\t\tsc.signature = sig\n\t\t\tlogging.debug('Signature extracted from ftrace metadata: %s', sc.name)\n\t\telse:\n\t\t\t# Weird/bad location and no FTRACE_SYSCALLS metadata :(\n\t\t\tif sc.file is not None and sc.line is not None:\n\t\t\t\tlogging.debug('Signature extraction skipped: %s at %s:%d',\n\t\t\t\t\tsc.name, sc.file, sc.line)\n\n\treturn res\n\n"
  },
  {
    "path": "src/systrack/syscall.py",
    "content": "from collections import Counter\nfrom pathlib import Path\nfrom typing import List\n\nfrom .elf import Symbol\n\nclass Syscall:\n\t'''Class representing a Linux syscall.\n\t'''\n\t# NOTE: do not remove, __slots__ are used used by the JSON encoder\n\t__slots__ = (\n\t\t'index', 'number',\n\t\t'name', 'origname', 'symbol',\n\t\t'file', 'line', 'signature',\n\t\t'esoteric', 'good_location', 'grepped_location', 'kconfig'\n\t)\n\n\tdef __init__(self, index: int, number: int, name: str, origname: str,\n\t\t\tsymbol: Symbol, kconfig: str, file: Path = None, line: int = None,\n\t\t\tsignature: List[str] = None, esoteric: bool = False):\n\t\tself.index            = index\n\t\tself.number           = number\n\t\tself.name             = name\n\t\tself.origname         = origname\n\t\tself.symbol           = symbol\n\t\tself.kconfig          = kconfig\n\t\tself.file             = file\n\t\tself.line             = line\n\t\tself.signature        = signature\n\t\tself.esoteric         = esoteric\n\t\tself.good_location    = False\n\t\tself.grepped_location = False\n\n\tdef __repr__(s):\n\t\tfile = '??' if s.file is None else s.file\n\t\tline = '?' if s.line is None else s.line\n\t\tres  = f'Syscall(index={s.index}, number={s.number}, name={s.name!r}, '\n\t\tres += f'symbol={s.symbol.name!r}, defined at {file}:{line}, '\n\t\tres += f'takes {len(s.signature) if s.signature else \"?\"} args'\n\t\tres += f', depends on {s.kconfig})' if s.kconfig else ')'\n\t\treturn res\n\ndef common_syscall_symbol_prefixes(names: List[str], threshold: int) -> List[str]:\n\t'''Given a list of symbol names, find and return a list of common prefixes\n\tof the form \"xxx_\" that appear in a number of symbols greater than or equal\n\tto threshold.\n\n\tFor example, given that a bunch of syscalls in x86-64 start with __x64_sys_,\n\tthis function returns ['__x64_sys_', '__x64_', '__'].\n\t'''\n\tres = []\n\n\tfor l in range(max(map(len, names)), 1, -1):\n\t\tcandidates = list(filter(lambda n: len(n) >= l and n[l - 1] == '_', names))\n\t\tif len(candidates) < threshold:\n\t\t\tcontinue\n\n\t\tcounts = Counter(name[:l] for name in candidates)\n\t\tres.extend(filter(lambda name: counts[name] >= threshold, counts))\n\n\treturn res\n"
  },
  {
    "path": "src/systrack/templates/syscall_table.css",
    "content": ":root {\n\t--main-bg: white;\n\t--main-fg: black;\n\t--table-fg: black;\n\t--table-bg: white;\n\t--table-head-bg: #d7efff;\n\t--table-head-bg-hover: #93d4ff;\n\t--table-row-bg-hover: #c5ffdf;\n\t--table-border: 1px solid #d0d0d0;\n\t--link-fg: #00319f;\n\t--link-fg-visited: #7f009f;\n}\n\nbody {\n\tfont-family: consolas, monospace;\n\tfont-size: 12px;\n\tcolor: var(--main-fg);\n\tbackground-color: var(--main-bg);\n}\n\na, a:visited {\n\tcolor: var(--main-fg);\n}\n\ntable {\n\tpadding: 5px;\n\tcolor: var(--table-fg);\n\tborder: var(--table-border);\n\tborder-collapse: collapse;\n}\n\ntable th {\n\ttop: 0;\n\tposition: sticky;\n\ttext-align: left;\n\tpadding: 5px;\n\tborder: var(--table-border);\n\tbackground-color: var(--table-head-bg);\n}\n\ntable th.sortable {\n\tcursor: pointer;\n}\n\ntable tr.highlight td {\n\tbackground-color: var(--table-row-bg-hover);\n}\n\ntable td {\n\ttext-align: left;\n\tpadding: 3px 5px 3px;\n\tborder: var(--table-border);\n\tbackground-color: var(--table-bg);\n}\n\ntable a {\n\tcolor: var(--link-fg);\n\ttext-decoration: none;\n}\n\ntable a:visited {\n\tcolor: var(--link-fg-visited);\n}\n\ntable span.argtype {\n\tcolor: #006e8f;\n}\n\ntable td.unknown {\n\tfont-family: sans-serif;\n\tfont-style: italic;\n}\n\n/* Emojis! Use U+202f (narrow no-break space) to space header sort arrows and\n   U+2002 (en space) to space emojis for bad locations and esoteric syscalls. */\n\ntable th.ascending::before  { content: '\\2b07\\fe0f\\202f';  }\ntable th.descending::before { content: '\\2b06\\fe0f\\202f';  }\ntable td.bad::after         { content: '\\2002\\26a0\\fe0f';  }\ntable td.esoteric::after    { content: '\\2002\\1f984\\fe0f'; }\n\n@media (any-hover: hover) {\n\ttable th.sortable:hover {\n\t\tcursor: pointer;\n\t\tbackground-color: var(--table-head-bg-hover);\n\t}\n\n\ttable tr:hover td {\n\t\tbackground-color: var(--table-row-bg-hover);\n\t}\n\n\ttable a:hover {\n\t\ttext-decoration: underline;\n\t}\n}\n"
  },
  {
    "path": "src/systrack/templates/syscall_table.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<title>Linux {{kernel_version_tag}} {{arch}} {{bits}}-bit, {{'compat ' if compat else ''}}{{abi_bits}}-bit {{abi}} syscall table</title>\n\t\t<meta charset=\"UTF-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\t\t<style>{% include 'syscall_table.css' %}</style>\n\t</head>\n\t<body>\n\t\t<h1>Linux {{kernel_version_tag}} syscall table</h1>\n\t\t<h2>Architecture: {{arch}} {{bits}}-bit</h2>\n\t\t<h2>ABI: {{'compat ' if compat else ''}}{{abi_bits}}-bit {{abi}}</h2>\n\t\t<table>\n\t\t\t<tbody>\n\t\t\t\t<tr>\n\t\t\t\t\t<th class=\"sortable ascending\" colspan=\"2\">Number{% if num_reg %}&nbsp;({{num_reg}}){% endif %}</th>\n\t\t\t\t\t<th class=\"sortable\">Name</th>\n\t\t\t\t\t<th class=\"sortable\">Symbol</th>\n\t\t\t\t\t<th class=\"sortable\">Definition location</th>\n\t\t\t\t\t<th class=\"sortable\">Kconfig</th>\n# for i in range(max_args):\n\t\t\t\t\t<th>Arg {{i + 1}} ({{arg_regs[i]}})</th>\n# endfor\n\t\t\t\t</tr>\n# for sc in syscalls:\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{sc.number}}</td>\n\t\t\t\t\t<td>{{ '0x%x' | format(sc.number) }}</td>\n\t\t\t\t\t<td{%if sc.esoteric %} class=\"esoteric\" title=\"This syscall has an esoteric implementation\"{% endif %}>{{sc.name}}</td>\n\t\t\t\t\t<td>{{sc.symbol.name}}</td>\n\t# if sc.file and sc.line is not none\n\t\t# if not sc.good_location\n\t\t\t\t\t<td class=\"bad\" title=\"The identified location may be inaccurate (non-standard definition or missing kernel sources)\">\n\t\t# elif sc.grepped_location\n\t\t\t\t\t<td class=\"bad\" title=\"This syscall definition was found through grepping, the identified location may be inaccurate\">\n\t\t# else\n\t\t\t\t\t<td>\n\t\t# endif\n\t\t# if sc.file.is_absolute()\n\t\t\t\t\t\t{{sc.file}}:{{sc.line}}\n\t\t# else\n\t\t\t\t\t\t<a target=\"_blank\" href=\"https://elixir.bootlin.com/linux/{{kernel_version_tag}}/source/{{sc.file}}#L{{sc.line}}\">{{sc.file}}:{{sc.line}}</a>\n\t\t# endif\n\t\t\t\t\t</td>\n\t# elif sc.file\n\t\t\t\t\t<td class=\"bad\" title=\"The syscall definition could not be located within this file, the identified location may be inaccurate\">\n\t\t# if sc.file.is_absolute()\n\t\t\t\t\t\t{{sc.file}}:??\n\t\t# else\n\t\t\t\t\t\t<a target=\"_blank\" href=\"https://elixir.bootlin.com/linux/{{kernel_version_tag}}/source/{{sc.file}}\">{{sc.file}}:??</a>\n\t\t# endif\n\t\t\t\t\t</td>\n\t# else\n\t\t\t\t\t<td class=\"unknown\">unknown</td>\n\t# endif\n\t\t\t\t\t<td>{{(sc.kconfig | replace(\"CONFIG_\", \"\") + \"=y\") if sc.kconfig else ''}}</td>\n\t# if sc.signature is none\n\t\t\t\t\t<td colspan=\"{{max_args}}\" class=\"unknown\">unknown signature</td>\n\t# elif sc.signature | length == 0\n\t\t\t\t\t<td colspan=\"{{max_args}}\"><span class=\"argtype\">void</span></td>\n\t# else\n\t\t# for arg in sc.signature:\n\t\t\t# set i = arg.rfind(' ') + 1\n\t\t\t\t\t<td><span class=\"argtype\">{{arg[:i]}}</span><span class=\"argname\">{{arg[i:]}}</span></td>\n\t\t# endfor\n\t\t# set span = max_args - sc.signature|length\n\t\t# if span > 0:\n\t\t\t\t\t<td colspan=\"{{span}}\"></td>\n\t\t# endif\n\t# endif\n\t\t\t\t</tr>\n# endfor\n\t\t\t</tbody>\n\t\t</table>\n\t\t<p>Auto-generated by <a target=\"_blank\" href=\"https://github.com/mebeim/systrack\">Systrack v{{systrack_version}}</a> &#x2014; {{systrack_copy}}</p>\n\t\t<script>{% include 'syscall_table.js' %}</script>\n\t</body>\n</html>\n"
  },
  {
    "path": "src/systrack/templates/syscall_table.js",
    "content": "const table = document.getElementsByTagName('table')[0]\n\nfunction sortTable(e) {\n\tconst header = e.target\n\tconst idx    = Array.from(header.parentNode.children).indexOf(e.target)\n\tconst rows   = Array.from(table.querySelectorAll('tr')).slice(1)\n\tconst desc   = header.classList.contains('ascending')\n\tconst body   = rows[0].parentElement\n\tlet getValue\n\n\tif (idx === 0) {\n\t\tgetValue = el => parseInt(el.children[0].textContent, 16)\n\t} else {\n\t\t// The \"number\" header spans two columns (for decimal and hexadecimal)\n\t\tgetValue = el => el.children[idx + 1].textContent\n\t}\n\n\trows.forEach(el => body.removeChild(el))\n\trows.sort((a, b) => {\n\t\tlet va = getValue(a)\n\t\tlet vb = getValue(b)\n\n\t\tif (desc)\n\t\t\t[va, vb] = [vb, va]\n\n\t\tif (va > vb) return 1\n\t\tif (va < vb) return -1\n\t\treturn 0\n\t})\n\n\trows.forEach(el => body.appendChild(el))\n\ttable.querySelectorAll('th').forEach(h => h.classList.remove('ascending', 'descending'))\n\theader.classList.add(desc ? 'descending' : 'ascending')\n}\n\nfunction highlightRow(e) {\n\tconst row = e.currentTarget\n\trow.classList.toggle('highlight')\n}\n\ndocument.querySelectorAll('th.sortable').forEach(el => el.addEventListener('click', sortTable))\ndocument.querySelectorAll('tr:not(:first-child)').forEach(el => el.addEventListener('click', highlightRow))\n"
  },
  {
    "path": "src/systrack/type_hints.py",
    "content": "from typing import Union, Tuple, List, Optional\n\nKernelVersion = Union[Tuple[int],Tuple[int,int],Tuple[int,int,int]]\nEsotericSyscall = List[Tuple[int,str,str,Tuple[str,...],Optional[str]]]\n"
  },
  {
    "path": "src/systrack/utils.py",
    "content": "import sys\nimport logging\n\nfrom collections import defaultdict\nfrom pathlib import Path\nfrom shlex import join as shlex_join\nfrom shutil import which\nfrom subprocess import Popen, DEVNULL, PIPE\nfrom textwrap import indent\nfrom typing import Union, Iterable, Tuple, Any, AnyStr, Hashable, Optional\n\nfrom .log import log_verbosity\n\n\nAnyStrOrPath = Union[AnyStr,Path]\n\n\nclass VersionedDict:\n\t'''A dict that can have multiple versions with different contents. Accessing\n\td[version] will return the value of the dict for the given version. Adding\n\ta {key: value} for a range of versions can be done through the .add()\n\tmethod.\n\t'''\n\t__slots__ = ('_versions', '_cache')\n\n\tdef __init__(self, iterable: Optional[Iterable[Tuple[Hashable,Hashable,Hashable,Any]]]=None):\n\t\t'''Instantiate a VersionedDict given initial version ranges and relative\n\t\tkey-value pairs, or an empty VersionedDict if iterable is not given.\n\n\t\tThe given iterable= is an iterable of tuples where each tuple is of the\n\t\tform (vstart, vend, key, val), i.e., the same parameters taken by the\n\t\t.add() method.\n\t\t'''\n\t\tself._cache    = {}\n\t\tself._versions = defaultdict(dict)\n\n\t\tif iterable is not None:\n\t\t\tfor vstart, vend, key, val in iterable:\n\t\t\t\tself._versions[vstart, vend][key] = val\n\n\tdef __getitem__(self, version: Hashable) -> dict:\n\t\t'''Get the dict corresponding to the given version.\n\t\t'''\n\t\tif version not in self._cache:\n\t\t\tself._cache[version] = self._getversion(version)\n\t\treturn self._cache[version]\n\n\tdef _getversion(self, version: Hashable) -> dict:\n\t\t'''Create and return the dict corresponding to the given version.\n\t\t'''\n\t\tres = {}\n\t\tfor (vstart, vend), dct in self._versions.items():\n\t\t\tif vstart <= version < vend:\n\t\t\t\tres.update(dct)\n\t\treturn res\n\n\tdef add(self, vstart: Hashable, vend: Hashable, key: Hashable, value: Any):\n\t\t'''Add a {key: value} mapping for all versions of this VersionedDict\n\t\tbetween vstart (included) and vend (not included).\n\t\t'''\n\t\tself._versions[vstart, vend][key] = value\n\n\t\t# Invalidate cache for any version in [vstart, vend)\n\t\tfor v in self._cache:\n\t\t\tif vstart <= v < vend:\n\t\t\t\tdel self._cache[v]\n\n\nclass VersionedList:\n\t'''A list that can have multiple versions with different contents. Accessing\n\tlst[version] will return the value of the list for the given version. Adding\n\tvalues for a range of versions can be done through the .add() method.\n\t'''\n\t__slots__ = ('_versions', '_cache')\n\n\tdef __init__(self, iterable: Optional[Iterable[Tuple[Hashable,Hashable,Iterable[Any]]]]=None):\n\t\t'''Instantiate a VersionedList given initial version ranges and relative\n\t\tvalues, or an empty VersionedList if iterable is not given.\n\n\t\tThe given iterable= is an iterable of tuples where each tuple is of the\n\t\tform (vstart, vend, iterable_of_values), i.e., the same parameters taken\n\t\tby the .add() method.\n\t\t'''\n\t\tself._cache    = {}\n\t\tself._versions = defaultdict(list)\n\n\t\tif iterable is not None:\n\t\t\tfor vstart, vend, values in iterable:\n\t\t\t\tself._versions[vstart, vend].extend(values)\n\n\tdef __getitem__(self, version: Hashable) -> list:\n\t\t'''Get the list corresponding to the given version.\n\t\t'''\n\t\tif version not in self._cache:\n\t\t\tself._cache[version] = self._getversion(version)\n\t\treturn self._cache[version]\n\n\tdef _getversion(self, version: Hashable) -> list:\n\t\t'''Create and return the list corresponding to the given version.\n\t\t'''\n\t\tres = []\n\t\tfor (vstart, vend), lst in self._versions.items():\n\t\t\tif vstart <= version < vend:\n\t\t\t\tres.extend(lst)\n\t\treturn res\n\n\tdef add(self, vstart: Hashable, vend: Hashable, values: Iterable[Any]):\n\t\t'''Add all the values from values to for all versions of this\n\t\tVersionedList between vstart (included) and vend (not included).\n\t\t'''\n\t\tself._versions[vstart, vend].extend(values)\n\n\t\t# Invalidate cache for any version in [vstart, vend)\n\t\tfor v in self._cache:\n\t\t\tif vstart <= v < vend:\n\t\t\t\tdel self._cache[v]\n\n\ndef maybe_rel(path: Path, root: Path) -> Path:\n\t'''Calculate and return a the given path relative to root. If path is not\n\trelative to root, it is returned as is.\n\t'''\n\treturn path.relative_to(root) if root is not None and path.is_relative_to(root) else path\n\ndef anyprefix(s: str, *pxs: str) -> bool:\n\t'''Determine whether the given string as any of the given prefixes.\n\t'''\n\treturn any(s.startswith(px) for px in pxs)\n\ndef anysuffix(s: str, *sxs: str) -> bool:\n\t'''Determine whether the given string as any of the given suffixes.\n\t'''\n\treturn any(s.endswith(sx) for sx in sxs)\n\ndef noprefix(s: str, *pxs: str) -> str:\n\t'''Find the first matching prefix in s among pxs and return a new string\n\twithout it. If s does not have any of the given prefixes, it is returned as\n\tis.\n\t'''\n\tfor px in pxs:\n\t\tif s.startswith(px):\n\t\t\treturn s[len(px):]\n\treturn s\n\ndef nosuffix(s: str, *sxs: str) -> str:\n\t'''Find the first matching suffix in s among sxs and return a new string\n\twithout it. If s does not have any of the given suffixes, it is returned as\n\tis.\n\t'''\n\tfor sx in sxs:\n\t\tif s.endswith(sx):\n\t\t\treturn s[:-len(sx)]\n\treturn s\n\ndef do_popen(cmd: Union[AnyStr,Iterable[AnyStr]], cwd: Union[AnyStr,Path], **kwargs) -> Popen:\n\t'''Conveniency wrapper around subprocess.Popen, which gracefully handles\n\tFileNotFoundError and NotADirectoryError providing useful logging to the\n\tuser.\n\t'''\n\ttry:\n\t\treturn Popen(cmd, cwd=cwd, **kwargs)\n\texcept FileNotFoundError:\n\t\t# We can also get here if the passed cwd= is invalid, so differentiate\n\t\t# between the two. Yes this is racy... see if I care.\n\t\tif cwd.exists():\n\t\t\tcmd = cmd.split()[0] if isinstance(cmd, str) else cmd[0]\n\t\t\tlogging.critical('Command not found: %s', cmd)\n\t\telse:\n\t\t\tlogging.critical('Directory does not exist: %s', cwd)\n\texcept NotADirectoryError:\n\t\tlogging.critical('Path is not a directory: %s', cwd)\n\n\treturn None\n\ndef command_argv_to_string(cmd: Union[AnyStrOrPath,Iterable[AnyStrOrPath]]) -> str:\n\t'''Convert the given command, which can be str, bytes, Path, or an iterable\n\tcontaining any of those, to a shlex-escaped string.\n\t'''\n\tif isinstance(cmd, Path):\n\t\treturn str(cmd)\n\telif isinstance(cmd, bytes):\n\t\treturn cmd.decode()\n\telif isinstance(cmd, str):\n\t\treturn cmd\n\n\tparts = []\n\tfor part in cmd:\n\t\tif isinstance(part, Path):\n\t\t\tparts.append(str(part))\n\t\telif isinstance(part, bytes):\n\t\t\tparts.append(part.decode())\n\t\telse:\n\t\t\tparts.append(part)\n\n\treturn shlex_join(parts)\n\ndef run_command(cmd: Union[AnyStrOrPath,Iterable[AnyStrOrPath]],\n\t\tcwd: Optional[AnyStrOrPath]=None, stdin: Optional[AnyStr]=None,\n\t\tconsole_output: bool=False) -> int:\n\t'''Run the given command (cmd), optionally under the given working directory\n\t(cwd), optionally passing the given data to standard input (stdin), and\n\toptionally enabling console output. The returned value is the exit code of\n\tthe command.\n\t'''\n\tif log_verbosity() >= 3:\n\t\tlogging.debug('Running command: %s', command_argv_to_string(cmd))\n\n\tif console_output:\n\t\tstdout, stderr = sys.stdout, sys.stderr\n\telse:\n\t\tstdout = stderr = DEVNULL\n\n\tchild = do_popen(cmd, cwd=cwd, shell=isinstance(cmd, str), stdout=stdout, stderr=stderr)\n\tif child is None:\n\t\treturn 127\n\n\tchild.communicate(stdin)\n\treturn child.returncode\n\ndef ensure_command(cmd: Union[AnyStrOrPath,Iterable[AnyStrOrPath]],\n\t\tcwd: Optional[AnyStrOrPath]=None, stdin: Optional[AnyStr]=None,\n\t\tcapture_stdout: bool=True, console_output: bool=False) -> AnyStr:\n\t'''Run the given command (cmd), optionally under the given working directory\n\t(cwd), optionally passing the given data to standard input (stdin),\n\tcapturing and returning its standard output (if capture_stdout=True) and\n\toptionally enabling console output (if console_output=True).\n\n\tIf the given command is not found or exits with a non-zero exit code, the\n\tstandard error produced by the command is loggged and the caller is\n\tterminated by means of sys.exit().\n\t'''\n\t# console_output implies not capture_stdout\n\tassert not console_output or not capture_stdout\n\n\tif log_verbosity() >= 3:\n\t\tlogging.debug('Running command: %s', command_argv_to_string(cmd))\n\n\tif console_output:\n\t\tstdout, stderr = sys.stdout, sys.stderr\n\telse:\n\t\tstdout = PIPE if capture_stdout else DEVNULL\n\t\tstderr = PIPE\n\n\tchild = do_popen(cmd, cwd=cwd, shell=isinstance(cmd, str), stdout=stdout, stderr=stderr, text=True)\n\tif child is None:\n\t\tsys.exit(127)\n\n\tout, err = child.communicate(stdin)\n\n\tif child.returncode != 0:\n\t\tif stderr == PIPE:\n\t\t\terr = ('\\n' + indent(err, '\\t')) if err.strip() else ' (no stderr output)'\n\t\telse:\n\t\t\terr = ''\n\n\t\tlogging.critical('Command returned %d: %s%s', child.returncode, cmd, err)\n\t\tsys.exit(1)\n\n\treturn out\n\ndef command_available(name: AnyStr) -> bool:\n\t'''Wrapper for shutil.which to determine whether a command is available or\n\tnot (i.e., whether it is under the current PATH paths) given its name.\n\t'''\n\treturn which(name) is not None\n\ndef gcc_version(gcc_cmd: AnyStr) -> str:\n\t'''Run GCC to get its version and return it as a string. Execution will be\n\taborted if the given GCC command is not found.\n\t'''\n\treturn ensure_command((gcc_cmd, '--version')).splitlines()[0].strip()\n\ndef git_checkout(repo_dir: Union[AnyStr,Path], ref: AnyStr):\n\t'''Run git checkout inside repo_dir to check out to the given ref. Execution\n\twill be aborted if git is not found or errors out.\n\t'''\n\tensure_command(('git', 'checkout', ref), cwd=repo_dir, capture_stdout=False)\n\ndef format_duration(s: float) -> str:\n\t'''Convert a duration in seconds to a human readable string specifying\n\thours, minutes and seconds.\n\t'''\n\ts = round(s)\n\th = s // 3600\n\ts %= 3600\n\tm = s // 60\n\ts %= 60\n\n\tif h > 0:\n\t\treturn f'{h}h {m:02d}m {s:02d}s'\n\tif m > 0:\n\t\treturn f'{m}m {s:02d}s'\n\treturn f'{s}s'\n"
  },
  {
    "path": "src/systrack/version.py",
    "content": "VERSION = '0.8'\nVERSION_COPY = '''\\\nCopyright (C) 2023-2025 Marco Bonelli\nLicensed under the GNU General Public License v3.0\n'''\nVERSION_HELP = f'''\\\nSystrack version {VERSION}\n{VERSION_COPY}\\\n'''\n\nif __name__ == '__main__':\n\tprint(VERSION)\n"
  },
  {
    "path": "tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/data/.gitignore",
    "content": "*\n!.gitignore\n!Makefile\n!*.s\n"
  },
  {
    "path": "tests/data/Makefile",
    "content": "ASMS = $(wildcard *.s)\nBINS = $(ASMS:.s=)\n\n.PHONY: all clean\nall: $(BINS)\n\n# Need to link because GNU AS generates relocations for the call insns.\n# OTOH clang is generates a .o w/o relocations for call insns, might consider\n# using it in the future.\n%: %.s\n\t$(CC) -ffreestanding -nostdlib -o $@ $@.s\n\nclean:\n\trm -f $(BINS)\n"
  },
  {
    "path": "tests/data/x86_no_table_syscall_handlers.s",
    "content": ".section .text\n\n.globl x64_sys_call\n.type x64_sys_call @function\nx64_sys_call:\n\tendbr64\n\tcmp    $0xbe,%esi\n\tje     0xffffffff81003b4b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x169b> */\n\tja     0xffffffff81002532 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x82> */\n\tcmp    $0x59,%esi\n\tje     0xffffffff81003b46 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1696> */\n\tjbe    0xffffffff810029c5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x515> */\n\tcmp    $0x87,%esi\n\tje     0xffffffff81003b41 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1691> */\n\tjbe    0xffffffff81002976 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x4c6> */\n\tcmp    $0x9f,%esi\n\tje     0xffffffff81003b3c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x168c> */\n\tjbe    0xffffffff81002912 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x462> */\n\tcmp    $0xaa,%esi\n\tje     0xffffffff81003b37 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1687> */\n\tjbe    0xffffffff810028e1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x431> */\n\tcmp    $0xb3,%esi\n\tje     0xffffffff81003b32 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1682> */\n\tjbe    0xffffffff810025c8 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x118> */\n\tcmp    $0xbc,%esi\n\tje     0xffffffff81003b2d - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x167d> */\n\tcmp    $0xbd,%esi\n\tjne    0xffffffff810025ab - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xfb> */\n\tjmp    0xffffffff8135ae20 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_lsetxattr> */\n\tcmp    $0x11e,%esi\n\tje     0xffffffff81003b28 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1678> */\n\tjbe    0xffffffff8100275f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x2af> */\n\tcmp    $0x14b,%esi\n\tje     0xffffffff81003b23 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1673> */\n\tjbe    0xffffffff8100270a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x25a> */\n\tcmp    $0x1b9,%esi\n\tje     0xffffffff81003b1e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x166e> */\n\tjbe    0xffffffff810026a6 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1f6> */\n\tcmp    $0x1c4,%esi\n\tje     0xffffffff81003b19 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1669> */\n\tjbe    0xffffffff81002675 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1c5> */\n\tcmp    $0x1ca,%esi\n\tje     0xffffffff8100386c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13bc> */\n\tjbe    0xffffffff81002610 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x160> */\n\tcmp    $0x1cd,%esi\n\tje     0xffffffff81003867 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13b7> */\n\tjbe    0xffffffff810025f3 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x143> */\n\tcmp    $0x1ce,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812de850 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mseal> */\n\tcmp    $0xba,%esi\n\tje     0xffffffff81003cdb - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x182b> */\n\tcmp    $0xbb,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81284070 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_readahead> */\n\tcmp    $0xad,%esi\n\tje     0xffffffff81003cd6 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1826> */\n\tjbe    0xffffffff8100263b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x18b> */\n\tcmp    $0xaf,%esi\n\tje     0xffffffff81003cd1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1821> */\n\tcmp    $0xb0,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8113bdc0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_delete_module> */\n\tcmp    $0x1cb,%esi\n\tje     0xffffffff81003ccc - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x181c> */\n\tcmp    $0x1cc,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff815111a0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_lsm_set_self_attr> */\n\tcmp    $0x1c7,%esi\n\tje     0xffffffff81003cc7 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1817> */\n\tjbe    0xffffffff81002658 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1a8> */\n\tcmp    $0x1c8,%esi\n\tje     0xffffffff81003cc2 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1812> */\n\tcmp    $0x1c9,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813570d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_statmount> */\n\tcmp    $0xab,%esi\n\tje     0xffffffff81003cbd - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x180d> */\n\tcmp    $0xac,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810370f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_iopl> */\n\tcmp    $0x1c5,%esi\n\tje     0xffffffff81003cb8 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1808> */\n\tcmp    $0x1c6,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81161930 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_futex_wake> */\n\tcmp    $0x1bf,%esi\n\tje     0xffffffff81003cb3 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1803> */\n\tjbe    0xffffffff81002fe5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xb35> */\n\tcmp    $0x1c2,%esi\n\tje     0xffffffff81003cae - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17fe> */\n\tjbe    0xffffffff810026ed - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x23d> */\n\tcmp    $0x1c3,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8127a6d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_cachestat> */\n\tcmp    $0x1ae,%esi\n\tje     0xffffffff81003ca9 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17f9> */\n\tjbe    0xffffffff810036de - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x122e> */\n\tcmp    $0x1b4,%esi\n\tje     0xffffffff81003ca4 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17f4> */\n\tjbe    0xffffffff810030b9 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xc09> */\n\tcmp    $0x1b7,%esi\n\tje     0xffffffff81003c9f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17ef> */\n\tjbe    0xffffffff810030e4 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xc34> */\n\tcmp    $0x1b8,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812f2ea0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_process_madvise> */\n\tcmp    $0x1c0,%esi\n\tje     0xffffffff81003c9a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17ea> */\n\tcmp    $0x1c1,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81161650 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_futex_waitv> */\n\tcmp    $0x135,%esi\n\tje     0xffffffff81003c95 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17e5> */\n\tjbe    0xffffffff81002818 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x368> */\n\tcmp    $0x140,%esi\n\tje     0xffffffff81003c90 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17e0> */\n\tjbe    0xffffffff810027e7 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x337> */\n\tcmp    $0x146,%esi\n\tje     0xffffffff81003c8b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17db> */\n\tjbe    0xffffffff8100287c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x3cc> */\n\tcmp    $0x149,%esi\n\tje     0xffffffff81003c86 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17d6> */\n\tjbe    0xffffffff810027ca - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x31a> */\n\tcmp    $0x14a,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812cce90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pkey_alloc> */\n\tcmp    $0xf1,%esi\n\tje     0xffffffff81003c81 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17d1> */\n\tjbe    0xffffffff810032ea - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xe3a> */\n\tcmp    $0x108,%esi\n\tje     0xffffffff81003c7c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17cc> */\n\tjbe    0xffffffff81003072 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xbc2> */\n\tcmp    $0x113,%esi\n\tje     0xffffffff81003c77 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17c7> */\n\tjbe    0xffffffff8100325b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xdab> */\n\tcmp    $0x119,%esi\n\tje     0xffffffff81003c72 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17c2> */\n\tjbe    0xffffffff81002fb6 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xb06> */\n\tcmp    $0x11c,%esi\n\tje     0xffffffff81003c6d - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17bd> */\n\tjbe    0xffffffff810028a7 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x3f7> */\n\tcmp    $0x11d,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8131bcc0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fallocate> */\n\tcmp    $0x147,%esi\n\tje     0xffffffff81003c68 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17b8> */\n\tcmp    $0x148,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81321d80 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pwritev2> */\n\tcmp    $0x13b,%esi\n\tje     0xffffffff81003c63 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17b3> */\n\tjbe    0xffffffff81003014 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xb64> */\n\tcmp    $0x13e,%esi\n\tje     0xffffffff81003c5e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17ae> */\n\tjbe    0xffffffff8100285f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x3af> */\n\tcmp    $0x13f,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81319ee0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_memfd_create> */\n\tcmp    $0x12a,%esi\n\tje     0xffffffff81003c59 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17a9> */\n\tjbe    0xffffffff81003166 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xcb6> */\n\tcmp    $0x130,%esi\n\tje     0xffffffff81003c54 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x17a4> */\n\tjbe    0xffffffff8100313b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xc8b> */\n\tcmp    $0x133,%esi\n\tje     0xffffffff81003c4f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x179f> */\n\tjbe    0xffffffff81003204 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xd54> */\n\tcmp    $0x134,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810c4860 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setns> */\n\tcmp    $0x13c,%esi\n\tje     0xffffffff81003c4a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x179a> */\n\tcmp    $0x13d,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8119e490 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_seccomp> */\n\tcmp    $0x143,%esi\n\tje     0xffffffff81003c45 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1795> */\n\tjbe    0xffffffff810028c4 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x414> */\n\tcmp    $0x144,%esi\n\tje     0xffffffff81003c40 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1790> */\n\tcmp    $0x145,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812c24f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mlock2> */\n\tcmp    $0x11a,%esi\n\tje     0xffffffff81003c3b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x178b> */\n\tcmp    $0x11b,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81389ef0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_timerfd_create> */\n\tcmp    $0x141,%esi\n\tje     0xffffffff81003c36 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1786> */\n\tcmp    $0x142,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8132d5b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_execveat> */\n\tcmp    $0xa5,%esi\n\tje     0xffffffff81003c31 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1781> */\n\tjbe    0xffffffff81003043 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xb93> */\n\tcmp    $0xa8,%esi\n\tje     0xffffffff81003c2c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x177c> */\n\tjbe    0xffffffff81002959 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x4a9> */\n\tcmp    $0xa9,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810c7f10 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_reboot> */\n\tcmp    $0x93,%esi\n\tje     0xffffffff81003c27 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1777> */\n\tjbe    0xffffffff810035e9 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1139> */\n\tcmp    $0x99,%esi\n\tje     0xffffffff81003c22 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1772> */\n\tjbe    0xffffffff810035be - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x110e> */\n\tcmp    $0x9d,%esi\n\tje     0xffffffff81003c1d - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x176d> */\n\tjbe    0xffffffff81003687 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x11d7> */\n\tcmp    $0x9e,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81031bc0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_arch_prctl> */\n\tcmp    $0xa6,%esi\n\tje     0xffffffff81003c18 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1768> */\n\tcmp    $0xa7,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812faf10 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_swapon> */\n\tcmp    $0x70,%esi\n\tje     0xffffffff81003c13 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1763> */\n\tjbe    0xffffffff81002a63 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x5b3> */\n\tcmp    $0x7b,%esi\n\tje     0xffffffff81003c0e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x175e> */\n\tjbe    0xffffffff81002a3b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x58b> */\n\tcmp    $0x81,%esi\n\tje     0xffffffff81003c09 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1759> */\n\tjbe    0xffffffff81002ab5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x605> */\n\tcmp    $0x84,%esi\n\tje     0xffffffff81003c04 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1754> */\n\tjbe    0xffffffff81002a1e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x56e> */\n\tcmp    $0x85,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813385b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mknod> */\n\tcmp    $0x2c,%esi\n\tje     0xffffffff81003bff - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x174f> */\n\tjbe    0xffffffff81002be2 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x732> */\n\tcmp    $0x43,%esi\n\tje     0xffffffff81003bfa - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x174a> */\n\tjbe    0xffffffff81002ba2 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x6f2> */\n\tcmp    $0x4e,%esi\n\tje     0xffffffff81003bf5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1745> */\n\tjbe    0xffffffff81002b2a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x67a> */\n\tcmp    $0x54,%esi\n\tje     0xffffffff81003bf0 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1740> */\n\tjbe    0xffffffff81002b08 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x658> */\n\tcmp    $0x57,%esi\n\tje     0xffffffff81003beb - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x173b> */\n\tjbe    0xffffffff81002ada - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x62a> */\n\tcmp    $0x58,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813392b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_symlink> */\n\tcmp    $0x82,%esi\n\tje     0xffffffff81003be6 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1736> */\n\tcmp    $0x83,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810a8060 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sigaltstack> */\n\tcmp    $0x76,%esi\n\tje     0xffffffff81003be1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1731> */\n\tjbe    0xffffffff81002cd8 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x828> */\n\tcmp    $0x79,%esi\n\tje     0xffffffff81003bdc - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x172c> */\n\tjbe    0xffffffff81002a9e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x5ee> */\n\tcmp    $0x7a,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810ac560 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setfsuid> */\n\tcmp    $0x65,%esi\n\tje     0xffffffff81003bd7 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1727> */\n\tjbe    0xffffffff81002d37 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x887> */\n\tcmp    $0x6b,%esi\n\tje     0xffffffff81003bd2 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1722> */\n\tjbe    0xffffffff81002d15 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x865> */\n\tcmp    $0x6e,%esi\n\tje     0xffffffff81003bcd - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x171d> */\n\tjbe    0xffffffff81002db4 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x904> */\n\tcmp    $0x6f,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810acd10 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_getpgrp> */\n\tcmp    $0x77,%esi\n\tje     0xffffffff81003bc8 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1718> */\n\tcmp    $0x78,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810ac380 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getresgid> */\n\tcmp    $0x7e,%esi\n\tje     0xffffffff81003bc3 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1713> */\n\tjbe    0xffffffff81002af1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x641> */\n\tcmp    $0x7f,%esi\n\tje     0xffffffff81003bbe - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x170e> */\n\tcmp    $0x80,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810a6bb0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_rt_sigtimedwait> */\n\tcmp    $0x55,%esi\n\tje     0xffffffff81003bb9 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1709> */\n\tcmp    $0x56,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81339740 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_link> */\n\tcmp    $0x7c,%esi\n\tje     0xffffffff81003bb4 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1704> */\n\tcmp    $0x7d,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8109d1a0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_capget> */\n\tcmp    $0x51,%esi\n\tje     0xffffffff81003baf - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16ff> */\n\tjbe    0xffffffff81002b4e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x69e> */\n\tcmp    $0x52,%esi\n\tje     0xffffffff81003baa - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16fa> */\n\tcmp    $0x53,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81338860 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mkdir> */\n\tcmp    $0x49,%esi\n\tje     0xffffffff81003ba5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16f5> */\n\tjbe    0xffffffff81002b7c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x6cc> */\n\tcmp    $0x4c,%esi\n\tje     0xffffffff81003ba0 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16f0> */\n\tjbe    0xffffffff81002b65 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x6b5> */\n\tcmp    $0x4d,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8131ba30 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_ftruncate> */\n\tcmp    $0x4f,%esi\n\tje     0xffffffff81003b9b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16eb> */\n\tcmp    $0x50,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8131bee0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_chdir> */\n\tcmp    $0x4a,%esi\n\tje     0xffffffff81003b96 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16e6> */\n\tcmp    $0x4b,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8136b4b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fdatasync> */\n\tcmp    $0x46,%esi\n\tje     0xffffffff81003b91 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16e1> */\n\tjbe    0xffffffff81002c28 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x778> */\n\tcmp    $0x47,%esi\n\tje     0xffffffff81003b8c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16dc> */\n\tcmp    $0x48,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8133b120 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fcntl> */\n\tcmp    $0x37,%esi\n\tje     0xffffffff81003b87 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16d7> */\n\tjbe    0xffffffff81002c70 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7c0> */\n\tcmp    $0x3d,%esi\n\tje     0xffffffff81003b82 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16d2> */\n\tjbe    0xffffffff81002c4e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x79e> */\n\tcmp    $0x40,%esi\n\tje     0xffffffff81003b7d - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16cd> */\n\tjbe    0xffffffff81002c3b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x78b> */\n\tcmp    $0x41,%esi\n\tje     0xffffffff81003b78 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16c8> */\n\tcmp    $0x42,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff814fc3b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_semctl> */\n\tcmp    $0x16,%esi\n\tje     0xffffffff81003b73 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16c3> */\n\tjbe    0xffffffff81002e21 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x971> */\n\tcmp    $0x21,%esi\n\tje     0xffffffff81003b6e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16be> */\n\tjbe    0xffffffff81002df9 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x949> */\n\tcmp    $0x27,%esi\n\tje     0xffffffff81003b69 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16b9> */\n\tjbe    0xffffffff81002e73 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x9c3> */\n\tcmp    $0x2a,%esi\n\tje     0xffffffff81003b64 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16b4> */\n\tjbe    0xffffffff81002cfe - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x84e> */\n\tcmp    $0x2b,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81b96230 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_accept> */\n\tcmp    $0x44,%esi\n\tje     0xffffffff81003b5f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16af> */\n\tcmp    $0x45,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff814f9070 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_msgsnd> */\n\tcmp    $0x3e,%esi\n\tje     0xffffffff81003b5a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16aa> */\n\tcmp    $0x3f,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810acfd0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_newuname> */\n\tcmp    $0x3a,%esi\n\tje     0xffffffff81003b55 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16a5> */\n\tjbe    0xffffffff81002c90 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7e0> */\n\tcmp    $0x3b,%esi\n\tje     0xffffffff81003b50 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x16a0> */\n\tcmp    $0x3c,%esi\n\tje     0xffffffff81003ce5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1835> */\n\tjmp    0xffffffff81003d20 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_ni_syscall> */\n\tcmp    $0x32,%esi\n\tje     0xffffffff81003b14 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1664> */\n\tjbe    0xffffffff81002cb6 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x806> */\n\tcmp    $0x35,%esi\n\tje     0xffffffff81003b0f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x165f> */\n\tjbe    0xffffffff81002ca3 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7f3> */\n\tcmp    $0x36,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81b96cf0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setsockopt> */\n\tcmp    $0x38,%esi\n\tje     0xffffffff81003b0a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x165a> */\n\tcmp    $0x39,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8108e070 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_fork> */\n\tcmp    $0x33,%esi\n\tje     0xffffffff81003b05 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1655> */\n\tcmp    $0x34,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81b96670 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getpeername> */\n\tcmp    $0x2f,%esi\n\tje     0xffffffff81003b00 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1650> */\n\tjbe    0xffffffff81002dcb - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x91b> */\n\tcmp    $0x30,%esi\n\tje     0xffffffff81003afb - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x164b> */\n\tcmp    $0x31,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81b95d60 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_bind> */\n\tcmp    $0x73,%esi\n\tje     0xffffffff81003af6 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1646> */\n\tjbe    0xffffffff81002e95 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x9e5> */\n\tcmp    $0x74,%esi\n\tje     0xffffffff81003af1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1641> */\n\tcmp    $0x75,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810abfd0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setresuid> */\n\tcmp    $0x28,%esi\n\tje     0xffffffff81003aec - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x163c> */\n\tcmp    $0x29,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81b958c0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_socket> */\n\tcmp    $0x68,%esi\n\tje     0xffffffff81003ae7 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1637> */\n\tjbe    0xffffffff81002d64 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x8b4> */\n\tcmp    $0x69,%esi\n\tje     0xffffffff81003ae2 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1632> */\n\tcmp    $0x6a,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810aba10 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setgid> */\n\tcmp    $0x5f,%esi\n\tje     0xffffffff81003add - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x162d> */\n\tjbe    0xffffffff81002d92 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x8e2> */\n\tcmp    $0x62,%esi\n\tje     0xffffffff81003ad8 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1628> */\n\tjbe    0xffffffff81002d7b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x8cb> */\n\tcmp    $0x63,%esi\n\tje     0xffffffff81003ad3 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1623> */\n\tcmp    $0x64,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810ac850 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_times> */\n\tcmp    $0x66,%esi\n\tje     0xffffffff81003ace - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x161e> */\n\tcmp    $0x67,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81106d40 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_syslog> */\n\tcmp    $0x60,%esi\n\tje     0xffffffff81003ac9 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1619> */\n\tcmp    $0x61,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810ade30 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getrlimit> */\n\tcmp    $0x5c,%esi\n\tje     0xffffffff81003ac4 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1614> */\n\tjbe    0xffffffff81002de2 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x932> */\n\tcmp    $0x5d,%esi\n\tje     0xffffffff81003abf - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x160f> */\n\tcmp    $0x5e,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8131cd50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_lchown> */\n\tcmp    $0x6c,%esi\n\tje     0xffffffff81003aba - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x160a> */\n\tcmp    $0x6d,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810acc50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setpgid> */\n\tcmp    $0x2d,%esi\n\tje     0xffffffff81003ab5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1605> */\n\tcmp    $0x2e,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81b976f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sendmsg> */\n\tcmp    $0x5a,%esi\n\tje     0xffffffff81003ab0 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1600> */\n\tcmp    $0x5b,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8131c740 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fchmod> */\n\tcmp    $0x1c,%esi\n\tje     0xffffffff81003aab - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15fb> */\n\tjbe    0xffffffff81002ec3 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xa13> */\n\tcmp    $0x1f,%esi\n\tje     0xffffffff81003aa6 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15f6> */\n\tjbe    0xffffffff81002e5c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x9ac> */\n\tcmp    $0x20,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8134d100 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_dup> */\n\tcmp    $0xb,%esi\n\tje     0xffffffff81003aa1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15f1> */\n\tjbe    0xffffffff81002f35 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xa85> */\n\tcmp    $0x11,%esi\n\tje     0xffffffff81003a9c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15ec> */\n\tjbe    0xffffffff81002f13 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xa63> */\n\tcmp    $0x14,%esi\n\tje     0xffffffff81003a97 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15e7> */\n\tjbe    0xffffffff81002ee5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xa35> */\n\tcmp    $0x15,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8131be80 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_access> */\n\tcmp    $0x1d,%esi\n\tje     0xffffffff81003a92 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15e2> */\n\tcmp    $0x1e,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81500c90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_shmat> */\n\tcmp    $0x24,%esi\n\tje     0xffffffff81003a8d - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15dd> */\n\tjbe    0xffffffff81002eac - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x9fc> */\n\tcmp    $0x25,%esi\n\tje     0xffffffff81003a88 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15d8> */\n\tcmp    $0x26,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81156ce0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setitimer> */\n\tcmp    $0x71,%esi\n\tje     0xffffffff81003a83 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15d3> */\n\tcmp    $0x72,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810ab8d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setregid> */\n\tcmp    $0x22,%esi\n\tje     0xffffffff81003a7e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15ce> */\n\tcmp    $0x23,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81146f40 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_nanosleep> */\n\tcmp    $0x19,%esi\n\tje     0xffffffff81003a79 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15c9> */\n\tjbe    0xffffffff81002efc - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xa4c> */\n\tcmp    $0x1a,%esi\n\tje     0xffffffff81003a74 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15c4> */\n\tcmp    $0x1b,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812c0920 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mincore> */\n\tcmp    $0x12,%esi\n\tje     0xffffffff81003a6f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15bf> */\n\tcmp    $0x13,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813219e0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_readv> */\n\tcmp    $0x17,%esi\n\tje     0xffffffff81003a6a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15ba> */\n\tcmp    $0x18,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810ee330 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_sched_yield> */\n\tcmp    $0xe,%esi\n\tje     0xffffffff81003a65 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15b5> */\n\tjbe    0xffffffff81002f62 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xab2> */\n\tcmp    $0xf,%esi\n\tje     0xffffffff81003a60 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15b0> */\n\tcmp    $0x10,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8133cf60 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_ioctl> */\n\tcmp    $0x5,%esi\n\tje     0xffffffff81003a5b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15ab> */\n\tjbe    0xffffffff81002f90 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xae0> */\n\tcmp    $0x8,%esi\n\tje     0xffffffff81003a56 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15a6> */\n\tjbe    0xffffffff81002f79 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xac9> */\n\tcmp    $0x9,%esi\n\tje     0xffffffff81003a51 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x15a1> */\n\tcmp    $0xa,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812ccdc0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mprotect> */\n\tcmp    $0xc,%esi\n\tje     0xffffffff81003a4c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x159c> */\n\tcmp    $0xd,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810a8940 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_rt_sigaction> */\n\tcmp    $0x6,%esi\n\tje     0xffffffff81003a47 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1597> */\n\tcmp    $0x7,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813409b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_poll> */\n\tcmp    $0x2,%esi\n\tje     0xffffffff81003a42 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1592> */\n\tjbe    0xffffffff81003288 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xdd8> */\n\tcmp    $0x3,%esi\n\tje     0xffffffff81003a3d - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x158d> */\n\tcmp    $0x4,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81329c00 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_newstat> */\n\tcmp    $0x116,%esi\n\tje     0xffffffff81003a38 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1588> */\n\tjbe    0xffffffff81003101 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xc51> */\n\tcmp    $0x117,%esi\n\tje     0xffffffff81003a33 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1583> */\n\tcmp    $0x118,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8136bef0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_utimensat> */\n\tcmp    $0x1bc,%esi\n\tje     0xffffffff81003a2e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x157e> */\n\tjbe    0xffffffff81003221 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xd71> */\n\tcmp    $0x1bd,%esi\n\tje     0xffffffff81003a29 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1579> */\n\tcmp    $0x1be,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8153fdf0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_landlock_restrict_self> */\n\tcmp    $0x138,%esi\n\tje     0xffffffff81003a24 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1574> */\n\tjbe    0xffffffff810036a4 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x11f4> */\n\tcmp    $0x139,%esi\n\tje     0xffffffff81003a1f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x156f> */\n\tcmp    $0x13a,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810ed150 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_setattr> */\n\tcmp    $0xa2,%esi\n\tje     0xffffffff81003a1a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x156a> */\n\tjbe    0xffffffff8100334b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xe9b> */\n\tcmp    $0xa3,%esi\n\tje     0xffffffff81003a15 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1565> */\n\tcmp    $0xa4,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81140790 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_settimeofday> */\n\tcmp    $0xfd,%esi\n\tje     0xffffffff81003a10 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1560> */\n\tjbe    0xffffffff8100379f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x12ef> */\n\tcmp    $0x103,%esi\n\tje     0xffffffff81003a0b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x155b> */\n\tjbe    0xffffffff81003774 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x12c4> */\n\tcmp    $0x106,%esi\n\tje     0xffffffff81003a06 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1556> */\n\tjbe    0xffffffff8100370b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x125b> */\n\tcmp    $0x107,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81338f10 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_unlinkat> */\n\tcmp    $0x1b1,%esi\n\tje     0xffffffff81003a01 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1551> */\n\tjbe    0xffffffff8100311e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xc6e> */\n\tcmp    $0x1b2,%esi\n\tje     0xffffffff810039fc - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x154c> */\n\tcmp    $0x1b3,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8108e1c0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_clone3> */\n\tcmp    $0x1b5,%esi\n\tje     0xffffffff810039f7 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1547> */\n\tcmp    $0x1b6,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810bb6a0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pidfd_getfd> */\n\tcmp    $0x114,%esi\n\tje     0xffffffff810039f2 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1542> */\n\tcmp    $0x115,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8136b780 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sync_file_range> */\n\tcmp    $0x1af,%esi\n\tje     0xffffffff810039ed - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x153d> */\n\tcmp    $0x1b0,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81356650 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fsmount> */\n\tcmp    $0x12d,%esi\n\tje     0xffffffff810039e8 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1538> */\n\tjbe    0xffffffff8100319f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xcef> */\n\tcmp    $0x12e,%esi\n\tje     0xffffffff810039e3 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1533> */\n\tcmp    $0x12f,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813a6890 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_name_to_handle_at> */\n\tcmp    $0x124,%esi\n\tje     0xffffffff810039de - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x152e> */\n\tjbe    0xffffffff810031d9 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xd29> */\n\tcmp    $0x127,%esi\n\tje     0xffffffff810039d9 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1529> */\n\tjbe    0xffffffff810031bc - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xd0c> */\n\tcmp    $0x128,%esi\n\tje     0xffffffff810039d4 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1524> */\n\tcmp    $0x129,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810a7a80 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_rt_tgsigqueueinfo> */\n\tcmp    $0x12b,%esi\n\tje     0xffffffff810039cf - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x151f> */\n\tcmp    $0x12c,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81384810 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fanotify_init> */\n\tcmp    $0x125,%esi\n\tje     0xffffffff810039ca - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x151a> */\n\tcmp    $0x126,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81380680 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_inotify_init1> */\n\tcmp    $0x121,%esi\n\tje     0xffffffff810039c5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1515> */\n\tjbe    0xffffffff8100323e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xd8e> */\n\tcmp    $0x122,%esi\n\tje     0xffffffff810039c0 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1510> */\n\tcmp    $0x123,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813864c0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_epoll_create1> */\n\tcmp    $0x131,%esi\n\tje     0xffffffff810039bb - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x150b> */\n\tcmp    $0x132,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8136b270 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_syncfs> */\n\tcmp    $0x1ba,%esi\n\tje     0xffffffff810039b6 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1506> */\n\tcmp    $0x1bb,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813b80d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_quotactl_fd> */\n\tcmp    $0x11f,%esi\n\tje     0xffffffff810039b1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1501> */\n\tcmp    $0x120,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81b961d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_accept4> */\n\tcmp    $0x10e,%esi\n\tje     0xffffffff810039ac - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14fc> */\n\tjbe    0xffffffff810032bb - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xe0b> */\n\tcmp    $0x111,%esi\n\tje     0xffffffff810039a7 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14f7> */\n\tjbe    0xffffffff8100329e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xdee> */\n\tcmp    $0x112,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81160c90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_get_robust_list> */\n\ttest   %esi,%esi\n\tje     0xffffffff810039a2 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14f2> */\n\tcmp    $0x1,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81321500 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_write> */\n\tcmp    $0x10f,%esi\n\tje     0xffffffff8100399d - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14ed> */\n\tcmp    $0x110,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8108e6d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_unshare> */\n\tcmp    $0x10b,%esi\n\tje     0xffffffff81003998 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14e8> */\n\tjbe    0xffffffff81003368 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xeb8> */\n\tcmp    $0x10c,%esi\n\tje     0xffffffff81003993 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14e3> */\n\tcmp    $0x10d,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8131bdc0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_faccessat> */\n\tcmp    $0xd9,%esi\n\tje     0xffffffff8100398e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14de> */\n\tjbe    0xffffffff81003406 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xf56> */\n\tcmp    $0xe4,%esi\n\tje     0xffffffff81003989 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14d9> */\n\tjbe    0xffffffff810033d1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xf21> */\n\tcmp    $0xea,%esi\n\tje     0xffffffff81003984 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14d4> */\n\tjbe    0xffffffff810033a2 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xef2> */\n\tcmp    $0xee,%esi\n\tje     0xffffffff8100397f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14cf> */\n\tjbe    0xffffffff81003385 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xed5> */\n\tcmp    $0xef,%esi\n\tje     0xffffffff8100397a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14ca> */\n\tcmp    $0xf0,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff815040f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mq_open> */\n\tcmp    $0xa0,%esi\n\tje     0xffffffff81003975 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14c5> */\n\tcmp    $0xa1,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8131c260 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_chroot> */\n\tcmp    $0x109,%esi\n\tje     0xffffffff81003970 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14c0> */\n\tcmp    $0x10a,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81339210 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_symlinkat> */\n\tcmp    $0xeb,%esi\n\tje     0xffffffff8100396b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14bb> */\n\tcmp    $0xed,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8130d160 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mbind> */\n\tcmp    $0xe7,%esi\n\tje     0xffffffff81003ce0 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1830> */\n\tjbe    0xffffffff81003445 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xf95> */\n\tcmp    $0xe8,%esi\n\tje     0xffffffff81003966 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14b6> */\n\tcmp    $0xe9,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81387270 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_epoll_ctl> */\n\tcmp    $0xdf,%esi\n\tje     0xffffffff81003961 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14b1> */\n\tjbe    0xffffffff81003559 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x10a9> */\n\tcmp    $0xe2,%esi\n\tje     0xffffffff8100395c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14ac> */\n\tjbe    0xffffffff8100353c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x108c> */\n\tcmp    $0xe3,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81152780 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_clock_settime> */\n\tcmp    $0xc9,%esi\n\tje     0xffffffff81003957 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14a7> */\n\tjbe    0xffffffff810034aa - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xffa> */\n\tcmp    $0xd0,%esi\n\tje     0xffffffff81003952 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x14a2> */\n\tjbe    0xffffffff8100347f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xfcf> */\n\tcmp    $0xd5,%esi\n\tje     0xffffffff8100394d - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x149d> */\n\tjbe    0xffffffff81003462 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0xfb2> */\n\tcmp    $0xd8,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812ca0b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_remap_file_pages> */\n\tcmp    $0xe5,%esi\n\tje     0xffffffff81003948 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1498> */\n\tcmp    $0xe6,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81153260 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_clock_nanosleep> */\n\tcmp    $0xd1,%esi\n\tje     0xffffffff81003943 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1493> */\n\tcmp    $0xd2,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81392ab0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_io_cancel> */\n\tcmp    $0xcc,%esi\n\tje     0xffffffff8100393e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x148e> */\n\tjbe    0xffffffff810034d7 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1027> */\n\tcmp    $0xce,%esi\n\tje     0xffffffff81003939 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1489> */\n\tcmp    $0xcf,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813923b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_io_destroy> */\n\tcmp    $0xc4,%esi\n\tje     0xffffffff81003934 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1484> */\n\tjbe    0xffffffff81003511 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1061> */\n\tcmp    $0xc7,%esi\n\tje     0xffffffff8100392f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x147f> */\n\tjbe    0xffffffff810034f4 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1044> */\n\tcmp    $0xc8,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810a75f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_tkill> */\n\tcmp    $0xca,%esi\n\tje     0xffffffff8100392a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x147a> */\n\tcmp    $0xcb,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810edfe0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_setaffinity> */\n\tcmp    $0xc5,%esi\n\tje     0xffffffff81003925 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1475> */\n\tcmp    $0xc6,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8135b6f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_lremovexattr> */\n\tcmp    $0xc1,%esi\n\tje     0xffffffff81003920 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1470> */\n\tjbe    0xffffffff81003584 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x10d4> */\n\tcmp    $0xc2,%esi\n\tje     0xffffffff8100391b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x146b> */\n\tcmp    $0xc3,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8135b4d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_llistxattr> */\n\tcmp    $0xe0,%esi\n\tje     0xffffffff81003916 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1466> */\n\tcmp    $0xe1,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81151ea0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_timer_getoverrun> */\n\tcmp    $0xdc,%esi\n\tje     0xffffffff81003911 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1461> */\n\tjbe    0xffffffff810035a1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x10f1> */\n\tcmp    $0xdd,%esi\n\tje     0xffffffff8100390c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x145c> */\n\tcmp    $0xde,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81151a20 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_timer_create> */\n\tcmp    $0xbf,%esi\n\tje     0xffffffff81003907 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1457> */\n\tcmp    $0xc0,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8135b270 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_lgetxattr> */\n\tcmp    $0xda,%esi\n\tje     0xffffffff81003902 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1452> */\n\tcmp    $0xdb,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810a2e20 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_restart_syscall> */\n\tcmp    $0x96,%esi\n\tje     0xffffffff810038fd - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x144d> */\n\tjbe    0xffffffff81003622 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1172> */\n\tcmp    $0x97,%esi\n\tje     0xffffffff810038f8 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1448> */\n\tcmp    $0x98,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812c2810 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_munlockall> */\n\tcmp    $0x8d,%esi\n\tje     0xffffffff810038f3 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1443> */\n\tjbe    0xffffffff8100365c - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x11ac> */\n\tcmp    $0x90,%esi\n\tje     0xffffffff810038ee - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x143e> */\n\tjbe    0xffffffff8100363f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x118f> */\n\tcmp    $0x91,%esi\n\tje     0xffffffff810038e9 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1439> */\n\tcmp    $0x92,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810ee350 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_get_priority_max> */\n\tcmp    $0x94,%esi\n\tje     0xffffffff810038e4 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1434> */\n\tcmp    $0x95,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812c2490 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mlock> */\n\tcmp    $0x8e,%esi\n\tje     0xffffffff810038df - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x142f> */\n\tcmp    $0x8f,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810ed6b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_getparam> */\n\tcmp    $0x8a,%esi\n\tje     0xffffffff810038da - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x142a> */\n\tjbe    0xffffffff810036c1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1211> */\n\tcmp    $0x8b,%esi\n\tje     0xffffffff810038d5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1425> */\n\tcmp    $0x8c,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810ab730 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getpriority> */\n\tcmp    $0x9a,%esi\n\tje     0xffffffff810038d0 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1420> */\n\tcmp    $0x9b,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81356fe0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pivot_root> */\n\tcmp    $0x136,%esi\n\tje     0xffffffff810038cb - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x141b> */\n\tcmp    $0x137,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff812de300 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_process_vm_writev> */\n\tcmp    $0x88,%esi\n\tje     0xffffffff810038c6 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1416> */\n\tcmp    $0x89,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8136e710 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_statfs> */\n\tcmp    $0x1a9,%esi\n\tje     0xffffffff810038c1 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1411> */\n\tjbe    0xffffffff81003745 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1295> */\n\tcmp    $0x1ac,%esi\n\tje     0xffffffff810038bc - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x140c> */\n\tjbe    0xffffffff81003728 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1278> */\n\tcmp    $0x1ad,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813566b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_move_mount> */\n\tcmp    $0x104,%esi\n\tje     0xffffffff810038b7 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1407> */\n\tcmp    $0x105,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8136c070 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_futimesat> */\n\tcmp    $0x1aa,%esi\n\tje     0xffffffff810038b2 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1402> */\n\tcmp    $0x1ab,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff815bb5a0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_io_uring_register> */\n\tcmp    $0x14e,%esi\n\tje     0xffffffff810038ad - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13fd> */\n\tjbe    0xffffffff810037d8 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1328> */\n\tcmp    $0x14f,%esi\n\tje     0xffffffff810038a8 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13f8> */\n\tcmp    $0x1a8,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff810a73d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pidfd_send_signal> */\n\tcmp    $0x100,%esi\n\tje     0xffffffff810038a3 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13f3> */\n\tjbe    0xffffffff810037f5 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1345> */\n\tcmp    $0x101,%esi\n\tje     0xffffffff8100389e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13ee> */\n\tcmp    $0x102,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813387c0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mkdirat> */\n\tcmp    $0xf7,%esi\n\tje     0xffffffff81003899 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13e9> */\n\tjbe    0xffffffff8100382b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x137b> */\n\tcmp    $0xfa,%esi\n\tje     0xffffffff81003894 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13e4> */\n\tjbe    0xffffffff81003812 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x1362> */\n\tcmp    $0xfb,%esi\n\tje     0xffffffff8100388f - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13df> */\n\tcmp    $0xfc,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81585f40 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_ioprio_get> */\n\tcmp    $0x14c,%esi\n\tje     0xffffffff8100388a - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13da> */\n\tcmp    $0x14d,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81392f30 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_io_pgetevents> */\n\tcmp    $0xfe,%esi\n\tje     0xffffffff81003885 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13d5> */\n\tcmp    $0xff,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff813809e0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_inotify_rm_watch> */\n\tcmp    $0xf8,%esi\n\tje     0xffffffff81003880 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13d0> */\n\tcmp    $0xf9,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8150a450 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_request_key> */\n\tcmp    $0xf4,%esi\n\tje     0xffffffff8100387b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13cb> */\n\tjbe    0xffffffff8100384e - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x139e> */\n\tcmp    $0xf5,%esi\n\tje     0xffffffff81003876 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13c6> */\n\tcmp    $0xf6,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff8116c590 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_kexec_load> */\n\tcmp    $0xf2,%esi\n\tje     0xffffffff81003871 - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x13c1> */\n\tcmp    $0xf3,%esi\n\tjne    0xffffffff81002c6b - 0xffffffff810024b0 + x64_sys_call /* <x64_sys_call+0x7bb> */\n\tjmp    0xffffffff81504670 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mq_timedreceive> */\n\tjmp    0xffffffff81511260 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_lsm_list_modules> */\n\tjmp    0xffffffff81357130 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_listmount> */\n\tjmp    0xffffffff815044f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mq_timedsend> */\n\tjmp    0xffffffff815048f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mq_getsetattr> */\n\tjmp    0xffffffff815047f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mq_notify> */\n\tjmp    0xffffffff8150a3f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_add_key> */\n\tjmp    0xffffffff81380750 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_inotify_add_watch> */\n\tjmp    0xffffffff81329ff0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_statx> */\n\tjmp    0xffffffff81585ee0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_ioprio_set> */\n\tjmp    0xffffffff8150be50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_keyctl> */\n\tjmp    0xffffffff81095d60 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_waitid> */\n\tjmp    0xffffffff8131d8e0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_openat> */\n\tjmp    0xffffffff8130aa00 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_migrate_pages> */\n\tjmp    0xffffffff810750c0 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_uretprobe> */\n\tjmp    0xffffffff81272810 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_rseq> */\n\tjmp    0xffffffff815a7ff0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_io_uring_enter> */\n\tjmp    0xffffffff8131cc50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fchownat> */\n\tjmp    0xffffffff81354f90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_open_tree> */\n\tjmp    0xffffffff815a80a0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_io_uring_setup> */\n\tjmp    0xffffffff8136e870 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_ustat> */\n\tjmp    0xffffffff812de280 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_process_vm_readv> */\n\tjmp    0xffffffff81039330 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_modify_ldt> */\n\tjmp    0xffffffff8134d910 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sysfs> */\n\tjmp    0xffffffff8136e7c0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fstatfs> */\n\tjmp    0xffffffff810ed0f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_setparam> */\n\tjmp    0xffffffff810ee4d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_rr_get_interval> */\n\tjmp    0xffffffff810ed590 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_getscheduler> */\n\tjmp    0xffffffff810ed070 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_setscheduler> */\n\tjmp    0xffffffff810ab6d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setpriority> */\n\tjmp    0xffffffff812c27d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mlockall> */\n\tjmp    0xffffffff812c25b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_munlock> */\n\tjmp    0xffffffff8108b310 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_set_tid_address> */\n\tjmp    0xffffffff8135b210 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getxattr> */\n\tjmp    0xffffffff8127f200 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fadvise64> */\n\tjmp    0xffffffff814fd900 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_semtimedop> */\n\tjmp    0xffffffff81151ca0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_timer_gettime> */\n\tjmp    0xffffffff8135b470 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_listxattr> */\n\tjmp    0xffffffff8135b2d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fgetxattr> */\n\tjmp    0xffffffff8135b690 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_removexattr> */\n\tjmp    0xffffffff81160ff0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_futex> */\n\tjmp    0xffffffff8135b750 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fremovexattr> */\n\tjmp    0xffffffff8135b530 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_flistxattr> */\n\tjmp    0xffffffff81392070 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_io_setup> */\n\tjmp    0xffffffff810ee1b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_getaffinity> */\n\tjmp    0xffffffff81392590 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_io_submit> */\n\tjmp    0xffffffff81152b90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_clock_getres> */\n\tjmp    0xffffffff81386520 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_epoll_create> */\n\tjmp    0xffffffff81392d90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_io_getevents> */\n\tjmp    0xffffffff811401b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_time> */\n\tjmp    0xffffffff811523c0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_timer_delete> */\n\tjmp    0xffffffff81151fc0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_timer_settime> */\n\tjmp    0xffffffff813873d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_epoll_wait> */\n\tjmp    0xffffffff8136c0d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_utimes> */\n\tjmp    0xffffffff81339650 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_linkat> */\n\tjmp    0xffffffff810ae7b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setrlimit> */\n\tjmp    0xffffffff8130aa60 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_get_mempolicy> */\n\tjmp    0xffffffff8130a9a0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_set_mempolicy> */\n\tjmp    0xffffffff810a7430 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_tgkill> */\n\tjmp    0xffffffff81152920 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_clock_gettime> */\n\tjmp    0xffffffff8133def0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getdents64> */\n\tjmp    0xffffffff8131c8c0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fchmodat> */\n\tjmp    0xffffffff81329d50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_readlinkat> */\n\tjmp    0xffffffff81340c30 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_ppoll> */\n\tjmp    0xffffffff813213b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_read> */\n\tjmp    0xffffffff81160c00 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_set_robust_list> */\n\tjmp    0xffffffff81340840 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pselect6> */\n\tjmp    0xffffffff8138a0b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_timerfd_gettime> */\n\tjmp    0xffffffff81357030 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mount_setattr> */\n\tjmp    0xffffffff81152b40 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_clock_adjtime> */\n\tjmp    0xffffffff8138ae30 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_eventfd2> */\n\tjmp    0xffffffff81388970 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_signalfd4> */\n\tjmp    0xffffffff8132f870 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pipe2> */\n\tjmp    0xffffffff81b97fc0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_recvmmsg> */\n\tjmp    0xffffffff81321c50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pwritev> */\n\tjmp    0xffffffff81321aa0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_preadv> */\n\tjmp    0xffffffff8134cec0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_dup3> */\n\tjmp    0xffffffff810ae750 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_prlimit64> */\n\tjmp    0xffffffff81384870 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fanotify_mark> */\n\tjmp    0xffffffff81371dc0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fsconfig> */\n\tjmp    0xffffffff8136ac60 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_tee> */\n\tjmp    0xffffffff8131da40 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_openat2> */\n\tjmp    0xffffffff810bb460 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pidfd_open> */\n\tjmp    0xffffffff81371aa0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fspick> */\n\tjmp    0xffffffff81329ca0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_newfstatat> */\n\tjmp    0xffffffff81338510 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mknodat> */\n\tjmp    0xffffffff813806e0 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_inotify_init> */\n\tjmp    0xffffffff81169770 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_acct> */\n\tjmp    0xffffffff8136b1e0 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_sync> */\n\tjmp    0xffffffff8113b920 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_finit_module> */\n\tjmp    0xffffffff8113e8f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_kcmp> */\n\tjmp    0xffffffff8153fc50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_landlock_add_rule> */\n\tjmp    0xffffffff8153fbf0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_landlock_create_ruleset> */\n\tjmp    0xffffffff81312f00 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_move_pages> */\n\tjmp    0xffffffff8136a580 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_vmsplice> */\n\tjmp    0xffffffff8131dfe0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_close> */\n\tjmp    0xffffffff8131d780 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_open> */\n\tjmp    0xffffffff81329c50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_newlstat> */\n\tjmp    0xffffffff812c8660 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_brk> */\n\tjmp    0xffffffff8103b8d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mmap> */\n\tjmp    0xffffffff8131ff00 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_lseek> */\n\tjmp    0xffffffff81329d00 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_newfstat> */\n\tjmp    0xffffffff81032830 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_rt_sigreturn> */\n\tjmp    0xffffffff810a3110 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_rt_sigprocmask> */\n\tjmp    0xffffffff813407c0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_select> */\n\tjmp    0xffffffff81321850 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pwrite64> */\n\tjmp    0xffffffff812cf360 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_msync> */\n\tjmp    0xffffffff812ceff0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mremap> */\n\tjmp    0xffffffff810a93b0 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_pause> */\n\tjmp    0xffffffff810abbe0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setreuid> */\n\tjmp    0xffffffff81156b80 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_alarm> */\n\tjmp    0xffffffff811566d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getitimer> */\n\tjmp    0xffffffff81500420 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_shmget> */\n\tjmp    0xffffffff81321a40 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_writev> */\n\tjmp    0xffffffff81321610 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pread64> */\n\tjmp    0xffffffff812c7160 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_munmap> */\n\tjmp    0xffffffff81500540 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_shmctl> */\n\tjmp    0xffffffff812f2dc0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_madvise> */\n\tjmp    0xffffffff8131c920 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_chmod> */\n\tjmp    0xffffffff81b96b10 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_recvfrom> */\n\tjmp    0xffffffff810ac810 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_getegid> */\n\tjmp    0xffffffff8131cf30 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fchown> */\n\tjmp    0xffffffff8131ccd0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_chown> */\n\tjmp    0xffffffff81140510 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_gettimeofday> */\n\tjmp    0xffffffff810ac750 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_getuid> */\n\tjmp    0xffffffff810afa70 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sysinfo> */\n\tjmp    0xffffffff810aee50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getrusage> */\n\tjmp    0xffffffff810aeef0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_umask> */\n\tjmp    0xffffffff810abd60 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setuid> */\n\tjmp    0xffffffff810ac7d0 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_getgid> */\n\tjmp    0xffffffff813226a0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sendfile64> */\n\tjmp    0xffffffff810ca510 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setgroups> */\n\tjmp    0xffffffff810ca380 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getgroups> */\n\tjmp    0xffffffff81b96fc0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_shutdown> */\n\tjmp    0xffffffff81b97a80 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_recvmsg> */\n\tjmp    0xffffffff81b96530 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getsockname> */\n\tjmp    0xffffffff8108e160 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_clone> */\n\tjmp    0xffffffff81b95ba0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_socketpair> */\n\tjmp    0xffffffff81b95ed0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_listen> */\n\tjmp    0xffffffff8131c860 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fchmodat2> */\n\tjmp    0xffffffff81387870 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_epoll_pwait2> */\n\tjmp    0xffffffff812ccee0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pkey_free> */\n\tjmp    0xffffffff81389f50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_timerfd_settime> */\n\tjmp    0xffffffff8135ada0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setxattr> */\n\tjmp    0xffffffff813b7d30 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_quotactl> */\n\tjmp    0xffffffff810ad310 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sethostname> */\n\tjmp    0xffffffff81140d00 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_adjtimex> */\n\tjmp    0xffffffff8108e900 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_personality> */\n\tjmp    0xffffffff81329dd0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_readlink> */\n\tjmp    0xffffffff8135aea0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fsetxattr> */\n\tjmp    0xffffffff8132d4f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_execve> */\n\tjmp    0xffffffff8108e0e0 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_vfork> */\n\tjmp    0xffffffff810a7270 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_kill> */\n\tjmp    0xffffffff814f8d90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_msgget> */\n\tjmp    0xffffffff81b96400 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_connect> */\n\tjmp    0xffffffff810ac6a0 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_getpid> */\n\tjmp    0xffffffff8134cf20 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_dup2> */\n\tjmp    0xffffffff8132f8d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pipe> */\n\tjmp    0xffffffff814fdcb0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_semop> */\n\tjmp    0xffffffff814fc270 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_semget> */\n\tjmp    0xffffffff81096120 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_wait4> */\n\tjmp    0xffffffff81b96e50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getsockopt> */\n\tjmp    0xffffffff814f8eb0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_msgctl> */\n\tjmp    0xffffffff814f9220 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_msgrcv> */\n\tjmp    0xffffffff8136b3d0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fsync> */\n\tjmp    0xffffffff8136d3b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getcwd> */\n\tjmp    0xffffffff8131b740 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_truncate> */\n\tjmp    0xffffffff813993b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_flock> */\n\tjmp    0xffffffff81339f50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_rename> */\n\tjmp    0xffffffff8131c0c0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fchdir> */\n\tjmp    0xffffffff810acd60 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getsid> */\n\tjmp    0xffffffff8131dee0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_creat> */\n\tjmp    0xffffffff810a3490 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_rt_sigpending> */\n\tjmp    0xffffffff8109d1f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_capset> */\n\tjmp    0xffffffff810ac320 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setresgid> */\n\tjmp    0xffffffff810ac700 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_getppid> */\n\tjmp    0xffffffff810ac790 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_geteuid> */\n\tjmp    0xffffffff8109ef50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_ptrace> */\n\tjmp    0xffffffff810accb0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getpgid> */\n\tjmp    0xffffffff810ac030 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getresuid> */\n\tjmp    0xffffffff810a9410 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_rt_sigsuspend> */\n\tjmp    0xffffffff81338ff0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_unlink> */\n\tjmp    0xffffffff81338b20 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_rmdir> */\n\tjmp    0xffffffff8133dcb0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getdents> */\n\tjmp    0xffffffff81501090 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_shmdt> */\n\tjmp    0xffffffff81b968f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sendto> */\n\tjmp    0xffffffff8136c130 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_utime> */\n\tjmp    0xffffffff810a7790 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_rt_sigqueueinfo> */\n\tjmp    0xffffffff810ac660 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setfsgid> */\n\tjmp    0xffffffff810acfb0 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_setsid> */\n\tjmp    0xffffffff81353560 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_umount> */\n\tjmp    0xffffffff810af910 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_prctl> */\n\tjmp    0xffffffff8131e160 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_vhangup> */\n\tjmp    0xffffffff810ee410 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_get_priority_min> */\n\tjmp    0xffffffff812fae70 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_swapoff> */\n\tjmp    0xffffffff813563b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mount> */\n\tjmp    0xffffffff811f2320 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_bpf> */\n\tjmp    0xffffffff81388a90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_signalfd> */\n\tjmp    0xffffffff810f6970 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_membarrier> */\n\tjmp    0xffffffff8138ef10 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_userfaultfd> */\n\tjmp    0xffffffff81339db0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_renameat2> */\n\tjmp    0xffffffff81b97920 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sendmmsg> */\n\tjmp    0xffffffff813a6a30 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_open_by_handle_at> */\n\tjmp    0xffffffff81267190 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_perf_event_open> */\n\tjmp    0xffffffff816f8620 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getrandom> */\n\tjmp    0xffffffff810ed8b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_sched_getattr> */\n\tjmp    0xffffffff81321bd0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_preadv2> */\n\tjmp    0xffffffff8138ae90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_eventfd> */\n\tjmp    0xffffffff813875f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_epoll_pwait> */\n\tjmp    0xffffffff8136a5e0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_splice> */\n\tjmp    0xffffffff81339e90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_renameat> */\n\tjmp    0xffffffff81504230 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_mq_unlink> */\n\tjmp    0xffffffff812cce30 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_pkey_mprotect> */\n\tjmp    0xffffffff81323480 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_copy_file_range> */\n\tjmp    0xffffffff8116de80 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_kexec_file_load> */\n\tjmp    0xffffffff810af970 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_getcpu> */\n\tjmp    0xffffffff8127ed80 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_process_mrelease> */\n\tjmp    0xffffffff8131be20 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_faccessat2> */\n\tjmp    0xffffffff8131e100 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_close_range> */\n\tjmp    0xffffffff81371800 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_fsopen> */\n\tjmp    0xffffffff8130ca50 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_set_mempolicy_home_node> */\n\tjmp    0xffffffff81315860 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_memfd_secret> */\n\tjmp    0xffffffff810783f0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_map_shadow_stack> */\n\tjmp    0xffffffff810ad990 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_setdomainname> */\n\tjmp    0xffffffff81161cf0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_futex_requeue> */\n\tjmp    0xffffffff81161a90 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_futex_wait> */\n\tjmp    0xffffffff81511200 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_lsm_get_self_attr> */\n\tjmp    0xffffffff8113b8c0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_init_module> */\n\tjmp    0xffffffff81037090 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_ioperm> */\n\tjmp    0xffffffff810ac6d0 - 0xffffffff810024b0 + x64_sys_call /* <__ia32_sys_gettid> */\n\tcall   0xffffffff810954a0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_exit_group> */\n\tcall   0xffffffff810953b0 - 0xffffffff810024b0 + x64_sys_call /* <__x64_sys_exit> */\n\n.size x64_sys_call, . - x64_sys_call\n\n.globl x32_sys_call\n.type x32_sys_call @function\nx32_sys_call:\n\tendbr64\n\tcmp    $0xd0,%esi\n\tje     0xffffffff810082ce - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x179e> */\n\tja     0xffffffff81006bbc - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x8c> */\n\tcmp    $0x64,%esi\n\tje     0xffffffff810082c9 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1799> */\n\tjbe    0xffffffff8100704e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x51e> */\n\tcmp    $0x97,%esi\n\tje     0xffffffff810082c4 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1794> */\n\tjbe    0xffffffff81006ffc - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x4cc> */\n\tcmp    $0xb0,%esi\n\tje     0xffffffff810082bf - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x178f> */\n\tjbe    0xffffffff81006f98 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x468> */\n\tcmp    $0xc3,%esi\n\tje     0xffffffff810082ba - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x178a> */\n\tjbe    0xffffffff81006f67 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x437> */\n\tcmp    $0xc9,%esi\n\tje     0xffffffff810082b5 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1785> */\n\tjbe    0xffffffff81006c4e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x11e> */\n\tcmp    $0xcc,%esi\n\tje     0xffffffff810082b0 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1780> */\n\tjbe    0xffffffff81006c31 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x101> */\n\tcmp    $0xcf,%esi\n\tje     0xffffffff810082ab - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x177b> */\n\tjmp    0xffffffff81003d20 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_ni_syscall> */\n\tcmp    $0x13f,%esi\n\tje     0xffffffff810082a6 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1776> */\n\tjbe    0xffffffff81006de5 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x2b5> */\n\tcmp    $0x1c7,%esi\n\tje     0xffffffff810082a1 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1771> */\n\tjbe    0xffffffff81006d90 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x260> */\n\tcmp    $0x20e,%esi\n\tje     0xffffffff8100829c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x176c> */\n\tjbe    0xffffffff81006d2c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1fc> */\n\tcmp    $0x219,%esi\n\tje     0xffffffff81008297 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1767> */\n\tjbe    0xffffffff81006cfb - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1cb> */\n\tcmp    $0x21f,%esi\n\tje     0xffffffff81008292 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1762> */\n\tjbe    0xffffffff81006c96 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x166> */\n\tcmp    $0x222,%esi\n\tje     0xffffffff81008003 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14d3> */\n\tjbe    0xffffffff81006c79 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x149> */\n\tcmp    $0x223,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81322430 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_pwritev64v2> */\n\tcmp    $0xca,%esi\n\tje     0xffffffff8100828d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x175d> */\n\tcmp    $0xcb,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810edfe0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_setaffinity> */\n\tcmp    $0xc6,%esi\n\tje     0xffffffff81008288 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1758> */\n\tjbe    0xffffffff81006cc1 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x191> */\n\tcmp    $0xc7,%esi\n\tje     0xffffffff81008369 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1839> */\n\tcmp    $0xc8,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810a75f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_tkill> */\n\tcmp    $0x220,%esi\n\tje     0xffffffff81008364 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1834> */\n\tcmp    $0x221,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8132d7c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_execveat> */\n\tcmp    $0x21c,%esi\n\tje     0xffffffff8100835f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x182f> */\n\tjbe    0xffffffff81006cde - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1ae> */\n\tcmp    $0x21d,%esi\n\tje     0xffffffff8100835a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x182a> */\n\tcmp    $0x21e,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81b96e50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getsockopt> */\n\tcmp    $0xc4,%esi\n\tje     0xffffffff81008355 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1825> */\n\tcmp    $0xc5,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8135b690 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_removexattr> */\n\tcmp    $0x21a,%esi\n\tje     0xffffffff81008350 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1820> */\n\tcmp    $0x21b,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff812de280 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_process_vm_readv> */\n\tcmp    $0x214,%esi\n\tje     0xffffffff8100834b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x181b> */\n\tjbe    0xffffffff810076ae - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xb7e> */\n\tcmp    $0x217,%esi\n\tje     0xffffffff81008346 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1816> */\n\tjbe    0xffffffff81006d73 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x243> */\n\tcmp    $0x218,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810a7d00 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_rt_tgsigqueueinfo> */\n\tcmp    $0x203,%esi\n\tje     0xffffffff81007ffe - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14ce> */\n\tjbe    0xffffffff81007da3 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1273> */\n\tcmp    $0x209,%esi\n\tje     0xffffffff8100832d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17fd> */\n\tjbe    0xffffffff81007782 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xc52> */\n\tcmp    $0x20c,%esi\n\tje     0xffffffff81008328 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17f8> */\n\tjbe    0xffffffff810077ad - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xc7d> */\n\tcmp    $0x20d,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810a83a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_sigaltstack> */\n\tcmp    $0x215,%esi\n\tje     0xffffffff81008337 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1807> */\n\tcmp    $0x216,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81321ef0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_preadv64> */\n\tcmp    $0x1b1,%esi\n\tje     0xffffffff81008341 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1811> */\n\tjbe    0xffffffff81006e9e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x36e> */\n\tcmp    $0x1bc,%esi\n\tje     0xffffffff8100833c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x180c> */\n\tjbe    0xffffffff81006e6d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x33d> */\n\tcmp    $0x1c2,%esi\n\tje     0xffffffff81008323 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17f3> */\n\tjbe    0xffffffff81006f02 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x3d2> */\n\tcmp    $0x1c5,%esi\n\tje     0xffffffff8100831e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17ee> */\n\tjbe    0xffffffff81006e50 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x320> */\n\tcmp    $0x1c6,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81161930 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_futex_wake> */\n\tcmp    $0x107,%esi\n\tje     0xffffffff81008332 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1802> */\n\tjbe    0xffffffff810079b3 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xe83> */\n\tcmp    $0x122,%esi\n\tje     0xffffffff81008391 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1861> */\n\tjbe    0xffffffff8100773b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xc0b> */\n\tcmp    $0x131,%esi\n\tje     0xffffffff8100838c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x185c> */\n\tjbe    0xffffffff81007924 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xdf4> */\n\tcmp    $0x13a,%esi\n\tje     0xffffffff81008387 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1857> */\n\tjbe    0xffffffff8100767f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xb4f> */\n\tcmp    $0x13d,%esi\n\tje     0xffffffff81008382 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1852> */\n\tjbe    0xffffffff81006f2d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x3fd> */\n\tcmp    $0x13e,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff816f8620 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getrandom> */\n\tcmp    $0x1c3,%esi\n\tje     0xffffffff8100839b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x186b> */\n\tcmp    $0x1c4,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8131c860 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fchmodat2> */\n\tcmp    $0x1b7,%esi\n\tje     0xffffffff810083a5 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1875> */\n\tjbe    0xffffffff810076dd - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xbad> */\n\tcmp    $0x1ba,%esi\n\tje     0xffffffff810083a0 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1870> */\n\tjbe    0xffffffff81006ee5 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x3b5> */\n\tcmp    $0x1bb,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff813b80d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_quotactl_fd> */\n\tcmp    $0x14e,%esi\n\tje     0xffffffff81008396 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1866> */\n\tjbe    0xffffffff8100782f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xcff> */\n\tcmp    $0x1ac,%esi\n\tje     0xffffffff810083b9 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1889> */\n\tjbe    0xffffffff81007804 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xcd4> */\n\tcmp    $0x1af,%esi\n\tje     0xffffffff810083b4 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1884> */\n\tjbe    0xffffffff810078cd - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xd9d> */\n\tcmp    $0x1b0,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81356650 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fsmount> */\n\tcmp    $0x1b8,%esi\n\tje     0xffffffff810080a3 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1573> */\n\tcmp    $0x1b9,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81387870 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_epoll_pwait2> */\n\tcmp    $0x1bf,%esi\n\tje     0xffffffff81007f45 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1415> */\n\tjbe    0xffffffff81006f4a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x41a> */\n\tcmp    $0x1c0,%esi\n\tje     0xffffffff81007f40 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1410> */\n\tcmp    $0x1c1,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81161650 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_futex_waitv> */\n\tcmp    $0x13b,%esi\n\tje     0xffffffff81007f59 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1429> */\n\tcmp    $0x13c,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81339db0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_renameat2> */\n\tcmp    $0x1bd,%esi\n\tje     0xffffffff81007f54 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1424> */\n\tcmp    $0x1be,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8153fdf0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_landlock_restrict_self> */\n\tcmp    $0xbe,%esi\n\tje     0xffffffff81007f4f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x141f> */\n\tjbe    0xffffffff8100770c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xbdc> */\n\tcmp    $0xc1,%esi\n\tje     0xffffffff81007f4a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x141a> */\n\tjbe    0xffffffff81006fdf - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x4af> */\n\tcmp    $0xc2,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8135b470 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_listxattr> */\n\tcmp    $0xa4,%esi\n\tje     0xffffffff8100809e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x156e> */\n\tjbe    0xffffffff81007cae - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x117e> */\n\tcmp    $0xaa,%esi\n\tje     0xffffffff810083af - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x187f> */\n\tjbe    0xffffffff81007c83 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1153> */\n\tcmp    $0xad,%esi\n\tje     0xffffffff810083aa - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x187a> */\n\tjbe    0xffffffff81007d4c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x121c> */\n\tcmp    $0xaf,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8113b8c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_init_module> */\n\tcmp    $0xbf,%esi\n\tje     0xffffffff81008373 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1843> */\n\tcmp    $0xc0,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8135b270 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_lgetxattr> */\n\tcmp    $0x7c,%esi\n\tje     0xffffffff8100837d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x184d> */\n\tjbe    0xffffffff810070f5 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x5c5> */\n\tcmp    $0x8c,%esi\n\tje     0xffffffff81008378 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1848> */\n\tjbe    0xffffffff810070c4 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x594> */\n\tcmp    $0x92,%esi\n\tje     0xffffffff8100823d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x170d> */\n\tjbe    0xffffffff8100714d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x61d> */\n\tcmp    $0x95,%esi\n\tje     0xffffffff81008238 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1708> */\n\tjbe    0xffffffff810070a7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x577> */\n\tcmp    $0x96,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff812c25b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_munlock> */\n\tcmp    $0x34,%esi\n\tje     0xffffffff8100836e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x183e> */\n\tjbe    0xffffffff8100727d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x74d> */\n\tcmp    $0x4e,%esi\n\tje     0xffffffff81008251 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1721> */\n\tjbe    0xffffffff81007246 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x716> */\n\tcmp    $0x59,%esi\n\tje     0xffffffff8100824c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x171c> */\n\tjbe    0xffffffff810071ce - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x69e> */\n\tcmp    $0x5f,%esi\n\tje     0xffffffff81008247 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1717> */\n\tjbe    0xffffffff810071ac - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x67c> */\n\tcmp    $0x62,%esi\n\tje     0xffffffff81008242 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1712> */\n\tjbe    0xffffffff81007178 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x648> */\n\tcmp    $0x63,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810afa70 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sysinfo> */\n\tcmp    $0x93,%esi\n\tje     0xffffffff8100825b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x172b> */\n\tcmp    $0x94,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ee4d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_rr_get_interval> */\n\tcmp    $0x87,%esi\n\tje     0xffffffff81008265 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1735> */\n\tjbe    0xffffffff81007398 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x868> */\n\tcmp    $0x8a,%esi\n\tje     0xffffffff81008260 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1730> */\n\tjbe    0xffffffff81007130 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x600> */\n\tcmp    $0x8b,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8134d910 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sysfs> */\n\tcmp    $0x71,%esi\n\tje     0xffffffff81008256 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1726> */\n\tjbe    0xffffffff81007400 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x8d0> */\n\tcmp    $0x77,%esi\n\tje     0xffffffff81008233 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1703> */\n\tjbe    0xffffffff810073de - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x8ae> */\n\tcmp    $0x7a,%esi\n\tje     0xffffffff8100822e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16fe> */\n\tjbe    0xffffffff8100747d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x94d> */\n\tcmp    $0x7b,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ac660 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setfsgid> */\n\tcmp    $0x88,%esi\n\tje     0xffffffff8100816b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x163b> */\n\tcmp    $0x89,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8136e710 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_statfs> */\n\tcmp    $0x8f,%esi\n\tje     0xffffffff810080ad - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x157d> */\n\tjbe    0xffffffff8100718f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x65f> */\n\tcmp    $0x90,%esi\n\tje     0xffffffff810080a8 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1578> */\n\tcmp    $0x91,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ed590 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_getscheduler> */\n\tcmp    $0x60,%esi\n\tje     0xffffffff810080c1 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1591> */\n\tcmp    $0x61,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ade30 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getrlimit> */\n\tcmp    $0x8d,%esi\n\tje     0xffffffff810080bc - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x158c> */\n\tcmp    $0x8e,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ed0f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_setparam> */\n\tcmp    $0x5c,%esi\n\tje     0xffffffff810080b7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1587> */\n\tjbe    0xffffffff810071f2 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x6c2> */\n\tcmp    $0x5d,%esi\n\tje     0xffffffff810080b2 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1582> */\n\tcmp    $0x5e,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8131cd50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_lchown> */\n\tcmp    $0x54,%esi\n\tje     0xffffffff810080d5 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15a5> */\n\tjbe    0xffffffff81007220 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x6f0> */\n\tcmp    $0x57,%esi\n\tje     0xffffffff810080d0 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15a0> */\n\tjbe    0xffffffff81007209 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x6d9> */\n\tcmp    $0x58,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff813392b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_symlink> */\n\tcmp    $0x5a,%esi\n\tje     0xffffffff81008166 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1636> */\n\tcmp    $0x5b,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8131c740 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fchmod> */\n\tcmp    $0x55,%esi\n\tje     0xffffffff810080e9 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15b9> */\n\tcmp    $0x56,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81339740 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_link> */\n\tcmp    $0x51,%esi\n\tje     0xffffffff810080e4 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15b4> */\n\tjbe    0xffffffff810072c7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x797> */\n\tcmp    $0x52,%esi\n\tje     0xffffffff810080df - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15af> */\n\tcmp    $0x53,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81338860 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mkdir> */\n\tcmp    $0x43,%esi\n\tje     0xffffffff810080da - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15aa> */\n\tjbe    0xffffffff81007317 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x7e7> */\n\tcmp    $0x49,%esi\n\tje     0xffffffff81008279 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1749> */\n\tjbe    0xffffffff810072f5 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x7c5> */\n\tcmp    $0x4c,%esi\n\tje     0xffffffff81008274 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1744> */\n\tjbe    0xffffffff810072de - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x7ae> */\n\tcmp    $0x4d,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8131ba30 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_ftruncate> */\n\tcmp    $0x1b,%esi\n\tje     0xffffffff8100826f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x173f> */\n\tjbe    0xffffffff810074ea - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x9ba> */\n\tcmp    $0x26,%esi\n\tje     0xffffffff810080cb - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x159b> */\n\tjbe    0xffffffff810074c2 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x992> */\n\tcmp    $0x2c,%esi\n\tje     0xffffffff810080c6 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1596> */\n\tjbe    0xffffffff8100753c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xa0c> */\n\tcmp    $0x32,%esi\n\tje     0xffffffff8100826a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x173a> */\n\tjbe    0xffffffff810073c7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x897> */\n\tcmp    $0x33,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81b96530 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getsockname> */\n\tcmp    $0x4f,%esi\n\tje     0xffffffff81008189 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1659> */\n\tcmp    $0x50,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8131bee0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_chdir> */\n\tcmp    $0x4a,%esi\n\tje     0xffffffff81008184 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1654> */\n\tcmp    $0x4b,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8136b4b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fdatasync> */\n\tcmp    $0x46,%esi\n\tje     0xffffffff8100817f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x164f> */\n\tjbe    0xffffffff81007344 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x814> */\n\tcmp    $0x47,%esi\n\tje     0xffffffff8100817a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x164a> */\n\tcmp    $0x48,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8133b120 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fcntl> */\n\tcmp    $0x3d,%esi\n\tje     0xffffffff81008175 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1645> */\n\tjbe    0xffffffff81007372 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x842> */\n\tcmp    $0x40,%esi\n\tje     0xffffffff81008170 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1640> */\n\tjbe    0xffffffff8100735b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x82b> */\n\tcmp    $0x41,%esi\n\tje     0xffffffff81008283 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1753> */\n\tcmp    $0x42,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff814fc3b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_semctl> */\n\tcmp    $0x44,%esi\n\tje     0xffffffff8100827e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x174e> */\n\tcmp    $0x45,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff814f9070 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_msgsnd> */\n\tcmp    $0x3e,%esi\n\tje     0xffffffff81008102 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15d2> */\n\tcmp    $0x3f,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810acfd0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_newuname> */\n\tcmp    $0x39,%esi\n\tje     0xffffffff810080fd - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15cd> */\n\tjbe    0xffffffff81007494 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x964> */\n\tcmp    $0x3a,%esi\n\tje     0xffffffff810080f8 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15c8> */\n\tcmp    $0x3c,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tcall   0xffffffff810953b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_exit> */\n\tcmp    $0x82,%esi\n\tje     0xffffffff81008116 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15e6> */\n\tjbe    0xffffffff8100755e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xa2e> */\n\tcmp    $0x84,%esi\n\tje     0xffffffff81008111 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15e1> */\n\tcmp    $0x85,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff813385b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mknod> */\n\tcmp    $0x30,%esi\n\tje     0xffffffff8100810c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15dc> */\n\tcmp    $0x31,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81b95d60 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_bind> */\n\tcmp    $0x74,%esi\n\tje     0xffffffff81008107 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15d7> */\n\tjbe    0xffffffff8100742d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x8fd> */\n\tcmp    $0x75,%esi\n\tje     0xffffffff81008161 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1631> */\n\tcmp    $0x76,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ac030 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getresuid> */\n\tcmp    $0x6b,%esi\n\tje     0xffffffff8100815c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x162c> */\n\tjbe    0xffffffff8100745b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x92b> */\n\tcmp    $0x6e,%esi\n\tje     0xffffffff81008157 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1627> */\n\tjbe    0xffffffff81007444 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x914> */\n\tcmp    $0x6f,%esi\n\tje     0xffffffff81008152 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1622> */\n\tcmp    $0x70,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810acfb0 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_setsid> */\n\tcmp    $0x72,%esi\n\tje     0xffffffff8100814d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x161d> */\n\tcmp    $0x73,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ca380 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getgroups> */\n\tcmp    $0x6c,%esi\n\tje     0xffffffff81008148 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1618> */\n\tcmp    $0x6d,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810acc50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setpgid> */\n\tcmp    $0x68,%esi\n\tje     0xffffffff81008143 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1613> */\n\tjbe    0xffffffff810074ab - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x97b> */\n\tcmp    $0x69,%esi\n\tje     0xffffffff8100813e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x160e> */\n\tcmp    $0x6a,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810aba10 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setgid> */\n\tcmp    $0x78,%esi\n\tje     0xffffffff810081b1 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1681> */\n\tcmp    $0x79,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810accb0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getpgid> */\n\tcmp    $0x35,%esi\n\tje     0xffffffff810081ac - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x167c> */\n\tcmp    $0x38,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8108e160 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_clone> */\n\tcmp    $0x66,%esi\n\tje     0xffffffff810081a7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1677> */\n\tcmp    $0x67,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81106d40 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_syslog> */\n\tcmp    $0x21,%esi\n\tje     0xffffffff810081a2 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1672> */\n\tjbe    0xffffffff8100758c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xa5c> */\n\tcmp    $0x24,%esi\n\tje     0xffffffff81008193 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1663> */\n\tjbe    0xffffffff81007525 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x9f5> */\n\tcmp    $0x25,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81156b80 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_alarm> */\n\tcmp    $0xb,%esi\n\tje     0xffffffff8100819d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x166d> */\n\tjbe    0xffffffff810075fe - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xace> */\n\tcmp    $0x16,%esi\n\tje     0xffffffff81008198 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1668> */\n\tjbe    0xffffffff810075dc - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xaac> */\n\tcmp    $0x19,%esi\n\tje     0xffffffff8100818e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x165e> */\n\tjbe    0xffffffff810075ae - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xa7e> */\n\tcmp    $0x1a,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff812cf360 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_msync> */\n\tcmp    $0x22,%esi\n\tje     0xffffffff810081c5 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1695> */\n\tcmp    $0x23,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81146f40 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_nanosleep> */\n\tcmp    $0x29,%esi\n\tje     0xffffffff810081c0 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1690> */\n\tjbe    0xffffffff81007575 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xa45> */\n\tcmp    $0x2a,%esi\n\tje     0xffffffff810081d9 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16a9> */\n\tcmp    $0x2b,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81b96230 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_accept> */\n\tcmp    $0x7d,%esi\n\tje     0xffffffff810081d4 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16a4> */\n\tcmp    $0x7e,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8109d1f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_capset> */\n\tcmp    $0x27,%esi\n\tje     0xffffffff810081cf - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x169f> */\n\tcmp    $0x28,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff813226a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sendfile64> */\n\tcmp    $0x1e,%esi\n\tje     0xffffffff810081ca - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x169a> */\n\tjbe    0xffffffff810075c5 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xa95> */\n\tcmp    $0x1f,%esi\n\tje     0xffffffff81007ff9 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14c9> */\n\tcmp    $0x20,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8134d100 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_dup> */\n\tcmp    $0x17,%esi\n\tje     0xffffffff81007ff4 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14c4> */\n\tcmp    $0x18,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ee330 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_sched_yield> */\n\tcmp    $0x1c,%esi\n\tje     0xffffffff81007fef - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14bf> */\n\tcmp    $0x1d,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81500420 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_shmget> */\n\tcmp    $0x11,%esi\n\tje     0xffffffff81007fea - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14ba> */\n\tjbe    0xffffffff8100762b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xafb> */\n\tcmp    $0x12,%esi\n\tje     0xffffffff81007fe5 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14b5> */\n\tcmp    $0x15,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8131be80 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_access> */\n\tcmp    $0x5,%esi\n\tje     0xffffffff81007fe0 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14b0> */\n\tjbe    0xffffffff81007659 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xb29> */\n\tcmp    $0x8,%esi\n\tje     0xffffffff81007fdb - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14ab> */\n\tjbe    0xffffffff81007642 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xb12> */\n\tcmp    $0x9,%esi\n\tje     0xffffffff81007fd6 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14a6> */\n\tcmp    $0xa,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff812ccdc0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mprotect> */\n\tcmp    $0xc,%esi\n\tje     0xffffffff81007fd1 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14a1> */\n\tcmp    $0xe,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810a3110 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_rt_sigprocmask> */\n\tcmp    $0x6,%esi\n\tje     0xffffffff81007fcc - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x149c> */\n\tcmp    $0x7,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff813409b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_poll> */\n\tcmp    $0x2,%esi\n\tje     0xffffffff81007fc7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1497> */\n\tjbe    0xffffffff81007951 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xe21> */\n\tcmp    $0x3,%esi\n\tje     0xffffffff81007fc2 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1492> */\n\tcmp    $0x4,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81329c00 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_newstat> */\n\tcmp    $0x135,%esi\n\tje     0xffffffff81007fbd - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x148d> */\n\tjbe    0xffffffff810077ca - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xc9a> */\n\tcmp    $0x138,%esi\n\tje     0xffffffff81007fb8 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1488> */\n\tcmp    $0x139,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8113b920 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_finit_module> */\n\tcmp    $0x211,%esi\n\tje     0xffffffff81007fb3 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1483> */\n\tjbe    0xffffffff810078ea - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xdba> */\n\tcmp    $0x212,%esi\n\tje     0xffffffff81007fae - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x147e> */\n\tcmp    $0x213,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81161e90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_get_robust_list> */\n\tcmp    $0x1b4,%esi\n\tje     0xffffffff81007f81 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1451> */\n\tjbe    0xffffffff81007d69 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1239> */\n\tcmp    $0x1b5,%esi\n\tje     0xffffffff81007f7c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x144c> */\n\tcmp    $0x1b6,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810bb6a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pidfd_getfd> */\n\tcmp    $0xbb,%esi\n\tje     0xffffffff81007f77 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1447> */\n\tjbe    0xffffffff81007a04 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xed4> */\n\tcmp    $0xbc,%esi\n\tje     0xffffffff81007f72 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1442> */\n\tcmp    $0xbd,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8135ae20 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_lsetxattr> */\n\tcmp    $0x115,%esi\n\tje     0xffffffff81007f6d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x143d> */\n\tjbe    0xffffffff81007e64 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1334> */\n\tcmp    $0x11d,%esi\n\tje     0xffffffff81007f68 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1438> */\n\tjbe    0xffffffff81007e39 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1309> */\n\tcmp    $0x120,%esi\n\tje     0xffffffff81007f63 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1433> */\n\tjbe    0xffffffff81007dd0 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x12a0> */\n\tcmp    $0x121,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81388970 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_signalfd4> */\n\tcmp    $0x206,%esi\n\tje     0xffffffff81007fa9 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1479> */\n\tjbe    0xffffffff810077e7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xcb7> */\n\tcmp    $0x207,%esi\n\tje     0xffffffff81007fa4 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1474> */\n\tcmp    $0x208,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8132d6f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_execve> */\n\tcmp    $0x20a,%esi\n\tje     0xffffffff81007f9f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x146f> */\n\tcmp    $0x20b,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810a7000 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_rt_sigtimedwait_time64> */\n\tcmp    $0x132,%esi\n\tje     0xffffffff81007f9a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x146a> */\n\tcmp    $0x134,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810c4860 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setns> */\n\tcmp    $0x204,%esi\n\tje     0xffffffff81007f95 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1465> */\n\tcmp    $0x205,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81c24420 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_recvfrom> */\n\tcmp    $0x1a9,%esi\n\tje     0xffffffff81007f90 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1460> */\n\tjbe    0xffffffff81007868 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xd38> */\n\tcmp    $0x1aa,%esi\n\tje     0xffffffff81007f8b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x145b> */\n\tcmp    $0x1ab,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff815bb5a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_io_uring_register> */\n\tcmp    $0x146,%esi\n\tje     0xffffffff81007f86 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1456> */\n\tjbe    0xffffffff810078a2 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xd72> */\n\tcmp    $0x14b,%esi\n\tje     0xffffffff8100804e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x151e> */\n\tjbe    0xffffffff81007885 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xd55> */\n\tcmp    $0x14c,%esi\n\tje     0xffffffff81008049 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1519> */\n\tcmp    $0x14d,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81392f30 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_io_pgetevents> */\n\tcmp    $0x14f,%esi\n\tje     0xffffffff81008044 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1514> */\n\tcmp    $0x1a8,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810a73d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pidfd_send_signal> */\n\tcmp    $0x149,%esi\n\tje     0xffffffff8100803f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x150f> */\n\tcmp    $0x14a,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff812cce90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pkey_alloc> */\n\tcmp    $0x143,%esi\n\tje     0xffffffff8100803a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x150a> */\n\tjbe    0xffffffff81007907 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xdd7> */\n\tcmp    $0x144,%esi\n\tje     0xffffffff81008035 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1505> */\n\tcmp    $0x145,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff812c24f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mlock2> */\n\tcmp    $0x1ad,%esi\n\tje     0xffffffff81008030 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1500> */\n\tcmp    $0x1ae,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81371800 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fsopen> */\n\tcmp    $0x20f,%esi\n\tje     0xffffffff8100802b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14fb> */\n\tcmp    $0x210,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8116c910 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_kexec_load> */\n\tcmp    $0x140,%esi\n\tje     0xffffffff810081bb - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x168b> */\n\tcmp    $0x141,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff811f2320 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_bpf> */\n\tcmp    $0x12c,%esi\n\tje     0xffffffff810081b6 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1686> */\n\tjbe    0xffffffff81007984 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xe54> */\n\tcmp    $0x12f,%esi\n\tje     0xffffffff81007f5e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x142e> */\n\tjbe    0xffffffff81007967 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xe37> */\n\tcmp    $0x130,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff813a6a30 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_open_by_handle_at> */\n\ttest   %esi,%esi\n\tje     0xffffffff81008026 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14f6> */\n\tcmp    $0x1,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81321500 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_write> */\n\tcmp    $0x12d,%esi\n\tje     0xffffffff81008021 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14f1> */\n\tcmp    $0x12e,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ae750 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_prlimit64> */\n\tcmp    $0x125,%esi\n\tje     0xffffffff8100801c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14ec> */\n\tjbe    0xffffffff81007a21 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xef1> */\n\tcmp    $0x126,%esi\n\tje     0xffffffff81008017 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14e7> */\n\tcmp    $0x12a,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81267190 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_perf_event_open> */\n\tcmp    $0xee,%esi\n\tje     0xffffffff81008076 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1546> */\n\tjbe    0xffffffff81007abf - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xf8f> */\n\tcmp    $0xfc,%esi\n\tje     0xffffffff81008071 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1541> */\n\tjbe    0xffffffff81007a8a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xf5a> */\n\tcmp    $0x102,%esi\n\tje     0xffffffff8100806c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x153c> */\n\tjbe    0xffffffff81007a5b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xf2b> */\n\tcmp    $0x105,%esi\n\tje     0xffffffff81008067 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1537> */\n\tjbe    0xffffffff81007a3e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xf0e> */\n\tcmp    $0x106,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81329ca0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_newfstatat> */\n\tcmp    $0xb3,%esi\n\tje     0xffffffff81008058 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1528> */\n\tcmp    $0xba,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ac6d0 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_gettid> */\n\tcmp    $0x123,%esi\n\tje     0xffffffff81008062 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1532> */\n\tcmp    $0x124,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8134cec0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_dup3> */\n\tcmp    $0x103,%esi\n\tje     0xffffffff8100805d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x152d> */\n\tcmp    $0x104,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8131cc50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fchownat> */\n\tcmp    $0xff,%esi\n\tje     0xffffffff81008099 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1569> */\n\tjbe    0xffffffff81007b0a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xfda> */\n\tcmp    $0x100,%esi\n\tje     0xffffffff81008094 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1564> */\n\tcmp    $0x101,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8131d8e0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_openat> */\n\tcmp    $0xf5,%esi\n\tje     0xffffffff8100808f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x155f> */\n\tjbe    0xffffffff81007c1e - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x10ee> */\n\tcmp    $0xfa,%esi\n\tje     0xffffffff8100808a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x155a> */\n\tjbe    0xffffffff81007c01 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x10d1> */\n\tcmp    $0xfb,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81585ee0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_ioprio_set> */\n\tcmp    $0xe1,%esi\n\tje     0xffffffff81008053 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1523> */\n\tjbe    0xffffffff81007b6f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x103f> */\n\tcmp    $0xe7,%esi\n\tje     0xffffffff810083be - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x188e> */\n\tjbe    0xffffffff81007b44 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1014> */\n\tcmp    $0xea,%esi\n\tje     0xffffffff81008085 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1555> */\n\tjbe    0xffffffff81007b27 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0xff7> */\n\tcmp    $0xeb,%esi\n\tje     0xffffffff81008201 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16d1> */\n\tcmp    $0xed,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8130d160 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mbind> */\n\tcmp    $0xfd,%esi\n\tje     0xffffffff810081fc - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16cc> */\n\tcmp    $0xfe,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81380750 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_inotify_add_watch> */\n\tcmp    $0xe8,%esi\n\tje     0xffffffff810081f7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16c7> */\n\tcmp    $0xe9,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81387270 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_epoll_ctl> */\n\tcmp    $0xe4,%esi\n\tje     0xffffffff810081f2 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16c2> */\n\tjbe    0xffffffff81007b9c - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x106c> */\n\tcmp    $0xe5,%esi\n\tje     0xffffffff810081ed - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16bd> */\n\tcmp    $0xe6,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81153260 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_clock_nanosleep> */\n\tcmp    $0xdb,%esi\n\tje     0xffffffff810081e8 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16b8> */\n\tjbe    0xffffffff81007bd6 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x10a6> */\n\tcmp    $0xdf,%esi\n\tje     0xffffffff810081e3 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16b3> */\n\tjbe    0xffffffff81007bb9 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1089> */\n\tcmp    $0xe0,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81151ca0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_timer_gettime> */\n\tcmp    $0xe2,%esi\n\tje     0xffffffff81008229 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16f9> */\n\tcmp    $0xe3,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81152780 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_clock_settime> */\n\tcmp    $0xdc,%esi\n\tje     0xffffffff81008224 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16f4> */\n\tcmp    $0xdd,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8127f200 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fadvise64> */\n\tcmp    $0xd8,%esi\n\tje     0xffffffff8100821f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16ef> */\n\tjbe    0xffffffff81007c49 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1119> */\n\tcmp    $0xd9,%esi\n\tje     0xffffffff8100821a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16ea> */\n\tcmp    $0xda,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8108b310 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_set_tid_address> */\n\tcmp    $0xf8,%esi\n\tje     0xffffffff81008215 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16e5> */\n\tcmp    $0xf9,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8150a450 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_request_key> */\n\tcmp    $0xf1,%esi\n\tje     0xffffffff81008210 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16e0> */\n\tjbe    0xffffffff81007c66 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1136> */\n\tcmp    $0xf2,%esi\n\tje     0xffffffff8100820b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16db> */\n\tcmp    $0xf3,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81504670 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mq_timedreceive> */\n\tcmp    $0xd2,%esi\n\tje     0xffffffff81008206 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16d6> */\n\tcmp    $0xd5,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81386520 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_epoll_create> */\n\tcmp    $0xef,%esi\n\tje     0xffffffff81008139 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1609> */\n\tcmp    $0xf0,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff815040f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mq_open> */\n\tcmp    $0xa7,%esi\n\tje     0xffffffff81008134 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1604> */\n\tjbe    0xffffffff81007ce7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x11b7> */\n\tcmp    $0xa8,%esi\n\tje     0xffffffff8100812f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15ff> */\n\tcmp    $0xa9,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810c7f10 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_reboot> */\n\tcmp    $0x9e,%esi\n\tje     0xffffffff8100812a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15fa> */\n\tjbe    0xffffffff81007d21 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x11f1> */\n\tcmp    $0xa1,%esi\n\tje     0xffffffff81008125 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15f5> */\n\tjbe    0xffffffff81007d04 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x11d4> */\n\tcmp    $0xa2,%esi\n\tje     0xffffffff81008120 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15f0> */\n\tcmp    $0xa3,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81169770 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_acct> */\n\tcmp    $0xa5,%esi\n\tje     0xffffffff810080f3 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15c3> */\n\tcmp    $0xa6,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81353560 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_umount> */\n\tcmp    $0x9f,%esi\n\tje     0xffffffff810080ee - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15be> */\n\tcmp    $0xa0,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810ae7b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setrlimit> */\n\tcmp    $0x9a,%esi\n\tje     0xffffffff81008012 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14e2> */\n\tjbe    0xffffffff81007d86 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1256> */\n\tcmp    $0x9b,%esi\n\tje     0xffffffff8100800d - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14dd> */\n\tcmp    $0x9d,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810af910 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_prctl> */\n\tcmp    $0xab,%esi\n\tje     0xffffffff81008008 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x14d8> */\n\tcmp    $0xac,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810370f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_iopl> */\n\tcmp    $0x1b2,%esi\n\tje     0xffffffff8100811b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x15eb> */\n\tcmp    $0x1b3,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8108e1c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_clone3> */\n\tcmp    $0x98,%esi\n\tje     0xffffffff81008080 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1550> */\n\tcmp    $0x99,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8131e160 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_vhangup> */\n\tcmp    $0x1cd,%esi\n\tje     0xffffffff8100807b - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x154b> */\n\tjbe    0xffffffff81007e0a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x12da> */\n\tcmp    $0x201,%esi\n\tje     0xffffffff810081de - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x16ae> */\n\tjbe    0xffffffff81007ded - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x12bd> */\n\tcmp    $0x202,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8133d130 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_ioctl> */\n\tcmp    $0x11e,%esi\n\tje     0xffffffff81008319 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17e9> */\n\tcmp    $0x11f,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8138a0b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_timerfd_gettime> */\n\tcmp    $0x1ce,%esi\n\tje     0xffffffff81008314 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17e4> */\n\tcmp    $0x200,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff810a8ce0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_rt_sigaction> */\n\tcmp    $0x1ca,%esi\n\tje     0xffffffff8100830f - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17df> */\n\tjbe    0xffffffff81007ea1 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x1371> */\n\tcmp    $0x1cb,%esi\n\tje     0xffffffff8100830a - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17da> */\n\tcmp    $0x1cc,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff815111a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_lsm_set_self_attr> */\n\tcmp    $0x11a,%esi\n\tje     0xffffffff81008305 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17d5> */\n\tjbe    0xffffffff81007ebe - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x138e> */\n\tcmp    $0x11b,%esi\n\tje     0xffffffff81008300 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17d0> */\n\tcmp    $0x11c,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8138ae90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_eventfd> */\n\tcmp    $0x10d,%esi\n\tje     0xffffffff810082fb - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17cb> */\n\tjbe    0xffffffff81007ef8 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x13c8> */\n\tcmp    $0x110,%esi\n\tje     0xffffffff810082f6 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17c6> */\n\tjbe    0xffffffff81007edb - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x13ab> */\n\tcmp    $0x113,%esi\n\tje     0xffffffff810082f1 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17c1> */\n\tcmp    $0x114,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8136ac60 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_tee> */\n\tcmp    $0x1c8,%esi\n\tje     0xffffffff810082ec - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17bc> */\n\tcmp    $0x1c9,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff813570d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_statmount> */\n\tcmp    $0x118,%esi\n\tje     0xffffffff810082e7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17b7> */\n\tcmp    $0x119,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff813875f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_epoll_pwait> */\n\tcmp    $0x10e,%esi\n\tje     0xffffffff810082e2 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17b2> */\n\tcmp    $0x10f,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81340c30 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_ppoll> */\n\tcmp    $0x10a,%esi\n\tje     0xffffffff810082dd - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17ad> */\n\tjbe    0xffffffff81007f23 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x13f3> */\n\tcmp    $0x10b,%esi\n\tje     0xffffffff810082d8 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17a8> */\n\tcmp    $0x10c,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff8131c8c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fchmodat> */\n\tcmp    $0x108,%esi\n\tje     0xffffffff810082d3 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x17a3> */\n\tcmp    $0x109,%esi\n\tjne    0xffffffff81006bb7 - 0xffffffff81006b30 + x32_sys_call /* <x32_sys_call+0x87> */\n\tjmp    0xffffffff81339650 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_linkat> */\n\tjmp    0xffffffff8127ed80 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_process_mrelease> */\n\tjmp    0xffffffff81315860 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_memfd_secret> */\n\tjmp    0xffffffff8135b2d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fgetxattr> */\n\tjmp    0xffffffff8135aea0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fsetxattr> */\n\tjmp    0xffffffff8153fc50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_landlock_add_rule> */\n\tjmp    0xffffffff810ed8b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_getattr> */\n\tjmp    0xffffffff813a6890 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_name_to_handle_at> */\n\tjmp    0xffffffff81b961d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_accept4> */\n\tjmp    0xffffffff8131bcc0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fallocate> */\n\tjmp    0xffffffff8136b780 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sync_file_range> */\n\tjmp    0xffffffff8135ada0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setxattr> */\n\tjmp    0xffffffff81284070 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_readahead> */\n\tjmp    0xffffffff8131da40 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_openat2> */\n\tjmp    0xffffffff8131e100 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_close_range> */\n\tjmp    0xffffffff81323480 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_copy_file_range> */\n\tjmp    0xffffffff815a7ff0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_io_uring_enter> */\n\tjmp    0xffffffff815a80a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_io_uring_setup> */\n\tjmp    0xffffffff81321a40 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_writev> */\n\tjmp    0xffffffff8136b270 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_syncfs> */\n\tjmp    0xffffffff810a3720 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_rt_sigpending> */\n\tjmp    0xffffffff81c24330 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_recvmsg> */\n\tjmp    0xffffffff81c24250 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_sendmsg> */\n\tjmp    0xffffffff81161d90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_set_robust_list> */\n\tjmp    0xffffffff81096270 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_waitid> */\n\tjmp    0xffffffff8113e8f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_kcmp> */\n\tjmp    0xffffffff810af970 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getcpu> */\n\tjmp    0xffffffff8131dfe0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_close> */\n\tjmp    0xffffffff8131d780 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_open> */\n\tjmp    0xffffffff81329c50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_newlstat> */\n\tjmp    0xffffffff812c8660 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_brk> */\n\tjmp    0xffffffff8103b8d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mmap> */\n\tjmp    0xffffffff8131ff00 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_lseek> */\n\tjmp    0xffffffff81329d00 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_newfstat> */\n\tjmp    0xffffffff81321850 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pwrite64> */\n\tjmp    0xffffffff81321610 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pread64> */\n\tjmp    0xffffffff812f2dc0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_madvise> */\n\tjmp    0xffffffff813407c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_select> */\n\tjmp    0xffffffff81500540 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_shmctl> */\n\tjmp    0xffffffff813219e0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_readv> */\n\tjmp    0xffffffff813220a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_preadv64v2> */\n\tjmp    0xffffffff810ad990 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setdomainname> */\n\tjmp    0xffffffff81356fe0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pivot_root> */\n\tjmp    0xffffffff81039330 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_modify_ldt> */\n\tjmp    0xffffffff81380680 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_inotify_init1> */\n\tjmp    0xffffffff8132f870 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pipe2> */\n\tjmp    0xffffffff81384870 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fanotify_mark> */\n\tjmp    0xffffffff813213b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_read> */\n\tjmp    0xffffffff81504bd0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_mq_notify> */\n\tjmp    0xffffffff813566b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_move_mount> */\n\tjmp    0xffffffff810f6970 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_membarrier> */\n\tjmp    0xffffffff8138ef10 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_userfaultfd> */\n\tjmp    0xffffffff812cce30 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pkey_mprotect> */\n\tjmp    0xffffffff810750c0 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_uretprobe> */\n\tjmp    0xffffffff81329ff0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_statx> */\n\tjmp    0xffffffff812ccee0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pkey_free> */\n\tjmp    0xffffffff81151ea0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_timer_getoverrun> */\n\tjmp    0xffffffff813b7d30 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_quotactl> */\n\tjmp    0xffffffff81338510 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mknodat> */\n\tjmp    0xffffffff813864c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_epoll_create1> */\n\tjmp    0xffffffff8136c070 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_futimesat> */\n\tjmp    0xffffffff813387c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mkdirat> */\n\tjmp    0xffffffff81585f40 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_ioprio_get> */\n\tjmp    0xffffffff8130a9a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_set_mempolicy> */\n\tjmp    0xffffffff81511260 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_lsm_list_modules> */\n\tjmp    0xffffffff812c2810 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_munlockall> */\n\tjmp    0xffffffff810a7430 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_tgkill> */\n\tjmp    0xffffffff8150be50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_keyctl> */\n\tjmp    0xffffffff815048f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mq_getsetattr> */\n\tjmp    0xffffffff8130aa00 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_migrate_pages> */\n\tjmp    0xffffffff813809e0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_inotify_rm_watch> */\n\tjmp    0xffffffff81140790 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_settimeofday> */\n\tjmp    0xffffffff812f2ea0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_process_madvise> */\n\tjmp    0xffffffff810ed070 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_setscheduler> */\n\tjmp    0xffffffff810ed6b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_getparam> */\n\tjmp    0xffffffff8131cf30 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fchown> */\n\tjmp    0xffffffff8131ccd0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_chown> */\n\tjmp    0xffffffff810ab6d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setpriority> */\n\tjmp    0xffffffff81140510 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_gettimeofday> */\n\tjmp    0xffffffff81b968f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sendto> */\n\tjmp    0xffffffff81156ce0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setitimer> */\n\tjmp    0xffffffff81338ff0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_unlink> */\n\tjmp    0xffffffff81338b20 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_rmdir> */\n\tjmp    0xffffffff81501090 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_shmdt> */\n\tjmp    0xffffffff81339f50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_rename> */\n\tjmp    0xffffffff8131c0c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fchdir> */\n\tjmp    0xffffffff8131dee0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_creat> */\n\tjmp    0xffffffff81140d00 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_adjtimex> */\n\tjmp    0xffffffff813563b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mount> */\n\tjmp    0xffffffff8108e0e0 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_vfork> */\n\tjmp    0xffffffff8108e070 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_fork> */\n\tjmp    0xffffffff810a7270 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_kill> */\n\tjmp    0xffffffff810ca510 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setgroups> */\n\tjmp    0xffffffff81b96fc0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_shutdown> */\n\tjmp    0xffffffff8136c130 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_utime> */\n\tjmp    0xffffffff810a9410 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_rt_sigsuspend> */\n\tjmp    0xffffffff810bb460 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pidfd_open> */\n\tjmp    0xffffffff8136b1e0 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_sync> */\n\tjmp    0xffffffff8131c260 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_chroot> */\n\tjmp    0xffffffff81031bc0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_arch_prctl> */\n\tjmp    0xffffffff812fae70 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_swapoff> */\n\tjmp    0xffffffff812faf10 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_swapon> */\n\tjmp    0xffffffff8130aa60 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_get_mempolicy> */\n\tjmp    0xffffffff810abd60 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setuid> */\n\tjmp    0xffffffff810ac7d0 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_getgid> */\n\tjmp    0xffffffff810ac810 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_getegid> */\n\tjmp    0xffffffff810ab8d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setregid> */\n\tjmp    0xffffffff810acd10 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_getpgrp> */\n\tjmp    0xffffffff810ac700 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_getppid> */\n\tjmp    0xffffffff810ac790 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_geteuid> */\n\tjmp    0xffffffff810abfd0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setresuid> */\n\tjmp    0xffffffff8131c920 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_chmod> */\n\tjmp    0xffffffff8136e870 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_ustat> */\n\tjmp    0xffffffff814fc270 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_semget> */\n\tjmp    0xffffffff81096120 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_wait4> */\n\tjmp    0xffffffff814f8eb0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_msgctl> */\n\tjmp    0xffffffff814f9220 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_msgrcv> */\n\tjmp    0xffffffff8136b3d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fsync> */\n\tjmp    0xffffffff8136d3b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getcwd> */\n\tjmp    0xffffffff812ceff0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mremap> */\n\tjmp    0xffffffff811566d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getitimer> */\n\tjmp    0xffffffff8132f8d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pipe> */\n\tjmp    0xffffffff812c7160 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_munmap> */\n\tjmp    0xffffffff8134cf20 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_dup2> */\n\tjmp    0xffffffff810ac750 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_getuid> */\n\tjmp    0xffffffff81b95ba0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_socketpair> */\n\tjmp    0xffffffff810ac380 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getresgid> */\n\tjmp    0xffffffff81384810 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fanotify_init> */\n\tjmp    0xffffffff8116de80 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_kexec_file_load> */\n\tjmp    0xffffffff81b958c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_socket> */\n\tjmp    0xffffffff810a93b0 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_pause> */\n\tjmp    0xffffffff81500c90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_shmat> */\n\tjmp    0xffffffff810ac6a0 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_getpid> */\n\tjmp    0xffffffff8109d1a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_capget> */\n\tjmp    0xffffffff81b96400 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_connect> */\n\tjmp    0xffffffff81032c40 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_compat_sys_x32_rt_sigreturn> */\n\tjmp    0xffffffff81151fc0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_timer_settime> */\n\tjmp    0xffffffff810a2e20 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_restart_syscall> */\n\tjmp    0xffffffff81152b90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_clock_getres> */\n\tjmp    0xffffffff81152920 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_clock_gettime> */\n\tjmp    0xffffffff813873d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_epoll_wait> */\n\tjmp    0xffffffff813806e0 - 0xffffffff81006b30 + x32_sys_call /* <__ia32_sys_inotify_init> */\n\tjmp    0xffffffff8136c0d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_utimes> */\n\tjmp    0xffffffff81392ab0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_io_cancel> */\n\tjmp    0xffffffff815044f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mq_timedsend> */\n\tjmp    0xffffffff81504230 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mq_unlink> */\n\tjmp    0xffffffff8150a3f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_add_key> */\n\tjmp    0xffffffff8133def0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getdents64> */\n\tjmp    0xffffffff812ca0b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_remap_file_pages> */\n\tjmp    0xffffffff814fd900 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_semtimedop> */\n\tjmp    0xffffffff811523c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_timer_delete> */\n\tjmp    0xffffffff810ac560 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setfsuid> */\n\tjmp    0xffffffff810ac320 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setresgid> */\n\tjmp    0xffffffff812c2490 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mlock> */\n\tjmp    0xffffffff810ee350 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_get_priority_max> */\n\tjmp    0xffffffff810aee50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getrusage> */\n\tjmp    0xffffffff810aeef0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_umask> */\n\tjmp    0xffffffff81329dd0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_readlink> */\n\tjmp    0xffffffff8133dcb0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getdents> */\n\tjmp    0xffffffff810abbe0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setreuid> */\n\tjmp    0xffffffff810ee410 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_get_priority_min> */\n\tjmp    0xffffffff8136e7c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fstatfs> */\n\tjmp    0xffffffff8108e900 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_personality> */\n\tjmp    0xffffffff81b95ed0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_listen> */\n\tjmp    0xffffffff812c0920 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mincore> */\n\tjmp    0xffffffff8131b740 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_truncate> */\n\tjmp    0xffffffff813993b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_flock> */\n\tjmp    0xffffffff814f8d90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_msgget> */\n\tjmp    0xffffffff814fdcb0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_semop> */\n\tjmp    0xffffffff8135b6f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_lremovexattr> */\n\tjmp    0xffffffff81160ff0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_futex> */\n\tjmp    0xffffffff813922e0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_io_setup> */\n\tjmp    0xffffffff81c244a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_recvmmsg_time64> */\n\tjmp    0xffffffff81151c00 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_timer_create> */\n\tjmp    0xffffffff81161a90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_futex_wait> */\n\tjmp    0xffffffff81319ee0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_memfd_create> */\n\tjmp    0xffffffff813923b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_io_destroy> */\n\tjmp    0xffffffff810ee1b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_getaffinity> */\n\tjmp    0xffffffff811401b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_time> */\n\tjmp    0xffffffff8135b4d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_llistxattr> */\n\tjmp    0xffffffff8113bdc0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_delete_module> */\n\tjmp    0xffffffff812c27d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mlockall> */\n\tjmp    0xffffffff810ac850 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_times> */\n\tjmp    0xffffffff81392d90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_io_getevents> */\n\tjmp    0xffffffff81339e90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_renameat> */\n\tjmp    0xffffffff81329d50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_readlinkat> */\n\tjmp    0xffffffff81339210 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_symlinkat> */\n\tjmp    0xffffffff81340840 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_pselect6> */\n\tjmp    0xffffffff8136bef0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_utimensat> */\n\tjmp    0xffffffff81161cf0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_futex_requeue> */\n\tjmp    0xffffffff8136a5e0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_splice> */\n\tjmp    0xffffffff8108e6d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_unshare> */\n\tjmp    0xffffffff8131bdc0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_faccessat> */\n\tjmp    0xffffffff81389ef0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_timerfd_create> */\n\tjmp    0xffffffff81388a90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_signalfd> */\n\tjmp    0xffffffff81511200 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_lsm_get_self_attr> */\n\tjmp    0xffffffff81357130 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_listmount> */\n\tjmp    0xffffffff812de850 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mseal> */\n\tjmp    0xffffffff81389f50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_timerfd_settime> */\n\tjmp    0xffffffff810783f0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_map_shadow_stack> */\n\tjmp    0xffffffff8130ca50 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_set_mempolicy_home_node> */\n\tjmp    0xffffffff810a7a00 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_rt_sigqueueinfo> */\n\tjmp    0xffffffff8109f7b0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_ptrace> */\n\tjmp    0xffffffff81338f10 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_unlinkat> */\n\tjmp    0xffffffff81312f00 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_move_pages> */\n\tjmp    0xffffffff8153fbf0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_landlock_create_ruleset> */\n\tjmp    0xffffffff81371aa0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fspick> */\n\tjmp    0xffffffff81322280 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_pwritev64> */\n\tjmp    0xffffffff8136a580 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_vmsplice> */\n\tjmp    0xffffffff81c242c0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_sendmmsg> */\n\tjmp    0xffffffff8135b530 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_flistxattr> */\n\tjmp    0xffffffff81b96cf0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_setsockopt> */\n\tjmp    0xffffffff812de300 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_process_vm_writev> */\n\tjmp    0xffffffff81392970 - 0xffffffff81006b30 + x32_sys_call /* <__x64_compat_sys_io_submit> */\n\tjmp    0xffffffff8135b750 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fremovexattr> */\n\tjmp    0xffffffff81b96670 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getpeername> */\n\tjmp    0xffffffff8135b210 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getxattr> */\n\tjmp    0xffffffff810ab730 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getpriority> */\n\tjmp    0xffffffff810acd60 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_getsid> */\n\tjmp    0xffffffff8119e490 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_seccomp> */\n\tjmp    0xffffffff810ed150 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sched_setattr> */\n\tjmp    0xffffffff81152b40 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_clock_adjtime> */\n\tjmp    0xffffffff8138ae30 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_eventfd2> */\n\tjmp    0xffffffff81272810 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_rseq> */\n\tjmp    0xffffffff8127a6d0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_cachestat> */\n\tjmp    0xffffffff81357030 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_mount_setattr> */\n\tjmp    0xffffffff8131be20 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_faccessat2> */\n\tjmp    0xffffffff81037090 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_ioperm> */\n\tjmp    0xffffffff810ad310 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_sethostname> */\n\tjmp    0xffffffff81371dc0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_fsconfig> */\n\tjmp    0xffffffff81354f90 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_open_tree> */\n\tcall   0xffffffff810954a0 - 0xffffffff81006b30 + x32_sys_call /* <__x64_sys_exit_group> */\n\n.size x32_sys_call, . - x32_sys_call\n\n.globl ia32_sys_call\n.type ia32_sys_call @function\nia32_sys_call:\n\tendbr64\n\tcmp    $0xed,%esi\n\tje     0xffffffff81006662 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1802> */\n\tja     0xffffffff81004eec - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x8c> */\n\tcmp    $0x76,%esi\n\tje     0xffffffff8100665d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17fd> */\n\tjbe    0xffffffff81005e1e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xfbe> */\n\tcmp    $0xb4,%esi\n\tje     0xffffffff81006658 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17f8> */\n\tjbe    0xffffffff810054b9 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x659> */\n\tcmp    $0xd1,%esi\n\tje     0xffffffff81006653 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17f3> */\n\tjbe    0xffffffff81005afe - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xc9e> */\n\tcmp    $0xe0,%esi\n\tje     0xffffffff8100664e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17ee> */\n\tjbe    0xffffffff8100531a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x4ba> */\n\tcmp    $0xe7,%esi\n\tje     0xffffffff81006649 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17e9> */\n\tjbe    0xffffffff81004f8e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x12e> */\n\tcmp    $0xea,%esi\n\tje     0xffffffff81006644 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17e4> */\n\tjbe    0xffffffff81004f71 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x111> */\n\tcmp    $0xeb,%esi\n\tje     0xffffffff8100663f - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17df> */\n\tjmp    0xffffffff8135b720 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_lremovexattr> */\n\tcmp    $0x15d,%esi\n\tje     0xffffffff8100663a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17da> */\n\tjbe    0xffffffff81005167 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x307> */\n\tcmp    $0x199,%esi\n\tje     0xffffffff81006635 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17d5> */\n\tjbe    0xffffffff81005102 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x2a2> */\n\tcmp    $0x1b5,%esi\n\tje     0xffffffff81006630 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17d0> */\n\tjbe    0xffffffff81005092 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x232> */\n\tcmp    $0x1c2,%esi\n\tje     0xffffffff8100662b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17cb> */\n\tjbe    0xffffffff81005055 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1f5> */\n\tcmp    $0x1c9,%esi\n\tje     0xffffffff81006626 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17c6> */\n\tjbe    0xffffffff81004fd6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x176> */\n\tcmp    $0x1cc,%esi\n\tje     0xffffffff81006621 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17c1> */\n\tjbe    0xffffffff81004fb9 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x159> */\n\tcmp    $0x1cd,%esi\n\tje     0xffffffff8100661c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17bc> */\n\tcmp    $0x1ce,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff812de880 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mseal> */\n\tcmp    $0xe8,%esi\n\tje     0xffffffff81006617 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17b7> */\n\tcmp    $0xe9,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8135b500 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_llistxattr> */\n\tcmp    $0xe4,%esi\n\tje     0xffffffff81006b08 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ca8> */\n\tjbe    0xffffffff81005001 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a1> */\n\tcmp    $0xe5,%esi\n\tje     0xffffffff81006b03 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ca3> */\n\tcmp    $0xe6,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8135b2a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_lgetxattr> */\n\tcmp    $0x1ca,%esi\n\tje     0xffffffff81006afe - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c9e> */\n\tcmp    $0x1cb,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81511230 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_lsm_get_self_attr> */\n\tcmp    $0x1c6,%esi\n\tje     0xffffffff81006af9 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c99> */\n\tjbe    0xffffffff8100501a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ba> */\n\tcmp    $0x1c7,%esi\n\tje     0xffffffff81006af4 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c94> */\n\tcmp    $0x1c8,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81161d20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_futex_requeue> */\n\tcmp    $0xe2,%esi\n\tje     0xffffffff81006aef - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c8f> */\n\tcmp    $0xe3,%esi\n\tjne    0xffffffff81005033 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1d3> */\n\tjmp    0xffffffff8135ae60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_lsetxattr> */\n\tcmp    $0x1c4,%esi\n\tje     0xffffffff81006aea - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c8a> */\n\tcmp    $0x1c5,%esi\n\tjne    0xffffffff81005044 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1e4> */\n\tjmp    0xffffffff81078490 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_map_shadow_stack> */\n\tcmp    $0xe1,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8103aba0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ia32_readahead> */\n\tcmp    $0x1c3,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8127a860 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_cachestat> */\n\tcmp    $0x1bc,%esi\n\tje     0xffffffff81006ae5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c85> */\n\tjbe    0xffffffff8100545b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x5fb> */\n\tcmp    $0x1bf,%esi\n\tje     0xffffffff81006ae0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c80> */\n\tjbe    0xffffffff810050e5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x285> */\n\tcmp    $0x1c0,%esi\n\tje     0xffffffff81006adb - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c7b> */\n\tcmp    $0x1c1,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff811617c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_futex_waitv> */\n\tcmp    $0x1a8,%esi\n\tje     0xffffffff81006ad6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c76> */\n\tjbe    0xffffffff81005a58 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xbf8> */\n\tcmp    $0x1af,%esi\n\tje     0xffffffff81006ad1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c71> */\n\tjbe    0xffffffff81005a2d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xbcd> */\n\tcmp    $0x1b2,%esi\n\tje     0xffffffff81006acc - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c6c> */\n\tjbe    0xffffffff81005d97 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xf37> */\n\tcmp    $0x1b3,%esi\n\tje     0xffffffff81006ac7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c67> */\n\tcmp    $0x1b4,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8131e130 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_close_range> */\n\tcmp    $0x1bd,%esi\n\tje     0xffffffff81006ac2 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c62> */\n\tcmp    $0x1be,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8153ff40 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_landlock_restrict_self> */\n\tcmp    $0x178,%esi\n\tje     0xffffffff81006abd - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c5d> */\n\tjbe    0xffffffff81005238 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x3d8> */\n\tcmp    $0x18c,%esi\n\tje     0xffffffff81006ab8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c58> */\n\tjbe    0xffffffff810051fb - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x39b> */\n\tcmp    $0x193,%esi\n\tje     0xffffffff81006ab3 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c53> */\n\tjbe    0xffffffff810052a4 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x444> */\n\tcmp    $0x196,%esi\n\tje     0xffffffff81006aae - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c4e> */\n\tjbe    0xffffffff810051de - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x37e> */\n\tcmp    $0x197,%esi\n\tje     0xffffffff81006aa9 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c49> */\n\tcmp    $0x198,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81151d20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timer_gettime> */\n\tcmp    $0x127,%esi\n\tje     0xffffffff81006aa4 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c44> */\n\tjbe    0xffffffff8100556d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x70d> */\n\tcmp    $0x142,%esi\n\tje     0xffffffff81006a9f - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c3f> */\n\tjbe    0xffffffff8100551e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x6be> */\n\tcmp    $0x150,%esi\n\tje     0xffffffff81006a9a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c3a> */\n\tjbe    0xffffffff81005386 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x526> */\n\tcmp    $0x157,%esi\n\tje     0xffffffff81006a95 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c35> */\n\tjbe    0xffffffff8100535b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x4fb> */\n\tcmp    $0x15a,%esi\n\tje     0xffffffff81006a90 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c30> */\n\tjbe    0xffffffff810052cf - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x46f> */\n\tcmp    $0x15b,%esi\n\tje     0xffffffff81006a8b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c2b> */\n\tcmp    $0x15c,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff812de340 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_process_vm_writev> */\n\tcmp    $0x194,%esi\n\tje     0xffffffff81006a86 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c26> */\n\tcmp    $0x195,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81152b70 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clock_adjtime> */\n\tcmp    $0x17f,%esi\n\tje     0xffffffff81006a81 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c21> */\n\tjbe    0xffffffff8100548a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x62a> */\n\tcmp    $0x189,%esi\n\tje     0xffffffff81006a7c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c1c> */\n\tjbe    0xffffffff8100528b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x42b> */\n\tcmp    $0x18a,%esi\n\tje     0xffffffff81006a77 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c17> */\n\tcmp    $0x18b,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff815004b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_shmget> */\n\tcmp    $0x16b,%esi\n\tje     0xffffffff81006a72 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c12> */\n\tjbe    0xffffffff810060a5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1245> */\n\tcmp    $0x172,%esi\n\tje     0xffffffff81006a6d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c0d> */\n\tjbe    0xffffffff81005acf - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xc6f> */\n\tcmp    $0x175,%esi\n\tje     0xffffffff81006a68 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c08> */\n\tjbe    0xffffffff81006073 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1213> */\n\tcmp    $0x176,%esi\n\tje     0xffffffff81006a63 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1c03> */\n\tcmp    $0x177,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810f6ad0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_membarrier> */\n\tcmp    $0x181,%esi\n\tje     0xffffffff81006a5e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bfe> */\n\tcmp    $0x182,%esi\n\tjne    0xffffffff810052ec - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x48c> */\n\tjmp    0xffffffff812729a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_rseq> */\n\tcmp    $0x190,%esi\n\tje     0xffffffff81006a59 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bf9> */\n\tjbe    0xffffffff810052fd - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x49d> */\n\tcmp    $0x191,%esi\n\tje     0xffffffff81006a54 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bf4> */\n\tcmp    $0x192,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff814f8f10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_msgctl> */\n\tcmp    $0x158,%esi\n\tje     0xffffffff81006a4f - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bef> */\n\tcmp    $0x159,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81c24280 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sendmmsg> */\n\tcmp    $0x180,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81031c60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_arch_prctl> */\n\tcmp    $0x18e,%esi\n\tje     0xffffffff81006a4a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bea> */\n\tcmp    $0x18f,%esi\n\tjne    0xffffffff81005e7c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x101c> */\n\tjmp    0xffffffff814f8e20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_msgget> */\n\tcmp    $0xd8,%esi\n\tje     0xffffffff81006a45 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1be5> */\n\tjbe    0xffffffff8100597b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xb1b> */\n\tcmp    $0xdb,%esi\n\tje     0xffffffff81006a40 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1be0> */\n\tjbe    0xffffffff81005874 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xa14> */\n\tcmp    $0xdc,%esi\n\tje     0xffffffff81006a3b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bdb> */\n\tcmp    $0xdd,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8133b2d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_fcntl64> */\n\tcmp    $0x154,%esi\n\tje     0xffffffff81006a36 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bd6> */\n\tjbe    0xffffffff810053bf - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x55f> */\n\tcmp    $0x155,%esi\n\tje     0xffffffff81006a31 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bd1> */\n\tcmp    $0x156,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff813a6a90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_open_by_handle_at> */\n\tcmp    $0x149,%esi\n\tje     0xffffffff81006a2c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bcc> */\n\tjbe    0xffffffff810053f1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x591> */\n\tcmp    $0x14d,%esi\n\tje     0xffffffff81006a27 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bc7> */\n\tjbe    0xffffffff810053d8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x578> */\n\tcmp    $0x14e,%esi\n\tje     0xffffffff81006a22 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bc2> */\n\tcmp    $0x14f,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810a7c80 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_rt_tgsigqueueinfo> */\n\tcmp    $0x152,%esi\n\tje     0xffffffff81006a1d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bbd> */\n\tcmp    $0x153,%esi\n\tjne    0xffffffff8100541c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x5bc> */\n\tjmp    0xffffffff813848f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_fanotify_mark> */\n\tcmp    $0x14b,%esi\n\tje     0xffffffff81006a18 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bb8> */\n\tcmp    $0x14c,%esi\n\tjne    0xffffffff8100542d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x5cd> */\n\tjmp    0xffffffff813806b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_inotify_init1> */\n\tcmp    $0x146,%esi\n\tje     0xffffffff81006a13 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bb3> */\n\tjbe    0xffffffff8100543e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x5de> */\n\tcmp    $0x147,%esi\n\tje     0xffffffff81006a0e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1bae> */\n\tcmp    $0x148,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8138ae60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_eventfd2> */\n\tcmp    $0x151,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81c244e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_recvmmsg_time32> */\n\tcmp    $0x14a,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8134cef0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_dup3> */\n\tcmp    $0x144,%esi\n\tje     0xffffffff81006a09 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ba9> */\n\tcmp    $0x145,%esi\n\tjne    0xffffffff81005db4 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xf54> */\n\tjmp    0xffffffff8138a260 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timerfd_settime32> */\n\tcmp    $0x1b9,%esi\n\tje     0xffffffff81006a04 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ba4> */\n\tjbe    0xffffffff8100608c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x122c> */\n\tcmp    $0x1ba,%esi\n\tje     0xffffffff810069ff - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b9f> */\n\tcmp    $0x1bb,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff813b82e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_quotactl_fd> */\n\tcmp    $0x17c,%esi\n\tje     0xffffffff810069fa - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b9a> */\n\tjbe    0xffffffff81005e8d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x102d> */\n\tcmp    $0x17d,%esi\n\tje     0xffffffff810069f5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b95> */\n\tcmp    $0x17e,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff812cd020 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_pkey_free> */\n\tcmp    $0x96,%esi\n\tje     0xffffffff810069f0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b90> */\n\tjbe    0xffffffff81005bab - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xd4b> */\n\tcmp    $0xa4,%esi\n\tje     0xffffffff810069eb - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b8b> */\n\tjbe    0xffffffff81005b6e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xd0e> */\n\tcmp    $0xae,%esi\n\tje     0xffffffff810069e6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b86> */\n\tjbe    0xffffffff8100616a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x130a> */\n\tcmp    $0xb1,%esi\n\tje     0xffffffff810069e1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b81> */\n\tjbe    0xffffffff81005b51 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xcf1> */\n\tcmp    $0xb2,%esi\n\tje     0xffffffff810069dc - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b7c> */\n\tcmp    $0xb3,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810a9510 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_rt_sigsuspend> */\n\tcmp    $0x135,%esi\n\tje     0xffffffff810069d7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b77> */\n\tjbe    0xffffffff810057e0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x980> */\n\tcmp    $0x13c,%esi\n\tje     0xffffffff810069d2 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b72> */\n\tjbe    0xffffffff810057b5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x955> */\n\tcmp    $0x13f,%esi\n\tje     0xffffffff810069cd - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b6d> */\n\tjbe    0xffffffff810055ca - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x76a> */\n\tcmp    $0x140,%esi\n\tje     0xffffffff810069c8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b68> */\n\tcmp    $0x141,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81388cd0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_signalfd> */\n\tcmp    $0x10a,%esi\n\tje     0xffffffff810069c3 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b63> */\n\tjbe    0xffffffff81005674 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x814> */\n\tcmp    $0x119,%esi\n\tje     0xffffffff810069be - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b5e> */\n\tjbe    0xffffffff81005633 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x7d3> */\n\tcmp    $0x121,%esi\n\tje     0xffffffff810069b9 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b59> */\n\tjbe    0xffffffff81005604 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x7a4> */\n\tcmp    $0x124,%esi\n\tje     0xffffffff810069b4 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b54> */\n\tjbe    0xffffffff810055e7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x787> */\n\tcmp    $0x125,%esi\n\tje     0xffffffff810069af - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b4f> */\n\tcmp    $0x126,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8130aa30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_migrate_pages> */\n\tcmp    $0x13d,%esi\n\tje     0xffffffff810069aa - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b4a> */\n\tcmp    $0x13e,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810af9f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getcpu> */\n\tcmp    $0x122,%esi\n\tje     0xffffffff810069a5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b45> */\n\tcmp    $0x123,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff813806e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_inotify_init> */\n\tcmp    $0x11e,%esi\n\tje     0xffffffff810069a0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b40> */\n\tjbe    0xffffffff810056bf - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x85f> */\n\tcmp    $0x11f,%esi\n\tje     0xffffffff8100699b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b3b> */\n\tcmp    $0x120,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8150edb0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_keyctl> */\n\tcmp    $0x112,%esi\n\tje     0xffffffff81006996 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b36> */\n\tjbe    0xffffffff810058e6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xa86> */\n\tcmp    $0x116,%esi\n\tje     0xffffffff81006991 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b31> */\n\tjbe    0xffffffff81005857 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x9f7> */\n\tcmp    $0x117,%esi\n\tje     0xffffffff8100698c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b2c> */\n\tcmp    $0x118,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81504f00 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mq_timedreceive_time32> */\n\tcmp    $0xfa,%esi\n\tje     0xffffffff81006987 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b27> */\n\tjbe    0xffffffff8100573e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x8de> */\n\tcmp    $0x103,%esi\n\tje     0xffffffff81006982 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b22> */\n\tjbe    0xffffffff81005713 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x8b3> */\n\tcmp    $0x107,%esi\n\tje     0xffffffff8100697d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b1d> */\n\tjbe    0xffffffff810056d8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x878> */\n\tcmp    $0x108,%esi\n\tje     0xffffffff81006978 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b18> */\n\tcmp    $0x109,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81152fa0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clock_gettime32> */\n\tcmp    $0x11b,%esi\n\tje     0xffffffff81006973 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b13> */\n\tcmp    $0x11c,%esi\n\tjne    0xffffffff810056f1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x891> */\n\tjmp    0xffffffff81096240 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_waitid> */\n\tcmp    $0x105,%esi\n\tje     0xffffffff8100696e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b0e> */\n\tcmp    $0x106,%esi\n\tjne    0xffffffff81005702 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x8a2> */\n\tjmp    0xffffffff81151f30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timer_getoverrun> */\n\tcmp    $0x11a,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81504c60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_mq_getsetattr> */\n\tcmp    $0x104,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff811522c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timer_settime32> */\n\tcmp    $0x100,%esi\n\tje     0xffffffff81006969 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b09> */\n\tjbe    0xffffffff8100577b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x91b> */\n\tcmp    $0x101,%esi\n\tje     0xffffffff81006964 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1b04> */\n\tcmp    $0x102,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8108b350 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_set_tid_address> */\n\tcmp    $0xf4,%esi\n\tje     0xffffffff8100695f - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1aff> */\n\tjbe    0xffffffff81005891 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xa31> */\n\tcmp    $0xf7,%esi\n\tje     0xffffffff8100695a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1afa> */\n\tjbe    0xffffffff81005798 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x938> */\n\tcmp    $0xf8,%esi\n\tje     0xffffffff81006955 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1af5> */\n\tcmp    $0xf9,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81392c20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_io_cancel> */\n\tcmp    $0xfe,%esi\n\tje     0xffffffff81006950 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1af0> */\n\tcmp    $0xff,%esi\n\tjne    0xffffffff810058bc - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xa5c> */\n\tjmp    0xffffffff81387320 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_epoll_ctl> */\n\tcmp    $0xf5,%esi\n\tje     0xffffffff8100694b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1aeb> */\n\tcmp    $0xf6,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff813924a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_io_destroy> */\n\tcmp    $0x139,%esi\n\tje     0xffffffff81006946 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ae6> */\n\tjbe    0xffffffff8100581d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x9bd> */\n\tcmp    $0x13a,%esi\n\tje     0xffffffff81006941 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ae1> */\n\tcmp    $0x13b,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8136ad40 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_tee> */\n\tcmp    $0x12e,%esi\n\tje     0xffffffff8100693c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1adc> */\n\tjbe    0xffffffff81005950 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xaf0> */\n\tcmp    $0x132,%esi\n\tje     0xffffffff81006937 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ad7> */\n\tjbe    0xffffffff8100583a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x9da> */\n\tcmp    $0x133,%esi\n\tje     0xffffffff81006932 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ad2> */\n\tcmp    $0x134,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81341200 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_pselect6_time32> */\n\tcmp    $0x137,%esi\n\tje     0xffffffff8100692d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1acd> */\n\tcmp    $0x138,%esi\n\tjne    0xffffffff810059a6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xb46> */\n\tjmp    0xffffffff81161dd0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_get_robust_list> */\n\tcmp    $0x130,%esi\n\tje     0xffffffff81006928 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ac8> */\n\tcmp    $0x131,%esi\n\tjne    0xffffffff81005911 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xab1> */\n\tjmp    0xffffffff81329d90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_readlinkat> */\n\tcmp    $0x114,%esi\n\tje     0xffffffff81006923 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ac3> */\n\tcmp    $0x115,%esi\n\tjne    0xffffffff810059b7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xb57> */\n\tjmp    0xffffffff81504950 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_mq_open> */\n\tcmp    $0xd9,%esi\n\tje     0xffffffff8100691e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1abe> */\n\tcmp    $0xda,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff812c0950 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mincore> */\n\tcmp    $0xf1,%esi\n\tje     0xffffffff81006919 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ab9> */\n\tjbe    0xffffffff810058cd - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xa6d> */\n\tcmp    $0xf2,%esi\n\tje     0xffffffff81006914 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1ab4> */\n\tcmp    $0xf3,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8104a070 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_set_thread_area> */\n\tcmp    $0xfc,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tcall   0xffffffff810954d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_exit_group> */\n\tcmp    $0xef,%esi\n\tje     0xffffffff8100690f - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1aaf> */\n\tcmp    $0xf0,%esi\n\tjne    0xffffffff81005922 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xac2> */\n\tjmp    0xffffffff81162120 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_futex_time32> */\n\tcmp    $0x10e,%esi\n\tje     0xffffffff8100690a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1aaa> */\n\tjbe    0xffffffff81005933 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xad3> */\n\tcmp    $0x10f,%esi\n\tje     0xffffffff81006905 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1aa5> */\n\tcmp    $0x110,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8103ab20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ia32_fadvise64_64> */\n\tcmp    $0x12f,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff813396d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_linkat> */\n\tcmp    $0xee,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810a76c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_tkill> */\n\tcmp    $0x10c,%esi\n\tje     0xffffffff81006900 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1aa0> */\n\tcmp    $0x10d,%esi\n\tjne    0xffffffff810059e1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xb81> */\n\tjmp    0xffffffff8136eaa0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_fstatfs64> */\n\tcmp    $0x12b,%esi\n\tje     0xffffffff810068fb - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a9b> */\n\tjbe    0xffffffff810059c8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xb68> */\n\tcmp    $0x12c,%esi\n\tje     0xffffffff810068f6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a96> */\n\tcmp    $0x12d,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81338f80 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_unlinkat> */\n\tcmp    $0xd5,%esi\n\tje     0xffffffff810068f1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a91> */\n\tjbe    0xffffffff810059f2 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xb92> */\n\tcmp    $0xd6,%esi\n\tje     0xffffffff810068ec - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a8c> */\n\tcmp    $0xd7,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ac580 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setfsuid> */\n\tcmp    $0x136,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8108e700 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_unshare> */\n\tcmp    $0x113,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8130ab30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_get_mempolicy> */\n\tcmp    $0x129,%esi\n\tje     0xffffffff810068e7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a87> */\n\tcmp    $0x12a,%esi\n\tjne    0xffffffff81005a0b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xbab> */\n\tjmp    0xffffffff8131cc90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fchownat> */\n\tcmp    $0x10b,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81153650 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clock_nanosleep_time32> */\n\tcmp    $0xd3,%esi\n\tje     0xffffffff810068e2 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a82> */\n\tcmp    $0xd4,%esi\n\tjne    0xffffffff81005a1c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xbbc> */\n\tjmp    0xffffffff8131cd10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_chown> */\n\tcmp    $0x128,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81338810 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mkdirat> */\n\tcmp    $0xd2,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ac350 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setresgid> */\n\tcmp    $0x1ac,%esi\n\tje     0xffffffff810068dd - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a7d> */\n\tjbe    0xffffffff81005a95 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xc35> */\n\tcmp    $0x1ad,%esi\n\tje     0xffffffff810068d8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a78> */\n\tcmp    $0x1ae,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81371950 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fsopen> */\n\tcmp    $0x1a1,%esi\n\tje     0xffffffff810068d3 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a73> */\n\tjbe    0xffffffff81005dc5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xf65> */\n\tcmp    $0x1a5,%esi\n\tje     0xffffffff810068ce - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a6e> */\n\tjbe    0xffffffff81005ab2 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xc52> */\n\tcmp    $0x1a6,%esi\n\tje     0xffffffff810068c9 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a69> */\n\tcmp    $0x1a7,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ee560 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_rr_get_interval> */\n\tcmp    $0x1aa,%esi\n\tje     0xffffffff810068c4 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a64> */\n\tcmp    $0x1ab,%esi\n\tjne    0xffffffff81005df0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xf90> */\n\tjmp    0xffffffff815bb5d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_io_uring_register> */\n\tcmp    $0x1a3,%esi\n\tje     0xffffffff810068bf - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a5f> */\n\tcmp    $0x1a4,%esi\n\tjne    0xffffffff810060da - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x127a> */\n\tjmp    0xffffffff814fd9c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_semtimedop> */\n\tcmp    $0x16f,%esi\n\tje     0xffffffff810068ba - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a5a> */\n\tjbe    0xffffffff81005ec8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1068> */\n\tcmp    $0x170,%esi\n\tje     0xffffffff810068b5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a55> */\n\tcmp    $0x171,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81b96930 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sendto> */\n\tcmp    $0xc4,%esi\n\tje     0xffffffff810068b0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a50> */\n\tjbe    0xffffffff810061e5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1385> */\n\tcmp    $0xcb,%esi\n\tje     0xffffffff810068ab - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a4b> */\n\tjbe    0xffffffff81006199 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1339> */\n\tcmp    $0xce,%esi\n\tje     0xffffffff810068a6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a46> */\n\tjbe    0xffffffff810061c8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1368> */\n\tcmp    $0xcf,%esi\n\tje     0xffffffff810068a1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a41> */\n\tcmp    $0xd0,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ac000 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setresuid> */\n\tcmp    $0xaf,%esi\n\tje     0xffffffff8100689c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a3c> */\n\tcmp    $0xb0,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810a3630 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_rt_sigpending> */\n\tcmp    $0x9d,%esi\n\tje     0xffffffff81006897 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a37> */\n\tjbe    0xffffffff81005c17 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xdb7> */\n\tcmp    $0xa1,%esi\n\tje     0xffffffff81006892 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a32> */\n\tjbe    0xffffffff81005bfa - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xd9a> */\n\tcmp    $0xa2,%esi\n\tje     0xffffffff8100688d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a2d> */\n\tcmp    $0xa3,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff812cf020 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mremap> */\n\tcmp    $0x87,%esi\n\tje     0xffffffff81006888 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a28> */\n\tjbe    0xffffffff81005c92 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xe32> */\n\tcmp    $0x8f,%esi\n\tje     0xffffffff81006883 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a23> */\n\tjbe    0xffffffff81005c46 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xde6> */\n\tcmp    $0x92,%esi\n\tje     0xffffffff8100687e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a1e> */\n\tjbe    0xffffffff81005c75 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xe15> */\n\tcmp    $0x93,%esi\n\tje     0xffffffff81006879 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a19> */\n\tcmp    $0x94,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8136b550 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fdatasync> */\n\tcmp    $0x9f,%esi\n\tje     0xffffffff81006874 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a14> */\n\tcmp    $0xa0,%esi\n\tjne    0xffffffff81005cfa - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xe9a> */\n\tjmp    0xffffffff810ee470 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_get_priority_min> */\n\tcmp    $0x9a,%esi\n\tje     0xffffffff8100686f - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a0f> */\n\tjbe    0xffffffff81005cc8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xe68> */\n\tcmp    $0x9b,%esi\n\tje     0xffffffff8100686a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a0a> */\n\tcmp    $0x9c,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ed0b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_setscheduler> */\n\tcmp    $0x8c,%esi\n\tje     0xffffffff81006865 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a05> */\n\tjbe    0xffffffff81005d51 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xef1> */\n\tcmp    $0x8d,%esi\n\tje     0xffffffff81006860 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1a00> */\n\tcmp    $0x8e,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81340ee0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_select> */\n\tcmp    $0x90,%esi\n\tje     0xffffffff8100685b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19fb> */\n\tcmp    $0x91,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81321a10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_readv> */\n\tcmp    $0x7d,%esi\n\tje     0xffffffff81006856 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19f6> */\n\tjbe    0xffffffff81005d0b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xeab> */\n\tcmp    $0x83,%esi\n\tje     0xffffffff81006851 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19f1> */\n\tjbe    0xffffffff81005ce1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xe81> */\n\tcmp    $0x84,%esi\n\tje     0xffffffff8100684c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19ec> */\n\tcmp    $0x85,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8131c190 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fchdir> */\n\tcmp    $0x98,%esi\n\tje     0xffffffff81006847 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19e7> */\n\tcmp    $0x99,%esi\n\tjne    0xffffffff81005d2d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xecd> */\n\tjmp    0xffffffff812c2810 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_munlockall> */\n\tcmp    $0x80,%esi\n\tje     0xffffffff81006842 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19e2> */\n\tcmp    $0x81,%esi\n\tjne    0xffffffff81005d6a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xf0a> */\n\tjmp    0xffffffff8113bdf0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_delete_module> */\n\tcmp    $0x9e,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ee330 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_yield> */\n\tcmp    $0x7a,%esi\n\tje     0xffffffff8100683d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19dd> */\n\tjbe    0xffffffff81005d3e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xede> */\n\tcmp    $0x7b,%esi\n\tje     0xffffffff81006838 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19d8> */\n\tcmp    $0x7c,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81141090 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_adjtimex_time32> */\n\tcmp    $0x97,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff812c26c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_munlock> */\n\tcmp    $0x78,%esi\n\tje     0xffffffff81006833 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19d3> */\n\tcmp    $0x79,%esi\n\tjne    0xffffffff81005d78 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xf18> */\n\tjmp    0xffffffff810adbe0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setdomainname> */\n\tcmp    $0x8a,%esi\n\tje     0xffffffff8100682e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19ce> */\n\tcmp    $0x8b,%esi\n\tjne    0xffffffff81005d86 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xf26> */\n\tjmp    0xffffffff81167810 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setfsgid16> */\n\tcmp    $0x7e,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8116df10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sigprocmask> */\n\tcmp    $0x77,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8103b210 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sigreturn> */\n\tcmp    $0x88,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8108e940 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_personality> */\n\tcmp    $0x1b0,%esi\n\tje     0xffffffff81006829 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19c9> */\n\tcmp    $0x1b1,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81371c30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fspick> */\n\tcmp    $0x143,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8138aec0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_eventfd> */\n\tcmp    $0x19d,%esi\n\tje     0xffffffff81006824 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19c4> */\n\tjbe    0xffffffff81005e01 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0xfa1> */\n\tcmp    $0x19e,%esi\n\tje     0xffffffff8100681f - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19bf> */\n\tcmp    $0x1a0,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81393650 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_io_pgetevents_time64> */\n\tcmp    $0x1a9,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff815a8110 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_io_uring_setup> */\n\tcmp    $0x19b,%esi\n\tje     0xffffffff8100681a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19ba> */\n\tcmp    $0x19c,%esi\n\tjne    0xffffffff81005ea6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1046> */\n\tjmp    0xffffffff8136bfb0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_utimensat> */\n\tcmp    $0x3d,%esi\n\tje     0xffffffff81006815 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19b5> */\n\tjbe    0xffffffff81005ff0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1190> */\n\tcmp    $0x58,%esi\n\tje     0xffffffff81006810 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19b0> */\n\tjbe    0xffffffff81005f8a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x112a> */\n\tcmp    $0x67,%esi\n\tje     0xffffffff8100680b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19ab> */\n\tjbe    0xffffffff81005f2b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x10cb> */\n\tcmp    $0x6e,%esi\n\tje     0xffffffff81006806 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19a6> */\n\tjbe    0xffffffff81005f09 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x10a9> */\n\tcmp    $0x73,%esi\n\tje     0xffffffff81006801 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x19a1> */\n\tjbe    0xffffffff81005ee1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1081> */\n\tcmp    $0x74,%esi\n\tje     0xffffffff810067fc - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x199c> */\n\tcmp    $0x75,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81501330 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ipc> */\n\tcmp    $0x18d,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81500d70 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_shmat> */\n\tcmp    $0x17a,%esi\n\tje     0xffffffff810067f7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1997> */\n\tcmp    $0x17b,%esi\n\tjne    0xffffffff81005eb7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1057> */\n\tjmp    0xffffffff81322480 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_pwritev2> */\n\tcmp    $0x19a,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8138a130 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timerfd_gettime> */\n\tcmp    $0x179,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff813234c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_copy_file_range> */\n\tcmp    $0x16d,%esi\n\tje     0xffffffff810067f2 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1992> */\n\tcmp    $0x16e,%esi\n\tjne    0xffffffff81005ef8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1098> */\n\tjmp    0xffffffff81b96d30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setsockopt> */\n\tcmp    $0x6f,%esi\n\tje     0xffffffff810067ed - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x198d> */\n\tcmp    $0x72,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810961e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_wait4> */\n\tcmp    $0x16c,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81b96200 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_accept4> */\n\tcmp    $0x6b,%esi\n\tje     0xffffffff810067e8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1988> */\n\tjbe    0xffffffff81005f5c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x10fc> */\n\tcmp    $0x6c,%esi\n\tje     0xffffffff810067e3 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1983> */\n\tcmp    $0x6d,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ad030 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_uname> */\n\tcmp    $0x5f,%esi\n\tje     0xffffffff810067de - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x197e> */\n\tjbe    0xffffffff81005fce - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x116e> */\n\tcmp    $0x64,%esi\n\tje     0xffffffff810067d9 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1979> */\n\tjbe    0xffffffff81005f73 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1113> */\n\tcmp    $0x65,%esi\n\tje     0xffffffff810067d4 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1974> */\n\tcmp    $0x66,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81c24560 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_socketcall> */\n\tcmp    $0x69,%esi\n\tje     0xffffffff810067cf - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x196f> */\n\tcmp    $0x6a,%esi\n\tjne    0xffffffff81006306 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x14a6> */\n\tjmp    0xffffffff8132a1b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_newstat> */\n\tcmp    $0x61,%esi\n\tje     0xffffffff810067ca - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x196a> */\n\tcmp    $0x63,%esi\n\tjne    0xffffffff8100603b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x11db> */\n\tjmp    0xffffffff8136e8c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_statfs> */\n\tcmp    $0x4b,%esi\n\tje     0xffffffff810067c5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1965> */\n\tjbe    0xffffffff8100634d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x14ed> */\n\tcmp    $0x52,%esi\n\tje     0xffffffff810067c0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1960> */\n\tjbe    0xffffffff8100632b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x14cb> */\n\tcmp    $0x55,%esi\n\tje     0xffffffff810067bb - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x195b> */\n\tjbe    0xffffffff81006314 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x14b4> */\n\tcmp    $0x56,%esi\n\tje     0xffffffff810067b6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1956> */\n\tcmp    $0x57,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff812faf40 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_swapon> */\n\tcmp    $0x5c,%esi\n\tje     0xffffffff810067b1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1951> */\n\tjbe    0xffffffff81006045 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x11e5> */\n\tcmp    $0x5d,%esi\n\tje     0xffffffff810067ac - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x194c> */\n\tcmp    $0x5e,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8131c7d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fchmod> */\n\tcmp    $0x1b,%esi\n\tje     0xffffffff810067a7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1947> */\n\tjbe    0xffffffff8100646d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x160d> */\n\tcmp    $0x2d,%esi\n\tje     0xffffffff810067a2 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1942> */\n\tjbe    0xffffffff810063f5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1595> */\n\tcmp    $0x34,%esi\n\tje     0xffffffff8100679d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x193d> */\n\tjbe    0xffffffff8100642a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x15ca> */\n\tcmp    $0x39,%esi\n\tje     0xffffffff81006798 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1938> */\n\tjbe    0xffffffff8100605c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x11fc> */\n\tcmp    $0x3b,%esi\n\tje     0xffffffff81006793 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1933> */\n\tcmp    $0x3c,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810aef30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_umask> */\n\tcmp    $0x60,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ab760 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getpriority> */\n\tcmp    $0x5a,%esi\n\tje     0xffffffff8100678e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x192e> */\n\tcmp    $0x5b,%esi\n\tjne    0xffffffff8100644c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x15ec> */\n\tjmp    0xffffffff812c7190 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_munmap> */\n\tcmp    $0x36,%esi\n\tje     0xffffffff81006789 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1929> */\n\tcmp    $0x37,%esi\n\tje     0xffffffff81005356 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x4f6> */\n\tjmp    0xffffffff81003d20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ni_syscall> */\n\tcmp    $0x173,%esi\n\tje     0xffffffff81006784 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1924> */\n\tcmp    $0x174,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81c24300 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_recvmsg> */\n\tcmp    $0x1b7,%esi\n\tje     0xffffffff8100677f - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x191f> */\n\tcmp    $0x1b8,%esi\n\tjne    0xffffffff810060e7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1287> */\n\tjmp    0xffffffff812f2ed0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_process_madvise> */\n\tcmp    $0x164,%esi\n\tje     0xffffffff8100677a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x191a> */\n\tjbe    0xffffffff81006111 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x12b1> */\n\tcmp    $0x168,%esi\n\tje     0xffffffff81006775 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1915> */\n\tjbe    0xffffffff810060f8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1298> */\n\tcmp    $0x169,%esi\n\tje     0xffffffff81006770 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1910> */\n\tcmp    $0x16a,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81b96430 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_connect> */\n\tcmp    $0x1a2,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff815045b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mq_timedsend> */\n\tcmp    $0x1b6,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810bb730 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_pidfd_getfd> */\n\tcmp    $0x166,%esi\n\tje     0xffffffff8100676b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x190b> */\n\tcmp    $0x167,%esi\n\tjne    0xffffffff8100613c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x12dc> */\n\tjmp    0xffffffff81b958f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_socket> */\n\tcmp    $0x161,%esi\n\tje     0xffffffff81006766 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1906> */\n\tjbe    0xffffffff8100614d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x12ed> */\n\tcmp    $0x162,%esi\n\tje     0xffffffff81006761 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1901> */\n\tcmp    $0x163,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff816f86f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getrandom> */\n\tcmp    $0x165,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff811f2360 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_bpf> */\n\tcmp    $0x15f,%esi\n\tje     0xffffffff8100675c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18fc> */\n\tcmp    $0x160,%esi\n\tjne    0xffffffff81006254 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x13f4> */\n\tjmp    0xffffffff810eda70 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_getattr> */\n\tcmp    $0xab,%esi\n\tje     0xffffffff81006757 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18f7> */\n\tjbe    0xffffffff8100621e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x13be> */\n\tcmp    $0xac,%esi\n\tje     0xffffffff81006752 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18f2> */\n\tcmp    $0xad,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8103b2e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_rt_sigreturn> */\n\tcmp    $0xc8,%esi\n\tje     0xffffffff8100674d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18ed> */\n\tjbe    0xffffffff810062ba - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x145a> */\n\tcmp    $0xc9,%esi\n\tje     0xffffffff81006748 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18e8> */\n\tcmp    $0xca,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ac810 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getegid> */\n\tcmp    $0xcc,%esi\n\tje     0xffffffff81006743 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18e3> */\n\tcmp    $0xcd,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ca430 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getgroups> */\n\tcmp    $0xbb,%esi\n\tje     0xffffffff8100673e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18de> */\n\tjbe    0xffffffff81006265 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1405> */\n\tcmp    $0xc1,%esi\n\tje     0xffffffff81006739 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18d9> */\n\tjbe    0xffffffff81006237 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x13d7> */\n\tcmp    $0xc2,%esi\n\tje     0xffffffff81006734 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18d4> */\n\tcmp    $0xc3,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8103ad90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ia32_stat64> */\n\tcmp    $0xa8,%esi\n\tje     0xffffffff8100672f - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18cf> */\n\tcmp    $0xaa,%esi\n\tjne    0xffffffff81006290 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1430> */\n\tjmp    0xffffffff811675b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setresgid16> */\n\tcmp    $0xbf,%esi\n\tje     0xffffffff8100672a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18ca> */\n\tcmp    $0xc0,%esi\n\tjne    0xffffffff810062d3 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1473> */\n\tjmp    0xffffffff812c6080 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mmap_pgoff> */\n\tcmp    $0x15e,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8113b9c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_finit_module> */\n\tcmp    $0xb8,%esi\n\tje     0xffffffff81006725 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18c5> */\n\tjbe    0xffffffff810062a1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1441> */\n\tcmp    $0xb9,%esi\n\tje     0xffffffff81006720 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18c0> */\n\tcmp    $0xba,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810a8370 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sigaltstack> */\n\tcmp    $0xa5,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff811674a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getresuid16> */\n\tcmp    $0xb6,%esi\n\tje     0xffffffff8100671b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18bb> */\n\tcmp    $0xb7,%esi\n\tjne    0xffffffff810062e4 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1484> */\n\tjmp    0xffffffff8136d3e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getcwd> */\n\tcmp    $0xc6,%esi\n\tje     0xffffffff81006716 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18b6> */\n\tcmp    $0xc7,%esi\n\tjne    0xffffffff810062f5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1495> */\n\tjmp    0xffffffff810ac750 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getuid> */\n\tcmp    $0xbe,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8108e0e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_vfork> */\n\tcmp    $0xb5,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8103aa90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ia32_pwrite64> */\n\tcmp    $0xc5,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8103ae30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ia32_fstat64> */\n\tcmp    $0x68,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81156fe0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_setitimer> */\n\tcmp    $0x53,%esi\n\tje     0xffffffff81006711 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18b1> */\n\tcmp    $0x54,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81329b90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_lstat> */\n\tcmp    $0x4f,%esi\n\tje     0xffffffff8100670c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18ac> */\n\tjbe    0xffffffff8100637a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x151a> */\n\tcmp    $0x50,%esi\n\tje     0xffffffff81006707 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18a7> */\n\tcmp    $0x51,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff811679f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setgroups16> */\n\tcmp    $0x44,%esi\n\tje     0xffffffff81006702 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x18a2> */\n\tjbe    0xffffffff810063a0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1540> */\n\tcmp    $0x48,%esi\n\tje     0xffffffff810066fd - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x189d> */\n\tjbe    0xffffffff8100638d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x152d> */\n\tcmp    $0x49,%esi\n\tje     0xffffffff810066f8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1898> */\n\tcmp    $0x4a,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ad550 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sethostname> */\n\tcmp    $0x4d,%esi\n\tje     0xffffffff810066f3 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1893> */\n\tcmp    $0x4e,%esi\n\tjne    0xffffffff810063c2 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1562> */\n\tjmp    0xffffffff81140970 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_gettimeofday> */\n\tcmp    $0x46,%esi\n\tje     0xffffffff810066ee - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x188e> */\n\tcmp    $0x47,%esi\n\tjne    0xffffffff810063d0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1570> */\n\tjmp    0xffffffff811671c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setregid16> */\n\tcmp    $0x41,%esi\n\tje     0xffffffff810066e9 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1889> */\n\tjbe    0xffffffff810063de - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x157e> */\n\tcmp    $0x42,%esi\n\tje     0xffffffff810066e4 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1884> */\n\tcmp    $0x43,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810a8e60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sigaction> */\n\tcmp    $0x4c,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ae590 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_old_getrlimit> */\n\tcmp    $0x45,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810a91f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ssetmask> */\n\tcmp    $0x3f,%esi\n\tje     0xffffffff810066df - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x187f> */\n\tcmp    $0x40,%esi\n\tjne    0xffffffff810064c0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1660> */\n\tjmp    0xffffffff810ac700 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getppid> */\n\tcmp    $0x25,%esi\n\tje     0xffffffff810066da - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x187a> */\n\tjbe    0xffffffff810064ea - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x168a> */\n\tcmp    $0x29,%esi\n\tje     0xffffffff810066d5 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1875> */\n\tjbe    0xffffffff810064ad - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x164d> */\n\tcmp    $0x2a,%esi\n\tje     0xffffffff810066d0 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1870> */\n\tcmp    $0x2b,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ac990 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_times> */\n\tcmp    $0x31,%esi\n\tje     0xffffffff810066cb - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x186b> */\n\tjbe    0xffffffff8100645a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x15fa> */\n\tcmp    $0x32,%esi\n\tje     0xffffffff810066c6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1866> */\n\tcmp    $0x33,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81169820 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_acct> */\n\tcmp    $0x59,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8133e130 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_old_readdir> */\n\tcmp    $0x2f,%esi\n\tje     0xffffffff810066c1 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1861> */\n\tcmp    $0x30,%esi\n\tjne    0xffffffff810064ce - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x166e> */\n\tjmp    0xffffffff810a9320 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_signal> */\n\tcmp    $0xd,%esi\n\tje     0xffffffff810066bc - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x185c> */\n\tjbe    0xffffffff81006558 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x16f8> */\n\tcmp    $0x15,%esi\n\tje     0xffffffff810066b7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1857> */\n\tjbe    0xffffffff81006536 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x16d6> */\n\tcmp    $0x18,%esi\n\tje     0xffffffff810066b2 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1852> */\n\tjbe    0xffffffff8100650c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x16ac> */\n\tcmp    $0x19,%esi\n\tje     0xffffffff810066ad - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x184d> */\n\tcmp    $0x1a,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8109f670 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ptrace> */\n\tcmp    $0x27,%esi\n\tje     0xffffffff810066a8 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1848> */\n\tcmp    $0x28,%esi\n\tjne    0xffffffff810064dc - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x167c> */\n\tjmp    0xffffffff81338b90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_rmdir> */\n\tcmp    $0x3e,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8136eb00 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ustat> */\n\tcmp    $0x2e,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81167230 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setgid16> */\n\tcmp    $0x26,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81339fb0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_rename> */\n\tcmp    $0x21,%esi\n\tje     0xffffffff810066a3 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1843> */\n\tjbe    0xffffffff81006523 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x16c3> */\n\tcmp    $0x22,%esi\n\tje     0xffffffff8100669e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x183e> */\n\tcmp    $0x24,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8136b1e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sync> */\n\tcmp    $0x16,%esi\n\tje     0xffffffff81006699 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1839> */\n\tcmp    $0x17,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81167310 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setuid16> */\n\tcmp    $0x1d,%esi\n\tje     0xffffffff81006694 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1834> */\n\tcmp    $0x1e,%esi\n\tjne    0xffffffff81006585 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1725> */\n\tjmp    0xffffffff8136c340 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_utime32> */\n\tcmp    $0x12,%esi\n\tje     0xffffffff8100668f - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x182f> */\n\tjbe    0xffffffff81006593 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1733> */\n\tcmp    $0x13,%esi\n\tje     0xffffffff8100668a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x182a> */\n\tcmp    $0x14,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810ac6a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getpid> */\n\tcmp    $0x6,%esi\n\tje     0xffffffff81006685 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1825> */\n\tjbe    0xffffffff810065b9 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1759> */\n\tcmp    $0xa,%esi\n\tje     0xffffffff81006680 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1820> */\n\tjbe    0xffffffff810065a6 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1746> */\n\tcmp    $0xb,%esi\n\tje     0xffffffff8100667b - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x181b> */\n\tcmp    $0xc,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8131bfd0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_chdir> */\n\tcmp    $0x1c,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81329be0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fstat> */\n\tcmp    $0xf,%esi\n\tje     0xffffffff81006676 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1816> */\n\tcmp    $0x10,%esi\n\tjne    0xffffffff810065db - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x177b> */\n\tjmp    0xffffffff81167080 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_lchown16> */\n\tcmp    $0x8,%esi\n\tje     0xffffffff81006671 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1811> */\n\tcmp    $0x9,%esi\n\tjne    0xffffffff810065e9 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1789> */\n\tjmp    0xffffffff813397a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_link> */\n\tcmp    $0x3,%esi\n\tje     0xffffffff8100666c - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x180c> */\n\tjbe    0xffffffff810065f7 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1797> */\n\tcmp    $0x4,%esi\n\tje     0xffffffff81006667 - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1807> */\n\tcmp    $0x5,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff8131dc60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_open> */\n\tcmp    $0xe,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff81338600 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mknod> */\n\tcmp    $0x7,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810961b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_waitpid> */\n\tcmp    $0x1,%esi\n\tje     0xffffffff81006b0d - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x1cad> */\n\tcmp    $0x2,%esi\n\tjne    0xffffffff8100660a - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x17aa> */\n\tjmp    0xffffffff8108e070 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fork> */\n\ttest   %esi,%esi\n\tjne    0xffffffff8100606e - 0xffffffff81004e60 + ia32_sys_call /* <ia32_sys_call+0x120e> */\n\tjmp    0xffffffff810a2e20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_restart_syscall> */\n\tjmp    0xffffffff8135b4a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_listxattr> */\n\tjmp    0xffffffff81511320 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_lsm_list_modules> */\n\tjmp    0xffffffff815111d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_lsm_set_self_attr> */\n\tjmp    0xffffffff81357100 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_statmount> */\n\tjmp    0xffffffff8130ca80 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_set_mempolicy_home_node> */\n\tjmp    0xffffffff8131db50 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_openat2> */\n\tjmp    0xffffffff811520c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timer_settime> */\n\tjmp    0xffffffff8113e920 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_kcmp> */\n\tjmp    0xffffffff8135b6c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_removexattr> */\n\tjmp    0xffffffff8135b5e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_flistxattr> */\n\tjmp    0xffffffff8135b3a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fgetxattr> */\n\tjmp    0xffffffff810ac6d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_gettid> */\n\tjmp    0xffffffff810ac0c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getresuid> */\n\tjmp    0xffffffff8103aa10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ia32_pread64> */\n\tjmp    0xffffffff8136b440 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fsync> */\n\tjmp    0xffffffff8135b780 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fremovexattr> */\n\tjmp    0xffffffff81321530 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_write> */\n\tjmp    0xffffffff813213e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_read> */\n\tjmp    0xffffffff8131df60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_creat> */\n\tjmp    0xffffffff8131c950 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_chmod> */\n\tjmp    0xffffffff8132d690 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_execve> */\n\tjmp    0xffffffff81339060 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_unlink> */\n\tjmp    0xffffffff8131e070 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_close> */\n\tjmp    0xffffffff8131ff60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_lseek> */\n\tjmp    0xffffffff81329b40 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_stat> */\n\tjmp    0xffffffff810a93b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_pause> */\n\tjmp    0xffffffff813536f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_oldumount> */\n\tjmp    0xffffffff810ebfa0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_nice> */\n\tjmp    0xffffffff8131beb0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_access> */\n\tjmp    0xffffffff813388e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mkdir> */\n\tjmp    0xffffffff81140480 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_stime32> */\n\tjmp    0xffffffff81167a10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getuid16> */\n\tjmp    0xffffffff81356500 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mount> */\n\tjmp    0xffffffff811403a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_time32> */\n\tjmp    0xffffffff81167ab0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getgid16> */\n\tjmp    0xffffffff81167b00 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getegid16> */\n\tjmp    0xffffffff81167a60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_geteuid16> */\n\tjmp    0xffffffff8132f900 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_pipe> */\n\tjmp    0xffffffff8134d220 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_dup> */\n\tjmp    0xffffffff810a7320 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_kill> */\n\tjmp    0xffffffff8134d010 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_dup2> */\n\tjmp    0xffffffff810acfb0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setsid> */\n\tjmp    0xffffffff810acd10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getpgrp> */\n\tjmp    0xffffffff811672a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setreuid16> */\n\tjmp    0xffffffff810aeea0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_getrusage> */\n\tjmp    0xffffffff810a85c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sigpending> */\n\tjmp    0xffffffff810a9670 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sigsuspend> */\n\tjmp    0xffffffff810a9120 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sgetmask> */\n\tjmp    0xffffffff81167900 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getgroups16> */\n\tjmp    0xffffffff81140b10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_settimeofday> */\n\tjmp    0xffffffff81339300 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_symlink> */\n\tjmp    0xffffffff8131cd90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_lchown> */\n\tjmp    0xffffffff81166fd0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_chown16> */\n\tjmp    0xffffffff8109d220 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_capset> */\n\tjmp    0xffffffff8109d1d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_capget> */\n\tjmp    0xffffffff810ae170 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_getrlimit> */\n\tjmp    0xffffffff81340af0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_poll> */\n\tjmp    0xffffffff8103a9a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ia32_ftruncate64> */\n\tjmp    0xffffffff8103a940 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ia32_truncate64> */\n\tjmp    0xffffffff81322860 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sendfile> */\n\tjmp    0xffffffff810ab900 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setregid> */\n\tjmp    0xffffffff810ac790 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_geteuid> */\n\tjmp    0xffffffff810ac7d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getgid> */\n\tjmp    0xffffffff810af940 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_prctl> */\n\tjmp    0xffffffff811676c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getresgid16> */\n\tjmp    0xffffffff810ed370 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_setattr> */\n\tjmp    0xffffffff8119e4c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_seccomp> */\n\tjmp    0xffffffff81339e20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_renameat2> */\n\tjmp    0xffffffff8132d750 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_execveat> */\n\tjmp    0xffffffff81b95d90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_bind> */\n\tjmp    0xffffffff81b95bd0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_socketpair> */\n\tjmp    0xffffffff81319f10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_memfd_create> */\n\tjmp    0xffffffff8131be50 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_faccessat2> */\n\tjmp    0xffffffff81c243e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_recvfrom> */\n\tjmp    0xffffffff8133d100 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ioctl> */\n\tjmp    0xffffffff8103aee0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ia32_mmap> */\n\tjmp    0xffffffff810ad1b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_olduname> */\n\tjmp    0xffffffff810acc80 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setpgid> */\n\tjmp    0xffffffff813535f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_umount> */\n\tjmp    0xffffffff812c8680 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_brk> */\n\tjmp    0xffffffff81156c30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_alarm> */\n\tjmp    0xffffffff8131bb30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ftruncate> */\n\tjmp    0xffffffff8131b7c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_truncate> */\n\tjmp    0xffffffff8132c6c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_uselib> */\n\tjmp    0xffffffff81329e20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_readlink> */\n\tjmp    0xffffffff81340f60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_old_select> */\n\tjmp    0xffffffff810ae010 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_setrlimit> */\n\tjmp    0xffffffff810ab700 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setpriority> */\n\tjmp    0xffffffff81156890 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_getitimer> */\n\tjmp    0xffffffff810370c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ioperm> */\n\tjmp    0xffffffff8136e910 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_fstatfs> */\n\tjmp    0xffffffff81167130 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fchown16> */\n\tjmp    0xffffffff8132a2b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_newfstat> */\n\tjmp    0xffffffff8132a200 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_newlstat> */\n\tjmp    0xffffffff8131e160 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_vhangup> */\n\tjmp    0xffffffff81b96e90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getsockopt> */\n\tjmp    0xffffffff813220f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_preadv2> */\n\tjmp    0xffffffff810afab0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sysinfo> */\n\tjmp    0xffffffff812fae90 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_swapoff> */\n\tjmp    0xffffffff81037170 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_iopl> */\n\tjmp    0xffffffff81106d70 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_syslog> */\n\tjmp    0xffffffff810c7f40 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_reboot> */\n\tjmp    0xffffffff8131c380 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_chroot> */\n\tjmp    0xffffffff8138a000 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timerfd_settime> */\n\tjmp    0xffffffff81341630 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ppoll_time64> */\n\tjmp    0xffffffff81341080 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_pselect6_time64> */\n\tjmp    0xffffffff81356680 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fsmount> */\n\tjmp    0xffffffff811677b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setfsuid16> */\n\tjmp    0xffffffff8103b020 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ia32_clone> */\n\tjmp    0xffffffff810393c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_modify_ldt> */\n\tjmp    0xffffffff810acff0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_newuname> */\n\tjmp    0xffffffff8113b8f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_init_module> */\n\tjmp    0xffffffff812c27f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mlockall> */\n\tjmp    0xffffffff810acce0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getpgid> */\n\tjmp    0xffffffff813b7f00 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_quotactl> */\n\tjmp    0xffffffff812cce00 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mprotect> */\n\tjmp    0xffffffff812cf390 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_msync> */\n\tjmp    0xffffffff8133e2d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_getdents> */\n\tjmp    0xffffffff81320110 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_llseek> */\n\tjmp    0xffffffff810ed7b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_getparam> */\n\tjmp    0xffffffff810ed120 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_setparam> */\n\tjmp    0xffffffff810ee3b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_get_priority_max> */\n\tjmp    0xffffffff810ace00 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getsid> */\n\tjmp    0xffffffff81321a70 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_writev> */\n\tjmp    0xffffffff813993e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_flock> */\n\tjmp    0xffffffff8134d9c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sysfs> */\n\tjmp    0xffffffff81147210 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_nanosleep_time32> */\n\tjmp    0xffffffff810ee670 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_rr_get_interval_time32> */\n\tjmp    0xffffffff810ed620 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sched_getscheduler> */\n\tjmp    0xffffffff810a32d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_rt_sigprocmask> */\n\tjmp    0xffffffff8131cf60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fchown> */\n\tjmp    0xffffffff810ca540 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setgroups> */\n\tjmp    0xffffffff810abc10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setreuid> */\n\tjmp    0xffffffff8103ade0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ia32_lstat64> */\n\tjmp    0xffffffff81b966a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getpeername> */\n\tjmp    0xffffffff81b96560 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getsockname> */\n\tjmp    0xffffffff81504730 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mq_timedreceive> */\n\tjmp    0xffffffff815a8030 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_io_uring_enter> */\n\tjmp    0xffffffff811611c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_futex> */\n\tjmp    0xffffffff810a6f30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_rt_sigtimedwait_time64> */\n\tjmp    0xffffffff81c24460 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_recvmmsg_time64> */\n\tjmp    0xffffffff81356850 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_move_mount> */\n\tjmp    0xffffffff81355130 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_open_tree> */\n\tjmp    0xffffffff810ac410 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getresgid> */\n\tjmp    0xffffffff81338560 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mknodat> */\n\tjmp    0xffffffff810aba30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setgid> */\n\tjmp    0xffffffff810abd80 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setuid> */\n\tjmp    0xffffffff8103ae80 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ia32_fstatat64> */\n\tjmp    0xffffffff8136c5a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_futimesat_time32> */\n\tjmp    0xffffffff8136e9d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_statfs64> */\n\tjmp    0xffffffff8136c600 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_utimes_time32> */\n\tjmp    0xffffffff810a7510 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_tgkill> */\n\tjmp    0xffffffff81322780 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_sendfile64> */\n\tjmp    0xffffffff8116e4d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sched_getaffinity> */\n\tjmp    0xffffffff8116e310 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sched_setaffinity> */\n\tjmp    0xffffffff81357010 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_pivot_root> */\n\tjmp    0xffffffff8130a9d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_set_mempolicy> */\n\tjmp    0xffffffff81339260 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_symlinkat> */\n\tjmp    0xffffffff81161d50 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_set_robust_list> */\n\tjmp    0xffffffff8131bdf0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_faccessat> */\n\tjmp    0xffffffff8131c8f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fchmodat> */\n\tjmp    0xffffffff81339ef0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_renameat> */\n\tjmp    0xffffffff8103ac20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ia32_sync_file_range> */\n\tjmp    0xffffffff8136a700 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_splice> */\n\tjmp    0xffffffff81392210 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_io_setup> */\n\tjmp    0xffffffff81386560 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_epoll_create> */\n\tjmp    0xffffffff81392830 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_io_submit> */\n\tjmp    0xffffffff813932c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_io_getevents_time32> */\n\tjmp    0xffffffff8104a210 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_get_thread_area> */\n\tjmp    0xffffffff812ca0e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_remap_file_pages> */\n\tjmp    0xffffffff813874e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_epoll_wait> */\n\tjmp    0xffffffff81151e20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timer_gettime32> */\n\tjmp    0xffffffff8116c770 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_kexec_load> */\n\tjmp    0xffffffff81152e00 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clock_settime32> */\n\tjmp    0xffffffff811524e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timer_delete> */\n\tjmp    0xffffffff81151b60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_timer_create> */\n\tjmp    0xffffffff8103acb0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ia32_fadvise64> */\n\tjmp    0xffffffff81504d80 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mq_timedsend_time32> */\n\tjmp    0xffffffff81504390 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mq_unlink> */\n\tjmp    0xffffffff8130d1a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mbind> */\n\tjmp    0xffffffff8150a480 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_request_key> */\n\tjmp    0xffffffff8150a420 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_add_key> */\n\tjmp    0xffffffff81585f70 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ioprio_get> */\n\tjmp    0xffffffff81312f40 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_move_pages> */\n\tjmp    0xffffffff81380ac0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_inotify_rm_watch> */\n\tjmp    0xffffffff813808a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_inotify_add_watch> */\n\tjmp    0xffffffff81585f10 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ioprio_set> */\n\tjmp    0xffffffff81504b40 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_mq_notify> */\n\tjmp    0xffffffff81153190 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clock_getres_time32> */\n\tjmp    0xffffffff8136c4b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_utimensat_time32> */\n\tjmp    0xffffffff81387730 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_epoll_pwait> */\n\tjmp    0xffffffff8136a5b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_vmsplice> */\n\tjmp    0xffffffff81341380 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_ppoll_time32> */\n\tjmp    0xffffffff810a7980 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_rt_sigqueueinfo> */\n\tjmp    0xffffffff810a70d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_rt_sigtimedwait_time32> */\n\tjmp    0xffffffff810a8b60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_rt_sigaction> */\n\tjmp    0xffffffff81167390 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setresuid16> */\n\tjmp    0xffffffff812c24c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mlock> */\n\tjmp    0xffffffff812ccec0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_pkey_alloc> */\n\tjmp    0xffffffff812cce60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_pkey_mprotect> */\n\tjmp    0xffffffff81357060 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mount_setattr> */\n\tjmp    0xffffffff81387cb0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_epoll_pwait2> */\n\tjmp    0xffffffff8103ad40 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_ia32_fallocate> */\n\tjmp    0xffffffff81388bb0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_signalfd4> */\n\tjmp    0xffffffff8138a390 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timerfd_gettime32> */\n\tjmp    0xffffffff8132f8a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_pipe2> */\n\tjmp    0xffffffff81384840 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fanotify_init> */\n\tjmp    0xffffffff81322380 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_pwritev> */\n\tjmp    0xffffffff81321ff0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_preadv> */\n\tjmp    0xffffffff813864f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_epoll_create1> */\n\tjmp    0xffffffff813a6960 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_name_to_handle_at> */\n\tjmp    0xffffffff810ae780 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_prlimit64> */\n\tjmp    0xffffffff8133e010 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getdents64> */\n\tjmp    0xffffffff812f2e30 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_madvise> */\n\tjmp    0xffffffff810ac680 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setfsgid> */\n\tjmp    0xffffffff815010b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_shmdt> */\n\tjmp    0xffffffff8136b320 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_syncfs> */\n\tjmp    0xffffffff814f92d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_msgrcv> */\n\tjmp    0xffffffff814f9160 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_msgsnd> */\n\tjmp    0xffffffff81393390 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_io_pgetevents> */\n\tjmp    0xffffffff8138ef70 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_userfaultfd> */\n\tjmp    0xffffffff81b96ff0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_shutdown> */\n\tjmp    0xffffffff81c24220 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_sendmsg> */\n\tjmp    0xffffffff81b95f00 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_listen> */\n\tjmp    0xffffffff814fc410 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_semctl> */\n\tjmp    0xffffffff814fc310 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_semget> */\n\tjmp    0xffffffff8132a0d0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_statx> */\n\tjmp    0xffffffff81152850 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clock_settime> */\n\tjmp    0xffffffff812de2c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_process_vm_readv> */\n\tjmp    0xffffffff810c4890 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setns> */\n\tjmp    0xffffffff811530a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clock_adjtime32> */\n\tjmp    0xffffffff812671c0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_perf_event_open> */\n\tjmp    0xffffffff81389f20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_timerfd_create> */\n\tjmp    0xffffffff8131dda0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_openat> */\n\tjmp    0xffffffff811533b0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clock_nanosleep> */\n\tjmp    0xffffffff81152c60 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clock_getres> */\n\tjmp    0xffffffff811529f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clock_gettime> */\n\tjmp    0xffffffff815005a0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_compat_sys_shmctl> */\n\tjmp    0xffffffff812c2550 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_mlock2> */\n\tjmp    0xffffffff8153fd20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_landlock_add_rule> */\n\tjmp    0xffffffff8108e1f0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_clone3> */\n\tjmp    0xffffffff810bb580 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_pidfd_open> */\n\tjmp    0xffffffff81371df0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fsconfig> */\n\tjmp    0xffffffff810a7400 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_pidfd_send_signal> */\n\tjmp    0xffffffff8127edb0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_process_mrelease> */\n\tjmp    0xffffffff81315920 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_memfd_secret> */\n\tjmp    0xffffffff8153fc20 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_landlock_create_ruleset> */\n\tjmp    0xffffffff8131c890 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fchmodat2> */\n\tjmp    0xffffffff8135ade0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_setxattr> */\n\tjmp    0xffffffff81161bd0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_futex_wait> */\n\tjmp    0xffffffff811619e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_futex_wake> */\n\tjmp    0xffffffff81357160 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_listmount> */\n\tjmp    0xffffffff8135b240 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_getxattr> */\n\tjmp    0xffffffff8135aed0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_fsetxattr> */\n\tcall   0xffffffff810953e0 - 0xffffffff81004e60 + ia32_sys_call /* <__ia32_sys_exit> */\n\n.size ia32_sys_call, . - ia32_sys_call\n"
  },
  {
    "path": "tests/test_arch_sanity.py",
    "content": "import inspect\n\nfrom systrack.arch import Arch, ARCH_CLASSES\n\n\ndef test_arch_subclass_method_overrides():\n\t# Ensure that Arch methods marked as @final aren't overridden by subclasses\n\tfinal_methods = list(filter(lambda m: hasattr(m[1], '__final__'),\n\t\tinspect.getmembers(Arch, predicate=inspect.isfunction)))\n\n\tfor subclass in ARCH_CLASSES:\n\t\tfor method_name, super_method in final_methods:\n\t\t\tif not hasattr(super_method, '__final__'):\n\t\t\t\tcontinue\n\n\t\t\tassert issubclass(subclass, Arch)\n\t\t\tassert getattr(subclass, method_name) is super_method, \\\n\t\t\t\tf'{subclass.__name__} class overrides @final method ' \\\n\t\t\t\tf'{method_name}() of Arch class!'\n"
  },
  {
    "path": "tests/test_mips.py",
    "content": "from systrack.arch import ArchMips\n\nfrom .utils import *\n\n\ndef test_dummy_syscall_64():\n\tfor abi in ('n64', 'n32', 'o32'):\n\t\t# Big-endian\n\t\tassert arch_is_dummy_syscall(ArchMips((6,9), abi, False), True,\n\t\t\tbytes.fromhex(\n\t\t\t\t'03e00008' # jr  ra\n\t\t\t\t'2402ffa7' # li  v0,-89 (-ENOSYS)\n\t\t\t)\n\t\t)\n\n\t\t# Little-endian\n\t\tassert arch_is_dummy_syscall(ArchMips((6,9), abi, False), False,\n\t\t\tbytes.fromhex(\n\t\t\t\t'0800e003' # jr  ra\n\t\t\t\t'eaff0224' # li  v0,-22 (-EINVAL)\n\t\t\t)\n\t\t)\n"
  },
  {
    "path": "tests/test_powerpc.py",
    "content": "from systrack.arch import ArchPowerPC\n\nfrom .utils import *\n\n\ndef test_dummy_syscall_simple():\n\tassert arch_is_dummy_syscall(ArchPowerPC((6,8), 'ppc64', False), True,\n\t\tbytes.fromhex(\n\t\t\t'38 60 ff da' # li      r3,-38\n\t\t\t'4e 80 00 20' # blr\n\t\t)\n\t)\n\n\tassert arch_is_dummy_syscall(ArchPowerPC((6,8), 'ppc32', True), True,\n\t\tbytes.fromhex(\n\t\t\t'94 21 ff f0' # stwu    r1,-16(r1)\n\t\t\t'38 60 ff da' # li      r3,-38\n\t\t\t'38 21 00 10' # addi    r1,r1,16\n\t\t\t'4e 80 00 20' # blr\n\t\t)\n\t)\n\n\tassert not arch_is_dummy_syscall(ArchPowerPC((6,8), 'ppc32', True), True,\n\t\tbytes.fromhex(\n\t\t\t'94 21 ff f0' # stwu    r1,-16(r1)\n\t\t\t'38 60 ff 00' # li      r3,-256\n\t\t\t'38 21 00 10' # addi    r1,r1,16\n\t\t\t'4e 80 00 20' # blr\n\t\t)\n\t)\n\n\ndef test_dummy_syscall_64():\n\tassert arch_is_dummy_syscall(ArchPowerPC((5,0), 'ppc64', False), True,\n\t\t# <.sys_ni_syscall>: (64-bit, v5.0)\n\t\tbytes.fromhex(\n\t\t\t'7c 08 02 a6' # mflr    r0\n\t\t\t'f8 01 00 10' # std     r0,16(r1)\n\t\t\t'f8 21 ff 91' # stdu    r1,-112(r1)\n\t\t\t'4b ee 47 45' # bl      c0000000000707e0 <._mcount>\n\t\t\t'60 00 00 00' # nop\n\t\t\t'38 21 00 70' # addi    r1,r1,112\n\t\t\t'38 60 ff da' # li      r3,-38\n\t\t\t'e8 01 00 10' # ld      r0,16(r1)\n\t\t\t'7c 08 03 a6' # mtlr    r0\n\t\t\t'4e 80 00 20' # blr\n\t\t\t'60 00 00 00' # nop\n\t\t\t'60 00 00 00' # nop\n\t\t)\n\t)\n\n\ndef test_dummy_syscall_32():\n\tassert arch_is_dummy_syscall(ArchPowerPC((6,8), 'ppc32', True), True,\n\t\tbytes.fromhex(\n\t\t\t# <sys_migrate_pages>: (32-bit, v6.8)\n\t\t\t'7c 08 02 a6' # mflr    r0\n\t\t\t'90 01 00 04' # stw     r0,4(r1)\n\t\t\t'4b f9 20 11' # bl      c0039860 <_mcount>\n\t\t\t'94 21 ff f0' # stwu    r1,-16(r1)\n\t\t\t'38 60 ff da' # li      r3,-38\n\t\t\t'38 21 00 10' # addi    r1,r1,16\n\t\t\t'4e 80 00 20' # blr\n\t\t)\n\t)\n\n\ndef test_esoteric_fast_endian_switch_simple():\n\tsym = Symbol(0x0, 0x0, 0x0, 'NOTYPE', 'exc_real_0xc00_system_call')\n\telf = MockELF(True, {sym: bytes.fromhex(\n\t\t# Minimal code example that should match\n\t\t'2c 20 1e be' #    cmpdi   r0,7870\n\t\t'41 c2 00 04' #    beq-    X\n\t\t'7d 9b 02 a6' # X: mfsrr1  r12\n\t\t'69 8c 00 01' #    xori    r12,r12,1\n\t\t'7d 9b 03 a6' #    mtsrr1  r12\n\t\t'4c 00 00 24' #    rfid\n\t)})\n\n\t# Should only be available for 64-bit ppc64 ABI\n\tassert not ArchPowerPC((6,8), 'ppc32', True).extract_esoteric_syscalls(elf)\n\tassert not ArchPowerPC((6,8), 'ppc32', False).extract_esoteric_syscalls(elf)\n\tassert not ArchPowerPC((6,8), 'spu', False).extract_esoteric_syscalls(elf)\n\n\tarch = ArchPowerPC((6,8), 'ppc64', False)\n\tres = arch.extract_esoteric_syscalls(elf)\n\tassert res and res[0][:3] == (7870, 'switch_endian', sym.name)\n\n\t# Also test beq+, and beq (2 encodings)\n\tfor beq in (0x41e2, 0x4182, 0x41a2):\n\t\tcode = elf.symbols_code[sym]\n\t\tcode = code[:4] + beq.to_bytes(2, 'big') + code[6:]\n\t\telf.symbols_code[sym] = code\n\n\t\tres = arch.extract_esoteric_syscalls(elf)\n\t\tassert res and res[0][:3] == (7870, 'switch_endian', sym.name)\n\n\ndef test_esoteric_fast_endian_switch_real():\n\tsym = Symbol(0x0, 0x0, 0x0, 'NOTYPE', 'exc_real_0xc00_system_call')\n\telf = MockELF(True, {sym: bytes.fromhex(\n\t\t# <exc_real_0xc00_system_call>: (64-bit, v6.8)\n\t\t'7d a9 03 a6' # mtctr   r13\n\t\t'7d b1 42 a6' # mfsprg  r13,1\n\t\t'f9 4d 00 88' # std     r10,136(r13)\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'89 4d 0a b8' # lbz     r10,2744(r13)\n\t\t'2c 0a 00 00' # cmpwi   r10,0\n\t\t'39 40 0c 00' # li      r10,3072\n\t\t'40 82 0d e0' # bne     c000000000001a10 <kvm_hcall>\n\t\t'7d 29 02 a6' # mfctr   r9\n\t\t'2c 20 1e be' # cmpdi   r0,7870\n\t\t'41 c2 00 20' # beq-    c000000000000c5c <exc_real_0xc00_system_call+0x5c>\n\t\t'7d 7a 02 a6' # mfsrr0  r11\n\t\t'7d 9b 02 a6' # mfsrr1  r12\n\t\t'7c 42 13 78' # mr      r2,r2\n\t\t'e9 4d 00 18' # ld      r10,24(r13)\n\t\t'61 4a ca d0' # ori     r10,r10,51920\n\t\t'7d 49 03 a6' # mtctr   r10\n\t\t'4e 80 04 20' # bctr\n\t\t'7d 9b 02 a6' # mfsrr1  r12\n\t\t'69 8c 00 01' # xori    r12,r12,1\n\t\t'7d 9b 03 a6' # mtsrr1  r12\n\t\t'7d 2d 4b 78' # mr      r13,r9\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'60 00 00 00' # nop\n\t\t'4c 00 00 24' # rfid\n\t\t'48 00 14 ac' # b       c000000000002140 <rfi_flush_fallback>\n\t\t'48 00 00 00' # b       c000000000000c98 (infinite loop)\n\t)})\n\n\t# Should only be available for 64-bit ppc64 ABI\n\tassert not ArchPowerPC((6,8), 'ppc32', True).extract_esoteric_syscalls(elf)\n\tassert not ArchPowerPC((6,8), 'ppc32', False).extract_esoteric_syscalls(elf)\n\tassert not ArchPowerPC((6,8), 'spu', False).extract_esoteric_syscalls(elf)\n\n\tres = ArchPowerPC((6,8), 'ppc64', False).extract_esoteric_syscalls(elf)\n\tassert res and res[0][:3] == (7870, 'switch_endian', sym.name)\n"
  },
  {
    "path": "tests/test_x86.py",
    "content": "from systrack.arch import ArchX86\nfrom systrack.elf import ELF\n\nfrom .utils import *\n\n\ndef test_x86_no_table_extract_syscall_vaddrs():\n\telf = ELF(make_test_elf('x86_no_table_syscall_handlers'))\n\n\tarch = ArchX86((6,11), 'x64')\n\tvaddrs = arch.extract_syscall_vaddrs(elf)\n\tassert len(vaddrs) == 358\n\n\tarch = ArchX86((6,11), 'x32')\n\tvaddrs = arch.extract_syscall_vaddrs(elf)\n\tassert len(vaddrs) == 358\n\n\tarch = ArchX86((6,11), 'ia32')\n\tvaddrs = arch.extract_syscall_vaddrs(elf)\n\tassert len(vaddrs) == 429\n"
  },
  {
    "path": "tests/utils.py",
    "content": "from pathlib import Path\nfrom subprocess import check_call\nfrom typing import Dict, Union\n\nfrom systrack.arch import Arch\nfrom systrack.kernel import Syscall\nfrom systrack.elf import Symbol\n\nclass MockELF:\n\t'''Mock ELF class to be used in place of the ELF class provided by Systrack\n\tfor testing.\n\t'''\n\tdef __init__(self, big_endian: bool, symbols_with_code: Dict[Symbol,bytes]):\n\t\tself.big_endian = big_endian\n\t\tself.symbols_code = symbols_with_code\n\t\tself.symbols = {}\n\n\t\tfor sym in symbols_with_code:\n\t\t\tself.symbols[sym.name] = sym\n\n\tdef next_symbol(self, sym: Symbol) -> Union[Symbol,None]:\n\t\treturn None\n\n\tdef vaddr_read(self, vaddr: int, size: int) -> bytes:\n\t\tfor sym in self.symbols_code:\n\t\t\tif sym.real_vaddr == vaddr:\n\t\t\t\tcode = self.symbols_code[sym]\n\t\t\t\treturn code.ljust(size, b'\\x00')\n\n\t\tassert False, 'Bad call to mocked ELF.vaddr_read()'\n\n\tdef read_symbol(self, sym: Union[str,Symbol]) -> bytes:\n\t\tif not isinstance(sym, Symbol):\n\t\t\tsym = self.symbols[sym]\n\n\t\treturn self.vaddr_read(sym.real_vaddr, sym.size)\n\ndef arch_is_dummy_syscall(arch: Arch,  big_endian: bool, code: bytes) -> bool:\n\tsym = Symbol(0x0, 0x0, len(code), 'FUNC', 'test')\n\tsc  = Syscall(0x0, 0x0, 'test', 'test', sym, None)\n\telf = MockELF(big_endian, {sym: code})\n\treturn arch.is_dummy_syscall(sc, elf)\n\ndef make_test_elf(name: str) -> Path:\n\ttarget = Path(__file__).parent / 'data' / name\n\tcheck_call(['make', '-C', target.parent, target.name])\n\treturn target\n"
  }
]