├── .github └── workflows │ ├── audit.yml │ ├── release.yml │ └── rust.yml ├── .gitignore ├── CHANGELOG.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── release.toml ├── src └── main.rs └── tests ├── snapshots ├── ui__amdgpu_info.snap ├── ui__help-2.snap ├── ui__help-3.snap ├── ui__help-4.snap ├── ui__help-5.snap ├── ui__help.snap └── ui__list.snap └── ui.rs /.github/workflows/audit.yml: -------------------------------------------------------------------------------- 1 | name: Security audit 2 | on: 3 | push: 4 | paths: 5 | - "**/Cargo.toml" 6 | - "**/Cargo.lock" 7 | branches: [main] 8 | schedule: 9 | - cron: "0 22 * * 1" 10 | jobs: 11 | security_audit: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: actions-rs/toolchain@v1 16 | with: 17 | toolchain: stable 18 | override: true 19 | profile: minimal 20 | components: rustfmt, clippy 21 | - name: Cache 22 | uses: Swatinem/rust-cache@v2 23 | - uses: actions-rs/audit-check@v1 24 | with: 25 | token: ${{ secrets.GITHUB_TOKEN }} 26 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | # CI that: 2 | # 3 | # * checks for a Git Tag that looks like a release 4 | # * creates a Github Release™ and fills in its text 5 | # * builds artifacts with cargo-dist (executable-zips, installers) 6 | # * uploads those artifacts to the Github Release™ 7 | # 8 | # Note that the Github Release™ will be created before the artifacts, 9 | # so there will be a few minutes where the release has no artifacts 10 | # and then they will slowly trickle in, possibly failing. To make 11 | # this more pleasant we mark the release as a "draft" until all 12 | # artifacts have been successfully uploaded. This allows you to 13 | # choose what to do with partial successes and avoids spamming 14 | # anyone with notifications before the release is actually ready. 15 | name: Release 16 | 17 | permissions: 18 | contents: write 19 | 20 | # This task will run whenever you push a git tag that looks like a version 21 | # like "v1", "v1.2.0", "v0.1.0-prerelease01", "my-app-v1.0.0", etc. 22 | # The version will be roughly parsed as ({PACKAGE_NAME}-)?v{VERSION}, where 23 | # PACKAGE_NAME must be the name of a Cargo package in your workspace, and VERSION 24 | # must be a Cargo-style SemVer Version. 25 | # 26 | # If PACKAGE_NAME is specified, then we will create a Github Release™ for that 27 | # package (erroring out if it doesn't have the given version or isn't cargo-dist-able). 28 | # 29 | # If PACKAGE_NAME isn't specified, then we will create a Github Release™ for all 30 | # (cargo-dist-able) packages in the workspace with that version (this is mode is 31 | # intended for workspaces with only one dist-able package, or with all dist-able 32 | # packages versioned/released in lockstep). 33 | # 34 | # If you push multiple tags at once, separate instances of this workflow will 35 | # spin up, creating an independent Github Release™ for each one. 36 | # 37 | # If there's a prerelease-style suffix to the version then the Github Release™ 38 | # will be marked as a prerelease. 39 | on: 40 | push: 41 | tags: 42 | - '*-?v[0-9]+*' 43 | 44 | jobs: 45 | # Create the Github Release™ so the packages have something to be uploaded to 46 | create-release: 47 | runs-on: ubuntu-latest 48 | outputs: 49 | has-releases: ${{ steps.create-release.outputs.has-releases }} 50 | env: 51 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 52 | steps: 53 | - uses: actions/checkout@v3 54 | - name: Install Rust 55 | run: rustup update stable --no-self-update && rustup default stable 56 | - name: Install cargo-dist 57 | run: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.0.7/cargo-dist-installer.sh | sh 58 | - id: create-release 59 | run: | 60 | cargo dist plan --tag=${{ github.ref_name }} --output-format=json > dist-manifest.json 61 | echo "dist plan ran successfully" 62 | cat dist-manifest.json 63 | 64 | # Create the Github Release™ based on what cargo-dist thinks it should be 65 | ANNOUNCEMENT_TITLE=$(jq --raw-output ".announcement_title" dist-manifest.json) 66 | IS_PRERELEASE=$(jq --raw-output ".announcement_is_prerelease" dist-manifest.json) 67 | jq --raw-output ".announcement_github_body" dist-manifest.json > new_dist_announcement.md 68 | gh release create ${{ github.ref_name }} --draft --prerelease="$IS_PRERELEASE" --title="$ANNOUNCEMENT_TITLE" --notes-file=new_dist_announcement.md 69 | echo "created announcement!" 70 | 71 | # Upload the manifest to the Github Release™ 72 | gh release upload ${{ github.ref_name }} dist-manifest.json 73 | echo "uploaded manifest!" 74 | 75 | # Disable all the upload-artifacts tasks if we have no actual releases 76 | HAS_RELEASES=$(jq --raw-output ".releases != null" dist-manifest.json) 77 | echo "has-releases=$HAS_RELEASES" >> "$GITHUB_OUTPUT" 78 | 79 | # Build and packages all the things 80 | upload-artifacts: 81 | # Let the initial task tell us to not run (currently very blunt) 82 | needs: create-release 83 | if: ${{ needs.create-release.outputs.has-releases == 'true' }} 84 | strategy: 85 | matrix: 86 | # For these target platforms 87 | include: 88 | - os: ubuntu-20.04 89 | dist-args: --artifacts=local --target=x86_64-unknown-linux-gnu 90 | install-dist: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.0.7/cargo-dist-installer.sh | sh 91 | 92 | runs-on: ${{ matrix.os }} 93 | env: 94 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 95 | steps: 96 | - uses: actions/checkout@v3 97 | - name: Install Rust 98 | run: rustup update stable --no-self-update && rustup default stable 99 | - name: Install cargo-dist 100 | run: ${{ matrix.install-dist }} 101 | - name: Run cargo-dist 102 | # This logic is a bit janky because it's trying to be a polyglot between 103 | # powershell and bash since this will run on windows, macos, and linux! 104 | # The two platforms don't agree on how to talk about env vars but they 105 | # do agree on 'cat' and '$()' so we use that to marshal values between commands. 106 | run: | 107 | # Actually do builds and make zips and whatnot 108 | cargo dist build --tag=${{ github.ref_name }} --output-format=json ${{ matrix.dist-args }} > dist-manifest.json 109 | echo "dist ran successfully" 110 | cat dist-manifest.json 111 | 112 | # Parse out what we just built and upload it to the Github Release™ 113 | jq --raw-output ".artifacts[]?.path | select( . != null )" dist-manifest.json > uploads.txt 114 | echo "uploading..." 115 | cat uploads.txt 116 | gh release upload ${{ github.ref_name }} $(cat uploads.txt) 117 | echo "uploaded!" 118 | 119 | # Mark the Github Release™ as a non-draft now that everything has succeeded! 120 | publish-release: 121 | # Only run after all the other tasks, but it's ok if upload-artifacts was skipped 122 | needs: [create-release, upload-artifacts] 123 | if: ${{ always() && needs.create-release.result == 'success' && (needs.upload-artifacts.result == 'skipped' || needs.upload-artifacts.result == 'success') }} 124 | runs-on: ubuntu-latest 125 | env: 126 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 127 | steps: 128 | - uses: actions/checkout@v3 129 | - name: mark release as non-draft 130 | run: | 131 | gh release edit ${{ github.ref_name }} --draft=false 132 | -------------------------------------------------------------------------------- /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: Rust 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | paths: 7 | - "src/**/*.rs" 8 | - "**/Cargo.toml" 9 | - "**/Cargo.lock" 10 | pull_request: 11 | branches: [main] 12 | paths: 13 | - "src/**/*.rs" 14 | - "**/Cargo.toml" 15 | - "**/Cargo.lock" 16 | 17 | env: 18 | CARGO_TERM_COLOR: always 19 | 20 | jobs: 21 | Check: 22 | name: Build, Check, and test 23 | runs-on: ubuntu-latest 24 | 25 | steps: 26 | - uses: actions/checkout@v3.5.2 27 | - uses: actions-rs/toolchain@v1 28 | with: 29 | toolchain: stable 30 | override: true 31 | profile: minimal 32 | components: rustfmt, clippy 33 | - name: Cache 34 | uses: Swatinem/rust-cache@v2.4.0 35 | - name: Clippy 36 | run: cargo clippy --verbose 37 | - name: Build 38 | run: cargo build --verbose 39 | - name: Run tests 40 | run: cargo test --verbose 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | 9 | 10 | ## [Unreleased] - ReleaseDate 11 | 12 | ## [0.3.6] - 2023-05-22 13 | 14 | ### Fixed 15 | 16 | - Fixed table width 17 | 18 | ## [0.3.5] - 2023-05-22 19 | 20 | ### Fixed 21 | 22 | - Release build.. 23 | 24 | ## [0.3.4] - 2023-05-22 25 | 26 | ### Fixed 27 | 28 | - Release build.. 29 | 30 | ## [0.3.3] - 2023-05-22 31 | 32 | ### Added 33 | 34 | - Shell completion support 35 | 36 | ### Fixed 37 | 38 | - Broken pipe panic 39 | - Proper column width for `nms info ` parameters 40 | - Fixed "invalid `.modinfo`" for certain modules, such as `loop` 41 | 42 | ### Changed 43 | 44 | - Internal code improvements 45 | - Updated `comfy-tables` 46 | - Updated `clap` 47 | - Updated `quit` 48 | - Updated `linapi` 49 | 50 | ## [0.3.2] - 2021-07-23 51 | 52 | ### Added 53 | 54 | - Support for Zstandard kernel module compression. 55 | 56 | ### Changed 57 | 58 | - Updated dependencies. 59 | 60 | ## [0.3.1] - 2021-05-03 61 | 62 | ### Fixed 63 | 64 | - Errors being sent to the pager. 65 | 66 | ## [0.3.0] - 2021-05-01 67 | 68 | ### Added 69 | 70 | - Fixed terminal size detection. 71 | 72 | ### Changed 73 | 74 | - `$COLUMNS` will override terminal size detection, not act as a fallback. 75 | - Fallback terminal width is 80 if it can't be detected and `$COLUMNS` isn't set. 76 | 77 | ### Fixed 78 | 79 | - Typos 80 | 81 | ## [0.2.5] - 2021-03-31 82 | 83 | ### Changed 84 | 85 | - Updated dependencies 86 | 87 | ## [0.2.4] - 2020-12-09 88 | 89 | ### Added 90 | 91 | - Automatic paging for `nms list` and `nms info`. 92 | - Attempt fallback to `$COLUMNS` for terminal width if stdout is not a TTY. 93 | 94 | ### Changed 95 | 96 | - `nms info ` now uses "Description" instead of "Desc". 97 | 98 | ### Fixed 99 | 100 | - Outdated and large amounts of transitive dependencies. 101 | 102 | ## [0.2.3] - 2020-04-05 103 | 104 | ### Fixed 105 | 106 | - Spurious errors on `nms insert` 107 | 108 | ## [0.2.2] - 2020-04-05 109 | 110 | ### Added 111 | 112 | - Automatic underscore conversion for `nms remove`. 113 | `nms remove module-name` is equivalent to `nms remove module_name` 114 | 115 | ## [0.2.1] - 2020-04-05 116 | 117 | ### Fixed 118 | 119 | - `nms list` broke due to clap/structopt oddities. Fixed now. 120 | 121 | ## [0.2.0] - 2020-03-26 122 | 123 | ### Changed 124 | 125 | - ***BREAKING*** Renamed binary to `nms`. 126 | - Updated example in readme. 127 | 128 | ## [0.1.7] - 2020-03-26 129 | 130 | ### Added 131 | 132 | - Version flags 133 | 134 | ## [0.1.6] - 2020-03-26 135 | 136 | ### Added 137 | 138 | - Kernel modprobe support. Can be used in `/proc/sys/kernel/modprobe`. 139 | 140 | ### Changed 141 | 142 | - Tables use fancy UTF-8 characters for pretty tables 143 | 144 | ## [0.1.5] - 2020-02-26 145 | 146 | ### Fixed 147 | 148 | - `linux_modules list` panicking 149 | 150 | ## [0.1.4] - 2020-02-19 151 | 152 | ### Fixed 153 | 154 | - Failure to get information on some xz compressed modules, such as `vivid` 155 | - Modules with long parameter descriptions, such as `vivid`, displaying incorrectly. 156 | 157 | ### Changed 158 | 159 | - Module parameters now appear in alphabetical order, instead of random. 160 | 161 | ## [0.1.3] - 2020-02-18 162 | 163 | ### Added 164 | 165 | - `uname` command flag, so you can get information about modules from 166 | other kernel versions. This can happen if you upgrade your kernel, 167 | causing current module files to be removed. Arch Linux does this. 168 | 169 | ### Fixed 170 | 171 | - `linux_modules info ` now correctly identifies signatures 172 | - `linux_modules info ` now works for modules without parameters 173 | 174 | ### Changed 175 | 176 | - Proper error messages instead of rust panics 177 | 178 | ## [0.1.2] - 2020-02-16 179 | 180 | ### Changed 181 | 182 | - Updated `linapi` 183 | 184 | ## [0.1.1] - 2020-02-16 185 | 186 | ### Added 187 | 188 | - Support for compressed modules 189 | 190 | ## [0.1.0] - 2020-02-16 191 | 192 | ### Added 193 | 194 | - CLI Interface for adding, removing listing, and getting information on modules. 195 | 196 | 197 | [Unreleased]: https://github.com/DianaNites/linux_modules/compare/v0.3.6...HEAD 198 | [0.3.6]: https://github.com/DianaNites/linux_modules/compare/v0.3.5...v0.3.6 199 | [0.3.5]: https://github.com/DianaNites/linux_modules/compare/v0.3.4...v0.3.5 200 | [0.3.4]: https://github.com/DianaNites/linux_modules/compare/v0.3.3...v0.3.4 201 | [0.3.3]: https://github.com/DianaNites/linux_modules/compare/v0.3.2...v0.3.3 202 | [0.3.2]: https://github.com/DianaNites/linux_modules/compare/v0.3.1...v0.3.2 203 | [0.3.1]: https://github.com/DianaNites/linux_modules/compare/v0.3.0...v0.3.1 204 | [0.3.0]: https://github.com/DianaNites/linux_modules/compare/v0.2.5...v0.3.0 205 | [0.2.5]: https://github.com/DianaNites/linux_modules/compare/v0.2.4...v0.2.5 206 | [0.2.4]: https://github.com/DianaNites/linux_modules/compare/v0.2.3...v0.2.4 207 | [0.2.3]: https://github.com/DianaNites/linux_modules/compare/v0.2.2...v0.2.3 208 | [0.2.2]: https://github.com/DianaNites/linux_modules/compare/v0.2.1...v0.2.2 209 | [0.2.1]: https://github.com/DianaNites/linux_modules/compare/v0.2.0...v0.2.1 210 | [0.2.0]: https://github.com/DianaNites/linux_modules/compare/v0.1.7...v0.2.0 211 | [0.1.7]: https://github.com/DianaNites/linux_modules/compare/v0.1.6...v0.1.7 212 | [0.1.6]: https://github.com/DianaNites/linux_modules/compare/v0.1.5...v0.1.6 213 | [0.1.5]: https://github.com/DianaNites/linux_modules/compare/v0.1.4...v0.1.5 214 | [0.1.4]: https://github.com/DianaNites/linux_modules/compare/v0.1.3...v0.1.4 215 | [0.1.3]: https://github.com/DianaNites/linux_modules/compare/v0.1.2...v0.1.3 216 | [0.1.2]: https://github.com/DianaNites/linux_modules/compare/v0.1.1...v0.1.2 217 | [0.1.1]: https://github.com/DianaNites/linux_modules/compare/v0.1.0...v0.1.1 218 | [0.1.0]: https://github.com/DianaNites/linux_modules/releases/tag/v0.1.0 219 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "adler" 7 | version = "1.0.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 10 | 11 | [[package]] 12 | name = "anstyle" 13 | version = "1.0.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" 16 | 17 | [[package]] 18 | name = "anyhow" 19 | version = "1.0.71" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" 22 | 23 | [[package]] 24 | name = "assert_cmd" 25 | version = "2.0.11" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "86d6b683edf8d1119fe420a94f8a7e389239666aa72e65495d91c00462510151" 28 | dependencies = [ 29 | "anstyle", 30 | "bstr", 31 | "doc-comment", 32 | "predicates", 33 | "predicates-core", 34 | "predicates-tree", 35 | "wait-timeout", 36 | ] 37 | 38 | [[package]] 39 | name = "atty" 40 | version = "0.2.14" 41 | source = "registry+https://github.com/rust-lang/crates.io-index" 42 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 43 | dependencies = [ 44 | "hermit-abi", 45 | "libc", 46 | "winapi", 47 | ] 48 | 49 | [[package]] 50 | name = "autocfg" 51 | version = "1.1.0" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 54 | 55 | [[package]] 56 | name = "bitflags" 57 | version = "1.3.2" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 60 | 61 | [[package]] 62 | name = "bstr" 63 | version = "1.5.0" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" 66 | dependencies = [ 67 | "memchr", 68 | "once_cell", 69 | "regex-automata", 70 | "serde", 71 | ] 72 | 73 | [[package]] 74 | name = "cc" 75 | version = "1.0.79" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" 78 | dependencies = [ 79 | "jobserver", 80 | ] 81 | 82 | [[package]] 83 | name = "cfg-if" 84 | version = "0.1.10" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 87 | 88 | [[package]] 89 | name = "cfg-if" 90 | version = "1.0.0" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 93 | 94 | [[package]] 95 | name = "clap" 96 | version = "3.2.25" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" 99 | dependencies = [ 100 | "atty", 101 | "bitflags", 102 | "clap_derive", 103 | "clap_lex", 104 | "indexmap", 105 | "once_cell", 106 | "strsim", 107 | "termcolor", 108 | "textwrap", 109 | ] 110 | 111 | [[package]] 112 | name = "clap_complete" 113 | version = "3.2.5" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "3f7a2e0a962c45ce25afce14220bc24f9dade0a1787f185cecf96bfba7847cd8" 116 | dependencies = [ 117 | "clap", 118 | ] 119 | 120 | [[package]] 121 | name = "clap_derive" 122 | version = "3.2.25" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" 125 | dependencies = [ 126 | "heck", 127 | "proc-macro-error", 128 | "proc-macro2", 129 | "quote", 130 | "syn 1.0.109", 131 | ] 132 | 133 | [[package]] 134 | name = "clap_lex" 135 | version = "0.2.4" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" 138 | dependencies = [ 139 | "os_str_bytes", 140 | ] 141 | 142 | [[package]] 143 | name = "comfy-table" 144 | version = "6.1.4" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "6e7b787b0dc42e8111badfdbe4c3059158ccb2db8780352fa1b01e8ccf45cc4d" 147 | dependencies = [ 148 | "crossterm", 149 | "strum", 150 | "strum_macros", 151 | "unicode-width", 152 | ] 153 | 154 | [[package]] 155 | name = "console" 156 | version = "0.15.7" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" 159 | dependencies = [ 160 | "encode_unicode", 161 | "lazy_static", 162 | "libc", 163 | "windows-sys", 164 | ] 165 | 166 | [[package]] 167 | name = "crc32fast" 168 | version = "1.3.2" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 171 | dependencies = [ 172 | "cfg-if 1.0.0", 173 | ] 174 | 175 | [[package]] 176 | name = "crossterm" 177 | version = "0.25.0" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" 180 | dependencies = [ 181 | "bitflags", 182 | "crossterm_winapi", 183 | "libc", 184 | "mio", 185 | "parking_lot", 186 | "signal-hook", 187 | "signal-hook-mio", 188 | "winapi", 189 | ] 190 | 191 | [[package]] 192 | name = "crossterm_winapi" 193 | version = "0.9.0" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c" 196 | dependencies = [ 197 | "winapi", 198 | ] 199 | 200 | [[package]] 201 | name = "difflib" 202 | version = "0.4.0" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" 205 | 206 | [[package]] 207 | name = "displaydoc" 208 | version = "0.1.7" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "adc2ab4d5a16117f9029e9a6b5e4e79f4c67f6519bc134210d4d4a04ba31f41b" 211 | dependencies = [ 212 | "proc-macro2", 213 | "quote", 214 | "syn 1.0.109", 215 | ] 216 | 217 | [[package]] 218 | name = "doc-comment" 219 | version = "0.3.3" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" 222 | 223 | [[package]] 224 | name = "either" 225 | version = "1.8.1" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" 228 | 229 | [[package]] 230 | name = "encode_unicode" 231 | version = "0.3.6" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 234 | 235 | [[package]] 236 | name = "errno" 237 | version = "0.2.8" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" 240 | dependencies = [ 241 | "errno-dragonfly", 242 | "libc", 243 | "winapi", 244 | ] 245 | 246 | [[package]] 247 | name = "errno-dragonfly" 248 | version = "0.1.2" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 251 | dependencies = [ 252 | "cc", 253 | "libc", 254 | ] 255 | 256 | [[package]] 257 | name = "flate2" 258 | version = "1.0.26" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" 261 | dependencies = [ 262 | "crc32fast", 263 | "miniz_oxide", 264 | ] 265 | 266 | [[package]] 267 | name = "hashbrown" 268 | version = "0.12.3" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 271 | 272 | [[package]] 273 | name = "heck" 274 | version = "0.4.1" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 277 | 278 | [[package]] 279 | name = "hermit-abi" 280 | version = "0.1.19" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 283 | dependencies = [ 284 | "libc", 285 | ] 286 | 287 | [[package]] 288 | name = "indexmap" 289 | version = "1.9.3" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 292 | dependencies = [ 293 | "autocfg", 294 | "hashbrown", 295 | ] 296 | 297 | [[package]] 298 | name = "insta" 299 | version = "1.29.0" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "9a28d25139df397cbca21408bb742cf6837e04cdbebf1b07b760caf971d6a972" 302 | dependencies = [ 303 | "console", 304 | "lazy_static", 305 | "linked-hash-map", 306 | "serde", 307 | "similar", 308 | "yaml-rust", 309 | ] 310 | 311 | [[package]] 312 | name = "itertools" 313 | version = "0.10.5" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 316 | dependencies = [ 317 | "either", 318 | ] 319 | 320 | [[package]] 321 | name = "jobserver" 322 | version = "0.1.26" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" 325 | dependencies = [ 326 | "libc", 327 | ] 328 | 329 | [[package]] 330 | name = "lazy_static" 331 | version = "1.4.0" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 334 | 335 | [[package]] 336 | name = "libc" 337 | version = "0.2.144" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" 340 | 341 | [[package]] 342 | name = "linapi" 343 | version = "0.5.3" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "29ad5c17bca211ae374e8f62f359935a7d0c51ba86b54e5980653ffb1ca93e77" 346 | dependencies = [ 347 | "bitflags", 348 | "displaydoc", 349 | "flate2", 350 | "libc", 351 | "nix", 352 | "thiserror", 353 | "walkdir", 354 | "xmas-elf", 355 | "xz2", 356 | "zstd", 357 | ] 358 | 359 | [[package]] 360 | name = "linked-hash-map" 361 | version = "0.5.6" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 364 | 365 | [[package]] 366 | name = "linux_modules" 367 | version = "0.3.6" 368 | dependencies = [ 369 | "anyhow", 370 | "assert_cmd", 371 | "clap", 372 | "clap_complete", 373 | "comfy-table", 374 | "insta", 375 | "linapi", 376 | "once_cell", 377 | "pager", 378 | "quit", 379 | ] 380 | 381 | [[package]] 382 | name = "lock_api" 383 | version = "0.4.9" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 386 | dependencies = [ 387 | "autocfg", 388 | "scopeguard", 389 | ] 390 | 391 | [[package]] 392 | name = "log" 393 | version = "0.4.17" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 396 | dependencies = [ 397 | "cfg-if 1.0.0", 398 | ] 399 | 400 | [[package]] 401 | name = "lzma-sys" 402 | version = "0.1.20" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" 405 | dependencies = [ 406 | "cc", 407 | "libc", 408 | "pkg-config", 409 | ] 410 | 411 | [[package]] 412 | name = "memchr" 413 | version = "2.5.0" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 416 | 417 | [[package]] 418 | name = "miniz_oxide" 419 | version = "0.7.1" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 422 | dependencies = [ 423 | "adler", 424 | ] 425 | 426 | [[package]] 427 | name = "mio" 428 | version = "0.8.6" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" 431 | dependencies = [ 432 | "libc", 433 | "log", 434 | "wasi", 435 | "windows-sys", 436 | ] 437 | 438 | [[package]] 439 | name = "nix" 440 | version = "0.17.0" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" 443 | dependencies = [ 444 | "bitflags", 445 | "cc", 446 | "cfg-if 0.1.10", 447 | "libc", 448 | "void", 449 | ] 450 | 451 | [[package]] 452 | name = "once_cell" 453 | version = "1.17.1" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" 456 | 457 | [[package]] 458 | name = "os_str_bytes" 459 | version = "6.5.0" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" 462 | 463 | [[package]] 464 | name = "pager" 465 | version = "0.16.1" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "2599211a5c97fbbb1061d3dc751fa15f404927e4846e07c643287d6d1f462880" 468 | dependencies = [ 469 | "errno", 470 | "libc", 471 | ] 472 | 473 | [[package]] 474 | name = "parking_lot" 475 | version = "0.12.1" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 478 | dependencies = [ 479 | "lock_api", 480 | "parking_lot_core", 481 | ] 482 | 483 | [[package]] 484 | name = "parking_lot_core" 485 | version = "0.9.7" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" 488 | dependencies = [ 489 | "cfg-if 1.0.0", 490 | "libc", 491 | "redox_syscall", 492 | "smallvec", 493 | "windows-sys", 494 | ] 495 | 496 | [[package]] 497 | name = "pkg-config" 498 | version = "0.3.27" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" 501 | 502 | [[package]] 503 | name = "predicates" 504 | version = "3.0.3" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9" 507 | dependencies = [ 508 | "anstyle", 509 | "difflib", 510 | "itertools", 511 | "predicates-core", 512 | ] 513 | 514 | [[package]] 515 | name = "predicates-core" 516 | version = "1.0.6" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" 519 | 520 | [[package]] 521 | name = "predicates-tree" 522 | version = "1.0.9" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" 525 | dependencies = [ 526 | "predicates-core", 527 | "termtree", 528 | ] 529 | 530 | [[package]] 531 | name = "proc-macro-error" 532 | version = "1.0.4" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 535 | dependencies = [ 536 | "proc-macro-error-attr", 537 | "proc-macro2", 538 | "quote", 539 | "syn 1.0.109", 540 | "version_check", 541 | ] 542 | 543 | [[package]] 544 | name = "proc-macro-error-attr" 545 | version = "1.0.4" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 548 | dependencies = [ 549 | "proc-macro2", 550 | "quote", 551 | "version_check", 552 | ] 553 | 554 | [[package]] 555 | name = "proc-macro2" 556 | version = "1.0.58" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" 559 | dependencies = [ 560 | "unicode-ident", 561 | ] 562 | 563 | [[package]] 564 | name = "quit" 565 | version = "2.0.0" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "c090c608233d81bd6b90e718cf34506c60a10e633dff2292c3d1029e798d669b" 568 | dependencies = [ 569 | "quit_macros", 570 | ] 571 | 572 | [[package]] 573 | name = "quit_macros" 574 | version = "2.0.0" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "1d4b27a0dd5d08ad7af2d17952fb360ec9c30eeade0b32df7a3c9b099ff37564" 577 | 578 | [[package]] 579 | name = "quote" 580 | version = "1.0.27" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" 583 | dependencies = [ 584 | "proc-macro2", 585 | ] 586 | 587 | [[package]] 588 | name = "redox_syscall" 589 | version = "0.2.16" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 592 | dependencies = [ 593 | "bitflags", 594 | ] 595 | 596 | [[package]] 597 | name = "regex-automata" 598 | version = "0.1.10" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 601 | 602 | [[package]] 603 | name = "rustversion" 604 | version = "1.0.12" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" 607 | 608 | [[package]] 609 | name = "same-file" 610 | version = "1.0.6" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 613 | dependencies = [ 614 | "winapi-util", 615 | ] 616 | 617 | [[package]] 618 | name = "scopeguard" 619 | version = "1.1.0" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 622 | 623 | [[package]] 624 | name = "serde" 625 | version = "1.0.163" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" 628 | 629 | [[package]] 630 | name = "signal-hook" 631 | version = "0.3.15" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9" 634 | dependencies = [ 635 | "libc", 636 | "signal-hook-registry", 637 | ] 638 | 639 | [[package]] 640 | name = "signal-hook-mio" 641 | version = "0.2.3" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" 644 | dependencies = [ 645 | "libc", 646 | "mio", 647 | "signal-hook", 648 | ] 649 | 650 | [[package]] 651 | name = "signal-hook-registry" 652 | version = "1.4.1" 653 | source = "registry+https://github.com/rust-lang/crates.io-index" 654 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 655 | dependencies = [ 656 | "libc", 657 | ] 658 | 659 | [[package]] 660 | name = "similar" 661 | version = "2.2.1" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "420acb44afdae038210c99e69aae24109f32f15500aa708e81d46c9f29d55fcf" 664 | 665 | [[package]] 666 | name = "smallvec" 667 | version = "1.10.0" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 670 | 671 | [[package]] 672 | name = "strsim" 673 | version = "0.10.0" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 676 | 677 | [[package]] 678 | name = "strum" 679 | version = "0.24.1" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" 682 | 683 | [[package]] 684 | name = "strum_macros" 685 | version = "0.24.3" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" 688 | dependencies = [ 689 | "heck", 690 | "proc-macro2", 691 | "quote", 692 | "rustversion", 693 | "syn 1.0.109", 694 | ] 695 | 696 | [[package]] 697 | name = "syn" 698 | version = "1.0.109" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 701 | dependencies = [ 702 | "proc-macro2", 703 | "quote", 704 | "unicode-ident", 705 | ] 706 | 707 | [[package]] 708 | name = "syn" 709 | version = "2.0.16" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" 712 | dependencies = [ 713 | "proc-macro2", 714 | "quote", 715 | "unicode-ident", 716 | ] 717 | 718 | [[package]] 719 | name = "termcolor" 720 | version = "1.2.0" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" 723 | dependencies = [ 724 | "winapi-util", 725 | ] 726 | 727 | [[package]] 728 | name = "termtree" 729 | version = "0.4.1" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" 732 | 733 | [[package]] 734 | name = "textwrap" 735 | version = "0.16.0" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" 738 | 739 | [[package]] 740 | name = "thiserror" 741 | version = "1.0.40" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" 744 | dependencies = [ 745 | "thiserror-impl", 746 | ] 747 | 748 | [[package]] 749 | name = "thiserror-impl" 750 | version = "1.0.40" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" 753 | dependencies = [ 754 | "proc-macro2", 755 | "quote", 756 | "syn 2.0.16", 757 | ] 758 | 759 | [[package]] 760 | name = "unicode-ident" 761 | version = "1.0.8" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" 764 | 765 | [[package]] 766 | name = "unicode-width" 767 | version = "0.1.10" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 770 | 771 | [[package]] 772 | name = "version_check" 773 | version = "0.9.4" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 776 | 777 | [[package]] 778 | name = "void" 779 | version = "1.0.2" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 782 | 783 | [[package]] 784 | name = "wait-timeout" 785 | version = "0.2.0" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" 788 | dependencies = [ 789 | "libc", 790 | ] 791 | 792 | [[package]] 793 | name = "walkdir" 794 | version = "2.3.3" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" 797 | dependencies = [ 798 | "same-file", 799 | "winapi-util", 800 | ] 801 | 802 | [[package]] 803 | name = "wasi" 804 | version = "0.11.0+wasi-snapshot-preview1" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 807 | 808 | [[package]] 809 | name = "winapi" 810 | version = "0.3.9" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 813 | dependencies = [ 814 | "winapi-i686-pc-windows-gnu", 815 | "winapi-x86_64-pc-windows-gnu", 816 | ] 817 | 818 | [[package]] 819 | name = "winapi-i686-pc-windows-gnu" 820 | version = "0.4.0" 821 | source = "registry+https://github.com/rust-lang/crates.io-index" 822 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 823 | 824 | [[package]] 825 | name = "winapi-util" 826 | version = "0.1.5" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 829 | dependencies = [ 830 | "winapi", 831 | ] 832 | 833 | [[package]] 834 | name = "winapi-x86_64-pc-windows-gnu" 835 | version = "0.4.0" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 838 | 839 | [[package]] 840 | name = "windows-sys" 841 | version = "0.45.0" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 844 | dependencies = [ 845 | "windows-targets", 846 | ] 847 | 848 | [[package]] 849 | name = "windows-targets" 850 | version = "0.42.2" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 853 | dependencies = [ 854 | "windows_aarch64_gnullvm", 855 | "windows_aarch64_msvc", 856 | "windows_i686_gnu", 857 | "windows_i686_msvc", 858 | "windows_x86_64_gnu", 859 | "windows_x86_64_gnullvm", 860 | "windows_x86_64_msvc", 861 | ] 862 | 863 | [[package]] 864 | name = "windows_aarch64_gnullvm" 865 | version = "0.42.2" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 868 | 869 | [[package]] 870 | name = "windows_aarch64_msvc" 871 | version = "0.42.2" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 874 | 875 | [[package]] 876 | name = "windows_i686_gnu" 877 | version = "0.42.2" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 880 | 881 | [[package]] 882 | name = "windows_i686_msvc" 883 | version = "0.42.2" 884 | source = "registry+https://github.com/rust-lang/crates.io-index" 885 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 886 | 887 | [[package]] 888 | name = "windows_x86_64_gnu" 889 | version = "0.42.2" 890 | source = "registry+https://github.com/rust-lang/crates.io-index" 891 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 892 | 893 | [[package]] 894 | name = "windows_x86_64_gnullvm" 895 | version = "0.42.2" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 898 | 899 | [[package]] 900 | name = "windows_x86_64_msvc" 901 | version = "0.42.2" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 904 | 905 | [[package]] 906 | name = "xmas-elf" 907 | version = "0.7.0" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | checksum = "e74de9a366f6ab8c405fa6b371d9ac24943921fa14b3d64afcb202065c405f11" 910 | dependencies = [ 911 | "zero", 912 | ] 913 | 914 | [[package]] 915 | name = "xz2" 916 | version = "0.1.7" 917 | source = "registry+https://github.com/rust-lang/crates.io-index" 918 | checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" 919 | dependencies = [ 920 | "lzma-sys", 921 | ] 922 | 923 | [[package]] 924 | name = "yaml-rust" 925 | version = "0.4.5" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" 928 | dependencies = [ 929 | "linked-hash-map", 930 | ] 931 | 932 | [[package]] 933 | name = "zero" 934 | version = "0.1.3" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "2fe21bcc34ca7fe6dd56cc2cb1261ea59d6b93620215aefb5ea6032265527784" 937 | 938 | [[package]] 939 | name = "zstd" 940 | version = "0.9.2+zstd.1.5.1" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "2390ea1bf6c038c39674f22d95f0564725fc06034a47129179810b2fc58caa54" 943 | dependencies = [ 944 | "zstd-safe", 945 | ] 946 | 947 | [[package]] 948 | name = "zstd-safe" 949 | version = "4.1.3+zstd.1.5.1" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "e99d81b99fb3c2c2c794e3fe56c305c63d5173a16a46b5850b07c935ffc7db79" 952 | dependencies = [ 953 | "libc", 954 | "zstd-sys", 955 | ] 956 | 957 | [[package]] 958 | name = "zstd-sys" 959 | version = "1.6.2+zstd.1.5.1" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "2daf2f248d9ea44454bfcb2516534e8b8ad2fc91bf818a1885495fc42bc8ac9f" 962 | dependencies = [ 963 | "cc", 964 | "libc", 965 | ] 966 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "linux_modules" 3 | version = "0.3.6" 4 | authors = ["Diana"] 5 | edition = "2021" 6 | # 7 | description = "Tool To Manage Linux Kernel Modules" 8 | documentation = "https://docs.rs/linux_modules" 9 | repository = "https://github.com/DianaNites/linux_modules" 10 | readme = "README.md" 11 | keywords = ["linux", "kernel", "module"] 12 | categories = ["os::unix-apis", "command-line-utilities"] 13 | license = "MIT OR Apache-2.0" 14 | 15 | [dependencies] 16 | clap = { version = "3.2.23", features = ["derive", "color"] } 17 | anyhow = "1.0.71" 18 | comfy-table = "6.1.4" 19 | linapi = "0.5.3" 20 | quit = "2.0.0" 21 | pager = "0.16.1" 22 | once_cell = "1.17.1" 23 | clap_complete = "3.2.5" 24 | 25 | [dev-dependencies] 26 | assert_cmd = "2.0.11" 27 | insta = { version = "1.29.0", features = ["yaml"] } 28 | 29 | [[bin]] 30 | path = "src/main.rs" 31 | name = "nms" 32 | 33 | [badges] 34 | maintenance = { status = "experimental" } 35 | 36 | [profile.dist] 37 | inherits = "release" 38 | lto = "thin" 39 | 40 | # Config for 'cargo dist' 41 | [workspace.metadata.dist] 42 | cargo-dist-version = "0.0.7" 43 | rust-toolchain-version = "stable" 44 | ci = ["github"] 45 | installers = [] 46 | targets = ["x86_64-unknown-linux-gnu"] 47 | 48 | [profile.dev.package.insta] 49 | opt-level = 3 50 | 51 | [profile.dev.package.similar] 52 | opt-level = 3 53 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 DianaNites 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Linux Modules 2 | 3 | [![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat)](https://github.com/RichardLitt/standard-readme) 4 | [![linux_modules crates.io version and link](https://img.shields.io/crates/v/linux_modules.svg)](https://crates.io/crates/linux_modules) 5 | ![linux_modules Crates.io license](https://img.shields.io/crates/l/linux_modules) 6 | [![linux_modules docs.rs badge](https://docs.rs/linux_modules/badge.svg)](https://docs.rs/linux_modules) 7 | 8 | Tool To Manage Linux Kernel Modules 9 | 10 | This is a tool to manage your Linux Kernel Modules. 11 | It is an alternative to `modprobe`, and supports listing, adding, and removing modules, 12 | as well as displaying information on them. 13 | 14 | It does not yet support modprobe style dependencies or aliases, 15 | and is not capable of displaying module signature data, except whether one exists or not. 16 | 17 | ## Install 18 | 19 | ```shell 20 | cargo install linux_modules 21 | ``` 22 | 23 | ## Usage 24 | 25 | ### CLI 26 | 27 | ```shell 28 | $ nms info loop 29 | ╭───────────────────┬──────────────────────────────────────╮ 30 | │ File ┆ /lib/modules/6.3.1-arch2-1/kernel/dr │ 31 | │ ┆ ivers/block/loop.ko.zst │ 32 | ╞═══════════════════╪══════════════════════════════════════╡ 33 | │ Authors ┆ │ 34 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 35 | │ License ┆ GPL │ 36 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 37 | │ Description ┆ │ 38 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 39 | │ Version ┆ │ 40 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 41 | │ Firmware ┆ │ 42 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 43 | │ Alias ┆ devname:loop-control │ 44 | │ ┆ char-major-10-237 │ 45 | │ ┆ block-major-7-* │ 46 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 47 | │ Dependencies ┆ │ 48 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 49 | │ Soft Dependencies ┆ │ 50 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 51 | │ In Tree ┆ true │ 52 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 53 | │ Retpoline ┆ true │ 54 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 55 | │ Staging ┆ false │ 56 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 57 | │ Version Magic ┆ 6.3.1-arch2-1 SMP preempt mod_unload │ 58 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 59 | │ Source Checksum ┆ B9EBD1F7F134B1C20C5B09B │ 60 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 61 | │ Parameters ┆ ╭────────────┬───────────┬─────────╮ │ 62 | │ ┆ │ Name ┆ Descripti ┆ Type │ │ 63 | │ ┆ │ ┆ on ┆ │ │ 64 | │ ┆ ╞════════════╪═══════════╪═════════╡ │ 65 | │ ┆ │ hw_queue_d ┆ Queue ┆ Unknown │ │ 66 | │ ┆ │ epth ┆ depth for ┆ │ │ 67 | │ ┆ │ ┆ each ┆ │ │ 68 | │ ┆ │ ┆ hardware ┆ │ │ 69 | │ ┆ │ ┆ queue. ┆ │ │ 70 | │ ┆ │ ┆ Default: ┆ │ │ 71 | │ ┆ │ ┆ 128 ┆ │ │ 72 | │ ┆ ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤ │ 73 | │ ┆ │ max_loop ┆ Maximum ┆ int │ │ 74 | │ ┆ │ ┆ number of ┆ │ │ 75 | │ ┆ │ ┆ loop ┆ │ │ 76 | │ ┆ │ ┆ devices ┆ │ │ 77 | │ ┆ ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤ │ 78 | │ ┆ │ max_part ┆ Maximum ┆ int │ │ 79 | │ ┆ │ ┆ number of ┆ │ │ 80 | │ ┆ │ ┆ partition ┆ │ │ 81 | │ ┆ │ ┆ s per ┆ │ │ 82 | │ ┆ │ ┆ loop ┆ │ │ 83 | │ ┆ │ ┆ device ┆ │ │ 84 | │ ┆ ╰────────────┴───────────┴─────────╯ │ 85 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 86 | │ Signature ┆ true │ 87 | ╰───────────────────┴──────────────────────────────────────╯ 88 | ``` 89 | 90 | Note that the table size will adapt to your terminal. 91 | This example uses size `60`. 92 | 93 | ### Pager 94 | 95 | `nms info` and `nms list` automatically pipe output to a pager, 96 | defaulting to `less`, but this may be customized through environment variables. 97 | 98 | See the [`pager`](https://crates.io/crates/pager) crate for details on 99 | how to customize what pager is used. 100 | 101 | ## Changelog 102 | 103 | Please see [CHANGELOG](CHANGELOG.md) for version history 104 | 105 | ## Contributing 106 | 107 | This crate is not looking for contributors at this time. 108 | 109 | However, feel free to ask questions and request bindings using github issues, 110 | or suggest/discuss API improvements. 111 | 112 | Unless you explicitly state otherwise, any contribution intentionally submitted 113 | for inclusion in the work by you, as defined in the Apache-2.0 license, shall be 114 | dual licensed as below, without any additional terms or conditions. 115 | 116 | ## License 117 | 118 | Licensed under either of 119 | 120 | - Apache License, Version 2.0 121 | ([LICENSE-APACHE](LICENSE-APACHE) or 122 | - MIT license 123 | ([LICENSE-MIT](LICENSE-MIT) or 124 | 125 | at your option. 126 | -------------------------------------------------------------------------------- /release.toml: -------------------------------------------------------------------------------- 1 | pre-release-commit-message = "Release version {{version}}" 2 | tag-message = "(release) {{crate_name}} version {{version}}" 3 | 4 | [[pre-release-replacements]] 5 | file = "tests/snapshots/ui__help.snap" 6 | search = "linux_modules .*" 7 | replace = "linux_modules {{version}}" 8 | 9 | [[pre-release-replacements]] 10 | file = "CHANGELOG.md" 11 | search = "Unreleased" 12 | replace = "{{version}}" 13 | 14 | [[pre-release-replacements]] 15 | file = "CHANGELOG.md" 16 | search = "\\.\\.\\.HEAD" 17 | replace = "...{{tag_name}}" 18 | exactly = 1 19 | 20 | [[pre-release-replacements]] 21 | file = "CHANGELOG.md" 22 | search = "ReleaseDate" 23 | replace = "{{date}}" 24 | 25 | [[pre-release-replacements]] 26 | file = "CHANGELOG.md" 27 | search = "" 28 | replace = "\n\n## [Unreleased] - ReleaseDate" 29 | exactly = 1 30 | 31 | [[pre-release-replacements]] 32 | file = "CHANGELOG.md" 33 | search = "" 34 | replace = "\n[Unreleased]: https://github.com/DianaNites/{{crate_name}}/compare/{{tag_name}}...HEAD" 35 | exactly = 1 36 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | env, 3 | io::{stdout, Write}, 4 | path::{Path, PathBuf}, 5 | }; 6 | 7 | use anyhow::{Context, Result}; 8 | use clap::{CommandFactory, Parser, ValueHint}; 9 | use clap_complete::Shell; 10 | use comfy_table::{modifiers::UTF8_ROUND_CORNERS, presets::UTF8_FULL, ContentArrangement, Table}; 11 | use linapi::system::modules::{LoadedModule, ModuleFile}; 12 | use once_cell::sync::OnceCell; 13 | 14 | static TERM_WIDTH: OnceCell = OnceCell::new(); 15 | 16 | #[derive(Debug, Parser)] 17 | enum Commands { 18 | /// List loaded kernel modules 19 | List {}, 20 | 21 | /// Load a kernel module 22 | Insert { 23 | /// Path to file, or module name. 24 | /// 25 | /// If this is a full path, that file is loaded directly. 26 | /// 27 | /// If a module name, `lib/modules/(uname -r)` will be searched. 28 | #[clap(value_hint(ValueHint::FilePath))] 29 | module: PathBuf, 30 | 31 | /// Force load the module. 32 | /// 33 | /// This ignores important kernel compatibility checks. 34 | /// 35 | /// USE AT YOUR OWN RISK 36 | #[clap(long, short)] 37 | force: bool, 38 | }, 39 | 40 | /// Remove/unload a kernel module 41 | Remove { 42 | /// Name of the module to unload 43 | name: String, 44 | 45 | /// Force unload the module. 46 | /// 47 | /// This is extremely dangerous and can cause serious system 48 | /// instability. Not all modules are designed to be unloaded, and this 49 | /// can cause a module currently being used to be unloaded. 50 | /// 51 | /// USE AT YOUR OWN RISK 52 | #[clap(long, short)] 53 | force: bool, 54 | }, 55 | 56 | /// Get information on a kernel module 57 | Info { 58 | /// Uname to use instead of the current one. 59 | /// 60 | /// This may be required if you want information on modules regarding a 61 | /// kernel other than the one currently running. 62 | /// 63 | /// Alternatively the full path to the module may be specified. 64 | #[clap(long, short)] 65 | uname: Option, 66 | 67 | /// Name of the module, or a path to one. 68 | #[clap(value_hint(ValueHint::FilePath))] 69 | module: PathBuf, 70 | }, 71 | 72 | /// Generate shell completions, outputting to stdout 73 | Completions { 74 | // Shell to generate completions for 75 | #[clap(value_enum)] 76 | shell: Shell, 77 | }, 78 | } 79 | 80 | /// Manage Linux Kernel Modules 81 | #[derive(Debug, Parser)] 82 | #[clap(version)] 83 | #[clap(subcommand_negates_reqs = true)] 84 | #[clap(disable_help_subcommand = true)] 85 | #[clap(arg_required_else_help = true)] 86 | struct Args { 87 | /// Module name to load. For linux kernel support. 88 | #[clap(hide(true), required_unless("name"), value_hint(ValueHint::FilePath))] 89 | name: Option, 90 | 91 | /// Does nothing. For linux kernel support. 92 | #[clap(short, hide(true), required(true))] 93 | #[allow(dead_code)] 94 | quiet: bool, 95 | 96 | #[clap(subcommand)] 97 | cmd: Option, 98 | } 99 | 100 | fn create_table() -> Result { 101 | let cols = env::var("COLUMNS") 102 | .map(|s| s.parse()) 103 | .unwrap_or(Ok(80)) 104 | .context("COLUMNS was not a valid number")?; 105 | let mut table = Table::new(); 106 | table.set_width(*TERM_WIDTH.get_or_init(|| match table.width() { 107 | Some(w) => w, 108 | None => cols, 109 | })); 110 | table 111 | .load_preset(UTF8_FULL) 112 | .set_content_arrangement(ContentArrangement::Dynamic) 113 | .apply_modifier(UTF8_ROUND_CORNERS); 114 | Ok(table) 115 | } 116 | 117 | fn get_module(name: &Path, uname: Option<&str>) -> Result { 118 | if name.is_absolute() { 119 | Ok(ModuleFile::from_path(name)?) 120 | } else { 121 | // This unwrap should be okay, `name` always valid utf-8? 122 | if let Some(uname) = uname { 123 | Ok(ModuleFile::from_name_with_uname( 124 | name.to_str().unwrap(), 125 | uname, 126 | )?) 127 | } else { 128 | Ok(ModuleFile::from_name(name.to_str().unwrap())?) 129 | } 130 | } 131 | } 132 | 133 | fn list_modules() -> Result<()> { 134 | let mut table = create_table()?; 135 | table.set_header(["Module", "Size (Bytes)", "References", "Used By"]); 136 | 137 | for m in LoadedModule::get_loaded()? { 138 | table.add_row([ 139 | m.name(), 140 | &m.size().to_string(), 141 | &m.ref_count().unwrap().to_string(), 142 | &m.holders() 143 | .iter() 144 | .map(|m| m.name()) 145 | .collect::>() 146 | .join("\n"), 147 | ]); 148 | } 149 | pager::Pager::with_default_pager("less").setup(); 150 | let _ = writeln!(stdout(), "{}", table); 151 | Ok(()) 152 | } 153 | 154 | fn add_module(name: &Path, force: bool) -> Result<()> { 155 | let m = get_module(name, None)?; 156 | if force { 157 | unsafe { m.force_load("")? }; 158 | } else { 159 | m.load("")?; 160 | } 161 | Ok(()) 162 | } 163 | 164 | fn remove_module(name: &str, force: bool) -> Result<()> { 165 | for name in &[ 166 | name.to_string(), 167 | name.replace('-', "_"), 168 | name.replace('_', "-"), 169 | ] { 170 | let m = match LoadedModule::from_name(name) { 171 | Ok(m) => m, 172 | Err(_) => continue, 173 | }; 174 | if force { 175 | unsafe { m.force_unload()? }; 176 | } else { 177 | m.unload()?; 178 | } 179 | break; 180 | } 181 | Ok(()) 182 | } 183 | 184 | fn info_module(name: &Path, uname: Option<&str>) -> Result<()> { 185 | let mut table = create_table()?; 186 | let m = get_module(name, uname)?; 187 | pager::Pager::with_default_pager("less").setup(); 188 | let info = m.info(); 189 | // FIXME: amdgpu dependencies are comma separated single string? 190 | // Bug in linapi? kernel oddity? 191 | // panic!("{:?}", &info.dependencies); 192 | 193 | table.set_header(&["File".into(), m.path().display().to_string()]); 194 | 195 | table.add_rows([ 196 | ["Authors", &info.authors.join("\n")], 197 | ["License", &info.license], 198 | ["Description", &info.description], 199 | ["Version", &info.version], 200 | ["Firmware", &info.firmware.join("\n")], 201 | ["Alias", &info.alias.join("\n")], 202 | ["Dependencies", &info.dependencies.join("\n")], 203 | ["Soft Dependencies", &info.soft_dependencies.join("\n")], 204 | ["In Tree", &info.in_tree.to_string()], 205 | ["Retpoline", &info.retpoline.to_string()], 206 | ["Staging", &info.staging.to_string()], 207 | ["Version Magic", &info.version_magic], 208 | ["Source Checksum", &info.source_checksum], 209 | ]); 210 | 211 | let mut p_table = create_table()?; 212 | p_table.set_header(["Name", "Description", "Type"]); 213 | 214 | // Max width of `tables` contents before we add params 215 | // 6 Is how many characters, including padding, the first column borders take. 216 | // Plus 1 for our own padding, for a total of 7. 217 | p_table.set_width(table.width().unwrap() - table.column_max_content_widths()[0] - 7); 218 | 219 | let mut parameters = info.parameters.clone(); 220 | parameters.sort_unstable_by(|a, b| a.name.cmp(&b.name)); 221 | for p in parameters { 222 | let desc = p 223 | .description 224 | .as_ref() 225 | .map(|s| s.replace('\t', " ")) 226 | .unwrap_or_else(|| "None".into()); 227 | p_table.add_row(&[p.name.clone(), desc, p.type_.clone()]); 228 | } 229 | if info.parameters.is_empty() { 230 | table.add_row(["Parameters", "None"]); 231 | } else { 232 | table.add_row(["Parameters", &p_table.to_string()]); 233 | } 234 | table.add_row(["Signature", &m.has_signature().to_string()]); 235 | 236 | let _ = writeln!(stdout(), "{}", table); 237 | Ok(()) 238 | } 239 | 240 | #[quit::main] 241 | fn main() -> Result<()> { 242 | let args: Args = Args::from_args(); 243 | let _ = create_table(); // So that TERM_WIDTH gets set. 244 | 245 | if args.cmd.is_some() { 246 | match args.cmd.unwrap() { 247 | Commands::List { .. } => { 248 | list_modules().with_context(|| "Couldn't list running modules")? 249 | } 250 | Commands::Insert { module, force } => add_module(&module, force) 251 | .with_context(|| format!("Couldn't add module {}", module.display()))?, 252 | Commands::Remove { name, force } => remove_module(&name, force) 253 | .with_context(|| format!("Couldn't remove module {}", name))?, 254 | Commands::Info { module, uname } => info_module(&module, uname.as_deref()) 255 | .with_context(|| { 256 | format!("Couldn't get information on module {}", module.display()) 257 | })?, 258 | Commands::Completions { shell } => { 259 | clap_complete::generate( 260 | shell, 261 | &mut Args::command(), 262 | env!("CARGO_BIN_NAME"), 263 | &mut stdout(), 264 | ); 265 | } 266 | } 267 | } else { 268 | // This exists for support with the Linux kernel, which calls modprobe as so: 269 | // `modprobe -q ` 270 | 271 | // Can't be `None`, guaranteed by clap requirements. 272 | let _ = add_module(&args.name.unwrap(), false); 273 | quit::with_code(1); 274 | } 275 | 276 | Ok(()) 277 | } 278 | -------------------------------------------------------------------------------- /tests/snapshots/ui__help-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/ui.rs 3 | expression: out 4 | --- 5 | nms-list 6 | List loaded kernel modules 7 | 8 | USAGE: 9 | nms list 10 | 11 | OPTIONS: 12 | -h, --help Print help information 13 | 14 | -------------------------------------------------------------------------------- /tests/snapshots/ui__help-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/ui.rs 3 | expression: out 4 | --- 5 | nms-insert 6 | Load a kernel module 7 | 8 | USAGE: 9 | nms insert [OPTIONS] 10 | 11 | ARGS: 12 | 13 | Path to file, or module name. 14 | 15 | If this is a full path, that file is loaded directly. 16 | 17 | If a module name, `lib/modules/(uname -r)` will be searched. 18 | 19 | OPTIONS: 20 | -f, --force 21 | Force load the module. 22 | 23 | This ignores important kernel compatibility checks. 24 | 25 | USE AT YOUR OWN RISK 26 | 27 | -h, --help 28 | Print help information 29 | 30 | -------------------------------------------------------------------------------- /tests/snapshots/ui__help-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/ui.rs 3 | expression: out 4 | --- 5 | nms-remove 6 | Remove/unload a kernel module 7 | 8 | USAGE: 9 | nms remove [OPTIONS] 10 | 11 | ARGS: 12 | 13 | Name of the module to unload 14 | 15 | OPTIONS: 16 | -f, --force 17 | Force unload the module. 18 | 19 | This is extremely dangerous and can cause serious system instability. Not all modules 20 | are designed to be unloaded, and this can cause a module currently being used to be 21 | unloaded. 22 | 23 | USE AT YOUR OWN RISK 24 | 25 | -h, --help 26 | Print help information 27 | 28 | -------------------------------------------------------------------------------- /tests/snapshots/ui__help-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/ui.rs 3 | expression: out 4 | --- 5 | nms-info 6 | Get information on a kernel module 7 | 8 | USAGE: 9 | nms info [OPTIONS] 10 | 11 | ARGS: 12 | 13 | Name of the module, or a path to one 14 | 15 | OPTIONS: 16 | -h, --help 17 | Print help information 18 | 19 | -u, --uname 20 | Uname to use instead of the current one. 21 | 22 | This may be required if you want information on modules regarding a kernel other than 23 | the one currently running. 24 | 25 | Alternatively the full path to the module may be specified. 26 | 27 | -------------------------------------------------------------------------------- /tests/snapshots/ui__help.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/ui.rs 3 | expression: out 4 | --- 5 | linux_modules 0.3.6 6 | Manage Linux Kernel Modules 7 | 8 | USAGE: 9 | nms -q 10 | nms 11 | 12 | OPTIONS: 13 | -h, --help Print help information 14 | -V, --version Print version information 15 | 16 | SUBCOMMANDS: 17 | completions Generate shell completions, outputting to stdout 18 | info Get information on a kernel module 19 | insert Load a kernel module 20 | list List loaded kernel modules 21 | remove Remove/unload a kernel module 22 | 23 | -------------------------------------------------------------------------------- /tests/snapshots/ui__list.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/ui.rs 3 | expression: out 4 | --- 5 | ╭───────────────────────┬──────────────┬────────────┬───────────────────────╮ 6 | │ Module ┆ Size (Bytes) ┆ References ┆ Used By │ 7 | ╞═══════════════════════╪══════════════╪════════════╪═══════════════════════╡ 8 | │ encrypted_keys ┆ 28672 ┆ 1 ┆ dm_crypt │ 9 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 10 | │ pkcs8_key_parser ┆ 16384 ┆ 0 ┆ │ 11 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 12 | │ r8169 ┆ 114688 ┆ 0 ┆ │ 13 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 14 | │ snd_hda_codec_generic ┆ 114688 ┆ 1 ┆ snd_hda_codec_realtek │ 15 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 16 | │ ac97_bus ┆ 16384 ┆ 1 ┆ snd_soc_core │ 17 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 18 | │ gf128mul ┆ 16384 ┆ 1 ┆ polyval_generic │ 19 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 20 | │ ccp ┆ 151552 ┆ 1 ┆ kvm_amd │ 21 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 22 | │ gpu_sched ┆ 57344 ┆ 1 ┆ amdgpu │ 23 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 24 | │ xt_conntrack ┆ 16384 ┆ 14 ┆ │ 25 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 26 | │ mdio_devres ┆ 16384 ┆ 1 ┆ r8169 │ 27 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 28 | │ poly1305_x86_64 ┆ 28672 ┆ 1 ┆ libchacha20poly1305 │ 29 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 30 | │ nf_conntrack ┆ 204800 ┆ 4 ┆ xt_conntrack │ 31 | │ ┆ ┆ ┆ nf_nat │ 32 | │ ┆ ┆ ┆ nft_ct │ 33 | │ ┆ ┆ ┆ nft_masq │ 34 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 35 | │ snd_seq ┆ 106496 ┆ 7 ┆ snd_seq_dummy │ 36 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 37 | │ snd_rpl_pci_acp6x ┆ 20480 ┆ 0 ┆ │ 38 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 39 | │ chacha_x86_64 ┆ 28672 ┆ 1 ┆ libchacha20poly1305 │ 40 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 41 | │ snd_rn_pci_acp3x ┆ 24576 ┆ 0 ┆ │ 42 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 43 | │ irqbypass ┆ 16384 ┆ 1 ┆ kvm │ 44 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 45 | │ hid_nintendo ┆ 49152 ┆ 0 ┆ │ 46 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 47 | │ video ┆ 77824 ┆ 2 ┆ asus_wmi │ 48 | │ ┆ ┆ ┆ amdgpu │ 49 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 50 | │ ip6_udp_tunnel ┆ 16384 ┆ 1 ┆ wireguard │ 51 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 52 | │ i2c_hid ┆ 40960 ┆ 1 ┆ i2c_hid_acpi │ 53 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 54 | │ btrtl ┆ 28672 ┆ 1 ┆ btusb │ 55 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 56 | │ cryptd ┆ 32768 ┆ 5 ┆ crypto_simd │ 57 | │ ┆ ┆ ┆ ghash_clmulni_intel │ 58 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 59 | │ serio ┆ 28672 ┆ 6 ┆ amd_pmc │ 60 | │ ┆ ┆ ┆ serio_raw │ 61 | │ ┆ ┆ ┆ atkbd │ 62 | │ ┆ ┆ ┆ psmouse │ 63 | │ ┆ ┆ ┆ i8042 │ 64 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 65 | │ ecdh_generic ┆ 16384 ┆ 2 ┆ bluetooth │ 66 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 67 | │ snd_sof_amd_acp ┆ 57344 ┆ 2 ┆ snd_sof_amd_rembrandt │ 68 | │ ┆ ┆ ┆ snd_sof_amd_renoir │ 69 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 70 | │ crypto_simd ┆ 16384 ┆ 1 ┆ aesni_intel │ 71 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 72 | │ nfnetlink ┆ 20480 ┆ 2 ┆ nft_compat │ 73 | │ ┆ ┆ ┆ nf_tables │ 74 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 75 | │ soundcore ┆ 16384 ┆ 1 ┆ snd │ 76 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 77 | │ crypto_user ┆ 20480 ┆ 0 ┆ │ 78 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 79 | │ snd_seq_device ┆ 16384 ┆ 1 ┆ snd_seq │ 80 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 81 | │ libchacha20poly1305 ┆ 16384 ┆ 1 ┆ wireguard │ 82 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 83 | │ dm_crypt ┆ 65536 ┆ 2 ┆ │ 84 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 85 | │ snd_hda_codec_hdmi ┆ 94208 ┆ 2 ┆ │ 86 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 87 | │ snd_hwdep ┆ 20480 ┆ 1 ┆ snd_hda_codec │ 88 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 89 | │ nf_nat ┆ 65536 ┆ 2 ┆ nft_masq │ 90 | │ ┆ ┆ ┆ nft_chain_nat │ 91 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 92 | │ nft_ct ┆ 24576 ┆ 11 ┆ │ 93 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 94 | │ snd_pci_acp6x ┆ 20480 ┆ 0 ┆ │ 95 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 96 | │ nft_compat ┆ 24576 ┆ 109 ┆ │ 97 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 98 | │ libchacha ┆ 16384 ┆ 1 ┆ chacha_x86_64 │ 99 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 100 | │ acpi_cpufreq ┆ 32768 ┆ 0 ┆ │ 101 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 102 | │ amd_pmc ┆ 36864 ┆ 0 ┆ │ 103 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 104 | │ tee ┆ 45056 ┆ 1 ┆ trusted │ 105 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 106 | │ snd_intel_sdw_acpi ┆ 20480 ┆ 1 ┆ snd_intel_dspcfg │ 107 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 108 | │ snd_pci_acp5x ┆ 20480 ┆ 0 ┆ │ 109 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 110 | │ libphy ┆ 217088 ┆ 3 ┆ r8169 │ 111 | │ ┆ ┆ ┆ mdio_devres │ 112 | │ ┆ ┆ ┆ realtek │ 113 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 114 | │ usbnet ┆ 61440 ┆ 2 ┆ rndis_host │ 115 | │ ┆ ┆ ┆ cdc_ether │ 116 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 117 | │ xt_multiport ┆ 20480 ┆ 4 ┆ │ 118 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 119 | │ sha512_ssse3 ┆ 49152 ┆ 0 ┆ │ 120 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 121 | │ mii ┆ 16384 ┆ 1 ┆ usbnet │ 122 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 123 | │ snd_sof_amd_rembrandt ┆ 16384 ┆ 0 ┆ │ 124 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 125 | │ mbcache ┆ 16384 ┆ 1 ┆ ext4 │ 126 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 127 | │ ccm ┆ 20480 ┆ 6 ┆ │ 128 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 129 | │ algif_hash ┆ 16384 ┆ 1 ┆ │ 130 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 131 | │ crc32c_generic ┆ 16384 ┆ 0 ┆ │ 132 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 133 | │ snd_hda_intel ┆ 65536 ┆ 5 ┆ │ 134 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 135 | │ iwlmvm ┆ 618496 ┆ 0 ┆ │ 136 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 137 | │ crc16 ┆ 16384 ┆ 2 ┆ bluetooth │ 138 | │ ┆ ┆ ┆ ext4 │ 139 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 140 | │ snd_pci_acp3x ┆ 20480 ┆ 0 ┆ │ 141 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 142 | │ xt_tcpudp ┆ 20480 ┆ 0 ┆ │ 143 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 144 | │ mousedev ┆ 24576 ┆ 0 ┆ │ 145 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 146 | │ snd_sof_xtensa_dsp ┆ 20480 ┆ 1 ┆ snd_sof_amd_acp │ 147 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 148 | │ realtek ┆ 40960 ┆ 1 ┆ │ 149 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 150 | │ kvm_amd ┆ 204800 ┆ 0 ┆ │ 151 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 152 | │ nf_defrag_ipv6 ┆ 24576 ┆ 1 ┆ nf_conntrack │ 153 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 154 | │ usbhid ┆ 77824 ┆ 1 ┆ hid_asus │ 155 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 156 | │ hid_multitouch ┆ 32768 ┆ 0 ┆ │ 157 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 158 | │ i2c_algo_bit ┆ 20480 ┆ 1 ┆ amdgpu │ 159 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 160 | │ snd_sof_pci ┆ 24576 ┆ 2 ┆ snd_sof_amd_rembrandt │ 161 | │ ┆ ┆ ┆ snd_sof_amd_renoir │ 162 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 163 | │ xhci_pci_renesas ┆ 24576 ┆ 1 ┆ xhci_pci │ 164 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 165 | │ nvme ┆ 65536 ┆ 3 ┆ │ 166 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 167 | │ dm_multipath ┆ 49152 ┆ 0 ┆ │ 168 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 169 | │ btmtk ┆ 16384 ┆ 1 ┆ btusb │ 170 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 171 | │ xt_addrtype ┆ 16384 ┆ 4 ┆ │ 172 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 173 | │ trusted ┆ 53248 ┆ 2 ┆ encrypted_keys │ 174 | │ ┆ ┆ ┆ dm_crypt │ 175 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 176 | │ mac_hid ┆ 16384 ┆ 0 ┆ │ 177 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 178 | │ snd_hda_codec ┆ 217088 ┆ 4 ┆ snd_hda_codec_generic │ 179 | │ ┆ ┆ ┆ snd_hda_codec_hdmi │ 180 | │ ┆ ┆ ┆ snd_hda_intel │ 181 | │ ┆ ┆ ┆ snd_hda_codec_realtek │ 182 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 183 | │ snd_hda_codec_realtek ┆ 196608 ┆ 1 ┆ │ 184 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 185 | │ snd_sof ┆ 389120 ┆ 2 ┆ snd_sof_amd_acp │ 186 | │ ┆ ┆ ┆ snd_sof_pci │ 187 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 188 | │ nf_defrag_ipv4 ┆ 16384 ┆ 1 ┆ nf_conntrack │ 189 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 190 | │ intel_rapl_msr ┆ 20480 ┆ 0 ┆ │ 191 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 192 | │ libcrc32c ┆ 16384 ┆ 3 ┆ nf_conntrack │ 193 | │ ┆ ┆ ┆ nf_nat │ 194 | │ ┆ ┆ ┆ nf_tables │ 195 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 196 | │ bpf_preload ┆ 24576 ┆ 0 ┆ │ 197 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 198 | │ platform_profile ┆ 16384 ┆ 1 ┆ asus_wmi │ 199 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 200 | │ cmac ┆ 16384 ┆ 3 ┆ │ 201 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 202 | │ drm_display_helper ┆ 208896 ┆ 1 ┆ amdgpu │ 203 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 204 | │ algif_skcipher ┆ 16384 ┆ 1 ┆ │ 205 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 206 | │ nft_reject_inet ┆ 16384 ┆ 6 ┆ │ 207 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 208 | │ nf_reject_ipv6 ┆ 24576 ┆ 2 ┆ nft_reject_inet │ 209 | │ ┆ ┆ ┆ ip6t_REJECT │ 210 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 211 | │ ip6t_rt ┆ 20480 ┆ 3 ┆ │ 212 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 213 | │ serio_raw ┆ 20480 ┆ 0 ┆ │ 214 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 215 | │ snd_timer ┆ 53248 ┆ 3 ┆ snd_seq │ 216 | │ ┆ ┆ ┆ snd_hrtimer │ 217 | │ ┆ ┆ ┆ snd_pcm │ 218 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 219 | │ ledtrig_audio ┆ 16384 ┆ 2 ┆ snd_hda_codec_generic │ 220 | │ ┆ ┆ ┆ asus_wmi │ 221 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 222 | │ k10temp ┆ 16384 ┆ 0 ┆ │ 223 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 224 | │ snd_acp_config ┆ 16384 ┆ 4 ┆ snd_rn_pci_acp3x │ 225 | │ ┆ ┆ ┆ snd_sof_amd_rembrandt │ 226 | │ ┆ ┆ ┆ snd_acp_pci │ 227 | │ ┆ ┆ ┆ snd_sof_amd_renoir │ 228 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 229 | │ vivaldi_fmap ┆ 16384 ┆ 1 ┆ atkbd │ 230 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 231 | │ sparse_keymap ┆ 16384 ┆ 1 ┆ asus_wmi │ 232 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 233 | │ polyval_generic ┆ 16384 ┆ 1 ┆ polyval_clmulni │ 234 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 235 | │ snd_hrtimer ┆ 16384 ┆ 1 ┆ │ 236 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 237 | │ snd_intel_dspcfg ┆ 36864 ┆ 2 ┆ snd_hda_intel │ 238 | │ ┆ ┆ ┆ snd_sof │ 239 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 240 | │ ghash_clmulni_intel ┆ 16384 ┆ 0 ┆ │ 241 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 242 | │ usb_storage ┆ 86016 ┆ 1 ┆ uas │ 243 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 244 | │ nvme_core ┆ 237568 ┆ 4 ┆ nvme │ 245 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 246 | │ rndis_host ┆ 24576 ┆ 0 ┆ │ 247 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 248 | │ asus_wireless ┆ 20480 ┆ 0 ┆ │ 249 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 250 | │ rfkill ┆ 40960 ┆ 11 ┆ iwlmvm │ 251 | │ ┆ ┆ ┆ asus_wmi │ 252 | │ ┆ ┆ ┆ bluetooth │ 253 | │ ┆ ┆ ┆ cfg80211 │ 254 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 255 | │ btintel ┆ 57344 ┆ 1 ┆ btusb │ 256 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 257 | │ typec ┆ 110592 ┆ 1 ┆ typec_ucsi │ 258 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 259 | │ joydev ┆ 28672 ┆ 0 ┆ │ 260 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 261 | │ nf_reject_ipv4 ┆ 16384 ┆ 2 ┆ nft_reject_inet │ 262 | │ ┆ ┆ ┆ ipt_REJECT │ 263 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 264 | │ af_alg ┆ 36864 ┆ 6 ┆ algif_hash │ 265 | │ ┆ ┆ ┆ algif_skcipher │ 266 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 267 | │ asus_wmi ┆ 77824 ┆ 2 ┆ asus_nb_wmi │ 268 | │ ┆ ┆ ┆ hid_asus │ 269 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 270 | │ snd_compress ┆ 32768 ┆ 1 ┆ snd_soc_core │ 271 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 272 | │ drm_buddy ┆ 20480 ┆ 1 ┆ amdgpu │ 273 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 274 | │ ip6_tables ┆ 40960 ┆ 52 ┆ │ 275 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 276 | │ atkbd ┆ 40960 ┆ 0 ┆ │ 277 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 278 | │ bluetooth ┆ 1081344 ┆ 48 ┆ btrtl │ 279 | │ ┆ ┆ ┆ btmtk │ 280 | │ ┆ ┆ ┆ btintel │ 281 | │ ┆ ┆ ┆ btbcm │ 282 | │ ┆ ┆ ┆ bnep │ 283 | │ ┆ ┆ ┆ btusb │ 284 | │ ┆ ┆ ┆ rfcomm │ 285 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 286 | │ wmi_bmof ┆ 16384 ┆ 0 ┆ │ 287 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 288 | │ btbcm ┆ 24576 ┆ 1 ┆ btusb │ 289 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 290 | │ libarc4 ┆ 16384 ┆ 1 ┆ mac80211 │ 291 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 292 | │ fuse ┆ 204800 ┆ 13 ┆ │ 293 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 294 | │ amdgpu ┆ 11718656 ┆ 160 ┆ │ 295 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 296 | │ iwlwifi ┆ 548864 ┆ 1 ┆ iwlmvm │ 297 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 298 | │ libps2 ┆ 20480 ┆ 2 ┆ atkbd │ 299 | │ ┆ ┆ ┆ psmouse │ 300 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 301 | │ nf_tables ┆ 352256 ┆ 1341 ┆ nft_ct │ 302 | │ ┆ ┆ ┆ nft_compat │ 303 | │ ┆ ┆ ┆ nft_reject_inet │ 304 | │ ┆ ┆ ┆ nft_masq │ 305 | │ ┆ ┆ ┆ nft_chain_nat │ 306 | │ ┆ ┆ ┆ nft_limit │ 307 | │ ┆ ┆ ┆ nft_reject │ 308 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 309 | │ typec_ucsi ┆ 65536 ┆ 1 ┆ ucsi_acpi │ 310 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 311 | │ bnep ┆ 36864 ┆ 2 ┆ │ 312 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 313 | │ sp5100_tco ┆ 20480 ┆ 0 ┆ │ 314 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 315 | │ libcurve25519_generic ┆ 53248 ┆ 2 ┆ curve25519_x86_64 │ 316 | │ ┆ ┆ ┆ wireguard │ 317 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 318 | │ snd_soc_core ┆ 434176 ┆ 1 ┆ snd_sof │ 319 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 320 | │ loop ┆ 40960 ┆ 0 ┆ │ 321 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 322 | │ btusb ┆ 77824 ┆ 0 ┆ │ 323 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 324 | │ cec ┆ 86016 ┆ 1 ┆ drm_display_helper │ 325 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 326 | │ ext4 ┆ 1163264 ┆ 2 ┆ │ 327 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 328 | │ asn1_encoder ┆ 16384 ┆ 1 ┆ trusted │ 329 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 330 | │ x_tables ┆ 61440 ┆ 12 ┆ xt_conntrack │ 331 | │ ┆ ┆ ┆ nft_compat │ 332 | │ ┆ ┆ ┆ xt_multiport │ 333 | │ ┆ ┆ ┆ xt_tcpudp │ 334 | │ ┆ ┆ ┆ xt_addrtype │ 335 | │ ┆ ┆ ┆ ip6t_rt │ 336 | │ ┆ ┆ ┆ ip6_tables │ 337 | │ ┆ ┆ ┆ ipt_REJECT │ 338 | │ ┆ ┆ ┆ ip_tables │ 339 | │ ┆ ┆ ┆ xt_limit │ 340 | │ ┆ ┆ ┆ xt_hl │ 341 | │ ┆ ┆ ┆ ip6t_REJECT │ 342 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 343 | │ edac_mce_amd ┆ 57344 ┆ 0 ┆ │ 344 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 345 | │ xhci_pci ┆ 24576 ┆ 0 ┆ │ 346 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 347 | │ snd_sof_utils ┆ 20480 ┆ 1 ┆ snd_sof │ 348 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 349 | │ ipt_REJECT ┆ 16384 ┆ 1 ┆ │ 350 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 351 | │ mac80211 ┆ 1503232 ┆ 1 ┆ iwlmvm │ 352 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 353 | │ udp_tunnel ┆ 28672 ┆ 1 ┆ wireguard │ 354 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 355 | │ drm_ttm_helper ┆ 16384 ┆ 1 ┆ amdgpu │ 356 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 357 | │ uinput ┆ 20480 ┆ 0 ┆ │ 358 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 359 | │ cdc_ether ┆ 24576 ┆ 1 ┆ rndis_host │ 360 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 361 | │ kvm ┆ 1327104 ┆ 1 ┆ kvm_amd │ 362 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 363 | │ ucsi_acpi ┆ 16384 ┆ 0 ┆ │ 364 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 365 | │ ff_memless ┆ 20480 ┆ 1 ┆ hid_nintendo │ 366 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 367 | │ uas ┆ 36864 ┆ 0 ┆ │ 368 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 369 | │ curve25519_x86_64 ┆ 36864 ┆ 1 ┆ wireguard │ 370 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 371 | │ cbc ┆ 16384 ┆ 0 ┆ │ 372 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 373 | │ aesni_intel ┆ 401408 ┆ 12 ┆ │ 374 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 375 | │ asus_nb_wmi ┆ 32768 ┆ 0 ┆ │ 376 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 377 | │ nft_masq ┆ 16384 ┆ 2 ┆ │ 378 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 379 | │ roles ┆ 20480 ┆ 1 ┆ typec_ucsi │ 380 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 381 | │ i2c_hid_acpi ┆ 16384 ┆ 0 ┆ │ 382 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 383 | │ crct10dif_pclmul ┆ 16384 ┆ 1 ┆ │ 384 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 385 | │ snd_pcm ┆ 200704 ┆ 13 ┆ snd_sof_amd_acp │ 386 | │ ┆ ┆ ┆ snd_hda_codec_hdmi │ 387 | │ ┆ ┆ ┆ snd_pci_acp6x │ 388 | │ ┆ ┆ ┆ snd_hda_intel │ 389 | │ ┆ ┆ ┆ snd_hda_codec │ 390 | │ ┆ ┆ ┆ snd_sof │ 391 | │ ┆ ┆ ┆ snd_compress │ 392 | │ ┆ ┆ ┆ snd_soc_core │ 393 | │ ┆ ┆ ┆ snd_sof_utils │ 394 | │ ┆ ┆ ┆ snd_hda_core │ 395 | │ ┆ ┆ ┆ snd_pci_ps │ 396 | │ ┆ ┆ ┆ snd_pcm_dmaengine │ 397 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 398 | │ uhid ┆ 20480 ┆ 1 ┆ │ 399 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 400 | │ nft_chain_nat ┆ 16384 ┆ 2 ┆ │ 401 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 402 | │ rapl ┆ 20480 ┆ 0 ┆ │ 403 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 404 | │ snd ┆ 151552 ┆ 24 ┆ snd_hda_codec_generic │ 405 | │ ┆ ┆ ┆ snd_seq │ 406 | │ ┆ ┆ ┆ snd_seq_device │ 407 | │ ┆ ┆ ┆ snd_hda_codec_hdmi │ 408 | │ ┆ ┆ ┆ snd_hwdep │ 409 | │ ┆ ┆ ┆ snd_hda_intel │ 410 | │ ┆ ┆ ┆ snd_hda_codec │ 411 | │ ┆ ┆ ┆ snd_hda_codec_realtek │ 412 | │ ┆ ┆ ┆ snd_sof │ 413 | │ ┆ ┆ ┆ snd_timer │ 414 | │ ┆ ┆ ┆ snd_compress │ 415 | │ ┆ ┆ ┆ snd_soc_core │ 416 | │ ┆ ┆ ┆ snd_pcm │ 417 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 418 | │ nft_limit ┆ 16384 ┆ 1 ┆ │ 419 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 420 | │ dm_mod ┆ 225280 ┆ 6 ┆ dm_crypt │ 421 | │ ┆ ┆ ┆ dm_multipath │ 422 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 423 | │ wireguard ┆ 118784 ┆ 0 ┆ │ 424 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 425 | │ crc32c_intel ┆ 24576 ┆ 5 ┆ │ 426 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 427 | │ psmouse ┆ 233472 ┆ 0 ┆ │ 428 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 429 | │ ip_tables ┆ 40960 ┆ 8 ┆ │ 430 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 431 | │ i8042 ┆ 53248 ┆ 1 ┆ asus_nb_wmi │ 432 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 433 | │ ttm ┆ 102400 ┆ 2 ┆ amdgpu │ 434 | │ ┆ ┆ ┆ drm_ttm_helper │ 435 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 436 | │ nvme_common ┆ 24576 ┆ 1 ┆ nvme_core │ 437 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 438 | │ xt_limit ┆ 16384 ┆ 0 ┆ │ 439 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 440 | │ snd_soc_acpi ┆ 16384 ┆ 2 ┆ snd_sof_amd_acp │ 441 | │ ┆ ┆ ┆ snd_acp_config │ 442 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 443 | │ xt_hl ┆ 16384 ┆ 22 ┆ │ 444 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 445 | │ snd_hda_core ┆ 139264 ┆ 5 ┆ snd_hda_codec_generic │ 446 | │ ┆ ┆ ┆ snd_hda_codec_hdmi │ 447 | │ ┆ ┆ ┆ snd_hda_intel │ 448 | │ ┆ ┆ ┆ snd_hda_codec │ 449 | │ ┆ ┆ ┆ snd_hda_codec_realtek │ 450 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 451 | │ snd_acp_pci ┆ 16384 ┆ 0 ┆ │ 452 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 453 | │ intel_rapl_common ┆ 36864 ┆ 1 ┆ intel_rapl_msr │ 454 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 455 | │ i2c_piix4 ┆ 36864 ┆ 0 ┆ │ 456 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 457 | │ hid_asus ┆ 36864 ┆ 0 ┆ │ 458 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 459 | │ rfcomm ┆ 102400 ┆ 16 ┆ │ 460 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 461 | │ wmi ┆ 45056 ┆ 3 ┆ video │ 462 | │ ┆ ┆ ┆ asus_wmi │ 463 | │ ┆ ┆ ┆ wmi_bmof │ 464 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 465 | │ ip6t_REJECT ┆ 16384 ┆ 1 ┆ │ 466 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 467 | │ snd_seq_dummy ┆ 16384 ┆ 0 ┆ │ 468 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 469 | │ ledtrig_timer ┆ 16384 ┆ 0 ┆ │ 470 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 471 | │ snd_pci_ps ┆ 20480 ┆ 0 ┆ │ 472 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 473 | │ crc32_pclmul ┆ 16384 ┆ 0 ┆ │ 474 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 475 | │ pcspkr ┆ 16384 ┆ 0 ┆ │ 476 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 477 | │ vfat ┆ 24576 ┆ 1 ┆ │ 478 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 479 | │ snd_sof_amd_renoir ┆ 16384 ┆ 0 ┆ │ 480 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 481 | │ cfg80211 ┆ 1286144 ┆ 3 ┆ iwlmvm │ 482 | │ ┆ ┆ ┆ iwlwifi │ 483 | │ ┆ ┆ ┆ mac80211 │ 484 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 485 | │ nft_reject ┆ 16384 ┆ 1 ┆ nft_reject_inet │ 486 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 487 | │ polyval_clmulni ┆ 16384 ┆ 0 ┆ │ 488 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 489 | │ fat ┆ 102400 ┆ 1 ┆ vfat │ 490 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 491 | │ jbd2 ┆ 217088 ┆ 1 ┆ ext4 │ 492 | ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ 493 | │ snd_pcm_dmaengine ┆ 20480 ┆ 1 ┆ snd_soc_core │ 494 | ╰───────────────────────┴──────────────┴────────────┴───────────────────────╯ 495 | 496 | -------------------------------------------------------------------------------- /tests/ui.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused_imports, unused_mut, unreachable_code)] 2 | use std::str::from_utf8; 3 | 4 | use anyhow::Result; 5 | use assert_cmd::{prelude::*, Command}; 6 | use insta::assert_snapshot; 7 | 8 | /// amdgpu is a complicated module that makes use of many features, 9 | /// all of which we want to display correctly. 10 | /// 11 | /// This test will inherently have unstable output, the goal is to make sure 12 | /// the formatting is correct, not the contents. 13 | // TODO: Figure out `insta` filters to ignore changing contents 14 | #[test] 15 | #[ignore = "Flaky"] 16 | fn amdgpu_info() -> Result<()> { 17 | let mut cmd = Command::cargo_bin("nms")?; 18 | cmd //. 19 | .env_clear() 20 | .env("COLUMNS", "120") 21 | .args(["info", "amdgpu"]); 22 | let out = cmd.output()?; 23 | let out = from_utf8(&out.stdout)?; 24 | 25 | assert_snapshot!(out); 26 | 27 | Ok(()) 28 | } 29 | 30 | #[test] 31 | fn help() -> Result<()> { 32 | for arg in [ 33 | &["--help"][..], 34 | &["list", "--help"][..], 35 | &["insert", "--help"][..], 36 | &["remove", "--help"][..], 37 | &["info", "--help"][..], 38 | ] { 39 | let mut cmd = Command::cargo_bin("nms")?; 40 | cmd.env_clear().args(arg); 41 | let out = cmd.output()?; 42 | let out = from_utf8(&out.stdout)?; 43 | 44 | assert_snapshot!(out); 45 | } 46 | 47 | Ok(()) 48 | } 49 | 50 | #[test] 51 | #[ignore = "Flaky"] 52 | fn list() -> Result<()> { 53 | let mut cmd = Command::cargo_bin("nms")?; 54 | cmd.env_clear().env("COLUMNS", "120").args(["list"]); 55 | let out = cmd.output()?; 56 | let out = from_utf8(&out.stdout)?; 57 | 58 | assert_snapshot!(out); 59 | 60 | Ok(()) 61 | } 62 | --------------------------------------------------------------------------------